static void _marilith_gain_level(int new_level) { if (p_ptr->current_r_idx == MON_MANES && new_level >= 10) { p_ptr->current_r_idx = MON_QUASIT; msg_print("You have evolved into a Quasit."); p_ptr->redraw |= PR_MAP; } if (p_ptr->current_r_idx == MON_QUASIT && new_level >= 20) { p_ptr->current_r_idx = MON_BODAK; msg_print("You have evolved into a Bodak."); p_ptr->redraw |= PR_MAP; } if (p_ptr->current_r_idx == MON_BODAK && new_level >= 30) { p_ptr->current_r_idx = MON_DEATH_QUASIT; msg_print("You have evolved into a Death Quasit."); p_ptr->redraw |= PR_MAP; } if (p_ptr->current_r_idx == MON_DEATH_QUASIT && new_level >= 40) { p_ptr->current_r_idx = MON_MARILITH; p_ptr->psex = SEX_FEMALE; sp_ptr = &sex_info[p_ptr->psex]; msg_print("You have evolved into a Marilith."); equip_on_change_race(); p_ptr->redraw |= PR_MAP; } }
/****************************************************************************** * 20 30 40 * Servant of Khorne: Bloodletter -> Fleshhound -> Juggernaut -> Bloodthirster ******************************************************************************/ static void _khorne_birth(void) { object_type forge; p_ptr->current_r_idx = MON_BLOODLETTER_KHORNE; equip_on_change_race(); object_prep(&forge, lookup_kind(TV_RING, 0)); forge.name2 = EGO_RING_COMBAT; forge.to_d = 6; add_outfit(&forge); object_prep(&forge, lookup_kind(TV_SOFT_ARMOR, SV_LEATHER_SCALE_MAIL)); add_outfit(&forge); object_prep(&forge, lookup_kind(TV_SWORD, SV_BLADE_OF_CHAOS)); forge.name2 = EGO_WEAPON_SHARPNESS; forge.pval = 1; forge.to_h = 0; forge.to_d = 0; forge.ds = 6; forge.weight = 220; add_flag(forge.flags, OF_VORPAL); add_outfit(&forge); }
/********************************************************************** * 7 14 21 28 35 * Evolution: White -> Green -> Blue -> Red -> Clear -> Multihued **********************************************************************/ static void _birth(void) { object_type forge; p_ptr->current_r_idx = MON_CENTIPEDE_WHITE; equip_on_change_race(); skills_innate_init("Bite", WEAPON_EXP_BEGINNER, WEAPON_EXP_MASTER); skills_innate_init("Sting", WEAPON_EXP_BEGINNER, WEAPON_EXP_MASTER); skills_innate_init("Crawl", WEAPON_EXP_BEGINNER, WEAPON_EXP_MASTER); object_prep(&forge, lookup_kind(TV_RING, 0)); forge.name2 = EGO_RING_COMBAT; forge.to_h = 3; forge.to_d = 2; forge.pval = 1; add_flag(forge.flags, OF_DEX); add_outfit(&forge); object_prep(&forge, lookup_kind(TV_BOOTS, SV_PAIR_OF_SOFT_LEATHER_BOOTS)); add_outfit(&forge); object_prep(&forge, lookup_kind(TV_BOOTS, SV_PAIR_OF_SOFT_LEATHER_BOOTS)); add_outfit(&forge); }
static void _set_mimic_form(int which) { p_ptr->mimic_form = which; equip_on_change_race(); if (p_ptr->action == ACTION_QUICK_WALK || p_ptr->action == ACTION_STALK) /* Wolf form ... */ set_action(ACTION_NONE); p_ptr->redraw |= PR_BASIC | PR_STATUS | PR_MAP | PR_EQUIPPY; p_ptr->update |= PU_BONUS | PU_HP; handle_stuff(); }
static void _gain_level(int new_level) { if (p_ptr->current_r_idx == MON_CENTIPEDE_WHITE && new_level >= 7) { p_ptr->current_r_idx = MON_CENTIPEDE_GREEN; equip_on_change_race(); msg_print("You have evolved into a metallic green centipede."); p_ptr->redraw |= PR_MAP; } if (p_ptr->current_r_idx == MON_CENTIPEDE_GREEN && new_level >= 14) { p_ptr->current_r_idx = MON_CENTIPEDE_BLUE; equip_on_change_race(); msg_print("You have evolved into a metallic blue centipede."); p_ptr->redraw |= PR_MAP; } if (p_ptr->current_r_idx == MON_CENTIPEDE_BLUE && new_level >= 21) { p_ptr->current_r_idx = MON_CENTIPEDE_RED; equip_on_change_race(); msg_print("You have evolved into a metallic red centipede."); p_ptr->redraw |= PR_MAP; } if (p_ptr->current_r_idx == MON_CENTIPEDE_RED && new_level >= 28) { p_ptr->current_r_idx = MON_CENTIPEDE_CLEAR; equip_on_change_race(); msg_print("You have evolved into a giant clear centipede."); p_ptr->redraw |= PR_MAP; } if (p_ptr->current_r_idx == MON_CENTIPEDE_CLEAR && new_level >= 35 && player_is_monster_king()) { p_ptr->current_r_idx = MON_CENTIPEDE_MULTIHUED; equip_on_change_race(); msg_print("You have evolved into The Multi-hued Centipede! There can only be one, you know ..."); p_ptr->redraw |= PR_MAP; } }
/********************************************************************** * Hound Equipment **********************************************************************/ static void _birth(void) { object_type forge; p_ptr->current_r_idx = MON_CLEAR_HOUND; equip_on_change_race(); object_prep(&forge, lookup_kind(TV_RING, 0)); forge.name2 = EGO_RING_COMBAT; forge.to_d = 3; add_outfit(&forge); object_prep(&forge, lookup_kind(TV_BOOTS, SV_PAIR_OF_METAL_SHOD_BOOTS)); add_outfit(&forge); }
static void _gain_level(int new_level) { if (p_ptr->current_r_idx == MON_UMBER_HULK && new_level >= 20) { p_ptr->current_r_idx = MON_XORN; equip_on_change_race(); msg_print("You have evolved into a Xorn."); p_ptr->redraw |= PR_MAP; } if (p_ptr->current_r_idx == MON_XORN && new_level >= 35) { p_ptr->current_r_idx = MON_XAREN; msg_print("You have evolved into a Xaren."); p_ptr->redraw |= PR_MAP; } }
/********************************************************************** * Birth and Evolution **********************************************************************/ static void _birth(void) { object_type forge; int i; for (i = 0; i < _MAX_ESSENCE; i++) _essences[i] = 0; p_ptr->current_r_idx = MON_BROKEN_DEATH_SWORD; equip_on_change_race(); object_prep(&forge, lookup_kind(TV_SWORD, SV_BROKEN_SWORD)); add_flag(forge.art_flags, TR_NO_REMOVE); forge.to_h = 1; forge.to_d = 3; add_outfit(&forge); }
/********************************************************************** * Hound Equipment **********************************************************************/ static void _birth(void) { object_type forge; p_ptr->current_r_idx = MON_CLEAR_HOUND; equip_on_change_race(); skills_innate_init("Claw", WEAPON_EXP_BEGINNER, WEAPON_EXP_MASTER); skills_innate_init("Bite", WEAPON_EXP_BEGINNER, WEAPON_EXP_MASTER); object_prep(&forge, lookup_kind(TV_RING, 0)); forge.name2 = EGO_RING_COMBAT; forge.to_d = 3; add_outfit(&forge); object_prep(&forge, lookup_kind(TV_BOOTS, SV_PAIR_OF_METAL_SHOD_BOOTS)); add_outfit(&forge); }
static void _birth(void) { object_type forge; p_ptr->current_r_idx = MON_BLACK_OOZE; equip_on_change_race(); skills_innate_init("Pseudopod", WEAPON_EXP_BEGINNER, WEAPON_EXP_MASTER); object_prep(&forge, lookup_kind(TV_RING, 0)); forge.name2 = EGO_RING_COMBAT; forge.pval = 1; forge.to_d = 3; add_flag(forge.flags, OF_STR); add_outfit(&forge); object_prep(&forge, lookup_kind(TV_SOFT_ARMOR, SV_LEATHER_SCALE_MAIL)); add_outfit(&forge); }
static void _marilith_birth(void) { object_type forge; p_ptr->current_r_idx = MON_MANES; equip_on_change_race(); object_prep(&forge, lookup_kind(TV_RING, 0)); forge.name2 = EGO_RING_COMBAT; forge.to_d = 3; add_outfit(&forge); object_prep(&forge, lookup_kind(TV_SOFT_ARMOR, SV_LEATHER_SCALE_MAIL)); add_outfit(&forge); object_prep(&forge, lookup_kind(TV_SWORD, SV_BROAD_SWORD)); forge.to_h = 1; forge.to_d = 2; add_outfit(&forge); }
/****************************************************************************** * 25 35 45 * Vampire: Vampire -> Master Vampire -> Vampire Lord -> Elder Vampire ******************************************************************************/ static void _birth(void) { object_type forge; p_ptr->current_r_idx = MON_VAMPIRE; equip_on_change_race(); object_prep(&forge, lookup_kind(TV_SOFT_ARMOR, SV_LEATHER_SCALE_MAIL)); add_outfit(&forge); object_prep(&forge, lookup_kind(TV_SWORD, SV_DAGGER)); forge.name2 = EGO_WEAPON_DEATH; add_outfit(&forge); /* Encourage shapeshifting! */ object_prep(&forge, lookup_kind(TV_RING, 0)); forge.name2 = EGO_RING_COMBAT; forge.to_d = 4; add_outfit(&forge); }
/****************************************************************************** * Troll Evolution ******************************************************************************/ static void _birth(void) { object_type forge; p_ptr->current_r_idx = MON_FOREST_TROLL; equip_on_change_race(); object_prep(&forge, lookup_kind(TV_HARD_ARMOR, SV_CHAIN_MAIL)); add_outfit(&forge); object_prep(&forge, lookup_kind(TV_RING, 0)); forge.name2 = EGO_RING_COMBAT; forge.to_d = 7; add_outfit(&forge); object_prep(&forge, lookup_kind(TV_HAFTED, SV_CLUB)); forge.weight = 100; forge.dd = 3; forge.ds = 4; forge.to_d = 7; add_outfit(&forge); }
static void _birth(void) { object_type forge; p_ptr->current_r_idx = MON_GAZER; equip_on_change_race(); skills_innate_init("Gaze", WEAPON_EXP_BEGINNER, WEAPON_EXP_MASTER); object_prep(&forge, lookup_kind(TV_CROWN, SV_IRON_CROWN)); forge.name2 = EGO_CROWN_SEEING; forge.pval = 4; forge.to_a = 10; add_esp_weak(&forge, FALSE); add_outfit(&forge); object_prep(&forge, lookup_kind(TV_WAND, SV_ANY)); if (device_init_fixed(&forge, EFFECT_BOLT_FIRE)) add_outfit(&forge); object_prep(&forge, lookup_kind(TV_WAND, SV_ANY)); if (device_init_fixed(&forge, EFFECT_BOLT_COLD)) add_outfit(&forge); }
static void _birth(void) { object_type forge; int i; possessor_on_birth(); /* Cleanup history from last character */ for (i = 0; i < _MAX_FORMS; i++) _forms[i] = 0; p_ptr->current_r_idx = MON_MIMIC; equip_on_change_race(); object_prep(&forge, lookup_kind(TV_SWORD, SV_LONG_SWORD)); add_outfit(&forge); object_prep(&forge, lookup_kind(TV_SOFT_ARMOR, SV_LEATHER_SCALE_MAIL)); add_outfit(&forge); object_prep(&forge, lookup_kind(TV_RING, 0)); forge.name2 = EGO_RING_COMBAT; forge.to_d = 3; add_outfit(&forge); }
void mimic_race(int new_race, const char *msg) { int old_race = p_ptr->mimic_form; if (p_ptr->prace != RACE_DOPPELGANGER) return; if (p_ptr->tim_mimic) return; if (new_race == old_race) return; if (msg) msg_print(msg); if (old_race == RACE_HUMAN || old_race == RACE_DEMIGOD) { int i, idx; for (i = 0; i < MAX_DEMIGOD_POWERS; i++) { idx = p_ptr->demigod_power[i]; if (idx >= 0) { mut_unlock(idx); mut_lose(idx); /* Lose the mutation, but not the choice! p_ptr->demigod_power[i] = -1; */ } } } /* Shifting form causes mutations to vanish! */ mut_lose_all(); if (new_race == MIMIC_NONE) msg_print("You resume your true form."); else { race_t *race_ptr = get_race_t_aux(new_race, 0); if (is_a_vowel(race_ptr->name[0])) msg_format("You turn into an %s!", race_ptr->name); else msg_format("You turn into a %s!", race_ptr->name); } p_ptr->mimic_form = new_race; p_ptr->expfact = calc_exp_factor(); check_experience(); if (new_race == RACE_HUMAN || new_race == RACE_DEMIGOD) { get_race_t()->gain_level(p_ptr->lev); /* This is OK ... Just make sure we get to choose racial powers on mimicry */ } if (new_race == RACE_BEASTMAN) { int i; mut_gain_random(mut_good_pred); for (i = 2; i <= p_ptr->lev; i++) { if (one_in_(5)) mut_gain_random(NULL); } } p_ptr->redraw |= (PR_BASIC | PR_STATUS | PR_MAP); p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA); equip_on_change_race(); reset_visuals(); handle_stuff(); }
static void _gain_level(int new_level) { if (p_ptr->current_r_idx == MON_FOREST_TROLL && new_level >= 10) { p_ptr->current_r_idx = MON_STONE_TROLL; msg_print("You have evolved into a Stone Troll."); p_ptr->redraw |= PR_MAP; } if (p_ptr->current_r_idx == MON_STONE_TROLL && new_level >= 20) { int r = randint0(3); if (spoiler_hack) r = 2; switch (r) { case 0: p_ptr->current_r_idx = MON_ICE_TROLL; msg_print("You have evolved into an Ice Troll."); break; case 1: p_ptr->current_r_idx = MON_FIRE_TROLL; msg_print("You have evolved into a Fire Troll."); break; case 2: p_ptr->current_r_idx = MON_ALGROTH; msg_print("You have evolved into an Algroth."); break; } p_ptr->redraw |= PR_MAP; } if (p_ptr->current_r_idx == MON_ALGROTH && new_level >= 25) { p_ptr->current_r_idx = MON_AKLASH; msg_print("You have evolved into an Aklash."); p_ptr->redraw |= PR_MAP; } if ( ( p_ptr->current_r_idx == MON_FIRE_TROLL || p_ptr->current_r_idx == MON_ICE_TROLL || p_ptr->current_r_idx == MON_AKLASH ) && new_level >= 30 ) { p_ptr->current_r_idx = MON_OLOG; msg_print("You have evolved into an Olog."); p_ptr->redraw |= PR_MAP; } if (p_ptr->current_r_idx == MON_OLOG && new_level >= 40) { switch (p_ptr->psubrace) { case TROLL_ETTIN: p_ptr->current_r_idx = MON_ETTIN; msg_print("You have evolved into an Ettin."); equip_on_change_race(); /* Two heads */ break; case TROLL_STORM: p_ptr->current_r_idx = MON_STORM_TROLL; msg_print("You have evolved into a Storm Troll."); break; case TROLL_SPIRIT: p_ptr->current_r_idx = MON_SPIRIT_TROLL; msg_print("You have evolved into a Spirit Troll."); break; case TROLL_KING: p_ptr->current_r_idx = MON_TROLL_KING; msg_print("You have evolved into a Troll King."); break; } p_ptr->redraw |= PR_MAP; } }
/**************************************************************** * Centaur ****************************************************************/ static void _centaur_birth(void) { equip_on_change_race(); }