52 lines
1.6 KiB
Text
52 lines
1.6 KiB
Text
# system.ludic - the effects as a system: reset, a tick in game hours, and its own save section
|
|
export function effects_reset(effects_st: mut EffectsState) -> void {
|
|
effects_clear(effects_st)
|
|
q_clear(effects_ended(effects_st))
|
|
}
|
|
|
|
function effects_tick(effects_st: mut EffectsState, t: Tick) -> void { effects_run(effects_st, t.hours * 60.0) }
|
|
|
|
export function effects_save(effects_st: EffectsState) -> Val {
|
|
let l = Value.list()
|
|
let all = ef_all(effects_st)
|
|
for i in 0 .. len(all) {
|
|
let o = Value.object()
|
|
sv_put_int(o, "k", all[i].kind)
|
|
sv_put_float(o, "m", all[i].mag)
|
|
sv_put_float(o, "t", all[i].left)
|
|
sv_put_float(o, "d", all[i].delay)
|
|
sv_put_bool(o, "b", all[i].bonus)
|
|
sv_put_str(o, "l", all[i].label)
|
|
Value.add(l, o)
|
|
}
|
|
let v = Value.object()
|
|
Value.put(v, "list", l)
|
|
return v
|
|
}
|
|
|
|
export function effects_load(effects_st: mut EffectsState, v: Val, version: int) -> void {
|
|
effects_clear(effects_st)
|
|
if Value.has(v, "list") == 0 { return }
|
|
let l = Value.get(v, "list")
|
|
for i in 0 .. Value.count(l) {
|
|
if len(ef_all(effects_st)) >= effects_st.ef_max { break }
|
|
let o = Value.at(l, i)
|
|
let e = new Effect
|
|
e.kind = sv_int(o, "k", 0)
|
|
e.mag = sv_float(o, "m", 0.0)
|
|
e.left = sv_float(o, "t", 0.0)
|
|
e.delay = sv_float(o, "d", 0.0)
|
|
e.bonus = sv_bool(o, "b", false)
|
|
e.label = sv_str(o, "l", "")
|
|
push(ef_all(effects_st), e)
|
|
}
|
|
}
|
|
|
|
export function effects_system() -> System {
|
|
let s = system_new("effects", PH_SIMULATE)
|
|
s.reset = fn effects_reset
|
|
s.tick = fn effects_tick
|
|
s.save = fn effects_save
|
|
s.load = fn effects_load
|
|
return s
|
|
}
|