132 lines
5.1 KiB
Lua
132 lines
5.1 KiB
Lua
require "lib"
|
|
-- for testing
|
|
script.on_event(defines.events.on_tick, function(event)
|
|
if event.tick%600 == 0 then
|
|
dumpTech(game.forces["player"])
|
|
end
|
|
end)
|
|
|
|
-- hook into researches done
|
|
script.on_event(defines.events.on_research_finished, function(event)
|
|
local technology = event.research
|
|
dumpTech(technology.force)
|
|
{% if free_samples %}
|
|
local players = technology.force.players
|
|
if technology.effects then
|
|
for _, effect in pairs(technology.effects) do
|
|
if effect.type == "unlock-recipe" then
|
|
local recipe = game.recipe_prototypes[effect.recipe]
|
|
for _, result in pairs(recipe.products) do
|
|
if result.type == "item" and result.amount then
|
|
{% if free_samples == 1 %}
|
|
local new = {count=result.amount, name=result.name}
|
|
{% elif free_samples == 2 %}
|
|
local new = {count=get_any_stack_size(result.name) * 0.5, name=result.name}
|
|
{% else %}
|
|
local new = {count=get_any_stack_size(result.name), name=result.name}
|
|
{% endif %}
|
|
for _, player in pairs(players) do
|
|
player.insert(new)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
{% endif %}
|
|
|
|
end)
|
|
|
|
function dumpTech(force)
|
|
local data_collection = {}
|
|
for tech_name, tech in pairs(force.technologies) do
|
|
if tech.researched and string.find(tech_name, "ap-") == 1 then
|
|
data_collection[tech_name] = tech.researched
|
|
end
|
|
end
|
|
game.write_file("research_done.json", game.table_to_json(data_collection), false)
|
|
-- game.write_file("research_done.json", game.table_to_json(data_collection), false, 0)
|
|
-- game.print("Sent progress to Archipelago.")
|
|
end
|
|
|
|
function dumpGameInfo()
|
|
-- dump Game Information that the Archipelago Randomizer needs.
|
|
local data_collection = {}
|
|
local force = game.forces["player"]
|
|
for tech_name, tech in pairs(force.technologies) do
|
|
if tech.enabled and tech.research_unit_count_formula == nil then
|
|
local tech_data = {}
|
|
local unlocks = {}
|
|
tech_data["unlocks"] = unlocks
|
|
local requires = {}
|
|
tech_data["requires"] = requires
|
|
local ingredients = {}
|
|
tech_data["ingredients"] = ingredients
|
|
for tech_requirement, _ in pairs(tech.prerequisites) do
|
|
table.insert(requires, tech_requirement)
|
|
end
|
|
for _, modifier in pairs(tech.effects) do
|
|
if modifier.type == "unlock-recipe" then
|
|
table.insert(unlocks, modifier.recipe)
|
|
end
|
|
end
|
|
for _, ingredient in pairs(tech.research_unit_ingredients) do
|
|
table.insert(ingredients, ingredient.name)
|
|
end
|
|
data_collection[tech_name] = tech_data
|
|
|
|
end
|
|
game.write_file("techs.json", game.table_to_json(data_collection), false)
|
|
game.print("Exported Tech Data")
|
|
end
|
|
data_collection = {}
|
|
for recipe_name, recipe in pairs(force.recipes) do
|
|
local recipe_data = {}
|
|
recipe_data["ingredients"] = {}
|
|
recipe_data["products"] = {}
|
|
recipe_data["category"] = recipe.category
|
|
for _, ingredient in pairs(recipe.ingredients) do
|
|
table.insert(recipe_data["ingredients"], ingredient.name)
|
|
end
|
|
for _, product in pairs(recipe.products) do
|
|
table.insert(recipe_data["products"], product.name)
|
|
end
|
|
data_collection[recipe_name] = recipe_data
|
|
end
|
|
game.write_file("recipes.json", game.table_to_json(data_collection), false)
|
|
game.print("Exported Recipe Data")
|
|
-- data.raw can't be accessed from control.lua, need to find a better method
|
|
-- data_collection = {}
|
|
-- for machine_name, machine in pairs(data.raw["assembling_machine"]) do
|
|
-- local machine_data = {}
|
|
-- machine_data["categories"] = table.deepcopy(machine.crafting_categories)
|
|
-- data_collection[machine.name] = machine_data
|
|
-- end
|
|
-- game.write_file("machines.json", game.table_to_json(data_collection), false)
|
|
-- game.print("Exported Machine Data")
|
|
end
|
|
|
|
-- add / commands
|
|
|
|
commands.add_command("ap-get-info-dump", "Dump Game Info, used by Archipelago.", function(call)
|
|
dumpGameInfo()
|
|
end)
|
|
|
|
commands.add_command("ap-sync", "Run manual Research Sync with Archipelago.", function(call)
|
|
dumpTech()
|
|
end)
|
|
|
|
commands.add_command("ap-get-technology", "Grant a technology, used by the Archipelago Client.", function(call)
|
|
local force = game.forces["player"]
|
|
local tech_name = call.parameter
|
|
local tech = force.technologies[tech_name]
|
|
if tech ~= nil then
|
|
if tech.researched ~= true then
|
|
tech.researched = true
|
|
game.print({"", "Received ", tech.localised_name, " from Archipelago"})
|
|
game.play_sound({path="utility/research_completed"})
|
|
end
|
|
else
|
|
game.print("Unknown Technology " .. tech_name)
|
|
end
|
|
end) |