OSDN Git Service

[Fix] 油つぼからランタンの燃料補給ができなくなる
[hengbandforosx/hengbandosx.git] / src / load / old / item-loader-savefile50.cpp
index 731c4e8..2639c6d 100644 (file)
@@ -40,17 +40,17 @@ void ItemLoader50::rd_item(ObjectType *o_ptr)
     o_ptr->discount = any_bits(flags, SaveDataItemFlagType::DISCOUNT) ? rd_byte() : 0;
     o_ptr->number = any_bits(flags, SaveDataItemFlagType::NUMBER) ? rd_byte() : 1;
     o_ptr->weight = rd_s16b();
-    if (any_bits(flags, SaveDataItemFlagType::NAME1)) {
+    if (any_bits(flags, SaveDataItemFlagType::FIXED_ARTIFACT_IDX)) {
         if (h_older_than(3, 0, 0, 2)) {
-            o_ptr->name1 = rd_byte();
+            o_ptr->fixed_artifact_idx = rd_byte();
         } else {
-            o_ptr->name1 = rd_s16b();
+            o_ptr->fixed_artifact_idx = rd_s16b();
         }
     } else {
-        o_ptr->name1 = 0;
+        o_ptr->fixed_artifact_idx = 0;
     }
 
-    o_ptr->name2 = any_bits(flags, SaveDataItemFlagType::NAME2) ? rd_byte() : 0;
+    o_ptr->ego_idx = i2enum<EgoType>(any_bits(flags, SaveDataItemFlagType::EGO_IDX) ? rd_byte() : 0);
     o_ptr->timeout = any_bits(flags, SaveDataItemFlagType::TIMEOUT) ? rd_s16b() : 0;
     o_ptr->to_h = any_bits(flags, SaveDataItemFlagType::TO_H) ? rd_s16b() : 0;
     o_ptr->to_d = any_bits(flags, SaveDataItemFlagType::TO_D) ? rd_s16b() : 0;
@@ -116,9 +116,9 @@ void ItemLoader50::rd_item(ObjectType *o_ptr)
 
     // xtra3フィールドが複数目的に共用されていた頃の名残.
     if (loading_savefile_version_is_older_than(12)) {
-        int8_t tmp8s = any_bits(flags, SavedataItemOlderThan12FlagType::XTRA3) ? rd_byte() : 0;
+        uint8_t tmp8s = any_bits(flags, SavedataItemOlderThan12FlagType::XTRA3) ? rd_byte() : 0;
         if (o_ptr->tval == ItemKindType::CHEST) {
-            o_ptr->chest_level = static_cast<uint8_t>(tmp8s);
+            o_ptr->chest_level = tmp8s;
         } else if (o_ptr->tval == ItemKindType::CAPTURE) {
             o_ptr->captured_monster_speed = tmp8s;
         }
@@ -131,7 +131,7 @@ void ItemLoader50::rd_item(ObjectType *o_ptr)
     if (loading_savefile_version_is_older_than(13)) {
         int16_t xtra4 = any_bits(flags, SavedataItemOlderThan13FlagType::XTRA4) ? rd_s16b() : 0;
         if (o_ptr->is_fuel()) {
-            o_ptr->fuel = static_cast<ushort>(xtra4);
+            o_ptr->fuel = static_cast<short>(xtra4);
         } else if (o_ptr->tval == ItemKindType::CAPTURE) {
             o_ptr->captured_monster_current_hp = xtra4;
         } else {
@@ -139,10 +139,17 @@ void ItemLoader50::rd_item(ObjectType *o_ptr)
             o_ptr->smith_damage = static_cast<byte>(xtra4 & 0x000f);
         }
     } else {
-        o_ptr->fuel = any_bits(flags, SaveDataItemFlagType::FUEL) ? rd_u16b() : 0;
+        o_ptr->fuel = any_bits(flags, SaveDataItemFlagType::FUEL) ? rd_s16b() : 0;
         o_ptr->captured_monster_current_hp = any_bits(flags, SaveDataItemFlagType::CAPTURED_MONSTER_CURRENT_HP) ? rd_s16b() : 0;
     }
 
+    if (o_ptr->is_fuel() && (o_ptr->tval == ItemKindType::LITE)) {
+        const auto fuel_max = o_ptr->sval == SV_LITE_TORCH ? FUEL_TORCH : FUEL_LAMP;
+        if (o_ptr->fuel < 0 || o_ptr->fuel > fuel_max) {
+            o_ptr->fuel = 0;
+        }
+    }
+
     o_ptr->captured_monster_max_hp = any_bits(flags, SaveDataItemFlagType::XTRA5) ? rd_s16b() : 0;
     o_ptr->feeling = any_bits(flags, SaveDataItemFlagType::FEELING) ? rd_byte() : 0;
     o_ptr->stack_idx = any_bits(flags, SaveDataItemFlagType::STACK_IDX) ? rd_s16b() : 0;
@@ -181,7 +188,7 @@ void ItemLoader50::rd_item(ObjectType *o_ptr)
         return;
     }
 
-    if ((o_ptr->name2 == EGO_DARK) || (o_ptr->name2 == EGO_ANCIENT_CURSE) || (o_ptr->name1 == ART_NIGHT)) {
+    if ((o_ptr->ego_idx == EgoType::DARK) || (o_ptr->ego_idx == EgoType::ANCIENT_CURSE) || (o_ptr->fixed_artifact_idx == ART_NIGHT)) {
         o_ptr->art_flags.set(TR_LITE_M1);
         o_ptr->art_flags.reset(TR_LITE_1);
         o_ptr->art_flags.reset(TR_LITE_2);
@@ -189,7 +196,7 @@ void ItemLoader50::rd_item(ObjectType *o_ptr)
         return;
     }
 
-    if (o_ptr->name2 == EGO_LITE_DARKNESS) {
+    if (o_ptr->ego_idx == EgoType::LITE_DARKNESS) {
         if (o_ptr->tval != ItemKindType::LITE) {
             o_ptr->art_flags.set(TR_LITE_M1);
             return;