dnl ====================================================================== dnl File : ralf.m4 dnl Purpose : m4-source for bg2-scripts dnl ====================================================================== divert(-1) define(`SCRIPT',ralf)dnl Name of generated script define(`STAMP',Time-stamp: )dnl time stamp divert(0)dnl include(`source/macros.m4')dnl dnl ====================================================================== dnl script section: dnl ====================================================================== SECTION(1,File : SCRIPT.baf,Purpose : Universal controlable script,STAMP,DO NOT EDIT: This script is generated from ralf.m4) dnl ====================================================================== SECTION(1,Control-Keys:,) CMT(2,dnl J = Yell for help,dnl D = Change active NPCs to melee-mode,dnl F = Change active NPCs to ranged-mode,dnl C = Set leader-mode for active NPC,dnl S = Toggle follow-mode,dnl G = Change "yell-for-help"-level,dnl P = Drop everything,dnl V = Spread party,dnl ) dnl ====================================================================== SECTION(1,Main features:,) CMT(2,* Leader/follow mode:,) CMTFLOW(3,All character with active follow-mode follow the current leader. dnl They only do this if they are 20 steps away _and_ outside of screen.) CMT(2,* Ranged/melee mode:,) CMTFLOW(3,If NPC is in ranged-mode he runs away from close enemies and attacks them with ranged weapons. dnl In both modes NPC switches to melee weapons if enemy gets too close.) CMT(2,* NPC communication:,) CMTFLOW(3,NPCs shout if they are HURT/POISONED/UNDER_ATTACK or ATTACKING. dnl The other NPCs react on these calls.) CMT(3,- HURT:,) CMTFLOW(4,Depending on "yell-for-help"-level they call for help at 75%/50%/25% or never. dnl They only yell for help if they don't see an enemy. If they have potions they use them.) CMT(3,- POISONED:,) CMTFLOW(4,[...]) CMT(3,- UNDER_ATTACK:,) CMTFLOW(4,[...]) CMT(3,- ATTACKING:,) CMTFLOW(4,[...]) dnl ====================================================================== SECTION(1,Hotkeys:) define(`SHOUT_FOR_HELP',`Shout($1) DebugStringHead(Myself,STR_HEAL),lset($2,1),START_TIMER(WAIT_HELP)')dnl SHOUT_FOR_HELP(shout,state) SECTION(2,yell for help) ADDIT( HotKey(J), SHOUT_FOR_HELP(HURT,HealState)) SECTION(2,drop all items) ADDIT( HotKey(P), DropInventory(), RandomWalk()) dnl ---------- SECTION(2,switch to melee-mode) ADDIT( HotKey(D), Melee(), lset(MeleeAttack,1)) SECTION(2,switch to ranged-mode) ADDIT( HotKey(F), Ranged(), lset(MeleeAttack,0)) dnl ---------- SECTION(2,set myself as leader) forloop(`i',0,5,`SetAsLeader(i)') SECTION(2,autocenter on myself) forloop(`i',0,5,`SetCenterOn(i)') forloop(`i',0,5,`SetCenterOff(i)') forloop(`i',0,5,`CenterOn(i)') dnl ---------- SECTION(2,turn off leader) FORCE(`UND(HotKey(C),!geq(FollowMe,0))', DisplayStringHead(Myself,STR_FOLLOW_MODE_OFF), gset(FollowMe,0)) dnl ---------- SECTION(2,toggle follow mode) FORCE(`UND(HotKey(S),leq(AutoFollow,0))',DisplayStringHead(Myself,STR_FOLLOW_MODE_ON),lset(AutoFollow,1)) FORCE(`UND(HotKey(S),leq(AutoFollow,1))',DisplayStringHead(Myself,STR_FOLLOW_MODE_OFF),lset(AutoFollow,0)) dnl ---------- SECTION(2,set pain tolerance) dnl PainTolerance==0 -> never heal dnl PainTolerance==1 -> heal if below 25% dnl PainTolerance==2 -> heal if below 50% dnl PainTolerance==3 -> heal if below 75% FORCE(`UND(HotKey(G),leq(PainTolerance,0))',DisplayStringHead(Myself,STR_SHOUT_HELP_25),lset(PainTolerance,1)) FORCE(`UND(HotKey(G),leq(PainTolerance,1))',DisplayStringHead(Myself,STR_SHOUT_HELP_50),lset(PainTolerance,2)) FORCE(`UND(HotKey(G),leq(PainTolerance,2))',DisplayStringHead(Myself,STR_SHOUT_HELP_75),lset(PainTolerance,3)) FORCE(`UND(HotKey(G),leq(PainTolerance,3))',DisplayStringHead(Myself,STR_SHOUT_HELP_NO),lset(PainTolerance,0)) dnl ---------- SECTION(2,spread party to explore area) SECTION(3,start spread-party-mode) FORCE(`UND(HotKey(V),geq(SpreadParty,0),InPartySlot(Myself,0))',`gset(SpreadParty,1),START_TIMER(SPREAD),DisplayStringHead(Myself,STR_TARGET)') SECTION(3,stop spread-party-mode) FORCE(`UND(HotKey(V),geq(SpreadParty,1),InPartySlot(Myself,0))',`gset(SpreadParty,0),DisplayStringHead(Myself,STR_STOP)') FORCE(`UND(geq(SpreadParty,1),TIMEOUT(SPREAD))',`gset(SpreadParty,0),DisplayStringHead(Myself,STR_STOP)') SECTION(3,run around) ALLOW(`geq(SpreadParty,1)',`RUN_AWAY_FROM(SecondNearest([PC])),DisplayStringHead(Myself,STR_OFF)') dnl ====================================================================== SECTION(1,unpoison/heal) SECTION(2,unpoison myself) USE_ITEM_IF(I_AM_POISONED,"POTN20") USE_ITEM_IF(I_AM_POISONED,"POTN17") USE_SPELL_IF(I_AM_POISONED,CLERIC_NEUTRALIZE_POISON) USE_SPELL_IF(I_AM_POISONED,INNATE_SLOW_POISON) USE_SPELL_IF(I_AM_POISONED,CLERIC_SLOW_POISON) SECTION(2,heal myself with potions etc.) USE_ITEM_IF(HEALTH_BELOW(60),"POTN08") USE_ITEM_IF(HEALTH_BELOW(60),"IPOTN08") USE_ITEM_IF(HEALTH_BELOW(45),"POTN52") USE_ITEM_IF(HEALTH_BELOW(45),"TTPOT") SECTION(2,simulate death) FORCE(`UND(HEALTH_BELOW(10),SEE_ENEMY,I_AM_NOT_POISONED)',SHOUT_FOR_HELP(HURT,HealState),PlayDead(15000)) dnl ----------- divert(-1) define(`COMMANDER',`LastCommandedBy(Myself)')dnl define(`HS_CLEAR',`0') define(`HS_SHOUTED',`1') define(`HS_ORDERED',`2') define(`WAIT_FOR_HELP', `SECTION(3,anyone $2? give him the order to do so) ALLOW(`UND(leq($1,HS_SHOUTED),Heard([PC],$2))',lset($1,HS_ORDERED),REQUEST(LastHeardBy(Myself),$3),MEET_WITH(LastHeardBy(Myself))) SECTION(3,nobody answered - try again) ALLOW(`UND(leq($1,HS_SHOUTED),TIMEOUT(WAIT_HELP))',SHOUT_FOR_HELP($4,$1)) SECTION(3,i requested $3 - and got ack) ALLOW(`UND(leq($1,HS_ORDERED),GOT_ACKNOWLEDGE($3))' DebugStringHead(Myself,STR_HEALED),lset($1,HS_CLEAR)) SECTION(3,i requested $3 - but ack timed out) ALLOW(`UND(leq($1,HS_ORDERED),TIMEOUT(CAT(ACK_,$3)))',SHOUT_FOR_HELP($4,$1))' ) dnl WAIT_FOR_HELP(state,shout_can,order,shout) define(`HELP_WITH_SPELL', `SECTION(3,cast $1 to help and send ack) ALLOW(`UND(GOT_REQUEST($4),HaveSpell($1),SEE_ENEMY)', `KEEP_DISTANCE_TO(NEAREST_ENEMY) DebugStringHead(Myself,STR_HEALING),Spell(COMMANDER,$1),ACKNOWLEDGE(COMMANDER,$4)') ALLOW(`UND(GOT_REQUEST($4),HaveSpell($1))', `DebugStringHead(Myself,STR_HEALING),Spell(COMMANDER,$1),ACKNOWLEDGE(COMMANDER,$4)') SECTION(3,say i could cast $1 to help) ALLOW(`UND(Heard([PC],$2),HaveSpell($1))',Shout($3) DebugStringHead(Myself,STR_CURE_LIGHT_WOUNDS))' ) dnl HELP_WITH_SPELL(spell,shout_help,shout_can,order) define(`HELP_WITH_ITEM', `SECTION(3,give $1 to help (only if enemy is visible)) ALLOW(`UND(SEE_ENEMY,GOT_REQUEST($4),HasItem($1,Myself))', `KEEP_DISTANCE_TO(NEAREST_ENEMY) DebugStringHead(Myself,STR_HEALING),GiveItem($1,COMMANDER),ACKNOWLEDGE(COMMANDER,$4)') SECTION(3,say i could give item $1 to help) ALLOW(`UND(SEE_ENEMY, Heard([PC],$2),HasItem($1,Myself))',`Shout($3) DebugStringHead(Myself,STR_CURE_LIGHT_WOUNDS)') ') dnl HELP_WITH_ITEM(item,shout_help,shout_can,order) define(`UNPOISON_WITH_SPELL',`HELP_WITH_SPELL($1, POISONED, CAN_UNPOISON, UNPOISON)') define(`HEAL_WITH_SPELL', `HELP_WITH_SPELL($1, HURT, CAN_HEAL, HEAL)') define(`UNPOISON_WITH_ITEM',`HELP_WITH_ITEM($1, POISONED, CAN_UNPOISON, UNPOISON)') define(`HEAL_WITH_ITEM', `HELP_WITH_ITEM($1, HURT, CAN_HEAL, HEAL)') divert(0) dnl ---------- SECTION(1,help others) SECTION(2,unpoison others) UNPOISON_WITH_SPELL(CLERIC_NEUTRALIZE_POISON) UNPOISON_WITH_SPELL(INNATE_SLOW_POISON) UNPOISON_WITH_SPELL(CLERIC_SLOW_POISON) UNPOISON_WITH_ITEM("POTN20") UNPOISON_WITH_ITEM("POTN17") SECTION(2,heal others) HEAL_WITH_SPELL(CLERIC_HEAL) HEAL_WITH_SPELL(INNATE_LAYHANDS) HEAL_WITH_SPELL(INNATE_CURE_LIGHT_WOUNDS) HEAL_WITH_SPELL(PALADIN_LAY_ON_HANDS) HEAL_WITH_SPELL(MONK_LAY_ON_HANDS) HEAL_WITH_SPELL(CLERIC_CURE_CRITICAL_WOUNDS) HEAL_WITH_SPELL(CLERIC_CURE_SERIOUS_WOUNDS) HEAL_WITH_SPELL(CLERIC_CURE_MEDIUM_WOUNDS) HEAL_WITH_SPELL(CLERIC_CURE_LIGHT_WOUNDS) HEAL_WITH_SPELL(CLERIC_AID) HEAL_WITH_SPELL(INNATE_LAYHANDS) HEAL_WITH_SPELL(INNATE_LAYHANDS) HEAL_WITH_ITEM("POTN08") HEAL_WITH_ITEM("IPOTN08") HEAL_WITH_ITEM("POTN52") HEAL_WITH_ITEM("TTPOT") dnl ----------- SECTION(2,wait for help) WAIT_FOR_HELP(UnpoisonState, CAN_UNPOISON, UNPOISON, POISONED) WAIT_FOR_HELP(HealState, CAN_HEAL, HEAL, HURT) dnl ----------- SECTION(2,yell for help) SECTION(3,yell for unpoison) ALLOW(`I_AM_POISONED',`SHOUT_FOR_HELP(POISONED,UnpoisonState)') SECTION(3,check hitpoints and yell for help if needed) ALLOW(`NEED_HELP1',`SHOUT_FOR_HELP(HURT,HealState)') ALLOW(`NEED_HELP2',`SHOUT_FOR_HELP(HURT,HealState)') ALLOW(`NEED_HELP3',`SHOUT_FOR_HELP(HURT,HealState)') dnl ====================================================================== SECTION(1,follow my leader) forloop(`i',1,6,`FollowLeader(i)') dnl ====================================================================== SECTION(1,combat) SECTION(2,run away from party members attacking me (charmed?)) ALLOW(`UND(I_AM_ATTACKED,InParty(ATTACKER))',GOTO_SAFE_POSITION(ATTACKER)) dnl ALLOW(`UND(I_AM_ATTACKED,InParty(ATTACKER))',GOTO_SAFE_POSITION(NEAREST_ENEMY)) dnl define(`SHOUT',`ifelse($1,,,`Shout($1),')')dnl dnl dnl STANDARD_ATTACKS(condition,target[,shout]) define(`STANDARD_ATTACKS',` NL(CMT(1,i am damaged) )FORCE(`UND($1,lgt(HealState,0),DIST_NEAR($2))', SHOUT($3) GOTO_SAFE_POSITION($2),Ranged(),ATTACK($2)) NL(CMT(1,melee-attack in melee-mode) )ALLOW(`UND($1,I_AM_MELEE,DIST_MEDIUM($2))', SHOUT($3) Melee(),ATTACK($2)) NL(CMT(1,ranged-attack in melee-mode) )ALLOW(`UND($1,I_AM_MELEE)', SHOUT($3) Ranged(),ATTACK($2)) NL(CMT(1,melee-attack in ranged-mode) )ALLOW(`UND($1,I_AM_RANGED,DIST_VERY_NEAR($2))', SHOUT($3) Melee(),ATTACK($2)) NL(CMT(1,keep-distance in ranged-mode) )ALLOW(`UND($1,I_AM_RANGED,DIST_MEDIUM($2))', SHOUT($3) KEEP_DISTANCE_TO($2),Ranged(),ATTACK($2)) NL(CMT(1,ranged-attack in ranged-mode) )ALLOW(`UND($1,I_AM_RANGED)', SHOUT($3) Ranged(),ATTACK($2))') SECTION(2,defend myself) STANDARD_ATTACKS(`ATTACKED',`ATTACKER',`UNDER_ATTACK') CMT(1,hide in shadows if combat starts) ALLOW(`UND(FRIEND_ATTACKED,NO_ENEMY,!INVISIBLE(Myself))',Hide()) ALLOW(`UND(FRIEND_ATTACKING,NO_ENEMY,!INVISIBLE(Myself))',Hide()) SECTION(2,defend friends who are attacked (attack their attackers)) STANDARD_ATTACKS(`FRIEND_ATTACKED',`HIS_ATTACKER') SECTION(2,coordinate with friends who are attacking (attack their nearest enemy)) STANDARD_ATTACKS(`FRIEND_ATTACKING',`HIS_TARGET') SECTION(2,attack nearest/second nearest visible targets and tell friends to coordinate) STANDARD_ATTACKS(`SEE_TARGET(Nearest)',`LAST_SEEN',`ATTACKING') STANDARD_ATTACKS(`SEE_TARGET(SecondNearest)',`LAST_SEEN',`ATTACKING') dnl ====================================================================== SECTION(1,if not in combat do special actions) SECTION(2,search for traps) ALLOW(`UND(I_AM_THIEF,!ModalState(DETECTTRAPS))',`FindTraps()') SECTION(2,eat berries) USE_ITEM_IF(`UND(NO_ENEMY,HEALTH_BELOW(95))',"GBERRY") SECTION(2,make berries) USE_SPELL_IF(`UND(NO_ENEMY,!HAVE_ITEM("GBERRY"))',`CLERIC_GOOD_BERRIES') dnl SECTION(2,auto-scroll) dnl ALLOW(`UND(`geq(AutoScroll,1)')',`MoveViewObject(Player3,10)') dnl ====================================================================== SECTION(1,end of SCRIPT.baf)