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
}
}
}
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.1.0 (2020-03-05) by kdau#1430. More info at https://workshop.codes/2177F"
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;
}
}
rule("Sub: Announce a Bingate")
rule("Sub: Introduce a Challenge")
{
event
{
Subroutine;
AnnounceBingate;
}
actions
{
"Wait a moment for the regular \"Eliminated X\" message to cycle through."
Wait(1, Ignore Condition);
"Add a bonus point to the player's score."
Modify Player Score(Global.BingateAttacker, 1);
"Let the player know."
Small Message(Global.BingateAttacker, Custom String("Bingate Kill of {0} {1}!\r\nBonus Point for Ultimate Shutdown",
Set Player Variable(Event Player, ChosenHero, Hero Of(Event Player));
}
}
rule("Global: Technical Challenge (2/3)")
{
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);
}
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)));
}
}
rule("Global: Showstopper Challenge (3/3)")
rule("Player: Technical Challenge (2/3)")
{
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);
}
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);
"Record the player's hero so they can return to it after the Technical Challenge."
Event Player.ChosenHero = Hero Of(Event Player);
}
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global Variable(Challenge) == 3;
Match Time <= 0.1;
}
// Action count: 3
actions
{
Set Global Variable(Challenge, -99);
Enable Built-In Game Mode Announcer;
Enable Built-In Game Mode Completion;
}
}
rule("Player: Technical Challenge (2/3)")
rule("Sub: Update the Soggy Bottom")
{
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."
Wait Until(Has Spawned(Event Player), 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;
}
}
rule("Player: Showstopper Challenge (3/3)")
rule("Player: Handle Death")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Global.Challenge == 3;
Is Dummy Bot(Event Player) == False;
}
actions
{
"Return the player to their originally chosen hero."
Start Forcing Player To Be Hero(Event Player, Event Player.ChosenHero);
"Respawn the player in a new location."
Respawn(Event Player);
"Ensure the player has respawned so they will be affected by further actions."
Wait Until(Has Spawned(Event Player), 3);
"Wait a little longer, else setting ultimate charge doesn't work."
Set Player Variable(Event Player, SoggyBottomEffect, Null);
}
}
rule("Player: Handle Death")
rule("Sub: Announce a Bingate")
{
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;
}
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);
}
}
rule("Player: Clean Up Soggy Bottom Effect")
rule("Player: Handle End of Ultimate")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
"Start when the effect is created elsewhere."
Event Player.SoggyEffect != Null;
}
actions
{
"Wait for immortality to lapse."
Wait(15, Abort When False);
Destroy Effect(Event Player.SoggyEffect);
Event Player.SoggyEffect = Null;
}
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")