package game import ( "github.com/google/uuid" ) type ShipTypeReport struct { Name string `json:"name"` Drive float64 `json:"drive"` Armament uint `json:"armament"` Weapons float64 `json:"weapons"` Shields float64 `json:"shields"` Cargo float64 `json:"cargo"` } type ShipType struct { ID uuid.UUID `json:"id"` ShipTypeReport } type ShipTypeReportForeign struct { RaceName string ShipTypeReport } func (st ShipType) Equal(o ShipType) bool { return st.Drive == o.Drive && st.Weapons == o.Weapons && st.Armament == o.Armament && st.Shields == o.Shields && st.Cargo == o.Cargo } func (st ShipType) BlockMass(t Tech) float64 { switch t { case TechDrive: return st.DriveBlockMass() case TechWeapons: return st.WeaponsBlockMass() case TechShields: return st.ShieldsBlockMass() case TechCargo: return st.CargoBlockMass() default: panic("BlockMass: unexpectec tech: " + t.String()) } } func (st ShipType) DriveBlockMass() float64 { return st.Drive } func (st ShipType) WeaponsBlockMass() float64 { if st.Armament == 0 || st.Weapons == 0 { return 0 } return float64(st.Armament+1) * (st.Weapons / 2) } func (st ShipType) ShieldsBlockMass() float64 { return st.Shields } func (st ShipType) CargoBlockMass() float64 { return st.Cargo } func (st ShipType) EmptyMass() float64 { shipMass := st.DriveBlockMass() + st.ShieldsBlockMass() + st.CargoBlockMass() + st.WeaponsBlockMass() return shipMass } // ProductionCost returns Material (MAT) and Population (POP) to produce this [ShipType] // TODO: do we need this? func (st ShipType) ProductionCost() (mat float64, pop float64) { mat = st.EmptyMass() pop = mat * 10 return }