Skip to content

Commit 256f8dc

Browse files
committed
Allow switching stages
1 parent 2e28073 commit 256f8dc

File tree

4 files changed

+87
-40
lines changed

4 files changed

+87
-40
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<script setup lang="ts">
2+
import {computed, inject} from "vue";
3+
import SelectInput from "@/components/common/SelectInput.vue";
4+
import {useMatchStateStore} from "@/store/matchState";
5+
import {stageName} from "@/helpers/texts";
6+
import {Referee_Stage} from "@/proto/ssl_gc_referee_message";
7+
import type {ControlApi} from "@/providers/controlApi/ControlApi";
8+
import {getRemainingStages} from "@/helpers";
9+
10+
const store = useMatchStateStore()
11+
const control = inject<ControlApi>('control-api')
12+
13+
const model = computed(() => {
14+
return store.matchState.stage
15+
})
16+
17+
const options = computed(() => getRemainingStages(store.matchState.stage!))
18+
const optionsLabel = (v: Referee_Stage) => stageName(v) || "-"
19+
20+
const onChange = (newStage: Referee_Stage) => {
21+
control?.SubmitChange({
22+
change: {
23+
$case: 'changeStageChange',
24+
changeStageChange: {
25+
newStage
26+
}
27+
}
28+
})
29+
}
30+
</script>
31+
32+
<template>
33+
<SelectInput
34+
label="Stage"
35+
style="min-width: 130px"
36+
:modelValue="model"
37+
:options="options"
38+
:option-label="optionsLabel"
39+
@update:model-value="onChange"
40+
/>
41+
</template>

frontend/src/helpers/index.ts

Lines changed: 21 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -57,40 +57,22 @@ export const originIcon = (origin: string) => {
5757
}
5858
}
5959

60-
export const getNextStage = function (stage: Referee_Stage): Referee_Stage {
61-
switch (stage) {
62-
case Referee_Stage.NORMAL_FIRST_HALF_PRE:
63-
return Referee_Stage.NORMAL_FIRST_HALF
64-
case Referee_Stage.NORMAL_FIRST_HALF:
65-
return Referee_Stage.NORMAL_HALF_TIME
66-
case Referee_Stage.NORMAL_HALF_TIME:
67-
return Referee_Stage.NORMAL_SECOND_HALF_PRE
68-
case Referee_Stage.NORMAL_SECOND_HALF_PRE:
69-
return Referee_Stage.NORMAL_SECOND_HALF
70-
case Referee_Stage.NORMAL_SECOND_HALF:
71-
return Referee_Stage.EXTRA_TIME_BREAK
72-
case Referee_Stage.EXTRA_TIME_BREAK:
73-
return Referee_Stage.EXTRA_FIRST_HALF_PRE
74-
case Referee_Stage.EXTRA_FIRST_HALF_PRE:
75-
return Referee_Stage.EXTRA_FIRST_HALF
76-
case Referee_Stage.EXTRA_FIRST_HALF:
77-
return Referee_Stage.EXTRA_HALF_TIME
78-
case Referee_Stage.EXTRA_HALF_TIME:
79-
return Referee_Stage.EXTRA_SECOND_HALF_PRE
80-
case Referee_Stage.EXTRA_SECOND_HALF_PRE:
81-
return Referee_Stage.EXTRA_SECOND_HALF
82-
case Referee_Stage.EXTRA_SECOND_HALF:
83-
return Referee_Stage.PENALTY_SHOOTOUT_BREAK
84-
case Referee_Stage.PENALTY_SHOOTOUT_BREAK:
85-
return Referee_Stage.PENALTY_SHOOTOUT
86-
case Referee_Stage.PENALTY_SHOOTOUT:
87-
return Referee_Stage.POST_GAME
88-
case Referee_Stage.POST_GAME:
89-
case Referee_Stage.UNRECOGNIZED:
90-
default:
91-
return Referee_Stage.POST_GAME
92-
}
93-
}
60+
const stages: Referee_Stage[] = [
61+
Referee_Stage.NORMAL_FIRST_HALF_PRE,
62+
Referee_Stage.NORMAL_FIRST_HALF,
63+
Referee_Stage.NORMAL_HALF_TIME,
64+
Referee_Stage.NORMAL_SECOND_HALF_PRE,
65+
Referee_Stage.NORMAL_SECOND_HALF,
66+
Referee_Stage.EXTRA_TIME_BREAK,
67+
Referee_Stage.EXTRA_FIRST_HALF_PRE,
68+
Referee_Stage.EXTRA_FIRST_HALF,
69+
Referee_Stage.EXTRA_HALF_TIME,
70+
Referee_Stage.EXTRA_SECOND_HALF_PRE,
71+
Referee_Stage.EXTRA_SECOND_HALF,
72+
Referee_Stage.PENALTY_SHOOTOUT_BREAK,
73+
Referee_Stage.PENALTY_SHOOTOUT,
74+
Referee_Stage.POST_GAME,
75+
]
9476

9577
export const isPausedStage = function (stage: Referee_Stage): boolean {
9678
return stage.toString() === Referee_Stage[Referee_Stage.NORMAL_HALF_TIME]
@@ -114,3 +96,8 @@ export const isPreStage = function (stage: Referee_Stage): boolean {
11496
|| stage.toString() === Referee_Stage[Referee_Stage.EXTRA_FIRST_HALF_PRE]
11597
|| stage.toString() === Referee_Stage[Referee_Stage.EXTRA_SECOND_HALF_PRE]
11698
};
99+
100+
export const getRemainingStages = function (fromStage: Referee_Stage): Referee_Stage[] {
101+
const idx = stages.indexOf(fromStage)
102+
return stages.slice(idx)
103+
}

frontend/src/views/StartView.vue

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import GoalKeeperIdInput from "@/components/team/GoalKeeperIdInput.vue";
1212
import BallPlacementEnabledInput from "@/components/team/BallPlacementEnabledInput.vue";
1313
import FirstKickOffInput from "@/components/team/FirstKickOffInput.vue";
1414
import FieldHalfInput from "@/components/team/FieldHalfInput.vue";
15+
import StageInput from "@/components/start/StageInput.vue";
1516
import {teams} from "@/helpers";
1617
</script>
1718

@@ -67,11 +68,19 @@ import {teams} from "@/helpers";
6768
</q-list>
6869
</div>
6970

70-
<div class="row justify-evenly q-gutter-md">
71+
<div class="row justify-evenly">
7172
<SwitchColorButton/>
7273
<SwitchColorRandomButton/>
7374
<SwitchSidesRandomButton/>
74-
<EndMatchButton/>
75+
</div>
76+
77+
<q-separator spaced/>
78+
79+
<div class="row justify-evenly">
80+
<StageInput/>
81+
<div class="q-pa-md">
82+
<EndMatchButton/>
83+
</div>
7584
</div>
7685

7786
<div class="q-ma-md">

internal/app/statemachine/change_stage.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,18 @@ import (
99

1010
func (s *StateMachine) processChangeChangeStage(newState *state.State, change *Change_ChangeStage) (changes []*Change) {
1111

12+
currentStage := *newState.Stage
13+
for stage := currentStage + 1; stage <= *change.NewStage; stage++ {
14+
changes = append(changes, s.proceedStage(newState, stage)...)
15+
}
16+
17+
return
18+
}
19+
20+
func (s *StateMachine) proceedStage(newState *state.State, newStage state.Referee_Stage) (changes []*Change) {
21+
1222
// update stage time
13-
newState.StageTimeLeft = durationpb.New(s.stageTimes[*change.NewStage])
23+
newState.StageTimeLeft = durationpb.New(s.stageTimes[newStage])
1424
newState.StageTimeElapsed = durationpb.New(time.Duration(0))
1525

1626
// if not transiting from a pre stage
@@ -32,15 +42,15 @@ func (s *StateMachine) processChangeChangeStage(newState *state.State, change *C
3242
}
3343

3444
// update timeout times when transiting to overtime
35-
if *change.NewStage == state.Referee_EXTRA_FIRST_HALF_PRE {
45+
if newStage == state.Referee_EXTRA_FIRST_HALF_PRE {
3646
*newState.TeamInfo(state.Team_YELLOW).TimeoutsLeft = s.gameConfig.Overtime.Timeouts
3747
newState.TeamInfo(state.Team_YELLOW).TimeoutTimeLeft = durationpb.New(s.gameConfig.Overtime.TimeoutDuration)
3848
*newState.TeamInfo(state.Team_BLUE).TimeoutsLeft = s.gameConfig.Overtime.Timeouts
3949
newState.TeamInfo(state.Team_BLUE).TimeoutTimeLeft = durationpb.New(s.gameConfig.Overtime.TimeoutDuration)
4050
}
4151

4252
// update next command based on new stage
43-
newState.NextCommand = s.getNextCommandForStage(newState, *change.NewStage)
53+
newState.NextCommand = s.getNextCommandForStage(newState, newStage)
4454

4555
// update placement pos (assuming it is either kickoff or nothing)
4656
if newState.NextCommand == nil {
@@ -54,7 +64,7 @@ func (s *StateMachine) processChangeChangeStage(newState *state.State, change *C
5464
newState.GameEvents = nil
5565

5666
// update new stage
57-
newState.Stage = change.NewStage
67+
*newState.Stage = newStage
5868

5969
return
6070
}

0 commit comments

Comments
 (0)