@@ -52,23 +52,13 @@ func (e *Engine) SendCommand(command RefCommand, forTeam Team) {
5252 e .State .CommandFor = forTeam
5353 e .LogCommand ()
5454
55- if command .RunningState () {
56- if e .State .GameEvent .Type != GameEventNone {
57- e .State .GameEvent = GameEvent {Type : GameEventNone }
58- }
59- if e .State .GameEventSecondary .Type != GameEventNone {
60- e .State .GameEventSecondary = GameEvent {Type : GameEventNone }
61- }
55+ if command .RunningState () && len (e .State .GameEvents ) > 0 {
56+ e .State .GameEvents = []* GameEvent {}
6257 }
6358}
6459
65- func (e * Engine ) SendGameEventPrimary (gameEvent GameEvent ) {
66- e .State .GameEvent = gameEvent
67- e .LogGameEvent (gameEvent )
68- }
69-
70- func (e * Engine ) SendGameEventSecondary (gameEvent GameEvent ) {
71- e .State .GameEventSecondary = gameEvent
60+ func (e * Engine ) AddGameEvent (gameEvent GameEvent ) {
61+ e .State .GameEvents = append (e .State .GameEvents , & gameEvent )
7262 e .LogGameEvent (gameEvent )
7363}
7464
@@ -83,7 +73,31 @@ func (e *Engine) UndoLastAction() {
8373}
8474
8575func (e * Engine ) Continue () error {
86- switch e .State .GameEvent .Type {
76+ if len (e .State .GameEvents ) == 0 {
77+ return errors .New ("No game events available to determine next action" )
78+ }
79+ primaryEvent := e .State .GameEvents [0 ]
80+ teamInFavor := primaryEvent .ByTeam ().Opposite ()
81+
82+ if e .State .Division == DivA {
83+ for _ , event := range e .State .GameEvents {
84+ if event .Type == GameEventPlacementFailedByTeamInFavor {
85+ switch primaryEvent .Type {
86+ case
87+ GameEventGoal ,
88+ GameEventDefenderInDefenseArea ,
89+ GameEventMultipleYellowCards :
90+ default :
91+ // the placement failed by team in favor
92+ // the game is continued by the other team
93+ e .SendCommand (CommandIndirect , teamInFavor .Opposite ())
94+ }
95+ return nil
96+ }
97+ }
98+ }
99+
100+ switch primaryEvent .Type {
87101 case
88102 GameEventBallLeftFieldTouchLine ,
89103 GameEventIcing ,
@@ -96,7 +110,7 @@ func (e *Engine) Continue() error {
96110 GameEventDefenderInDefenseAreaPartially ,
97111 GameEventKickTimeout ,
98112 GameEventKeeperHeldBall :
99- e .SendCommand (CommandIndirect , e . State . GameEvent . ByTeam (). Opposite () )
113+ e .SendCommand (CommandIndirect , teamInFavor )
100114 case
101115 GameEventBallLeftFieldGoalLine ,
102116 GameEventIndirectGoal ,
@@ -105,30 +119,25 @@ func (e *Engine) Continue() error {
105119 GameEventBotCrashUnique ,
106120 GameEventBotPushedBot ,
107121 GameEventBotHeldBallDeliberately :
108- e .SendCommand (CommandDirect , e . State . GameEvent . ByTeam (). Opposite () )
122+ e .SendCommand (CommandDirect , teamInFavor )
109123 case
110124 GameEventGoal :
111- e .SendCommand (CommandKickoff , e . State . GameEvent . ByTeam (). Opposite () )
125+ e .SendCommand (CommandKickoff , teamInFavor )
112126 case
113127 GameEventBotCrashDrawn ,
114128 GameEventNoProgressInGame :
115129 e .SendCommand (CommandForceStart , TeamUnknown )
116130 case
117131 GameEventDefenderInDefenseArea ,
118132 GameEventMultipleYellowCards :
119- e .SendCommand (CommandPenalty , e . State . GameEvent . ByTeam (). Opposite () )
133+ e .SendCommand (CommandPenalty , teamInFavor )
120134 case
121135 GameEventBotInterferedPlacement ,
122136 GameEventDefenderTooCloseToKickPoint :
123137 if cmd , err := e .LastGameStartCommand (); err != nil {
124138 log .Print ("Warn: " , err )
125139 } else {
126- e .SendCommand (cmd , e .State .GameEvent .ByTeam ().Opposite ())
127- }
128- case
129- GameEventPlacementFailedByTeamInFavor :
130- if e .State .PlacementPos != nil {
131- e .SendCommand (CommandBallPlacement , e .State .GameEvent .ByTeam ().Opposite ())
140+ e .SendCommand (cmd , teamInFavor )
132141 }
133142 case
134143 GameEventBotTooFastInStop ,
@@ -137,10 +146,11 @@ func (e *Engine) Continue() error {
137146 GameEventBotCrashUniqueContinue ,
138147 GameEventBotPushedBotContinue ,
139148 GameEventMultipleFouls ,
149+ GameEventPlacementFailedByTeamInFavor ,
140150 GameEventPlacementFailedByOpponent :
141151 // no command
142152 default :
143- return errors .Errorf ("Unknown game event: %v" , e .State .GameEvent )
153+ return errors .Errorf ("Unknown game event: %v" , e .State .GameEvents )
144154 }
145155 return nil
146156}
@@ -177,7 +187,7 @@ func (e *Engine) appendHistory() {
177187
178188func (e * Engine ) LogGameEvent (event GameEvent ) {
179189 gameEvent := RefereeEvent {
180- Timestamp : e .TimeProvider (),
190+ Timestamp : e .TimeProvider (). UnixNano () ,
181191 StageTime : e .State .StageTimeElapsed ,
182192 Type : RefereeEventGameEvent ,
183193 Name : string (event .Type ),
@@ -189,7 +199,7 @@ func (e *Engine) LogGameEvent(event GameEvent) {
189199
190200func (e * Engine ) LogCommand () {
191201 refereeEvent := RefereeEvent {
192- Timestamp : e .TimeProvider (),
202+ Timestamp : e .TimeProvider (). UnixNano () ,
193203 StageTime : e .State .StageTimeElapsed ,
194204 Type : RefereeEventCommand ,
195205 Name : string (e .State .Command ),
@@ -200,7 +210,7 @@ func (e *Engine) LogCommand() {
200210
201211func (e * Engine ) LogCard (card * EventCard ) {
202212 refereeEvent := RefereeEvent {
203- Timestamp : e .TimeProvider (),
213+ Timestamp : e .TimeProvider (). UnixNano () ,
204214 StageTime : e .State .StageTimeElapsed ,
205215 Type : RefereeEventCard ,
206216 Name : fmt .Sprintf ("%v %v card" , card .Operation , card .Type ),
@@ -211,7 +221,7 @@ func (e *Engine) LogCard(card *EventCard) {
211221
212222func (e * Engine ) LogTime (description string , forTeam Team ) {
213223 refereeEvent := RefereeEvent {
214- Timestamp : e .TimeProvider (),
224+ Timestamp : e .TimeProvider (). UnixNano () ,
215225 StageTime : e .State .StageTimeElapsed ,
216226 Type : RefereeEventTime ,
217227 Name : description ,
@@ -222,7 +232,7 @@ func (e *Engine) LogTime(description string, forTeam Team) {
222232
223233func (e * Engine ) LogStage (stage Stage ) {
224234 refereeEvent := RefereeEvent {
225- Timestamp : e .TimeProvider (),
235+ Timestamp : e .TimeProvider (). UnixNano () ,
226236 StageTime : e .State .StageTimeElapsed ,
227237 Type : RefereeEventStage ,
228238 Name : string (stage ),
@@ -532,15 +542,11 @@ func (e *Engine) processGameEvent(event *GameEvent) error {
532542 addCard (& EventCard {Type : CardTypeRed , ForTeam : team , Operation : CardOperationAdd }, e .State .TeamState [team ], 0 )
533543 }
534544
535- if event .IsSecondary () {
536- e .SendGameEventSecondary (* event )
537- } else {
538- e .SendGameEventPrimary (* event )
539- e .State .PlacementPos = e .BallPlacementPos ()
540- }
545+ e .AddGameEvent (* event )
546+ e .State .PlacementPos = e .BallPlacementPos ()
541547
542548 if e .State .GameState () != GameStateHalted && ! event .IsContinued () {
543- teamInFavor := e . State . GameEvent .ByTeam ().Opposite ()
549+ teamInFavor := event .ByTeam ().Opposite ()
544550 if e .State .PlacementPos == nil {
545551 e .SendCommand (CommandStop , "" )
546552 } else if e .State .TeamState [teamInFavor ].CanPlaceBall {
0 commit comments