@@ -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 ]
5979end
6080
6181local 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 }
6988end
7089
7190local 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 }
85102end
86103
87104local 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 }
97112end
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
110125end
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
122137end
123138
124139local 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 )}
128142end
129143
130144local 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 )}
134147end
135148
136149local 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 )}
142154end
143155
144156local 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 )}
147158end
148159
149160local 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 }
160170end
161171
162172local 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)
712722end
713723
714724function 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