DEV 953: Add basic maps support to CLI (#74)

* remove squad support and switch to using pipelines only in RulesBuilder

* remove spawn_food.standard from legacy ruleset definitions

* bugfix: Royale map generates Standard food

* add maps support to CLI

* add automated tests for all registered GameMap implementations

* update README
This commit is contained in:
Rob O'Dwyer 2022-05-25 11:24:27 -07:00 committed by GitHub
parent 3bd1e47bb4
commit 1adbc79168
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
27 changed files with 565 additions and 1371 deletions

View file

@ -94,15 +94,14 @@ func TestRoyaleHazards(t *testing.T) {
Width: test.Width,
Height: test.Height,
}
r := RoyaleRuleset{
StandardRuleset: StandardRuleset{
HazardDamagePerTurn: 1,
settings := Settings{
HazardDamagePerTurn: 1,
RoyaleSettings: RoyaleSettings{
ShrinkEveryNTurns: test.ShrinkEveryNTurns,
},
Seed: seed,
ShrinkEveryNTurns: test.ShrinkEveryNTurns,
}
}.WithSeed(seed)
_, err := PopulateHazardsRoyale(b, r.Settings(), mockSnakeMoves())
_, err := PopulateHazardsRoyale(b, settings, mockSnakeMoves())
require.Equal(t, test.Error, err)
if err == nil {
// Obstacles should match
@ -121,64 +120,6 @@ func TestRoyaleHazards(t *testing.T) {
}
}
func TestRoyalDamageNextTurn(t *testing.T) {
seed := int64(45897034512311)
base := &BoardState{Width: 10, Height: 10, Snakes: []Snake{{ID: "one", Health: 100, Body: []Point{{9, 1}, {9, 1}, {9, 1}}}}}
r := RoyaleRuleset{StandardRuleset: StandardRuleset{HazardDamagePerTurn: 30}, Seed: seed, ShrinkEveryNTurns: 10}
m := []SnakeMove{{ID: "one", Move: "down"}}
stateAfterTurn := func(prevState *BoardState, turn int) *BoardState {
nextState := prevState.Clone()
nextState.Turn = turn - 1
_, err := PopulateHazardsRoyale(nextState, r.Settings(), nil)
require.NoError(t, err)
nextState.Turn = turn
return nextState
}
prevState := stateAfterTurn(base, 9)
next, err := r.CreateNextBoardState(prevState, m)
require.NoError(t, err)
require.Equal(t, NotEliminated, next.Snakes[0].EliminatedCause)
require.Equal(t, 99, next.Snakes[0].Health)
require.Equal(t, Point{9, 0}, next.Snakes[0].Body[0])
require.Equal(t, 10, len(next.Hazards)) // X = 0
prevState = stateAfterTurn(base, 19)
next, err = r.CreateNextBoardState(prevState, m)
require.NoError(t, err)
require.Equal(t, NotEliminated, next.Snakes[0].EliminatedCause)
require.Equal(t, 99, next.Snakes[0].Health)
require.Equal(t, Point{9, 0}, next.Snakes[0].Body[0])
require.Equal(t, 20, len(next.Hazards)) // X = 9
prevState = stateAfterTurn(base, 20)
next, err = r.CreateNextBoardState(prevState, m)
require.NoError(t, err)
require.Equal(t, NotEliminated, next.Snakes[0].EliminatedCause)
require.Equal(t, 69, next.Snakes[0].Health)
require.Equal(t, Point{9, 0}, next.Snakes[0].Body[0])
require.Equal(t, 20, len(next.Hazards))
prevState.Snakes[0].Health = 15
next, err = r.CreateNextBoardState(prevState, m)
require.NoError(t, err)
require.Equal(t, EliminatedByOutOfHealth, next.Snakes[0].EliminatedCause)
require.Equal(t, 0, next.Snakes[0].Health)
require.Equal(t, Point{9, 0}, next.Snakes[0].Body[0])
require.Equal(t, 20, len(next.Hazards))
prevState.Food = append(prevState.Food, Point{9, 0})
next, err = r.CreateNextBoardState(prevState, m)
require.NoError(t, err)
require.Equal(t, Point{9, 0}, next.Snakes[0].Body[0])
require.Equal(t, NotEliminated, next.Snakes[0].EliminatedCause)
require.Equal(t, 100, next.Snakes[0].Health)
require.Equal(t, Point{9, 0}, next.Snakes[0].Body[0])
require.Equal(t, 20, len(next.Hazards))
}
// Checks that hazards get placed
// also that:
// - snakes move properly
@ -264,13 +205,13 @@ func TestRoyaleCreateNextBoardState(t *testing.T) {
},
ShrinkEveryNTurns: 1,
}
rand.Seed(0)
rb := NewRulesetBuilder().WithParams(map[string]string{
ParamGameType: GameTypeRoyale,
ParamHazardDamagePerTurn: "1",
ParamShrinkEveryNTurns: "1",
})
}).WithSeed(1234)
for _, gc := range cases {
rand.Seed(1234)
gc.requireValidNextState(t, &r)
// also test a RulesBuilder constructed instance
gc.requireValidNextState(t, rb.Ruleset())