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 }