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
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
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 );
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
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
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)
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
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)
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
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");
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)
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");
def __init__(self, pos): savage.FSMState.__init__(self); self.destination = Vec3(pos); self.nav = savage.StateNavigation()
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)
def add_guide(self, x, y): self.guides.append(Vec3(x, y)) self.update_points()
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
def commandPosition(self, whofrom, goal, x, y): g = savage.Goal(goal, 25000) g.targetPosition = Vec3(x, y, 0) self.addGoal(g)