require("story") require('util') local think = function(thought) game.players[1].print({"","[img=entity/character][color=orange]",{"engineer-title"},": [/color]",{"think-"..thought}}) end local set_arrow = function(arrow_settings) if global.arrow then global.arrow.destroy() end if arrow_settings == nil then global.arrow = nil else global.arrow = game.players[1].surface.create_entity(arrow_settings) end end local on_player_created = function(event) local player = game.players[event.player_index] player.disable_recipe_groups() player.disable_recipe_subgroups() player.minimap_enabled = false player.force.disable_all_prototypes() player.force.disable_research() player.surface.always_day = true -- Don't bother the player with night in this early mission player.game_view_settings = { show_hotkey_suggestions = false } local recipe_list = player.force.recipes recipe_list["iron-plate"].enabled = true recipe_list["copper-plate"].enabled = true recipe_list["stone-furnace"].enabled = true recipe_list["wooden-chest"].enabled = true recipe_list["iron-gear-wheel"].enabled = true recipe_list["burner-mining-drill"].enabled = true recipe_list["transport-belt"].enabled = true recipe_list["burner-inserter"].enabled = true game.players[1].clear_recipe_notifications() if player.character then player.character.insert{name = "coal", count = 20} end end local init = function() global.story = story_init() game.map_settings.pollution.enabled = false global.inserter_chest = game.get_entity_by_tag("inserter-chest") or error("Inserter chest missing") global.inserter_chest_position = global.inserter_chest.position global.inserter_chest_position.energy = 0 global.inserter_furnace = game.get_entity_by_tag("inserter-furnace") or error("Inserter furnace missing") global.inserter_furnace_position = global.inserter_furnace.position end function check_for_player_death(event) if event.name == defines.events.on_player_died then game.set_game_state({game_finished=true, player_won=false, can_continue=false}) end end local story_table = { ["update-functions"]= { ["check-inserter-1"]= function(event, story) if not global.inserter_chest.valid then story_jump_to(story, "build-the-accidentally-mined-inserter") end end, ["check-inserter-2"]= function(event, story) if not global.inserter_furnace.valid then story_jump_to(story, "build-the-accidentally-mined-inserter-2") end end }, { { init = function(event, story) story_add_update(story, "check-inserter-1") end, condition = story_elapsed_check(3), action = function() think("found-mining-site") end }, { condition = story_elapsed_check(4), action = function() think("robotic-arm") end }, { condition = story_elapsed_check(4.6), action = function(event,story) if global.inserter_chest.energy > 0 then story_jump_to(story,"inserter-explaination") else story_show_message_dialog{text={"msg-inserter-no-power"}, point_to={type="entity", entity=global.inserter_chest}} end end }, { condition = story_elapsed_check(1), action = function() set_goal({"goal-open-machine-gui"}) game.players[1].set_gui_arrow({type="entity", entity=global.inserter_chest}) end }, { name = "wait-to-open-inserter-1", condition = function() return global.inserter_chest == game.players[1].opened end, action = function() set_goal({"goal-insert-fuel-into-inserter-1"}) game.players[1].clear_gui_arrow() end }, { condition = function() return global.inserter_chest.energy > 0 end, action = function() set_goal({"goal-close-inserter-gui"}) end }, { name = 'inserter-explaination', condition = function() return game.players[1].opened == nil end, action = function() set_goal("") local shown_text; if game.players[1].input_method == defines.input_method.game_controller then shown_text = "msg-inserter-introduction-1-controller" else shown_text = "msg-inserter-introduction-1" end story_show_message_dialog{text={shown_text}, image = "inserter-explanation.png", point_to={type="entity", entity=global.inserter_chest}} end }, { action = function(event, story) story_show_message_dialog{text={"msg-inserter-introduction-2"}, image = "inserter-usage-explanation.png", point_to={type="entity", entity=global.inserter_chest}} story_remove_update(story, "check-inserter-1") game.players[1].game_view_settings.update_entity_selection = true end }, { condition = story_elapsed_check(5), action = function() local pistol_chest = game.get_entity_by_tag('pistol-chest') if pistol_chest and pistol_chest.valid then set_goal({"goal-inspect-chest"}) global.arrow = game.players[1].surface.create_entity{name="orange-arrow-with-circle", position = pistol_chest.position} end end }, { condition = function() local pistol_chest = game.get_entity_by_tag('pistol-chest') return pistol_chest == nil or (pistol_chest.get_inventory(defines.inventory.chest).is_empty() and game.players[1].cursor_stack.valid_for_read == false) end, action = function() if global.arrow then global.arrow.destroy() end set_goal({"goal-close-inventory"}) end }, { condition = function() return game.players[1].opened == nil end, action = function() think("chest-content-useful") set_goal("") end }, { condition = story_elapsed_check(2), action = function(event, story) if not (game.players[1].character.get_inventory(defines.inventory.character_guns)[1].valid_for_read and game.players[1].character.get_inventory(defines.inventory.character_guns)[1].name == "pistol") then local shown_text; if game.players[1].input_method == defines.input_method.game_controller then shown_text = "msg-gun-equipment-controller" else shown_text = "msg-gun-equipment" end story_show_message_dialog { text = {shown_text}, point_to = { type = "item_stack", inventory_index = defines.inventory.character_guns, item_stack_index = 1, source = "player-equipment-bar" } } end if game.players[1].input_method ~= defines.input_method.game_controller then story_jump_to(story, "equip-start") end end }, { init = function() game.players[1].set_goal_description({"goal-controller-open-character-gui"}) end, condition = function (event) return game.players[1].opened_gui_type == defines.gui_type.controller end }, { name = 'wait-for-window-to-open', condition = story_elapsed_check(0.0000001), }, { init = function() game.show_message_dialog({text={"msg-controller-character-tab"}, point_to= {type="active_window"}}) end, condition = story_elapsed_check(0.0000001), }, { name = 'equip-start', condition = story_elapsed_check(0.5), action = function() if not (game.players[1].character.get_inventory(defines.inventory.character_guns)[1].valid_for_read and game.players[1].character.get_inventory(defines.inventory.character_guns)[1].name == "pistol") then set_goal({"goal-equip-gun"}) if game.players[1].input_method ~= defines.input_method.game_controller then game.players[1].set_gui_arrow{type = "item_stack", inventory_index = defines.inventory.character_guns, item_stack_index = 1, source="player-equipment-bar"} else game.players[1].character.clear_gui_arrow() end end end }, { condition = function() return game.players[1].character.get_inventory(defines.inventory.character_guns)[1].valid_for_read and game.players[1].character.get_inventory(defines.inventory.character_guns)[1].name == "pistol" end, action = function() if game.players[1].character.get_inventory(defines.inventory.character_ammo).get_item_count("firearm-magazine") == 0 then set_goal({"goal-equip-ammo"}) if game.players[1].input_method ~= defines.input_method.game_controller then game.players[1].set_gui_arrow{type = "item_stack", inventory_index = defines.inventory.character_ammo, item_stack_index = 1, source="player-equipment-bar"} else game.players[1].character.clear_gui_arrow() end end end }, { condition = function() return game.players[1].character.get_inventory(defines.inventory.character_ammo)[1].valid_for_read and game.players[1].character.get_inventory(defines.inventory.character_ammo)[1].name == "firearm-magazine" end, action = function() set_goal("") game.players[1].character.clear_gui_arrow() end }, { init = function() set_goal({"goal-close-inventory"}) end, condition = function() return game.players[1].opened == nil and game.players[1].opened_self == false end, action = function() set_goal("") if game.players[1].surface.count_entities_filtered({name='small-biter'}) < 2 then local pos = { x=0, y=game.players[1].surface.map_gen_settings.height/-2 } for k=1,4 do game.players[1].surface.create_entity({ name='small-biter', position=game.players[1].surface.find_non_colliding_position('small-biter',pos,5,0.1) }) end end end }, { condition = story_elapsed_check(2), action = function() think("creepers-coming") game.players[1].character.clear_gui_arrow() end }, { condition = story_elapsed_check(3), action = function() local shown_text; if game.players[1].input_method == defines.input_method.game_controller then shown_text = "msg-shooting-controller" else shown_text = "msg-shooting" end story_show_message_dialog { text = {shown_text}, point_to = {type = "entity", entity = game.players[1].character} } global.biters_killed = 0 end }, { condition = story_elapsed_check(1.5), action = function() set_goal({"kill-creepers"}) end }, { init = function() game.surfaces[1].create_entity({name='small-biter',position={x=-51,y=-55}}) game.surfaces[1].create_entity({name='small-biter',position={x=-55,y=-55}}) game.players[1].surface.set_multi_command { command = { type=defines.command.attack, target=game.players[1].character, distraction=defines.distraction.none }, unit_count = 2 } end, update = function(event) if event.name == defines.events.on_entity_died and event.entity.name == "small-biter" then global.biters_killed = global.biters_killed + 1 end end, condition = function() return global.biters_killed >= 2 end, action = function() set_goal("") think("creepers-dead") end }, { condition = story_elapsed_check(3), action = function() set_goal("") think("prepare") end }, { init = function(event, story) story_add_update(story, "check-inserter-2") end, condition = story_elapsed_check(5), action = function(event, story) if global.inserter_furnace.direction == defines.direction.east then story_jump_to(story,"more-machines") else story_show_message_dialog { text = {"msg-inserter-2-reversed"}, point_to = {type="entity", entity = global.inserter_furnace} } end end }, { condition = story_elapsed_check(0.5), action = function() game.players[1].set_gui_arrow({type="entity", entity=global.inserter_furnace}) if game.players[1].input_method == defines.input_method.game_controller then set_goal({"goal-rotate-inserter-2-controller"}) else set_goal({"goal-rotate-inserter-2"}) end end }, { name = "wait-to-rotate-inserter-2", condition = function() return global.inserter_furnace.drop_target ~= nil and global.inserter_furnace.drop_target.name == "stone-furnace" end, action = function(event, story) set_goal("") game.players[1].clear_gui_arrow() think("inserter2-working") story_remove_update(story, "check-inserter-2") end }, { condition = story_elapsed_check(3), action = function() game.players[1].clear_gui_arrow() story_show_message_dialog { text = {"msg-rotations-explained"}, point_to = {type = "entity", entity = game.players[1].character} } end }, { name = 'more-machines', condition = story_elapsed_check(3), action = function() think("need-more-machines") end }, { condition = story_elapsed_check(4) }, { init = function(event, story) global.mined_stone_count = 0 story_remove_update(story, "check-inserter-1") story_remove_update(story, "check-inserter-2") end, update = (function() --jesus... --yeah i know what you mean... local only_update = false return function(event) progress = event.name == defines.events.on_built_entity and (event.created_entity.name == "burner-mining-drill" or event.created_entity.name == "stone-furnace") if event.name == defines.events.on_player_mined_item and event.item_stack.name == "stone" then global.mined_stone_count = global.mined_stone_count + 1 end if global.mined_stone_count >= 5 and global.advice_to_mine_stone == nil then think("automated-stone-mining") global.advice_to_mine_stone = true end set_goal ( { "goal-build-machines", game.players[1].force.get_entity_count("burner-mining-drill"), 10, game.players[1].force.get_entity_count("stone-furnace"), 5 }, true ) only_update = true end end)(), condition = function() return game.players[1].force.get_entity_count("burner-mining-drill") >= 10 and game.players[1].force.get_entity_count("stone-furnace") >= 5 end, action = function() think("got-machines") set_goal("") end }, { condition = story_elapsed_check(5), action = function() think("need-more-resources") end }, { update = (function() local only_update = false return function(event) local iron_plate_count = game.players[1].character.get_item_count("iron-plate") local copperplatecount = game.players[1].character.get_item_count("copper-plate") local coal_count = game.players[1].character.get_item_count("coal") set_goal ( { "goal-get-resources", iron_plate_count, 150, copperplatecount, 50, coal_count, 75 }, only_update ) only_update = true end end)(), condition = function() return game.players[1].character.get_item_count("iron-plate") >= 150 and game.players[1].character.get_item_count("copper-plate") >= 50 and game.players[1].character.get_item_count("coal") >= 75 end, action = function() think("got-resources-1") set_goal("") end }, { condition = story_elapsed_check(5), action = function() think("time-to-move-on") end }, { condition = story_elapsed_check(5), action = function() game.set_game_state({game_finished=true, player_won=true, can_continue=true,next_level='level-03'}) end } }, { { name = "build-the-accidentally-mined-inserter", init = function(event, story) story_remove_update(story, "check-inserter-1") end, action = function() story_show_message_dialog { text={"msg-mined-inserter-instead-of-open"}, point_to = {type = "position", position = global.inserter_chest_position}} set_arrow({name="orange-arrow-with-circle", position = global.inserter_chest_position}) end }, { action = function() set_goal({"goal-build-inserter-back"}) end }, { condition = function(event) if event.name == defines.events.on_built_entity and event.created_entity.name == "burner-inserter" then if not (event.created_entity.position.x == global.inserter_chest_position.x and event.created_entity.position.y == global.inserter_chest_position.y) then story_show_message_dialog { text = {"msg-inserter-1-wrong-position"}, point_to = {type = "entity", entity = event.created_entity} } return false else event.created_entity.direction = defines.direction.west global.inserter_chest = event.created_entity return true end end end, action = function(event, story) set_arrow() story_jump_to(story, "wait-to-open-inserter-1") story_add_update(story, "check-inserter-1") end } }, { { name = "build-the-accidentally-mined-inserter-2", init = function(event, story) story_remove_update(story, "check-inserter-2") end, action = function() story_show_message_dialog { text = {"msg-mined-inserter-instead-of-open-2"}, point_to = {type="position", position = global.inserter_furnace_position} } set_arrow({name="orange-arrow-with-circle", position = global.inserter_furnace_position}) end }, { action = function() set_goal({"goal-build-inserter-back"}) end }, { condition = function(event) if event.name == defines.events.on_built_entity and event.created_entity.name == "burner-inserter" then if not table.compare(event.created_entity.position, global.inserter_furnace_position or {0,0}) then story_show_message_dialog { text = {"msg-inserter-2-wrong-position"}, point_to = {type = "entity", entity = event.created_entity} } return false end global.inserter_furnace = event.created_entity return true end end, action = function(event, story) set_arrow() story_jump_to(story, "wait-to-rotate-inserter-2") story_add_update(story, "check-inserter-2") end } } } story_init_helpers(story_table) local story_events = { defines.events.on_tick, defines.events.on_entity_died, defines.events.on_built_entity, defines.events.on_player_mined_item, defines.events.on_player_died } script.on_event(story_events, function(event) if game.players[1].character then check_for_player_death(event) story_update(global.story, event, "level-03") end end) script.on_init(init) script.on_event(defines.events.on_player_created, function(event) on_player_created(event) end)