Skip to content

Commit 017914e

Browse files
committed
Feature: More specific game event behavior config
1 parent 0c917d4 commit 017914e

File tree

12 files changed

+440
-266
lines changed

12 files changed

+440
-266
lines changed

config/engine.yaml

Lines changed: 33 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,38 @@
11
{
22
"gameEventBehavior": {
3-
"AIMLESS_KICK": "GAME_EVENT_BEHAVIOR_ON",
4-
"ATTACKER_DOUBLE_TOUCHED_BALL": "GAME_EVENT_BEHAVIOR_ON",
5-
"ATTACKER_TOO_CLOSE_TO_DEFENSE_AREA": "GAME_EVENT_BEHAVIOR_ON",
6-
"ATTACKER_TOUCHED_BALL_IN_DEFENSE_AREA": "GAME_EVENT_BEHAVIOR_ON",
7-
"ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA": "GAME_EVENT_BEHAVIOR_ON",
8-
"ATTACKER_TOUCHED_OPPONENT_IN_DEFENSE_AREA_SKIPPED": "GAME_EVENT_BEHAVIOR_ON",
9-
"BALL_LEFT_FIELD_GOAL_LINE": "GAME_EVENT_BEHAVIOR_ON",
10-
"BALL_LEFT_FIELD_TOUCH_LINE": "GAME_EVENT_BEHAVIOR_ON",
11-
"BOT_CRASH_DRAWN": "GAME_EVENT_BEHAVIOR_ON",
12-
"BOT_CRASH_UNIQUE": "GAME_EVENT_BEHAVIOR_ON",
13-
"BOT_CRASH_UNIQUE_SKIPPED": "GAME_EVENT_BEHAVIOR_ON",
14-
"BOT_DRIBBLED_BALL_TOO_FAR": "GAME_EVENT_BEHAVIOR_ON",
15-
"BOT_HELD_BALL_DELIBERATELY": "GAME_EVENT_BEHAVIOR_ON",
16-
"BOT_INTERFERED_PLACEMENT": "GAME_EVENT_BEHAVIOR_ON",
17-
"BOT_KICKED_BALL_TOO_FAST": "GAME_EVENT_BEHAVIOR_ON",
18-
"BOT_PUSHED_BOT": "GAME_EVENT_BEHAVIOR_ON",
19-
"BOT_PUSHED_BOT_SKIPPED": "GAME_EVENT_BEHAVIOR_ON",
20-
"BOT_SUBSTITUTION": "GAME_EVENT_BEHAVIOR_ON",
21-
"BOT_TIPPED_OVER": "GAME_EVENT_BEHAVIOR_ON",
22-
"BOT_TOO_FAST_IN_STOP": "GAME_EVENT_BEHAVIOR_ON",
23-
"BOUNDARY_CROSSING": "GAME_EVENT_BEHAVIOR_ON",
24-
"CHIPPED_GOAL": "GAME_EVENT_BEHAVIOR_ON",
25-
"DEFENDER_IN_DEFENSE_AREA": "GAME_EVENT_BEHAVIOR_ON",
26-
"DEFENDER_IN_DEFENSE_AREA_PARTIALLY": "GAME_EVENT_BEHAVIOR_ON",
27-
"DEFENDER_TOO_CLOSE_TO_KICK_POINT": "GAME_EVENT_BEHAVIOR_ON",
28-
"GOAL": "GAME_EVENT_BEHAVIOR_ON",
29-
"INDIRECT_GOAL": "GAME_EVENT_BEHAVIOR_ON",
30-
"INVALID_GOAL": "GAME_EVENT_BEHAVIOR_ON",
31-
"KEEPER_HELD_BALL": "GAME_EVENT_BEHAVIOR_ON",
32-
"KICK_TIMEOUT": "GAME_EVENT_BEHAVIOR_ON",
33-
"MULTIPLE_CARDS": "GAME_EVENT_BEHAVIOR_ON",
34-
"MULTIPLE_FOULS": "GAME_EVENT_BEHAVIOR_ON",
35-
"MULTIPLE_PLACEMENT_FAILURES": "GAME_EVENT_BEHAVIOR_ON",
36-
"NO_PROGRESS_IN_GAME": "GAME_EVENT_BEHAVIOR_ON",
37-
"PENALTY_KICK_FAILED": "GAME_EVENT_BEHAVIOR_ON",
38-
"PLACEMENT_FAILED": "GAME_EVENT_BEHAVIOR_ON",
39-
"PLACEMENT_SUCCEEDED": "GAME_EVENT_BEHAVIOR_ON",
40-
"POSSIBLE_GOAL": "GAME_EVENT_BEHAVIOR_ON",
41-
"PREPARED": "GAME_EVENT_BEHAVIOR_ON",
42-
"TOO_MANY_ROBOTS": "GAME_EVENT_BEHAVIOR_ON",
43-
"UNKNOWN_GAME_EVENT_TYPE": "GAME_EVENT_BEHAVIOR_ON",
44-
"UNSPORTING_BEHAVIOR_MAJOR": "GAME_EVENT_BEHAVIOR_ON",
45-
"UNSPORTING_BEHAVIOR_MINOR": "GAME_EVENT_BEHAVIOR_ON"
3+
"AIMLESS_KICK": "BEHAVIOR_ACCEPT",
4+
"ATTACKER_DOUBLE_TOUCHED_BALL": "BEHAVIOR_ACCEPT",
5+
"ATTACKER_TOO_CLOSE_TO_DEFENSE_AREA": "BEHAVIOR_ACCEPT",
6+
"ATTACKER_TOUCHED_BALL_IN_DEFENSE_AREA": "BEHAVIOR_ACCEPT",
7+
"BALL_LEFT_FIELD_GOAL_LINE": "BEHAVIOR_ACCEPT",
8+
"BALL_LEFT_FIELD_TOUCH_LINE": "BEHAVIOR_ACCEPT",
9+
"BOT_CRASH_DRAWN": "BEHAVIOR_ACCEPT",
10+
"BOT_CRASH_UNIQUE": "BEHAVIOR_ACCEPT",
11+
"BOT_DRIBBLED_BALL_TOO_FAR": "BEHAVIOR_ACCEPT",
12+
"BOT_HELD_BALL_DELIBERATELY": "BEHAVIOR_ACCEPT",
13+
"BOT_INTERFERED_PLACEMENT": "BEHAVIOR_ACCEPT",
14+
"BOT_KICKED_BALL_TOO_FAST": "BEHAVIOR_ACCEPT",
15+
"BOT_PUSHED_BOT": "BEHAVIOR_ACCEPT",
16+
"BOT_SUBSTITUTION": "BEHAVIOR_ACCEPT",
17+
"BOT_TIPPED_OVER": "BEHAVIOR_ACCEPT",
18+
"BOT_TOO_FAST_IN_STOP": "BEHAVIOR_ACCEPT",
19+
"BOUNDARY_CROSSING": "BEHAVIOR_ACCEPT",
20+
"DEFENDER_IN_DEFENSE_AREA": "BEHAVIOR_ACCEPT",
21+
"DEFENDER_TOO_CLOSE_TO_KICK_POINT": "BEHAVIOR_ACCEPT",
22+
"GOAL": "BEHAVIOR_ACCEPT",
23+
"INVALID_GOAL": "BEHAVIOR_ACCEPT",
24+
"KEEPER_HELD_BALL": "BEHAVIOR_ACCEPT",
25+
"MULTIPLE_CARDS": "BEHAVIOR_ACCEPT",
26+
"MULTIPLE_FOULS": "BEHAVIOR_ACCEPT",
27+
"NO_PROGRESS_IN_GAME": "BEHAVIOR_ACCEPT",
28+
"PENALTY_KICK_FAILED": "BEHAVIOR_ACCEPT",
29+
"PLACEMENT_FAILED": "BEHAVIOR_ACCEPT",
30+
"PLACEMENT_SUCCEEDED": "BEHAVIOR_ACCEPT",
31+
"POSSIBLE_GOAL": "BEHAVIOR_ACCEPT",
32+
"TOO_MANY_ROBOTS": "BEHAVIOR_ACCEPT",
33+
"UNKNOWN_GAME_EVENT_TYPE": "BEHAVIOR_ACCEPT",
34+
"UNSPORTING_BEHAVIOR_MAJOR": "BEHAVIOR_ACCEPT",
35+
"UNSPORTING_BEHAVIOR_MINOR": "BEHAVIOR_ACCEPT"
4636
},
4737
"autoRefConfigs": {
4838
}

internal/app/engine/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import (
1212

1313
func DefaultConfig() (c Config) {
1414
c.AutoRefConfigs = map[string]*AutoRefConfig{}
15-
c.GameEventBehavior = map[string]Config_GameEventBehavior{}
15+
c.GameEventBehavior = map[string]Config_Behavior{}
1616
for _, event := range state.AllGameEvents() {
17-
c.GameEventBehavior[event.String()] = Config_GAME_EVENT_BEHAVIOR_ON
17+
c.GameEventBehavior[event.String()] = Config_BEHAVIOR_ACCEPT
1818
}
1919
return
2020
}

internal/app/engine/engine.go

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,11 @@ func NewEngine(gameConfig config.Game, engineConfig config.Engine) (e *Engine) {
6464

6565
// Enqueue adds the change to the change queue
6666
func (e *Engine) Enqueue(change *statemachine.Change) {
67-
if change.GetAddGameEvent() != nil && !e.IsGameEventEnabled(*change.GetAddGameEvent().GameEvent.Type) {
68-
log.Printf("Ignoring disabled game event %v", change.GetAddGameEvent().GameEvent)
69-
return
67+
if change.GetAddGameEvent() != nil {
68+
change = e.filterGameEvent(change)
69+
if change == nil {
70+
return
71+
}
7072
}
7173
if change.Revertible == nil {
7274
change.Revertible = new(bool)
@@ -76,6 +78,40 @@ func (e *Engine) Enqueue(change *statemachine.Change) {
7678
e.queue <- change
7779
}
7880

81+
func (e *Engine) filterGameEvent(change *statemachine.Change) *statemachine.Change {
82+
gameEvent := change.GetAddGameEvent().GameEvent
83+
behavior := e.config.GameEventBehavior[gameEvent.Type.String()]
84+
switch behavior {
85+
case Config_BEHAVIOR_ACCEPT:
86+
return change
87+
case Config_BEHAVIOR_ACCEPT_MAJORITY, Config_BEHAVIOR_PROPOSE_ONLY:
88+
timestamp, _ := ptypes.TimestampProto(e.timeProvider())
89+
return &statemachine.Change{
90+
Origin: &changeOriginEngine,
91+
Change: &statemachine.Change_AddProposal{
92+
AddProposal: &statemachine.AddProposal{
93+
Proposal: &state.Proposal{
94+
Timestamp: timestamp,
95+
GameEvent: gameEvent,
96+
},
97+
},
98+
},
99+
}
100+
case Config_BEHAVIOR_LOG:
101+
return &statemachine.Change{
102+
Origin: &changeOriginEngine,
103+
Change: &statemachine.Change_AddPassiveGameEvent{
104+
AddPassiveGameEvent: &statemachine.AddPassiveGameEvent{
105+
GameEvent: gameEvent,
106+
},
107+
},
108+
}
109+
case Config_BEHAVIOR_IGNORE:
110+
log.Printf("Ignoring game event: %v", *gameEvent)
111+
}
112+
return nil
113+
}
114+
79115
// getGeometry returns the current geometry
80116
func (e *Engine) getGeometry() config.Geometry {
81117
return e.stateMachine.Geometry
@@ -313,10 +349,10 @@ func (e *Engine) UpdateConfig(delta *Config) {
313349
for autoRef, cfg := range delta.AutoRefConfigs {
314350
if _, ok := e.config.AutoRefConfigs[autoRef]; !ok {
315351
e.config.AutoRefConfigs[autoRef] = new(AutoRefConfig)
316-
e.config.AutoRefConfigs[autoRef].GameEventEnabled = map[string]bool{}
352+
e.config.AutoRefConfigs[autoRef].GameEventBehavior = map[string]AutoRefConfig_Behavior{}
317353
}
318-
for k, v := range cfg.GameEventEnabled {
319-
e.config.AutoRefConfigs[autoRef].GameEventEnabled[k] = v
354+
for k, v := range cfg.GameEventBehavior {
355+
e.config.AutoRefConfigs[autoRef].GameEventBehavior[k] = v
320356
}
321357
}
322358
log.Printf("Engine config updated to %v", e.config)
@@ -325,7 +361,7 @@ func (e *Engine) UpdateConfig(delta *Config) {
325361
}
326362
}
327363

328-
// IsGameEventEnabled returns true, if the game event type is not disabled
364+
// IsGameEventEnabled returns true, if the game event type is always accepted
329365
func (e *Engine) IsGameEventEnabled(evenType state.GameEvent_Type) bool {
330-
return e.config.GameEventBehavior[evenType.String()] != Config_GAME_EVENT_BEHAVIOR_OFF
366+
return e.config.GameEventBehavior[evenType.String()] == Config_BEHAVIOR_ACCEPT
331367
}

internal/app/engine/process_proposals.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@ func (e *Engine) processProposals() {
1515
minTime := now.Add(-proposalTimeout)
1616

1717
for i, group := range e.currentState.ProposalGroups {
18-
if *group.Accepted || groupHasRecentProposal(group, minTime) {
18+
latestGameEvent := group.Proposals[len(group.Proposals)-1].GameEvent
19+
if *group.Accepted || groupHasRecentProposal(group, minTime) ||
20+
e.config.GameEventBehavior[latestGameEvent.Type.String()] == Config_BEHAVIOR_PROPOSE_ONLY {
1921
continue
2022
}
2123
numProposals := uniqueOrigins(group)
22-
latestGameEvent := group.Proposals[len(group.Proposals)-1].GameEvent
2324
numAutoRefs := e.numAutoRefs(latestGameEvent)
2425
majority := int(math.Floor(float64(numAutoRefs) / 2.0))
2526

@@ -60,7 +61,8 @@ func (e *Engine) numAutoRefs(gameEvent *state.GameEvent) (n int) {
6061
autoRefs = append(autoRefs, autoRef)
6162
}
6263
for _, autoRef := range autoRefs {
63-
if e.config.AutoRefConfigs[autoRef].GameEventEnabled[gameEvent.Type.String()] {
64+
behavior := e.config.AutoRefConfigs[autoRef].GameEventBehavior[gameEvent.Type.String()]
65+
if behavior == AutoRefConfig_BEHAVIOR_ACCEPT {
6466
n++
6567
}
6668
}

internal/app/engine/proposals.go

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ package engine
33
import (
44
"github.com/RoboCup-SSL/ssl-game-controller/internal/app/state"
55
"github.com/RoboCup-SSL/ssl-game-controller/internal/app/statemachine"
6-
"github.com/golang/protobuf/ptypes"
76
"log"
87
)
98

10-
// EnqueueGameEvent accepts a game event and handles majority accordingly
9+
// EnqueueGameEvent accepts a game event and handles behaviors accordingly
1110
func (e *Engine) EnqueueGameEvent(gameEvent *state.GameEvent) {
1211
e.mutex.Lock()
1312
defer e.mutex.Unlock()
@@ -18,34 +17,22 @@ func (e *Engine) EnqueueGameEvent(gameEvent *state.GameEvent) {
1817
}
1918
origin := gameEvent.Origin[0]
2019

21-
if !e.config.AutoRefConfigs[origin].GameEventEnabled[gameEvent.Type.String()] {
20+
autoRefBehavior := e.config.AutoRefConfigs[origin].GameEventBehavior[gameEvent.Type.String()]
21+
switch autoRefBehavior {
22+
case AutoRefConfig_BEHAVIOR_IGNORE:
23+
log.Printf("Ignoring game event from autoRef: %v", *gameEvent)
24+
case AutoRefConfig_BEHAVIOR_LOG:
2225
e.Enqueue(&statemachine.Change{
23-
Origin: &origin,
26+
Origin: &changeOriginEngine,
2427
Change: &statemachine.Change_AddPassiveGameEvent{
2528
AddPassiveGameEvent: &statemachine.AddPassiveGameEvent{
2629
GameEvent: gameEvent,
2730
},
2831
},
2932
})
30-
return
31-
}
32-
33-
if e.IsMajorityForGameEventEnabled(*gameEvent.Type) {
34-
timestamp, _ := ptypes.TimestampProto(e.timeProvider())
33+
case AutoRefConfig_BEHAVIOR_ACCEPT:
3534
e.Enqueue(&statemachine.Change{
36-
Origin: &origin,
37-
Change: &statemachine.Change_AddProposal{
38-
AddProposal: &statemachine.AddProposal{
39-
Proposal: &state.Proposal{
40-
Timestamp: timestamp,
41-
GameEvent: gameEvent,
42-
},
43-
},
44-
},
45-
})
46-
} else {
47-
e.Enqueue(&statemachine.Change{
48-
Origin: &origin,
35+
Origin: &changeOriginEngine,
4936
Change: &statemachine.Change_AddGameEvent{
5037
AddGameEvent: &statemachine.AddGameEvent{
5138
GameEvent: gameEvent,
@@ -54,8 +41,3 @@ func (e *Engine) EnqueueGameEvent(gameEvent *state.GameEvent) {
5441
})
5542
}
5643
}
57-
58-
// IsMajorityForGameEventEnabled returns true, if the game event behavior is set to majority
59-
func (e *Engine) IsMajorityForGameEventEnabled(evenType state.GameEvent_Type) bool {
60-
return e.config.GameEventBehavior[evenType.String()] == Config_GAME_EVENT_BEHAVIOR_MAJORITY
61-
}

0 commit comments

Comments
 (0)