feat: remove unreachable routes

This commit is contained in:
Ilia Denisov
2026-01-23 00:43:21 +02:00
parent 812e0d4afd
commit abf72c16b4
3 changed files with 50 additions and 5 deletions
+6 -1
View File
@@ -16,7 +16,7 @@ func MakeTurn(c *Controller, r Repo, g *game.Game) error {
battles := ProduceBattles(c.Cache)
// 03. Товары загружаются на корабли, находящиеся в начале грузовых маршрутов, и корабли входят в гиперпространство (но ещё не полетели)
c.Cache.EnrouteGroups()
c.Cache.SendRoutedGroups()
// 04. Корабли пролетают сквозь гиперпространство.
c.Cache.MoveShipGroups()
@@ -37,8 +37,13 @@ func MakeTurn(c *Controller, r Repo, g *game.Game) error {
c.Cache.TurnPlanetProductions()
// 12. Товары выгружаются в конце грузовых маршрутов.
// 13. Выгруженные колонисты увеличивают население планеты (если население планеты ниже её размера).
// 14. Накопленная и выгруженная промышленность увеличивает производственный уровень планеты (если производственный уровень планеты ниже уровня населения).
c.Cache.TurnUnloadEnroutedGroups()
// 15. Происходит отмена маршрутов, выходящих за зону полета кораблей.
c.Cache.RemoveUnreachableRoutes()
/*** Last steps ***/
// Store battles
+20 -1
View File
@@ -92,7 +92,7 @@ func (c *Cache) RemovePlanetRoute(rt game.RouteType, origin uint) {
}
// TODO: NOT IN THIS FUNC: remove routes if planet became uninhabited (bombing, quit game, etc)
func (c *Cache) EnrouteGroups() {
func (c *Cache) SendRoutedGroups() {
for pi := range c.g.Map.Planet {
if len(c.g.Map.Planet[pi].Route) == 0 {
continue
@@ -200,6 +200,25 @@ func (c *Cache) TurnUnloadEnroutedGroups() {
for _, rt := range []game.RouteType{game.RouteMaterial, game.RouteCapital} {
c.doUnload(c.listRoutedUnloadShipGroupIds(p.Number, rt))
}
p.UnpackColonists()
p.UnpackCapital()
}
}
func (c *Cache) RemoveUnreachableRoutes() {
for i := range c.g.Map.Planet {
p1 := &c.g.Map.Planet[i]
if p1.Owner == uuid.Nil {
continue
}
ri := c.RaceIndex(p1.Owner)
for rt, destination := range p1.Route {
p2 := c.MustPlanet(destination)
rangeToDestination := util.ShortDistance(c.g.Map.Width, c.g.Map.Height, p1.X, p1.Y, p2.X, p2.Y)
if rangeToDestination > c.g.Race[ri].FlightDistance() {
delete(p1.Route, rt)
}
}
}
}
+24 -3
View File
@@ -144,7 +144,7 @@ func TestEnrouteGroups_SplitGroup(t *testing.T) {
assert.NoError(t, c.CreateShips(Race_0_idx, Race_0_Freighter, R0_Planet_0_num, 5)) // 21.0 per Ship
assert.Equal(t, 105., c.ShipGroup(0).CargoCapacity(c.ShipGroupShipClass(0)))
c.EnrouteGroups()
c.SendRoutedGroups()
assert.Len(t, slices.Collect(c.RaceShipGroups(Race_0_idx)), 2)
assert.Equal(t, game.StateInOrbit, c.ShipGroup(0).State())
@@ -171,7 +171,7 @@ func TestEnrouteGroups_GroupSorting(t *testing.T) {
assert.NoError(t, c.CreateShips(Race_0_idx, Race_0_Freighter, R0_Planet_0_num, 5)) // 21.0 per Ship
assert.Equal(t, 105., c.ShipGroup(1).CargoCapacity(c.ShipGroupShipClass(1)))
c.EnrouteGroups()
c.SendRoutedGroups()
assert.Len(t, slices.Collect(c.RaceShipGroups(Race_0_idx)), 2)
assert.Equal(t, game.StateInOrbit, c.ShipGroup(0).State())
@@ -207,7 +207,7 @@ func TestEnrouteGroups_LaunchOrder(t *testing.T) {
assert.NoError(t, c.CreateShips(Race_0_idx, Race_0_Freighter, R0_Planet_0_num, 5))
assert.Equal(t, 105., c.ShipGroup(2).CargoCapacity(c.ShipGroupShipClass(2)))
c.EnrouteGroups()
c.SendRoutedGroups()
assert.Len(t, slices.Collect(c.RaceShipGroups(Race_0_idx)), 5)
@@ -416,3 +416,24 @@ func TestTurnUnloadEnroutedGroups(t *testing.T) {
assert.Equal(t, game.ProductionCapital, c.MustPlanet(Uninhabited_Planet_4_num).Production.Type)
assert.Equal(t, 17.3, c.ShipGroup(3).Load)
}
func TestRemoveUnreachableRoutes(t *testing.T) {
c, g := newCache()
assert.NoError(t, g.SetRoute(Race_0.Name, "MAT", R0_Planet_2_num, R0_Planet_0_num))
assert.NoError(t, g.SetRoute(Race_0.Name, "CAP", R0_Planet_2_num, R0_Planet_0_num))
assert.NoError(t, g.SetRoute(Race_1.Name, "COL", R1_Planet_1_num, R0_Planet_0_num))
assert.NoError(t, g.SetRoute(Race_1.Name, "CAP", R1_Planet_1_num, Uninhabited_Planet_4_num))
assert.Error(t, g.SetRoute(Race_0.Name, "COL", R0_Planet_2_num, Uninhabited_Planet_3_num))
c.MustPlanet(R0_Planet_2_num).Route[game.RouteColonist] = Uninhabited_Planet_3_num
c.RemoveUnreachableRoutes()
assert.NotContains(t, c.MustPlanet(R0_Planet_2_num).Route, game.RouteColonist)
assert.Contains(t, c.MustPlanet(R0_Planet_2_num).Route, game.RouteMaterial)
assert.Contains(t, c.MustPlanet(R0_Planet_2_num).Route, game.RouteCapital)
assert.Contains(t, c.MustPlanet(R1_Planet_1_num).Route, game.RouteColonist)
assert.Contains(t, c.MustPlanet(R1_Planet_1_num).Route, game.RouteCapital)
}