package game import ( "math" "github.com/iliadenisov/galaxy/pkg/number" ) type ShipType struct { Name string Drive float64 // [0], [1...] Armament uint Weapons float64 // [0], [1...] Shields float64 // [0], [1...] Cargo float64 // [0], [1...] } type ShipGroup struct { Type ShipType Number uint State string // TODO: kinda enum: In_Orbit, In_Space, Transfer_State, Upgrade Load float64 // Cargo loaded - "Масса груза" Drive float64 Weapons float64 Shields float64 Cargo float64 } type Fleet struct { ShipGroups []ShipGroup } // TODO: test on real values func (st ShipType) EmptyMass() float64 { shipMass := st.DriveMass() + st.ShieldsMass() + st.CargoMass() + st.WeaponsMass() return shipMass } func (st ShipType) DriveMass() float64 { return st.Drive } func (st ShipType) ShieldsMass() float64 { return st.Shields } func (st ShipType) CargoMass() float64 { return st.Cargo } func (st ShipType) WeaponsMass() float64 { return float64(st.Armament)*(st.Weapons/2) + st.Weapons/2 } // Грузоподъёмность func (sg ShipGroup) CargoCapacity() float64 { return sg.Drive * (sg.Type.Cargo + (sg.Type.Cargo*sg.Type.Cargo)/20) } // "Масса перевозимого груза" func (sg ShipGroup) CarryingMass() float64 { return sg.Load / sg.Cargo } func (sg ShipGroup) FullMass() float64 { return sg.Type.EmptyMass() + sg.CarryingMass() } // "Эффективность двигателя" // равна мощности Двигателей умноженной на текущий технологический уровень блока Двигателей func (sg ShipGroup) DriveEffective() float64 { return sg.Type.Drive * sg.Drive } // TODO: test this func (sg ShipGroup) Speed() float64 { return sg.DriveEffective() * 20 / sg.FullMass() } func (sg ShipGroup) UpgradeDriveCost(drive float64) float64 { return (1 - sg.Drive/drive) * 10 * sg.Type.Drive } // TODO: test on other values func (sg ShipGroup) UpgradeWeaponsCost(weapons float64) float64 { return (1 - sg.Weapons/weapons) * 10 * sg.Type.WeaponsMass() } func (sg ShipGroup) UpgradeShieldsCost(shields float64) float64 { return (1 - sg.Shields/shields) * 10 * sg.Type.Shields } func (sg ShipGroup) UpgradeCargoCost(cargo float64) float64 { return (1 - sg.Cargo/cargo) * 10 * sg.Type.Cargo } // Мощность бомбардировки // TODO: maybe rounding must be done only for display? func (sg ShipGroup) BombingPower() float64 { // return math.Sqrt(sg.Type.Weapons * sg.Weapons) result := (math.Sqrt(sg.Type.Weapons*sg.Weapons)/10. + 1.) * sg.Type.Weapons * sg.Weapons * float64(sg.Type.Armament) * float64(sg.Number) return number.Fixed3(result) } // TODO: test this func (fl Fleet) Speed() float64 { result := math.MaxFloat64 for _, sg := range fl.ShipGroups { if sg.Speed() < result { result = sg.Speed() } } return result }