feat: westworldwithwoman. add elsa

This commit is contained in:
jonas committed 2026-09-03 21:28:28 +02:00
1 parent 2764849943
commit 0e7482e04c
28 files changed
+1946

No files matched your search

@@ -0,0 +1,49 @@
package westworldwithwoman
// Elsa is the miner's wife, introduced in this section of the book.
// She's built the exact same way Miner is: embed *BaseGameEntity for
// her ID, own a *StateMachine[Elsa] and delegate all state
// bookkeeping to it. This is the payoff of making State[T] and
// StateMachine[T] generic earlier - Elsa reuses both unchanged,
// just with the blank slot filled in as Elsa instead of Miner.
type Elsa struct {
*BaseGameEntity
stateMachine *StateMachine[Elsa]
}
// NewElsa sets up Elsa's state machine: DoHousework is her ordinary,
// everyday state, and WifesGlobalState is what checks - every single
// tick, no matter what she's currently doing - whether nature is
// calling. That's exactly why it has to be a global state rather
// than logic inside DoHousework: the book says "Elsa may feel the
// call of nature during any state and at any time," and a global
// state's Execute runs regardless of the current state.
func NewElsa(id int) *Elsa {
e := &Elsa{
BaseGameEntity: NewBaseGameEntity(id),
}
e.stateMachine = NewStateMachine(e)
e.stateMachine.SetCurrentState(DoHousework())
e.stateMachine.SetGlobalState(WifesGlobalState())
return e
}
// FSM returns Elsa's state machine.
func (e *Elsa) FSM() *StateMachine[Elsa] {
return e.stateMachine
}
// Update satisfies the Entity interface (alongside the ID() method
// borrowed from BaseGameEntity) and just delegates to the state
// machine, same shape as Miner.Update.
func (e *Elsa) Update() {
e.stateMachine.Update()
}
// ChangeState forwards to the state machine, same as Miner.ChangeState.
func (e *Elsa) ChangeState(newState State[Elsa]) {
e.stateMachine.ChangeState(newState)
}