Skip to content

Commit a045c6d

Browse files
committed
[feature] Preserve game event details from all autoRefs
1 parent d60e55c commit a045c6d

7 files changed

+49
-47
lines changed

internal/app/controller/autoRefConnection.go

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -17,79 +17,70 @@ func (c *GameController) ProcessAutoRefRequests(id string, request refproto.Auto
1717
log.Printf("Received request from autoRef '%v': %v", id, request)
1818

1919
details := GameEventDetailsFromProto(*request.GameEvent)
20-
event := Event{GameEvent: &GameEvent{Type: details.EventType(), Details: details}}
20+
gameEvent := GameEvent{Type: details.EventType(), Details: details}
2121

22-
c.Engine.applyGameEventFilters(event.GameEvent)
22+
c.Engine.applyGameEventFilters(&gameEvent)
2323

2424
validUntil := c.Engine.TimeProvider().Add(c.Config.Game.AutoRefProposalTimeout)
25-
proposal := GameEventProposal{GameEvent: *event.GameEvent, ProposerId: id, ValidUntil: validUntil}
26-
27-
if matchingEvent := c.Engine.State.FindMatchingRecentGameEvent(event.GameEvent); matchingEvent != nil {
28-
// there was already such a game event recently. Just add the proposer to the existing event.
29-
matchingEvent.Origins = append(matchingEvent.Origins, id)
30-
} else if c.Engine.applyMajority(&event) { // look for a majority
25+
proposal := GameEventProposal{GameEvent: gameEvent, ProposerId: id, ValidUntil: validUntil}
26+
proposal.GameEvent.Origins = []string{id}
3127

28+
recentGameEvent := c.Engine.State.IsRecentGameEvent(&gameEvent)
29+
if !recentGameEvent && c.Engine.applyMajority(&gameEvent) {
30+
log.Printf("Apply majority logic to autoRef proposal %v", proposal)
3231
if c.Engine.isNewProposal(&proposal) {
3332
// the autoRef has not submitted the same event recently, so add it to the proposals - waiting for majority
3433
c.Engine.GcState.GameEventProposals = append(c.Engine.GcState.GameEventProposals, &proposal)
3534
}
3635

37-
numProposals := c.Engine.numberOfMatchingProposals(event.GameEvent)
36+
matchingProposals := c.Engine.collectAllMatchingProposals(&gameEvent)
37+
numProposals := len(matchingProposals)
3838
majority := int(math.Floor(float64(len(c.AutoRefServer.Clients)) / 2.0))
3939
if numProposals > majority {
4040
// there is a majority for a game event that has not yet been submitted to the GC
41-
// remove the matching proposals and submit the event to the GC
42-
c.OnNewEvent(event)
41+
// remove the matching proposals and submit the events to the GC
42+
log.Printf("Majority (%v > %v) for %v", numProposals, majority, gameEvent)
43+
for _, proposal := range matchingProposals {
44+
c.OnNewEvent(Event{GameEvent: &proposal.GameEvent})
45+
}
46+
c.Engine.GcState.GameEventProposals = c.Engine.collectNonMatchingProposals(gameEvent.Type)
4347
}
44-
4548
} else {
46-
// game event has not been submitted recently (by any autoRef) and no majority required.
47-
// Just submit this event
48-
event.GameEvent.Origins = []string{id}
49-
c.OnNewEvent(event)
49+
// no majority required or event submitted recently. Submit event to engine
50+
log.Printf("Submit %v game event proposal to engine: %v", recentGameEventString(recentGameEvent), gameEvent)
51+
c.OnNewEvent(Event{GameEvent: &gameEvent})
5052
}
5153

5254
return nil
5355
}
5456

55-
func (e *Engine) numberOfMatchingProposals(event *GameEvent) (count int) {
56-
count = 0
57-
for _, proposal := range e.GcState.GameEventProposals {
58-
if proposal.GameEvent.Type == event.Type && e.proposalValid(proposal) {
59-
count++
60-
}
57+
func recentGameEventString(isRecent bool) string {
58+
if isRecent {
59+
return "recent"
6160
}
62-
return
61+
return "new"
6362
}
6463

6564
func (e *Engine) collectAllMatchingProposals(event *GameEvent) []*GameEventProposal {
6665
var proposals []*GameEventProposal
6766
for _, proposal := range e.GcState.GameEventProposals {
68-
if proposal.GameEvent.Type == event.Type {
67+
if proposal.GameEvent.Type == event.Type && e.proposalValid(proposal) {
6968
proposals = append(proposals, proposal)
7069
}
7170
}
7271
return proposals
7372
}
7473

75-
func (e *Engine) collectNonMatchingProposals(event *GameEvent) []*GameEventProposal {
74+
func (e *Engine) collectNonMatchingProposals(eventType GameEventType) []*GameEventProposal {
7675
var proposals []*GameEventProposal
7776
for _, proposal := range e.GcState.GameEventProposals {
78-
if proposal.GameEvent.Type != event.Type {
77+
if proposal.GameEvent.Type != eventType {
7978
proposals = append(proposals, proposal)
8079
}
8180
}
8281
return proposals
8382
}
8483

85-
func collectAllOrigins(proposals []*GameEventProposal) []string {
86-
var origins []string
87-
for _, proposal := range proposals {
88-
origins = append(origins, proposal.ProposerId)
89-
}
90-
return origins
91-
}
92-
9384
func (e *Engine) proposalValid(proposal *GameEventProposal) bool {
9485
return proposal.ValidUntil.After(e.TimeProvider())
9586
}
@@ -105,6 +96,6 @@ func (e *Engine) isNewProposal(newProposal *GameEventProposal) bool {
10596
return true
10697
}
10798

108-
func (e *Engine) applyMajority(event *Event) bool {
109-
return e.GcState.GameEventBehavior[event.GameEvent.Type] == GameEventBehaviorMajority
99+
func (e *Engine) applyMajority(event *GameEvent) bool {
100+
return e.GcState.GameEventBehavior[event.Type] == GameEventBehaviorMajority
110101
}

internal/app/controller/engine.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -823,16 +823,22 @@ func (e *Engine) processGameEvent(event *GameEvent) error {
823823
return errors.Errorf("Incomplete game event: %v", event)
824824
}
825825

826+
log.Printf("Processing game event %v", event)
827+
828+
event.SetOccurred(e.TimeProvider())
829+
826830
e.applyGameEventFilters(event)
827831

828-
event.Origins = append(event.Origins, collectAllOrigins(e.collectAllMatchingProposals(event))...)
829-
e.GcState.GameEventProposals = e.collectNonMatchingProposals(event)
832+
if e.State.IsRecentGameEvent(event) {
833+
// only add event to list, not to protocol
834+
e.State.GameEvents = append(e.State.GameEvents, event)
835+
return nil
836+
}
830837

831838
if e.disabledGameEvent(event.Type) {
832839
e.LogIgnoredGameEvent(event)
833840
return nil
834841
}
835-
event.SetOccurred(e.TimeProvider())
836842

837843
e.applyQueuedGameEvents()
838844

internal/app/controller/state.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,11 @@ func (s *State) FindMatchingRecentGameEvent(event *GameEvent) *GameEvent {
571571
return nil
572572
}
573573

574+
func (s *State) IsRecentGameEvent(event *GameEvent) bool {
575+
matchingEvent := s.FindMatchingRecentGameEvent(event)
576+
return matchingEvent != nil
577+
}
578+
574579
// Location is a two-dimensional coordinate
575580
type Location struct {
576581
X float64 `json:"x" yaml:"x"`

internal/app/controller/testdata/engine_test_gameevent_placement_fail_twice_bothCanPlace_divA.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ transitions:
9696
teamState:
9797
Blue:
9898
ballPlacementFailures: 4
99-
- tick: 1s # make sure that the stage time is not proceeded
99+
- tick: 5s # make sure that the stage time is not proceeded
100100
expectedStateDiff:
101-
currentActionTimeRemaining: 29s
101+
currentActionTimeRemaining: 25s
102102
placementPos:
103103
x: 5.8
104104
y: 4.3

internal/app/controller/testdata/engine_test_gameevent_placement_fail_twice_bothCanPlace_divA_collision.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ transitions:
9696
teamState:
9797
Blue:
9898
ballPlacementFailures: 4
99-
- tick: 1s # make sure that the stage time is not proceeded
99+
- tick: 5s # make sure that the stage time is not proceeded
100100
expectedStateDiff:
101-
currentActionTimeRemaining: 29s
101+
currentActionTimeRemaining: 25s
102102
placementPos:
103103
x: 2.0
104104
y: 1.0

internal/app/controller/testdata/engine_test_gameevent_placement_fail_twice_bothCanPlace_divB.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ transitions:
9696
teamState:
9797
Blue:
9898
ballPlacementFailures: 4
99-
- tick: 1s # make sure that the stage time is not proceeded
99+
- tick: 5s # make sure that the stage time is not proceeded
100100
expectedStateDiff:
101-
currentActionTimeRemaining: 29s
101+
currentActionTimeRemaining: 25s
102102
placementPos:
103103
x: 4.3
104104
y: 2.8

internal/app/controller/testdata/engine_test_gameevent_placement_fail_twice_bothCanPlace_divB_collision.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ transitions:
9696
teamState:
9797
Blue:
9898
ballPlacementFailures: 4
99-
- tick: 1s # make sure that the stage time is not proceeded
99+
- tick: 5s # make sure that the stage time is not proceeded
100100
expectedStateDiff:
101-
currentActionTimeRemaining: 29s
101+
currentActionTimeRemaining: 25s
102102
placementPos:
103103
x: 2.0
104104
y: 1.0

0 commit comments

Comments
 (0)