Skip to content

Commit 3aa076e

Browse files
committed
Handle challenge flags
1 parent 0926737 commit 3aa076e

15 files changed

+1130
-604
lines changed

frontend/src/components/match/ContinueActionButton.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ const label = computed(() => {
7070
return 'Accept Goal'
7171
case ContinueAction_Type.NORMAL_START:
7272
return 'Normal Start'
73+
case ContinueAction_Type.CHALLENGE_ACCEPT:
74+
return 'Accept Challenge'
75+
case ContinueAction_Type.CHALLENGE_REJECT:
76+
return 'Reject Challenge'
7377
case ContinueAction_Type.TYPE_UNKNOWN:
7478
case ContinueAction_Type.UNRECOGNIZED:
7579
default:

frontend/src/helpers/texts.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ export const gameEventNames = new Map<GameEvent_Type, string>([
119119
[GameEvent_Type.BOT_SUBSTITUTION, "Bot substitution"],
120120
[GameEvent_Type.TOO_MANY_ROBOTS, "Too many bots on field"],
121121
[GameEvent_Type.CHALLENGE_FLAG, "Challenge flag"],
122+
[GameEvent_Type.CHALLENGE_FLAG_HANDLED, "Challenge flag handled"],
122123
[GameEvent_Type.EMERGENCY_STOP, "Emergency stop"],
123124
[GameEvent_Type.UNSPORTING_BEHAVIOR_MINOR, "Unsporting behavior (minor)"],
124125
[GameEvent_Type.UNSPORTING_BEHAVIOR_MAJOR, "Unsporting behavior (major)"],

frontend/src/proto/ssl_gc_engine.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ export enum ContinueAction_Type {
152152
END_GAME = "END_GAME",
153153
ACCEPT_GOAL = "ACCEPT_GOAL",
154154
NORMAL_START = "NORMAL_START",
155+
CHALLENGE_ACCEPT = "CHALLENGE_ACCEPT",
156+
CHALLENGE_REJECT = "CHALLENGE_REJECT",
155157
UNRECOGNIZED = "UNRECOGNIZED",
156158
}
157159

@@ -211,6 +213,12 @@ export function continueAction_TypeFromJSON(object: any): ContinueAction_Type {
211213
case 13:
212214
case "NORMAL_START":
213215
return ContinueAction_Type.NORMAL_START;
216+
case 18:
217+
case "CHALLENGE_ACCEPT":
218+
return ContinueAction_Type.CHALLENGE_ACCEPT;
219+
case 19:
220+
case "CHALLENGE_REJECT":
221+
return ContinueAction_Type.CHALLENGE_REJECT;
214222
case -1:
215223
case "UNRECOGNIZED":
216224
default:
@@ -256,6 +264,10 @@ export function continueAction_TypeToJSON(object: ContinueAction_Type): string {
256264
return "ACCEPT_GOAL";
257265
case ContinueAction_Type.NORMAL_START:
258266
return "NORMAL_START";
267+
case ContinueAction_Type.CHALLENGE_ACCEPT:
268+
return "CHALLENGE_ACCEPT";
269+
case ContinueAction_Type.CHALLENGE_REJECT:
270+
return "CHALLENGE_REJECT";
259271
case ContinueAction_Type.UNRECOGNIZED:
260272
default:
261273
return "UNRECOGNIZED";

frontend/src/proto/ssl_gc_game_event.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export interface GameEvent {
5454
| { $case: "botSubstitution"; botSubstitution: GameEvent_BotSubstitution }
5555
| { $case: "tooManyRobots"; tooManyRobots: GameEvent_TooManyRobots }
5656
| { $case: "challengeFlag"; challengeFlag: GameEvent_ChallengeFlag }
57+
| { $case: "challengeFlagHandled"; challengeFlagHandled: GameEvent_ChallengeFlagHandled }
5758
| { $case: "emergencyStop"; emergencyStop: GameEvent_EmergencyStop }
5859
| { $case: "unsportingBehaviorMinor"; unsportingBehaviorMinor: GameEvent_UnsportingBehaviorMinor }
5960
| { $case: "unsportingBehaviorMajor"; unsportingBehaviorMajor: GameEvent_UnsportingBehaviorMajor }
@@ -142,6 +143,8 @@ export enum GameEvent_Type {
142143
TOO_MANY_ROBOTS = "TOO_MANY_ROBOTS",
143144
/** CHALLENGE_FLAG - triggered by GC */
144145
CHALLENGE_FLAG = "CHALLENGE_FLAG",
146+
/** CHALLENGE_FLAG_HANDLED - triggered by GC */
147+
CHALLENGE_FLAG_HANDLED = "CHALLENGE_FLAG_HANDLED",
145148
/** EMERGENCY_STOP - triggered by GC */
146149
EMERGENCY_STOP = "EMERGENCY_STOP",
147150
/** UNSPORTING_BEHAVIOR_MINOR - triggered by human ref */
@@ -269,6 +272,9 @@ export function gameEvent_TypeFromJSON(object: any): GameEvent_Type {
269272
case 44:
270273
case "CHALLENGE_FLAG":
271274
return GameEvent_Type.CHALLENGE_FLAG;
275+
case 46:
276+
case "CHALLENGE_FLAG_HANDLED":
277+
return GameEvent_Type.CHALLENGE_FLAG_HANDLED;
272278
case 45:
273279
case "EMERGENCY_STOP":
274280
return GameEvent_Type.EMERGENCY_STOP;
@@ -381,6 +387,8 @@ export function gameEvent_TypeToJSON(object: GameEvent_Type): string {
381387
return "TOO_MANY_ROBOTS";
382388
case GameEvent_Type.CHALLENGE_FLAG:
383389
return "CHALLENGE_FLAG";
390+
case GameEvent_Type.CHALLENGE_FLAG_HANDLED:
391+
return "CHALLENGE_FLAG_HANDLED";
384392
case GameEvent_Type.EMERGENCY_STOP:
385393
return "EMERGENCY_STOP";
386394
case GameEvent_Type.UNSPORTING_BEHAVIOR_MINOR:
@@ -799,6 +807,14 @@ export interface GameEvent_ChallengeFlag {
799807
byTeam?: Team;
800808
}
801809

810+
/** A challenge, flagged recently, has been handled by the referee */
811+
export interface GameEvent_ChallengeFlagHandled {
812+
/** the team that requested the challenge flag */
813+
byTeam?: Team;
814+
/** the challenge was accepted by the referee */
815+
accepted?: boolean;
816+
}
817+
802818
/** An emergency stop, requested by team previously, occurred */
803819
export interface GameEvent_EmergencyStop {
804820
/** the team that substitutes robots */
@@ -951,6 +967,11 @@ export const GameEvent = {
951967
? { $case: "tooManyRobots", tooManyRobots: GameEvent_TooManyRobots.fromJSON(object.tooManyRobots) }
952968
: isSet(object.challengeFlag)
953969
? { $case: "challengeFlag", challengeFlag: GameEvent_ChallengeFlag.fromJSON(object.challengeFlag) }
970+
: isSet(object.challengeFlagHandled)
971+
? {
972+
$case: "challengeFlagHandled",
973+
challengeFlagHandled: GameEvent_ChallengeFlagHandled.fromJSON(object.challengeFlagHandled),
974+
}
954975
: isSet(object.emergencyStop)
955976
? { $case: "emergencyStop", emergencyStop: GameEvent_EmergencyStop.fromJSON(object.emergencyStop) }
956977
: isSet(object.unsportingBehaviorMinor)
@@ -1119,6 +1140,9 @@ export const GameEvent = {
11191140
message.event?.$case === "challengeFlag" && (obj.challengeFlag = message.event?.challengeFlag
11201141
? GameEvent_ChallengeFlag.toJSON(message.event?.challengeFlag)
11211142
: undefined);
1143+
message.event?.$case === "challengeFlagHandled" && (obj.challengeFlagHandled = message.event?.challengeFlagHandled
1144+
? GameEvent_ChallengeFlagHandled.toJSON(message.event?.challengeFlagHandled)
1145+
: undefined);
11221146
message.event?.$case === "emergencyStop" && (obj.emergencyStop = message.event?.emergencyStop
11231147
? GameEvent_EmergencyStop.toJSON(message.event?.emergencyStop)
11241148
: undefined);
@@ -1959,6 +1983,26 @@ export const GameEvent_ChallengeFlag = {
19591983
},
19601984
};
19611985

1986+
function createBaseGameEvent_ChallengeFlagHandled(): GameEvent_ChallengeFlagHandled {
1987+
return {};
1988+
}
1989+
1990+
export const GameEvent_ChallengeFlagHandled = {
1991+
fromJSON(object: any): GameEvent_ChallengeFlagHandled {
1992+
return {
1993+
byTeam: isSet(object.byTeam) ? teamFromJSON(object.byTeam) : Team.UNKNOWN,
1994+
accepted: isSet(object.accepted) ? Boolean(object.accepted) : false,
1995+
};
1996+
},
1997+
1998+
toJSON(message: GameEvent_ChallengeFlagHandled): unknown {
1999+
const obj: any = {};
2000+
message.byTeam !== undefined && (obj.byTeam = teamToJSON(message.byTeam));
2001+
message.accepted !== undefined && (obj.accepted = message.accepted);
2002+
return obj;
2003+
},
2004+
};
2005+
19622006
function createBaseGameEvent_EmergencyStop(): GameEvent_EmergencyStop {
19632007
return {};
19642008
}

internal/app/engine/common.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,18 @@ func createBallPlacementFailedEventChange(byTeam state.Team) *statemachine.Chang
7171
})
7272
}
7373

74+
// createChallengeFlagHandledEventChange creates a new change for handled challenge flags
75+
func createChallengeFlagHandledEventChange(byTeam state.Team, accepted bool) *statemachine.Change {
76+
return createGameEventChange(state.GameEvent_CHALLENGE_FLAG_HANDLED, &state.GameEvent{
77+
Event: &state.GameEvent_ChallengeFlagHandled_{
78+
ChallengeFlagHandled: &state.GameEvent_ChallengeFlagHandled{
79+
ByTeam: &byTeam,
80+
Accepted: &accepted,
81+
},
82+
},
83+
})
84+
}
85+
7486
// createStageChange creates a change with a new stage
7587
func createStageChange(stage *state.Referee_Stage) *statemachine.Change {
7688
return &statemachine.Change{

internal/app/engine/process_continue_next_action.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,22 @@ func (e *Engine) nextActions() (actions []*ContinueAction) {
7676
ContinueAction_READY_MANUAL,
7777
))
7878
}
79+
80+
challengeFlagsRaised := len(e.currentState.FindGameEventsByTeam(state.GameEvent_CHALLENGE_FLAG, team))
81+
challengeFlagsHandled := len(e.currentState.FindGameEventsByTeam(state.GameEvent_CHALLENGE_FLAG_HANDLED, team))
82+
83+
if challengeFlagsRaised > challengeFlagsHandled {
84+
actions = append(actions, createContinueAction(
85+
ContinueAction_CHALLENGE_ACCEPT,
86+
team,
87+
ContinueAction_READY_MANUAL,
88+
))
89+
actions = append(actions, createContinueAction(
90+
ContinueAction_CHALLENGE_REJECT,
91+
team,
92+
ContinueAction_READY_MANUAL,
93+
))
94+
}
7995
}
8096
}
8197

internal/app/engine/process_continue_perform.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ func (e *Engine) performContinueAction(action *ContinueAction) {
6969
}
7070
case ContinueAction_NORMAL_START:
7171
e.Enqueue(createCommandChange(state.NewCommandNeutral(state.Command_NORMAL_START)))
72+
case ContinueAction_CHALLENGE_ACCEPT:
73+
e.Enqueue(createChallengeFlagHandledEventChange(*action.ForTeam, true))
74+
case ContinueAction_CHALLENGE_REJECT:
75+
e.Enqueue(createChallengeFlagHandledEventChange(*action.ForTeam, false))
7276
default:
7377
log.Println("Unknown continue action: ", *action.Type)
7478
}

internal/app/engine/ssl_gc_engine.pb.go

Lines changed: 21 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/app/rcon/server_remotecontrol.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,10 @@ func (c *RemoteControlClient) checkRequestRobotSubstitution() error {
280280
func (c *RemoteControlClient) checkRequestChallengeFlag() error {
281281
currentState := c.gcEngine.CurrentState()
282282
teamState := currentState.TeamState[c.team.String()]
283-
if currentState.HasGameEventByTeam(state.GameEvent_CHALLENGE_FLAG, *c.team) {
283+
challengeFlagsRaised := len(currentState.FindGameEventsByTeam(state.GameEvent_CHALLENGE_FLAG, *c.team))
284+
challengeFlagsHandled := len(currentState.FindGameEventsByTeam(state.GameEvent_CHALLENGE_FLAG_HANDLED, *c.team))
285+
286+
if challengeFlagsRaised > challengeFlagsHandled {
284287
return errors.New("Challenge flag already requested")
285288
}
286289
if *teamState.ChallengeFlags <= 0 {

0 commit comments

Comments
 (0)