Lately I've been working on writing arena code for my mud. However,
I've hit a snag in the form of an irritating crash bug which I haven't
been able to track down. I've been staring at the place where it
crashes and the code still makes sense to *me* -- why doesn't it make
sense to the mud?
The crash occurs in a function called arena_store_affects(). That's
where I attempt to remove the affects from a character, and store
them for later. (That way players enter the arena without spell-ups,
and get them back when they exit.)
The code....
struct combatant_info_type {
struct char_data *ch; /* player */
sh_int was_in; /* room was in */
byte team; /* which team it's on */
sh_int hit; /* maxhit/mana/moves */
sh_int mana;
sh_int move;
struct affected_type *affected; /* affects that were on the player */
struct combatant_info_type *next; /* the next combatant */
};
void arena_store_affects(struct char_data *ch, struct combatant_info_type
*comb) {
struct affected_type *aff, *new_aff;
comb->affected = NULL;
for (aff = ch->affected; aff; aff = aff->next) {
CREATE(new_aff, struct affected_type, 1);
clear_affect(new_aff);
new_aff->type = aff->type; /* <-- Crashes here */
new_aff->idnum = aff->idnum;
new_aff->duration = aff->duration;
new_aff->modifier = aff->modifier;
new_aff->location = aff->location;
new_aff->bitvector = aff->bitvector;
new_aff->bitvector1 = aff->bitvector1;
new_aff->next = comb->affected;
comb->affected = new_aff;
affect_remove(ch, aff);
}
}
GDB says...
Core was generated by `bin/circle -q 4200'.
Program terminated with signal 11, Segmentation fault.
#0 arena_store_affects (ch=0x874d478, comb=0x8750e70) at arena.c:207
207 new_aff->type = aff->type;
(gdb) bt
#0 arena_store_affects (ch=0x874d478, comb=0x8750e70) at arena.c:207
#1 0x808fbba in add_combatant (ch=0x874d478, team=0) at arena.c:129
#2 0x8090fd0 in arena_join (ch=0x874d478) at arena.c:953
#3 0x8090b12 in do_arena (ch=0x874d478, argument=0xbffffa8d " accept",
cmd=28, subcmd=0) at arena.c:709
#4 0x80bccb6 in command_interpreter (ch=0x874d478, argument=0xbffffa88
"arena accept") at interpreter.c:954
#5 0x804a33c in game_loop (mother_desc=3) at comm.c:782
#6 0x8049a64 in init_game (port=4200) at comm.c:384
#7 0x80499d9 in main (argc=3, argv=0xbffffde8) at comm.c:346
(gdb) printf "new_aff->type: %d, aff->type: %d\n", new_aff->type, aff->type
new_aff->type: 0, aff->type: 8305
(gdb) print new_aff
$1 = (struct affected_type *) 0x874ed20
(gdb) print aff
$2 = (struct affected_type *) 0x38
(gdb) print *aff
$3 = {type = 8305, duration = 12852, modifier = 48 '0', location = 48 '0',
idnum = 0, bitvector = 0, bitvector1 = 0,
bitvector2 = 0, bitvector3 = 0, bitvector4 = 0, bitvector5 = 0, demon_id
= 0, obj_bitvector = 0, room_bitvector = 0,
next = 0x0}
It looks like 'aff' is total garbage, but I don't know how that is
happening. I tried putting in a couple log statements, but the mud
crashed on _them_. Maybe it's because I've been coding for 17 hours
straight, but I can't see what I'm missing.
The log...
< 5000H 5000M 1000V > cast 'spellshield' me
Okay.
A shield of magical energy surrounds your body.
< 5000H 5000M 1000V > stat meer
female PC 'Meer' IDNum: [ 1], In room [ 1214]
L-Des: <None>
Level: [110], XP: [50000000], Align: [-110], Remorts: [0]
Created: [Mon Feb 28], Last Logon: [Thu Aug 31], Played [0h 0m], Age [31]
Hometown: [1], Speaks: [0/0/0], Pracs: [99], Has Remort: no(0)
Hit Pts:[5000/5000+10] Mana Pts:[5000/5000+24] Move Pts:[1000/1000+24]
Coins: [ 0], Bank: [ 37805] (Total: 37805)
AC: [0], Hitroll: [ 3], Damroll: [ 0]
Saving throws: [20/0/0/0/0/0/0/0/0/0/0/0]
Pos: Standing, Fighting: Nobody, Connected: Playing
Default position: Standing, Idle Timer (in tics) [0]
PLR: NOBITS
PRF: D_H D_M D_V A_EX !HASS LIGHT C1 C2 L1 L2 RMFLG A_COND STACK
Carried: weight: 0, items: 0; Items in: inventory: 0, eq: 0
Hunger: [-1], Thirst: [-1], Drunk: [-1], Drugged: [-1]
Master is: <none>, Followers are:
AFF : NOBITS
AFF1: SPELLSHIELD
SPL: ( 7hr) spellshield +20 to SAVE_MAGIC
< 5000H 5000M 1000V >
[ARENA] Lyre challenges Meer to a duel!
[ARENA] You have been challenged to a duel by Lyre! (Type 'arena accept'
to defend your honor.)
< 5000H 5000M 1000V > arena accept
[BOOM!!!]
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 04/11/01 PDT