creps@silver.bacs.indiana.edu (Steve Creps) (01/01/88)
Here are the mods to fix the problem with ghosts, soldiers, eels, etc. not being restored properly. It was actually two problems: the soldiers problem was because I hadn't added a case for soldiers in the special index section of the save code. I added this code, and it now works. Also I added cases for kobold, giant rats, and medusas, since these weren't there and would have caused the same problem. Now the problem with the ghosts and eels was that the code to compute the special index for these monsters was not logically correct. It was trying to decrement a counter (starting at -1) to keep track of the index. However, this decrement was _inside_an_if_statement_, so it was possible (and highly likely) for two monsters to get the same index. My fix is to change the index computation back to being hard-coded, like it used to be. This does NOT cause any problems, even if not all monsters are #defined. If a monster is missing, it will leave an unused index, but who cares? In my earlier posting I described a monster appearing as an umlauted e. I think this was a giant rat that did not get restored correctly. Now that I've added the giant_rat case to the save code, it should not happen again. The error only occurred in the PC version, because the code in question was inside a #define. Here are the diffs: *** lev.c.old Thu Dec 31 18:44:26 1987 --- lev.c Thu Dec 31 18:28:31 1987 *************** *** 173,178 struct permonst *permonstp; int monsindex; extern struct permonst li_dog, dog, la_dog; #ifdef KAA int mi; extern struct permonst hell_hound; --- 173,192 ----- struct permonst *permonstp; int monsindex; extern struct permonst li_dog, dog, la_dog; + #ifdef SAC + extern struct permonst pm_soldier; + #endif + #ifdef KJSMODS + #ifdef KOPS + extern struct permonst kobold; + #endif + #ifdef ROCKMOLE + extern struct permonst giant_rat; + #endif + #endif /* KJSMODS */ + #ifdef RPH + extern struct permonst pm_medusa; + #endif #ifdef KAA int mi; extern struct permonst hell_hound; *************** *** 191,197 /* store an index where the pointer used to be */ permonstp = mtmp->data; if (permonstp == &li_dog) ! monsindex = mi = -1; /* fake index */ else if (permonstp == &dog) monsindex = --mi; /* fake index */ else if (permonstp == &la_dog) --- 205,211 ----- /* store an index where the pointer used to be */ permonstp = mtmp->data; if (permonstp == &li_dog) ! monsindex = -1; /* fake index */ else if (permonstp == &dog) monsindex = -2; /* fake index */ else if (permonstp == &la_dog) *************** *** 193,199 if (permonstp == &li_dog) monsindex = mi = -1; /* fake index */ else if (permonstp == &dog) ! monsindex = --mi; /* fake index */ else if (permonstp == &la_dog) monsindex = --mi; /* fake index */ #ifdef KAA --- 207,213 ----- if (permonstp == &li_dog) monsindex = -1; /* fake index */ else if (permonstp == &dog) ! monsindex = -2; /* fake index */ else if (permonstp == &la_dog) monsindex = -3; /* fake index */ #ifdef SAC *************** *** 195,201 else if (permonstp == &dog) monsindex = --mi; /* fake index */ else if (permonstp == &la_dog) ! monsindex = --mi; /* fake index */ #ifdef KAA else if (permonstp == &hell_hound) monsindex = --mi; /* fake index */ --- 209,233 ----- else if (permonstp == &dog) monsindex = -2; /* fake index */ else if (permonstp == &la_dog) ! monsindex = -3; /* fake index */ ! #ifdef SAC ! else if (permonstp == &pm_soldier) ! monsindex = -4; ! #endif ! #ifdef KJSMODS ! #ifdef KOPS ! else if (permonstp == &kobold) ! monsindex = -5; ! #endif ! #ifdef ROCKMOLE ! else if (permonstp == &giant_rat) ! monsindex = -6; ! #endif ! #endif /* KJSMODS */ ! #ifdef RPH ! else if (permonstp == &pm_medusa) ! monsindex = -7; ! #endif #ifdef KAA else if (permonstp == &hell_hound) monsindex = -8; /* fake index */ *************** *** 198,204 monsindex = --mi; /* fake index */ #ifdef KAA else if (permonstp == &hell_hound) ! monsindex = --mi; /* fake index */ # ifdef HARD else if (permonstp == &d_lord) monsindex = --mi; /* fake index */ --- 230,236 ----- #endif #ifdef KAA else if (permonstp == &hell_hound) ! monsindex = -8; /* fake index */ # ifdef HARD else if (permonstp == &d_lord) monsindex = -9; /* fake index */ *************** *** 201,207 monsindex = --mi; /* fake index */ # ifdef HARD else if (permonstp == &d_lord) ! monsindex = --mi; /* fake index */ else if (permonstp == &d_prince) monsindex = --mi; /* fake index */ --- 233,239 ----- monsindex = -8; /* fake index */ # ifdef HARD else if (permonstp == &d_lord) ! monsindex = -9; /* fake index */ else if (permonstp == &d_prince) monsindex = -10; /* fake index */ *************** *** 204,210 monsindex = --mi; /* fake index */ else if (permonstp == &d_prince) ! monsindex = --mi; /* fake index */ # endif # ifdef KJSMODS else if (permonstp == &pm_guard) --- 236,242 ----- monsindex = -9; /* fake index */ else if (permonstp == &d_prince) ! monsindex = -10; /* fake index */ # endif # ifdef KJSMODS else if (permonstp == &pm_guard) *************** *** 208,214 # endif # ifdef KJSMODS else if (permonstp == &pm_guard) ! monsindex = -mi; /* fake index */ else if (permonstp == &pm_ghost) monsindex = -mi; /* fake index */ --- 240,246 ----- # endif # ifdef KJSMODS else if (permonstp == &pm_guard) ! monsindex = -11; /* fake index */ else if (permonstp == &pm_ghost) monsindex = -12; /* fake index */ *************** *** 211,217 monsindex = -mi; /* fake index */ else if (permonstp == &pm_ghost) ! monsindex = -mi; /* fake index */ else if (permonstp == &pm_eel) monsindex = -mi; /* fake index */ --- 243,249 ----- monsindex = -11; /* fake index */ else if (permonstp == &pm_ghost) ! monsindex = -12; /* fake index */ else if (permonstp == &pm_eel) monsindex = -13; /* fake index */ *************** *** 214,220 monsindex = -mi; /* fake index */ else if (permonstp == &pm_eel) ! monsindex = -mi; /* fake index */ # endif #endif else --- 246,252 ----- monsindex = -12; /* fake index */ else if (permonstp == &pm_eel) ! monsindex = -13; /* fake index */ # endif #endif else *** save.c.old Thu Dec 31 18:44:27 1987 --- save.c Thu Dec 31 18:36:59 1987 *************** *** 345,350 int xl; int monsindex, mi; extern struct permonst li_dog, dog, la_dog; #ifdef KAA extern struct permonst hell_hound; # ifdef HARD --- 345,364 ----- int xl; int monsindex, mi; extern struct permonst li_dog, dog, la_dog; + #ifdef SAC + extern struct permonst pm_soldier; + #endif + #ifdef KJSMODS + #ifdef KOPS + extern struct permonst kobold; + #endif + #ifdef ROCKMOLE + extern struct permonst giant_rat; + #endif + #endif /* KJSMODS */ + #ifdef RPH + extern struct permonst pm_medusa; + #endif #ifdef KAA extern struct permonst hell_hound; # ifdef HARD *************** *** 369,375 if(!mtmp->m_id) mtmp->m_id = flags.ident++; monsindex = *((int *)&mtmp->data); ! if (monsindex == (mi = -1)) /* Special fake index */ mtmp->data = &li_dog; else if (monsindex == --mi) /* Special fake index */ mtmp->data = &dog; --- 383,389 ----- if(!mtmp->m_id) mtmp->m_id = flags.ident++; monsindex = *((int *)&mtmp->data); ! if (monsindex == -1) /* Special fake index */ mtmp->data = &li_dog; else if (monsindex == -2) /* Special fake index */ mtmp->data = &dog; *************** *** 371,377 monsindex = *((int *)&mtmp->data); if (monsindex == (mi = -1)) /* Special fake index */ mtmp->data = &li_dog; ! else if (monsindex == --mi) /* Special fake index */ mtmp->data = &dog; else if (monsindex == --mi) /* Special fake index */ mtmp->data = &la_dog; --- 385,391 ----- monsindex = *((int *)&mtmp->data); if (monsindex == -1) /* Special fake index */ mtmp->data = &li_dog; ! else if (monsindex == -2) /* Special fake index */ mtmp->data = &dog; else if (monsindex == -3) /* Special fake index */ mtmp->data = &la_dog; *************** *** 373,379 mtmp->data = &li_dog; else if (monsindex == --mi) /* Special fake index */ mtmp->data = &dog; ! else if (monsindex == --mi) /* Special fake index */ mtmp->data = &la_dog; #ifdef KAA else if (monsindex == --mi) --- 387,393 ----- mtmp->data = &li_dog; else if (monsindex == -2) /* Special fake index */ mtmp->data = &dog; ! else if (monsindex == -3) /* Special fake index */ mtmp->data = &la_dog; #ifdef SAC else if (monsindex == -4) *************** *** 375,380 mtmp->data = &dog; else if (monsindex == --mi) /* Special fake index */ mtmp->data = &la_dog; #ifdef KAA else if (monsindex == --mi) mtmp->data = &hell_hound; --- 389,412 ----- mtmp->data = &dog; else if (monsindex == -3) /* Special fake index */ mtmp->data = &la_dog; + #ifdef SAC + else if (monsindex == -4) + mtmp->data = &pm_soldier; + #endif + #ifdef KJSMODS + #ifdef KOPS + else if (monsindex == -5) + mtmp->data = &kobold; + #endif + #ifdef ROCKMOLE + else if (monsindex == -6) + mtmp->data = &giant_rat; + #endif + #endif /* KJSMODS */ + #ifdef RPH + else if (monsindex == -7) + mtmp->data = &pm_medusa; + #endif #ifdef KAA else if (monsindex == -8) mtmp->data = &hell_hound; *************** *** 376,382 else if (monsindex == --mi) /* Special fake index */ mtmp->data = &la_dog; #ifdef KAA ! else if (monsindex == --mi) mtmp->data = &hell_hound; # ifdef HARD else if (monsindex == --mi) --- 408,414 ----- mtmp->data = &pm_medusa; #endif #ifdef KAA ! else if (monsindex == -8) mtmp->data = &hell_hound; # ifdef HARD else if (monsindex == -9) *************** *** 379,385 else if (monsindex == --mi) mtmp->data = &hell_hound; # ifdef HARD ! else if (monsindex == --mi) mtmp->data = &d_lord; else if (monsindex == --mi) --- 411,417 ----- else if (monsindex == -8) mtmp->data = &hell_hound; # ifdef HARD ! else if (monsindex == -9) mtmp->data = &d_lord; else if (monsindex == -10) *************** *** 382,388 else if (monsindex == --mi) mtmp->data = &d_lord; ! else if (monsindex == --mi) mtmp->data = &d_prince; # endif # ifdef KJSMODS --- 414,420 ----- else if (monsindex == -9) mtmp->data = &d_lord; ! else if (monsindex == -10) mtmp->data = &d_prince; # endif # ifdef KJSMODS *************** *** 386,392 mtmp->data = &d_prince; # endif # ifdef KJSMODS ! else if (monsindex == --mi) mtmp->data = &pm_guard; else if (monsindex == --mi) --- 418,424 ----- mtmp->data = &d_prince; # endif # ifdef KJSMODS ! else if (monsindex == -11) mtmp->data = &pm_guard; else if (monsindex == -12) *************** *** 389,395 else if (monsindex == --mi) mtmp->data = &pm_guard; ! else if (monsindex == --mi) mtmp->data = &pm_ghost; else if (monsindex == --mi) --- 421,427 ----- else if (monsindex == -11) mtmp->data = &pm_guard; ! else if (monsindex == -12) mtmp->data = &pm_ghost; else if (monsindex == -13) *************** *** 392,398 else if (monsindex == --mi) mtmp->data = &pm_ghost; ! else if (monsindex == --mi) mtmp->data = &pm_eel; # endif #endif --- 424,430 ----- else if (monsindex == -12) mtmp->data = &pm_ghost; ! else if (monsindex == -13) mtmp->data = &pm_eel; # endif #endif - - - - - - - - - Steve Creps on the VAX 8650 running Ultrix 2.0-1 at Indiana University. creps@silver.bacs.indiana.edu "F-14 Tomcat! There IS no substitute."