//////////////////////////////////////////////////////////////////////////////// // // Siege Couillard - Initiates Load Sequence // os_arm_cou // by Don Anderson // dandersonru@msn.com // //////////////////////////////////////////////////////////////////////////////// #include "os_inc" void main() { object oCouillard = OBJECT_SELF; int nSelfFaction = GetLocalInt(oCouillard,"FACTION"); int nLoaded = GetLocalInt(oCouillard,"LOADED"); location lLoc = GetLocation(oCouillard); //Find closest related Switch object oSwitch = GetNearestObjectByTag("SiegeSwitch",oCouillard,1); float fSDist = GetDistanceToObject(oSwitch); if(fSDist > SIEGE_SWITCH) return; int nFaction; object oTarget; object oAcquire; string sTarget; //Check for Active Fire Mode int nFMode = GetLocalInt(oSwitch,"FIREMODE"); if(nFMode < 1) { AssignCommand(oCouillard,SpeakString("Couillard standing down!")); SetLocalInt(oCouillard,"LOADED",0); SetLocalInt(oCouillard,"ACQUIRED",0); return; } //Find a Valid Stone Pile object oStone = GetNearestObjectByTag("SiegeStones",oCouillard,1); if(oStone != OBJECT_INVALID && nLoaded == 0) { float fDist = GetDistanceToObject(oStone); if(fDist <= SIEGE_SUPPLY) { //Check for Available Stones int nStones = GetLocalInt(oStone,"AMMOQTY"); if(nStones > 0) { nStones--; SetLocalInt(oStone,"AMMOQTY",nStones); SetLocalInt(oCouillard,"LOADED",1); SetLocalInt(oCouillard,"ACQUIRED",0); } else { //Destroy Existing and Find Another DestroyObject(oStone,0.1); DelayCommand(1.0,ExecuteScript("os_arm_bri",oCouillard)); } } } else { DelayCommand(1.0,SpeakString("Couillard standing down....no Stones available!")); SetLocalInt(oCouillard,"LOADED",0); SetLocalInt(oCouillard,"ACQUIRED",0); return; } /*******************************************************************************/ //: SIEGE COUILLARD //Now the ammunition is properly loaded and the firing sequence takes place if(GetLocalInt(oCouillard,"LOADED") == 1) { //Now we look for doors if(GetLocalInt(oCouillard,"ACQUIRED") == 0) { object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, MAXRANGE_SIEGECOUILLARD, lLoc, TRUE, OBJECT_TYPE_DOOR); while (GetIsObjectValid(oTarget)) { location lType = GetLocation(oTarget); string sType = GetTag(oTarget); fSDist = GetDistanceToObject(oTarget); if(fSDist >= MINRANGE_SIEGECOUILLARD) { //OK to Fire On? if(GetPlotFlag(oTarget) == FALSE) { int nNPCHP = GetCurrentHitPoints(oTarget); if(nNPCHP >= 1) { SetLocalInt(oCouillard,"ACQUIRED",1); oAcquire = oTarget; break;//Acquired Target } } } oTarget = GetNextObjectInShape(SHAPE_SPHERE, MAXRANGE_SIEGECOUILLARD, lLoc, TRUE, OBJECT_TYPE_DOOR); } } //Now we check for Siege Weapons if(GetLocalInt(oCouillard,"ACQUIRED") == 0) { object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, MAXRANGE_SIEGECOUILLARD, lLoc, TRUE, OBJECT_TYPE_PLACEABLE); while (GetIsObjectValid(oTarget)) { location lType = GetLocation(oTarget); string sType = GetTag(oTarget); fSDist = GetDistanceToObject(oTarget); if((fSDist >= MINRANGE_SIEGECOUILLARD) && (sType == SIEGEARBALEST_LGT || sType == SIEGEARBALEST_HVY || sType == SIEGECATAPULT_LGT || sType == SIEGECATAPULT_HVY || sType == SIEGEBRICOLE || sType == SIEGECOUILLARD || sType == SIEGEPERRIERE || sType == SIEGEONAGER)) { //OK to Fire On? if(GetPlotFlag(oTarget) == FALSE) { nFaction = GetLocalInt(oTarget,"FACTION"); int nNPCHP = GetCurrentHitPoints(oTarget); if(nNPCHP >= 1 && (nFaction != nSelfFaction)) { SetLocalInt(oCouillard,"ACQUIRED",1); oAcquire = oTarget; break;//Acquired Target } } } oTarget = GetNextObjectInShape(SHAPE_SPHERE, MAXRANGE_SIEGECOUILLARD, lLoc, TRUE, OBJECT_TYPE_PLACEABLE); } } //Now we look for creatures if(GetLocalInt(oCouillard,"ACQUIRED") == 0) { object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, MAXRANGE_SIEGECOUILLARD, lLoc, TRUE, OBJECT_TYPE_CREATURE); while (GetIsObjectValid(oTarget)) { location lType = GetLocation(oTarget); string sType = GetTag(oTarget); fSDist = GetDistanceToObject(oTarget); if(fSDist >= MINRANGE_SIEGECOUILLARD) { //OK to Fire On? if(GetPlotFlag(oTarget) == FALSE) { nFaction = GetLocalInt(oTarget,"FACTION"); int nNPCHP = GetCurrentHitPoints(oTarget); if(nNPCHP >= 1 && (nFaction != nSelfFaction)) { SetLocalInt(oCouillard,"ACQUIRED",1); oAcquire = oTarget; break;//Acquired Target } } } oTarget = GetNextObjectInShape(SHAPE_SPHERE, MAXRANGE_SIEGECOUILLARD, lLoc, TRUE, OBJECT_TYPE_CREATURE); } } } //: SIEGE COUILLARD /*******************************************************************************/ if(GetLocalInt(oCouillard,"LOADED") == 1) { //Now we either stand down or range and face the target if(GetLocalInt(oCouillard,"ACQUIRED") == 0) { AssignCommand(oCouillard,DelayCommand(1.0,SpeakString("Couillard standing down....no valid targets!"))); SetLocalInt(oCouillard,"LOADED",0); return; } else { sTarget = GetName(oAcquire); float fDTarget = GetDistanceToObject(oAcquire); SetLocalFloat(oCouillard,"RANGE",fDTarget); SetFacingObject(oAcquire); } //Get Range in Integer Format int nDTarget = FloatToInt(GetLocalFloat(oCouillard,"RANGE")); //Now we start the Firing Process if(GetLocalInt(oCouillard,"LOADED") == 1) { AssignCommand(oCouillard,DelayCommand(1.0,SpeakString("Couillard has acquired "+ sTarget +" as a Target!"))); AssignCommand(oCouillard,DelayCommand(3.0,SpeakString("Range: "+ IntToString(nDTarget) +" Meters"))); AssignCommand(oCouillard,DelayCommand(5.0,SpeakString("Siege Stone Ammunition Received!"))); AssignCommand(oCouillard,DelayCommand(TIME_SIEGECOUILLARD - 10.0,PlaySound("as_cv_ropepully1"))); AssignCommand(oCouillard,DelayCommand(TIME_SIEGECOUILLARD - 8.0,PlaySound("as_cv_ropecreak2"))); AssignCommand(oCouillard,DelayCommand(TIME_SIEGECOUILLARD - 6.0,SpeakString("Loaded!"))); AssignCommand(oCouillard,DelayCommand(TIME_SIEGECOUILLARD - 3.0,SpeakString("Ready!"))); AssignCommand(oCouillard,DelayCommand(TIME_SIEGECOUILLARD - 0.5,SpeakString("FIRE!"))); AssignCommand(oCouillard,DelayCommand(TIME_SIEGECOUILLARD,ExecuteScript("os_fire_cou",oCouillard))); AssignCommand(oCouillard,DelayCommand(TIME_SIEGECOUILLARD + 10.0,ExecuteScript("os_arm_bri",oCouillard))); } } }