dfhack/scripts/modtools/reaction-trigger-transition...

138 lines
4.4 KiB
Lua

-- scripts/modtools/reaction-trigger-transition.lua
-- author expwnent
-- prints useful things to the console and a file to help modders transition from autoSyndrome to reaction-trigger
-- this script is basically an apology for breaking backward compatibiility
local function maybeQuote(str)
if str == '' or string.find(str,' ') then
return ('"' .. str .. '"')
else
return str
end
end
warnings = ''
output = ''
for _,reaction in ipairs(df.global.world.raws.reactions) do
local function foreachProduct(product)
local prodType = product:getType()
if prodType ~= df.reaction_product_type.item then
return
end
if product.item_type ~= df.item_type.BOULDER then
return
end
if product.mat_index < 0 then
return
end
local inorganic = df.global.world.raws.inorganics[product.mat_index]
local didInorganicName
for _,syndrome in ipairs(inorganic.material.syndrome) do
local workerOnly = true
local allowMultipleTargets = false;
local command
local commandStr
local destroyRock = true;
local foundAutoSyndrome = false;
local resetPolicy;
for i,synclass in ipairs(syndrome.syn_class) do
synclass = synclass.value
if false then
elseif synclass == '\\AUTO_SYNDROME' then
foundAutoSyndrome = true
elseif synclass == '\\ALLOW_NONWORKER_TARGETS' then
workerOnly = false
elseif synclass == '\\ALLOW_MULTIPLE_TARGETS' then
allowMultipleTargets = true
elseif synclass == '\\PRESERVE_ROCK' then
destroyRock = false
elseif synclass == '\\RESET_POLICY DoNothing' then
resetPolicy = 'DoNothing'
elseif synclass == '\\RESET_POLICY ResetDuration' then
resetPolicy = 'ResetDuration'
elseif synclass == '\\RESET_POLICY AddDuration' then
resetPolicy = 'AddDuration'
elseif synclass == '\\RESET_POLICY NewInstance' then
resetPolicy = 'NewInstance'
elseif synclass == '\\COMMAND' then
command = ''
elseif command then
if synclass == '\\LOCATION' then
command = command .. '\\LOCATION '
elseif synclass == '\\WORKER_ID' then
command = command .. '\\WORKER_ID '
elseif synclass == '\\REACTION_INDEX' then
warnings = warnings .. ('Warning: \\REACTION_INDEX is deprecated. Use \\REACTION_NAME instead.\n')
command = command .. '\\REACTION_NAME '
else
commandStr = true
command = command .. maybeQuote(synclass) .. ' '
end
end
end
if foundAutoSyndrome then
if destroyRock then
warnings = warnings .. ('Warning: instead of destroying the rock, do not produce it in the first place.\n')
end
if workerOnly then
workerOnly = 'true'
else
workerOnly = 'false'
end
if allowMultipleTargets then
allowMultipleTargets = 'true'
else
allowMultipleTargets = 'false'
end
local reactionTriggerStr = 'modtools/reaction-trigger -reactionName ' .. maybeQuote(reaction.code) --.. '"'
if workerOnly ~= 'true' then
reactionTriggerStr = reactionTriggerStr .. ' -workerOnly ' .. workerOnly
end
if allowMultipleTargets ~= 'false' then
reactionTriggerStr = reactionTriggerStr .. ' -allowMultipleTargets ' .. allowMultipleTargets
end
if resetPolicy and resetPolicy ~= 'NewInstance' then
reactionTriggerStr = reactionTriggerStr .. ' -resetPolicy ' .. resetPolicy
end
if #syndrome.ce > 0 then
if syndrome.syn_name == '' then
warnings = warnings .. ('Warning: give this syndrome a name!\n')
end
reactionTriggerStr = reactionTriggerStr .. ' -syndrome ' .. maybeQuote(syndrome.syn_name) .. ''
end
if command and commandStr then
reactionTriggerStr = reactionTriggerStr .. ' -command [ ' .. command .. ']'
end
if (not command or command == '') and (not syndrome.syn_name or syndrome.syn_name == '') then
--output = output .. '#'
else
if not didInorganicName then
-- output = output .. '# ' .. (inorganic.id) .. '\n'
didInorganicName = true
end
output = output .. (reactionTriggerStr) .. '\n'
end
end
end
end
for _,product in ipairs(reaction.products) do
foreachProduct(product)
end
end
print(warnings)
print('\n\n\n\n')
print(output)
local file = io.open('reaction-trigger-transition.txt', 'w+')
--io.output(file)
--file:write(warnings)
--file:write('\n\n\n\n')
file:write(output)
file:flush()
--io.flush(file)
io.close(file)
--io.output()
print('transition information written to reaction-trigger-transition.txt')