Description: "Great Over Watch Off (code 2177F): A three-round deathmatch inspired by a certain UK baking program. Compete in signature, technical and showstopper challenges. Don't be the soggy bottom or cause a Bingate...or should you? Version 1.1.0 (2020-03-05) by kdau#1430. More info at https://workshop.codes/2177F"
}
lobby
{
Max FFA Players: 8
Max Spectators: 4
}
modes
{
General
{
Allow Hero Switching: Off
Game Length In Minutes: 9
Game Mode Start: Immediately
Hero Limit: Off
}
Deathmatch
{
Score To Win: 50
enabled maps
{
Black Forest
Castillo
Château Guillard
Ecopoint: Antarctica
Kanezaka
Necropolis
Petra
}
}
}
heroes
{
General
{
Ability Cooldown Time: 50%
Ultimate Ability: Off
Ultimate Generation: 500%
Ana
{
No Automatic Fire: On
Quick Melee: Off
}
Ashe
{
No Automatic Fire: On
Quick Melee: Off
}
Brigitte
{
Primary Fire: Off
Quick Melee: Off
Repair Pack: Off
}
D.va
{
Micro Missiles Cooldown Time: 33%
Primary Fire: Off
Quick Melee: Off
}
Doomfist
{
Primary Fire: Off
Quick Melee: Off
Rocket Punch Cooldown Time: 125%
}
Echo
{
Primary Fire: Off
Quick Melee: Off
}
Genji
{
Primary Fire: Off
Quick Melee: Off
}
Hanzo
{
Primary Fire: Off
Quick Melee: Off
}
Junkrat
{
Primary Fire: Off
Quick Melee: Off
}
Lúcio
{
Damage Dealt: 250%
Primary Fire: Off
Quick Melee: Off
}
Mccree
{
Damage Dealt: 70%
Primary Fire: Off
Quick Melee: Off
}
Mei
{
Cryo-Freeze Cooldown Time: 75%
Damage Dealt: 125%
Quick Melee: Off
Secondary Fire: Off
Weapon Freeze Duration Scalar: 110%
}
Moira
{
Biotic Orb Cooldown Time: 40%
Biotic Orb Max Damage Scalar: 120%
Primary Fire: Off
Quick Melee: Off
Secondary Fire: Off
}
Reinhardt
{
Primary Fire: Off
Quick Melee: Off
}
Roadhog
{
Quick Melee: Off
Secondary Fire: Off
}
Sigma
{
Accretion Cooldown Time: 20%
Primary Fire: Off
Quick Melee: Off
}
Soldier: 76
{
Biotic Field Cooldown Time: 75%
Helix Rockets Cooldown Time: 45%
Primary Fire: Off
Quick Melee: Off
}
Symmetra
{
Damage Dealt: 85%
Primary Fire: Off
Quick Melee: Off
Sentry Turret Cooldown Time: 120%
}
Torbjörn
{
Quick Melee: Off
Weapons Enabled: Forge Hammer Only
}
Tracer
{
Damage Dealt: 150%
Primary Fire: Off
}
Widowmaker
{
Ammunition Clip Size Scalar: 29%
Damage Dealt: 80%
No Automatic Fire: On
Quick Melee: Off
}
Winston
{
Damage Dealt: 200%
Primary Fire: Off
}
Wrecking Ball
{
Damage Dealt: 135%
Primary Fire: Off
Quick Melee: Off
Roll Always Active: On
}
Zarya
{
Damage Dealt: 110%
Primary Fire: Off
Projected Barrier: Off
Quick Melee: Off
}
Zenyatta
{
Ammunition Clip Size Scalar: 75%
Damage Dealt: 70%
Orb Of Harmony: Off
Primary Fire: Off
Quick Melee: Off
}
disabled heroes
{
Baptiste
Bastion
Mercy
Orisa
Pharah
Reaper
Sombra
}
}
}
main
{
Description: "Great Over Watch Off (code 2177F): A three-round deathmatch inspired by a certain UK baking program. Compete in signature, technical and showstopper challenges. Don't be the soggy bottom or cause a Bingate...or should you? Version 1.0 (2020-03-01) by kdau#1430. More info at https://workshop.codes/2177F"
}
lobby
{
Max FFA Players: 8
Max Spectators: 4
}
modes
{
Deathmatch
{
enabled maps
{
Black Forest
Castillo
Château Guillard
Ecopoint: Antarctica
Kanezaka
Necropolis
Petra
}
}
General
{
Allow Hero Switching: Off
Game Length In Minutes: 9
Game Mode Start: Immediately
Hero Limit: Off
Score To Win: 999
}
}
heroes
{
General
{
Ability Cooldown Time: 50%
Ultimate Ability: Off
Ana
{
No Automatic Fire: On
Quick Melee: Off
}
Ashe
{
No Automatic Fire: On
Quick Melee: Off
}
Brigitte
{
Primary Fire: Off
Quick Melee: Off
Repair Pack: Off
}
D.Va
{
Micro Missiles Cooldown Time: 33%
Primary Fire: Off
Quick Melee: Off
}
Doomfist
{
Primary Fire: Off
Quick Melee: Off
Rocket Punch Cooldown Time: 200%
}
Echo
{
Primary Fire: Off
Quick Melee: Off
}
Genji
{
Primary Fire: Off
Quick Melee: Off
}
Hanzo
{
Primary Fire: Off
Quick Melee: Off
}
Junkrat
{
Primary Fire: Off
Quick Melee: Off
}
Lúcio
{
Damage Dealt: 250%
Primary Fire: Off
Quick Melee: Off
}
McCree
{
Damage Dealt: 70%
Primary Fire: Off
Quick Melee: Off
}
Mei
{
Cryo-Freeze Cooldown Time: 75%
Damage Dealt: 125%
Quick Melee: Off
Secondary Fire: Off
Weapon Freeze Duration Scalar: 110%
}
Moira
{
Biotic Orb Cooldown Time: 40%
Biotic Orb Max Damage Scalar: 120%
Primary Fire: Off
Quick Melee: Off
Secondary Fire: Off
}
Reinhardt
{
Primary Fire: Off
Quick Melee: Off
}
Roadhog
{
Quick Melee: Off
Secondary Fire: Off
}
Sigma
{
Accretion Cooldown Time: 20%
Primary Fire: Off
Quick Melee: Off
}
Soldier: 76
{
Biotic Field Cooldown Time: 75%
Helix Rockets Cooldown Time: 45%
Primary Fire: Off
Quick Melee: Off
}
Symmetra
{
Damage Dealt: 85%
Primary Fire: Off
Quick Melee: Off
Sentry Turret Cooldown Time: 120%
}
Torbjörn
{
Quick Melee: Off
Weapons Enabled: Forge Hammer Only
}
Tracer
{
Damage Dealt: 150%
Primary Fire: Off
}
Widowmaker
{
Ammunition Clip Size Scalar: 29%
Damage Dealt: 80%
No Automatic Fire: On
Quick Melee: Off
}
Winston
{
Damage Dealt: 200%
Primary Fire: Off
}
Wrecking Ball
{
Damage Dealt: 135%
Primary Fire: Off
Quick Melee: Off
Roll Always Active: On
}
Zarya
{
Damage Dealt: 110%
Primary Fire: Off
Projected Barrier: Off
Quick Melee: Off
}
Zenyatta
{
Ammunition Clip Size Scalar: 75%
Damage Dealt: 70%
Orb of Harmony: Off
Primary Fire: Off
Quick Melee: Off
}
disabled heroes
{
Baptiste
Bastion
Mercy
Orisa
Pharah
Reaper
Sombra
}
}
}
}
variables
{
global:
0: _extendedGlobalCollection
1: _arrayBuilder
2: ChallengeDuration
3: Challenge
4: UnusedHeroes
5: TechnicalHero
6: InstructionsID
7: RecognizeSoggyBottom
8: SoggyBottomImmortalityDuration
9: CurrentSoggyBottom
10: LastSoggyBottomChange
11: RecognizeBingate
12: BingateBonusPoints
13: BingateAttacker
14: BingateVictim
15: TestingCommands
16: DummyBots
17: RecognizeSelfDamage
18: spawnCount
19: i
20: player
21: maxDeaths
22: candidates
23: newSoggyBottom
player:
0: _extendedPlayerCollection
1: ChosenHero
2: KillsInChallenge
3: DeathsInChallenge
4: LastDeathTime
5: LastKiller
6: SoggyBottomEffect
}
// Extended collection variables:
// global [0]: _arrayBuilderStore
// global [1]: foreachIndex,
// Class identifiers:
global:
0: Challenge
1: InstructionsID
2: TechnicalHero
3: UnusedHeroes
4: SoggyBottom
5: BingateAttacker
6: BingateVictim
7: LastSoggyBottomChange
8: LoopIter
9: Scratch1
10: Scratch2
13: LoopMax
player:
0: ChosenHero
1: SoggyEffect
2: DeathsInChallenge
3: KillsInChallenge
4: LastDeathTime
5: LastKiller
}
subroutines
{
0: FindUnusedHeroes
1: SetUpChallenge
2: CleanUpSoggyBottom
3: SpawnDummies
4: IntroduceChallenge
5: ResetPrimaryFire
6: UpdateSoggyBottom
7: AnnounceBingate
0: IntroduceChallenge
1: SpawnDummies
2: SetUpChallenge
3: UpdateSoggyBottom
4: AnnounceBingate
5: CleanUpSoggyBottom
6: FindUnusedHeroes
}
rule("Sub: Find Unused Heroes")
{
event
{
Subroutine;
FindUnusedHeroes;
}
// Action count: 3
actions
{
Set Global Variable(UnusedHeroes, Randomized Array(Allowed Heroes(Host Player)));
Modify Global Variable(UnusedHeroes, Remove From Array By Value, Mapped Array(All Players(Team(All)), Hero Of(Current Array Element)));
Modify Global Variable(UnusedHeroes, Remove From Array By Value, Array(Hero(D.va), Hero(Tracer), Hero(Winston)));
Set Global Variable(spawnCount, Subtract(8, Number Of Players(Team(All))));
For Global Variable(i, 0, Global Variable(spawnCount), 1);
Create Dummy Bot(If-Then-Else(Compare(Global Variable(Challenge), ==, 2), Global Variable(TechnicalHero), Value In Array(Global Variable(UnusedHeroes), Global Variable(i))), Team(All), -1, Value In Array(Spawn Points(Team(All)), Global Variable(i)), Vector(0, 0, 0));
End;
}
event
{
Subroutine;
CleanUpSoggyBottom;
}
actions
{
"Turn off effects on any previous Soggy Bottom."
If(Global.SoggyBottom != Null);
Destroy Effect(Global.SoggyBottom.SoggyEffect);
Global.SoggyBottom.SoggyEffect = Null;
Stop Forcing Player Outlines(All Players(All Teams), Global.SoggyBottom);
Clear Status(Global.SoggyBottom, Unkillable);
Global.SoggyBottom = Null;
End;
}
}
rule("Sub: Introduce a Challenge")
rule("Sub: Announce a Bingate")
{
event
{
Subroutine;
IntroduceChallenge;
}
// Action count: 24
actions
{
Pause Match Time;
Wait Until(Is True For All(All Players(Team(All)), Has Spawned(Current Array Element)), 3);
Set Player Variable(Event Player, ChosenHero, Hero Of(Event Player));
}
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.Challenge == -1;
}
actions
{
Call Subroutine(SetUpChallenge);
Global.Challenge = 1;
Call Subroutine(SpawnDummies);
Call Subroutine(IntroduceChallenge);
}
}
rule("Global: Technical Challenge (2/3)")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global Variable(Challenge) == 1;
Match Time <= 0.1;
}
// Action count: 6
actions
{
Call Subroutine(SetUpChallenge);
Call Subroutine(FindUnusedHeroes);
Set Global Variable(TechnicalHero, Random Value In Array(Global Variable(UnusedHeroes)));
Set Global Variable(Challenge, 2);
Call Subroutine(SpawnDummies);
Call Subroutine(IntroduceChallenge);
}
}
rule("Sub: Reset the Primary Fire Status")
{
event
{
Subroutine;
ResetPrimaryFire;
}
// Action count: 1
actions
{
Set Primary Fire Enabled(Global Variable(player), Array Contains(Array(Hero(Ana), Hero(Ashe), Hero(Mei), Hero(Roadhog), Hero(Torbjörn), Hero(Widowmaker)), Global Variable(player)));
}
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.Challenge == 1;
Match Time <= 0.100;
}
actions
{
Call Subroutine(SetUpChallenge);
"Update the unused list for any new arrivals."
Call Subroutine(FindUnusedHeroes);
"Choose the hero for the Technical Challenge from the unused list."
Global.TechnicalHero = Random Value In Array(Global.UnusedHeroes);
Global.Challenge = 2;
Call Subroutine(SpawnDummies);
Call Subroutine(IntroduceChallenge);
}
}
rule("Player: Technical Challenge (2/3)")
rule("Global: Showstopper Challenge (3/3)")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Global Variable(Challenge) == 2;
Not(Is Dummy Bot(Event Player)) == True;
}
// Action count: 8
actions
{
Start Forcing Player To Be Hero(Event Player, Global Variable(TechnicalHero));
Respawn(Event Player);
Wait Until(Has Spawned(Event Player), 3);
Wait(0.25, Ignore Condition);
Set Global Variable(player, Event Player);
Call Subroutine(ResetPrimaryFire);
Set Ultimate Charge(Event Player, 0);
Set Ultimate Ability Enabled(Event Player, False);
}
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.Challenge == 2;
Match Time <= 0.100;
}
actions
{
Call Subroutine(SetUpChallenge);
"It isn't the Showstopper Challenge without ults!"
Set Ultimate Ability Enabled(All Players(All Teams), True);
Global.Challenge = 3;
Call Subroutine(SpawnDummies);
Call Subroutine(IntroduceChallenge);
}
}
rule("Global: Showstopper Challenge (3/3)")
rule("Global: Finish the Match")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global Variable(Challenge) == 2;
Match Time <= 0.1;
}
// Action count: 4
actions
{
Call Subroutine(SetUpChallenge);
Set Global Variable(Challenge, 3);
Call Subroutine(SpawnDummies);
Call Subroutine(IntroduceChallenge);
}
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.Challenge == 3;
Match Time <= 0.100;
}
actions
{
"This is a placeholder value for being finished."
Global.Challenge = -99;
"Bring back Athena to announce the outcome."
Enable Built-In Game Mode Announcer;
"Let nature take its course."
Enable Built-In Game Mode Completion;
}
}
rule("Player: Showstopper Challenge (3/3)")
rule("Player: Set Up the Match")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Global Variable(Challenge) == 3;
Not(Is Dummy Bot(Event Player)) == True;
}
// Action count: 8
actions
{
Start Forcing Player To Be Hero(Event Player, Player Variable(Event Player, ChosenHero));
"Record the player's hero so they can return to it after the Technical Challenge."
Event Player.ChosenHero = Hero Of(Event Player);
}
}
rule("Sub: Update the Soggy Bottom")
rule("Player: Technical Challenge (2/3)")
{
event
{
Subroutine;
UpdateSoggyBottom;
}
// Action count: 27
actions
{
If(Not(Global Variable(RecognizeSoggyBottom)));
Skip(25);
End;
Set Global Variable(maxDeaths, Last Of(Sorted Array(Mapped Array(All Players(Team(All)), Player Variable(Current Array Element, DeathsInChallenge)), Current Array Element)));
Set Global Variable(candidates, Filtered Array(All Players(Team(All)), Compare(Player Variable(Current Array Element, DeathsInChallenge), ==, Global Variable(maxDeaths))));
Set Global Variable(newSoggyBottom, Last Of(Sorted Array(Global Variable(candidates), Player Variable(Current Array Element, LastDeathTime))));
If(Compare(Global Variable(CurrentSoggyBottom), ==, Global Variable(newSoggyBottom)));
Skip(16);
End;
If(Compare(Total Time Elapsed, <, Add(Global Variable(LastSoggyBottomChange), 10)));
Skip(13);
End;
Set Global Variable(LastSoggyBottomChange, Total Time Elapsed);
Call Subroutine(CleanUpSoggyBottom);
Set Global Variable(CurrentSoggyBottom, Global Variable(newSoggyBottom));
Start Forcing Player Outlines(All Living Players(Team(All)), Global Variable(CurrentSoggyBottom), True, Color(Red), Always);
Wait Until(Is Alive(Global Variable(CurrentSoggyBottom)), Global Variable(SoggyBottomImmortalityDuration));
Big Message(Global Variable(CurrentSoggyBottom), Custom String("You are the Soggy Bottom", Null, Null, Null));
Small Message(Global Variable(CurrentSoggyBottom), Custom String("Enjoy wallhacks and {0} seconds of immortality!", Global Variable(SoggyBottomImmortalityDuration), Null, Null));
Set Status(Global Variable(CurrentSoggyBottom), Null, Unkillable, Global Variable(SoggyBottomImmortalityDuration));
Create Effect(If-Then-Else(Is Alive(Global Variable(CurrentSoggyBottom)), All Players(Team(All)), Empty Array), Bad Aura, Color(Aqua), Global Variable(CurrentSoggyBottom), 1, Visible To Position and Radius);
Set Player Variable(Global Variable(CurrentSoggyBottom), SoggyBottomEffect, Last Created Entity);
End;
}
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Global.Challenge == 2;
Is Dummy Bot(Event Player) == False;
}
actions
{
"Switch the player to the Technical Challenge hero."
Start Forcing Player To Be Hero(Event Player, Global.TechnicalHero);
"Respawn the player in a new location."
Respawn(Event Player);
"Ensure the player has respawned so they will be affected by further actions."
Set Player Variable(Event Player, SoggyBottomEffect, Null);
}
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
"Detect end of ultimate."
Is Using Ultimate(Event Player) == False;
}
actions
{
"Recognize a Bingate during the Showstopper Challenge."
If(Global.Challenge == 3 && Event Player.LastDeathTime == Total Time Elapsed);
Global.BingateAttacker = Event Player.LastKiller;
Global.BingateVictim = Event Player;
Call Subroutine(AnnounceBingate);
End;
}
}
rule("Sub: Announce a Bingate")
rule("Player: Handle Death")
{
event
{
Subroutine;
AnnounceBingate;
}
// Action count: 7
actions
{
If(Not(Global Variable(RecognizeBingate)));
Skip(5);
End;
Wait(1, Ignore Condition);
Modify Player Score(Global Variable(BingateAttacker), Global Variable(BingateBonusPoints));
Small Message(Global Variable(BingateAttacker), Custom String("Bingate Kill of {0} {1}!\n{2} Bonus Point(s) for Ultimate Shutdown", Hero Icon String(Hero Of(Global Variable(BingateVictim))), Global Variable(BingateVictim), Global Variable(BingateBonusPoints)));
Play Effect(Global Variable(BingateAttacker), Good Pickup Effect, Color(Purple), Add(Eye Position(Global Variable(BingateAttacker)), Facing Direction Of(Global Variable(BingateAttacker))), 3);
}
event
{
Player Died;
All;
All;
}
conditions
{
"Ignore self damage."
Attacker != Victim;
}
actions
{
Victim.LastDeathTime = Total Time Elapsed;
Victim.LastKiller = Attacker;
Victim.DeathsInChallenge += 1;
Attacker.KillsInChallenge += 1;
"Update the Soggy Bottom for applicable challenges."
If(Global.Challenge != 3);
Call Subroutine(UpdateSoggyBottom);
End;
}
}
rule("Player: Handle End of Ultimate")
rule("Player: Clean Up Soggy Bottom Effect")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Not(Is Using Ultimate(Event Player)) == True;
}
// Action count: 5
actions
{
If(And(And(Compare(Global Variable(Challenge), ==, 3), Global Variable(RecognizeBingate)), Compare(Player Variable(Event Player, LastDeathTime), ==, Total Time Elapsed)));
Set Global Variable(BingateAttacker, Player Variable(Event Player, LastKiller));
Set Global Variable(BingateVictim, Event Player);
Call Subroutine(AnnounceBingate);
End;
}
}
rule("Hero: Brigitte: Shield Bash deals more damage")