///////////////////////////////////////////////////////////////////////////// // Real Time Strategy - NWN - Heartbeat kicker //=========================================================================== // By Deva Bryson Winblood. 02/24/2003 ///////////////////////////////////////////////////////////////////////////// /* This heartbeat just makes sure the DelayCommand() for the NPC fired off recently. If it has not then it will start it up again */ // If no AI has been processed for 12 seconds it will launch the script #include "antistuck_h" object fnGetCloseTarget(object oMe,float fRange) { // PURPOSE: Get a close target object oRet=OBJECT_INVALID; object oOb; int nN=1; oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oMe,nN,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY); if (GetDistanceBetween(oOb,oMe)<=fRange) oRet=oOb; return oRet; } // fnGetCloseTarget() object fnGetFarTarget(object oMe,float fRange) { // PURPOSE: Get a target perceived by allies object oRet=OBJECT_INVALID; float fDist=1000.0; object oFriend; object oOb; int nF; nF=1; oFriend=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oMe,nF,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_FRIEND); while(oFriend!=OBJECT_INVALID&&GetDistanceBetween(oMe,oFriend)<=fRange) { // check perception of friends oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oFriend,1,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY); if (GetDistanceBetween(oOb,oMe)<=fRange) { // enemy in range spotted by ally if (GetDistanceBetween(oOb,oMe)nDX) nEW=-1; if (nMY>nDY) nNS=-1; if (nMX2.0&&oDeployed!=OBJECT_INVALID) { // move AssignCommand(oMe,ClearAllActions(TRUE)); AssignCommand(oMe,ASActionMoveToObject(oDeployed,TRUE,1.0)); } // move else { // animate AssignCommand(oMe,SetFacingPoint(GetPosition(oDeployed))); ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,5.5); nLoadCount++; SetLocalInt(oDeployed,"nLoadCount",nLoadCount); } // animate } // load else if (oTarget==OBJECT_INVALID||GetIsEnemy(oTarget)==FALSE||GetArea(oTarget)!=GetArea(oMe)||fDistance<10.0||fDistance>fRange) { // look for target AssignCommand(oMe,ActionPlayAnimation(ANIMATION_LOOPING_LOOK_FAR,1.0,5.5)); if (fRange==40.0) { // close only oTarget=fnGetCloseTarget(oMe,fRange); } // close only else { // close then far oTarget=fnGetCloseTarget(oMe,fRange); if (oTarget==OBJECT_INVALID) oTarget=fnGetFarTarget(oMe,fRange); } // close then far if (oTarget!=OBJECT_INVALID) { // found AssignCommand(oMe,SpeakString("Target sighted")); SetLocalObject(oMe,"oTarget",oTarget); } // found } // look for target else { // fire AssignCommand(oMe,SpeakString("Fire!!")); if (GetResRef(oMe)=="dwfupg1") { // ballista AssignCommand(oMe,PlaySound("cb_sh_ballista")); } // ballista else { // catapult AssignCommand(oMe,PlaySound("cb_sh_catapult")); } // catapult fnFire(oDeployed,oTarget,GetLocation(oTarget),fRange); } // fire } // artillery is deployed else { // artillery is not deployed if (nMode==0) { // stand around - wait ExecuteScript("nw_c2_default1",oMe); } // stand around - wait else if (nMode==1) { // follow if (GetArea(oTarget)!=GetArea(oMe)) { // teleport AssignCommand(oMe,ClearAllActions(TRUE)); AssignCommand(oMe,JumpToObject(oTarget)); } // teleport else if (GetDistanceBetween(oMe,oTarget)>5.0) { // move AssignCommand(oMe,ASActionMoveToObject(oTarget,TRUE,4.0)); } // move else { // standard script ExecuteScript("nw_c2_default1",oMe); } // standard script } // follow else if (nMode==2) { // deploy if (nS==0) { // animate get low ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,5.5); SetLocalInt(oMe,"nSState",1); } // animate get low else if (nS==1) { // create artillery oDeployed=CreateObject(OBJECT_TYPE_PLACEABLE,sRes,GetLocation(oMe)); SetLocalObject(oDeployed,"oOwner",oMe); SetLocalObject(oMe,"oDeployed",oDeployed); SetLocalInt(oMe,"nSState",2); } // create artillery else { // completed SetLocalInt(oMe,"bDeployed",TRUE); DeleteLocalInt(oMe,"nSState"); DeleteLocalInt(oMe,"nMState"); AssignCommand(oMe,SpeakString("Deployed")); } // completed } // deploy else if (nMode==3) { // pack up if (nS==0) { // move to artillery if (GetDistanceBetween(oMe,oDeployed)>1.5) { // move AssignCommand(oMe,ClearAllActions(TRUE)); AssignCommand(oMe,ASActionMoveToObject(oDeployed,TRUE,1.0)); } // move else { SetLocalInt(oMe,"nSState",1); } } // move to artillery else if (nS==1) { // get mid animation AssignCommand(oMe,SetFacingPoint(GetPosition(oDeployed))); ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,5.5); SetLocalInt(oMe,"nSState",2); } // get mid animation else if (nS==2) { // destroy artillery DestroyObject(oDeployed); SetLocalInt(oMe,"nSState",3); } // destroy artillery else { // completed DeleteLocalInt(oMe,"nMState"); DeleteLocalInt(oMe,"nSState"); DeleteLocalInt(oMe,"bDeployed"); DeleteLocalObject(oMe,"oDeployed"); DeleteLocalObject(oMe,"oTarget"); AssignCommand(oMe,SpeakString("Packed")); } // completed } // pack up } // artillery is not deployed }