Files
galaxy-game/internal/controller/command.go
T
2026-02-16 20:46:53 +02:00

274 lines
7.8 KiB
Go

package controller
/*
TODO: Препроцессинг и сохранение приказов
Когда приказ (последовательность команд) поступает на сервер, игрок получает
уведомление о том, что его команды приняты к производству. Каждая команда из
приказа проверяется на корректность и получает отдельное подтверждение. Игрок
может послать любое количество приказов по своему усмотрению, однако, каждый
новый приказ отменяет предыдущий. Таким образом, можно исправить неверно
составленный приказ, но при этом необходимо повторить те команды, которые
были отданы верно. К счастью, программа-клиент помогает игроку не запутаться
в этом процессе и берёт на себя контроль за целостностью приказов.
*/
import (
"strings"
"github.com/google/uuid"
e "github.com/iliadenisov/galaxy/internal/error"
"github.com/iliadenisov/galaxy/internal/model/game"
)
func (c Controller) RaceID(actor string) (uuid.UUID, error) {
ri, err := c.Cache.validRace(actor)
if err != nil {
return uuid.Nil, err
}
return c.Cache.g.Race[ri].ID, nil
}
/*
TODO: не сбрасывать счётчик при последующих командах?
*/
func (c Controller) RaceQuit(actor string) error {
ri, err := c.Cache.validRace(actor)
if err != nil {
return err
}
c.Cache.g.Race[ri].TTL = 3
return nil
}
func (c Controller) RaceVote(actor, acceptor string) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
rec, err := c.Cache.validRace(acceptor)
if err != nil {
return err
}
c.Cache.g.Race[ri].VoteFor = c.Cache.g.Race[rec].ID
return nil
}
func (c Controller) RaceRelation(actor, acceptor string, v string) error {
rel, ok := game.ParseRelation(v)
if !ok {
return e.NewUnknownRelationError(v)
}
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
other, err := c.Cache.validRace(acceptor)
if err != nil {
return err
}
return c.Cache.UpdateRelation(ri, other, rel)
}
func (c *Controller) ShipClassCreate(actor, typeName string, drive float64, ammo int, weapons, shileds, cargo float64) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
return c.Cache.ShipClassCreate(ri, typeName, drive, ammo, weapons, shileds, cargo)
}
func (c *Controller) ShipClassMerge(actor, name, targetName string) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
return c.Cache.shipClassMerge(ri, name, targetName)
}
func (c *Controller) ShipClassRemove(actor, typeName string) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
return c.Cache.shipClassRemove(ri, typeName)
}
func (c *Controller) ShipGroupLoad(actor string, groupID uuid.UUID, cargoType string, quantity float64) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
ct, ok := game.CargoTypeSet[strings.ToLower(cargoType)]
if !ok {
return e.NewCargoTypeInvalidError(cargoType)
}
return c.Cache.shipGroupLoad(ri, groupID, ct, quantity)
}
func (c *Controller) ShipGroupUnload(actor string, groupID uuid.UUID, quantity float64) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
return c.Cache.shipGroupUnload(ri, groupID, quantity)
}
func (c *Controller) ShipGroupSend(actor string, groupID uuid.UUID, planetNumber uint) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
return c.Cache.shipGroupSend(ri, groupID, planetNumber)
}
func (c *Controller) ShipGroupUpgrade(actor string, groupID uuid.UUID, techInput string, limitLevel float64) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
return c.Cache.shipGroupUpgrade(ri, groupID, techInput, limitLevel)
}
func (c *Controller) ShipGroupMerge(actor string) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
c.Cache.shipGroupMerge(ri)
return nil
}
func (c *Controller) ShipGroupBreak(actor string, groupID, newID uuid.UUID, quantity uint) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
return c.Cache.ShipGroupBreak(ri, groupID, newID, quantity)
}
func (c *Controller) ShipGroupDismantle(actor string, groupID uuid.UUID) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
return c.Cache.shipGroupDismantle(ri, groupID)
}
func (c *Controller) ShipGroupTransfer(actor, acceptor string, groupID uuid.UUID) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
riAccept, err := c.Cache.validRace(acceptor)
if err != nil {
return err
}
return c.Cache.shipGroupTransfer(ri, riAccept, groupID)
}
func (c *Controller) ShipGroupJoinFleet(actor, fleetName string, groupID uuid.UUID) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
return c.Cache.ShipGroupJoinFleet(ri, fleetName, groupID)
}
func (c *Controller) FleetMerge(actor, fleetSourceName, fleetTargetName string) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
return c.Cache.fleetMerge(ri, fleetSourceName, fleetTargetName)
}
func (c *Controller) FleetSend(actor, fleetName string, planetNumber uint) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
fi, ok := c.Cache.fleetIndex(ri, fleetName)
if !ok {
return e.NewEntityNotExistsError("fleet %q", fleetName)
}
return c.Cache.FleetSend(ri, fi, planetNumber)
}
func (c *Controller) ScienceCreate(actor, typeName string, drive, weapons, shields, cargo float64) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
return c.Cache.ScienceCreate(ri, typeName, drive, weapons, shields, cargo)
}
func (c *Controller) ScienceRemove(actor, typeName string) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
return c.Cache.ScienceRemove(ri, typeName)
}
func (c *Controller) PlanetRename(actor string, planetNumber int, name string) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
return c.Cache.PlanetRename(ri, planetNumber, name)
}
func (c *Controller) PlanetProduce(actor string, planetNumber int, prodType, subject string) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
var prod game.ProductionType
switch game.ProductionType(strings.ToUpper(prodType)) {
case game.ProductionMaterial:
prod = game.ProductionMaterial
case game.ProductionCapital:
prod = game.ProductionCapital
case game.ResearchDrive:
prod = game.ResearchDrive
case game.ResearchWeapons:
prod = game.ResearchWeapons
case game.ResearchShields:
prod = game.ResearchShields
case game.ResearchCargo:
prod = game.ResearchCargo
case game.ResearchScience:
prod = game.ResearchScience
case game.ProductionShip:
prod = game.ProductionShip
default:
return e.NewProductionInvalidError(prodType)
}
return c.Cache.PlanetProduce(ri, planetNumber, prod, subject)
}
func (c *Controller) PlanetRouteSet(actor, loadType string, origin, destination uint) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
rt, ok := game.RouteTypeSet[strings.ToLower(loadType)]
if !ok {
return e.NewCargoTypeInvalidError(loadType)
}
return c.Cache.PlanetRouteSet(ri, rt, origin, destination)
}
func (c *Controller) PlanetRouteRemove(actor, loadType string, origin uint) error {
ri, err := c.Cache.validActor(actor)
if err != nil {
return err
}
rt, ok := game.RouteTypeSet[strings.ToLower(loadType)]
if !ok {
return e.NewCargoTypeInvalidError(loadType)
}
return c.Cache.PlanetRouteRemove(ri, rt, origin)
}