Page 1 of 1

problem with a verb routine

Posted: Thu Apr 28, 2016 12:44 pm
by misterman83
I'm working on a tactical combat system, slightly based on Necrotic Drift. For some reason, my DoHit replacement isn't working: Either the verb messages aren't printing, or the verb routine isn't running when I type "attack x".
The verb routine calls an external routine to calculate attack and damage rolls, as well as deal damage.
The external routine calls yet another external routine to print combat messages.
I don't think the problem lies in the external routine: it works perfectly when enemies attack the player, but not for when the player attacks an enemy.
Any help is appreciated.

Posted: Thu Apr 28, 2016 12:47 pm
by misterman83
Whoops. I think I posted the topic twice.

Posted: Fri Apr 29, 2016 7:51 am
by Roody_Yogurt
I'd probably have to see the code to track it down. Does your external routine have an argument for the attacker, like:

AttackSystem(attacker, victim)

Then you'd have your replacement DoHit call it with:

AttackSystem(player, object)

(so then your code can check if the attacker is the player for player-optimised messages)

Posted: Thu May 05, 2016 12:49 pm
by misterman83
Yes it does.
Here's my external attack routine:
routine fight(attacker, target)
{
AttackRoll = random(20)
if AttackRoll < target.armor_class: print CombatMessage(attacker, target, 1)
else {
print CombatMessage(attacker, target, 2)
DamageRoll = random(attacker.damage)
target.health -= (DamageRoll)
}
}

and Here's my combatMessages routine:
routine CombatMessage(attacker, target, num)
{
select num
case 1
{
print CThe(attacker);
print MatchPlural(attacker, "misses", "miss");
"!"
}
case 2
{
print CThe(attacker);
print MatchPlural(attacker, "hits", "hit");
print CThe(target);
" for ";
print number DamageRoll;
" damage!"
}
}

Posted: Thu May 05, 2016 3:24 pm
by Roody_Yogurt
First off, you want to be sure that your DoHit replacement is somewhere after roodylib is included (assuming you're using Roodylib), as that also replaces DoHit.

Then, you'd want your replacement to look something like this:

replace DoHit
{
if object is not living
VMessage(&DoHit)
elseif object = player
RlibMessage(&DoHit)
else
return fight(player, object)
}

Also, in your code, don't you want to set DamageRoll before you call the attack message?