summaryrefslogtreecommitdiff
path: root/src/xtra2.cc
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2015-02-23 09:11:58 +0100
committerBardur Arantsson <bardur@scientician.net>2015-02-23 09:11:58 +0100
commitcaa23251d8b279529330641032c62f8640ee13ff (patch)
treefd442587708295bfc31b17f12cc726aedf406f15 /src/xtra2.cc
parent3bfa6a0e2cba6b4fc8f53dac1e987c95fe7ed93c (diff)
Remove rp_head, rp_name, rp_text, rmp_head, rmp_name, rmp_text
Diffstat (limited to 'src/xtra2.cc')
-rw-r--r--src/xtra2.cc38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/xtra2.cc b/src/xtra2.cc
index d3a6cc63..5896e3bc 100644
--- a/src/xtra2.cc
+++ b/src/xtra2.cc
@@ -18,6 +18,8 @@
#include "quark.h"
#include "hooks.h"
+#include <type_traits>
+
#include <boost/algorithm/string/predicate.hpp>
using boost::algorithm::iequals;
@@ -5657,27 +5659,47 @@ void switch_subrace(int racem, bool_ copy_old)
/* If we switch to the saved subrace, we copy over the old subrace data */
if (copy_old && (racem == SUBRACE_SAVE))
{
- s32b old_title = race_mod_info[SUBRACE_SAVE].title;
- s32b old_desc = race_mod_info[SUBRACE_SAVE].desc;
-
+ // This code is very reliant on the race_mod_info
+ // elements being simple PODs, in particular the
+ // text pointers being *unmanaged* owned pointers.
+ static_assert(std::is_pod<player_race_mod>::value,
+ "This code needs reworking");
+ // Keep references to owned pointers.
+ auto old_title = race_mod_info[SUBRACE_SAVE].title;
+ auto old_desc = race_mod_info[SUBRACE_SAVE].desc;
+ // Copy everything
race_mod_info[SUBRACE_SAVE] = race_mod_info[p_ptr->pracem];
+ // "Undo" copy of title and description (since they're *owned* pointers)
race_mod_info[SUBRACE_SAVE].title = old_title;
race_mod_info[SUBRACE_SAVE].desc = old_desc;
- strcpy(race_mod_info[SUBRACE_SAVE].title + rmp_name, race_mod_info[p_ptr->pracem].title + rmp_name);
+ // Replace subrace title with the title currently held by player.
+ set_subrace_title(&race_mod_info[SUBRACE_SAVE], race_mod_info[p_ptr->pracem].title);
}
p_ptr->pracem = racem;
rmp_ptr = &race_mod_info[p_ptr->pracem];
}
-cptr get_subrace_title(int racem)
+void set_subrace_title(player_race_mod *rmp_ptr, cptr name)
{
- return race_mod_info[racem].title + rmp_name;
+ // Free old title.
+ free(rmp_ptr->title);
+ // Allocate copy of new title.
+ rmp_ptr->title = strdup(name);
+ if (!rmp_ptr->title) {
+ abort();
+ }
}
-void set_subrace_title(int racem, cptr name)
+void set_subrace_description(player_race_mod *rmp_ptr, cptr desc)
{
- strcpy(race_mod_info[racem].title + rmp_name, name);
+ // Free old description
+ free(rmp_ptr->desc);
+ // Allocate copy of new description.
+ rmp_ptr->desc = strdup(desc);
+ if (!rmp_ptr->desc) {
+ abort();
+ }
}
/*