OSDN Git Service

table.c の整理。
[hengband/hengband.git] / src / dungeon.c
index 39d8490..04dccdd 100644 (file)
@@ -313,6 +313,7 @@ static void sense_inventory1(void)
                }
 
                case CLASS_PALADIN:
+               case CLASS_SNIPER:
                {
                        /* Bad sensing */
                        if (0 != randint0(77777L / (plev * plev + 40))) return;
@@ -476,6 +477,7 @@ static void sense_inventory2(void)
                case CLASS_SAMURAI:
                case CLASS_CAVALRY:
                case CLASS_BERSERKER:
+               case CLASS_SNIPER:
                {
                        return;
                }
@@ -1171,6 +1173,11 @@ void leave_quest_check(void)
        {
                quest[leaving_quest].status = QUEST_STATUS_FAILED;
                quest[leaving_quest].complev = (byte)p_ptr->lev;
+               if(quest[leaving_quest].type == QUEST_TYPE_TOWER)
+               {
+                       quest[QUEST_TOWER1].status = QUEST_STATUS_FAILED;
+                       quest[QUEST_TOWER1].complev = (byte)p_ptr->lev;
+               }
                if (quest[leaving_quest].type == QUEST_TYPE_RANDOM)
                {
                        r_info[quest[leaving_quest].r_idx].flags1 &= ~(RF1_QUESTOR);
@@ -1183,6 +1190,23 @@ void leave_quest_check(void)
                else if (record_fix_quest)
                        do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL);
        }
+                                               
+}
+
+void leave_tower_check(void)
+{
+       leaving_quest = p_ptr->inside_quest;
+       /* Check for Tower Quest */
+       if (leaving_quest &&
+               (quest[leaving_quest].type == QUEST_TYPE_TOWER) &&
+               (quest[QUEST_TOWER1].status != QUEST_STATUS_COMPLETED))
+       {
+               if(quest[leaving_quest].type == QUEST_TYPE_TOWER)
+               {
+                       quest[QUEST_TOWER1].status = QUEST_STATUS_FAILED;
+                       quest[QUEST_TOWER1].complev = (byte)p_ptr->lev;
+               }
+       }
 }
 
 
@@ -1277,6 +1301,9 @@ msg_format("%s
        /* "Inscribe" it */
        o_ptr->feeling = feel;
 
+       /* Player touches it */
+       o_ptr->marked |= OM_TOUCHED;
+
        /* Combine / Reorder the pack (later) */
        p_ptr->notice |= (PN_COMBINE | PN_REORDER);
 
@@ -2231,6 +2258,7 @@ static void process_world_aux_mutation(void)
 #endif
 
                (void)set_shero(10 + randint1(p_ptr->lev), FALSE);
+               (void)set_afraid(0);
        }
 
        if ((p_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13))
@@ -2670,6 +2698,7 @@ static void process_world_aux_mutation(void)
                msg_print(NULL);
                set_food(PY_FOOD_WEAK);
                if (music_singing_any()) stop_singing();
+               if (hex_spelling_any()) stop_hex_spell_all();
        }
 
        if ((p_ptr->muta2 & MUT2_WALK_SHAD) &&
@@ -3283,6 +3312,7 @@ msg_print("
                                dungeon_type = 0;
 
                                leave_quest_check();
+                               leave_tower_check();
 
                                p_ptr->inside_quest = 0;
 
@@ -3524,7 +3554,11 @@ static byte get_dungeon_feeling(void)
                if (!o_ptr->k_idx) continue;
 
                /* Skip known objects */
-               if (object_is_known(o_ptr)) continue;
+               if (object_is_known(o_ptr))
+               {
+                       /* Touched? */
+                       if (o_ptr->marked & OM_TOUCHED) continue;
+               }
 
                /* Skip pseudo-known objects */
                if (o_ptr->ident & IDENT_SENSE) continue;
@@ -4377,6 +4411,10 @@ static void process_command(void)
 
        now_message = 0;
 
+       /* Sniper */
+       if ((p_ptr->pclass == CLASS_SNIPER) && (p_ptr->concent))
+               reset_concent = TRUE;
+
        /* Parse the command */
        switch (command_cmd)
        {
@@ -4757,6 +4795,8 @@ msg_print("
                                do_cmd_kaji(TRUE);
                        else if (p_ptr->pclass == CLASS_MAGIC_EATER)
                                do_cmd_magic_eater(TRUE);
+                       else if (p_ptr->pclass == CLASS_SNIPER)
+                               do_cmd_snipe_browse();
                        else do_cmd_browse();
                        break;
                }
@@ -4863,6 +4903,8 @@ msg_print("
                                                do_cmd_cast_learned();
                                        else if (p_ptr->pclass == CLASS_SMITH)
                                                do_cmd_kaji(FALSE);
+                                       else if (p_ptr->pclass == CLASS_SNIPER)
+                                               do_cmd_snipe();
                                        else
                                                do_cmd_cast();
                                }
@@ -5179,6 +5221,7 @@ msg_print("
                case '=':
                {
                        do_cmd_options();
+                       (void)combine_and_reorder_home(STORE_HOME);
                        do_cmd_redraw();
                        break;
                }
@@ -5294,6 +5337,13 @@ msg_print("
                        break;
                }
 
+               /* Record/stop "Movie" */
+               case ']':
+               {
+                       prepare_movie_hooks();
+                       break;
+               }
+
                /* Make random artifact list */
                case KTRL('V'):
                {
@@ -5301,6 +5351,18 @@ msg_print("
                        break;
                }
 
+#ifdef TRAVEL
+               case '`':
+               {
+                       if (!p_ptr->wild_mode) do_cmd_travel();
+                       if (p_ptr->special_defense & KATA_MUSOU)
+                       {
+                               set_action(ACTION_NONE);
+                       }
+                       break;
+               }
+#endif
+
                /* Hack -- Unknown command */
                default:
                {
@@ -5350,12 +5412,15 @@ static void pack_overflow(void)
 {
        if (inventory[INVEN_PACK].k_idx)
        {
-               int item = INVEN_PACK;
                char o_name[MAX_NLEN];
                object_type *o_ptr;
 
+               /* Is auto-destroy done? */
+               notice_stuff();
+               if (!inventory[INVEN_PACK].k_idx) return;
+
                /* Access the slot to be dropped */
-               o_ptr = &inventory[item];
+               o_ptr = &inventory[INVEN_PACK];
 
                /* Disturbing */
                disturb(0, 0);
@@ -5372,18 +5437,18 @@ static void pack_overflow(void)
 
                /* Message */
 #ifdef JP
-               msg_format("%s(%c)¤òÍî¤È¤·¤¿¡£", o_name, index_to_label(item));
+               msg_format("%s(%c)¤òÍî¤È¤·¤¿¡£", o_name, index_to_label(INVEN_PACK));
 #else
-               msg_format("You drop %s (%c).", o_name, index_to_label(item));
+               msg_format("You drop %s (%c).", o_name, index_to_label(INVEN_PACK));
 #endif
 
                /* Drop it (carefully) near the player */
                (void)drop_near(o_ptr, 0, py, px);
 
                /* Modify, Describe, Optimize */
-               inven_item_increase(item, -255);
-               inven_item_describe(item);
-               inven_item_optimize(item);
+               inven_item_increase(INVEN_PACK, -255);
+               inven_item_describe(INVEN_PACK);
+               inven_item_optimize(INVEN_PACK);
 
                /* Handle "p_ptr->notice" */
                notice_stuff();
@@ -5637,6 +5702,10 @@ msg_print("
        /* Handle the player song */
        if (!load) check_music();
 
+       /* Hex - Handle the hex spells */
+       if (!load) check_hex();
+       if (!load) revenge_spell();
+
        load = FALSE;
 
        /* Fast */
@@ -5779,6 +5848,15 @@ msg_print("
                        run_step(0);
                }
 
+#ifdef TRAVEL
+               /* Traveling */
+               else if (travel.run)
+               {
+                       /* Take a step */
+                       travel_step();
+               }
+#endif
+
                /* Repeated command */
                else if (command_rep)
                {
@@ -5989,6 +6067,9 @@ msg_print("
                        break;
                }
 
+               /* Sniper */
+               if (energy_use && reset_concent) reset_concentration(TRUE);
+
                /* Handle "leaving" */
                if (p_ptr->leaving) break;
        }
@@ -6072,6 +6153,8 @@ static void dungeon(bool load_game)
                if (record_maxdepth) do_cmd_write_nikki(NIKKI_MAXDEAPTH, dun_level, NULL);
        }
 
+       (void)calculate_upkeep();
+
        /* Validate the panel */
        panel_bounds_center();
 
@@ -6271,8 +6354,15 @@ msg_print("
 
                /* Count game turns */
                turn++;
-               if (!p_ptr->wild_mode || wild_regen) dungeon_turn++;
-               else if (p_ptr->wild_mode && !(turn % ((MAX_HGT + MAX_WID) / 2))) dungeon_turn++;
+
+               if (dungeon_turn < dungeon_turn_limit)
+               {
+                       if (!p_ptr->wild_mode || wild_regen) dungeon_turn++;
+                       else if (p_ptr->wild_mode && !(turn % ((MAX_HGT + MAX_WID) / 2))) dungeon_turn++;
+               }
+
+               prevent_turn_overflow();
+
                if (wild_regen) wild_regen--;
        }
 
@@ -6513,6 +6603,13 @@ void play_game(bool new_game)
        }
 #endif
 
+       if (browsing_movie)
+       {
+               reset_visuals();
+               browse_movie();
+               return;
+       }
+
        hack_mutation = FALSE;
 
        /* Hack -- Character is "icky" */
@@ -6626,6 +6723,8 @@ quit("
                quit(0);
        }
 
+       creating_savefile = new_game;
+
        /* Nothing loaded */
        if (!character_loaded)
        {
@@ -6740,6 +6839,8 @@ quit("
                }
        }
 
+       creating_savefile = FALSE;
+
        p_ptr->teleport_town = FALSE;
        p_ptr->sutemi = FALSE;
        world_monster = FALSE;
@@ -6917,6 +7018,9 @@ prt("
                m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED();
        }
 
+       (void)combine_and_reorder_home(STORE_HOME);
+       (void)combine_and_reorder_home(STORE_MUSEUM);
+
        /* Process */
        while (TRUE)
        {
@@ -6926,9 +7030,14 @@ prt("
                /* Handle "p_ptr->notice" */
                notice_stuff();
 
+               /* Hack -- prevent "icky" message */
+               character_xtra = TRUE;
+
                /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */
                handle_stuff();
 
+               character_xtra = FALSE;
+
                /* Cancel the target */
                target_who = 0;
 
@@ -7147,3 +7256,47 @@ s32b turn_real(s32b hoge)
                return hoge;
        }
 }
+
+/*
+ * ¥¿¡¼¥ó¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ËÂФ¹¤ëÂнè
+ * ¥¿¡¼¥óµÚ¤Ó¥¿¡¼¥ó¤òµ­Ï¿¤¹¤ëÊÑ¿ô¤ò¥¿¡¼¥ó¤Î¸Â³¦¤Î1ÆüÁ°¤Þ¤Ç´¬¤­Ì᤹.
+ */
+void prevent_turn_overflow(void)
+{
+       int rollback_days, i, j;
+       s32b rollback_turns;
+
+       if (turn < turn_limit) return;
+
+       rollback_days = 1 + (turn - turn_limit) / (TURNS_PER_TICK * TOWN_DAWN);
+       rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days;
+
+       if (turn > rollback_turns) turn -= rollback_turns;
+       else turn = 1; /* Paranoia */
+       if (old_turn > rollback_turns) old_turn -= rollback_turns;
+       else old_turn = 1;
+       if (old_battle > rollback_turns) old_battle -= rollback_turns;
+       else old_battle = 1;
+       if (p_ptr->feeling_turn > rollback_turns) p_ptr->feeling_turn -= rollback_turns;
+       else p_ptr->feeling_turn = 1;
+
+       for (i = 1; i < max_towns; i++)
+       {
+               for (j = 0; j < MAX_STORES; j++)
+               {
+                       store_type *st_ptr = &town[i].store[j];
+
+                       if (st_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS)
+                       {
+                               st_ptr->last_visit -= rollback_turns;
+                               if (st_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS) st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
+                       }
+
+                       if (st_ptr->store_open)
+                       {
+                               st_ptr->store_open -= rollback_turns;
+                               if (st_ptr->store_open < 1) st_ptr->store_open = 1;
+                       }
+               }
+       }
+}