At 12:00 AM 10/26/95 -0500, you wrote:
>I'm stumped. I am trying to implement multi-attacks for mobs that is
>independent of the skill based multi-attack that PCs have. I have it set up
>as a field in the enhanced mobile field. I am using Circle3.0 bpl8.
>I altered the code in this manner:
>
>In db.c in function interpret_espec I added a case
>
> CASE("NumAttacks") {
> RANGE(1, 10);
> mob_proto[i].mob_specials.numattacks = num_arg;
> }
>
>In utils.c I added
>
> #define GET_MOB_ATT(ch) ((ch)->mob_specials.numattacks)
>
>In structs.h, in the structure mob_special_data, I added a field
>
> int numattacks; /* Number of attacks */
>
>And finally, in fight.c, the relevant code in perform_violence looks like
>this:
>
> hit(ch, FIGHTING(ch), TYPE_UNDEFINED);
> if (FIGHTING(ch) == NULL || ch->in_room != FIGHTING(ch)->in_room) {
> stop_fighting(ch);
> continue;
> } else if (!IS_NPC(ch)) {
> percent = number(1, 101); /* 101% is complete failure */
> if (percent < GET_SKILL(ch, SKILL_SECOND_ATTACK))
> hit(ch, FIGHTING(ch), TYPE_UNDEFINED);
> } else if (IS_NPC(ch) && GET_MOB_ATT(ch) > 1) {
> for (j = 2; j < (GET_MOB_ATT(ch) + 1); j++)
> hit(ch, FIGHTING(ch), TYPE_UNDEFINED);
> }
> if (MOB_FLAGGED(ch, MOB_SPEC) && mob_index[GET_MOB_RNUM(ch)].func !=
>NULL)
> (mob_index[GET_MOB_RNUM(ch)].func) (ch, ch, 0, "");
> }
> }
>
>The added code is between the first hit function and the if (MOB_FLAGGED)
>statement.
>
>The first else if is for the player. It works fine.
>The second else if does not work properly.
>
>I sure I defined everything, I can see no flaw in the logic, but I'm getting
>unexpected results.
>
>1. I created a hydra with 9 attacks
>2. I have the hydra attack Puff
>3. Puff gets 9 attacks against the Hydra. The hydra only gets one.
>4. I have the hydra attack Jupiter. Both only get one attack.
>
>Based on the result from Puff, I tried to reverse the arguments in hit(), but
>that caused a segmentation fault. Normally, I view stuff like this as a good
>learning experience (much like my troubles implementing racial maximums), but
>this problem makes no sense to me.
>
>Could someone please point out my mistake, or, better yet, tell me a better
>way of doing it?
>
>
Well , when I coded multiple attacks it was a little tricky at first, but I
used a pretty simple method.
A) I set up mob action bitstrings for 2,3 and 4 attacks
B) I altered perform_violence() in fight.c to do a check like this :
int num_attacks=0;
int counter=0;
if (MOB_FLAGGED(MOB_2ATTACKS,ch))
num_attacks+=2
else counter++;
if (MOB_FLAGGED(MOB_3ATTACKS,ch))
num_attacks+=3;
else counter++;
if (MOB_FLAGGED(MOB_4ATTACKS,ch))
num_attacks+=4;
else counter++
if (counter==3)
num_attacks=1;
Below this was the checks for the warrior and thief multiple attacks skills
etc ..
As can be seen above, although this method leaves a bit to be desired when
it comes to customizing the number of attacks
I can have mobs that have 1,2,3,4,5,6,7 or 9 attacks. Kinda clugy - but it
was my first hack. I found that the key to make everything work was that I
do a while loop in the hit() function until num_attacks=0. If I simply
called the hit() function x number of times from perform_violence it didn't
work properly and caused seg faults sometimes. Anyway, this method worked
fine for me and I will probably never have a mob on my mud that has more
than 9 attacks (too much spam).
Good Luck
Maistro/Malador/Grimlock/Groo
--
_______________________________________________________________________(_)
(_) Glenn Campbell Voice:902-564-3660 (136)
|
| | Computer Systems Specialist Fax:902-562-6113
|
| | Canadian Coast Guard College Voice Mail:902-565-6563 (20 second )
|
| |_______________________________________________________________________)
(_)
This archive was generated by hypermail 2b30 : 12/07/00 PST