From bf34843568144332d189a4b2fdccefb965578a1e Mon Sep 17 00:00:00 2001 From: Ilia Denisov Date: Sun, 8 Feb 2026 15:47:59 +0200 Subject: [PATCH] minor refactor --- internal/controller/command.go | 7 +---- internal/controller/race.go | 8 ++++++ internal/controller/ship_group_move_test.go | 2 +- internal/controller/vote.go | 30 ++++++++++++--------- internal/controller/vote_test.go | 1 - internal/error/input.go | 1 - 6 files changed, 28 insertions(+), 21 deletions(-) diff --git a/internal/controller/command.go b/internal/controller/command.go index 8915bf0..8d82073 100644 --- a/internal/controller/command.go +++ b/internal/controller/command.go @@ -34,12 +34,7 @@ func (c Controller) UpdateRelation(actor, acceptor string, rel game.Relation) er if err != nil { return err } - var other int - if actor == acceptor { - other = ri - } else if other, err = c.Cache.validRace(acceptor); err != nil { - return err - } + other, err := c.Cache.validRace(acceptor) if err != nil { return err } diff --git a/internal/controller/race.go b/internal/controller/race.go index cfc34fd..b25f87f 100644 --- a/internal/controller/race.go +++ b/internal/controller/race.go @@ -137,6 +137,14 @@ func (c *Cache) wipeRace(ri int) { } p.Wipe() } + for i := range c.listRaceActingIdx() { + if i == ri { + continue + } + if c.g.Race[i].VoteFor == r.ID { + c.g.Race[i].VoteFor = c.g.Race[i].ID + } + } r.Votes = 0 r.VoteFor = r.ID r.Extinct = true diff --git a/internal/controller/ship_group_move_test.go b/internal/controller/ship_group_move_test.go index 044b8bc..a167f5c 100644 --- a/internal/controller/ship_group_move_test.go +++ b/internal/controller/ship_group_move_test.go @@ -44,6 +44,6 @@ func TestListMoveableGroupIds(t *testing.T) { for _, i := range movableGroups { sg := c.ShipGroup(i) assert.NotEqual(t, game.StateUpgrade, sg.State()) - assert.NotEqual(t, game.StateTransfer, sg.State()) // TODO: Transfer state movable or not? + assert.NotEqual(t, game.StateTransfer, sg.State()) } } diff --git a/internal/controller/vote.go b/internal/controller/vote.go index 0f61f7b..21b094d 100644 --- a/internal/controller/vote.go +++ b/internal/controller/vote.go @@ -56,24 +56,28 @@ func (c *Cache) TurnCalculateVotes() []int { return votingWinners(calc, c.g.Votes.F()) } -func VotingGraph(races []game.Race, raceIndex func(uuid.UUID) int) []*VoteNode { - nodes := make([]*VoteNode, len(races)) +func VotingGraph(races []game.Race, raceIndex func(uuid.UUID) int) map[int]*VoteNode { + nodes := make(map[int]*VoteNode, len(races)) for ri := range races { - // TODO: filter inactive (RIP) races + if races[ri].Extinct { + continue + } r := &races[ri] - if nodes[ri] == nil { + if _, ok := nodes[ri]; !ok { nodes[ri] = &VoteNode{ ID: ri, } } if r.VoteFor != r.ID { vid := raceIndex(r.VoteFor) - if nodes[vid] == nil { - nodes[vid] = &VoteNode{ - ID: vid, + if !races[vid].Extinct { + if _, ok := nodes[vid]; !ok { + nodes[vid] = &VoteNode{ + ID: vid, + } } + nodes[ri].Next = nodes[vid] } - nodes[ri].Next = nodes[vid] } } return nodes @@ -93,7 +97,7 @@ func (c *Cache) votesByRace() map[int]float64 { return result } -func GroupVotes(raceVotes map[int]float64, nodes []*VoteNode) []*VoteGroup { +func GroupVotes(raceVotes map[int]float64, nodes map[int]*VoteNode) []*VoteGroup { votes := maps.Clone(raceVotes) result := make([]*VoteGroup, 0) chains := VotingChains(nodes) @@ -131,11 +135,13 @@ func GroupVotes(raceVotes map[int]float64, nodes []*VoteNode) []*VoteGroup { return result } -func VotingChains(nodes []*VoteNode) [][]VoteNode { +func VotingChains(nodes map[int]*VoteNode) [][]VoteNode { visited := make(map[int]bool) result := make([][]VoteNode, 0) - for i := range nodes { - n := nodes[i] + raceIds := slices.Collect(maps.Keys(nodes)) + slices.Sort(raceIds) + for _, rid := range raceIds { + n := nodes[rid] if v, ok := visited[n.ID]; (ok && v) || n.Next == nil { continue } diff --git a/internal/controller/vote_test.go b/internal/controller/vote_test.go index e226284..dd0a33a 100644 --- a/internal/controller/vote_test.go +++ b/internal/controller/vote_test.go @@ -27,7 +27,6 @@ func TestVotesByRace(t *testing.T) { assert.Equal(t, 0.78, vbr[Race_0_idx]) assert.Contains(t, vbr, Race_1_idx) assert.Equal(t, 0.9, vbr[Race_1_idx]) - // TODO: add races without planets / dead races } func prepareRaces() ([]game.Race, func(u uuid.UUID) int) { diff --git a/internal/error/input.go b/internal/error/input.go index cc3d1c1..21d65e9 100644 --- a/internal/error/input.go +++ b/internal/error/input.go @@ -4,7 +4,6 @@ func NewRaceUnknownError(arg ...any) error { return newGenericError(ErrInputUnknownRace, arg...) } func NewSameRaceError(arg ...any) error { - // TODO: check all possible commands return newGenericError(ErrInputSameRace, arg...) }