race quit, transfer state, refactor
This commit is contained in:
+76
-44
@@ -2,6 +2,7 @@ package controller
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"iter"
|
||||
"slices"
|
||||
|
||||
e "github.com/iliadenisov/galaxy/internal/error"
|
||||
@@ -9,40 +10,11 @@ import (
|
||||
"github.com/iliadenisov/galaxy/internal/model/game"
|
||||
)
|
||||
|
||||
func (c Controller) Relation(from, to string) (game.Relation, error) {
|
||||
r1, err := c.Cache.raceIndex(from)
|
||||
if err != nil {
|
||||
return game.Relation(""), err
|
||||
}
|
||||
r2, err := c.Cache.raceIndex(to)
|
||||
if err != nil {
|
||||
return game.Relation(""), err
|
||||
}
|
||||
return c.Cache.Relation(r1, r2), nil
|
||||
}
|
||||
|
||||
func (c Controller) UpdateRelation(race, opponent string, rel game.Relation) error {
|
||||
ri, err := c.Cache.raceIndex(race)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var other int
|
||||
if race == opponent {
|
||||
other = ri
|
||||
} else if other, err = c.Cache.raceIndex(opponent); err != nil {
|
||||
return err
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return c.Cache.UpdateRelation(ri, other, rel)
|
||||
}
|
||||
|
||||
func (c *Cache) Relation(r1, r2 int) game.Relation {
|
||||
if c.cacheRelation == nil {
|
||||
c.cacheRelation = make(map[int]map[int]game.Relation)
|
||||
for r1 := range c.g.Race {
|
||||
for r2 := range c.g.Race {
|
||||
for r1 := range c.listRaceActingIdx() {
|
||||
for r2 := range c.listRaceActingIdx() {
|
||||
if r1 == r2 {
|
||||
continue
|
||||
}
|
||||
@@ -78,19 +50,6 @@ func (c *Cache) updateRelationCache(r1, r2 int, rel game.Relation) {
|
||||
c.cacheRelation[r1][r2] = rel
|
||||
}
|
||||
|
||||
func (c *Cache) GiveVotes(race, recipient string) error {
|
||||
ri, err := c.raceIndex(race)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
rec, err := c.raceIndex(recipient)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
c.g.Race[ri].VoteFor = c.g.Race[rec].ID
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Cache) Voted(ri int) int {
|
||||
c.validateRaceIndex(ri)
|
||||
return c.RaceIndex(c.g.Race[ri].VoteFor)
|
||||
@@ -123,6 +82,26 @@ func (c *Cache) validateRaceIndex(i int) {
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Cache) validActor(name string) (int, error) {
|
||||
i, err := c.validRace(name)
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
c.g.Race[i].TTL = 10
|
||||
return i, nil
|
||||
}
|
||||
|
||||
func (c *Cache) validRace(name string) (int, error) {
|
||||
i, err := c.raceIndex(name)
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
if c.g.Race[i].Extinct {
|
||||
return -1, e.NewRaceExinctError(name)
|
||||
}
|
||||
return i, nil
|
||||
}
|
||||
|
||||
func (c *Cache) raceIndex(name string) (int, error) {
|
||||
i := slices.IndexFunc(c.g.Race, func(r game.Race) bool { return r.Name == name })
|
||||
if i < 0 {
|
||||
@@ -135,3 +114,56 @@ func (c *Cache) raceTechLevel(ri int, t game.Tech, v float64) {
|
||||
c.validateRaceIndex(ri)
|
||||
c.g.Race[ri].Tech = c.g.Race[ri].Tech.Set(t, v)
|
||||
}
|
||||
|
||||
func (c *Cache) TurnWipeExtinctRaces() {
|
||||
for i := range c.listRaceActingIdx() {
|
||||
if c.g.Race[i].TTL == 0 {
|
||||
c.wipeRace(i)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Cache) wipeRace(ri int) {
|
||||
c.validateRaceIndex(ri)
|
||||
r := &c.g.Race[ri]
|
||||
c.g.ShipGroups = slices.DeleteFunc(c.g.ShipGroups, func(v game.ShipGroup) bool { return v.OwnerID == r.ID })
|
||||
c.g.Fleets = slices.DeleteFunc(c.g.Fleets, func(v game.Fleet) bool { return v.OwnerID == r.ID })
|
||||
clear(r.ShipTypes)
|
||||
clear(r.Sciences)
|
||||
for i := range c.g.Map.Planet {
|
||||
p := &c.g.Map.Planet[i]
|
||||
if p.Owner != nil && *p.Owner != r.ID {
|
||||
continue
|
||||
}
|
||||
p.Wipe()
|
||||
}
|
||||
r.Votes = 0
|
||||
r.VoteFor = r.ID
|
||||
r.Extinct = true
|
||||
r.TTL = 0
|
||||
c.invalidateFleetCache()
|
||||
c.invalidateShipGroupCache()
|
||||
}
|
||||
|
||||
func (c *Cache) listRaceActingIdx() iter.Seq[int] {
|
||||
return func(yield func(int) bool) {
|
||||
for i := range c.listRaceIdx() {
|
||||
if c.g.Race[i].Extinct {
|
||||
continue
|
||||
}
|
||||
if !yield(i) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Cache) listRaceIdx() iter.Seq[int] {
|
||||
return func(yield func(int) bool) {
|
||||
for i := range c.g.Race {
|
||||
if !yield(i) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user