--- Cutscene Module -- @script cutscene -- Container module for cutscenes available in the game local locations = require(mod_name .. ".lualib.locations") local util = require("util") local cutscene = {} -- This data is saved in global local cutscene_data = { playing = false, last_waypoint = -1, last_waypoints = nil } function cutscene.play(scene, players) players = players or game.forces['player'].players scene = util.table.deepcopy(scene) scene.darkness_multiplier = scene.darkness_multiplier or 0.8 cutscene_data.last_waypoints = scene.waypoints cutscene_data.playing = true game.autosave_enabled = false --convert string waypoints for _, waypoint in pairs(scene.waypoints) do if type(waypoint.position) == 'string' then waypoint.position = locations.get_pos(waypoint.position) end end for _, player in pairs(players) do assert(player.controller_type ~= defines.controllers.cutscene) if player.controller_type == defines.controllers.character then player.walking_state = {walking = false, direction = defines.direction.south} player.set_controller(scene) end end end local refresh_cutscene_playing = function() if not cutscene_data.playing then return end local playing_cutscene = false for _, player in pairs(game.players) do if player.controller_type == defines.controllers.cutscene then playing_cutscene = true break end end if not playing_cutscene then game.autosave_enabled = true cutscene_data.playing = false cutscene_data.last_waypoint = -1 end end cutscene.is_any_cutscene_playing = function() refresh_cutscene_playing() return cutscene_data.playing end cutscene.init = function() global.cutscene_data = cutscene_data end cutscene.on_load = function() cutscene_data = global.cutscene_data end cutscene.get_last_waypoint_reached = function() refresh_cutscene_playing() return cutscene_data.last_waypoint end cutscene.get_last_waypoint_reached_name = function() local last_index = cutscene.get_last_waypoint_reached() if cutscene_data.last_waypoints[last_index + 1] then return cutscene_data.last_waypoints[last_index + 1].name -- could be nil! end return nil end local on_cutscene_waypoint_reached = function(event) cutscene_data.last_waypoint = event.waypoint_index end local on_tick = function() if game.tick % (60 * 2) == 0 then refresh_cutscene_playing() -- make sure we always reenable autosaves end end cutscene.events = { [defines.events.on_cutscene_waypoint_reached] = on_cutscene_waypoint_reached, [defines.events.on_tick] = on_tick } return cutscene