Skip to content

Commit 8e6c988

Browse files
committed
Convert aimless kick for proposed events already
1 parent 7445894 commit 8e6c988

File tree

2 files changed

+42
-34
lines changed

2 files changed

+42
-34
lines changed

internal/app/engine/engine.go

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,18 @@ func NewEngine(gameConfig config.Game, engineConfig config.Engine) (e *Engine) {
8282
// Enqueue adds the change to the change queue
8383
func (e *Engine) Enqueue(change *statemachine.Change) {
8484
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)
9487
if change == nil {
9588
return
9689
}
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
9795
}
96+
9897
if change.Revertible == nil {
9998
change.Revertible = new(bool)
10099
// 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 {
144143
return false
145144
}
146145

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 {
148180
gameEvent := change.GetAddGameEventChange().GameEvent
149181
behavior := e.config.GameEventBehavior[gameEvent.Type.String()]
150182
if isNonMajorityOrigin(gameEvent.Origin) && behavior == Config_BEHAVIOR_ACCEPT_MAJORITY {

internal/app/statemachine/change_gameevent.go

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package statemachine
22

33
import (
44
"fmt"
5-
"github.com/RoboCup-SSL/ssl-game-controller/internal/app/config"
65
"github.com/RoboCup-SSL/ssl-game-controller/internal/app/geom"
76
"github.com/RoboCup-SSL/ssl-game-controller/internal/app/state"
87
"google.golang.org/protobuf/proto"
@@ -22,12 +21,6 @@ func (s *StateMachine) processChangeAddGameEvent(newState *state.State, change *
2221
return
2322
}
2423

25-
// convert aimless kick if necessary
26-
if newState.Division.Div() == config.DivA && *gameEvent.Type == state.GameEvent_AIMLESS_KICK {
27-
log.Println("Convert aimless kick to ball left field event, because we are in DivA")
28-
gameEvent = s.convertAimlessKick(change.GameEvent)
29-
}
30-
3124
// remember game event
3225
newState.GameEvents = append(newState.GameEvents, gameEvent)
3326

@@ -320,23 +313,6 @@ func (s *StateMachine) multipleFoulsChange(byTeam state.Team, events []*state.Ga
320313
)
321314
}
322315

323-
// convertAimlessKick converts the aimless kick event into a ball left field via goal line event
324-
// because aimless kick only applies to DivB
325-
func (s *StateMachine) convertAimlessKick(gameEvent *state.GameEvent) *state.GameEvent {
326-
eventType := state.GameEvent_BALL_LEFT_FIELD_GOAL_LINE
327-
return &state.GameEvent{
328-
Type: &eventType,
329-
Origin: gameEvent.Origin,
330-
Event: &state.GameEvent_BallLeftFieldGoalLine{
331-
BallLeftFieldGoalLine: &state.GameEvent_BallLeftField{
332-
ByTeam: gameEvent.GetAimlessKick().ByTeam,
333-
ByBot: gameEvent.GetAimlessKick().ByBot,
334-
Location: gameEvent.GetAimlessKick().Location,
335-
},
336-
},
337-
}
338-
}
339-
340316
// nextCommandForEvent determines the next command for the given event or returns the currently set one
341317
func (s *StateMachine) nextCommandForEvent(newState *state.State, gameEvent *state.GameEvent) (command *state.Command) {
342318
switch *gameEvent.Type {

0 commit comments

Comments
 (0)