| local util = require("util") |
| require("story") |
|
|
| local spawn_position = {-37, 55} |
|
|
| local think = function(thought) |
| game.players[1].print({"","[img=entity/character][color=orange]",{"engineer-title"},": [/color]",{"think-"..thought}}) |
| end |
|
|
| local msg = function(msg) |
| game.players[1].print({"","[img=entity/radar][color=green]",{"computer-title"},": [/color]",{"msg-"..msg}}) |
| end |
|
|
| local on_player_created = function(event) |
|
|
| local player = game.players[1] |
|
|
| player.disable_recipe_groups() |
| player.disable_recipe_subgroups() |
| player.minimap_enabled = false |
| player.force.disable_all_prototypes() |
| player.force.disable_research() |
|
|
| 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["iron-stick"].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 |
| recipe_list["pipe"].enabled = true |
| recipe_list["pipe-to-ground"].enabled = true |
| recipe_list["boiler"].enabled = true |
| recipe_list["steam-engine"].enabled = true |
| recipe_list["electronic-circuit"].enabled = true |
| recipe_list["copper-cable"].enabled = true |
| recipe_list["pistol"].enabled = true |
| recipe_list["firearm-magazine"].enabled = true |
| recipe_list["light-armor"].enabled = true |
| game.players[1].clear_recipe_notifications() |
|
|
| local character = player.character |
| character.insert{name = "iron-plate", count = 20} |
| character.insert{name = "copper-plate", count = 15} |
| character.insert{name = "coal", count = 20} |
| character.insert{name = "transport-belt", count = 50} |
| character.insert{name = "electric-mining-drill", count = 2} |
| character.insert{name = "inserter", count = 10} |
| character.insert{name = "stone-furnace", count = 10} |
| character.insert{name = "pistol", count = 1} |
| character.insert{name = "firearm-magazine", count = 5} |
| end |
|
|
| local story_table = |
| { |
| { |
| { |
| condition = story_elapsed_check(3), |
| action = function() |
| think('find-ship') |
| end |
| }, |
| { |
| condition = story_elapsed_check(5), |
| action = function() |
| think('use-radar') |
| end |
| }, |
| { |
| condition = story_elapsed_check(5), |
| action = function() |
| think('simple-setup') |
| end |
| }, |
| { |
| condition = story_elapsed_check(3), |
| action = |
| function() |
| game.players[1].force.recipes["offshore-pump"].enabled = true |
| end |
| }, |
| { |
| init = |
| function() |
| if global.pump == nil or not global.pump.valid then |
| set_goal({"goal-build-pump"}) |
| else |
| return true |
| end |
| end, |
| condition = |
| function(event) |
| if event.name == defines.events.on_built_entity and |
| event.created_entity.name == "offshore-pump" then |
| return true |
| end |
| return false |
| end |
| }, |
|
|
| { |
| condition = story_elapsed_check(1), |
| action = function() |
| if (not global.boiler.fluidbox[1] or |
| global.boiler.fluidbox[1].amount < 0.01) then |
| set_goal({"goal-connect-boiler-to-water"}) |
| end |
| end |
| }, |
| { |
| condition = function() |
| if global.boiler.fluidbox then |
| return (global.boiler.fluidbox[1] ~= nil) |
| end |
| end, |
| action = function() |
| set_goal("") |
| end |
| }, |
| { |
| condition = story_elapsed_check(3), |
| init= |
| function() |
| if (global.boiler.energy <= 0.1) then |
| set_goal({"goal-fuel-into-boiler"}) |
| end |
| end |
| }, |
| { |
| condition = function() return global.boiler.energy > 0.1 end, |
| action = function() |
| set_goal({"goal-connect-boiler-to-steam-engine"}) |
| end |
| }, |
| { |
| condition = function() return |
| global.steam_engine.fluidbox[1] and |
| global.steam_engine.fluidbox[1].amount > 0 end, |
| action = function() |
| set_goal("") |
| end |
| }, |
| { |
| condition = story_elapsed_check(2), |
| action = function() |
| if (global.steam_engine.energy <= 0.1) then |
| story_show_message_dialog{text={"msg-cold-water"}, |
| point_to={type="entity", entity=global.steam_engine}} |
| end |
| end |
| }, |
|
|
| { |
| condition = story_elapsed_check(3), |
| action = function() end |
| }, |
| { |
| condition = function() return not game.players[1].opened end, |
| action = function() |
| think('electricity-setup') |
| end |
| }, |
| { |
| condition = story_elapsed_check(3), |
| action = function() |
| local recipe_list = game.players[1].force.recipes |
| recipe_list["small-electric-pole"].enabled = true |
| recipe_list["electric-mining-drill"].enabled = true |
| recipe_list["inserter"].enabled = true |
| set_goal({"goal-power-electric-mining-drill"}) |
| end |
| }, |
| { |
| condition = function() return global.mining_drill.energy > 0 end, |
| action = function() |
| set_goal("") |
| end |
| }, |
| { |
| condition = story_elapsed_check(3), |
| action = function() |
| think('piece-of-cake') |
| |
| end |
| }, |
|
|
| { |
| condition = story_elapsed_check(7), |
| action = function() |
| think('factory-instruction') |
| for index, entity in pairs(global.intro_entities) do |
| entity.minable = true |
| entity.destructible = true |
| end |
| local recipe_list = game.players[1].force.recipes |
| recipe_list["assembling-machine-1"].enabled = true |
| end |
| }, |
| { |
| condition = story_elapsed_check(5), |
| action = function() |
| think('get-to-work') |
| |
| end |
| }, |
| { |
| condition = story_elapsed_check(5), |
| action = function() |
| think('beware-of-creepers') |
| |
| end |
| }, |
| { |
| init = function() |
| set_goal({"goal-build-radars",0,3}) |
| global.radars = 0 |
| local recipe_list = game.players[1].force.recipes |
| recipe_list["radar"].enabled = true |
| end, |
| update = function(event) |
| manage_attacks(event.tick) |
| check_light() |
| check_machine_gun() |
| check_ammo(event.tick) |
|
|
| if event.name == defines.events.on_entity_died and event.entity.name == 'radar' then |
| global.radars = global.radars - 1 |
| set_goal({"goal-build-radars",global.radars,3},true) |
| elseif event.name == defines.events.on_built_entity and event.created_entity.name == 'radar' then |
| global.radars = global.radars + 1 |
| set_goal({"goal-build-radars",global.radars,3}) |
| elseif event.name == defines.events.on_player_mined_entity and event.entity.name =='radar' then |
| global.radars = global.radars - 1 |
| set_goal({"goal-build-radars",global.radars,3},true) |
| elseif event.name == defines.events.on_entity_damaged and event.entity.name =='radar' and global.radar_damaged == nil and event.force.name == 'enemy' and event.cause then |
| global.damaging_biter = event.cause |
| global.radar_damaged = true |
| story_show_message_dialog |
| { |
| text={"msg-radar-under-attack"}, |
| point_to={type="entity", entity=event.entity} |
| } |
| end |
|
|
| if event.name == defines.events.on_built_entity and event.created_entity.name == 'burner-mining-drill' and not global.explained_electric_mining then |
| think('electric-mining') |
| global.explained_electric_mining = true |
| end |
|
|
| if global.radar_damaged and global.repair_pack_given == nil and (global.damaging_biter == nil or global.damaging_biter.valid == false) then |
| think('repair-pack') |
| local recipe_list = game.players[1].force.recipes |
| recipe_list["repair-pack"].enabled = true |
| global.repair_pack_given = true |
| end |
|
|
| if global.radars == 1 and not global.explained_radar_function then |
| story_show_message_dialog{text = {"msg-start-with-radars-1"}} |
| global.explained_radar_function = true |
| end |
|
|
| if global.radars == 2 and not global.explained_power_need then |
| story_show_message_dialog{text = {"msg-start-with-radars-2"}} |
| global.explained_power_need = true |
| end |
|
|
| end, |
| condition = function(event) |
| return global.radars >= 3 |
| end |
| }, |
| { |
| action = function() |
| if global.gun_turret_gained == nil then |
| global.gun_turret_gained = true |
| game.players[1].force.recipes["gun-turret"].enabled = true |
| end |
| story_show_message_dialog{text = {"msg-protect-radars"}} |
| end |
| }, |
| { |
| condition = story_elapsed_check(5), |
| action = function() |
| global.sectors_scanned = 0; |
| end |
| }, |
| { |
| init = function() |
| set_goal({"goal-radar-progress",global.sectors_scanned,50}) |
| end, |
| update = function(event) |
| manage_attacks(event.tick) |
| check_light() |
| check_machine_gun() |
| check_ammo(event.tick) |
| check_player_being_lazy() |
|
|
| scanned = (event.name == defines.events.on_sector_scanned) |
| if scanned then |
| global.sectors_scanned = global.sectors_scanned + 1 |
| set_goal({"goal-radar-progress",global.sectors_scanned,50},global.sectors_scanned < 50) |
| elseif event.name == defines.events.on_entity_damaged and event.entity.name =='radar' and global.radar_damaged == nil and event.force.name == 'enemy' and event.cause then |
| global.damaging_biter = event.cause |
| global.radar_damaged = true |
| story_show_message_dialog |
| { |
| text={"msg-radar-under-attack"}, |
| point_to={type="entity", entity=event.entity} |
| } |
| end |
|
|
| if global.radar_damaged and global.repair_pack_given == nil and (global.damaging_biter == nil or global.damaging_biter.valid == false) then |
| think('repair-pack') |
| local recipe_list = game.players[1].force.recipes |
| recipe_list["repair-pack"].enabled = true |
| global.repair_pack_given = true |
| end |
|
|
| end, |
| condition = function() |
| return global.sectors_scanned >= 50 |
| end |
| }, |
| { |
| condition = story_elapsed_check(4), |
| action = function() |
| msg('sector-scan-completed') |
| set_goal("",true) |
| end |
| }, |
| { |
| condition = story_elapsed_check(4), |
| action = function() |
| msg('ship-wreck-located') |
| end |
| }, |
| { |
| condition = story_elapsed_check(4), |
| action = function() |
| think('explore-ship-wreck') |
| end |
| }, |
| { |
| condition = story_elapsed_check(4), |
| action = function() |
| game.set_game_state({game_finished=true, player_won=true, can_continue=false, next_level = "level-04"}) |
| end |
| } |
| } |
| } |
|
|
| story_init_helpers(story_table) |
|
|
| function manage_attacks(tick) |
| |
| if global.last_attack_at == nil then |
| global.last_attack_at = 0 |
| end |
| |
| if global.attack_count == nil then |
| global.attack_count = 4 |
| end |
| |
| if global.attack_frequency == nil then |
| global.attack_frequency = 180 |
| end |
| if tick - global.last_attack_at > 60 * global.attack_frequency then |
| global.last_attack_at = tick |
| local radars = game.players[1].surface.find_entities_filtered({name='radar'}) |
| if #radars > 0 then |
| game.players[1].surface.set_multi_command |
| { |
| command = |
| { |
| type=defines.command.attack, |
| target=game.players[1].character, |
| distraction=defines.distraction.by_enemy |
| }, |
| unit_count = global.attack_count - 1 |
| } |
| game.players[1].surface.set_multi_command |
| { |
| command = |
| { |
| type=defines.command.attack, |
| target=radars[math.random(1,#radars)], |
| distraction=defines.distraction.by_enemy |
| }, |
| unit_count = 1 |
| } |
| else |
| game.players[1].surface.set_multi_command |
| { |
| command = |
| { |
| type=defines.command.attack, |
| target=game.players[1].character, |
| distraction=defines.distraction.by_enemy |
| }, |
| unit_count = global.attack_count |
| } |
| end |
|
|
| global.attack_count = global.attack_count + 1 |
|
|
| |
| if global.attack_count >= 6 and global.submachine_gained == nil then |
| global.submachine_gained = true |
| think('need-better-weapon') |
| local recipe_list = game.players[1].force.recipes |
| recipe_list["submachine-gun"].enabled = true |
| return |
| end |
| end |
| end |
|
|
| |
| function check_light() |
| if game.surfaces['nauvis'].darkness > 0.5 and |
| global.lampallowed == nil then |
| global.lampallowed = true |
| think('need-light') |
| |
| local recipe_list = game.players[1].force.recipes |
| recipe_list["small-lamp"].enabled = true |
| end |
| end |
|
|
| function check_player_being_lazy() |
| if not global.explained_no_lazy and global.sectors_scanned > 10 then |
| if game.surfaces[1].count_entities_filtered({name='radar'}) == 3 then |
| think('build-more-radars') |
| global.explained_no_lazy = true |
| end |
| end |
| end |
|
|
| function check_ammo(tick) |
| if not global.explained_ammo and tick % 120 == 0 then |
| if game.players[1].character.get_item_count("firearm-magazine") < 4 and game.players[1].in_combat == false then |
| think("craft-more-ammo") |
| global.explained_ammo = true |
| end |
| end |
| end |
|
|
| function check_machine_gun() |
| if global.submachine_gained and |
| global.submachine_built == nil and |
| game.players[1].character.get_item_count("submachine-gun") > 0 then |
| global.submachine_built = true |
| story_show_message_dialog{text = {"msg-active-gun"}} |
| return |
| end |
|
|
| if global.submachine_built and |
| global.submachine_equipped == nil and |
| game.players[1].character.get_inventory(defines.inventory.character_guns).get_item_count("submachine-gun") > 0 then |
| global.submachine_equipped = true |
| story_show_message_dialog{text = {"msg-change-active-gun"}} |
| end |
| 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 init = function() |
| global.story = story_init() |
| game.map_settings.pollution.enabled = false |
| game.map_settings.enemy_expansion.enabled = false |
| game.forces.enemy.evolution_factor = 0 |
| game.map_settings.enemy_evolution.enabled = false |
|
|
| |
|
|
| global.mining_drill = game.get_entity_by_tag("mining-drill") |
| global.steam_engine = game.get_entity_by_tag("steam-engine") |
| global.boiler = game.get_entity_by_tag("boiler") |
|
|
| local entities = |
| { |
| global.mining_drill, |
| global.steam_engine, |
| global.boiler |
| } |
|
|
| for index, entity in pairs(entities) do |
| entity.minable = false |
| entity.destructible = false |
| end |
|
|
| global.intro_entities = entities |
| end |
|
|
| local story_events = |
| { |
| defines.events.on_tick, |
| defines.events.on_sector_scanned, |
| defines.events.on_built_entity, |
| defines.events.on_player_mined_entity, |
| defines.events.on_entity_died, |
| defines.events.on_entity_damaged, |
| 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-04") |
| end |
| end) |
|
|
| script.on_init(init) |
|
|
| script.on_event(defines.events.on_player_created, function(event) |
| on_player_created(event) |
| end) |