Merge branch 'cycle-hotkey-rev' of https://github.com/johncosker/dfhack into cycle-hotkey-rev
						commit
						fdf1d38b23
					
				| @ -1,302 +0,0 @@ | |||||||
| local _ENV = mkmodule('makeown') |  | ||||||
| --[[ |  | ||||||
|     'tweak makeown' as a lua include |  | ||||||
|     make_own(unit)        -- removes foreign flags, sets civ_id to fort civ_id, and sets clothes ownership |  | ||||||
|     make_citizen(unit)    -- called by make_own if unit.race == fort race |  | ||||||
| 
 |  | ||||||
|     eventually ought to migrate to hack/lua/plugins/tweak.lua |  | ||||||
|     and local _ENV = mkmodule('plugin.tweak') |  | ||||||
|     in order to link to functions in the compiled plugin (when/if they become available to lua) |  | ||||||
| --]] |  | ||||||
| local utils = require 'utils' |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| local function fix_clothing_ownership(unit) |  | ||||||
|     -- extracted/translated from tweak makeown plugin |  | ||||||
|     -- to be called by tweak-fixmigrant/makeown |  | ||||||
|     -- units forced into the fort by removing the flags do not own their clothes |  | ||||||
|     -- which has the result that they drop all their clothes and become unhappy because they are naked |  | ||||||
|     -- so we need to make them own their clothes and add them to their uniform |  | ||||||
|     local fixcount = 0    --int fixcount = 0; |  | ||||||
|     for j=0,#unit.inventory-1 do    --for(size_t j=0; j<unit->inventory.size(); j++) |  | ||||||
|         local inv_item = unit.inventory[j]    --unidf::unit_inventory_item* inv_item = unit->inventory[j]; |  | ||||||
|         local item = inv_item.item    --df::item* item = inv_item->item; |  | ||||||
|         -- unforbid items (for the case of kidnapping caravan escorts who have their stuff forbidden by default) |  | ||||||
|         -- moved forbid false to inside if so that armor/weapons stay equiped |  | ||||||
|         if inv_item.mode == df.unit_inventory_item.T_mode.Worn then --if(inv_item->mode == df::unit_inventory_item::T_mode::Worn) |  | ||||||
|             -- ignore armor? |  | ||||||
|             -- it could be leather boots, for example, in which case it would not be nice to forbid ownership |  | ||||||
|             --if(item->getEffectiveArmorLevel() != 0) |  | ||||||
|             --    continue; |  | ||||||
| 
 |  | ||||||
|             if not dfhack.items.getOwner(item) then    --if(!Items::getOwner(item)) |  | ||||||
|                 if dfhack.items.setOwner(item,unit) then    --if(Items::setOwner(item, unit)) |  | ||||||
|                     item.flags.forbid = false    --inv_item->item->flags.bits.forbid = 0; |  | ||||||
|                     -- add to uniform, so they know they should wear their clothes |  | ||||||
|                     unit.military.uniforms[0]:insert('#',item.id)    --insert_into_vector(unit->military.uniforms[0], item->id); |  | ||||||
|                     fixcount = fixcount + 1    --fixcount++; |  | ||||||
|                 else |  | ||||||
|                     ----out << "could not change ownership for item!" << endl; |  | ||||||
|                     print("Makeown: could not change ownership for an item!") |  | ||||||
|                 end |  | ||||||
|             end |  | ||||||
|         end |  | ||||||
|     end |  | ||||||
|     -- clear uniform_drop (without this they would drop their clothes and pick them up some time later) |  | ||||||
|     -- dirty? |  | ||||||
|     unit.military.uniform_drop:resize(0)    --unit->military.uniform_drop.clear(); |  | ||||||
|     ----out << "ownership for " << fixcount << " clothes fixed" << endl; |  | ||||||
|     print("Makeown: claimed ownership for "..tostring(fixcount).." worn items") |  | ||||||
|     --return true    --return CR_OK; |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
| local function entity_link(hf, eid, do_event, add, replace_idx) |  | ||||||
|     do_event = (do_event == nil) and true or do_event |  | ||||||
|     add = (add == nil) and true or add |  | ||||||
|     replace_idx = replace_idx or -1 |  | ||||||
| 
 |  | ||||||
|     local link = add and df.histfig_entity_link_memberst:new() or df.histfig_entity_link_former_memberst:new() |  | ||||||
|     link.entity_id = eid |  | ||||||
|     if replace_idx > -1 then |  | ||||||
|         local e = hf.entity_links[replace_idx] |  | ||||||
|         link.link_strength = (e.link_strength > 3) and (e.link_strength - 2) or e.link_strength |  | ||||||
|         hf.entity_links[replace_idx] = link -- replace member link with former member link |  | ||||||
|         e:delete() |  | ||||||
|     else |  | ||||||
|         link.link_strength =  100 |  | ||||||
|         hf.entity_links:insert('#', link) |  | ||||||
|     end |  | ||||||
|     if do_event then |  | ||||||
|         event = add and df.history_event_add_hf_entity_linkst:new() or df.history_event_remove_hf_entity_linkst:new() |  | ||||||
|         event.year = df.global.cur_year |  | ||||||
|         event.seconds = df.global.cur_year_tick |  | ||||||
|         event.civ = eid |  | ||||||
|         event.histfig = hf.id |  | ||||||
|         event.link_type = 0 |  | ||||||
|         event.position_id = -1 |  | ||||||
|         event.id = df.global.hist_event_next_id |  | ||||||
|         df.global.world.history.events:insert('#',event) |  | ||||||
|         df.global.hist_event_next_id = df.global.hist_event_next_id + 1 |  | ||||||
|     end |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
| local function change_state(hf, site_id, pos) |  | ||||||
|     hf.info.unk_14.unk_0 = 3    -- state? arrived? |  | ||||||
|     hf.info.unk_14.region:assign(pos) |  | ||||||
|     hf.info.unk_14.site = site_id |  | ||||||
|     event = df.history_event_change_hf_statest:new() |  | ||||||
|     event.year = df.global.cur_year |  | ||||||
|     event.seconds = df.global.cur_year_tick |  | ||||||
|     event.hfid = hf.id |  | ||||||
|     event.state = 3 |  | ||||||
|     event.site = site_id |  | ||||||
|     event.region_pos:assign(pos) |  | ||||||
|     event.substate = -1; event.region = -1; event.layer = -1; |  | ||||||
|     event.id = df.global.hist_event_next_id |  | ||||||
|     df.global.world.history.events:insert('#',event) |  | ||||||
|     df.global.hist_event_next_id = df.global.hist_event_next_id + 1 |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| function make_citizen(unit) |  | ||||||
|     local dfg = df.global |  | ||||||
|     local civ_id = dfg.ui.civ_id |  | ||||||
|     local group_id = dfg.ui.group_id |  | ||||||
|     local events = dfg.world.history.events |  | ||||||
|     local fortent = dfg.ui.main.fortress_entity |  | ||||||
|     local civent = fortent and df.historical_entity.find(fortent.entity_links[0].target) |  | ||||||
|         -- utils.binsearch(dfg.world.entities.all, fortent.entity_links[0].target, 'id') |  | ||||||
|     local event |  | ||||||
|     local region_pos = df.world_site.find(dfg.ui.site_id).pos -- used with state events and hf state |  | ||||||
| 
 |  | ||||||
|     local hf |  | ||||||
|     -- assume that hf id 1 and hf id 2 are equal.  I am unaware of instances of when they are not. |  | ||||||
|     -- occationally a unit does not have both flags set (missing flags1.important_historical_figure) |  | ||||||
|     -- and I don't know what that means yet. |  | ||||||
|     if unit.flags1.important_historical_figure and unit.flags2.important_historical_figure then |  | ||||||
|         -- aready hf, find it (unlikely to happen) |  | ||||||
|         hf = utils.binsearch(dfg.world.history.figures, unit.hist_figure_id, 'id') |  | ||||||
|     --elseif unit.flags1.important_historical_figure or unit.flags2.important_historical_figure then |  | ||||||
|         -- something wrong, try to fix it? |  | ||||||
|         --[[ |  | ||||||
|         if unit.hist_figure_id == -1 then |  | ||||||
|             unit.hist_figure_id = unit.hist_figure_id2 |  | ||||||
|         end |  | ||||||
|         if unit.hist_figure_id > -1 then |  | ||||||
|             unit.hist_figure_id2 = unit.hist_figure_id |  | ||||||
|             unit.flags1.important_historical_figure = true |  | ||||||
|             unit.flags2.important_historical_figure = true |  | ||||||
|             hf = utils.binsearch(dfg.world.history.figures, unit.hist_figure_id, 'id') |  | ||||||
|         else |  | ||||||
|             unit.flags1.important_historical_figure = false |  | ||||||
|             unit.flags2.important_historical_figure = false |  | ||||||
|         end |  | ||||||
|         --]] |  | ||||||
|     --else |  | ||||||
|         -- make one |  | ||||||
|     end |  | ||||||
|     --local new_hf = false |  | ||||||
|     if not hf then |  | ||||||
|         --new_hf = true |  | ||||||
|         hf = df.historical_figure:new() |  | ||||||
|         hf.profession = unit.profession |  | ||||||
|         hf.race = unit.race |  | ||||||
|         hf.caste = unit.caste |  | ||||||
|         hf.sex = unit.sex |  | ||||||
|         hf.appeared_year = dfg.cur_year |  | ||||||
|         hf.born_year = unit.birth_year |  | ||||||
|         hf.born_seconds = unit.birth_time |  | ||||||
|         hf.curse_year = unit.curse_year |  | ||||||
|         hf.curse_seconds = unit.curse_time |  | ||||||
|         hf.birth_year_bias=unit.bias_birth_bias |  | ||||||
|         hf.birth_time_bias=unit.birth_time_bias |  | ||||||
|         hf.old_year = unit.old_year |  | ||||||
|         hf.old_seconds = unit.old_time |  | ||||||
|         hf.died_year = -1 |  | ||||||
|         hf.died_seconds = -1 |  | ||||||
|         hf.name:assign(unit.name) |  | ||||||
|         hf.civ_id = unit.civ_id |  | ||||||
|         hf.population_id  = unit.population_id |  | ||||||
|         hf.breed_id = -1 |  | ||||||
|         hf.unit_id = unit.id |  | ||||||
|         hf.id = dfg.hist_figure_next_id -- id must be set before adding links (for the events) |  | ||||||
| 
 |  | ||||||
|         --history_event_add_hf_entity_linkst not reported for civ on starting 7 |  | ||||||
|         entity_link(hf, civ_id, false) -- so lets skip event here |  | ||||||
|         entity_link(hf, group_id) |  | ||||||
| 
 |  | ||||||
|         hf.info = df.historical_figure_info:new() |  | ||||||
|         hf.info.unk_14 = df.historical_figure_info.T_unk_14:new() -- hf state? |  | ||||||
|         --unk_14.region_id = -1; unk_14.beast_id = -1; unk_14.unk_14 = 0 |  | ||||||
|         hf.info.unk_14.unk_18 = -1; hf.info.unk_14.unk_1c = -1 |  | ||||||
|         -- set values that seem related to state and do event |  | ||||||
|         change_state(hf, dfg.ui.site_id, region_pos) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         --lets skip skills for now |  | ||||||
|         --local skills = df.historical_figure_info.T_skills:new() -- skills snap shot |  | ||||||
|         -- ... |  | ||||||
|         --info.skills = skills |  | ||||||
| 
 |  | ||||||
|         dfg.world.history.figures:insert('#', hf) |  | ||||||
|         dfg.hist_figure_next_id = dfg.hist_figure_next_id + 1 |  | ||||||
| 
 |  | ||||||
|         --new_hf_loc = df.global.world.history.figures[#df.global.world.history.figures - 1] |  | ||||||
|         fortent.histfig_ids:insert('#', hf.id) |  | ||||||
|         fortent.hist_figures:insert('#', hf) |  | ||||||
|         civent.histfig_ids:insert('#', hf.id) |  | ||||||
|         civent.hist_figures:insert('#', hf) |  | ||||||
| 
 |  | ||||||
|         unit.flags1.important_historical_figure = true |  | ||||||
|         unit.flags2.important_historical_figure = true |  | ||||||
|         unit.hist_figure_id = hf.id |  | ||||||
|         unit.hist_figure_id2 = hf.id |  | ||||||
|         print("Makeown-citizen: created historical figure") |  | ||||||
|     else |  | ||||||
|         -- only insert into civ/fort if not already there |  | ||||||
|         -- Migrants change previous histfig_entity_link_memberst to histfig_entity_link_former_memberst |  | ||||||
|         -- for group entities, add link_member for new group, and reports events for remove from group, |  | ||||||
|         -- remove from civ, change state, add civ, and add group |  | ||||||
| 
 |  | ||||||
|         hf.civ_id = civ_id -- ensure current civ_id |  | ||||||
| 
 |  | ||||||
|         local found_civlink = false |  | ||||||
|         local found_fortlink = false |  | ||||||
|         local v = hf.entity_links |  | ||||||
|         for k=#v-1,0,-1 do |  | ||||||
|             if df.histfig_entity_link_memberst:is_instance(v[k]) then |  | ||||||
|                 entity_link(hf, v[k].entity_id, true, false, k) |  | ||||||
|             end |  | ||||||
|         end |  | ||||||
| 
 |  | ||||||
|         if hf.info and hf.info.unk_14 then |  | ||||||
|             change_state(hf, dfg.ui.site_id, region_pos) |  | ||||||
|             -- leave info nil if not found for now |  | ||||||
|         end |  | ||||||
| 
 |  | ||||||
|         if not found_civlink then    entity_link(hf,civ_id)        end |  | ||||||
|         if not found_fortlink then    entity_link(hf,group_id)    end |  | ||||||
| 
 |  | ||||||
|         --change entity_links |  | ||||||
|         local found = false |  | ||||||
|         for _,v in ipairs(civent.histfig_ids) do |  | ||||||
|             if v == hf.id then found = true; break end |  | ||||||
|         end |  | ||||||
|         if not found then |  | ||||||
|             civent.histfig_ids:insert('#', hf.id) |  | ||||||
|             civent.hist_figures:insert('#', hf) |  | ||||||
|         end |  | ||||||
|         found = false |  | ||||||
|         for _,v in ipairs(fortent.histfig_ids) do |  | ||||||
|             if v == hf.id then found = true; break end |  | ||||||
|         end |  | ||||||
|         if not found then |  | ||||||
|             fortent.histfig_ids:insert('#', hf.id) |  | ||||||
|             fortent.hist_figures:insert('#', hf) |  | ||||||
|         end |  | ||||||
|         print("Makeown-citizen: migrated historical figure") |  | ||||||
|     end    -- hf |  | ||||||
| 
 |  | ||||||
|     local nemesis = dfhack.units.getNemesis(unit) |  | ||||||
|     if not nemesis then |  | ||||||
|         nemesis = df.nemesis_record:new() |  | ||||||
|         nemesis.figure = hf |  | ||||||
|         nemesis.unit = unit |  | ||||||
|         nemesis.unit_id = unit.id |  | ||||||
|         nemesis.save_file_id = civent.save_file_id |  | ||||||
|         nemesis.unk10, nemesis.unk11, nemesis.unk12 = -1, -1, -1 |  | ||||||
|         --group_leader_id = -1 |  | ||||||
|         nemesis.id = dfg.nemesis_next_id |  | ||||||
|         nemesis.member_idx = civent.next_member_idx |  | ||||||
|         civent.next_member_idx = civent.next_member_idx + 1 |  | ||||||
| 
 |  | ||||||
|         dfg.world.nemesis.all:insert('#', nemesis) |  | ||||||
|         dfg.nemesis_next_id = dfg.nemesis_next_id + 1 |  | ||||||
| 
 |  | ||||||
|         nemesis_link = df.general_ref_is_nemesisst:new() |  | ||||||
|         nemesis_link.nemesis_id = nemesis.id |  | ||||||
|         unit.general_refs:insert('#', nemesis_link) |  | ||||||
| 
 |  | ||||||
|         --new_nemesis_loc = df.global.world.nemesis.all[#df.global.world.nemesis.all - 1] |  | ||||||
|         fortent.nemesis_ids:insert('#', nemesis.id) |  | ||||||
|         fortent.nemesis:insert('#', nemesis) |  | ||||||
|         civent.nemesis_ids:insert('#', nemesis.id) |  | ||||||
|         civent.nemesis:insert('#', nemesis) |  | ||||||
|         print("Makeown-citizen: created nemesis entry") |  | ||||||
|     else-- only insert into civ/fort if not already there |  | ||||||
|         local found = false |  | ||||||
|         for _,v in ipairs(civent.nemesis_ids) do |  | ||||||
|             if v == nemesis.id then found = true; break end |  | ||||||
|         end |  | ||||||
|         if not found then |  | ||||||
|             civent.nemesis_ids:insert('#', nemesis.id) |  | ||||||
|             civent.nemesis:insert('#', nemesis) |  | ||||||
|         end |  | ||||||
|         found = false |  | ||||||
|         for _,v in ipairs(fortent.nemesis_ids) do |  | ||||||
|             if v == nemesis.id then found = true; break end |  | ||||||
|         end |  | ||||||
|         if not found then |  | ||||||
|             fortent.nemesis_ids:insert('#', nemesis.id) |  | ||||||
|             fortent.nemesis:insert('#', nemesis) |  | ||||||
|         end |  | ||||||
|         print("Makeown-citizen: migrated nemesis entry") |  | ||||||
|     end -- nemesis |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| function make_own(unit) |  | ||||||
|     --tweak makeown |  | ||||||
|     unit.flags2.resident = false; unit.flags1.merchant = false; unit.flags1.forest = false; |  | ||||||
|     unit.civ_id = df.global.plotinfo.civ_id |  | ||||||
|     if unit.profession == df.profession.MERCHANT then unit.profession = df.profession.TRADER end |  | ||||||
|     if unit.profession2 == df.profession.MERCHANT then unit.profession2 = df.profession.TRADER end |  | ||||||
|     fix_clothing_ownership(unit) |  | ||||||
|     if unit.race == df.global.plotinfo.race_id then |  | ||||||
|         make_citizen(unit) |  | ||||||
|     end |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| return _ENV |  | ||||||
		Loading…
	
		Reference in New Issue