@@ -82,19 +82,18 @@ func NewEngine(gameConfig config.Game, engineConfig config.Engine) (e *Engine) {
82
82
// Enqueue adds the change to the change queue
83
83
func (e * Engine ) Enqueue (change * statemachine.Change ) {
84
84
if change .GetAddGameEventChange () != nil {
85
- // Set creation timestamp
86
- gameEvent := change .GetAddGameEventChange ().GameEvent
87
- if gameEvent .CreatedTimestamp != nil {
88
- log .Printf ("Ignore existing created_timestamp in enqueued game event: %v" , gameEvent )
89
- }
90
- gameEvent .CreatedTimestamp = new (uint64 )
91
- * gameEvent .CreatedTimestamp = uint64 (e .timeProvider ().UnixMicro ())
92
-
93
- change = e .filterGameEvent (change )
85
+ change .GetAddGameEventChange ().GameEvent = e .processGameEvent (change .GetAddGameEventChange ().GameEvent )
86
+ change = e .handleGameEventBehavior (change )
94
87
if change == nil {
95
88
return
96
89
}
90
+ } else if change .GetAddPassiveGameEventChange () != nil {
91
+ change .GetAddPassiveGameEventChange ().GameEvent = e .processGameEvent (change .GetAddPassiveGameEventChange ().GameEvent )
92
+ } else if change .GetAddProposalChange () != nil {
93
+ log .Println ("Ignoring unexpected proposal change: " , change .GetAddProposalChange ())
94
+ return
97
95
}
96
+
98
97
if change .Revertible == nil {
99
98
change .Revertible = new (bool )
100
99
// Assume that changes from outside are by default revertible, except if the flag is already set
@@ -144,7 +143,40 @@ func isNonMajorityOrigin(origins []string) bool {
144
143
return false
145
144
}
146
145
147
- func (e * Engine ) filterGameEvent (change * statemachine.Change ) * statemachine.Change {
146
+ func (e * Engine ) processGameEvent (gameEvent * state.GameEvent ) * state.GameEvent {
147
+ // Set creation timestamp
148
+ if gameEvent .CreatedTimestamp != nil {
149
+ log .Printf ("Ignore existing created_timestamp in enqueued game event: %v" , gameEvent )
150
+ }
151
+ gameEvent .CreatedTimestamp = new (uint64 )
152
+ * gameEvent .CreatedTimestamp = uint64 (e .timeProvider ().UnixMicro ())
153
+
154
+ // convert aimless kick if necessary
155
+ if e .currentState .Division .Div () == config .DivA && * gameEvent .Type == state .GameEvent_AIMLESS_KICK {
156
+ return convertAimlessKick (gameEvent )
157
+ }
158
+ return gameEvent
159
+ }
160
+
161
+ // convertAimlessKick converts the aimless kick event into a ball left field via goal line event
162
+ // because aimless kick only applies to DivB
163
+ func convertAimlessKick (gameEvent * state.GameEvent ) * state.GameEvent {
164
+ log .Println ("Convert aimless kick to ball left field event, because we are in DivA" )
165
+ aimlessKick := & state.GameEvent {}
166
+ proto .Merge (aimlessKick , gameEvent )
167
+ eventType := state .GameEvent_BALL_LEFT_FIELD_GOAL_LINE
168
+ aimlessKick .Type = & eventType
169
+ aimlessKick .Event = & state.GameEvent_BallLeftFieldGoalLine {
170
+ BallLeftFieldGoalLine : & state.GameEvent_BallLeftField {
171
+ ByTeam : gameEvent .GetAimlessKick ().ByTeam ,
172
+ ByBot : gameEvent .GetAimlessKick ().ByBot ,
173
+ Location : gameEvent .GetAimlessKick ().Location ,
174
+ },
175
+ }
176
+ return aimlessKick
177
+ }
178
+
179
+ func (e * Engine ) handleGameEventBehavior (change * statemachine.Change ) * statemachine.Change {
148
180
gameEvent := change .GetAddGameEventChange ().GameEvent
149
181
behavior := e .config .GameEventBehavior [gameEvent .Type .String ()]
150
182
if isNonMajorityOrigin (gameEvent .Origin ) && behavior == Config_BEHAVIOR_ACCEPT_MAJORITY {
0 commit comments