| 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 |
| 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() |
| |
| |
| 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) |