Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
383 lines
6.8 KiB
Plaintext
383 lines
6.8 KiB
Plaintext
fsm WussyBot : integer;
|
|
|
|
const
|
|
#include_ <content\ABLScripts\mwconst.abi>
|
|
|
|
type
|
|
#include_ <content\ABLScripts\mwtype.abi>
|
|
|
|
|
|
var
|
|
static integer attackRange; // At what range do I start shooting?
|
|
static integer withdrawRange; // At what range do I withdraw?
|
|
static ObjectID mymech;
|
|
static integer mytactic;
|
|
static integer pilotskill;
|
|
static integer gunneryskill;
|
|
static integer commandskill;
|
|
static integer hits;
|
|
static ObjectID shooter;
|
|
static integer bot_activated_timer;
|
|
static integer death;
|
|
static integer deathbucket;
|
|
static integer kills;
|
|
static integer killsbucket;
|
|
static integer adjust;
|
|
|
|
function Init;
|
|
code
|
|
|
|
// Editable Settings.
|
|
//
|
|
// 10 can't hit the barn
|
|
// 100 deadly shot
|
|
// 999 never miss
|
|
|
|
pilotskill = 0;
|
|
gunneryskill = 0; // 70 is Average
|
|
commandskill = 0;
|
|
|
|
// End of Editable Settings
|
|
// script-specific variables
|
|
|
|
hits = 0;
|
|
adjust = 0;
|
|
attackRange = 9999;
|
|
withdrawRange = 9999;
|
|
|
|
// driver settings
|
|
SetFiringDelay (ME,0.0,0.0);
|
|
SetIgnoreFriendlyFire (ME,true);
|
|
SetIsShotRadius (ME,200);
|
|
SetEntropyMood (ME,AGRESSIVE_END);
|
|
SetCurMood (ME,AGRESSIVE_END);
|
|
SetSkillLevel (ME,pilotskill,gunneryskill,commandskill);
|
|
SetAttackThrottle (ME,100);
|
|
SetMinSpeed (ME,100);
|
|
|
|
EnablePerWeaponRayCasting (ME,TRUE);
|
|
|
|
bot_activated_timer = gti_Timer_1;
|
|
|
|
endfunction;
|
|
|
|
function getmechsettactic;
|
|
var
|
|
integer i;
|
|
|
|
code
|
|
|
|
mymech = GetMechType(me);
|
|
mytactic = TACTIC_PICK_BEST;
|
|
|
|
switch (mymech)
|
|
|
|
Case FirstMechID:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
Case M_ArcticWolf:
|
|
mytactic = TACTIC_HIT_AND_RUN;
|
|
Endcase;
|
|
|
|
Case M_Ares:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
Case M_Argus:
|
|
mytactic = TACTIC_FAST_CIRCLE;
|
|
Endcase;
|
|
|
|
Case M_Atlas:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
Case M_Awesome:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_BlackKnight:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_BlackLanner:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
Case M_Brigand:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
Case M_Bushwacker:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
Case M_Catapult:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_CauldronBorn:
|
|
mytactic = TACTIC_CIRCLE_OF_DEATH;
|
|
Endcase;
|
|
|
|
Case M_Chimera:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
Case M_Commando:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
Case M_Cougar:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
Case M_Cyclops:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
Case M_Daishi:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_Deimos:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
Case M_Dragon:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_Flea:
|
|
mytactic = TACTIC_HIT_AND_RUN;
|
|
Endcase;
|
|
|
|
Case M_Fafnir:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_Gladiator:
|
|
mytactic = TACTIC_CIRCLE_OF_DEATH;
|
|
Endcase;
|
|
|
|
Case M_Grizzly:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
Case M_Hauptmann :
|
|
mytactic = TACTIC_CIRCLE_OF_DEATH;
|
|
Endcase;
|
|
|
|
Case M_Hellhound:
|
|
mytactic = TACTIC_HIT_AND_RUN;
|
|
Endcase;
|
|
|
|
Case M_Hellspawn:
|
|
mytactic = TACTIC_HIT_AND_RUN;
|
|
Endcase;
|
|
|
|
Case M_Highlander:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_HollanderII:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_Hunchback:
|
|
mytactic = TACTIC_CIRCLE_OF_DEATH;
|
|
Endcase;
|
|
|
|
Case M_Kodiak:
|
|
mytactic = TACTIC_CIRCLE_OF_DEATH;
|
|
Endcase;
|
|
|
|
Case M_Loki:
|
|
mytactic = TACTIC_CIRCLE_OF_DEATH;
|
|
Endcase;
|
|
|
|
Case M_Longbow:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_Madcat:
|
|
mytactic = TACTIC_CIRCLE_OF_DEATH;
|
|
Endcase;
|
|
|
|
Case M_Madcat_MKII:
|
|
mytactic = TACTIC_JUMP_AND_SHOOT;
|
|
Endcase;
|
|
|
|
Case M_Masakari:
|
|
mytactic = TACTIC_CIRCLE_OF_DEATH;
|
|
Endcase;
|
|
|
|
Case M_Mauler:
|
|
mytactic = TACTIC_CIRCLE_OF_DEATH;
|
|
Endcase;
|
|
|
|
Case M_Novacat:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_Osiris:
|
|
mytactic = TACTIC_HIT_AND_RUN;
|
|
Endcase;
|
|
|
|
Case M_Owens :
|
|
mytactic = TACTIC_HIT_AND_RUN;
|
|
Endcase;
|
|
|
|
Case M_Puma:
|
|
mytactic = TACTIC_JUMP_AND_SHOOT;
|
|
Endcase;
|
|
|
|
Case M_Raven:
|
|
mytactic = TACTIC_HIT_AND_RUN;
|
|
Endcase;
|
|
|
|
Case M_Ryoken:
|
|
mytactic = TACTIC_HIT_AND_RUN;
|
|
Endcase;
|
|
|
|
Case M_Shadowcat:
|
|
mytactic = TACTIC_JUMP_AND_SHOOT;
|
|
Endcase;
|
|
|
|
Case M_Solitaire:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
Case M_Sunder:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_Templar:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_Thanatos:
|
|
mytactic = TACTIC_JUMP_AND_SHOOT;
|
|
Endcase;
|
|
|
|
Case M_Thor:
|
|
mytactic = TACTIC_JUMP_AND_SHOOT;
|
|
Endcase;
|
|
|
|
Case M_Uller:
|
|
mytactic = TACTIC_HIT_AND_RUN;
|
|
Endcase;
|
|
|
|
Case M_Uziel:
|
|
mytactic = TACTIC_JUMP_AND_SHOOT;
|
|
Endcase;
|
|
|
|
Case M_Victor:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_Vulture:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case M_Wolfhound:
|
|
mytactic = TACTIC_CIRCLE_OF_DEATH;
|
|
Endcase;
|
|
|
|
Case M_Zeus:
|
|
mytactic = TACTIC_SNIPE;
|
|
Endcase;
|
|
|
|
Case NoMechID:
|
|
mytactic = TACTIC_PICK_BEST;
|
|
Endcase;
|
|
|
|
|
|
Endswitch;
|
|
endfunction;
|
|
|
|
|
|
state StartState;
|
|
|
|
code
|
|
StartTimer(bot_activated_timer);
|
|
trans CheckTimer;
|
|
|
|
endstate;
|
|
|
|
state CheckTimer;
|
|
|
|
code
|
|
|
|
//---------------------------------------------
|
|
// Time before Bot Wakes up and starts Shooting
|
|
//---------------------------------------------
|
|
if (TimeGreater(bot_activated_timer,5.0)) then
|
|
getmechsettactic;
|
|
trans WaitToAmbushState;
|
|
endif;
|
|
//---------------------------------------------
|
|
// Firing upon/near before timer up lets the bot go play
|
|
//---------------------------------------------
|
|
if (IsShot(ME) == TRUE) then
|
|
SetTarget(ME,WhoShot(ME));
|
|
getmechsettactic;
|
|
trans WaitToAmbushState;
|
|
endif;
|
|
trans CheckTimer;
|
|
|
|
endstate;
|
|
|
|
state WaitToAmbushState;
|
|
code
|
|
if (Bot_FindEnemy(attackrange)) then
|
|
trans AttackState;
|
|
endif;
|
|
|
|
if ((isshot(me)) == true) then
|
|
hits = hits + 1;
|
|
if (hits > 100) then
|
|
hits = 100;
|
|
endif;
|
|
shooter = Whoshot(me);
|
|
SetTarget (me,shooter);
|
|
SetTargetDesirability(shooter, hits);
|
|
endif;
|
|
|
|
OrderMoveLookOut;
|
|
endstate;
|
|
|
|
state AttackState;
|
|
code
|
|
if (LeaveAttackState(withdrawRange)) then
|
|
trans WaitToAmbushState;
|
|
endif;
|
|
|
|
if ((isshot(me)) == true) then
|
|
hits = hits + 1;
|
|
if (hits > 100) then
|
|
hits = 100;
|
|
endif;
|
|
shooter = Whoshot(me);
|
|
SetTarget (me,shooter);
|
|
SetTargetDesirability(shooter, hits);
|
|
endif;
|
|
|
|
OrderAttackTactic(TACTIC_STARE,TRUE);
|
|
endstate;
|
|
|
|
state DeadState;
|
|
code
|
|
shooter = WhoDestroyed(me);
|
|
SetTargetDesirability(shooter, 20);
|
|
|
|
orderDie;
|
|
endstate;
|
|
|
|
|
|
endfsm.
|
|
|
|
|
|
|
|
|