feat: westworldwithwoman. add elsa
This commit is contained in:
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)
|
||||
}
|
||||
Reference in new issue
Block a user