OSDN Git Service

Merge pull request #1017 from shimitei/feature/#1010_active_main_window
authorshimitei <shimitei@gmail.com>
Wed, 5 May 2021 04:53:54 +0000 (13:53 +0900)
committerGitHub <noreply@github.com>
Wed, 5 May 2021 04:53:54 +0000 (13:53 +0900)
[Fix] タスク切り替え時にメインウインドウをアクティブにする

123 files changed:
Hengband/Hengband/Hengband.vcxproj
Hengband/Hengband/Hengband.vcxproj.filters
lib/edit/v_info.txt
src/Makefile.am
src/action/action-limited.cpp
src/action/weapon-shield.cpp
src/artifact/fixed-art-generator.cpp
src/birth/game-play-initializer.cpp
src/birth/inventory-initializer.cpp
src/cmd-action/cmd-attack.cpp
src/cmd-item/cmd-destroy.cpp
src/cmd-item/cmd-eat.cpp
src/cmd-item/cmd-equipment.cpp
src/cmd-item/cmd-smith.cpp
src/cmd-item/cmd-throw.cpp
src/cmd-item/cmd-usestaff.cpp
src/cmd-visual/cmd-visuals.cpp
src/combat/shoot.cpp
src/core/object-compressor.cpp
src/dungeon/dungeon-flag-mask.h [new file with mode: 0644]
src/dungeon/dungeon-flag-types.h
src/dungeon/dungeon.h
src/dungeon/quest-completion-checker.cpp
src/dungeon/quest.cpp
src/effect/effect-feature.cpp
src/effect/effect-monster.cpp
src/flavor/flavor-util.cpp
src/floor/cave-generator.cpp
src/floor/fixed-map-generator.cpp
src/floor/floor-events.cpp
src/floor/floor-generator.cpp
src/floor/floor-object.cpp
src/floor/floor-streams.cpp
src/floor/floor-util.cpp
src/floor/wild.cpp
src/grid/door.cpp
src/grid/feature-generator.cpp
src/grid/feature.cpp
src/grid/grid.cpp
src/grid/object-placer.cpp
src/info-reader/dungeon-info-tokens-table.cpp
src/info-reader/dungeon-info-tokens-table.h
src/info-reader/dungeon-reader.cpp
src/inventory/inventory-object.cpp
src/io/input-key-processor.cpp
src/knowledge/knowledge-items.cpp
src/knowledge/knowledge-quests.cpp
src/load/inventory-loader.cpp
src/load/store-loader.cpp
src/market/bounty.cpp
src/market/building-craft-weapon.cpp
src/melee/melee-spell-flags-checker.cpp
src/melee/melee-spell-util.cpp
src/melee/monster-attack-monster.cpp
src/mind/mind-archer.cpp
src/mind/mind-chaos-warrior.cpp
src/mind/mind-hobbit.cpp
src/mind/mind-mage.cpp
src/mind/mind-ninja.cpp
src/monster-attack/monster-attack-player.cpp
src/monster-attack/monster-attack-processor.cpp
src/monster-attack/monster-eating.cpp
src/monster-floor/monster-death.cpp
src/monster-floor/monster-lite.cpp
src/monster-floor/monster-object.cpp
src/monster-floor/monster-summon.cpp
src/monster-floor/special-death-switcher.cpp
src/monster/monster-list.cpp
src/monster/monster-status.cpp
src/monster/monster-update.cpp
src/monster/monster-util.cpp
src/mspell/mspell-attack.cpp
src/mspell/mspell-lite.cpp
src/object-use/quaff-execution.cpp
src/object/object-generator.cpp [deleted file]
src/object/object-generator.h [deleted file]
src/object/warning.cpp
src/perception/object-perception.cpp
src/player/player-move.cpp
src/racial/racial-android.cpp
src/racial/racial-vampire.cpp
src/realm/realm-hissatsu.cpp
src/realm/realm-nature.cpp
src/room/cave-filler.cpp
src/room/room-generator.cpp
src/room/rooms-builder.cpp
src/room/rooms-fractal.cpp
src/room/rooms-maze-vault.cpp
src/room/rooms-normal.cpp
src/room/rooms-special.cpp
src/room/rooms-trap.cpp
src/room/rooms-vault.cpp
src/room/space-finder.cpp
src/save/save.cpp
src/specific-object/chest.cpp
src/specific-object/torch.cpp
src/spell-kind/earthquake.cpp
src/spell-kind/spells-detection.cpp
src/spell-kind/spells-enchant.cpp
src/spell-kind/spells-floor.cpp
src/spell-kind/spells-lite.cpp
src/spell/spells-object.cpp
src/spell/spells-status.cpp
src/store/cmd-store.cpp
src/store/home.cpp
src/store/purchase-order.cpp
src/store/rumor.cpp
src/store/sell-order.cpp
src/store/store-util.cpp
src/store/store.cpp
src/system/object-type-definition.cpp [new file with mode: 0644]
src/system/object-type-definition.h
src/system/player-type-definition.h
src/util/flag-group.h
src/view/display-characteristic.cpp
src/view/object-describer.cpp
src/window/display-sub-windows.cpp
src/wizard/fixed-artifacts-spoiler.cpp
src/wizard/items-spoiler.cpp
src/wizard/wizard-item-modifier.cpp
src/wizard/wizard-special-process.cpp
src/wizard/wizard-spoiler.cpp
src/world/world-object.cpp

index 872c625..3b08974 100644 (file)
     <ClCompile Include="..\..\src\store\sell-order.cpp" />\r
     <ClCompile Include="..\..\src\store\service-checker.cpp" />\r
     <ClCompile Include="..\..\src\system\angband-version.cpp" />\r
+    <ClCompile Include="..\..\src\system\object-type-definition.cpp" />\r
     <ClCompile Include="..\..\src\system\player-type-definition.cpp" />\r
     <ClCompile Include="..\..\src\target\grid-selector.cpp" />\r
     <ClCompile Include="..\..\src\target\projection-path-calculator.cpp" />\r
     <ClCompile Include="..\..\src\object\object-stack.cpp" />\r
     <ClCompile Include="..\..\src\object\object-value-calc.cpp" />\r
     <ClCompile Include="..\..\src\perception\object-perception.cpp" />\r
-    <ClCompile Include="..\..\src\object\object-generator.cpp" />\r
     <ClCompile Include="..\..\src\object\object-value.cpp" />\r
     <ClCompile Include="..\..\src\pet\pet-fall-off.cpp" />\r
     <ClCompile Include="..\..\src\mspell\mspell-floor.cpp" />\r
     <ClInclude Include="..\..\src\cmd-action\cmd-tunnel.h" />\r
     <ClInclude Include="..\..\src\action\movement-execution.h" />\r
     <ClInclude Include="..\..\src\core\score-util.h" />\r
+    <ClInclude Include="..\..\src\dungeon\dungeon-flag-mask.h" />\r
     <ClInclude Include="..\..\src\main-win\commandline-win.h" />\r
     <ClInclude Include="..\..\src\main-win\graphics-win.h" />\r
     <ClInclude Include="..\..\src\object-enchant\apply-magic-amulet.h" />\r
     <ClInclude Include="..\..\src\object\object-stack.h" />\r
     <ClInclude Include="..\..\src\object\object-value-calc.h" />\r
     <ClInclude Include="..\..\src\perception\object-perception.h" />\r
-    <ClInclude Include="..\..\src\object\object-generator.h" />\r
     <ClInclude Include="..\..\src\object\object-value.h" />\r
     <ClInclude Include="..\..\src\pet\pet-fall-off.h" />\r
     <ClInclude Include="..\..\src\pet\pet-util.h" />\r
index c31ae09..cb80056 100644 (file)
     <ClCompile Include="..\..\src\world\world-object.cpp">\r
       <Filter>world</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\src\object\object-generator.cpp">\r
-      <Filter>object</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\src\object-enchant\object-boost.cpp">\r
       <Filter>object-enchant</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\src\object-enchant\apply-magic-amulet.cpp">\r
       <Filter>object-enchant</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\src\system\object-type-definition.cpp">\r
+      <Filter>system</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="..\..\src\combat\shoot.h">\r
     <ClInclude Include="..\..\src\world\world-object.h">\r
       <Filter>world</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\src\object\object-generator.h">\r
-      <Filter>object</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\src\sv-definition\sv-armor-types.h">\r
       <Filter>sv-definition</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\src\object-enchant\apply-magic-amulet.h">\r
       <Filter>object-enchant</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\src\dungeon\dungeon-flag-mask.h">\r
+      <Filter>dungeon</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <None Include="..\..\src\wall.bmp" />\r
index 8450158..2c88ee5 100644 (file)
@@ -3096,12 +3096,12 @@ N:132:Fixed room4
 X:17:8:10:10
 D:   %%%%   
 D:  %%##%%  
-D: %%.. .%% 
-D:%%.#. #.%%
+D: %%....%% 
+D:%%.#..#.%%
 D:%#..##..#%
 D:%#..##..#%
-D:%%.#. #.%%
-D: %%.. .%% 
+D:%%.#..#.%%
+D: %%....%% 
 D:  %%##%%  
 D:   %%%%   
 
index b595748..53a3279 100644 (file)
@@ -164,6 +164,7 @@ hengband_SOURCES = \
        core/window-redrawer.cpp core/window-redrawer.h \
        \
        dungeon/dungeon.cpp dungeon/dungeon.h \
+       dungeon/dungeon-flag-mask.h \
        dungeon/dungeon-flag-types.h \
        dungeon/dungeon-processor.cpp dungeon/dungeon-processor.h \
        dungeon/quest.h dungeon/quest.cpp \
@@ -542,7 +543,6 @@ hengband_SOURCES = \
        object/item-tester-hooker.cpp object/item-tester-hooker.h \
        object/object-broken.cpp object/object-broken.h \
        object/object-flags.cpp object/object-flags.h \
-       object/object-generator.cpp object/object-generator.h \
        object/object-info.cpp object/object-info.h \
        object/object-kind.cpp object/object-kind.h \
        object/object-kind-hook.cpp object/object-kind-hook.h \
@@ -833,7 +833,7 @@ hengband_SOURCES = \
        system/h-define.h system/h-system.h system/h-type.h \
        system/monster-race-definition.h \
        system/monster-type-definition.h \
-       system/object-type-definition.h \
+       system/object-type-definition.cpp system/object-type-definition.h \
        system/player-type-definition.cpp system/player-type-definition.h \
        system/system-variables.cpp system/system-variables.h \
        system/gamevalue.h \
index 8f87f1b..50ec67e 100644 (file)
@@ -22,7 +22,7 @@
  */
 bool cmd_limit_cast(player_type *creature_ptr)
 {
-    if (is_in_dungeon(creature_ptr) && (d_info[creature_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC)) {
+    if (is_in_dungeon(creature_ptr) && (d_info[creature_ptr->dungeon_idx].flags.has(DF::NO_MAGIC))) {
         msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
         msg_print(NULL);
         return TRUE;
index 696be76..f9d2888 100644 (file)
@@ -10,7 +10,6 @@
 #include "inventory/inventory-slot-types.h"
 #include "object-hook/hook-checker.h"
 #include "object-hook/hook-weapon.h"
-#include "object/object-generator.h"
 #include "player-info/equipment-info.h"
 #include "player-status/player-hand-types.h"
 #include "system/object-type-definition.h"
@@ -41,7 +40,7 @@ void verify_equip_slot(player_type *owner_ptr, INVENTORY_IDX item)
         }
 
         new_o_ptr = &owner_ptr->inventory_list[INVEN_MAIN_HAND];
-        object_copy(new_o_ptr, o_ptr);
+        new_o_ptr->copy_from(o_ptr);
         inven_item_increase(owner_ptr, INVEN_SUB_HAND, -((int)o_ptr->number));
         inven_item_optimize(owner_ptr, INVEN_SUB_HAND);
         if (object_allow_two_hands_wielding(o_ptr) && can_two_hands_wielding(owner_ptr))
@@ -69,7 +68,7 @@ void verify_equip_slot(player_type *owner_ptr, INVENTORY_IDX item)
         return;
 
     new_o_ptr = &owner_ptr->inventory_list[INVEN_SUB_HAND];
-    object_copy(new_o_ptr, o_ptr);
+    new_o_ptr->copy_from(o_ptr);
     inven_item_increase(owner_ptr, INVEN_MAIN_HAND, -((int)o_ptr->number));
     inven_item_optimize(owner_ptr, INVEN_MAIN_HAND);
     msg_format(_("%sを持ち替えた。", "You switched hand of %s."), o_name);
index b83a8a2..b0213bc 100644 (file)
@@ -20,7 +20,6 @@
 #include "object-enchant/tr-types.h"
 #include "object-enchant/trc-types.h"
 #include "object-enchant/trg-types.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "object/object-kind.h"
 #include "player/player-sex.h"
@@ -247,7 +246,7 @@ bool create_named_art(player_type *player_ptr, ARTIFACT_IDX a_idx, POSITION y, P
 
     object_type forge;
     auto q_ptr = &forge;
-    object_prep(player_ptr, q_ptr, i);
+    q_ptr->prep(player_ptr, i);
     q_ptr->name1 = a_idx;
 
     (void)apply_artifact(player_ptr, q_ptr);
@@ -378,7 +377,7 @@ bool make_artifact_special(player_type *player_ptr, object_type *o_ptr)
 
         /*! @note 前述の条件を満たしたら、後のIDのアーティファクトはチェックせずすぐ確定し生成処理に移す /
          * Assign the template. Mega-Hack -- mark the item as an artifact. Hack: Some artifacts get random extra powers. Success. */
-        object_prep(player_ptr, o_ptr, k_idx);
+        o_ptr->prep(player_ptr, k_idx);
 
         o_ptr->name1 = i;
         return true;
index e91262f..0c82b86 100644 (file)
@@ -10,7 +10,6 @@
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags1.h"
 #include "monster-race/race-flags7.h"
-#include "object/object-generator.h"
 #include "object/object-kind.h"
 #include "pet/pet-util.h"
 #include "player/digestion-processor.h"
@@ -78,7 +77,7 @@ void player_wipe_without_name(player_type *creature_ptr)
     creature_ptr->inven_cnt = 0;
     creature_ptr->equip_cnt = 0;
     for (int i = 0; i < INVEN_TOTAL; i++)
-        object_wipe(&creature_ptr->inventory_list[i]);
+        (&creature_ptr->inventory_list[i])->wipe();
 
     for (int i = 0; i < max_a_idx; i++) {
         artifact_type *a_ptr = &a_info[i];
index 6116f5b..2a05957 100644 (file)
@@ -10,7 +10,6 @@
 #include "object-enchant/apply-magic.h"
 #include "object-enchant/item-apply-magic.h"
 #include "object-enchant/object-ego.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-kind-hook.h"
 #include "object/object-kind.h"
@@ -53,7 +52,7 @@ void wield_all(player_type *creature_ptr)
 
         object_type *i_ptr;
         i_ptr = &object_type_body;
-        object_copy(i_ptr, o_ptr);
+        i_ptr->copy_from(o_ptr);
         i_ptr->number = 1;
 
         if (item >= 0) {
@@ -65,7 +64,7 @@ void wield_all(player_type *creature_ptr)
         }
 
         o_ptr = &creature_ptr->inventory_list[slot];
-        object_copy(o_ptr, i_ptr);
+        o_ptr->copy_from(i_ptr);
         creature_ptr->equip_cnt++;
     }
 }
@@ -95,7 +94,7 @@ static void decide_initial_items(player_type *creature_ptr, object_type *q_ptr)
         /* Demon can drain vitality from humanoid corpse */
         get_mon_num_prep(creature_ptr, monster_hook_human, NULL);
         for (int i = rand_range(3, 4); i > 0; i--) {
-            object_prep(creature_ptr, q_ptr, lookup_kind(TV_CORPSE, SV_CORPSE));
+            q_ptr->prep(creature_ptr, lookup_kind(TV_CORPSE, SV_CORPSE));
             q_ptr->pval = get_mon_num(creature_ptr, 0, 2, 0);
             if (q_ptr->pval) {
                 q_ptr->number = 1;
@@ -109,26 +108,26 @@ static void decide_initial_items(player_type *creature_ptr, object_type *q_ptr)
     case RACE_ZOMBIE:
     case RACE_SPECTRE:
         /* Staff (of Nothing) */
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_STAFF, SV_STAFF_NOTHING));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_STAFF, SV_STAFF_NOTHING));
         q_ptr->number = 1;
         add_outfit(creature_ptr, q_ptr);
         break;
     case RACE_ENT:
         /* Potions of Water */
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_POTION, SV_POTION_WATER));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_POTION, SV_POTION_WATER));
         q_ptr->number = (ITEM_NUMBER)rand_range(15, 23);
         add_outfit(creature_ptr, q_ptr);
         break;
     case RACE_ANDROID:
         /* Flasks of oil */
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_FLASK, SV_ANY));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_FLASK, SV_ANY));
         apply_magic_to_object(creature_ptr, q_ptr, 1, AM_NO_FIXED_ART);
         q_ptr->number = (ITEM_NUMBER)rand_range(7, 12);
         add_outfit(creature_ptr, q_ptr);
         break;
     default:
         /* Food rations */
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
         q_ptr->number = (ITEM_NUMBER)rand_range(3, 7);
         add_outfit(creature_ptr, q_ptr);
     }
@@ -148,11 +147,11 @@ void player_outfit(player_type *creature_ptr)
     q_ptr = &forge;
 
     if ((creature_ptr->prace == RACE_VAMPIRE) && (creature_ptr->pclass != CLASS_NINJA)) {
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_SCROLL, SV_SCROLL_DARKNESS));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_SCROLL, SV_SCROLL_DARKNESS));
         q_ptr->number = (ITEM_NUMBER)rand_range(2, 5);
         add_outfit(creature_ptr, q_ptr);
     } else if (creature_ptr->pclass != CLASS_NINJA) {
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_LITE, SV_LITE_TORCH));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_LITE, SV_LITE_TORCH));
         q_ptr->number = (ITEM_NUMBER)rand_range(3, 7);
         q_ptr->xtra4 = rand_range(3, 7) * 500;
 
@@ -161,73 +160,73 @@ void player_outfit(player_type *creature_ptr)
 
     q_ptr = &forge;
     if (creature_ptr->prace == RACE_MERFOLK) {
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_RING, SV_RING_LEVITATION_FALL));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_RING, SV_RING_LEVITATION_FALL));
         q_ptr->number = 1;
         add_outfit(creature_ptr, q_ptr);
     }
 
     if ((creature_ptr->pclass == CLASS_RANGER) || (creature_ptr->pclass == CLASS_CAVALRY)) {
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_ARROW, SV_AMMO_NORMAL));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_ARROW, SV_AMMO_NORMAL));
         q_ptr->number = (byte)rand_range(15, 20);
         add_outfit(creature_ptr, q_ptr);
     }
 
     if (creature_ptr->pclass == CLASS_RANGER) {
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_BOW, SV_SHORT_BOW));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_BOW, SV_SHORT_BOW));
         add_outfit(creature_ptr, q_ptr);
     } else if (creature_ptr->pclass == CLASS_ARCHER) {
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_ARROW, SV_AMMO_NORMAL));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_ARROW, SV_AMMO_NORMAL));
         q_ptr->number = (ITEM_NUMBER)rand_range(15, 20);
         add_outfit(creature_ptr, q_ptr);
     } else if (creature_ptr->pclass == CLASS_HIGH_MAGE || creature_ptr->pclass == CLASS_ELEMENTALIST) {
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_WAND, SV_WAND_MAGIC_MISSILE));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_WAND, SV_WAND_MAGIC_MISSILE));
         q_ptr->number = 1;
         q_ptr->pval = (PARAMETER_VALUE)rand_range(25, 30);
         add_outfit(creature_ptr, q_ptr);
     } else if (creature_ptr->pclass == CLASS_SORCERER) {
         int book_tval;
         for (book_tval = TV_LIFE_BOOK; book_tval <= TV_LIFE_BOOK + static_cast<int>(MAX_MAGIC) - 1; book_tval++) {
-            object_prep(creature_ptr, q_ptr, lookup_kind(static_cast<tval_type>(book_tval), 0));
+            q_ptr->prep(creature_ptr, lookup_kind(static_cast<tval_type>(book_tval), 0));
             q_ptr->number = 1;
             add_outfit(creature_ptr, q_ptr);
         }
     } else if (creature_ptr->pclass == CLASS_TOURIST) {
         if (creature_ptr->pseikaku != PERSONALITY_SEXY) {
-            object_prep(creature_ptr, q_ptr, lookup_kind(TV_SHOT, SV_AMMO_LIGHT));
+            q_ptr->prep(creature_ptr, lookup_kind(TV_SHOT, SV_AMMO_LIGHT));
             q_ptr->number = rand_range(15, 20);
             add_outfit(creature_ptr, q_ptr);
         }
 
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_FOOD, SV_FOOD_BISCUIT));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_FOOD, SV_FOOD_BISCUIT));
         q_ptr->number = rand_range(2, 4);
 
         add_outfit(creature_ptr, q_ptr);
 
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_FOOD, SV_FOOD_WAYBREAD));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_FOOD, SV_FOOD_WAYBREAD));
         q_ptr->number = rand_range(2, 4);
 
         add_outfit(creature_ptr, q_ptr);
 
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_FOOD, SV_FOOD_JERKY));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_FOOD, SV_FOOD_JERKY));
         q_ptr->number = rand_range(1, 3);
 
         add_outfit(creature_ptr, q_ptr);
 
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_FOOD, SV_FOOD_PINT_OF_ALE));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_FOOD, SV_FOOD_PINT_OF_ALE));
         q_ptr->number = rand_range(2, 4);
 
         add_outfit(creature_ptr, q_ptr);
 
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_FOOD, SV_FOOD_PINT_OF_WINE));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_FOOD, SV_FOOD_PINT_OF_WINE));
         q_ptr->number = rand_range(2, 4);
 
         add_outfit(creature_ptr, q_ptr);
     } else if (creature_ptr->pclass == CLASS_NINJA) {
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_SPIKE, 0));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_SPIKE, 0));
         q_ptr->number = rand_range(15, 20);
         add_outfit(creature_ptr, q_ptr);
     } else if (creature_ptr->pclass == CLASS_SNIPER) {
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_BOLT, SV_AMMO_NORMAL));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_BOLT, SV_AMMO_NORMAL));
         q_ptr->number = rand_range(15, 20);
         add_outfit(creature_ptr, q_ptr);
     }
@@ -260,7 +259,7 @@ void player_outfit(player_type *creature_ptr)
         }
 
         q_ptr = &forge;
-        object_prep(creature_ptr, q_ptr, lookup_kind(static_cast<tval_type>(tv), sv));
+        q_ptr->prep(creature_ptr, lookup_kind(static_cast<tval_type>(tv), sv));
         if ((tv == TV_SWORD || tv == TV_HAFTED)
             && (creature_ptr->pclass == CLASS_ROGUE && creature_ptr->realm1 == REALM_DEATH)) /* Only assassins get a poisoned weapon */
             q_ptr->name2 = EGO_BRAND_POIS;
index c4c599e..1d77d73 100644 (file)
@@ -200,7 +200,7 @@ bool do_cmd_attack(player_type *attacker_ptr, POSITION y, POSITION x, combat_opt
         }
     }
 
-    if (d_info[attacker_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) {
+    if (d_info[attacker_ptr->dungeon_idx].flags.has(DF::NO_MELEE)) {
         msg_print(_("なぜか攻撃することができない。", "Something prevents you from attacking."));
         return FALSE;
     }
index c388c3c..ef358da 100644 (file)
@@ -17,7 +17,6 @@
 #include "object-hook/hook-expendable.h"
 #include "object-hook/hook-magic.h"
 #include "object/item-use-flags.h"
-#include "object/object-generator.h"
 #include "object/object-stack.h"
 #include "object/object-value.h"
 #include "player-info/avatar.h"
@@ -176,7 +175,7 @@ static void process_destroy_magic_book(player_type *creature_ptr, destroy_type *
 
 static void exe_destroy_item(player_type *creature_ptr, destroy_type *destroy_ptr)
 {
-    object_copy(destroy_ptr->q_ptr, destroy_ptr->o_ptr);
+    destroy_ptr->q_ptr->copy_from(destroy_ptr->o_ptr);
     msg_format(_("%sを壊した。", "You destroy %s."), destroy_ptr->o_name);
     sound(SOUND_DESTITEM);
     reduce_charges(destroy_ptr->o_ptr, destroy_ptr->amt);
index 08459b9..43c926d 100644 (file)
@@ -19,7 +19,6 @@
 #include "object-hook/hook-expendable.h"
 #include "object/item-tester-hooker.h"
 #include "object/item-use-flags.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-kind-hook.h"
 #include "object/object-kind.h"
@@ -224,7 +223,7 @@ bool exe_eat_charge_of_magic_device(player_type *creature_ptr, object_type *o_pt
             object_type forge;
             object_type *q_ptr;
             q_ptr = &forge;
-            object_copy(q_ptr, o_ptr);
+            q_ptr->copy_from(o_ptr);
 
             /* Modify quantity */
             q_ptr->number = 1;
@@ -329,7 +328,7 @@ void exe_eat_food(player_type *creature_ptr, INVENTORY_IDX item)
             object_type *q_ptr = &forge;
 
             msg_print(_("食べ物がアゴを素通りして落ちた!", "The food falls through your jaws!"));
-            object_prep(creature_ptr, q_ptr, lookup_kind(o_ptr->tval, o_ptr->sval));
+            q_ptr->prep(creature_ptr, lookup_kind(o_ptr->tval, o_ptr->sval));
 
             /* Drop the object from heaven */
             (void)drop_near(creature_ptr, q_ptr, -1, creature_ptr->y, creature_ptr->x);
index 890d46c..92af737 100644 (file)
@@ -25,7 +25,6 @@
 #include "object-hook/hook-weapon.h"
 #include "object/item-tester-hooker.h"
 #include "object/item-use-flags.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-mark-types.h"
 #include "perception/object-perception.h"
@@ -214,9 +213,9 @@ void do_cmd_wield(player_type *creature_ptr)
         object_type *otmp_ptr = &object_tmp;
         GAME_TEXT switch_name[MAX_NLEN];
         describe_flavor(creature_ptr, switch_name, switch_o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
-        object_copy(otmp_ptr, switch_o_ptr);
-        object_copy(switch_o_ptr, slot_o_ptr);
-        object_copy(slot_o_ptr, otmp_ptr);
+        otmp_ptr->copy_from(switch_o_ptr);
+        switch_o_ptr->copy_from(slot_o_ptr);
+        slot_o_ptr->copy_from(otmp_ptr);
         msg_format(_("%sを%sに構えなおした。", "You wield %s at %s hand."), switch_name,
             (slot == INVEN_MAIN_HAND) ? (left_hander ? _("左手", "left") : _("右手", "right")) : (left_hander ? _("右手", "right") : _("左手", "left")));
         slot = need_switch_wielding;
@@ -230,7 +229,7 @@ void do_cmd_wield(player_type *creature_ptr)
 
     PlayerEnergy(creature_ptr).set_player_turn_energy(100);
     q_ptr = &forge;
-    object_copy(q_ptr, o_ptr);
+    q_ptr->copy_from(o_ptr);
     q_ptr->number = 1;
     if (item >= 0) {
         inven_item_increase(creature_ptr, item, -1);
@@ -244,7 +243,7 @@ void do_cmd_wield(player_type *creature_ptr)
     if (o_ptr->k_idx)
         (void)inven_takeoff(creature_ptr, slot, 255);
 
-    object_copy(o_ptr, q_ptr);
+    o_ptr->copy_from(q_ptr);
     o_ptr->marked |= OM_TOUCHED;
     creature_ptr->equip_cnt++;
 
index 58718af..33b0548 100644 (file)
@@ -29,7 +29,6 @@
 #include "object/item-tester-hooker.h"
 #include "object/item-use-flags.h"
 #include "object/object-flags.h" //!< @todo 相互参照している.
-#include "object/object-generator.h"
 #include "perception/object-perception.h"
 #include "player-status/player-energy.h"
 #include "system/object-type-definition.h"
@@ -333,7 +332,7 @@ static void drain_essence(player_type *creature_ptr)
     marked = o_ptr->marked;
     number = o_ptr->number;
 
-    object_prep(creature_ptr, o_ptr, o_ptr->k_idx);
+    o_ptr->prep(creature_ptr, o_ptr->k_idx);
 
     o_ptr->iy = iy;
     o_ptr->ix = ix;
index dcbad05..4ea9716 100644 (file)
@@ -40,7 +40,6 @@
 #include "object/item-use-flags.h"
 #include "object/object-broken.h"
 #include "object/object-flags.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-kind.h"
 #include "object/object-stack.h"
@@ -137,7 +136,7 @@ static bool check_can_throw(player_type *creature_ptr, it_type *it_ptr)
 
 static void calc_throw_range(player_type *creature_ptr, it_type *it_ptr)
 {
-    object_copy(it_ptr->q_ptr, it_ptr->o_ptr);
+    it_ptr->q_ptr->copy_from(it_ptr->o_ptr);
     object_flags(creature_ptr, it_ptr->q_ptr, it_ptr->obj_flags);
     torch_flags(it_ptr->q_ptr, it_ptr->obj_flags);
     distribute_charges(it_ptr->o_ptr, it_ptr->q_ptr, 1);
@@ -482,7 +481,7 @@ static void process_boomerang_back(player_type *creature_ptr, it_type *it_ptr)
         }
 
         it_ptr->o_ptr = &creature_ptr->inventory_list[it_ptr->item];
-        object_copy(it_ptr->o_ptr, it_ptr->q_ptr);
+        it_ptr->o_ptr->copy_from(it_ptr->q_ptr);
         creature_ptr->equip_cnt++;
         creature_ptr->update |= PU_BONUS | PU_TORCH | PU_MANA;
         creature_ptr->window_flags |= PW_EQUIP;
index de2d065..aaa16bb 100644 (file)
@@ -12,7 +12,6 @@
 #include "monster-floor/place-monster-types.h"
 #include "object-enchant/special-object-flags.h"
 #include "object/item-use-flags.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-kind.h"
 #include "perception/object-perception.h"
@@ -402,7 +401,7 @@ void exe_use_staff(player_type *creature_ptr, INVENTORY_IDX item)
         object_type forge;
         object_type *q_ptr;
         q_ptr = &forge;
-        object_copy(q_ptr, o_ptr);
+        q_ptr->copy_from(o_ptr);
 
         /* Modify quantity */
         q_ptr->number = 1;
index 410d868..84f1983 100644 (file)
@@ -15,7 +15,6 @@
 #include "knowledge/lighting-level-table.h"
 #include "main/sound-of-music.h"
 #include "monster-race/monster-race.h"
-#include "object/object-generator.h"
 #include "object/object-kind.h"
 #include "system/monster-race-definition.h"
 #include "system/object-type-definition.h"
@@ -154,9 +153,9 @@ void do_cmd_visuals(player_type *creature_ptr)
                 if (!k_ptr->flavor) {
                     strip_name(o_name, k_idx);
                 } else {
-                    object_type forge;
-                    object_prep(creature_ptr, &forge, k_idx);
-                    describe_flavor(creature_ptr, o_name, &forge, OD_FORCE_FLAVOR);
+                    object_type dummy;
+                    dummy.prep(creature_ptr, k_idx);
+                    describe_flavor(creature_ptr, o_name, &dummy, OD_FORCE_FLAVOR);
                 }
 
                 auto_dump_printf(auto_dump_stream, "# %s\n", o_name);
index f134d09..2f4c867 100644 (file)
@@ -42,7 +42,6 @@
 #include "object-hook/hook-enchant.h"
 #include "object/object-broken.h"
 #include "object/object-flags.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-kind.h"
 #include "object/object-mark-types.h"
@@ -507,7 +506,7 @@ void exe_fire(player_type *shooter_ptr, INVENTORY_IDX item, object_type *j_ptr,
         y = shooter_ptr->y;
         x = shooter_ptr->x;
         q_ptr = &forge;
-        object_copy(q_ptr, o_ptr);
+        q_ptr->copy_from(o_ptr);
 
         /* Single object */
         q_ptr->number = 1;
@@ -852,7 +851,7 @@ void exe_fire(player_type *shooter_ptr, INVENTORY_IDX item, object_type *j_ptr,
             }
 
             o_ptr = &shooter_ptr->current_floor_ptr->o_list[o_idx];
-            object_copy(o_ptr, q_ptr);
+            o_ptr->copy_from(q_ptr);
 
             /* Forget mark */
             reset_bits(o_ptr->marked, OM_TOUCHED);
index 824e6b0..8e8a9ec 100644 (file)
@@ -6,7 +6,6 @@
 #include "grid/grid.h"
 #include "object-hook/hook-checker.h"
 #include "object-hook/hook-enchant.h"
-#include "object/object-generator.h"
 #include "object/object-kind.h"
 #include "system/floor-type-definition.h"
 #include "system/monster-type-definition.h"
@@ -35,7 +34,7 @@ static void compact_objects_aux(floor_type *floor_ptr, OBJECT_IDX i1, OBJECT_IDX
 
     // 要素番号i1のオブジェクトを要素番号i2に移動
     floor_ptr->o_list[i2] = floor_ptr->o_list[i1];
-    object_wipe(o_ptr);
+    o_ptr->wipe();
 }
 
 /*!
diff --git a/src/dungeon/dungeon-flag-mask.h b/src/dungeon/dungeon-flag-mask.h
new file mode 100644 (file)
index 0000000..55a9728
--- /dev/null
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "dungeon/dungeon-flag-types.h"
+#include "util/flag-group.h"
+
+inline const EnumClassFlagGroup<DF> DF_LAKE_MASK({ DF::LAKE_WATER, DF::LAKE_LAVA, DF::LAKE_RUBBLE, DF::LAKE_TREE, DF::LAKE_POISONOUS, DF::LAKE_ACID });
+inline const EnumClassFlagGroup<DF> DF_RIVER_MASK({ DF::WATER_RIVER, DF::LAVA_RIVER, DF::ACID_RIVER, DF::POISONOUS_RIVER });
index c0ce990..f219d20 100644 (file)
@@ -1,38 +1,37 @@
 #pragma once
 
-enum dungeon_flag_type {
-       DF1_WINNER = 0x00000001L,
-    DF1_MAZE = 0x00000002L,
-    DF1_SMALLEST = 0x00000004L,
-    DF1_BEGINNER = 0x00000008L,
-    DF1_BIG = 0x00000010L,
-    DF1_NO_DOORS = 0x00000020L,
-    DF1_WATER_RIVER = 0x00000040L,
-    DF1_LAVA_RIVER = 0x00000080L,
-    DF1_CURTAIN = 0x00000100L,
-    DF1_GLASS_DOOR = 0x00000200L,
-    DF1_CAVE = 0x00000400L,
-    DF1_CAVERN = 0x00000800L,
-    DF1_ARCADE = 0x00001000L,
-    DF1_LAKE_ACID = 0x00002000L,
-    DF1_LAKE_POISONOUS = 0x00004000L,
-    DF1_XXX15 = 0x00008000L,
-    DF1_FORGET = 0x00010000L,
-    DF1_LAKE_WATER = 0x00020000L,
-    DF1_LAKE_LAVA = 0x00040000L,
-    DF1_LAKE_RUBBLE = 0x00080000L,
-    DF1_LAKE_TREE = 0x00100000L,
-    DF1_NO_VAULT = 0x00200000L,
-    DF1_ARENA = 0x00400000L,
-    DF1_DESTROY = 0x00800000L,
-    DF1_GLASS_ROOM = 0x01000000L,
-    DF1_NO_CAVE = 0x02000000L,
-    DF1_NO_MAGIC = 0x04000000L,
-    DF1_NO_MELEE = 0x08000000L,
-    DF1_CHAMELEON = 0x10000000L,
-    DF1_DARKNESS = 0x20000000L,
-    DF1_ACID_RIVER = 0x40000000L,
-    DF1_POISONOUS_RIVER = 0x80000000L,
+enum class DF {
+    WINNER,
+    MAZE,
+    SMALLEST,
+    BEGINNER,
+    BIG,
+    NO_DOORS,
+    WATER_RIVER,
+    LAVA_RIVER,
+    CURTAIN,
+    GLASS_DOOR,
+    CAVE,
+    CAVERN,
+    ARCADE,
+    LAKE_ACID,
+    LAKE_POISONOUS,
+    NO_ROOM,
+    FORGET,
+    LAKE_WATER,
+    LAKE_LAVA,
+    LAKE_RUBBLE,
+    LAKE_TREE,
+    NO_VAULT,
+    ARENA,
+    DESTROY,
+    GLASS_ROOM,
+    NO_CAVE,
+    NO_MAGIC,
+    NO_MELEE,
+    CHAMELEON,
+    DARKNESS,
+    ACID_RIVER,
+    POISONOUS_RIVER,
+    MAX,
 };
-
-#define DF1_LAKE_MASK (DF1_LAKE_WATER | DF1_LAKE_LAVA | DF1_LAKE_RUBBLE | DF1_LAKE_TREE | DF1_LAKE_POISONOUS | DF1_LAKE_ACID)
index fd4f7a3..93d51ed 100644 (file)
@@ -3,6 +3,7 @@
 #include <string>
 #include <vector>
 
+#include "dungeon/dungeon-flag-types.h"
 #include "monster-race/race-ability-flags.h"
 #include "system/angband.h"
 #include "util/flag-group.h"
@@ -60,7 +61,7 @@ typedef struct dungeon_type {
        int min_m_alloc_level{};        /* Minimal number of monsters per level */
        int max_m_alloc_chance{};       /* There is a 1/max_m_alloc_chance chance per round of creating a new monster */
 
-       BIT_FLAGS flags1{};             /* Flags 1 */
+       EnumClassFlagGroup<DF> flags{}; /* Dungeon Flags */
 
        BIT_FLAGS mflags1{};            /* The monster flags that are allowed */
        BIT_FLAGS mflags2{};
index 5ad5633..eb5b527 100644 (file)
@@ -10,7 +10,6 @@
 #include "grid/grid.h"
 #include "monster/monster-info.h"
 #include "object-enchant/item-apply-magic.h"
-#include "object/object-generator.h"
 #include "system/floor-type-definition.h"
 #include "system/monster-type-definition.h"
 #include "system/object-type-definition.h"
@@ -173,7 +172,7 @@ void check_quest_completion(player_type *player_ptr, monster_type *m_ptr)
     object_type *o_ptr;
     for (int i = 0; i < (floor_ptr->dun_level / 15) + 1; i++) {
         o_ptr = &forge;
-        object_wipe(o_ptr);
+        o_ptr->wipe();
         make_object(player_ptr, o_ptr, AM_GOOD | AM_GREAT);
         (void)drop_near(player_ptr, o_ptr, -1, y, x);
     }
index 99345b0..badd57f 100644 (file)
@@ -25,7 +25,6 @@
 #include "monster/smart-learn-types.h"
 #include "object-enchant/item-apply-magic.h"
 #include "object-enchant/trg-types.h"
-#include "object/object-generator.h"
 #include "player-status/player-energy.h"
 #include "player/player-personality-types.h"
 #include "player/player-status.h"
index 2161988..f38c053 100644 (file)
@@ -317,7 +317,7 @@ bool affect_feature(player_type *caster_ptr, MONSTER_IDX who, POSITION r, POSITI
     }
     case GF_LITE_WEAK:
     case GF_LITE: {
-        if ((d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS) != 0)
+        if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
             break;
 
         g_ptr->info |= (CAVE_GLOW);
index bee2df7..d910440 100644 (file)
@@ -35,7 +35,6 @@
 #include "monster/monster-status.h"
 #include "monster/monster-update.h"
 #include "object-enchant/special-object-flags.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "player-info/avatar.h"
 #include "util/bit-flags-calculator.h"
@@ -591,7 +590,7 @@ static void postprocess_by_taking_photo(player_type *caster_ptr, effect_monster_
     object_type *q_ptr;
     object_type forge;
     q_ptr = &forge;
-    object_prep(caster_ptr, q_ptr, lookup_kind(TV_STATUE, SV_PHOTO));
+    q_ptr->prep(caster_ptr, lookup_kind(TV_STATUE, SV_PHOTO));
     q_ptr->pval = em_ptr->photo;
     q_ptr->ident |= (IDENT_FULL_KNOWN);
     (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
index e4b4032..dfd4f36 100644 (file)
@@ -74,24 +74,18 @@ char *object_desc_str(char *t, concptr s)
  * @param t 保管先文字列ポインタ
  * @param n コピーしたい数値
  * @details
- * Print an unsigned number "n" into a string "t", as if by
+ * Print an unsigned number "n" into a string "t", actually by
  * sprintf(t, "%u", n), and return a pointer to the terminator.
  */
 char *object_desc_num(char *t, uint n)
 {
-    /* loop */
-    uint p;
-    for (p = 1; n >= p * 10; p = p * 10)
-        ;
-
-    while (p >= 1) {
-        *t++ = '0' + n / p;
-        n = n % p;
-        p = p / 10;
+    int ret = sprintf(t, "%u", n);
+    if (ret < 0) {
+        // error
+        ret = 0;
+        *t = '\0';
     }
-
-    *t = '\0';
-    return t;
+    return t + ret;
 }
 
 /*!
index 47d8e76..3fc6f1a 100644 (file)
@@ -140,7 +140,7 @@ static void make_walls(player_type *player_ptr, dun_data_type *dd_ptr, dungeon_t
         g_ptr = &player_ptr->current_floor_ptr->grid_array[dd_ptr->tunnel_y][dd_ptr->tunnel_x];
         g_ptr->mimic = 0;
         place_grid(player_ptr, g_ptr, GB_FLOOR);
-        if ((randint0(100) < dt_ptr->dun_tun_pen) && !(d_ptr->flags1 & DF1_NO_DOORS))
+        if ((randint0(100) < dt_ptr->dun_tun_pen) && d_ptr->flags.has_not(DF::NO_DOORS))
             place_random_door(player_ptr, dd_ptr->tunnel_y, dd_ptr->tunnel_x, TRUE);
     }
 }
@@ -176,11 +176,27 @@ static void make_doors(player_type *player_ptr, dun_data_type *dd_ptr, dt_type *
     }
 }
 
+static void make_only_tunnel_points(floor_type *floor_ptr, dun_data_type *dd_ptr)
+{
+    int point_num = (floor_ptr->width * floor_ptr->height) / 200 + randint1(3);
+    dd_ptr->cent_n = point_num;
+    for (int i = 0; i < point_num; i++) {
+        dd_ptr->cent[i].y = randint0(floor_ptr->height);
+        dd_ptr->cent[i].x = randint0(floor_ptr->width);
+    }
+}
+
 static bool make_one_floor(player_type *player_ptr, dun_data_type *dd_ptr, dungeon_type *d_ptr)
 {
-    if (!generate_rooms(player_ptr, dd_ptr)) {
-        *dd_ptr->why = _("部屋群の生成に失敗", "Failed to generate rooms");
-        return FALSE;
+    floor_type *floor_ptr = player_ptr->current_floor_ptr;
+
+    if (d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_ROOM)) {
+        make_only_tunnel_points(floor_ptr, dd_ptr);
+    } else {
+        if (!generate_rooms(player_ptr, dd_ptr)) {
+            *dd_ptr->why = _("部屋群の生成に失敗", "Failed to generate rooms");
+            return FALSE;
+        }
     }
 
     place_cave_contents(player_ptr, dd_ptr, d_ptr);
@@ -205,7 +221,7 @@ static bool make_one_floor(player_type *player_ptr, dun_data_type *dd_ptr, dunge
 
 static bool switch_making_floor(player_type *player_ptr, dun_data_type *dd_ptr, dungeon_type *d_ptr)
 {
-    if (d_ptr->flags1 & DF1_MAZE) {
+    if (d_ptr->flags.has(DF::MAZE)) {
         floor_type *floor_ptr = player_ptr->current_floor_ptr;
         build_maze_vault(player_ptr, floor_ptr->width / 2 - 1, floor_ptr->height / 2 - 1, floor_ptr->width - 4, floor_ptr->height - 4, FALSE);
         if (!alloc_stairs(player_ptr, feat_down_stair, rand_range(2, 3), 3)) {
@@ -302,7 +318,7 @@ static bool allocate_dungeon_data(player_type *player_ptr, dun_data_type *dd_ptr
         (void)alloc_monster(player_ptr, 0, PM_ALLOW_SLEEP, summon_specific);
 
     alloc_object(player_ptr, ALLOC_SET_BOTH, ALLOC_TYP_TRAP, randint1(dd_ptr->alloc_object_num));
-    if (!(d_ptr->flags1 & DF1_NO_CAVE))
+    if (d_ptr->flags.has_not(DF::NO_CAVE))
         alloc_object(player_ptr, ALLOC_SET_CORR, ALLOC_TYP_RUBBLE, randint1(dd_ptr->alloc_object_num));
 
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
@@ -324,7 +340,7 @@ static void decide_grid_glowing(floor_type *floor_ptr, dun_data_type *dd_ptr, du
 {
     bool is_empty_or_dark = dd_ptr->empty_level;
     is_empty_or_dark &= !one_in_(DARK_EMPTY) || (randint1(100) > floor_ptr->dun_level);
-    is_empty_or_dark &= (d_ptr->flags1 & DF1_DARKNESS) == 0;
+    is_empty_or_dark &= d_ptr->flags.has_not(DF::DARKNESS);
     if (!is_empty_or_dark)
         return;
 
@@ -357,7 +373,7 @@ bool cave_gen(player_type *player_ptr, concptr *why)
 
     dd_ptr->cent_n = 0;
     dungeon_type *d_ptr = &d_info[floor_ptr->dungeon_idx];
-    if (ironman_empty_levels || ((d_ptr->flags1 & DF1_ARENA) && (empty_levels && one_in_(EMPTY_LEVEL)))) {
+    if (ironman_empty_levels || (d_ptr->flags.has(DF::ARENA) && (empty_levels && one_in_(EMPTY_LEVEL)))) {
         dd_ptr->empty_level = TRUE;
         msg_print_wizard(player_ptr, CHEAT_DUNGEON, _("アリーナレベルを生成。", "Arena level."));
     }
index db18212..c6423a6 100644 (file)
@@ -22,7 +22,6 @@
 #include "object-enchant/item-apply-magic.h"
 #include "object-enchant/object-ego.h"
 #include "object-enchant/trg-types.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-kind-hook.h"
 #include "object/object-kind.h"
@@ -66,7 +65,7 @@ static void drop_here(floor_type *floor_ptr, object_type *j_ptr, POSITION y, POS
     OBJECT_IDX o_idx = o_pop(floor_ptr);
     object_type *o_ptr;
     o_ptr = &floor_ptr->o_list[o_idx];
-    object_copy(o_ptr, j_ptr);
+    o_ptr->copy_from(j_ptr);
     o_ptr->iy = y;
     o_ptr->ix = x;
     o_ptr->held_m_idx = 0;
@@ -87,7 +86,7 @@ static void generate_artifact(player_type *player_ptr, qtwg_type *qtwg_ptr, cons
     KIND_OBJECT_IDX k_idx = lookup_kind(TV_SCROLL, SV_SCROLL_ACQUIREMENT);
     object_type forge;
     object_type *q_ptr = &forge;
-    object_prep(player_ptr, q_ptr, k_idx);
+    q_ptr->prep(player_ptr, k_idx);
     drop_here(player_ptr->current_floor_ptr, q_ptr, *qtwg_ptr->y, *qtwg_ptr->x);
 }
 
@@ -175,7 +174,7 @@ static void parse_qtw_D(player_type *player_ptr, qtwg_type *qtwg_ptr, char *s)
         } else if (object_index) {
             object_type tmp_object;
             object_type *o_ptr = &tmp_object;
-            object_prep(player_ptr, o_ptr, object_index);
+            o_ptr->prep(player_ptr, object_index);
             if (o_ptr->tval == TV_GOLD) {
                 coin_type = object_index - OBJ_GOLD_LIST;
                 make_gold(player_ptr, o_ptr);
index efeb8c7..25f0450 100644 (file)
@@ -265,7 +265,7 @@ void update_dungeon_feeling(player_type *subject_ptr)
  */
 void glow_deep_lava_and_bldg(player_type *subject_ptr)
 {
-    if (d_info[subject_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+    if (d_info[subject_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         return;
 
     floor_type *floor_ptr = subject_ptr->current_floor_ptr;
index 326e8e4..af9dbc0 100644 (file)
@@ -268,15 +268,15 @@ static bool level_gen(player_type *player_ptr, concptr *why)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
     DUNGEON_IDX d_idx = floor_ptr->dungeon_idx;
-    if ((always_small_levels || ironman_small_levels || (one_in_(SMALL_LEVEL) && small_levels) || (d_info[d_idx].flags1 & DF1_BEGINNER)
-            || (d_info[d_idx].flags1 & DF1_SMALLEST))
-        && !(d_info[d_idx].flags1 & DF1_BIG)) {
+    if ((always_small_levels || ironman_small_levels || (one_in_(SMALL_LEVEL) && small_levels) || d_info[d_idx].flags.has(DF::BEGINNER)
+            || d_info[d_idx].flags.has(DF::SMALLEST))
+        && d_info[d_idx].flags.has_not(DF::BIG)) {
         int level_height;
         int level_width;
-        if (d_info[d_idx].flags1 & DF1_SMALLEST) {
+        if (d_info[d_idx].flags.has(DF::SMALLEST)) {
             level_height = 1;
             level_width = 1;
-        } else if (d_info[d_idx].flags1 & DF1_BEGINNER) {
+        } else if (d_info[d_idx].flags.has(DF::BEGINNER)) {
             level_height = 2;
             level_width = 2;
         } else {
index cb11207..7af0fcd 100644 (file)
@@ -25,7 +25,6 @@
 #include "object-enchant/special-object-flags.h"
 #include "object-hook/hook-checker.h"
 #include "object-hook/hook-enchant.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-kind-hook.h"
 #include "object/object-kind.h"
@@ -118,7 +117,7 @@ bool make_object(player_type *owner_ptr, object_type *j_ptr, BIT_FLAGS mode)
         if (!k_idx)
             return FALSE;
 
-        object_prep(owner_ptr, j_ptr, k_idx);
+        j_ptr->prep(owner_ptr, k_idx);
     }
 
     apply_magic_to_object(owner_ptr, j_ptr, floor_ptr->object_level, mode);
@@ -163,7 +162,7 @@ bool make_gold(player_type *player_ptr, object_type *j_ptr)
         i = coin_type;
     if (i >= MAX_GOLD)
         i = MAX_GOLD - 1;
-    object_prep(player_ptr, j_ptr, OBJ_GOLD_LIST + i);
+    j_ptr->prep(player_ptr, OBJ_GOLD_LIST + i);
 
     s32b base = k_info[OBJ_GOLD_LIST + i].cost;
     j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
@@ -189,7 +188,7 @@ void delete_all_items_from_floor(player_type *player_ptr, POSITION y, POSITION x
     for (const auto this_o_idx : g_ptr->o_idx_list) {
         object_type *o_ptr;
         o_ptr = &floor_ptr->o_list[this_o_idx];
-        object_wipe(o_ptr);
+        o_ptr->wipe();
         floor_ptr->o_cnt--;
     }
 
@@ -261,7 +260,7 @@ void delete_object_idx(player_type *player_ptr, OBJECT_IDX o_idx)
         lite_spot(player_ptr, y, x);
     }
 
-    object_wipe(j_ptr);
+    j_ptr->wipe();
     floor_ptr->o_cnt--;
 
     set_bits(player_ptr->window_flags, PW_FLOOR_ITEM_LIST);
@@ -507,7 +506,7 @@ OBJECT_IDX drop_near(player_type *owner_ptr, object_type *j_ptr, PERCENTAGE chan
     }
 
     if (!done) {
-        object_copy(&floor_ptr->o_list[o_idx], j_ptr);
+        (&floor_ptr->o_list[o_idx])->copy_from(j_ptr);
         j_ptr = &floor_ptr->o_list[o_idx];
         j_ptr->iy = by;
         j_ptr->ix = bx;
index 8456a31..8537ede 100644 (file)
@@ -140,7 +140,7 @@ static void recursive_river(floor_type *floor_ptr, POSITION x1, POSITION y1, POS
 
                         /* Lava terrain glows */
                         if (has_flag(f_info[feat1].flags, FF_LAVA)) {
-                            if (!(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS))
+                            if (d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS))
                                 g_ptr->info |= CAVE_GLOW;
                         }
 
@@ -172,7 +172,7 @@ void add_river(floor_type *floor_ptr, dun_data_type *dd_ptr)
     dungeon_ptr = &d_info[floor_ptr->dungeon_idx];
 
     /* Choose water mainly */
-    if ((randint1(MAX_DEPTH * 2) - 1 > floor_ptr->dun_level) && (dungeon_ptr->flags1 & DF1_WATER_RIVER)) {
+    if ((randint1(MAX_DEPTH * 2) - 1 > floor_ptr->dun_level) && dungeon_ptr->flags.has(DF::WATER_RIVER)) {
         feat1 = feat_deep_water;
         feat2 = feat_shallow_water;
     } else /* others */
@@ -181,17 +181,17 @@ void add_river(floor_type *floor_ptr, dun_data_type *dd_ptr)
         FEAT_IDX select_shallow_feat[10];
         int select_id_max = 0, selected;
 
-        if (dungeon_ptr->flags1 & DF1_LAVA_RIVER) {
+        if (dungeon_ptr->flags.has(DF::LAVA_RIVER)) {
             select_deep_feat[select_id_max] = feat_deep_lava;
             select_shallow_feat[select_id_max] = feat_shallow_lava;
             select_id_max++;
         }
-        if (dungeon_ptr->flags1 & DF1_POISONOUS_RIVER) {
+        if (dungeon_ptr->flags.has(DF::POISONOUS_RIVER)) {
             select_deep_feat[select_id_max] = feat_deep_poisonous_puddle;
             select_shallow_feat[select_id_max] = feat_shallow_poisonous_puddle;
             select_id_max++;
         }
-        if (dungeon_ptr->flags1 & DF1_ACID_RIVER) {
+        if (dungeon_ptr->flags.has(DF::ACID_RIVER)) {
             select_deep_feat[select_id_max] = feat_deep_acid_puddle;
             select_shallow_feat[select_id_max] = feat_shallow_acid_puddle;
             select_id_max++;
@@ -448,7 +448,7 @@ void place_trees(player_type *player_ptr, POSITION x, POSITION y)
                 g_ptr->mimic = 0;
 
                 /* Light area since is open above */
-                if (!(d_info[player_ptr->dungeon_idx].flags1 & DF1_DARKNESS))
+                if (d_info[player_ptr->dungeon_idx].flags.has_not(DF::DARKNESS))
                     floor_ptr->grid_array[j][i].info |= (CAVE_GLOW | CAVE_ROOM);
             }
         }
index d4e4cf0..4b4ad37 100644 (file)
@@ -17,7 +17,6 @@
 #include "grid/grid.h"
 #include "object-hook/hook-checker.h"
 #include "object-hook/hook-enchant.h"
-#include "object/object-generator.h"
 #include "perception/object-perception.h"
 #include "system/artifact-type-definition.h"
 #include "system/floor-type-definition.h"
@@ -134,7 +133,7 @@ void wipe_o_list(floor_type *floor_ptr)
 
         auto &list = get_o_idx_list_contains(floor_ptr, i);
         list.clear();
-        object_wipe(o_ptr);
+        o_ptr->wipe();
     }
 
     floor_ptr->o_max = 1;
index b37b635..6445e24 100644 (file)
@@ -350,7 +350,7 @@ static void generate_area(player_type *player_ptr, POSITION y, POSITION x, bool
 
     bool is_winner = wilderness[y][x].entrance > 0;
     is_winner &= (wilderness[y][x].town == 0);
-    bool is_wild_winner = (d_info[wilderness[y][x].entrance].flags1 & DF1_WINNER) == 0;
+    bool is_wild_winner = d_info[wilderness[y][x].entrance].flags.has_not(DF::WINNER);
     is_winner &= ((current_world_ptr->total_winner != 0) || is_wild_winner);
     if (!is_winner)
         return;
@@ -574,7 +574,7 @@ void wilderness_gen_small(player_type *creature_ptr)
                 continue;
             }
 
-            if (wilderness[j][i].entrance && (current_world_ptr->total_winner || !(d_info[wilderness[j][i].entrance].flags1 & DF1_WINNER))) {
+            if (wilderness[j][i].entrance && (current_world_ptr->total_winner || d_info[wilderness[j][i].entrance].flags.has_not(DF::WINNER))) {
                 floor_ptr->grid_array[j][i].feat = feat_entrance;
                 floor_ptr->grid_array[j][i].special = (byte)wilderness[j][i].entrance;
                 floor_ptr->grid_array[j][i].info |= (CAVE_GLOW | CAVE_MARK);
index bdc4ec2..f41d811 100644 (file)
@@ -62,15 +62,15 @@ void add_door(player_type *player_ptr, POSITION x, POSITION y)
 void place_secret_door(player_type *player_ptr, POSITION y, POSITION x, int type)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_DOORS) {
+    if (d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_DOORS)) {
         place_bold(player_ptr, y, x, GB_FLOOR);
         return;
     }
 
     if (type == DOOR_DEFAULT) {
-        type = ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_CURTAIN) && one_in_((d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) ? 16 : 256))
+        type = (d_info[floor_ptr->dungeon_idx].flags.has(DF::CURTAIN) && one_in_(d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE) ? 16 : 256))
             ? DOOR_CURTAIN
-            : ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
+            : (d_info[floor_ptr->dungeon_idx].flags.has(DF::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
     }
 
     place_closed_door(player_ptr, y, x, type);
@@ -99,12 +99,12 @@ void place_secret_door(player_type *player_ptr, POSITION y, POSITION x, int type
 void place_locked_door(player_type *player_ptr, POSITION y, POSITION x)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_DOORS) {
+    if (d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_DOORS)) {
         place_bold(player_ptr, y, x, GB_FLOOR);
         return;
     }
 
-    set_cave_feat(floor_ptr, y, x, feat_locked_door_random((d_info[player_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR));
+    set_cave_feat(floor_ptr, y, x, feat_locked_door_random(d_info[player_ptr->dungeon_idx].flags.has(DF::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR));
     floor_ptr->grid_array[y][x].info &= ~(CAVE_FLOOR);
     delete_monster(player_ptr, y, x);
 }
@@ -122,14 +122,14 @@ void place_random_door(player_type *player_ptr, POSITION y, POSITION x, bool roo
     grid_type *g_ptr = &floor_ptr->grid_array[y][x];
     g_ptr->mimic = 0;
 
-    if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_DOORS) {
+    if (d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_DOORS)) {
         place_bold(player_ptr, y, x, GB_FLOOR);
         return;
     }
 
-    int type = ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_CURTAIN) && one_in_((d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) ? 16 : 256))
+    int type = (d_info[floor_ptr->dungeon_idx].flags.has(DF::CURTAIN) && one_in_(d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE) ? 16 : 256))
         ? DOOR_CURTAIN
-        : ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
+        : (d_info[floor_ptr->dungeon_idx].flags.has(DF::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
 
     int tmp = randint0(1000);
     FEAT_IDX feat = feat_none;
@@ -177,7 +177,7 @@ void place_random_door(player_type *player_ptr, POSITION y, POSITION x, bool roo
 void place_closed_door(player_type *player_ptr, POSITION y, POSITION x, int type)
 {
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_DOORS) {
+    if (d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_DOORS)) {
         place_bold(player_ptr, y, x, GB_FLOOR);
         return;
     }
index e4d98a4..aa80530 100644 (file)
@@ -1,4 +1,5 @@
 #include "grid/feature-generator.h"
+#include "dungeon/dungeon-flag-mask.h"
 #include "dungeon/dungeon-flag-types.h"
 #include "dungeon/dungeon.h"
 #include "dungeon/quest.h"
 void gen_caverns_and_lakes(player_type *owner_ptr, dungeon_type *dungeon_ptr, dun_data_type *dd_ptr)
 {
     floor_type *floor_ptr = owner_ptr->current_floor_ptr;
-    if ((floor_ptr->dun_level > 30) && one_in_(DUN_DEST * 2) && small_levels && (dungeon_ptr->flags1 & DF1_DESTROY)) {
+    if ((floor_ptr->dun_level > 30) && one_in_(DUN_DEST * 2) && small_levels && dungeon_ptr->flags.has(DF::DESTROY)) {
         dd_ptr->destroyed = TRUE;
         build_lake(owner_ptr, one_in_(2) ? LAKE_T_CAVE : LAKE_T_EARTH_VAULT);
     }
 
-    if (one_in_(LAKE_LEVEL) && !dd_ptr->empty_level && !dd_ptr->destroyed && (dungeon_ptr->flags1 & DF1_LAKE_MASK)) {
+    if (one_in_(LAKE_LEVEL) && !dd_ptr->empty_level && !dd_ptr->destroyed && dungeon_ptr->flags.has_any_of(DF_LAKE_MASK)) {
         int count = 0;
-        if (dungeon_ptr->flags1 & DF1_LAKE_WATER)
+        if (dungeon_ptr->flags.has(DF::LAKE_WATER))
             count += 3;
 
-        if (dungeon_ptr->flags1 & DF1_LAKE_LAVA)
+        if (dungeon_ptr->flags.has(DF::LAKE_LAVA))
             count += 3;
 
-        if (dungeon_ptr->flags1 & DF1_LAKE_RUBBLE)
+        if (dungeon_ptr->flags.has(DF::LAKE_RUBBLE))
             count += 3;
 
-        if (dungeon_ptr->flags1 & DF1_LAKE_TREE)
+        if (dungeon_ptr->flags.has(DF::LAKE_TREE))
             count += 3;
 
-        if (dungeon_ptr->flags1 & DF1_LAKE_LAVA) {
+        if (dungeon_ptr->flags.has(DF::LAKE_LAVA)) {
             if ((floor_ptr->dun_level > 80) && (randint0(count) < 2))
                 dd_ptr->laketype = LAKE_T_LAVA;
 
@@ -54,7 +55,7 @@ void gen_caverns_and_lakes(player_type *owner_ptr, dungeon_type *dungeon_ptr, du
             count--;
         }
 
-        if ((dungeon_ptr->flags1 & DF1_LAKE_WATER) && !dd_ptr->laketype) {
+        if (dungeon_ptr->flags.has(DF::LAKE_WATER) && !dd_ptr->laketype) {
             if ((floor_ptr->dun_level > 50) && randint0(count) < 2)
                 dd_ptr->laketype = LAKE_T_WATER;
 
@@ -65,7 +66,7 @@ void gen_caverns_and_lakes(player_type *owner_ptr, dungeon_type *dungeon_ptr, du
             count--;
         }
 
-        if ((dungeon_ptr->flags1 & DF1_LAKE_RUBBLE) && !dd_ptr->laketype) {
+        if (dungeon_ptr->flags.has(DF::LAKE_RUBBLE) && !dd_ptr->laketype) {
             if ((floor_ptr->dun_level > 35) && (randint0(count) < 2))
                 dd_ptr->laketype = LAKE_T_CAVE;
 
@@ -76,7 +77,7 @@ void gen_caverns_and_lakes(player_type *owner_ptr, dungeon_type *dungeon_ptr, du
             count--;
         }
 
-        if ((floor_ptr->dun_level > 5) && (dungeon_ptr->flags1 & DF1_LAKE_TREE) && !dd_ptr->laketype)
+        if ((floor_ptr->dun_level > 5) && dungeon_ptr->flags.has(DF::LAKE_TREE) && !dd_ptr->laketype)
             dd_ptr->laketype = LAKE_T_AIR_VAULT;
 
         if (dd_ptr->laketype) {
@@ -85,7 +86,7 @@ void gen_caverns_and_lakes(player_type *owner_ptr, dungeon_type *dungeon_ptr, du
         }
     }
 
-    if ((floor_ptr->dun_level > DUN_CAVERN) && !dd_ptr->empty_level && (dungeon_ptr->flags1 & DF1_CAVERN) && !dd_ptr->laketype && !dd_ptr->destroyed
+    if ((floor_ptr->dun_level > DUN_CAVERN) && !dd_ptr->empty_level && dungeon_ptr->flags.has(DF::CAVERN) && !dd_ptr->laketype && !dd_ptr->destroyed
         && (randint1(1000) < floor_ptr->dun_level)) {
         dd_ptr->cavern = TRUE;
         msg_print_wizard(owner_ptr, CHEAT_DUNGEON, _("洞窟を生成。", "Cavern on level."));
@@ -98,7 +99,7 @@ void gen_caverns_and_lakes(player_type *owner_ptr, dungeon_type *dungeon_ptr, du
 
 bool has_river_flag(dungeon_type *dungeon_ptr)
 {
-    return (dungeon_ptr->flags1 & (DF1_WATER_RIVER | DF1_LAVA_RIVER | DF1_ACID_RIVER | DF1_POISONOUS_RIVER)) != 0;
+    return dungeon_ptr->flags.has_any_of(DF_RIVER_MASK);
 }
 
 /*!
@@ -164,7 +165,7 @@ void try_door(player_type *player_ptr, dt_type *dt_ptr, POSITION y, POSITION x)
 
     bool can_place_door = randint0(100) < dt_ptr->dun_tun_jct;
     can_place_door &= possible_doorway(floor_ptr, y, x);
-    can_place_door &= (d_info[player_ptr->dungeon_idx].flags1 & DF1_NO_DOORS) == 0;
+    can_place_door &= d_info[player_ptr->dungeon_idx].flags.has_not(DF::NO_DOORS);
     if (can_place_door)
         place_random_door(player_ptr, y, x, FALSE);
 }
index 9657a40..131b631 100644 (file)
@@ -197,7 +197,7 @@ void cave_set_feat(player_type *player_ptr, POSITION y, POSITION x, FEAT_IDX fea
     if (!current_world_ptr->character_dungeon) {
         g_ptr->mimic = 0;
         g_ptr->feat = feat;
-        if (has_flag(f_ptr->flags, FF_GLOW) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS)) {
+        if (has_flag(f_ptr->flags, FF_GLOW) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS)) {
             for (DIRECTION i = 0; i < 9; i++) {
                 POSITION yy = y + ddy_ddd[i];
                 POSITION xx = x + ddx_ddd[i];
@@ -217,7 +217,7 @@ void cave_set_feat(player_type *player_ptr, POSITION y, POSITION x, FEAT_IDX fea
     g_ptr->mimic = 0;
     g_ptr->feat = feat;
     g_ptr->info &= ~(CAVE_OBJECT);
-    if (old_mirror && (d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS)) {
+    if (old_mirror && d_info[floor_ptr->dungeon_idx].flags.has(DF::DARKNESS)) {
         g_ptr->info &= ~(CAVE_GLOW);
         if (!view_torch_grids)
             g_ptr->info &= ~(CAVE_MARK);
@@ -235,7 +235,7 @@ void cave_set_feat(player_type *player_ptr, POSITION y, POSITION x, FEAT_IDX fea
     if (old_los ^ has_flag(f_ptr->flags, FF_LOS))
         player_ptr->update |= PU_VIEW | PU_LITE | PU_MON_LITE | PU_MONSTERS;
 
-    if (!has_flag(f_ptr->flags, FF_GLOW) || (d_info[player_ptr->dungeon_idx].flags1 & DF1_DARKNESS))
+    if (!has_flag(f_ptr->flags, FF_GLOW) || d_info[player_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         return;
 
     for (DIRECTION i = 0; i < 9; i++) {
index 16099d5..316e14d 100644 (file)
@@ -993,7 +993,7 @@ void remove_mirror(player_type *caster_ptr, POSITION y, POSITION x)
     g_ptr->info &= ~(CAVE_OBJECT);
     g_ptr->mimic = 0;
 
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS) {
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS)) {
         g_ptr->info &= ~(CAVE_GLOW);
         if (!view_torch_grids)
             g_ptr->info &= ~(CAVE_MARK);
index 83e19f3..667005e 100644 (file)
@@ -3,7 +3,6 @@
 #include "floor/floor-object.h"
 #include "grid/grid.h"
 #include "object-hook/hook-enchant.h"
-#include "object/object-generator.h"
 #include "system/artifact-type-definition.h"
 #include "system/floor-type-definition.h"
 #include "system/object-type-definition.h"
@@ -34,7 +33,7 @@ void place_gold(player_type *player_ptr, POSITION y, POSITION x)
     object_type forge;
     object_type *q_ptr;
     q_ptr = &forge;
-    object_wipe(q_ptr);
+    q_ptr->wipe();
     if (!make_gold(player_ptr, q_ptr))
         return;
 
@@ -44,7 +43,7 @@ void place_gold(player_type *player_ptr, POSITION y, POSITION x)
 
     object_type *o_ptr;
     o_ptr = &floor_ptr->o_list[o_idx];
-    object_copy(o_ptr, q_ptr);
+    o_ptr->copy_from(q_ptr);
 
     o_ptr->iy = y;
     o_ptr->ix = x;
@@ -77,7 +76,7 @@ void place_object(player_type *owner_ptr, POSITION y, POSITION x, BIT_FLAGS mode
         return;
 
     q_ptr = &forge;
-    object_wipe(q_ptr);
+    q_ptr->wipe();
     if (!make_object(owner_ptr, q_ptr, mode))
         return;
 
@@ -92,7 +91,7 @@ void place_object(player_type *owner_ptr, POSITION y, POSITION x, BIT_FLAGS mode
 
     object_type *o_ptr;
     o_ptr = &floor_ptr->o_list[o_idx];
-    object_copy(o_ptr, q_ptr);
+    o_ptr->copy_from(q_ptr);
 
     o_ptr->iy = y;
     o_ptr->ix = x;
index 80de1b5..7f8843c 100644 (file)
@@ -1,41 +1,41 @@
 #include "info-reader/dungeon-info-tokens-table.h"
+#include "dungeon/dungeon-flag-types.h"
 
 /*!
  * ダンジョン特性トークンの定義 /
  * Dungeon flags
  */
-concptr d_info_flags1[NUM_D_FLAGS] = {
-       "WINNER",
-       "MAZE",
-       "SMALLEST",
-       "BEGINNER",
-       "BIG",
-       "NO_DOORS",
-       "WATER_RIVER",
-       "LAVA_RIVER",
-       "CURTAIN",
-       "GLASS_DOOR",
-       "CAVE",
-       "CAVERN",
-       "ARCADE",
-       "LAKE_ACID",
-       "LAKE_POISONOUS",
-       "XXX",
-       "FORGET",
-       "LAKE_WATER",
-       "LAKE_LAVA",
-       "LAKE_RUBBLE",
-       "LAKE_TREE",
-       "NO_VAULT",
-       "ARENA",
-       "DESTROY",
-       "GLASS_ROOM",
-       "NO_CAVE",
-       "NO_MAGIC",
-       "NO_MELEE",
-       "CHAMELEON",
-       "DARKNESS",
-       "ACID_RIVER",
-       "POISONOUS_RIVER"
+const std::unordered_map<std::string_view, DF> d_info_flags = {
+    { "WINNER", DF::WINNER },
+    { "MAZE", DF::MAZE },
+    { "SMALLEST", DF::SMALLEST },
+    { "BEGINNER", DF::BEGINNER },
+    { "BIG", DF::BIG },
+    { "NO_DOORS", DF::NO_DOORS },
+    { "WATER_RIVER", DF::WATER_RIVER },
+    { "LAVA_RIVER", DF::LAVA_RIVER },
+    { "CURTAIN", DF::CURTAIN },
+    { "GLASS_DOOR", DF::GLASS_DOOR },
+    { "CAVE", DF::CAVE },
+    { "CAVERN", DF::CAVERN },
+    { "ARCADE", DF::ARCADE },
+    { "LAKE_ACID", DF::LAKE_ACID },
+    { "LAKE_POISONOUS", DF::LAKE_POISONOUS },
+    { "NO_ROOM", DF::NO_ROOM },
+    { "FORGET", DF::FORGET },
+    { "LAKE_WATER", DF::LAKE_WATER },
+    { "LAKE_LAVA", DF::LAKE_LAVA },
+    { "LAKE_RUBBLE", DF::LAKE_RUBBLE },
+    { "LAKE_TREE", DF::LAKE_TREE },
+    { "NO_VAULT", DF::NO_VAULT },
+    { "ARENA", DF::ARENA },
+    { "DESTROY", DF::DESTROY },
+    { "GLASS_ROOM", DF::GLASS_ROOM },
+    { "NO_CAVE", DF::NO_CAVE },
+    { "NO_MAGIC", DF::NO_MAGIC },
+    { "NO_MELEE", DF::NO_MELEE },
+    { "CHAMELEON", DF::CHAMELEON },
+    { "DARKNESS", DF::DARKNESS },
+    { "ACID_RIVER", DF::ACID_RIVER },
+    { "POISONOUS_RIVER", DF::POISONOUS_RIVER },
 };
-
index eb0525b..f1be670 100644 (file)
@@ -2,6 +2,9 @@
 
 #include "system/angband.h"
 
-#define NUM_D_FLAGS 32
+#include <string_view>
+#include <unordered_map>
 
-extern concptr d_info_flags1[NUM_D_FLAGS];
+enum class DF;
+
+extern const std::unordered_map<std::string_view, DF> d_info_flags;
index dabc7b6..c13390c 100644 (file)
@@ -20,7 +20,7 @@
  */
 static errr grab_one_dungeon_flag(dungeon_type *d_ptr, concptr what)
 {
-    if (grab_one_flag(&d_ptr->flags1, d_info_flags1, what) == 0)
+    if (EnumClassFlagGroup<DF>::grab_one_flag(d_ptr->flags, d_info_flags, what))
         return 0;
 
     msg_format(_("未知のダンジョン・フラグ '%s'。", "Unknown dungeon type flag '%s'."), what);
index 0b79d1a..c502fff 100644 (file)
@@ -5,7 +5,6 @@
 #include "floor/floor-object.h"
 #include "inventory/inventory-slot-types.h"
 #include "object-hook/hook-weapon.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-mark-types.h"
 #include "object/object-stack.h"
@@ -84,7 +83,7 @@ void inven_item_optimize(player_type *owner_ptr, INVENTORY_IDX item)
 
     if (item >= INVEN_MAIN_HAND) {
         owner_ptr->equip_cnt--;
-        object_wipe(&owner_ptr->inventory_list[item]);
+        (&owner_ptr->inventory_list[item])->wipe();
         owner_ptr->update |= PU_BONUS;
         owner_ptr->update |= PU_TORCH;
         owner_ptr->update |= PU_MANA;
@@ -100,7 +99,7 @@ void inven_item_optimize(player_type *owner_ptr, INVENTORY_IDX item)
         owner_ptr->inventory_list[i] = owner_ptr->inventory_list[i + 1];
     }
 
-    object_wipe(&owner_ptr->inventory_list[i]);
+    (&owner_ptr->inventory_list[i])->wipe();
     owner_ptr->window_flags |= PW_INVEN;
     owner_ptr->window_flags |= PW_SPELL;
 }
@@ -133,7 +132,7 @@ void drop_from_inventory(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER
     }
 
     q_ptr = &forge;
-    object_copy(q_ptr, o_ptr);
+    q_ptr->copy_from(o_ptr);
     distribute_charges(o_ptr, q_ptr, amt);
 
     q_ptr->number = amt;
@@ -188,7 +187,7 @@ void combine_pack(player_type *owner_ptr)
                         owner_ptr->inventory_list[k] = owner_ptr->inventory_list[k + 1];
                     }
 
-                    object_wipe(&owner_ptr->inventory_list[k]);
+                    (&owner_ptr->inventory_list[k])->wipe();
                 } else {
                     int old_num = o_ptr->number;
                     int remain = j_ptr->number + o_ptr->number - max_num;
@@ -250,12 +249,12 @@ void reorder_pack(player_type *owner_ptr)
 
         flag = TRUE;
         q_ptr = &forge;
-        object_copy(q_ptr, &owner_ptr->inventory_list[i]);
+        q_ptr->copy_from(&owner_ptr->inventory_list[i]);
         for (k = i; k > j; k--) {
-            object_copy(&owner_ptr->inventory_list[k], &owner_ptr->inventory_list[k - 1]);
+            (&owner_ptr->inventory_list[k])->copy_from(&owner_ptr->inventory_list[k - 1]);
         }
 
-        object_copy(&owner_ptr->inventory_list[j], q_ptr);
+        (&owner_ptr->inventory_list[j])->copy_from(q_ptr);
         owner_ptr->window_flags |= (PW_INVEN);
     }
 
@@ -323,13 +322,13 @@ s16b store_item_to_inventory(player_type *owner_ptr, object_type *o_ptr)
 
         i = j;
         for (k = n; k >= i; k--) {
-            object_copy(&owner_ptr->inventory_list[k + 1], &owner_ptr->inventory_list[k]);
+            (&owner_ptr->inventory_list[k + 1])->copy_from(&owner_ptr->inventory_list[k]);
         }
 
-        object_wipe(&owner_ptr->inventory_list[i]);
+        (&owner_ptr->inventory_list[i])->wipe();
     }
 
-    object_copy(&owner_ptr->inventory_list[i], o_ptr);
+    (&owner_ptr->inventory_list[i])->copy_from(o_ptr);
     j_ptr = &owner_ptr->inventory_list[i];
     j_ptr->held_m_idx = 0;
     j_ptr->iy = j_ptr->ix = 0;
@@ -397,7 +396,7 @@ INVENTORY_IDX inven_takeoff(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUM
     if (amt > o_ptr->number)
         amt = o_ptr->number;
     q_ptr = &forge;
-    object_copy(q_ptr, o_ptr);
+    q_ptr->copy_from(o_ptr);
     q_ptr->number = amt;
     describe_flavor(owner_ptr, o_name, q_ptr, 0);
     if (((item == INVEN_MAIN_HAND) || (item == INVEN_SUB_HAND)) && object_is_melee_weapon(o_ptr)) {
index f702e1a..31f4176 100644 (file)
@@ -383,7 +383,7 @@ void process_command(player_type *creature_ptr)
             break;
         }
         
-        if (floor_ptr->dun_level && (d_info[creature_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC) && (creature_ptr->pclass != CLASS_BERSERKER)
+        if (floor_ptr->dun_level && d_info[creature_ptr->dungeon_idx].flags.has(DF::NO_MAGIC) && (creature_ptr->pclass != CLASS_BERSERKER)
             && (creature_ptr->pclass != CLASS_SMITH)) {
             msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
             msg_print(NULL);
index 1d37613..01fff84 100644 (file)
@@ -18,7 +18,6 @@
 #include "knowledge/object-group-table.h"
 #include "object-enchant/special-object-flags.h"
 #include "object-hook/hook-enchant.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "object/object-kind.h"
 #include "perception/identification.h"
@@ -107,7 +106,7 @@ void do_cmd_knowledge_artifacts(player_type *player_ptr)
             object_type forge;
             object_type *q_ptr;
             q_ptr = &forge;
-            object_prep(player_ptr, q_ptr, z);
+            q_ptr->prep(player_ptr, z);
             q_ptr->name1 = who[k];
             q_ptr->ident |= IDENT_STORE;
             describe_flavor(player_ptr, base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
@@ -228,8 +227,8 @@ static void desc_obj_fake(player_type *creature_ptr, KIND_OBJECT_IDX k_idx)
     object_type *o_ptr;
     object_type object_type_body;
     o_ptr = &object_type_body;
-    object_wipe(o_ptr);
-    object_prep(creature_ptr, o_ptr, k_idx);
+    o_ptr->wipe();
+    o_ptr->prep(creature_ptr, k_idx);
 
     o_ptr->ident |= IDENT_KNOWN;
     handle_stuff(creature_ptr);
index 39c4a1b..d6c99d3 100644 (file)
@@ -15,7 +15,6 @@
 #include "locale/english.h"
 #include "monster-race/monster-race.h"
 #include "object-enchant/special-object-flags.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "system/artifact-type-definition.h"
 #include "system/floor-type-definition.h"
@@ -99,7 +98,7 @@ static void do_cmd_knowledge_quests_current(player_type *creature_ptr, FILE *fff
                         object_type forge;
                         object_type *q_ptr = &forge;
                         KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
-                        object_prep(creature_ptr, q_ptr, k_idx);
+                        q_ptr->prep(creature_ptr, k_idx);
                         q_ptr->name1 = quest[i].k_idx;
                         q_ptr->ident = IDENT_STORE;
                         describe_flavor(creature_ptr, name, q_ptr, OD_NAME_ONLY);
index 86941d4..9e9feec 100644 (file)
@@ -2,7 +2,6 @@
 #include "inventory/inventory-slot-types.h"
 #include "load/item-loader.h"
 #include "load/load-util.h"
-#include "object/object-generator.h"
 #include "object/object-mark-types.h"
 #include "system/object-type-definition.h"
 #include "system/player-type-definition.h"
@@ -38,7 +37,7 @@ static errr rd_inventory(player_type *player_ptr)
         object_type forge;
         object_type *q_ptr;
         q_ptr = &forge;
-        object_wipe(q_ptr);
+        q_ptr->wipe();
 
         rd_item(player_ptr, q_ptr);
         if (!q_ptr->k_idx)
@@ -46,7 +45,7 @@ static errr rd_inventory(player_type *player_ptr)
 
         if (n >= INVEN_MAIN_HAND) {
             q_ptr->marked |= OM_TOUCHED;
-            object_copy(&player_ptr->inventory_list[n], q_ptr);
+            (&player_ptr->inventory_list[n])->copy_from(q_ptr);
             player_ptr->equip_cnt++;
             continue;
         }
@@ -58,7 +57,7 @@ static errr rd_inventory(player_type *player_ptr)
 
         n = slot++;
         q_ptr->marked |= OM_TOUCHED;
-        object_copy(&player_ptr->inventory_list[n], q_ptr);
+        (&player_ptr->inventory_list[n])->copy_from(q_ptr);
         player_ptr->inven_cnt++;
     }
 
index d484e13..9504e17 100644 (file)
@@ -1,5 +1,4 @@
 #include "load/store-loader.h"
-#include "object/object-generator.h"
 #include "floor/floor-town.h"
 #include "load/angband-version-comparer.h"
 #include "load/item-loader.h"
@@ -98,7 +97,7 @@ static errr rd_store(player_type *player_ptr, int town_number, int store_number)
         object_type forge;
         object_type *q_ptr;
         q_ptr = &forge;
-        object_wipe(q_ptr);
+        q_ptr->wipe();
 
         rd_item(player_ptr, q_ptr);
 
@@ -110,7 +109,7 @@ static errr rd_store(player_type *player_ptr, int town_number, int store_number)
             home_carry_load(player_ptr, store_ptr, q_ptr);
         } else {
             int k = store_ptr->stock_num++;
-            object_copy(&store_ptr->stock[k], q_ptr);
+            (&store_ptr->stock[k])->copy_from(q_ptr);
         }
     }
 
index 2da09f1..b9fd63d 100644 (file)
@@ -23,7 +23,6 @@
 #include "monster/monster-util.h"
 #include "object-enchant/apply-magic.h"
 #include "object-enchant/item-apply-magic.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-kind-hook.h"
 #include "perception/object-perception.h"
@@ -164,7 +163,7 @@ bool exchange_cash(player_type *player_ptr)
 
             msg_format(_("これで合計 %d ポイント獲得しました。", "You earned %d point%s total."), num, (num > 1 ? "s" : ""));
 
-            object_prep(player_ptr, &forge, lookup_kind(prize_list[num - 1].tval, prize_list[num - 1].sval));
+            (&forge)->prep(player_ptr, lookup_kind(prize_list[num - 1].tval, prize_list[num - 1].sval));
             apply_magic_to_object(player_ptr, &forge, player_ptr->current_floor_ptr->object_level, AM_NO_FIXED_ART);
 
             object_aware(player_ptr, &forge);
index 162fb20..3c9d8af 100644 (file)
@@ -15,7 +15,6 @@
 #include "object/item-tester-hooker.h"
 #include "object/item-use-flags.h"
 #include "object/object-flags.h"
-#include "object/object-generator.h"
 #include "realm/realm-hex-numbers.h"
 #include "spell-realm/spells-hex.h"
 #include "sv-definition/sv-weapon-types.h"
@@ -360,7 +359,7 @@ PRICE compare_weapons(player_type *customer_ptr, PRICE bcost)
     screen_save();
     clear_bldg(0, 22);
     i_ptr = &customer_ptr->inventory_list[INVEN_MAIN_HAND];
-    object_copy(&orig_weapon, i_ptr);
+    (&orig_weapon)->copy_from(i_ptr);
 
     item_tester_hook = item_tester_hook_orthodox_melee_weapons;
     concptr q = _("第一の武器は?", "What is your first weapon? ");
@@ -382,14 +381,14 @@ PRICE compare_weapons(player_type *customer_ptr, PRICE bcost)
         for (int i = 0; i < n; i++) {
             int col = (wid * i + mgn);
             if (o_ptr[i] != i_ptr)
-                object_copy(i_ptr, o_ptr[i]);
+                i_ptr->copy_from(o_ptr[i]);
 
             customer_ptr->update |= PU_BONUS;
             handle_stuff(customer_ptr);
 
             list_weapon(customer_ptr, o_ptr[i], row, col);
             compare_weapon_aux(customer_ptr, o_ptr[i], col, row + 8);
-            object_copy(i_ptr, &orig_weapon);
+            i_ptr->copy_from(&orig_weapon);
         }
 
         customer_ptr->update |= PU_BONUS;
index b6180d0..661c741 100644 (file)
@@ -102,7 +102,7 @@ static void check_darkness(player_type *target_ptr, melee_spell_type *ms_ptr)
     if ((ms_ptr->r_ptr->flags2 & RF2_STUPID) != 0)
         return;
 
-    if (d_info[target_ptr->dungeon_idx].flags1 & DF1_DARKNESS) {
+    if (d_info[target_ptr->dungeon_idx].flags.has(DF::DARKNESS)) {
         ms_ptr->ability_flags.reset(RF_ABILITY::DARKNESS);
         return;
     }
index 91fc5bc..e8755de 100644 (file)
@@ -26,7 +26,7 @@ melee_spell_type *initialize_melee_spell_type(player_type *target_ptr, melee_spe
     ms_ptr->see_m = is_seen(target_ptr, ms_ptr->m_ptr);
     ms_ptr->maneable = player_has_los_bold(target_ptr, ms_ptr->m_ptr->fy, ms_ptr->m_ptr->fx);
     ms_ptr->pet = is_pet(ms_ptr->m_ptr);
-    ms_ptr->in_no_magic_dungeon = (d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC) && floor_ptr->dun_level
+    ms_ptr->in_no_magic_dungeon = d_info[target_ptr->dungeon_idx].flags.has(DF::NO_MAGIC) && floor_ptr->dun_level
         && (!floor_ptr->inside_quest || is_fixed_quest_idx(floor_ptr->inside_quest));
     return ms_ptr;
 }
index 8986239..9ee9417 100644 (file)
@@ -150,7 +150,7 @@ static bool check_same_monster(player_type *subject_ptr, mam_type *mam_ptr)
     if (r_ptr->flags1 & RF1_NEVER_BLOW)
         return FALSE;
 
-    if (d_info[subject_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
+    if (d_info[subject_ptr->dungeon_idx].flags.has(DF::NO_MELEE))
         return FALSE;
 
     return TRUE;
index 57b57ea..1196402 100644 (file)
@@ -17,7 +17,6 @@
 #include "object-hook/hook-bow.h"
 #include "object/item-tester-hooker.h"
 #include "object/item-use-flags.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "perception/object-perception.h"
 #include "system/floor-type-definition.h"
@@ -121,7 +120,7 @@ bool create_ammo(player_type *creature_ptr)
 
         object_type forge;
         object_type *q_ptr = &forge;
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_SHOT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, creature_ptr->lev) + 1));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_SHOT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, creature_ptr->lev) + 1));
         q_ptr->number = (byte)rand_range(15, 30);
         object_aware(creature_ptr, q_ptr);
         object_known(q_ptr);
@@ -149,7 +148,7 @@ bool create_ammo(player_type *creature_ptr)
 
         object_type forge;
         q_ptr = &forge;
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_ARROW, (OBJECT_SUBTYPE_VALUE)m_bonus(1, creature_ptr->lev) + 1));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_ARROW, (OBJECT_SUBTYPE_VALUE)m_bonus(1, creature_ptr->lev) + 1));
         q_ptr->number = (byte)rand_range(5, 10);
         object_aware(creature_ptr, q_ptr);
         object_known(q_ptr);
@@ -176,7 +175,7 @@ bool create_ammo(player_type *creature_ptr)
 
         object_type forge;
         q_ptr = &forge;
-        object_prep(creature_ptr, q_ptr, lookup_kind(TV_BOLT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, creature_ptr->lev) + 1));
+        q_ptr->prep(creature_ptr, lookup_kind(TV_BOLT, (OBJECT_SUBTYPE_VALUE)m_bonus(1, creature_ptr->lev) + 1));
         q_ptr->number = (byte)rand_range(4, 8);
         object_aware(creature_ptr, q_ptr);
         object_known(q_ptr);
index 7a09535..6a23344 100644 (file)
@@ -2,7 +2,6 @@
 #include "floor/floor-object.h"
 #include "object-enchant/object-boost.h"
 #include "object-enchant/object-ego.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "sv-definition/sv-weapon-types.h"
 #include "system/floor-type-definition.h"
@@ -113,7 +112,7 @@ void acquire_chaos_weapon(player_type *creature_ptr)
         dummy2 = SV_BLADE_OF_CHAOS;
     }
 
-    object_prep(creature_ptr, q_ptr, lookup_kind(dummy, dummy2));
+    q_ptr->prep(creature_ptr, lookup_kind(dummy, dummy2));
     q_ptr->to_h = 3 + randint1(creature_ptr->current_floor_ptr->dun_level) % 10;
     q_ptr->to_d = 3 + randint1(creature_ptr->current_floor_ptr->dun_level) % 10;
     one_resistance(q_ptr);
index 5c9852c..c082095 100644 (file)
@@ -1,6 +1,5 @@
 #include "mind/mind-hobbit.h"
 #include "floor/floor-object.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "sv-definition/sv-food-types.h"
 #include "system/object-type-definition.h"
@@ -11,7 +10,7 @@ bool create_ration(player_type *creature_ptr)
 {
     object_type forge;
     object_type *q_ptr = &forge;
-    object_prep(creature_ptr, q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
+    q_ptr->prep(creature_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
     (void)drop_near(creature_ptr, q_ptr, -1, creature_ptr->y, creature_ptr->x);
     msg_print(_("食事を料理して作った。", "You cook some food."));
     return TRUE;
index 4c17497..a7607d0 100644 (file)
@@ -15,7 +15,6 @@
 #include "object-hook/hook-magic.h"
 #include "object/item-tester-hooker.h"
 #include "object/item-use-flags.h"
-#include "object/object-generator.h"
 #include "object/object-kind.h"
 #include "player/player-realm.h"
 #include "system/object-type-definition.h"
@@ -78,7 +77,7 @@ bool eat_magic(player_type *caster_ptr, int power)
                     object_type forge;
                     object_type *q_ptr;
                     q_ptr = &forge;
-                    object_copy(q_ptr, o_ptr);
+                    q_ptr->copy_from(o_ptr);
 
                     q_ptr->number = 1;
                     o_ptr->pval++;
index cde78e3..897a562 100644 (file)
@@ -25,7 +25,6 @@
 #include "monster/monster-status.h"
 #include "monster/monster-update.h"
 #include "object-enchant/trc-types.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "player-attack/player-attack-util.h"
 #include "player-info/equipment-info.h"
@@ -87,9 +86,9 @@ bool kawarimi(player_type *caster_ptr, bool success)
     POSITION x = caster_ptr->x;
 
     teleport_player(caster_ptr, 10 + randint1(90), TELEPORT_SPONTANEOUS);
-    object_wipe(q_ptr);
+    q_ptr->wipe();
     const int SV_WOODEN_STATUE = 0;
-    object_prep(caster_ptr, q_ptr, lookup_kind(TV_STATUE, SV_WOODEN_STATUE));
+    q_ptr->prep(caster_ptr, lookup_kind(TV_STATUE, SV_WOODEN_STATUE));
 
     q_ptr->pval = MON_NINJA;
     (void)drop_near(caster_ptr, q_ptr, -1, y, x);
index 3453340..b51098f 100644 (file)
@@ -63,7 +63,7 @@ static bool check_no_blow(player_type *target_ptr, monap_type *monap_ptr)
     if (r_ptr->flags1 & (RF1_NEVER_BLOW))
         return FALSE;
 
-    if (d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
+    if (d_info[target_ptr->dungeon_idx].flags.has(DF::NO_MELEE))
         return FALSE;
 
     if (!is_hostile(monap_ptr->m_ptr))
index 8a8d5f4..c863d26 100644 (file)
@@ -47,7 +47,7 @@ void exe_monster_attack_to_player(player_type *target_ptr, turn_flags *turn_flag
         turn_flags_ptr->do_move = FALSE;
     }
 
-    if (turn_flags_ptr->do_move && ((d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) != 0) && !monster_confused_remaining(m_ptr)) {
+    if (turn_flags_ptr->do_move && d_info[target_ptr->dungeon_idx].flags.has(DF::NO_MELEE) && !monster_confused_remaining(m_ptr)) {
         if (!(r_ptr->flags2 & RF2_STUPID))
             turn_flags_ptr->do_move = FALSE;
         else if (is_original_ap_and_seen(target_ptr, m_ptr))
@@ -86,7 +86,7 @@ static bool exe_monster_attack_to_monster(player_type *target_ptr, MONSTER_IDX m
         return FALSE;
     if (monst_attack_monst(target_ptr, m_idx, g_ptr->m_idx))
         return TRUE;
-    if ((d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) == 0)
+    if (d_info[target_ptr->dungeon_idx].flags.has_not(DF::NO_MELEE))
         return FALSE;
     if (monster_confused_remaining(m_ptr))
         return TRUE;
index 01ea382..54c4033 100644 (file)
@@ -16,7 +16,6 @@
 #include "monster-attack/monster-attack-util.h"
 #include "monster/monster-status.h"
 #include "object-hook/hook-enchant.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-kind.h"
 #include "object/object-mark-types.h"
@@ -106,7 +105,7 @@ static void move_item_to_monster(player_type *target_ptr, monap_type *monap_ptr,
 
     object_type *j_ptr;
     j_ptr = &target_ptr->current_floor_ptr->o_list[o_idx];
-    object_copy(j_ptr, monap_ptr->o_ptr);
+    j_ptr->copy_from(monap_ptr->o_ptr);
     j_ptr->number = 1;
     if ((monap_ptr->o_ptr->tval == TV_ROD) || (monap_ptr->o_ptr->tval == TV_WAND)) {
         j_ptr->pval = monap_ptr->o_ptr->pval / monap_ptr->o_ptr->number;
index ccc3d49..5e4a1ae 100644 (file)
@@ -32,7 +32,6 @@
 #include "monster/monster-list.h"
 #include "object-enchant/apply-magic.h"
 #include "object-enchant/item-apply-magic.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "pet/pet-fall-off.h"
 #include "player/patron.h"
@@ -91,7 +90,7 @@ static void on_defeat_arena_monster(player_type *player_ptr, monster_death_type
     if (arena_info[player_ptr->arena_number].tval) {
         object_type forge;
         object_type *q_ptr = &forge;
-        object_prep(player_ptr, q_ptr, lookup_kind(arena_info[player_ptr->arena_number].tval, arena_info[player_ptr->arena_number].sval));
+        q_ptr->prep(player_ptr, lookup_kind(arena_info[player_ptr->arena_number].tval, arena_info[player_ptr->arena_number].sval));
         apply_magic_to_object(player_ptr, q_ptr, floor_ptr->object_level, AM_NO_FIXED_ART);
         (void)drop_near(player_ptr, q_ptr, -1, md_ptr->md_y, md_ptr->md_x);
     }
@@ -135,7 +134,7 @@ static void drop_corpse(player_type *player_ptr, monster_death_type *md_ptr)
 
     object_type forge;
     object_type *q_ptr = &forge;
-    object_prep(player_ptr, q_ptr, lookup_kind(TV_CORPSE, (corpse ? SV_CORPSE : SV_SKELETON)));
+    q_ptr->prep(player_ptr, lookup_kind(TV_CORPSE, (corpse ? SV_CORPSE : SV_SKELETON)));
     apply_magic_to_object(player_ptr, q_ptr, floor_ptr->object_level, AM_NO_FIXED_ART);
     q_ptr->pval = md_ptr->m_ptr->r_idx;
     (void)drop_near(player_ptr, q_ptr, -1, md_ptr->md_y, md_ptr->md_x);
@@ -216,7 +215,7 @@ static void drop_artifact(player_type *player_ptr, monster_death_type *md_ptr)
     if (k_idx != 0) {
         object_type forge;
         object_type *q_ptr = &forge;
-        object_prep(player_ptr, q_ptr, k_idx);
+        q_ptr->prep(player_ptr, k_idx);
         apply_magic_to_object(player_ptr, q_ptr, player_ptr->current_floor_ptr->object_level, AM_NO_FIXED_ART | AM_GOOD);
         (void)drop_near(player_ptr, q_ptr, -1, md_ptr->md_y, md_ptr->md_x);
     }
@@ -277,7 +276,7 @@ static void drop_items_golds(player_type *player_ptr, monster_death_type *md_ptr
     for (int i = 0; i < drop_numbers; i++) {
         object_type forge;
         object_type *q_ptr = &forge;
-        object_wipe(q_ptr);
+        q_ptr->wipe();
         if (md_ptr->do_gold && (!md_ptr->do_item || (randint0(100) < 50))) {
             if (!make_gold(player_ptr, q_ptr))
                 continue;
index 537655b..c7a2a3c 100644 (file)
@@ -135,7 +135,7 @@ void update_mon_lite(player_type *subject_ptr)
     std::vector<Pos2D> points;
 
     void (*add_mon_lite)(player_type *, std::vector<Pos2D> &, const POSITION, const POSITION, const monster_lite_type *);
-    int dis_lim = ((d_info[subject_ptr->dungeon_idx].flags1 & DF1_DARKNESS) && !subject_ptr->see_nocto) ? (MAX_SIGHT / 2 + 1) : (MAX_SIGHT + 3);
+    int dis_lim = (d_info[subject_ptr->dungeon_idx].flags.has(DF::DARKNESS) && !subject_ptr->see_nocto) ? (MAX_SIGHT / 2 + 1) : (MAX_SIGHT + 3);
     floor_type *floor_ptr = subject_ptr->current_floor_ptr;
     for (int i = 0; i < floor_ptr->mon_lite_n; i++) {
         grid_type *g_ptr;
@@ -175,7 +175,7 @@ void update_mon_lite(player_type *subject_ptr)
                     && (monster_csleep_remaining(m_ptr) || (!floor_ptr->dun_level && is_daytime()) || subject_ptr->phase_out))
                     continue;
 
-                if (d_info[subject_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+                if (d_info[subject_ptr->dungeon_idx].flags.has(DF::DARKNESS))
                     rad = 1;
 
                 add_mon_lite = update_monster_lite;
index 527039a..f2e78a9 100644 (file)
@@ -22,7 +22,6 @@
 #include "object-enchant/tr-types.h"
 #include "object-hook/hook-enchant.h"
 #include "object/object-flags.h"
-#include "object/object-generator.h"
 #include "object/object-mark-types.h"
 #include "system/floor-type-definition.h"
 #include "system/monster-race-definition.h"
@@ -196,7 +195,7 @@ void monster_drop_carried_objects(player_type *player_ptr, monster_type *m_ptr)
         const OBJECT_IDX this_o_idx = *it++;
         o_ptr = &player_ptr->current_floor_ptr->o_list[this_o_idx];
         q_ptr = &forge;
-        object_copy(q_ptr, o_ptr);
+        q_ptr->copy_from(o_ptr);
         q_ptr->held_m_idx = 0;
         delete_object_idx(player_ptr, this_o_idx);
         (void)drop_near(player_ptr, q_ptr, -1, m_ptr->fy, m_ptr->fx);
index 98c99ef..5e686b5 100644 (file)
@@ -64,7 +64,7 @@ static bool summon_specific_okay(player_type *player_ptr, MONRACE_IDX r_idx)
         && monster_has_hostile_align(player_ptr, NULL, 10, -10, r_ptr))
         return FALSE;
 
-    if ((r_ptr->flags7 & RF7_CHAMELEON) && (d_info[player_ptr->dungeon_idx].flags1 & DF1_CHAMELEON))
+    if ((r_ptr->flags7 & RF7_CHAMELEON) && d_info[player_ptr->dungeon_idx].flags.has(DF::CHAMELEON))
         return TRUE;
 
     if (summon_specific_who > 0) {
index 2f8c737..448437a 100644 (file)
@@ -29,7 +29,6 @@
 #include "object-enchant/apply-magic.h"
 #include "object-enchant/item-apply-magic.h"
 #include "object-hook/hook-checker.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "spell/spell-types.h"
 #include "spell/summon-types.h"
@@ -103,7 +102,7 @@ static void on_dead_bloodletter(player_type *player_ptr, monster_death_type *md_
 
     object_type forge;
     object_type *q_ptr = &forge;
-    object_prep(player_ptr, q_ptr, lookup_kind(TV_SWORD, SV_BLADE_OF_CHAOS));
+    q_ptr->prep(player_ptr, lookup_kind(TV_SWORD, SV_BLADE_OF_CHAOS));
     apply_magic_to_object(player_ptr, q_ptr, player_ptr->current_floor_ptr->object_level, AM_NO_FIXED_ART | md_ptr->mo_mode);
     (void)drop_near(player_ptr, q_ptr, -1, md_ptr->md_y, md_ptr->md_x);
 }
@@ -116,7 +115,7 @@ static void on_dead_raal(player_type *player_ptr, monster_death_type *md_ptr)
 
     object_type forge;
     object_type *q_ptr = &forge;
-    object_wipe(q_ptr);
+    q_ptr->wipe();
     if ((floor_ptr->dun_level > 49) && one_in_(5))
         get_obj_num_hook = kind_is_good_book;
     else
@@ -189,12 +188,12 @@ static void on_dead_serpent(player_type *player_ptr, monster_death_type *md_ptr)
 
     object_type forge;
     object_type *q_ptr = &forge;
-    object_prep(player_ptr, q_ptr, lookup_kind(TV_HAFTED, SV_GROND));
+    q_ptr->prep(player_ptr, lookup_kind(TV_HAFTED, SV_GROND));
     q_ptr->name1 = ART_GROND;
     apply_magic_to_object(player_ptr, q_ptr, -1, AM_GOOD | AM_GREAT);
     (void)drop_near(player_ptr, q_ptr, -1, md_ptr->md_y, md_ptr->md_x);
     q_ptr = &forge;
-    object_prep(player_ptr, q_ptr, lookup_kind(TV_CROWN, SV_CHAOS));
+    q_ptr->prep(player_ptr, lookup_kind(TV_CROWN, SV_CHAOS));
     q_ptr->name1 = ART_CHAOS;
     apply_magic_to_object(player_ptr, q_ptr, -1, AM_GOOD | AM_GREAT);
     (void)drop_near(player_ptr, q_ptr, -1, md_ptr->md_y, md_ptr->md_x);
@@ -207,7 +206,7 @@ static void on_dead_death_sword(player_type *player_ptr, monster_death_type *md_
 
     object_type forge;
     object_type *q_ptr = &forge;
-    object_prep(player_ptr, q_ptr, lookup_kind(TV_SWORD, randint1(2)));
+    q_ptr->prep(player_ptr, lookup_kind(TV_SWORD, randint1(2)));
     (void)drop_near(player_ptr, q_ptr, -1, md_ptr->md_y, md_ptr->md_x);
 }
 
@@ -222,7 +221,7 @@ static void on_dead_can_angel(player_type *player_ptr, monster_death_type *md_pt
 
     object_type forge;
     object_type *q_ptr = &forge;
-    object_prep(player_ptr, q_ptr, lookup_kind(TV_CHEST, SV_CHEST_KANDUME));
+    q_ptr->prep(player_ptr, lookup_kind(TV_CHEST, SV_CHEST_KANDUME));
     apply_magic_to_object(player_ptr, q_ptr, player_ptr->current_floor_ptr->object_level, AM_NO_FIXED_ART);
     (void)drop_near(player_ptr, q_ptr, -1, md_ptr->md_y, md_ptr->md_x);
 }
@@ -341,7 +340,7 @@ static void on_dead_big_raven(player_type *player_ptr, monster_death_type *md_pt
  */
 static bool make_equipment(player_type *player_ptr, object_type *q_ptr, const BIT_FLAGS drop_mode, const bool is_object_hook_null)
 {
-    object_wipe(q_ptr);
+    q_ptr->wipe();
     (void)make_object(player_ptr, q_ptr, drop_mode);
     if (!is_object_hook_null) {
         return true;
@@ -434,7 +433,7 @@ static void drop_specific_item_on_dead(player_type *player_ptr, monster_death_ty
 {
     object_type forge;
     object_type *q_ptr = &forge;
-    object_wipe(q_ptr);
+    q_ptr->wipe();
     get_obj_num_hook = object_hook_pf;
     (void)make_object(player_ptr, q_ptr, md_ptr->mo_mode);
     (void)drop_near(player_ptr, q_ptr, -1, md_ptr->md_y, md_ptr->md_x);
index 77381d0..cc3e8f7 100644 (file)
@@ -32,7 +32,6 @@
 #include "monster/monster-info.h"
 #include "monster/monster-update.h"
 #include "monster/monster-util.h"
-#include "object/object-generator.h"
 #include "pet/pet-fall-off.h"
 #include "player/player-status.h"
 #include "system/alloc-entries.h"
@@ -111,7 +110,7 @@ MONRACE_IDX get_mon_num(player_type *player_ptr, DEPTH min_level, DEPTH max_leve
     /* starts from 0, reaches +25lv after 75days from a max_level dependent base date */
     pls_max_level = MIN(NASTY_MON_PLUS_MAX, over_days / 3);
 
-    if (d_info[player_ptr->dungeon_idx].flags1 & DF1_MAZE) {
+    if (d_info[player_ptr->dungeon_idx].flags.has(DF::MAZE)) {
         pls_kakuritu = MIN(pls_kakuritu / 2, pls_kakuritu - 10);
         if (pls_kakuritu < 2)
             pls_kakuritu = 2;
@@ -120,7 +119,7 @@ MONRACE_IDX get_mon_num(player_type *player_ptr, DEPTH min_level, DEPTH max_leve
     }
 
     /* Boost the max_level */
-    if ((option & GMN_ARENA) || !(d_info[player_ptr->dungeon_idx].flags1 & DF1_BEGINNER)) {
+    if ((option & GMN_ARENA) || d_info[player_ptr->dungeon_idx].flags.has_not(DF::BEGINNER)) {
         /* Nightmare mode allows more out-of depth monsters */
         if (ironman_nightmare && !randint0(pls_kakuritu)) {
             /* What a bizarre calculation */
@@ -309,7 +308,7 @@ void choose_new_monster(player_type *player_ptr, MONSTER_IDX m_idx, bool born, M
         else
             level = floor_ptr->dun_level;
 
-        if (d_info[player_ptr->dungeon_idx].flags1 & DF1_CHAMELEON)
+        if (d_info[player_ptr->dungeon_idx].flags.has(DF::CHAMELEON))
             level += 2 + randint1(3);
 
         r_idx = get_mon_num(player_ptr, 0, level, 0);
index 2562352..08d2fc9 100644 (file)
@@ -796,7 +796,7 @@ bool mon_take_hit(player_type *target_ptr, MONSTER_IDX m_idx, HIT_POINT dam, boo
 #endif
         }
 
-        if (!(d_info[target_ptr->dungeon_idx].flags1 & DF1_BEGINNER)) {
+        if (d_info[target_ptr->dungeon_idx].flags.has_not(DF::BEGINNER)) {
             if (!target_ptr->current_floor_ptr->dun_level && !target_ptr->ambush_flag && !target_ptr->current_floor_ptr->inside_arena) {
                 chg_virtue(target_ptr, V_VALOUR, -1);
             } else if (r_ptr->level > target_ptr->current_floor_ptr->dun_level) {
index 43ede5d..1299535 100644 (file)
@@ -168,7 +168,7 @@ static um_type *initialize_um_type(player_type *subject_ptr, um_type *um_ptr, MO
     um_ptr->fx = um_ptr->m_ptr->fx;
     um_ptr->flag = FALSE;
     um_ptr->easy = FALSE;
-    um_ptr->in_darkness = (d_info[subject_ptr->dungeon_idx].flags1 & DF1_DARKNESS) && !subject_ptr->see_nocto;
+    um_ptr->in_darkness = d_info[subject_ptr->dungeon_idx].flags.has(DF::DARKNESS) && !subject_ptr->see_nocto;
     um_ptr->full = full;
     return um_ptr;
 }
index 1bc38c9..eea0576 100644 (file)
@@ -56,17 +56,17 @@ static bool restrict_monster_to_dungeon(player_type *player_ptr, MONRACE_IDX r_i
     dungeon_type *d_ptr = &d_info[d_idx];
     monster_race *r_ptr = &r_info[r_idx];
 
-    if (d_ptr->flags1 & DF1_CHAMELEON) {
+    if (d_ptr->flags.has(DF::CHAMELEON)) {
         if (chameleon_change_m_idx)
             return TRUE;
     }
 
-    if (d_ptr->flags1 & DF1_NO_MAGIC) {
+    if (d_ptr->flags.has(DF::NO_MAGIC)) {
         if (r_idx != MON_CHAMELEON && r_ptr->freq_spell && r_ptr->ability_flags.has_none_of(RF_ABILITY_NOMAGIC_MASK))
             return FALSE;
     }
 
-    if (d_ptr->flags1 & DF1_NO_MELEE) {
+    if (d_ptr->flags.has(DF::NO_MELEE)) {
         if (r_idx == MON_CHAMELEON)
             return TRUE;
         if (r_ptr->ability_flags.has_none_of(RF_ABILITY_BOLT_MASK | RF_ABILITY_BEAM_MASK | RF_ABILITY_BALL_MASK)
@@ -76,14 +76,14 @@ static bool restrict_monster_to_dungeon(player_type *player_ptr, MONRACE_IDX r_i
     }
 
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if (d_ptr->flags1 & DF1_BEGINNER) {
+    if (d_ptr->flags.has(DF::BEGINNER)) {
         if (r_ptr->level > floor_ptr->dun_level)
             return FALSE;
     }
 
     if (d_ptr->special_div >= 64)
         return TRUE;
-    if (summon_specific_type && !(d_ptr->flags1 & DF1_CHAMELEON))
+    if (summon_specific_type && d_ptr->flags.has_not(DF::CHAMELEON))
         return TRUE;
 
     byte a;
index 007cee5..656af9d 100644 (file)
@@ -50,7 +50,7 @@ static void set_no_magic_mask(msa_type *msa_ptr)
 static void check_mspell_stupid(player_type *target_ptr, msa_type *msa_ptr)
 {
     floor_type *floor_ptr = target_ptr->current_floor_ptr;
-    msa_ptr->in_no_magic_dungeon = (d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC) && floor_ptr->dun_level
+    msa_ptr->in_no_magic_dungeon = d_info[target_ptr->dungeon_idx].flags.has(DF::NO_MAGIC) && floor_ptr->dun_level
         && (!floor_ptr->inside_quest || is_fixed_quest_idx(floor_ptr->inside_quest));
     if (!msa_ptr->in_no_magic_dungeon || ((msa_ptr->r_ptr->flags2 & RF2_STUPID) != 0))
         return;
index fe75f29..a7a09c1 100644 (file)
@@ -187,7 +187,7 @@ void decide_lite_area(player_type *target_ptr, msa_type *msa_ptr)
     if ((msa_ptr->r_ptr->flags2 & RF2_STUPID) != 0)
         return;
 
-    if (d_info[target_ptr->dungeon_idx].flags1 & DF1_DARKNESS) {
+    if (d_info[target_ptr->dungeon_idx].flags.has(DF::DARKNESS)) {
         msa_ptr->ability_flags.reset(RF_ABILITY::DARKNESS);
         return;
     }
index cab2585..1649d97 100644 (file)
@@ -16,7 +16,6 @@
 #include "main/sound-of-music.h"
 #include "mutation/mutation-investor-remover.h"
 #include "object/object-broken.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-kind.h"
 #include "perception/object-perception.h"
@@ -139,7 +138,7 @@ void exe_quaff_potion(player_type *creature_ptr, INVENTORY_IDX item)
 
     o_ptr = ref_item(creature_ptr, item);
     q_ptr = &forge;
-    object_copy(q_ptr, o_ptr);
+    q_ptr->copy_from(o_ptr);
     q_ptr->number = 1;
     vary_item(creature_ptr, item, -1);
     sound(SOUND_QUAFF);
diff --git a/src/object/object-generator.cpp b/src/object/object-generator.cpp
deleted file mode 100644 (file)
index 6057695..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-#include "object/object-generator.h"
-#include "object-enchant/object-curse.h"
-#include "object-enchant/special-object-flags.h"
-#include "object-enchant/trc-types.h"
-#include "object-enchant/trg-types.h"
-#include "object/object-kind.h"
-#include "system/object-type-definition.h"
-#include "system/player-type-definition.h"
-
-/*!
- * @brief オブジェクトを初期化する
- * Wipe an object clean.
- * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
- */
-void object_wipe(object_type *o_ptr) { (void)WIPE(o_ptr, object_type); }
-
-/*!
- * @brief オブジェクトを複製する
- * Wipe an object clean.
- * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
- * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
- */
-void object_copy(object_type *o_ptr, object_type *j_ptr) { (void)COPY(o_ptr, j_ptr, object_type); }
-
-/*!
- * @brief オブジェクト構造体にベースアイテムを作成する
- * Prepare an object based on an object kind.
- * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
- * @param k_idx 新たに作成したいベースアイテム情報のID
- */
-void object_prep(player_type *player_ptr, object_type *o_ptr, KIND_OBJECT_IDX k_idx)
-{
-    object_kind *k_ptr = &k_info[k_idx];
-    object_wipe(o_ptr);
-    o_ptr->k_idx = k_idx;
-    o_ptr->tval = k_ptr->tval;
-    o_ptr->sval = k_ptr->sval;
-    o_ptr->pval = k_ptr->pval;
-    o_ptr->number = 1;
-    o_ptr->weight = k_ptr->weight;
-    o_ptr->to_h = k_ptr->to_h;
-    o_ptr->to_d = k_ptr->to_d;
-    o_ptr->to_a = k_ptr->to_a;
-    o_ptr->ac = k_ptr->ac;
-    o_ptr->dd = k_ptr->dd;
-    o_ptr->ds = k_ptr->ds;
-
-    if (k_ptr->act_idx > 0)
-        o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
-    if (k_info[o_ptr->k_idx].cost <= 0)
-        o_ptr->ident |= (IDENT_BROKEN);
-
-    if (k_ptr->gen_flags.has(TRG::CURSED))
-        o_ptr->curse_flags |= (TRC_CURSED);
-    if (k_ptr->gen_flags.has(TRG::HEAVY_CURSE))
-        o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
-    if (k_ptr->gen_flags.has(TRG::PERMA_CURSE))
-        o_ptr->curse_flags |= (TRC_PERMA_CURSE);
-    if (k_ptr->gen_flags.has(TRG::RANDOM_CURSE0))
-        o_ptr->curse_flags |= get_curse(player_ptr, 0, o_ptr);
-    if (k_ptr->gen_flags.has(TRG::RANDOM_CURSE1))
-        o_ptr->curse_flags |= get_curse(player_ptr, 1, o_ptr);
-    if (k_ptr->gen_flags.has(TRG::RANDOM_CURSE2))
-        o_ptr->curse_flags |= get_curse(player_ptr, 2, o_ptr);
-}
diff --git a/src/object/object-generator.h b/src/object/object-generator.h
deleted file mode 100644 (file)
index 37a7cd1..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#pragma once
-
-#include "system/angband.h"
-
-typedef struct object_type object_type;
-typedef struct player_type player_type;
-void object_wipe(object_type *o_ptr);
-void object_copy(object_type *o_ptr, object_type *j_ptr);
-void object_prep(player_type *player_ptr, object_type *o_ptr, KIND_OBJECT_IDX k_idx);
index 0ce3b19..7ce3868 100644 (file)
@@ -377,7 +377,7 @@ bool process_warning(player_type *creature_ptr, POSITION xx, POSITION yy)
             if (projectable(creature_ptr, my, mx, yy, xx)) {
                 const auto flags = r_ptr->ability_flags;
 
-                if (!(d_info[creature_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC)) {
+                if (d_info[creature_ptr->dungeon_idx].flags.has_not(DF::NO_MAGIC)) {
                     if (flags.has(RF_ABILITY::BA_CHAO))
                         spell_damcalc_by_spellnum(creature_ptr, RF_ABILITY::BA_CHAO, GF_CHAOS, g_ptr->m_idx, &dam_max0);
                     if (flags.has(RF_ABILITY::BA_MANA))
@@ -441,7 +441,7 @@ bool process_warning(player_type *creature_ptr, POSITION xx, POSITION yy)
             }
 
             /* Monster melee attacks */
-            if ((r_ptr->flags1 & RF1_NEVER_BLOW) || (d_info[creature_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)) {
+            if ((r_ptr->flags1 & RF1_NEVER_BLOW) || d_info[creature_ptr->dungeon_idx].flags.has(DF::NO_MELEE)) {
                 dam_max += dam_max0;
                 continue;
             }
index 91345bf..0cd2f0c 100644 (file)
@@ -7,7 +7,6 @@
 #include "object-enchant/special-object-flags.h"
 #include "object-enchant/trg-types.h"
 #include "object/item-tester-hooker.h" // 暫定、このファイルへ引っ越す.
-#include "object/object-generator.h"
 #include "object/object-kind.h"
 #include "system/object-type-definition.h"
 #include "system/player-type-definition.h"
@@ -70,7 +69,7 @@ void object_aware(player_type *owner_ptr, object_type *o_ptr)
     GAME_TEXT o_name[MAX_NLEN];
 
     q_ptr = &forge;
-    object_copy(q_ptr, o_ptr);
+    q_ptr->copy_from(o_ptr);
 
     q_ptr->number = 1;
     describe_flavor(owner_ptr, o_name, q_ptr, OD_NAME_ONLY);
index 502560a..484d417 100644 (file)
@@ -163,7 +163,7 @@ bool move_player_effect(player_type *creature_ptr, POSITION ny, POSITION nx, BIT
         if ((!creature_ptr->blind && !no_lite(creature_ptr)) || !is_trap(creature_ptr, g_ptr->feat))
             g_ptr->info &= ~(CAVE_UNSAFE);
 
-        if (floor_ptr->dun_level && (d_info[creature_ptr->dungeon_idx].flags1 & DF1_FORGET))
+        if (floor_ptr->dun_level && d_info[creature_ptr->dungeon_idx].flags.has(DF::FORGET))
             wiz_dark(creature_ptr);
 
         if (mpe_mode & MPE_HANDLE_STUFF)
index be01f41..28663fb 100644 (file)
@@ -4,7 +4,6 @@
 #include "object-enchant/trg-types.h"
 #include "object-hook/hook-enchant.h"
 #include "object-hook/hook-weapon.h"
-#include "object/object-generator.h"
 #include "object/object-kind.h"
 #include "object/object-value-calc.h"
 #include "object/object-value.h"
@@ -74,8 +73,8 @@ void calc_android_exp(player_type *creature_ptr)
         if (!o_ptr->k_idx)
             continue;
 
-        object_wipe(q_ptr);
-        object_copy(q_ptr, o_ptr);
+        q_ptr->wipe();
+        q_ptr->copy_from(o_ptr);
         q_ptr->discount = 0;
         q_ptr->curse_flags = 0L;
 
index 059ac9d..cd99973 100644 (file)
@@ -14,7 +14,7 @@
 
 bool vampirism(player_type *caster_ptr)
 {
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) {
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::NO_MELEE)) {
         msg_print(_("なぜか攻撃することができない。", "Something prevents you from attacking."));
         return FALSE;
     }
index bcbc448..621e1e0 100644 (file)
@@ -347,7 +347,7 @@ concptr do_hissatsu_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type m
                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
                 return NULL;
             }
-            if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) {
+            if (d_info[caster_ptr->dungeon_idx].flags.has(DF::NO_MELEE)) {
                 return "";
             }
             if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx) {
@@ -729,7 +729,7 @@ concptr do_hissatsu_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type m
                     return NULL;
                 }
 
-                if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) {
+                if (d_info[caster_ptr->dungeon_idx].flags.has(DF::NO_MELEE)) {
                     return "";
                 }
 
@@ -930,7 +930,7 @@ concptr do_hissatsu_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type m
             y = caster_ptr->y + ddy[dir];
             x = caster_ptr->x + ddx[dir];
 
-            if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) {
+            if (d_info[caster_ptr->dungeon_idx].flags.has(DF::NO_MELEE)) {
                 msg_print(_("なぜか攻撃することができない。", "Something prevents you from attacking."));
                 return "";
             }
index 0fdea2d..9bca371 100644 (file)
@@ -7,7 +7,6 @@
 #include "hpmp/hp-mp-processor.h"
 #include "monster-floor/monster-summon.h"
 #include "monster-floor/place-monster-types.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "player-attack/player-attack.h"
 #include "player-info/avatar.h"
@@ -134,7 +133,7 @@ concptr do_nature_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mod
                 msg_print(_("食料を生成した。", "A food ration is produced."));
 
                 /* Create the food ration */
-                object_prep(caster_ptr, q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
+                q_ptr->prep(caster_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
 
                 /* Drop the object from heaven */
                 (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
index 82cc067..a3e3da9 100644 (file)
@@ -471,7 +471,7 @@ bool generate_lake(player_type *player_ptr, POSITION y0, POSITION x0, POSITION x
 
             floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ICKY | CAVE_ROOM);
             if (cave_has_flag_bold(floor_ptr, y0 + y - yhsize, x0 + x - xhsize, FF_LAVA)) {
-                if (!(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS))
+                if (d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS))
                     floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info |= CAVE_GLOW;
             }
         }
index 25643b5..e930b33 100644 (file)
@@ -109,14 +109,14 @@ bool generate_rooms(player_type *player_ptr, dun_data_type *dd_ptr)
      * かつ「常に通常でない部屋を生成する」フラグがONならば、
      * GRATER_VAULTのみを生成対象とする。 / Ironman sees only Greater Vaults
      */
-    if (ironman_rooms && !((d_info[floor_ptr->dungeon_idx].flags1 & (DF1_BEGINNER | DF1_CHAMELEON | DF1_SMALLEST)))) {
+    if (ironman_rooms && d_info[floor_ptr->dungeon_idx].flags.has_none_of( {DF::BEGINNER, DF::CHAMELEON, DF::SMALLEST })) {
         for (int i = 0; i < ROOM_T_MAX; i++) {
             if (i == ROOM_T_GREATER_VAULT)
                 prob_list[i] = 1;
             else
                 prob_list[i] = 0;
         }
-    } else if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_VAULT) {
+    } else if (d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_VAULT)) {
         /*! @details ダンジョンにNO_VAULTフラグがあるならば、LESSER_VAULT / GREATER_VAULT/ RANDOM_VAULTを除外 / Forbidden vaults */
         prob_list[ROOM_T_LESSER_VAULT] = 0;
         prob_list[ROOM_T_GREATER_VAULT] = 0;
@@ -124,15 +124,15 @@ bool generate_rooms(player_type *player_ptr, dun_data_type *dd_ptr)
     }
 
     /*! @details ダンジョンにBEGINNERフラグがあるならば、FIXED_ROOMを除外 / Forbidden vaults */
-    if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_BEGINNER)
+    if (d_info[floor_ptr->dungeon_idx].flags.has(DF::BEGINNER))
         prob_list[ROOM_T_FIXED] = 0;
 
     /*! @details ダンジョンにNO_CAVEフラグがある場合、FRACAVEの生成枠がNORMALに与えられる。CRIPT、OVALの生成枠がINNER_Fに与えられる。/ NO_CAVE dungeon */
-    if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) {
+    if (d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE)) {
         move_prob_list(ROOM_T_NORMAL, ROOM_T_FRACAVE, prob_list);
         move_prob_list(ROOM_T_INNER_FEAT, ROOM_T_CRYPT, prob_list);
         move_prob_list(ROOM_T_INNER_FEAT, ROOM_T_OVAL, prob_list);
-    } else if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_CAVE) {
+    } else if (d_info[floor_ptr->dungeon_idx].flags.has(DF::CAVE)) {
         /*! @details ダンジョンにCAVEフラグがある場合、NORMALの生成枠がFRACAVEに与えられる。/ CAVE dungeon (Orc floor_ptr->grid_array etc.) */
         move_prob_list(ROOM_T_FRACAVE, ROOM_T_NORMAL, prob_list);
     } else if (dd_ptr->cavern || dd_ptr->empty_level) {
@@ -141,11 +141,11 @@ bool generate_rooms(player_type *player_ptr, dun_data_type *dd_ptr)
     }
 
     /*! @details ダンジョンに最初からGLASS_ROOMフラグがある場合、GLASS を生成から除外。/ Forbidden glass rooms */
-    if (!(d_info[floor_ptr->dungeon_idx].flags1 & DF1_GLASS_ROOM))
+    if (d_info[floor_ptr->dungeon_idx].flags.has_not(DF::GLASS_ROOM))
         prob_list[ROOM_T_GLASS] = 0;
 
     /*! @details ARCADEは同フラグがダンジョンにないと生成されない。 / Forbidden glass rooms */
-    if (!(d_info[floor_ptr->dungeon_idx].flags1 & DF1_ARCADE))
+    if (d_info[floor_ptr->dungeon_idx].flags.has_not(DF::ARCADE))
         prob_list[ROOM_T_ARCADE] = 0;
 
     ProbabilityTable<int> prob_table;
index 194cd16..4b9f9a3 100644 (file)
@@ -99,7 +99,7 @@ void build_cavern(player_type *player_ptr)
     bool light = FALSE;
     bool done = FALSE;
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if ((floor_ptr->dun_level <= randint1(50)) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS))
+    if ((floor_ptr->dun_level <= randint1(50)) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS))
         light = TRUE;
 
     POSITION xsize = floor_ptr->width - 1;
index 167e978..3f5f445 100644 (file)
@@ -46,7 +46,7 @@ bool build_type9(player_type *player_ptr, dun_data_type *dd_ptr)
        light = done = FALSE;
        room = TRUE;
 
-       if ((floor_ptr->dun_level <= randint1(25)) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS)) light = TRUE;
+       if ((floor_ptr->dun_level <= randint1(25)) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS)) light = TRUE;
 
        while (!done)
        {
index c3fd777..804d6ba 100644 (file)
@@ -98,7 +98,7 @@ void build_maze_vault(player_type *player_ptr, POSITION x0, POSITION y0, POSITIO
 {
     msg_print_wizard(player_ptr, CHEAT_DUNGEON, _("迷路ランダムVaultを生成しました。", "Maze Vault."));
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    bool light = ((floor_ptr->dun_level <= randint1(25)) && is_vault && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS));
+    bool light = ((floor_ptr->dun_level <= randint1(25)) && is_vault && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS));
     POSITION dy = ysize / 2 - 1;
     POSITION dx = xsize / 2 - 1;
     POSITION y1 = y0 - dy;
index 5762091..c64bb6e 100644 (file)
@@ -28,7 +28,7 @@ bool build_type1(player_type *player_ptr, dun_data_type *dd_ptr)
     grid_type *g_ptr;
 
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    bool curtain = (d_info[floor_ptr->dungeon_idx].flags1 & DF1_CURTAIN) && one_in_((d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) ? 48 : 512);
+    bool curtain = (d_info[floor_ptr->dungeon_idx].flags.has(DF::CURTAIN)) && one_in_(d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE) ? 48 : 512);
 
     /* Pick a room size */
     y1 = randint1(4);
@@ -56,7 +56,7 @@ bool build_type1(player_type *player_ptr, dun_data_type *dd_ptr)
     }
 
     /* Choose lite or dark */
-    light = ((floor_ptr->dun_level <= randint1(25)) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS));
+    light = ((floor_ptr->dun_level <= randint1(25)) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS));
 
     /* Get corner values */
     y1 = yval - ysize / 2;
@@ -153,7 +153,7 @@ bool build_type1(player_type *player_ptr, dun_data_type *dd_ptr)
     }
     /* Hack -- Occasional divided room */
     else if (one_in_(50)) {
-        bool curtain2 = (d_info[floor_ptr->dungeon_idx].flags1 & DF1_CURTAIN) && one_in_((d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) ? 2 : 128);
+        bool curtain2 = (d_info[floor_ptr->dungeon_idx].flags.has(DF::CURTAIN)) && one_in_(d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE) ? 2 : 128);
 
         if (randint1(100) < 50) {
             /* Horizontal wall */
@@ -205,7 +205,7 @@ bool build_type2(player_type *player_ptr, dun_data_type *dd_ptr)
         return FALSE;
 
     /* Choose lite or dark */
-    light = ((floor_ptr->dun_level <= randint1(25)) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS));
+    light = ((floor_ptr->dun_level <= randint1(25)) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS));
 
     /* Determine extents of the first room */
     y1a = yval - randint1(4);
@@ -316,7 +316,7 @@ bool build_type3(player_type *player_ptr, dun_data_type *dd_ptr)
         return FALSE;
 
     /* Choose lite or dark */
-    light = ((floor_ptr->dun_level <= randint1(25)) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS));
+    light = ((floor_ptr->dun_level <= randint1(25)) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS));
 
     /* For now, always 3x3 */
     wx = wy = 1;
@@ -489,9 +489,9 @@ bool build_type3(player_type *player_ptr, dun_data_type *dd_ptr)
             /* Sometimes shut using secret doors */
             if (one_in_(3)) {
                 int door_type
-                    = ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_CURTAIN) && one_in_((d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) ? 16 : 256))
+                    = (d_info[floor_ptr->dungeon_idx].flags.has(DF::CURTAIN) && one_in_(d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE) ? 16 : 256))
                     ? DOOR_CURTAIN
-                    : ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
+                    : (d_info[floor_ptr->dungeon_idx].flags.has(DF::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
 
                 place_secret_door(player_ptr, yval, x1a - 1, door_type);
                 place_secret_door(player_ptr, yval, x2a + 1, door_type);
@@ -551,7 +551,7 @@ bool build_type4(player_type *player_ptr, dun_data_type *dd_ptr)
         return FALSE;
 
     /* Choose lite or dark */
-    light = ((floor_ptr->dun_level <= randint1(25)) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS));
+    light = ((floor_ptr->dun_level <= randint1(25)) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS));
 
     /* Large room */
     y1 = yval - 4;
@@ -736,9 +736,9 @@ bool build_type4(player_type *player_ptr, dun_data_type *dd_ptr)
 
         /* Occasionally, some Inner rooms */
         if (one_in_(3)) {
-            int door_type = ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_CURTAIN) && one_in_((d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) ? 16 : 256))
+            int door_type = (d_info[floor_ptr->dungeon_idx].flags.has(DF::CURTAIN) && one_in_(d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE) ? 16 : 256))
                 ? DOOR_CURTAIN
-                : ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
+                : (d_info[floor_ptr->dungeon_idx].flags.has(DF::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
 
             /* Long horizontal walls */
             for (x = xval - 5; x <= xval + 5; x++) {
@@ -816,9 +816,9 @@ bool build_type4(player_type *player_ptr, dun_data_type *dd_ptr)
 
     /* Four small rooms. */
     case 5: {
-        int door_type = ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_CURTAIN) && one_in_((d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) ? 16 : 256))
+        int door_type = (d_info[floor_ptr->dungeon_idx].flags.has(DF::CURTAIN) && one_in_(d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE) ? 16 : 256))
             ? DOOR_CURTAIN
-            : ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
+            : (d_info[floor_ptr->dungeon_idx].flags.has(DF::GLASS_DOOR) ? DOOR_GLASS_DOOR : DOOR_DOOR);
 
         /* Inner "cross" */
         for (y = y1; y <= y2; y++) {
@@ -877,7 +877,7 @@ bool build_type11(player_type *player_ptr, dun_data_type *dd_ptr)
 
     /* Occasional light */
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if ((randint1(floor_ptr->dun_level) <= 15) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS))
+    if ((randint1(floor_ptr->dun_level) <= 15) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS))
         light = TRUE;
 
     rad = randint0(9);
@@ -929,7 +929,7 @@ bool build_type12(player_type *player_ptr, dun_data_type *dd_ptr)
 
     /* Occasional light */
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if ((randint1(floor_ptr->dun_level) <= 5) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS))
+    if ((randint1(floor_ptr->dun_level) <= 5) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS))
         light = TRUE;
 
     rad = randint1(9);
index 536d898..3d284dc 100644 (file)
@@ -43,7 +43,7 @@ bool build_type15(player_type *player_ptr, dun_data_type *dd_ptr)
         return FALSE;
 
     /* Choose lite or dark */
-    light = ((floor_ptr->dun_level <= randint1(25)) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS));
+    light = ((floor_ptr->dun_level <= randint1(25)) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS));
 
     /* Get corner values */
     y1 = yval - ysize / 2;
index 7231ec4..362031b 100644 (file)
@@ -42,7 +42,7 @@ bool build_type14(player_type *player_ptr, dun_data_type *dd_ptr)
 
     /* Choose lite or dark */
     floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    light = ((floor_ptr->dun_level <= randint1(25)) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS));
+    light = ((floor_ptr->dun_level <= randint1(25)) && d_info[floor_ptr->dungeon_idx].flags.has_not(DF::DARKNESS));
 
     /* Get corner values */
     y1 = yval - ysize / 2;
index c7fa777..d055fda 100644 (file)
@@ -1099,7 +1099,7 @@ bool build_type10(player_type *player_ptr, dun_data_type *dd_ptr)
     /* Select type of vault */
     do {
         vtype = randint1(15);
-    } while ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) && ((vtype == 1) || (vtype == 3) || (vtype == 8) || (vtype == 9) || (vtype == 11)));
+    } while (d_info[floor_ptr->dungeon_idx].flags.has(DF::NO_CAVE) && ((vtype == 1) || (vtype == 3) || (vtype == 8) || (vtype == 9) || (vtype == 11)));
 
     switch (vtype) {
         /* Build an appropriate room */
index 5971357..3cdf217 100644 (file)
@@ -194,7 +194,7 @@ bool find_space(player_type *player_ptr, dun_data_type *dd_ptr, POSITION *y, POS
     if (!candidates)
         return FALSE;
 
-    if (!(d_info[player_ptr->current_floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE))
+    if (d_info[player_ptr->current_floor_ptr->dungeon_idx].flags.has_not(DF::NO_CAVE))
         pick = randint1(candidates);
     else
         pick = candidates / 2 + 1;
index 4f81adf..6a90528 100644 (file)
@@ -101,7 +101,7 @@ static bool wr_savefile_new(player_type *player_ptr, save_type type)
 
     wr_u32b(tmp32u);
     for (int i = tmp32u - 1; i >= 0; i--)
-        wr_string(message_str((s16b)i));
+        wr_string(message_str(i));
 
     u16b tmp16u = max_r_idx;
     wr_u16b(tmp16u);
index 0d0147c..7cc01bb 100644 (file)
@@ -8,7 +8,6 @@
 #include "monster-floor/monster-summon.h"
 #include "monster-floor/place-monster-types.h"
 #include "object-enchant/item-apply-magic.h"
-#include "object/object-generator.h"
 #include "perception/object-perception.h"
 #include "player/player-class.h"
 #include "player/player-damage.h"
@@ -90,7 +89,7 @@ void chest_death(player_type *owner_ptr, bool scatter, POSITION y, POSITION x, O
        for (; number > 0; --number)
        {
                q_ptr = &forge;
-               object_wipe(q_ptr);
+        q_ptr->wipe();
 
                /* Small chests often drop gold */
                if (small && (randint0(100) < 25))
index 7eb5f56..692c331 100644 (file)
@@ -118,7 +118,7 @@ void update_lite_radius(player_type *creature_ptr)
         creature_ptr->cur_lite += rad;
     }
 
-    if (d_info[creature_ptr->dungeon_idx].flags1 & DF1_DARKNESS && creature_ptr->cur_lite > 1)
+    if (d_info[creature_ptr->dungeon_idx].flags.has(DF::DARKNESS) && creature_ptr->cur_lite > 1)
         creature_ptr->cur_lite = 1;
 
     if (creature_ptr->cur_lite <= 0 && creature_ptr->lite)
index 9c4a8f9..2677d5a 100644 (file)
@@ -325,7 +325,7 @@ bool earthquake(player_type *caster_ptr, POSITION cy, POSITION cx, POSITION r, M
                 continue;
             }
 
-            if ((d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS))
+            if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
                 continue;
 
             grid_type *cc_ptr;
index 19e4aa4..2ddcae4 100644 (file)
@@ -40,7 +40,7 @@
  */
 static bool detect_feat_flag(player_type *caster_ptr, POSITION range, int flag, bool known)
 {
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         range /= 3;
 
     grid_type *g_ptr;
@@ -167,7 +167,7 @@ bool detect_treasure(player_type *caster_ptr, POSITION range)
 bool detect_objects_gold(player_type *caster_ptr, POSITION range)
 {
     POSITION range2 = range;
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         range2 /= 3;
 
     /* Scan objects */
@@ -215,7 +215,7 @@ bool detect_objects_gold(player_type *caster_ptr, POSITION range)
 bool detect_objects_normal(player_type *caster_ptr, POSITION range)
 {
     POSITION range2 = range;
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         range2 /= 3;
 
     bool detect = FALSE;
@@ -269,7 +269,7 @@ bool detect_objects_normal(player_type *caster_ptr, POSITION range)
  */
 bool detect_objects_magic(player_type *caster_ptr, POSITION range)
 {
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         range /= 3;
 
     tval_type tv;
@@ -315,7 +315,7 @@ bool detect_objects_magic(player_type *caster_ptr, POSITION range)
  */
 bool detect_monsters_normal(player_type *caster_ptr, POSITION range)
 {
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         range /= 3;
 
     bool flag = FALSE;
@@ -354,7 +354,7 @@ bool detect_monsters_normal(player_type *caster_ptr, POSITION range)
  */
 bool detect_monsters_invis(player_type *caster_ptr, POSITION range)
 {
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         range /= 3;
 
     bool flag = FALSE;
@@ -399,7 +399,7 @@ bool detect_monsters_invis(player_type *caster_ptr, POSITION range)
  */
 bool detect_monsters_evil(player_type *caster_ptr, POSITION range)
 {
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         range /= 3;
 
     bool flag = FALSE;
@@ -444,7 +444,7 @@ bool detect_monsters_evil(player_type *caster_ptr, POSITION range)
  */
 bool detect_monsters_nonliving(player_type *caster_ptr, POSITION range)
 {
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         range /= 3;
 
     bool flag = FALSE;
@@ -484,7 +484,7 @@ bool detect_monsters_nonliving(player_type *caster_ptr, POSITION range)
  */
 bool detect_monsters_mind(player_type *caster_ptr, POSITION range)
 {
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         range /= 3;
 
     bool flag = FALSE;
@@ -527,7 +527,7 @@ bool detect_monsters_mind(player_type *caster_ptr, POSITION range)
  */
 bool detect_monsters_string(player_type *caster_ptr, POSITION range, concptr Match)
 {
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         range /= 3;
 
     bool flag = FALSE;
@@ -572,7 +572,7 @@ bool detect_monsters_string(player_type *caster_ptr, POSITION range, concptr Mat
  */
 bool detect_monsters_xxx(player_type *caster_ptr, POSITION range, u32b match_flag)
 {
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         range /= 3;
 
     bool flag = FALSE;
index 55f018c..7b32ce6 100644 (file)
@@ -12,7 +12,6 @@
 #include "object-hook/hook-weapon.h"
 #include "object/item-tester-hooker.h"
 #include "object/item-use-flags.h"
-#include "object/object-generator.h"
 #include "player-info/avatar.h"
 #include "racial/racial-android.h"
 #include "system/object-type-definition.h"
@@ -140,7 +139,7 @@ bool mundane_spell(player_type *owner_ptr, bool only_equip)
     byte marked = o_ptr->marked;
     u16b inscription = o_ptr->inscription;
 
-    object_prep(owner_ptr, o_ptr, o_ptr->k_idx);
+    o_ptr->prep(owner_ptr, o_ptr->k_idx);
 
     o_ptr->iy = iy;
     o_ptr->ix = ix;
index 1cea06e..17aaa22 100644 (file)
@@ -96,7 +96,7 @@ void wiz_lite(player_type *caster_ptr, bool ninja)
                 f_ptr = &f_info[get_feat_mimic(g_ptr)];
 
                 /* Perma-lite the grid */
-                if (!(d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS) && !ninja) {
+                if (d_info[caster_ptr->dungeon_idx].flags.has_not(DF::DARKNESS) && !ninja) {
                     g_ptr->info |= (CAVE_GLOW);
                 }
 
@@ -184,7 +184,7 @@ void wiz_dark(player_type *caster_ptr)
  */
 void map_area(player_type *caster_ptr, POSITION range)
 {
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS))
         range /= 3;
 
     /* Scan that area */
@@ -421,7 +421,7 @@ bool destroy_area(player_type *caster_ptr, POSITION y1, POSITION x1, POSITION r,
                 continue;
             }
 
-            if ((d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS))
+            if (d_info[floor_ptr->dungeon_idx].flags.has(DF::DARKNESS))
                 continue;
 
             DIRECTION i;
index cfc80ac..a0fe56a 100644 (file)
@@ -405,7 +405,7 @@ bool starlight(player_type *caster_ptr, bool magic)
  */
 bool lite_area(player_type *caster_ptr, HIT_POINT dam, POSITION rad)
 {
-    if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS) {
+    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS)) {
         msg_print(_("ダンジョンが光を吸収した。", "The darkness of this dungeon absorbs your light."));
         return FALSE;
     }
index c91dcb5..b7218e8 100644 (file)
@@ -29,7 +29,6 @@
 #include "object-hook/hook-weapon.h"
 #include "object/item-tester-hooker.h"
 #include "object/item-use-flags.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "object/object-kind.h"
 #include "perception/object-perception.h"
@@ -115,7 +114,7 @@ void amusement(player_type *creature_ptr, POSITION y1, POSITION x1, int num, boo
                 break;
         }
         i_ptr = &object_type_body;
-        object_wipe(i_ptr);
+        i_ptr->wipe();
         k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
 
         /* Paranoia - reroll if nothing */
@@ -144,7 +143,7 @@ void amusement(player_type *creature_ptr, POSITION y1, POSITION x1, int num, boo
         }
 
         /* Make an object (if possible) */
-        object_prep(creature_ptr, i_ptr, k_idx);
+        i_ptr->prep(creature_ptr, k_idx);
         if (a_idx)
             i_ptr->name1 = a_idx;
         apply_magic_to_object(creature_ptr, i_ptr, 1, AM_NO_FIXED_ART);
@@ -194,7 +193,7 @@ void acquirement(player_type *caster_ptr, POSITION y1, POSITION x1, int num, boo
     /* Acquirement */
     while (num--) {
         i_ptr = &object_type_body;
-        object_wipe(i_ptr);
+        i_ptr->wipe();
 
         /* Make a good (or great) object (if possible) */
         if (!make_object(caster_ptr, i_ptr, mode))
index c75f6ff..1e991e9 100644 (file)
@@ -24,7 +24,6 @@
 #include "inventory/inventory-slot-types.h"
 #include "mind/mind-force-trainer.h"
 #include "monster/monster-describer.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "object/object-kind.h"
 #include "player-info/avatar.h"
@@ -490,7 +489,7 @@ bool cosmic_cast_off(player_type *creature_ptr, object_type **o_ptr_ptr)
         return FALSE;
 
     object_type forge;
-    object_copy(&forge, o_ptr);
+    (&forge)->copy_from(o_ptr);
     inven_item_increase(creature_ptr, slot, (0 - o_ptr->number));
     inven_item_optimize(creature_ptr, slot);
 
index 6d9da5d..38d1e33 100644 (file)
@@ -18,7 +18,6 @@
 #include "io/input-key-requester.h"
 #include "main/music-definitions-table.h"
 #include "main/sound-of-music.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "player-status/player-energy.h"
 #include "store/cmd-store.h"
@@ -171,7 +170,7 @@ void do_cmd_store(player_type *player_ptr)
                 GAME_TEXT o_name[MAX_NLEN];
                 msg_print(_("ザックからアイテムがあふれてしまった!", "Your pack overflows!"));
                 q_ptr = &forge;
-                object_copy(q_ptr, o_ptr);
+                q_ptr->copy_from(o_ptr);
                 describe_flavor(player_ptr, o_name, q_ptr, 0);
                 msg_format(_("%sが落ちた。(%c)", "You drop %s (%c)."), o_name, index_to_label(item));
                 vary_item(player_ptr, item, -255);
index a0df4f1..eb561ec 100644 (file)
@@ -2,7 +2,6 @@
 #include "floor/floor-town.h"
 #include "game-option/birth-options.h"
 #include "game-option/game-play-options.h"
-#include "object/object-generator.h"
 #include "object/object-stack.h"
 #include "object/object-value.h"
 #include "player-info/avatar.h"
@@ -94,7 +93,7 @@ static bool exe_combine_store_items(object_type *o_ptr, object_type *j_ptr, cons
     for (k = i; k < st_ptr->stock_num; k++)
         st_ptr->stock[k] = st_ptr->stock[k + 1];
 
-    object_wipe(&st_ptr->stock[k]);
+    (&st_ptr->stock[k])->wipe();
     *combined = TRUE;
     return TRUE;
 }
@@ -151,11 +150,11 @@ static void exe_reorder_store_item(player_type *player_ptr, bool *flag)
         object_type *j_ptr;
         object_type forge;
         j_ptr = &forge;
-        object_copy(j_ptr, &st_ptr->stock[i]);
+        j_ptr->copy_from(&st_ptr->stock[i]);
         for (int k = i; k > j; k--)
-            object_copy(&st_ptr->stock[k], &st_ptr->stock[k - 1]);
+            (&st_ptr->stock[k])->copy_from(&st_ptr->stock[k - 1]);
 
-        object_copy(&st_ptr->stock[j], j_ptr);
+        (&st_ptr->stock[j])->copy_from(j_ptr);
     }
 }
 
index f22fb3a..e365405 100644 (file)
@@ -13,7 +13,6 @@
 #include "main/sound-of-music.h"
 #include "object-enchant/item-feeling.h"
 #include "object-enchant/special-object-flags.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-stack.h"
 #include "object/object-value.h"
@@ -210,7 +209,7 @@ void store_purchase(player_type *player_ptr)
     ITEM_NUMBER amt = 1;
     object_type forge;
     object_type *j_ptr = &forge;
-    object_copy(j_ptr, o_ptr);
+    j_ptr->copy_from(o_ptr);
 
     /*
      * If a rod or wand, allocate total maximum timeouts or charges
@@ -235,7 +234,7 @@ void store_purchase(player_type *player_ptr)
     }
 
     j_ptr = &forge;
-    object_copy(j_ptr, o_ptr);
+    j_ptr->copy_from(o_ptr);
 
     /*
      * If a rod or wand, allocate total maximum timeouts or charges
index e4ce2c6..57263ed 100644 (file)
@@ -8,7 +8,6 @@
 #include "io/tokenizer.h"
 #include "monster-race/monster-race.h"
 #include "object-enchant/special-object-flags.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "system/artifact-type-definition.h"
 #include "system/monster-race-definition.h"
@@ -77,7 +76,7 @@ void display_rumor(player_type *player_ptr, bool ex)
         KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
         object_type forge;
         object_type *q_ptr = &forge;
-        object_prep(player_ptr, q_ptr, k_idx);
+        q_ptr->prep(player_ptr, k_idx);
         q_ptr->name1 = a_idx;
         q_ptr->ident = IDENT_STORE;
         describe_flavor(player_ptr, fullname, q_ptr, OD_NAME_ONLY);
index 0a77562..65ec64d 100644 (file)
@@ -20,7 +20,6 @@
 #include "object-hook/hook-checker.h"
 #include "object/item-tester-hooker.h"
 #include "object/item-use-flags.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-stack.h"
 #include "object/object-value.h"
@@ -128,7 +127,7 @@ void store_sell(player_type *owner_ptr)
 
     object_type forge;
     object_type *q_ptr = &forge;
-    object_copy(q_ptr, o_ptr);
+    q_ptr->copy_from(o_ptr);
     q_ptr->number = amt;
 
     if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
@@ -170,7 +169,7 @@ void store_sell(player_type *owner_ptr)
 
             identify_item(owner_ptr, o_ptr);
             q_ptr = &forge;
-            object_copy(q_ptr, o_ptr);
+            q_ptr->copy_from(o_ptr);
             q_ptr->number = amt;
             q_ptr->ident |= IDENT_STORE;
 
index 696a10c..4d55a18 100644 (file)
@@ -10,7 +10,6 @@
 #include "object-enchant/item-feeling.h"
 #include "object-enchant/special-object-flags.h"
 #include "object-hook/hook-enchant.h"
-#include "object/object-generator.h"
 #include "object/object-kind.h"
 #include "object/object-value.h"
 #include "perception/object-perception.h"
@@ -63,7 +62,7 @@ void store_item_optimize(INVENTORY_IDX item)
     for (int j = item; j < st_ptr->stock_num; j++)
         st_ptr->stock[j] = st_ptr->stock[j + 1];
 
-    object_wipe(&st_ptr->stock[st_ptr->stock_num]);
+    (&st_ptr->stock[st_ptr->stock_num])->wipe();
 }
 
 /*!
@@ -153,7 +152,7 @@ void store_create(
         object_type forge;
         object_type *q_ptr;
         q_ptr = &forge;
-        object_prep(player_ptr, q_ptr, k_idx);
+        q_ptr->prep(player_ptr, k_idx);
         apply_magic_to_object(player_ptr, q_ptr, level, AM_NO_FIXED_ART);
         if (!(*store_will_buy)(player_ptr, q_ptr))
             continue;
index 45f4fc1..f05cd61 100644 (file)
@@ -19,7 +19,6 @@
 #include "main/sound-of-music.h"
 #include "object-enchant/special-object-flags.h"
 #include "object-hook/hook-enchant.h"
-#include "object/object-generator.h"
 #include "object/object-stack.h"
 #include "perception/identification.h"
 #include "perception/object-perception.h"
@@ -387,5 +386,5 @@ void store_init(int town_num, int store_num)
     st_ptr->stock_num = 0;
     st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
     for (int k = 0; k < st_ptr->stock_size; k++)
-        object_wipe(&st_ptr->stock[k]);
+        (&st_ptr->stock[k])->wipe();
 }
diff --git a/src/system/object-type-definition.cpp b/src/system/object-type-definition.cpp
new file mode 100644 (file)
index 0000000..8757902
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * @file object-type-definition.h
+ * @brief アイテム定義の構造体とエンティティ処理実装
+ * @author Hourier
+ * @date 2021/05/02
+ */
+
+#include "system/object-type-definition.h"
+#include "object-enchant/object-curse.h"
+#include "object-enchant/special-object-flags.h"
+#include "object-enchant/trc-types.h"
+#include "object-enchant/trg-types.h"
+#include "object/object-kind.h"
+#include "system/player-type-definition.h"
+
+/*!
+ * @brief オブジェクトを初期化する
+ * Wipe an object clean.
+ */
+void object_type::wipe()
+{
+    (void)WIPE(this, object_type);
+}
+
+/*!
+ * @brief オブジェクトを複製する
+ * Wipe an object clean.
+ * @param j_ptr 複製元のオブジェクトの構造体参照ポインタ
+ */
+void object_type::copy_from(object_type *j_ptr)
+{
+    (void)COPY(this, j_ptr, object_type);
+}
+
+/*!
+ * @brief オブジェクト構造体にベースアイテムを作成する
+ * Prepare an object based on an object kind.
+ * @param player_ptr プレーヤーへの参照ポインタ
+ * @param k_idx 新たに作成したいベースアイテム情報のID
+ */
+void object_type::prep(player_type *player_ptr, KIND_OBJECT_IDX ko_idx)
+{
+    object_kind *k_ptr = &k_info[ko_idx];
+    wipe();
+    this->k_idx = ko_idx;
+    this->tval = k_ptr->tval;
+    this->sval = k_ptr->sval;
+    this->pval = k_ptr->pval;
+    this->number = 1;
+    this->weight = k_ptr->weight;
+    this->to_h = k_ptr->to_h;
+    this->to_d = k_ptr->to_d;
+    this->to_a = k_ptr->to_a;
+    this->ac = k_ptr->ac;
+    this->dd = k_ptr->dd;
+    this->ds = k_ptr->ds;
+
+    if (k_ptr->act_idx > 0)
+        this->xtra2 = (XTRA8)k_ptr->act_idx;
+    if (k_info[this->k_idx].cost <= 0)
+        this->ident |= (IDENT_BROKEN);
+
+    if (k_ptr->gen_flags.has(TRG::CURSED))
+        this->curse_flags |= (TRC_CURSED);
+    if (k_ptr->gen_flags.has(TRG::HEAVY_CURSE))
+        this->curse_flags |= (TRC_HEAVY_CURSE);
+    if (k_ptr->gen_flags.has(TRG::PERMA_CURSE))
+        this->curse_flags |= (TRC_PERMA_CURSE);
+    if (k_ptr->gen_flags.has(TRG::RANDOM_CURSE0))
+        this->curse_flags |= get_curse(player_ptr, 0, this);
+    if (k_ptr->gen_flags.has(TRG::RANDOM_CURSE1))
+        this->curse_flags |= get_curse(player_ptr, 1, this);
+    if (k_ptr->gen_flags.has(TRG::RANDOM_CURSE2))
+        this->curse_flags |= get_curse(player_ptr, 2, this);
+}
index 1fb5775..50b35e4 100644 (file)
@@ -1,9 +1,17 @@
 #pragma once
 
+/*
+ * @file object-type-definition.h
+ * @brief アイテム定義の構造体とエンティティ処理定義
+ * @author Hourier
+ * @date 2021/05/02
+ */
+
 #include "object/tval-types.h"
 #include "system/angband.h"
 #include "system/system-variables.h"
 
+struct player_type;
 typedef struct object_type {
     KIND_OBJECT_IDX k_idx; /* Kind index (zero if "dead") */
     POSITION iy; /* Y-position on map, or zero */
@@ -42,4 +50,8 @@ typedef struct object_type {
     BIT_FLAGS curse_flags; /* Flags for curse */
     MONSTER_IDX held_m_idx; /*!< アイテムを所持しているモンスターID (いないなら 0) / Monster holding us (if any) */
     ARTIFACT_BIAS_IDX artifact_bias; /*!< ランダムアーティファクト生成時のバイアスID */
+
+    void wipe();
+    void copy_from(object_type *j_ptr);
+    void prep(player_type *player_ptr, KIND_OBJECT_IDX ko_idx);
 } object_type;
index c1a3d04..392669e 100644 (file)
@@ -1,5 +1,6 @@
 #pragma once
 
+#include "mutation/mutation-flag-types.h"
 #include "player-ability/player-ability-types.h"
 #include "player/player-race-types.h"
 #include "player/player-class-types.h"
@@ -11,7 +12,6 @@
 #define MAX_SKILLS 10
 #define MAX_MANE 16
 
-enum class MUTA;
 enum class RF_ABILITY;
 
 typedef struct floor_type floor_type;
index 6cd48fa..134a755 100644 (file)
@@ -2,8 +2,6 @@
 
 #include <bitset>
 
-#include "mutation/mutation-flag-types.h"
-
 /**
  * @brief フラグ集合を扱う、FlagGroupクラス
  *
index 27fbfec..0f8af1c 100644 (file)
@@ -188,6 +188,8 @@ static void process_light_equipment_characteristics(player_type *creature_ptr, a
             return;
         }
     }
+
+    char_stat.syms.emplace_back(".");
 }
 
 /*!
index 129dbca..260872f 100644 (file)
@@ -3,7 +3,6 @@
 #include "flavor/flavor-describer.h"
 #include "flavor/object-flavor-types.h"
 #include "object-enchant/special-object-flags.h"
-#include "object/object-generator.h"
 #include "perception/object-perception.h"
 #include "realm/realm-names-table.h"
 #include "spell/spell-info.h"
@@ -88,7 +87,7 @@ void display_koff(player_type *owner_ptr, KIND_OBJECT_IDX k_idx)
         return;
     q_ptr = &forge;
 
-    object_prep(owner_ptr, q_ptr, k_idx);
+    q_ptr->prep(owner_ptr, k_idx);
     describe_flavor(owner_ptr, o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
 
     term_putstr(0, 0, -1, TERM_WHITE, o_name);
index 480d0b5..478c29a 100644 (file)
@@ -43,9 +43,9 @@
 #include "window/main-window-equipments.h"
 #include "window/main-window-util.h"
 #include "world/world.h"
-#include <string>
-#include <sstream>
 #include <mutex>
+#include <sstream>
+#include <string>
 
 /*!
  * @brief サブウィンドウに所持品一覧を表示する / Hack -- display inventory in sub-windows
@@ -520,9 +520,11 @@ static void display_floor_item_list(player_type *player_ptr, const int y, const
     else if (g_ptr->m_idx > 0) {
         const monster_type *const m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
 
-        if (m_ptr->r_idx == 0)
+        if (player_ptr->image) {
+            sprintf(line, _("(X:%03d Y:%03d) 何か奇妙な物の足元の発見済みアイテム一覧", "Found items at (%03d,%03d) under something strange"), x, y);
+        } else if (m_ptr->r_idx == 0) {
             sprintf(line, _("(X:%03d Y:%03d) 奇妙な物体の足元のアイテム一覧", "Items at (%03d,%03d) under an odd object"), x, y);
-        else {
+        else {
             const monster_race *const r_ptr = &r_info[m_ptr->r_idx];
             sprintf(line, _("(X:%03d Y:%03d) %sの足元の発見済みアイテム一覧", "Found items at (%03d,%03d) under %s"), x, y, r_ptr->name.c_str());
         }
@@ -538,7 +540,6 @@ static void display_floor_item_list(player_type *player_ptr, const int y, const
         else
             sprintf(buf, _("%s", "on %s"), fn);
         sprintf(line, _("(X:%03d Y:%03d) %sの上の発見済みアイテム一覧", "Found items at (X:%03d Y:%03d) %s"), x, y, buf);
-
     }
     term_addstr(-1, TERM_WHITE, line);
 
index 1e7916b..0650c87 100644 (file)
@@ -1,6 +1,5 @@
 #include "wizard/fixed-artifacts-spoiler.h"
 #include "io/files-util.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "system/angband-version.h"
 #include "system/artifact-type-definition.h"
@@ -93,7 +92,7 @@ static bool make_fake_artifact(player_type *player_ptr, object_type *o_ptr, ARTI
     if (!i)
         return FALSE;
 
-    object_prep(player_ptr, o_ptr, i);
+    o_ptr->prep(player_ptr, i);
     o_ptr->name1 = name1;
     o_ptr->pval = a_ptr->pval;
     o_ptr->ac = a_ptr->ac;
@@ -169,7 +168,7 @@ spoiler_output_status spoil_fixed_artifact(concptr fname)
                 continue;
 
             q_ptr = &forge;
-            object_wipe(q_ptr);
+            q_ptr->wipe();
             if (!make_fake_artifact(&dummy, q_ptr, j))
                 continue;
 
index 6cb2765..00337e6 100644 (file)
@@ -4,7 +4,6 @@
 #include "io/files-util.h"
 #include "object-enchant/special-object-flags.h"
 #include "object-enchant/trg-types.h"
-#include "object/object-generator.h"
 #include "object/object-kind.h"
 #include "object/object-value.h"
 #include "system/angband-version.h"
@@ -30,7 +29,7 @@ static void kind_info(player_type *player_ptr, char *buf, char *dam, char *wgt,
 {
     object_type forge;
     object_type *q_ptr = &forge;
-    object_prep(player_ptr, q_ptr, k);
+    q_ptr->prep(player_ptr, k);
     q_ptr->ident |= IDENT_KNOWN;
     q_ptr->pval = 0;
     q_ptr->to_a = 0;
index 9438d05..efb2675 100644 (file)
@@ -23,7 +23,6 @@
 #include "object-hook/hook-checker.h"
 #include "object/item-use-flags.h"
 #include "object/object-flags.h"
-#include "object/object-generator.h"
 #include "object/object-info.h"
 #include "object/object-kind.h"
 #include "object/object-kind-hook.h"
@@ -46,6 +45,7 @@
 #include "util/int-char-converter.h"
 #include "wizard/wizard-special-process.h"
 #include "world/world.h"
+#include <algorithm>
 #include <sstream>
 #include <vector>
 
@@ -88,6 +88,17 @@ void display_wizard_sub_menu()
 }
 }
 
+/*!
+ * @brief キャスト先の型の最小値、最大値でclampする。
+ */
+template <typename T>
+T clamp_cast(int val)
+{
+    return static_cast<T>(std::clamp(val,
+        static_cast<int>(std::numeric_limits<T>::min()),
+        static_cast<int>(std::numeric_limits<T>::max())));
+}
+
 void wiz_restore_aware_flag_of_fixed_arfifact(ARTIFACT_IDX a_idx, bool aware = false);
 void wiz_modify_item_activation(player_type *caster_ptr);
 void wiz_identify_full_inventory(player_type *caster_ptr);
@@ -439,7 +450,7 @@ static void wiz_statistics(player_type *caster_ptr, object_type *o_ptr)
 
             object_type forge;
             object_type *q_ptr = &forge;
-            object_wipe(q_ptr);
+            q_ptr->wipe();
             make_object(caster_ptr, q_ptr, mode);
             if (object_is_fixed_artifact(q_ptr))
                 a_info[q_ptr->name1].cur_num = 0;
@@ -481,7 +492,7 @@ static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
     object_type forge;
     object_type *q_ptr;
     q_ptr = &forge;
-    object_copy(q_ptr, o_ptr);
+    q_ptr->copy_from(o_ptr);
 
     char ch;
     bool changed = FALSE;
@@ -510,32 +521,32 @@ static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
         switch (tolower(ch)) {
         /* Apply bad magic, but first clear object */
         case 'w':
-            object_prep(owner_ptr, q_ptr, o_ptr->k_idx);
+            q_ptr->prep(owner_ptr, o_ptr->k_idx);
             apply_magic_to_object(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED);
             break;
         /* Apply bad magic, but first clear object */
         case 'c':
-            object_prep(owner_ptr, q_ptr, o_ptr->k_idx);
+            q_ptr->prep(owner_ptr, o_ptr->k_idx);
             apply_magic_to_object(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED);
             break;
         /* Apply normal magic, but first clear object */
         case 'n':
-            object_prep(owner_ptr, q_ptr, o_ptr->k_idx);
+            q_ptr->prep(owner_ptr, o_ptr->k_idx);
             apply_magic_to_object(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
             break;
         /* Apply good magic, but first clear object */
         case 'g':
-            object_prep(owner_ptr, q_ptr, o_ptr->k_idx);
+            q_ptr->prep(owner_ptr, o_ptr->k_idx);
             apply_magic_to_object(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD);
             break;
         /* Apply great magic, but first clear object */
         case 'e':
-            object_prep(owner_ptr, q_ptr, o_ptr->k_idx);
+            q_ptr->prep(owner_ptr, o_ptr->k_idx);
             apply_magic_to_object(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT);
             break;
         /* Apply special magic, but first clear object */
         case 's':
-            object_prep(owner_ptr, q_ptr, o_ptr->k_idx);
+            q_ptr->prep(owner_ptr, o_ptr->k_idx);
             apply_magic_to_object(owner_ptr, q_ptr, owner_ptr->current_floor_ptr->dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL);
             if (!object_is_artifact(q_ptr))
                 become_random_artifact(owner_ptr, q_ptr, FALSE);
@@ -553,7 +564,7 @@ static void wiz_reroll_item(player_type *owner_ptr, object_type *o_ptr)
     if (!changed)
         return;
 
-    object_copy(o_ptr, q_ptr);
+    o_ptr->copy_from(q_ptr);
     set_bits(owner_ptr->update, PU_BONUS | PU_COMBINE | PU_REORDER);
     set_bits(owner_ptr->window_flags, PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_FLOOR_ITEM_LIST);
 }
@@ -574,28 +585,28 @@ static void wiz_tweak_item(player_type *player_ptr, object_type *o_ptr)
     if (!get_string(p, tmp_val, 5))
         return;
 
-    o_ptr->pval = (s16b)atoi(tmp_val);
+    o_ptr->pval = clamp_cast<s16b>(atoi(tmp_val));
     wiz_display_item(player_ptr, o_ptr);
     p = "Enter new 'to_a' setting: ";
     sprintf(tmp_val, "%d", o_ptr->to_a);
     if (!get_string(p, tmp_val, 5))
         return;
 
-    o_ptr->to_a = (s16b)atoi(tmp_val);
+    o_ptr->to_a = clamp_cast<s16b>(atoi(tmp_val));
     wiz_display_item(player_ptr, o_ptr);
     p = "Enter new 'to_h' setting: ";
     sprintf(tmp_val, "%d", o_ptr->to_h);
     if (!get_string(p, tmp_val, 5))
         return;
 
-    o_ptr->to_h = (s16b)atoi(tmp_val);
+    o_ptr->to_h = clamp_cast<s16b>(atoi(tmp_val));
     wiz_display_item(player_ptr, o_ptr);
     p = "Enter new 'to_d' setting: ";
     sprintf(tmp_val, "%d", (int)o_ptr->to_d);
     if (!get_string(p, tmp_val, 5))
         return;
 
-    o_ptr->to_d = (s16b)atoi(tmp_val);
+    o_ptr->to_d = clamp_cast<s16b>(atoi(tmp_val));
     wiz_display_item(player_ptr, o_ptr);
 }
 
@@ -652,7 +663,7 @@ void wiz_modify_item(player_type *creature_ptr)
     object_type forge;
     object_type *q_ptr;
     q_ptr = &forge;
-    object_copy(q_ptr, o_ptr);
+    q_ptr->copy_from(o_ptr);
     char ch;
     bool changed = FALSE;
     while (TRUE) {
@@ -688,7 +699,7 @@ void wiz_modify_item(player_type *creature_ptr)
     if (changed) {
         msg_print("Changes accepted.");
 
-        object_copy(o_ptr, q_ptr);
+        o_ptr->copy_from(q_ptr);
         set_bits(creature_ptr->update, PU_BONUS | PU_COMBINE | PU_REORDER);
         set_bits(creature_ptr->window_flags, PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_FLOOR_ITEM_LIST);
     } else {
@@ -844,7 +855,7 @@ WishResult do_cmd_wishing(player_type *caster_ptr, int prob, bool allow_art, boo
             if (k_ptr->name.empty())
                 continue;
 
-            object_prep(caster_ptr, o_ptr, k);
+            o_ptr->prep(caster_ptr, k);
             describe_flavor(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
 #ifndef JP
             str_tolower(o_name);
@@ -864,7 +875,7 @@ WishResult do_cmd_wishing(player_type *caster_ptr, int prob, bool allow_art, boo
 
         if (allow_ego && k_ids.size() == 1) {
             KIND_OBJECT_IDX k_idx = k_ids.back();
-            object_prep(caster_ptr, o_ptr, k_idx);
+            o_ptr->prep(caster_ptr, k_idx);
 
             for (EGO_IDX k = 1; k < max_e_idx; k++) {
                 ego_item_type *e_ptr = &e_info[k];
@@ -905,7 +916,7 @@ WishResult do_cmd_wishing(player_type *caster_ptr, int prob, bool allow_art, boo
             if (!k_idx)
                 continue;
 
-            object_prep(caster_ptr, o_ptr, k_idx);
+            o_ptr->prep(caster_ptr, k_idx);
             o_ptr->name1 = i;
 
             describe_flavor(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
@@ -1015,7 +1026,7 @@ WishResult do_cmd_wishing(player_type *caster_ptr, int prob, bool allow_art, boo
         if (wish_randart) {
             if (must || ok_art) {
                 do {
-                    object_prep(caster_ptr, o_ptr, k_idx);
+                    o_ptr->prep(caster_ptr, k_idx);
                     apply_magic_to_object(caster_ptr, o_ptr, k_ptr->level, (AM_SPECIAL | AM_NO_FIXED_ART));
                 } while (!o_ptr->art_name || o_ptr->name1 || o_ptr->name2 || object_is_cursed(o_ptr));
 
@@ -1031,14 +1042,14 @@ WishResult do_cmd_wishing(player_type *caster_ptr, int prob, bool allow_art, boo
         if (allow_ego && (wish_ego || e_ids.size() > 0)) {
             if (must || ok_ego) {
                 if (e_ids.size() > 0) {
-                    object_prep(caster_ptr, o_ptr, k_idx);
+                    o_ptr->prep(caster_ptr, k_idx);
                     o_ptr->name2 = e_ids[0];
                     apply_ego(caster_ptr, o_ptr, caster_ptr->current_floor_ptr->base_level);
                 } else {
                     int max_roll = 1000;
                     int i = 0;
                     for (i = 0; i < max_roll; i++) {
-                        object_prep(caster_ptr, o_ptr, k_idx);
+                        o_ptr->prep(caster_ptr, k_idx);
                         (void)apply_magic_to_object(caster_ptr, o_ptr, k_ptr->level, (AM_GREAT | AM_NO_FIXED_ART));
 
                         if (o_ptr->name1 || o_ptr->art_name)
@@ -1071,7 +1082,7 @@ WishResult do_cmd_wishing(player_type *caster_ptr, int prob, bool allow_art, boo
             res = WishResult::EGO;
         } else {
             for (int i = 0; i < 100; i++) {
-                object_prep(caster_ptr, o_ptr, k_idx);
+                o_ptr->prep(caster_ptr, k_idx);
                 apply_magic_to_object(caster_ptr, o_ptr, 0, (AM_NO_FIXED_ART));
                 if (!object_is_cursed(o_ptr))
                     break;
index e7e6fa1..e20cf7a 100644 (file)
@@ -52,7 +52,6 @@
 #include "object-enchant/item-apply-magic.h"
 #include "object-enchant/trc-types.h"
 #include "object-enchant/trg-types.h"
-#include "object/object-generator.h"
 #include "object/object-kind.h"
 #include "perception/object-perception.h"
 #include "player-info/self-info.h"
@@ -203,7 +202,7 @@ void wiz_create_item(player_type *caster_ptr)
     object_type forge;
     object_type *q_ptr;
     q_ptr = &forge;
-    object_prep(caster_ptr, q_ptr, k_idx);
+    q_ptr->prep(caster_ptr, k_idx);
     apply_magic_to_object(caster_ptr, q_ptr, caster_ptr->current_floor_ptr->dun_level, AM_NO_FIXED_ART);
     (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x);
     msg_print("Allocated.");
@@ -440,7 +439,7 @@ void wiz_learn_items_all(player_type *caster_ptr)
         object_kind *k_ptr = &k_info[i];
         if (k_ptr->level <= command_arg) {
             q_ptr = &forge;
-            object_prep(caster_ptr, q_ptr, i);
+            q_ptr->prep(caster_ptr, i);
             object_aware(caster_ptr, q_ptr);
         }
     }
index d181ed6..4788f29 100644 (file)
@@ -19,7 +19,6 @@
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags7.h"
 #include "monster-race/race-flags8.h"
-#include "object/object-generator.h"
 #include "object/object-kind-hook.h"
 #include "player/player-class.h"
 #include "realm/realm-names-table.h"
@@ -260,7 +259,7 @@ static spoiler_output_status spoil_player_spell(concptr fname)
         if (magic_ptr->spell_book != 0) {
             object_type book;
             auto o_ptr = &book;
-            object_prep(&dummy_p, o_ptr, lookup_kind(magic_ptr->spell_book, 0));
+            o_ptr->prep(&dummy_p, lookup_kind(magic_ptr->spell_book, 0));
             describe_flavor(&dummy_p, title, o_ptr, OD_NAME_ONLY);
             book_name = title;
             char *s = angband_strchr(book_name, '[');
index 044280c..91d5a50 100644 (file)
@@ -73,7 +73,7 @@ OBJECT_IDX get_obj_num(player_type *owner_ptr, DEPTH level, BIT_FLAGS mode)
     if (level > MAX_DEPTH - 1)
         level = MAX_DEPTH - 1;
 
-    if ((level > 0) && !(d_info[owner_ptr->dungeon_idx].flags1 & DF1_BEGINNER)) {
+    if ((level > 0) && d_info[owner_ptr->dungeon_idx].flags.has_not(DF::BEGINNER)) {
         if (one_in_(GREAT_OBJ)) {
             level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
         }