• Tutorials

  • Home
  • Guarding Scripts


    When Free Attack Ends Reduce the number of attacks available Combatant / FreeAttack-AttackOver
    When enemy retreats Should combatant 'Free Attack'? Combatant / FreeAttack-CanFreeAttack
    When Guard Attack Ends Reduce the number of attacks available Combatant / Guarding-AttackOver
    When a combat begins Initialize combatant status Combatant / Guarding-BeginCombat
    Combat Menu or Auto Movement terminated by max steps. Should the combatant enter 'Guard' mode Combatant / Guarding-CanGuard
    When enemy approaches Should combatant 'Guard Attack'? Combatant / Guarding-CanGuardAttack
    At Start of Combat Round Information Only Combatant / Guarding-StartOfRound

    FreeAttack-AttackOver

    After Free attack is complete we attempt to call this script. Then we use HookParameter[7] to modify the number of 'Normal' attacks that this combatant can use in this round. We use HookParameter[8] to modify the number of additional 'Free' attacks that this combatant can execute against the same enemy combatant.

    This script can modify HookParameter[7] and HookParameter[8].

    The script should use this opportunity to update its own count of the number of 'Free' attacks available to this combatant.

    Parameters:

    Parameter [5] = Number of available attacks (before this Free attack)
    Parameter [6] = Number of Free attacks against this one enemy (before this free attack). This is currently always 1.
    Parameter [7] = Minus one.
    Parameter [8] = Minus one.

    Context:

    Combatant

    Result: Ignored


    FreeAttack-CanFreeAttack

    This script is called whenever a combatant who is adjacent to a potential 'Free Attacker' moves to a position that is not adjacent to the potential 'Free Attacker'.

    Parameters:

    Parameter [5] = attacker's number of available attacks
    Parameter [6] = “Y” if attacker is party member; else “N”
    Parameter [7] = “Y” if attacker is on 'Auto'. “N” if under player control.
    Parameter [8] = number of attacks allowed per turn for this combatant. It may be the number of attacks specified for a monster or it may be the Rate-of-Fire of a readied weapon.

    Context:

    Attacker
    Target

    Result: If the script returns a 'Y' as the first character then the Free attack can take place. The default result is an empty string and no free attack can occur.


    Guarding-AttackOver

    After Guarding attack is complete we attempt to call this script. Then we use HookParameter[7] to modify the number of 'Normal' attacks that this combatant can use in this round. We use HookParameter[8] to modify the number of additional 'Guard' attacks that this combatant can execute against the same enemy combatant.

    This script can modify HookParameter[7] and HookParameter[8].

    The script should use this opportunity to update its own count of the number of 'Guard' attacks available to this combatant.

    Parameters:

    Parameter[5] = Number of available attacks (before this guarding attack)
    Parameter [6] = Number of Guarding attacks against this one enemy (before this guarding attack). This is currently always 1.
    Parameter [7] = Minus one.
    Parameter [8] = Minus one.

    Context:

    Combatant

    Result: Ignored


    Guarding-BeginCombat

    Immediately after placing all combatants in the arena we search each combatant for a script named 'Guarding-BeginCombat'

    Parameters:

    None

    Context:

    Combatant

    Result ignored.

    Guarding-CanGuard

    Parameters:

    Parameter [5] = case number (1 or 2 – see below)

    Context:

    Combatant

    Result: If the first character of the result is 'Y' then the combatant is able to 'Guard'.

    Default result: 'N'

    Case 1:

    When a combatant is in 'Auto' mode and is fleeing and exhausts his maximum number of steps.

    Case 2:

    When a combatant is in player control and the combat menu is about to be displayed. Answer the question: “Should “GUARD” be a combat option?”.


    Guarding-CanGuardAttack

    Parameters:

    Parameter [5] = attacker's number of available attacks
    Parameter [6] = “Y” if attacker is party member; else “N”
    Parameter [7] = “Y” if attacker is on 'Auto'. “N” if under player control.

    Context:

    Attacker
    Target

    Result: If the script returns a 'Y' as the first character then the Guarding attack can take place. The default result is an empty string and no guarding attack can occur.


    Guarding-StartOfRound

    At the start of each combat round, this hook is called for each combatant. The hook “StartCombatRound” is also called under exactly the same circumstances but I added this so that 'Guarding' issues could be handled in their own private way and keep the scripts simpler. If it is important to you, you should know that “StartCombatRound is called first and Guarding-StartOfRound is called second.

    Parameters:

    Parameter [5] = current state of the combatant:
    0 = ICS_None
    1 = ICS_Casting,
    2 = ICS_Attacking
    3 = ICS_Guarding
    4 = ICS_Bandaging,
    5 = ICS_Using
    6 = ICS_Moving
    7 = ICS_Turning
    8 = ICS_Fleeing
    9 = ICS_Fled
    10 = ICS_ContinueGuarding (into next round)
    Parameter [6] = can be set to force a continuation of 'ICS_Guarding'. Normally at the start of each round, a combatant who is not in 'ICS_Casting' state and who is not in 'Auto' mode will have his state set to 'ICS_None'. If HookParameter[6] contains a 'G' then any non-Auto combatant who is in 'ICS_Guarding' state will be set to 'ICS_ContinueGuarding' and will remain in that state until his initiative arrives. He will then be set to 'ICS_None' and his combat menu will be displayed.

    Context:

    Combatant
    Character

    Result: Ignored. Probably best to return “” in case we augment this hook someday.

    Default Result: “”



    The control of 'Free' attacks and 'Guard' attacks is entrusted to these scripts. Here is a possible outline of the process:

    */
    
    Good Morning,
    
    OK.  Here is what I plan. This email message
    will be copied verbatim into the C++ code as
    comments as a reference. Let me know if it
    seems wrong.
    
    What follows here is a kind of "Pseudo-code"
    as if it were being done by hook scripts)
    and is applied to each combatants; PC, NPC,
    or monster. I will attempt to code this
    algorithm in such a way that hooks could
    be inserted at any of these points in the
    hard-coded algorithm. This may take a couple
    of days and obviously will require more
    extensive testing because there are so
    many possibilities.
    
    $VAR AttacksRemaining;
    $VAR GuardingAttacksRemaining;
    $VAR IsGuarding;
    
    [Guarding-CanGuard]
    $IF (is monster) $RETURN "N";
    $IF (rangeWeapon) $RETURN "N";
    $RETURN "Y";
    
    [Guarding-BeginCombat]
    GuardingAttacksRemaining = 0;
    IsGuarding = false;
    
    [Guarding-StartOfRound]
    AttacksRemaining = ;
    
    [Guarding-Guard] // combatant enters 'guard' mode
    GuardingAttacksRemaining = AttacksRemaining
    IsGuarding = true;
    
    [Guarding-StartOfTurn] // menu presented for combatant
    IsGuarding = false;
    GuardingAttacksRemaining = 0;
    
    [Guarding-CanGuardAttack] // enemy approaches
    $IF( !IsGuarding) $RETURN "N";
    $IF (rangeWeapon) $RETURN "N";
    $IF(GuardAttacksRemaining <=# 0) $RETURN "N";
    $IF(AttacksRemaining <=#0) $RETURN "N";
    $RETURN "Y";
    
    [Guarding-AttackOver]
    Decrement GuardAttacksRemaining;
    $IF(GuardAttacksRemaining <=#0) IsGuarding = false;
    Decrement AttacksRemaining
    
    [FreeAttack-CanFreeAttack] // enemy departs
    $IF(rangeWeapon) $RETURN "N";
    $RETURN "Y";
    
    [FreeAttack-AttackOver]
    Decrement AttacksRemaining;
    Decrement GuardAttacksRemaining;
    $IF(GuardAttacksRemaining <=#0) IsGuarding = false;
    
    [CanAttack]
    $IF (IsGuarding) $RETURN "N";
    $RETURN "Y";
    
    Now I will attempt to apply this algorithm to your
    examples.
    
    On 10/17/2011 7:30 PM, Eric Cone wrote:
    ***> Good afternoon.
    ***>
    ***> First things first - terminology.
    ***>
    ***> Free attack: an attack that follows all the rules of regular
    ***> melee physical attacks (with or without weapon weapon, if
    ***> weapon only range of 1 counts as melee)
    ***> Guarding attack: a type of free attack that occurs when
    ***> a combatant moves adjacent to a combatant that is GUARDING.
    ***> As of this time, only***> combatants under player control
    ***> may GUARD.
    
    Handled by $IF (is monster) in [Guarding-CanGuardAttack]
    
    ***> which may occur between a combatants consecutive turns is
    ***> equal to it's number of attacks per turn.
    
    Handled by:
    [Guarding-Guard]
    [Guarding-StartOfTurn]
    {Guarding-AttackOver]
    
    ***>
    ***> The other kind of free attack, occurs when a combatant moves
    ***> away from an adjacent square, once per monster moving away.
    ***>
    ***> With that in mind, let's use Tom's answers to the
    ***> questions - he was very thorough, and once the vocabulary
    ***> is straightened out, I completely agree. Here it is.
    ***>
    ***> -Eric
    ***>
    ***> On Sun, Oct 16, 2011 at 7:40 AM,  > wrote:
    ***>
    ***> Good Morning Eric,
    ***>
    ***> Here are the answers I came up with for Paul's
    ***> questions.
    ***>
    ***> If an enemy is immediately adjacent and moves away
    ***> then he is subject to a free attack.
    ***>
    ***> If an enemy is not immediately adjacent and moves
    ***> so as to become immediately adjacent he is subject
    ***> to a 'guarding' attack, but not a free attack.
    ***>
    ***> The Exact Rules:
    ***>
    ***> Free Attacks
    ***>
    ***> 1. The 'free attack' is actually comprised of the
    ***> attacker's entire 'attack routine' for a combat
    ***> round. This is normally 1 or 2 attacks for
    ***> characters. For 'monsters', it may be 8 or more.
    ***>
    ***> 2. Free attacks will always occur if the target is
    ***> valid (IsValidTarget != "N") and the attacker is
    ***> able to execute a melee attack.
    ***> (IsCombatReady != "N", and a missile weapon is
    ***> not readied.)
    
    Handled by [FreeAttack-CanFreeAttack]
    
    
    ***>
    ***> 3. If a free attack occurs before the attacker's
    ***> normal action for the round, any attacks executed
    ***> are deducted from the attacks available for that
    ***> round. If the attacks are depleted it constitutes
    ***> the combatant's action for the round, and the
    ***> combatant gets no 'turn'.
    
    Handled by [FreeAttack-MakeFreeAttack]
    You did not specify this so I made a guess
    that a free attack should also reduce the
    number of guard attacks remaining.
    
    ***>
    ***> 4. Free attacks are allowed against fleeing enemies
    ***> regardless of whether the attacker has any 'normal'
    ***> attacks remaining, so in that sense they are
    ***> unlimited.
    ***>
    
    Handled by [FreeAttack-CanFreeAttack]
    
    
    ***> Guarding Attacks
    ***>
    ***> Combatants who do not have missile weapons readied
    ***> may select 'Guard' as a combat action. If a
    ***> non-adjacent enemy moves adjacent to a guarding
    
    Handled by [Guarding-CanGuard]
    
    ***> combatant, the guarding combatant will execute its
    ***> attack routine. Any attacks made will be deducted
    ***> from those available to the attacker in the combat
    ***> round when guard was set. If the attacks are
    ***> depleted, guarding status is removed.
    
    Handled by:
    [MakeAttack]
    [FreeAttack-AttackOver]
    [Guarding-AttackOver]
    
    ***>
    ***> Example:
    
    [StartOfCombat]
    GuardAttacksRemaining=0;
    
    
    ***> A combatant selects Guard in round three. If an
    ***> enemy moves adjacent prior
    
    [Guarding-StartOfRound] Round 3
    AttacksRemaining = 3; // for example
    [Guarding-Guard] round 3
    GuardAttacksRemaining = AttacksRemaining = 3; //for example
    [Guarding-AttackOver] round 3
    Decrement GuardAttacksRemaining (now = 2)
    
    ***> to the guarding combatant's turn in round four,
    ***> the guarding combatant will
    
    [GuardIng-StartOfRound] Round 4
    AttacksRemaining = 3;
    
    ***> execute its attack routine, and the attacks will
    ***> be counted against the attacks available in round
    ***> three (when Guard was set). The combatant's round
    ***> four turn remains available.
    
    [Guarding-AttackOver]
    Decrement AttacksAvailable (now = 3)
    Decrement GuardAttacksRemaining (now = 1)
    
    The rest of your explanation assumed that
    'free attacks' are completely separate from
    'guard attacks' whereas my questions assumed
    they were two different aspects of the same
    thing. So the answers did not apply to the
    intent of my questions.
    
    
    PAul
    */