90 lines
2.6 KiB
Go
90 lines
2.6 KiB
Go
package controller
|
|
|
|
import (
|
|
e "github.com/iliadenisov/galaxy/internal/error"
|
|
"github.com/iliadenisov/galaxy/internal/model/game"
|
|
"github.com/iliadenisov/galaxy/internal/util"
|
|
)
|
|
|
|
func (c *Controller) SendFleet(raceName, fleetName string, planetNumber uint) error {
|
|
ri, err := c.Cache.raceIndex(raceName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fi, ok := c.Cache.fleetIndex(ri, fleetName)
|
|
if !ok {
|
|
return e.NewEntityNotExistsError("fleet %q", fleetName)
|
|
}
|
|
return c.Cache.SendFleet(ri, fi, planetNumber)
|
|
}
|
|
|
|
func (c *Cache) SendFleet(ri, fi int, planetNumber uint) error {
|
|
c.validateRaceIndex(ri)
|
|
c.validateFleetIndex(fi)
|
|
state, sourcePlanet, _ := c.FleetState(c.g.Fleets[fi].ID)
|
|
if game.StateInOrbit != state && game.StateLaunched != state {
|
|
return e.NewShipsBusyError()
|
|
}
|
|
|
|
p1, ok := c.Planet(*sourcePlanet)
|
|
// p1, ok := PlanetByNum(g, *sourcePlanet)
|
|
if !ok {
|
|
return e.NewGameStateError("source planet #%d does not exists", sourcePlanet)
|
|
}
|
|
p2, ok := c.Planet(planetNumber)
|
|
// p2, ok := PlanetByNum(g, planetNumber)
|
|
if !ok {
|
|
return e.NewEntityNotExistsError("destination planet #%d", planetNumber)
|
|
}
|
|
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() {
|
|
return e.NewSendUnreachableDestinationError("range=%.03f", rangeToDestination)
|
|
}
|
|
|
|
for sg := range c.FleetGroups(ri, fi) {
|
|
st := c.ShipType(ri, sg.TypeID)
|
|
// 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 {
|
|
c.UnsendFleet(ri, fi)
|
|
return nil
|
|
}
|
|
|
|
c.LaunchFleet(ri, fi, planetNumber)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (c *Cache) LaunchFleet(ri, fi int, destination uint) {
|
|
c.validateRaceIndex(ri)
|
|
c.validateFleetIndex(fi)
|
|
for sg := range c.FleetGroups(ri, fi) {
|
|
c.LaunchShips(*sg, destination)
|
|
// 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] = c.LaunchShips(sg, destination)
|
|
}
|
|
}
|
|
|
|
func (c *Cache) UnsendFleet(ri, fi int) {
|
|
c.validateRaceIndex(ri)
|
|
c.validateFleetIndex(fi)
|
|
for sg := range c.FleetGroups(ri, fi) {
|
|
c.UnsendShips(*sg)
|
|
// 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] = c.UnsendShips(sg)
|
|
}
|
|
}
|