cmd: send fleet
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"slices"
|
||||
|
||||
e "github.com/iliadenisov/galaxy/internal/error"
|
||||
"github.com/iliadenisov/galaxy/internal/util"
|
||||
)
|
||||
|
||||
func (g *Game) SendFleet(raceName, fleetName string, planetNumber uint) error {
|
||||
ri, err := g.raceIndex(raceName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fi := g.fleetIndex(ri, fleetName)
|
||||
if fi < 0 {
|
||||
return e.NewEntityNotExistsError("fleet %q", fleetName)
|
||||
}
|
||||
return g.sendFleetInternal(ri, fi, planetNumber)
|
||||
}
|
||||
|
||||
func (g *Game) sendFleetInternal(ri, fi int, planetNumber uint) error {
|
||||
state, sourcePlanet, _ := FleetState(g, g.Fleets[fi].ID)
|
||||
if StateInOrbit != state && StateLaunched != state {
|
||||
return e.NewShipsBusyError()
|
||||
}
|
||||
|
||||
p1, ok := PlanetByNum(g, *sourcePlanet)
|
||||
if !ok {
|
||||
return e.NewGameStateError("source planet #%d does not exists", sourcePlanet)
|
||||
}
|
||||
p2, ok := PlanetByNum(g, planetNumber)
|
||||
if !ok {
|
||||
return e.NewEntityNotExistsError("destination planet #%d", planetNumber)
|
||||
}
|
||||
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)
|
||||
}
|
||||
|
||||
for sg := range FleetGroups(g, ri, fi) {
|
||||
st, ok := ShipClass(g, ri, sg.TypeID)
|
||||
if !ok {
|
||||
return e.NewGameStateError("not found: ShipType ID=%v", sg.TypeID)
|
||||
}
|
||||
if st.DriveBlockMass() == 0 {
|
||||
return e.NewSendShipHasNoDrivesError("Class=%s", st.Name)
|
||||
}
|
||||
}
|
||||
|
||||
if *sourcePlanet == planetNumber {
|
||||
UnsendFleet(g, ri, fi)
|
||||
return nil
|
||||
}
|
||||
|
||||
LaunchFleet(g, ri, fi, planetNumber)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func LaunchFleet(g *Game, ri, fi int, destination uint) {
|
||||
for sg := range FleetGroups(g, ri, fi) {
|
||||
sgi := slices.IndexFunc(g.ShipGroups, func(s ShipGroup) bool { return sg.Index == s.Index })
|
||||
if sgi < 0 {
|
||||
panic(fmt.Sprintf("LauncgFleet: cannot find ship group index=%d", sg.Index))
|
||||
}
|
||||
g.ShipGroups[sgi] = LaunchShips(sg, destination)
|
||||
}
|
||||
}
|
||||
|
||||
func UnsendFleet(g *Game, ri, fi int) {
|
||||
for sg := range FleetGroups(g, ri, fi) {
|
||||
sgi := slices.IndexFunc(g.ShipGroups, func(s ShipGroup) bool { return sg.Index == s.Index })
|
||||
if sgi < 0 {
|
||||
panic(fmt.Sprintf("UnsendFleet: cannot find ship group index=%d", sg.Index))
|
||||
}
|
||||
g.ShipGroups[sgi] = UnsendShips(sg)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user