Skip to content

Commit 22d560f

Browse files
committed
[bugfix] Queue skipped events first, apply on next game event or stop
1 parent 0772344 commit 22d560f

File tree

4 files changed

+51
-9
lines changed

4 files changed

+51
-9
lines changed

internal/app/controller/engine.go

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,8 @@ func (e *Engine) SendCommand(command RefCommand, forTeam Team) {
239239
e.State.TeamState[forTeam].TimeoutsLeft--
240240
} else if command == CommandNormalStart {
241241
e.updatePreStages()
242+
} else if command == CommandStop {
243+
e.applyQueuedGameEvents()
242244
}
243245

244246
if command.ContinuesGame() {
@@ -269,9 +271,14 @@ func (e *Engine) setCurrentActionTimeout(timeout time.Duration) {
269271
e.State.CurrentActionDeadline = e.TimeProvider().Add(e.State.CurrentActionTimeRemaining)
270272
}
271273

272-
func (e *Engine) AddGameEvent(gameEvent GameEvent) {
274+
func (e *Engine) AddGameEvent(gameEvent *GameEvent) {
273275
e.LogGameEvent(gameEvent, e.State.DeepCopy())
274-
e.State.GameEvents = append(e.State.GameEvents, &gameEvent)
276+
e.State.GameEvents = append(e.State.GameEvents, gameEvent)
277+
}
278+
279+
func (e *Engine) QueueGameEvent(gameEvent *GameEvent) {
280+
e.LogGameEventQueued(gameEvent, e.State.DeepCopy())
281+
e.State.GameEventsQueued = append(e.State.GameEventsQueued, gameEvent)
275282
}
276283

277284
func (e *Engine) Continue() {
@@ -283,7 +290,7 @@ func (e *Engine) Continue() {
283290
Type: GameEventBotSubstitution,
284291
Details: GameEventDetails{
285292
BotSubstitution: &refproto.GameEvent_BotSubstitution{ByTeam: &teamProto}}}
286-
e.AddGameEvent(event)
293+
e.AddGameEvent(&event)
287294
e.LogHint("botSubstitution", "game halted for bot substitution", substitutionIntend)
288295
e.State.TeamState[TeamBlue].BotSubstitutionIntend = false
289296
e.State.TeamState[TeamYellow].BotSubstitutionIntend = false
@@ -822,11 +829,15 @@ func (e *Engine) processGameEvent(event *GameEvent) error {
822829
e.GcState.GameEventProposals = e.collectNonMatchingProposals(event)
823830

824831
if e.disabledGameEvent(event.Type) {
825-
e.LogIgnoredGameEvent(*event)
832+
e.LogIgnoredGameEvent(event)
826833
return nil
827834
}
828835
event.SetOccurred(e.TimeProvider())
829836

837+
e.applyQueuedGameEvents()
838+
839+
e.AddGameEvent(event)
840+
830841
var additionalEvents []*GameEvent
831842

832843
if event.IncrementsFoulCounter() {
@@ -848,8 +859,6 @@ func (e *Engine) processGameEvent(event *GameEvent) error {
848859
}
849860
}
850861

851-
e.AddGameEvent(*event)
852-
853862
if event.AddsYellowCard() {
854863
team := event.ByTeam()
855864
if team.Unknown() {
@@ -934,6 +943,16 @@ func (e *Engine) processGameEvent(event *GameEvent) error {
934943
return nil
935944
}
936945

946+
func (e *Engine) applyQueuedGameEvents() {
947+
queuedGameEvents := e.State.GameEventsQueued
948+
e.State.GameEventsQueued = []*GameEvent{}
949+
for _, queuedEvent := range queuedGameEvents {
950+
if err := e.processGameEvent(queuedEvent); err != nil {
951+
log.Print("Could not process queued game event: ", err)
952+
}
953+
}
954+
}
955+
937956
func (e *Engine) placeBall(event *GameEvent) {
938957
teamInFavor := event.ByTeam().Opposite()
939958

internal/app/controller/protocol.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ const (
2121
UiProtocolTime UiProtocolType = "time"
2222
// UiProtocolGameEvent represents an issued game event
2323
UiProtocolGameEvent UiProtocolType = "gameEvent"
24+
// UiProtocolGameEvent represents an issued game event
25+
UiProtocolGameEventQueued UiProtocolType = "gameEventQueued"
2426
// UiProtocolGameEventIgnored represents a detected game event that was not issued
2527
UiProtocolGameEventIgnored UiProtocolType = "ignoredGameEvent"
2628
// UiProtocolModify represents a manual modification on the state
@@ -48,7 +50,7 @@ type ProtocolEntry struct {
4850
}
4951

5052
// LogGameEvent adds a game event to the protocol
51-
func (e *Engine) LogGameEvent(event GameEvent, prevState *State) {
53+
func (e *Engine) LogGameEvent(event *GameEvent, prevState *State) {
5254
log.Printf("Log game event: %v", event)
5355
entry := ProtocolEntry{
5456
Id: e.newGlobalProtocolEntryId(),
@@ -63,8 +65,24 @@ func (e *Engine) LogGameEvent(event GameEvent, prevState *State) {
6365
e.PersistentState.Add(&entry)
6466
}
6567

68+
// LogGameEvent adds a game event to the protocol
69+
func (e *Engine) LogGameEventQueued(event *GameEvent, prevState *State) {
70+
log.Printf("Log queued game event: %v", event)
71+
entry := ProtocolEntry{
72+
Id: e.newGlobalProtocolEntryId(),
73+
Timestamp: e.TimeProvider().UnixNano(),
74+
StageTime: e.State.StageTimeElapsed,
75+
Type: UiProtocolGameEventQueued,
76+
Name: string(event.Type),
77+
Team: event.ByTeam(),
78+
Description: event.Details.String(),
79+
PreviousState: prevState,
80+
}
81+
e.PersistentState.Add(&entry)
82+
}
83+
6684
// LogIgnoredGameEvent adds an ignored game event to the protocol
67-
func (e *Engine) LogIgnoredGameEvent(event GameEvent) {
85+
func (e *Engine) LogIgnoredGameEvent(event *GameEvent) {
6886
log.Printf("Log ignored game event: %v", event)
6987
entry := ProtocolEntry{
7088
Id: e.newGlobalProtocolEntryId(),

internal/app/controller/state.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,7 @@ type State struct {
406406
Command RefCommand `json:"command" yaml:"command"`
407407
CommandFor Team `json:"commandForTeam" yaml:"commandForTeam"`
408408
GameEvents []*GameEvent `json:"gameEvents" yaml:"gameEvents"`
409+
GameEventsQueued []*GameEvent `json:"gameEventsQueued" yaml:"gameEvents"`
409410
StageTimeElapsed time.Duration `json:"stageTimeElapsed" yaml:"stageTimeElapsed"`
410411
StageTimeLeft time.Duration `json:"stageTimeLeft" yaml:"stageTimeLeft"`
411412
MatchTimeStart time.Time `json:"matchTimeStart" yaml:"matchTimeStart"`
@@ -426,6 +427,7 @@ func NewState() (s *State) {
426427
s.Stage = StagePreGame
427428
s.Command = CommandHalt
428429
s.GameEvents = []*GameEvent{}
430+
s.GameEventsQueued = []*GameEvent{}
429431

430432
s.StageTimeLeft = 0
431433
s.StageTimeElapsed = 0
@@ -448,6 +450,8 @@ func (s *State) DeepCopy() (c *State) {
448450
*c = *s
449451
c.GameEvents = make([]*GameEvent, len(s.GameEvents))
450452
copy(c.GameEvents, s.GameEvents)
453+
c.GameEventsQueued = make([]*GameEvent, len(s.GameEventsQueued))
454+
copy(c.GameEventsQueued, s.GameEventsQueued)
451455
if s.PlacementPos != nil {
452456
c.PlacementPos = new(Location)
453457
*c.PlacementPos = *s.PlacementPos

internal/app/controller/teamConnection.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,11 @@ func (c *GameController) ProcessTeamRequests(teamName string, request refproto.T
6060
default:
6161
return errors.Errorf("Unsupported advantage choice game event: %v", c.outstandingTeamChoice.Event.GameEvent.Type)
6262
}
63+
c.Engine.QueueGameEvent(c.outstandingTeamChoice.Event.GameEvent)
6364
} else {
6465
log.Printf("Team %v decided to stop the game within %v", c.outstandingTeamChoice.Team, responseTime)
66+
c.OnNewEvent(c.outstandingTeamChoice.Event)
6567
}
66-
c.OnNewEvent(c.outstandingTeamChoice.Event)
6768
c.outstandingTeamChoice = nil
6869
return nil
6970
}

0 commit comments

Comments
 (0)