summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
authorharanp <haranp@c06c8d41-db1a-0410-9941-cceddc491573>2007-06-17 21:55:31 +0000
committerharanp <haranp@c06c8d41-db1a-0410-9941-cceddc491573>2007-06-17 21:55:31 +0000
commitbcd3e391a7c63905b95527de38a92b34f535ddd0 (patch)
treede07bfa61d804a27acafb685056f880c69cacc45 /crawl-ref/source
parent44f56edce815f5ff8fb4124829523439f1cc8ad2 (diff)
downloadcrawl-ref-bcd3e391a7c63905b95527de38a92b34f535ddd0.tar.gz
crawl-ref-bcd3e391a7c63905b95527de38a92b34f535ddd0.zip
Some more cards and bugfixes.
Still not implemented: Shuffle, trowel, minefield, spade, blade. Partially implemented: Battlelust, helm, shadow, damage cards. Breaks savefiles. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1595 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/acr.cc7
-rw-r--r--crawl-ref/source/decks.cc93
-rw-r--r--crawl-ref/source/enum.h14
-rw-r--r--crawl-ref/source/externs.h2
-rw-r--r--crawl-ref/source/it_use3.cc2
-rw-r--r--crawl-ref/source/monstuff.cc12
-rw-r--r--crawl-ref/source/monstuff.h2
-rw-r--r--crawl-ref/source/output.cc6
-rw-r--r--crawl-ref/source/religion.cc1
-rw-r--r--crawl-ref/source/religion.h1
-rw-r--r--crawl-ref/source/shopping.cc16
-rw-r--r--crawl-ref/source/spl-cast.cc36
12 files changed, 120 insertions, 72 deletions
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index 7d8ca311bc..2c6ab89b92 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -1898,6 +1898,13 @@ static void decrement_durations()
you.invis = 0;
}
+ if ( you.duration[DUR_BARGAIN] > 1 )
+ you.duration[DUR_BARGAIN]--;
+ else if ( you.duration[DUR_BARGAIN] == 1 )
+ {
+ mpr("You feel less charismatic.", MSGCH_DURATION);
+ }
+
if (you.conf > 0)
reduce_confuse_player(1);
diff --git a/crawl-ref/source/decks.cc b/crawl-ref/source/decks.cc
index d42dc33dfb..513aee997f 100644
--- a/crawl-ref/source/decks.cc
+++ b/crawl-ref/source/decks.cc
@@ -25,6 +25,7 @@
#include "items.h"
#include "misc.h"
#include "monplace.h"
+#include "monstuff.h"
#include "mutation.h"
#include "ouch.h"
#include "player.h"
@@ -443,7 +444,7 @@ int get_power_level(int power, deck_rarity_type rarity)
}
/* Actual card implementations follow. */
-void portal_card(int power, deck_rarity_type rarity)
+static void portal_card(int power, deck_rarity_type rarity)
{
const int control_level = get_power_level(power, rarity);
bool instant = false;
@@ -474,7 +475,7 @@ void portal_card(int power, deck_rarity_type rarity)
you.duration[DUR_CONTROL_TELEPORT] = 0;
}
-void warp_card(int power, deck_rarity_type rarity)
+static void warp_card(int power, deck_rarity_type rarity)
{
const int control_level = get_power_level(power, rarity);
if ( control_level >= 2 )
@@ -485,12 +486,12 @@ void warp_card(int power, deck_rarity_type rarity)
random_blink(false);
}
-void swap_monster_card(int power, deck_rarity_type rarity)
+static void swap_monster_card(int power, deck_rarity_type rarity)
{
// swap between you and another monster
}
-void velocity_card(int power, deck_rarity_type rarity)
+static void velocity_card(int power, deck_rarity_type rarity)
{
const int power_level = get_power_level(power, rarity);
if ( power_level >= 2 )
@@ -508,7 +509,7 @@ void velocity_card(int power, deck_rarity_type rarity)
}
}
-void damnation_card(int power, deck_rarity_type rarity)
+static void damnation_card(int power, deck_rarity_type rarity)
{
// pick a random monster nearby to banish
int mons_count = 1; // you
@@ -538,7 +539,7 @@ void damnation_card(int power, deck_rarity_type rarity)
}
}
-void warpwright_card(int power, deck_rarity_type rarity)
+static void warpwright_card(int power, deck_rarity_type rarity)
{
int count = 0;
int fx = -1, fy = -1;
@@ -576,7 +577,7 @@ void warpwright_card(int power, deck_rarity_type rarity)
}
}
-void damaging_card( card_type card, int power, deck_rarity_type rarity )
+static void damaging_card( card_type card, int power, deck_rarity_type rarity )
{
dist target;
bolt beam;
@@ -598,7 +599,7 @@ void damaging_card( card_type card, int power, deck_rarity_type rarity )
zapping(ztype, random2(power/4), beam);
}
-void elixir_card(int power, deck_rarity_type rarity)
+static void elixir_card(int power, deck_rarity_type rarity)
{
int power_level = get_power_level(power, rarity);
@@ -624,7 +625,7 @@ void elixir_card(int power, deck_rarity_type rarity)
}
}
-void battle_lust_card(int power, deck_rarity_type rarity)
+static void battle_lust_card(int power, deck_rarity_type rarity)
{
const int power_level = get_power_level(power, rarity);
if ( power_level >= 2 )
@@ -637,7 +638,7 @@ void battle_lust_card(int power, deck_rarity_type rarity)
potion_effect(POT_MIGHT, random2(power/4));
}
-void metamorphosis_card(int power, deck_rarity_type rarity)
+static void metamorphosis_card(int power, deck_rarity_type rarity)
{
const int power_level = get_power_level(power, rarity);
transformation_type trans;
@@ -648,7 +649,7 @@ void metamorphosis_card(int power, deck_rarity_type rarity)
transform(random2(power/4), trans);
}
-void helm_card(int power, deck_rarity_type rarity)
+static void helm_card(int power, deck_rarity_type rarity)
{
const int power_level = get_power_level(power, rarity);
bool do_forescry = false;
@@ -687,7 +688,7 @@ void helm_card(int power, deck_rarity_type rarity)
// Do one of: vorpalise, sure blade, dancing weapon
// XXX XXX FIXME Hard to do now, because you have to
// wield the deck in order to evoke it!
-void blade_card(int power, deck_rarity_type rarity)
+static void blade_card(int power, deck_rarity_type rarity)
{
return;
const int power_level = get_power_level(power, rarity);
@@ -705,7 +706,7 @@ void blade_card(int power, deck_rarity_type rarity)
}
}
-void shadow_card(int power, deck_rarity_type rarity)
+static void shadow_card(int power, deck_rarity_type rarity)
{
const int power_level = get_power_level(power, rarity);
if ( power_level >= 1 )
@@ -715,7 +716,7 @@ void shadow_card(int power, deck_rarity_type rarity)
potion_effect(POT_INVISIBILITY, random2(power/4));
}
-void potion_card(int power, deck_rarity_type rarity)
+static void potion_card(int power, deck_rarity_type rarity)
{
const int power_level = get_power_level(power, rarity);
potion_type pot_effects[] = {
@@ -736,7 +737,7 @@ void potion_card(int power, deck_rarity_type rarity)
potion_effect(pot, random2(power/4));
}
-void focus_card(int power, deck_rarity_type rarity)
+static void focus_card(int power, deck_rarity_type rarity)
{
char* max_statp[] = { &you.max_strength, &you.max_intel, &you.max_dex };
char* base_statp[] = { &you.strength, &you.intel, &you.dex };
@@ -768,14 +769,14 @@ void focus_card(int power, deck_rarity_type rarity)
you.redraw_dexterity = true;
}
-void shuffle_card(int power, deck_rarity_type rarity)
+static void shuffle_card(int power, deck_rarity_type rarity)
{
// not yet implemented
// should shuffle *base* stat levels
return;
}
-void genetic_engineer_card(int power, deck_rarity_type rarity)
+static void genetic_engineer_card(int power, deck_rarity_type rarity)
{
mutation_type bad_mutations[] = {
MUT_FAST_METABOLISM, MUT_WEAK, MUT_DOPEY, MUT_CLUMSY,
@@ -795,7 +796,7 @@ void genetic_engineer_card(int power, deck_rarity_type rarity)
delete_mutation(which_mut);
}
-void dowsing_card(int power, deck_rarity_type rarity)
+static void dowsing_card(int power, deck_rarity_type rarity)
{
const int power_level = get_power_level(power, rarity);
bool things_to_do[3] = { false, false, false };
@@ -816,19 +817,19 @@ void dowsing_card(int power, deck_rarity_type rarity)
detect_creatures( random2(power/4) );
}
-void trowel_card(int power, deck_rarity_type rarity)
+static void trowel_card(int power, deck_rarity_type rarity)
{
// not implemented yet
return;
}
-void minefield_card(int power, deck_rarity_type rarity)
+static void minefield_card(int power, deck_rarity_type rarity)
{
// not implemented yet
return;
}
-void genie_card(int power, deck_rarity_type rarity)
+static void genie_card(int power, deck_rarity_type rarity)
{
if ( coinflip() )
acquirement( OBJ_RANDOM, AQ_CARD_ACQUISITION );
@@ -836,7 +837,38 @@ void genie_card(int power, deck_rarity_type rarity)
potion_effect( coinflip() ? POT_DEGENERATION : POT_DECAY, 40 );
}
-int card_power(deck_rarity_type rarity)
+static void godly_wrath()
+{
+ divine_retribution(static_cast<god_type>(random2(NUM_GODS)));
+}
+
+static void curse_card(int power, deck_rarity_type rarity)
+{
+ const int power_level = get_power_level(power, rarity);
+
+ if ( power_level >= 2 )
+ {
+ // curse (almost) everything + decay
+ while ( curse_an_item(true) && !one_chance_in(1000) )
+ ;
+ }
+ else if ( power_level == 1 )
+ {
+ do // curse an average of four items
+ {
+ curse_an_item(false);
+ } while ( !one_chance_in(4) );
+ }
+ else
+ {
+ curse_an_item(false); // curse 1.5 items
+ if ( coinflip() )
+ curse_an_item(false);
+ }
+}
+
+
+static int card_power(deck_rarity_type rarity)
{
int result = 0;
@@ -891,10 +923,13 @@ void card_effect(card_type which_card, deck_rarity_type rarity)
case CARD_TROWEL: trowel_card(power, rarity); break;
case CARD_MINEFIELD: minefield_card(power, rarity); break;
case CARD_GENIE: genie_card(power, rarity); break;
+ case CARD_CURSE: curse_card(power, rarity); break;
+ case CARD_WARPWRIGHT: warpwright_card(power, rarity); break;
case CARD_TOMB: entomb(); break;
-
- case CARD_WARPWRIGHT: case CARD_SPADE: case CARD_WRATH:
- case CARD_WRAITH: case CARD_CURSE: case CARD_BARGAIN:
+ case CARD_WRAITH: drain_exp(); lose_level(); break;
+ case CARD_WRATH: godly_wrath(); break;
+
+ case CARD_SPADE:
mpr("Sorry, this card is not yet available.");
break;
@@ -902,9 +937,13 @@ void card_effect(card_type which_card, deck_rarity_type rarity)
damaging_card(which_card, power, rarity);
break;
+ case CARD_BARGAIN:
+ you.duration[DUR_BARGAIN] += random2(power) + random2(power);
+ break;
- case CARD_MAP: magic_mapping( random2(power/10) + 15,
- random2(power) );
+ case CARD_MAP:
+ magic_mapping( random2(power/10) + 15, random2(power) );
+ break;
case CARD_BANSHEE: mass_enchantment(ENCH_FEAR, power, MHITYOU); break;
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index b55baccbca..0a507f8e79 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -1160,18 +1160,16 @@ enum duration_type
DUR_TRANSFORMATION,
DUR_DEATH_CHANNEL,
DUR_DEFLECT_MISSILES, // 15
-//jmf: new durations:
DUR_FORESCRY,
DUR_SEE_INVISIBLE,
- DUR_WEAPON_BRAND, // general "branding" spell counter
+ DUR_WEAPON_BRAND, // general "branding" spell counter
DUR_SILENCE,
- DUR_GLAMOUR, // 20
- DUR_CONDENSATION_SHIELD = 23, // 23
+ DUR_GLAMOUR, // 20
+ DUR_CONDENSATION_SHIELD,
DUR_STONESKIN,
- DUR_REPEL_UNDEAD, // 25
- DUR_STUN,
- DUR_CUT, // 27
- DUR_GOURMAND, // 28
+ DUR_REPEL_UNDEAD,
+ DUR_GOURMAND,
+ DUR_BARGAIN, // 25
NUM_DURATIONS = 30 // must be at least 30
};
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h
index 59436307f6..a86247fd60 100644
--- a/crawl-ref/source/externs.h
+++ b/crawl-ref/source/externs.h
@@ -647,7 +647,7 @@ public:
unsigned long experience;
int experience_level;
- unsigned int gold;
+ int gold;
int char_class;
char class_name[30];
int time_taken;
diff --git a/crawl-ref/source/it_use3.cc b/crawl-ref/source/it_use3.cc
index e361ed000d..9e4b6defa5 100644
--- a/crawl-ref/source/it_use3.cc
+++ b/crawl-ref/source/it_use3.cc
@@ -96,7 +96,7 @@ void special_wielded()
makes_noise = false;
if (one_chance_in(30))
- curse_an_item(0, 0);
+ curse_an_item(false);
break;
case SPWLD_VARIABLE:
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc
index f51cbc4ba4..b7a03ead8c 100644
--- a/crawl-ref/source/monstuff.cc
+++ b/crawl-ref/source/monstuff.cc
@@ -193,14 +193,8 @@ int get_mimic_colour( const monsters *mimic )
}
// monster curses a random player inventory item:
-bool curse_an_item( char which, char power )
+bool curse_an_item( bool decay_potions )
{
- UNUSED( power );
-
- /* use which later, if I want to curse weapon/gloves whatever
- which, for now: 0 = non-mummy, 1 = mummy (potions as well)
- don't change mitm.special of !odecay */
-
int count = 0;
int item = ENDOFPACK;
@@ -218,7 +212,7 @@ bool curse_an_item( char which, char power )
continue;
if (you.inv[i].base_type == OBJ_POTIONS
- && (which != 1 || you.inv[i].sub_type == POT_DECAY))
+ && (!decay_potions || you.inv[i].sub_type == POT_DECAY))
{
continue;
}
@@ -745,7 +739,7 @@ void monster_die(monsters *monster, char killer, int i, bool silent)
{
if (YOU_KILL(killer))
{
- if (curse_an_item(1, 0))
+ if (curse_an_item(true))
mpr("You feel nervous for a moment...", MSGCH_MONSTER_SPELL);
}
}
diff --git a/crawl-ref/source/monstuff.h b/crawl-ref/source/monstuff.h
index ddda00c94b..2381e34832 100644
--- a/crawl-ref/source/monstuff.h
+++ b/crawl-ref/source/monstuff.h
@@ -67,7 +67,7 @@ void behaviour_event( struct monsters *mon, int event_type,
/* ***********************************************************************
* called from: fight - it_use3 - spells
* *********************************************************************** */
-bool curse_an_item(char which, char power);
+bool curse_an_item(bool decay_potions);
/* ***********************************************************************
diff --git a/crawl-ref/source/output.cc b/crawl-ref/source/output.cc
index 9439c2f9e8..1e553159dc 100644
--- a/crawl-ref/source/output.cc
+++ b/crawl-ref/source/output.cc
@@ -530,6 +530,12 @@ void print_stats(void)
textcolor( YELLOW ); // no warning
cprintf( "BWpn" );
}
+
+ if (you.duration[DUR_BARGAIN] && wherex() < get_number_of_cols() - 4)
+ {
+ dur_colour( BLUE, (you.duration[DUR_BARGAIN] <= 15) );
+ cprintf( "Brgn" );
+ }
textcolor( LIGHTGREY );
}
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc
index c453640fec..52b1c4a215 100644
--- a/crawl-ref/source/religion.cc
+++ b/crawl-ref/source/religion.cc
@@ -276,7 +276,6 @@ const char* god_lose_power_messages[MAX_NUM_GODS][MAX_GOD_ABILITIES] =
void altar_prayer(void);
void dec_penance(int god, int val);
-void divine_retribution(god_type god);
void inc_penance(int god, int val);
void inc_penance(int val);
int followers_abandon_you(void); // Beogh
diff --git a/crawl-ref/source/religion.h b/crawl-ref/source/religion.h
index afed5bb7c1..a1ec62a17c 100644
--- a/crawl-ref/source/religion.h
+++ b/crawl-ref/source/religion.h
@@ -37,6 +37,7 @@ int piety_rank(int piety = -1);
void offer_items();
bool god_likes_butchery(god_type god);
bool god_hates_butchery(god_type god);
+void divine_retribution(god_type god);
bool xom_is_nice();
void xom_is_stimulated(int maxinterestingness);
diff --git a/crawl-ref/source/shopping.cc b/crawl-ref/source/shopping.cc
index e7b2765ee7..549dd35976 100644
--- a/crawl-ref/source/shopping.cc
+++ b/crawl-ref/source/shopping.cc
@@ -115,12 +115,12 @@ static void in_a_shop( char shoppy )
FixedVector < int, 20 > shop_items;
char st_pass[ ITEMNAME_SIZE ] = "";
- unsigned int gp_value = 0;
unsigned char ft;
std::string purchasable;
clrscr();
int itty = 0;
+ int gp_value; // Should eliminate gotos instead of initializing here
ShopInfo &si = stashes.get_shop(the_shop.x, the_shop.y);
@@ -174,6 +174,13 @@ static void in_a_shop( char shoppy )
gp_value = the_shop.greed * item_value(mitm[itty], id_stock);
gp_value /= 10;
+
+ if ( you.duration[DUR_BARGAIN] ) // 20% discount
+ {
+ gp_value *= 8;
+ gp_value /= 10;
+ }
+
if (gp_value <= 1)
gp_value = 1;
@@ -283,7 +290,12 @@ static void in_a_shop( char shoppy )
goto purchase;
}
- gp_value = the_shop.greed * item_value(mitm[shop_items[ft]], id_stock)/10;
+ gp_value = the_shop.greed*item_value(mitm[shop_items[ft]],id_stock)/10;
+ if ( you.duration[DUR_BARGAIN] ) // 20% discount
+ {
+ gp_value *= 8;
+ gp_value /= 10;
+ }
if (gp_value > you.gold)
{
diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc
index eb2aaa0a55..8096b5c40b 100644
--- a/crawl-ref/source/spl-cast.cc
+++ b/crawl-ref/source/spl-cast.cc
@@ -1901,15 +1901,13 @@ bool miscast_effect( unsigned int sp_type, int mag_pow, int mag_fail,
struct bolt beam;
bool failMsg = true;
- int loopj = 0;
- int spec_effect = 0;
- int hurted = 0;
+ int loopj;
if (sp_type == SPTYP_RANDOM)
sp_type = 1 << (random2(12));
- spec_effect = (mag_pow * mag_fail * (10 + mag_pow) / 7
- * WILD_MAGIC_NASTINESS) / 100;
+ int spec_effect = (mag_pow * mag_fail * (10 + mag_pow) / 7
+ * WILD_MAGIC_NASTINESS) / 100;
if (force_effect == 100
&& random2(40) > spec_effect && random2(40) > spec_effect)
@@ -1921,7 +1919,7 @@ bool miscast_effect( unsigned int sp_type, int mag_pow, int mag_fail,
// setup beam
beam.is_tracer = false;
- spec_effect = spec_effect / 100;
+ spec_effect /= 100;
#if DEBUG_DIAGNOSTICS
const int old_fail = spec_effect;
@@ -2131,7 +2129,7 @@ bool miscast_effect( unsigned int sp_type, int mag_pow, int mag_fail,
case 1:
case 2:
mpr("You sense a malignant aura.");
- curse_an_item(0, 0);
+ curse_an_item(false);
break;
case 3:
case 4:
@@ -2148,12 +2146,9 @@ bool miscast_effect( unsigned int sp_type, int mag_pow, int mag_fail,
switch (random2(4))
{
case 0:
- do
- {
- curse_an_item(0, 0);
- loopj = random2(3);
- }
- while (loopj != 0);
+ do {
+ curse_an_item(false);
+ } while ( !one_chance_in(3) );
mpr("You sense an overwhelmingly malignant aura!");
break;
@@ -2257,8 +2252,8 @@ bool miscast_effect( unsigned int sp_type, int mag_pow, int mag_fail,
break;
case 5:
mpr("Space twists in upon itself!");
-
- for (loopj = 0; loopj < 2 + random2(3); loopj++)
+ loopj = 2 + random2(3);
+ for (int i = 0; i < loopj; ++i)
{
create_monster( MONS_SPATIAL_VORTEX, 3,
BEH_HOSTILE, you.x_pos, you.y_pos,
@@ -2372,8 +2367,8 @@ bool miscast_effect( unsigned int sp_type, int mag_pow, int mag_fail,
{
case 0:
mpr("Space twists in upon itself!");
-
- for (loopj = 0; loopj < 2 + random2(3); loopj++)
+ loopj = 2 + random2(3);
+ for (int i = 0; i < loopj; ++i)
{
create_monster( MONS_SPATIAL_VORTEX, 3,
BEH_HOSTILE, you.x_pos, you.y_pos,
@@ -3170,11 +3165,8 @@ bool miscast_effect( unsigned int sp_type, int mag_pow, int mag_fail,
mpr("Rocks fall onto you out of nowhere!");
break;
}
-
- hurted = random2avg(13, 2) + 10;
- hurted -= random2(1 + player_AC());
-
- ouch(hurted, 0, KILLED_BY_WILD_MAGIC, cause);
+ ouch( random2avg(13,2) + 10 - random2(1 + player_AC()),
+ 0, KILLED_BY_WILD_MAGIC, cause);
break;
}
break;