cmd: add/remove route
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"slices"
|
||||
|
||||
e "github.com/iliadenisov/galaxy/internal/error"
|
||||
"github.com/iliadenisov/galaxy/internal/util"
|
||||
)
|
||||
|
||||
type RouteType string
|
||||
|
||||
const (
|
||||
RouteMaterial RouteType = "MAT" // Сырьё
|
||||
RouteCapital RouteType = "CAP" // Промышленность
|
||||
RouteColonist RouteType = "COL" // Колонисты
|
||||
RouteEmpty RouteType = "EMP" // Пустые корабли
|
||||
)
|
||||
|
||||
var (
|
||||
routeTypeSet map[string]RouteType = map[string]RouteType{
|
||||
RouteMaterial.String(): RouteMaterial,
|
||||
RouteCapital.String(): RouteCapital,
|
||||
RouteColonist.String(): RouteColonist,
|
||||
RouteEmpty.String(): RouteEmpty,
|
||||
}
|
||||
)
|
||||
|
||||
func (rt RouteType) Ref() *RouteType {
|
||||
return &rt
|
||||
}
|
||||
|
||||
func (rt RouteType) String() string {
|
||||
return string(rt)
|
||||
}
|
||||
|
||||
func (g *Game) SetRoute(raceName, loadType string, origin, destination uint) error {
|
||||
ri, err := g.raceIndex(raceName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
rt, ok := routeTypeSet[loadType]
|
||||
if !ok {
|
||||
return e.NewCargoTypeInvalidError(loadType)
|
||||
}
|
||||
return g.setRouteInternal(ri, rt, origin, destination)
|
||||
}
|
||||
|
||||
func (g *Game) RemoveRoute(raceName, loadType string, origin uint) error {
|
||||
ri, err := g.raceIndex(raceName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
rt, ok := routeTypeSet[loadType]
|
||||
if !ok {
|
||||
return e.NewCargoTypeInvalidError(loadType)
|
||||
}
|
||||
return g.removeRouteInternal(ri, rt, origin)
|
||||
}
|
||||
|
||||
func (g *Game) setRouteInternal(ri int, rt RouteType, origin, destination uint) error {
|
||||
p1, ok := PlanetByNum(g, origin)
|
||||
if !ok {
|
||||
return e.NewEntityNotExistsError("origin planet #%d", origin)
|
||||
}
|
||||
if p1.Owner != g.Race[ri].ID {
|
||||
return e.NewEntityNotOwnedError("planet #%d", origin)
|
||||
}
|
||||
p2, ok := PlanetByNum(g, destination)
|
||||
if !ok {
|
||||
return e.NewEntityNotExistsError("destination planet #%d", destination)
|
||||
}
|
||||
rangeToDestination := util.ShortDistance(g.Map.Width, g.Map.Height, p1.X, p1.Y, p2.X, p2.Y)
|
||||
if rangeToDestination > g.Race[ri].FlightDistance() {
|
||||
return e.NewSendUnreachableDestinationError("range=%.03f", rangeToDestination)
|
||||
}
|
||||
|
||||
SetPlanetRoute(g, rt, origin, destination)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *Game) removeRouteInternal(ri int, rt RouteType, origin uint) error {
|
||||
p1, ok := PlanetByNum(g, origin)
|
||||
if !ok {
|
||||
return e.NewEntityNotExistsError("origin planet #%d", origin)
|
||||
}
|
||||
if p1.Owner != g.Race[ri].ID {
|
||||
return e.NewEntityNotOwnedError("planet #%d", origin)
|
||||
}
|
||||
|
||||
RemovePlanetRoute(g, rt, origin)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func SetPlanetRoute(g *Game, rt RouteType, origin, destination uint) {
|
||||
pi := slices.IndexFunc(g.Map.Planet, func(p Planet) bool { return p.Number == origin })
|
||||
if pi < 0 {
|
||||
panic(fmt.Sprintf("SetPlanetRoute: origin planet #%d not found", origin))
|
||||
}
|
||||
if g.Map.Planet[pi].Route == nil {
|
||||
g.Map.Planet[pi].Route = make(map[RouteType]uint)
|
||||
}
|
||||
g.Map.Planet[pi].Route[rt] = destination
|
||||
}
|
||||
|
||||
func RemovePlanetRoute(g *Game, rt RouteType, origin uint) {
|
||||
pi := slices.IndexFunc(g.Map.Planet, func(p Planet) bool { return p.Number == origin })
|
||||
if pi < 0 {
|
||||
panic(fmt.Sprintf("RemovePlanetRoute: origin planet #%d not found", origin))
|
||||
}
|
||||
if g.Map.Planet[pi].Route != nil {
|
||||
delete(g.Map.Planet[pi].Route, rt)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user