summaryrefslogtreecommitdiffstats
path: root/stone_soup/crawl-ref/source/ouch.cc
diff options
context:
space:
mode:
Diffstat (limited to 'stone_soup/crawl-ref/source/ouch.cc')
-rw-r--r--stone_soup/crawl-ref/source/ouch.cc1046
1 files changed, 0 insertions, 1046 deletions
diff --git a/stone_soup/crawl-ref/source/ouch.cc b/stone_soup/crawl-ref/source/ouch.cc
deleted file mode 100644
index 5fa0ff13bd..0000000000
--- a/stone_soup/crawl-ref/source/ouch.cc
+++ /dev/null
@@ -1,1046 +0,0 @@
-/*
- * File: ouch.cc
- * Summary: Functions used when Bad Things happen to the player.
- * Written by: Linley Henzell
- *
- * Modified for Crawl Reference by $Author$ on $Date$
- *
- * Change History (most recent first):
- *
- * <8> 7/30/00 JDJ Fixed end_game so that it works with filenames longer than 6 characters.
- * <7> 19 June 2000 GDL Changed handle to FILE *
- * <6> 11/23/99 LRH Fixed file purging for DOS?
- * <5> 9/29/99 BCR Fixed highscore so that it
- * doesn't take so long. Also
- * added some whitespace to the scores.
- * Fixed problem with uniques and 'a'.
- * <4> 6/13/99 BWR applied a mix of DML and my tmp
- * file purging improvements.
- * <3> 5/26/99 JDJ highscore() will print more scores on
- * larger windows.
- * <2> 5/21/99 BWR Added SCORE_FILE_ENTRIES, so
- * that more top scores can be
- * saved.
- * <1> -/--/-- LRH Created
- */
-
-#include "AppHdr.h"
-
-#include <string.h>
-#include <string>
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <time.h>
-
-#ifdef DOS
-#include <conio.h>
-#include <file.h>
-#endif
-
-#ifdef UNIX
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#endif
-
-#ifdef USE_EMX
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#endif
-
-#ifdef OS9
-#include <stat.h>
-#else
-#include <sys/stat.h>
-#endif
-
-#include "ouch.h"
-
-#ifdef __MINGW32__
-#include <io.h>
-#endif
-
-#include "externs.h"
-
-#include "chardump.h"
-#include "delay.h"
-#include "files.h"
-#include "hiscores.h"
-#include "invent.h"
-#include "itemname.h"
-#include "itemprop.h"
-#include "items.h"
-#include "macro.h"
-#include "mon-util.h"
-#include "player.h"
-#include "randart.h"
-#include "religion.h"
-#include "shopping.h"
-#include "skills2.h"
-#include "spells4.h"
-#include "stuff.h"
-#include "view.h"
-
-
-void end_game( struct scorefile_entry &se );
-void item_corrode( char itco );
-
-
-/* NOTE: DOES NOT check for hellfire!!! */
-int check_your_resists(int hurted, int flavour)
-{
- int resist;
-
-#if DEBUG_DIAGNOSTICS
- snprintf( info, INFO_SIZE, "checking resistance: flavour=%d", flavour );
- mpr( info, MSGCH_DIAGNOSTICS );
-#endif
-
- if (flavour == BEAM_FIRE || flavour == BEAM_LAVA
- || flavour == BEAM_HELLFIRE || flavour == BEAM_FRAG)
- {
- if (you.duration[DUR_CONDENSATION_SHIELD] > 0)
- {
- mpr( "Your icy shield dissipates!", MSGCH_DURATION );
- you.duration[DUR_CONDENSATION_SHIELD] = 0;
- you.redraw_armour_class = 1;
- }
- }
-
- switch (flavour)
- {
- case BEAM_FIRE:
- resist = player_res_fire();
- if (resist > 0)
- {
- canned_msg(MSG_YOU_RESIST);
- hurted /= (1 + (resist * resist));
- }
- else if (resist < 0)
- {
- mpr("It burns terribly!");
- hurted *= 15;
- hurted /= 10;
- }
- break;
-
- case BEAM_COLD:
- resist = player_res_cold();
- if (resist > 0)
- {
- canned_msg(MSG_YOU_RESIST);
- hurted /= (1 + (resist * resist));
- }
- else if (resist < 0)
- {
- mpr("You feel a terrible chill!");
- hurted *= 15;
- hurted /= 10;
- }
- break;
-
- case BEAM_ELECTRICITY:
- resist = player_res_electricity();
- if (resist >= 3)
- {
- canned_msg(MSG_YOU_RESIST);
- hurted = 0;
- }
- else if (resist > 0)
- {
- canned_msg(MSG_YOU_RESIST);
- hurted /= 3;
- }
- break;
-
-
- case BEAM_POISON:
- resist = player_res_poison();
-
- if (!resist)
- poison_player( coinflip() ? 2 : 1 );
- else
- {
- canned_msg(MSG_YOU_RESIST);
- hurted /= 3;
- }
- break;
-
- case BEAM_POISON_ARROW:
- // [dshaligram] NOT importing uber-poison arrow from 4.1. Giving no
- // bonus to poison resistant players seems strange and unnecessarily
- // arbitrary.
- resist = player_res_poison();
-
- if (!resist)
- poison_player( 6 + random2(3), true );
- else
- {
- mpr("You partially resist.");
- hurted /= 2;
-
- if (!you.is_undead)
- poison_player( 2 + random2(3), true );
- }
- break;
-
- case BEAM_NEG:
- resist = player_prot_life();
-
- if (resist > 0)
- {
- hurted -= (resist * hurted) / 3;
- }
-
- drain_exp();
- break;
-
- case BEAM_ICE:
- resist = player_res_cold();
-
- if (resist > 0)
- {
- mpr("You partially resist.");
- hurted /= 2;
- }
- else if (resist < 0)
- {
- mpr("You feel a painful chill!");
- hurted *= 13;
- hurted /= 10;
- }
- break;
-
- case BEAM_LAVA:
- resist = player_res_fire();
-
- if (resist > 1)
- {
- mpr("You partially resist.");
- hurted /= (1 + resist);
- }
- else if (resist < 0)
- {
- mpr("It burns terribly!");
- hurted *= 15;
- hurted /= 10;
- }
- break;
-
- case BEAM_ACID:
- if (player_res_acid())
- {
- canned_msg( MSG_YOU_RESIST );
- hurted /= 3;
- }
- break;
-
- case BEAM_MIASMA:
- if (player_prot_life() > random2(3))
- {
- canned_msg( MSG_YOU_RESIST );
- hurted = 0;
- }
- break;
-
- case BEAM_HOLY:
- if (!you.is_undead && you.species != SP_DEMONSPAWN)
- {
- canned_msg( MSG_YOU_RESIST );
- hurted = 0;
- }
- break;
- } /* end switch */
-
- return (hurted);
-} // end check_your_resists()
-
-void splash_with_acid( char acid_strength )
-{
- /* affects equip only?
- assume that a message has already been sent, also that damage has
- already been done
- */
- char splc = 0;
- int dam = 0;
-
- const bool wearing_cloak = (you.equip[EQ_CLOAK] == -1);
-
- for (splc = EQ_CLOAK; splc <= EQ_BODY_ARMOUR; splc++)
- {
- if (you.equip[splc] == -1)
- {
- if (!wearing_cloak || coinflip())
- dam += roll_dice( 1, acid_strength );
-
- continue;
- }
-
- if (random2(20) <= acid_strength)
- item_corrode( you.equip[splc] );
- }
-
- if (dam)
- {
- mpr( "The acid burns!" );
- ouch( dam, 0, KILLED_BY_ACID );
- }
-} // end splash_with_acid()
-
-void weapon_acid( char acid_strength )
-{
- char hand_thing = you.equip[EQ_WEAPON];
-
- if (hand_thing == -1)
- hand_thing = you.equip[EQ_GLOVES];
-
- if (hand_thing == -1)
- {
- snprintf( info, INFO_SIZE, "Your %s burn!", your_hand(true) );
- mpr( info );
-
- ouch( roll_dice( 1, acid_strength ), 0, KILLED_BY_ACID );
- }
- else if (random2(20) <= acid_strength)
- {
- item_corrode( hand_thing );
- }
-} // end weapon_acid()
-
-void item_corrode( char itco )
-{
- int chance_corr = 0; // no idea what its full range is {dlb}
- bool it_resists = false; // code simplifier {dlb}
- bool suppress_msg = false; // code simplifier {dlb}
- int how_rusty = ((you.inv[itco].base_type == OBJ_WEAPONS)
- ? you.inv[itco].plus2 : you.inv[itco].plus);
-
- // early return for "oRC and cloak/preservation {dlb}:
- if (wearing_amulet(AMU_RESIST_CORROSION) && !one_chance_in(10))
- {
-#if DEBUG_DIAGNOSTICS
- mpr( "Amulet protects.", MSGCH_DIAGNOSTICS );
-#endif
- return;
- }
-
- // early return for items already pretty d*** rusty {dlb}:
- if (how_rusty < -5)
- return;
-
- // determine possibility of resistance by object type {dlb}:
- switch (you.inv[itco].base_type)
- {
- case OBJ_ARMOUR:
- if (is_random_artefact( you.inv[itco] ))
- {
- it_resists = true;
- suppress_msg = true;
- }
- else if ((you.inv[itco].sub_type == ARM_CRYSTAL_PLATE_MAIL
- || get_equip_race(you.inv[itco]) == ISFLAG_DWARVEN)
- && !one_chance_in(5))
- {
- it_resists = true;
- suppress_msg = false;
- }
- break;
-
- case OBJ_WEAPONS:
- if (is_fixed_artefact(you.inv[itco])
- || is_random_artefact(you.inv[itco]))
- {
- it_resists = true;
- suppress_msg = true;
- }
- else if (get_equip_race(you.inv[itco]) == ISFLAG_DWARVEN
- && !one_chance_in(5))
- {
- it_resists = true;
- suppress_msg = false;
- }
- break;
-
- case OBJ_MISSILES:
- if (get_equip_race(you.inv[itco]) == ISFLAG_DWARVEN
- && !one_chance_in(5))
- {
- it_resists = true;
- suppress_msg = false;
- }
- break;
- }
-
- // determine chance of corrosion {dlb}:
- if (!it_resists)
- {
- chance_corr = abs( how_rusty );
-
- // ---------------------------- but it needs to stay this way
- // (as it *was* this way)
-
- // the embedded equation may look funny, but it actually works well
- // to generate a pretty probability ramp {6%, 18%, 34%, 58%, 98%}
- // for values [0,4] which closely matches the original, ugly switch
- // {dlb}
- if (chance_corr >= 0 && chance_corr <= 4)
- {
- it_resists = (random2(100) <
- 2 + (2 << (1 + chance_corr)) + (chance_corr * 8));
- }
- else
- it_resists = true; // no idea how often this occurs {dlb}
-
- // if the checks get this far, you should hear about it {dlb}
- suppress_msg = false;
- }
-
- // handle message output and item damage {dlb}:
- if (!suppress_msg)
- {
- char str_pass[ ITEMNAME_SIZE ];
- in_name(itco, DESC_CAP_YOUR, str_pass);
- strcpy(info, str_pass);
- strcat(info, (it_resists) ? " resists." : " is eaten away!");
- mpr(info);
- }
-
- if (!it_resists)
- {
- how_rusty--;
-
- if (you.inv[itco].base_type == OBJ_WEAPONS)
- you.inv[itco].plus2 = how_rusty;
- else
- you.inv[itco].plus = how_rusty;
-
- you.redraw_armour_class = 1; // for armour, rings, etc. {dlb}
-
- if (you.equip[EQ_WEAPON] == itco)
- you.wield_change = true;
- }
-
- return;
-} // end item_corrode()
-
-void scrolls_burn(char burn_strength, char target_class)
-{
-
- unsigned char burnc;
- unsigned char burn2;
- unsigned char burn_no = 0;
-
- if (wearing_amulet(AMU_CONSERVATION) && !one_chance_in(10))
- {
-#if DEBUG_DIAGNOSTICS
- mpr( "Amulet conserves.", MSGCH_DIAGNOSTICS );
-#endif
- return;
- }
-
- for (burnc = 0; burnc < ENDOFPACK; burnc++)
- {
- if (!you.inv[burnc].quantity)
- continue;
- if (you.inv[burnc].base_type != target_class)
- continue;
-
- for (burn2 = 0; burn2 < you.inv[burnc].quantity; burn2++)
- {
- if (random2(70) < burn_strength)
- {
- burn_no++;
-
- if (burnc == you.equip[EQ_WEAPON])
- you.wield_change = true;
-
- if (dec_inv_item_quantity( burnc, 1 ))
- break;
- }
- }
- }
-
- if (burn_no == 1)
- {
- if (target_class == OBJ_SCROLLS)
- mpr("A scroll you are carrying catches fire!");
- else if (target_class == OBJ_POTIONS)
- mpr("A potion you are carrying freezes and shatters!");
- else if (target_class == OBJ_FOOD)
- mpr("Some of your food is covered with spores!");
- }
- else if (burn_no > 1)
- {
- if (target_class == OBJ_SCROLLS)
- mpr("Some of the scrolls you are carrying catch fire!");
- else if (target_class == OBJ_POTIONS)
- mpr("Some of the potions you are carrying freeze and shatter!");
- else if (target_class == OBJ_FOOD)
- mpr("Some of your food is covered with spores!");
- }
- /* burn_no could be 0 */
-}
-
- // end scrolls_burn()
-void lose_level(void)
-{
- // because you.experience is unsigned long, if it's going to be -ve
- // must die straightaway.
- if (you.experience_level == 1)
- ouch( -9999, 0, KILLED_BY_DRAINING );
-
- you.experience = exp_needed( you.experience_level + 1 ) - 1;
- you.experience_level--;
-
- snprintf( info, INFO_SIZE, "You are now a level %d %s!",
- you.experience_level, you.class_name );
- mpr( info, MSGCH_WARN );
-
- // Constant value to avoid grape jelly trick... see level_change() for
- // where these HPs and MPs are given back. -- bwr
- ouch( 4, 0, KILLED_BY_DRAINING );
- dec_max_hp(4);
-
- dec_mp(1);
- dec_max_mp(1);
-
- calc_hp();
- calc_mp();
-
- you.redraw_experience = 1;
-} // end lose_level()
-
-void drain_exp(void)
-{
- int protection = player_prot_life();
-
- if (you.duration[DUR_PRAYER]
- && (you.religion == GOD_ZIN || you.religion == GOD_SHINING_ONE)
- && random2(150) < you.piety)
- {
- simple_god_message(" protects your life force!");
- return;
- }
-
- if (protection >= 3 || you.is_undead)
- {
- mpr("You fully resist.");
- return;
- }
-
- if (you.experience == 0)
- ouch(-9999, 0, KILLED_BY_DRAINING);
-
- if (you.experience_level == 1)
- {
- you.experience = 0;
- return;
- }
-
- unsigned long total_exp = exp_needed( you.experience_level + 2 )
- - exp_needed( you.experience_level + 1 );
- unsigned long exp_drained = total_exp * (10 + random2(11));
-
- exp_drained /= 100;
-
- if (protection > 0)
- {
- mpr("You partially resist.");
- exp_drained -= (protection * exp_drained) / 3;
- }
-
- if (exp_drained > 0)
- {
- mpr("You feel drained.");
- you.experience -= exp_drained;
- you.exp_available -= exp_drained;
-
- if (you.exp_available < 0)
- you.exp_available = 0;
-
-#if DEBUG_DIAGNOSTICS
- snprintf( info, INFO_SIZE, "You lose %ld experience points.",
- exp_drained );
- mpr( info, MSGCH_DIAGNOSTICS );
-#endif
-
- you.redraw_experience = 1;
-
- if (you.experience < exp_needed(you.experience_level + 1))
- lose_level();
- }
-} // end drain_exp()
-
-// death_source should be set to zero for non-monsters {dlb}
-void ouch( int dam, int death_source, char death_type, const char *aux )
-{
- int d = 0;
- int e = 0;
-
- ait_hp_loss hpl(dam, death_type);
- interrupt_activity( AI_HP_LOSS, &hpl );
-
- if (you.deaths_door && death_type != KILLED_BY_LAVA
- && death_type != KILLED_BY_WATER)
- {
- return;
- }
-
- // assumed bug for high damage amounts
- if (dam > 300)
- {
- snprintf( info, INFO_SIZE,
- "Potential bug: Unexpectedly high damage = %d", dam );
- mpr( info, MSGCH_DANGER );
- return;
- }
-
- if (you_are_delayed())
- {
- stop_delay();
- }
-
- if (dam > -9000) // that is, a "death" caused by hp loss {dlb}
- {
- switch (you.religion)
- {
- case GOD_XOM:
- if (random2(you.hp_max) > you.hp && dam > random2(you.hp)
- && one_chance_in(5))
- {
- simple_god_message( " protects you from harm!" );
- return;
- }
- break;
-
- case GOD_ZIN:
- case GOD_SHINING_ONE:
- case GOD_ELYVILON:
- case GOD_OKAWARU:
- case GOD_YREDELEMNUL:
- if (dam >= you.hp && you.duration[DUR_PRAYER]
- && random2(you.piety) >= 30)
- {
- simple_god_message( " protects you from harm!" );
- return;
- }
- break;
- }
-
- // Damage applied here:
- dec_hp( dam, true );
-
- // Even if we have low HP messages off, we'll still give a
- // big hit warning (in this case, a hit for half our HPs) -- bwr
- if (dam > 0 && you.hp_max <= dam * 2)
- mpr( "Ouch! That really hurt!", MSGCH_DANGER );
-
- if (you.hp > 0 && Options.hp_warning
- && you.hp <= (you.hp_max * Options.hp_warning) / 100)
- {
- mpr( "* * * LOW HITPOINT WARNING * * *", MSGCH_DANGER );
- }
-
- if (you.hp > 0)
- return;
- }
-
-#ifdef WIZARD
- if (death_type != KILLED_BY_QUITTING
- && death_type != KILLED_BY_WINNING
- && death_type != KILLED_BY_LEAVING)
- {
- if (you.wizard)
- {
-#ifdef USE_OPTIONAL_WIZARD_DEATH
-
-#if DEBUG_DIAGNOSTICS
- snprintf( info, INFO_SIZE, "Damage: %d; Hit points: %d", dam, you.hp );
- mpr( info, MSGCH_DIAGNOSTICS );
-#endif // DEBUG_DIAGNOSTICS
-
- if (!yesno("Die?", false, 'n'))
- {
- set_hp(you.hp_max, false);
- return;
- }
-#else // !def USE_OPTIONAL_WIZARD_DEATH
- mpr("Since you're a debugger, I'll let you live.");
- mpr("Be more careful next time, okay?");
-
- set_hp(you.hp_max, false);
- return;
-#endif // USE_OPTIONAL_WIZARD_DEATH
- }
- }
-#endif // WIZARD
-
- //okay, so you're dead:
-
- // do points first.
- long points = you.gold;
- points += (you.experience * 7) / 10;
-
- //if (death_type == KILLED_BY_WINNING) points += points / 2;
- //if (death_type == KILLED_BY_LEAVING) points += points / 10;
- // these now handled by giving player the value of their inventory
- char temp_id[4][50];
-
- for (d = 0; d < 4; d++)
- {
- for (e = 0; e < 50; e++)
- temp_id[d][e] = 1;
- }
-
- // CONSTRUCT SCOREFILE ENTRY
- struct scorefile_entry se;
-
- // Score file entry version:
- //
- // 4.0 - original versioned entry
- // 4.1 - added real_time and num_turn fields
- // 4.2 - stats and god info
-
- se.version = 4;
- se.release = 2;
-
- strncpy( se.name, you.your_name, kNameLen );
- se.name[ kNameLen - 1 ] = '\0';
-#ifdef MULTIUSER
- se.uid = (int) getuid();
-#else
- se.uid = 0;
-#endif
-
- FixedVector< int, NUM_RUNE_TYPES > rune_array;
-
- se.num_runes = 0;
- se.num_diff_runes = 0;
-
- for (int i = 0; i < NUM_RUNE_TYPES; i++)
- rune_array[i] = 0;
-
- // Calculate value of pack and runes when character leaves dungeon
- if (death_type == KILLED_BY_LEAVING || death_type == KILLED_BY_WINNING)
- {
- for (d = 0; d < ENDOFPACK; d++)
- {
- if (is_valid_item( you.inv[d] ))
- {
- points += item_value( you.inv[d], temp_id, true );
-
- if (you.inv[d].base_type == OBJ_MISCELLANY
- && you.inv[d].sub_type == MISC_RUNE_OF_ZOT)
- {
- if (rune_array[ you.inv[d].plus ] == 0)
- se.num_diff_runes++;
-
- se.num_runes += you.inv[d].quantity;
- rune_array[ you.inv[d].plus ] += you.inv[d].quantity;
- }
- }
- }
-
- // Bonus for exploring different areas, not for collecting a
- // huge stack of demonic runes in Pandemonium (gold value
- // is enough for those). -- bwr
- if (se.num_diff_runes >= 3)
- points += ((se.num_diff_runes + 2) * (se.num_diff_runes + 2) * 1000);
- }
-
- // Players will have a hard time getting 1/10 of this (see XP cap):
- if (points > 99999999)
- points = 99999999;
-
- se.points = points;
- se.race = you.species;
- se.cls = you.char_class;
-
- // strcpy(se.race_class_name, "");
- se.race_class_name[0] = '\0';
-
- se.lvl = you.experience_level;
- se.best_skill = best_skill( SK_FIGHTING, NUM_SKILLS - 1, 99 );
- se.best_skill_lvl = you.skills[ se.best_skill ];
- se.death_type = death_type;
-
- // for death by monster
-
- // Set the default aux data value...
- // If aux is passed in (ie for a trap), we'll default to that.
- if (aux == NULL)
- se.auxkilldata[0] = '\0';
- else
- {
- strncpy( se.auxkilldata, aux, ITEMNAME_SIZE );
- se.auxkilldata[ ITEMNAME_SIZE - 1 ] = '\0';
- }
-
- if ((death_type == KILLED_BY_MONSTER || death_type == KILLED_BY_BEAM)
- && death_source >= 0 && death_source < MAX_MONSTERS)
- {
- struct monsters *monster = &menv[death_source];
-
- if (monster->type > 0 || monster->type <= NUM_MONSTERS)
- {
- se.death_source = monster->type;
- se.mon_num = monster->number;
-
- // Previously the weapon was only used for dancing weapons,
- // but now we pass it in as a string through the scorefile
- // entry to be appended in hiscores_format_single in long or
- // medium scorefile formats.
- // It still isn't used in monam for anything but flying weapons
- // though
- if (death_type == KILLED_BY_MONSTER
- && monster->inv[MSLOT_WEAPON] != NON_ITEM)
- {
-#if HISCORE_WEAPON_DETAIL
- set_ident_flags( mitm[monster->inv[MSLOT_WEAPON]],
- ISFLAG_IDENT_MASK );
-#else
- // changing this to ignore the pluses to keep it short
- unset_ident_flags( mitm[monster->inv[MSLOT_WEAPON]],
- ISFLAG_IDENT_MASK );
-
- set_ident_flags( mitm[monster->inv[MSLOT_WEAPON]],
- ISFLAG_KNOW_TYPE );
-
- // clear "runed" description text to make shorter yet
- set_equip_desc( mitm[monster->inv[MSLOT_WEAPON]], 0 );
-#endif
-
- // Setting this is redundant for dancing weapons, however
- // we do care about the above indentification. -- bwr
- if (monster->type != MONS_DANCING_WEAPON)
- {
- it_name( monster->inv[MSLOT_WEAPON], DESC_NOCAP_A, info );
- strncpy( se.auxkilldata, info, ITEMNAME_SIZE );
- se.auxkilldata[ ITEMNAME_SIZE - 1 ] = '\0';
- }
- }
-
- strcpy( info,
- monam( monster->number, monster->type, true, DESC_NOCAP_A,
- monster->inv[MSLOT_WEAPON] ) );
-
- strncpy( se.death_source_name, info, 40 );
- se.death_source_name[39] = '\0';
- }
- }
- else
- {
- se.death_source = death_source;
- se.mon_num = 0;
- se.death_source_name[0] = '\0';
- }
-
- se.damage = dam;
- se.final_hp = you.hp;
- se.final_max_hp = you.hp_max;
- se.final_max_max_hp = you.hp_max + player_rotted();
- se.str = you.strength;
- se.intel = you.intel;
- se.dex = you.dex;
-
- se.god = you.religion;
- if (you.religion != GOD_NO_GOD)
- {
- se.piety = you.piety;
- se.penance = you.penance[you.religion];
- }
-
- // main dungeon: level is simply level
- se.dlvl = you.your_level + 1;
- switch (you.where_are_you)
- {
- case BRANCH_ORCISH_MINES:
- case BRANCH_HIVE:
- case BRANCH_LAIR:
- case BRANCH_SLIME_PITS:
- case BRANCH_VAULTS:
- case BRANCH_CRYPT:
- case BRANCH_HALL_OF_BLADES:
- case BRANCH_HALL_OF_ZOT:
- case BRANCH_ECUMENICAL_TEMPLE:
- case BRANCH_SNAKE_PIT:
- case BRANCH_ELVEN_HALLS:
- case BRANCH_TOMB:
- case BRANCH_SWAMP:
- se.dlvl = you.your_level - you.branch_stairs[you.where_are_you - 10];
- break;
-
- case BRANCH_DIS:
- case BRANCH_GEHENNA:
- case BRANCH_VESTIBULE_OF_HELL:
- case BRANCH_COCYTUS:
- case BRANCH_TARTARUS:
- case BRANCH_INFERNO:
- case BRANCH_THE_PIT:
- se.dlvl = you.your_level - 26;
- break;
- }
-
- se.branch = you.where_are_you; // no adjustments necessary.
- se.level_type = you.level_type; // pandemonium, labyrinth, dungeon..
-
- se.birth_time = you.birth_time; // start time of game
- se.death_time = time( NULL ); // end time of game
-
- if (you.real_time != -1)
- se.real_time = you.real_time + (se.death_time - you.start_time);
- else
- se.real_time = -1;
-
- se.num_turns = you.num_turns;
-
-#ifdef WIZARD
- se.wiz_mode = (you.wizard ? 1 : 0);
-#else
- se.wiz_mode = 0;
-#endif
-
-#ifdef SCORE_WIZARD_CHARACTERS
- // add this highscore to the score file.
- hiscores_new_entry(se);
-#else
-
- // only add non-wizards to the score file.
- // never generate bones files of wizard characters -- bwr
- if (!you.wizard)
- {
- hiscores_new_entry(se);
-
- if (death_type != KILLED_BY_LEAVING && death_type != KILLED_BY_WINNING)
- save_ghost();
- }
-
-#endif
-
- end_game(se);
-}
-
-void end_game( struct scorefile_entry &se )
-{
- int i;
- char del_file[300]; // massive overkill!
- bool dead = true;
-
- if (se.death_type == KILLED_BY_LEAVING ||
- se.death_type == KILLED_BY_WINNING)
- {
- dead = false;
- }
-
- // clean all levels that we think we have ever visited
- for (int level = 0; level < MAX_LEVELS; level++)
- {
- for (int dungeon = 0; dungeon < MAX_BRANCHES; dungeon++)
- {
- if (tmp_file_pairs[level][dungeon])
- {
- make_filename( info, you.your_name, level, dungeon,
- false, false );
- unlink(info);
- }
- }
- }
-
- // temp level, if any
- make_filename( info, you.your_name, 0, 0, true, false );
- unlink(info);
-
- // create base file name
-#ifdef SAVE_DIR_PATH
- snprintf( info, INFO_SIZE, SAVE_DIR_PATH "%s%d", you.your_name, (int) getuid());
-#else
- strncpy(info, you.your_name, kFileNameLen);
- info[kFileNameLen] = '\0';
-#endif
-
- // this is to catch the game package if it still exists.
-#ifdef PACKAGE_SUFFIX
- strcpy(del_file, info);
- strcat(del_file, "." PACKAGE_SUFFIX);
- unlink(del_file);
-#endif
-
- // last, but not least, delete player .sav file
- strcpy(del_file, info);
-
- std::string basefile = del_file;
-
- strcat(del_file, ".sav");
- unlink(del_file);
-
- // Delete record of stashes, kills, travel cache and lua save.
- unlink( (basefile + ".st").c_str() );
- unlink( (basefile + ".kil").c_str() );
- unlink( (basefile + ".tc").c_str() );
-#ifdef CLUA_BINDINGS
- unlink( (basefile + ".lua").c_str() );
-#endif
-
- // death message
- if (dead)
- {
- mpr("You die..."); // insert player name here? {dlb}
- viewwindow(1, false); // don't do this for leaving/winning characters
- }
- more();
-
- for (i = 0; i < ENDOFPACK; i++)
- set_ident_flags( you.inv[i], ISFLAG_IDENT_MASK );
-
- for (i = 0; i < ENDOFPACK; i++)
- {
- if (you.inv[i].base_type != 0)
- {
- set_ident_type( you.inv[i].base_type,
- you.inv[i].sub_type, ID_KNOWN_TYPE );
- }
- }
-
- invent( -1, dead );
- clrscr();
-
- if (!dump_char( "morgue.txt", !dead ))
- mpr("Char dump unsuccessful! Sorry about that.");
-#if DEBUG_DIAGNOSTICS
- //jmf: switched logic and moved "success" message to debug-only
- else
- mpr("Char dump successful! (morgue.txt).");
-#endif // DEBUG
-
- more();
-
- clrscr();
-#ifdef DOS_TERM
- window(1, 1, 80, 25);
-#endif
-
- clrscr();
- cprintf( "Goodbye, " );
- cprintf( you.your_name );
- cprintf( "." );
- cprintf( EOL EOL " " ); // Space padding where # would go in list format
-
- char scorebuff[ HIGHSCORE_SIZE ];
-
- const int lines = hiscores_format_single_long( scorebuff, se, true );
-
- // truncate
- scorebuff[ HIGHSCORE_SIZE - 1 ] = '\0';
- cprintf( scorebuff );
-
- cprintf( EOL "Best Crawlers -" EOL );
-
- // "- 5" gives us an extra line in case the description wraps on a line.
- hiscores_print_list( get_number_of_lines() - lines - 5 );
-
- // just to pause, actual value returned does not matter {dlb}
- get_ch();
- end(0);
-}