Files
realworld/inc/world.action.go
T
2026-08-30 23:01:48 +02:00

89 lines
1.5 KiB
Go

package inc
import (
inkwell "git.teletypegames.org/engines/inkwell"
)
func (w *world) Do(a inkwell.Action) { w.G.Do(a) }
type fnAction struct{ fn func(*inkwell.Ctx) }
func (a *fnAction) Start() inkwell.Runner {
return &fnRunner{
spec: a,
}
}
type fnRunner struct{ spec *fnAction }
func (r *fnRunner) Tick(ctx *inkwell.Ctx) inkwell.Status {
r.spec.fn(ctx)
return inkwell.StatusDone
}
func Fn(f func(*inkwell.Ctx)) inkwell.Action {
return &fnAction{
fn: f,
}
}
func UseTheme(name string) inkwell.Action {
return Fn(func(ctx *inkwell.Ctx) { ctx.Game.UseTheme(name) })
}
func SetMode(m Mode) inkwell.Action {
return Fn(func(*inkwell.Ctx) { World.SetMode(m) })
}
func TapeOffer(line inkwell.Action) inkwell.Action {
return Fn(func(*inkwell.Ctx) {
World.tapeLine = line
World.tapeWaiting = true
})
}
func (w *world) TakeTapeOffer() {
if !w.tapeWaiting {
return
}
w.tapeWaiting = false
line := w.tapeLine
w.tapeLine = nil
w.Do(line)
}
func Paused(inner inkwell.Action) inkwell.Action {
return &pausedAction{
inner: inner,
}
}
type pausedAction struct {
inner inkwell.Action
}
func (a *pausedAction) Start() inkwell.Runner {
return &pausedRunner{
spec: a,
inner: a.inner.Start(),
}
}
type pausedRunner struct {
spec *pausedAction
inner inkwell.Runner
started bool
}
func (r *pausedRunner) Tick(ctx *inkwell.Ctx) inkwell.Status {
if !r.started {
r.started = true
World.SetNote(NotePaused)
}
s := r.inner.Tick(ctx)
if s != inkwell.StatusRunning {
World.SetNote("")
}
return s
}