Skip to content

Commit 5a6f126

Browse files
committed
refine word selector logic
1 parent 9992589 commit 5a6f126

File tree

1 file changed

+67
-52
lines changed

1 file changed

+67
-52
lines changed

gui/rename.lua

Lines changed: 67 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -20,42 +20,62 @@ local translations = df.language_translation.get_vector()
2020
-- target selection
2121
--
2222

23-
local wt = language.word_table
23+
local entity_names = {
24+
[df.language_name_type.Figure]=df.entity_name_type.OTHER,
25+
[df.language_name_type.FigureFirstOnly]=df.entity_name_type.OTHER,
26+
[df.language_name_type.FigureNoFirst]=df.entity_name_type.OTHER,
27+
[df.language_name_type.Civilization]=df.entity_name_type.CIV,
28+
[df.language_name_type.EntitySite]=df.entity_name_type.SITE,
29+
[df.language_name_type.Site]=df.entity_name_type.OTHER,
30+
[df.language_name_type.Squad]=df.entity_name_type.OTHER,
31+
[df.language_name_type.Temple]=df.entity_name_type.TEMPLE,
32+
[df.language_name_type.Library]=df.entity_name_type.LIBRARY,
33+
[df.language_name_type.Hospital]=df.entity_name_type.HOSPITAL,
34+
}
2435

25-
local function get_word_selectors(name_type, civ)
26-
-- default to something generic with a lot of word choices
27-
local major, minor = wt[0][df.language_name_category.River], wt[1][df.language_name_category.River]
36+
local category_names = {
37+
[df.language_name_type.World]=df.language_name_category.Region,
38+
[df.language_name_type.Region]=df.language_name_category.Region,
39+
[df.language_name_type.LegendaryFigure]=df.language_name_category.Unit,
40+
[df.language_name_type.FigureNoFirst]=df.language_name_category.Unit,
41+
[df.language_name_type.FigureFirstOnly]=df.language_name_category.Unit,
42+
[df.language_name_type.Figure]=df.language_name_category.Unit,
43+
[df.language_name_type.Religion]=df.language_name_category.CommonReligion,
44+
[df.language_name_type.Temple]=df.language_name_category.Temple,
45+
[df.language_name_type.FoodStore]=df.language_name_category.FoodStore,
46+
[df.language_name_type.Library]=df.language_name_category.Library,
47+
[df.language_name_type.Guildhall]=df.language_name_category.Guildhall,
48+
[df.language_name_type.Hospital]=df.language_name_category.Hospital,
49+
}
2850

29-
-- TODO: locations
51+
local wt = language.word_table
3052

31-
-- refine word selector choice based on context
32-
if name_type == df.language_name_type.Figure then
33-
if civ then
34-
major, minor = civ.entity_raw.symbols.symbols_major.OTHER, civ.entity_raw.symbols.symbols_minor.OTHER
35-
else
36-
major, minor = wt[0][df.language_name_category.Unit], wt[1][df.language_name_category.Unit]
37-
end
38-
elseif name_type == df.language_name_type.World then
39-
major, minor = wt[0][df.language_name_category.Region], wt[1][df.language_name_category.Region]
40-
elseif name_type == df.language_name_type.Artifact then
53+
local function get_word_selectors(name_type, civ)
54+
-- special cases
55+
if name_type == df.language_name_type.Artifact then
4156
-- The game normally only uses ArtifactEvil if it was created by a fell/macabre mood, but we don't know
4257
-- at this point, so we'll randomize the choice
4358
if math.random(5) == 1 then
44-
major, minor = wt[0][df.language_name_category.ArtifactEvil], wt[1][df.language_name_category.ArtifactEvil]
59+
return wt[0][df.language_name_category.ArtifactEvil], wt[1][df.language_name_category.ArtifactEvil]
4560
else
46-
major, minor = wt[0][df.language_name_category.Artifact], wt[1][df.language_name_category.Artifact]
61+
return wt[0][df.language_name_category.Artifact], wt[1][df.language_name_category.Artifact]
4762
end
48-
elseif name_type == df.language_name_type.Civilization and civ then
49-
major, minor = civ.entity_raw.symbols.symbols_major.CIV, civ.entity_raw.symbols.symbols_minor.CIV
50-
elseif name_type == df.language_name_type.EntitySite and civ then
51-
major, minor = civ.entity_raw.symbols.symbols_major.SITE, civ.entity_raw.symbols.symbols_minor.SITE
52-
elseif name_type == df.language_name_type.Site and civ then
53-
major, minor = civ.entity_raw.symbols.symbols_major.OTHER, civ.entity_raw.symbols.symbols_minor.OTHER
54-
elseif name_type == df.language_name_type.Squad and civ then
55-
major, minor = civ.entity_raw.symbols.symbols_major.OTHER, civ.entity_raw.symbols.symbols_minor.OTHER
5663
end
5764

58-
return major, minor
65+
-- entity-based names
66+
local etype = entity_names[name_type]
67+
if civ and etype then
68+
return civ.entity_raw.symbols.symbols_major[etype], civ.entity_raw.symbols.symbols_minor[etype]
69+
end
70+
71+
-- category-based names
72+
local ctype = category_names[name_type]
73+
if ctype then
74+
return wt[0][ctype], wt[1][ctype]
75+
end
76+
77+
-- default to something generic with a lot of word choices
78+
return wt[0][df.language_name_category.River], wt[1][df.language_name_category.River]
5979
end
6080

6181
local function get_artifact_target(item)
@@ -64,8 +84,7 @@ local function get_artifact_target(item)
6484
if not gref then return end
6585
local rec = df.artifact_record.find(gref.artifact_id)
6686
if not rec then return end
67-
local major_selector, minor_selector = get_word_selectors(df.language_name_type.Artifact)
68-
return {name=rec.name, major_selector=major_selector, minor_selector=minor_selector}
87+
return {name=rec.name}
6988
end
7089

7190
local function get_hf_target(hf)
@@ -79,9 +98,7 @@ local function get_hf_target(hf)
7998
table.insert(sync_names, unit_name)
8099
end
81100
end
82-
local civ = df.historical_entity.find(hf.civ_id)
83-
local major_selector, minor_selector = get_word_selectors(df.language_name_type.Figure, civ)
84-
return {name=name, sync_names=sync_names, major_selector=major_selector, minor_selector=minor_selector}
101+
return {name=name, sync_names=sync_names, civ_id=hf.civ_id}
85102
end
86103

87104
local function get_unit_target(unit)
@@ -91,59 +108,53 @@ local function get_unit_target(unit)
91108
return get_hf_target(hf)
92109
end
93110
-- unit with no hf
94-
local civ = df.historical_entity.find(unit.civ_id)
95-
local major_selector, minor_selector = get_word_selectors(df.language_name_type.Figure, civ)
96-
return {name=dfhack.units.getVisibleName(unit), major_selector=major_selector, minor_selector=minor_selector}
111+
return {name=dfhack.units.getVisibleName(unit), civ_id=unit.civ_id}
97112
end
98113

99-
local function get_civ_from_entity(entity)
114+
local function get_civ_id_from_entity(entity)
100115
if not entity then return end
101-
if entity.type == df.historical_entity_type.Civilization then return entity end
116+
if entity.type == df.historical_entity_type.Civilization then return entity.id end
102117
for _,ee_link in ipairs(entity.entity_links) do
103118
if ee_link.type ~= df.entity_entity_link_type.PARENT then goto continue end
104119
local linked_he = df.historical_entity.find(ee_link.target)
105120
if linked_he and linked_he.type == df.historical_entity_type.Civilization then
106-
return linked_he
121+
return ee_link.target
107122
end
108123
::continue::
109124
end
110125
end
111126

112-
local function get_civ_from_site(site)
127+
local function get_civ_id_from_site(site)
113128
if not site then return end
114129
for _,he_link in ipairs(site.entity_links) do
115130
if he_link.type ~= df.entity_site_link_type.All then goto continue end
116131
local linked_he = df.historical_entity.find(he_link.entity_id)
117132
if linked_he and linked_he.type == df.historical_entity_type.Civilization then
118-
return linked_he
133+
return he_link.entity_id
119134
end
120135
::continue::
121136
end
122137
end
123138

124139
local function get_entity_target(entity)
125140
if not entity then return end
126-
local major_selector, minor_selector = get_word_selectors(entity.name.type, get_civ_from_entity(entity))
127-
return {name=entity.name, major_selector=major_selector, minor_selector=minor_selector}
141+
return {name=entity.name, civ_id=get_civ_id_from_entity(entity)}
128142
end
129143

130144
local function get_site_target(site)
131145
if not site then return end
132-
local major_selector, minor_selector = get_word_selectors(site.name.type, get_civ_from_site(site))
133-
return {name=site.name, major_selector=major_selector, minor_selector=minor_selector}
146+
return {name=site.name, civ_id=get_civ_id_from_site(site)}
134147
end
135148

136149
local function get_location_target(site, loc_id)
137150
if not site or loc_id < 0 then return end
138151
local loc = utils.binsearch(site.buildings, loc_id, 'id')
139152
if not loc then return end
140-
local major_selector, minor_selector = get_word_selectors(loc.name.type, get_civ_from_site(site))
141-
return {name=loc.name, major_selector=major_selector, minor_selector=minor_selector}
153+
return {name=loc.name, civ_id=get_civ_id_from_site(site)}
142154
end
143155

144156
local function get_squad_target(fort, squad)
145-
local major_selector, minor_selector = get_word_selectors(squad.name.type, get_civ_from_entity(fort))
146-
return {name=squad.name, major_selector=major_selector, minor_selector=minor_selector}
157+
return {name=squad.name, civ_id=get_civ_id_from_entity(fort)}
147158
end
148159

149160
local function get_world_target()
@@ -155,8 +166,7 @@ local function get_world_target()
155166
dfhack.translation.translateName(name, true))
156167
end
157168
}
158-
local major_selector, minor_selector = get_word_selectors(df.language_name_type.World)
159-
return {name=name, sync_names=sync_names, major_selector=major_selector, minor_selector=minor_selector}
169+
return {name=name, sync_names=sync_names}
160170
end
161171

162172
local function select_artifact(cb)
@@ -251,10 +261,10 @@ local function select_new_target(cb)
251261
if #site.buildings > 0 then
252262
table.insert(choices, {text='A location', data={fn=curry(select_location, site)}})
253263
end
254-
table.insert(choices, {text='This fortress/site', data={fn=curry(select_site, site)}})
255264
if fort and #fort.squads > 0 then
256265
table.insert(choices, {text='A squad', data={fn=curry(select_squad, fort)}})
257266
end
267+
table.insert(choices, {text='This fortress/site', data={fn=curry(select_site, site)}})
258268
end
259269
if fort then
260270
table.insert(choices, {text='The government of this fortress', data={fn=curry(select_entity, fort)}})
@@ -712,8 +722,13 @@ function Rename:randomize_component_word(comp)
712722
end
713723

714724
function Rename:generate_random_name()
715-
dfhack.translation.generateName(self.target.name, self.target.name.language, self.target.name.type,
716-
self.target.major_selector, self.target.minor_selector)
725+
local civ
726+
if self.target.civ_id then
727+
civ = df.historical_entity.find(self.target.civ_id)
728+
end
729+
local major_selector, minor_selector = get_word_selectors(self.target.name.type, civ)
730+
dfhack.translation.generateName(self.target.name, self.target.name.language,
731+
self.target.name.type, major_selector, minor_selector)
717732
for _, sync_name in ipairs(self.target.sync_names) do
718733
if type(sync_name) == 'function' then
719734
sync_name()

0 commit comments

Comments
 (0)