X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fdungeon.c;h=955eeea5a33251ce10609b2b00d3100c3821011c;hb=5754437802a62c3425fca4d0c604677d154c6c0f;hp=596bc3924d2ba3bc3bf1b39455cd5b178cb3e2bd;hpb=2f0a3f4be0bb024ec1f57aa4063621978d6fa218;p=hengbandforosx%2Fhengbandosx.git diff --git a/src/dungeon.c b/src/dungeon.c index 596bc3924..955eeea5a 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; @@ -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; @@ -194,6 +195,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, FALSE); + /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); @@ -609,7 +616,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 @@ -662,6 +673,14 @@ msg_format("%d /* Change level */ dun_level = command_arg; + 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 +940,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 +954,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 +1104,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 @@ -1111,6 +1131,30 @@ msg_print(" } +void leave_quest_check(void) +{ + /* Save quset number for dungeon pref file ($LEAVING_QUEST) */ + leaving_quest = p_ptr->inside_quest; + + /* Leaving an 'only once' quest marks it as failed */ + if (leaving_quest && + ((quest[leaving_quest].flags & QUEST_FLAG_ONCE) || (quest[leaving_quest].type == QUEST_TYPE_RANDOM)) && + (quest[leaving_quest].status == QUEST_STATUS_TAKEN)) + { + quest[leaving_quest].status = QUEST_STATUS_FAILED; + quest[leaving_quest].complev = (byte)p_ptr->lev; + if (quest[leaving_quest].type == QUEST_TYPE_RANDOM) + { + 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); + } + else if (record_fix_quest) + do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL); + } +} + + /* * Forcibly pseudo-identify an object in the inventory * (or on the floor) @@ -1300,7 +1344,7 @@ static void gere_music(s32b music) case MUSIC_DETECT: case MUSIC_DETECT+1: case MUSIC_DETECT+2: - detect_traps(DETECT_RAD_DEFAULT); + 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; @@ -1354,7 +1398,7 @@ else msg_format("%s } -static void check_music() +static void check_music(void) { magic_type *s_ptr; u32b shouhimana; @@ -1363,25 +1407,25 @@ static void check_music() 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)) + 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) + 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); @@ -1410,18 +1454,45 @@ static void check_music() 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;} + 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 */ @@ -1433,20 +1504,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(); @@ -1475,7 +1546,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) @@ -1503,7 +1574,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; } @@ -1516,10 +1587,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("¿½¤·Ê¬¤±¤¢¤ê¤Þ¤»¤ó¤¬¡¢¤³¤Î¾¡Éé¤Ï°ú¤­Ê¬¤±¤È¤µ¤»¤Æ¤¤¤¿¤À¤­¤Þ¤¹¡£"); @@ -1528,17 +1599,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())) @@ -1575,7 +1646,7 @@ msg_print(" /* Stop playing */ - alive = FALSE; + p_ptr->playing = FALSE; /* Leaving */ p_ptr->leaving = TRUE; @@ -1586,7 +1657,7 @@ 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); } @@ -1605,12 +1676,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) @@ -1665,11 +1736,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 (!(c_ptr->info & CAVE_IN_MIRROR)) c_ptr->info &= ~(CAVE_GLOW | CAVE_MARK); /* Hack -- Notice spot */ note_spot(y, x); @@ -1690,7 +1763,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; @@ -1721,8 +1794,8 @@ if (cheat_xtra) msg_print(" } /* 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 ***/ @@ -1743,8 +1816,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) { @@ -2147,7 +2219,7 @@ 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;*/ @@ -2157,12 +2229,15 @@ take_hit(DAMAGE_NOESCAPE, i, " /* 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); @@ -2250,6 +2325,10 @@ msg_print(" { regen_amount /= 2; } + if (p_ptr->cursed & TRC_SLOW_REGEN) + { + regen_amount /= 5; + } } @@ -2271,7 +2350,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); @@ -2425,6 +2504,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) { @@ -2646,7 +2737,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--; @@ -2808,10 +2899,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("¤¢¤Ê¤¿¤Ï¥Ç¡¼¥â¥ó¤ò°ú¤­´ó¤»¤¿¡ª"); @@ -2940,10 +3034,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("ưʪ¤ò°ú¤­´ó¤»¤¿¡ª"); @@ -3046,10 +3142,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("¥É¥é¥´¥ó¤ò°ú¤­´ó¤»¤¿¡ª"); @@ -3260,10 +3358,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; @@ -3271,95 +3404,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 - if (!p_ptr->inside_battle) + o_ptr->feeling = FEEL_NONE; + + 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) @@ -3498,24 +3731,7 @@ msg_print(" dun_level = 0; dungeon_type = 0; - leaving_quest = p_ptr->inside_quest; - - /* Leaving an 'only once' quest marks it as failed */ - if (leaving_quest && - ((quest[leaving_quest].flags & QUEST_FLAG_ONCE) || (quest[leaving_quest].type == QUEST_TYPE_RANDOM)) && - (quest[leaving_quest].status == QUEST_STATUS_TAKEN)) - { - quest[leaving_quest].status = QUEST_STATUS_FAILED; - quest[leaving_quest].complev = (byte)p_ptr->lev; - if (quest[leaving_quest].type == QUEST_TYPE_RANDOM) - { - 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); - } - else if (record_fix_quest) - do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL); - } + leave_quest_check(); p_ptr->inside_quest = 0; p_ptr->leaving = TRUE; @@ -3600,7 +3816,7 @@ msg_print(" static bool enter_wizard_mode(void) { /* Ask first time */ - if (!noscore) + if (!p_ptr->noscore) { /* Mention effects */ #ifdef JP @@ -3625,7 +3841,7 @@ if (!get_check(" } /* Mark savefile */ - noscore |= 0x0002; + p_ptr->noscore |= 0x0002; } /* Success */ @@ -3641,7 +3857,7 @@ if (!get_check(" static bool enter_debug_mode(void) { /* Ask first time */ - if (!noscore) + if (!p_ptr->noscore) { /* Mention effects */ #ifdef JP @@ -3671,7 +3887,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 */ @@ -3694,7 +3910,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 @@ -3719,7 +3935,7 @@ if (!get_check(" } /* Mark savefile */ - noscore |= 0x0010; + p_ptr->noscore |= 0x0010; } /* Success */ @@ -3776,9 +3992,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 @@ -3788,7 +4004,7 @@ msg_print(" } else if (enter_wizard_mode()) { - wizard = TRUE; + p_ptr->wizard = TRUE; #ifdef JP msg_print("¥¦¥£¥¶¡¼¥É¥â¡¼¥ÉÆÍÆþ¡£"); #else @@ -4001,21 +4217,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; @@ -4138,6 +4354,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; } @@ -4161,7 +4379,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); } @@ -4237,7 +4455,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) @@ -4321,18 +4539,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; } @@ -4538,6 +4745,12 @@ msg_print(" break; } + case '_': + { + do_cmd_edit_autopick(); + break; + } + /* Interact with macros */ case '@': { @@ -4640,6 +4853,7 @@ msg_print(" /* Save and quit */ case KTRL('X'): + case SPECIAL_KEY_QUIT: { do_cmd_save_and_exit(); break; @@ -4719,7 +4933,7 @@ prt(" '?' -bool monster_tsuri(int r_idx) +static bool monster_tsuri(int r_idx) { monster_race *r_ptr = &r_info[r_idx]; @@ -4773,11 +4987,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 ***/ @@ -4829,7 +5045,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); @@ -4846,7 +5062,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); @@ -4854,7 +5070,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)) @@ -4909,7 +5125,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; @@ -4949,7 +5165,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; @@ -4989,7 +5205,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; @@ -5044,6 +5260,7 @@ msg_format("%^s p_ptr->magic_num1[0] = 0; } else p_ptr->magic_num1[0] -= 40; + p_ptr->update |= (PU_BONUS); } if (p_ptr->action == ACTION_LEARN) { @@ -5088,7 +5305,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; @@ -5274,8 +5491,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); @@ -5374,13 +5593,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; @@ -5392,7 +5611,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); @@ -5410,14 +5629,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; @@ -5543,21 +5762,12 @@ static void dungeon(bool load_game) 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); @@ -5566,10 +5776,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); @@ -5577,14 +5784,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(); @@ -5595,16 +5802,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; @@ -5635,7 +5832,7 @@ static void dungeon(bool load_game) { if (load_game) { - p_ptr->energy = 100; + p_ptr->energy_need = 0; battle_monsters(); } else @@ -5654,7 +5851,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)) @@ -5686,7 +5883,10 @@ 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; @@ -5742,7 +5942,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(); @@ -5766,7 +5966,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 */ @@ -5791,7 +5991,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; @@ -5811,7 +6011,7 @@ 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++) { @@ -5876,6 +6076,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); @@ -5895,17 +6108,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); #else 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) @@ -5952,6 +6174,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); @@ -5994,15 +6232,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); @@ -6012,7 +6250,7 @@ quit(" /* Update stuff */ update_stuff(); - death = TRUE; + p_ptr->is_dead = TRUE; start_time = time(NULL); @@ -6023,7 +6261,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); @@ -6032,9 +6270,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 @@ -6046,7 +6284,7 @@ quit(" } else { - wait_report_score = FALSE; + p_ptr->wait_report_score = FALSE; top_twenty(); #ifdef JP if (!save_player()) msg_print("¥»¡¼¥Ö¼ºÇÔ¡ª"); @@ -6231,6 +6469,10 @@ 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; @@ -6283,7 +6525,11 @@ 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) @@ -6320,7 +6566,7 @@ if (init_v_info()) quit(" /* Start game */ - alive = TRUE; + p_ptr->playing = TRUE; /* Reset the visual mappings */ reset_visuals(); @@ -6335,7 +6581,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(); @@ -6346,7 +6592,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(); @@ -6355,14 +6601,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 */ @@ -6401,11 +6647,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 */ @@ -6414,7 +6660,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) { @@ -6423,7 +6669,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; @@ -6433,9 +6679,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 { @@ -6446,7 +6692,7 @@ if ((wizard || cheat_live) && !get_check(" p_ptr->age++; /* Mark savefile */ - noscore |= 0x0001; + p_ptr->noscore |= 0x0001; /* Message */ #ifdef JP @@ -6464,11 +6710,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; } @@ -6509,14 +6755,14 @@ msg_print("Ä¥ /* 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; @@ -6562,7 +6808,7 @@ msg_print("Ä¥ } /* Handle "death" */ - if (death) break; + if (p_ptr->is_dead) break; /* Make a new level */ generate_cave(); @@ -6581,7 +6827,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; }