1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2025-02-03 13:11:21 +02:00
RedRafe acc257b8b6
April fools maps (#1404)
* Upload pinguin scenario

* Fix relative path

* Pinguin scenario modularization

* Update enemy_turrets.lua

Added energy interface controls to limit power available to enemy laser turrets, with laser_shots_per_level constant for balancing.

* Update floor_is_lava.lua

Now spawns fire under players when level is half of max.

* Explosion Scare Module

Added explosion_scare module. Chooses players to randomly explode (non-damaging) a number of times before switching to new targets. Explosion intensity increases as module increases.

* Update pinguin.lua

Removed comment block over modules.

* Added New Module: permanent_factory

Has a very small chance to make an entity unminable and undestructible when placed.

* MeteOres

Added new module: MeteOres.
Spawns a random meteor that damages entities, creates ore, and spawns biters.

* Update meteOres.lua

Added explosion to meteor

* Added Auto Build

Added auto_build module. Selects random players, and automatically builds the item in their cursor nearby for a while, before changing targets.

* New module: Unorganized Recipes

Added a new module to hide recipe groups and subgroups for random players. This leads to "unorganized" crafting menus.

* Update auto_build.lua

Fixed typo. I must have changed base targets to 0 instead of the global level when preparing this file for commit.

* Add Biter Ores Module

Add new module. Spawns ores on death of biters, worms, and spawners, based on difficulty of biter and level.

looks for ores on the tile the biter dies on to add to, otherwise looks nearby for an ore type and uses that, otherwise decides on a new ore type to spawn.

This should allow players to set up "farms" for their ores, creating reasonable ore patches.

Contains a RANDOM_ORES constant that will make the search radius small and ensure random ores are placed instead.

* Update biter_ores.lua

Found typo. radius should be .1 not 1 for tile directly beneath biter.

* Updated Existing Modules

Got luacheck setup in my IDE so we don't have to wait for RedMew to run it. Fixed white-space and other linting errors.

* Split AF scenarios

* Add alien biomes module

* Draft april-fools scenarios

* Fix draft issues

---------

Co-authored-by: R. Nukem <Reoisasa@gmail.com>
2024-03-28 23:27:27 +00:00

241 lines
8.1 KiB
Lua

-- this file contains all information related to map generation and control of new features.
-- a new feature has a chance to be added or increased every time a research is completed
-- or a rocket is launched, until its max capacity
-- Setup the scenario map information because everyone gets upset if you don't
local ScenarioInfo = require 'features.gui.info'
ScenarioInfo.set_map_name('Pinguin')
ScenarioInfo.set_map_description('You are Pinguins in Antarctica!')
ScenarioInfo.set_map_extra_info('Watch out for Icebergs!')
--- Config
local config = global.config
config.currency = nil
config.market.enabled = false
config.player_rewards.enabled = false
config.redmew_qol.set_alt_on_create = false
local restart_command = require 'map_gen.maps.april_fools.scenario.restart_command'
restart_command({scenario_name = 'april-fools-2019'})
-- == MAP GEN =================================================================
local b = require 'map_gen.shared.builders'
local RS = require 'map_gen.shared.redmew_surface'
local MGSP = require 'resources.map_gen_settings'
--[[
Scale the map.
The pictures are originally quite large to preserve detail.
Will need to scale the map differently depending on which map you use.
Antarctica map at .5 scale: Antarctica is 46 chunks tall
Earth map at .5 scale: Antarctica is 4 chunks tall
]]
local map_scale = _DEBUG and 0.1 or 20
local pic = require 'map_gen.data.presets.antarctica'
-- local pic = require 'map_gen.data.presets.antarctica_earth'
local shape = b.picture(pic)
shape = b.scale(shape, map_scale, map_scale)
local map = b.change_tile(shape, false, 'deepwater')
-- Override map gen selections
RS.set_map_gen_settings({ MGSP.water_very_low })
-- == MODULES IMPORT ==========================================================
local Event = require 'utils.event'
local modules = {
require 'map_gen.maps.april_fools.modules.alternative_biters', -- Spawns a random biters on every player that has alt-mode turned on
require 'map_gen.maps.april_fools.modules.crazy_chat_colors', -- Chance to change player's color every time they send a message in chat
require 'map_gen.maps.april_fools.modules.crazy_toolbar', -- Randomly replaces quickbar slots with new items
require 'map_gen.maps.april_fools.modules.enemy_turrets', -- Chance to change turret to enemy force, and give it ammo/fuel/power
require 'map_gen.maps.april_fools.modules.floor_is_lava', -- Does minor damage to a player when afk for a few second
require 'map_gen.maps.april_fools.modules.golden_goose', -- Randomly selected players will drop coins for a time, before changing targets
require 'map_gen.maps.april_fools.modules.marathon_mode', -- Enables expensive recipes and increases technology multiplier
require 'map_gen.maps.april_fools.modules.orphan_crafting', -- Chance to give the player an additional single underground belt or pipe-to-ground
require 'map_gen.maps.april_fools.modules.random_ores', -- Chance to change an ore to a random ore when a mining drill is placed
require 'map_gen.maps.april_fools.modules.rotate_entities', -- Chance to randomly rotate an entity when rotated by a player
require 'map_gen.maps.april_fools.modules.rotate_inserters', -- Chance to randomly rotate an inserter when built
require 'map_gen.maps.april_fools.modules.rotten_egg', -- Randomly selected players will produce pollution for a time, before changing targets
}
-- if script.active_mods['redmew-data'] then
-- local PATH_MODULES_MOD = '__redmew-data__/'
-- table.insert(modules, PATH_MODULES_MOD .. 'name_of_the_module')
-- end
-- Activate module events
for _, mod in pairs(modules) do
if mod.on_init then
Event.on_init(mod.on_init)
end
if mod.on_load then
Event.on_load(mod.on_load)
end
if mod.on_configuration_changed then
Event.on_configuration_changed(mod.on_configuration_changed)
end
if mod.events then
for id_event, callback in pairs(mod.events) do
Event.add(id_event, callback)
end
end
if mod.on_nth_tick then
for nth_tick, callback in pairs(mod.on_nth_tick) do
Event.on_nth_tick(nth_tick, callback)
end
end
end
-- == CONTROLLER ==============================================================
local Toast = require 'features.gui.toast'
local ICEBERG_ENABLE_PERCENTAGE = 0.50
local TOAST_DURATION = 10
local function draw_random_effect(max_share)
local mod_index = math.random(1, #modules)
local mod = modules[mod_index]
if mod == nil then
return
end
local old_level, new_level, max_level = 0, 0, 0
if mod.level_get then
old_level = mod.level_get()
end
if mod.max_get then
max_level = mod.max_get()
end
if old_level < (max_level * max_share) then
if mod.level_increase then
mod.level_increase()
end
end
if mod.level_get then
new_level = mod.level_get()
end
if new_level == old_level then
Toast.toast_all_players(TOAST_DURATION, 'Everything seems normal... for now.')
game.print('There appears to be no change to the iceberg, lucky Pinguins.')
else
if new_level == 1 then
Toast.toast_all_players(TOAST_DURATION, 'More snow has fallen! A new layer has been added to the iceberg!')
else
Toast.toast_all_players(TOAST_DURATION, 'The iceberg shifts, but you don\'t notice anything new.')
end
game.print(mod.name .. ' level: ' .. tostring(new_level))
end
end
-- Features can be incremented up to 50% of max level with research
local function on_research_finished()
if math.random(100) <= 100 * ICEBERG_ENABLE_PERCENTAGE then
draw_random_effect(0.5)
else
Toast.toast_all_players(TOAST_DURATION, 'Everything seems normal... for now.')
game.print('There appears to be no change to the iceberg, lucky Pinguins.')
end
end
-- Features can be incremented up to 100% of max level with rocket launches
local function on_rocket_launched()
if math.random(100) <= 100 * 2 * ICEBERG_ENABLE_PERCENTAGE then
draw_random_effect(1)
else
Toast.toast_all_players(TOAST_DURATION, 'Everything seems normal... for now.')
game.print('There appears to be no change to the iceberg, lucky Pinguins.')
end
end
Event.add(defines.events.on_research_finished, on_research_finished)
Event.add(defines.events.on_rocket_launched, on_rocket_launched)
require 'map_gen.maps.april_fools.scenario.rocket_launched'
-- == COMMANDS ================================================================
local Command = require 'utils.command'
local Ranks = require 'resources.ranks'
local Color = require 'resources.color_presets'
---Use "/af-reset" to reset all features's levels (admin/server only)
Command.add(
'af-reset',
{
description = [[Reset all features]],
arguments = {},
required_rank = Ranks.admin,
allowed_by_server = true
},
function()
for _, mod in pairs(modules) do
if mod.level_reset then
mod.level_reset()
end
end
game.print('Scenario reset!', Color.success)
end
)
---Use "/af-debug" to print all feature's levels, only to admin (admin/server only)
Command.add(
'af-debug',
{
description = [[Prints all features's current levels]],
arguments = {},
required_rank = Ranks.admin,
allowed_by_server = true
},
function(_, player)
for _, mod in pairs(modules) do
local msg = ''
if mod.level_get and mod.max_get then
msg = msg .. 'Lvl. ' ..tostring(mod.level_get()) .. '/' .. tostring(mod.max_get())
end
if mod.name then
msg = msg .. ' - ' .. mod.name
end
if player and player.valid then
player.print(msg, Color.info)
else
game.print(msg, Color.info)
end
end
end
)
---Use "/af-max" to set all features to their max level (admin/server only)
Command.add(
'af-max',
{
description = [[Sets all features to according max level]],
arguments = {},
required_rank = Ranks.admin,
allowed_by_server = true
},
function()
for _, mod in pairs(modules) do
if mod.level_set and mod.max_get then
mod.level_set(mod.max_get())
end
end
game.print('Scenario maxed out!', Color.warning)
end
)
-- ============================================================================
return map