X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fdungeon.c;h=7d51dac1a601eae6987f79a8b4bc92abe837056e;hb=5354093f6e1a73b3ea03e372703fffdf4947d0e1;hp=ea5784b16e8491cb8bb319a97c8fa5881fecdc6c;hpb=a54289d5e5c6fee78f5ec0c8db6eb2f341c6111c;p=hengbandforosx%2Fhengbandosx.git diff --git a/src/dungeon.c b/src/dungeon.c index ea5784b16..7d51dac1a 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -12,7 +12,7 @@ #include "angband.h" -#define TY_CURSE_CHANCE 100 +#define TY_CURSE_CHANCE 200 #define CHAINSWORD_NOISE 100 static bool load = TRUE; @@ -74,16 +74,16 @@ static byte value_check_aux2(object_type *o_ptr) if (broken_p(o_ptr)) return FEEL_BROKEN; /* Artifacts -- except cursed/broken ones */ - if (artifact_p(o_ptr) || o_ptr->art_name) return FEEL_GOOD; + if (artifact_p(o_ptr) || o_ptr->art_name) return FEEL_UNCURSED; /* Ego-Items -- except cursed/broken ones */ - if (ego_item_p(o_ptr)) return FEEL_GOOD; + if (ego_item_p(o_ptr)) return FEEL_UNCURSED; /* Good armor bonus */ - if (o_ptr->to_a > 0) return FEEL_GOOD; + if (o_ptr->to_a > 0) return FEEL_UNCURSED; /* Good weapon bonuses */ - if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD; + if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED; /* No feeling */ return FEEL_NONE; @@ -96,6 +96,7 @@ static void sense_inventory_aux(int slot, bool heavy) byte feel; object_type *o_ptr = &inventory[slot]; char o_name[MAX_NLEN]; + int idx; /* We know about it already, do not tell us again */ if (o_ptr->ident & (IDENT_SENSE))return; @@ -126,7 +127,10 @@ static void sense_inventory_aux(int slot, bool heavy) } case FEEL_CURSED: { - feel = randint0(3) ? FEEL_GOOD : FEEL_AVERAGE; + if (heavy) + feel = randint0(3) ? FEEL_GOOD : FEEL_AVERAGE; + else + feel = FEEL_UNCURSED; break; } case FEEL_AVERAGE: @@ -136,7 +140,10 @@ static void sense_inventory_aux(int slot, bool heavy) } case FEEL_GOOD: { - feel = randint0(3) ? FEEL_CURSED : FEEL_AVERAGE; + if (heavy) + feel = randint0(3) ? FEEL_CURSED : FEEL_AVERAGE; + else + feel = FEEL_CURSED; break; } case FEEL_EXCELLENT: @@ -166,8 +173,8 @@ msg_format("%s%s(%c) describe_use(slot),o_name, index_to_label(slot),game_inscriptions[feel]); #else msg_format("You feel the %s (%c) you are %s %s %s...", - o_name, index_to_label(slot), describe_use(slot), - ((o_ptr->number == 1) ? "is" : "are"), + o_name, index_to_label(slot), describe_use(slot), + ((o_ptr->number == 1) ? "is" : "are"), game_inscriptions[feel]); #endif @@ -181,8 +188,8 @@ msg_format(" o_name, index_to_label(slot),game_inscriptions[feel]); #else msg_format("You feel the %s (%c) in your pack %s %s...", - o_name, index_to_label(slot), - ((o_ptr->number == 1) ? "is" : "are"), + o_name, index_to_label(slot), + ((o_ptr->number == 1) ? "is" : "are"), game_inscriptions[feel]); #endif @@ -194,6 +201,12 @@ o_name, index_to_label(slot),game_inscriptions[feel]); /* Set the "inscription" */ o_ptr->feeling = feel; + /* Auto-inscription/destroy */ + idx = is_autopick(o_ptr); + auto_inscribe_item(slot, idx); + if (destroy_feeling) + auto_destroy_item(slot, idx); + /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); @@ -431,6 +444,7 @@ static void sense_inventory1(void) case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: + case TV_CARD: { okay = TRUE; break; @@ -609,7 +623,11 @@ if (get_check("¾ else if (dun_level == 100) max_level = 100; } - else max_level = d_info[dungeon_type].maxdepth; + else + { + max_level = d_info[dungeon_type].maxdepth; + min_level = d_info[dungeon_type].mindepth; + } /* Prompt */ #ifdef JP @@ -661,6 +679,15 @@ msg_format("%d /* Change level */ dun_level = command_arg; + prepare_change_floor_mode(CFM_CLEAR_ALL); + + leave_quest_check(); + + if (record_stair) do_cmd_write_nikki(NIKKI_PAT_TELE,0,NULL); + + p_ptr->inside_quest = 0; + p_ptr->leftbldg = FALSE; + energy_use = 0; /* Leaving */ p_ptr->leaving = TRUE; @@ -921,7 +948,7 @@ static void regenmagic(int percent) s32b new_mana; int i; - for (i = 0; i < 72; i++) + for (i = 0; i < EATER_EXT*2; i++) { if (!p_ptr->magic_num2[i]) continue; if (p_ptr->magic_num1[i] == ((long)p_ptr->magic_num2[i] << 16)) continue; @@ -935,11 +962,11 @@ static void regenmagic(int percent) } wild_regen = 20; } - for (i = 72; i < 108; i++) + for (i = EATER_EXT*2; i < EATER_EXT*3; i++) { if (!p_ptr->magic_num1[i]) continue; if (!p_ptr->magic_num2[i]) continue; - p_ptr->magic_num1[i] -= (long)(p_ptr->magic_num2[i] * (adj_mag_mana[A_INT] + 10)) * 0x1000; + p_ptr->magic_num1[i] -= (long)(p_ptr->magic_num2[i] * (adj_mag_mana[A_INT] + 10)) * EATER_ROD_CHARGE/16; if (p_ptr->magic_num1[i] < 0) p_ptr->magic_num1[i] = 0; wild_regen = 20; } @@ -1085,7 +1112,8 @@ msg_print(" /* The light is getting dim */ else if (o_ptr->name2 == EGO_LITE_LONG) { - if ((o_ptr->xtra4 < 50) && (!(o_ptr->xtra4 % 5)) && (turn % 40)) + if ((o_ptr->xtra4 < 50) && (!(o_ptr->xtra4 % 5)) + && (turn % (TURNS_PER_TICK*2))) { if (disturb_minor) disturb(0, 0); #ifdef JP @@ -1128,6 +1156,9 @@ void leave_quest_check(void) r_info[quest[leaving_quest].r_idx].flags1 &= ~(RF1_QUESTOR); if (record_rand_quest) do_cmd_write_nikki(NIKKI_RAND_QUEST_F, leaving_quest, NULL); + + /* Floor of random quest will be blocked */ + prepare_change_floor_mode(CFM_NO_RETURN); } else if (record_fix_quest) do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL); @@ -1154,7 +1185,8 @@ bool psychometry(void) char o_name[MAX_NLEN]; byte feel; cptr q, s; - + bool okay = FALSE; + int idx; item_tester_no_ryoute = TRUE; /* Get an item */ @@ -1232,6 +1264,41 @@ msg_format("%s /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); + /* Valid "tval" codes */ + switch (o_ptr->tval) + { + case TV_SHOT: + case TV_ARROW: + case TV_BOLT: + case TV_BOW: + case TV_DIGGING: + case TV_HAFTED: + case TV_POLEARM: + case TV_SWORD: + case TV_BOOTS: + case TV_GLOVES: + case TV_HELM: + case TV_CROWN: + case TV_SHIELD: + case TV_CLOAK: + case TV_SOFT_ARMOR: + case TV_HARD_ARMOR: + case TV_DRAG_ARMOR: + case TV_CARD: + case TV_RING: + case TV_AMULET: + case TV_LITE: + case TV_FIGURINE: + okay = TRUE; + break; + } + + /* Auto-inscription/destroy */ + idx = is_autopick(o_ptr); + auto_inscribe_item(item, idx); + if (okay && destroy_feeling) + auto_destroy_item(item, idx); + /* Something happened */ return (TRUE); } @@ -1239,97 +1306,97 @@ msg_format("%s static void gere_music(s32b music) { - switch(music) - { - case MUSIC_SLOW: - slow_monsters(); - break; - case MUSIC_STUN: - stun_monsters(damroll(p_ptr->lev/10,2)); - break; - case MUSIC_L_LIFE: - hp_player(damroll(2,6)); - break; - case MUSIC_FEAR: - project_hack(GF_TURN_ALL, p_ptr->lev); - break; - case MUSIC_PSI: - project_hack(GF_PSI, randint1(p_ptr->lev * 3 / 2)); - break; - case MUSIC_ID: - project(0, 1, py, px, 0, GF_IDENTIFY, PROJECT_ITEM, -1); - break; - case MUSIC_CONF: - confuse_monsters(p_ptr->lev * 2); - break; - case MUSIC_SOUND: - project_hack(GF_SOUND, damroll(10 + p_ptr->lev/5,7)); - break; - case MUSIC_CHARM: - charm_monsters(damroll(10 + p_ptr->lev/15,6)); - break; - case MUSIC_WALL: + switch(music) + { + case MUSIC_SLOW: + slow_monsters(); + break; + case MUSIC_STUN: + stun_monsters(damroll(p_ptr->lev/10,2)); + break; + case MUSIC_L_LIFE: + hp_player(damroll(2,6)); + break; + case MUSIC_FEAR: + project_hack(GF_TURN_ALL, p_ptr->lev); + break; + case MUSIC_PSI: + project_hack(GF_PSI, randint1(p_ptr->lev * 3 / 2)); + break; + case MUSIC_ID: + project(0, 1, py, px, 0, GF_IDENTIFY, PROJECT_ITEM, -1); + break; + case MUSIC_CONF: + confuse_monsters(p_ptr->lev * 2); + break; + case MUSIC_SOUND: + project_hack(GF_SOUND, damroll(10 + p_ptr->lev/5,7)); + break; + case MUSIC_CHARM: + charm_monsters(damroll(10 + p_ptr->lev/15,6)); + break; + case MUSIC_WALL: project(0, 0, py, px, 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1); - break; - case MUSIC_DISPEL: - dispel_monsters(randint1(p_ptr->lev * 3)); - dispel_evil(randint1(p_ptr->lev * 3)); - break; - case MUSIC_SARUMAN: - slow_monsters(); - sleep_monsters(); - break; - case MUSIC_QUAKE: - earthquake(py, px, 10); - break; - case MUSIC_STASIS: - stasis_monsters(p_ptr->lev * 4); - break; - case MUSIC_SHERO: - dispel_monsters(randint1(p_ptr->lev * 3)); - break; - case MUSIC_H_LIFE: - hp_player(damroll(15,10)); + break; + case MUSIC_DISPEL: + dispel_monsters(randint1(p_ptr->lev * 3)); + dispel_evil(randint1(p_ptr->lev * 3)); + break; + case MUSIC_SARUMAN: + slow_monsters(); + sleep_monsters(); + break; + case MUSIC_QUAKE: + earthquake(py, px, 10); + break; + case MUSIC_STASIS: + stasis_monsters(p_ptr->lev * 4); + break; + case MUSIC_SHERO: + dispel_monsters(randint1(p_ptr->lev * 3)); + break; + case MUSIC_H_LIFE: + hp_player(damroll(15,10)); set_stun(0); set_cut(0); - break; - case MUSIC_DETECT+19: + break; + case MUSIC_DETECT+19: wiz_lite(FALSE, FALSE); - case MUSIC_DETECT+11: - case MUSIC_DETECT+12: - case MUSIC_DETECT+13: - case MUSIC_DETECT+14: - case MUSIC_DETECT+15: - case MUSIC_DETECT+16: - case MUSIC_DETECT+17: - case MUSIC_DETECT+18: + case MUSIC_DETECT+11: + case MUSIC_DETECT+12: + case MUSIC_DETECT+13: + case MUSIC_DETECT+14: + case MUSIC_DETECT+15: + case MUSIC_DETECT+16: + case MUSIC_DETECT+17: + case MUSIC_DETECT+18: map_area(DETECT_RAD_MAP); if ((p_ptr->lev > 39) && (music < MUSIC_DETECT+19)) p_ptr->magic_num1[0] = music+1; - case MUSIC_DETECT+6: - case MUSIC_DETECT+7: - case MUSIC_DETECT+8: - case MUSIC_DETECT+9: - case MUSIC_DETECT+10: + case MUSIC_DETECT+6: + case MUSIC_DETECT+7: + case MUSIC_DETECT+8: + case MUSIC_DETECT+9: + case MUSIC_DETECT+10: detect_treasure(DETECT_RAD_DEFAULT); detect_objects_gold(DETECT_RAD_DEFAULT); detect_objects_normal(DETECT_RAD_DEFAULT); if ((p_ptr->lev > 24) && (music < MUSIC_DETECT+11)) p_ptr->magic_num1[0] = music+1; - case MUSIC_DETECT+3: - case MUSIC_DETECT+4: - case MUSIC_DETECT+5: + case MUSIC_DETECT+3: + case MUSIC_DETECT+4: + case MUSIC_DETECT+5: detect_monsters_invis(DETECT_RAD_DEFAULT); detect_monsters_normal(DETECT_RAD_DEFAULT); if ((p_ptr->lev > 19) && (music < MUSIC_DETECT+6)) p_ptr->magic_num1[0] = music+1; - case MUSIC_DETECT: - case MUSIC_DETECT+1: - case MUSIC_DETECT+2: - detect_traps(DETECT_RAD_DEFAULT); + case MUSIC_DETECT: + case MUSIC_DETECT+1: + case MUSIC_DETECT+2: + detect_traps(DETECT_RAD_DEFAULT, TRUE); detect_doors(DETECT_RAD_DEFAULT); detect_stairs(DETECT_RAD_DEFAULT); if ((p_ptr->lev > 14) && (music < MUSIC_DETECT+3)) p_ptr->magic_num1[0] = music+1; break; - } + } } /* @@ -1378,34 +1445,34 @@ else msg_format("%s } -static void check_music() +static void check_music(void) { - magic_type *s_ptr; + magic_type *s_ptr; u32b shouhimana; - /* Music singed by player */ - if(p_ptr->pclass != CLASS_BARD) return; - if(!p_ptr->magic_num1[0] && !p_ptr->magic_num1[1]) return; + /* Music singed by player */ + if(p_ptr->pclass != CLASS_BARD) return; + if(!p_ptr->magic_num1[0] && !p_ptr->magic_num1[1]) return; - s_ptr = &technic_info[REALM_MUSIC - MIN_TECHNIC - 1][p_ptr->magic_num2[0]]; + s_ptr = &technic_info[REALM_MUSIC - MIN_TECHNIC][p_ptr->magic_num2[0]]; - shouhimana = (s_ptr->smana*(3800-spell_exp[p_ptr->magic_num2[0]])+2399); + shouhimana = (s_ptr->smana*(3800-p_ptr->spell_exp[p_ptr->magic_num2[0]])+2399); if(p_ptr->dec_mana) shouhimana *= 3; else shouhimana *= 4; shouhimana /= 9600; if(shouhimana < 1) shouhimana = 1; - shouhimana *= 0x8000; - if ((p_ptr->csp < shouhimana / 0x10000) || (p_ptr->anti_magic)) - { - stop_singing(); + shouhimana *= 0x8000; + if (((u16b)(p_ptr->csp) < (shouhimana / 0x10000)) || (p_ptr->anti_magic)) + { + stop_singing(); return; - } - else - { - p_ptr->csp -= shouhimana / 0x10000; - shouhimana = (shouhimana & 0xffff); - if (p_ptr->csp_frac < shouhimana) + } + else + { + p_ptr->csp -= (u16b) (shouhimana / 0x10000); + shouhimana = (shouhimana & 0xffff); + if (p_ptr->csp_frac < shouhimana) { p_ptr->csp--; p_ptr->csp_frac += (u16b)(0x10000L - shouhimana); @@ -1415,7 +1482,7 @@ static void check_music() p_ptr->csp_frac -= (u16b)shouhimana; } - p_ptr->redraw |= PR_MANA; + p_ptr->redraw |= PR_MANA; if (p_ptr->magic_num1[1]) { p_ptr->magic_num1[0] = p_ptr->magic_num1[1]; @@ -1433,19 +1500,46 @@ static void check_music() /* Redraw status bar */ p_ptr->redraw |= (PR_STATUS); } - } - if (spell_exp[p_ptr->magic_num2[0]] < 900) - spell_exp[p_ptr->magic_num2[0]]+=5; - else if(spell_exp[p_ptr->magic_num2[0]] < 1200) - {if (one_in_(2) && (dun_level > 4) && ((dun_level + 10) > p_ptr->lev)) spell_exp[p_ptr->magic_num2[0]]+=1;} - else if(spell_exp[p_ptr->magic_num2[0]] < 1400) - {if (one_in_(5) && ((dun_level + 5) > p_ptr->lev) && ((dun_level + 5) > s_ptr->slevel)) spell_exp[p_ptr->magic_num2[0]]+=1;} - else if(spell_exp[p_ptr->magic_num2[0]] < 1600) - {if (one_in_(5) && ((dun_level + 5) > p_ptr->lev) && (dun_level > s_ptr->slevel)) spell_exp[p_ptr->magic_num2[0]]+=1;} - - gere_music(p_ptr->magic_num1[0]); + } + if (p_ptr->spell_exp[p_ptr->magic_num2[0]] < 900) + p_ptr->spell_exp[p_ptr->magic_num2[0]]+=5; + else if(p_ptr->spell_exp[p_ptr->magic_num2[0]] < 1200) + {if (one_in_(2) && (dun_level > 4) && ((dun_level + 10) > p_ptr->lev)) p_ptr->spell_exp[p_ptr->magic_num2[0]]+=1;} + else if(p_ptr->spell_exp[p_ptr->magic_num2[0]] < 1400) + {if (one_in_(5) && ((dun_level + 5) > p_ptr->lev) && ((dun_level + 5) > s_ptr->slevel)) p_ptr->spell_exp[p_ptr->magic_num2[0]]+=1;} + else if(p_ptr->spell_exp[p_ptr->magic_num2[0]] < 1600) + {if (one_in_(5) && ((dun_level + 5) > p_ptr->lev) && (dun_level > s_ptr->slevel)) p_ptr->spell_exp[p_ptr->magic_num2[0]]+=1;} + + gere_music(p_ptr->magic_num1[0]); +} + +/* Choose one of items that have cursed flag */ +static object_type *choose_cursed_obj_name(u32b flag) +{ + int i; + int choices[INVEN_TOTAL-INVEN_RARM]; + int number = 0; + + /* Paranoia -- Player has no warning-item */ + if (!(p_ptr->cursed & flag)) return NULL; + + /* Search Inventry */ + for (i = INVEN_RARM; i < INVEN_TOTAL; i++) + { + object_type *o_ptr = &inventory[i]; + + if (o_ptr->curse_flags & flag) + { + choices[number] = i; + number++; + } + } + + /* Choice one of them */ + return (&inventory[choices[randint0(number)]]); } + /* * Handle certain things once every 10 game turns */ @@ -1457,20 +1551,20 @@ static void process_world(void) int upkeep_factor = 0; cave_type *c_ptr; object_type *o_ptr; - u32b f1 = 0 , f2 = 0 , f3 = 0; int temp; object_kind *k_ptr; const int dec_count = (easy_band ? 2 : 1); - int hour, min, prev_min; - s32b len = 20L * TOWN_DAWN; + int day, hour, min, prev_min; + + s32b len = TURNS_PER_TICK * TOWN_DAWN; s32b tick = turn % len + len / 4; - hour = (24 * tick / len) % 24; - min = (1440 * tick / len) % 60; - prev_min = (1440 * (tick - 20) / len) % 60; + extract_day_hour_min(&day, &hour, &min); + prev_min = (1440 * (tick - TURNS_PER_TICK) / len) % 60; - if ((turn - old_turn == (3000 - dun_level*20)) && (dun_level) && + if ((turn - old_turn == (150 - dun_level) * TURNS_PER_TICK) + && (dun_level) && !(quest_number(dun_level) && ((quest_number(dun_level) < MIN_RANDOM_QUEST) && !(quest_number(dun_level) == QUEST_OBERON || quest_number(dun_level) == QUEST_SERPENT || !(quest[quest_number(dun_level)].flags & QUEST_FLAG_PRESET)))) && !(p_ptr->inside_battle)) do_cmd_feeling(); @@ -1499,7 +1593,7 @@ msg_print(" msg_print("They have kill each other at the same time."); #endif msg_print(NULL); - p_ptr->energy = 100; + p_ptr->energy_need = 0; battle_monsters(); } else if ((number_mon-1) == 0) @@ -1527,7 +1621,7 @@ msg_print(" #ifdef JP msg_format("%d¡ð¤ò¼õ¤±¼è¤Ã¤¿¡£", battle_odds); #else - msg_format("You recieved %d gold.", battle_odds); + msg_format("You received %d gold.", battle_odds); #endif p_ptr->au += battle_odds; } @@ -1540,10 +1634,10 @@ msg_print(" #endif } msg_print(NULL); - p_ptr->energy = 100; + p_ptr->energy_need = 0; battle_monsters(); } - else if(turn - old_turn == 3000L) + else if(turn - old_turn == 150*TURNS_PER_TICK) { #ifdef JP msg_print("¿½¤·Ê¬¤±¤¢¤ê¤Þ¤»¤ó¤¬¡¢¤³¤Î¾¡Éé¤Ï°ú¤­Ê¬¤±¤È¤µ¤»¤Æ¤¤¤¿¤À¤­¤Þ¤¹¡£"); @@ -1552,17 +1646,17 @@ msg_print(" #endif p_ptr->au += kakekin; msg_print(NULL); - p_ptr->energy = 100; + p_ptr->energy_need = 0; battle_monsters(); } } /* Every 20 game turns */ - if (turn % 20) return; + if (turn % TURNS_PER_TICK) return; /*** Check the Time and Load ***/ - if (!(turn % 1000)) + if (!(turn % (50*TURNS_PER_TICK))) { /* Check time and load */ if ((0 != check_time()) || (0 != check_load())) @@ -1599,7 +1693,7 @@ msg_print(" /* Stop playing */ - alive = FALSE; + p_ptr->playing = FALSE; /* Leaving */ p_ptr->leaving = TRUE; @@ -1610,18 +1704,18 @@ msg_print(" /*** Attempt timed autosave ***/ if (autosave_t && autosave_freq && !p_ptr->inside_battle) { - if (!(turn % ((s32b)autosave_freq * 20))) + if (!(turn % ((s32b)autosave_freq * TURNS_PER_TICK))) do_cmd_save_game(TRUE); } - if (mon_fight) - { + if (mon_fight) + { #ifdef JP - msg_print("²¿¤«¤¬Ê¹¤³¤¨¤¿¡£"); + msg_print("²¿¤«¤¬Ê¹¤³¤¨¤¿¡£"); #else - msg_print("You hear noise."); + msg_print("You hear noise."); #endif - } + } /*** Handle the wilderness/town (sunshine) ***/ @@ -1629,12 +1723,12 @@ msg_print(" if (!dun_level && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena && !p_ptr->wild_mode) { /* Hack -- Daybreak/Nighfall in town */ - if (!(turn % ((20L * TOWN_DAWN) / 2))) + if (!(turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2))) { bool dawn; /* Check for dawn */ - dawn = (!(turn % (20L * TOWN_DAWN))); + dawn = (!(turn % (TURNS_PER_TICK * TOWN_DAWN))); /* Day breaks */ if (dawn) @@ -1689,11 +1783,13 @@ msg_print(" /* Darken "boring" features */ if ((c_ptr->feat <= FEAT_INVIS) || ((c_ptr->feat >= FEAT_DEEP_WATER) && - (c_ptr->feat <= FEAT_TREES) && - (c_ptr->feat != FEAT_MUSEUM))) + (c_ptr->feat <= FEAT_MOUNTAIN) && + (c_ptr->feat != FEAT_MUSEUM)) || + (x == 0) || (x == cur_wid-1) || + (y == 0) || (y == cur_hgt-1)) { /* Forget the grid */ - c_ptr->info &= ~(CAVE_GLOW | CAVE_MARK); + if (!is_mirror_grid(c_ptr)) c_ptr->info &= ~(CAVE_GLOW | CAVE_MARK); /* Hack -- Notice spot */ note_spot(y, x); @@ -1714,7 +1810,7 @@ msg_print(" } /* Set back the rewards once a day */ - if (!(turn % (200L * STORE_TURNS))) + if (!(turn % (TURNS_PER_TICK*10 * STORE_TURNS))) { int n; @@ -1741,12 +1837,12 @@ if (cheat_xtra) msg_print(" !p_ptr->inside_arena && !p_ptr->inside_quest && !p_ptr->inside_battle) { /* Make a new monster */ - (void)alloc_monster(MAX_SIGHT + 5, FALSE); + (void)alloc_monster(MAX_SIGHT + 5, 0); } /* Hack -- Check for creature regeneration */ - if (!(turn % 200) && !p_ptr->inside_battle) regen_monsters(); - if (!(turn % 60)) regen_captured_monsters(); + if (!(turn % (TURNS_PER_TICK*10)) && !p_ptr->inside_battle) regen_monsters(); + if (!(turn % (TURNS_PER_TICK*3))) regen_captured_monsters(); /*** Damage over Time ***/ @@ -1767,8 +1863,7 @@ take_hit(DAMAGE_NOESCAPE, 1, " /* (Vampires) Take damage from sunlight */ if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) { - if (!dun_level && !p_ptr->resist_lite && !p_ptr->invuln && - (!((turn / ((20L * TOWN_DAWN) / 2)) % 2))) + if (!dun_level && !p_ptr->resist_lite && !p_ptr->invuln && is_daytime()) { if (cave[py][px].info & CAVE_GLOW) { @@ -2171,22 +2266,25 @@ take_hit(DAMAGE_NOESCAPE, i, " if (p_ptr->food < PY_FOOD_MAX) { /* Every 100 game turns */ - if (!(turn % 100)) + if (!(turn % (TURNS_PER_TICK*5))) { /* Basic digestion rate based on speed */ i = /* extract_energy[p_ptr->pspeed] * 2;*/ - ((p_ptr->pspeed > 199) ? 49 : ((p_ptr->pspeed < 0) ? - 1 : extract_energy[p_ptr->pspeed])); + ((p_ptr->pspeed > 199) ? 49 : ((p_ptr->pspeed < 0) ? + 1 : extract_energy[p_ptr->pspeed])); /* Regeneration takes more food */ if (p_ptr->regenerate) i += 20; if (p_ptr->special_defense & (KAMAE_MASK | KATA_MASK)) i+= 20; + if (p_ptr->cursed & TRC_FAST_DIGEST) i += 30; /* Slow digestion takes less food */ if (p_ptr->slow_digest) i -= 5; /* Minimal digestion */ if (i < 1) i = 1; + /* Maximal digestion */ + if (i > 100) i = 100; /* Digest some food */ (void)set_food(p_ptr->food - i); @@ -2274,6 +2372,10 @@ msg_print(" { regen_amount /= 2; } + if (p_ptr->cursed & TRC_SLOW_REGEN) + { + regen_amount /= 5; + } } @@ -2295,7 +2397,7 @@ msg_print(" regenmana(upkeep_regen/100); #ifdef TRACK_FRIENDS - if (wizard) + if (p_ptr->wizard) { #ifdef JP msg_format("£Í£Ð²óÉü: %d/%d", upkeep_regen, regen_amount); @@ -2449,6 +2551,18 @@ msg_print(" (void)set_tim_sh_fire(p_ptr->tim_sh_fire - 1, TRUE); } + /* Timed sh_holy */ + if (p_ptr->tim_sh_holy) + { + (void)set_tim_sh_holy(p_ptr->tim_sh_holy - 1, TRUE); + } + + /* Timed eyeeye */ + if (p_ptr->tim_eyeeye) + { + (void)set_tim_eyeeye(p_ptr->tim_eyeeye - 1, TRUE); + } + /* Timed resist-magic */ if (p_ptr->resist_magic) { @@ -2670,7 +2784,7 @@ msg_print(" /* Decrease life-span */ if (o_ptr->name2 == EGO_LITE_LONG) { - if (turn % 40) o_ptr->xtra4--; + if (turn % (TURNS_PER_TICK*2)) o_ptr->xtra4--; } else o_ptr->xtra4--; @@ -2832,10 +2946,13 @@ msg_print(" !p_ptr->anti_magic && (randint1(6666) == 666)) { bool pet = one_in_(6); - bool not_pet = (bool)(!pet); + u32b mode = PM_ALLOW_GROUP; + + if (pet) mode |= PM_FORCE_PET; + else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); if (summon_specific((pet ? -1 : 0), py, px, - dun_level, SUMMON_DEMON, TRUE, FALSE, pet, not_pet, not_pet)) + dun_level, SUMMON_DEMON, mode)) { #ifdef JP msg_print("¤¢¤Ê¤¿¤Ï¥Ç¡¼¥â¥ó¤ò°ú¤­´ó¤»¤¿¡ª"); @@ -2964,10 +3081,12 @@ msg_print(" !p_ptr->anti_magic && one_in_(7000)) { bool pet = one_in_(3); - bool not_pet = (bool)(!pet); + u32b mode = PM_ALLOW_GROUP; - if (summon_specific((pet ? -1 : 0), py, px, dun_level, SUMMON_ANIMAL, - TRUE, FALSE, pet, not_pet, not_pet)) + if (pet) mode |= PM_FORCE_PET; + else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); + + if (summon_specific((pet ? -1 : 0), py, px, dun_level, SUMMON_ANIMAL, mode)) { #ifdef JP msg_print("ưʪ¤ò°ú¤­´ó¤»¤¿¡ª"); @@ -3070,10 +3189,12 @@ msg_print(" !p_ptr->anti_magic && one_in_(3000)) { bool pet = one_in_(5); - bool not_pet = (bool)(!pet); + u32b mode = PM_ALLOW_GROUP; + + if (pet) mode |= PM_FORCE_PET; + else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); - if (summon_specific((pet ? -1 : 0), py, px, dun_level, SUMMON_DRAGON, - TRUE, FALSE, pet, not_pet, not_pet)) + if (summon_specific((pet ? -1 : 0), py, px, dun_level, SUMMON_DRAGON, mode)) { #ifdef JP msg_print("¥É¥é¥´¥ó¤ò°ú¤­´ó¤»¤¿¡ª"); @@ -3284,10 +3405,45 @@ msg_print(" /*** Process Inventory ***/ - /* Handle experience draining */ - if (p_ptr->exp_drain) + if ((p_ptr->cursed & TRC_P_FLAG_MASK) && !p_ptr->wild_mode) { - if (randint0(100) < 25) + /* + * Hack: Uncursed teleporting items (e.g. Trump Weapons) + * can actually be useful! + */ + if ((p_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(200)) + { +#ifdef JP +if (get_check_strict("¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©", CHECK_OKAY_CANCEL)) +#else + if (get_check_strict("Teleport? ", CHECK_OKAY_CANCEL)) +#endif + { + disturb(0, 0); + teleport_player(50); + } + } + /* Make a chainsword noise */ + if ((p_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE)) + { + char noise[1024]; +#ifdef JP +if (!get_rnd_line("chainswd_j.txt", 0, noise)) +#else + if (!get_rnd_line("chainswd.txt", 0, noise)) +#endif + msg_print(noise); + disturb(FALSE, FALSE); + } + /* TY Curse */ + if ((p_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE)) + { + int count = 0; + (void)activate_ty_curse(FALSE, &count); + } + /* Handle experience draining */ + if (p_ptr->prace != RACE_ANDROID && + ((p_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4))) { p_ptr->exp -= (p_ptr->lev+1)/2; if (p_ptr->exp < 0) p_ptr->exp = 0; @@ -3295,95 +3451,195 @@ msg_print(" if (p_ptr->max_exp < 0) p_ptr->max_exp = 0; check_experience(); } - } - - /* Rarely, take damage from the Jewel of Judgement */ - if (one_in_(999) && !p_ptr->anti_magic) - { - if ((inventory[INVEN_LITE].tval) && - (inventory[INVEN_LITE].sval == SV_LITE_THRAIN)) + /* Add light curse (Later) */ + if ((p_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(2000)) { + u32b new_curse; + object_type *o_ptr; + + o_ptr = choose_cursed_obj_name(TRC_ADD_L_CURSE); + + new_curse = get_curse(0, o_ptr); + if (!(o_ptr->curse_flags & new_curse)) + { + char o_name[MAX_NLEN]; + + object_desc(o_name, o_ptr, FALSE, 0); + + o_ptr->curse_flags |= new_curse; #ifdef JP -msg_print("¡Ø¿³È½¤ÎÊõÀС٤Ϥ¢¤Ê¤¿¤ÎÂÎÎϤòµÛ¼ý¤·¤¿¡ª"); -take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev, 50), "¿³È½¤ÎÊõÀÐ", -1); +msg_format("°­°Õ¤ËËþ¤Á¤¿¹õ¤¤¥ª¡¼¥é¤¬%s¤ò¤È¤ê¤Þ¤¤¤¿...", o_name); #else - msg_print("The Jewel of Judgement drains life from you!"); - take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev, 50), "the Jewel of Judgement", -1); + msg_format("There is a malignant black aura surrounding %s...", o_name); #endif + o_ptr->feeling = FEEL_NONE; + + p_ptr->update |= (PU_BONUS); + } } - } + /* Add heavy curse (Later) */ + if ((p_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(2000)) + { + u32b new_curse; + object_type *o_ptr; + o_ptr = choose_cursed_obj_name(TRC_ADD_H_CURSE); - /* Process equipment */ - for (j = 0, i = INVEN_RARM; i < INVEN_TOTAL; i++) - { - /* Get the object */ - o_ptr = &inventory[i]; + new_curse = get_curse(1, o_ptr); + if (!(o_ptr->curse_flags & new_curse)) + { + char o_name[MAX_NLEN]; - object_flags(o_ptr, &f1, &f2, &f3); + object_desc(o_name, o_ptr, FALSE, 0); - /* Skip non-objects */ - if (!o_ptr->k_idx) continue; + o_ptr->curse_flags |= new_curse; +#ifdef JP +msg_format("°­°Õ¤ËËþ¤Á¤¿¹õ¤¤¥ª¡¼¥é¤¬%s¤ò¤È¤ê¤Þ¤¤¤¿...", o_name); +#else + msg_format("There is a malignant black aura surrounding %s...", o_name); +#endif + + o_ptr->feeling = FEEL_NONE; - if (!p_ptr->inside_battle) + p_ptr->update |= (PU_BONUS); + } + } + /* Call animal */ + if ((p_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500)) { - /* TY Curse */ - if ((f3 & TR3_TY_CURSE) && one_in_(TY_CURSE_CHANCE)) + if (summon_specific(0, py, px, dun_level, SUMMON_ANIMAL, + (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET))) { - int count = 0; + char o_name[MAX_NLEN]; - (void)activate_ty_curse(FALSE, &count); - } + object_desc(o_name, choose_cursed_obj_name(TRC_CALL_ANIMAL), FALSE, 0); +#ifdef JP +msg_format("%s¤¬Æ°Êª¤ò°ú¤­´ó¤»¤¿¡ª", o_name); +#else + msg_format("%s have attracted an animal!", o_name); +#endif - /* Make a chainsword noise */ - if ((o_ptr->name1 == ART_CHAINSWORD) && one_in_(CHAINSWORD_NOISE)) + disturb(0, 0); + } + } + /* Call demon */ + if ((p_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111)) + { + if (summon_specific(0, py, px, dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET))) { - char noise[1024]; + char o_name[MAX_NLEN]; + + object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DEMON), FALSE, 0); #ifdef JP -if (!get_rnd_line("chainswd_j.txt", 0, noise)) +msg_format("%s¤¬°­Ëâ¤ò°ú¤­´ó¤»¤¿¡ª", o_name); #else - if (!get_rnd_line("chainswd.txt", 0, noise)) + msg_format("%s have attracted a demon!", o_name); #endif - msg_print(noise); - disturb(FALSE, FALSE); + disturb(0, 0); } + } + /* Call dragon */ + if ((p_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800)) + { + if (summon_specific(0, py, px, dun_level, SUMMON_DRAGON, + (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET))) + { + char o_name[MAX_NLEN]; - /* - * Hack: Uncursed teleporting items (e.g. Trump Weapons) - * can actually be useful! - */ - if ((f3 & TR3_TELEPORT) && (randint0(100) < 1)) + object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DRAGON), FALSE, 0); +#ifdef JP +msg_format("%s¤¬¥É¥é¥´¥ó¤ò°ú¤­´ó¤»¤¿¡ª", o_name); +#else + msg_format("%s have attracted an animal!", o_name); +#endif + + disturb(0, 0); + } + } + if ((p_ptr->cursed & TRC_COWARDICE) && one_in_(1500)) + { + if (!(p_ptr->resist_fear || p_ptr->hero || p_ptr->shero)) { - if ((o_ptr->ident & IDENT_CURSED) && !p_ptr->anti_tele) - { - disturb(0, 0); + disturb(0, 0); +#ifdef JP +msg_print("¤È¤Æ¤â°Å¤¤... ¤È¤Æ¤â¶²¤¤¡ª"); +#else + msg_print("It's so dark... so scary!"); +#endif - /* Teleport player */ - teleport_player(40); - } - else - { - if (p_ptr->wild_mode || (o_ptr->inscription && - (strchr(quark_str(o_ptr->inscription),'.')))) - { - /* Do nothing */ - /* msg_print("Teleport aborted.") */ ; - } + set_afraid(p_ptr->afraid + 13 + randint1(26)); + } + } + /* Teleport player */ + if ((p_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !p_ptr->anti_tele) + { + disturb(0, 0); + + /* Teleport player */ + teleport_player(40); + } + /* Handle HP draining */ + if ((p_ptr->cursed & TRC_DRAIN_HP) && one_in_(666)) + { + char o_name[MAX_NLEN]; + + object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_HP), FALSE, 0); #ifdef JP -else if (get_check_strict("¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©", 1)) +msg_format("%s¤Ï¤¢¤Ê¤¿¤ÎÂÎÎϤòµÛ¼ý¤·¤¿¡ª", o_name); #else - else if (get_check("Teleport? ")) + msg_format("%s drains HP from you!", o_name); #endif + take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev*2, 100), o_name, -1); + } + /* Handle mana draining */ + if ((p_ptr->cursed & TRC_DRAIN_MANA) && one_in_(666)) + { + char o_name[MAX_NLEN]; - { - disturb(0, 0); - teleport_player(50); - } - } + object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_MANA), FALSE, 0); +#ifdef JP +msg_format("%s¤Ï¤¢¤Ê¤¿¤ÎËâÎϤòµÛ¼ý¤·¤¿¡ª", o_name); +#else + msg_format("%s drains mana from you!", o_name); +#endif + p_ptr->csp -= MIN(p_ptr->lev, 50); + if (p_ptr->csp < 0) + { + p_ptr->csp = 0; + p_ptr->csp_frac = 0; } + p_ptr->redraw |= PR_MANA; + } + } + + /* Rarely, take damage from the Jewel of Judgement */ + if (one_in_(999) && !p_ptr->anti_magic) + { + if ((inventory[INVEN_LITE].tval) && + (inventory[INVEN_LITE].sval == SV_LITE_THRAIN)) + { +#ifdef JP +msg_print("¡Ø¿³È½¤ÎÊõÀС٤Ϥ¢¤Ê¤¿¤ÎÂÎÎϤòµÛ¼ý¤·¤¿¡ª"); +take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev, 50), "¿³È½¤ÎÊõÀÐ", -1); +#else + msg_print("The Jewel of Judgement drains life from you!"); + take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev, 50), "the Jewel of Judgement", -1); +#endif + } + } + + + /* Process equipment */ + for (j = 0, i = INVEN_RARM; i < INVEN_TOTAL; i++) + { + /* Get the object */ + o_ptr = &inventory[i]; + + /* Skip non-objects */ + if (!o_ptr->k_idx) continue; /* Recharge activatable objects */ if (o_ptr->timeout > 0) @@ -3504,7 +3760,7 @@ else if (get_check_strict(" if (!p_ptr->word_recall) { /* Disturbing! */ - disturb(0, 0); + disturb(0, 0); /* Determine the level */ if (dun_level || p_ptr->inside_quest) @@ -3515,12 +3771,13 @@ msg_print(" msg_print("You feel yourself yanked upwards!"); #endif - p_ptr->recall_dungeon = dungeon_type; + p_ptr->recall_dungeon = dungeon_type; if (record_stair) do_cmd_write_nikki(NIKKI_RECALL, dun_level, NULL); dun_level = 0; dungeon_type = 0; + prepare_change_floor_mode(CFM_CLEAR_ALL); leave_quest_check(); @@ -3535,7 +3792,7 @@ msg_print(" msg_print("You feel yourself yanked downwards!"); #endif - dungeon_type = p_ptr->recall_dungeon; + dungeon_type = p_ptr->recall_dungeon; if (record_stair) do_cmd_write_nikki(NIKKI_RECALL, dun_level, NULL); @@ -3574,6 +3831,8 @@ msg_print(" } p_ptr->wild_mode = FALSE; + prepare_change_floor_mode(CFM_CLEAR_ALL); + /* Leaving */ p_ptr->leaving = TRUE; @@ -3597,6 +3856,52 @@ msg_print(" sound(SOUND_TPLEVEL); } } + + + /* Delayed Alter reality */ + if (p_ptr->alter_reality) + { + if (autosave_l && (p_ptr->alter_reality == 1) && !p_ptr->inside_battle) + do_cmd_save_game(TRUE); + + /* Count down towards alter */ + p_ptr->alter_reality--; + + p_ptr->redraw |= (PR_STATUS); + + /* Activate the alter reality */ + if (!p_ptr->alter_reality) + { + /* Disturbing! */ + disturb(0, 0); + + /* Determine the level */ + if (!quest_number(dun_level) && dun_level) + { +#ifdef JP + msg_print("À¤³¦¤¬ÊѤï¤Ã¤¿¡ª"); +#else + msg_print("The world changes!"); +#endif + + prepare_change_floor_mode(CFM_CLEAR_ALL); + + /* Leaving */ + p_ptr->leaving = TRUE; + } + else + { +#ifdef JP + msg_print("À¤³¦¤¬¾¯¤·¤Î´ÖÊѲ½¤·¤¿¤è¤¦¤À¡£"); +#else + msg_print("The world seems to change for a moment!"); +#endif + } + + /* Sound */ + sound(SOUND_TPLEVEL); + } + } } @@ -3607,8 +3912,19 @@ msg_print(" static bool enter_wizard_mode(void) { /* Ask first time */ - if (!noscore) + if (!p_ptr->noscore) { + /* Wizard mode is not permitted */ + if (!allow_debug_opts) + { +#ifdef JP + msg_print("¥¦¥£¥¶¡¼¥É¥â¡¼¥É¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ "); +#else + msg_print("Wizard mode is not permitted."); +#endif + return FALSE; + } + /* Mention effects */ #ifdef JP msg_print("¥¦¥£¥¶¡¼¥É¥â¡¼¥É¤Ï¥Ç¥Ð¥°¤È¼Â¸³¤Î¤¿¤á¤Î¥â¡¼¥É¤Ç¤¹¡£ "); @@ -3632,7 +3948,7 @@ if (!get_check(" } /* Mark savefile */ - noscore |= 0x0002; + p_ptr->noscore |= 0x0002; } /* Success */ @@ -3648,8 +3964,19 @@ if (!get_check(" static bool enter_debug_mode(void) { /* Ask first time */ - if (!noscore) + if (!p_ptr->noscore) { + /* Debug mode is not permitted */ + if (!allow_debug_opts) + { +#ifdef JP + msg_print("¥Ç¥Ð¥Ã¥°¥³¥Þ¥ó¥É¤Ïµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ "); +#else + msg_print("Use of debug command is not permitted."); +#endif + return FALSE; + } + /* Mention effects */ #ifdef JP msg_print("¥Ç¥Ð¥°¡¦¥³¥Þ¥ó¥É¤Ï¥Ç¥Ð¥°¤È¼Â¸³¤Î¤¿¤á¤Î¥³¥Þ¥ó¥É¤Ç¤¹¡£ "); @@ -3678,7 +4005,7 @@ if (!get_check(" do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "give up sending score to use debug commands."); #endif /* Mark savefile */ - noscore |= 0x0008; + p_ptr->noscore |= 0x0008; } /* Success */ @@ -3701,7 +4028,7 @@ extern void do_cmd_debug(void); static bool enter_borg_mode(void) { /* Ask first time */ - if (!(noscore & 0x0010)) + if (!(p_ptr->noscore & 0x0010)) { /* Mention effects */ #ifdef JP @@ -3726,7 +4053,7 @@ if (!get_check(" } /* Mark savefile */ - noscore |= 0x0010; + p_ptr->noscore |= 0x0010; } /* Success */ @@ -3783,9 +4110,9 @@ static void process_command(void) /* Toggle Wizard Mode */ case KTRL('W'): { - if (wizard) + if (p_ptr->wizard) { - wizard = FALSE; + p_ptr->wizard = FALSE; #ifdef JP msg_print("¥¦¥£¥¶¡¼¥É¥â¡¼¥É²ò½ü¡£"); #else @@ -3795,7 +4122,7 @@ msg_print(" } else if (enter_wizard_mode()) { - wizard = TRUE; + p_ptr->wizard = TRUE; #ifdef JP msg_print("¥¦¥£¥¶¡¼¥É¥â¡¼¥ÉÆÍÆþ¡£"); #else @@ -4008,21 +4335,21 @@ msg_print(" /*** Stairs and Doors and Chests and Traps ***/ /* Enter store */ - case 253: + case SPECIAL_KEY_STORE: { if (!p_ptr->wild_mode) do_cmd_store(); break; } /* Enter building -KMW- */ - case 254: + case SPECIAL_KEY_BUILDING: { if (!p_ptr->wild_mode) do_cmd_bldg(); break; } /* Enter quest level -KMW- */ - case 255: + case SPECIAL_KEY_QUEST: { if (!p_ptr->wild_mode) do_cmd_quest(); break; @@ -4031,37 +4358,37 @@ msg_print(" /* Go up staircase */ case '<': { - if(!p_ptr->wild_mode && !dun_level && !p_ptr->inside_arena && !p_ptr->inside_quest) - { - if (!vanilla_town) - { - if(ambush_flag) + if(!p_ptr->wild_mode && !dun_level && !p_ptr->inside_arena && !p_ptr->inside_quest) + { + if (!vanilla_town) + { + if(ambush_flag) { #ifdef JP - msg_print("½±·â¤«¤éƨ¤²¤ë¤Ë¤Ï¥Þ¥Ã¥×¤Îü¤Þ¤Ç°ÜÆ°¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£"); + msg_print("½±·â¤«¤éƨ¤²¤ë¤Ë¤Ï¥Þ¥Ã¥×¤Îü¤Þ¤Ç°ÜÆ°¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£"); #else - msg_print("To flee the ambush you have to reach the edge of the map."); + msg_print("To flee the ambush you have to reach the edge of the map."); #endif } else if (p_ptr->food < PY_FOOD_WEAK) { #ifdef JP - msg_print("¤½¤ÎÁ°¤Ë¿©»ö¤ò¤È¤é¤Ê¤¤¤È¡£"); + msg_print("¤½¤ÎÁ°¤Ë¿©»ö¤ò¤È¤é¤Ê¤¤¤È¡£"); #else - msg_print("You must eat something here."); + msg_print("You must eat something here."); #endif } - else - { + else + { if (change_wild_mode()) { p_ptr->oldpx = px; p_ptr->oldpy = py; } - } - } - } - else + } + } + } + else do_cmd_go_up(); break; } @@ -4069,14 +4396,14 @@ msg_print(" /* Go down staircase */ case '>': { - if(!p_ptr->wild_mode) do_cmd_go_down(); - else - { + if(!p_ptr->wild_mode) do_cmd_go_down(); + else + { p_ptr->wilderness_x = px; p_ptr->wilderness_y = py; change_wild_mode(); - } - break; + } + break; } /* Open a door or chest */ @@ -4145,6 +4472,8 @@ msg_print(" ) do_cmd_mind_browse(); else if (p_ptr->pclass == CLASS_SMITH) do_cmd_kaji(TRUE); + else if (p_ptr->pclass == CLASS_MAGIC_EATER) + do_cmd_magic_eater(TRUE); else do_cmd_browse(); break; } @@ -4168,7 +4497,7 @@ msg_print(" #ifdef JP msg_print("¥À¥ó¥¸¥ç¥ó¤¬ËâË¡¤òµÛ¼ý¤·¤¿¡ª"); #else - msg_print("The arena absorbs all attempted magic!"); + msg_print("The dungeon absorbs all attempted magic!"); #endif msg_print(NULL); } @@ -4244,7 +4573,7 @@ msg_print(" else if (p_ptr->pclass == CLASS_IMITATOR) do_cmd_mane(FALSE); else if (p_ptr->pclass == CLASS_MAGIC_EATER) - do_cmd_magic_eater(); + do_cmd_magic_eater(FALSE); else if (p_ptr->pclass == CLASS_SAMURAI) do_cmd_hissatsu(); else if (p_ptr->pclass == CLASS_BLUE_MAGE) @@ -4328,18 +4657,7 @@ msg_print(" { if (!p_ptr->wild_mode) { - if (!p_ptr->inside_arena) do_cmd_throw(); - else - { -#ifdef JP -msg_print("¥¢¥ê¡¼¥Ê¤Ç¤Ï¥¢¥¤¥Æ¥à¤ò»È¤¨¤Ê¤¤¡ª"); -#else - msg_print("You're in the arena now. This is hand-to-hand!"); -#endif - - msg_print(NULL); - } } break; } @@ -4545,6 +4863,12 @@ msg_print(" break; } + case '_': + { + do_cmd_edit_autopick(); + break; + } + /* Interact with macros */ case '@': { @@ -4647,6 +4971,7 @@ msg_print(" /* Save and quit */ case KTRL('X'): + case SPECIAL_KEY_QUIT: { do_cmd_save_and_exit(); break; @@ -4702,7 +5027,7 @@ msg_print(" char error_m[1024]; sound(SOUND_ILLEGAL); #ifdef JP - if (!get_rnd_line("error_j.txt", 0, error_m)) + if (!get_rnd_line("error_j.txt", 0, error_m)) #else if (!get_rnd_line("error.txt", 0, error_m)) #endif @@ -4726,7 +5051,7 @@ prt(" '?' -bool monster_tsuri(int r_idx) +static bool monster_tsuri(int r_idx) { monster_race *r_ptr = &r_info[r_idx]; @@ -4780,11 +5105,13 @@ msg_print(" } /* Give the player some energy */ - else if((randint0(60) < ((p_ptr->pspeed > 199) ? 49 : ((p_ptr->pspeed < 0) ? 1 : extract_energy[p_ptr->pspeed]))) && !(load && p_ptr->energy >= 100)) - p_ptr->energy += gain_energy(); + else if (!(load && p_ptr->energy_need <= 0)) + { + p_ptr->energy_need -= (p_ptr->pspeed > 199 ? 49 : (p_ptr->pspeed < 0 ? 1 : extract_energy[p_ptr->pspeed])); + } /* No turn yet */ - if (p_ptr->energy < 100) return; + if (p_ptr->energy_need > 0) return; if (!command_rep) prt_time(); /*** Check for interupts ***/ @@ -4813,7 +5140,8 @@ msg_print(" !p_ptr->poisoned && !p_ptr->afraid && !p_ptr->stun && !p_ptr->cut && !p_ptr->slow && !p_ptr->paralyzed && - !p_ptr->image && !p_ptr->word_recall) + !p_ptr->image && !p_ptr->word_recall && + !p_ptr->alter_reality) { set_action(ACTION_NONE); } @@ -4836,7 +5164,7 @@ msg_print(" int y, x; y = py+ddy[tsuri_dir]; x = px+ddx[tsuri_dir]; - if (place_monster_aux(y, x, r_idx, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE)) + if (place_monster_aux(0, y, x, r_idx, PM_NO_KAGE)) { char m_name[80]; monster_desc(m_name, &m_list[cave[y][x].m_idx], 0); @@ -4853,7 +5181,7 @@ msg_print(" #ifdef JP msg_print("±Â¤À¤±¿©¤ï¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª¤¯¤Ã¤½¡Á¡ª"); #else - msg_print("Damn! The fish took a bait away!"); + msg_print("Damn! The fish stole your bait!"); #endif } disturb(0, 0); @@ -4861,7 +5189,7 @@ msg_print(" } /* Handle "abort" */ - if (avoid_abort) + if (check_abort) { /* Check for "player abort" (semi-efficiently for resting) */ if (running || command_rep || (p_ptr->action == ACTION_REST) || (p_ptr->action == ACTION_FISH)) @@ -4916,7 +5244,7 @@ msg_format("%^s int d = 1; /* Make a "saving throw" against stun */ - if (randint0(r_info[m_ptr->r_idx].level) < skill_exp[GINOU_RIDING]) + if (randint0(r_info[m_ptr->r_idx].level) < p_ptr->skill_exp[GINOU_RIDING]) { /* Recover fully */ d = m_ptr->stunned; @@ -4956,7 +5284,7 @@ msg_format("%^s int d = 1; /* Make a "saving throw" against stun */ - if (randint0(r_info[m_ptr->r_idx].level) < skill_exp[GINOU_RIDING]) + if (randint0(r_info[m_ptr->r_idx].level) < p_ptr->skill_exp[GINOU_RIDING]) { /* Recover fully */ d = m_ptr->confused; @@ -4996,7 +5324,7 @@ msg_format("%^s int d = 1; /* Make a "saving throw" against stun */ - if (randint0(r_info[m_ptr->r_idx].level) < skill_exp[GINOU_RIDING]) + if (randint0(r_info[m_ptr->r_idx].level) < p_ptr->skill_exp[GINOU_RIDING]) { /* Recover fully */ d = m_ptr->monfear; @@ -5096,7 +5424,7 @@ msg_format("%^s /*** Handle actual user input ***/ /* Repeat until out of energy */ - while (p_ptr->energy >= 100) + while (p_ptr->energy_need <= 0) { p_ptr->window |= PW_PLAYER; p_ptr->sutemi = FALSE; @@ -5192,7 +5520,7 @@ msg_format("%s(%c) /* Place the cursor on the player */ move_cursor_relative(py, px); - command_cmd = 254; + command_cmd = SPECIAL_KEY_BUILDING; /* Process the command */ process_command(); @@ -5282,8 +5610,10 @@ msg_format("%s(%c) if (energy_use) { /* Use some energy */ - p_ptr->energy -= energy_use; - + if (!world_player) + p_ptr->energy_need += (s16b)((s32b)energy_use * ENERGY_NEED() / 100L); + else + p_ptr->energy_need += energy_use * TURNS_PER_TICK / 10; /* Hack -- constant hallucination */ if (p_ptr->image) p_ptr->redraw |= (PR_MAP); @@ -5382,13 +5712,13 @@ msg_format("%s(%c) } if (p_ptr->pclass == CLASS_IMITATOR) { - if (mane_num > (p_ptr->lev > 44 ? 3 : p_ptr->lev > 29 ? 2 : 1)) + if (p_ptr->mane_num > (p_ptr->lev > 44 ? 3 : p_ptr->lev > 29 ? 2 : 1)) { - mane_num--; - for (i = 0; i < mane_num; i++) + p_ptr->mane_num--; + for (i = 0; i < p_ptr->mane_num; i++) { - mane_spell[i] = mane_spell[i+1]; - mane_dam[i] = mane_dam[i+1]; + p_ptr->mane_spell[i] = p_ptr->mane_spell[i+1]; + p_ptr->mane_dam[i] = p_ptr->mane_dam[i+1]; } } new_mane = FALSE; @@ -5400,7 +5730,7 @@ msg_format("%s(%c) p_ptr->redraw |= (PR_STATE); } - if (world_player && (p_ptr->energy < 1000)) + if (world_player && (p_ptr->energy_need > - 1000)) { /* Redraw map */ p_ptr->redraw |= (PR_MAP); @@ -5418,14 +5748,14 @@ msg_format("%s(%c) #endif msg_print(NULL); world_player = FALSE; - p_ptr->energy = 0; + p_ptr->energy_need = ENERGY_NEED(); handle_stuff(); } } /* Hack -- notice death */ - if (!alive || death) + if (!p_ptr->playing || p_ptr->is_dead) { world_player = FALSE; break; @@ -5448,7 +5778,7 @@ msg_format("%s(%c) */ static void dungeon(bool load_game) { - int quest_num = 0, i, num; + int quest_num = 0, i; /* Set the base level */ base_level = dun_level; @@ -5510,62 +5840,12 @@ static void dungeon(bool load_game) if (record_maxdeapth) do_cmd_write_nikki(NIKKI_MAXDEAPTH, dun_level, NULL); } - /* No stairs down from Quest */ - if (quest_number(dun_level)) - { - create_down_stair = 0; - } - - /* Paranoia -- no stairs from town or wilderness */ - if (!dun_level) create_down_stair = create_up_stair = 0; - - /* Option -- no connected stairs */ - if (!dungeon_stair) create_down_stair = create_up_stair = 0; - - /* Option -- no up stairs */ - if (ironman_downward) create_down_stair = create_up_stair = 0; - - /* Make a stairway. */ - if (create_up_stair || create_down_stair) - { - /* Place a stairway */ - if (cave_valid_bold(py, px)) - { - /* XXX XXX XXX */ - delete_object(py, px); - - /* Make stairs */ - if (create_down_stair) - { - if (create_down_stair == 2) cave_set_feat(py, px, FEAT_MORE_MORE); - else cave_set_feat(py, px, FEAT_MORE); - } - else - { - if (create_up_stair == 2) cave_set_feat(py, px, FEAT_LESS_LESS); - else cave_set_feat(py, px, FEAT_LESS); - } - } - - /* Cancel the stair request */ - create_down_stair = create_up_stair = 0; - } - + /* Validate the panel */ + panel_bounds_center(); /* Verify the panel */ verify_panel(); - /* Validate the panel */ - if (center_player) - { - panel_bounds_center(); - } - else - { - panel_bounds(); - } - - /* Flush messages */ msg_print(NULL); @@ -5574,10 +5854,7 @@ static void dungeon(bool load_game) character_xtra = TRUE; /* Window stuff */ - p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER); - - /* Window stuff */ - p_ptr->window |= (PW_MONSTER); + p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON); /* Redraw dungeon */ p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY); @@ -5585,14 +5862,14 @@ static void dungeon(bool load_game) /* Redraw map */ p_ptr->redraw |= (PR_MAP); - /* Window stuff */ - p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); - /* Update stuff */ p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); - /* Calculate torch radius */ - p_ptr->update |= (PU_TORCH); + /* Update lite/view */ + p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE | PU_TORCH); + + /* Update monsters */ + p_ptr->update |= (PU_MONSTERS | PU_DISTANCE | PU_FLOW); /* Update stuff */ update_stuff(); @@ -5603,16 +5880,6 @@ static void dungeon(bool load_game) /* Redraw stuff */ window_stuff(); - /* Update stuff */ - p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_DISTANCE | PU_MON_LITE); - p_ptr->update |= (PU_MONSTERS);/*¼«Ê¬¤Ç¸÷¤Ã¤Æ¤¤¤ë¥â¥ó¥¹¥¿¡¼¤Î°Ù */ - - /* Update stuff */ - update_stuff(); - - /* Redraw stuff */ - redraw_stuff(); - /* Leave "xtra" mode */ character_xtra = FALSE; @@ -5643,7 +5910,7 @@ static void dungeon(bool load_game) { if (load_game) { - p_ptr->energy = 100; + p_ptr->energy_need = 0; battle_monsters(); } else @@ -5662,7 +5929,7 @@ msg_print(" p_ptr->magic_num1[0] = MUSIC_DETECT; /* Hack -- notice death or departure */ - if (!alive || death) return; + if (!p_ptr->playing || p_ptr->is_dead) return; /* Print quest message if appropriate */ if (!p_ptr->inside_quest && (dungeon_type == DUNGEON_ANGBAND)) @@ -5694,14 +5961,17 @@ msg_print(" hack_mind = TRUE; - if (p_ptr->energy < 100 && !p_ptr->inside_battle && (dun_level || p_ptr->leaving_dungeon || p_ptr->inside_arena)) p_ptr->energy = 100; + if (p_ptr->energy_need > 0 && !p_ptr->inside_battle && + (dun_level || p_ptr->leaving_dungeon || p_ptr->inside_arena)) + p_ptr->energy_need = 0; + /* Not leaving dungeon */ p_ptr->leaving_dungeon = FALSE; /* Main loop */ while (TRUE) { - int i, correct_inven_cnt = 0; + int i; /* Hack -- Compact the monster list occasionally */ if ((m_cnt + 32 > max_m_idx) && !p_ptr->inside_battle) compact_monsters(64); @@ -5723,17 +5993,6 @@ msg_print(" /* Notice stuff */ if (p_ptr->notice) notice_stuff(); - /* Similar slot? */ - for (i = 0; i < INVEN_PACK; i++) - { - object_type *j_ptr = &inventory[i]; - - /* Skip non-objects */ - if (!j_ptr->k_idx) continue; - - correct_inven_cnt++; - } - /* Update stuff */ if (p_ptr->update) update_stuff(); @@ -5750,7 +6009,7 @@ msg_print(" if (fresh_after) Term_fresh(); /* Hack -- Notice death or departure */ - if (!alive || death) break; + if (!p_ptr->playing || p_ptr->is_dead) break; /* Process all of the monsters */ process_monsters(); @@ -5774,7 +6033,7 @@ msg_print(" if (fresh_after) Term_fresh(); /* Hack -- Notice death or departure */ - if (!alive || death) break; + if (!p_ptr->playing || p_ptr->is_dead) break; /* Process the world */ @@ -5799,7 +6058,7 @@ msg_print(" if (fresh_after) Term_fresh(); /* Hack -- Notice death or departure */ - if (!alive || death) break; + if (!p_ptr->playing || p_ptr->is_dead) break; /* Handle "leaving" */ if (p_ptr->leaving) break; @@ -5819,58 +6078,19 @@ msg_print(" } /* Not save-and-quit and not dead? */ - if (alive && !death) + if (p_ptr->playing && !p_ptr->is_dead) { - for(num = 0; num < 21; num++) - { - party_mon[num].r_idx = 0; - } - - if (p_ptr->riding) - { - COPY(&party_mon[0], &m_list[p_ptr->riding], monster_type); - } - - for(i = m_max - 1, num = 1; (i >= 1 && num < 21); i--) - { - monster_type *m_ptr = &m_list[i]; - - if (!m_ptr->r_idx) continue; - if (!is_pet(m_ptr)) continue; - if (i == p_ptr->riding) continue; - - if (m_ptr->nickname && (player_has_los_bold(m_ptr->fy, m_ptr->fx) || los(m_ptr->fy, m_ptr->fx, py, px))) - { - if (distance(py, px, m_ptr->fy, m_ptr->fx) > 3) continue; - } - else - { - if (distance(py, px, m_ptr->fy, m_ptr->fx) > 1) continue; - } - if (m_ptr->confused || m_ptr->stunned || m_ptr->csleep) continue; + /* + * Maintain Unique monsters and artifact, save current + * floor, then prepare next floor + */ + leave_floor(); - COPY(&party_mon[num], &m_list[i], monster_type); - delete_monster_idx(i); - num++; - } - if (record_named_pet) - { - for (i = m_max - 1; i >=1; i--) - { - monster_type *m_ptr = &m_list[i]; - char m_name[80]; - - if (!m_ptr->r_idx) continue; - if (!is_pet(m_ptr)) continue; - if (!m_ptr->nickname) continue; - if (p_ptr->riding == i) continue; - - monster_desc(m_name, m_ptr, 0x88); - do_cmd_write_nikki(NIKKI_NAMED_PET, 4, m_name); - } - } + /* Forget the flag */ + reinit_wilderness = FALSE; } + /* Write about current level on the play record once per level */ write_level = TRUE; } @@ -5884,6 +6104,19 @@ msg_print(" static void load_all_pref_files(void) { char buf[1024]; + errr err; + + /* Access the "user" pref file */ + sprintf(buf, "user.prf"); + + /* Process that file */ + process_pref_file(buf); + + /* Access the "user" system pref file */ + sprintf(buf, "user-%s.prf", ANGBAND_SYS); + + /* Process that file */ + process_pref_file(buf); /* Access the "race" pref file */ sprintf(buf, "%s.prf", rp_ptr->title); @@ -5903,17 +6136,26 @@ static void load_all_pref_files(void) /* Process that file */ process_pref_file(buf); + /* Free old entries */ + init_autopicker(); + #ifdef JP - sprintf(buf, "picktype-%s.prf", player_base); + sprintf(buf, "picktype-%s.prf", player_base); #else - sprintf(buf, "pickpref-%s.prf", player_base); + sprintf(buf, "pickpref-%s.prf", player_base); #endif - process_pickpref_file(buf); + + err = process_pickpref_file(buf); + + /* Process 'pick????.prf' if 'pick????-.prf' doesn't exist */ + if (0 > err) + { #ifdef JP - process_pickpref_file("picktype.prf"); + process_pickpref_file("picktype.prf"); #else - process_pickpref_file("pickpref.prf"); + process_pickpref_file("pickpref.prf"); #endif + } /* Access the "realm 1" pref file */ if (p_ptr->realm1 != REALM_NONE) @@ -5960,6 +6202,22 @@ void play_game(bool new_game) /* Hack -- Character is "icky" */ character_icky = TRUE; + /* Make sure main term is active */ + Term_activate(angband_term[0]); + + /* Initialise the resize hooks */ + angband_term[0]->resize_hook = resize_map; + + for (i = 1; i < 8; i++) + { + /* Does the term exist? */ + if (angband_term[i]) + { + /* Add the redraw on resize hook */ + angband_term[i]->resize_hook = redraw_window; + } + } + /* Hack -- turn off the cursor */ (void)Term_set_cursor(0); @@ -6002,15 +6260,15 @@ quit(" } /* Report waited score */ - if (wait_report_score) + if (p_ptr->wait_report_score) { char buf[1024]; bool success; #ifdef JP - if (!get_check("ÂÔµ¡¤·¤Æ¤¤¤¿¥¹¥³¥¢ÅÐÏ¿¤òº£¹Ô¤Ê¤¤¤Þ¤¹¤«¡©")) + if (!get_check_strict("ÂÔµ¡¤·¤Æ¤¤¤¿¥¹¥³¥¢ÅÐÏ¿¤òº£¹Ô¤Ê¤¤¤Þ¤¹¤«¡©", CHECK_NO_HISTORY)) #else - if (!get_check("Do you register score now? ")) + if (!get_check_strict("Do you register score now? ", CHECK_NO_HISTORY)) #endif quit(0); @@ -6020,7 +6278,7 @@ quit(" /* Update stuff */ update_stuff(); - death = TRUE; + p_ptr->is_dead = TRUE; start_time = time(NULL); @@ -6031,7 +6289,7 @@ quit(" character_icky = TRUE; /* Build the filename */ - path_build(buf, 1024, ANGBAND_DIR_APEX, "scores.raw"); + path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw"); /* Open the high score file, for reading/writing */ highscore_fd = fd_open(buf, O_RDWR); @@ -6040,9 +6298,9 @@ quit(" success = send_world_score(TRUE); #ifdef JP - if (!success && !get_check("¥¹¥³¥¢ÅÐÏ¿¤òÄü¤á¤Þ¤¹¤«¡©")) + if (!success && !get_check_strict("¥¹¥³¥¢ÅÐÏ¿¤òÄü¤á¤Þ¤¹¤«¡©", CHECK_NO_HISTORY)) #else - if (!success && !get_check("Do you give up score registration? ")) + if (!success && !get_check_strict("Do you give up score registration? ", CHECK_NO_HISTORY)) #endif { #ifdef JP @@ -6054,7 +6312,7 @@ quit(" } else { - wait_report_score = FALSE; + p_ptr->wait_report_score = FALSE; top_twenty(); #ifdef JP if (!save_player()) msg_print("¥»¡¼¥Ö¼ºÇÔ¡ª"); @@ -6085,6 +6343,16 @@ quit(" /* Prepare to init the RNG */ Rand_quick = TRUE; + + /* Initialize the saved floors data */ + init_saved_floors(); + } + + /* Old game is loaded. But new game is requested. */ + else if (new_game) + { + /* Delete expanded temporal files */ + clear_saved_floor_files(); } /* Process old character */ @@ -6239,18 +6507,22 @@ quit(" start_time = time(NULL) - 1; record_o_name[0] = '\0'; + /* Reset map panel */ + panel_row_min = cur_hgt; + panel_col_min = cur_wid; + /* Sexy gal gets bonus to maximum weapon skill of whip */ if(p_ptr->pseikaku == SEIKAKU_SEXY) s_info[p_ptr->pclass].w_max[TV_HAFTED-TV_BOW][SV_WHIP] = 8000; - /* Fill the arrays of floors and walls in the good proportions */ - for (i = 0; i < 100; i++) - { - int lim1, lim2, lim3; + /* Fill the arrays of floors and walls in the good proportions */ + for (i = 0; i < 100; i++) + { + int lim1, lim2, lim3; - lim1 = d_info[dungeon_type].floor_percent1; - lim2 = lim1 + d_info[dungeon_type].floor_percent2; - lim3 = lim2 + d_info[dungeon_type].floor_percent3; + lim1 = d_info[dungeon_type].floor_percent1; + lim2 = lim1 + d_info[dungeon_type].floor_percent2; + lim3 = lim2 + d_info[dungeon_type].floor_percent3; if (i < lim1) floor_type[i] = d_info[dungeon_type].floor1; @@ -6268,7 +6540,7 @@ quit(" fill_type[i] = d_info[dungeon_type].fill_type2; else if (i < lim3) fill_type[i] = d_info[dungeon_type].fill_type3; - } + } /* Flavor the objects */ flavor_init(); @@ -6291,19 +6563,23 @@ prt(" /* Hack -- Enter wizard mode */ - if (arg_wizard && enter_wizard_mode()) wizard = TRUE; + if (arg_wizard) + { + if (enter_wizard_mode()) p_ptr->wizard = TRUE; + else if (p_ptr->is_dead) quit("Already dead."); + } /* Initialize the town-buildings if necessary */ if (!dun_level && !p_ptr->inside_quest) { /* Init the wilderness */ -process_dungeon_file("w_info_j.txt", 0, 0, max_wild_y, max_wild_x); + process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x); /* Init the town */ init_flags = INIT_ONLY_BUILDINGS; -process_dungeon_file("t_info_j.txt", 0, 0, MAX_HGT, MAX_WID); + process_dungeon_file("t_info.txt", 0, 0, MAX_HGT, MAX_WID); } @@ -6316,7 +6592,7 @@ if (init_v_info()) quit(" #endif /* Generate a dungeon level if needed */ - if (!character_dungeon) generate_cave(); + if (!character_dungeon) change_floor(); /* Character is now "complete" */ @@ -6328,7 +6604,7 @@ if (init_v_info()) quit(" /* Start game */ - alive = TRUE; + p_ptr->playing = TRUE; /* Reset the visual mappings */ reset_visuals(); @@ -6343,7 +6619,7 @@ if (init_v_info()) quit(" p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER); /* Window stuff */ - p_ptr->window |= (PW_MONSTER); + p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT); /* Window stuff */ window_stuff(); @@ -6354,7 +6630,7 @@ if (init_v_info()) quit(" if (arg_force_roguelike) rogue_like_commands = TRUE; /* Hack -- Enforce "delayed death" */ - if (p_ptr->chp < 0) death = TRUE; + if (p_ptr->chp < 0) p_ptr->is_dead = TRUE; if (p_ptr->prace == RACE_ANDROID) calc_android_exp(); @@ -6363,14 +6639,14 @@ if (init_v_info()) quit(" monster_type *m_ptr; int pet_r_idx = ((p_ptr->pclass == CLASS_CAVALRY) ? MON_HORSE : MON_YASE_HORSE); monster_race *r_ptr = &r_info[pet_r_idx]; - place_monster_aux(py, px - 1, pet_r_idx, - FALSE, FALSE, TRUE, TRUE, TRUE, FALSE); + place_monster_aux(0, py, px - 1, pet_r_idx, + (PM_FORCE_PET | PM_NO_KAGE)); m_ptr = &m_list[hack_m_idx_ii]; m_ptr->mspeed = r_ptr->speed; m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside+1)/2; m_ptr->max_maxhp = m_ptr->maxhp; m_ptr->hp = r_ptr->hdice*(r_ptr->hside+1)/2; - m_ptr->energy = -100; + m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED(); } /* Process */ @@ -6409,11 +6685,11 @@ if (init_v_info()) quit(" clear_mon_lite(); /* Handle "quit and save" */ - if (!alive && !death) break; + if (!p_ptr->playing && !p_ptr->is_dead) break; /* Erase the old cave */ wipe_o_list(); - if (!death) wipe_m_list(); + if (!p_ptr->is_dead) wipe_m_list(); /* XXX XXX XXX */ @@ -6422,7 +6698,7 @@ if (init_v_info()) quit(" load_game = FALSE; /* Accidental Death */ - if (alive && death) + if (p_ptr->playing && p_ptr->is_dead) { if (p_ptr->inside_arena) { @@ -6431,7 +6707,7 @@ if (init_v_info()) quit(" p_ptr->arena_number++; else p_ptr->arena_number = 99; - death = FALSE; + p_ptr->is_dead = FALSE; p_ptr->chp = 0; p_ptr->chp_frac = 0; p_ptr->exit_bldg = TRUE; @@ -6441,9 +6717,9 @@ if (init_v_info()) quit(" { /* Mega-Hack -- Allow player to cheat death */ #ifdef JP -if ((wizard || cheat_live) && !get_check("»à¤Ë¤Þ¤¹¤«? ")) +if ((p_ptr->wizard || cheat_live) && !get_check("»à¤Ë¤Þ¤¹¤«? ")) #else - if ((wizard || cheat_live) && !get_check("Die? ")) + if ((p_ptr->wizard || cheat_live) && !get_check("Die? ")) #endif { @@ -6454,7 +6730,7 @@ if ((wizard || cheat_live) && !get_check(" p_ptr->age++; /* Mark savefile */ - noscore |= 0x0001; + p_ptr->noscore |= 0x0001; /* Message */ #ifdef JP @@ -6472,11 +6748,11 @@ msg_print(" if (p_ptr->pclass == CLASS_MAGIC_EATER) { - for (i = 0; i < 72; i++) + for (i = 0; i < EATER_EXT*2; i++) { - p_ptr->magic_num1[i] = p_ptr->magic_num2[i]*0x10000; + p_ptr->magic_num1[i] = p_ptr->magic_num2[i]*EATER_CHARGE; } - for (; i < 108; i++) + for (; i < EATER_EXT*3; i++) { p_ptr->magic_num1[i] = 0; } @@ -6515,16 +6791,24 @@ msg_print("Ä¥ p_ptr->redraw |= (PR_STATUS); } + /* Hack -- cancel alter */ + if (p_ptr->alter_reality) + { + /* Hack -- Prevent alter */ + p_ptr->alter_reality = 0; + p_ptr->redraw |= (PR_STATUS); + } + /* Note cause of death XXX XXX XXX */ #ifdef JP -(void)strcpy(died_from, "»à¤Îµ½¤­"); +(void)strcpy(p_ptr->died_from, "»à¤Îµ½¤­"); #else - (void)strcpy(died_from, "Cheating death"); + (void)strcpy(p_ptr->died_from, "Cheating death"); #endif /* Do not die */ - death = FALSE; + p_ptr->is_dead = FALSE; dun_level = 0; p_ptr->inside_arena = FALSE; @@ -6570,10 +6854,10 @@ msg_print("Ä¥ } /* Handle "death" */ - if (death) break; + if (p_ptr->is_dead) break; /* Make a new level */ - generate_cave(); + change_floor(); } /* Close stuff */ @@ -6589,7 +6873,7 @@ s32b turn_real(s32b hoge) (p_ptr->prace == RACE_SKELETON) || (p_ptr->prace == RACE_ZOMBIE) || (p_ptr->prace == RACE_SPECTRE)) - return hoge-(60L * TOWN_DAWN) / 4; + return hoge-(TURNS_PER_TICK * TOWN_DAWN *3/ 4); else return hoge; }