The last point means that the player (or admin, in the case of the servers) has to delete a buggy bones file themselves, but the benefits of making tracking down bugs easier should outweigh that inconvenience.
Add a new wizmode command that calls debug_stethoscope even if the game is not compiled in debugging mode.
Also, Stone Soup 0.5 bones files are now officially incompatible with 0.4. (The changes to the spell ids cause ghosts casting spells to crash the game.)
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@9832 c06c8d41-db1a-0410-9941-cceddc491573
MRUMXF3YPJCHAW4DC7DHJR5O77LXAJLMA53IOJP4YEMAOZRNWNKAC
VBRYPOHVS4GLHSQ5CE6K6GJTPK7FQE5VLRC5WLSOWKLQEDNPR7ZAC
QNSFZBLVAN7BPYYRXUELHBZCLIQTYDATDIXF3YVH7LBBST66VUCQC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
5UVDIVD4NSXA52U4QMQIVST3GSZJ2A2YZK3RUEXKPM43YVQ7LI5AC
N7CKO4LATD44HNNA6747FY7M4BA4UKTMSJRL7KXONYADP5VMHROAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
7AMQN7MITMXBNVDAK5VOXTQ4TZIAOD6ZLOFJG7GQMBTY23Y2BKSAC
RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC
SG76BPJKTQGDFNP5QFMAVR6H72FMMAYCECVGSWWSCLMAVQX7E3FQC
XOFMSAGWPC54V3QR4CJZVWKY3BG54V32JOFCGDU4SMPKFNPH7J4QC
W5VEC2PBIM5DMU5233HOWAZUEPTGWJRZZIA3H35YYQQW6BTP6XUAC
PHBACPMH3F34GODHVDKNCMXWU373RJQGVTDLBFCCDLLWDXVYOLTAC
YCL3W2PFE6ILTGBFODCSXNPDIA46KVSZP2TI7HDMYAOEJT65RIEAC
5B5DP5S6A6LQMKZYVLQAEMHQZWFWYDHPCKQGRNSCNNYIBQYZ6BIQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
6DNNPEMZGBQDMA7YG4LCTQUVZ7LYPC3R4A2XBYT5SDQ65GYOLJVAC
34LSODHJVOGATMHLJN67YGGWOV2PYDGAY3OAZGCU6J2ESULN6S3QC
2WWSPLCXLSMBGTXUC33EQ5YBOA5IBFSMJSTZ2TU6HZIMZZWZJWGAC
L254F6ZIU2HWGLFFGPIORTN4C3TDQ3E5JZ7Z7GQA5AEDIKL6PKDAC
O7S3ILRELHICJXXTDGMF7KPPZWYHPYCNDPV2I77FZXXH4I454B4QC
DWWOM6V2Z4RQVT6AKW6OYLSFOUE4W5PTP2SH4AAZE2E4EIH4RLUAC
SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC
347OTVM5V6C5UE5ERARQJQTVNTHKQNL5NEKE43TI2SYUH64CWT6QC
Y4ORYGHVKJMAF2HCG6AIGTZP56DBLHDNR5JERCQBJJRUWD6WZMCQC
Y4NA3JSN63RLATF4NNBPSR5CWF5Z7UEMWCGVX4B6NOAR47CGM4GQC
DNAZ35MX7CF3D53NHBU4YOL4UI5CT3VECTI3WRXXOAODXEXDAMWQC
NS3KXJXQSN33UQSOBDK3WXXKA3KY5YOUJL67NBZKGQAJYDYZ2COQC
DINIHMHQWCV7UKXHNIA2TLT2ZOO5IYJJE7GMI3XUAWYIR37AKD2QC
RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC
N7J2IWU7B34XIUYWHJF2RTRAXXAQLVVZLWWHFWN4FC5PLNFFEWCAC
}
// Sanity checks for some ghost values.
bool debug_check_ghosts()
{
for (unsigned int k = 0; k < ghosts.size(); ++k)
{
ghost_demon ghost = ghosts[k];
// Values greater than the allowed maximum signalize bugginess.
if (ghost.damage > MAX_GHOST_DAMAGE)
return (false);
if (ghost.max_hp > MAX_GHOST_HP)
return (false);
if (ghost.xl > 27)
return (false);
if (ghost.ev > MAX_GHOST_EVASION)
return (false);
// Check for non-existing spells.
for (int sp = 0; sp < NUM_MONSTER_SPELL_SLOTS; ++sp)
if (ghost.spells[sp] < 0 || ghost.spells[sp] >= NUM_SPELLS)
return (false);
}
return (true);
std::ostringstream spl;
const monster_spells &hspell_pass = mons.spells;
bool found_spell = false;
for (int k = 0; k < NUM_MONSTER_SPELL_SLOTS; ++k)
{
if (hspell_pass[k] != SPELL_NO_SPELL)
{
if (found_spell)
spl << ", ";
found_spell = true;
spl << k << ": ";
if (hspell_pass[k] >= NUM_SPELLS)
spl << "buggy spell";
else
spl << spell_title(hspell_pass[k]);
spl << " (" << static_cast<int>(hspell_pass[k]) << ")";
}
}
if (found_spell)
mprf(MSGCH_DIAGNOSTICS, "spells: %s", spl.str().c_str());