82 lines
2.2 KiB
Go
82 lines
2.2 KiB
Go
package controller
|
|
|
|
import (
|
|
"github.com/google/uuid"
|
|
"github.com/iliadenisov/galaxy/internal/model/game"
|
|
"github.com/iliadenisov/galaxy/internal/model/report"
|
|
)
|
|
|
|
func TransformBattle(c *Cache, b *Battle) *report.BattleReport {
|
|
r := &report.BattleReport{
|
|
ID: b.ID,
|
|
Planet: b.Planet,
|
|
PlanetName: c.MustPlanet(b.Planet).Name,
|
|
Races: make(map[int]uuid.UUID),
|
|
Ships: make(map[int]report.BattleReportGroup),
|
|
Protocol: make([]report.BattleActionReport, len(b.Protocol)),
|
|
}
|
|
|
|
cacheShipClass := make(map[uuid.UUID]int)
|
|
cacheRaceName := make(map[uuid.UUID]int)
|
|
|
|
addShipGroup := func(groupId int, inBattle bool) int {
|
|
shipClass := c.ShipGroupShipClass(groupId)
|
|
sg := c.ShipGroup(groupId)
|
|
itemNumber := len(r.Ships)
|
|
r.Ships[itemNumber] = report.BattleReportGroup{
|
|
OwnerID: sg.OwnerID,
|
|
InBattle: inBattle,
|
|
Number: b.initialNumbers[groupId],
|
|
NumberLeft: sg.Number,
|
|
ClassName: shipClass.Name,
|
|
LoadType: sg.CargoString(),
|
|
LoadQuantity: sg.Load.RF(),
|
|
Drive: sg.TechLevel(game.TechDrive).RF(),
|
|
Weapons: sg.TechLevel(game.TechWeapons).RF(),
|
|
Shields: sg.TechLevel(game.TechShields).RF(),
|
|
Cargo: sg.TechLevel(game.TechCargo).RF(),
|
|
}
|
|
cacheShipClass[shipClass.ID] = itemNumber
|
|
return itemNumber
|
|
}
|
|
|
|
ship := func(groupId int) int {
|
|
shipClass := c.ShipGroupShipClass(groupId)
|
|
if v, ok := cacheShipClass[shipClass.ID]; ok {
|
|
return v
|
|
} else {
|
|
return addShipGroup(groupId, true)
|
|
}
|
|
}
|
|
|
|
race := func(groupId int) int {
|
|
race := c.ShipGroupOwnerRace(groupId)
|
|
if v, ok := cacheRaceName[race.ID]; ok {
|
|
return v
|
|
} else {
|
|
itemNumber := len(r.Races)
|
|
r.Races[itemNumber] = race.ID
|
|
cacheRaceName[race.ID] = itemNumber
|
|
return itemNumber
|
|
}
|
|
}
|
|
|
|
for i := range b.Protocol {
|
|
r.Protocol[i] = report.BattleActionReport{
|
|
Attacker: race(b.Protocol[i].Attacker),
|
|
AttackerShipClass: ship(b.Protocol[i].Attacker),
|
|
Defender: race(b.Protocol[i].Defender),
|
|
DefenderShipClass: ship(b.Protocol[i].Defender),
|
|
Destroyed: b.Protocol[i].Destroyed,
|
|
}
|
|
}
|
|
|
|
for sgi, inBattle := range b.observerGroups {
|
|
if !inBattle {
|
|
addShipGroup(sgi, false)
|
|
}
|
|
}
|
|
|
|
return r
|
|
}
|