summaryrefslogtreecommitdiffstats
path: root/stone_soup/crawl-ref/source/delay.cc
diff options
context:
space:
mode:
Diffstat (limited to 'stone_soup/crawl-ref/source/delay.cc')
-rw-r--r--stone_soup/crawl-ref/source/delay.cc559
1 files changed, 0 insertions, 559 deletions
diff --git a/stone_soup/crawl-ref/source/delay.cc b/stone_soup/crawl-ref/source/delay.cc
deleted file mode 100644
index b288d1bb85..0000000000
--- a/stone_soup/crawl-ref/source/delay.cc
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- * File: delay.cc
- * Summary: Functions for handling multi-turn actions.
- *
- * Change History (most recent first):
- *
- * <1> Sept 09, 2001 BWR Created
- */
-
-#include "AppHdr.h"
-#include "externs.h"
-
-#include <stdio.h>
-#include <string.h>
-
-#include "delay.h"
-#include "enum.h"
-#include "food.h"
-#include "items.h"
-#include "itemname.h"
-#include "itemprop.h"
-#include "item_use.h"
-#include "it_use2.h"
-#include "message.h"
-#include "misc.h"
-#include "monstuff.h"
-#include "ouch.h"
-#include "output.h"
-#include "player.h"
-#include "randart.h"
-#include "spl-util.h"
-#include "stuff.h"
-
-void start_delay( int type, int turns, int parm1, int parm2 )
-/***********************************************************/
-{
- delay_queue_item delay;
-
- delay.type = type;
- delay.duration = turns;
- delay.parm1 = parm1;
- delay.parm2 = parm2;
-
- you.delay_queue.push( delay );
-}
-
-void stop_delay( void )
-/*********************/
-{
- delay_queue_item delay = you.delay_queue.front();
-
- // At the very least we can remove any queued delays, right
- // now there is no problem with doing this... note that
- // any queuing here can only happen from a single command,
- // as the effect of a delay doesn't normally allow interaction
- // until it is done... it merely chains up individual actions
- // into a single action. -- bwr
- if (you.delay_queue.size() > 1)
- {
- while (you.delay_queue.size())
- you.delay_queue.pop();
-
- you.delay_queue.push( delay );
- }
-
- switch (delay.type)
- {
- case DELAY_BUTCHER:
- // Corpse keeps track of work in plus2 field, see handle_delay() -- bwr
- mpr( "You stop butchering the corpse." );
- you.delay_queue.pop();
- break;
-
- case DELAY_MEMORISE:
- // Losing work here is okay... having to start from
- // scratch is a reasonable behaviour. -- bwr
- mpr( "Your memorization is interrupted." );
- you.delay_queue.pop();
- break;
-
- case DELAY_PASSWALL:
- // The lost work here is okay since this spell requires
- // the player to "attune to the rock". If changed, the
- // the delay should be increased to reduce the power of
- // this spell. -- bwr
- mpr( "Your meditation is interrupted." );
- you.delay_queue.pop();
- break;
-
- case DELAY_INTERUPTABLE:
- // always stopable by definition...
- // try using a more specific type anyways. -- bwr
- you.delay_queue.pop();
- break;
-
- case DELAY_EAT:
- // XXX: Large problems with object destruction here... food can
- // be from in the inventory or on the ground and these are
- // still handled quite differently. Eventually we would like
- // this to be stoppable, with partial food items implimented. -- bwr
- break;
-
- case DELAY_ARMOUR_ON:
- case DELAY_ARMOUR_OFF:
- // These two have the default action of not being interuptable,
- // although they will often be chained (remove cloak, remove
- // armour, wear new armour, replace cloak), all of which can
- // be stopped when complete. This is a fairly reasonable
- // behaviour, although perhaps the character should have
- // option of reversing the current action if it would take
- // less time to get out of the plate mail that's half on
- // than it would take to continue. Probably too much trouble,
- // and would have to have a prompt... this works just fine. -- bwr
- break;
-
- case DELAY_AUTOPICKUP: // one turn... too much trouble
- case DELAY_WEAPON_SWAP: // one turn... too much trouble
- case DELAY_DROP_ITEM: // one turn... only used for easy armour drops
- case DELAY_ASCENDING_STAIRS: // short... and probably what people want
- case DELAY_DESCENDING_STAIRS: // short... and probably what people want
- case DELAY_UNINTERUPTABLE: // never stopable
- default:
- break;
- }
-}
-
-bool you_are_delayed( void )
-/**************************/
-{
- return (!you.delay_queue.empty());
-}
-
-int current_delay_action( void )
-/******************************/
-{
- return (you_are_delayed() ? you.delay_queue.front().type
- : DELAY_NOT_DELAYED);
-}
-
-void handle_delay( void )
-/***********************/
-{
- int ego;
- char str_pass[ ITEMNAME_SIZE ];
-
- if (you_are_delayed())
- {
- delay_queue_item &delay = you.delay_queue.front();
-
- // First check cases where delay may no longer be valid:
- // XXX: need to handle passwall when monster digs -- bwr
- if (delay.type == DELAY_BUTCHER)
- {
- // A monster may have raised the corpse you're chopping up! -- bwr
- // Note that a monster could have raised the corpse and another
- // monster could die and create a corpse with the same ID number...
- // However, it would not be at the player's square like the
- // original and that's why we do it this way. Note that
- // we ignore the conversion to skeleton possiblity just to
- // be nice. -- bwr
- if (is_valid_item( mitm[ delay.parm1 ] )
- && mitm[ delay.parm1 ].base_type == OBJ_CORPSES
- && mitm[ delay.parm1 ].x == you.x_pos
- && mitm[ delay.parm1 ].y == you.y_pos)
- {
- // mark work done on the corpse in case we stop -- bwr
- mitm[ delay.parm1 ].plus2++;
- }
- else
- {
- // corpse is no longer valid!
- stop_delay();
- return;
- }
- }
-
- // Handle delay:
- if (delay.duration > 0)
- {
-#if DEBUG_DIAGNOSTICS
- snprintf( info, INFO_SIZE, "Delay type: %d duration: %d",
- delay.type, delay.duration );
-
- mpr( info, MSGCH_DIAGNOSTICS );
-#endif
- delay.duration--;
- }
- else
- {
- switch (delay.type)
- {
- case DELAY_AUTOPICKUP:
- break;
-
- case DELAY_WEAPON_SWAP:
- weapon_switch( delay.parm1 );
- break;
-
- case DELAY_ARMOUR_ON:
- {
- set_ident_flags( you.inv[ delay.parm1 ],
- ISFLAG_EQ_ARMOUR_MASK );
-
- in_name( delay.parm1, DESC_NOCAP_YOUR, str_pass );
- snprintf( info, INFO_SIZE,
- "You finish putting on %s.", str_pass );
- mpr(info);
-
- const equipment_type slot =
- get_armour_slot( you.inv[delay.parm1] );
-
- if (slot == EQ_BODY_ARMOUR)
- {
- you.equip[EQ_BODY_ARMOUR] = delay.parm1;
-
- if (you.duration[DUR_ICY_ARMOUR] != 0)
- {
- mpr( "Your icy armour melts away.", MSGCH_DURATION );
- you.redraw_armour_class = 1;
- you.duration[DUR_ICY_ARMOUR] = 0;
- }
- }
- else
- {
- switch (slot)
- {
- case EQ_SHIELD:
- if (you.duration[DUR_CONDENSATION_SHIELD])
- {
- mpr( "Your icy shield evaporates.", MSGCH_DURATION );
- you.duration[DUR_CONDENSATION_SHIELD] = 0;
- }
- you.equip[EQ_SHIELD] = delay.parm1;
- break;
- case EQ_CLOAK:
- you.equip[EQ_CLOAK] = delay.parm1;
- break;
- case EQ_HELMET:
- you.equip[EQ_HELMET] = delay.parm1;
- break;
- case EQ_GLOVES:
- you.equip[EQ_GLOVES] = delay.parm1;
- break;
- case EQ_BOOTS:
- you.equip[EQ_BOOTS] = delay.parm1;
- break;
- default:
- break;
- }
- }
-
- ego = get_armour_ego_type( you.inv[ delay.parm1 ] );
- if (ego != SPARM_NORMAL)
- {
- switch (ego)
- {
- case SPARM_RUNNING:
- strcpy(info, "You feel quick");
- strcat(info, (you.species == SP_NAGA
- || you.species == SP_CENTAUR) ? "." : " on your feet.");
- mpr(info);
- break;
-
- case SPARM_FIRE_RESISTANCE:
- mpr("You feel resistant to fire.");
- break;
-
- case SPARM_COLD_RESISTANCE:
- mpr("You feel resistant to cold.");
- break;
-
- case SPARM_POISON_RESISTANCE:
- mpr("You feel healthy.");
- break;
-
- case SPARM_SEE_INVISIBLE:
- mpr("You feel perceptive.");
- break;
-
- case SPARM_DARKNESS:
- if (!you.invis)
- mpr("You become transparent for a moment.");
- break;
-
- case SPARM_STRENGTH:
- modify_stat(STAT_STRENGTH, 3, false);
- break;
-
- case SPARM_DEXTERITY:
- modify_stat(STAT_DEXTERITY, 3, false);
- break;
-
- case SPARM_INTELLIGENCE:
- modify_stat(STAT_INTELLIGENCE, 3, false);
- break;
-
- case SPARM_PONDEROUSNESS:
- mpr("You feel rather ponderous.");
- // you.speed += 2;
- you.redraw_evasion = 1;
- break;
-
- case SPARM_LEVITATION:
- mpr("You feel rather light.");
- break;
-
- case SPARM_MAGIC_RESISTANCE:
- mpr("You feel resistant to magic.");
- break;
-
- case SPARM_PROTECTION:
- mpr("You feel protected.");
- break;
-
- case SPARM_STEALTH:
- mpr("You feel stealthy.");
- break;
-
- case SPARM_RESISTANCE:
- mpr("You feel resistant to extremes of temperature.");
- break;
-
- case SPARM_POSITIVE_ENERGY:
- mpr("Your life-force is being protected.");
- break;
-
- case SPARM_ARCHMAGI:
- if (!you.skills[SK_SPELLCASTING])
- mpr("You feel strangely numb.");
- else
- mpr("You feel extremely powerful.");
- break;
- }
- }
-
- if (is_random_artefact( you.inv[ delay.parm1 ] ))
- use_randart( delay.parm1 );
-
- if (item_cursed( you.inv[ delay.parm1 ] ))
- mpr( "Oops, that feels deathly cold." );
-
- you.redraw_armour_class = 1;
- you.redraw_evasion = 1;
- break;
- }
- case DELAY_ARMOUR_OFF:
- {
- in_name( delay.parm1, DESC_NOCAP_YOUR, str_pass );
- snprintf( info, INFO_SIZE, "You finish taking off %s.", str_pass );
- mpr(info);
-
- const equipment_type slot =
- get_armour_slot( you.inv[delay.parm1] );
-
- if (slot == EQ_BODY_ARMOUR)
- {
- you.equip[EQ_BODY_ARMOUR] = -1;
- }
- else
- {
- switch (slot)
- {
- case EQ_SHIELD:
- if (delay.parm1 == you.equip[EQ_SHIELD])
- you.equip[EQ_SHIELD] = -1;
- break;
-
- case EQ_CLOAK:
- if (delay.parm1 == you.equip[EQ_CLOAK])
- you.equip[EQ_CLOAK] = -1;
- break;
-
- case EQ_HELMET:
- if (delay.parm1 == you.equip[EQ_HELMET])
- you.equip[EQ_HELMET] = -1;
- break;
-
-
- case EQ_GLOVES:
- if (delay.parm1 == you.equip[EQ_GLOVES])
- you.equip[EQ_GLOVES] = -1;
- break;
-
- case EQ_BOOTS:
- if (delay.parm1 == you.equip[EQ_BOOTS])
- you.equip[EQ_BOOTS] = -1;
- break;
-
- default:
- break;
- }
- }
-
- unwear_armour( delay.parm1 );
-
- you.redraw_armour_class = 1;
- you.redraw_evasion = 1;
- break;
- }
- case DELAY_EAT:
- mpr( "You finish eating." );
- break;
-
- case DELAY_MEMORISE:
- mpr( "You finish memorising." );
- add_spell_to_memory( delay.parm1 );
- break;
-
- case DELAY_PASSWALL:
- {
- mpr( "You finish merging with the rock." );
- more(); // or the above message won't be seen
-
- const int pass_x = delay.parm1;
- const int pass_y = delay.parm2;
-
- if (pass_x != 0 && pass_y != 0)
- {
-
- switch (grd[ pass_x ][ pass_y ])
- {
- case DNGN_ROCK_WALL:
- case DNGN_STONE_WALL:
- case DNGN_METAL_WALL:
- case DNGN_GREEN_CRYSTAL_WALL:
- case DNGN_WAX_WALL:
- case DNGN_SILVER_STATUE:
- case DNGN_ORANGE_CRYSTAL_STATUE:
- ouch(1 + you.hp, 0, KILLED_BY_PETRIFICATION);
- break;
-
- case DNGN_SECRET_DOOR: // oughtn't happen
- case DNGN_CLOSED_DOOR: // open the door
- grd[ pass_x ][ pass_y ] = DNGN_OPEN_DOOR;
- break;
-
- default:
- break;
- }
-
- //jmf: hmm, what to do. kill the monster? (seems too powerful)
- // displace the monster? randomly teleport the monster?
- // This seems fair: try to move the monster, but if not
- // able to, then kill it.
- int mon = mgrd[ pass_x ][ pass_y ];
- if (mon != NON_MONSTER)
- {
- monster_blink( &menv[ mon ] );
-
- // recheck square for monster
- mon = mgrd[ pass_x ][ pass_y ];
- if (mon != NON_MONSTER)
- monster_die( &menv[ mon ], KILL_YOU, 0 );
- }
-
- you.x_pos = pass_x;
- you.y_pos = pass_y;
- redraw_screen();
-
- const unsigned char grid = grd[ you.x_pos ][ you.y_pos ];
- if ((grid == DNGN_LAVA || grid == DNGN_DEEP_WATER)
- && !player_is_levitating())
- {
- if (you.species == SP_MERFOLK && grid == DNGN_DEEP_WATER)
- {
- mpr("You fall into the water and return "
- "to your normal form.");
- merfolk_start_swimming();
- }
- else
- {
- fall_into_a_pool( true, grid );
- redraw_screen();
- }
- }
- }
- }
- break;
-
- case DELAY_BUTCHER:
- strcpy( info, "You finish " );
- strcat( info, (you.species == SP_TROLL
- || you.species == SP_GHOUL) ? "ripping"
- : "chopping" );
-
- strcat( info, " the corpse into pieces." );
- mpr( info );
-
- turn_corpse_into_chunks( mitm[ delay.parm1 ] );
-
- if (you.berserker && you.berserk_penalty != NO_BERSERK_PENALTY)
- {
- mpr("You enjoyed that.");
- you.berserk_penalty = 0;
- }
- break;
-
- case DELAY_DROP_ITEM:
- // Note: checking if item is dropable is assumed to
- // be done before setting up this delay... this includes
- // quantity (delay.parm2). -- bwr
-
- // Make sure item still exists.
- if (!is_valid_item( you.inv[ delay.parm1 ] ))
- break;
-
- // Must handle unwield_item before we attempt to copy
- // so that temporary brands and such are cleared. -- bwr
- if (delay.parm1 == you.equip[EQ_WEAPON])
- {
- unwield_item( delay.parm1 );
- you.equip[EQ_WEAPON] = -1;
- canned_msg( MSG_EMPTY_HANDED );
- }
-
- if (!copy_item_to_grid( you.inv[ delay.parm1 ],
- you.x_pos, you.y_pos, delay.parm2 ))
- {
- mpr("Too many items on this level, not dropping the item.");
- }
- else
- {
- quant_name( you.inv[ delay.parm1 ], delay.parm2,
- DESC_NOCAP_A, str_pass );
-
- snprintf( info, INFO_SIZE, "You drop %s.", str_pass );
- mpr(info);
-
- dec_inv_item_quantity( delay.parm1, delay.parm2 );
- }
- break;
-
- case DELAY_ASCENDING_STAIRS:
- up_stairs();
- untag_followers();
- break;
-
- case DELAY_DESCENDING_STAIRS:
- down_stairs( false, delay.parm1 );
- untag_followers();
- break;
-
- case DELAY_INTERUPTABLE:
- case DELAY_UNINTERUPTABLE:
- // these are simple delays that have no effect when complete
- break;
-
- default:
- mpr( "You finish doing something." );
- break;
- }
-
- you.wield_change = true;
- print_stats(); // force redraw of the stats
- you.turn_is_over = 1;
- you.delay_queue.pop();
- }
- }
-}