gil@svax.cs.cornell.edu (Gil Neiger) (04/22/87)
A few weeks ago a posted a problem I was having in hack here at Cornell. Many players were finding that when they reached level 27 or thereabouts they often lost a game due to "panic". They would get the message "Suddenly, the dungeon collapses" followed by "makemon?". I posted the appropriate section of makemon() that I had, but no one was able to help me. I noticed that some people have been having problems with another version (Amiga) of hack crashing - maybe my fix can help them also. I had installed a fix to makemon() to better balance monsters when using KOPS and ROCKMOLE. Here's what the code looked like: } else { ct = CMNUM - strlen(fut_geno); if(index(fut_geno, 'm')) ct++; /* make only 1 minotaur */ if(index(fut_geno, '@')) ct++; if(ct <= 0) return(0); /* no more monsters! */ tmp = 7; #ifdef KOPS tmp--; #endif KOPS #ifdef ROCKMOLE if(dlevel<4)tmp--; #endif ROCKMOLE tmp = rn2(ct*dlevel/24 + tmp); if(tmp < dlevel - 4) tmp = rn2(ct*dlevel/24 + 12); if(tmp >= ct) tmp = rn1(ct - ct/2, ct/2); ct = 0; #ifdef KOPS ct++; /****************************/ #endif KOPS for(; ct < CMNUM; ct++){ ptr = &mons[ct]; if(index(fut_geno, ptr->mlet)) continue; if(!tmp--) goto gotmon; } panic("makemon?"); } gotmon: The problem is when ct is decremented when KOPS is on (see ***); tmp needs to be correspondingly (if it is greater than 0). Specifically, that portion of the code should look like this tmp = rn2(ct*dlevel/24 + tmp); if(tmp < dlevel - 4) tmp = rn2(ct*dlevel/24 + 12); if(tmp >= ct) tmp = rn1(ct - ct/2, ct/2); ct = 0; #ifdef KOPS ct++; tmp = (tmp) ? tmp-- : tmp; #endif KOPS for(; ct < CMNUM; ct++){ ptr = &mons[ct]; Now you can be assured that the loop will terminate correctly and that there will be no panic. - Gil