Refactor rulesets into smaller composable operations In order to mix up the functionality from different rulesets like Solo, Royale, etc. the code in these classes needs to be broken up into small functions that can be composed in a pipeline to make a custom game mode.
76 lines
1.4 KiB
Go
76 lines
1.4 KiB
Go
package rules
|
|
|
|
type WrappedRuleset struct {
|
|
StandardRuleset
|
|
}
|
|
|
|
func (r *WrappedRuleset) Name() string { return GameTypeWrapped }
|
|
|
|
func (r *WrappedRuleset) CreateNextBoardState(prevState *BoardState, moves []SnakeMove) (*BoardState, error) {
|
|
nextState := prevState.Clone()
|
|
|
|
err := r.moveSnakes(nextState, moves)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = r.reduceSnakeHealth(nextState)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = r.maybeDamageHazards(nextState)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = r.maybeFeedSnakes(nextState)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = r.maybeSpawnFood(nextState)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = r.maybeEliminateSnakes(nextState)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return nextState, nil
|
|
}
|
|
|
|
func (r *WrappedRuleset) moveSnakes(b *BoardState, moves []SnakeMove) error {
|
|
_, err := r.callStageFunc(MoveSnakesWrapped, b, moves)
|
|
return err
|
|
}
|
|
|
|
func MoveSnakesWrapped(b *BoardState, settings Settings, moves []SnakeMove) (bool, error) {
|
|
_, err := MoveSnakesStandard(b, settings, moves)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
for i := 0; i < len(b.Snakes); i++ {
|
|
snake := &b.Snakes[i]
|
|
if snake.EliminatedCause != NotEliminated {
|
|
continue
|
|
}
|
|
snake.Body[0].X = wrap(snake.Body[0].X, 0, b.Width-1)
|
|
snake.Body[0].Y = wrap(snake.Body[0].Y, 0, b.Height-1)
|
|
}
|
|
|
|
return false, nil
|
|
}
|
|
|
|
func wrap(value, min, max int32) int32 {
|
|
if value < min {
|
|
return max
|
|
}
|
|
if value > max {
|
|
return min
|
|
}
|
|
return value
|
|
}
|