Add events

master
Corvus262 2022-08-05 15:42:33 +02:00
parent eb7fd3cb9e
commit 76f15ea1bd
5 changed files with 218 additions and 70 deletions

149
biome.lua
View File

@ -1,57 +1,16 @@
-- Functions and data related to the biome mode
skygen.biome_names = {
"cold_desert",
"cold_desert_under",
"cold_desert_ocean",
"desert",
"desert_ocean",
"desert_under",
"taiga",
"taiga_ocean",
"taiga_under",
"snowy_grassland",
"snowy_grassland_under",
"snowy_grassland_ocean",
"grassland",
"grassland_ocean",
"grassland_dunes",
"grassland_under",
"coniferous_forest",
"coniferous_forest_dunes",
"coniferous_forest_ocean",
"coniferous_forest_under",
"deciduous_forest",
"deciduous_forest_ocean",
"deciduous_forest_under",
"deciduous_forest_shore",
"rainforest",
"rainforest_ocean",
"rainforest_swamp",
"rainforest_under",
"icesheet",
"icesheet_ocean",
"icesheet_under",
"tundra",
"tundra_highland",
"tundra_beach",
"tundra_ocean",
"tundra_under",
"sandstone_desert",
"sandstone_desert_ocean",
"sandstone_desert_under",
"savanna",
"savanna_shore",
"savanna_ocean",
"savanna_under"
}
-- Functions related to the biome mode
skygen.previous_biome = {}
skygen.transition_frames = 16
skygen.set_sky = function(player, biome_name)
local base_values = skygen.biomes[biome_name].colors
local base_values = {}
if skygen.event == "none" then
base_values = skygen.biomes[biome_name].colors
else
base_values = skygen.biomes[biome_name].event_colors
end
player:set_sky({
type = "regular",
sky_color = {
@ -72,8 +31,13 @@ end
skygen.init_transition = function(player, prev_biome_name, biome_name)
skygen.sky_state[player:get_player_name()] = "transition"
local base_colors = {}
base_colors[1] = skygen.biomes[prev_biome_name].colors[3] -- Sun tint
base_colors[2] = skygen.biomes[prev_biome_name].colors[4] -- Moon tint
if skygen.event == "none" then
base_colors[1] = skygen.biomes[prev_biome_name].colors[3] -- Sun tint
base_colors[2] = skygen.biomes[prev_biome_name].colors[4] -- Moon tint
else
base_colors[1] = skygen.biomes[prev_biome_name].event_colors[3] -- Sun tint
base_colors[2] = skygen.biomes[prev_biome_name].event_colors[4] -- Moon tint
end
local base_params = {}
base_params[1] = minetest.registered_biomes[prev_biome_name].heat_point
base_params[2] = minetest.registered_biomes[prev_biome_name].humidity_point
@ -99,16 +63,34 @@ skygen.transition = function(player, base_colors, base_params, color_diffs, para
end
local sun = base_colors[1]
local moon = base_colors[2]
local cloud_color = {}
if skygen.event == "none" then
cloud_color = {r = 255, g = 255, b = 255, a = 255 * humidity}
else
local colorset = skygen.event_data[skygen.event].color_cloud
cloud_color = {r = colorset[1], g = colorset[2], b = colorset[3], a = 255 * humidity}
end
player:set_clouds({
density = humidity/1.5,
color = {r = 255, g = 255, b = 255, a = 255 * humidity},
color = cloud_color,
thickness = humidity * 80
})
local sun_texture
local moon_texture
if skygen.event ~= "none" then
sun_texture = skygen.event_data[skygen.event].sun_texture
moon_texture = skygen.event_data[skygen.event].moon_texture
else
sun_texture = "sun.png"
moon_texture = "moon.png"
end
player:set_sun({
scale = ((heat/255) + 0.1)*2
texture = sun_texture,
scale = ((heat/255) + 0.1)*2,
})
player:set_moon({
scale = ((heat/255) + 0.1)*4
texture = moon_texture,
scale = ((heat/255) + 0.1)*4,
})
if skygen.colorize_stars == true then
player:set_stars({
@ -116,9 +98,9 @@ skygen.transition = function(player, base_colors, base_params, color_diffs, para
count = (1.5 - humidity) * 4 * 10
})
else
player:set_stars(
player:set_stars({
count = (1.5 - humidity) * 4 * 10
)
})
end
minetest.after(1 / skygen.transition_frames, function()
skygen.transition(player, base_colors, base_params, color_diffs, param_diffs, progress, biome)
@ -137,20 +119,43 @@ skygen.colorize = function(color, colorizer, amount)
end
skygen.set_all = function(player, biome_name) -- For initial case
sun = skygen.biomes[biome_name].colors[3] -- Sun tint
moon = skygen.biomes[biome_name].colors[4] -- Moon tint
if skygen.event == "none" then
sun = skygen.biomes[biome_name].colors[3] -- Sun tint
moon = skygen.biomes[biome_name].colors[4] -- Moon tint
else
sun = skygen.biomes[biome_name].event_colors[3] -- Sun tint
moon = skygen.biomes[biome_name].event_colors[4] -- Moon tint
end
heat = minetest.registered_biomes[biome_name].heat_point*2.55
humidity = minetest.registered_biomes[biome_name].humidity_point/100
local cloud_color = {}
if skygen.event == "none" then
cloud_color = {r = 255, g = 255, b = 255, a = 255 * humidity}
else
local colorset = skygen.event_data[skygen.event].color_cloud
cloud_color = {r = colorset[1], g = colorset[2], b = colorset[3], a = 255 * humidity}
end
player:set_clouds({
density = humidity/1.5,
color = {r = 255, g = 255, b = 255, a = 255 * humidity},
color = cloud_color,
thickness = humidity * 80
})
local sun_texture
local moon_texture
if skygen.event ~= "none" then
sun_texture = skygen.event_data[skygen.event].sun_texture
moon_texture = skygen.event_data[skygen.event].moon_texture
else
sun_texture = "sun.png"
moon_texture = "moon.png"
end
player:set_sun({
scale = ((heat/255) + 0.1)*2
texture = sun_texture,
scale = ((heat/255) + 0.1)*2,
})
player:set_moon({
scale = ((heat/255) + 0.1)*4
texture = moon_texture,
scale = ((heat/255) + 0.1)*4,
})
if skygen.colorize_stars == true then
player:set_stars({
@ -165,9 +170,16 @@ end
skygen.set_clouds = function(player, biome_name) -- Cause minetest sets them to default every now and then
local heat = minetest.registered_biomes[biome_name].heat_point*2.55
local humidity = minetest.registered_biomes[biome_name].humidity_point/100
local cloud_color = {}
if skygen.event == "none" then
cloud_color = {r = 255, g = 255, b = 255, a = 255 * humidity}
else
local colorset = skygen.event_data[skygen.event].color_cloud
cloud_color = {r = colorset[1], g = colorset[2], b = colorset[3], a = 255 * humidity}
end
player:set_clouds({
density = humidity/1.5,
color = {r = 255, g = 255, b = 255, a = 255 * humidity},
color = cloud_color,
thickness = humidity * 80
})
end
@ -185,11 +197,18 @@ end
skygen.get_color_diffs = function(prev_biome_name, biome_name)
local prev_colorset = {}
prev_colorset[1] = skygen.biomes[prev_biome_name].colors[3] -- Sun tint
prev_colorset[2] = skygen.biomes[prev_biome_name].colors[4] -- Moon tint
local colorset = {}
colorset[1] = skygen.biomes[biome_name].colors[3] -- Sun tint
colorset[2] = skygen.biomes[biome_name].colors[4] -- Moon tint
if skygen.event == "none" then
prev_colorset[1] = skygen.biomes[prev_biome_name].colors[3] -- Sun tint
prev_colorset[2] = skygen.biomes[prev_biome_name].colors[4] -- Moon tint
colorset[1] = skygen.biomes[biome_name].colors[3] -- Sun tint
colorset[2] = skygen.biomes[biome_name].colors[4] -- Moon tint
else
prev_colorset[1] = skygen.biomes[prev_biome_name].event_colors[3] -- Sun tint
prev_colorset[2] = skygen.biomes[prev_biome_name].event_colors[4] -- Moon tint
colorset[1] = skygen.biomes[biome_name].event_colors[3] -- Sun tint
colorset[2] = skygen.biomes[biome_name].event_colors[4] -- Moon tint
end
local result = {{}, {}}
for k=1,2 do
for i=1,3 do

View File

@ -5,6 +5,52 @@
-- Stars are colorized using the sun tint as well
-- Clouds are changed in three different functions already and colorizing them would be a bit more expensive due to the required transition functions
skygen.biome_names = {
"cold_desert",
"cold_desert_under",
"cold_desert_ocean",
"desert",
"desert_ocean",
"desert_under",
"taiga",
"taiga_ocean",
"taiga_under",
"snowy_grassland",
"snowy_grassland_under",
"snowy_grassland_ocean",
"grassland",
"grassland_ocean",
"grassland_dunes",
"grassland_under",
"coniferous_forest",
"coniferous_forest_dunes",
"coniferous_forest_ocean",
"coniferous_forest_under",
"deciduous_forest",
"deciduous_forest_ocean",
"deciduous_forest_under",
"deciduous_forest_shore",
"rainforest",
"rainforest_ocean",
"rainforest_swamp",
"rainforest_under",
"icesheet",
"icesheet_ocean",
"icesheet_under",
"tundra",
"tundra_highland",
"tundra_beach",
"tundra_ocean",
"tundra_under",
"sandstone_desert",
"sandstone_desert_ocean",
"sandstone_desert_under",
"savanna",
"savanna_shore",
"savanna_ocean",
"savanna_under"
}
skygen.biomes = {
cold_desert = {
name = "Cold Desert",

12
events.lua Normal file
View File

@ -0,0 +1,12 @@
-- Event data here
skygen.event_data.test = {
description = "Test",
moon = "moonfall_moon.png",
sun = "sun.png^[colorize:#FFFFFF",
color = {0, 255, 0},
color_night = {0, 255, 0},
color_cloud = {255, 0, 0},
color_sun = {0, 255, 0},
color_moon = {0, 255, 0},
}

View File

@ -6,10 +6,15 @@ skygen.save_timer = 0
skygen.save_interval = 1000
skygen.sky_state = {}
skygen.active = true
skygen.event = "none"
skygen.events = {"test"} -- Add event names here
skygen.skybox_names = {"test_sky"} -- Add skybox names here
skygen.skyboxes = {}
skygen.event_data = {}
skygen.save_file = minetest.get_worldpath() .. "/skygen"
skygen.event_save_file = minetest.get_worldpath() .. "/skygen_event"
skygen.colorize_stars = true
@ -18,12 +23,20 @@ local skybox_path = minetest.get_modpath("skygen") .. "/skyboxes"
dofile(path.."/colors.lua")
dofile(path.."/biome.lua")
dofile(path.."/skybox.lua")
dofile(path.."/events.lua")
for i=1,#skygen.skybox_names do
dofile(skybox_path .. "/" .. skygen.skybox_names[i] .. "/skydef.lua")
end
function skygen.load_saves()
local event_input = io.open(skygen.event_save_file, "r")
if not event_input then
return
else
skygen.event = event_input:read("*a")
end
event_input:close()
local input = io.open(skygen.save_file, "r")
if not input then
return
@ -38,7 +51,6 @@ function skygen.load_saves()
skygen.sky_state[name] = state
skygen.skybox_status[name] = skybox
end
print(dump(skygen.sky_state))
input:close()
end
@ -61,9 +73,21 @@ function skygen.save()
return true
end
function skygen.event_save()
local data = {}
local output = io.open(skygen.event_save_file, "w")
if output then
output:write(skygen.event)
io.close(output)
return true
end
return true
end
skygen.load_saves()
minetest.register_on_shutdown(function()
skygen.save()
skygen.event_save()
end)
minetest.register_on_leaveplayer(function(player)
@ -118,11 +142,34 @@ minetest.register_globalstep(function()
biome_colors[7] = skygen.colorize(biome_colors[1], biome_colors[4], 0.75) -- Night
biome_colors[8] = skygen.colorize(biome_colors[2], biome_colors[4], 0.75) -- Night Horizon
end
skygen.sky_globalstep(players)
if skygen.event == "none" then
skygen.sky_globalstep(players)
else
for i=1,#skygen.events do
if skygen.event == skygen.events[i] then
for i=1, #skygen.biome_names do
local biome_name = skygen.biome_names[i]
local biome_colors = skygen.biomes[biome_name].colors
local event_biome_colors = {}
event_biome_colors[1] = skygen.colorize(biome_colors[1], skygen.event_data[skygen.event].color, 0.75) -- Day
event_biome_colors[2] = skygen.colorize(biome_colors[2], skygen.event_data[skygen.event].color, 0.75) -- Day Horizon
event_biome_colors[3] = skygen.colorize(biome_colors[3], skygen.event_data[skygen.event].color_sun, 0.75) -- Sun
event_biome_colors[4] = skygen.colorize(biome_colors[4], skygen.event_data[skygen.event].color_moon, 0.75) -- Moon
event_biome_colors[5] = skygen.colorize(biome_colors[5], skygen.event_data[skygen.event].color_sun, 0.75) -- Dawn
event_biome_colors[6] = skygen.colorize(biome_colors[6], skygen.event_data[skygen.event].color_sun, 0.75) -- Dawn Horizon
event_biome_colors[7] = skygen.colorize(biome_colors[7], skygen.event_data[skygen.event].color_night, 0.75) -- Night
event_biome_colors[8] = skygen.colorize(biome_colors[8], skygen.event_data[skygen.event].color_night, 0.75) -- Night Horizon
skygen.biomes[biome_name].event_colors = event_biome_colors
end
end
end
skygen.sky_globalstep(players)
end
else
skygen.sky_globalstep(players)
if (skygen.save_timer > skygen.save_interval) then
skygen.save()
skygen.event_save()
skygen.save_timer = 0
else
skygen.save_timer = skygen.save_timer + 1
@ -153,16 +200,40 @@ minetest.register_chatcommand("skygen", {
end
if parameters[1] == "off" then
skygen.deactivate(name)
minetest.chat_send_player("The sky is now set to be Minetest default")
minetest.chat_send_player(name, "The sky is now set to be Minetest default")
elseif parameters[1] == "biome" then
skygen.biome_mode(name)
minetest.chat_send_player("The sky is now set to be biome-adaptive")
minetest.chat_send_player(name, "The sky is now set to be biome-adaptive")
elseif parameters[1] == "skybox" then
for i=1, #skygen.skybox_names do
if skygen.skybox_names[i] == parameters[2] then
local sky_description = skygen.skyboxes[parameters[2]].description
skygen.set_skybox(minetest.get_player_by_name(name), parameters[2])
minetest.chat_send_player("The sky is now set to be a skybox, " .. sky_description)
minetest.chat_send_player(name, "The sky is now set to be a skybox, " .. sky_description)
end
end
end
end
})
minetest.register_chatcommand("skygen_event", {
params = "<event_name>",
description = "Initiate an event",
func = function(name, param)
if param == "deactivate" then
if skygen.event ~= "none" then
local previous_event = skygen.event_data[skygen.event].description
minetest.chat_send_all("The " .. previous_event .. " has ended!")
skygen.event = "none"
skygen.start = 1
end
else
for i=1,#skygen.events do
if skygen.events[i] == param then
local new_event = skygen.event_data[param].description
skygen.event = param
skygen.start = 1
minetest.chat_send_all("The " .. new_event .. " has arrived!")
end
end
end

BIN
textures/moonfall_moon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB