package game import ( "math" "github.com/google/uuid" e "github.com/iliadenisov/galaxy/pkg/error" ) type UnidentifiedPlanet struct { X float64 `json:"x"` Y float64 `json:"y"` Number uint `json:"number"` } type UninhabitedPlanet struct { UnidentifiedPlanet Size float64 `json:"size"` Name string `json:"name"` Resources float64 `json:"resources"` // R - Ресурсы / сырьё Capital float64 `json:"capital"` // CAP $ - Запасы промышленности Material float64 `json:"material"` // MAT M - Запасы ресурсов / сырья } type PlanetReport struct { UninhabitedPlanet Industry float64 `json:"industry"` // I - Промышленность Population float64 `json:"population"` // P - Население Colonists float64 `json:"colonists"` // COL C - Количество колонистов Production ProductionType `json:"production"` // TODO: internal/report format // Параметр "L" - Свободный производственный потенциал } type Planet struct { Owner uuid.UUID `json:"owner"` PlanetReport } type PlanetReportForeign struct { RaceName string PlanetReport } // Свободный производственный потенциал (L) // промышленность * 0.75 + население * 0.25 // TODO: за вычетом затрат, расходуемых в течение хода на модернизацию кораблей func (p Planet) ProductionCapacity() float64 { return p.Industry*0.75 + p.Population*0.25 } // Производство промышленности // TODO: test on real values func (p *Planet) IncreaseIndustry() { prod := p.ProductionCapacity() / 5 industryIncrement := math.Min(prod, p.Material) p.Industry += industryIncrement if p.Industry > p.Population { p.Industry = p.Population p.Capital += p.Population - p.Industry } } // Производство материалов // TODO: test on real values func (p *Planet) IncreaseMaterial() { p.Material += p.ProductionCapacity() * p.Industry } // Автоматическое увеличение населения на каждом ходу func (p *Planet) IncreasePopulation() { p.Population *= 1.08 var extraPopulation = p.Size - p.Population if extraPopulation > 0 { p.Colonists += extraPopulation / 8 p.Population -= extraPopulation } } func (g Game) RenamePlanet(raceName string, planetNumber int, typeName string) error { raceID, err := g.hostRaceID(raceName) if err != nil { return err } return g.renamePlanetInternal(raceID, planetNumber, typeName) } func (g Game) renamePlanetInternal(race uuid.UUID, number int, name string) error { n, ok := validateTypeName(name) if !ok { return e.NewEntityTypeNameValidationError("%q", n) } if number < 0 { return e.NewPlanetNumberError(number) } num := uint(number) for pl := range g.Map.Planet { if g.Map.Planet[pl].Number == num { if g.Map.Planet[pl].Owner != race { return e.NewEntityNotOwnedError("planet %#d", num) } g.Map.Planet[pl].Name = n return nil } } return e.NewEntityNotExistsError("planet #%d", number) }