diff options
-rw-r--r-- | crawl-ref/source/abl-show.cc | 2 | ||||
-rw-r--r-- | crawl-ref/source/acr.cc | 5 | ||||
-rw-r--r-- | crawl-ref/source/art-func.h | 4 | ||||
-rw-r--r-- | crawl-ref/source/beam.cc | 29 | ||||
-rw-r--r-- | crawl-ref/source/chardump.cc | 3 | ||||
-rw-r--r-- | crawl-ref/source/clua.cc | 2 | ||||
-rw-r--r-- | crawl-ref/source/dat/database/monspeak.txt | 31 | ||||
-rw-r--r-- | crawl-ref/source/dat/descript/monsters.txt | 4 | ||||
-rw-r--r-- | crawl-ref/source/dungeon.cc | 7 | ||||
-rw-r--r-- | crawl-ref/source/enum.h | 22 | ||||
-rw-r--r-- | crawl-ref/source/fight.cc | 1 | ||||
-rw-r--r-- | crawl-ref/source/misc.cc | 1 | ||||
-rw-r--r-- | crawl-ref/source/mon-data.h | 12 | ||||
-rw-r--r-- | crawl-ref/source/mon-spll.h | 11 | ||||
-rw-r--r-- | crawl-ref/source/monplace.cc | 4 | ||||
-rw-r--r-- | crawl-ref/source/monstuff.cc | 38 | ||||
-rw-r--r-- | crawl-ref/source/mstuff2.cc | 8 | ||||
-rw-r--r-- | crawl-ref/source/output.cc | 3 | ||||
-rw-r--r-- | crawl-ref/source/player.cc | 13 | ||||
-rw-r--r-- | crawl-ref/source/spl-data.h | 13 | ||||
-rw-r--r-- | crawl-ref/source/tilepick.cc | 1 | ||||
-rw-r--r-- | crawl-ref/source/transfor.cc | 43 | ||||
-rw-r--r-- | crawl-ref/source/transfor.h | 1 |
23 files changed, 228 insertions, 30 deletions
diff --git a/crawl-ref/source/abl-show.cc b/crawl-ref/source/abl-show.cc index 01bf48e49c..d0f3c3624a 100644 --- a/crawl-ref/source/abl-show.cc +++ b/crawl-ref/source/abl-show.cc @@ -2164,7 +2164,7 @@ std::vector<talent> your_talents(bool check_confused) if (player_mutation_level(MUT_SMITE)) _add_talent(talents, ABIL_BOLT_OF_DRAINING, check_confused); - if (you.duration[DUR_TRANSFORMATION]) + if (you.duration[DUR_TRANSFORMATION] && you.attribute[ATTR_TRANSFORMATION]!=TRAN_PIG) _add_talent(talents, ABIL_END_TRANSFORMATION, check_confused); if (player_mutation_level(MUT_BLINK)) diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc index a16226327e..835b08cf6f 100644 --- a/crawl-ref/source/acr.cc +++ b/crawl-ref/source/acr.cc @@ -1670,7 +1670,8 @@ void process_command( command_type cmd ) case CMD_CAST_SPELL: case CMD_FORCE_CAST_SPELL: - if (player_in_bat_form()) + if (player_in_bat_form() + || you.attribute[ATTR_TRANSFORMATION] == TRAN_PIG) { canned_msg(MSG_PRESENT_FORM); break; @@ -4077,7 +4078,7 @@ static void _compile_time_asserts() COMPILE_CHECK(SP_VAMPIRE == 31 , c3); COMPILE_CHECK(SPELL_DEBUGGING_RAY == 107 , c4); COMPILE_CHECK(SPELL_PETRIFY == 160 , c5); - COMPILE_CHECK(NUM_SPELLS == 198 , c6); + COMPILE_CHECK(NUM_SPELLS == 199 , c6); //jmf: NEW ASSERTS: we ought to do a *lot* of these COMPILE_CHECK(NUM_JOBS < JOB_UNKNOWN , c7); diff --git a/crawl-ref/source/art-func.h b/crawl-ref/source/art-func.h index 3cd9976040..e5a54cf691 100644 --- a/crawl-ref/source/art-func.h +++ b/crawl-ref/source/art-func.h @@ -408,7 +408,7 @@ static bool _WUCAD_MU_evoke(item_def *item, int* pract, bool* did_work, /////////////////////////////////////////////////// -// XXX: Always getting maximal vampiric drain is harcoded in +// XXX: Always getting maximal vampiric drain is hardcoded in // melee_attack::apply_damage_brand() static void _VAMPIRES_TOOTH_equip(item_def *item, bool *show_msgs, bool unmeld) @@ -470,7 +470,7 @@ static void _ZONGULDROK_world_reacts(item_def *item) did_god_conduct(DID_NECROMANCY, 1); } } - + static void _ZONGULDROK_melee_effect(item_def* weapon, actor* attacker, actor* defender, bool mondied) { diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc index c05e1bf18f..4067b00a24 100644 --- a/crawl-ref/source/beam.cc +++ b/crawl-ref/source/beam.cc @@ -55,6 +55,7 @@ REVISION("$Rev$"); #include "state.h" #include "stuff.h" #include "terrain.h" +#include "transfor.h" #include "traps.h" #include "tutorial.h" #include "view.h" @@ -3746,6 +3747,15 @@ void bolt::affect_player_enchantment() obvious_effect = true; break; + case BEAM_PORKALATOR: + if (!transform(ench_power, TRAN_PIG, true)) + { + mpr("You feel like a pig."); + break; + } + obvious_effect = true; + break; + default: // _All_ enchantments should be enumerated here! mpr("Software bugs nibble your toes!"); @@ -4528,6 +4538,8 @@ void bolt::affect_monster(monsters* mon) int beam_hit = hit; if (mon->invisible() && !this->can_see_invis) beam_hit /= 2; + if (mon->type == MONS_KIRKE) // deflect missiles + beam_hit = random2(beam_hit * 2) / 3; // FIXME We're randomising mon->evasion, which is further // randomised inside test_beam_hit. This is so we stay close to the 4.0 @@ -4687,6 +4699,13 @@ bool _ench_flavour_affects_monster(beam_type flavour, const monsters* mon) && mons_res_cold(mon) <= 0; // can't be hibernated break; + case BEAM_PORKALATOR: + rc = (mons_holiness(mon) == MH_NATURAL + && mon->type != MONS_HOG) || + (mons_holiness(mon) == MH_DEMONIC + && mon->type != MONS_HELL_HOG); + break; + default: break; } @@ -5003,6 +5022,12 @@ mon_resist_type bolt::apply_enchantment_to_monster(monsters* mon) } return (MON_AFFECTED); + case BEAM_PORKALATOR: + if (monster_polymorph(mon, (mons_holiness(mon)==MH_DEMONIC)? + MONS_HELL_HOG : MONS_HOG)) + obvious_effect = true; + return (MON_AFFECTED); + default: break; } @@ -5703,6 +5728,7 @@ std::string beam_type_name(beam_type type) case BEAM_PETRIFY: return("petrify"); case BEAM_BACKLIGHT: return("backlight"); case BEAM_SLEEP: return("sleep"); + case BEAM_PORKALATOR: return("porkalator"); case BEAM_POTION_BLACK_SMOKE: return("black smoke"); case BEAM_POTION_GREY_SMOKE: return("grey smoke"); case BEAM_POTION_BLUE_SMOKE: return("blue smoke"); @@ -5721,7 +5747,8 @@ std::string beam_type_name(beam_type type) void clear_zap_info_on_exit() { - for (unsigned int i = 0; i < NUM_BEAMS; ++i) + const unsigned int zap_size = sizeof(zap_data) / sizeof(zap_info); + for (unsigned int i = 0; i < zap_size; ++i) { delete zap_data[i].damage; delete zap_data[i].tohit; diff --git a/crawl-ref/source/chardump.cc b/crawl-ref/source/chardump.cc index e3f62bd2bd..097932a3c0 100644 --- a/crawl-ref/source/chardump.cc +++ b/crawl-ref/source/chardump.cc @@ -256,6 +256,9 @@ static void _sdump_transform(dump_params &par) case TRAN_LICH: text += "You " + verb + " in lich-form."; break; + case TRAN_PIG: + text += "You " + verb + " a filthy swine."; + break; } text += "\n\n"; diff --git a/crawl-ref/source/clua.cc b/crawl-ref/source/clua.cc index f0f37d7314..e4ded572b4 100644 --- a/crawl-ref/source/clua.cc +++ b/crawl-ref/source/clua.cc @@ -752,6 +752,8 @@ static const char *transform_name() return "dragon"; case TRAN_LICH: return "lich"; + case TRAN_PIG: + return "pig"; default: return ""; } diff --git a/crawl-ref/source/dat/database/monspeak.txt b/crawl-ref/source/dat/database/monspeak.txt index 6142784c1b..cbb42fb886 100644 --- a/crawl-ref/source/dat/database/monspeak.txt +++ b/crawl-ref/source/dat/database/monspeak.txt @@ -1800,6 +1800,37 @@ _Jozef_rare_ @The_monster@ screams @at_foe@, "Die! I've got more contracts today." ## END Jozef ## %%%% +# an enchantress, lover of Odysseus +Kirke + +VISUAL:@The_monster@ splashes a potion @at_foe@. + +VISUAL:@The_monster@ throws some @strange@ powder @at_foe@. + +@The_monster@ says @to_foe@, "Odis was a nice man, you're awful." + +@The_monster@ holds her sides and says @to_foe@, "You'll eat dirt beneath my feet." + +# "moly" is a magic herb, mentioned only in Kirke's myth (as an antidote to +# Kirke's potions) and in the English interjection. +@The_monster@ whispers @to_foe@, "Not even holy moly will save you." + +@The_monster@ says, "Can we stop fighting? I have some good wine for you..." @player_only@ + +@The_monster@ shouts @at_foe@, "You pig! I'll make you look the way you deserve." + +@_wizard_common_spell_@ +@_fake_spell_effect_@ +%%%% +strange + +strange + +weird + +mysterious +### END Kirke ### +%%%% # A powerful sorceress, guarding the ORB Margery diff --git a/crawl-ref/source/dat/descript/monsters.txt b/crawl-ref/source/dat/descript/monsters.txt index e0c33be01f..5ddb79b85b 100644 --- a/crawl-ref/source/dat/descript/monsters.txt +++ b/crawl-ref/source/dat/descript/monsters.txt @@ -172,6 +172,10 @@ Killer Klown A comical figure full of life and laughter. It looks very happy to see you... but is there a slightly malicious cast to its features? Is that red face paint or something altogether less pleasant? %%%% +Kirke + +A beautiful enchantress. +%%%% Lom Lobon An ancient and strangely serene demon. It regards you coldly from the huge glowing eye in the centre of its forehead. diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc index e48b56ff8d..3ddcd20595 100644 --- a/crawl-ref/source/dungeon.cc +++ b/crawl-ref/source/dungeon.cc @@ -3269,19 +3269,20 @@ static monster_type _choose_unique_by_depth(int step) MONS_SNORG, MONS_ERICA, MONS_JOSEPHINE, MONS_HAROLD, MONS_ROXANNE, MONS_RUPERT, MONS_NORBERT, MONS_JOZEF, MONS_AZRAEL, MONS_NESSOS, MONS_AGNES, - MONS_MAUD, MONS_LOUISE, MONS_NERGALLE, -1); + MONS_MAUD, MONS_LOUISE, MONS_NERGALLE, MONS_KIRKE, -1); break; case 5: // depth <= 19 ret = random_choose(MONS_SNORG, MONS_LOUISE, MONS_FRANCIS, MONS_FRANCES, MONS_RUPERT, MONS_WAYNE, MONS_DUANE, MONS_NORRIS, MONS_AZRAEL, MONS_NESSOS, MONS_NERGALLE, - MONS_ROXANNE, MONS_SAINT_ROKA, -1); + MONS_ROXANNE, MONS_SAINT_ROKA, MONS_KIRKE, -1); break; case 6: // depth > 19 default: ret = random_choose(MONS_FRANCIS, MONS_FRANCES, MONS_WAYNE, MONS_DUANE, MONS_XTAHUA, MONS_NORRIS, MONS_FREDERICK, - MONS_MARGERY, MONS_BORIS, MONS_SAINT_ROKA, -1); + MONS_MARGERY, MONS_BORIS, MONS_SAINT_ROKA, + MONS_KIRKE, -1); } return static_cast<monster_type>(ret); diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h index 42cb62cc1f..67d799ef05 100644 --- a/crawl-ref/source/enum.h +++ b/crawl-ref/source/enum.h @@ -235,30 +235,31 @@ enum beam_type // beam[].flavour BEAM_BLINK, BEAM_PETRIFY, BEAM_BACKLIGHT, - BEAM_SLEEP, // 45 + BEAM_PORKALATOR, // 45 + BEAM_SLEEP, BEAM_LAST_ENCHANTMENT = BEAM_SLEEP, // new beams for evaporate BEAM_POTION_STINKING_CLOUD, BEAM_POTION_POISON, BEAM_POTION_MIASMA, - BEAM_POTION_STEAM, - BEAM_POTION_FIRE, // 50 + BEAM_POTION_STEAM, // 50 + BEAM_POTION_FIRE, BEAM_POTION_COLD, BEAM_POTION_BLACK_SMOKE, BEAM_POTION_GREY_SMOKE, - BEAM_POTION_BLUE_SMOKE, - BEAM_POTION_PURP_SMOKE, // 55 + BEAM_POTION_BLUE_SMOKE, // 55 + BEAM_POTION_PURP_SMOKE, BEAM_POTION_RANDOM, BEAM_LAST_REAL = BEAM_POTION_RANDOM, // For getting the visual effect of a beam. - BEAM_VISUAL, // 57 + BEAM_VISUAL, BEAM_TORMENT_DAMAGE, // Pseudo-beam for damage flavour. BEAM_FIRST_PSEUDO = BEAM_TORMENT_DAMAGE, - BEAM_STEAL_FOOD, // 59: Pseudo-beam for harpies stealing food. + BEAM_STEAL_FOOD, // 60: Pseudo-beam for harpies stealing food. NUM_BEAMS }; @@ -2018,6 +2019,7 @@ enum monster_type // (int) menv[].type MONS_NESSOS, MONS_LERNAEAN_HYDRA, MONS_DISSOLUTION, // 460 + MONS_KIRKE, // Testing monsters MONS_TEST_SPAWNER, @@ -2222,6 +2224,7 @@ enum mon_spellbook_type MST_ILSUIW, MST_PRINCE_RIBBIT, // 145 MST_NESSOS, + MST_KIRKE, MST_GERYON = 150, MST_DISPATER, MST_ASMODEUS, @@ -2808,9 +2811,10 @@ enum spell_type SPELL_FIRE_BREATH, SPELL_COLD_BREATH, // 195 SPELL_DRACONIAN_BREATH, - SPELL_WATER_ELEMENTALS, // 197 + SPELL_WATER_ELEMENTALS, + SPELL_PORKALATOR, // 198 - NUM_SPELLS // 198 + NUM_SPELLS // 199 }; enum slot_select_mode diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc index 4f7e94b236..b90eee161f 100644 --- a/crawl-ref/source/fight.cc +++ b/crawl-ref/source/fight.cc @@ -1696,6 +1696,7 @@ int melee_attack::player_weapon_type_modify(int damage) { case TRAN_SPIDER: case TRAN_BAT: + case TRAN_PIG: if (damage < HIT_STRONG) attack_verb = "bite"; else diff --git a/crawl-ref/source/misc.cc b/crawl-ref/source/misc.cc index 32b5d1625b..df74fbb252 100644 --- a/crawl-ref/source/misc.cc +++ b/crawl-ref/source/misc.cc @@ -3017,6 +3017,7 @@ std::string your_hand(bool plural) result = "hand"; break; case TRAN_SPIDER: + case TRAN_PIG: result = "front leg"; break; case TRAN_DRAGON: diff --git a/crawl-ref/source/mon-data.h b/crawl-ref/source/mon-data.h index 151693960e..08e1fed7d0 100644 --- a/crawl-ref/source/mon-data.h +++ b/crawl-ref/source/mon-data.h @@ -4349,6 +4349,18 @@ static monsterentry mondata[] = { }, { + MONS_KIRKE, '@', YELLOW, "Kirke", + M_UNIQUE | M_SPELLCASTER | M_ACTUAL_SPELLS | M_WARM_BLOOD | M_SEE_INVIS + | M_SPEAKS, + MR_NO_FLAGS, + 550, 15, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5, + { {AT_HIT, AF_PLAIN, 18}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, + { 16, 0, 0, 110 }, + 0, 10, MST_KIRKE, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_NORMAL, + HT_LAND, 10, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM +}, + +{ MONS_WAYNE, '@', YELLOW, "Wayne", M_UNIQUE | M_SPELLCASTER | M_ACTUAL_SPELLS | M_WARM_BLOOD | M_SEE_INVIS | M_EVIL | M_SPEAKS, diff --git a/crawl-ref/source/mon-spll.h b/crawl-ref/source/mon-spll.h index 0169a74396..1aa37e5f65 100644 --- a/crawl-ref/source/mon-spll.h +++ b/crawl-ref/source/mon-spll.h @@ -1043,6 +1043,17 @@ } }, + { MST_KIRKE, + { + SPELL_PORKALATOR, + SPELL_SLOW, + SPELL_SUMMON_UGLY_THING, + SPELL_SUMMON_ICE_BEAST, + SPELL_BACKLIGHT, + SPELL_INVISIBILITY + } + }, + { MST_GERYON, { SPELL_SUMMON_BEAST, diff --git a/crawl-ref/source/monplace.cc b/crawl-ref/source/monplace.cc index aa5df5c286..726e8b64db 100644 --- a/crawl-ref/source/monplace.cc +++ b/crawl-ref/source/monplace.cc @@ -1658,9 +1658,11 @@ static band_type _choose_band(int mon_type, int power, int &band_size) band_size = 2 + random2(3); break; + case MONS_KIRKE: + band_size = 3 + random2(5); case MONS_HOG: band = BAND_HOGS; - band_size = 1 + random2(3); + band_size += 1 + random2(3); break; case MONS_GIANT_MOSQUITO: diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc index a7acbe5c0e..310fb9e111 100644 --- a/crawl-ref/source/monstuff.cc +++ b/crawl-ref/source/monstuff.cc @@ -58,6 +58,7 @@ REVISION("$Rev$"); #include "state.h" #include "stuff.h" #include "terrain.h" +#include "transfor.h" #include "traps.h" #include "tutorial.h" #include "view.h" @@ -1068,6 +1069,39 @@ void _monster_die_cloud(const monsters* monster, bool corpse, bool silent, } } +static void _hogs_to_humans() +{ + // Simplification: if, in a rare event, another hog which was not created + // as a part of Kirke's band happens to be on the level, the player can't + // tell them apart anyway. + // On the other hand, hogs which left the level are too far away to be + // affected by the magic of Kirke's death. + int any = 0; + + for (int i = 0; i < MAX_MONSTERS; ++i) + { + monsters *monster = &menv[i]; + if (monster->type == MONS_HOG) + { + monster->type = MONS_HUMAN; + monster->attitude = ATT_GOOD_NEUTRAL; + monster->flags |= MF_WAS_NEUTRAL; + behaviour_event(monster, ME_EVAL); + + any++; + } + } + + if (any==1) + mpr("No longer under Kirke's spell, the hog turns into a human!"); + else if (any>1) + mpr("No longer under Kirke's spell, all hogs revert to their human form!"); + + // Revert the player as well. + if (you.attribute[ATTR_TRANSFORMATION] == TRAN_PIG) + untransform(); +} + int monster_die(monsters *monster, killer_type killer, int killer_index, bool silent, bool wizard) { @@ -1678,6 +1712,10 @@ int monster_die(monsters *monster, killer_type killer, // creation again. -- bwr you.unique_creatures[monster->type] = false; } + else if (monster->type == MONS_KIRKE && !in_transit) + { + _hogs_to_humans(); + } else if (!mons_is_summoned(monster)) { if (mons_genus(monster->type) == MONS_MUMMY) diff --git a/crawl-ref/source/mstuff2.cc b/crawl-ref/source/mstuff2.cc index 38a93a53d0..e9a4d2fd26 100644 --- a/crawl-ref/source/mstuff2.cc +++ b/crawl-ref/source/mstuff2.cc @@ -2057,6 +2057,14 @@ bolt mons_spells( monsters *mons, spell_type spell_cast, int power ) beam.is_beam = true; break; + case SPELL_PORKALATOR: + beam.name = "0"; + beam.type = 0; + beam.flavour = BEAM_PORKALATOR; + beam.thrower = KILL_MON_MISSILE; + beam.is_beam = true; + break; + default: if (!is_valid_spell(real_spell)) DEBUGSTR("Invalid spell #%d cast by %s", (int) real_spell, diff --git a/crawl-ref/source/output.cc b/crawl-ref/source/output.cc index fd2ebd42db..c6371dd018 100644 --- a/crawl-ref/source/output.cc +++ b/crawl-ref/source/output.cc @@ -2569,6 +2569,9 @@ std::string _status_mut_abilities() case TRAN_LICH: text += "\nYou are in lich-form."; break; + case TRAN_PIG: + text += "\nYou are a filthy swine."; + break; } if ((you.species != SP_VAMPIRE || you.attribute[ATTR_TRANSFORMATION] != TRAN_BAT) diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc index c04ea520bf..287d8efdf0 100644 --- a/crawl-ref/source/player.cc +++ b/crawl-ref/source/player.cc @@ -506,6 +506,8 @@ bool is_player_same_species(const int mon, bool transform) return (mons_genus(mon) == MONS_WOLF_SPIDER); case TRAN_DRAGON: return (mons_genus(mon) == MONS_DRAGON); // Includes all drakes. + case TRAN_PIG: + return (mons_genus(mon) == MONS_HOG); default: break; // Check real (non-transformed) form. } @@ -729,8 +731,8 @@ bool you_tran_can_wear(int eq, bool check_mutation) if (transform == TRAN_NONE || transform == TRAN_LICH) return (true); - // Bats cannot wear anything except amulets. - if (transform == TRAN_BAT && eq != EQ_AMULET) + // Bats and pigs cannot wear anything except amulets. + if ((transform == TRAN_BAT || transform == TRAN_PIG) && eq != EQ_AMULET) return (false); // Everyone else can wear jewellery, at least. @@ -1966,6 +1968,8 @@ int player_movement_speed(void) mv = 8; else if (player_in_bat_form()) mv = 5; // but allowed minimum is six + else if (you.attribute[ATTR_TRANSFORMATION] == TRAN_PIG) + mv = 7; // armour if (player_equip_ego_type( EQ_BOOTS, SPARM_RUNNING )) @@ -3970,6 +3974,9 @@ void display_char_status() case TRAN_LICH: text += "You are in lich-form."; break; + case TRAN_PIG: + text += "You are a filthy swine."; + break; } mpr(text.c_str()); } @@ -6255,6 +6262,8 @@ std::string player::shout_verb() const return "hiss"; case TRAN_BAT: return "squeak"; + case TRAN_PIG: + return "squeal"; default: // depends on SCREAM mutation int level = player_mutation_level(MUT_SCREAM); if (level <= 1) diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h index 99036db9f3..b9e01d3fad 100644 --- a/crawl-ref/source/spl-data.h +++ b/crawl-ref/source/spl-data.h @@ -2514,6 +2514,19 @@ }, { + SPELL_PORKALATOR, "Porkalator", + SPTYP_ENCHANTMENT | SPTYP_TRANSMUTATION, + SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF, + 5, + 200, + LOS_RADIUS, LOS_RADIUS, + 0, + NULL, + true, + false +}, + +{ SPELL_NO_SPELL, "nonexistent spell", 0, SPFLAG_TESTING, diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc index 88636bda76..c4975fafe0 100644 --- a/crawl-ref/source/tilepick.cc +++ b/crawl-ref/source/tilepick.cc @@ -2492,6 +2492,7 @@ int tileidx_player(int job) case '#': ch = TILEP_MONS_VAPOUR; break; case 'S': ch = TILEP_MONS_LAVA_SNAKE; break; case 'b': ch = TILEP_MONS_GIANT_BAT; break; + case 'h': ch = TILEP_MONS_HOG; break; } if (player_is_airborne()) diff --git a/crawl-ref/source/transfor.cc b/crawl-ref/source/transfor.cc index 070841ae21..2036d37e0d 100644 --- a/crawl-ref/source/transfor.cc +++ b/crawl-ref/source/transfor.cc @@ -56,9 +56,10 @@ bool transform_allows_wearing_item(const item_def& item, if (item.base_type == OBJ_JEWELLERY) { - // Everything but bats can wear all jewellery; bats can + // Everything but bats can wear all jewellery; bats and pigs can // only wear amulets. - if (transform == TRAN_BAT && !jewellery_is_amulet(item)) + if ((transform == TRAN_BAT || transform == TRAN_PIG) + && !jewellery_is_amulet(item)) rc = false; } else @@ -78,6 +79,7 @@ bool transform_allows_wearing_item(const item_def& item, // Some can't wear anything. case TRAN_DRAGON: case TRAN_BAT: + case TRAN_PIG: rc = false; break; @@ -470,6 +472,8 @@ size_type player::transform_size(int psize) const case TRAN_SPIDER: case TRAN_BAT: return SIZE_TINY; + case TRAN_PIG: + return SIZE_SMALL; case TRAN_ICE_BEAST: return SIZE_LARGE; case TRAN_DRAGON: @@ -530,8 +534,11 @@ bool transform(int pow, transformation_type which_trans, bool force, { if (just_check) return (true); - - mpr("You extend your transformation's duration."); + + if (which_trans==TRAN_PIG) + mpr("You feel you'll be a pig longer."); + else + mpr("You extend your transformation's duration."); you.duration[DUR_TRANSFORMATION] += random2(pow); if (you.duration[DUR_TRANSFORMATION] > 100) @@ -541,7 +548,7 @@ bool transform(int pow, transformation_type which_trans, bool force, } else { - if (!force) + if (!force && which_trans!=TRAN_PIG) mpr("You cannot extend your transformation any further!"); return (false); } @@ -589,7 +596,7 @@ bool transform(int pow, transformation_type which_trans, bool force, std::set<equipment_type> rem_stuff = _init_equipment_removal(which_trans); - if (_check_for_cursed_equipment(rem_stuff, which_trans, force)) + if (_check_for_cursed_equipment(rem_stuff, which_trans, force) && which_trans!=TRAN_PIG) return (_abort_or_fizzle(just_check)); int str = 0, dex = 0, symbol = '@', colour = LIGHTGREY, xhp = 0, dur = 0; @@ -673,14 +680,28 @@ bool transform(int pow, transformation_type which_trans, bool force, msg = "You turn into a bat."; break; + case TRAN_PIG: + tran_name = "pig"; + symbol = 'h'; + colour = RED; + dur = pow; + msg = "You have been turned into a pig!"; + break; + case TRAN_NONE: case NUM_TRANSFORMATIONS: break; } - if (check_transformation_stat_loss(rem_stuff, force, - std::max(-str, 0), std::max(-dex, 0))) - { + if (check_transformation_stat_loss(rem_stuff, force || which_trans == TRAN_PIG, + std::max(-str, 0), std::max(-dex,0))) + { // would have died to stat loss + if (which_trans == TRAN_PIG) + { // no easy way around this! + mpr("A dreadful feeling locks you in place!"); + if (you.duration[DUR_PARALYSIS]<10) + you.duration[DUR_PARALYSIS]=10; + } return (_abort_or_fizzle(just_check)); } @@ -879,6 +900,10 @@ void untransform(bool skip_wielding) you.is_undead = US_ALIVE; break; + case TRAN_PIG: + mpr( "Your transformation has ended.", MSGCH_DURATION ); + break; + default: break; } diff --git a/crawl-ref/source/transfor.h b/crawl-ref/source/transfor.h index 5dff88bcfa..681f1e84f9 100644 --- a/crawl-ref/source/transfor.h +++ b/crawl-ref/source/transfor.h @@ -25,6 +25,7 @@ enum transformation_type TRAN_DRAGON, // 5 TRAN_LICH, TRAN_BAT, + TRAN_PIG, NUM_TRANSFORMATIONS // must remain last member {dlb} }; |