Exemplo n.º 1
0
 def __init__(self,
              position=Vec3(0, 0),
              velocity=Vec3(0, 0),
              orientation=Vec3(1, 0)):
     super(MovingEntity, self).__init__(position)
     self.velocity = velocity
     self.orientation = orientation
Exemplo n.º 2
0
    def isComplete(self):
        go = self.machine.mind

        if self.nav.blocked:
            return False

        if self.targetObject == None or self.targetObject.getHealth(
        ) <= 0 or not self.targetObject.isActive():
            go.stopMoving()
            return True

        if not self.nav.firstRun and go.isArrived():
            go.stopMoving()
            return True

        p = Vec3(self.targetObject.getPosition())
        o = Vec3(go.getPosition())
        dist = self.chaseDist
        if dist < 0:
            dist = go.getType().getAttackTypeValue("melee_1", "range")
        dist = dist**2

        if o.distanceSqTo(p) <= dist:
            go.stopMoving()
            return True

        return self.arrived
Exemplo n.º 3
0
	def damageFalloff( self, target, maxdamage, maxrange, flags=0):
		import math;
		v0 = Vec3( self.getPosition() );
		v1 = Vec3( target.getPosition() );
		x = max(0, v0.distanceTo( v1 )-target.getRadius());
		
		if x > maxrange: damage = 0;
		else: damage = maxdamage * math.cos( x*math.pi*0.5/maxrange );
		#since 0.5 is a float, python won't truncate the quotient
		self.damage( target, damage, flags|DAMAGE_SPLASH );
Exemplo n.º 4
0
 def findClosestDropPoint(self):
     buildings = savage.team_getbuildings(self.getTeam())
     closest = None
     o = Vec3(self.getPosition())
     for obj in buildings:
         if obj.getType().getValue("dropoff") and not obj.isBeingBuilt():
             p = Vec3(obj.getPosition())
             if closest is None or p.distanceSqTo(o) < Vec3(
                     closest.getPosition()).distanceSqTo(o):
                 closest = obj
     return closest
Exemplo n.º 5
0
    def findClosestObject(self, objtype):
        #really just a wrapper...
        objs = savage.getTypeObjects(objtype)
        closest = objs[0]
        o = Vec3(self.getPosition())
        for obj in objs:
            p = Vec3(obj.getPosition())
            if p.distanceSqTo(o) < Vec3(closest.getPosition()).distanceSqTo(o):
                closest = p

        return closest
Exemplo n.º 6
0
    def spawnForward(self):
        import operator
        points = {}
        team = savage.Team(self.getTeam())
        t = 1
        if self.getTeam() == t:
            t = 2
        enemyteam = savage.Team(t)

        cc = Vec3(enemyteam.getCommandCenter().getPosition())
        objs = team.getSpawnPoints()
        for obj in objs:
            points[Vec3(obj.getPosition()).distanceSqTo(cc)] = obj
        sp = sorted(points.iteritems(), key=operator.itemgetter(0))
        silverback.SV_VClient_RequestSpawn(self.objectId, sp[0][1].objectId)
Exemplo n.º 7
0
def getdist(bl, a1idx, ba, idx, bdi):
    vecs = []
    vecs.append(Vec3(0.0, 0.0, 0.0))
    vecs.append(Vec3(bl[0], 0.0, 0.0))

    V3wk = vecs[a1idx[0][1] - 1].sub(vecs[a1idx[0][0] - 1]).unitvec()
    if vecs[1].x > 0:
        vecs.append(
            V3wk.rotate(Vec3(0.0, 0.0, 1.0),
                        -ba[0]).scale(bl[1]).add(vecs[a1idx[0][0] - 1]))
    else:
        vecs.append(
            V3wk.rotate(Vec3(0.0, 0.0, 1.0),
                        -ba[0]).scale(bl[1]).add(vecs[a1idx[0][0] - 1]))

    def printvecs(vector):
        for i in vector:
            i.printv()

    for i in range(3, len(bl) + 1):
        # print idx[i-3][2]-1
        # print idx[i-3][0]-1
        # print ba[i-2]
        R10 = vecs[idx[i - 3][2] - 1].sub(vecs[idx[i - 3][1] -
                                               1])  ##vec[0] - vec[1]
        R12 = vecs[idx[i - 3][0] - 1].sub(vecs[idx[i - 3][1] -
                                               1])  ##vec[2] - vec[0]
        N = R10.crossprod(R12).unitvec().scale(1.0)
        # print "N: "
        # N.printv()
        Rw = R12.scale(-1.0).unitvec().rotate(N, ba[i - 2])
        # Rw.printv()
        Rw = Rw.rotate(R12.unitvec(), bdi[i - 3])
        # Rw.printv()
        Rw = Rw.scale(bl[i - 1]).add(vecs[idx[i - 3][0] - 1])
        vecs.append(Rw)

    #print "Results:"
    #printvecs(vecs)
    dists = []
    for i in range(0, len(bl) + 1):
        for j in range(i + 1, len(bl) + 1):
            d = vecs[i].sub(vecs[j]).len()
            dists.append(d)

    return dists
Exemplo n.º 8
0
 def teleport(self, to):
     p = self.getPosition()
     # the fallback is to go nowhere
     if isinstance(to, Vec3):
         p = to
     elif isinstance(to, savage.GameObject):
         p = to.getPosition()
         p = Vec3(
             silverback.SV_GetSpawnPointAroundObject(
                 to.objectId, self.objectId))
     self.setPosition(p)
Exemplo n.º 9
0
    def toss(self, objtype, speed, gravity):
        ob = savage.go_spawn(objtype, self.objectId)

        f = Vec3(self.getForwardVector())
        f.normalise()
        f = f * speed

        ob.setTrajectory(f.data)
        ob.setGravity(gravity)

        ob.onToss(self)
        return ob
Exemplo n.º 10
0
	def run(self):
		go = self.machine.mind;
		gotype = go.getType();

		#check if target is out of range, if so
		#insert a chase state into the mind and exit
		r = gotype.getAttackTypeValue("melee_1", "range") ** 2;
		p = Vec3(go.getPosition());
		o = Vec3(self.targetObject.getPosition());
		
		if go.getPrimaryAnimState() != AnimStates.AS_CONSTRUCT:
			self.attackTime = savage.getGameTime()+gotype.getAttackTypeValue("melee_1", "impact");
			#go.setPrimaryAnimState(AnimStates.AS_IDLE);
			go.setPrimaryAnimState(AnimStates.AS_CONSTRUCT);

		if go.getPrimaryAnimState() == AnimStates.AS_CONSTRUCT:
			go.setForwardVector( o - p );
			#make the attack
			if self.attackTime <= savage.getGameTime():
				go.damage(self.targetObject, gotype.getAttackTypeValue("melee_1", "damage"));
				self.attackTime = savage.getGameTime() + gotype.getAttackTypeValue("melee_1", "time");
Exemplo n.º 11
0
    def spawnCloseTo(self, objtype):
        import operator
        points = {}
        team = savage.Team(self.getTeam())
        cc = Vec3(team.getCommandCenter().getPosition())

        objs = savage.getActiveObjects()
        for obj in objs:
            points[obj] = Vec3(obj.getPosition()).distanceSqTo(cc)
        sp = sorted(points.iteritems(), key=operator.itemgetter(1))

        objpos = Vec3(sp[0][0].getPosition())

        #we have the closest object of objtype to our CC
        #now find the closest spawnpoint to that object
        objs = team.getSpawnPoints()
        for obj in objs:
            points[Vec3(obj.getPosition()).distanceSqTo(objpos)] = obj
        sp = sorted(points.iteritems(), key=operator.itemgetter(0))

        silverback.SV_VClient_RequestSpawn(self.objectId, sp[0][1].objectId)
Exemplo n.º 12
0
	def run(self):
		go = self.machine.mind;
		gotype = go.getType();

		#check if target is out of range, if so
		#insert a chase state into the mind and exit
		#r = gotype.getAttackTypeValue("melee_1", "range") ** 2;
		p = Vec3(go.getPosition());
		o = Vec3(self.targetObject.getPosition());

		#are we ready to mine, or should we return?
		mineType = self.targetObject.getType().getValue("mineType");
		if go.getCarryResource(mineType) >= go.getMaxCarryResource(mineType):
			#go.setCurrentGoalPriority(9001); #reset mining priority so we never randomly forget we were mining...
			go.fsm.insertState(savage.MineState(self.targetObject))
			go.fsm.insertState(savage.ChaseState(self.targetObject, self.targetObject.getType().getValue("proximity")))
			dropoff = go.findClosestDropPoint()
			go.fsm.insertState(savage.DropoffState(dropoff))
			go.fsm.insertState(savage.ChaseState(dropoff, dropoff.getType().getValue("proximity")));
			self.maxCapacity = True
			return;

		#are we close enough to the mine?
		#if o.distanceSqTo(p)-self.targetObject.getRadiusSq() > r:
		#	self.attackTime = 0;
		#	go.fsm.insertState(savage.ChaseState(self.targetObject, 100));
		#	return;

		if go.getPrimaryAnimState() != AnimStates.AS_MINE:
			self.attackTime = savage.getGameTime()+gotype.getAttackTypeValue("melee_1", "impact");
			#go.setPrimaryAnimState(AnimStates.AS_IDLE);
			go.setPrimaryAnimState(AnimStates.AS_MINE);

		if go.getPrimaryAnimState() == AnimStates.AS_MINE:
			go.setForwardVector( o - p );
			#make the attack
			if self.attackTime <= savage.getGameTime():
				go.mineResources(self.targetObject)
				self.attackTime = savage.getGameTime() + gotype.getAttackTypeValue("melee_1", "time");
Exemplo n.º 13
0
	def __init__(self, pos):
		savage.FSMState.__init__(self);
		self.destination = Vec3(pos);
		self.nav = savage.StateNavigation()
Exemplo n.º 14
0
 def __init__(self, position=Vec3(0, 0)):
     #        self.rect = Rect(0,0,5,5)
     self.position = position
     self.bounding_radius = 5
     self.color = (.12, .96, .72)
Exemplo n.º 15
0
 def add_guide(self, x, y):
     self.guides.append(Vec3(x, y))
     self.update_points()
Exemplo n.º 16
0
    def run(self):
        go = self.machine.mind
        gotype = go.getType()
        attackName = "melee_1"

        go.setPrimaryAnimState(AnimStates.AS_IDLE)

        weapon = gotype.getValue("forceInventory0")
        isRanged = False
        if not weapon is None:
            weaponType = savage.getObjectType(weapon)
            if weaponType.getObjectClass() == "weapon":
                isRanged = True

        isSuicide = M_Randnum(
            0, 100) < 100 * gotype.getValue("attackSuicideChance")
        if isSuicide:
            attackName = "melee_1"

        if isRanged:
            r = 400.0
        else:
            r = gotype.getAttackTypeValue(attackName, "range")
        r2 = r**2
        p = Vec3(go.getPosition())
        o = Vec3(self.targetObject.getPosition())

        go.setForwardVector(o - p)
        # always face target

        if not self.attackStarted:
            if o.distanceSqTo(p) > r2:
                go.fsm.insertState(savage.ChaseState(self.targetObject, r))
                return
            self.attackTime = savage.getGameTime() + gotype.getAttackTypeValue(
                attackName, "time")
            self.impactTime = savage.getGameTime() + gotype.getAttackTypeValue(
                attackName, "impact")
            if isSuicide:
                go.setSecondaryAnimState(AnimStates.AS_SUICIDE)
            else:
                go.setSecondaryAnimState(AnimStates.AS_MELEE_1)
            self.impacted = False
            self.attackStarted = True

        if self.impactTime <= savage.getGameTime() and not self.impacted:
            #make the attack
            if isRanged:
                go.fireWeapon(o)
                go.setSecondaryAnimState(AnimStates.AS_IDLE)
            else:
                if isSuicide:
                    go.addEvent(33)
                    #there's a whole lot of events, I'm not putting them all in defines.py
                    objs = savage.getRadiusObjects(go.objectId, 150)
                    for obj in objs:
                        go.damageFalloff(
                            obj, gotype.getValue("attackSuicideDamage"),
                            gotype.getValue("attackSuicideRadius"))
                    go.damage(go,
                              go.getMaxHealth() + 10)
                else:
                    go.damage(self.targetObject,
                              gotype.getAttackTypeValue(attackName, "damage"))
            self.impacted = True

        if self.attackTime <= savage.getGameTime():
            go.setSecondaryAnimState(AnimStates.AS_IDLE)
            self.attackStarted = False
Exemplo n.º 17
0
 def commandPosition(self, whofrom, goal, x, y):
     g = savage.Goal(goal, 25000)
     g.targetPosition = Vec3(x, y, 0)
     self.addGoal(g)