diff --git a/constants.go b/constants.go index c6bb45b..041f436 100644 --- a/constants.go +++ b/constants.go @@ -39,11 +39,12 @@ const ( ErrorMapNotFound = RulesetError("map not found") // Ruleset / game type names - GameTypeConstrictor = "constrictor" - GameTypeRoyale = "royale" - GameTypeSolo = "solo" - GameTypeStandard = "standard" - GameTypeWrapped = "wrapped" + GameTypeConstrictor = "constrictor" + GameTypeRoyale = "royale" + GameTypeSolo = "solo" + GameTypeStandard = "standard" + GameTypeWrapped = "wrapped" + GameTypeWrappedConstrictor = "wrapped_constrictor" // Game creation parameter names ParamGameType = "name" diff --git a/constrictor.go b/constrictor.go index 6f0a28f..3fb5eea 100644 --- a/constrictor.go +++ b/constrictor.go @@ -11,6 +11,17 @@ var constrictorRulesetStages = []string{ StageModifySnakesAlwaysGrow, } +var wrappedConstrictorRulesetStages = []string{ + StageGameOverStandard, + StageMovementWrapBoundaries, + StageStarvationStandard, + StageHazardDamageStandard, + StageFeedSnakesStandard, + StageEliminationStandard, + StageSpawnFoodNoFood, + StageModifySnakesAlwaysGrow, +} + type ConstrictorRuleset struct { StandardRuleset } diff --git a/maps/arcade_maze.go b/maps/arcade_maze.go index c503eac..eb3a1fe 100644 --- a/maps/arcade_maze.go +++ b/maps/arcade_maze.go @@ -23,6 +23,7 @@ func (m ArcadeMazeMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 6, BoardSizes: FixedSizes(Dimensions{19, 21}), + Tags: []string{TAG_FOOD_PLACEMENT, TAG_HAZARD_PLACEMENT, TAG_SNAKE_PLACEMENT}, } } diff --git a/maps/empty.go b/maps/empty.go index e204feb..40699f9 100644 --- a/maps/empty.go +++ b/maps/empty.go @@ -23,6 +23,7 @@ func (m EmptyMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 16, BoardSizes: OddSizes(rules.BoardSizeSmall, rules.BoardSizeXXLarge), + Tags: []string{}, } } diff --git a/maps/game_map.go b/maps/game_map.go index 258c718..94406af 100644 --- a/maps/game_map.go +++ b/maps/game_map.go @@ -4,6 +4,13 @@ import ( "github.com/BattlesnakeOfficial/rules" ) +const ( + TAG_EXPERIMENTAL = "experimental" // experimental map, only available via CLI + TAG_SNAKE_PLACEMENT = "snake-placement" // map overrides default snake placement + TAG_HAZARD_PLACEMENT = "hazard-placement" // map places hazards + TAG_FOOD_PLACEMENT = "food-placement" // map overrides or adds to default food placement +) + type GameMap interface { // Return a unique identifier for this map. ID() string @@ -82,6 +89,8 @@ type Metadata struct { // 2. multiple, fixed sizes (i.e. [11x11, 19x19, 25x25]) // 3. "unlimited" sizes (the board is not fixed and can scale to any reasonable size) BoardSizes sizes + // Tags is a list of strings use to categorize the map. + Tags []string } // Editor is used by GameMap implementations to modify the board state. diff --git a/maps/hazards.go b/maps/hazards.go index 973fbb6..2eb8de4 100644 --- a/maps/hazards.go +++ b/maps/hazards.go @@ -33,6 +33,7 @@ func (m InnerBorderHazardsMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 16, BoardSizes: OddSizes(rules.BoardSizeSmall, rules.BoardSizeXXLarge), + Tags: []string{TAG_HAZARD_PLACEMENT}, } } @@ -73,6 +74,7 @@ func (m ConcentricRingsHazardsMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 16, BoardSizes: OddSizes(rules.BoardSizeSmall, rules.BoardSizeXXLarge), + Tags: []string{TAG_HAZARD_PLACEMENT}, } } @@ -114,6 +116,7 @@ func (m ColumnsHazardsMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 16, BoardSizes: OddSizes(rules.BoardSizeSmall, rules.BoardSizeXXLarge), + Tags: []string{TAG_HAZARD_PLACEMENT}, } } @@ -153,6 +156,7 @@ func (m SpiralHazardsMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 16, BoardSizes: OddSizes(rules.BoardSizeSmall, rules.BoardSizeXXLarge), + Tags: []string{TAG_HAZARD_PLACEMENT}, } } @@ -245,6 +249,7 @@ func (m ScatterFillMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 16, BoardSizes: OddSizes(rules.BoardSizeSmall, rules.BoardSizeXXLarge), + Tags: []string{TAG_HAZARD_PLACEMENT}, } } @@ -296,6 +301,7 @@ func (m DirectionalExpandingBoxMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 16, BoardSizes: OddSizes(rules.BoardSizeSmall, rules.BoardSizeXXLarge), + Tags: []string{TAG_HAZARD_PLACEMENT}, } } @@ -410,6 +416,7 @@ func (m ExpandingBoxMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 16, BoardSizes: OddSizes(rules.BoardSizeSmall, rules.BoardSizeXXLarge), + Tags: []string{TAG_HAZARD_PLACEMENT}, } } @@ -485,6 +492,7 @@ func (m ExpandingScatterMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 16, BoardSizes: OddSizes(rules.BoardSizeSmall, rules.BoardSizeXXLarge), + Tags: []string{TAG_HAZARD_PLACEMENT}, } } @@ -567,6 +575,7 @@ Each river has one or two 1-square "bridges" over them`, MinPlayers: 1, MaxPlayers: 12, BoardSizes: FixedSizes(Dimensions{11, 11}, Dimensions{19, 19}, Dimensions{25, 25}), + Tags: []string{TAG_HAZARD_PLACEMENT, TAG_SNAKE_PLACEMENT}, } } diff --git a/maps/healing_pools.go b/maps/healing_pools.go index f530630..1a67a3f 100644 --- a/maps/healing_pools.go +++ b/maps/healing_pools.go @@ -25,6 +25,7 @@ func (m HealingPoolsMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 8, BoardSizes: FixedSizes(Dimensions{7, 7}, Dimensions{11, 11}, Dimensions{19, 19}), + Tags: []string{TAG_HAZARD_PLACEMENT}, } } diff --git a/maps/registry_test.go b/maps/registry_test.go index 4ed88cf..62ad504 100644 --- a/maps/registry_test.go +++ b/maps/registry_test.go @@ -29,6 +29,7 @@ func TestRegisteredMaps(t *testing.T) { require.NotZero(t, meta.MaxPlayers, "registered maps must have maximum players declared") require.LessOrEqual(t, meta.MaxPlayers, meta.MaxPlayers, "max players should always be >= min players") require.NotEmpty(t, meta.BoardSizes, "registered maps must have at least one supported size declared") + require.NotNil(t, meta.Tags) var setupBoardState *rules.BoardState // "fuzz test" supported players diff --git a/maps/royale.go b/maps/royale.go index 1870757..c04f94b 100644 --- a/maps/royale.go +++ b/maps/royale.go @@ -25,6 +25,7 @@ func (m RoyaleHazardsMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 16, BoardSizes: OddSizes(rules.BoardSizeSmall, rules.BoardSizeXXLarge), + Tags: []string{TAG_HAZARD_PLACEMENT}, } } diff --git a/maps/sinkholes.go b/maps/sinkholes.go index 80c8ceb..849645c 100644 --- a/maps/sinkholes.go +++ b/maps/sinkholes.go @@ -25,6 +25,7 @@ func (m SinkholesMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 8, BoardSizes: FixedSizes(Dimensions{7, 7}, Dimensions{11, 11}, Dimensions{19, 19}), + Tags: []string{TAG_HAZARD_PLACEMENT}, } } diff --git a/maps/solo_maze.go b/maps/solo_maze.go index 29f30eb..d752594 100644 --- a/maps/solo_maze.go +++ b/maps/solo_maze.go @@ -54,6 +54,7 @@ func (m SoloMazeMap) Meta() Metadata { Dimensions{19, 21}, Dimensions{25, 25}, ), + Tags: []string{TAG_EXPERIMENTAL, TAG_FOOD_PLACEMENT, TAG_HAZARD_PLACEMENT, TAG_SNAKE_PLACEMENT}, } } diff --git a/maps/standard.go b/maps/standard.go index bcdb19d..0bd47ad 100644 --- a/maps/standard.go +++ b/maps/standard.go @@ -23,6 +23,7 @@ func (m StandardMap) Meta() Metadata { MinPlayers: 1, MaxPlayers: 16, BoardSizes: OddSizes(rules.BoardSizeSmall, rules.BoardSizeXXLarge), + Tags: []string{}, } } diff --git a/ruleset.go b/ruleset.go index e69bbe8..c615012 100644 --- a/ruleset.go +++ b/ruleset.go @@ -144,6 +144,8 @@ func (rb rulesetBuilder) Ruleset() PipelineRuleset { stages = append(stages, standardRulesetStages[1:]...) case GameTypeConstrictor: stages = append(stages, constrictorRulesetStages[1:]...) + case GameTypeWrappedConstrictor: + stages = append(stages, wrappedConstrictorRulesetStages[1:]...) case GameTypeRoyale: stages = append(stages, royaleRulesetStages[1:]...) case GameTypeSolo: diff --git a/ruleset_test.go b/ruleset_test.go index 423d15b..16ce402 100644 --- a/ruleset_test.go +++ b/ruleset_test.go @@ -111,6 +111,7 @@ func TestRulesetBuilder(t *testing.T) { {GameType: rules.GameTypeRoyale}, {GameType: rules.GameTypeSolo}, {GameType: rules.GameTypeConstrictor}, + {GameType: rules.GameTypeWrappedConstrictor}, } for _, expected := range expectedResults {