@@ -29,13 +29,13 @@ func (s *StateMachine) processChangeAcceptProposals(newState *state.State, chang
29
29
return
30
30
}
31
31
32
- func (s * StateMachine ) createMergedGameEvent (events []* state.Proposal , acceptedBy * string ) * state.GameEvent {
32
+ func (s * StateMachine ) createMergedGameEvent (proposals []* state.Proposal , acceptedBy * string ) * state.GameEvent {
33
33
event := new (state.GameEvent )
34
- proto .Merge (event , events [0 ].GameEvent )
34
+ proto .Merge (event , proposals [0 ].GameEvent )
35
35
event .Origin = []string {}
36
36
byTeam := map [state.Team ]int {}
37
37
origins := map [string ]struct {}{}
38
- for _ , e := range events {
38
+ for _ , e := range proposals {
39
39
for _ , origin := range e .GameEvent .Origin {
40
40
origins [origin ] = struct {}{}
41
41
}
@@ -55,5 +55,138 @@ func (s *StateMachine) createMergedGameEvent(events []*state.Proposal, acceptedB
55
55
log .Printf ("autoRefs undecided on team: %v. Throwing a dice." , byTeam )
56
56
event .SetByTeam (state .Team (s .rand .Intn (2 ) + 1 ))
57
57
}
58
+ var events []* state.GameEvent
59
+ for _ , p := range proposals {
60
+ events = append (events , p .GameEvent )
61
+ }
62
+ mergeGameEventData (event , events )
58
63
return event
59
64
}
65
+
66
+ func mergeGameEventData (event * state.GameEvent , events []* state.GameEvent ) {
67
+ switch * event .Type {
68
+ case state .GameEvent_GOAL :
69
+ var maxBallHeight []* float32
70
+ for _ , e := range events {
71
+ maxBallHeight = append (maxBallHeight , e .GetGoal ().MaxBallHeight )
72
+ }
73
+ event .GetGoal ().MaxBallHeight = averageFloat (maxBallHeight )
74
+ case state .GameEvent_POSSIBLE_GOAL :
75
+ var maxBallHeight []* float32
76
+ for _ , e := range events {
77
+ maxBallHeight = append (maxBallHeight , e .GetPossibleGoal ().MaxBallHeight )
78
+ }
79
+ event .GetPossibleGoal ().MaxBallHeight = averageFloat (maxBallHeight )
80
+ case state .GameEvent_BOT_TOO_FAST_IN_STOP :
81
+ var speed []* float32
82
+ for _ , e := range events {
83
+ speed = append (speed , e .GetBotTooFastInStop ().Speed )
84
+ }
85
+ event .GetBotTooFastInStop ().Speed = averageFloat (speed )
86
+ case state .GameEvent_DEFENDER_TOO_CLOSE_TO_KICK_POINT :
87
+ var distance []* float32
88
+ for _ , e := range events {
89
+ distance = append (distance , e .GetDefenderTooCloseToKickPoint ().Distance )
90
+ }
91
+ event .GetDefenderTooCloseToKickPoint ().Distance = averageFloat (distance )
92
+ case state .GameEvent_BOT_CRASH_DRAWN :
93
+ var crashSpeed []* float32
94
+ var speedDiff []* float32
95
+ var crashAngle []* float32
96
+ for _ , e := range events {
97
+ crashSpeed = append (crashSpeed , e .GetBotCrashDrawn ().CrashSpeed )
98
+ speedDiff = append (speedDiff , e .GetBotCrashDrawn ().SpeedDiff )
99
+ crashAngle = append (crashAngle , e .GetBotCrashDrawn ().CrashAngle )
100
+ }
101
+ event .GetBotCrashDrawn ().CrashSpeed = averageFloat (crashSpeed )
102
+ event .GetBotCrashDrawn ().SpeedDiff = averageFloat (speedDiff )
103
+ event .GetBotCrashDrawn ().CrashAngle = averageFloat (crashAngle )
104
+ case state .GameEvent_BOT_CRASH_UNIQUE :
105
+ var crashSpeed []* float32
106
+ var speedDiff []* float32
107
+ var crashAngle []* float32
108
+ for _ , e := range events {
109
+ crashSpeed = append (crashSpeed , e .GetBotCrashUnique ().CrashSpeed )
110
+ speedDiff = append (speedDiff , e .GetBotCrashUnique ().SpeedDiff )
111
+ crashAngle = append (crashAngle , e .GetBotCrashUnique ().CrashAngle )
112
+ }
113
+ event .GetBotCrashUnique ().CrashSpeed = averageFloat (crashSpeed )
114
+ event .GetBotCrashUnique ().SpeedDiff = averageFloat (speedDiff )
115
+ event .GetBotCrashUnique ().CrashAngle = averageFloat (crashAngle )
116
+ case state .GameEvent_BOT_PUSHED_BOT :
117
+ var distance []* float32
118
+ for _ , e := range events {
119
+ distance = append (distance , e .GetBotPushedBot ().PushedDistance )
120
+ }
121
+ event .GetBotPushedBot ().PushedDistance = averageFloat (distance )
122
+ case state .GameEvent_DEFENDER_IN_DEFENSE_AREA :
123
+ var distance []* float32
124
+ for _ , e := range events {
125
+ distance = append (distance , e .GetDefenderInDefenseArea ().Distance )
126
+ }
127
+ event .GetDefenderInDefenseArea ().Distance = averageFloat (distance )
128
+ case state .GameEvent_ATTACKER_TOUCHED_BALL_IN_DEFENSE_AREA :
129
+ var distance []* float32
130
+ for _ , e := range events {
131
+ distance = append (distance , e .GetAttackerTouchedBallInDefenseArea ().Distance )
132
+ }
133
+ event .GetAttackerTouchedBallInDefenseArea ().Distance = averageFloat (distance )
134
+ case state .GameEvent_BOT_KICKED_BALL_TOO_FAST :
135
+ var initialBallSpeeds []* float32
136
+ var chipped []* bool
137
+ for _ , e := range events {
138
+ initialBallSpeeds = append (initialBallSpeeds , e .GetBotKickedBallTooFast ().InitialBallSpeed )
139
+ chipped = append (chipped , e .GetBotKickedBallTooFast ().Chipped )
140
+ }
141
+ event .GetBotKickedBallTooFast ().InitialBallSpeed = averageFloat (initialBallSpeeds )
142
+ event .GetBotKickedBallTooFast ().Chipped = averageBool (chipped )
143
+ case state .GameEvent_ATTACKER_TOO_CLOSE_TO_DEFENSE_AREA :
144
+ var distance []* float32
145
+ for _ , e := range events {
146
+ distance = append (distance , e .GetAttackerTooCloseToDefenseArea ().Distance )
147
+ }
148
+ event .GetAttackerTooCloseToDefenseArea ().Distance = averageFloat (distance )
149
+ case state .GameEvent_PLACEMENT_FAILED :
150
+ var distance []* float32
151
+ for _ , e := range events {
152
+ distance = append (distance , e .GetPlacementFailed ().RemainingDistance )
153
+ }
154
+ event .GetPlacementFailed ().RemainingDistance = averageFloat (distance )
155
+ }
156
+ }
157
+
158
+ func averageFloat (values []* float32 ) (value * float32 ) {
159
+ sum := float32 (0.0 )
160
+ count := 0
161
+ for _ , v := range values {
162
+ if v != nil {
163
+ sum += * v
164
+ count ++
165
+ }
166
+ }
167
+ if count > 0 {
168
+ value = new (float32 )
169
+ * value = sum / float32 (count )
170
+ }
171
+ return
172
+ }
173
+
174
+ func averageBool (values []* bool ) (value * bool ) {
175
+ sum := 0
176
+ count := 0
177
+ for _ , v := range values {
178
+ if v != nil {
179
+ if * v {
180
+ sum ++
181
+ }
182
+ count ++
183
+ }
184
+ }
185
+ if count > 0 {
186
+ value = new (bool )
187
+ if sum > count / 2 {
188
+ * value = true
189
+ }
190
+ }
191
+ return
192
+ }
0 commit comments