From 36a0eb00994b1347de5fbac13b6a3901f755ec27 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Clean up load_player() a little --- src/loadsave.cc | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 1806d7c8..4c313901 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2727,8 +2727,6 @@ static errr rd_savefile(void) */ bool_ load_player(void) { - int fd = -1; - errr err = 0; cptr what = "generic"; @@ -2761,13 +2759,16 @@ bool_ load_player(void) if (!err) { /* Open the savefile */ - fd = fd_open(savefile, O_RDONLY); + int fd = fd_open(savefile, O_RDONLY); /* No file */ if (fd < 0) err = -1; /* Message (below) */ if (err) what = "Cannot open savefile"; + + /* Close the file */ + if (!err) fd_close(fd); } /* Process file */ @@ -2777,18 +2778,13 @@ bool_ load_player(void) /* Open the file XXX XXX XXX XXX Should use Angband file interface */ fff = my_fopen(savefile, "rb"); -/* fff = fdopen(fd, "r"); */ /* Read the first four bytes */ do_u32b(&vernum, ls_flag_t::LOAD); do_byte(&tmp8u, ls_flag_t::LOAD); // For comatibility with old savefiles - /* XXX XXX XXX XXX Should use Angband file interface */ my_fclose(fff); - /* fclose(fff) */ - /* Close the file */ - fd_close(fd); } /* Process file */ -- cgit v1.2.3 From a343ccf6b05df1d889cb4302a3e9e21c4816c048 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Remove player gender, age, height, etc. --- src/loadsave.cc | 25 ------------------------- 1 file changed, 25 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 4c313901..d358e271 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -259,7 +259,6 @@ static void do_quick_start(ls_flag_t flag) u32b tmp32u; int i; - do_s16b(&previous_char.sex, flag); do_s16b(&previous_char.race, flag); do_s16b(&previous_char.rmod, flag); do_s16b(&previous_char.pclass, flag); @@ -267,10 +266,6 @@ static void do_quick_start(ls_flag_t flag) do_byte(&previous_char.quests, flag); do_byte(&previous_char.god, flag); do_s32b(&previous_char.grace, flag); - do_s16b(&previous_char.age, flag); - do_s16b(&previous_char.wt, flag); - do_s16b(&previous_char.ht, flag); - do_s16b(&previous_char.sc, flag); do_s32b(&previous_char.au, flag); for (i = 0; i < 6; i++) do_s16b(&(previous_char.stat[i]), flag); @@ -334,19 +329,6 @@ static void do_subrace(ls_flag_t flag) do_byte((byte*)&sr_ptr->r_mhp, flag); do_s16b(&sr_ptr->r_exp, flag); - do_byte((byte*)&sr_ptr->b_age, flag); - do_byte((byte*)&sr_ptr->m_age, flag); - - do_byte((byte*)&sr_ptr->m_b_ht, flag); - do_byte((byte*)&sr_ptr->m_m_ht, flag); - do_byte((byte*)&sr_ptr->f_b_ht, flag); - do_byte((byte*)&sr_ptr->f_m_ht, flag); - - do_byte((byte*)&sr_ptr->m_b_wt, flag); - do_byte((byte*)&sr_ptr->m_m_wt, flag); - do_byte((byte*)&sr_ptr->f_b_wt, flag); - do_byte((byte*)&sr_ptr->f_m_wt, flag); - do_byte((byte*)&sr_ptr->infra, flag); for (i = 0; i < 4; i++) @@ -513,7 +495,6 @@ static bool_ do_extra(ls_flag_t flag) do_byte(&p_ptr->pracem, flag); do_byte(&p_ptr->pclass, flag); do_byte(&p_ptr->pspec, flag); - do_byte(&p_ptr->psex, flag); do_u16b(&tmp16b, flag); do_u16b(&tmp16b, flag); do_byte(&p_ptr->mimic_form, flag); @@ -523,10 +504,6 @@ static bool_ do_extra(ls_flag_t flag) do_byte(&p_ptr->hitdie, flag); do_u16b(&p_ptr->expfact, flag); - do_s16b(&p_ptr->age, flag); - do_s16b(&p_ptr->ht, flag); - do_s16b(&p_ptr->wt, flag); - /* Dump the stats (maximum and current) */ for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_max[i], flag); for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cur[i], flag); @@ -696,7 +673,6 @@ static bool_ do_extra(ls_flag_t flag) /* More info */ tmp16s = 0; - do_s16b(&p_ptr->sc, flag); do_s16b(&p_ptr->blind, flag); do_s16b(&p_ptr->paralyzed, flag); do_s16b(&p_ptr->confused, flag); @@ -2261,7 +2237,6 @@ static void junkinit(void) static void morejunk(void) { - sp_ptr = &sex_info[p_ptr->psex]; /* Sex */ rp_ptr = &race_info[p_ptr->prace]; /* Raceclass */ rmp_ptr = &race_mod_info[p_ptr->pracem]; cp_ptr = &class_info[p_ptr->pclass]; -- cgit v1.2.3 From 899041ce6b7cbc33e8cb3124aaa54b518c4a4b72 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 29 Mar 2016 20:32:55 +0200 Subject: Convert dungeon_info_type to use new flag_set --- src/loadsave.cc | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index d358e271..6b3ad713 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1311,8 +1311,6 @@ static void my_sentinel(const char *place, u16b value, ls_flag_t flag) */ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) { - int i; - cave_type *c_ptr; /* Read specific */ @@ -1331,8 +1329,10 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) do_s16b(&max_panel_rows, flag); do_s16b(&max_panel_cols, flag); - do_u32b(&dungeon_flags1, flag); - do_u32b(&dungeon_flags2, flag); + for (std::size_t i = 0; i < dungeon_flags.size(); i++) + { + do_u32b(&dungeon_flags[i], flag); + } /* Last teleportation */ do_s16b(&last_teleportation_y, flag); @@ -1347,7 +1347,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) quit("Too many spell effects"); } - for (i = 0; i < tmp16b; ++i) + for (std::size_t i = 0; i < tmp16b; ++i) { do_s16b(&effects[i].type, flag); do_s16b(&effects[i].dam, flag); @@ -1359,7 +1359,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) } /* TO prevent bugs with evolving dungeons */ - for (i = 0; i < 100; i++) + for (std::size_t i = 0; i < 100; i++) { do_s16b(&floor_type[i], flag); do_s16b(&fill_type[i], flag); @@ -1393,7 +1393,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) if (no_companions) { - for (i = 1; i < o_max; i++) + for (int i = 1; i < o_max; i++) { object_type *o_ptr = &o_list[i]; @@ -1418,7 +1418,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) } /* Dungeon items */ - for (i = 1; i < tmp16b; i++) + for (int i = 1; i < tmp16b; i++) { int o_idx; @@ -1481,7 +1481,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) if (no_companions) { - for (i = 1; i < m_max; i++) + for (int i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; @@ -1506,7 +1506,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) } /* Read the monsters */ - for (i = 1; i < tmp16b; i++) + for (int i = 1; i < tmp16b; i++) { int m_idx; monster_type *m_ptr; @@ -1569,7 +1569,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) note(format("Too many (%d) monster entries!", tmp16b)); return (FALSE); } - for (i = 1; i < tmp16b; i++) + for (std::size_t i = 1; i < tmp16b; i++) { monster_type *m_ptr; -- cgit v1.2.3 From 7137a17f77fd3b6c3bbcefa2d621b3a11f161679 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Remove monster memory Instead of having monster memory, the player automatically knows everything about all monsters from the start. --- src/loadsave.cc | 81 ++++++++++++++++++++------------------------------------- 1 file changed, 28 insertions(+), 53 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 6b3ad713..32d401af 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1637,62 +1637,39 @@ bool_ file_exist(cptr buf) */ static void do_lore(int r_idx, ls_flag_t flag) { + byte tmp_u8 = 0; + u32b tmp_u32 = 0; + s16b tmp_s16 = 0; monster_race *r_ptr = &r_info[r_idx]; - /* Count sights/deaths/kills */ - do_s16b(&r_ptr->r_sights, flag); - do_s16b(&r_ptr->r_deaths, flag); + do_s16b(&tmp_s16, flag); + do_s16b(&tmp_s16, flag); do_s16b(&r_ptr->r_pkills, flag); - do_s16b(&r_ptr->r_tkills, flag); - - /* Count wakes and ignores */ - do_byte(&r_ptr->r_wake, flag); - do_byte(&r_ptr->r_ignore, flag); - - /* Extra stuff */ - do_byte(&r_ptr->r_xtra1, flag); - do_byte(&r_ptr->r_xtra2, flag); - - /* Count drops */ - do_byte(&r_ptr->r_drop_gold, flag); - do_byte(&r_ptr->r_drop_item, flag); - - /* Count spells */ - do_byte(&r_ptr->r_cast_inate, flag); - do_byte(&r_ptr->r_cast_spell, flag); - - /* Count blows of each type */ - do_byte(&r_ptr->r_blows[0], flag); - do_byte(&r_ptr->r_blows[1], flag); - do_byte(&r_ptr->r_blows[2], flag); - do_byte(&r_ptr->r_blows[3], flag); - - /* Memorize flags */ - do_u32b(&r_ptr->r_flags1, flag); /* Just to remind you */ - do_u32b(&r_ptr->r_flags2, flag); /* flag is unrelated to */ - do_u32b(&r_ptr->r_flags3, flag); /* the other argument */ - do_u32b(&r_ptr->r_flags4, flag); - do_u32b(&r_ptr->r_flags5, flag); - do_u32b(&r_ptr->r_flags6, flag); - do_u32b(&r_ptr->r_flags7, flag); - do_u32b(&r_ptr->r_flags8, flag); - do_u32b(&r_ptr->r_flags9, flag); - - /* Read the "Racial" monster tmp16b per level */ - do_s16b(&r_ptr->max_num, flag); + do_s16b(&tmp_s16, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_s16b(&r_ptr->max_num, flag); do_byte((byte*)&r_ptr->on_saved, flag); - - if (flag == ls_flag_t::LOAD) - { - /* Lore flag repair? */ - r_ptr->r_flags1 &= r_ptr->flags1; - r_ptr->r_flags2 &= r_ptr->flags2; - r_ptr->r_flags3 &= r_ptr->flags3; - r_ptr->r_flags4 &= r_ptr->flags4; - r_ptr->r_flags5 &= r_ptr->flags5; - r_ptr->r_flags6 &= r_ptr->flags6; - } } @@ -1806,7 +1783,6 @@ static void do_options(ls_flag_t flag) cheat_hear = (c & 0x0200) ? TRUE : FALSE; cheat_room = (c & 0x0400) ? TRUE : FALSE; cheat_xtra = (c & 0x0800) ? TRUE : FALSE; - cheat_know = (c & 0x1000) ? TRUE : FALSE; cheat_live = (c & 0x2000) ? TRUE : FALSE; } if (flag == ls_flag_t::SAVE) @@ -1817,7 +1793,6 @@ static void do_options(ls_flag_t flag) if (cheat_hear) c |= 0x0200; if (cheat_room) c |= 0x0400; if (cheat_xtra) c |= 0x0800; - if (cheat_know) c |= 0x1000; if (cheat_live) c |= 0x2000; do_u16b(&c, ls_flag_t::SAVE); } -- cgit v1.2.3 From a6c2ddeb9253fdcf5c0ac6153f77fa65f4a72e2b Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Change store_type to non-POD type --- src/loadsave.cc | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 32d401af..c42dd4b9 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1688,7 +1688,10 @@ static void do_store(store_type *str, ls_flag_t flag) /* Could be cleaner, done this way for benefit of the for loop later on */ byte num; - if (flag == ls_flag_t::SAVE) num = str->stock_num; + if (flag == ls_flag_t::SAVE) + { + num = str->stock.size(); + } do_byte(&num, flag); /* Last visit */ @@ -1698,7 +1701,6 @@ static void do_store(store_type *str, ls_flag_t flag) for (int j = 0; j < num; j++) { if (flag == ls_flag_t::LOAD) - /* Can't this be cleaner? */ { object_type forge; /* Wipe the object */ @@ -1706,15 +1708,17 @@ static void do_store(store_type *str, ls_flag_t flag) /* Read the item */ do_item(&forge, ls_flag_t::LOAD); /* Acquire valid items */ - if ((str->stock_num < store_inven_max) && (str->stock_num < str->stock_size)) + if ((str->stock.size() < store_inven_max) && (str->stock.size() < str->stock_size)) { - int k = str->stock_num++; - - /* Acquire the item */ - object_copy(&str->stock[k], &forge); + object_type stock_obj; + object_copy(&stock_obj, &forge); + str->stock.push_back(stock_obj); } } - if (flag == ls_flag_t::SAVE) do_item(&str->stock[j], flag); + if (flag == ls_flag_t::SAVE) + { + do_item(&str->stock[j], flag); + } } } -- cgit v1.2.3 From f66fbf3dc0a324fbf17e2148a025ea703c6b4d83 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Add do_flag_set() in loadsave.cc --- src/loadsave.cc | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index c42dd4b9..75ce03b0 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -250,6 +250,22 @@ static void do_string(char *str, int max, ls_flag_t flag) } } +/* + * Load/save flag set + */ +namespace { + +template void do_flag_set(flag_set *flags, ls_flag_t flag) +{ + for (std::size_t i = 0; i < flags->size(); i++) + { + do_u32b(&(*flags)[i], flag); + } +} + +} // namespace (anonymous) + + /* * Load/Save quick start data */ @@ -1329,10 +1345,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) do_s16b(&max_panel_rows, flag); do_s16b(&max_panel_cols, flag); - for (std::size_t i = 0; i < dungeon_flags.size(); i++) - { - do_u32b(&dungeon_flags[i], flag); - } + do_flag_set(&dungeon_flags, flag); /* Last teleportation */ do_s16b(&last_teleportation_y, flag); -- cgit v1.2.3 From 60a24b0f1b05917677760634f8e4db687119c235 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Remove FIXMEs from loadsave.cc --- src/loadsave.cc | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 75ce03b0..3be0c39f 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1037,9 +1037,6 @@ static bool_ wearable_p(object_type *o_ptr) /* * rd/wr an object - * - * FIXME! This code probably has a lot of cruft from the old Z/V codebase. - * */ static void do_item(object_type *o_ptr, ls_flag_t flag) { @@ -1943,10 +1940,8 @@ static void do_options(ls_flag_t flag) /* - * Handle player inventory - * - * FIXME! This function probably could be unified better - * Note that the inventory is "re-sorted" later by "dungeon()". + * Handle player inventory. Note that the inventory is + * "re-sorted" later by "dungeon()". */ static bool_ do_inventory(ls_flag_t flag) { @@ -2046,7 +2041,7 @@ static bool_ do_inventory(ls_flag_t flag) /* * Read the saved messages */ -static void do_messages(ls_flag_t flag) /* FIXME! We should be able to unify this better */ +static void do_messages(ls_flag_t flag) { int i; char buf[128]; @@ -2265,7 +2260,7 @@ static bool_ do_savefile_aux(ls_flag_t flag) sf_saves++; /* Increment the saves ctr */ } - /* Handle version bytes. FIXME! DG wants me to change this all around */ + /* Handle version bytes */ if (flag == ls_flag_t::LOAD) { u32b mt32b; -- cgit v1.2.3 From 073ad3584fbf781ce10bef61ad4ff38850282f47 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 21 Jun 2016 13:37:02 +0200 Subject: Rework TR{1,2,3,4,5}_* flags to flag_set<> --- src/loadsave.cc | 30 ++++-------------------------- 1 file changed, 4 insertions(+), 26 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 3be0c39f..93f2679c 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -358,12 +358,7 @@ static void do_subrace(ls_flag_t flag) for (i = 0; i < PY_MAX_LEVEL + 1; i++) { - do_u32b(&sr_ptr->oflags1[i], flag); - do_u32b(&sr_ptr->oflags2[i], flag); - do_u32b(&sr_ptr->oflags3[i], flag); - do_u32b(&sr_ptr->oflags4[i], flag); - do_u32b(&sr_ptr->oflags5[i], flag); - do_u32b(&sr_ptr->oesp[i], flag); + do_flag_set(&sr_ptr->oflags[i], flag); do_s16b(&sr_ptr->opval[i], flag); } @@ -1043,10 +1038,6 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) byte old_dd; byte old_ds; - u32b f1, f2, f3, f4, f5, esp; - - object_kind *k_ptr; - /* Kind */ do_s16b(&o_ptr->k_idx, flag); @@ -1099,20 +1090,10 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) do_byte(&o_ptr->marked, flag); /* flags */ - do_u32b(&o_ptr->art_flags1, flag); - do_u32b(&o_ptr->art_flags2, flag); - do_u32b(&o_ptr->art_flags3, flag); - do_u32b(&o_ptr->art_flags4, flag); - do_u32b(&o_ptr->art_flags5, flag); - do_u32b(&o_ptr->art_esp, flag); + do_flag_set(&o_ptr->art_flags, flag); /* obvious flags */ - do_u32b(&o_ptr->art_oflags1, flag); - do_u32b(&o_ptr->art_oflags2, flag); - do_u32b(&o_ptr->art_oflags3, flag); - do_u32b(&o_ptr->art_oflags4, flag); - do_u32b(&o_ptr->art_oflags5, flag); - do_u32b(&o_ptr->art_oesp, flag); + do_flag_set(&o_ptr->art_oflags, flag); /* Monster holding object */ do_s16b(&o_ptr->held_m_idx, flag); @@ -1177,7 +1158,7 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) /*********** END OF ls_flag_t::SAVE ***************/ /* Obtain the "kind" template */ - k_ptr = &k_info[o_ptr->k_idx]; + object_kind *k_ptr = &k_info[o_ptr->k_idx]; /* Obtain tval/sval from k_info */ o_ptr->tval = k_ptr->tval; @@ -1202,9 +1183,6 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) } - /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - /* Paranoia */ if (o_ptr->name1) { -- cgit v1.2.3 From 3941b7834f0a038ed544e6ee96b9920d43db4c32 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 22 Jun 2016 07:42:43 +0200 Subject: Rework PR{1,2}_* flags to flag_set<> Since there's no need for two tiers we also reduce the flag set to 1 tier. (Breaks savefile compatbility.) --- src/loadsave.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 93f2679c..5c257518 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -353,8 +353,7 @@ static void do_subrace(ls_flag_t flag) for (i = 0; i < BODY_MAX; i++) do_byte((byte*)&sr_ptr->body_parts[i], flag); - do_u32b(&sr_ptr->flags1, flag); - do_u32b(&sr_ptr->flags2, flag); + do_flag_set(&sr_ptr->flags, flag); for (i = 0; i < PY_MAX_LEVEL + 1; i++) { -- cgit v1.2.3 From 6da48c4a3bdd2ff105c3ae55d29c6796bec5338b Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 22 Jun 2016 11:00:28 +0200 Subject: Remove unused "uses" field from skill_type --- src/loadsave.cc | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 5c257518..4c924527 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -544,7 +544,6 @@ static bool_ do_extra(ls_flag_t flag) do_s32b(&s_info[i].mod, flag); do_byte((byte*)&s_info[i].dev, flag); do_byte((byte*)&s_info[i].hidden, flag); - do_u32b(&s_info[i].uses, flag); } else { @@ -552,7 +551,6 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&tmp16s, flag); do_byte(&tmp8u, flag); do_byte(&tmp8u, flag); - do_u32b(&tmp32u, flag); } } -- cgit v1.2.3 From a7ead32f2066fe12dd2154800f480247dc6d7c6c Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Use std::vector for town_type::store --- src/loadsave.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 4c924527..8d63abf9 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2351,7 +2351,7 @@ static bool_ do_savefile_aux(ls_flag_t flag) if (i >= TOWN_RANDOM) { do_u32b(&town_info[i].seed, flag); - do_byte(&town_info[i].numstores, flag); + do_byte(&tmp8u, flag); do_byte(&town_info[i].flags, flag); /* If the town is realy used create a sock */ -- cgit v1.2.3 From 8dbbe9d1fcf29c57a2afc436fcde5150131adca4 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Clean up loadsave.cc --- src/loadsave.cc | 1745 +++++++++++++++++++++++++++---------------------------- 1 file changed, 865 insertions(+), 880 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 8d63abf9..d4cf63ff 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -171,36 +171,6 @@ static void do_s32b(s32b *ip, ls_flag_t flag) do_u32b((u32b *)ip, flag); } -/* - * Do object memory and similar stuff - */ -static void do_xtra(int k_idx, ls_flag_t flag) -{ - byte tmp8u = 0; - object_kind *k_ptr = &k_info[k_idx]; - - switch(flag) - { - case ls_flag_t::SAVE: - { - if (k_ptr->aware) tmp8u |= 0x01; - if (k_ptr->tried) tmp8u |= 0x02; - if (k_ptr->artifact) tmp8u |= 0x80; - - do_byte(&tmp8u, flag); - return; - } - case ls_flag_t::LOAD: - { - do_byte(&tmp8u, flag); - k_ptr->aware = ((tmp8u & 0x01) ? TRUE : FALSE); - k_ptr->tried = ((tmp8u & 0x02) ? TRUE : FALSE); - k_ptr->artifact = ((tmp8u & 0x80) ? TRUE : FALSE); - return; - } - } -} - static void save_string(const char *str) { while (*str) @@ -266,15 +236,8 @@ template void do_flag_set(flag_set *flags, ls_flag_t f } // namespace (anonymous) -/* - * Load/Save quick start data - */ static void do_quick_start(ls_flag_t flag) { - s16b tmp16s; - u32b tmp32u; - int i; - do_s16b(&previous_char.race, flag); do_s16b(&previous_char.rmod, flag); do_s16b(&previous_char.pclass, flag); @@ -284,14 +247,18 @@ static void do_quick_start(ls_flag_t flag) do_s32b(&previous_char.grace, flag); do_s32b(&previous_char.au, flag); - for (i = 0; i < 6; i++) do_s16b(&(previous_char.stat[i]), flag); + for (std::size_t i = 0; i < 6; i++) + { + do_s16b(&(previous_char.stat[i]), flag); + } do_s16b(&previous_char.luck, flag); - do_s16b(&tmp16s, flag); - do_u32b(&tmp32u, flag); - do_byte((byte*)&previous_char.quick_ok, flag); + do_bool(&previous_char.quick_ok, flag); - for (i = 0; i < 4; i++) do_string(previous_char.history[i], 60, flag); + for (std::size_t i = 0; i < 4; i++) + { + do_string(previous_char.history[i], 60, flag); + } } /* @@ -325,7 +292,7 @@ static void do_subrace(ls_flag_t flag) set_subrace_description(sr_ptr, buf); } - do_byte((byte*)&sr_ptr->place, flag); + do_bool(&sr_ptr->place, flag); for (i = 0; i < 6; i++) do_s16b(&sr_ptr->r_adj[i], flag); @@ -348,10 +315,14 @@ static void do_subrace(ls_flag_t flag) do_byte((byte*)&sr_ptr->infra, flag); for (i = 0; i < 4; i++) + { do_s16b(&sr_ptr->powers[i], flag); + } for (i = 0; i < BODY_MAX; i++) + { do_byte((byte*)&sr_ptr->body_parts[i], flag); + } do_flag_set(&sr_ptr->flags, flag); @@ -388,7 +359,7 @@ static void do_spells(int i, ls_flag_t flag) do_byte(&s_ptr->dam_sides, flag); do_byte(&s_ptr->dam_dice, flag); do_byte(&s_ptr->level, flag); - do_byte((byte*)&s_ptr->untried, flag); + do_bool(&s_ptr->untried, flag); } @@ -412,86 +383,57 @@ static void note(cptr msg) } -static void skip_ver_byte(u32b version, ls_flag_t flag) -/* Reads and discards a byte if the savefile is as old as/older than version */ -{ - if ((flag == ls_flag_t::LOAD) && (vernum <= version)) - { - byte forget; - do_byte(&forget, flag); - } - return; -} - -static void do_ver_s16b(s16b *v, u32b version, s16b defval, ls_flag_t flag) -{ - if ((flag == ls_flag_t::LOAD) && (vernum < version)) - { - *v = defval; - return; - } - do_s16b(v, flag); -} - /* * Misc. other data */ static char loaded_game_module[80]; static bool_ do_extra(ls_flag_t flag) { - int i, j; - byte tmp8u = 0; - s16b tmp16s = 0; - u32b tmp32u = 0; - s32b tmp32s = 0; - u16b tmp16b = 0; - u32b dummy32u = 0; - do_string(player_name, 32, flag); do_string(died_from, 80, flag); - for (i = 0; i < 4; i++) + for (std::size_t i = 0; i < 4; i++) { do_string(history[i], 60, flag); } /* Handle the special levels info */ - if (flag == ls_flag_t::SAVE) { - tmp8u = max_d_idx; - tmp16s = MAX_DUNGEON_DEPTH; - } - do_byte(&tmp8u, flag); + byte tmp8u = max_d_idx; + u16b tmp16u = MAX_DUNGEON_DEPTH; - if (flag == ls_flag_t::LOAD) - { - if (tmp8u > max_d_idx) + do_byte(&tmp8u, flag); + + if (flag == ls_flag_t::LOAD) { - note(format("Too many (%d) dungeon types!", tmp8u)); + if (tmp8u > max_d_idx) + { + note(format("Too many dungeon types!", static_cast(tmp8u))); + } } - } - do_s16b(&tmp16s, flag); + do_u16b(&tmp16u, flag); - if (flag == ls_flag_t::LOAD) - { - if (tmp16s > MAX_DUNGEON_DEPTH) + if (flag == ls_flag_t::LOAD) { - note(format("Too many (%d) max level by dungeon type!", tmp16s)); + if (tmp16u > MAX_DUNGEON_DEPTH) + { + note(format("Too many (%d) max level by dungeon type!", static_cast(tmp16u))); + } } - } - /* Load the special levels history */ - for (i = 0; i < tmp8u; i++) - { - for (j = 0; j < tmp16s; j++) + /* Load the special levels history */ + for (std::size_t i = 0; i < tmp8u; i++) { - do_byte((byte*)&special_lvl[j][i], flag); + for (std::size_t j = 0; j < tmp16u; j++) + { + do_bool(&special_lvl[j][i], flag); + } } } - do_byte((byte*)&generate_special_feeling, flag); + do_bool(&generate_special_feeling, flag); /* Load the quick start data */ do_quick_start(flag); @@ -505,68 +447,81 @@ static bool_ do_extra(ls_flag_t flag) do_byte(&p_ptr->pracem, flag); do_byte(&p_ptr->pclass, flag); do_byte(&p_ptr->pspec, flag); - do_u16b(&tmp16b, flag); - do_u16b(&tmp16b, flag); do_byte(&p_ptr->mimic_form, flag); do_s16b(&p_ptr->mimic_level, flag); - if (flag == ls_flag_t::SAVE) tmp8u = 0; do_byte(&p_ptr->hitdie, flag); do_u16b(&p_ptr->expfact, flag); /* Dump the stats (maximum and current) */ - for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_max[i], flag); - for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cur[i], flag); - for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cnt[i], flag); - for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_los[i], flag); + for (std::size_t i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_max[i], flag); + for (std::size_t i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cur[i], flag); + for (std::size_t i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cnt[i], flag); + for (std::size_t i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_los[i], flag); - /* Dump the skills */ - do_s16b(&p_ptr->skill_points, flag); - do_s16b(&p_ptr->skill_last_level, flag); - do_s16b(&p_ptr->melee_style, flag); - do_s16b(&p_ptr->use_piercing_shots, flag); + // Skills + { + do_s16b(&p_ptr->skill_points, flag); + do_s16b(&p_ptr->skill_last_level, flag); + do_s16b(&p_ptr->melee_style, flag); + do_s16b(&p_ptr->use_piercing_shots, flag); - tmp16s = MAX_SKILLS; - do_s16b(&tmp16s, flag); + u16b tmp16u = MAX_SKILLS; - if ((flag == ls_flag_t::LOAD) && (tmp16s > MAX_SKILLS)) - { - quit("Too many skills"); - } + do_u16b(&tmp16u, flag); - if (flag == ls_flag_t::SAVE) old_max_s_idx = max_s_idx; - do_u16b(&old_max_s_idx, flag); - for (i = 0; i < tmp16s; ++i) - { - if (i < old_max_s_idx) + if ((flag == ls_flag_t::LOAD) && (tmp16u > MAX_SKILLS)) { - do_s32b(&s_info[i].value, flag); - do_s32b(&s_info[i].mod, flag); - do_byte((byte*)&s_info[i].dev, flag); - do_byte((byte*)&s_info[i].hidden, flag); + quit("Too many skills"); } - else + + if (flag == ls_flag_t::SAVE) { - do_u32b(&tmp32u, flag); - do_s16b(&tmp16s, flag); - do_byte(&tmp8u, flag); - do_byte(&tmp8u, flag); + old_max_s_idx = max_s_idx; } - } - - tmp16s = max_ab_idx; - do_s16b(&tmp16s, flag); + do_u16b(&old_max_s_idx, flag); - if ((flag == ls_flag_t::LOAD) && (tmp16s > max_ab_idx)) - { - quit("Too many abilities"); + for (std::size_t i = 0; i < tmp16u; i++) + { + if (i < old_max_s_idx) + { + do_s32b(&s_info[i].value, flag); + do_s32b(&s_info[i].mod, flag); + do_bool(&s_info[i].dev, flag); + do_bool(&s_info[i].hidden, flag); + } + else + { + // Skip extraneous entries + u32b tmp32u = 0; + s16b tmp16s = 0; + bool_ tmp8u = 0; + do_u32b(&tmp32u, flag); + do_s16b(&tmp16s, flag); + do_bool(&tmp8u, flag); + do_bool(&tmp8u, flag); + } + } } - for (i = 0; i < tmp16s; ++i) + // Abilities { - do_byte((byte*)&ab_info[i].acquired, flag); + u16b tmp16u = max_ab_idx; + + do_u16b(&tmp16u, flag); + + if ((flag == ls_flag_t::LOAD) && (tmp16u > max_ab_idx)) + { + quit("Too many abilities"); + } + + for (std::size_t i = 0; i < tmp16u; ++i) + { + do_bool(&ab_info[i].acquired, flag); + } } + // Miscellaneous do_s16b(&p_ptr->luck_base, flag); do_s16b(&p_ptr->luck_max, flag); @@ -580,47 +535,56 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->town_num, flag); /* -KMW- */ /* Write arena and rewards information -KMW- */ - do_s16b(&tmp16s, flag); - do_s16b(&tmp16s, flag); do_s16b(&p_ptr->inside_quest, flag); - do_byte(&tmp8u, flag); /* Save/load spellbinder */ do_byte(&p_ptr->spellbinder_num, flag); do_byte(&p_ptr->spellbinder_trigger, flag); - for (i = 0; i < 4; i++) - do_u32b(&p_ptr->spellbinder[i], flag); - - - do_byte(&tmp8u, flag); /* tmp8u should be 0 at this point */ - - if (flag == ls_flag_t::SAVE) tmp8u = MAX_PLOTS; - do_byte(&tmp8u, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp8u > MAX_PLOTS)) + for (std::size_t i = 0; i < 4; i++) { - quit(format("Too many plots, %d %d", tmp8u, MAX_PLOTS)); + do_u32b(&p_ptr->spellbinder[i], flag); } - for (i = 0; i < tmp8u; i++) + // Quests { - do_s16b(&plots[i], flag); - } + byte tmp8u; - if (flag == ls_flag_t::SAVE) - { - tmp8u = MAX_RANDOM_QUEST; - } - do_byte(&tmp8u, flag); + // Number of quests + if (flag == ls_flag_t::SAVE) + { + tmp8u = MAX_PLOTS; + } + do_byte(&tmp8u, flag); + if ((flag == ls_flag_t::LOAD) && (tmp8u > MAX_PLOTS)) + { + quit(format("Too many plots, %d %d", tmp8u, MAX_PLOTS)); + } - if ((flag == ls_flag_t::LOAD) && - (tmp8u > MAX_RANDOM_QUEST)) quit("Too many random quests"); - for (i = 0; i < tmp8u; i++) - { - do_byte(&random_quests[i].type, flag); - do_s16b(&random_quests[i].r_idx, flag); - do_byte((byte*)&random_quests[i].done, flag); + // Quest status + for (std::size_t i = 0; i < tmp8u; i++) + { + do_s16b(&plots[i], flag); + } + + // Number of random quests + if (flag == ls_flag_t::SAVE) + { + tmp8u = MAX_RANDOM_QUEST; + } + do_byte(&tmp8u, flag); + if ((flag == ls_flag_t::LOAD) && (tmp8u > MAX_RANDOM_QUEST)) + { + quit("Too many random quests"); + } + + // Random quest data + for (std::size_t i = 0; i < tmp8u; i++) + { + do_byte(&random_quests[i].type, flag); + do_s16b(&random_quests[i].r_idx, flag); + do_bool(&random_quests[i].done, flag); + } } do_s16b(&p_ptr->oldpx, flag); @@ -639,48 +603,48 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->csp, flag); do_u16b(&p_ptr->csp_frac, flag); - /* XXX - Here's where tank points were. - Those who run the estate of you-know-who is really stupid. - I'll never even consider reading her books now. -- neil */ - do_s16b(&tmp16s, flag); - do_s16b(&tmp16s, flag); - do_s16b(&tmp16s, flag); - do_s16b(&tmp16s, flag); - /* Gods */ do_s32b(&p_ptr->grace, flag); do_s32b(&p_ptr->grace_delay, flag); - do_byte((byte*)&p_ptr->praying, flag); + do_bool(&p_ptr->praying, flag); do_s16b(&p_ptr->melkor_sacrifice, flag); do_byte(&p_ptr->pgod, flag); - /* Max Player and Dungeon Levels */ do_s16b(&p_ptr->max_plv, flag); - if (flag == ls_flag_t::SAVE) - tmp8u = max_d_idx; - do_byte(&tmp8u, flag); - for (i = 0; i < tmp8u; i++) + // Max dungeon levels { - if (flag == ls_flag_t::SAVE) - tmp16s = max_dlv[i]; - do_s16b(&tmp16s, flag); - if ((flag == ls_flag_t::LOAD) && (i <= max_d_idx)) - max_dlv[i] = tmp16s; + byte tmp8u = max_d_idx; + + do_byte(&tmp8u, flag); + + for (std::size_t i = 0; i < tmp8u; i++) + { + s16b tmp16s = max_dlv[i]; + + do_s16b(&tmp16s, flag); + + if ((flag == ls_flag_t::LOAD) && (i <= max_d_idx)) + { + max_dlv[i] = tmp16s; + } + } } + /* Repair max player level??? */ if ((flag == ls_flag_t::LOAD) && (p_ptr->max_plv < p_ptr->lev)) + { p_ptr->max_plv = p_ptr->lev; + } - do_byte((byte*)&(p_ptr->help.enabled), flag); - for (i = 0; i < HELP_MAX; i++) + /* Help */ + do_bool(&p_ptr->help.enabled, flag); + for (std::size_t i = 0; i < HELP_MAX; i++) { do_bool(&(p_ptr->help.activated[i]), flag); } /* More info */ - tmp16s = 0; do_s16b(&p_ptr->blind, flag); do_s16b(&p_ptr->paralyzed, flag); do_s16b(&p_ptr->confused, flag); @@ -742,69 +706,55 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->tim_esp, flag); do_s16b(&p_ptr->tim_wraith, flag); do_s16b(&p_ptr->tim_ffall, flag); - do_ver_s16b(&p_ptr->tim_fly, SAVEFILE_VERSION, 0, flag); - do_s16b(&tmp16s, flag); - do_ver_s16b(&p_ptr->tim_poison, SAVEFILE_VERSION, 0, flag); - do_s16b(&tmp16s, flag); + do_s16b(&p_ptr->tim_fly, flag); + do_s16b(&p_ptr->tim_poison, flag); do_s16b(&p_ptr->tim_invisible, flag); do_s16b(&p_ptr->tim_inv_pow, flag); do_s16b(&p_ptr->tim_mimic, flag); do_s16b(&p_ptr->lightspeed, flag); do_s16b(&p_ptr->tim_lite, flag); - do_ver_s16b(&p_ptr->tim_regen, SAVEFILE_VERSION, 0, flag); - do_ver_s16b(&p_ptr->tim_regen_pow, SAVEFILE_VERSION, 0, flag); + do_s16b(&p_ptr->tim_regen, flag); + do_s16b(&p_ptr->tim_regen_pow, flag); do_s16b(&p_ptr->holy, flag); - do_s16b(&tmp16s, flag); - do_s16b(&tmp16s, flag); do_s16b(&p_ptr->immov_cntr, flag); do_s16b(&p_ptr->strike, flag); - do_s16b(&tmp16s, flag); do_s16b(&p_ptr->tim_reflect, flag); - do_s16b(&tmp16s, flag); do_s16b(&p_ptr->tim_deadly, flag); do_s16b(&p_ptr->prob_travel, flag); do_s16b(&p_ptr->disrupt_shield, flag); do_s16b(&p_ptr->parasite, flag); do_s16b(&p_ptr->parasite_r_idx, flag); - do_s32b(&tmp32s, flag); - do_s32b(&tmp32s, flag); do_s16b(&p_ptr->absorb_soul, flag); do_s32b(&p_ptr->inertia_controlled_spell, flag); do_s16b(&p_ptr->last_rewarded_level, flag); - do_s16b(&tmp16s, flag); /* compat */ - - if (flag == ls_flag_t::SAVE) { tmp16s = CORRUPTIONS_MAX; } - do_s16b(&tmp16s, flag); - if (tmp16s > CORRUPTIONS_MAX) { - quit("Too many corruptions"); - } - - for (i = 0; i < tmp16s; i++) + // Corruptions { - if (flag == ls_flag_t::SAVE) - tmp8u = p_ptr->corruptions[i]; + u16b tmp16u = CORRUPTIONS_MAX; - do_byte(&tmp8u, flag); + do_u16b(&tmp16u, flag); - if (flag == ls_flag_t::LOAD) - p_ptr->corruptions[i] = tmp8u; + if (tmp16u > CORRUPTIONS_MAX) + { + quit("Too many corruptions"); + } + + for (std::size_t i = 0; i < tmp16u; i++) + { + do_bool(&p_ptr->corruptions[i], flag); + } } - do_byte((byte*)&p_ptr->corrupt_anti_teleport_stopped, flag); + do_bool(&p_ptr->corrupt_anti_teleport_stopped, flag); do_byte(&p_ptr->confusing, flag); - do_byte((byte*)&p_ptr->black_breath, flag); - do_byte((byte*)&fate_flag, flag); + do_bool(&p_ptr->black_breath, flag); + do_bool(&fate_flag, flag); do_byte(&p_ptr->searching, flag); - do_byte(&tmp8u, flag); do_byte(&p_ptr->preserve, flag); do_byte(&p_ptr->special, flag); - do_byte((byte*)&ambush_flag, flag); + do_bool(&ambush_flag, flag); do_byte(&p_ptr->allow_one_death, flag); - do_s16b(&tmp16s, flag); - - do_byte(&tmp8u, flag); do_s16b(&no_breeds, flag); do_s16b(&p_ptr->protgood, flag); @@ -812,36 +762,32 @@ static bool_ do_extra(ls_flag_t flag) /* Auxilliary variables */ do_u32b(&p_ptr->mimic_extra, flag); do_u32b(&p_ptr->antimagic_extra, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); do_u32b(&p_ptr->music_extra, flag); - do_u32b(&tmp32u, flag); do_u32b(&p_ptr->necro_extra, flag); do_u32b(&p_ptr->necro_extra2, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u16b(&p_ptr->body_monster, flag); - do_byte((byte*)&p_ptr->disembodied, flag); + do_bool(&p_ptr->disembodied, flag); /* Are we in astral mode? */ - do_byte((byte*)&p_ptr->astral, flag); + do_bool(&p_ptr->astral, flag); + + // Powers + { + u16b tmp16u = POWER_MAX; + + do_u16b(&tmp16u, flag); - if (flag == ls_flag_t::SAVE) tmp16s = POWER_MAX; - do_s16b(&tmp16s, flag); - if ((flag == ls_flag_t::LOAD) && (tmp16s > POWER_MAX)) - note(format("Too many (%u) powers!", tmp16s)); - for (i = 0; i < POWER_MAX; i++) - do_byte((byte*)&p_ptr->powers_mod[i], flag); + if ((flag == ls_flag_t::LOAD) && (tmp16u != POWER_MAX)) + { + quit("Too few/many powers!"); + } - skip_ver_byte(100, flag); + for (std::size_t i = 0; i < POWER_MAX; i++) + { + do_bool(&p_ptr->powers_mod[i], flag); + } + } /* The tactic */ do_byte((byte*)&p_ptr->tactic, flag); @@ -853,43 +799,38 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->companion_killed, flag); /* The fate */ - do_byte((byte*)&p_ptr->no_mortal, flag); + do_bool(&p_ptr->no_mortal, flag); - /* The bounties -- kept only for load-compatibility with old savefiles. */ - for (i = 0; i < 24; i++) { - tmp16s = 0; do_s16b(&tmp16s, flag); - tmp16s = 0; do_s16b(&tmp16s, flag); - } - tmp32u = 0; do_u32b(&tmp32u, flag); /* Spells */ - do_s16b(&spell_num, flag); - for (i = 0; i < MAX_SPELLS; i++) - do_spells(i, flag); - do_s16b(&rune_num, flag); - for (i = 0; i < MAX_RUNES; i++) { - do_string(rune_spells[i].name, 30, flag); - do_s16b(&rune_spells[i].type, flag); - do_s16b(&rune_spells[i].rune2, flag); - do_s16b(&rune_spells[i].mana, flag); + do_s16b(&spell_num, flag); + for (std::size_t i = 0; i < MAX_SPELLS; i++) + { + do_spells(i, flag); + } + + do_s16b(&rune_num, flag); + + for (std::size_t i = 0; i < MAX_RUNES; i++) + { + do_string(rune_spells[i].name, 30, flag); + do_s16b(&rune_spells[i].type, flag); + do_s16b(&rune_spells[i].rune2, flag); + do_s16b(&rune_spells[i].mana, flag); + } } /* Load random seeds */ - do_u32b(&dummy32u, flag); /* Load-compatibility with old savefiles. */ do_u32b(&seed_flavor, flag); /* For consistent object flavors. */ - do_u32b(&dummy32u, flag); /* Load-compatibility with old savefiles. */ /* Special stuff */ - do_u16b(&tmp16b, flag); /* Dummy */ do_u16b(&total_winner, flag); do_u16b(&has_won, flag); do_u16b(&noscore, flag); /* Write death */ - if (flag == ls_flag_t::SAVE) tmp8u = death; - do_byte(&tmp8u, flag); - if (flag == ls_flag_t::LOAD) death = tmp8u; + do_bool(&death, flag); /* Incompatible module? */ if (flag == ls_flag_t::LOAD) @@ -906,10 +847,8 @@ static bool_ do_extra(ls_flag_t flag) } } - /* Write feeling */ - if (flag == ls_flag_t::SAVE) tmp8u = feeling; - do_byte(&tmp8u, flag); - if (flag == ls_flag_t::LOAD) feeling = tmp8u; + /* Level feeling */ + do_s16b(&feeling, flag); /* Turn of last "feeling" */ do_s32b(&old_turn, flag); @@ -926,8 +865,6 @@ static bool_ do_extra(ls_flag_t flag) */ static void do_monster(monster_type *m_ptr, ls_flag_t flag) { - int i; - /* Read the monster race */ do_s16b(&m_ptr->r_idx, flag); @@ -960,10 +897,13 @@ static void do_monster(monster_type *m_ptr, ls_flag_t flag) do_s32b(&m_ptr->mflag, flag); - if (flag == ls_flag_t::LOAD) m_ptr->mflag &= PERM_MFLAG_MASK; + if (flag == ls_flag_t::LOAD) + { + m_ptr->mflag &= PERM_MFLAG_MASK; + } /* Attacks */ - for (i = 0; i < 4; i++) + for (std::size_t i = 0; i < 4; i++) { do_byte(&m_ptr->blow[i].method, flag); do_byte(&m_ptr->blow[i].effect, flag); @@ -1265,116 +1205,20 @@ static void do_grid(ls_flag_t flag) } } -static void my_sentinel(const char *place, u16b value, ls_flag_t flag) -/* This function lets us know exactly where a savefile is - broken by reading/writing conveniently a sentinel at this - spot */ +static bool do_objects(ls_flag_t flag, bool no_companions) { if (flag == ls_flag_t::SAVE) { - do_u16b(&value, flag); - return; - } - if (flag == ls_flag_t::LOAD) - { - u16b found; - do_u16b(&found, flag); - if (found == value) /* All is good */ - return; - /* All is bad */ - note(format("Savefile broken %s", place)); - return; - } - note(format("Impossible has occurred")); /* Programmer error */ - exit(0); -} - - - -/* - * Handle dungeon - * - * The monsters/objects must be loaded in the same order - * that they were stored, since the actual indexes matter. - */ -static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) -{ - cave_type *c_ptr; - - /* Read specific */ - u16b tmp16b = 0; - - my_sentinel("Before do_dungeon", 324, flag); - - /* Header info */ - do_s16b(&dun_level, flag); - do_byte(&dungeon_type, flag); - do_s16b(&num_repro, flag); - do_s16b(&p_ptr->py, flag); - do_s16b(&p_ptr->px, flag); - do_s16b(&cur_hgt, flag); - do_s16b(&cur_wid, flag); - do_s16b(&max_panel_rows, flag); - do_s16b(&max_panel_cols, flag); - - do_flag_set(&dungeon_flags, flag); - - /* Last teleportation */ - do_s16b(&last_teleportation_y, flag); - do_s16b(&last_teleportation_y, flag); - - /* Spell effects */ - tmp16b = MAX_EFFECTS; - do_u16b(&tmp16b, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp16b > MAX_EFFECTS)) - { - quit("Too many spell effects"); - } - - for (std::size_t i = 0; i < tmp16b; ++i) - { - do_s16b(&effects[i].type, flag); - do_s16b(&effects[i].dam, flag); - do_s16b(&effects[i].time, flag); - do_u32b(&effects[i].flags, flag); - do_s16b(&effects[i].cx, flag); - do_s16b(&effects[i].cy, flag); - do_s16b(&effects[i].rad, flag); - } - - /* TO prevent bugs with evolving dungeons */ - for (std::size_t i = 0; i < 100; i++) - { - do_s16b(&floor_type[i], flag); - do_s16b(&fill_type[i], flag); - } - - if ((flag == ls_flag_t::LOAD) && (!dun_level && !p_ptr->inside_quest)) - { - int xstart = 0; - int ystart = 0; - /* Init the wilderness */ - process_dungeon_file("w_info.txt", &ystart, &xstart, cur_hgt, cur_wid, - TRUE, FALSE); - - /* Init the town */ - xstart = 0; - ystart = 0; - init_flags = 0; - process_dungeon_file("t_info.txt", &ystart, &xstart, cur_hgt, cur_wid, - TRUE, FALSE); + // Compact everything before saving + compact_objects(0); + compact_monsters(0); } - do_grid(flag); - - /*** Objects ***/ + u16b n_objects = o_max; - if (flag == ls_flag_t::SAVE) compact_objects(0); - if (flag == ls_flag_t::SAVE) compact_monsters(0); if (flag == ls_flag_t::SAVE) { - tmp16b = o_max; + u16b tmp16u = n_objects; if (no_companions) { @@ -1382,87 +1226,95 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) { object_type *o_ptr = &o_list[i]; - if (o_ptr->held_m_idx && (m_list[o_ptr->held_m_idx].status == MSTATUS_COMPANION)) tmp16b--; + if (o_ptr->held_m_idx && (m_list[o_ptr->held_m_idx].status == MSTATUS_COMPANION)) + { + tmp16u--; + } } } - /* Item count */ - do_u16b(&tmp16b, flag); - - tmp16b = o_max; + do_u16b(&tmp16u, flag); } else - /* Read item count */ - do_u16b(&tmp16b, flag); + { + do_u16b(&n_objects, flag); + } /* Verify maximum */ - if ((flag == ls_flag_t::LOAD) && (tmp16b > max_o_idx)) + if ((flag == ls_flag_t::LOAD) && (n_objects > max_o_idx)) { - note(format("Too many (%d) object entries!", tmp16b)); - return (FALSE); + note("Too many object entries!"); + return false; } /* Dungeon items */ - for (int i = 1; i < tmp16b; i++) + if (flag == ls_flag_t::SAVE) { - int o_idx; - - object_type *o_ptr; - - if (flag == ls_flag_t::SAVE) + for (std::size_t i = 1; i < n_objects; i++) { - o_ptr = &o_list[i]; - /* Don't save objects held by companions when no_companions is set */ - if (no_companions && o_ptr->held_m_idx && (m_list[o_ptr->held_m_idx].status == MSTATUS_COMPANION)) continue; + auto o_ptr = &o_list[i]; + // Skip objects held by companions when no_companions is set + if (no_companions && o_ptr->held_m_idx && (m_list[o_ptr->held_m_idx].status == MSTATUS_COMPANION)) + { + continue; + } do_item(o_ptr, ls_flag_t::SAVE); - continue; /* Saving is easy */ } - /* Until the end of the loop, this is all ls_flag_t::LOAD */ - - /* Get a new record */ - o_idx = o_pop(); - - /* Oops */ - if (i != o_idx) + } + else if (flag == ls_flag_t::LOAD) + { + for (int i = 1; i < n_objects; i++) { - note(format("Object allocation error (%d <> %d)", i, o_idx)); - return (FALSE); - } + /* Get a new record */ + int o_idx = o_pop(); + /* Oops */ + if (i != o_idx) + { + note(format("Object allocation error (%d <> %d)", i, o_idx)); + return false; + } - /* Acquire place */ - o_ptr = &o_list[o_idx]; + /* Acquire place */ + auto o_ptr = &o_list[o_idx]; - /* Read the item */ - do_item(o_ptr, ls_flag_t::LOAD); + /* Read the item */ + do_item(o_ptr, ls_flag_t::LOAD); - /* Monster */ - if (o_ptr->held_m_idx) - { /* Monster */ - monster_type *m_ptr = &m_list[o_ptr->held_m_idx]; + if (o_ptr->held_m_idx) + { + /* Monster */ + monster_type *m_ptr = &m_list[o_ptr->held_m_idx]; - /* Place the object */ - m_ptr->hold_o_idxs.push_back(o_idx); - } + /* Place the object */ + m_ptr->hold_o_idxs.push_back(o_idx); + } - /* Dungeon */ - else - { - /* Access the item location */ - c_ptr = &cave[o_ptr->iy][o_ptr->ix]; + /* Dungeon */ + else + { + /* Access the item location */ + auto c_ptr = &cave[o_ptr->iy][o_ptr->ix]; - /* Place the object */ - c_ptr->o_idxs.push_back(o_idx); + /* Place the object */ + c_ptr->o_idxs.push_back(o_idx); + } } } - /*** Monsters ***/ + return true; +} + + +static bool do_monsters(ls_flag_t flag, bool no_companions) +{ + u16b n_monsters = m_max; if (flag == ls_flag_t::SAVE) { - tmp16b = m_max; + u16b tmp16u = m_max; if (no_companions) { @@ -1470,99 +1322,187 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) { monster_type *m_ptr = &m_list[i]; - if (m_ptr->status == MSTATUS_COMPANION) tmp16b--; + if (m_ptr->status == MSTATUS_COMPANION) + { + tmp16u--; + } } } - /* Write the monster count */ - do_u16b(&tmp16b, flag); - - tmp16b = m_max; + do_u16b(&tmp16u, flag); } else - /* Read the monster count */ - do_u16b(&tmp16b, flag); + { + do_u16b(&n_monsters, flag); + } /* Validate */ - if ((flag == ls_flag_t::LOAD) && (tmp16b > max_m_idx)) + if ((flag == ls_flag_t::LOAD) && (n_monsters > max_m_idx)) { - note(format("Too many (%d) monster entries!", tmp16b)); - return (FALSE); + note("Too many monster entries!"); + return false; } - /* Read the monsters */ - for (int i = 1; i < tmp16b; i++) - { - int m_idx; - monster_type *m_ptr; - monster_race *r_ptr; + /* Load/save the monsters */ - if (flag == ls_flag_t::SAVE) + if (flag == ls_flag_t::SAVE) + { + for (std::size_t i = 1; i < n_monsters; i++) { - m_ptr = &m_list[i]; + auto m_ptr = &m_list[i]; - /* Don't save companions when no_companions is set */ - if (no_companions && m_ptr->status == MSTATUS_COMPANION) continue; + // Skip companions when no_companions is set + if (no_companions && m_ptr->status == MSTATUS_COMPANION) + { + continue; + } do_monster(m_ptr, ls_flag_t::SAVE); - continue; /* Easy to save a monster */ } - /* From here on, it's all ls_flag_t::LOAD */ - /* Get a new record */ - m_idx = m_pop(); - - /* Oops */ - if (i != m_idx) + } + else if (flag == ls_flag_t::LOAD) + { + for (int i = 1; i < n_monsters; i++) { - note(format("Monster allocation error (%d <> %d)", i, m_idx)); - return (FALSE); - } + /* Get a new record */ + int m_idx = m_pop(); - /* Acquire monster */ - m_ptr = &m_list[m_idx]; + /* Oops */ + if (i != m_idx) + { + note(format("Monster allocation error (%d <> %d)", i, m_idx)); + return false; + } - /* Read the monster */ - do_monster(m_ptr, ls_flag_t::LOAD); + /* Acquire monster */ + auto m_ptr = &m_list[m_idx]; - /* Access grid */ - c_ptr = &cave[m_ptr->fy][m_ptr->fx]; + /* Read the monster */ + do_monster(m_ptr, ls_flag_t::LOAD); - /* Mark the location */ - c_ptr->m_idx = m_idx; + /* Place in grid */ + auto c_ptr = &cave[m_ptr->fy][m_ptr->fx]; + c_ptr->m_idx = m_idx; - /* Controlled ? */ - if (m_ptr->mflag & MFLAG_CONTROL) - p_ptr->control = m_idx; + /* Controlled? */ + if (m_ptr->mflag & MFLAG_CONTROL) + { + p_ptr->control = m_idx; + } - /* Access race */ - r_ptr = &r_info[m_ptr->r_idx]; + /* Count as an alive member of race */ + auto r_ptr = &r_info[m_ptr->r_idx]; + r_ptr->cur_num++; + } + } + + /* Save/load pets */ + { + u16b tmp16u = (flag == ls_flag_t::SAVE && !no_companions) ? max_m_idx : 0; - /* Count XXX XXX XXX */ - r_ptr->cur_num++; + do_u16b(&tmp16u, flag); + + if ((flag == ls_flag_t::LOAD) && (tmp16u > max_m_idx)) + { + note("Too many monster entries!"); + return false; + } + + for (std::size_t i = 1; i < tmp16u; i++) + { + /* Acquire monster */ + auto m_ptr = &km_list[i]; + + /* Read the monster */ + do_monster(m_ptr, flag); + } } - /* Read the kept monsters */ + return true; +} - tmp16b = (flag == ls_flag_t::SAVE && !no_companions) ? max_m_idx : 0; +/* + * Handle dungeon + * + * The monsters/objects must be loaded in the same order + * that they were stored, since the actual indexes matter. + */ +static bool_ do_dungeon(ls_flag_t flag, bool no_companions) +{ + /* Header info */ + do_s16b(&dun_level, flag); + do_byte(&dungeon_type, flag); + do_s16b(&num_repro, flag); + do_s16b(&p_ptr->py, flag); + do_s16b(&p_ptr->px, flag); + do_s16b(&cur_hgt, flag); + do_s16b(&cur_wid, flag); + do_s16b(&max_panel_rows, flag); + do_s16b(&max_panel_cols, flag); - /* Read the monster count */ - do_u16b(&tmp16b, flag); + do_flag_set(&dungeon_flags, flag); - /* Hack -- verify */ - if ((flag == ls_flag_t::LOAD) && (tmp16b > max_m_idx)) + /* Last teleportation */ + do_s16b(&last_teleportation_y, flag); + do_s16b(&last_teleportation_y, flag); + + /* Spell effects */ { - note(format("Too many (%d) monster entries!", tmp16b)); - return (FALSE); + u16b n_effects = MAX_EFFECTS; + do_u16b(&n_effects, flag); + + if ((flag == ls_flag_t::LOAD) && (n_effects > MAX_EFFECTS)) + { + quit("Too many spell effects"); + } + + for (std::size_t i = 0; i < n_effects; ++i) + { + do_s16b(&effects[i].type, flag); + do_s16b(&effects[i].dam, flag); + do_s16b(&effects[i].time, flag); + do_u32b(&effects[i].flags, flag); + do_s16b(&effects[i].cx, flag); + do_s16b(&effects[i].cy, flag); + do_s16b(&effects[i].rad, flag); + } + } + + /* To prevent bugs with evolving dungeons */ + for (std::size_t i = 0; i < 100; i++) + { + do_s16b(&floor_type[i], flag); + do_s16b(&fill_type[i], flag); } - for (std::size_t i = 1; i < tmp16b; i++) + + if ((flag == ls_flag_t::LOAD) && (!dun_level && !p_ptr->inside_quest)) { - monster_type *m_ptr; + int xstart = 0; + int ystart = 0; + /* Init the wilderness */ + process_dungeon_file("w_info.txt", &ystart, &xstart, cur_hgt, cur_wid, + TRUE, FALSE); - /* Acquire monster */ - m_ptr = &km_list[i]; + /* Init the town */ + xstart = 0; + ystart = 0; + init_flags = 0; + process_dungeon_file("t_info.txt", &ystart, &xstart, cur_hgt, cur_wid, + TRUE, FALSE); + } - /* Read the monster */ - do_monster(m_ptr, flag); + do_grid(flag); + + /*** Objects ***/ + if (!do_objects(flag, no_companions)) + { + return FALSE; + } + + /*** Monsters ***/ + if (!do_monsters(flag, no_companions)) + { + return FALSE; } /*** Success ***/ @@ -1591,7 +1531,7 @@ void save_dungeon(void) fff = my_fopen(name, "wb"); /* Save the dungeon */ - do_dungeon(ls_flag_t::SAVE, TRUE); + do_dungeon(ls_flag_t::SAVE, true); my_fclose(fff); } @@ -1620,41 +1560,13 @@ bool_ file_exist(cptr buf) /* * Handle monster lore */ -static void do_lore(int r_idx, ls_flag_t flag) +static void do_lore(std::size_t r_idx, ls_flag_t flag) { - byte tmp_u8 = 0; - u32b tmp_u32 = 0; - s16b tmp_s16 = 0; monster_race *r_ptr = &r_info[r_idx]; - do_s16b(&tmp_s16, flag); - do_s16b(&tmp_s16, flag); do_s16b(&r_ptr->r_pkills, flag); - do_s16b(&tmp_s16, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_s16b(&r_ptr->max_num, flag); - do_byte((byte*)&r_ptr->on_saved, flag); + do_bool(&r_ptr->on_saved, flag); } @@ -1665,44 +1577,39 @@ static void do_lore(int r_idx, ls_flag_t flag) */ static void do_store(store_type *str, ls_flag_t flag) { - byte store_inven_max = STORE_INVEN_MAX; - - /* Some basic info */ + // Store state do_s32b(&str->store_open, flag); do_u16b(&str->owner, flag); + do_s32b(&str->last_visit, flag); - /* Could be cleaner, done this way for benefit of the for loop later on */ - byte num; - if (flag == ls_flag_t::SAVE) + // Items in store { - num = str->stock.size(); - } - do_byte(&num, flag); + byte num = str->stock.size(); - /* Last visit */ - do_s32b(&str->last_visit, flag); + do_byte(&num, flag); - /* Items */ - for (int j = 0; j < num; j++) - { - if (flag == ls_flag_t::LOAD) + if (flag == ls_flag_t::SAVE) { - object_type forge; - /* Wipe the object */ - object_wipe(&forge); - /* Read the item */ - do_item(&forge, ls_flag_t::LOAD); - /* Acquire valid items */ - if ((str->stock.size() < store_inven_max) && (str->stock.size() < str->stock_size)) + for (std::size_t i = 0; i < num; i++) { - object_type stock_obj; - object_copy(&stock_obj, &forge); - str->stock.push_back(stock_obj); + do_item(&str->stock[i], ls_flag_t::SAVE); } } - if (flag == ls_flag_t::SAVE) + else if (flag == ls_flag_t::LOAD) { - do_item(&str->stock[j], flag); + for (std::size_t i = 0; i < num; i++) + { + object_type forge; + object_wipe(&forge); + do_item(&forge, ls_flag_t::LOAD); + + if ((str->stock.size() < STORE_INVEN_MAX) && (str->stock.size() < str->stock_size)) + { + object_type stock_obj; + object_copy(&stock_obj, &forge); + str->stock.push_back(stock_obj); + } + } } } } @@ -1712,18 +1619,11 @@ static void do_store(store_type *str, ls_flag_t flag) */ static void do_randomizer(ls_flag_t flag) { - int i; - - u16b tmp16u = 0; - - /* Tmp */ - do_u16b(&tmp16u, flag); - /* Place */ do_u16b(&Rand_place, flag); /* State */ - for (i = 0; i < RAND_DEG; i++) + for (std::size_t i = 0; i < RAND_DEG; i++) { do_u32b(&Rand_state[i], flag); } @@ -1786,8 +1686,8 @@ static void do_options(ls_flag_t flag) do_u16b(&c, ls_flag_t::SAVE); } - do_byte((byte*)&autosave_l, flag); - do_byte((byte*)&autosave_t, flag); + do_bool(&autosave_l, flag); + do_bool(&autosave_t, flag); do_s16b(&autosave_freq, flag); if (flag == ls_flag_t::LOAD) @@ -1996,16 +1896,16 @@ static bool_ do_inventory(ls_flag_t flag) } if (flag == ls_flag_t::SAVE) { - u16b i; - u16b sent = 0xFFFF; - for (i = 0; i < INVEN_TOTAL; i++) + for (u16b i = 0; i < INVEN_TOTAL; i++) { object_type *o_ptr = &p_ptr->inventory[i]; if (!o_ptr->k_idx) continue; do_u16b(&i, flag); do_item(o_ptr, flag); } - do_u16b(&sent, ls_flag_t::SAVE); /* Sentinel */ + // Sentinel + u16b sent = 0xFFFF; + do_u16b(&sent, ls_flag_t::SAVE); } /* Success */ return (TRUE); @@ -2031,13 +1931,11 @@ static void do_messages(ls_flag_t flag) /* Read the messages */ if (flag == ls_flag_t::LOAD) { - byte tmp8u = 0; for (i = 0; i < num; i++) { /* Read the message */ do_string(buf, 128, ls_flag_t::LOAD); do_byte(&color, flag); - do_byte(&tmp8u, flag); /* Save the message */ message_add(buf, color); @@ -2046,13 +1944,11 @@ static void do_messages(ls_flag_t flag) if (flag == ls_flag_t::SAVE) { byte holder; - byte zero = 0; for (i = num - 1; i >= 0; i--) { do_string((char *)message_str((s16b)i), 0, ls_flag_t::SAVE); holder = message_color((s16b)i); do_byte(&holder, flag); - do_byte(&zero, flag); } } } @@ -2082,7 +1978,7 @@ bool_ load_dungeon(char *ext) } /* Read the dungeon */ - if (!do_dungeon(ls_flag_t::LOAD, FALSE)) + if (!do_dungeon(ls_flag_t::LOAD, false)) { dun_level = old_dun; dungeon_type = old_dungeon_type; @@ -2099,23 +1995,6 @@ bool_ load_dungeon(char *ext) return (TRUE); } -void do_fate(int i, ls_flag_t flag) -{ - if ((flag == ls_flag_t::LOAD) && (i >= MAX_FATES)) i = MAX_FATES - 1; - - do_byte(&fates[i].fate, flag); - do_byte(&fates[i].level, flag); - do_byte(&fates[i].serious, flag); - do_s16b(&fates[i].o_idx, flag); - do_s16b(&fates[i].e_idx, flag); - do_s16b(&fates[i].a_idx, flag); - do_s16b(&fates[i].v_idx, flag); - do_s16b(&fates[i].r_idx, flag); - do_s16b(&fates[i].count, flag); - do_s16b(&fates[i].time, flag); - do_byte((byte*)&fates[i].know, flag); -} - /* * Load/save timers. */ @@ -2136,7 +2015,6 @@ static void do_timers(ls_flag_t flag) */ static void do_stores(ls_flag_t flag) { - u16b tmp16u; u16b real_max = 0; /* Note that this forbids max_towns from shrinking, but that is fine */ @@ -2154,55 +2032,391 @@ static void do_stores(ls_flag_t flag) do_u16b(&real_max, flag); for (int i = 0; i < real_max; i++) { - do_byte((byte*)&reals[i], flag); + do_byte(&reals[i], flag); } /* Read the stores */ - if (flag == ls_flag_t::SAVE) tmp16u = max_st_idx; - do_u16b(&tmp16u, flag); - assert(tmp16u <= max_st_idx); + u16b n_stores = max_st_idx; + do_u16b(&n_stores, flag); + assert(n_stores <= max_st_idx); - /* Ok now read the real towns */ for (int i = 0; i < real_max; i++) { int z = reals[i]; - /* Ultra paranoia */ - if (!town_info[z].stocked) create_stores_stock(z); + if (!town_info[z].stocked) + { + create_stores_stock(z); + } - for (int j = 0; j < tmp16u; j++) + for (int j = 0; j < n_stores; j++) { do_store(&town_info[z].store[j], flag); } } } +/* + * Monster memory + */ +static bool do_monster_lore(ls_flag_t flag) +{ + u16b tmp16u = max_r_idx; + + do_u16b(&tmp16u, flag); + + if ((flag == ls_flag_t::LOAD) && (tmp16u > max_r_idx)) + { + note("Too many monster races!"); + return false; + } + + for (std::size_t i = 0; i < tmp16u; i++) + { + do_lore(i, flag); + } + + return true; +} + + +/* + * Object memory + */ +static bool do_object_lore(ls_flag_t flag) +{ + u16b n_kinds = max_k_idx; + + do_u16b(&n_kinds, flag); + + if ((flag == ls_flag_t::LOAD) && (n_kinds > max_k_idx)) + { + note("Too many object kinds!"); + return false; + } + + for (std::size_t i = 0; i < n_kinds; i++) + { + object_kind *k_ptr = &k_info[i]; + do_bool(&k_ptr->aware, flag); + do_bool(&k_ptr->tried, flag); + do_bool(&k_ptr->artifact, flag); + } + + return true; +} + + /* * Note that this function may not be needed at all. * It was taken out of load_player_aux(). Do we need it? */ static void junkinit(void) { - int i, j; p_ptr->inside_quest = 0; p_ptr->town_num = 1; p_ptr->wilderness_x = 4; p_ptr->wilderness_y = 4; - for (i = 0; i < max_wild_x; i++) + for (std::size_t i = 0; i < max_wild_x; i++) { - for (j = 0; j < max_wild_y; j++) + for (std::size_t j = 0; j < max_wild_y; j++) { wild_map[j][i].seed = rand_int(0x10000000); } } } -static void morejunk(void) +static bool do_towns(ls_flag_t flag) +{ + u16b max_towns_ldsv = max_towns; + + do_u16b(&max_towns_ldsv, flag); + + if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > max_towns)) + { + note("Too many towns!"); + return false; + } + + if (flag == ls_flag_t::SAVE) + { + max_towns_ldsv = TOWN_RANDOM; + } + + do_u16b(&max_towns_ldsv, flag); + + if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv != TOWN_RANDOM)) + { + note("Different random towns base!"); + return false; + } + + for (std::size_t i = 0; i < max_towns; i++) + { + auto town = &town_info[i]; + + do_bool(&town->destroyed, flag); + + if (i >= TOWN_RANDOM) + { + do_u32b(&town->seed, flag); + do_byte(&town->flags, flag); + + // Create stock if necessary + if ((town_info->flags & TOWN_REAL) && (flag == ls_flag_t::LOAD)) + { + create_stores_stock(i); + } + } + } + + if (flag == ls_flag_t::SAVE) + { + max_towns_ldsv = max_d_idx; + } + + do_u16b(&max_towns_ldsv, flag); + + if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > max_d_idx)) + { + note("Too many dungeon types!"); + return false; + } + + // Town quest entrances + u16b max_quests_ldsv = TOWN_DUNGEON; + do_u16b(&max_quests_ldsv, flag); + + if ((flag == ls_flag_t::LOAD) && (max_quests_ldsv > TOWN_DUNGEON)) + { + note("Too many town per dungeons!"); + return false; + } + + for (std::size_t i = 0; i < max_towns_ldsv; i++) + { + for (std::size_t j = 0; j < max_quests_ldsv; j++) + { + do_s16b(&(d_info[i].t_idx[j]), flag); + do_s16b(&(d_info[i].t_level[j]), flag); + } + do_s16b(&(d_info[i].t_num), flag); + } + + return true; +} + +static bool do_quests(ls_flag_t flag) +{ + u16b max_quests_ldsv = MAX_Q_IDX; + + do_u16b(&max_quests_ldsv, flag); + + if ((flag == ls_flag_t::LOAD) && (max_quests_ldsv != MAX_Q_IDX)) + { + note("Invalid number of quests!"); + return false; + } + + for (std::size_t i = 0; i < MAX_Q_IDX; i++) + { + auto q = &quest[i]; + + do_s16b(&q->status, flag); + for (auto &quest_data : q->data) + { + do_s32b(&quest_data, flag); + } + + // Initialize the quest if necessary + if ((flag == ls_flag_t::LOAD) && (q->init != NULL)) + { + q->init(i); + } + } + + return true; +} + +static bool do_wilderness(ls_flag_t flag) +{ + // Player position and "mode" wrt. wilderness + do_s32b(&p_ptr->wilderness_x, flag); + do_s32b(&p_ptr->wilderness_y, flag); + do_bool(&p_ptr->wild_mode, flag); + do_bool(&p_ptr->old_wild_mode, flag); + + // Size of the wilderness + u16b wild_x_size = max_wild_x; + u16b wild_y_size = max_wild_y; + do_u16b(&wild_x_size, flag); + do_u16b(&wild_y_size, flag); + + if (flag == ls_flag_t::LOAD) + { + if ((wild_x_size > max_wild_x) || (wild_y_size > max_wild_y)) + { + note("Wilderness is too big!"); + return false; + } + } + + // Save/load wilderness tile state + for (std::size_t i = 0; i < wild_x_size; i++) + { + for (std::size_t j = 0; j < wild_y_size; j++) + { + auto w = &wild_map[j][i]; + do_u32b(&w->seed, flag); + do_u16b(&w->entrance, flag); + do_bool(&w->known, flag); + } + } + + return true; +} + +static bool do_randarts(ls_flag_t flag) { - rp_ptr = &race_info[p_ptr->prace]; /* Raceclass */ - rmp_ptr = &race_mod_info[p_ptr->pracem]; - cp_ptr = &class_info[p_ptr->pclass]; - spp_ptr = &class_info[p_ptr->pclass].spec[p_ptr->pspec]; + u16b n_randarts = MAX_RANDARTS; + + do_u16b(&n_randarts, flag); + + if ((flag == ls_flag_t::LOAD) && (n_randarts > MAX_RANDARTS)) + { + note("Too many random artifacts!"); + return false; + } + + for (std::size_t i = 0; i < n_randarts; i++) + { + random_artifact *ra_ptr = &random_artifacts[i]; + + do_string(ra_ptr->name_full, 80, flag); + do_string(ra_ptr->name_short, 80, flag); + do_byte(&ra_ptr->level, flag); + do_byte(&ra_ptr->attr, flag); + do_u32b(&ra_ptr->cost, flag); + do_byte(&ra_ptr->activation, flag); + do_byte(&ra_ptr->generated, flag); + } + + return true; +} + +static bool do_artifacts(ls_flag_t flag) +{ + u16b n_artifacts; + + if (flag == ls_flag_t::SAVE) + { + n_artifacts = max_a_idx; + } + + do_u16b(&n_artifacts, flag); + + if ((flag == ls_flag_t::LOAD) && (n_artifacts > max_a_idx)) + { + note("Too many artifacts!"); + return false; + } + + for (std::size_t i = 0; i < n_artifacts; i++) + { + do_byte(&(&a_info[i])->cur_num, flag); + } + + return true; +} + +static bool do_fates(ls_flag_t flag) +{ + u16b n_fates = MAX_FATES; + + do_u16b(&n_fates, flag); + + if ((flag == ls_flag_t::LOAD) && (n_fates > MAX_FATES)) + { + note("Too many fates!"); + return false; + } + + for (std::size_t i = 0; i < n_fates; i++) + { + auto fate = &fates[i]; + do_byte(&fate->fate, flag); + do_byte(&fate->level, flag); + do_byte(&fate->serious, flag); + do_s16b(&fate->o_idx, flag); + do_s16b(&fate->e_idx, flag); + do_s16b(&fate->a_idx, flag); + do_s16b(&fate->v_idx, flag); + do_s16b(&fate->r_idx, flag); + do_s16b(&fate->count, flag); + do_s16b(&fate->time, flag); + do_bool(&fate->know, flag); + } + + return true; +} + +static bool do_traps(ls_flag_t flag) +{ + u16b n_traps = max_t_idx; + + do_u16b(&n_traps, flag); + + if ((flag == ls_flag_t::LOAD) && (n_traps > max_t_idx)) + { + note("Too many traps!"); + return false; + } + + for (std::size_t i = 0; i < n_traps; i++) + { + do_bool(&t_info[i].ident, flag); + } + + return true; +} + +static bool do_floor_inscriptions(ls_flag_t flag) +{ + u16b n_inscriptions = MAX_INSCRIPTIONS; + do_u16b(&n_inscriptions, flag); + + if ((flag == ls_flag_t::LOAD) && (n_inscriptions > MAX_INSCRIPTIONS)) + { + note("Too many inscriptions!"); + return false; + } + + for (std::size_t i = 0; i < n_inscriptions; i++) + { + do_bool(&inscription_info[i].know, flag); + } + + return true; +} + +static bool do_player_hd(ls_flag_t flag) +{ + u16b max_level = PY_MAX_LEVEL; + + do_u16b(&max_level, flag); + + if ((flag == ls_flag_t::LOAD) && (max_level > PY_MAX_LEVEL)) + { + note("Too many hitpoint entries!"); + return false; + } + + for (std::size_t i = 0; i < max_level; i++) + { + do_s16b(&player_hp[i], flag); + } + + return true; } @@ -2211,23 +2425,14 @@ static void morejunk(void) */ static bool_ do_savefile_aux(ls_flag_t flag) { - int i, j; - - byte tmp8u; - u16b tmp16u; - /* Mention the savefile version */ if (flag == ls_flag_t::LOAD) { - if (vernum < 100) + if (vernum != SAVEFILE_VERSION) { - note(format("Savefile version %lu too old! ", vernum)); + note("Incompatible save file version"); return FALSE; } - else - { - note(format("Loading version %lu savefile... ", vernum)); - } } if (flag == ls_flag_t::SAVE) { @@ -2238,26 +2443,15 @@ static bool_ do_savefile_aux(ls_flag_t flag) /* Handle version bytes */ if (flag == ls_flag_t::LOAD) { - u32b mt32b; - byte mtbyte; - /* Discard all this, we've already read it */ + u32b mt32b; do_u32b(&mt32b, flag); - do_byte(&mtbyte, flag); } if (flag == ls_flag_t::SAVE) { u32b saver; saver = SAVEFILE_VERSION; do_u32b(&saver, flag); - tmp8u = (byte)rand_int(256); - do_byte(&tmp8u, flag); /* 'encryption' */ - } - - /* Kept only for compatibility; always set to 0 */ - { - u32b tmp32u = 0; - do_u32b(&tmp32u, flag); } /* Time of last save */ @@ -2271,7 +2465,9 @@ static bool_ do_savefile_aux(ls_flag_t flag) /* Game module */ if (flag == ls_flag_t::SAVE) + { strcpy(loaded_game_module, game_module); + } do_string(loaded_game_module, 80, flag); /* Timers */ @@ -2281,7 +2477,7 @@ static bool_ do_savefile_aux(ls_flag_t flag) do_randomizer(flag); /* Automatizer state */ - do_byte((byte*)&automatizer_enabled, flag); + do_bool(&automatizer_enabled, flag); /* Then the options */ do_options(flag); @@ -2289,283 +2485,82 @@ static bool_ do_savefile_aux(ls_flag_t flag) /* Then the "messages" */ do_messages(flag); - /* Monster Memory */ - if (flag == ls_flag_t::SAVE) tmp16u = max_r_idx; - do_u16b(&tmp16u, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_r_idx)) - { - note(format("Too many (%u) monster races!", tmp16u)); - return (FALSE); - } - - /* Read the available records */ - for (i = 0; i < tmp16u; i++) + if (!do_monster_lore(flag)) { - /* Read the lore */ - do_lore(i, flag); + return FALSE; } - /* Object Memory */ - if (flag == ls_flag_t::SAVE) tmp16u = max_k_idx; - do_u16b(&tmp16u, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_k_idx)) + if (!do_object_lore(flag)) { - note(format("Too many (%u) object kinds!", tmp16u)); - return (FALSE); + return FALSE; } - /* Read the object memory */ - for (i = 0; i < tmp16u; i++) do_xtra(i, flag); - if (flag == ls_flag_t::LOAD) junkinit(); - + // Initialize + if (flag == ls_flag_t::LOAD) { - u16b max_towns_ldsv; - u16b max_quests_ldsv; - if (flag == ls_flag_t::SAVE) max_towns_ldsv = max_towns; - /* Number of towns */ - do_u16b(&max_towns_ldsv, flag); - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > max_towns)) - { - note(format("Too many (%u) towns!", max_towns_ldsv)); - return (FALSE); - } - /* Min of random towns */ - if (flag == ls_flag_t::SAVE) max_towns_ldsv = TOWN_RANDOM; - do_u16b(&max_towns_ldsv, flag); - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv != TOWN_RANDOM)) - { - note(format("Different random towns base (%u)!", max_towns_ldsv)); - return (FALSE); - } - - for (i = 0; i < max_towns; i++) - { - do_byte((byte*)&town_info[i].destroyed, flag); - - if (i >= TOWN_RANDOM) - { - do_u32b(&town_info[i].seed, flag); - do_byte(&tmp8u, flag); - do_byte(&town_info[i].flags, flag); - - /* If the town is realy used create a sock */ - if ((town_info[i].flags & (TOWN_REAL)) && (flag == ls_flag_t::LOAD)) - { - create_stores_stock(i); - } - } - } - - /* Number of dungeon */ - if (flag == ls_flag_t::SAVE) max_towns_ldsv = max_d_idx; - do_u16b(&max_towns_ldsv, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > max_d_idx)) - { - note(format("Too many dungeon types (%u)!", max_towns_ldsv)); - return (FALSE); - } - - /* Number of towns per dungeon */ - if (flag == ls_flag_t::SAVE) max_quests_ldsv = TOWN_DUNGEON; - do_u16b(&max_quests_ldsv, flag); - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (max_quests_ldsv > TOWN_DUNGEON)) - { - note(format("Too many town per dungeons (%u)!", max_quests_ldsv)); - return (FALSE); - } - - for (i = 0; i < max_towns_ldsv; i++) - { - for (j = 0; j < max_quests_ldsv; j++) - { - do_s16b(&(d_info[i].t_idx[j]), flag); - do_s16b(&(d_info[i].t_level[j]), flag); - } - do_s16b(&(d_info[i].t_num), flag); - } - - /* Sanity check number of quests */ - if (flag == ls_flag_t::SAVE) max_quests_ldsv = MAX_Q_IDX; - do_u16b(&max_quests_ldsv, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (max_quests_ldsv != MAX_Q_IDX)) - { - note(format("Invalid number of quests (%u)!", max_quests_ldsv)); - return (FALSE); - } - - for (i = 0; i < MAX_Q_IDX; i++) - { - do_s16b(&quest[i].status, flag); - for (auto &quest_data : quest[i].data) - { - do_s32b(&quest_data, flag); - } - - /* Init the hooks */ - if ((flag == ls_flag_t::LOAD) && (quest[i].init != NULL)) - { - quest[i].init(i); - } - } - - /* Position in the wilderness */ - do_s32b(&p_ptr->wilderness_x, flag); - do_s32b(&p_ptr->wilderness_y, flag); - do_byte((byte*)&p_ptr->wild_mode, flag); - do_byte((byte*)&p_ptr->old_wild_mode, flag); - - { - s32b wild_x_size, wild_y_size; - if (flag == ls_flag_t::SAVE) - { - wild_x_size = max_wild_x; - wild_y_size = max_wild_y; - } - /* Size of the wilderness */ - do_s32b(&wild_x_size, flag); - do_s32b(&wild_y_size, flag); - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && - ((wild_x_size > max_wild_x) || (wild_y_size > max_wild_y))) - { - note(format("Wilderness is too big (%u/%u)!", - wild_x_size, wild_y_size)); - return (FALSE); - } - /* Wilderness seeds */ - for (i = 0; i < wild_x_size; i++) - { - for (j = 0; j < wild_y_size; j++) - { - do_u32b(&wild_map[j][i].seed, flag); - do_u16b(&wild_map[j][i].entrance, flag); - do_byte((byte*)&wild_map[j][i].known, flag); - } - } - } + junkinit(); } - /* Load the random artifacts. */ - if (flag == ls_flag_t::SAVE) tmp16u = MAX_RANDARTS; - do_u16b(&tmp16u, flag); - if ((flag == ls_flag_t::LOAD) && (tmp16u > MAX_RANDARTS)) - { - note(format("Too many (%u) random artifacts!", tmp16u)); - return (FALSE); - } - for (i = 0; i < tmp16u; i++) + if (!do_towns(flag)) { - random_artifact *ra_ptr = &random_artifacts[i]; - - do_string(ra_ptr->name_full, 80, flag); - do_string(ra_ptr->name_short, 80, flag); - do_byte(&ra_ptr->level, flag); - do_byte(&ra_ptr->attr, flag); - do_u32b(&ra_ptr->cost, flag); - do_byte(&ra_ptr->activation, flag); - do_byte(&ra_ptr->generated, flag); + return FALSE; } - /* Load the Artifacts */ - if (flag == ls_flag_t::SAVE) tmp16u = max_a_idx; - do_u16b(&tmp16u, flag); - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_a_idx)) + if (!do_quests(flag)) { - note(format("Too many (%u) artifacts!", tmp16u)); - return (FALSE); + return FALSE; } - /* Read the artifact flags */ - for (i = 0; i < tmp16u; i++) + if (!do_wilderness(flag)) { - do_byte(&(&a_info[i])->cur_num, flag); + return FALSE; } - /* Fates */ - if (flag == ls_flag_t::SAVE) tmp16u = MAX_FATES; - do_u16b(&tmp16u, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > MAX_FATES)) + if (!do_randarts(flag)) { - note(format("Too many (%u) fates!", tmp16u)); - return (FALSE); + return FALSE; } - /* Read the fate flags */ - for (i = 0; i < tmp16u; i++) + if (!do_artifacts(flag)) { - do_fate(i, flag); + return FALSE; } - /* Load the Traps */ - if (flag == ls_flag_t::SAVE) tmp16u = max_t_idx; - do_u16b(&tmp16u, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_t_idx)) + if (!do_fates(flag)) { - note(format("Too many (%u) traps!", tmp16u)); - return (FALSE); + return FALSE; } - /* fate flags */ - for (i = 0; i < tmp16u; i++) + if (!do_traps(flag)) { - do_byte((byte*)&t_info[i].ident, flag); + return FALSE; } - /* inscription knowledge */ - if (flag == ls_flag_t::SAVE) tmp16u = MAX_INSCRIPTIONS; - do_u16b(&tmp16u, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > MAX_INSCRIPTIONS)) + if (!do_floor_inscriptions(flag)) { - note(format("Too many (%u) inscriptions!", tmp16u)); - return (FALSE); + return FALSE; } - /* Read the inscription flag */ - for (i = 0; i < tmp16u; i++) - do_byte((byte*)&inscription_info[i].know, flag); - - - /* Read the extra stuff */ if (!do_extra(flag)) + { return FALSE; + } - - /* player_hp array */ - if (flag == ls_flag_t::SAVE) tmp16u = PY_MAX_LEVEL; - do_u16b(&tmp16u, flag); - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > PY_MAX_LEVEL)) + if (!do_player_hd(flag)) { - note(format("Too many (%u) hitpoint entries!", tmp16u)); - return (FALSE); + return FALSE; } - /* Read the player_hp array */ - for (i = 0; i < tmp16u; i++) + if (flag == ls_flag_t::LOAD) { - do_s16b(&player_hp[i], flag); + // Make sure that the auxiliary pointers for player + // class, race, etc. point to the right places. + rp_ptr = &race_info[p_ptr->prace]; + rmp_ptr = &race_mod_info[p_ptr->pracem]; + cp_ptr = &class_info[p_ptr->pclass]; + spp_ptr = &class_info[p_ptr->pclass].spec[p_ptr->pspec]; } - if (flag == ls_flag_t::LOAD) morejunk(); - /* Read the pet command settings */ do_byte(&p_ptr->pet_follow_distance, flag); do_byte(&p_ptr->pet_open_doors, flag); @@ -2575,10 +2570,13 @@ static bool_ do_savefile_aux(ls_flag_t flag) do_s16b(&p_ptr->dripping_tread, flag); /* Read the inventory */ - if (!do_inventory(flag) && (flag == ls_flag_t::LOAD)) /* do NOT reverse this ordering */ + if (!do_inventory(flag)) { - note("Unable to read inventory"); - return (FALSE); + if (flag == ls_flag_t::LOAD) + { + note("Unable to read inventory"); + return FALSE; + } } /* Stores */ @@ -2588,35 +2586,25 @@ static bool_ do_savefile_aux(ls_flag_t flag) if (!death) { /* Dead players have no dungeon */ - if (flag == ls_flag_t::LOAD) note("Restoring Dungeon..."); - if ((flag == ls_flag_t::LOAD) && (!do_dungeon(ls_flag_t::LOAD, FALSE))) + if (flag == ls_flag_t::LOAD) + { + note("Restoring Dungeon..."); + } + + if ((flag == ls_flag_t::LOAD) && (!do_dungeon(ls_flag_t::LOAD, false))) { note("Error reading dungeon data"); - return (FALSE); + return FALSE; } - if (flag == ls_flag_t::SAVE) do_dungeon(ls_flag_t::SAVE, FALSE); - my_sentinel("Before ghost data", 435, flag); - my_sentinel("After ghost data", 320, flag); - } - { - byte foo = 0; if (flag == ls_flag_t::SAVE) { - /* - * Safety Padding. It's there - * for a good reason. Trust me on - * this. Keep this at the *END* - * of the file, and do *NOT* try to - * read it. Insert any new stuff before - * this position. - */ - do_byte(&foo, ls_flag_t::SAVE); + do_dungeon(ls_flag_t::SAVE, false); } } /* Success */ - return (TRUE); + return TRUE; } @@ -2711,14 +2699,11 @@ bool_ load_player(void) /* Process file */ if (!err) { - byte tmp8u = 0; - /* Open the file XXX XXX XXX XXX Should use Angband file interface */ fff = my_fopen(savefile, "rb"); /* Read the first four bytes */ do_u32b(&vernum, ls_flag_t::LOAD); - do_byte(&tmp8u, ls_flag_t::LOAD); // For comatibility with old savefiles my_fclose(fff); -- cgit v1.2.3 From 68d77669646e9a51bb622bdced5be948c58791e2 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Remove unused fields in player_{class,race,race_mod} structs --- src/loadsave.cc | 9 --------- 1 file changed, 9 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index d4cf63ff..2c5085ed 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -300,15 +300,6 @@ static void do_subrace(ls_flag_t flag) do_byte((byte*)&sr_ptr->luck, flag); do_s16b(&sr_ptr->mana, flag); - do_s16b(&sr_ptr->r_dis, flag); - do_s16b(&sr_ptr->r_dev, flag); - do_s16b(&sr_ptr->r_sav, flag); - do_s16b(&sr_ptr->r_stl, flag); - do_s16b(&sr_ptr->r_srh, flag); - do_s16b(&sr_ptr->r_fos, flag); - do_s16b(&sr_ptr->r_thn, flag); - do_s16b(&sr_ptr->r_thb, flag); - do_byte((byte*)&sr_ptr->r_mhp, flag); do_s16b(&sr_ptr->r_exp, flag); -- cgit v1.2.3 From 2fa1a5e82a4e13f16ea6001c11d2452bac036d20 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Unify skill_* fields into skill_modifier{,s} --- src/loadsave.cc | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 2c5085ed..1d3e8144 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -261,6 +261,22 @@ static void do_quick_start(ls_flag_t flag) } } +static void do_skill_modifier(skill_modifier *s, ls_flag_t flag) +{ + do_byte((byte*) &s->basem, flag); + do_u32b( &s->base, flag); + do_byte((byte*) &s->modm, flag); + do_s16b( &s->mod, flag); +} + +static void do_skill_modifiers(skill_modifiers *skill_modifiers, ls_flag_t flag) +{ + for (std::size_t i = 0; i < MAX_SKILLS; i++) + { + do_skill_modifier(&skill_modifiers->modifiers[i], flag); + } +} + /* * The special saved subrace */ @@ -326,13 +342,7 @@ static void do_subrace(ls_flag_t flag) do_byte(&sr_ptr->g_attr, flag); do_byte((byte*)&sr_ptr->g_char, flag); - for (i = 0; i < MAX_SKILLS; i++) - { - do_byte((byte*)&sr_ptr->skill_basem[i], flag); - do_u32b(&sr_ptr->skill_base[i], flag); - do_byte((byte*)&sr_ptr->skill_modm[i], flag); - do_s16b(&sr_ptr->skill_mod[i], flag); - } + do_skill_modifiers(&sr_ptr->skill_modifiers, flag); } -- cgit v1.2.3 From 0a16384475488d682e33c8d55691e5d9417412ac Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Unify opval/oflags in player_* structs into player_level_flag --- src/loadsave.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 1d3e8144..07e2c4fc 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -19,6 +19,7 @@ #include "object2.hpp" #include "object_kind.hpp" #include "player_class.hpp" +#include "player_level_flag.hpp" #include "player_race.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" @@ -277,6 +278,12 @@ static void do_skill_modifiers(skill_modifiers *skill_modifiers, ls_flag_t flag) } } +static void do_player_level_flag(player_level_flag *lflag, ls_flag_t flag) +{ + do_flag_set(&lflag->oflags, flag); + do_s16b(&lflag->pval, flag); +} + /* * The special saved subrace */ @@ -335,8 +342,7 @@ static void do_subrace(ls_flag_t flag) for (i = 0; i < PY_MAX_LEVEL + 1; i++) { - do_flag_set(&sr_ptr->oflags[i], flag); - do_s16b(&sr_ptr->opval[i], flag); + do_player_level_flag(&sr_ptr->lflags[i], flag); } do_byte(&sr_ptr->g_attr, flag); -- cgit v1.2.3 From ef68a0c23ddb50de58ddb55f1f893095b78d7c4c Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Clean up cheat option handling in loadsave.c --- src/loadsave.cc | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 07e2c4fc..8166ab65 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1670,29 +1670,14 @@ static void do_options(ls_flag_t flag) do_byte(&hitpoint_warn, flag); /*** Cheating options ***/ - if (flag == ls_flag_t::LOAD) /* There *MUST* be some nice way to unify this! */ - { - u16b c; - do_u16b(&c, ls_flag_t::LOAD); - if (c & 0x0002) wizard = TRUE; - cheat_peek = (c & 0x0100) ? TRUE : FALSE; - cheat_hear = (c & 0x0200) ? TRUE : FALSE; - cheat_room = (c & 0x0400) ? TRUE : FALSE; - cheat_xtra = (c & 0x0800) ? TRUE : FALSE; - cheat_live = (c & 0x2000) ? TRUE : FALSE; - } - if (flag == ls_flag_t::SAVE) - { - u16b c = 0; - if (wizard) c |= 0x0002; - if (cheat_peek) c |= 0x0100; - if (cheat_hear) c |= 0x0200; - if (cheat_room) c |= 0x0400; - if (cheat_xtra) c |= 0x0800; - if (cheat_live) c |= 0x2000; - do_u16b(&c, ls_flag_t::SAVE); - } - + do_bool(&wizard, flag); + do_bool(&cheat_peek, flag); + do_bool(&cheat_hear, flag); + do_bool(&cheat_room, flag); + do_bool(&cheat_xtra, flag); + do_bool(&cheat_live, flag); + + /*** Autosave options */ do_bool(&autosave_l, flag); do_bool(&autosave_t, flag); do_s16b(&autosave_freq, flag); -- cgit v1.2.3 From 76b3632d13bbf57c6354bc10f67ea849f1d47279 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Rework player_race_mod::{title,desc} to std::string --- src/loadsave.cc | 66 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 22 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 8166ab65..066e6a6e 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -221,6 +221,48 @@ static void do_string(char *str, int max, ls_flag_t flag) } } +static void load_std_string(std::string &s) +{ + s.clear(); + while (true) + { + byte u8 = sf_get(); + if (u8) + { + s += u8; + } + else + { + break; + } + } +} + +static void save_std_string(std::string &s) +{ + for (std::size_t i = 0; i < s.length(); i++) + { + assert(s[i] != 0); // Sanity check; we cannot handle NULs in strings + sf_put(s[i]); + } + sf_put(0); // NUL terminator +} + +static void do_std_string(std::string &s, ls_flag_t flag) +{ + switch(flag) + { + case ls_flag_t::LOAD: + { + load_std_string(s); + break; + } + case ls_flag_t::SAVE: + save_std_string(s); + break; + } +} + /* * Load/save flag set */ @@ -291,29 +333,9 @@ static void do_subrace(ls_flag_t flag) { player_race_mod *sr_ptr = &race_mod_info[SUBRACE_SAVE]; int i; - char buf[81]; - buf[80] = '\0'; // Make sure string is always NUL terminated - - if (flag == ls_flag_t::SAVE) - { - strncpy(buf, sr_ptr->title, 80); - } - do_string(buf, 80, flag); - if (flag == ls_flag_t::LOAD) - { - set_subrace_title(sr_ptr, buf); - } - - if (flag == ls_flag_t::SAVE) - { - strncpy(buf, sr_ptr->desc, 80); - } - do_string(buf, 80, flag); - if (flag == ls_flag_t::LOAD) - { - set_subrace_description(sr_ptr, buf); - } + do_std_string(sr_ptr->title, flag); + do_std_string(sr_ptr->description, flag); do_bool(&sr_ptr->place, flag); -- cgit v1.2.3 From 2ec260320655504b88f8042d4b24e3e7910846a7 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Split out spellbinder fields from player_type --- src/loadsave.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 066e6a6e..ea9828d9 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -568,11 +568,11 @@ static bool_ do_extra(ls_flag_t flag) /* Save/load spellbinder */ - do_byte(&p_ptr->spellbinder_num, flag); - do_byte(&p_ptr->spellbinder_trigger, flag); + do_byte(&p_ptr->spellbinder.num, flag); + do_byte(&p_ptr->spellbinder.trigger, flag); for (std::size_t i = 0; i < 4; i++) { - do_u32b(&p_ptr->spellbinder[i], flag); + do_u32b(&p_ptr->spellbinder.spells[i], flag); } // Quests -- cgit v1.2.3 From cbcc1ba9ddafd8c2480e1c647d4b7b5f630bb63e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Refactor spellbinder to use std::vector<> --- src/loadsave.cc | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index ea9828d9..292c80b6 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -263,11 +263,11 @@ static void do_std_string(std::string &s, ls_flag_t flag) } } -/* - * Load/save flag set - */ namespace { +/** + * Load/save flag set + */ template void do_flag_set(flag_set *flags, ls_flag_t flag) { for (std::size_t i = 0; i < flags->size(); i++) @@ -276,6 +276,25 @@ template void do_flag_set(flag_set *flags, ls_flag_t f } } +template void do_vector(ls_flag_t flag, std::vector &v, F f) +{ + u32b n = v.size(); + + do_u32b(&n, flag); + + if (flag == ls_flag_t::LOAD) + { + v.clear(); // Make sure it's empty + v.reserve(n); + std::fill_n(std::back_inserter(v), n, T()); + } + + for (std::size_t i = 0; i < n; i++) + { + f(&v[i], flag); + } +} + } // namespace (anonymous) @@ -568,12 +587,8 @@ static bool_ do_extra(ls_flag_t flag) /* Save/load spellbinder */ - do_byte(&p_ptr->spellbinder.num, flag); do_byte(&p_ptr->spellbinder.trigger, flag); - for (std::size_t i = 0; i < 4; i++) - { - do_u32b(&p_ptr->spellbinder.spells[i], flag); - } + do_vector(flag, p_ptr->spellbinder.spell_idxs, do_u32b); // Quests { -- cgit v1.2.3 From b06b5ca24b7a48bfa0fba6ba0032262e4e52b569 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove effectively unused player_type::oppose_* fields --- src/loadsave.cc | 3 --- 1 file changed, 3 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 292c80b6..f6a67093 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -742,10 +742,7 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->oppose_acid, flag); do_s16b(&p_ptr->oppose_elec, flag); do_s16b(&p_ptr->oppose_pois, flag); - do_s16b(&p_ptr->oppose_ld, flag); do_s16b(&p_ptr->oppose_cc, flag); - do_s16b(&p_ptr->oppose_ss, flag); - do_s16b(&p_ptr->oppose_nex, flag); do_s16b(&p_ptr->tim_esp, flag); do_s16b(&p_ptr->tim_wraith, flag); -- cgit v1.2.3 From 8ef7443e887958060d7a77b3750f495b592eb7b3 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove unused player_type::special field --- src/loadsave.cc | 1 - 1 file changed, 1 deletion(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index f6a67093..20182298 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -793,7 +793,6 @@ static bool_ do_extra(ls_flag_t flag) do_bool(&fate_flag, flag); do_byte(&p_ptr->searching, flag); do_byte(&p_ptr->preserve, flag); - do_byte(&p_ptr->special, flag); do_bool(&ambush_flag, flag); do_byte(&p_ptr->allow_one_death, flag); -- cgit v1.2.3 From 7bf0a5a464c417cbe6d746a0deabd9538d66d4b1 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove player_type::preserve field It redundantly duplicates the value of the 'preserve' option, and since the options are saved along with the character we don't actually need it. --- src/loadsave.cc | 1 - 1 file changed, 1 deletion(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 20182298..d6ca168a 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -792,7 +792,6 @@ static bool_ do_extra(ls_flag_t flag) do_bool(&p_ptr->black_breath, flag); do_bool(&fate_flag, flag); do_byte(&p_ptr->searching, flag); - do_byte(&p_ptr->preserve, flag); do_bool(&ambush_flag, flag); do_byte(&p_ptr->allow_one_death, flag); -- cgit v1.2.3 From c3c9b09d73391ed2d0a0864dc326fc6840da0e2e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove inactive player_type::prot{good,undead} --- src/loadsave.cc | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index d6ca168a..8982d1cc 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -703,7 +703,6 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->poisoned, flag); do_s16b(&p_ptr->image, flag); do_s16b(&p_ptr->protevil, flag); - do_s16b(&p_ptr->protundead, flag); do_s16b(&p_ptr->invuln, flag); do_s16b(&p_ptr->hero, flag); do_s16b(&p_ptr->shero, flag); @@ -796,7 +795,6 @@ static bool_ do_extra(ls_flag_t flag) do_byte(&p_ptr->allow_one_death, flag); do_s16b(&no_breeds, flag); - do_s16b(&p_ptr->protgood, flag); /* Auxilliary variables */ do_u32b(&p_ptr->mimic_extra, flag); -- cgit v1.2.3 From e1273e8666e5c03c36b55a4fec80f6f76270ee10 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Move sf_* variables from global variable.cc to loadsave.cc --- src/loadsave.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 8982d1cc..1c1bb161 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -45,6 +45,20 @@ static u32b vernum; /* Version flag */ static FILE *fff; /* Local savefile ptr */ +/* + * Savefile version + */ +static byte sf_major; +static byte sf_minor; +static byte sf_patch; + +/* + * Savefile information + */ +static u32b sf_when; /* Time when savefile created */ +static u16b sf_lives; /* Number of past "lives" with this file */ +static u16b sf_saves; /* Number of "saves" during this life */ + /** * Load/save flag */ -- cgit v1.2.3 From 902611ac55dbd2c967f244b27c54d37540964c47 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Move non-boolean options to options.cc too --- src/loadsave.cc | 1 + 1 file changed, 1 insertion(+) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 1c1bb161..aa2ca5a6 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -18,6 +18,7 @@ #include "object1.hpp" #include "object2.hpp" #include "object_kind.hpp" +#include "options.hpp" #include "player_class.hpp" #include "player_level_flag.hpp" #include "player_race.hpp" -- cgit v1.2.3 From f035201f330a3b1f50a2041ea9ad3f854f7d4e00 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Move all options to a struct instead of using globals --- src/loadsave.cc | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index aa2ca5a6..a46a8787 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1709,23 +1709,23 @@ static void do_options(ls_flag_t flag) /*** Special info */ /* Read "delay_factor" */ - do_byte(&delay_factor, flag); + do_byte(&options->delay_factor, flag); /* Read "hitpoint_warn" */ - do_byte(&hitpoint_warn, flag); + do_byte(&options->hitpoint_warn, flag); /*** Cheating options ***/ do_bool(&wizard, flag); - do_bool(&cheat_peek, flag); - do_bool(&cheat_hear, flag); - do_bool(&cheat_room, flag); - do_bool(&cheat_xtra, flag); - do_bool(&cheat_live, flag); + do_bool(&options->cheat_peek, flag); + do_bool(&options->cheat_hear, flag); + do_bool(&options->cheat_room, flag); + do_bool(&options->cheat_xtra, flag); + do_bool(&options->cheat_live, flag); /*** Autosave options */ - do_bool(&autosave_l, flag); - do_bool(&autosave_t, flag); - do_s16b(&autosave_freq, flag); + do_bool(&options->autosave_l, flag); + do_bool(&options->autosave_t, flag); + do_s16b(&options->autosave_freq, flag); if (flag == ls_flag_t::LOAD) { @@ -1807,16 +1807,16 @@ static void do_options(ls_flag_t flag) if (flag == ls_flag_t::SAVE) { /* Analyze the options */ - for (i = 0; option_info[i].o_desc; i++) + for (auto const &option: options->standard_options) { - int os = option_info[i].o_page; - int ob = option_info[i].o_bit; + int os = option.o_page; + int ob = option.o_bit; /* Process real entries */ - if (option_info[i].o_var) + if (option.o_var) { /* Set */ - if (*option_info[i].o_var) + if (*option.o_var) { /* Set */ option_flag[os] |= (1L << ob); -- cgit v1.2.3 From 59df18cd52b37fb69097a7ce9ad7d1e7efa734de Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove option_{flag,mask} arrays --- src/loadsave.cc | 120 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 60 insertions(+), 60 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index a46a8787..b3b04b9c 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -68,6 +68,19 @@ enum class ls_flag_t { SAVE = 7 }; +/** + * Structure for loading/saving option values + */ +namespace { + +struct option_value { + std::string name; + bool_ value; +}; + +} // namespace (anonymous) + + /* * Basic byte-level reading from savefile. This provides a single point * of interface to the pseudoencryption that ToME (and Angband) @@ -278,6 +291,13 @@ static void do_std_string(std::string &s, ls_flag_t flag) } } +static void do_option_value(option_value *option_value, ls_flag_t flag) +{ + do_std_string(option_value->name, flag); + do_bool(&option_value->value, flag); +} + + namespace { /** @@ -1727,45 +1747,58 @@ static void do_options(ls_flag_t flag) do_bool(&options->autosave_t, flag); do_s16b(&options->autosave_freq, flag); - if (flag == ls_flag_t::LOAD) + // Standard options { - /* Read the option flags */ - for (n = 0; n < 8; n++) do_u32b(&oflag[n], flag); + std::vector option_values; - /* Read the option masks */ - for (n = 0; n < 8; n++) do_u32b(&mask[n], flag); + // If we're saving we need to map to a vector of key-value pairs. + if (flag == ls_flag_t::SAVE) + { + for (auto const &option: options->standard_options) + { + option_values.emplace_back( + option_value { + option.o_text, + *option.o_var + } + ); + } + } - /* Analyze the options */ - for (n = 0; n < 8; n++) + // Read/write the option values + do_vector(flag, option_values, do_option_value); + + // If we're loading we need to set options based of the key-value pairs. + if (flag == ls_flag_t::LOAD) { - /* Analyze the options */ - for (i = 0; i < 32; i++) + // Go through all the options that were loaded. + for (auto const &option_value: option_values) { - /* Process valid flags */ - if (mask[n] & (1L << i)) + // We need to search through all the options + // that are actually in the game; we'll ignore + // saved options that are now gone. + const option_type *found_option; + for (auto const &option: options->standard_options) { - /* Process valid flags */ - if (option_mask[n] & (1L << i)) + if (option_value.name == option.o_text) { - /* Set */ - if (oflag[n] & (1L << i)) - { - /* Set */ - option_flag[n] |= (1L << i); - } - - /* Clear */ - else - { - /* Clear */ - option_flag[n] &= ~(1L << i); - } + found_option = &option; + break; } } + + // If we found the option, we'll set the value. + if (found_option) + { + *(*found_option).o_var = option_value.value; + } } } + } + if (flag == ls_flag_t::LOAD) + { /*** Window Options ***/ /* Read the window flags */ @@ -1804,42 +1837,9 @@ static void do_options(ls_flag_t flag) } } } + if (flag == ls_flag_t::SAVE) { - /* Analyze the options */ - for (auto const &option: options->standard_options) - { - int os = option.o_page; - int ob = option.o_bit; - - /* Process real entries */ - if (option.o_var) - { - /* Set */ - if (*option.o_var) - { - /* Set */ - option_flag[os] |= (1L << ob); - } - - /* Clear */ - else - { - /* Clear */ - option_flag[os] &= ~(1L << ob); - } - } - } - - - /*** Normal options ***/ - - /* Dump the flags */ - for (i = 0; i < 8; i++) do_u32b(&option_flag[i], flag); - - /* Dump the masks */ - for (i = 0; i < 8; i++) do_u32b(&option_mask[i], flag); - /*** Window options ***/ /* Dump the flags */ -- cgit v1.2.3 From 36969a9058806e71078efcb04a91cc263612d42e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Change loadsave:do_std_string() to handle NUL properly --- src/loadsave.cc | 51 ++++++++++++++++++--------------------------------- 1 file changed, 18 insertions(+), 33 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index b3b04b9c..1843c414 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -249,45 +249,30 @@ static void do_string(char *str, int max, ls_flag_t flag) } } -static void load_std_string(std::string &s) +static void do_std_string(std::string &s, ls_flag_t flag) { - s.clear(); - while (true) + // Length prefix. + u32b saved_size = s.size(); + do_u32b(&saved_size, flag); + // Convert to size_t + std::size_t n = saved_size; + // Load/save goes a little differently since we cannot + // assume anything about 's' when loading. + if (flag == ls_flag_t::LOAD) { - byte u8 = sf_get(); - if (u8) - { - s += u8; - } - else + s.clear(); + s.reserve(n); + for (std::size_t i = 0; i < n; i++) { - break; + s += sf_get(); } } -} - -static void save_std_string(std::string &s) -{ - for (std::size_t i = 0; i < s.length(); i++) - { - assert(s[i] != 0); // Sanity check; we cannot handle NULs in strings - sf_put(s[i]); - } - sf_put(0); // NUL terminator -} - -static void do_std_string(std::string &s, ls_flag_t flag) -{ - switch(flag) - { - case ls_flag_t::LOAD: + else { - load_std_string(s); - break; - } - case ls_flag_t::SAVE: - save_std_string(s); - break; + for (std::size_t i = 0; i < n; i++) + { + sf_put(s[i]); + } } } -- cgit v1.2.3 From 6d11bb4a2d5bc8ab7c1491639f1083532b1b8fd1 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Replace RNG with PCG random number generator --- src/loadsave.cc | 78 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 35 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 1843c414..8bea40f4 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -315,9 +315,37 @@ template void do_vector(ls_flag_t flag, std::vector & } } +static void do_bytes(ls_flag_t flag, std::uint8_t *buf, std::size_t n) +{ + for (std::size_t i = 0; i < n; i++) + { + do_byte(&buf[i], flag); + } +}; + +static void do_seed(seed_t *seed, ls_flag_t flag) +{ + uint8_t buf[seed_t::n_bytes]; + + if (flag == ls_flag_t::SAVE) + { + seed->to_bytes(buf); + } + + do_bytes(flag, buf, sizeof(buf)); + + if (flag == ls_flag_t::LOAD) + { + *seed = seed_t::from_bytes(buf); + } +} + } // namespace (anonymous) +/* + * Load/Save quick start data + */ static void do_quick_start(ls_flag_t flag) { do_s16b(&previous_char.race, flag); @@ -878,8 +906,8 @@ static bool_ do_extra(ls_flag_t flag) } } - /* Load random seeds */ - do_u32b(&seed_flavor, flag); /* For consistent object flavors. */ + /* Random seed for object flavors. */ + do_seed(&seed_flavor(), flag); /* Special stuff */ do_u16b(&total_winner, flag); @@ -1676,19 +1704,24 @@ static void do_store(store_type *str, ls_flag_t flag) */ static void do_randomizer(ls_flag_t flag) { - /* Place */ - do_u16b(&Rand_place, flag); + std::string state; + + if (flag == ls_flag_t::SAVE) + { + state = get_complex_rng_state(); + } - /* State */ - for (std::size_t i = 0; i < RAND_DEG; i++) + do_std_string(state, flag); + + if (flag == ls_flag_t::LOAD) { - do_u32b(&Rand_state[i], flag); + set_complex_rng_state(state); } /* Accept */ if (flag == ls_flag_t::LOAD) { - Rand_quick = FALSE; + set_complex_rng(); } } @@ -2129,25 +2162,6 @@ static bool do_object_lore(ls_flag_t flag) } -/* - * Note that this function may not be needed at all. - * It was taken out of load_player_aux(). Do we need it? - */ -static void junkinit(void) -{ - p_ptr->inside_quest = 0; - p_ptr->town_num = 1; - p_ptr->wilderness_x = 4; - p_ptr->wilderness_y = 4; - for (std::size_t i = 0; i < max_wild_x; i++) - { - for (std::size_t j = 0; j < max_wild_y; j++) - { - wild_map[j][i].seed = rand_int(0x10000000); - } - } -} - static bool do_towns(ls_flag_t flag) { u16b max_towns_ldsv = max_towns; @@ -2181,7 +2195,7 @@ static bool do_towns(ls_flag_t flag) if (i >= TOWN_RANDOM) { - do_u32b(&town->seed, flag); + do_seed(&town->seed, flag); do_byte(&town->flags, flag); // Create stock if necessary @@ -2289,7 +2303,7 @@ static bool do_wilderness(ls_flag_t flag) for (std::size_t j = 0; j < wild_y_size; j++) { auto w = &wild_map[j][i]; - do_u32b(&w->seed, flag); + do_seed(&w->seed, flag); do_u16b(&w->entrance, flag); do_bool(&w->known, flag); } @@ -2517,12 +2531,6 @@ static bool_ do_savefile_aux(ls_flag_t flag) return FALSE; } - // Initialize - if (flag == ls_flag_t::LOAD) - { - junkinit(); - } - if (!do_towns(flag)) { return FALSE; -- cgit v1.2.3 From e569b328d76c7437018eb11efcc0aa10bbd91de6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Use 'bool' in random_quest struct --- src/loadsave.cc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 8bea40f4..73429be4 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -145,6 +145,24 @@ static void do_bool(bool_ *f, ls_flag_t flag) } } +static void do_bool(bool *x, ls_flag_t flag) +{ + switch (flag) + { + case ls_flag_t::LOAD: + { + *x = (sf_get() != 0); + return; + } + case ls_flag_t::SAVE: + { + byte val = (*x) ? 1 : 0; + sf_put(val); + return; + } + } +} + static void do_u16b(u16b *v, ls_flag_t flag) { switch (flag) -- cgit v1.2.3 From 5a3f511fd036dd73152786e83f32c32f274f2398 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Use 'bool' in struct help_info --- src/loadsave.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 73429be4..2e3ac33f 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -751,7 +751,7 @@ static bool_ do_extra(ls_flag_t flag) do_bool(&p_ptr->help.enabled, flag); for (std::size_t i = 0; i < HELP_MAX; i++) { - do_bool(&(p_ptr->help.activated[i]), flag); + do_bool(&p_ptr->help.activated[i], flag); } /* More info */ -- cgit v1.2.3 From cc857c940cfe1bfe8d78674dbce53e5b71acaf41 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Move ability_type::acquired to p_ptr struct This is justified by the fact that the 'acquired' flag is actually a player-centered bit of information and must be loaded/saved. Everything else in ability_type is defined by the *.txt files. --- src/loadsave.cc | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 2e3ac33f..e6f4cefa 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1,7 +1,6 @@ #include "loadsave.hpp" #include "loadsave.h" -#include "ability_type.hpp" #include "artifact_type.hpp" #include "birth.hpp" #include "cave_type.hpp" @@ -619,21 +618,7 @@ static bool_ do_extra(ls_flag_t flag) } // Abilities - { - u16b tmp16u = max_ab_idx; - - do_u16b(&tmp16u, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_ab_idx)) - { - quit("Too many abilities"); - } - - for (std::size_t i = 0; i < tmp16u; ++i) - { - do_bool(&ab_info[i].acquired, flag); - } - } + do_vector(flag, p_ptr->abilities, do_u16b); // Miscellaneous do_s16b(&p_ptr->luck_base, flag); -- cgit v1.2.3 From daf23851092099647a3830aa1c0cf12962f55b8e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Move 'player_*' shared fields to new 'player_shared' struct --- src/loadsave.cc | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index e6f4cefa..350fad65 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -424,19 +424,32 @@ static void do_subrace(ls_flag_t flag) do_bool(&sr_ptr->place, flag); for (i = 0; i < 6; i++) - do_s16b(&sr_ptr->r_adj[i], flag); + { + do_s16b(&sr_ptr->ps.adj[i], flag); + } do_byte((byte*)&sr_ptr->luck, flag); do_s16b(&sr_ptr->mana, flag); - do_byte((byte*)&sr_ptr->r_mhp, flag); - do_s16b(&sr_ptr->r_exp, flag); + do_byte((byte*)&sr_ptr->ps.mhp, flag); + do_s16b(&sr_ptr->ps.exp, flag); do_byte((byte*)&sr_ptr->infra, flag); - for (i = 0; i < 4; i++) { - do_s16b(&sr_ptr->powers[i], flag); + u16b n = sr_ptr->ps.powers.size(); + + do_u16b(&n, flag); + + for (std::size_t i = 0; i < n; i++) + { + if (flag == ls_flag_t::LOAD) + { + sr_ptr->ps.powers.push_back(0); + } + + do_s16b(&sr_ptr->ps.powers[i], flag); + } } for (i = 0; i < BODY_MAX; i++) -- cgit v1.2.3 From fdeb84f9ae4927938d3c0a541129e17338f39e15 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Add do_char() in loadsave.cc to avoid casts --- src/loadsave.cc | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 350fad65..84061354 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -134,6 +134,11 @@ static void do_byte(byte *v, ls_flag_t flag) } } +static void do_char(char *c, ls_flag_t flag) +{ + do_byte((byte *) c, flag); +} + static void do_bool(bool_ *f, ls_flag_t flag) { byte b = *f; @@ -390,10 +395,10 @@ static void do_quick_start(ls_flag_t flag) static void do_skill_modifier(skill_modifier *s, ls_flag_t flag) { - do_byte((byte*) &s->basem, flag); - do_u32b( &s->base, flag); - do_byte((byte*) &s->modm, flag); - do_s16b( &s->mod, flag); + do_char(&s->basem, flag); + do_u32b(&s->base, flag); + do_char(&s->modm, flag); + do_s16b(&s->mod, flag); } static void do_skill_modifiers(skill_modifiers *skill_modifiers, ls_flag_t flag) @@ -428,13 +433,13 @@ static void do_subrace(ls_flag_t flag) do_s16b(&sr_ptr->ps.adj[i], flag); } - do_byte((byte*)&sr_ptr->luck, flag); + do_char(&sr_ptr->luck, flag); do_s16b(&sr_ptr->mana, flag); - do_byte((byte*)&sr_ptr->ps.mhp, flag); + do_s16b(&sr_ptr->ps.mhp, flag); do_s16b(&sr_ptr->ps.exp, flag); - do_byte((byte*)&sr_ptr->infra, flag); + do_char(&sr_ptr->infra, flag); { u16b n = sr_ptr->ps.powers.size(); @@ -454,7 +459,7 @@ static void do_subrace(ls_flag_t flag) for (i = 0; i < BODY_MAX; i++) { - do_byte((byte*)&sr_ptr->body_parts[i], flag); + do_char(&sr_ptr->body_parts[i], flag); } do_flag_set(&sr_ptr->flags, flag); @@ -465,7 +470,7 @@ static void do_subrace(ls_flag_t flag) } do_byte(&sr_ptr->g_attr, flag); - do_byte((byte*)&sr_ptr->g_char, flag); + do_char(&sr_ptr->g_char, flag); do_skill_modifiers(&sr_ptr->skill_modifiers, flag); } @@ -891,10 +896,10 @@ static bool_ do_extra(ls_flag_t flag) } /* The tactic */ - do_byte((byte*)&p_ptr->tactic, flag); + do_char(&p_ptr->tactic, flag); /* The movement */ - do_byte((byte*)&p_ptr->movement, flag); + do_char(&p_ptr->movement, flag); /* The comapnions killed */ do_s16b(&p_ptr->companion_killed, flag); -- cgit v1.2.3 From 639976ed95b8031cfde1f64e85b5efdeba417164 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Un-overload do_bool() in loadsave It turns out this causes issues with inference around templated functions, so it's best to avoid it for now. --- src/loadsave.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 84061354..f71a0e63 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -149,7 +149,7 @@ static void do_bool(bool_ *f, ls_flag_t flag) } } -static void do_bool(bool *x, ls_flag_t flag) +static void do_std_bool(bool *x, ls_flag_t flag) { switch (flag) { @@ -490,7 +490,7 @@ static void do_spells(int i, ls_flag_t flag) do_byte(&s_ptr->dam_sides, flag); do_byte(&s_ptr->dam_dice, flag); do_byte(&s_ptr->level, flag); - do_bool(&s_ptr->untried, flag); + do_std_bool(&s_ptr->untried, flag); } @@ -696,7 +696,7 @@ static bool_ do_extra(ls_flag_t flag) { do_byte(&random_quests[i].type, flag); do_s16b(&random_quests[i].r_idx, flag); - do_bool(&random_quests[i].done, flag); + do_std_bool(&random_quests[i].done, flag); } } @@ -751,10 +751,10 @@ static bool_ do_extra(ls_flag_t flag) } /* Help */ - do_bool(&p_ptr->help.enabled, flag); + do_std_bool(&p_ptr->help.enabled, flag); for (std::size_t i = 0; i < HELP_MAX; i++) { - do_bool(&p_ptr->help.activated[i], flag); + do_std_bool(&p_ptr->help.activated[i], flag); } /* More info */ -- cgit v1.2.3 From d9d9d8c5e96eadbefb2c8506a387fc282c2fe8b5 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove unused "quest_idx" parameter from quest_type::init() --- src/loadsave.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index f71a0e63..c31aeccc 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2288,7 +2288,7 @@ static bool do_quests(ls_flag_t flag) // Initialize the quest if necessary if ((flag == ls_flag_t::LOAD) && (q->init != NULL)) { - q->init(i); + q->init(); } } -- cgit v1.2.3 From 4f1abfbf1a70f4dcc4e360a68b71b27e867d561d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Split "inscription known" game state from inscription definitions --- src/loadsave.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index c31aeccc..5fb4bada 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2450,7 +2450,7 @@ static bool do_floor_inscriptions(ls_flag_t flag) for (std::size_t i = 0; i < n_inscriptions; i++) { - do_bool(&inscription_info[i].know, flag); + do_std_bool(&p_ptr->inscriptions[i], flag); } return true; -- cgit v1.2.3 From 7d8641b99e82d62ddb8753d7b50d6b9fcab91c41 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Don't try to handle added skills on load --- src/loadsave.cc | 32 ++++++-------------------------- 1 file changed, 6 insertions(+), 26 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 5fb4bada..562a403b 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -601,37 +601,17 @@ static bool_ do_extra(ls_flag_t flag) do_u16b(&tmp16u, flag); - if ((flag == ls_flag_t::LOAD) && (tmp16u > MAX_SKILLS)) + if ((flag == ls_flag_t::LOAD) && (tmp16u != MAX_SKILLS)) { - quit("Too many skills"); + quit("Too few/many skills"); } - if (flag == ls_flag_t::SAVE) - { - old_max_s_idx = max_s_idx; - } - do_u16b(&old_max_s_idx, flag); - for (std::size_t i = 0; i < tmp16u; i++) { - if (i < old_max_s_idx) - { - do_s32b(&s_info[i].value, flag); - do_s32b(&s_info[i].mod, flag); - do_bool(&s_info[i].dev, flag); - do_bool(&s_info[i].hidden, flag); - } - else - { - // Skip extraneous entries - u32b tmp32u = 0; - s16b tmp16s = 0; - bool_ tmp8u = 0; - do_u32b(&tmp32u, flag); - do_s16b(&tmp16s, flag); - do_bool(&tmp8u, flag); - do_bool(&tmp8u, flag); - } + do_s32b(&s_info[i].value, flag); + do_s32b(&s_info[i].mod, flag); + do_bool(&s_info[i].dev, flag); + do_bool(&s_info[i].hidden, flag); } } -- cgit v1.2.3 From 0cd5370d552babada63b59003e7629c180d4eeaa Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Change skill_type struct to use 'bool' --- src/loadsave.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 562a403b..b8544f01 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -610,8 +610,8 @@ static bool_ do_extra(ls_flag_t flag) { do_s32b(&s_info[i].value, flag); do_s32b(&s_info[i].mod, flag); - do_bool(&s_info[i].dev, flag); - do_bool(&s_info[i].hidden, flag); + do_std_bool(&s_info[i].dev, flag); + do_std_bool(&s_info[i].hidden, flag); } } -- cgit v1.2.3 From 013e27d39ee8ee513208d2855c7e3f6252f0c0bf Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Refactor object_type 'inscription' field to std::string We don't really need quarks for this since we're not nearly as memory-constrained these days. --- src/loadsave.cc | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index b8544f01..6da23406 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1138,16 +1138,13 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) do_s16b(&o_ptr->found_aux3, flag); do_s16b(&o_ptr->found_aux4, flag); + // Inscription + do_std_string(o_ptr->inscription, flag); + + /* Artifact name */ if (flag == ls_flag_t::LOAD) { char buf[128]; - /* Inscription */ - load_string(buf, 128); - if (buf[0]) - { - o_ptr->note = quark_add(buf); - } - /* Artifact name */ load_string(buf, 128); if (buf[0]) { @@ -1156,15 +1153,6 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) } if (flag == ls_flag_t::SAVE) { - /* Save the inscription (if any) */ - if (o_ptr->note) - { - save_string(quark_str(o_ptr->note)); - } - else - { - save_string(""); - } if (o_ptr->art_name) { save_string(quark_str(o_ptr->art_name)); -- cgit v1.2.3 From 8bbf783ead4517465445272f9144cf06bdac9be7 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Refactor object_type 'artifact name' field to std::string We don't really need quarks for this since we're not nearly as memory-constrained these days. --- src/loadsave.cc | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 6da23406..3f4ba47f 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1141,31 +1141,15 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) // Inscription do_std_string(o_ptr->inscription, flag); - /* Artifact name */ - if (flag == ls_flag_t::LOAD) - { - char buf[128]; - load_string(buf, 128); - if (buf[0]) - { - o_ptr->art_name = quark_add(buf); - } - } - if (flag == ls_flag_t::SAVE) - { - if (o_ptr->art_name) - { - save_string(quark_str(o_ptr->art_name)); - } - else - { - save_string(""); - } - } + // Artifact name + do_std_string(o_ptr->artifact_name, flag); + + /* Stick any more shared code before this. The rest + of this function is reserved for ls_flag_t::LOAD's + cleanup functions */ + + if (flag == ls_flag_t::SAVE) return; - if (flag == ls_flag_t::SAVE) return ; /* Stick any more shared code before this. The rest - of this function is reserved for ls_flag_t::LOAD's - cleanup functions */ /*********** END OF ls_flag_t::SAVE ***************/ /* Obtain the "kind" template */ @@ -1248,7 +1232,7 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) o_ptr->ds = old_ds; } - if (o_ptr->art_name) /* A random artifact */ + if (!o_ptr->artifact_name.empty()) /* A random artifact */ { o_ptr->dd = old_dd; o_ptr->ds = old_ds; -- cgit v1.2.3 From 288c3d3f725eabfee06507966a0ba63bf587c3da Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove quark.{cc,hpp} --- src/loadsave.cc | 1 - 1 file changed, 1 deletion(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 3f4ba47f..b66aeb01 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -23,7 +23,6 @@ #include "player_race.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "hooks.hpp" #include "skill_type.hpp" #include "store_type.hpp" -- cgit v1.2.3 From 446e8bb30e8171988781722fff69b49e2b2d2e20 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Split loadsave:do_std_string --- src/loadsave.cc | 52 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 17 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index b66aeb01..cf257849 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -270,30 +270,48 @@ static void do_string(char *str, int max, ls_flag_t flag) } } -static void do_std_string(std::string &s, ls_flag_t flag) +static void save_std_string(std::string const *s) +{ + // Length prefix. + u32b saved_size = s->size(); + do_u32b(&saved_size, ls_flag_t::SAVE); + // Save each character + for (auto c: *s) + { + sf_put(c); + } +} + +static std::string load_std_string() { // Length prefix. - u32b saved_size = s.size(); - do_u32b(&saved_size, flag); + u32b saved_size; + do_u32b(&saved_size, ls_flag_t::LOAD); // Convert to size_t std::size_t n = saved_size; - // Load/save goes a little differently since we cannot - // assume anything about 's' when loading. - if (flag == ls_flag_t::LOAD) + // Make sure we reserve space rather than resizing as we go. + std::string s; + s.reserve(n); + // Read each character + for (std::size_t i = 0; i < n; i++) { - s.clear(); - s.reserve(n); - for (std::size_t i = 0; i < n; i++) - { - s += sf_get(); - } + s += sf_get(); } - else + // Done + return s; +} + + +static void do_std_string(std::string &s, ls_flag_t flag) +{ + switch (flag) { - for (std::size_t i = 0; i < n; i++) - { - sf_put(s[i]); - } + case ls_flag_t::LOAD: + s = load_std_string(); + break; + case ls_flag_t::SAVE: + save_std_string(&s); + break; } } -- cgit v1.2.3 From 656d238d855e3d7640f10c6b0c1dc84380f50e94 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Use do_vector() for "powers" in loadsave.cc --- src/loadsave.cc | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index cf257849..c8b3e533 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -458,21 +458,7 @@ static void do_subrace(ls_flag_t flag) do_char(&sr_ptr->infra, flag); - { - u16b n = sr_ptr->ps.powers.size(); - - do_u16b(&n, flag); - - for (std::size_t i = 0; i < n; i++) - { - if (flag == ls_flag_t::LOAD) - { - sr_ptr->ps.powers.push_back(0); - } - - do_s16b(&sr_ptr->ps.powers[i], flag); - } - } + do_vector(flag, sr_ptr->ps.powers, do_s16b); for (i = 0; i < BODY_MAX; i++) { -- cgit v1.2.3 From 0a48c0f1af4b35338d2360f6efa4c467ec60b60d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Refactor messages.cc to use boost::circular_buffer We might as well delegate the massive implementation complexity and get rid of a ton of legacy code. --- src/loadsave.cc | 43 +++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 24 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index c8b3e533..ce7dfdf8 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1943,43 +1943,38 @@ static bool_ do_inventory(ls_flag_t flag) } +static void do_message(message &msg, ls_flag_t flag) +{ + do_std_string(msg.text, flag); + do_u32b(&msg.count, flag); + do_byte(&msg.color, flag); +} + /* * Read the saved messages */ static void do_messages(ls_flag_t flag) { - int i; - char buf[128]; - byte color; - - s16b num; - - /* Total */ - if (flag == ls_flag_t::SAVE) num = message_num(); + /* Save/load number of messages */ + s16b num = message_num(); do_s16b(&num, flag); /* Read the messages */ - if (flag == ls_flag_t::LOAD) + for (int i = 0; i < num; i++) { - for (i = 0; i < num; i++) - { - /* Read the message */ - do_string(buf, 128, ls_flag_t::LOAD); - do_byte(&color, flag); + message message; - /* Save the message */ - message_add(buf, color); + if (flag == ls_flag_t::SAVE) + { + message = message_at(i); } - } - if (flag == ls_flag_t::SAVE) - { - byte holder; - for (i = num - 1; i >= 0; i--) + + do_message(message, flag); + + if (flag == ls_flag_t::LOAD) { - do_string((char *)message_str((s16b)i), 0, ls_flag_t::SAVE); - holder = message_color((s16b)i); - do_byte(&holder, flag); + message_add(message); } } } -- cgit v1.2.3 From 68c4fe1d6494fb6c92d117db170ea39831c16b00 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Clean up do_stores() in loadsave.cc a little --- src/loadsave.cc | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index ce7dfdf8..9b963cfd 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2041,35 +2041,33 @@ static void do_timers(ls_flag_t flag) */ static void do_stores(ls_flag_t flag) { - u16b real_max = 0; + // Indexes for "real" towns. + std::vector reals; + reals.reserve(max_towns); - /* Note that this forbids max_towns from shrinking, but that is fine */ - std::unique_ptr reals(new byte[max_towns]); - - /* Find the real towns */ + // Fill in the "real" towns if necessary. if (flag == ls_flag_t::SAVE) { for (int i = 1; i < max_towns; i++) { - if (!(town_info[i].flags & (TOWN_REAL))) continue; - reals[real_max++] = i; + if (!(town_info[i].flags & TOWN_REAL)) + { + continue; + } + reals.emplace_back(i); } } - do_u16b(&real_max, flag); - for (int i = 0; i < real_max; i++) - { - do_byte(&reals[i], flag); - } + + // Load/save + do_vector(flag, reals, do_byte); /* Read the stores */ u16b n_stores = max_st_idx; do_u16b(&n_stores, flag); assert(n_stores <= max_st_idx); - for (int i = 0; i < real_max; i++) + for (auto const z: reals) { - int z = reals[i]; - if (!town_info[z].stocked) { create_stores_stock(z); -- cgit v1.2.3 From dc261d2c9732554d9f510e11711ac84d028e5ac1 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Use grid<> for wilderness grid --- src/loadsave.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 9b963cfd..9eb0b185 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2245,6 +2245,8 @@ static bool do_quests(ls_flag_t flag) static bool do_wilderness(ls_flag_t flag) { + auto &wilderness = *wilderness_ptr; + // Player position and "mode" wrt. wilderness do_s32b(&p_ptr->wilderness_x, flag); do_s32b(&p_ptr->wilderness_y, flag); @@ -2252,14 +2254,14 @@ static bool do_wilderness(ls_flag_t flag) do_bool(&p_ptr->old_wild_mode, flag); // Size of the wilderness - u16b wild_x_size = max_wild_x; - u16b wild_y_size = max_wild_y; + u16b wild_x_size = wilderness.width(); + u16b wild_y_size = wilderness.height(); do_u16b(&wild_x_size, flag); do_u16b(&wild_y_size, flag); if (flag == ls_flag_t::LOAD) { - if ((wild_x_size > max_wild_x) || (wild_y_size > max_wild_y)) + if ((wild_x_size > wilderness.width()) || (wild_y_size > wilderness.height())) { note("Wilderness is too big!"); return false; @@ -2267,11 +2269,11 @@ static bool do_wilderness(ls_flag_t flag) } // Save/load wilderness tile state - for (std::size_t i = 0; i < wild_x_size; i++) + for (std::size_t x = 0; x < wild_x_size; x++) { - for (std::size_t j = 0; j < wild_y_size; j++) + for (std::size_t y = 0; y < wild_y_size; y++) { - auto w = &wild_map[j][i]; + auto w = &wilderness(x, y); do_seed(&w->seed, flag); do_u16b(&w->entrance, flag); do_bool(&w->known, flag); -- cgit v1.2.3 From 05cdb1a997cba7748f0089cffa0a5885ca0b2c43 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Move wilderness structure into Game --- src/loadsave.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 9eb0b185..22708203 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -6,6 +6,7 @@ #include "cave_type.hpp" #include "dungeon_info_type.hpp" #include "ego_item_type.hpp" +#include "game.hpp" #include "init1.hpp" #include "init2.hpp" #include "levels.hpp" @@ -2245,7 +2246,7 @@ static bool do_quests(ls_flag_t flag) static bool do_wilderness(ls_flag_t flag) { - auto &wilderness = *wilderness_ptr; + auto &wilderness = game->wilderness; // Player position and "mode" wrt. wilderness do_s32b(&p_ptr->wilderness_x, flag); -- cgit v1.2.3 From b85a1f777946af3ba763942ee78a7a4bce2afdb0 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Move player_hp[] into Game --- src/loadsave.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 22708203..bbcc8784 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2409,6 +2409,8 @@ static bool do_floor_inscriptions(ls_flag_t flag) static bool do_player_hd(ls_flag_t flag) { + auto &player_hp = game->player_hp; + u16b max_level = PY_MAX_LEVEL; do_u16b(&max_level, flag); -- cgit v1.2.3 From a82be561ad77d615f619ed16614c3c09fdc9ba2f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move random_spells into player_type # Conflicts: # src/loadsave.cc --- src/loadsave.cc | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index bbcc8784..06e53d02 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -480,10 +480,8 @@ static void do_subrace(ls_flag_t flag) } -/* Load/Save the random spells info */ -static void do_spells(int i, ls_flag_t flag) +static void do_random_spell(random_spell *s_ptr, ls_flag_t flag) { - random_spell *s_ptr = &random_spells[i]; do_string(s_ptr->name, 30, flag); do_string(s_ptr->desc, 30, flag); do_s16b(&s_ptr->mana, flag); @@ -891,15 +889,11 @@ static bool_ do_extra(ls_flag_t flag) /* The fate */ do_bool(&p_ptr->no_mortal, flag); + /* Random spells */ + do_vector(flag, p_ptr->random_spells, do_random_spell); /* Spells */ { - do_s16b(&spell_num, flag); - for (std::size_t i = 0; i < MAX_SPELLS; i++) - { - do_spells(i, flag); - } - do_s16b(&rune_num, flag); for (std::size_t i = 0; i < MAX_RUNES; i++) -- cgit v1.2.3 From 0e91eb9e205508daf5de1234e7ac3e59fa809982 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move rune_spells into player_type --- src/loadsave.cc | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 06e53d02..8c2a79c4 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -495,6 +495,14 @@ static void do_random_spell(random_spell *s_ptr, ls_flag_t flag) do_std_bool(&s_ptr->untried, flag); } +static void do_rune_spell(rune_spell *s_ptr, ls_flag_t flag) +{ + do_string(s_ptr->name, 30, flag); + do_s16b(&s_ptr->type, flag); + do_s16b(&s_ptr->rune2, flag); + do_s16b(&s_ptr->mana, flag); +} + /* * Show information on the screen, one line at a time. @@ -892,18 +900,8 @@ static bool_ do_extra(ls_flag_t flag) /* Random spells */ do_vector(flag, p_ptr->random_spells, do_random_spell); - /* Spells */ - { - do_s16b(&rune_num, flag); - - for (std::size_t i = 0; i < MAX_RUNES; i++) - { - do_string(rune_spells[i].name, 30, flag); - do_s16b(&rune_spells[i].type, flag); - do_s16b(&rune_spells[i].rune2, flag); - do_s16b(&rune_spells[i].mana, flag); - } - } + /* Rune spells */ + do_vector(flag, p_ptr->rune_spells, do_rune_spell); /* Random seed for object flavors. */ do_seed(&seed_flavor(), flag); -- cgit v1.2.3 From 3cdeb22086fc177165acb2d7b6530ccc230ec8e6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move class_info to GameEditData --- src/loadsave.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 8c2a79c4..82603563 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2427,6 +2427,8 @@ static bool do_player_hd(ls_flag_t flag) */ static bool_ do_savefile_aux(ls_flag_t flag) { + auto &class_info = game->edit_data.class_info; + /* Mention the savefile version */ if (flag == ls_flag_t::LOAD) { -- cgit v1.2.3 From d33961f89a0c80f2fae4020184e72467b5c192cf Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move race_info and race_mod_info to GameEditData --- src/loadsave.cc | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 82603563..5354af9a 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -438,6 +438,8 @@ static void do_player_level_flag(player_level_flag *lflag, ls_flag_t flag) */ static void do_subrace(ls_flag_t flag) { + auto &race_mod_info = game->edit_data.race_mod_info; + player_race_mod *sr_ptr = &race_mod_info[SUBRACE_SAVE]; int i; @@ -2428,6 +2430,8 @@ static bool do_player_hd(ls_flag_t flag) static bool_ do_savefile_aux(ls_flag_t flag) { auto &class_info = game->edit_data.class_info; + auto const &race_info = game->edit_data.race_info; + auto const &race_mod_info = game->edit_data.race_mod_info; /* Mention the savefile version */ if (flag == ls_flag_t::LOAD) -- cgit v1.2.3 From 667acd0e312301ad613b6a71f843c51d2062aee6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move d_info into GameEditData --- src/loadsave.cc | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 5354af9a..c100418e 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -532,6 +532,8 @@ static void note(cptr msg) static char loaded_game_module[80]; static bool_ do_extra(ls_flag_t flag) { + auto const &d_info = game->edit_data.d_info; + do_string(player_name, 32, flag); do_string(died_from, 80, flag); @@ -543,14 +545,14 @@ static bool_ do_extra(ls_flag_t flag) /* Handle the special levels info */ { - byte tmp8u = max_d_idx; + byte tmp8u = d_info.size(); u16b tmp16u = MAX_DUNGEON_DEPTH; do_byte(&tmp8u, flag); if (flag == ls_flag_t::LOAD) { - if (tmp8u > max_d_idx) + if (tmp8u > d_info.size()) { note(format("Too many dungeon types!", static_cast(tmp8u))); } @@ -719,7 +721,7 @@ static bool_ do_extra(ls_flag_t flag) // Max dungeon levels { - byte tmp8u = max_d_idx; + byte tmp8u = d_info.size(); do_byte(&tmp8u, flag); @@ -729,7 +731,7 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&tmp16s, flag); - if ((flag == ls_flag_t::LOAD) && (i <= max_d_idx)) + if ((flag == ls_flag_t::LOAD) && (i <= d_info.size())) { max_dlv[i] = tmp16s; } @@ -794,7 +796,7 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->tim_invis, flag); do_s16b(&p_ptr->word_recall, flag); - do_s16b(&p_ptr->recall_dungeon, flag); + do_byte(&p_ptr->recall_dungeon, flag); do_s16b(&p_ptr->see_infra, flag); do_s16b(&p_ptr->tim_infra, flag); do_s16b(&p_ptr->oppose_fire, flag); @@ -2128,6 +2130,8 @@ static bool do_object_lore(ls_flag_t flag) static bool do_towns(ls_flag_t flag) { + auto &d_info = game->edit_data.d_info; + u16b max_towns_ldsv = max_towns; do_u16b(&max_towns_ldsv, flag); @@ -2172,12 +2176,12 @@ static bool do_towns(ls_flag_t flag) if (flag == ls_flag_t::SAVE) { - max_towns_ldsv = max_d_idx; + max_towns_ldsv = d_info.size(); } do_u16b(&max_towns_ldsv, flag); - if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > max_d_idx)) + if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > d_info.size())) { note("Too many dungeon types!"); return false; -- cgit v1.2.3 From aebc48dffa75698be4d2c1bb2b1a0927b10be1cc Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move st_info into GameEditData --- src/loadsave.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index c100418e..64b4f6d6 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2038,6 +2038,8 @@ static void do_timers(ls_flag_t flag) */ static void do_stores(ls_flag_t flag) { + auto const &st_info = game->edit_data.st_info; + // Indexes for "real" towns. std::vector reals; reals.reserve(max_towns); @@ -2059,9 +2061,9 @@ static void do_stores(ls_flag_t flag) do_vector(flag, reals, do_byte); /* Read the stores */ - u16b n_stores = max_st_idx; + u16b n_stores = st_info.size(); do_u16b(&n_stores, flag); - assert(n_stores <= max_st_idx); + assert(n_stores <= st_info.size()); for (auto const z: reals) { -- cgit v1.2.3 From 765e1a3dc7abce3a849b8d1f124ada7a6984154a Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move s_{info,descriptors} to Game/GameEdtiData --- src/loadsave.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 64b4f6d6..41bd86d1 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -421,10 +421,7 @@ static void do_skill_modifier(skill_modifier *s, ls_flag_t flag) static void do_skill_modifiers(skill_modifiers *skill_modifiers, ls_flag_t flag) { - for (std::size_t i = 0; i < MAX_SKILLS; i++) - { - do_skill_modifier(&skill_modifiers->modifiers[i], flag); - } + do_vector(flag, skill_modifiers->modifiers, do_skill_modifier); } static void do_player_level_flag(player_level_flag *lflag, ls_flag_t flag) @@ -533,6 +530,7 @@ static char loaded_game_module[80]; static bool_ do_extra(ls_flag_t flag) { auto const &d_info = game->edit_data.d_info; + auto &s_info = game->s_info; do_string(player_name, 32, flag); @@ -611,11 +609,11 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->melee_style, flag); do_s16b(&p_ptr->use_piercing_shots, flag); - u16b tmp16u = MAX_SKILLS; + u16b tmp16u = s_info.size(); do_u16b(&tmp16u, flag); - if ((flag == ls_flag_t::LOAD) && (tmp16u != MAX_SKILLS)) + if ((flag == ls_flag_t::LOAD) && (tmp16u != s_info.size())) { quit("Too few/many skills"); } -- cgit v1.2.3 From 0c2f30b56c221a826ba64f0ec864c29d0f717644 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move r_info into GameEditData --- src/loadsave.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 41bd86d1..8d05cb43 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1366,6 +1366,8 @@ static bool do_objects(ls_flag_t flag, bool no_companions) static bool do_monsters(ls_flag_t flag, bool no_companions) { + auto &r_info = game->edit_data.r_info; + u16b n_monsters = m_max; if (flag == ls_flag_t::SAVE) @@ -1618,7 +1620,9 @@ bool_ file_exist(cptr buf) */ static void do_lore(std::size_t r_idx, ls_flag_t flag) { - monster_race *r_ptr = &r_info[r_idx]; + auto &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; do_s16b(&r_ptr->r_pkills, flag); do_s16b(&r_ptr->max_num, flag); @@ -2082,11 +2086,13 @@ static void do_stores(ls_flag_t flag) */ static bool do_monster_lore(ls_flag_t flag) { - u16b tmp16u = max_r_idx; + auto const &r_info = game->edit_data.r_info; + + u16b tmp16u = r_info.size(); do_u16b(&tmp16u, flag); - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_r_idx)) + if ((flag == ls_flag_t::LOAD) && (tmp16u > r_info.size())) { note("Too many monster races!"); return false; -- cgit v1.2.3 From 1bbed63b66c0f69809e698576a51501150f06bba Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move k_info into GameEditData --- src/loadsave.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 8d05cb43..1329827f 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1056,6 +1056,8 @@ static bool_ wearable_p(object_type *o_ptr) */ static void do_item(object_type *o_ptr, ls_flag_t flag) { + auto &k_info = game->edit_data.k_info; + byte old_dd; byte old_ds; @@ -2112,11 +2114,13 @@ static bool do_monster_lore(ls_flag_t flag) */ static bool do_object_lore(ls_flag_t flag) { - u16b n_kinds = max_k_idx; + auto &k_info = game->edit_data.k_info; + + u16b n_kinds = k_info.size(); do_u16b(&n_kinds, flag); - if ((flag == ls_flag_t::LOAD) && (n_kinds > max_k_idx)) + if ((flag == ls_flag_t::LOAD) && (n_kinds > k_info.size())) { note("Too many object kinds!"); return false; -- cgit v1.2.3 From 57bb453a15034c67d04496360b306a5f3bfd0bf2 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move a_info into GameEditData --- src/loadsave.cc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 1329827f..c58279a2 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1057,6 +1057,7 @@ static bool_ wearable_p(object_type *o_ptr) static void do_item(object_type *o_ptr, ls_flag_t flag) { auto &k_info = game->edit_data.k_info; + auto &a_info = game->edit_data.a_info; byte old_dd; byte old_ds; @@ -1181,10 +1182,8 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) /* Paranoia */ if (o_ptr->name1) { - artifact_type *a_ptr; - /* Obtain the artifact info */ - a_ptr = &a_info[o_ptr->name1]; + auto a_ptr = &a_info[o_ptr->name1]; /* Verify that artifact */ if (!a_ptr->name) o_ptr->name1 = 0; @@ -1852,6 +1851,8 @@ static void do_options(ls_flag_t flag) */ static bool_ do_inventory(ls_flag_t flag) { + auto const &a_info = game->edit_data.a_info; + if (flag == ls_flag_t::LOAD) { int slot = 0; @@ -2322,16 +2323,18 @@ static bool do_randarts(ls_flag_t flag) static bool do_artifacts(ls_flag_t flag) { + auto &a_info = game->edit_data.a_info; + u16b n_artifacts; if (flag == ls_flag_t::SAVE) { - n_artifacts = max_a_idx; + n_artifacts = a_info.size(); } do_u16b(&n_artifacts, flag); - if ((flag == ls_flag_t::LOAD) && (n_artifacts > max_a_idx)) + if ((flag == ls_flag_t::LOAD) && (n_artifacts > a_info.size())) { note("Too many artifacts!"); return false; -- cgit v1.2.3 From 89e75b855662b1dcc86a6dc3789fa496aafbb0a2 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move e_info into GameEditData --- src/loadsave.cc | 1 + 1 file changed, 1 insertion(+) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index c58279a2..d9dfe452 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1058,6 +1058,7 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) { auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; + auto &e_info = game->edit_data.e_info; byte old_dd; byte old_ds; -- cgit v1.2.3 From c25b265c056a4512b0fb0e1789927e6c4b7b32cf Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move t_info into GameEditData --- src/loadsave.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index d9dfe452..f412cc52 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2382,11 +2382,13 @@ static bool do_fates(ls_flag_t flag) static bool do_traps(ls_flag_t flag) { - u16b n_traps = max_t_idx; + auto &t_info = game->edit_data.t_info; + + u16b n_traps = t_info.size(); do_u16b(&n_traps, flag); - if ((flag == ls_flag_t::LOAD) && (n_traps > max_t_idx)) + if ((flag == ls_flag_t::LOAD) && (n_traps > t_info.size())) { note("Too many traps!"); return false; -- cgit v1.2.3 From cbafbc638c2e1d5bb40ee6bc419007062e9615e4 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:09 +0200 Subject: Remove traps Credit goes mostly to "miramor" who did most of the actual work. I just did a few minor tweaks and fixes + rebased onto master. --- src/loadsave.cc | 31 ------------------------------- 1 file changed, 31 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index f412cc52..e91e8993 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -30,7 +30,6 @@ #include "tables.hpp" #include "timer_type.hpp" #include "town_type.hpp" -#include "trap_type.hpp" #include "util.hpp" #include "util.h" #include "wilderness_map.hpp" @@ -851,7 +850,6 @@ static bool_ do_extra(ls_flag_t flag) do_byte(&p_ptr->confusing, flag); do_bool(&p_ptr->black_breath, flag); do_bool(&fate_flag, flag); - do_byte(&p_ptr->searching, flag); do_bool(&ambush_flag, flag); do_byte(&p_ptr->allow_one_death, flag); @@ -1039,7 +1037,6 @@ static bool_ wearable_p(object_type *o_ptr) case TV_HYPNOS: case TV_INSTRUMENT: case TV_DAEMON_BOOK: - case TV_TRAPKIT: case TV_TOOL: { return (TRUE); @@ -1246,7 +1243,6 @@ static void do_cave_type(cave_type *c_ptr, ls_flag_t flag) do_byte(&c_ptr->mimic, flag); do_s16b(&c_ptr->special, flag); do_s16b(&c_ptr->special2, flag); - do_s16b(&c_ptr->t_idx, flag); do_s16b(&c_ptr->inscription, flag); do_byte(&c_ptr->mana, flag); do_s16b(&c_ptr->effect, flag); @@ -2380,28 +2376,6 @@ static bool do_fates(ls_flag_t flag) return true; } -static bool do_traps(ls_flag_t flag) -{ - auto &t_info = game->edit_data.t_info; - - u16b n_traps = t_info.size(); - - do_u16b(&n_traps, flag); - - if ((flag == ls_flag_t::LOAD) && (n_traps > t_info.size())) - { - note("Too many traps!"); - return false; - } - - for (std::size_t i = 0; i < n_traps; i++) - { - do_bool(&t_info[i].ident, flag); - } - - return true; -} - static bool do_floor_inscriptions(ls_flag_t flag) { u16b n_inscriptions = MAX_INSCRIPTIONS; @@ -2553,11 +2527,6 @@ static bool_ do_savefile_aux(ls_flag_t flag) return FALSE; } - if (!do_traps(flag)) - { - return FALSE; - } - if (!do_floor_inscriptions(flag)) { return FALSE; -- cgit v1.2.3 From 5bc01c584066a0cea37021eb6e13bd96d74de7b5 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 28 Feb 2017 19:44:12 +0100 Subject: Remove Runecrafting --- src/loadsave.cc | 12 ------------ 1 file changed, 12 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index e91e8993..731efab2 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -493,15 +493,6 @@ static void do_random_spell(random_spell *s_ptr, ls_flag_t flag) do_std_bool(&s_ptr->untried, flag); } -static void do_rune_spell(rune_spell *s_ptr, ls_flag_t flag) -{ - do_string(s_ptr->name, 30, flag); - do_s16b(&s_ptr->type, flag); - do_s16b(&s_ptr->rune2, flag); - do_s16b(&s_ptr->mana, flag); -} - - /* * Show information on the screen, one line at a time. * @@ -900,9 +891,6 @@ static bool_ do_extra(ls_flag_t flag) /* Random spells */ do_vector(flag, p_ptr->random_spells, do_random_spell); - /* Rune spells */ - do_vector(flag, p_ptr->rune_spells, do_rune_spell); - /* Random seed for object flavors. */ do_seed(&seed_flavor(), flag); -- cgit v1.2.3 From aae967c8a33e1aad994b7349abad7fbd447264bb Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Remove random_spell::{name,desc} --- src/loadsave.cc | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 731efab2..5c6b24bb 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -480,8 +480,6 @@ static void do_subrace(ls_flag_t flag) static void do_random_spell(random_spell *s_ptr, ls_flag_t flag) { - do_string(s_ptr->name, 30, flag); - do_string(s_ptr->desc, 30, flag); do_s16b(&s_ptr->mana, flag); do_s16b(&s_ptr->fail, flag); do_u32b(&s_ptr->proj_flags, flag); -- cgit v1.2.3 From a40a0d1aeddb4742e486f601cbcc7e9ddcc06e2d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Move player_{name,base} to Game --- src/loadsave.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 5c6b24bb..645d479e 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -520,7 +520,7 @@ static bool_ do_extra(ls_flag_t flag) auto const &d_info = game->edit_data.d_info; auto &s_info = game->s_info; - do_string(player_name, 32, flag); + do_std_string(game->player_name, flag); do_string(died_from, 80, flag); @@ -1566,7 +1566,7 @@ void save_dungeon(void) if (!get_dungeon_save(buf) || (!dun_level)) return; /* Construct filename */ - sprintf(tmp, "%s.%s", player_base, buf); + sprintf(tmp, "%s.%s", game->player_base.c_str(), buf); path_build(name, 1024, ANGBAND_DIR_SAVE, tmp); /* Open the file */ @@ -1973,7 +1973,7 @@ bool_ load_dungeon(char *ext) s16b old_dun = dun_level; /* Construct name */ - sprintf(tmp, "%s.%s", player_base, ext); + sprintf(tmp, "%s.%s", game->player_base.c_str(), ext); path_build(name, 1024, ANGBAND_DIR_SAVE, tmp); /* Open the file */ -- cgit v1.2.3 From 0f37adeca0e2facfcb32f30e285048fac23c8845 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Move died_from to Game struct --- src/loadsave.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 645d479e..6e7ae7ff 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -522,7 +522,7 @@ static bool_ do_extra(ls_flag_t flag) do_std_string(game->player_name, flag); - do_string(died_from, 80, flag); + do_std_string(game->died_from, flag); for (std::size_t i = 0; i < 4; i++) { @@ -2752,7 +2752,7 @@ bool_ load_player(void) if (p_ptr->chp >= 0) { /* Reset cause of death */ - (void)strcpy(died_from, "(alive and well)"); + game->died_from = "(alive and well)"; } /* Success */ -- cgit v1.2.3 From 598c5887ae589059e4f4a9801ff1e4f7f8385f00 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Move previous_char to Game struct --- src/loadsave.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 6e7ae7ff..ad824536 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -385,7 +385,7 @@ static void do_seed(seed_t *seed, ls_flag_t flag) /* * Load/Save quick start data */ -static void do_quick_start(ls_flag_t flag) +static void do_quick_start(ls_flag_t flag, birther &previous_char) { do_s16b(&previous_char.race, flag); do_s16b(&previous_char.rmod, flag); @@ -567,7 +567,7 @@ static bool_ do_extra(ls_flag_t flag) do_bool(&generate_special_feeling, flag); /* Load the quick start data */ - do_quick_start(flag); + do_quick_start(flag, game->previous_char); /* Load/save the special subrace */ do_subrace(flag); -- cgit v1.2.3 From ca47ccdc66d252e0b5791112cac4042e86cefc89 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Remove character background --- src/loadsave.cc | 10 ---------- 1 file changed, 10 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index ad824536..196e8d81 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -403,11 +403,6 @@ static void do_quick_start(ls_flag_t flag, birther &previous_char) do_s16b(&previous_char.luck, flag); do_bool(&previous_char.quick_ok, flag); - - for (std::size_t i = 0; i < 4; i++) - { - do_string(previous_char.history[i], 60, flag); - } } static void do_skill_modifier(skill_modifier *s, ls_flag_t flag) @@ -524,11 +519,6 @@ static bool_ do_extra(ls_flag_t flag) do_std_string(game->died_from, flag); - for (std::size_t i = 0; i < 4; i++) - { - do_string(history[i], 60, flag); - } - /* Handle the special levels info */ { byte tmp8u = d_info.size(); -- cgit v1.2.3 From 6a35e3de332df186eab39c3b67506882409a3ca2 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Remove redundant (void) parameters and return value casts --- src/loadsave.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 196e8d81..86c67956 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -94,7 +94,7 @@ struct option_value { * not to save it. There's no point. -- takkaria */ -static byte sf_get(void) +static byte sf_get() { byte c; @@ -108,7 +108,7 @@ static byte sf_get(void) static void sf_put(byte v) { - (void)putc((int)v, fff); + putc((int)v, fff); } /* @@ -1547,7 +1547,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool no_companions) } /* Save the current persistent dungeon -SC- */ -void save_dungeon(void) +void save_dungeon() { char tmp[16]; char name[1024], buf[5]; @@ -2579,7 +2579,7 @@ static bool_ do_savefile_aux(ls_flag_t flag) /* * Actually read the savefile */ -static errr rd_savefile(void) +static errr rd_savefile() { errr err = 0; @@ -2617,7 +2617,7 @@ static errr rd_savefile(void) * Note that we always try to load the "current" savefile, even if * there is no such file, so we must check for "empty" savefile names. */ -bool_ load_player(void) +bool_ load_player() { errr err = 0; @@ -2780,7 +2780,7 @@ static bool_ save_player_aux(char *name) if (fd >= 0) { /* Close the "fd" */ - (void)fd_close(fd); + fd_close(fd); /* Open the savefile */ fff = my_fopen(name, "wb"); @@ -2799,7 +2799,7 @@ static bool_ save_player_aux(char *name) if (!ok) { /* Remove "broken" files */ - (void)fd_kill(name); + fd_kill(name); } } @@ -2813,7 +2813,7 @@ static bool_ save_player_aux(char *name) /* * Attempt to save the player in a savefile */ -bool_ save_player(void) +bool_ save_player() { int result = FALSE; char safe[1024]; -- cgit v1.2.3 From 2c8b8579faf729b9cf21b8b2d827f0e482570bd3 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Move random_artifacts to Game struct --- src/loadsave.cc | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 86c67956..ef554f19 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2266,31 +2266,20 @@ static bool do_wilderness(ls_flag_t flag) return true; } +static void do_randart(random_artifact *ra_ptr, ls_flag_t flag) +{ + do_std_string(ra_ptr->name_full, flag); + do_std_string(ra_ptr->name_short, flag); + do_byte(&ra_ptr->level, flag); + do_byte(&ra_ptr->attr, flag); + do_u32b(&ra_ptr->cost, flag); + do_byte(&ra_ptr->activation, flag); + do_byte(&ra_ptr->generated, flag); +} + static bool do_randarts(ls_flag_t flag) { - u16b n_randarts = MAX_RANDARTS; - - do_u16b(&n_randarts, flag); - - if ((flag == ls_flag_t::LOAD) && (n_randarts > MAX_RANDARTS)) - { - note("Too many random artifacts!"); - return false; - } - - for (std::size_t i = 0; i < n_randarts; i++) - { - random_artifact *ra_ptr = &random_artifacts[i]; - - do_string(ra_ptr->name_full, 80, flag); - do_string(ra_ptr->name_short, 80, flag); - do_byte(&ra_ptr->level, flag); - do_byte(&ra_ptr->attr, flag); - do_u32b(&ra_ptr->cost, flag); - do_byte(&ra_ptr->activation, flag); - do_byte(&ra_ptr->generated, flag); - } - + do_vector(flag, game->random_artifacts, do_randart); return true; } -- cgit v1.2.3 From 87a6c654d3f83837319f7459c07bd2c31d70fa63 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove unnecessary save file fields --- src/loadsave.cc | 41 ++--------------------------------------- 1 file changed, 2 insertions(+), 39 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index ef554f19..dacd0e15 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -44,20 +44,6 @@ static u32b vernum; /* Version flag */ static FILE *fff; /* Local savefile ptr */ -/* - * Savefile version - */ -static byte sf_major; -static byte sf_minor; -static byte sf_patch; - -/* - * Savefile information - */ -static u32b sf_when; /* Time when savefile created */ -static u16b sf_lives; /* Number of past "lives" with this file */ -static u16b sf_saves; /* Number of "saves" during this life */ - /** * Load/save flag */ @@ -2401,11 +2387,6 @@ static bool_ do_savefile_aux(ls_flag_t flag) return FALSE; } } - if (flag == ls_flag_t::SAVE) - { - sf_when = time((time_t *) 0); /* Note when file was saved */ - sf_saves++; /* Increment the saves ctr */ - } /* Handle version bytes */ if (flag == ls_flag_t::LOAD) @@ -2421,15 +2402,6 @@ static bool_ do_savefile_aux(ls_flag_t flag) do_u32b(&saver, flag); } - /* Time of last save */ - do_u32b(&sf_when, flag); - - /* Number of past lives */ - do_u16b(&sf_lives, flag); - - /* Number of times saved */ - do_u16b(&sf_saves, flag); - /* Game module */ if (flag == ls_flag_t::SAVE) { @@ -2668,12 +2640,6 @@ bool_ load_player() /* Process file */ if (!err) { - - /* Extract version */ - sf_major = VERSION_MAJOR; - sf_minor = VERSION_MINOR; - sf_patch = VERSION_PATCH; - /* Clear screen */ Term_clear(); @@ -2714,9 +2680,6 @@ bool_ load_player() return (TRUE); } - /* Count lives */ - sf_lives++; - /* Forget turns */ turn = old_turn = 0; @@ -2740,8 +2703,8 @@ bool_ load_player() /* Message */ - msg_format("Error (%s) reading %d.%d.%d savefile.", - what, sf_major, sf_minor, sf_patch); + msg_format("Error (%s) reading savefile (version " FMTu32b ").", + what, vernum); msg_print(NULL); /* Oops */ -- cgit v1.2.3 From 0595b2fa946619d29624505f8edc0f9c00146e61 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove pointless comment --- src/loadsave.cc | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index dacd0e15..a085283d 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -66,20 +66,8 @@ struct option_value { /* - * Basic byte-level reading from savefile. This provides a single point - * of interface to the pseudoencryption that ToME (and Angband) - * uses. I'm thinking about if it might be faster/better to modify all - * the do_* functions to directly do this stuff -- it'd make the code - * somewhat uglier to maintain, but concievably might be much faster. Or - * is it better maybe to scrap the pseudoencryption entirely and adopt - * some other means of obfuscation, should it still prove useful in any - * way? -- Improv - * - * What's the point of encryption on savefiles anyway? If I wanted to - * make a cheater savefile, I'd activate debug mode, and hack the game - * not to save it. There's no point. -- takkaria + * Basic byte-level reading from savefile. */ - static byte sf_get() { byte c; -- cgit v1.2.3 From 554ff9a63d5d9bc64f668a00b6baa9b91dc41306 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Move "messages" to Game struct --- src/loadsave.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index a085283d..5968e7c5 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1905,8 +1905,10 @@ static void do_message(message &msg, ls_flag_t flag) */ static void do_messages(ls_flag_t flag) { + auto &messages = game->messages; + /* Save/load number of messages */ - s16b num = message_num(); + s16b num = messages.size(); do_s16b(&num, flag); /* Read the messages */ @@ -1916,14 +1918,14 @@ static void do_messages(ls_flag_t flag) if (flag == ls_flag_t::SAVE) { - message = message_at(i); + message = messages.at(i); } do_message(message, flag); if (flag == ls_flag_t::LOAD) { - message_add(message); + messages.add(message); } } } -- cgit v1.2.3 From dd900258b2c67562dc58840722b0223f68769b3c Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Rework loadsave.c:loaded_game_module to use std::string --- src/loadsave.cc | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 5968e7c5..8413086d 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -39,6 +39,7 @@ #include "z-rand.hpp" #include +#include #include static u32b vernum; /* Version flag */ @@ -483,7 +484,6 @@ static void note(cptr msg) /* * Misc. other data */ -static char loaded_game_module[80]; static bool_ do_extra(ls_flag_t flag) { auto const &d_info = game->edit_data.d_info; @@ -864,21 +864,6 @@ static bool_ do_extra(ls_flag_t flag) /* Write death */ do_bool(&death, flag); - /* Incompatible module? */ - if (flag == ls_flag_t::LOAD) - { - s32b ok; - - ok = module_savefile_loadable(loaded_game_module); - - /* Argh bad game module! */ - if (!ok) - { - note(format("Bad game module. Savefile was saved with module '%s' but game is '%s'.", loaded_game_module, game_module)); - return (FALSE); - } - } - /* Level feeling */ do_s16b(&feeling, flag); @@ -2393,11 +2378,27 @@ static bool_ do_savefile_aux(ls_flag_t flag) } /* Game module */ - if (flag == ls_flag_t::SAVE) { - strcpy(loaded_game_module, game_module); + std::string loaded_game_module; + + if (flag == ls_flag_t::SAVE) + { + loaded_game_module = game_module; + } + do_std_string(loaded_game_module, flag); + + // Check for incompatible module + if (flag == ls_flag_t::LOAD) + { + if (!module_savefile_loadable(loaded_game_module)) + { + note(fmt::format("Bad game module. Savefile was saved with module '{:s}' but game is '{:s}'.", + loaded_game_module, + game_module).c_str()); + return FALSE; + } + } } - do_string(loaded_game_module, 80, flag); /* Timers */ do_timers(flag); -- cgit v1.2.3 From 7a98afaeee09141ab36607e898d0e00072d9d930 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove loadsave:do_string() --- src/loadsave.cc | 49 ------------------------------------------------- 1 file changed, 49 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 8413086d..fc473e0c 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -196,55 +196,6 @@ static void do_s32b(s32b *ip, ls_flag_t flag) do_u32b((u32b *)ip, flag); } -static void save_string(const char *str) -{ - while (*str) - { - do_byte((byte*)str, ls_flag_t::SAVE); - str++; - } - do_byte((byte*)str, ls_flag_t::SAVE); -} - -static void load_string(char *str, int max) -{ - int i; - - /* Read the string */ - for (i = 0; TRUE; i++) - { - byte tmp8u; - - /* Read a byte */ - do_byte(&tmp8u, ls_flag_t::LOAD); - - /* Collect string while legal */ - if (i < max) str[i] = tmp8u; - - /* End of string */ - if (!tmp8u) break; - } - /* Terminate */ - str[max - 1] = '\0'; -} - -static void do_string(char *str, int max, ls_flag_t flag) -/* Max is ignored for writing */ -{ - switch(flag) { - case ls_flag_t::LOAD: - { - load_string(str, max); - return; - } - case ls_flag_t::SAVE: - { - save_string(str); - return; - } - } -} - static void save_std_string(std::string const *s) { // Length prefix. -- cgit v1.2.3 From 1fb9b3961781e5bca533c6876615cb67d5a455b0 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Use boost::fs::exists() instead of "homebaked" file_exist() --- src/loadsave.cc | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index fc473e0c..541fbbec 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -38,6 +38,7 @@ #include "xtra2.hpp" #include "z-rand.hpp" +#include #include #include #include @@ -1478,27 +1479,6 @@ void save_dungeon() my_fclose(fff); } -bool_ file_exist(cptr buf) -{ - int fd; - bool_ result; - - /* Open savefile */ - fd = fd_open(buf, O_RDONLY); - - /* File exists */ - if (fd >= 0) - { - fd_close(fd); - result = TRUE; - } - else - result = FALSE; - - return result; -} - - /* * Handle monster lore */ @@ -2540,7 +2520,7 @@ bool_ load_player() /* XXX XXX XXX Fix this */ /* Verify the existance of the savefile */ - if (!file_exist(savefile)) + if (!boost::filesystem::exists(savefile)) { /* Give a message */ msg_format("Savefile does not exist: %s", savefile); -- cgit v1.2.3 From aac97ab5f017e5f0fd312c721d76c534ae318321 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Reduce redundancy in load/save --- src/loadsave.cc | 444 ++++++++++++++++++++------------------------------------ 1 file changed, 154 insertions(+), 290 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 541fbbec..2ef44ca8 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -46,6 +46,25 @@ static u32b vernum; /* Version flag */ static FILE *fff; /* Local savefile ptr */ +/* + * Show information on the screen, one line at a time. + * + * Avoid the top two lines, to avoid interference with "msg_print()". + */ +static void note(cptr msg) +{ + static int y = 2; + + /* Draw the message */ + prt(msg, y, 0); + + /* Advance one line (wrap if needed) */ + if (++y >= 24) y = 2; + + /* Flush it */ + Term_fresh(); +} + /** * Load/save flag */ @@ -281,6 +300,28 @@ template void do_vector(ls_flag_t flag, std::vector & } } +template void do_array(std::string const &what, ls_flag_t flag, A &array, std::size_t size, F f) +{ + // Save/load size. + u32b n = size; + do_u32b(&n, flag); + + // Check that we don't overflow the array. + if (flag == ls_flag_t::LOAD) + { + if (n > size) + { + note(fmt::format("Too many {:s}: {:d} > {:d}! Game may act strangely or crash.", what, n, size).c_str()); + } + } + + // Load/save the contents of the array. + for (std::size_t i = 0; i < n; i++) + { + f(&array[i], flag); + } +} + static void do_bytes(ls_flag_t flag, std::uint8_t *buf, std::size_t n) { for (std::size_t i = 0; i < n; i++) @@ -413,26 +454,6 @@ static void do_random_spell(random_spell *s_ptr, ls_flag_t flag) do_std_bool(&s_ptr->untried, flag); } -/* - * Show information on the screen, one line at a time. - * - * Avoid the top two lines, to avoid interference with "msg_print()". - */ -static void note(cptr msg) -{ - static int y = 2; - - /* Draw the message */ - prt(msg, y, 0); - - /* Advance one line (wrap if needed) */ - if (++y >= 24) y = 2; - - /* Flush it */ - Term_fresh(); -} - - /* * Misc. other data */ @@ -513,22 +534,14 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->melee_style, flag); do_s16b(&p_ptr->use_piercing_shots, flag); - u16b tmp16u = s_info.size(); - - do_u16b(&tmp16u, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp16u != s_info.size())) - { - quit("Too few/many skills"); - } - - for (std::size_t i = 0; i < tmp16u; i++) - { - do_s32b(&s_info[i].value, flag); - do_s32b(&s_info[i].mod, flag); - do_std_bool(&s_info[i].dev, flag); - do_std_bool(&s_info[i].hidden, flag); - } + do_array("skills", flag, s_info, s_info.size(), + [](auto skill, auto flag) -> void { + do_s32b(&skill->value, flag); + do_s32b(&skill->mod, flag); + do_std_bool(&skill->dev, flag); + do_std_bool(&skill->hidden, flag); + } + ); } // Abilities @@ -555,46 +568,21 @@ static bool_ do_extra(ls_flag_t flag) do_byte(&p_ptr->spellbinder.trigger, flag); do_vector(flag, p_ptr->spellbinder.spell_idxs, do_u32b); - // Quests - { - byte tmp8u; - - // Number of quests - if (flag == ls_flag_t::SAVE) - { - tmp8u = MAX_PLOTS; - } - do_byte(&tmp8u, flag); - if ((flag == ls_flag_t::LOAD) && (tmp8u > MAX_PLOTS)) - { - quit(format("Too many plots, %d %d", tmp8u, MAX_PLOTS)); - } - - // Quest status - for (std::size_t i = 0; i < tmp8u; i++) - { - do_s16b(&plots[i], flag); - } - - // Number of random quests - if (flag == ls_flag_t::SAVE) - { - tmp8u = MAX_RANDOM_QUEST; - } - do_byte(&tmp8u, flag); - if ((flag == ls_flag_t::LOAD) && (tmp8u > MAX_RANDOM_QUEST)) - { - quit("Too many random quests"); + // Quest status + do_array("plot quests", flag, plots, MAX_PLOTS, + [](auto plot, auto flag) -> void { + do_s16b(plot, flag); } - - // Random quest data - for (std::size_t i = 0; i < tmp8u; i++) - { - do_byte(&random_quests[i].type, flag); - do_s16b(&random_quests[i].r_idx, flag); - do_std_bool(&random_quests[i].done, flag); + ); + + // Random quests + do_array("random quests", flag, random_quests, MAX_RANDOM_QUEST, + [](auto q, auto flag) -> void { + do_byte(&q->type, flag); + do_s16b(&q->r_idx, flag); + do_std_bool(&q->done, flag); } - } + ); do_s16b(&p_ptr->oldpx, flag); do_s16b(&p_ptr->oldpy, flag); @@ -733,22 +721,11 @@ static bool_ do_extra(ls_flag_t flag) do_s32b(&p_ptr->inertia_controlled_spell, flag); do_s16b(&p_ptr->last_rewarded_level, flag); - // Corruptions - { - u16b tmp16u = CORRUPTIONS_MAX; - - do_u16b(&tmp16u, flag); - - if (tmp16u > CORRUPTIONS_MAX) - { - quit("Too many corruptions"); - } - - for (std::size_t i = 0; i < tmp16u; i++) - { - do_bool(&p_ptr->corruptions[i], flag); + do_array("corruptions", flag, p_ptr->corruptions, CORRUPTIONS_MAX, + [](auto corruption, auto flag) -> void { + do_bool(corruption, flag); } - } + ); do_bool(&p_ptr->corrupt_anti_teleport_stopped, flag); @@ -774,21 +751,11 @@ static bool_ do_extra(ls_flag_t flag) do_bool(&p_ptr->astral, flag); // Powers - { - u16b tmp16u = POWER_MAX; - - do_u16b(&tmp16u, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp16u != POWER_MAX)) - { - quit("Too few/many powers!"); + do_array("powers", flag, p_ptr->powers_mod, POWER_MAX, + [](auto pwr, auto flag) -> void { + do_bool(pwr, flag); } - - for (std::size_t i = 0; i < POWER_MAX; i++) - { - do_bool(&p_ptr->powers_mod[i], flag); - } - } + ); /* The tactic */ do_char(&p_ptr->tactic, flag); @@ -872,13 +839,14 @@ static void do_monster(monster_type *m_ptr, ls_flag_t flag) } /* Attacks */ - for (std::size_t i = 0; i < 4; i++) - { - do_byte(&m_ptr->blow[i].method, flag); - do_byte(&m_ptr->blow[i].effect, flag); - do_byte(&m_ptr->blow[i].d_dice, flag); - do_byte(&m_ptr->blow[i].d_side, flag); - } + do_array("attacks", flag, m_ptr->blow, 4, + [](auto blow, auto flag) { + do_byte(&blow->method, flag); + do_byte(&blow->effect, flag); + do_byte(&blow->d_dice, flag); + do_byte(&blow->d_side, flag); + } + ); } @@ -1341,24 +1309,14 @@ static bool do_monsters(ls_flag_t flag, bool no_companions) /* Save/load pets */ { - u16b tmp16u = (flag == ls_flag_t::SAVE && !no_companions) ? max_m_idx : 0; + const std::size_t sz = + (flag == ls_flag_t::SAVE && !no_companions) ? max_m_idx : 0; - do_u16b(&tmp16u, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_m_idx)) - { - note("Too many monster entries!"); - return false; - } - - for (std::size_t i = 1; i < tmp16u; i++) - { - /* Acquire monster */ - auto m_ptr = &km_list[i]; - - /* Read the monster */ - do_monster(m_ptr, flag); - } + do_array("pets", flag, km_list, sz, + [](auto m_ptr, auto flag) { + do_monster(m_ptr, flag); + } + ); } return true; @@ -1390,26 +1348,17 @@ static bool_ do_dungeon(ls_flag_t flag, bool no_companions) do_s16b(&last_teleportation_y, flag); /* Spell effects */ - { - u16b n_effects = MAX_EFFECTS; - do_u16b(&n_effects, flag); - - if ((flag == ls_flag_t::LOAD) && (n_effects > MAX_EFFECTS)) - { - quit("Too many spell effects"); + do_array("spell effects", flag, effects, MAX_EFFECTS, + [](auto effect, auto flag) -> void { + do_s16b(&effect->type, flag); + do_s16b(&effect->dam, flag); + do_s16b(&effect->time, flag); + do_u32b(&effect->flags, flag); + do_s16b(&effect->cx, flag); + do_s16b(&effect->cy, flag); + do_s16b(&effect->rad, flag); } - - for (std::size_t i = 0; i < n_effects; ++i) - { - do_s16b(&effects[i].type, flag); - do_s16b(&effects[i].dam, flag); - do_s16b(&effects[i].time, flag); - do_u32b(&effects[i].flags, flag); - do_s16b(&effects[i].cx, flag); - do_s16b(&effects[i].cy, flag); - do_s16b(&effects[i].rad, flag); - } - } + ); /* To prevent bugs with evolving dungeons */ for (std::size_t i = 0; i < 100; i++) @@ -1479,22 +1428,6 @@ void save_dungeon() my_fclose(fff); } -/* - * Handle monster lore - */ -static void do_lore(std::size_t r_idx, ls_flag_t flag) -{ - auto &r_info = game->edit_data.r_info; - - auto r_ptr = &r_info[r_idx]; - - do_s16b(&r_ptr->r_pkills, flag); - do_s16b(&r_ptr->max_num, flag); - do_bool(&r_ptr->on_saved, flag); -} - - - /* * Read a store @@ -1954,22 +1887,15 @@ static void do_stores(ls_flag_t flag) */ static bool do_monster_lore(ls_flag_t flag) { - auto const &r_info = game->edit_data.r_info; - - u16b tmp16u = r_info.size(); - - do_u16b(&tmp16u, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp16u > r_info.size())) - { - note("Too many monster races!"); - return false; - } + auto &r_info = game->edit_data.r_info; - for (std::size_t i = 0; i < tmp16u; i++) - { - do_lore(i, flag); - } + do_array("monster races", flag, r_info, r_info.size(), + [](auto r_ptr, auto flag) -> void { + do_s16b(&r_ptr->r_pkills, flag); + do_s16b(&r_ptr->max_num, flag); + do_bool(&r_ptr->on_saved, flag); + } + ); return true; } @@ -1982,23 +1908,13 @@ static bool do_object_lore(ls_flag_t flag) { auto &k_info = game->edit_data.k_info; - u16b n_kinds = k_info.size(); - - do_u16b(&n_kinds, flag); - - if ((flag == ls_flag_t::LOAD) && (n_kinds > k_info.size())) - { - note("Too many object kinds!"); - return false; - } - - for (std::size_t i = 0; i < n_kinds; i++) - { - object_kind *k_ptr = &k_info[i]; - do_bool(&k_ptr->aware, flag); - do_bool(&k_ptr->tried, flag); - do_bool(&k_ptr->artifact, flag); - } + do_array("object kinds", flag, k_info, k_info.size(), + [](auto k_ptr, auto flag) -> void { + do_bool(&k_ptr->aware, flag); + do_bool(&k_ptr->tried, flag); + do_bool(&k_ptr->artifact, flag); + } + ); return true; } @@ -2088,32 +2004,21 @@ static bool do_towns(ls_flag_t flag) static bool do_quests(ls_flag_t flag) { - u16b max_quests_ldsv = MAX_Q_IDX; - - do_u16b(&max_quests_ldsv, flag); - - if ((flag == ls_flag_t::LOAD) && (max_quests_ldsv != MAX_Q_IDX)) - { - note("Invalid number of quests!"); - return false; - } - - for (std::size_t i = 0; i < MAX_Q_IDX; i++) - { - auto q = &quest[i]; - - do_s16b(&q->status, flag); - for (auto &quest_data : q->data) - { - do_s32b(&quest_data, flag); - } - - // Initialize the quest if necessary - if ((flag == ls_flag_t::LOAD) && (q->init != NULL)) - { - q->init(); + do_array("quests", flag, quest, MAX_Q_IDX, + [](auto q, auto flag) { + // Load/save the data + do_s16b(&q->status, flag); + for (auto &quest_data : q->data) + { + do_s32b(&quest_data, flag); + } + // Initialize if necessary + if ((flag == ls_flag_t::LOAD) && (q->init != NULL)) + { + q->init(); + } } - } + ); return true; } @@ -2179,75 +2084,43 @@ static bool do_artifacts(ls_flag_t flag) { auto &a_info = game->edit_data.a_info; - u16b n_artifacts; - - if (flag == ls_flag_t::SAVE) - { - n_artifacts = a_info.size(); - } - - do_u16b(&n_artifacts, flag); - - if ((flag == ls_flag_t::LOAD) && (n_artifacts > a_info.size())) - { - note("Too many artifacts!"); - return false; - } - - for (std::size_t i = 0; i < n_artifacts; i++) - { - do_byte(&(&a_info[i])->cur_num, flag); - } + do_array("artifacts", flag, a_info, a_info.size(), + [](auto a_ptr, auto flag) { + do_byte(&a_ptr->cur_num, flag); + } + ); return true; } static bool do_fates(ls_flag_t flag) { - u16b n_fates = MAX_FATES; - - do_u16b(&n_fates, flag); - - if ((flag == ls_flag_t::LOAD) && (n_fates > MAX_FATES)) - { - note("Too many fates!"); - return false; - } - - for (std::size_t i = 0; i < n_fates; i++) - { - auto fate = &fates[i]; - do_byte(&fate->fate, flag); - do_byte(&fate->level, flag); - do_byte(&fate->serious, flag); - do_s16b(&fate->o_idx, flag); - do_s16b(&fate->e_idx, flag); - do_s16b(&fate->a_idx, flag); - do_s16b(&fate->v_idx, flag); - do_s16b(&fate->r_idx, flag); - do_s16b(&fate->count, flag); - do_s16b(&fate->time, flag); - do_bool(&fate->know, flag); - } + do_array("fates", flag, fates, MAX_FATES, + [](auto fate, auto flag) { + do_byte(&fate->fate, flag); + do_byte(&fate->level, flag); + do_byte(&fate->serious, flag); + do_s16b(&fate->o_idx, flag); + do_s16b(&fate->e_idx, flag); + do_s16b(&fate->a_idx, flag); + do_s16b(&fate->v_idx, flag); + do_s16b(&fate->r_idx, flag); + do_s16b(&fate->count, flag); + do_s16b(&fate->time, flag); + do_bool(&fate->know, flag); + } + ); return true; } static bool do_floor_inscriptions(ls_flag_t flag) { - u16b n_inscriptions = MAX_INSCRIPTIONS; - do_u16b(&n_inscriptions, flag); - - if ((flag == ls_flag_t::LOAD) && (n_inscriptions > MAX_INSCRIPTIONS)) - { - note("Too many inscriptions!"); - return false; - } - - for (std::size_t i = 0; i < n_inscriptions; i++) - { - do_std_bool(&p_ptr->inscriptions[i], flag); - } + do_array("inscriptions", flag, p_ptr->inscriptions, MAX_INSCRIPTIONS, + [](auto i_ptr, auto flag) { + do_std_bool(i_ptr, flag); + } + ); return true; } @@ -2256,20 +2129,11 @@ static bool do_player_hd(ls_flag_t flag) { auto &player_hp = game->player_hp; - u16b max_level = PY_MAX_LEVEL; - - do_u16b(&max_level, flag); - - if ((flag == ls_flag_t::LOAD) && (max_level > PY_MAX_LEVEL)) - { - note("Too many hitpoint entries!"); - return false; - } - - for (std::size_t i = 0; i < max_level; i++) - { - do_s16b(&player_hp[i], flag); - } + do_array("hit dice entries", flag, player_hp, PY_MAX_LEVEL, + [](auto hp_ptr, auto flag) { + do_s16b(hp_ptr, flag); + } + ); return true; } -- cgit v1.2.3 From c0d3818fa0a3859d5f6cd923488ac3244d3c00d6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Use ANGBAND_TERM_MAX instead of literal 8 (This won't cover nearly all cases, but it helps a little.) --- src/loadsave.cc | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 2ef44ca8..e98b832c 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1592,13 +1592,19 @@ static void do_options(ls_flag_t flag) /*** Window Options ***/ /* Read the window flags */ - for (n = 0; n < 8; n++) do_u32b(&oflag[n], flag); + for (n = 0; n < ANGBAND_TERM_MAX; n++) + { + do_u32b(&oflag[n], flag); + } /* Read the window masks */ - for (n = 0; n < 8; n++) do_u32b(&mask[n], flag); + for (n = 0; n < ANGBAND_TERM_MAX; n++) + { + do_u32b(&mask[n], flag); + } /* Analyze the options */ - for (n = 0; n < 8; n++) + for (n = 0; n < ANGBAND_TERM_MAX; n++) { /* Analyze the options */ for (i = 0; i < 32; i++) @@ -1633,10 +1639,16 @@ static void do_options(ls_flag_t flag) /*** Window options ***/ /* Dump the flags */ - for (i = 0; i < 8; i++) do_u32b(&window_flag[i], flag); + for (i = 0; i < ANGBAND_TERM_MAX; i++) + { + do_u32b(&window_flag[i], flag); + } /* Dump the masks */ - for (i = 0; i < 8; i++) do_u32b(&window_mask[i], flag); + for (i = 0; i < ANGBAND_TERM_MAX; i++) + { + do_u32b(&window_mask[i], flag); + } } } -- cgit v1.2.3 From 94080e67843f84cb68e1538990736ab0ee82ab9f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 7 Sep 2017 12:53:57 +0200 Subject: Move gl_timer to Game struct and change timer_type to class --- src/loadsave.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index e98b832c..3d45bf0f 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1838,13 +1838,11 @@ bool_ load_dungeon(char *ext) */ static void do_timers(ls_flag_t flag) { - timer_type *t_ptr; - - for (t_ptr = gl_timers; t_ptr != NULL; t_ptr = t_ptr->next) + for (auto &&t_ptr: game->timers) { - do_bool(&t_ptr->enabled, flag); - do_s32b(&t_ptr->delay, flag); - do_s32b(&t_ptr->countdown, flag); + do_std_bool(&t_ptr->m_enabled, flag); + do_s32b(&t_ptr->m_delay, flag); + do_s32b(&t_ptr->m_countdown, flag); } } -- cgit v1.2.3 From 39e1689130e87732cf410aaea7458dfdc399d50e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 7 Sep 2017 12:53:57 +0200 Subject: Move special_level[] to Game struct Refactor into a multi_array<> to make it more robust. --- src/loadsave.cc | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src/loadsave.cc') diff --git a/src/loadsave.cc b/src/loadsave.cc index 3d45bf0f..3c843a36 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -454,6 +454,28 @@ static void do_random_spell(random_spell *s_ptr, ls_flag_t flag) do_std_bool(&s_ptr->untried, flag); } +static void do_level_marker(level_marker *marker, ls_flag_t flag) +{ + std::string v; + + if (flag == ls_flag_t::SAVE) + { + v = level_marker_values().stringify(*marker); + } + + do_std_string(v, flag); + + if (flag == ls_flag_t::LOAD) + { + bool valid = level_marker_values().parse(v.c_str(), marker); + if (!valid) + { + note(fmt::format("Bad level marker: {}!", v).c_str()); + abort(); + } + } +} + /* * Misc. other data */ @@ -496,12 +518,12 @@ static bool_ do_extra(ls_flag_t flag) { for (std::size_t j = 0; j < tmp16u; j++) { - do_bool(&special_lvl[j][i], flag); + do_level_marker(&game->level_markers[j][i], flag); } } } - do_bool(&generate_special_feeling, flag); + do_std_bool(&game->generate_special_feeling, flag); /* Load the quick start data */ do_quick_start(flag, game->previous_char); -- cgit v1.2.3