diff options
author | haranp <haranp@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-06-17 21:55:31 +0000 |
---|---|---|
committer | haranp <haranp@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-06-17 21:55:31 +0000 |
commit | bcd3e391a7c63905b95527de38a92b34f535ddd0 (patch) | |
tree | de07bfa61d804a27acafb685056f880c69cacc45 /crawl-ref/source | |
parent | 44f56edce815f5ff8fb4124829523439f1cc8ad2 (diff) | |
download | crawl-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.cc | 7 | ||||
-rw-r--r-- | crawl-ref/source/decks.cc | 93 | ||||
-rw-r--r-- | crawl-ref/source/enum.h | 14 | ||||
-rw-r--r-- | crawl-ref/source/externs.h | 2 | ||||
-rw-r--r-- | crawl-ref/source/it_use3.cc | 2 | ||||
-rw-r--r-- | crawl-ref/source/monstuff.cc | 12 | ||||
-rw-r--r-- | crawl-ref/source/monstuff.h | 2 | ||||
-rw-r--r-- | crawl-ref/source/output.cc | 6 | ||||
-rw-r--r-- | crawl-ref/source/religion.cc | 1 | ||||
-rw-r--r-- | crawl-ref/source/religion.h | 1 | ||||
-rw-r--r-- | crawl-ref/source/shopping.cc | 16 | ||||
-rw-r--r-- | crawl-ref/source/spl-cast.cc | 36 |
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; |