Skip to content

Commit 79607f2

Browse files
committed
Merge game event data of proposals together
1 parent a688cb0 commit 79607f2

File tree

2 files changed

+390
-3
lines changed

2 files changed

+390
-3
lines changed

internal/app/statemachine/change_acceptproposal.go

Lines changed: 136 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ func (s *StateMachine) processChangeAcceptProposals(newState *state.State, chang
2929
return
3030
}
3131

32-
func (s *StateMachine) createMergedGameEvent(events []*state.Proposal, acceptedBy *string) *state.GameEvent {
32+
func (s *StateMachine) createMergedGameEvent(proposals []*state.Proposal, acceptedBy *string) *state.GameEvent {
3333
event := new(state.GameEvent)
34-
proto.Merge(event, events[0].GameEvent)
34+
proto.Merge(event, proposals[0].GameEvent)
3535
event.Origin = []string{}
3636
byTeam := map[state.Team]int{}
3737
origins := map[string]struct{}{}
38-
for _, e := range events {
38+
for _, e := range proposals {
3939
for _, origin := range e.GameEvent.Origin {
4040
origins[origin] = struct{}{}
4141
}
@@ -55,5 +55,138 @@ func (s *StateMachine) createMergedGameEvent(events []*state.Proposal, acceptedB
5555
log.Printf("autoRefs undecided on team: %v. Throwing a dice.", byTeam)
5656
event.SetByTeam(state.Team(s.rand.Intn(2) + 1))
5757
}
58+
var events []*state.GameEvent
59+
for _, p := range proposals {
60+
events = append(events, p.GameEvent)
61+
}
62+
mergeGameEventData(event, events)
5863
return event
5964
}
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

Comments
 (0)