2021-01-19 14:55:49 -08:00
|
|
|
package rules
|
|
|
|
|
|
|
|
|
|
type ConstrictorRuleset struct {
|
|
|
|
|
StandardRuleset
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-16 16:58:05 -07:00
|
|
|
func (r *ConstrictorRuleset) Name() string { return GameTypeConstrictor }
|
2022-01-31 09:43:10 -08:00
|
|
|
|
2021-08-23 17:13:58 -07:00
|
|
|
func (r *ConstrictorRuleset) ModifyInitialBoardState(initialBoardState *BoardState) (*BoardState, error) {
|
|
|
|
|
initialBoardState, err := r.StandardRuleset.ModifyInitialBoardState(initialBoardState)
|
2021-01-19 14:55:49 -08:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2022-03-16 16:58:05 -07:00
|
|
|
|
|
|
|
|
r.removeFood(initialBoardState)
|
|
|
|
|
|
|
|
|
|
err = r.applyConstrictorRules(initialBoardState)
|
2021-01-19 14:55:49 -08:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-16 16:58:05 -07:00
|
|
|
return initialBoardState, nil
|
2021-01-19 14:55:49 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *ConstrictorRuleset) CreateNextBoardState(prevState *BoardState, moves []SnakeMove) (*BoardState, error) {
|
|
|
|
|
nextState, err := r.StandardRuleset.CreateNextBoardState(prevState, moves)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-16 16:58:05 -07:00
|
|
|
r.removeFood(nextState)
|
|
|
|
|
|
2021-01-19 14:55:49 -08:00
|
|
|
err = r.applyConstrictorRules(nextState)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nextState, nil
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-16 16:58:05 -07:00
|
|
|
func (r *ConstrictorRuleset) removeFood(b *BoardState) {
|
|
|
|
|
_, _ = r.callStageFunc(RemoveFoodConstrictor, b, []SnakeMove{})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func RemoveFoodConstrictor(b *BoardState, settings Settings, moves []SnakeMove) (bool, error) {
|
2021-01-19 14:55:49 -08:00
|
|
|
// Remove all food from the board
|
|
|
|
|
b.Food = []Point{}
|
|
|
|
|
|
2022-03-16 16:58:05 -07:00
|
|
|
return false, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *ConstrictorRuleset) applyConstrictorRules(b *BoardState) error {
|
|
|
|
|
_, err := r.callStageFunc(GrowSnakesConstrictor, b, []SnakeMove{})
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func GrowSnakesConstrictor(b *BoardState, settings Settings, moves []SnakeMove) (bool, error) {
|
2021-01-19 14:55:49 -08:00
|
|
|
// Set all snakes to max health and ensure they grow next turn
|
|
|
|
|
for i := 0; i < len(b.Snakes); i++ {
|
|
|
|
|
b.Snakes[i].Health = SnakeMaxHealth
|
|
|
|
|
|
|
|
|
|
tail := b.Snakes[i].Body[len(b.Snakes[i].Body)-1]
|
|
|
|
|
subTail := b.Snakes[i].Body[len(b.Snakes[i].Body)-2]
|
|
|
|
|
if tail != subTail {
|
2022-03-16 16:58:05 -07:00
|
|
|
growSnake(&b.Snakes[i])
|
2021-01-19 14:55:49 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-16 16:58:05 -07:00
|
|
|
return false, nil
|
2021-01-19 14:55:49 -08:00
|
|
|
}
|