226 lines
5.3 KiB
Text
226 lines
5.3 KiB
Text
###########################################################
|
|
# Aurora Borealis manager
|
|
#
|
|
# this runs once at startup to randomize Aurora appearance
|
|
# a little and otherwise simulates detailed Aurora evolution
|
|
# only when requested by the user
|
|
###########################################################
|
|
|
|
var aurora_manager = {
|
|
|
|
running_flag : 0,
|
|
|
|
storm_probability: 0.1,
|
|
storm_flag: 0,
|
|
storm_duration: 0,
|
|
storm_timer: 0,
|
|
|
|
afterglow_flag: 0,
|
|
afterglow_timer: 0,
|
|
|
|
strength_bg: 0,
|
|
strength_target: 0,
|
|
strength_current: 0,
|
|
strength_rate: 0.015,
|
|
|
|
ray_bg: 0,
|
|
ray_target: 0,
|
|
ray_current: 0,
|
|
ray_rate: 0.005,
|
|
|
|
glow_bg: 0,
|
|
glow_target: 0,
|
|
glow_current: 0,
|
|
glow_rate: 0.02,
|
|
|
|
upper_bg: 0,
|
|
upper_target: 0,
|
|
upper_current: 0,
|
|
upper_rate: 0.025,
|
|
|
|
delta_t: 0.1,
|
|
|
|
|
|
init: func {
|
|
|
|
var rn = rand();
|
|
setprop("/environment/aurora/penetration-factor", rn);
|
|
|
|
rn = rand();
|
|
setprop("/environment/aurora/ray-factor", 0.8 * rn);
|
|
me.ray_bg = 0.4 * rn;
|
|
|
|
rn = rand();
|
|
setprop("/environment/aurora/patchiness", rn);
|
|
|
|
rn = rand();
|
|
setprop("/environment/aurora/upper-alt-factor", rn);
|
|
me.upper_bg = 0.5 * rn;
|
|
|
|
me.strength_bg = 0.4 * rand();
|
|
|
|
me.strength_rate = me.strength_rate * me.delta_t;
|
|
me.ray_rate = me.ray_rate * me.delta_t;
|
|
me.glow_rate = me.glow_rate * me.delta_t;
|
|
me.upper_rate = me.upper_rate * me.delta_t;
|
|
|
|
# me.storm_probability = me.storm_probability * me.delta_t;
|
|
|
|
|
|
},
|
|
|
|
state: func {
|
|
|
|
var state = getprop("/environment/aurora/aurora-manager");
|
|
print("Aurora state manager");
|
|
if (state == 1) {me.start();}
|
|
else {me.stop();}
|
|
|
|
},
|
|
|
|
start: func {
|
|
|
|
if (me.running_flag == 1) {return;}
|
|
|
|
print("Starting aurora manager.");
|
|
|
|
me.running_flag = 1;
|
|
me.ray_target = me.ray_bg;
|
|
me.upper_target = me.upper_bg;
|
|
me.strength_target = getprop("/environment/aurora/set-strength");
|
|
me.ray_current = me.ray_target;
|
|
me.upper_current = me.ray_target;
|
|
me.strength_current = me.ray_target;
|
|
|
|
|
|
me.update();
|
|
|
|
},
|
|
|
|
stop: func {
|
|
|
|
me.running_flag = 0;
|
|
print("Stopping aurora manager.");
|
|
|
|
|
|
},
|
|
|
|
update: func {
|
|
|
|
if (me.running_flag == 0) {return;}
|
|
|
|
|
|
if ((rand() < me.storm_probability) and (me.storm_flag == 0) and (me.afterglow_flag == 0))# init auroral storm
|
|
{
|
|
me.storm_flag = 1;
|
|
me.storm_timer = 0;
|
|
me.storm_duration = 60.0 + rand() * 120.0;
|
|
me.storm_duration *= 0.4;
|
|
print("Auroral storm duration: ", me.storm_duration, " s");
|
|
}
|
|
|
|
if (me.storm_flag == 1)
|
|
{
|
|
if (me.storm_timer < me.storm_duration)
|
|
{
|
|
me.strength_target = 1.0;
|
|
me.ray_target = 0.7;
|
|
me.upper_target = 1.0;
|
|
}
|
|
else
|
|
{
|
|
me.ray_target = me.ray_bg;
|
|
me.storm_flag = 0;
|
|
me.afterglow_timer = 0;
|
|
me.afterglow_flag = 1;
|
|
}
|
|
|
|
me.storm_timer = me.storm_timer + me.delta_t;
|
|
}
|
|
if (me.afterglow_flag == 1)
|
|
{
|
|
if (me.afterglow_timer < 60)
|
|
{
|
|
me.glow_target = 1.0 - me.strength_bg;
|
|
}
|
|
else if (me.afterglow_timer < 120)
|
|
{
|
|
me.upper_target = me.upper_bg;
|
|
me.strength_target = me.strength_bg;
|
|
me.glow_target = 0.0;
|
|
}
|
|
else
|
|
{
|
|
me.afterglow_flag = 0;
|
|
}
|
|
|
|
me.afterglow_timer = me.afterglow_timer + me.delta_t;
|
|
}
|
|
|
|
|
|
me.evolve();
|
|
|
|
|
|
settimer (func me.update(), me.delta_t);
|
|
|
|
},
|
|
|
|
|
|
evolve: func {
|
|
|
|
|
|
if (me.strength_current < me.strength_target)
|
|
{
|
|
me.strength_current = me.strength_current + me.strength_rate;
|
|
if (me.strength_current > me.strength_target) {me.strength_current = me.strength_target;}
|
|
}
|
|
else if (me.strength_current > me.strength_target)
|
|
{
|
|
me.strength_current = me.strength_current - me.strength_rate;
|
|
if (me.strength_current < me.strength_target) {me.strength_current = me.strength_target;}
|
|
}
|
|
|
|
if (me.ray_current < me.ray_target)
|
|
{
|
|
me.ray_current = me.ray_current + me.ray_rate;
|
|
if (me.ray_current > me.ray_target) {me.ray_current = me.ray_target;}
|
|
}
|
|
else if (me.ray_current > me.ray_target)
|
|
{
|
|
me.ray_current = me.ray_current - me.ray_rate;
|
|
if (me.ray_current < me.ray_target) {me.ray_current = me.ray_target;}
|
|
}
|
|
|
|
if (me.upper_current < me.upper_target)
|
|
{
|
|
me.upper_current = me.upper_current + me.upper_rate;
|
|
if (me.upper_current > me.upper_target) {me.upper_current = me.upper_target;}
|
|
}
|
|
else if (me.upper_current > me.upper_target)
|
|
{
|
|
me.upper_current = me.upper_current - me.upper_rate;
|
|
if (me.upper_current < me.upper_target) {me.upper_current = me.upper_target;}
|
|
}
|
|
|
|
if (me.glow_current < me.glow_target)
|
|
{
|
|
me.glow_current = me.glow_current + me.glow_rate;
|
|
if (me.glow_current > me.glow_target) {me.glow_current = me.glow_target;}
|
|
}
|
|
else if (me.glow_current > me.glow_target)
|
|
{
|
|
me.glow_current = me.glow_current - me.glow_rate;
|
|
if (me.glow_current < me.glow_target) {me.glow_current = me.glow_target;}
|
|
}
|
|
|
|
setprop("/environment/aurora/set-strength", me.strength_current);
|
|
setprop("/environment/aurora/ray-factor", me.ray_current);
|
|
setprop("/environment/aurora/upper-alt-factor", me.upper_current);
|
|
setprop("/environment/aurora/afterglow", me.glow_current);
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
aurora_manager.init();
|