@@ -0,0 +1,81 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"galaxy/model/report"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
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)
|
||||
bg := &report.BattleReportGroup{
|
||||
Race: c.g.Race[c.RaceIndex(sg.OwnerID)].Name,
|
||||
InBattle: inBattle,
|
||||
Number: b.InitialNumbers[groupId],
|
||||
NumberLeft: sg.Number,
|
||||
ClassName: shipClass.Name,
|
||||
LoadType: sg.CargoString(),
|
||||
LoadQuantity: report.F(sg.Load.F()),
|
||||
}
|
||||
for t, v := range sg.Tech {
|
||||
bg.Tech[t.String()] = report.F(v.F())
|
||||
}
|
||||
r.Ships[itemNumber] = *bg
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user