1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2025-03-27 21:48:52 +02:00

Minor changes to player_create

Allowing cutscenes to run before welcoming players via info gui and console messages.

Also includes a search limit for walls and rock to prevent the cutscene from running too far away from {0, 0}
This commit is contained in:
SimonFlapse 2019-06-09 23:59:16 +02:00
parent 003cd6c801
commit 85fc38fd3a
6 changed files with 193 additions and 61 deletions

View File

@ -170,6 +170,7 @@ global.config = {
'Welcome to this map created by the RedMew team. You can join our discord at: redmew.com/discord',
'Click the question mark in the top left corner for server information and map details.'
},
cutscene = false,
-- format is a table: {{message, weight}, {message, weight}}, where a higher weight has more chance to be shown
random_join_message_set = require 'resources.join_messages',
-- applied when cheat_mode is set to true

View File

@ -35,37 +35,47 @@ local function assert_type(expected_type, given, variable_reference_message)
end
end
function Public.register_cutscene_function(identifier, waypoints, func)
function Public.register_cutscene_function(identifier, waypoints, func, terminate_func)
assert_type('string', identifier, 'identifier of function cutscene_controller.register_cutscene_function')
assert_type('number', func, 'func of function cutscene_controller.register_cutscene_function')
assert_type('table', waypoints, 'waypoints of function cutscene_controller.register_cutscene_function')
cutscene_functions[identifier] = {func = func, waypoints = waypoints, update = false}
cutscene_functions[identifier] = {func = func, waypoints = waypoints, update = false, terminate_func = terminate_func}
end
function Public.register_running_cutscene(player_index, identifier, final_transition_time)
assert_type('number', player_index, 'player_index of function cutscene_controller.register_running_cutscene')
assert_type('string', identifier, 'identifier of function cutscene_controller.register_running_cutscene')
running_cutscenes[player_index] = cutscene_functions[identifier]
local player = game.get_player(player_index)
if not valid(player) then
return
end
if player.controller_type == defines.controllers.cutscene then
player.exit_cutscene()
end
running_cutscenes[player_index].character = player.character
player.set_controller {type = defines.controllers.ghost}
local cutscene_function = cutscene_functions[identifier]
if not cutscene_function then
return
end
local waypoints = cutscene_function.waypoints
if not waypoints then
return
end
running_cutscenes[player_index] = {
func = cutscene_function.func,
waypoints = waypoints,
update = cutscene_function.update,
final_transition_time = final_transition_time,
character = player.character,
terminate_func = cutscene_function.terminate_func,
rendering = {}
}
if player.controller_type == defines.controllers.cutscene then
player.exit_cutscene()
end
player.set_controller {type = defines.controllers.ghost}
final_transition_time = final_transition_time >= 0 and final_transition_time or 60
running_cutscenes[player_index].final_transition_time = final_transition_time
running_cutscenes[player_index].identifier = identifier
@ -101,7 +111,9 @@ local function restart_cutscene(player_index, waypoints, start_index)
waypoints = waypoints,
update = false,
final_transition_time = final_transition_time,
character = character
character = character,
terminate_func = current_running.terminate_func,
rendering = current_running.rendering
}
local player = game.get_player(player_index)
@ -165,11 +177,25 @@ local callback_function =
local reconnect_character =
Token.register(
function(params)
local player = game.get_player(params.player_index)
local player_index = params.player_index
local player = game.get_player(player_index)
local character = params.character
local func = params.func
if valid(player) and valid(character) then
player.exit_cutscene()
player.set_controller {type = defines.controllers.character, character = character}
if func then
Token.get(func)(player_index)
end
--game.print(serpent.block(params.rendering))
for _, v in pairs(params.rendering) do
--game.print('before valid: ' .. v)
if rendering.is_valid(v) then
--game.print('after valid: ' .. v)
rendering.destroy(v)
end
end
running_cutscenes[player_index] = nil
end
end
)
@ -187,11 +213,32 @@ function Public.terminate_cutscene(player_index, ticks)
reconnect_character,
{
player_index = player_index,
character = running_cutscene.character
character = running_cutscene.character,
func = running_cutscene.terminate_func,
rendering = running_cutscene.rendering
}
)
end
function Public.register_rendering_id(player_index, render_id)
if type(render_id) ~= 'table' then
render_id = {render_id}
end
local running_cutscene = running_cutscenes[player_index]
for _, id in pairs(render_id) do
--game.print('before valid: ' .. id)
if rendering.is_valid(id) then
--game.print('after valid: ' .. id)
if not running_cutscene then
--game.print('Error adding rendering id! ' .. id)
rendering.destroy(id)
else
table.insert(running_cutscenes[player_index].rendering, id)
end
end
end
end
handler = function(event)
local player_index = event.player_index
local waypoint_index = event.waypoint_index

View File

@ -71,7 +71,7 @@ function Public.draw_text(original_resolution, original_zoom, player_zoom, offse
local oiam = params.only_in_alt_mode
oiam = oiam or false
rendering.draw_text {
return rendering.draw_text {
text = {'', text},
color = color,
target = target,
@ -91,6 +91,7 @@ function Public.draw_text(original_resolution, original_zoom, player_zoom, offse
end
function Public.draw_multi_line_text(original_resolution, original_zoom, player_zoom, offset, texts, scale, player, params, draw_background)
local ids = {}
local height_scalar = player.display_resolution.height / original_resolution.height
local size = (0.0065 * player.display_resolution.height * scale) / (player_zoom * 32)
local tile_scalar = (original_zoom * 32) / (player_zoom * 32)
@ -100,14 +101,15 @@ function Public.draw_multi_line_text(original_resolution, original_zoom, player_
local right_bottom = {x = 40, y = ((size * 1.5) / tile_scalar / height_scalar) * #texts}
local background_params = params.background
background_params = background_params or params
Public.draw_rectangle(original_resolution, original_zoom, player_zoom, offset, left_top, right_bottom, player, background_params)
table.insert(ids, Public.draw_rectangle(original_resolution, original_zoom, player_zoom, offset, left_top, right_bottom, player, background_params))
draw_background = false
end
for i = 1, #texts do
Public.draw_text(original_resolution, original_zoom, player_zoom, offset, texts[i], scale, player, params, draw_background)
table.insert(ids, Public.draw_text(original_resolution, original_zoom, player_zoom, offset, texts[i], scale, player, params, draw_background))
offset.y = offset.y + (size * 1.5) / tile_scalar / height_scalar
end
return ids
end
function Public.draw_rectangle(original_resolution, original_zoom, player_zoom, offset, left_top, right_bottom, player, params)
@ -163,7 +165,7 @@ function Public.draw_rectangle(original_resolution, original_zoom, player_zoom,
local oiam = params.only_in_alt_mode
oiam = oiam or false
rendering.draw_rectangle {
return rendering.draw_rectangle {
color = color,
width = width,
filled = filled,
@ -182,7 +184,7 @@ end
function Public.blackout(player, zoom, ttl, color)
local left_top = {x = -40, y = -22.5}
local right_bottom = {x = 40, y = 22.5}
Public.draw_rectangle({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 0}, left_top, right_bottom, player, {color = color, time_to_live = ttl})
return Public.draw_rectangle({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 0}, left_top, right_bottom, player, {color = color, time_to_live = ttl})
end
return Public

View File

@ -6,25 +6,10 @@ local pairs = pairs
local get_random_weighted = table.get_random_weighted
local function player_created(event)
local Public = {}
function Public.show_start_up(player)
local config = global.config.player_create
local player = game.get_player(event.player_index)
if not player or not player.valid then
return
end
-- ensure the top menu is correctly styled
local gui = player.gui
gui.top.style = 'slot_table_spacing_horizontal_flow'
gui.left.style = 'slot_table_spacing_vertical_flow'
local player_insert = player.insert
for _, item in pairs(config.starting_items) do
player_insert(item)
end
local p = player.print
for _, message in pairs(config.join_messages) do
p(message)
@ -48,12 +33,29 @@ local function player_created(event)
elseif not _DEBUG and not game.is_multiplayer() then
player.print('To change your name in single-player, open chat and type the following /c game.player.name = "your_name"')
end
end
-- Remove 2019-03-04
if player.admin then
player.print('## - Regular commands have changed. /regular <player_name> to promote /regular-remove <player_name> to demote.')
local function player_created(event)
local config = global.config.player_create
local player = game.get_player(event.player_index)
if not player or not player.valid then
return
end
-- ensure the top menu is correctly styled
local gui = player.gui
gui.top.style = 'slot_table_spacing_horizontal_flow'
gui.left.style = 'slot_table_spacing_vertical_flow'
local player_insert = player.insert
for _, item in pairs(config.starting_items) do
player_insert(item)
end
if not config.cutscene then
Public.show_start_up(player)
end
--End remove
end
Event.add(defines.events.on_player_created, player_created)
@ -125,3 +127,5 @@ if _CHEATS then
Event.add(defines.events.on_player_created, player_created_cheat_mode)
end
return Public

View File

@ -18,10 +18,6 @@ local Config = {
night_time = {
enabled = true -- true = No Daylight, false = Day/night circle (Solar panels work)
},
-- controls the introduction cutscene
cutscene = {
enabled = true
},
-- controls setting up the players
setup_player = {
enabled = true,
@ -53,6 +49,10 @@ local Config = {
starting_items = {}
}
},
-- controls the introduction cutscene
cutscene = {
enabled = true
},
-- core feature
diggy_hole = {
enabled = true,

View File

@ -5,28 +5,63 @@ local Cutscene = require 'features.cutscene.cutscene_controller'
local Rendering = require 'features.cutscene.renderings'
local RS = require 'map_gen.shared.redmew_surface'
local Color = require 'resources.color_presets'
local PC = require 'features.player_create'
local Command = require 'utils.command'
local DiggyCutscene = {}
local play_sound_delayed =
Token.register(
function(params)
params.player.play_sound {path = params.path}
end
)
local function play_sound(player, path, times, delay, initial_delay)
if not game.is_valid_sound_path(path) then
return
end
times = times or 1
if times == 1 and not delay and initial_delay then
delay = initial_delay
end
if times > 1 or delay then
delay = delay or 20
initial_delay = initial_delay or 0
for i = 1, times, 1 do
Task.set_timeout_in_ticks(initial_delay + delay * i, play_sound_delayed, {player = player, path = path})
end
else
player.play_sound {path = path}
end
end
local function cutscene_function(player_index, waypoint_index, params)
local cases = {}
local player = game.players[player_index]
local ttw = params.time_to_wait
local zoom = params.zoom
--game.print('index: ' .. waypoint_index .. ' | position:' .. serpent.block(params.position) .. ' | trans_time: ' .. params.transition_time .. ' | ttw: ' .. ttw .. ' | zoom: ' .. zoom)
if waypoint_index ~= -1 or waypoint_index ~= 6 then
play_sound(player, 'utility/list_box_click', 1)
--play_sound(player, 'utility/inventory_move', 1, 10)
end
cases[-1] = function()
player.clear_console()
player.gui.center.clear()
Rendering.blackout(player, zoom, ttw + 1)
Rendering.draw_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = -16}, 'Diggy', 10, player, {time_to_live = ttw, color = Color.yellow}, false)
play_sound(player, 'utility/game_won')
play_sound(player, 'ambient/first-light', 1, 400)
Cutscene.register_rendering_id(player_index, Rendering.blackout(player, zoom, ttw + 1))
Cutscene.register_rendering_id(player_index, Rendering.draw_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = -16}, 'Diggy', 10, player, {time_to_live = ttw, color = Color.yellow}, false))
local multi_params = {time_to_live = ttw}
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = -5}, {'Welcome to Diggy', '---------------------', 'This is a custom scenario developed by Redmew', 'Join us at www.redmew.com/discord'}, 5, player, multi_params, multi_params, false)
Rendering.draw_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 10}, 'The following introduction will help you get started!', 3, player, {time_to_live = ttw}, false)
Cutscene.register_rendering_id(
player_index,
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = -5}, {'Welcome to Diggy', '---------------------', 'This is a custom scenario developed by Redmew', 'Join us at www.redmew.com/discord'}, 5, player, multi_params, multi_params, false)
)
Cutscene.register_rendering_id(player_index, Rendering.draw_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 10}, 'The following introduction will help you get started!', 3, player, {time_to_live = ttw}, false))
Cutscene.register_rendering_id(player_index, Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 13}, {'Use the /skip command if you wish to skip this introduction', 'You can always replay this introduction by using the /replay command'}, 1.5, player, {time_to_live = ttw}, {time_to_live = ttw}, false))
end
cases[0] = function()
Rendering.draw_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, 'This is the starting area', 2.5, player, {time_to_live = ttw}, true)
local entity = RS.get_surface().find_entities_filtered {name = 'stone-wall', limit = 1}
Cutscene.register_rendering_id(player_index, Rendering.draw_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, 'This is the starting area', 2.5, player, {time_to_live = ttw}, true))
local entity = RS.get_surface().find_entities_filtered {position = {0,0}, radius = 20, name = 'stone-wall', limit = 1}
if entity[1] then
--game.print('Found wall')
local position = entity[1].position
@ -41,31 +76,53 @@ local function cutscene_function(player_index, waypoint_index, params)
end
end
cases[1] = function()
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'Expanding the mine is dangerous!', '', 'Walls are used to keep the cave roof from crushing us'}, 2.5, player, {time_to_live = ttw}, true)
play_sound(player, 'utility/build_small')
Cutscene.register_rendering_id(player_index, Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'Expanding the mine is dangerous!', '', 'Walls are used to keep the cave roof from crushing us'}, 2.5, player, {time_to_live = ttw}, true))
end
cases[2] = function()
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'The market provides extra supplies', '', 'You unlock new items when you level up'}, 2.5, player, {time_to_live = ttw}, true)
Cutscene.register_rendering_id(player_index, Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'The market provides extra supplies', '', 'You unlock new items when you level up'}, 2.5, player, {time_to_live = ttw}, true))
end
cases[3] = function()
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {"Cave ins happens frequently when you don't add supports", '', 'Different types of brick and concrete can reinforce our support pillars!'}, 2.5, player, {time_to_live = ttw}, true)
local position = RS.get_surface().find_entities_filtered {name = 'rock-big', limit = 1}[1].position
Cutscene.register_rendering_id(
player_index,
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {"Cave ins happens frequently when you don't add supports", '', 'Different types of brick and concrete can reinforce our support pillars!'}, 2.5, player, {time_to_live = ttw}, true)
)
local radius = 25
local entity
repeat
entity = RS.get_surface().find_entities_filtered {position = {0,0}, radius = radius, name = 'rock-big', limit = 1}
radius = radius + 25
until entity[1] or radius >= 200
local position = {0, 3.5}
local way_zoom = 0.4
if entity[1] then
position = entity[1].position
way_zoom = 5
end
local waypoint = {
-- case 4
position = position,
transition_time = 120,
time_to_wait = 300,
zoom = 5
zoom = way_zoom
}
Cutscene.inject_waypoint(player_index, waypoint, 6)
end
cases[4] = function()
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'This world contains brittle rocks', '', 'Our tools are too powerful to preserve any resources from destroying them'}, 2.5, player, {time_to_live = ttw}, true)
play_sound(player, 'utility/axe_mining_ore', 3, 35)
Cutscene.register_rendering_id(
player_index,
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'This world contains brittle rocks', '', 'Our tools are too powerful to preserve any resources from destroying them'}, 2.5, player, {time_to_live = ttw}, true)
)
end
cases[5] = function()
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'The native population is lurking in the dark', '', 'Be wary when digging, always bring along some defences'}, 2.5, player, {time_to_live = ttw}, true)
play_sound(player, 'utility/axe_fighting', 4, 25, 10)
play_sound(player, 'worm-sends-biters', 1, 60)
Cutscene.register_rendering_id(player_index, Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'The native population is lurking in the dark', '', 'Be wary when digging, always bring along some defences'}, 2.5, player, {time_to_live = ttw}, true))
end
cases[6] = function()
Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'This concludes the introduction', '', 'Have fun and keep digging!'}, 2.5, player, {time_to_live = ttw}, true)
Cutscene.register_rendering_id(player_index, Rendering.draw_multi_line_text({height = 1440, width = 2560}, 1, zoom, {x = 0, y = 18}, {'This concludes the introduction', '', 'Have fun and keep digging!'}, 2.5, player, {time_to_live = ttw}, true))
play_sound(player, 'utility/tutorial_notice', 1)
end
local case = cases[waypoint_index]
if case then
@ -78,7 +135,7 @@ local waypoints = {
-- case -1
position = {x = 0, y = 0},
transition_time = 60,
time_to_wait = 600,
time_to_wait = 400,
zoom = 0.5
},
{
@ -126,7 +183,11 @@ local waypoints = {
}
}
Cutscene.register_cutscene_function('Diggy_Welcome', waypoints, Token.register(cutscene_function))
local function terminate_function(player_index)
PC.show_start_up(game.get_player(player_index))
end
Cutscene.register_cutscene_function('Diggy_Welcome', waypoints, Token.register(cutscene_function), Token.register(terminate_function))
local start_cutscene =
Token.register(
@ -136,6 +197,8 @@ local start_cutscene =
)
function DiggyCutscene.register()
global.config.player_create.cutscene = true
Event.add(
defines.events.on_player_created,
function(event)
@ -144,4 +207,19 @@ function DiggyCutscene.register()
)
end
local function replay_handler(_, player)
Token.get(start_cutscene)({event = {player_index = player.index}})
end
Command.add(
'replay',
{
description = 'Replays the introduction cutscene',
capture_excess_arguments = false,
allowed_by_server = false
},
replay_handler
)
return DiggyCutscene