package generator import ( "fmt" "math" ) func (m *Map) CreatePlanets(num int, deadZoneRadius float32, size, resources func() float32) error { for range num { coord, err := m.NewCoordinate(deadZoneRadius) if err != nil { return err } planet := NewPlanet(coord, size(), resources()) m.AddPlanet(planet) } return nil } func Generate(cfg ...func(*MapSetting)) (Map, error) { ms := DefaultMapSetting() for i := range cfg { cfg[i](&ms) } // TODO: pre-calculate sufficient map size var mapSize uint32 = 200 m, err := NewMap(mapSize, mapSize, ms.Players) if err != nil { return Map{}, fmt.Errorf("NewMap: %s", err) } totalPlanets := ms.Players * 10 // TODO: why 10? freePlanets := totalPlanets - ms.Players*(ms.DWCount+1) // 1. Place Giant planets giantsNum := int(math.Ceil(float64(freePlanets) * float64(ms.GiantPlanets.Probability))) m.CreatePlanets(giantsNum, float32(ms.GiantPlanets.MinDistanceHW), RandIFn(ms.GiantPlanets.MinSize, ms.GiantPlanets.MaxSize), RandIFn(ms.GiantPlanets.MinResource, ms.GiantPlanets.MaxResource), ) // 2. Place Big planets bigsNum := int(math.Ceil(float64(freePlanets) * float64(ms.BigPlanets.Probability))) m.CreatePlanets(bigsNum, float32(ms.BigPlanets.MinDistanceHW), RandIFn(ms.BigPlanets.MinSize, ms.BigPlanets.MaxSize), RandIFn(ms.BigPlanets.MinResource, ms.BigPlanets.MaxResource), ) // X. Place players' Home Worlds for player := 0; player < int(ms.Players); player++ { coord, err := m.NewCoordinate(float32(ms.HWMinDistance)) if err != nil { return Map{}, err } planet := NewPlanet(coord, float32(ms.HWSize), float32(ms.HWResources)) m.HomePlanets[player] = PlanetarySystem{HW: planet} } m.plotter.Clear() for i := range m.HomePlanets { m.plotter.MarkDeadZone(m.HomePlanets[i].HW.Position.X, m.HomePlanets[i].HW.Position.Y, 5) for j := range m.HomePlanets[i].DW { m.plotter.MarkDeadZone(m.HomePlanets[i].DW[j].Position.X, m.HomePlanets[i].DW[j].Position.Y, 5) } } for i := range m.FreePlanets { m.plotter.MarkDeadZone(m.FreePlanets[i].Position.X, m.FreePlanets[i].Position.Y, 5) } return *m, nil }