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') --game.print({"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') --game.print({"think-get-to-work"}) end }, { condition = story_elapsed_check(5), action = function() think('beware-of-creepers') --game.print({"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) -- set default value of last_attack_at, it contains tick of the last attack if global.last_attack_at == nil then global.last_attack_at = 0 end -- set default value of attack count if global.attack_count == nil then global.attack_count = 4 end -- set default of attack_frequency, it specifies how many seconds between attacks 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 -- Give the player submachine gun when 6 creepers start to attack if global.attack_count >= 6 and global.submachine_gained == nil then -- 6 min 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 -- Gives lamp to the player when it gets dark function check_light() if game.surfaces['nauvis'].darkness > 0.5 and global.lampallowed == nil then global.lampallowed = true think('need-light') --story_show_message_dialog{text = {"msg-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 --game.forces.player.set_spawn_position(spawn_position, game.surfaces[1]) 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)