Skip to content

Commit be3d985

Browse files
committed
[feature] Add gameEventBehavior to disable game events through UI
1 parent 4228485 commit be3d985

File tree

8 files changed

+191
-36
lines changed

8 files changed

+191
-36
lines changed

internal/app/controller/engine.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,18 @@ func (e *Engine) LogGameEvent(event GameEvent) {
225225
e.RefereeEvents = append(e.RefereeEvents, gameEvent)
226226
}
227227

228+
func (e *Engine) LogIgnoredGameEvent(event GameEvent) {
229+
gameEvent := RefereeEvent{
230+
Timestamp: e.TimeProvider().UnixNano(),
231+
StageTime: e.State.StageTimeElapsed,
232+
Type: RefereeEventGameEventIgnored,
233+
Name: string(event.Type),
234+
Team: event.ByTeam(),
235+
Description: event.Details.Description(),
236+
}
237+
e.RefereeEvents = append(e.RefereeEvents, gameEvent)
238+
}
239+
228240
func (e *Engine) LogCommand() {
229241
refereeEvent := RefereeEvent{
230242
Timestamp: e.TimeProvider().UnixNano(),
@@ -380,6 +392,8 @@ func (e *Engine) processModify(m *EventModifyValue) error {
380392
if e.State.AutoContinue {
381393
e.Continue()
382394
}
395+
} else if m.GameEventBehavior != nil {
396+
e.State.GameEventBehavior[m.GameEventBehavior.GameEventType] = m.GameEventBehavior.GameEventBehavior
383397
} else if err := e.processTeamModify(m); err != nil {
384398
return err
385399
}
@@ -573,12 +587,25 @@ func (e *Engine) processTrigger(t *EventTrigger) (err error) {
573587
return err
574588
}
575589

590+
func (e *Engine) disabledGameEvent(event GameEventType) bool {
591+
for eventType, behavior := range e.State.GameEventBehavior {
592+
if event == eventType {
593+
return behavior == GameEventBehaviorOff
594+
}
595+
}
596+
return false
597+
}
598+
576599
func (e *Engine) processGameEvent(event *GameEvent) error {
577600

578601
if event.Details.EventType() == GameEventNone {
579602
return errors.Errorf("Incomplete game event: %v", event)
580603
}
581604

605+
if e.disabledGameEvent(event.Type) {
606+
e.LogIgnoredGameEvent(*event)
607+
return nil
608+
}
582609
e.AddGameEvent(*event)
583610

584611
if event.IncrementsFoulCounter() {

internal/app/controller/events.go

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -89,24 +89,31 @@ type EventModifyCardTime struct {
8989
Duration string `json:"duration"`
9090
}
9191

92+
// EventModifyGameEventBehavior holds the type to behavior mapping
93+
type EventModifyGameEventBehavior struct {
94+
GameEventType GameEventType `json:"gameEventType"`
95+
GameEventBehavior GameEventBehavior `json:"gameEventBehavior"`
96+
}
97+
9298
// EventModifyValue is an event that can be applied
9399
type EventModifyValue struct {
94100
ForTeam Team `json:"forTeam,omitempty"`
95101

96-
Goals *int `json:"goals,omitempty"`
97-
Goalie *int `json:"goalie,omitempty"`
98-
YellowCards *int `json:"yellowCards,omitempty"`
99-
YellowCardTime *EventModifyCardTime `json:"yellowCardTime,omitempty"`
100-
RedCards *int `json:"redCards,omitempty"`
101-
TimeoutsLeft *int `json:"timeoutsLeft,omitempty"`
102-
TimeoutTimeLeft *string `json:"timeoutTimeLeft,omitempty"`
103-
OnPositiveHalf *bool `json:"onPositiveHalf,omitempty"`
104-
TeamName *string `json:"teamName,omitempty"`
105-
FoulCounter *int `json:"foulCounter,omitempty"`
106-
BallPlacementFailures *int `json:"ballPlacementFailures,omitempty"`
107-
CanPlaceBall *bool `json:"canPlaceBall,omitempty"`
108-
Division *Division `json:"division,omitempty"`
109-
AutoContinue *bool `json:"autoContinue,omitempty"`
102+
Goals *int `json:"goals,omitempty"`
103+
Goalie *int `json:"goalie,omitempty"`
104+
YellowCards *int `json:"yellowCards,omitempty"`
105+
YellowCardTime *EventModifyCardTime `json:"yellowCardTime,omitempty"`
106+
RedCards *int `json:"redCards,omitempty"`
107+
TimeoutsLeft *int `json:"timeoutsLeft,omitempty"`
108+
TimeoutTimeLeft *string `json:"timeoutTimeLeft,omitempty"`
109+
OnPositiveHalf *bool `json:"onPositiveHalf,omitempty"`
110+
TeamName *string `json:"teamName,omitempty"`
111+
FoulCounter *int `json:"foulCounter,omitempty"`
112+
BallPlacementFailures *int `json:"ballPlacementFailures,omitempty"`
113+
CanPlaceBall *bool `json:"canPlaceBall,omitempty"`
114+
Division *Division `json:"division,omitempty"`
115+
AutoContinue *bool `json:"autoContinue,omitempty"`
116+
GameEventBehavior *EventModifyGameEventBehavior `json:"gameEventBehavior,omitempty"`
110117
}
111118

112119
func (m EventModifyValue) String() string {

internal/app/controller/gameEvent.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,47 @@ func (m GameEvent) String() string {
6161
return string(b)
6262
}
6363

64+
func AllGameEvents() []GameEventType {
65+
return []GameEventType{
66+
GameEventBallLeftFieldTouchLine,
67+
GameEventBallLeftFieldGoalLine,
68+
GameEventIcing,
69+
GameEventGoal,
70+
GameEventIndirectGoal,
71+
GameEventChippedGoal,
72+
GameEventBotTooFastInStop,
73+
GameEventBotTippedOver,
74+
GameEventBotInterferedPlacement,
75+
GameEventBotCrashDrawn,
76+
GameEventBotKickedBallTooFast,
77+
GameEventBotDribbledBallTooFar,
78+
GameEventBotCrashUnique,
79+
GameEventBotCrashUniqueContinue,
80+
GameEventBotPushedBot,
81+
GameEventBotPushedBotContinue,
82+
GameEventBotHeldBallDeliberately,
83+
GameEventAttackerDoubleTouchedBall,
84+
GameEventAttackerTooCloseToDefenseArea,
85+
GameEventAttackerInDefenseArea,
86+
GameEventAttackerTouchedKeeper,
87+
GameEventDefenderTooCloseToKickPoint,
88+
GameEventDefenderInDefenseAreaPartially,
89+
GameEventDefenderInDefenseArea,
90+
GameEventKeeperHeldBall,
91+
GameEventUnsportiveBehaviorMinor,
92+
GameEventUnsportiveBehaviorMajor,
93+
GameEventMultipleCards,
94+
GameEventMultipleFouls,
95+
GameEventMultiplePlacementFailures,
96+
GameEventKickTimeout,
97+
GameEventNoProgressInGame,
98+
GameEventPlacementFailedByTeamInFavor,
99+
GameEventPlacementFailedByOpponent,
100+
GameEventPlacementSucceeded,
101+
GameEventPrepared,
102+
}
103+
}
104+
64105
// ByTeam extracts the `ByTeam` attribute from the game event details
65106
func (e GameEvent) ByTeam() Team {
66107
v := reflect.ValueOf(e.Details)

internal/app/controller/refereeEvents.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ import (
77
type RefereeEventType string
88

99
const (
10-
RefereeEventCommand RefereeEventType = "command"
11-
RefereeEventStage RefereeEventType = "stage"
12-
RefereeEventCard RefereeEventType = "card"
13-
RefereeEventTime RefereeEventType = "time"
14-
RefereeEventGameEvent RefereeEventType = "gameEvent"
15-
RefereeEventModify RefereeEventType = "modify"
10+
RefereeEventCommand RefereeEventType = "command"
11+
RefereeEventStage RefereeEventType = "stage"
12+
RefereeEventCard RefereeEventType = "card"
13+
RefereeEventTime RefereeEventType = "time"
14+
RefereeEventGameEvent RefereeEventType = "gameEvent"
15+
RefereeEventGameEventIgnored RefereeEventType = "ignoredGameEvent"
16+
RefereeEventModify RefereeEventType = "modify"
1617
)
1718

1819
type RefereeEvent struct {

internal/app/controller/state.go

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -249,23 +249,32 @@ type TeamInfo struct {
249249

250250
// State of the game
251251
type State struct {
252-
Stage Stage `json:"stage"`
253-
Command RefCommand `json:"command"`
254-
CommandFor Team `json:"commandForTeam"`
255-
GameEvents []*GameEvent `json:"gameEvents"`
256-
StageTimeElapsed time.Duration `json:"stageTimeElapsed"`
257-
StageTimeLeft time.Duration `json:"stageTimeLeft"`
258-
MatchTimeStart time.Time `json:"matchTimeStart"`
259-
MatchDuration time.Duration `json:"matchDuration"`
260-
TeamState map[Team]*TeamInfo `json:"teamState"`
261-
Division Division `json:"division"`
262-
PlacementPos *Location `json:"placementPos"`
263-
AutoContinue bool `json:"autoContinue"`
264-
NextCommand RefCommand `json:"nextCommand"`
265-
NextCommandFor Team `json:"nextCommandFor"`
266-
AutoRefsConnected []string `json:"autoRefsConnected"`
252+
Stage Stage `json:"stage"`
253+
Command RefCommand `json:"command"`
254+
CommandFor Team `json:"commandForTeam"`
255+
GameEvents []*GameEvent `json:"gameEvents"`
256+
StageTimeElapsed time.Duration `json:"stageTimeElapsed"`
257+
StageTimeLeft time.Duration `json:"stageTimeLeft"`
258+
MatchTimeStart time.Time `json:"matchTimeStart"`
259+
MatchDuration time.Duration `json:"matchDuration"`
260+
TeamState map[Team]*TeamInfo `json:"teamState"`
261+
Division Division `json:"division"`
262+
PlacementPos *Location `json:"placementPos"`
263+
AutoContinue bool `json:"autoContinue"`
264+
NextCommand RefCommand `json:"nextCommand"`
265+
NextCommandFor Team `json:"nextCommandFor"`
266+
AutoRefsConnected []string `json:"autoRefsConnected"`
267+
GameEventBehavior map[GameEventType]GameEventBehavior `json:"gameEventBehavior"`
267268
}
268269

270+
type GameEventBehavior string
271+
272+
const (
273+
GameEventBehaviorOn GameEventBehavior = "on"
274+
GameEventBehaviorMajority GameEventBehavior = "majority"
275+
GameEventBehaviorOff GameEventBehavior = "off"
276+
)
277+
269278
// NewState creates a new state, initialized for the start of a new game
270279
func NewState() (s *State) {
271280
s = new(State)
@@ -288,6 +297,11 @@ func NewState() (s *State) {
288297
s.Division = DivA
289298
s.AutoContinue = true
290299

300+
s.GameEventBehavior = map[GameEventType]GameEventBehavior{}
301+
for _, event := range AllGameEvents() {
302+
s.GameEventBehavior[event] = GameEventBehaviorOn
303+
}
304+
291305
return
292306
}
293307

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<template>
2+
<div>
3+
<table>
4+
<tr v-for="eventType in eventTypes">
5+
<td align="left">{{eventType}}</td>
6+
<td>
7+
<div class="btn-group-toggle btn-group">
8+
<label :class="{btn:true, 'btn-secondary': true, active: eventBehavior(eventType) === 'on'}"
9+
@click="changeBehavior(eventType, 'on')">
10+
On
11+
</label>
12+
<label :class="{btn:true, 'btn-secondary': true, active: eventBehavior(eventType) === 'majority'}"
13+
@click="changeBehavior(eventType, 'majority')">
14+
Majority
15+
</label>
16+
<label :class="{btn:true, 'btn-secondary': true, active: eventBehavior(eventType) === 'off'}"
17+
@click="changeBehavior(eventType, 'off')">
18+
Off
19+
</label>
20+
</div>
21+
</td>
22+
</tr>
23+
</table>
24+
</div>
25+
</template>
26+
27+
<script>
28+
export default {
29+
name: "EventBehavior",
30+
computed: {
31+
state() {
32+
return this.$store.state.refBoxState
33+
},
34+
eventTypes() {
35+
return Object.keys(this.state.gameEventBehavior).sort();
36+
},
37+
},
38+
methods: {
39+
eventBehavior(eventType) {
40+
return this.state.gameEventBehavior[eventType];
41+
},
42+
changeBehavior(eventType, eventBehavior) {
43+
this.$socket.sendObj({
44+
'modify': {'gameEventBehavior': {gameEventType: eventType, gameEventBehavior: eventBehavior}}
45+
})
46+
}
47+
}
48+
}
49+
</script>
50+
51+
<style scoped>
52+
53+
</style>

src/components/events/Events.vue

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,28 @@
1919
<!-- hide modal buttons -->
2020
</div>
2121
</b-modal>
22+
23+
<b-btn v-b-modal.event-behavior-modal size="sm" variant="primary">Behaviors</b-btn>
24+
<b-modal id="event-behavior-modal"
25+
title="Game Event Behaviors"
26+
:lazy="true">
27+
<EventBehavior/>
28+
<div slot="modal-footer">
29+
<!-- hide modal buttons -->
30+
</div>
31+
</b-modal>
2232
</div>
2333
</div>
2434
</template>
2535

2636
<script>
2737
import EventTable from "./EventTable";
2838
import NewEvent from "./NewEvent";
39+
import EventBehavior from "./EventBehavior";
2940
3041
export default {
3142
name: "Events",
32-
components: {EventTable, NewEvent},
43+
components: {EventBehavior, EventTable, NewEvent},
3344
data() {
3445
return {
3546
currentPage: 1,

src/store.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export class RefBoxState {
3434
nextCommand = '';
3535
nextCommandFor = '';
3636
autoRefsConnected = [];
37+
gameEventBehavior = {};
3738
}
3839

3940
export default new Vuex.Store({

0 commit comments

Comments
 (0)