MACHINE "AI" STATE battle RULE event In :action AIFleetL1:=GetFreeSel(); SelectShips(AIFleetL1, s.race=#race_spacetech); if(AllNumOf(AIFleetL1)>0, m.AITeam_leader:=PickMax(AIFleetL1, 1 / s.this:tGetMaxVelocity()), ChangeState(noTeam1,0)); //slowest ship is AI leader //for cloaking ships, we will have to change code below ExecList(AIFleetL1, MakeFullyKnown(s.this); FreezeReconState(s.this, #race_player, 1); ); PlayerFleetL1:=GetFreeSel(); SelectShips(PlayerFleetL1, s.race=#race_player); ExecList(PlayerFleetL1, MakeFullyKnown(s.this); FreezeReconState(s.this, #race_spacetech, 1); ); m.PShipsCount:= AllNumOf(PlayerFleetL1); //time to turn on defence systems in order of importance ExecList(AIFleetL1, EnergyLeft:=s.this:availSuppForDevices; TempEcmL := GetFreeSel(); TempEccmL := GetFreeSel(); TempCloakL := GetFreeSel(); TempSensorL := GetFreeSel(); If(SelectDevices(TempEcmL, s.this, s.working & InSet(s.this, 16)), //ecm Ecm:=PickFirst(TempEcmL); If(EnergyLeft>=Ecm:energyIn, ActivateDevice(Ecm, 1); EnergyLeft:=EnergyLeft-Ecm:energyIn; ); ); If(SelectDevices(TempEccmL, s.this, s.working & InSet(s.this, 17)), //eccm Eccm:=PickFirst(TempEccmL); If(EnergyLeft>=Eccm:energyIn, ActivateDevice(Eccm, 1); EnergyLeft:=EnergyLeft-Eccm:energyIn; ); ); If(SelectDevices(TempCloakL, s.this, s.working & InSet(s.this, 9)), //cloaking also give some protection Cloak:=PickFirst(TempCloakL); If(EnergyLeft>=Cloak:energyIn, ActivateDevice(Cloak, 1); EnergyLeft:=EnergyLeft-Cloak:energyIn; ); ); //If(SelectDevices(TempSensorL, s.this, s.working & InSet(s.this, 18)), //sensor, need for cloakers // Sensor:=PickFirst(TempSensorL); // If(EnergyLeft>=Sensor:energyIn, // ActivateDevice(Sensor, 1); // EnergyLeft:=EnergyLeft-Sensor:energyIn; // ); //); DeleteSelect(TempEcmL); DeleteSelect(TempEccmL); DeleteSelect(TempCloakL); DeleteSelect(TempSensorL); ); m.AITeam_leader:tRequestShipInRangeEvent(3,3); //to know when we are close enough to call realBattle state DeleteSelect(AIFleetL1); DeleteSelect(PlayerFleetL1); Delay(0,2,LocalEvent(GetClosestTarget),0); :end END RULE event GetClosestTarget condition isValid(m.AITeam_leader)¬(m.AITeam_leader:wreck) :action Debug("GetClosestTarget"); PlayerFleetL2:=GetFreeSel(); SelectShips(PlayerFleetL2, s.race=#race_player); if(AllNumOf(PlayerFleetL2)>0, TempMainTarget:=PickMax(PlayerFleetL2, 1 / distance(s.this, m.AITeam_leader)), ChangeState(noTeam0,0)); if(m.mainTarget!=TempMainTarget, // to avoid cpu overhead becouse of tick Debug("New target"); m.mainTarget:=TempMainTarget; LocalEvent(EvaluateAIFleet); LocalEvent(FireMissile); LocalEvent(MoveInFormation); ); DeleteSelect(PlayerFleetL2); :end END RULE event EvaluateAIFleet //evaluate AI fleet missile capabilities name "evaluateAI" :action Debug("EvaluateAIFleet"); Disable("evaluateAI"); //We call it only once AIFleetL3:=GetFreeSel(); SelectShips(AIFleetL3, s.race=#race_spacetech); MissCap:=0; ExecList(AIFleetL3, AIMissileDL:=GetFreeSel(); SelectDevices(AIMissileDL, s.this, s.weapon & s.working & InSet(s.this, 5) & s.count>1); MissCap := MissCap + AllNumOf(AIMissileDL); DeleteSelect(AIMissileDL); ); if((MissCap/(m.PShipsCount+1))>0.4, LocalEvent(SendAIBombers,e.cover:=1); //with enough missiles, we send in fighters early to saturate enemy flak, leaving only 1 squad for anti-missile defence , LocalEvent(SendAIBombers,e.cover:=10); //else we leave all fighters on defence ); DeleteSelect(AIFleetL3); :end END RULE event MoveInFormation :action if(IsValid(m.AITeam_leader)&Not(m.AITeam_leader:wreck)&IsValid(m.mainTarget)&Not(m.mainTarget:wreck), AIFleetL4 := GetFreeSel(); SelectShips(AIFleetL4, s.race=#race_spacetech); //RemoveItem(AIFleetL4, m.AITeam_leader); //formation works worse then simple move //if(NumOf(AIFleetL4)>0, // m.AITeam_leader:tSetFormation(2, 1); // ExecList(AIFleetL4, // S.this:tSetForbid(#FORBID_MOTION_MOTIVATION_AWAY); // S.this:tFollow(m.AITeam_leader, 2000, 10); // ); //); ExecList(AIFleetL4, s.this:tSetForbid(#FORBID_MOTION_MOTIVATION_AWAY); SetAbsSpeed(s.this, m.AITeam_leader:tGetMaxVelocity()); s.this:tMoveTo(m.mainTarget, 2, 0); ); DeleteSelect(AIFleetL4); , LocalEvent(FatalDamaged); ); :end END RULE event FireMissile :action Debug("FireMissile"); if(isValid(m.AITeam_leader)&Not(m.AITeam_leader:wreck)&IsValid(m.mainTarget)&Not(m.mainTarget:wreck), AIFleetL5:=GetFreeSel(); SelectShips(AIFleetL5, s.race=#race_spacetech); ExecList(AIFleetL5, s.this:tClearFire; s.this:tSetForbid(#FORBID_FIRE_MISSILE); //we don't want AI to mess with it AIMissileL:=GetFreeSel(); SelectDevices(AIMissileL, s.this, s.weapon & s.working & InSet(s.this, 5) & s.count!=0); //missiles & e-bombs ExecList(AIMissileL, s.this:contFire:=1; //burst missile fire ActivateDevice(S.this, 1); TargetWeapon(S.this, m.mainTarget); ); DeleteSelect(AIMissileL); ); DeleteSelect(AIFleetL5); , LocalEvent(FatalDamaged); ); :end END RULE event SendAIBombers :action Debug("Send Bombers"); PlayerFleetL6:=GetFreeSel(); SelectShips(PlayerFleetL6, s.race=#race_player); ExecList(PlayerFleetL6, WGDevL:=GetFreeSel(); SelectDevices(WGDevL, s.this, s.this:damage<100&InSet(S.this, 70)); //focusing on weapon generators if(isValid(PickFirst(WGDevL)), FocusDevice(PickFirst(WGDevL), #race_spacetech, 1)); DeleteSelect(WGDevL); ); DeleteSelect(PlayerFleetL6); AIFleetL6:=GetFreeSel(); SelectShips(AIFleetL6, s.race=#race_spacetech); ExecList(AIFleetL6, s.this:tSetForbid(#FORBID_FIRE_BOMBER); //we don't want AI to mess with it as well AIBombersL:=GetFreeSel(); HostShip:=s.this; NumofCover:=0; SelectDevices(AIBombersL, s.this, s.weapon&s.working&s.count!=0&InSet(s.this,22)); //fighters by SET ExecList(AIBombersL, ActivateDevice(s.this, 1); if(NumofCover25, //full power to weapons, however we leave reserve for shield augmenting s.this:tEnergyMode(1, 2); , s.this:tEnergyMode(1, 0); ); ); DeleteSelect(AIFleetL7); LocalEvent(GetClosestTarget); //during battle we constantly update closest target :end END Tick 6 RULE event CO_ShipInRange :action Debug("In range"); ChangeState(realBattle,0) //time to close in action :end END RULE event FatalDamaged :action Debug("battleFatalDamaged"); if(e.ship:Race=#race_player, m.PShipsCount:=m.PShipsCount-1; if(e.ship=m.mainTarget, LocalEvent(GetClosestTarget); ); , if(e.ship=m.AITeam_leader, AIFleetL8:=GetFreeSel(); SelectShips(AIFleetL8, s.race=#race_spacetech); if(AllNumOf(AIFleetL8)>0, m.AITeam_leader:=PickMax(AIFleetL8, 1 / s.this:tGetMaxVelocity()), ChangeState(noTeam1,0)); DeleteSelect(AIFleetL8); //LocalEvent(MoveInFormation); LocalEvent(GetClosestTarget); ); ); :end END RULE event out //disband formation :action if(isValid(m.AITeam_leader)&Not(m.AITeam_leader:wreck)&IsValid(m.mainTarget)&Not(m.mainTarget:wreck), AIFleetL9 := GetFreeSel(); SelectShips(AIFleetL9, s.race=#race_spacetech); ExecList(AIFleetL9, SetAbsSpeed(s.this, s.this:tGetMaxVelocity()); s.this:tMoveTo(m.mainTarget, 2, 0); ); DeleteSelect(AIFleetL9); ); :end END END //STATE battle STATE realBattle RULE event In :action Disable("latertick"); //just precaution if something changed during switching states if(Not(isValid(m.AITeam_leader))|m.AITeam_leader:wreck, AIFleetL1:=GetFreeSel(); SelectShips(AIFleetL1, s.race=#race_spacetech); if(AllNumOf(AIFleetL1)>0, m.AITeam_leader:=PickMax(AIFleetL1, 1 / s.this:tGetMaxVelocity()), ChangeState(noTeam1,0)); //slowest ship is AI leader DeleteSelect(AIFleetL1); ); if(not(IsValid(m.mainTarget))|m.mainTarget:wreck, PlayerFleetL1:=GetFreeSel(); SelectShips(PlayerFleetL1, s.race=#race_player); if(AllNumOf(PlayerFleetL1)>0, m.mainTarget:=PickMax(PlayerFleetL1, 1 / distance(s.this, m.AITeam_leader)), ChangeState(noTeam0,0)); DeleteSelect(PlayerFleetL1); ); m.AITeam_leader:tRequestShipInRangeEvent(2,3); //to know when we are close enough to enable deflection and combat engines Delay(0,1,LocalEvent(EvaluateAIFleet),0); Delay(0,2,LocalEvent(GetMainTarget),0); Delay(0,4,LocalEvent(GetSecondaryTarget),0); Delay(0,6,LocalEvent(GetMissileTarget),0); Delay(0,8,Enable("latertick"),0); :end END RULE event EvaluateAIFleet :action AIFleetL2:=GetFreeSel(); SelectShips(AIFleetL2, s.race=#race_spacetech); AIShipSHBusterL:=GetFreeSel(); //shield and hull buster ships AIShipDeviceBusterL:=GetFreeSel(); //device buster ships ExecList(AIFleetL2, AIDevBustDL:=GetFreeSel(); AISHBustDL:=GetFreeSel(); SelectDevices(AIDevBustDL, s.this, s.weapon & s.working & s.deviceValue=1 & s.count!=0); SelectDevices(AISHBustDL, s.this, s.weapon & s.working & (s.hullValue=1 | s.shieldValue=1) & s.count!=0); SubList(AIDevBustDL, AISHBustDL); // remove multipurpose weapons if(NumOf(AIDevBustDL)>NumOf(AISHBustDL), AddItem(AIShipDeviceBusterL, s.this); // ships with primary device busting capablities , AddItem(AIShipSHBusterL, s.this); // ships with primary hull and shield busting capablities ); //DeleteSelect(AIMissileDL); DeleteSelect(AIDevBustDL); DeleteSelect(AISHBustDL); ); DeleteSelect(AIFleetL2); LocalEvent(FocusOnDevices); :end END RULE event Tick Name "latertick" :action // basic energy management Debug("realBattle tick"); AIFleetL3:=GetFreeSel(); SelectShips(AIFleetL3, s.race=#race_spacetech); ExecList(AIFleetL3, if(s.this:reserveLevel>25, //full power to weapons, hovever we leave reserve for shield augmenting s.this:tEnergyMode(1, 2); , s.this:tEnergyMode(1, 0); ); if(s.this:shieldLevel<50, //boost shield when low s.this:tEnergyMode(2, 2); , s.this:tEnergyMode(2, 0); ); ); if(isValid(m.AITeam_leader)&isValid(m.mainTarget)¬(m.mainTarget:wreck)¬(m.AITeam_leader:wreck), if(range(m.AITeam_leader,m.mainTarget)>3, //main target running away LocalEvent(GetMainTarget); ); ); if(isValid(m.secondaryTarget)&isValid(m.mainTarget)¬(m.mainTarget:wreck)¬(m.secondaryTarget:wreck), if(range(m.secondaryTarget,m.mainTarget)>3, //secondary target running away LocalEvent(GetSecondaryTarget); ); ); if(isValid(m.missileTarget)¬(m.missileTarget:wreck), InBlastRange:=0; AIFleetL4:=GetFreeSel(); SelectShips(AIFleetL4, s.race=#race_spacetech); ExecList(AIFleetL4, if(range(m.missileTarget,s.this)=2, InBlastRange:=1; ); ); DeleteSelect(AIFleetL4); if(InBlastRange,LocalEvent(GetSecondaryTarget)); //some of our ships are in blast range - retargeting missiles ); DeleteSelect(AIFleetL3); :end END Tick 6 RULE event CO_ShipInRange :action Debug("In range"); AIFleetL5:=GetFreeSel(); SelectShips(AIFleetL5, s.race=#race_spacetech); ExecList(AIFleetL5, EnableDodge(s.this, 1); s.this:tEngineMode(2); ); DeleteSelect(AIFleetL5); :end END RULE event CO_DeviceDestroyed condition e.device:owner:race=#race_player&DeviceFocused(e.device,#race_spacetech) :action LocalEvent(FocusOnDevices); LocalEvent(GetSecondaryTarget); :end END RULE event ShieldDown condition e.ship:race=#race_player :action LocalEvent(FireMainShield); :end END RULE event ShieldUp condition E.ship:race=#race_player :action LocalEvent(FireMainShield); :end END RULE event FocusOnDevices :action PlayerFleetL6:=GetFreeSel(); SelectShips(PlayerFleetL6, s.race=#race_player); ExecList(PlayerFleetL6, WGDevL:=GetFreeSel(); SelectDevices(WGDevL, s.this, s.this:damage<100&InSet(S.this, 70)); //focusing on weapon generators if(isValid(PickFirst(WGDevL)), FocusDevice(PickFirst(WGDevL), #race_spacetech, 1)); DeleteSelect(WGDevL); ); DeleteSelect(PlayerFleetL6); :end END RULE event GetMainTarget :action Debug("GetMainTarget"); if(isValid(m.AITeam_leader)¬(m.AITeam_leader:wreck), PlayerFleetL7:=GetFreeSel(); SelectShips(PlayerFleetL7, s.race=#race_player&range(s.this,m.AITeam_leader)=2&s.this:damage>35); //if there is heavy damaged ship nearby, first finish it off if(AllNumOf(PlayerFleetL7)>0, m.mainTarget:=PickMax(PlayerFleetL7,s.this:damage); , SelectShips(PlayerFleetL7, s.race=#race_player&range(s.this,m.AITeam_leader)=2); //else we pick most dangerous nearby ship if(AllNumOf(PlayerFleetL7)>0, m.mainTarget:=PickMax(PlayerFleetL7, (s.this:tDamage(m.AITeam_leader,2,1)+s.this:tDamage(m.AITeam_leader,2,2)+s.this:tDamage(m.AITeam_leader,2,3)+s.this:tDamage(m.AITeam_leader,3,1)+s.this:tDamage(m.AITeam_leader,3,2)+s.this:tDamage(m.AITeam_leader,3,3))); , SelectShips(PlayerFleetL7, s.race=#race_player); //else we pick closest target if(AllNumOf(PlayerFleetL7)>0, m.mainTarget:=PickMax(PlayerFleetL7, 1 / distance(s.this, m.AITeam_leader)), ChangeState(noTeam0,0)); ); ); ExecList(AIShipSHBusterL, s.this:tMoveTo(m.mainTarget, 2, 0); ); LocalEvent(FireMainHull); LocalEvent(FireMainShield); DeleteSelect(PlayerFleetL7); , LocalEvent(FatalDamaged, E.ship=m.AITeam_leader); ); :end END RULE event GetSecondaryTarget :action Debug("GetSecondaryTarget"); if(NumOf(AIShipDeviceBusterL)>0, if(isValid(m.mainTarget)¬(m.mainTarget:wreck), PlayerFleetL8:=GetFreeSel(); SelectShips(PlayerFleetL8, s.race=#race_player&(range(s.this,m.mainTarget)=2|range(s.this,m.mainTarget)=3)); // we want to have main target in device buster ships artilery range if(AllNumOf(PlayerFleetL8)>0, m.secondaryTarget:=PickMax(PlayerFleetL8, (s.this:tDamage(m.AITeam_leader,2,1)+s.this:tDamage(m.AITeam_leader,2,2)+s.this:tDamage(m.AITeam_leader,2,3)+s.this:tDamage(m.AITeam_leader,3,1)+s.this:tDamage(m.AITeam_leader,3,2)+s.this:tDamage(m.AITeam_leader,3,3))), m.secondaryTarget:=m.mainTarget); //most dangerous opponent DeleteSelect(PlayerFleetL8); , LocalEvent(GetMainTarget); ); ExecList(AIShipDeviceBusterL, s.this:tMoveTo(m.secondaryTarget, 2, 0); ); , m.secondaryTarget:=m.mainTarget; ); LocalEvent(FireToSecondary); :end END RULE event GetMissileTarget :action Debug("GetMissileTarget"); if(isValid(m.AITeam_leader)¬(m.AITeam_leader:wreck), PlayerFleetL9:=GetFreeSel(); SelectShips(PlayerFleetL9, s.race=#race_player&range(s.this,m.AITeam_leader)>2); if(AllNumOf(PlayerFleetL9)>0, AIFleetL9:=GetFreeSel(); SelectShips(AIFleetL9, s.race=#race_spacetech&s.this!=m.AITeam_leader); // we don't want to have any AI ships in blast range if(AllNumOf(AIFleetL9)>0, ExecList(PlayerFleetL9, PotentialTarget:=s.this; ExecList(AIFleetL9, if(range(PotentialTarget,s.this)=2, RemoveItem(PlayerFleetL9, PotentialTarget); ); ); ); ); DeleteSelect(AIFleetL9); if(NumOf(PlayerFleetL9)>0, m.missileTarget:=PickMax(PlayerFleetL9, 1 / distance(s.this, m.AITeam_leader)); LocalEvent(FireMissile); ); ); DeleteSelect(PlayerFleetL9); , LocalEvent(FatalDamaged, E.ship=m.AITeam_leader); ); :end END RULE event FireMainHull :action Debug("FireMainHull"); if(isValid(m.AITeam_leader)&isValid(m.mainTarget)¬(m.mainTarget:wreck)¬(m.AITeam_leader:wreck), AIFleetL10:=GetFreeSel(); SelectShips(AIFleetL10, s.race=#race_spacetech); ExecList(AIFleetL10, s.this:tSetForbid(#FORBID_FIRE); s.this:tSetForbid(#FORBID_FIRE_BOMBER); AIFleetWeaponL10:=GetFreeSel(); SelectDevices(AIFleetWeaponL10, s.this, S.working&S.weapon&s.count!=0&s.hullValue=1); ExecList(AIFleetWeaponL10, s.this:contFire:=1; ActivateDevice(S.this, 1); TargetWeapon(s.this, m.mainTarget); ); DeleteSelect(AIFleetWeaponL10); AIFleetBomberL10:=GetFreeSel(); SelectDevices(AIFleetBomberL10, s.this, s.hullValue=1&s.working&(Inset(s.this,20)|Inset(s.this,21)|Inset(s.this,22))); ExecList(AIFleetBomberL10,WeaponMode(S.this,5,m.mainTarget)); DeleteSelect(AIFleetBomberL10); ); DeleteSelect(AIFleetL10); ); :end END RULE event FireMainShield :action Debug("FireMainShield"); if(isValid(m.AITeam_leader)¬(m.AITeam_leader:wreck), if(isValid(m.mainTarget)¬(m.mainTarget:wreck), AIFleetL11:=GetFreeSel(); SelectShips(AIFleetL11, s.race=#race_spacetech); ExecList(AIFleetL11, AIFleetWeaponL11:=GetFreeSel(); SelectDevices(AIFleetWeaponL11, s.this, S.working&S.weapon&s.count!=0&s.hullValue=0&s.shieldValue=1); ExecList(AIFleetWeaponL11, s.this:contFire:=1; ActivateDevice(S.this, 1); if(m.mainTarget:isShielded, TargetWeapon(s.this, m.mainTarget); , if(isValid(m.secondaryTarget)¬(m.secondaryTarget:wreck) if(m.secondaryTarget:isShielded, TargetWeapon(s.this, m.secondaryTarget); , PlayerFleetL11:=GetFreeSel(); SelectShips(PlayerFleetL11, s.race=#race_player&s.this:isShielded); if(AllNumOf(PlayerFleetL11)>0, TargetWeapon(s.this,PickMax(PlayerFleetL11, 1 / distance(s.this, m.AITeam_leader))); ); ); , LocalEvent(GetSecondaryTarget); ); ); ); ); DeleteSelect(AIFleetL11); , LocalEvent(GetMainTarget); ); ); :end END RULE event FireToSecondary :action Debug("FireToSecondary"); if(isValid(m.secondaryTarget)¬(m.secondaryTarget:wreck), AIFleetL12:=GetFreeSel(); SelectShips(AIFleetL12, s.race=#race_spacetech); ExecList(AIFleetL12, AIFleetWeaponL12:=GetFreeSel(); SelectDevices(AIFleetWeaponL12, s.this, S.working&S.weapon&s.count!=0&s.hullValue=0&s.shieldValue=0&s.DeviceValue=1); ExecList(AIFleetWeaponL12, s.this:contFire:=1; ActivateDevice(S.this, 1); TargetWeapon(s.this, m.secondaryTarget); ); DeleteSelect(AIFleetWeaponL12); AIFleetBomberL12:=GetFreeSel(); SelectDevices(AIFleetBomberL12, s.this, s.hullValue=0&s.shieldValue=0&s.DeviceValue=1&s.working&(Inset(s.this,20)|Inset(s.this,21)|Inset(s.this,22))); ExecList(AIFleetBomberL12,WeaponMode(S.this,5,m.secondaryTarget)); DeleteSelect(AIFleetBomberL12); ); DeleteSelect(AIFleetL12); ); :end END RULE event FireMissile :action Debug("FireMissile"); if(IsValid(m.missileTarget)&Not(m.missileTarget:wreck), AIFleetL13:=GetFreeSel(); SelectShips(AIFleetL13, s.race=#race_spacetech); ExecList(AIFleetL13, s.this:tSetForbid(#FORBID_FIRE_MISSILE); AIMissileL13:=GetFreeSel(); SelectDevices(AIMissileL13, s.this, s.weapon & s.working & InSet(s.this, 5) & s.count!=0); //missiles & e-bombs ExecList(AIMissileL13, s.this:contFire:=1; ActivateDevice(S.this, 1); TargetWeapon(S.this, m.missileTarget); ); DeleteSelect(AIMissileL13); ); DeleteSelect(AIFleetL13); , LocalEvent(FatalDamaged,E.ship=m.missileTarget); ); :end END RULE event FatalDamaged :action Debug("realBattleFatalDamaged"); if(e.ship:Race=#race_player, PlayerFleetL14:=GetFreeSel(); SelectShips(PlayerFleetL14, s.race=#race_player); if(NumOf(PlayerFleetL14)>0, if(e.ship=m.mainTarget, LocalEvent(GetMainTarget); ); if(e.ship=m.secondaryTarget, LocalEvent(GetSecondaryTarget); ); if(e.ship=m.misileTarget, LocalEvent(GetMissileTarget); ); , ChangeState(noTeam0,0); ); DeleteSelect(PlayerFleetL14); , RemoveItem(AIShipDeviceBusterL,e.ship); RemoveItem(AIShipSHBusterL,e.ship); if(e.ship=m.AITeam_leader, AIFleetL14:=GetFreeSel(); SelectShips(AIFleetL14, s.race=#race_spacetech); if(AllNumOf(AIFleetL14)>0, m.AITeam_leader:=PickMax(AIFleetL14, 1 / s.this:tGetMaxVelocity()), ChangeState(noTeam1,0)); DeleteSelect(AIFleetL14); Delay(0,1,LocalEvent(GetMainTarget),0); Delay(0,3,LocalEvent(GetSecondaryTarget),0); Delay(0,5,LocalEvent(GetMissileTarget),0); ); ); :end END END //STATE realBattle STATE noTeam1 RULE event In :action :end END END //STATE noTeam1 STATE noTeam0 RULE event In :action :end END END //STATE noTeam1 END //MACHINE "AI"