Files
galaxy-game/internal/model/game/planet.go
T
2026-02-04 19:26:17 +02:00

154 lines
3.7 KiB
Go

package game
import (
"math"
"github.com/google/uuid"
)
type Planet struct {
X Float `json:"x"`
Y Float `json:"y"`
Number uint `json:"number"`
Size Float `json:"size"`
Name string `json:"name"`
Owner *uuid.UUID `json:"owner,omitempty"`
Resources Float `json:"resources"` // R - Ресурсы
Capital Float `json:"capital"` // CAP $ - Запасы промышленности
Material Float `json:"material"` // MAT M - Запасы ресурсов / сырьё
Industry Float `json:"industry"` // I - Промышленность
Population Float `json:"population"` // P - Население
Colonists Float `json:"colonists"` // COL C - Количество колонистов
Production Production `json:"production"`
Route map[RouteType]uint `json:"route"`
}
func (p *Planet) Own(v uuid.UUID) {
if v == uuid.Nil {
p.Free()
return
}
if p.Owner == nil || *p.Owner != v {
p.Production = ProductionCapital.AsType(uuid.Nil)
}
p.Owner = &v
}
func (p *Planet) Free() {
p.Owner = nil
p.Production = ProductionNone.AsType(uuid.Nil)
}
func (p Planet) Owned() bool {
return p.Owner != nil && *p.Owner != uuid.Nil
}
func (p Planet) OwnedBy(v uuid.UUID) bool {
if !p.Owned() {
return false
}
return *p.Owner == v
}
func (p *Planet) Mat(v float64) {
p.Material = F(v)
}
func (p *Planet) Pop(v float64) {
p.Population = F(v)
}
func (p *Planet) Col(v float64) {
p.Colonists = F(v)
}
func (p *Planet) Ind(v float64) {
p.Industry = F(v)
}
func (p *Planet) Cap(v float64) {
p.Capital = F(v)
}
func (p Planet) Votes() float64 {
return p.Population.F() / 1000.
}
// Производственный потенциал
func (p Planet) ProductionCapacity() float64 {
return PlanetProduction(p.Industry.F(), p.Population.F())
}
func PlanetProduction(industry, population float64) float64 {
return industry*0.75 + population*0.25
}
// Производство промышленности
// TODO: test on real values
// [x] ind * 5 + ind / res = prod
// [x] ind = (res * prod) / (5 * res + 1)
// ind = 10 * 1000 / (5 * 10 + 1) = 10000 / 55 = 181.(81)
// int = 10 * 500 / 55 = 5000 / 55
func (p *Planet) ProduceIndustry() {
production := p.ProductionCapacity()
var ind float64
if p.Material > 0 {
ind = math.Min(production/5, p.Material.F())
p.Mat(p.Material.F() - ind)
production -= ind * 5.
}
ind += (production * p.Resources.F()) / (5.*p.Resources.F() + 1.)
p.Ind(p.Industry.F() + ind)
if p.Industry > p.Population {
p.Capital += p.Industry - p.Population
p.Industry = p.Population
}
}
// Производство материалов
func (p *Planet) ProduceMaterial() {
p.Material = p.Material.Add(p.ProductionCapacity() * p.Resources.F())
}
// Автоматическое увеличение населения на каждом ходу
func (p *Planet) ProducePopulation() {
p.Population *= 1.08
if p.Population > p.Size {
p.Colonists += (p.Population - p.Size) / 8.
p.Population = p.Size
}
}
func (p *Planet) UnpackCapital() {
if p.Capital == 0 {
return
}
deficit := p.Population - p.Industry
if deficit > p.Capital {
deficit = p.Capital
}
p.Capital -= deficit
p.Industry += deficit
}
func (p *Planet) UnpackColonists() {
if p.Colonists == 0 {
return
}
deficit := (p.Size - p.Population) / 8
if deficit > p.Colonists {
deficit = p.Colonists
}
p.Colonists -= deficit
p.Population += deficit * 8
}
func UnloadColonists(p Planet, v float64) Planet {
p.Pop(p.Population.F() + v*8)
if p.Population > p.Size {
p.Col(p.Colonists.F() + (p.Population.F()-p.Size.F())/8.)
p.Pop(p.Size.F())
}
return p
}