workshopModes/defendTheCastleExtended/latest.ow

8988 lines
289 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

settings
{
main
{
Description: "<FGf74b51FF>Defend The Castle Extended Version d143\nby ShuriZma#2349\nJ1K6F (Code Version: d143)\nOriginal mode by HuKuTa94#2589\n\nDefend the gate, kill enemies\nand don't allow them to damage the gate!\n\nSpecial Thanks to:\nShingen#21859 for the Abilities,\nLemonAid#11644 for the Hero Talents\n& Josbird for teaching me about Menus!\n\nFind this mode on: workshop.codes/defend-the-castle\nFind the Original Mode on: workshop.codes/BQEGS\nTell me what you think on Discord: dc.shuri.gg\n\nPS: SHINGEN PLS COME BACK"
Mode Name: "Defend The Castle Extended"
}
lobby
{
Max Spectators: 0
Max Team 1 Players: 4
Max Team 2 Players: 0
Return To Lobby: Never
Swap Teams After Match: No
}
modes
{
Escort
{
enabled maps
{
Havana 0
}
}
Team Deathmatch
{
enabled maps
{
}
}
General
{
Game Mode Start: Immediately
Spawn Health Packs: Disabled
}
}
extensions
{
Beam Effects
Buff Status Effects
Kinetic Explosion Effects
Explosion Sounds
Play More Effects
Spawn More Dummy Bots
}
}
variables
{
global:
0: gatePosition
1: zenSpawnPositions
2: spawnPositionMaxId
3: loopIterator
4: bigBossSpawnPositions
5: playerSpawnPositions
6: gateHealthChase
7: gateHealth
8: gateMaxHealth
9: gateProgressBarColorCurrent
10: gateProgressBarColorComponent
11: gateHealthEvent
12: bastionTargetPositions
13: sniperPositions
14: ballSpawnPositions
15: zenRespawnTime
16: timeSeconds
17: timeMinutes
18: defaultCurrentBot
19: defaultHeroBotsPool
21: isDebug
22: botOrisaParent
24: botOrisaChild
25: gateRepairPosition
26: botOrisaTargetPosition
27: botEchoRespawnPosition
28: botEchoTeleportPositions
29: upgradeGateMaxHealthValue
30: upgradeGateMaxHealthHudId
31: upgradePlayerMaxHealthValue
32: upgradePlayerMaxHealthHudId
33: upgradeCriticalDamageValue
34: upgradeCriticalDamageHudId
35: upgradeMaxAmmoValue
36: upgradeMaxAmmoHudId
37: upgradeMaxAmmoMaxValue
38: upgradePlayerMaxHealthMaxValue
39: upgradeCriticalDamageMaxValue
40: upgradeGateMaxHealthMaxValue
42: isDebugAINavigation
43: gameLogicCountOfUniqueHeroes
44: isNewWaveGameLogicProcessing
45: automaticRepair
46: upgradePerkSharpshooterValue
47: perk
48: maxHealthDone
49: startMoney
50: time5Minutes
51: selfNanoWorkshopSetting
52: shopCamPosition
53: shopBasePosition
54: shopPositionAngle
55: activeBoss
57: bossRotation
58: lastBoss
59: time10Minutes
60: moneyMultiplier
61: challengeCount
62: upgradeBossHealthValue
63: globalHUDs
108: extendedGlobalCollection
109: arrayBuilder
111: exitButtonProperties
112: allPositions
113: allDirections
114: firstPosition
115: secondPosition
116: firstPoint
117: secondPoint
118: second
119: z
120: wallId
121: showWalls
122: isGrounded
123: beamType
125: nodePositions
126: nodeConnections
127: distanceMatrix
player:
0: botSeePlayer
1: botDoesUniqueBehaviour
2: botEffects
3: botRayCastHitPosition
4: botEventPosition
5: currentHero
6: isDead
7: isRespawning
8: botBastionArtilleryDidShotsCount
9: botCounter
10: hasBadStatus
11: eventHealth
12: healOverTimeId
13: botIsOrisaChild
14: botEchoCapturedPlayer
15: botPlayersInRadius
16: botLoopIterator2
17: botWidowShotTime
18: botWidowTeleportTime
19: isNanoed
20: abilityHUD
21: lucioDashActive
22: lucioDashIcon
23: anaEntityID
24: abilities
25: money
26: heroTalentText
27: damageBoost
28: playerHealth
29: abilityCountdown
30: hpPool
31: effects
32: abilityProjectile
33: abilityEnd
34: abilityAvailable
35: speedBoost
36: damageMod
38: soldierEspionage
39: healBoost
40: baseStats
41: chainReactionOn
42: chainReactionImmune
43: abilityActive
44: loopIterator
45: secondWindActive
46: isInMenu
48: playerFacing
49: isBoss
53: deathPosition
54: lastSecondWind
55: vote
94: workshopButtons
95: extendedPlayerCollection
96: getProperties
97: buttonModification
98: currActionID
99: destroyButtonID
100: lastMenuButtonID
101: buttons
102: newButton
103: menuOriginalFacing
104: menuFrame
105: filterPosition
106: lastSavedPosition
107: closestBodyPosition
108: fullBodyPosition
109: previousPositionIntersection
110: activeWall
111: closestWall
112: x
113: intersectionLength
114: thickness
115: botCancelPathFinding
116: botLoopIterator1
117: botTempArray
118: botTargetPlayer
119: botTargetPosition
120: botClosestNodeIdToTarget
121: botClosestNodeIdToBot
122: botPreviousNodeId
123: botNextNodeId
124: botNextNodePosition
125: botCurrentDistanceToTarget
126: botShortestDistanceToTarget
127: botIsPathFinding
}
subroutines
{
0: BotBastionArtilleryDamage
2: BotBastionRespawn
3: GateProgressBarColor
4: BotZenyattaRespawn
5: BotWidowRespawn
6: BotBallRespawn
8: BotOrisaRespawn
9: BotLandingFromSky
10: BotEchoRespawn
11: BotEchoDetachPlayer
12: BotEchoFlyToPlayer
13: BotEchoFlyToPortal
14: GameLogicSetBotProperties
15: DisablePlayer
16: BotAppearFromUnderground
17: BotReinRespawn
18: PlayerInit
19: BotInit
20: PlayerRespawn
21: BotRespawn
22: BotWidowBadStatus
24: Refund
25: EnablePlayer
26: GateRepair
27: CancelMomentum
28: UpdatePlayerStats
114: createMenuButton
115: destroyMenuButton
116: modifyMenuButton
117: getButtonProperties
118: createCursor
122: doButtonUpdate
124: BotStartPathFinding
125: BotGetClosestNodeIdToTarget
126: BotGetNextNodeIdAndPosition
127: BotResetPathFinding
}
disabled rule("=== PATH BUILDER MODE IMPORT ===")
{
event
{
Ongoing - Global;
}
}
rule("MAP: HAVANA")
{
event
{
Ongoing - Global;
}
conditions
{
Current Map == Map(Havana);
}
actions
{
Global.nodePositions = Array(Vector(147.588, 6.425, -46.749), Vector(136.181, 6.425, -57.159), Vector(130.189, 6.425, -63.781),
Vector(123.305, 6.425, -57.983), Vector(125.678, 6.504, -46.633), Vector(114.485, 7.471, -46.699), Vector(138.743, 6.425,
-32.974), Vector(126.498, 6.425, -39.920), Vector(124.572, 10.434, -34.300), Vector(138.605, 5.359, -18.647), Vector(119.009,
2.331, -31.024), Vector(121.138, 5.228, -19.933), Vector(126.722, 6.425, -29.505), Vector(102.762, 3.157, -33.609), Vector(
76.030, 7.418, -74.087), Vector(83.720, 9.425, -33.744), Vector(97.439, 7.238, -42.379), Vector(86.252, 12.416, -47.261),
Vector(65.178, 11.425, -73.187), Vector(97.466, 7.269, -50.596), Vector(113.039, 7.424, -37.337), Vector(106.179, 7.450,
-46.143), Vector(90.086, 7.411, -44.653), Vector(78.752, 7.418, -62.140), Vector(82.124, 7.428, -44.229), Vector(90.675, 7.231,
-51.234), Vector(85.717, 4.692, -63.446), Vector(90.830, 4.330, -70.697), Vector(102.425, 2.387, -72.817), Vector(81.443,
4.425, -81.648), Vector(70.743, 6.418, -81.495), Vector(69.738, 6.419, -96.344), Vector(127.586, 12.643, -63.344), Vector(
118.911, 13.468, -58.008), Vector(102.885, 1.092, -56.579), Vector(100.009, 2.967, -67.139), Vector(106.703, 0.465, -44.628),
Vector(81.695, 7.418, -52.140), Vector(126.979, 12.393, -55.079), Vector(153.720, 18.578, -21.745), Vector(155.301, 18.619,
-17.595), Vector(133.043, 10.425, -26.625), Vector(114.646, 7.278, -57.336), Vector(95.160, 3.688, -81.194), Vector(78.456,
5.418, -93.581), Vector(75.455, 5.418, -101.492), Vector(148.071, 9.432, -32.123), Vector(146.706, 9.425, -27.858), Vector(
144.273, 9.445, -63.119), Vector(144.278, 9.454, -58.447));
Global.nodeConnections = Array(Array(1, 6, 4, 7), Array(2, 1, 4, 6, 7, 0, 49), Array(1, 3), Array(2, 4, 42), Array(3, 1, 5, 7, 6,
1, 0), Array(4, 7, 20, 21, 19, 16, 42), Array(7, 1, 4, 1, 9, 12, 0, 46), Array(4, 5, 6, 1, 1, 12, 0), Array(7, 41), Array(6,
11), Array(11, 13), Array(9, 10, 13), Array(6, 7, 10), Array(10, 16, 36), Array(18, 23, 30), Array(17, 24), Array(13, 19, 22,
21, 25, 5), Array(15, 22, 25, 23), Array(14), Array(16, 21, 22, 26, 27, 35, 25, 5), Array(5, 13, 10), Array(19, 16, 5, 13, 22,
34), Array(16, 19, 21, 24, 25), Array(14, 25, 26, 37), Array(22, 15, 37), Array(23, 22, 19, 16, 26, 27, 35, 37), Array(25, 19,
27, 35, 29), Array(19, 26, 25, 29, 35, 43), Array(35, 34, 43), Array(27, 26, 30, 43, 44), Array(29, 14, 31), Array(30, 29, 45),
Array(33, 38, 1, 48), Array(32, 38, 42), Array(35, 36, 28), Array(28, 19, 25, 27, 26, 34), Array(13, 34), Array(25, 23, 24),
Array(5, 4, 1, 6, 1, 32, 33, 0), Array(40), Array(39), Array(6, 8, 47, 46), Array(3, 5, 34), Array(28, 27, 29, 44), Array(29,
43, 45), Array(44, 31), Array(6, 47), Array(46, 41), Array(49, 32), Array(1, 0, 6, 48));
Global.distanceMatrix = Array(Array(0, 1, 2, 2, 1, 2, 1, 1, 5, 2, 3, 3, 2, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 6, 7,
4, 5, 4, 4, 5, 5, 5, 0, 0, 4, 3, 5, 6, 7, 2, 3, 3, 2), Array(1, 0, 1, 2, 1, 2, 1, 1, 5, 2, 3, 3, 2, 4, 6, 6, 3, 7, 7, 3, 3, 3,
4, 5, 5, 4, 4, 4, 5, 5, 6, 7, 3, 4, 4, 4, 5, 5, 4, 0, 0, 4, 3, 5, 6, 7, 2, 3, 2, 1), Array(2, 1, 0, 1, 2, 3, 2, 2, 6, 3, 4, 4,
3, 5, 7, 7, 4, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 4, 6, 7, 8, 4, 5, 3, 4, 4, 6, 5, 0, 0, 5, 2, 5, 6, 7, 3, 4, 3, 2), Array(2, 2,
1, 0, 1, 2, 2, 2, 6, 3, 4, 4, 3, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 3, 5, 6, 7, 5, 6, 2, 3, 3, 5, 6, 0, 0, 5, 1, 4,
5, 6, 3, 4, 4, 3), Array(1, 1, 2, 1, 0, 1, 1, 1, 5, 2, 3, 3, 2, 3, 5, 5, 2, 6, 6, 2, 2, 2, 3, 4, 4, 3, 3, 3, 4, 4, 5, 6, 4, 5,
3, 3, 4, 4, 5, 0, 0, 4, 2, 4, 5, 6, 2, 3, 3, 2), Array(2, 2, 3, 2, 1, 0, 2, 1, 6, 3, 2, 3, 2, 2, 4, 4, 1, 5, 5, 1, 1, 1, 2, 3,
3, 2, 2, 2, 3, 3, 4, 5, 5, 6, 2, 2, 3, 3, 6, 0, 0, 5, 1, 3, 4, 5, 3, 4, 4, 3), Array(1, 1, 2, 2, 1, 2, 0, 1, 4, 1, 2, 2, 1, 3,
6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 6, 7, 4, 5, 4, 4, 4, 5, 5, 0, 0, 3, 3, 5, 6, 7, 1, 2, 3, 2), Array(1, 1, 2, 2,
1, 1, 1, 0, 5, 2, 2, 3, 1, 3, 5, 5, 2, 6, 6, 2, 2, 2, 3, 4, 4, 3, 3, 3, 4, 4, 5, 6, 4, 5, 3, 3, 4, 4, 5, 0, 0, 4, 2, 4, 5, 6,
2, 3, 3, 2), Array(2, 2, 3, 3, 2, 2, 2, 1, 0, 3, 3, 4, 2, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 6, 7, 5, 6, 4, 4,
5, 5, 6, 0, 0, 1, 3, 5, 6, 7, 2, 2, 4, 3), Array(2, 2, 3, 3, 2, 3, 1, 2, 5, 0, 2, 1, 2, 2, 6, 6, 3, 7, 7, 4, 4, 4, 4, 5, 5, 4,
5, 5, 5, 6, 7, 8, 5, 6, 4, 5, 3, 5, 6, 0, 0, 4, 4, 6, 7, 8, 2, 3, 4, 3), Array(4, 4, 5, 5, 4, 3, 3, 4, 7, 2, 0, 1, 4, 1, 5, 5,
2, 6, 6, 3, 4, 3, 3, 4, 4, 3, 4, 4, 4, 5, 6, 7, 7, 8, 3, 4, 2, 4, 8, 0, 0, 6, 4, 5, 6, 7, 4, 5, 6, 5), Array(3, 3, 4, 4, 3, 3,
2, 3, 6, 1, 1, 0, 3, 1, 5, 5, 2, 6, 6, 3, 4, 3, 3, 4, 4, 3, 4, 4, 4, 5, 6, 7, 6, 7, 3, 4, 2, 4, 7, 0, 0, 5, 4, 5, 6, 7, 3, 4,
5, 4), Array(2, 2, 3, 3, 2, 2, 1, 1, 5, 2, 1, 2, 0, 2, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 6, 7, 5, 6, 4, 4, 3, 5,
6, 0, 0, 4, 3, 5, 6, 7, 2, 3, 4, 3), Array(4, 4, 5, 4, 3, 2, 4, 3, 8, 3, 1, 2, 4, 0, 4, 4, 1, 5, 5, 2, 3, 2, 2, 3, 3, 2, 3, 3,
3, 4, 5, 6, 7, 8, 2, 3, 1, 3, 8, 0, 0, 7, 3, 4, 5, 6, 5, 6, 6, 5), Array(6, 6, 7, 6, 5, 4, 6, 5, 10, 7, 5, 6, 6, 4, 0, 4, 3, 5,
1, 3, 5, 4, 3, 1, 3, 2, 2, 3, 4, 2, 1, 2, 9, 10, 4, 3, 5, 2, 10, 0, 0, 9, 5, 3, 3, 3, 7, 8, 8, 7), Array(6, 6, 7, 6, 5, 4, 6,
5, 10, 7, 5, 6, 6, 4, 3, 0, 3, 1, 4, 3, 5, 3, 2, 2, 1, 2, 3, 3, 4, 4, 4, 5, 9, 10, 4, 3, 5, 2, 10, 0, 0, 9, 5, 4, 5, 6, 7, 8,
8, 7), Array(3, 3, 4, 3, 2, 1, 3, 2, 7, 4, 2, 3, 3, 1, 3, 3, 0, 4, 4, 1, 2, 1, 1, 2, 2, 1, 2, 2, 3, 3, 4, 5, 6, 7, 2, 2, 2, 2,
7, 0, 0, 6, 2, 3, 4, 5, 4, 5, 5, 4), Array(5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 4, 5, 5, 3, 2, 1, 2, 0, 3, 2, 4, 2, 1, 1, 2, 1, 2, 2,
3, 3, 3, 4, 8, 9, 3, 2, 4, 2, 9, 0, 0, 8, 4, 3, 4, 5, 6, 7, 7, 6), Array(7, 7, 8, 7, 6, 5, 7, 6, 11, 8, 6, 7, 7, 5, 1, 5, 4, 6,
0, 4, 6, 5, 4, 2, 4, 3, 3, 4, 5, 3, 2, 3, 10, 11, 5, 4, 6, 3, 11, 0, 0, 10, 6, 4, 4, 4, 8, 9, 9, 8), Array(3, 3, 4, 3, 2, 1, 3,
2, 7, 4, 3, 4, 3, 2, 3, 3, 1, 4, 4, 0, 2, 1, 1, 2, 2, 1, 1, 1, 2, 2, 3, 4, 6, 7, 2, 1, 3, 2, 7, 0, 0, 6, 2, 2, 3, 4, 4, 5, 5,
4), Array(3, 3, 4, 3, 2, 1, 3, 2, 7, 3, 1, 2, 3, 1, 5, 5, 2, 6, 6, 2, 0, 2, 3, 4, 4, 3, 3, 3, 4, 4, 5, 6, 6, 7, 3, 3, 2, 4, 7,
0, 0, 6, 2, 4, 5, 6, 4, 5, 5, 4), Array(3, 3, 4, 3, 2, 1, 3, 2, 7, 4, 2, 3, 3, 1, 4, 3, 1, 4, 5, 1, 2, 0, 1, 3, 2, 2, 2, 2, 2,
3, 4, 5, 6, 7, 1, 2, 2, 3, 7, 0, 0, 6, 2, 3, 4, 5, 4, 5, 5, 4), Array(4, 4, 5, 4, 3, 2, 4, 3, 8, 5, 3, 4, 4, 2, 3, 2, 1, 3, 4,
1, 3, 1, 0, 2, 1, 1, 2, 2, 3, 3, 4, 5, 7, 8, 2, 2, 3, 2, 8, 0, 0, 7, 3, 3, 4, 5, 5, 6, 6, 5), Array(5, 5, 6, 5, 4, 3, 5, 4, 9,
6, 4, 5, 5, 3, 1, 3, 2, 4, 2, 2, 4, 3, 2, 0, 2, 1, 1, 2, 3, 2, 2, 3, 8, 9, 3, 2, 4, 1, 9, 0, 0, 8, 4, 3, 3, 4, 6, 7, 7, 6),
Array(5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 4, 5, 5, 3, 3, 1, 2, 2, 4, 2, 4, 2, 1, 2, 0, 2, 3, 3, 4, 4, 4, 5, 8, 9, 3, 3, 4, 1, 9, 0,
0, 8, 4, 4, 5, 6, 6, 7, 7, 6), Array(4, 4, 5, 4, 3, 2, 4, 3, 8, 5, 3, 4, 4, 2, 2, 3, 1, 4, 3, 1, 3, 2, 1, 1, 2, 0, 1, 1, 2, 2,
3, 4, 7, 8, 2, 1, 3, 1, 8, 0, 0, 7, 3, 2, 3, 4, 5, 6, 6, 5), Array(4, 4, 5, 4, 3, 2, 4, 3, 8, 5, 4, 5, 4, 3, 3, 4, 2, 5, 4, 1,
3, 2, 2, 2, 3, 1, 0, 1, 2, 1, 2, 3, 7, 8, 2, 1, 3, 2, 8, 0, 0, 7, 3, 2, 2, 3, 5, 6, 6, 5), Array(4, 4, 5, 4, 3, 2, 4, 3, 8, 5,
4, 5, 4, 3, 3, 4, 2, 5, 4, 1, 3, 2, 2, 2, 3, 1, 1, 0, 2, 1, 2, 3, 7, 8, 2, 1, 3, 2, 8, 0, 0, 7, 3, 1, 2, 3, 5, 6, 6, 5), Array(
5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 4, 5, 5, 3, 4, 5, 3, 6, 5, 2, 4, 3, 3, 3, 4, 2, 2, 2, 0, 2, 3, 4, 8, 9, 1, 1, 2, 3, 9, 0, 0, 8,
4, 1, 2, 3, 6, 7, 7, 6), Array(5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 5, 6, 5, 4, 2, 5, 3, 6, 3, 2, 4, 3, 3, 3, 4, 2, 1, 1, 2, 0, 1, 2,
8, 9, 3, 2, 4, 3, 9, 0, 0, 8, 4, 1, 1, 2, 6, 7, 7, 6), Array(6, 6, 7, 6, 5, 4, 6, 5, 10, 7, 6, 7, 6, 5, 1, 5, 4, 6, 2, 3, 5, 4,
4, 2, 4, 3, 2, 2, 3, 1, 0, 1, 9, 10, 4, 3, 5, 3, 10, 0, 0, 9, 5, 2, 2, 2, 7, 8, 8, 7), Array(6, 6, 7, 6, 5, 4, 6, 5, 10, 7, 6,
7, 6, 5, 2, 6, 4, 7, 3, 3, 5, 4, 4, 3, 5, 3, 2, 2, 3, 1, 1, 0, 9, 10, 4, 3, 5, 4, 10, 0, 0, 9, 5, 2, 2, 1, 7, 8, 8, 7), Array(
2, 1, 2, 3, 2, 2, 2, 2, 6, 3, 4, 4, 3, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 4, 5, 6, 7, 0, 1, 3, 4, 4, 5, 1, 0, 0, 5,
2, 5, 6, 7, 3, 4, 1, 2), Array(2, 2, 3, 2, 2, 2, 2, 3, 6, 3, 4, 4, 3, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 3, 5, 6, 7,
1, 0, 2, 3, 3, 5, 1, 0, 0, 5, 1, 4, 5, 6, 3, 4, 2, 3), Array(5, 5, 6, 5, 4, 3, 5, 4, 9, 5, 3, 4, 5, 2, 4, 5, 3, 6, 5, 2, 4, 3,
3, 3, 4, 2, 2, 2, 1, 3, 4, 5, 8, 9, 0, 1, 1, 3, 9, 0, 0, 8, 4, 2, 3, 4, 6, 7, 7, 6), Array(4, 4, 5, 4, 3, 2, 4, 3, 8, 5, 4, 5,
4, 3, 3, 4, 2, 5, 4, 1, 3, 2, 2, 2, 3, 1, 1, 1, 1, 2, 3, 4, 7, 8, 1, 0, 2, 2, 8, 0, 0, 7, 3, 2, 3, 4, 5, 6, 6, 5), Array(5, 5,
6, 5, 4, 3, 5, 4, 9, 4, 2, 3, 5, 1, 5, 5, 2, 6, 6, 3, 4, 3, 3, 4, 4, 3, 3, 3, 2, 4, 5, 6, 8, 9, 1, 2, 0, 4, 9, 0, 0, 8, 4, 3,
4, 5, 6, 7, 7, 6), Array(5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 4, 5, 5, 3, 2, 2, 2, 3, 3, 2, 4, 3, 2, 1, 1, 1, 2, 2, 3, 3, 3, 4, 8, 9,
3, 2, 4, 0, 9, 0, 0, 8, 4, 3, 4, 5, 6, 7, 7, 6), Array(1, 1, 2, 2, 1, 1, 1, 2, 5, 2, 3, 3, 2, 3, 5, 5, 2, 6, 6, 2, 2, 2, 3, 4,
4, 3, 3, 3, 4, 4, 5, 6, 1, 1, 3, 3, 4, 4, 0, 0, 0, 4, 2, 4, 5, 6, 2, 3, 2, 2), Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), Array(2, 2, 3, 3, 2, 3, 1, 2, 1, 2, 3, 3, 2,
4, 7, 7, 4, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 6, 6, 7, 8, 5, 6, 5, 5, 5, 6, 6, 0, 0, 0, 4, 6, 7, 8, 1, 1, 4, 3), Array(3, 3, 2,
1, 2, 1, 3, 2, 7, 4, 3, 4, 3, 3, 5, 5, 2, 6, 6, 2, 2, 2, 3, 4, 4, 3, 3, 3, 2, 4, 5, 6, 6, 7, 1, 2, 2, 4, 7, 0, 0, 6, 0, 3, 4,
5, 4, 5, 5, 4), Array(5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 5, 6, 5, 4, 3, 5, 3, 6, 4, 2, 4, 3, 3, 3, 4, 2, 2, 1, 1, 1, 2, 3, 8, 9, 2,
2, 3, 3, 9, 0, 0, 8, 4, 0, 1, 2, 6, 7, 7, 6), Array(6, 6, 7, 6, 5, 4, 6, 5, 10, 7, 6, 7, 6, 5, 3, 6, 4, 7, 4, 3, 5, 4, 4, 4, 5,
3, 2, 2, 2, 1, 2, 2, 9, 10, 3, 3, 4, 4, 10, 0, 0, 9, 5, 1, 0, 1, 7, 8, 8, 7), Array(7, 7, 8, 7, 6, 5, 7, 6, 11, 8, 7, 8, 7, 6,
3, 7, 5, 8, 4, 4, 6, 5, 5, 4, 6, 4, 3, 3, 3, 2, 2, 1, 10, 11, 4, 4, 5, 5, 11, 0, 0, 10, 6, 2, 1, 0, 8, 9, 9, 8), Array(2, 2, 3,
3, 2, 3, 1, 2, 3, 2, 3, 3, 2, 4, 7, 7, 4, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 6, 6, 7, 8, 5, 6, 5, 5, 5, 6, 6, 0, 0, 2, 4, 6, 7,
8, 0, 1, 4, 3), Array(3, 3, 4, 4, 3, 4, 2, 3, 2, 3, 4, 4, 3, 5, 8, 8, 5, 9, 9, 5, 5, 5, 6, 7, 7, 6, 6, 6, 7, 7, 8, 9, 6, 7, 6,
6, 6, 7, 7, 0, 0, 1, 5, 7, 8, 9, 1, 0, 5, 4), Array(2, 2, 3, 4, 3, 3, 2, 3, 6, 3, 4, 4, 3, 5, 7, 7, 4, 8, 8, 4, 4, 4, 5, 6, 6,
5, 5, 5, 5, 6, 7, 8, 1, 2, 4, 5, 5, 6, 2, 0, 0, 5, 3, 6, 7, 8, 3, 4, 0, 1), Array(1, 1, 2, 3, 2, 3, 1, 2, 5, 2, 3, 3, 2, 4, 7,
7, 4, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 6, 6, 7, 8, 2, 3, 5, 5, 5, 6, 3, 0, 0, 4, 4, 6, 7, 8, 2, 3, 1));
}
}
rule("SUBROUTINE: BOT - RESET PATH FINDING")
{
event
{
Subroutine;
BotResetPathFinding;
}
actions
{
Event Player.botTargetPlayer = -1;
Event Player.botTargetPosition = -1;
Event Player.botPreviousNodeId = -1;
Event Player.botClosestNodeIdToTarget = -1;
Event Player.botNextNodeId = -1;
Event Player.botNextNodePosition = -1;
Event Player.botIsPathFinding = False;
Event Player.botCancelPathFinding = False;
Stop Throttle In Direction(Event Player);
}
}
rule("SUBROUTINE: BOT - START PATH FINDING")
{
event
{
Subroutine;
BotStartPathFinding;
}
actions
{
Call Subroutine(BotGetNextNodeIdAndPosition);
Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.botNextNodePosition), 1,
To World, Replace existing throttle, Direction and Magnitude);
Event Player.botIsPathFinding = True;
}
}
rule("SUBROUTINE: BOT - GET NEXT NODE ID AND POSITION")
{
event
{
Subroutine;
BotGetNextNodeIdAndPosition;
}
actions
{
"BOT JUST START FOLLOW PATH OR LOST NEXT NODE"
If(Event Player.botPreviousNodeId == -1);
Event Player.botClosestNodeIdToBot = Index Of Array Value(Global.nodePositions, Sorted Array(Filtered Array(Global.nodePositions,
Is In Line of Sight(Position Of(Event Player) + Vector(0, 2, 0), Current Array Element, Barriers Do Not Block LOS) == True),
Distance Between(Position Of(Event Player), Current Array Element))[0]);
Call Subroutine(BotGetClosestNodeIdToTarget);
End;
"NEXT NODE IS TARGET (DISTANCE TO TARGET NODE = 1)"
If(Global.distanceMatrix[Event Player.botClosestNodeIdToBot][Event Player.botClosestNodeIdToTarget] == 1);
Event Player.botNextNodeId = Event Player.botClosestNodeIdToTarget;
"CHECK CONNECTIONS OF REACHED NODE"
Else;
Event Player.botShortestDistanceToTarget = 999;
Event Player.botCurrentDistanceToTarget = Event Player.botShortestDistanceToTarget;
Event Player.botTempArray = Global.nodeConnections[Event Player.botClosestNodeIdToBot];
For Player Variable(Event Player, botLoopIterator1, 0, Count Of(Event Player.botTempArray), 1);
Event Player.botCurrentDistanceToTarget = Global.distanceMatrix[Event Player.botTempArray[Event Player.botLoopIterator1]][Event Player.botClosestNodeIdToTarget];
If(Event Player.botCurrentDistanceToTarget < Event Player.botShortestDistanceToTarget);
Event Player.botShortestDistanceToTarget = Event Player.botCurrentDistanceToTarget;
Event Player.botNextNodeId = Event Player.botTempArray[Event Player.botLoopIterator1];
End;
End;
End;
"NEXT NODE IS HIGHER THAN BOT AND BOT DIDN'T REACH CLOSEST NODE"
If(Y Component Of(Position Of(Event Player)) - Y Component Of(Global.nodePositions[Event Player.botNextNodeId])
< -3 && Event Player.botPreviousNodeId != Event Player.botClosestNodeIdToBot);
Event Player.botPreviousNodeId = Event Player.botClosestNodeIdToBot;
Event Player.botNextNodeId = Event Player.botClosestNodeIdToBot;
"BOT CAN SEE TARGET POSITION AND NEXT NODE IS TARGET"
Else If(
Global.distanceMatrix[Event Player.botClosestNodeIdToBot][Event Player.botClosestNodeIdToTarget] == 1 && Is In Line of Sight(
Position Of(Event Player) + Vector(0, 1.600, 0), Event Player.botTargetPosition + Vector(0, 2, 0), Barriers Do Not Block LOS));
Event Player.botNextNodePosition = Event Player.botTargetPosition;
Abort;
"BOT CAN'T SEE NEXT NODE AND PREV NODE != REACHED NODE"
Else If(Is In Line of Sight(Position Of(Event Player) + Vector(0, 1.600, 0),
Global.nodePositions[Event Player.botNextNodeId] + Vector(0, 2, 0), Barriers Do Not Block LOS)
== False && Event Player.botPreviousNodeId != Event Player.botClosestNodeIdToBot);
Event Player.botPreviousNodeId = Event Player.botClosestNodeIdToBot;
Event Player.botNextNodeId = Event Player.botClosestNodeIdToBot;
End;
Event Player.botNextNodePosition = Global.nodePositions[Event Player.botNextNodeId];
}
}
rule("SUBROUTINE: BOT - GET CLOSEST NODE ID AND POSITION TO TARGET")
{
event
{
Subroutine;
BotGetClosestNodeIdToTarget;
}
actions
{
Event Player.botTargetPosition = Event Player.botTargetPlayer != -1 ? Position Of(Event Player.botTargetPlayer)
: Event Player.botTargetPosition;
Event Player.botClosestNodeIdToTarget = Index Of Array Value(Global.nodePositions, Sorted Array(Filtered Array(
Global.nodePositions, Is In Line of Sight(Event Player.botTargetPosition + Vector(0, 2, 0), Current Array Element,
Barriers Do Not Block LOS) == True), Distance Between(Event Player.botTargetPosition, Current Array Element))[0]);
}
}
rule("BOT: PATH FINDING - START")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
(Event Player.botTargetPosition != -1 || Event Player.botTargetPlayer != -1) == True;
}
actions
{
Start Rule(BotStartPathFinding, Restart Rule);
}
}
rule("BOT: PATH FINDING - CANCEL")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Event Player.botIsPathFinding == True;
Event Player.botCancelPathFinding == True;
}
actions
{
Start Rule(BotResetPathFinding, Restart Rule);
}
}
rule("BOT: PATH FINDING - LOST THE NODE")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Event Player.botIsPathFinding == True;
(Is In Line of Sight(Position Of(Event Player) + Vector(0, 1.600, 0), Event Player.botNextNodePosition + Vector(0, 2.500, 0),
Barriers Do Not Block LOS) == False && Speed Of In Direction(Event Player, Throttle Of(Event Player)) < 2) == True;
}
actions
{
Wait(0.500, Abort When False);
"RESET PREV NODE ID TO INFORM BOT THAT IT LOST NEXT NODE"
Event Player.botPreviousNodeId = -1;
"TRY FIND NEW NEXT NODE"
Call Subroutine(BotGetNextNodeIdAndPosition);
Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.botNextNodeId), 360, To World,
Direction and Turn Rate);
Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.botNextNodePosition), 1,
To World, Replace existing throttle, Direction and Magnitude);
}
}
rule("BOT: PATH FINDING - REACHED THE NODE")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Event Player.botIsPathFinding == True;
Event Player.botClosestNodeIdToTarget >= 0;
(Distance Between(Vector(X Component Of(Position Of(Event Player)), 0, Z Component Of(Position Of(Event Player))), Vector(
X Component Of(Event Player.botNextNodePosition), 0, Z Component Of(Event Player.botNextNodePosition))) < 0.850) == True;
}
actions
{
Event Player.botPreviousNodeId = Event Player.botNextNodeId;
Event Player.botClosestNodeIdToBot = Event Player.botNextNodeId;
"BOT'S TARGET IS PLAYER"
If(Event Player.botTargetPlayer != -1);
Call Subroutine(BotGetClosestNodeIdToTarget);
End;
Event Player.botCurrentDistanceToTarget = Distance Between(Vector(X Component Of(Position Of(Event Player)), 0, Z Component Of(
Position Of(Event Player))), Vector(X Component Of(Event Player.botTargetPosition), 0, Z Component Of(
Event Player.botTargetPosition)));
"BOT REACHED THE TARGET NODE OR TARGET POSITION"
If(Event Player.botNextNodeId == Event Player.botClosestNodeIdToTarget || Event Player.botCurrentDistanceToTarget <= 0.850);
"BOT DIDN'T REACH TARGET POSITION"
If(Event Player.botCurrentDistanceToTarget > 0.850);
Event Player.botNextNodePosition = Event Player.botTargetPosition;
Skip(6);
"BOT REACHED TARGET"
Else;
Call Subroutine(BotResetPathFinding);
Abort;
End;
End;
"CONTINUE FOLLOW PATH"
Call Subroutine(BotGetNextNodeIdAndPosition);
Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.botNextNodePosition), 1,
To World, Replace existing throttle, Direction and Magnitude);
}
}
disabled rule("=== PATH BUILDER MODE IMPORT ===")
{
event
{
Ongoing - Global;
}
}
rule("GLOBAL: GAME MODE INIT - WORKSHOP SETTINGS")
{
event
{
Ongoing - Global;
}
actions
{
Global.isDebug = False;
Global.isDebugAINavigation = False;
Global.gateMaxHealth[0] = Workshop Setting Integer(Custom String("Defend The Castle Extended"), Custom String("GATE MAX HEALTH"),
500, 100, 1000, 0);
Global.moneyMultiplier[0] = Workshop Setting Real(Custom String("Defend The Castle Extended"), Custom String(
"Money Multiplicator"), 1, 0.500, 2, 0);
Global.selfNanoWorkshopSetting = Workshop Setting Toggle(Custom String("Ana Self Nano"), Custom String(
"Ana can nano herself even if there are other players (only if no player targeted)"), False, 0);
}
}
rule("GLOBAL: GAME MODE INIT - COMMON PROPERTIES")
{
event
{
Ongoing - Global;
}
actions
{
Create In-World Text(All Players(Team 1), Custom String(
"Defend The Castle Extended d143\r\nby ShuriZma#2349\r\nOriginal mode by HUKUTA94#2589\r\nDiscord: dc.shuri.gg\r\n{0}",
Custom String(
"Special Thanks to:\nShingen#21859 for the Abilities,\nLemonAid#11644 for the Hero Talents &\nJosbird for teaching me about Menus{0}",
Custom String(" \nPS: SHINGEN PLS COME BACK"))), Vector(165, 12, -46.500), 1.200, Clip Against Surfaces, Visible To, Color(
White), Default Visibility);
Global.gateRepairPosition = Vector(153, 8, -46.500);
Global.gatePosition = Vector(148.800, 6, -46.400);
Global.ballSpawnPositions = Array(Vector(104, 7, -46), Vector(106, 2, -31));
Global.sniperPositions = Array(Vector(154, 18, -22.600), Vector(86, 12, -46.600), Vector(80.880, 11.300, -71.600), Vector(98, 9,
-19));
Global.zenSpawnPositions = Array(Vector(79.500, 5, -100), Vector(90, 4, -88), Vector(65, 11, -70), Vector(85, 4, -68), Vector(96,
2, -73), Vector(84, 7, -47), Vector(95, 9, -34), Vector(108, 1.700, -28), Vector(113, 7, -37), Vector(123, 5, -19), Vector(144,
5, -19), Vector(123, 6, -39), Vector(123, 6, -61), Vector(129, 6, -30.500), Vector(135, 6, -63));
Global.playerSpawnPositions = Array(Vector(160, 11, -53), Vector(158, 11, -53), Vector(160, 11, -39), Vector(158, 11, -39));
Global.bigBossSpawnPositions = Array(Vector(78, 4, -84), Vector(95, 4, -82));
Global.bastionTargetPositions = Array(Vector(131, 12, -62), Vector(115, 7, -46), Objective Position(2), Vector(136, 10, -27));
Global.spawnPositionMaxId = 2;
Global.botOrisaTargetPosition = Vector(104, 7, -46);
Global.botEchoRespawnPosition = Vector(130, 23, -44);
Global.botEchoTeleportPositions = Array(Vector(88, 23, -79), Vector(108, 18, -27));
Global.defaultHeroBotsPool = Array(Hero(Zenyatta), Hero(Widowmaker), Null, Hero(Bastion), Hero(Echo), Hero(Bastion));
Global.zenRespawnTime = 10;
Global.gameLogicCountOfUniqueHeroes = 5;
Global.lastBoss = Array(Null, Null, Null, Null);
Create Effect(All Players(Team 1), Ring, Color(Sky Blue), Vector(186, 11, -46.500), 9, Visible To Position and Radius);
Create Effect(All Players(Team 1), Ring, Color(Yellow), Vector(159, 11, -46.500), 2, Visible To Position and Radius);
}
}
disabled rule("=== TEAM UPGRADES ===")
{
event
{
Ongoing - Global;
}
}
rule("GLOBAL: TEAM UPGRADES - INIT")
{
event
{
Ongoing - Global;
}
actions
{
Global.upgradeMaxAmmoMaxValue[0] = 150;
Global.upgradeMaxAmmoMaxValue[1] = 300;
Global.upgradeMaxAmmoMaxValue[2] = 500;
Global.upgradeCriticalDamageMaxValue[0] = 10;
Global.upgradeCriticalDamageMaxValue[1] = 5;
Global.upgradeCriticalDamageMaxValue[2] = 10;
Global.upgradePlayerMaxHealthMaxValue[0] = 3000;
Global.upgradePlayerMaxHealthMaxValue[1] = 7000;
Global.upgradePlayerMaxHealthMaxValue[2] = 12000;
Global.upgradeGateMaxHealthMaxValue[0] = Round To Integer(Global.gateMaxHealth[0] + Global.gateMaxHealth[0] * 0.500, Up) > 1000 ? 1000 : Round To Integer(Global.gateMaxHealth[0] + Global.gateMaxHealth[0] * 0.500, Up);
Global.upgradeGateMaxHealthMaxValue[1] = Round To Integer(Global.upgradeGateMaxHealthMaxValue[0] + Global.upgradeGateMaxHealthMaxValue[0] * 0.500, Up);
Global.upgradeGateMaxHealthMaxValue[2] = Round To Integer(Global.upgradeGateMaxHealthMaxValue[1] + Global.upgradeGateMaxHealthMaxValue[1] * 0.500, Up);
Abort If(Global.isDebug == False);
Global.upgradeMaxAmmoMaxValue[0] = 1;
Global.upgradeCriticalDamageMaxValue[0] = 1;
Global.upgradePlayerMaxHealthMaxValue[0] = 1;
Global.upgradeGateMaxHealthMaxValue[0] = 1;
Global.upgradeMaxAmmoMaxValue[1] = 1;
Global.upgradeCriticalDamageMaxValue[1] = 1;
Global.upgradePlayerMaxHealthMaxValue[1] = 1;
Global.upgradeGateMaxHealthMaxValue[1] = 1;
Global.upgradeMaxAmmoMaxValue[2] = 1;
Global.upgradeCriticalDamageMaxValue[2] = 1;
Global.upgradePlayerMaxHealthMaxValue[2] = 1;
Global.upgradeGateMaxHealthMaxValue[2] = 1;
}
}
rule("GLOBAL: UPGRADE - GATE'S MAX HEALTH - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.upgradeGateMaxHealthValue >= Global.upgradeGateMaxHealthMaxValue[0]) == True;
}
actions
{
Play Effect(All Players(Team 1), Good Explosion, Color(Green), Global.gatePosition, 5);
Play Effect(All Players(Team 1), Buff Impact Sound, Color(Green), Global.gatePosition, 100);
Global.gateMaxHealth[0] = Round To Integer(Global.gateMaxHealth[0] + Global.gateMaxHealth[0] * 0.500, Up);
Global.gateHealth = Global.gateMaxHealth[0];
Destroy HUD Text(Global.upgradeGateMaxHealthHudId[0]);
Create HUD Text(All Players(Team 1), Ability Icon String(Hero(Reinhardt), Button(Secondary Fire)), Custom String("2X GATE REPAIR"), Custom String("REPAIR GATE {0}/{1} HP", Global.upgradeGateMaxHealthValue, Global.upgradeGateMaxHealthMaxValue[1]),
Left, 12, Color(Blue), Color(Blue), Color(Blue), Visible To and String, Default Visibility);
Global.upgradeGateMaxHealthHudId[1] = Last Text ID;
Start Rule(GateProgressBarColor, Restart Rule);
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - GATE'S MAX HEALTH 2 - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.upgradeGateMaxHealthValue >= Global.upgradeGateMaxHealthMaxValue[1]) == True;
}
actions
{
Play Effect(All Players(Team 1), Good Explosion, Color(Green), Global.gatePosition, 5);
Play Effect(All Players(Team 1), Buff Impact Sound, Color(Green), Global.gatePosition, 100);
Destroy HUD Text(Global.upgradeGateMaxHealthHudId[1]);
Create HUD Text(All Players(Team 1), Ability Icon String(Hero(Reinhardt), Button(Secondary Fire)), Custom String("2X AUTO-REPAIR"),
Custom String("REPAIR GATE {0}/{1} HP", Global.upgradeGateMaxHealthValue, Global.upgradeGateMaxHealthMaxValue[2]), Left, 12,
Color(Blue), Color(Blue), Color(Blue), Visible To and String, Default Visibility);
Global.upgradeGateMaxHealthHudId[2] = Last Text ID;
Global.gateHealth = Global.gateMaxHealth[0];
Start Rule(GateProgressBarColor, Restart Rule);
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - GATE'S MAX HEALTH 3 - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.upgradeGateMaxHealthValue >= Global.upgradeGateMaxHealthMaxValue[2]) == True;
}
actions
{
Play Effect(All Players(Team 1), Good Explosion, Color(Green), Global.gatePosition, 5);
Play Effect(All Players(Team 1), Buff Impact Sound, Color(Green), Global.gatePosition, 100);
Destroy HUD Text(Global.upgradeGateMaxHealthHudId[2]);
Global.gateHealth = Global.gateMaxHealth[0];
Start Rule(GateProgressBarColor, Restart Rule);
Global.challengeCount += 1;
}
}
rule("PLAYER: UPGRADE - PLAYER'S MAX HEALTH - DEALT HEALING")
{
event
{
Player Received Healing;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
Global.upgradePlayerMaxHealthValue < Global.upgradePlayerMaxHealthMaxValue[2];
}
actions
{
Global.upgradePlayerMaxHealthValue += Event Healing;
}
}
rule("GLOBAL: UPGRADE - PLAYER'S MAX HEALTH - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.upgradePlayerMaxHealthValue >= Global.upgradePlayerMaxHealthMaxValue[0]) == True;
}
actions
{
Destroy HUD Text(Global.upgradePlayerMaxHealthHudId[0]);
Create HUD Text(All Players(Team 1), Icon String(Plus), Custom String("Up You Go: You respawn twice as fast"), Custom String(
"HEAL PLAYERS {0}/{1} HP", Round To Integer(Global.upgradePlayerMaxHealthValue, Down),
Global.upgradePlayerMaxHealthMaxValue[1]), Left, 13, Color(Blue), Color(Blue), Color(Blue), Visible To and String,
Default Visibility);
Global.upgradePlayerMaxHealthHudId[1] = Last Text ID;
For Global Variable(loopIterator, 0, Count Of(All Players(Team 1)), 1);
Play Effect(All Players(Team 1), Good Pickup Effect, Color(Yellow), Position Of(All Players(Team 1)[Global.loopIterator]), 1);
Play Effect(All Players(Team 1), Buff Impact Sound, Color(Yellow), Position Of(All Players(Team 1)[Global.loopIterator]), 100);
End;
Global.maxHealthDone = 50;
Heal(All Players(Team 1), Null, 9999);
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - PLAYER'S MAX HEALTH - DONE")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
(Global.upgradePlayerMaxHealthValue >= Global.upgradePlayerMaxHealthMaxValue[0]) == True;
}
actions
{
Call Subroutine(UpdatePlayerStats);
}
}
rule("GLOBAL: UPGRADE - PERK UP YOU GO - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.upgradePlayerMaxHealthValue >= Global.upgradePlayerMaxHealthMaxValue[1]) == True;
}
actions
{
Destroy HUD Text(Global.upgradePlayerMaxHealthHudId[1]);
Create HUD Text(All Players(Team 1), Icon String(Plus), Custom String("PLAYER'S MAX HEALTH +100%"), Custom String(
"HEAL PLAYERS {0}/{1} HP", Round To Integer(Global.upgradePlayerMaxHealthValue, Down),
Global.upgradePlayerMaxHealthMaxValue[2]), Left, 13, Color(Blue), Color(Blue), Color(Blue), Visible To and String,
Default Visibility);
Global.upgradePlayerMaxHealthHudId[2] = Last Text ID;
Set Respawn Max Time(All Players(Team 1), 5);
Heal(All Players(Team 1), Null, 9999);
For Global Variable(loopIterator, 0, Count Of(All Players(Team 1)), 1);
Play Effect(All Players(Team 1), Good Pickup Effect, Color(Yellow), Position Of(All Players(Team 1)[Global.loopIterator]), 1);
Play Effect(All Players(Team 1), Buff Impact Sound, Color(Yellow), Position Of(All Players(Team 1)[Global.loopIterator]), 100);
End;
Global.perk[2] = 1;
Create HUD Text(All Players(Team 1), Null, Custom String("Up You Go"), Null, Left, 917, Color(White), Color(Green), Color(
White), Visible To and String, Default Visibility);
All Players(Team 1).abilityHUD[17] = Last Text ID;
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - PLAYER'S MAX HEALTH 2 - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.upgradePlayerMaxHealthValue >= Global.upgradePlayerMaxHealthMaxValue[2]) == True;
}
actions
{
Destroy HUD Text(Global.upgradePlayerMaxHealthHudId[2]);
For Global Variable(loopIterator, 0, Count Of(All Players(Team 1)), 1);
Play Effect(All Players(Team 1), Good Pickup Effect, Color(Yellow), Position Of(All Players(Team 1)[Global.loopIterator]), 1);
Play Effect(All Players(Team 1), Buff Impact Sound, Color(Yellow), Position Of(All Players(Team 1)[Global.loopIterator]), 100);
End;
Global.maxHealthDone = 150;
Heal(All Players(Team 1), Null, 9999);
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - PLAYER'S MAX HEALTH 2 - DONE")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
(Global.upgradePlayerMaxHealthValue >= Global.upgradePlayerMaxHealthMaxValue[2]) == True;
}
actions
{
Call Subroutine(UpdatePlayerStats);
}
}
rule("PLAYER: UPGRADE - CRITICAL DAMAGE - DEALT KILL")
{
event
{
Player Dealt Final Blow;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
Event Was Critical Hit == True;
Hero Of(Victim) == Hero(Widowmaker);
Global.upgradeCriticalDamageValue < Global.upgradeCriticalDamageMaxValue[0];
}
actions
{
Global.upgradeCriticalDamageValue += 1;
}
}
rule("GLOBAL: UPGRADE - CRITICAL DAMAGE - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.upgradeCriticalDamageValue >= Global.upgradeCriticalDamageMaxValue[0];
}
actions
{
Destroy HUD Text(Global.upgradeCriticalDamageHudId[0]);
Create HUD Text(All Players(Team 1), Icon String(Skull), Custom String("Sharpshooter: 40% more damage at >15m"), Custom String(
"KILL ECHO {0}/{1}", Global.upgradePerkSharpshooterValue, Global.upgradeCriticalDamageMaxValue[1]), Left, 14, Color(Blue),
Color(Blue), Color(Blue), Visible To and String, Default Visibility);
Global.upgradeCriticalDamageHudId[1] = Last Text ID;
Global.challengeCount += 1;
}
}
rule("PLAYER: UPGRADE - PERK SHARPSHOOTER - DEALT KILL")
{
event
{
Player Dealt Final Blow;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
Hero Of(Victim) == Hero(Echo);
Global.upgradePerkSharpshooterValue < Global.upgradeCriticalDamageMaxValue[1];
Global.upgradeCriticalDamageValue >= Global.upgradeCriticalDamageMaxValue[0];
}
actions
{
Global.upgradePerkSharpshooterValue += 1;
}
}
rule("GLOBAL: UPGRADE - PERK SHARPSHOOTER - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.upgradePerkSharpshooterValue >= Global.upgradeCriticalDamageMaxValue[1];
}
actions
{
Destroy HUD Text(Global.upgradeCriticalDamageHudId[1]);
Create HUD Text(All Players(Team 1), Icon String(Skull), Custom String("-10% BOSS HEALTH"), Custom String("KILL Bosses {0}/{1}",
Global.upgradeBossHealthValue, Global.upgradeCriticalDamageMaxValue[2]), Left, 14, Color(Blue), Color(Blue), Color(Blue),
Visible To and String, Default Visibility);
Global.upgradeCriticalDamageHudId[2] = Last Text ID;
Global.perk[0] = 1;
Create HUD Text(All Players(Team 1), Null, Custom String("Sharpshooter"), Null, Left, 918, Color(White), Color(Green), Color(
White), Visible To and String, Default Visibility);
All Players(Team 1).abilityHUD[18] = Last Text ID;
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - -10% BOSS HEALTH - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.upgradeBossHealthValue >= Global.upgradeCriticalDamageMaxValue[2];
}
actions
{
Destroy HUD Text(Global.upgradeCriticalDamageHudId[2]);
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - MAX AMMO - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.upgradeMaxAmmoValue >= Global.upgradeMaxAmmoMaxValue[0]) == True;
}
actions
{
Destroy HUD Text(Global.upgradeMaxAmmoHudId[0]);
Create HUD Text(All Players(Team 1), Icon String(Asterisk), Custom String("+50% DAMAGE"), Custom String("KILL ENEMIES: {0}/{1}",
Global.upgradeMaxAmmoValue, Global.upgradeMaxAmmoMaxValue[1]), Left, 15, Color(Blue), Color(Blue), Color(Blue),
Visible To and String, Default Visibility);
Global.upgradeMaxAmmoHudId[1] = Last Text ID;
For Global Variable(loopIterator, 0, Count Of(All Players(Team 1)), 1);
Set Max Ammo(All Players(Team 1)[Global.loopIterator], 0, Max Ammo(All Players(Team 1)[Global.loopIterator], 0) * 2);
Set Max Ammo(All Players(Team 1)[Global.loopIterator], 1, Max Ammo(All Players(Team 1)[Global.loopIterator], 1) * 2);
Set Ammo(All Players(Team 1)[Global.loopIterator], 0, Max Ammo(All Players(Team 1)[Global.loopIterator], 0));
Set Ammo(All Players(Team 1)[Global.loopIterator], 1, Max Ammo(All Players(Team 1)[Global.loopIterator], 1));
End;
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - +50% DAMAGE - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.upgradeMaxAmmoValue >= Global.upgradeMaxAmmoMaxValue[1]) == True;
}
actions
{
Destroy HUD Text(Global.upgradeMaxAmmoHudId[1]);
Create HUD Text(All Players(Team 1), Icon String(Asterisk), Custom String("Bulletstorm: Your weapon can hold unlimited ammo"),
Custom String("KILL ENEMIES: {0}/{1}", Global.upgradeMaxAmmoValue, Global.upgradeMaxAmmoMaxValue[2]), Left, 15, Color(Blue),
Color(Blue), Color(Blue), Visible To and String, Default Visibility);
Global.upgradeMaxAmmoHudId[2] = Last Text ID;
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - +50% DAMAGE - DONE")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
(Global.upgradeMaxAmmoValue >= Global.upgradeMaxAmmoMaxValue[1]) == True;
}
actions
{
Call Subroutine(UpdatePlayerStats);
}
}
rule("GLOBAL: UPGRADE - PERK BULLETSTORM - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.upgradeMaxAmmoValue >= Global.upgradeMaxAmmoMaxValue[2]) == True;
}
actions
{
Destroy HUD Text(Global.upgradeMaxAmmoHudId[2]);
Global.perk[1] = 1;
Create HUD Text(All Players(Team 1), Null, Custom String("Bulletstorm"), Null, Left, 919, Color(White), Color(Green), Color(
White), Visible To and String, Default Visibility);
All Players(Team 1).abilityHUD[19] = Last Text ID;
Global.challengeCount += 1;
}
}
disabled rule("=== GAME PHASES ===")
{
event
{
Ongoing - Global;
}
}
rule("GLOBAL: ASSEMBLING PHASE - MAKE CHALLENGE HUDS")
{
event
{
Ongoing - Global;
}
conditions
{
Is Assembling Heroes == True;
}
actions
{
If(Global.isDebug);
Set Match Time(1);
Else;
Disable Inspector Recording;
Set Match Time(10);
End;
Create In-World Text(All Players(Team 1), Custom String("{0}{1}\nREPAIR\n {2}", Custom String("{0}{1}{2}", Hero Icon String(Hero(
Torbjörn)), Hero Icon String(Hero(Brigitte)), Hero Icon String(Hero(Reinhardt))), Hero Icon String(Hero(Symmetra)),
Ability Icon String(Hero(Reinhardt), Button(Primary Fire))), Global.gatePosition + Vector(0, 1.400, 0), 1.200, Do Not Clip,
Visible To, Color(White), Default Visibility);
Create HUD Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[1] == 0), Null, Custom String(
"HOLD {0} - Reload to open the shop", Input Binding String(Button(Reload))), Null, Top, 1000, Color(White), Color(
Yellow), Color(White), Visible To and String, Default Visibility);
Wait Until(Is Game In Progress == True, 9999);
Create HUD Text(All Players(Team 1), Null, Custom String("TEAM CHALLENGES {0}/12", Global.challengeCount), Null, Left, 11, Color(
White), Color(Red), Color(White), Visible To and String, Default Visibility);
"UPGRADE - GATE'S MAX HEALTH"
Create HUD Text(All Players(Team 1), Ability Icon String(Hero(Reinhardt), Button(Secondary Fire)), Custom String(
"GATE'S MAX HEALTH: {0} HP", Round To Integer(Global.gateMaxHealth[0] + Global.gateMaxHealth[0] * 0.750, Up)), Custom String("REPAIR GATE {0}/{1} HP",
Global.upgradeGateMaxHealthValue, Global.upgradeGateMaxHealthMaxValue[0]), Left, 12, Color(Blue), Color(Blue), Color(Blue),
Visible To and String, Default Visibility);
Global.upgradeGateMaxHealthHudId[0] = Last Text ID;
"UPGRADE - PLAYER'S MAX HEALTH"
Create HUD Text(All Players(Team 1), Icon String(Plus), Custom String("PLAYER'S MAX HEALTH +50%"), Custom String(
"HEAL PLAYERS {0}/{1} HP", Round To Integer(Global.upgradePlayerMaxHealthValue, Down),
Global.upgradePlayerMaxHealthMaxValue[0]), Left, 13, Color(Blue), Color(Blue), Color(Blue), Visible To and String,
Default Visibility);
Global.upgradePlayerMaxHealthHudId[0] = Last Text ID;
"UPGRADE - CRITICAL DAMAGE"
Create HUD Text(All Players(Team 1), Icon String(Skull), Custom String("CRITICAL DAMAGE 150%"), Custom String(
"KILL WIDOW WITH HEADSHOT: {0}/{1}", Global.upgradeCriticalDamageValue, Global.upgradeCriticalDamageMaxValue[0]), Left, 14,
Color(Blue), Color(Blue), Color(Blue), Visible To and String, Default Visibility);
Global.upgradeCriticalDamageHudId[0] = Last Text ID;
"UPGRADE - MAX AMMO"
Create HUD Text(All Players(Team 1), Icon String(Asterisk), Custom String("MAX AMMO 200%"), Custom String("KILL ENEMIES: {0}/{1}",
Global.upgradeMaxAmmoValue, Global.upgradeMaxAmmoMaxValue[0]), Left, 15, Color(Blue), Color(Blue), Color(Blue),
Visible To and String, Default Visibility);
Global.upgradeMaxAmmoHudId[0] = Last Text ID;
}
}
rule("GLOBAL: SETUP PHASE")
{
event
{
Ongoing - Global;
}
conditions
{
Is In Setup == True;
}
actions
{
If(Global.isDebug);
Set Match Time(1);
Else;
Pause Match Time;
Create HUD Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[1] == 0), Null, Custom String(
"PRESS {0} - INTERACT TO VOTE FOR START | {1}/{2}", Input Binding String(Button(Interact)), Count Of(Filtered Array(
All Players(Team 1), Current Array Element.vote[0] == 1)), Count Of(All Players(Team 1))), Null, Top, 50, Color(White),
Color(Red), Color(White), Visible To and String, Default Visibility);
Global.globalHUDs[0] = Last Text ID;
Set Match Time(10);
While(Count Of(Filtered Array(All Players(Team 1), Current Array Element.vote[0] == 1)) <= Count Of(All Players(Team 1)) / 2);
Filtered Array(All Players(Team 1), Is Button Held(Current Array Element, Button(Interact))).vote[0] = 1;
Wait(0.100, Ignore Condition);
End;
Destroy HUD Text(Global.globalHUDs[0]);
Unpause Match Time;
End;
Set Objective Description(All Players(All Teams), Custom String("DEFEND GATE"), Visible To and String);
}
}
rule("GLOBAL: GAME IN PROGRESS")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
}
actions
{
Set Match Time(3599);
Pause Match Time;
Disable Built-In Game Mode Scoring;
Disable Built-In Game Mode Announcer;
Disable Built-In Game Mode Completion;
Disable Game Mode HUD(All Players(All Teams));
Disable Game Mode In-World UI(All Players(All Teams));
Global.gateHealth = Global.gateMaxHealth[0];
Global.gateHealthChase = Global.gateHealth;
Global.gateProgressBarColorComponent = 255;
Global.gateProgressBarColorCurrent = Color(White);
Create Progress Bar HUD Text(All Players(Team 1), Global.gateHealthChase * 100 / Global.gateMaxHealth[0], Custom String(
"GATE {0}/{1}", Global.gateHealth, Global.gateMaxHealth[0]), Top, 1, Global.gateProgressBarColorCurrent, Color(White),
Visible To Values and Color, Default Visibility);
Create HUD Text(All Players(Team 1), Null, Custom String("SURVIVED TIME: {0}:{1}", Global.timeMinutes,
Global.timeSeconds < 10 ? Custom String("0{0}", Global.timeSeconds) : Global.timeSeconds), Null, Top, 2, Color(White), Color(White),
Color(White), Visible To and String, Default Visibility);
}
}
disabled rule("=== GAME - MAIN LOGIC ===")
{
event
{
Ongoing - Global;
}
}
rule("GLOBAL: DEFEAT")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.isDebug == False;
Global.gateHealth <= 0;
}
actions
{
Declare Team Victory(Team 2);
}
}
rule("GLOBAL: TIMER - MAIN GAME LOOP")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
}
actions
{
Wait(1, Ignore Condition);
Global.timeSeconds += 1;
If(Global.timeSeconds == 60);
Global.timeSeconds = 0;
Global.timeMinutes += 1;
Global.time5Minutes = Round To Integer(Global.timeMinutes / 5, Down);
Global.time10Minutes = Round To Integer(Global.timeMinutes / 10, Down);
Global.spawnPositionMaxId += 1;
Else If(Global.timeSeconds == 30);
Global.spawnPositionMaxId += 1;
End;
Loop If Condition Is True;
}
}
rule("SUBROUTINE: GAME LOGIC - SET BOT PROPERTIES")
{
event
{
Subroutine;
GameLogicSetBotProperties;
}
actions
{
Abort If(Event Player.botIsOrisaChild == True);
If(Global.timeMinutes >= 10);
If(Filtered Array(Global.lastBoss, Current Array Element == Hero Of(Event Player)) == False);
If(Global.activeBoss == False);
Global.activeBoss = Event Player;
Event Player.isBoss[0] = 1;
End;
End;
End;
End;
"PROPERTIES BY DEFAULT"
Set Gravity(Event Player, 100);
Set Damage Dealt(Event Player, 100);
Set Respawn Max Time(Event Player, 10);
Start Scaling Player(Event Player, 1, False);
"INDIVIDUAL HERO'S PROPERTIES"
If(Hero Of(Event Player) == Hero(Zenyatta));
If(Event Player.isBoss[0] == 1);
Set Move Speed(Event Player, 30);
Set Max Health(Event Player, 10 * (100 + 10 * Global.timeMinutes + 25 * Global.time5Minutes + 50 * Global.time10Minutes) * (
Global.upgradeBossHealthValue >= Global.upgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Start Scaling Player(Event Player, 1.500, False);
Else;
If(20 + 3 * Number Of Players(Team 1) + 3 * Global.timeMinutes > 75);
Set Move Speed(Event Player, 75);
Else;
Set Move Speed(Event Player, 20 + 3 * Count Of(All Players(Team 1)) + 3 * Global.timeMinutes);
End;
Set Max Health(Event Player, 100 + 10 * Global.timeMinutes + 25 * Global.time5Minutes + 50 * Global.time10Minutes);
End;
Else If(Hero Of(Event Player) == Hero(Wrecking Ball));
If(Event Player.isBoss[0] == 1);
Set Move Speed(Event Player, 20);
Set Max Health(Event Player, 5 * (70 + 10 * Count Of(All Players(Team 1))
+ 10 * Global.timeMinutes + 25 * Global.time5Minutes + 30 * Global.time10Minutes) * (
Global.upgradeBossHealthValue >= Global.upgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Start Scaling Player(Event Player, 2, False);
Else If(Event Player.isBoss[1] == 1);
Set Move Speed(Event Player, 50);
Set Max Health(Event Player, 40 + 7 * Count Of(All Players(Team 1))
+ 5 * Global.timeMinutes + 20 * Global.time5Minutes + 15 * Global.time10Minutes);
Start Scaling Player(Event Player, 0.500, False);
Else;
If(30 + Global.timeMinutes + 2.500 * Global.time5Minutes > 40);
Set Move Speed(Event Player, 40);
Else;
Set Move Speed(Event Player, 30 + Global.timeMinutes + 2.500 * Global.time5Minutes);
End;
Set Ultimate Charge(Event Player, 0);
Set Max Health(Event Player, 70 + 10 * Count Of(All Players(Team 1))
+ 10 * Global.timeMinutes + 25 * Global.time5Minutes + 30 * Global.time10Minutes);
End;
Else If(Hero Of(Event Player) == Hero(Widowmaker));
If(Event Player.isBoss[0] == 1);
Set Damage Dealt(Event Player, 2 * (55 + 15 * Count Of(All Players(Team 1))
+ 25 * Global.time5Minutes + 30 * Global.time10Minutes));
Set Move Speed(Event Player, 100);
Set Max Health(Event Player, 5 * (50 + 25 * Count Of(All Players(Team 1))
+ 5 * Global.timeMinutes + 15 * Global.time5Minutes + 25 * Global.time10Minutes) * (
Global.upgradeBossHealthValue >= Global.upgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Start Scaling Player(Event Player, 2, False);
Else;
Event Player.botCounter = 0;
Set Damage Dealt(Event Player, 55 + 15 * Count Of(All Players(Team 1)) + 25 * Global.time5Minutes + 30 * Global.time10Minutes);
Set Move Speed(Event Player, 100);
Set Max Health(Event Player, 50 + 25 * Count Of(All Players(Team 1))
+ 5 * Global.timeMinutes + 15 * Global.time5Minutes + 25 * Global.time10Minutes);
End;
Else If(Hero Of(Event Player) == Hero(Bastion));
If(Event Player.isBoss[0] == 1);
Set Move Speed(Event Player, 50);
Set Damage Dealt(Event Player, 55 + 5 * Count Of(All Players(Team 1)) + 5 * Global.time5Minutes + 5 * Global.time10Minutes);
Start Scaling Player(Event Player, 3, False);
Set Max Health(Event Player, 5 * (125 + 150 * Count Of(All Players(Team 1))
+ 20 * Global.timeMinutes + 35 * Global.time5Minutes + 45 * Global.time10Minutes) * (
Global.upgradeBossHealthValue >= Global.upgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Else If(Event Player.isBoss[1] == 1);
Set Move Speed(Event Player, 100);
Set Damage Dealt(Event Player, 20 + 2 * Count Of(All Players(Team 1)) + 2 * Global.time5Minutes + 5 * Global.time10Minutes);
Set Max Health(Event Player, 60 + 60 * Count Of(All Players(Team 1))
+ 10 * Global.timeMinutes + 20 * Global.time5Minutes + 20 * Global.time10Minutes);
Else;
Set Move Speed(Event Player, 80);
Set Damage Dealt(Event Player, 55 + 5 * Count Of(All Players(Team 1)) + 5 * Global.time5Minutes + 5 * Global.time10Minutes);
Start Scaling Player(Event Player, 2, False);
Set Max Health(Event Player, 125 + 150 * Count Of(All Players(Team 1))
+ 20 * Global.timeMinutes + 35 * Global.time5Minutes + 45 * Global.time10Minutes);
End;
Else If(Hero Of(Event Player) == Hero(Orisa));
If(Event Player.isBoss[0] == 1);
Start Scaling Player(Event Player, 1.800, False);
Set Max Health(Event Player, 5 * (200 + Count Of(All Players(Team 1)) * 70 + 50 * Global.time5Minutes + 75 * Global.time10Minutes)
* (Global.upgradeBossHealthValue >= Global.upgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Set Move Speed(Event Player, 20 + 5 * Global.time5Minutes);
Else;
Start Scaling Player(Event Player, 1.800, False);
Set Max Health(Event Player, 200 + Count Of(All Players(Team 1)) * 70 + 50 * Global.time5Minutes + 75 * Global.time10Minutes);
Set Move Speed(Event Player, 80 + 5 * Global.time5Minutes);
End;
Else If(Hero Of(Event Player) == Hero(Echo));
If(Event Player.isBoss[0] == 1);
Set Gravity(Event Player, 40);
Set Move Speed(Event Player, 50 + 5 * Global.time5Minutes);
Set Respawn Max Time(Event Player, 18);
Set Max Health(Event Player, 5 * (70 + 25 * Count Of(All Players(Team 1))
+ 15 * Global.timeMinutes + 25 * Global.time5Minutes + 40 * Global.time10Minutes) * (
Global.upgradeBossHealthValue >= Global.upgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Start Scaling Player(Event Player, 2, False);
Else;
Set Gravity(Event Player, 40);
Set Move Speed(Event Player, 110 + 5 * Global.time5Minutes);
Set Respawn Max Time(Event Player, 18);
Set Max Health(Event Player, 70 + 25 * Count Of(All Players(Team 1))
+ 15 * Global.timeMinutes + 25 * Global.time5Minutes + 40 * Global.time10Minutes);
End;
Else If(Hero Of(Event Player) == Hero(Reinhardt));
If(Event Player.isBoss[0] == 1);
Start Scaling Player(Event Player, 1.500, False);
Set Move Speed(Event Player, 50);
Set Damage Dealt(Event Player, 80 + 5 * Count Of(All Players(Team 1)) + 5 * Global.time5Minutes + 8 * Global.time10Minutes);
Set Respawn Max Time(Event Player, 15);
Set Max Health(Event Player, 5 * (45 + 25 * Count Of(All Players(Team 1))
+ 15 * Global.timeMinutes + 25 * Global.time5Minutes + 40 * Global.time10Minutes) * (
Global.upgradeBossHealthValue >= Global.upgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Else If(Event Player.isBoss[1] == 1);
Start Scaling Player(Event Player, 0.500, False);
Set Move Speed(Event Player, 100);
Set Damage Dealt(Event Player, 30 + 2 * Count Of(All Players(Team 1)) + 2 * Global.time5Minutes + 5 * Global.time10Minutes);
Set Max Health(Event Player, 20 + 10 * Count Of(All Players(Team 1))
+ 10 * Global.timeMinutes + 10 * Global.time5Minutes + 20 * Global.time10Minutes);
Else;
Set Move Speed(Event Player, 90);
Set Damage Dealt(Event Player, 80 + 5 * Count Of(All Players(Team 1)) + 5 * Global.time5Minutes + 8 * Global.time10Minutes);
Set Respawn Max Time(Event Player, 15);
Set Max Health(Event Player, 45 + 25 * Count Of(All Players(Team 1))
+ 15 * Global.timeMinutes + 25 * Global.time5Minutes + 40 * Global.time10Minutes);
End;
End;
Wait(0.250, Ignore Condition);
"FILL HEALTH"
Heal(Event Player, Null, 100000);
}
}
disabled rule("=== GATE ===")
{
event
{
Ongoing - Global;
}
}
rule("Subroutine: UPDATE PLAYER STATS")
{
event
{
Subroutine;
UpdatePlayerStats;
}
actions
{
Event Player.damageBoost[0] = (Global.upgradeMaxAmmoValue >= Global.upgradeMaxAmmoMaxValue[1] ? 50 : 0)
+ Event Player.abilities[13] * 5 + Event Player.damageBoost[1];
Set Damage Dealt(Event Player, Event Player.baseStats[0] + Event Player.damageBoost);
Event Player.playerHealth = Global.maxHealthDone + Event Player.abilities[14] * 5;
Set Max Health(Event Player, Event Player.baseStats[1] + Event Player.playerHealth);
Event Player.healBoost[0] = Event Player.healBoost[1] + Event Player.abilities[15] * 5;
Set Healing Dealt(Event Player, Event Player.baseStats[2] + Event Player.healBoost[0]);
Set Move Speed(Event Player, Event Player.baseStats[3] + Event Player.speedBoost);
}
}
rule("Subroutine: GATE REPAIR")
{
event
{
Subroutine;
GateRepair;
}
actions
{
"UPGRADE - GATE'S MAX HEALTH"
If(Global.upgradeGateMaxHealthValue < Global.upgradeGateMaxHealthMaxValue[2]);
If(Global.gateMaxHealth[0] - Global.gateHealth > (Hero Of(Event Player) == Hero(Symmetra) ? 2 : 10) * (
Global.upgradeGateMaxHealthValue >= Global.upgradeGateMaxHealthMaxValue[1] ? 2 : 1) * (Event Player.isNanoed == 1 ? 2 : 1));
Global.upgradeGateMaxHealthValue += (Hero Of(Event Player) == Hero(Symmetra) ? 2 : 10) * (
Global.upgradeGateMaxHealthValue >= Global.upgradeGateMaxHealthMaxValue[1] ? 2 : 1) * (Event Player.isNanoed == 1 ? 2 : 1);
Else;
Global.upgradeGateMaxHealthValue += Global.gateMaxHealth[0] - Global.gateHealth;
End;
End;
"HEAL GATE"
If(Global.gateMaxHealth[0] - Global.gateHealth > (Hero Of(Event Player) == Hero(Symmetra) ? 2 : 10) * (
Global.upgradeGateMaxHealthValue >= Global.upgradeGateMaxHealthMaxValue[1] ? 2 : 1) * (Event Player.isNanoed == 1 ? 2 : 1));
Global.gateHealth += (Hero Of(Event Player) == Hero(Symmetra) ? 2 : 10) * (
Global.upgradeGateMaxHealthValue >= Global.upgradeGateMaxHealthMaxValue[1] ? 2 : 1) * (Event Player.isNanoed == 1 ? 2 : 1);
Else;
Global.gateHealth += Global.gateMaxHealth[0] - Global.gateHealth;
End;
"CHARGE ULTIMATE"
Set Ultimate Charge(Event Player, Ultimate Charge Percent(Event Player) + 2);
"UPDATE GATE'S HEALTH BAR"
Start Rule(GateProgressBarColor, Restart Rule);
}
}
rule("GATE REPAIR")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
((Hero Of(Event Player) == Hero(Torbjörn) && Weapon(Event Player) == 2) || (Hero Of(Event Player) == Hero(Reinhardt) || Hero Of(
Event Player) == Hero(Brigitte) || Hero Being Duplicated(Event Player) == Hero(Reinhardt) || Hero Of(Event Player) == Hero(
Symmetra))) == True;
Is Firing Primary(Event Player) == True;
Global.gateHealth < Global.gateMaxHealth[0];
Is In View Angle(Event Player, Global.gateRepairPosition, 30) == True;
Distance Between(Position Of(Event Player), Global.gatePosition) < (Hero Of(Event Player) == Hero(Brigitte) ? 5 : (Hero Of(
Event Player) == Hero(Symmetra) ? 12 : 3.500));
}
actions
{
If(Hero Of(Event Player) == Hero(Reinhardt));
Wait(0.100, Ignore Condition);
End;
Call Subroutine(GateRepair);
If(Hero Of(Event Player) == Hero(Torbjörn));
Wait(Is Using Ability 2(Event Player) == True ? 0.350 : 0.700, Ignore Condition);
Else If(Hero Of(Event Player) == Hero(Reinhardt));
Wait(0.850, Ignore Condition);
Else If(Hero Of(Event Player) == Hero(Symmetra));
Wait(0.100, Ignore Condition);
Else;
Wait(0.500, Ignore Condition);
End;
Loop If Condition Is True;
}
}
rule("SUBROUTINE: GATE PROGRESS BAR COLOR")
{
event
{
Subroutine;
GateProgressBarColor;
}
actions
{
Stop Chasing Global Variable(gateHealthChase);
Chase Global Variable Over Time(gateHealthChase, Global.gateHealth, 0.100, Destination and Duration);
"GATE WAS DAMAGED"
If(Global.gateHealth < Global.gateHealthEvent);
For Global Variable(loopIterator, 0, 3, 1);
Global.gateProgressBarColorCurrent = Color(Red);
Wait(0.100, Ignore Condition);
Global.gateProgressBarColorCurrent = Color(White);
Wait(0.100, Ignore Condition);
End;
"GATE WAS REPAIRED"
Else;
Global.gateProgressBarColorCurrent = Color(Green);
Wait(0.100, Ignore Condition);
Global.gateProgressBarColorCurrent = Color(Yellow);
Wait(0.100, Ignore Condition);
End;
Global.gateHealthEvent = Global.gateHealth;
Global.gateProgressBarColorComponent = Global.gateHealth * 255 / Global.gateMaxHealth[0];
Global.gateProgressBarColorCurrent = Custom Color(255, Global.gateProgressBarColorComponent, Global.gateProgressBarColorComponent,
255);
}
}
disabled rule("=== COMMON MECHANICS ===")
{
event
{
Ongoing - Global;
}
}
rule("ALL: INIT")
{
event
{
Player Joined Match;
All;
All;
}
actions
{
"ALL (COMMON) INIT"
Event Player.isDead = True;
Disable Kill Feed(Event Player);
Disable Game Mode In-World UI(Event Player);
Disable Death Spectate Target HUD(Event Player);
"BOT INIT"
If(Is Dummy Bot(Event Player));
Call Subroutine(BotInit);
"PLAYER INIT"
Else;
Call Subroutine(PlayerInit);
End;
}
}
rule("SUBROUTINE: BOT - INIT")
{
event
{
Subroutine;
BotInit;
}
actions
{
"INIT VARS"
Event Player.hasBadStatus = False;
Event Player.isRespawning = False;
Event Player.botDoesUniqueBehaviour = False;
Event Player.botEventPosition = Vector(9999, 999, 9999);
"DISABLE ALL FOR BOT"
Disable Hero HUD(Event Player);
Disable Messages(Event Player);
Disable Text Chat(Event Player);
Disable Scoreboard(Event Player);
Disable Game Mode HUD(Event Player);
Disable Death Spectate All Players(Event Player);
Disable Voice Chat(Event Player, True, True, True);
"INIT AI NAVIGATION VARS"
Call Subroutine(BotResetPathFinding);
}
}
rule("SUBROUTINE: PLAYER - INIT")
{
event
{
Subroutine;
PlayerInit;
}
actions
{
Call Subroutine(UpdatePlayerStats);
If(Is Game In Progress);
Disable Game Mode HUD(Event Player);
End;
}
}
rule("ALL: RESPAWN")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
(Hero Of(Event Player) != Event Player.currentHero || Event Player.isDead == True) == True;
}
actions
{
Event Player.isDead = False;
"BOT RESPAWN"
If(Is Dummy Bot(Event Player));
Call Subroutine(BotRespawn);
If(Global.isDebugAINavigation);
Create Beam Effect(All Players(All Teams), Good Beam, Eye Position(Event Player), Event Player.botNextNodePosition, Color(Green),
Visible To Position and Radius);
End;
"PLAYER RESPAWN"
Else;
Call Subroutine(PlayerRespawn);
End;
"MUST BE AFTER ALL RESPAWN SUBROUTINES!"
Event Player.currentHero = Hero Of(Event Player);
}
}
rule("SUBROUTINE: BOT - RESPAWN")
{
event
{
Subroutine;
BotRespawn;
}
actions
{
"RESET COMMON PROPERTIES"
Event Player.isRespawning = True;
Enable Nameplates(Event Player, All Players(Team 1));
Call Subroutine(BotResetPathFinding);
Call Subroutine(GameLogicSetBotProperties);
"INDIVIDUAL HERO'S RESPAWN SCRIPTS"
If(Hero Of(Event Player) == Hero(Bastion));
Call Subroutine(BotBastionRespawn);
Else If(Hero Of(Event Player) == Hero(Zenyatta));
Call Subroutine(BotZenyattaRespawn);
Else If(Hero Of(Event Player) == Hero(Widowmaker));
Call Subroutine(BotWidowRespawn);
Else If(Hero Of(Event Player) == Hero(Wrecking Ball));
Call Subroutine(BotBallRespawn);
Else If(Hero Of(Event Player) == Hero(Orisa));
Call Subroutine(BotOrisaRespawn);
Else If(Hero Of(Event Player) == Hero(Echo));
Call Subroutine(BotEchoRespawn);
Else If(Hero Of(Event Player) == Hero(Reinhardt));
Call Subroutine(BotReinRespawn);
End;
Event Player.isRespawning = False;
}
}
rule("SUBROUTINE: PLAYER - RESPAWN")
{
event
{
Subroutine;
PlayerRespawn;
}
actions
{
"TEAM CHALLENGE - MAX AMMO"
If(Hero Of(Event Player) != Event Player.currentHero && Global.upgradeMaxAmmoValue >= Global.upgradeMaxAmmoMaxValue[0]);
Set Max Ammo(Event Player, 0, Ammo(Event Player, 0) * 2);
Set Max Ammo(Event Player, 1, Ammo(Event Player, 1) * 2);
Set Ammo(Event Player, 0, Max Ammo(Event Player, 0));
Set Ammo(Event Player, 1, Max Ammo(Event Player, 1));
End;
"PLAYER RESPAWN"
Set Status(Event Player, Null, Phased Out, 3);
Set Facing(Event Player, Vector(-1, 0, 0), To World);
If(Ability Cooldown(Players On Hero(Hero(Mercy), Team 1), Button(Ability 2)) >= 30 * (Players On Hero(Hero(Mercy), Team 1)
.abilities[6] ? Players On Hero(Hero(Mercy), Team 1).abilities[6] * 0.250 : 1) - 1);
Wait(0.250, Ignore Condition);
Teleport(Event Player, Event Player.deathPosition);
Else;
Teleport(Event Player, Global.playerSpawnPositions[Slot Of(Event Player) == Count Of(Global.playerSpawnPositions) ? Random Integer(
0, Count Of(Global.playerSpawnPositions) - 1) : Slot Of(Event Player)]);
End;
Call Subroutine(UpdatePlayerStats);
}
}
rule("PLAYER: DEATH")
{
event
{
Player Died;
Team 1;
All;
}
actions
{
If(Hero Of(Event Player) == Hero(Roadhog));
Event Player.abilities[8] -= 1;
Wait(Global.perk[2] ? 5 : 10, Ignore Condition);
Event Player.abilities[8] += 1;
End;
Event Player.deathPosition = Position Of(Event Player);
Event Player.isDead = True;
}
}
rule("BOT: DEATH")
{
event
{
Player Died;
Team 2;
All;
}
actions
{
Event Player.deathPosition = Position Of(Event Player);
If(Event Player.isBoss[0] == 1);
If(
Global.upgradePerkSharpshooterValue >= Global.upgradeCriticalDamageMaxValue[1] && Global.upgradeBossHealthValue < Global.upgradeCriticalDamageMaxValue[2]);
Global.upgradeBossHealthValue += 1;
End;
Event Player.isBoss[0] = 0;
Global.activeBoss = Null;
Else If(Event Player.isBoss[1] == 1);
If(Hero Of(Event Player) == Hero(Wrecking Ball));
Destroy Effect(Event Player.botEffects[0]);
End;
Wait(1, Ignore Condition);
Start Forcing Player To Be Hero(Event Player, Random Integer(1, 100) > 50 ? Hero(Reinhardt) : (Random Integer(1, 100) > 33 ? Hero(
Wrecking Ball) : (Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Zenyatta))) > 0 ? Hero(
Wrecking Ball) : Hero(Bastion))));
End;
Event Player.isDead = True;
Event Player.hasBadStatus = False;
Event Player.botDoesUniqueBehaviour = False;
Disable Nameplates(Event Player, All Players(Team 1));
"BOT HAS 1 EFFECT IN VAR (NOT ARRAY)"
Skip If(!Entity Exists(Event Player.botEffects), 1);
Destroy Effect(Event Player.botEffects);
"BOT HAS MORE THEN 1 EFFECT IN VAR (ARRAY)"
Skip If(Count Of(Event Player.botEffects) == 0, 3);
For Player Variable(Event Player, botLoopIterator1, 0, Count Of(Event Player.botEffects), 1);
Destroy Effect(Event Player.botEffects[Event Player.botLoopIterator1]);
End;
}
}
disabled rule("=== BOT COMMON MECHANICS ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: BAD STATUS")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.hasBadStatus == False;
(Has Status(Event Player, Hacked) || Has Status(Event Player, Frozen) || Has Status(Event Player, Knocked Down) || Has Status(
Event Player, Asleep) || Has Status(Event Player, Stunned)) == True;
}
actions
{
Event Player.hasBadStatus = True;
"PROCESS BAD STATUS"
If(Hero Of(Event Player) == Hero(Widowmaker));
Start Rule(BotWidowBadStatus, Do Nothing);
End;
Wait Until(!Has Status(Event Player, Knocked Down) && !Has Status(Event Player, Asleep) && !Has Status(Event Player, Frozen)
&& !Has Status(Event Player, Stunned), 15);
Event Player.hasBadStatus = False;
}
}
rule("SUBROUTINE: BOT - LANDING FROM SKY")
{
event
{
Subroutine;
BotLandingFromSky;
}
actions
{
Stop Throttle In Direction(Event Player);
"SET RESPAWN POSITION"
Event Player.botEventPosition = Random Value In Array(Global.bigBossSpawnPositions);
"CREATE EFFECTS"
Create Effect(All Players(Team 1), Light Shaft, Color(Red), Event Player.botEventPosition, 3, Visible To);
Event Player.botEffects[0] = Last Created Entity;
"RESPAWN IN LIGHT SHAFT EFFECT"
Teleport(Event Player, Event Player.botEventPosition + Vector(0, 25, 0));
Wait(0.100, Ignore Condition);
"SLOW LANDING"
Set Gravity(Event Player, 50);
While(Is In Air(Event Player) == True);
Play Effect(All Players(Team 1), Good Pickup Effect, Color(Orange), Position Of(Event Player) + Vector(0, -2.700, 0), 2);
Wait(0.250, Ignore Condition);
End;
Set Gravity(Event Player, 100);
Destroy Effect(Event Player.botEffects[0]);
"LANDING EFFECTS"
Play Effect(All Players(Team 1), Wrecking Ball Piledriver Impact Effect, Custom Color(105, 87, 46, 255), Position Of(Event Player),
8);
Play Effect(All Players(Team 1), Doomfist Meteor Strike Impact Sound, Color(White), Position Of(Event Player), 150);
}
}
rule("SUBROUTINE: BOT - APPEAR FROM UNDERGROUND")
{
event
{
Subroutine;
BotAppearFromUnderground;
}
actions
{
Set Status(Event Player, Null, Knocked Down, 1);
Wait(0.200, Ignore Condition);
Set Gravity(Event Player, 20);
Disable Movement Collision With Environment(Event Player, True);
Teleport(Event Player, Global.zenSpawnPositions[Random Integer(Min(Global.timeMinutes, Count Of(Global.zenSpawnPositions) - 10),
Min(Global.spawnPositionMaxId, Count Of(Global.zenSpawnPositions) - 4))] + Vector(0, -1.500, 0));
Wait(0.100, Ignore Condition);
Play Effect(All Players(Team 1), Sigma Accretion Impact Effect, Custom Color(220, 175, 100, 255), Eye Position(Event Player), 3);
Play Effect(All Players(Team 1), Sigma Accretion Impact Sound, Color(Gray), Eye Position(Event Player), 50);
Apply Impulse(Event Player, Up, 3.500, To World, Cancel Contrary Motion);
Wait(0.400, Ignore Condition);
Clear Status(Event Player, Knocked Down);
Set Gravity(Event Player, 100);
Enable Movement Collision With Environment(Event Player);
}
}
disabled rule("=== PLAYER MECHANICS ===")
{
event
{
Ongoing - Global;
}
}
rule("PLAYER: HEALTH REGEN")
{
event
{
Player Took Damage;
Team 1;
All;
}
actions
{
Stop Heal Over Time(Event Player.healOverTimeId);
Event Player.eventHealth = Health(Event Player);
Wait(4, Ignore Condition);
"TOOK DAMAGE, RESET REGENERATION TIMER"
Loop If(Is Alive(Event Player) && Event Player.eventHealth > Health(Event Player));
Start Heal Over Time(Event Player, Null, 3, Max Health(Event Player) / 3);
Event Player.healOverTimeId = Last Heal Over Time ID;
}
}
disabled rule("=== ZENYATTA ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: ZEN - REACHED THE GATE")
{
event
{
Ongoing - Each Player;
Team 2;
Zenyatta;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
Event Player.botIsPathFinding == False;
}
actions
{
Set Ammo(Event Player, 0, 0);
Communicate(Event Player, Hello);
Wait(1.500, Ignore Condition);
Abort If(Is Dead(Event Player) == True);
Kill(Event Player, Null);
}
}
rule("BOT: ZEN - DEATH")
{
event
{
Player Died;
Team 2;
Zenyatta;
}
actions
{
"EFFECT"
Play Effect(All Players(Team 1), Junkrat Frag Launcher Explosion Effect, Color(Red), Eye Position(Event Player), 2.500);
Play Effect(All Players(Team 1), Ashe Dynamite Explosion Sound, Color(Red), Eye Position(Event Player), 70);
"DAMAGE AND APPLY IMPULSE TO PLAYERS"
Event Player.botPlayersInRadius = Players Within Radius(Position Of(Event Player), 2.500, All Teams, Surfaces And Enemy Barriers);
For Player Variable(Event Player, botLoopIterator1, 0, Count Of(Event Player.botPlayersInRadius), 1);
Apply Impulse(Event Player.botPlayersInRadius[Event Player.botLoopIterator1], Direction Towards(Position Of(Event Player),
Eye Position(Event Player.botPlayersInRadius[Event Player.botLoopIterator1])), 5, To World, Incorporate Contrary Motion);
If(Team Of(Event Player.botPlayersInRadius[Event Player.botLoopIterator1]) == Team 1);
Damage(Event Player.botPlayersInRadius[Event Player.botLoopIterator1], Event Player, 50);
End;
End;
"DAMAGE GATE"
If(Distance Between(Position Of(Event Player), Global.gatePosition) < 3 && Is In Line of Sight(Eye Position(Event Player),
Global.gatePosition, Enemy Barriers Block LOS));
If(Event Player.isBoss[0] == 1);
Global.gateHealth -= 125;
Else;
Global.gateHealth -= 25 + 5 * Global.time5Minutes;
End;
Start Rule(GateProgressBarColor, Restart Rule);
Respawn(Event Player);
Abort;
End;
"KILLED BY PLAYER"
Teleport(Event Player, Vector(0, -999, 0));
Wait(2, Ignore Condition);
Respawn(Event Player);
Wait(2, Ignore Condition);
}
}
rule("SUBROUTINE: ZEN - RESPAWN")
{
event
{
Subroutine;
BotZenyattaRespawn;
}
actions
{
Call Subroutine(BotAppearFromUnderground);
Event Player.botTargetPosition = Global.gatePosition;
Event Player.botIsPathFinding = True;
Start Rule(BotStartPathFinding, Do Nothing);
Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.botNextNodePosition), 360, To World,
Direction and Turn Rate);
}
}
disabled rule("=== WRECKING BALL ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: BALL - REACHED THE GATE")
{
event
{
Ongoing - Each Player;
Team 2;
Wrecking Ball;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
Event Player.botIsPathFinding == False;
}
actions
{
Start Holding Button(Event Player, Button(Ability 1));
Set Ammo(Event Player, 0, 0);
Wait(1, Ignore Condition);
Set Ultimate Charge(Event Player, 100);
Start Holding Button(Event Player, Button(Ultimate));
Wait Until(Is Using Ultimate(Event Player), 0.600);
Abort If(Is Dead(Event Player));
Kill(Event Player, Null);
Play Effect(All Players(Team 1), Junkrat RIP Tire Explosion Effect, Color(Orange), Eye Position(Event Player), 6);
Play Effect(All Players(Team 1), DVa Self Destruct Explosion Sound, Color(White), Eye Position(Event Player), 250);
If(Distance Between(Position Of(Event Player), Global.gatePosition) < 3.500 && Is In Line of Sight(Eye Position(Event Player),
Global.gatePosition, Enemy Barriers Block LOS));
If(Event Player.isBoss[0] == 1);
Global.gateHealth -= 300;
Else If(Event Player.isBoss[1] == 1);
Global.gateHealth -= 50;
Else;
Global.gateHealth -= 150 + 10 * Global.time5Minutes;
End;
Start Rule(GateProgressBarColor, Restart Rule);
End;
Damage(Players Within Radius(Eye Position(Event Player), 5, Team 1, Surfaces And All Barriers), Event Player, 100);
}
}
rule("BOT: BALL - ALTERNATIVE FORM")
{
event
{
Ongoing - Each Player;
Team 2;
Wrecking Ball;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is In Alternate Form(Event Player) == False;
}
actions
{
Start Holding Button(Event Player, Button(Ability 1));
Wait Until(Is In Alternate Form(Event Player), 10);
Stop Holding Button(Event Player, Button(Ability 1));
}
}
rule("BOT: BALL - DEATH")
{
event
{
Player Died;
Team 2;
Wrecking Ball;
}
actions
{
Stop Holding Button(Event Player, Button(Ability 1));
Stop Holding Button(Event Player, Button(Ultimate));
}
}
rule("SUBROUTINE: BALL - RESPAWN")
{
event
{
Subroutine;
BotBallRespawn;
}
actions
{
"RESPAWN IN AIR"
Teleport(Event Player, Random Value In Array(Global.ballSpawnPositions) + Vector(0, 20, 0));
Stop Holding Button(Event Player, Button(Ultimate));
Wait(0.250, Ignore Condition);
"LANDING"
Start Holding Button(Event Player, Button(Crouch));
Wait Until(Is On Ground(Event Player), 9999);
Stop Holding Button(Event Player, Button(Crouch));
"LANDING IMPACT EFFECT"
Play Effect(All Players(Team 1), Sigma Accretion Impact Sound, Color(White), Event Player, 150);
Play Effect(All Players(Team 1), Doomfist Meteor Strike Impact Effect, Color(Gray), Position Of(Event Player), 10);
Create Effect(All Players(Team 1), Bad Aura, Color(Orange), Eye Position(Event Player), 1.500, Visible To Position and Radius);
Event Player.botEffects[0] = Last Created Entity;
"PATH FINDING TO GATE"
Event Player.botTargetPosition = Global.gatePosition;
Event Player.botIsPathFinding = True;
Start Rule(BotStartPathFinding, Do Nothing);
}
}
disabled rule("=== ECHO ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: ECHO - FLY ABILITY")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
Event Player.botIsPathFinding == False;
Is Using Ability 1(Event Player) == False;
}
actions
{
Set Ability Cooldown(Event Player, Button(Ability 1), 0);
Press Button(Event Player, Button(Ability 1));
Wait(0.300, Ignore Condition);
Loop If Condition Is True;
}
}
rule("BOT: ECHO - BEAM ABILITY")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
Is Using Ability 1(Event Player) == False;
Event Player.botDoesUniqueBehaviour == True;
}
actions
{
Set Ability Cooldown(Event Player, Button(Ability 2), 0);
Press Button(Event Player, Button(Ability 2));
}
}
rule("BOT: ECHO - BAD STATUS - RESET BEAM")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
Event Player.hasBadStatus == True;
}
actions
{
If(Event Player.botDoesUniqueBehaviour);
Call Subroutine(BotEchoDetachPlayer);
End;
Wait Until(Event Player.hasBadStatus, 7);
}
}
rule("BOT: ECHO - CAN'T SEE PORTAL - APPLY IMPULSE")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
Event Player.botDoesUniqueBehaviour == True;
Is In Line of Sight(Position Of(Event Player), Global.botEchoRespawnPosition, Barriers Do Not Block LOS) == False;
}
actions
{
Wait(0.300, Abort When False);
Apply Impulse(Event Player, Vector(Random Integer(-1, 1), 1, Random Integer(-1, 1)), 20, To World, Incorporate Contrary Motion);
Wait(1, Ignore Condition);
If(!Is In Line of Sight(Position Of(Event Player), Global.botEchoRespawnPosition, Barriers Do Not Block LOS));
Event Player.botTargetPosition = Global.botEchoRespawnPosition;
Start Rule(BotStartPathFinding, Restart Rule);
Else;
Call Subroutine(BotResetPathFinding);
End;
Loop If Condition Is True;
}
}
rule("BOT: ECHO - MAIN LOGIC - LOOP")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
}
actions
{
If(Event Player.botDoesUniqueBehaviour == False);
Event Player.botSeePlayer = Sorted Array(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)
== True && Current Array Element.isInMenu[0] == False && (Hero Of(Current Array Element) == Hero(Sombra) && Is Using Ability 1(
Current Array Element)) == False && Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element),
Barriers Do Not Block LOS) == True), Distance Between(Position Of(Event Player), Position Of(Current Array Element)))[0];
End;
"TELEPORT PLAYER SO FAR"
If(Event Player.botDoesUniqueBehaviour && Distance Between(Position Of(Event Player.botEchoCapturedPlayer),
Global.botEchoRespawnPosition) < 4);
Play Effect(All Players(Team 1), Bad Pickup Effect, Color(White), Global.botEchoRespawnPosition, 1);
Teleport(Event Player.botEchoCapturedPlayer, Random Value In Array(Global.botEchoTeleportPositions));
Set Status(Event Player.botEchoCapturedPlayer, Event Player, Knocked Down, 1);
Call Subroutine(BotEchoDetachPlayer);
End;
"BEGIN TO FLY TO THE PORTAL WITH A PLAYER"
If(Event Player.botDoesUniqueBehaviour);
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Global.botEchoRespawnPosition), 100, To World,
Direction and Turn Rate);
"BOT SEES THE PORTAL"
If(Is In Line of Sight(Position Of(Event Player), Global.botEchoRespawnPosition, Barriers Do Not Block LOS));
"RESET PATH FINDING"
If(Event Player.botIsPathFinding);
Call Subroutine(BotResetPathFinding);
End;
Start Throttle In Direction(Event Player, Direction Towards(Eye Position(Event Player), Global.botEchoRespawnPosition), 1,
To World, Replace existing throttle, Direction and Magnitude);
"BOT DOES NOT SEE THE PORTAL"
Else If(!Event Player.botIsPathFinding);
Event Player.botTargetPlayer = Event Player.botEchoCapturedPlayer;
Stop Holding Button(Event Player, Button(Jump));
Start Rule(BotStartPathFinding, Restart Rule);
End;
End;
Wait(0.500, Ignore Condition);
Loop If Condition Is True;
}
}
rule("BOT: ECHO - DEFEND PORTAL")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.botSeePlayer == Null;
Event Player.isRespawning == False;
Event Player.botIsPathFinding == False;
Event Player.botDoesUniqueBehaviour == False;
}
actions
{
Call Subroutine(BotEchoFlyToPortal);
}
}
rule("BOT: ECHO - CAN SEE PLAYER")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.botSeePlayer != Null;
Event Player.isRespawning == False;
Event Player.botDoesUniqueBehaviour == False;
Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.botSeePlayer), Barriers Do Not Block LOS) == True;
Event Player.botSeePlayer.isInMenu[0] == False;
}
actions
{
If(Event Player.botIsPathFinding);
Call Subroutine(BotResetPathFinding);
End;
Call Subroutine(BotEchoFlyToPlayer);
}
}
rule("BOT: ECHO - PATH FINDING TO PLAYER")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.botSeePlayer != Null;
Event Player.isRespawning == False;
Event Player.botIsPathFinding == False;
Event Player.botDoesUniqueBehaviour == False;
Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.botSeePlayer), Barriers Do Not Block LOS) == False;
}
actions
{
Event Player.botTargetPlayer = Event Player.botSeePlayer;
Stop Holding Button(Event Player, Button(Jump));
Call Subroutine(BotStartPathFinding);
}
}
rule("BOT: ECHO - ATTACH PLAYER BY BEAM")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.hasBadStatus == False;
Event Player.botSeePlayer != Null;
Event Player.isRespawning == False;
Event Player.botEchoCapturedPlayer == Null;
Event Player.botDoesUniqueBehaviour == False;
Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.botSeePlayer), Barriers Do Not Block LOS) == True;
Distance Between(Position Of(Event Player), Position Of(Event Player.botSeePlayer)) < 3;
}
actions
{
Event Player.botDoesUniqueBehaviour = True;
Event Player.botEchoCapturedPlayer = Event Player.botSeePlayer;
Set Status(Event Player.botEchoCapturedPlayer, Event Player, Stunned, 0.700);
Set Status(Event Player.botEchoCapturedPlayer, Event Player, Hacked, 10);
Attach Players(Event Player.botEchoCapturedPlayer, Event Player, Vector(0, 0, 2));
Press Button(Event Player, Button(Ability 2));
}
}
rule("BOT: ECHO - PLAYER DEAD")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
Is Dead(Event Player.botEchoCapturedPlayer) != Null;
}
actions
{
If(Event Player.botDoesUniqueBehaviour);
Call Subroutine(BotEchoDetachPlayer);
End;
If(Event Player.botIsPathFinding);
Call Subroutine(BotResetPathFinding);
End;
Call Subroutine(BotEchoFlyToPortal);
}
}
rule("BOT: ECHO - DEATH")
{
event
{
Player Died;
Team 2;
Echo;
}
actions
{
Call Subroutine(BotEchoDetachPlayer);
Stop Holding Button(Event Player, Button(Jump));
Wait(5, Ignore Condition);
Teleport(Event Player, Vector(0, 999, 0));
Start Forcing Player To Be Hero(Event Player, Hero(Orisa));
}
}
rule("SUBROUTINE: ECHO - RESPAWN")
{
event
{
Subroutine;
BotEchoRespawn;
}
actions
{
Event Player.botCounter = 0;
Event Player.botEffects = Empty Array;
Create Effect(All Players(Team 1), Good Aura, Color(Sky Blue), Global.botEchoRespawnPosition, Event Player.botCounter,
Visible To Position and Radius);
Modify Player Variable(Event Player, botEffects, Append To Array, Last Created Entity);
Create Effect(All Players(Team 1), Bad Aura, Color(Sky Blue), Global.botEchoRespawnPosition, Event Player.botCounter,
Visible To Position and Radius);
Modify Player Variable(Event Player, botEffects, Append To Array, Last Created Entity);
Create Effect(All Players(Team 1), Energy Sound, Color(White), Global.botEchoRespawnPosition, 200, Visible To);
Modify Player Variable(Event Player, botEffects, Append To Array, Last Created Entity);
Chase Player Variable Over Time(Event Player, botCounter, 3, 0.800, Destination and Duration);
Play Effect(All Players(Team 1), Junkrat RIP Tire Explosion Effect, Color(Sky Blue), Global.botEchoRespawnPosition, 12);
Play Effect(All Players(Team 1), Sombra EMP Explosion Sound, Null, Global.botEchoRespawnPosition, 100);
Wait(3, Ignore Condition);
Teleport(Event Player, Global.botEchoRespawnPosition);
Play Effect(All Players(Team 1), Good Explosion, Color(White), Global.botEchoRespawnPosition, 2.500);
Play Effect(All Players(Team 1), Debuff Impact Sound, Null, Global.botEchoRespawnPosition, 100);
}
}
rule("SUBROUTINE: ECHO - FLY TO PLAYER")
{
event
{
Subroutine;
BotEchoFlyToPlayer;
}
actions
{
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.botSeePlayer)), 300, To World,
Direction and Turn Rate);
Start Throttle In Direction(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.botSeePlayer)),
1, To World, Replace existing throttle, Direction and Magnitude);
Stop Holding Button(Event Player, Button(Jump));
}
}
rule("SUBROUTINE: ECHO - FLY TO PORTAL")
{
event
{
Subroutine;
BotEchoFlyToPortal;
}
actions
{
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Global.botEchoRespawnPosition), 100, To World,
Direction and Turn Rate);
Start Throttle In Direction(Event Player, Direction Towards(Eye Position(Event Player), Global.botEchoRespawnPosition), 1,
To World, Replace existing throttle, Direction and Magnitude);
Start Holding Button(Event Player, Button(Jump));
}
}
rule("SUBROUTINE: ECHO - DETACH PLAYER")
{
event
{
Subroutine;
BotEchoDetachPlayer;
}
actions
{
Detach Players(Event Player.botEchoCapturedPlayer);
Clear Status(Event Player.botEchoCapturedPlayer, Hacked);
"IF PLAYER INSIDE THE WALL"
If(Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.botEchoCapturedPlayer), Barriers Do Not Block LOS));
Teleport(Event Player.botEchoCapturedPlayer, Position Of(Event Player));
End;
Event Player.botDoesUniqueBehaviour = False;
Event Player.botEchoCapturedPlayer = Null;
}
}
disabled rule("=== REINHARDT ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: REIN - SET PLAYER AS TARGET")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
"CAN SEE PLAYER"
Is True For Any(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)
&& Current Array Element.isInMenu[0] == False && (Hero Of(Current Array Element) == Hero(Sombra) && Is Using Ability 1(
Current Array Element)) == False), Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element),
Barriers Do Not Block LOS)) == True;
}
actions
{
Call Subroutine(BotResetPathFinding);
"SET CLOSEST PLAYER TO BOT AS TARGET AND FOLLOW HIM"
Event Player.botTargetPlayer = Sorted Array(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)
== True && Current Array Element.isInMenu[0] == False && (Hero Of(Current Array Element) == Hero(Sombra) && Is Using Ability 1(
Current Array Element)) == False && Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element),
Barriers Do Not Block LOS) == True), Distance Between(Position Of(Event Player), Position Of(Current Array Element)))[0];
Start Facing(Event Player, Direction Towards(Position Of(Event Player), Position Of(Event Player.botTargetPlayer)), 360, To World,
Direction and Turn Rate);
Start Rule(BotStartPathFinding, Restart Rule);
}
}
rule("BOT: REIN - SET GATE AS TARGET")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
"BOT DOESN'T FOLLOW PLAYER"
Event Player.botTargetPlayer == -1;
}
actions
{
Call Subroutine(BotResetPathFinding);
"SET GATE AS TARGET"
Event Player.botTargetPosition = Global.gatePosition;
Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.botNextNodePosition), 360, To World,
Direction and Turn Rate);
Start Rule(BotStartPathFinding, Restart Rule);
}
}
rule("BOT: REIN - TARGET DEAD")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
Event Player.botTargetPlayer != -1;
(Is Dead(Event Player.botTargetPlayer) || Event Player.botTargetPlayer.isInMenu[0] || (Hero Of(Event Player.botTargetPlayer)
== Hero(Sombra) && Is Using Ability 1(Event Player.botTargetPlayer))) == True;
}
actions
{
Call Subroutine(BotResetPathFinding);
}
}
rule("BOT: REIN - ATTACK TARGET")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
"CAN ATTACK TARGET"
Distance Between(Position Of(Event Player), Event Player.botTargetPlayer != -1 ? Position Of(Event Player.botTargetPlayer)
: Global.gatePosition) < 4;
}
actions
{
Start Holding Button(Event Player, Button(Primary Fire));
Stop Holding Button(Event Player, Button(Secondary Fire));
"TARGET IS PLAYER"
Abort If(Event Player.botTargetPlayer != -1);
If(Event Player.isBoss[0] == 1);
"TARGET IS GATE"
Global.gateHealth -= 25 + 10 * Global.time10Minutes;
Else If(Event Player.isBoss[1] == 1);
Global.gateHealth -= 5;
Else;
Global.gateHealth -= 5 + 5 * Global.time5Minutes;
End;
Start Rule(GateProgressBarColor, Restart Rule);
Wait(0.900, Ignore Condition);
Loop If Condition Is True;
}
}
rule("BOT: REIN - STOP ATTACK TARGET")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
"CAN ATTACK TARGET"
Distance Between(Position Of(Event Player), Event Player.botTargetPlayer != -1 ? Position Of(Event Player.botTargetPlayer)
: Global.gatePosition) > 4;
}
actions
{
Stop Holding Button(Event Player, Button(Primary Fire));
}
}
rule("BOT: REIN - USE SHIELD")
{
event
{
Player Took Damage;
Team 2;
Reinhardt;
}
conditions
{
Event Player.isBoss[1] == False;
Distance Between(Position Of(Event Player), Position Of(Event Player.botTargetPlayer)) > 3;
}
actions
{
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Attacker)), 200, To World,
Direction and Turn Rate);
Start Holding Button(Event Player, Button(Secondary Fire));
Wait Until(Distance Between(Position Of(Event Player), Position Of(Event Player.botTargetPlayer)) < 3, 3);
Stop Holding Button(Event Player, Button(Secondary Fire));
}
}
rule("BOT: REIN - CHARGE IN GATE")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
Event Player.botTargetPlayer == -1;
Is Using Ability 1(Event Player) == False;
Is In Line of Sight(Eye Position(Event Player), Global.gatePosition, Barriers Do Not Block LOS) == True;
Is In View Angle(Event Player, Global.gatePosition, 7.500) == True;
}
actions
{
Start Holding Button(Event Player, Button(Ability 1));
Wait Until(Is Using Ability 1(Event Player), 1);
Stop Holding Button(Event Player, Button(Ability 1));
}
}
rule("BOT: REIN - DEATH")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
actions
{
Stop Holding Button(Event Player, Button(Primary Fire));
Stop Holding Button(Event Player, Button(Secondary Fire));
}
}
rule("SUBROUTINE: REIN - RESPAWN")
{
event
{
Subroutine;
BotReinRespawn;
}
actions
{
Call Subroutine(BotAppearFromUnderground);
Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.botNextNodePosition), 360, To World,
Direction and Turn Rate);
}
}
disabled rule("=== WIDOW ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: WIDOW - SEE PLAYER")
{
event
{
Ongoing - Each Player;
Team 2;
Widowmaker;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Is Reloading(Event Player) == False;
Event Player.botSeePlayer == Null;
Event Player.hasBadStatus == False;
"CAN SEE PLAYER"
Is True For Any(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)
&& Current Array Element.isInMenu[0] == False && (Hero Of(Current Array Element) == Hero(Sombra) && Is Using Ability 1(
Current Array Element)) == False), Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element),
Barriers Do Not Block LOS)) == True;
}
actions
{
Event Player.botSeePlayer = Sorted Array(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)
== True && Current Array Element.isInMenu[0] == False && (Hero Of(Current Array Element) == Hero(Sombra) && Is Using Ability 1(
Current Array Element)) == False && Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element),
Barriers Do Not Block LOS) == True), Distance Between(Position Of(Event Player), Position Of(Current Array Element)))[0];
Event Player.botWidowShotTime = Total Time Elapsed + (Global.timeMinutes >= 9 ? Random Real(2, 5) : Random Real(5, 10));
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.botSeePlayer)), 9999, To World,
Direction and Turn Rate);
}
}
rule("BOT: WIDOW - SHOOT")
{
event
{
Ongoing - Each Player;
Team 2;
Widowmaker;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Is Reloading(Event Player) == False;
Event Player.botSeePlayer != Null;
Event Player.hasBadStatus == False;
Total Time Elapsed >= Event Player.botWidowShotTime;
}
actions
{
Press Button(Event Player, Button(Primary Fire));
Stop Facing(Event Player);
Event Player.botSeePlayer = Null;
}
}
rule("BOT: WIDOW - Aim Sound")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Alive(Event Player) == True;
Is In Line of Sight(Eye Position(Players On Hero(Hero(Widowmaker), Team 2)), Eye Position(Event Player), Barriers Do Not Block LOS)
== True;
Is Alive(Players On Hero(Hero(Widowmaker), Team 2)) == True;
Players On Hero(Hero(Widowmaker), Team 2).botSeePlayer == True;
}
actions
{
Play Effect(Event Player, Explosion Sound, Color(White), Event Player, 100);
Wait(1, Abort When False);
Loop If Condition Is True;
}
}
rule("BOT: WIDOW - TELEPORT TO NEW POSITION")
{
event
{
Ongoing - Each Player;
Team 2;
Widowmaker;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.hasBadStatus == False;
Total Time Elapsed >= Event Player.botWidowTeleportTime;
}
actions
{
Event Player.botWidowTeleportTime = Total Time Elapsed + 28;
Event Player.botWidowShotTime = Total Time Elapsed + (Global.timeMinutes >= 9 ? Random Real(1, 3) : Random Real(3, 6));
Play Effect(All Players(Team 1), Bad Pickup Effect, Color(White), Event Player, 1);
Wait(0.100, Ignore Condition);
Teleport(Event Player, Filtered Array(Global.sniperPositions, Distance Between(Event Player.botEventPosition,
Current Array Element) > 5)[Random Integer(0, Count Of(Global.sniperPositions) - 2)]);
Wait(0.100, Ignore Condition);
Event Player.botEventPosition = Position Of(Event Player);
Set Facing(Event Player, Direction Towards(Eye Position(Event Player), Objective Position(2)), To World);
Play Effect(All Players(Team 1), Good Pickup Effect, Color(White), Event Player, 2);
Play Effect(All Players(Team 1), Debuff Impact Sound, Color(White), Event Player, 100);
}
}
rule("BOT: WIDOW - DEATH")
{
event
{
Player Died;
Team 2;
Widowmaker;
}
actions
{
Stop Holding Button(Event Player, Button(Secondary Fire));
Wait(0.250, Ignore Condition);
Destroy Effect(Event Player.botEffects[0]);
}
}
rule("SUBROUTINE: WIDOW - RESPAWN")
{
event
{
Subroutine;
BotWidowRespawn;
}
actions
{
"RESPAWN ON RANDOM SNIPER POSITION"
Teleport(Event Player, Filtered Array(Global.sniperPositions, Distance Between(Event Player.botEventPosition,
Current Array Element) > 5)[Random Integer(0, Count Of(Global.sniperPositions) - 2)]);
Wait(0.100, Ignore Condition);
Event Player.botEventPosition = Position Of(Event Player);
Play Effect(All Players(Team 1), Good Pickup Effect, Color(White), Event Player, 2);
Play Effect(All Players(Team 1), Debuff Impact Sound, Color(White), Event Player, 100);
Set Facing(Event Player, Direction Towards(Eye Position(Event Player), Objective Position(2)), To World);
Wait(0.700, Ignore Condition);
Start Holding Button(Event Player, Button(Secondary Fire));
Create Beam Effect(All Players(All Teams), Torbjörn Turret Sight Beam, Eye Position(Event Player), Update Every Frame(
Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 999, Null,
Event Player, False)), Color(Red), Visible To Position and Radius);
Event Player.botEffects[0] = Last Created Entity;
Wait Until(Is Dead(Event Player), 99999);
Destroy Effect(Event Player.botEffects[0]);
}
}
rule("SUBROUTINE: WIDOW - BAD STATUS")
{
event
{
Subroutine;
BotWidowBadStatus;
}
actions
{
Stop Facing(Event Player);
Destroy Effect(Event Player.botEffects[0]);
Wait Until(!Event Player.hasBadStatus, 15);
Create Beam Effect(All Players(All Teams), Torbjörn Turret Sight Beam, Eye Position(Event Player), Update Every Frame(
Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 999, Null,
Event Player, False)), Color(Red), Visible To Position and Radius);
Event Player.botEffects[0] = Last Created Entity;
}
}
disabled rule("=== BASTION ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: BASTION - MAIN LOGIC - LOOP")
{
event
{
Ongoing - Each Player;
Team 2;
Bastion;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Event Player.botIsOrisaChild == False;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
Event Player.botDoesUniqueBehaviour == False;
}
actions
{
Event Player.botSeePlayer = Sorted Array(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)
== True && Current Array Element.isInMenu[0] == False && (Hero Of(Current Array Element) == Hero(Sombra) && Is Using Ability 1(
Current Array Element)) == False && Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element),
Barriers Do Not Block LOS) == True), Distance Between(Position Of(Event Player), Position Of(Current Array Element)))[0];
"SEE THE PLAYER"
If(Event Player.botSeePlayer != Null);
Stop Holding Button(Event Player, Button(Secondary Fire));
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.botSeePlayer) - Vector(0, 0.500,
0)), 100, To World, Direction and Turn Rate);
"SELF REPAIRING"
Else If(!Is Firing Secondary(Event Player) && Health(Event Player) < Max Health(Event Player));
Start Holding Button(Event Player, Button(Secondary Fire));
End;
Wait(1, Ignore Condition);
Loop If Condition Is True;
}
}
rule("BOT: BASTION - ARTILLERY")
{
event
{
Ongoing - Each Player;
Team 2;
Bastion;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Event Player.botIsOrisaChild == False;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.botSeePlayer == True;
Is Reloading(Event Player) == False;
Event Player.botDoesUniqueBehaviour == False;
Is In View Angle(Event Player, Position Of(Event Player.botSeePlayer), 30) == True;
Distance Between(Position Of(Event Player), Position Of(Event Player.botSeePlayer)) > 18;
Distance Between(Eye Position(Event Player), Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player)
+ Up * 99, Null, Event Player, False)) >= 35;
}
actions
{
"TRYING TO CAPTURE TARGET"
Wait(0.800, Abort When False);
"CAPTURE TARGET"
Event Player.botDoesUniqueBehaviour = True;
Stop Throttle In Direction(Event Player);
Create Beam Effect(All Players(All Teams), Torbjörn Turret Sight Beam, Update Every Frame(Eye Position(Event Player)),
Update Every Frame(Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
Event Player) * 1000, All Living Players(Team 1), Event Player, True)), Color(Sky Blue), Visible To Position and Radius);
Event Player.botEffects[1] = Last Created Entity;
Wait(1.400, Ignore Condition);
Destroy Effect(Event Player.botEffects[1]);
Abort If(Is Dead(Event Player));
Event Player.botEventPosition = Position Of(Event Player.botSeePlayer);
"SHOOT FROM ARTILLERY"
Event Player.botBastionArtilleryDidShotsCount = 0;
For Player Variable(Event Player, botLoopIterator1, 0, 4, 1);
Event Player.botBastionArtilleryDidShotsCount += 1;
Play Effect(All Players(Team 1), Wrecking Ball Minefield Explosion Sound, Color(White), Eye Position(Event Player), 250);
Play Effect(All Players(Team 1), Pharah Barrage Explosion Effect, Color(Orange), Eye Position(Event Player) + World Vector Of(
Vector(0, 1.400, -0.700), Event Player, Rotation), 2);
Create Beam Effect(All Players(All Teams), Zarya Particle Beam, Eye Position(Event Player) + World Vector Of(Vector(0, 1.400,
-0.700), Event Player, Rotation), Eye Position(Event Player) + World Vector Of(Vector(Random Real(-1, 1), Random Integer(40,
80), Random Real(0.500, 1.500)), Event Player, Rotation), Color(Orange), Visible To);
Event Player.botEffects[2] = Last Created Entity;
Wait(0.100, Ignore Condition);
Destroy Effect(Event Player.botEffects[2]);
Wait(0.400, Ignore Condition);
If(Is Dead(Event Player));
Break;
End;
End;
Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.botNextNodePosition), 1,
To World, Replace existing throttle, Direction and Magnitude);
Wait(1.500, Ignore Condition);
Start Rule(BotBastionArtilleryDamage, Do Nothing);
Wait(4, Ignore Condition);
}
}
rule("BOT: BASTION - PRIMARY FIRE")
{
event
{
Ongoing - Each Player;
Team 2;
Bastion;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Event Player.botIsOrisaChild == False;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.botSeePlayer != Null;
Event Player.botDoesUniqueBehaviour == False;
Is In View Angle(Event Player, Position Of(Event Player.botSeePlayer), 40) == True;
}
actions
{
Start Holding Button(Event Player, Button(Primary Fire));
Wait(1, Ignore Condition);
Stop Holding Button(Event Player, Button(Primary Fire));
Wait(1, Ignore Condition);
Loop If Condition Is True;
}
}
rule("BOT: BASTION - DEATH")
{
event
{
Player Died;
Team 2;
Bastion;
}
actions
{
Stop Holding Button(Event Player, Button(Secondary Fire));
For Player Variable(Event Player, botLoopIterator1, 0, 3, 1);
Play Effect(All Players(Team 1), Bastion Tank Cannon Explosion Effect, Color(White), Event Player, 1);
Play Effect(All Players(Team 1), Bastion Tank Cannon Explosion Sound, Color(White), Event Player, 100);
Wait(0.250, Ignore Condition);
End;
}
}
rule("SUBROUTINE: BASTION - RESPAWN")
{
event
{
Subroutine;
BotBastionRespawn;
}
actions
{
Abort If(Event Player.botIsOrisaChild == True);
Call Subroutine(BotLandingFromSky);
Set Ammo(Event Player, 0, 0);
Wait Until(!Is Reloading(Event Player), 99999);
Event Player.botTargetPosition = Objective Position(2);
}
}
rule("SUBROUTINE: BASTION - ARTILLERY DAMAGE")
{
event
{
Subroutine;
BotBastionArtilleryDamage;
}
actions
{
Event Player.botDoesUniqueBehaviour = False;
"EXPLOSIONS OF ARTILLERY"
For Player Variable(Event Player, botLoopIterator2, 0, Event Player.botBastionArtilleryDidShotsCount, 1);
Event Player.botEventPosition = Ray Cast Hit Position(Event Player.botEventPosition + Vector(0, 50, 0),
Event Player.botEventPosition + Vector(Random Integer(-4, 4), -15, Random Integer(-4, 4)), Null, Event Player, True);
Damage(Players Within Radius(Event Player.botEventPosition, 8, Team 1, Surfaces And Enemy Barriers), Event Player, 50);
Play Effect(All Players(Team 1), Bastion Tank Cannon Explosion Sound, Color(White), Event Player.botEventPosition, 150);
Play Effect(All Players(Team 1), Pharah Rocket Launcher Explosion Effect, Color(Orange), Event Player.botEventPosition, 5);
Create Beam Effect(All Players(All Teams), Zarya Particle Beam, Event Player.botEventPosition,
Event Player.botEventPosition + Vector(0, 60, 0), Color(Orange), Visible To);
Event Player.botEffects[1] = Last Created Entity;
Wait(0.100, Ignore Condition);
Destroy Effect(Event Player.botEffects[1]);
Wait(0.400, Ignore Condition);
End;
}
}
disabled rule("=== ORISA + BASTION ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: ORISA-BASTION - REACHED TARGET POSITION")
{
event
{
Ongoing - Each Player;
Team 2;
Orisa;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.botIsPathFinding == True;
Distance Between(Position Of(Event Player), Global.botOrisaTargetPosition) < 1.500;
}
actions
{
Call Subroutine(BotResetPathFinding);
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Vector(X Component Of(Global.gatePosition), -999,
Z Component Of(Global.gatePosition))), 80, To World, Direction and Turn Rate);
Start Facing(Global.botOrisaChild, Direction Towards(Eye Position(Event Player), Is In Line of Sight(Eye Position(Event Player),
Global.gatePosition, Barriers Do Not Block LOS) ? Global.gatePosition : Sorted Array(Filtered Array(All Players(Team 1),
Is Alive(Current Array Element)), Distance Between(Eye Position(Event Player), Position Of(Current Array Element)))[0]), 200,
To World, Direction and Turn Rate);
Press Button(Event Player, Button(Ability 1));
Wait Until(Y Component Of(Facing Direction Of(Event Player)) < -0.300, 99999);
Press Button(Event Player, Button(Ability 2));
Wait(0.800, Ignore Condition);
Global.botOrisaChild.botDoesUniqueBehaviour = False;
Disallow Button(Event Player, Button(Ability 2));
}
}
rule("BOT: ORISA-BASTION - SHOOT")
{
event
{
Ongoing - Each Player;
Team 2;
Bastion;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Event Player.botIsOrisaChild == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
Event Player.botDoesUniqueBehaviour == False;
}
actions
{
Event Player.botDoesUniqueBehaviour = True;
While(Is Alive(Event Player));
Create Effect(All Players(Team 1), Bad Aura, Color(Purple), Eye Position(Event Player) - Vector(0, 0.700, 0) + Facing Direction Of(
Event Player) * 3.200, 1, Visible To Position and Radius);
Event Player.botEffects[3] = Last Created Entity;
Wait(1.500, Ignore Condition);
Destroy Effect(Event Player.botEffects[3]);
Abort If(Is Dead(Event Player));
Press Button(Event Player, Button(Primary Fire));
Press Button(Event Player, Button(Reload));
Event Player.botRayCastHitPosition = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player)
+ Facing Direction Of(Event Player) * 999, All Players(Team 1), All Players(Team 2), True);
"ANTI-SHIELD BUG"
Event Player.botRayCastHitPosition = Event Player.botRayCastHitPosition + Direction Towards(Event Player.botRayCastHitPosition,
Eye Position(Event Player)) * 0.200;
Create Beam Effect(All Players(All Teams), Zarya Particle Beam, Eye Position(Event Player) - Vector(0, 0.700, 0)
+ Facing Direction Of(Event Player) * 3, Event Player.botRayCastHitPosition, Color(Purple), Visible To Position and Radius);
Event Player.botEffects[4] = Last Created Entity;
Damage(Players Within Radius(Event Player.botRayCastHitPosition, 4, Team 1, Surfaces And All Barriers), Event Player, 0.040);
Play Effect(All Players(Team 1), Pharah Concussive Blast Effect, Color(Purple), Event Player.botRayCastHitPosition, 4);
Play Effect(All Players(Team 1), Pharah Concussive Blast Sound, Color(Purple), Event Player.botRayCastHitPosition, 250);
Play Effect(All Players(Team 1), Bad Explosion, Color(Purple), Eye Position(Event Player) + Facing Direction Of(Event Player)
* 3.300, 2);
Play Effect(All Players(Team 1), Sombra EMP Explosion Sound, Color(Purple), Eye Position(Event Player), 170);
If(Distance Between(Event Player.botRayCastHitPosition, Global.gatePosition) < 4 && Is In Line of Sight(
Event Player.botRayCastHitPosition, Global.gatePosition, Enemy Barriers Block LOS));
Global.gateHealth -= 80 + 10 * Global.time5Minutes;
Start Rule(GateProgressBarColor, Restart Rule);
End;
Wait(0.150, Ignore Condition);
Destroy Effect(Event Player.botEffects[4]);
Wait(0.100, Ignore Condition);
Wait Until(!Is Reloading(Event Player), 2.500);
End;
}
}
rule("BOT: ORISA-BASTION - CAN'T SEE THE TARGET")
{
event
{
Ongoing - Each Player;
Team 2;
Orisa;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.isRespawning == False;
Event Player.botIsPathFinding == False;
Is In Line of Sight(Eye Position(Event Player), Global.gatePosition, Barriers Do Not Block LOS) == False;
}
actions
{
Event Player.botTargetPosition = Global.botOrisaTargetPosition;
Start Rule(BotStartPathFinding, Restart Rule);
}
}
rule("BOT: ORISA-BASTION - DEATH")
{
event
{
Player Died;
Team 2;
Orisa;
}
actions
{
Allow Button(Event Player, Button(Ability 2));
Kill(Global.botOrisaChild, Null);
Detach Players(Global.botOrisaChild);
Clear Status(Global.botOrisaChild, Phased Out);
Set Damage Dealt(Global.botOrisaChild, 100);
Global.botOrisaChild.botIsOrisaChild = False;
Global.botOrisaChild = Null;
Global.botOrisaParent = Null;
Start Forcing Player To Be Hero(Event Player, Hero(Widowmaker));
}
}
rule("SUBROUTINE: ORISA - RESPAWN")
{
event
{
Subroutine;
BotOrisaRespawn;
}
actions
{
Global.botOrisaParent = Event Player;
"WAITING FOR ANY BASTION TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(Bastion) && Current Array Element.isBoss[0] == False && Current Array Element.isBoss[1] == False),
99999);
"SETUP BASTION AS CHILD"
Global.botOrisaChild = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Bastion) && Current Array Element.isBoss[0] == False && Current Array Element.isBoss[1] == False)[0];
Global.botOrisaChild.botIsOrisaChild = True;
Global.botOrisaChild.botDoesUniqueBehaviour = True;
Wait(2, Ignore Condition);
Respawn(Global.botOrisaChild);
Start Scaling Player(Global.botOrisaChild, 1.800, False);
Set Damage Dealt(Global.botOrisaChild, 2000);
Set Status(Global.botOrisaChild, Null, Phased Out, 9999);
Disable Nameplates(Global.botOrisaChild, All Players(All Teams));
Set Facing(Global.botOrisaChild, Vector(X Component Of(Facing Direction Of(Event Player)), 9999, Z Component Of(
Facing Direction Of(Event Player))), To World);
Start Holding Button(Global.botOrisaChild, Button(Ability 1));
Wait Until(Is In Alternate Form(Global.botOrisaChild), 5);
Stop Holding Button(Global.botOrisaChild, Button(Ability 1));
Teleport(Global.botOrisaChild, Position Of(Event Player));
Attach Players(Global.botOrisaChild, Global.botOrisaParent, Vector(0, 1.800, 0.230));
Call Subroutine(BotLandingFromSky);
Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.botNextNodePosition), 360, To World,
Direction and Turn Rate);
Event Player.botTargetPosition = Global.botOrisaTargetPosition;
Start Rule(BotStartPathFinding, Do Nothing);
}
}
rule("GLOBAL: GAME LOGIC - MIN 0 - ZENS, REINS, BALL")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.timeMinutes == 0;
}
actions
{
"CREATE BOTS - ZEN"
While(Count Of(All Players(Team 2)) < 13);
Create Dummy Bot(Hero(Zenyatta), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
Wait(1, Ignore Condition);
End;
"BALL"
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Wrecking Ball))) == 0);
Create Dummy Bot(Hero(Wrecking Ball), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
Wait(1, Ignore Condition);
End;
"REPLACE DEAD ZEN TO REIN"
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Reinhardt))) != 3);
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Zenyatta)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.defaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Zenyatta))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.defaultCurrentBot));
Wait(0.200, Ignore Condition);
Create Dummy Bot(Hero(Reinhardt), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
End;
}
}
rule("GLOBAL: GAME LOGIC - MIN 1 - WIDOW")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.timeMinutes == 1;
}
actions
{
Global.isNewWaveGameLogicProcessing = True;
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Widowmaker))) == 0);
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Zenyatta)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.defaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Zenyatta))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.defaultCurrentBot));
Wait(0.200, Ignore Condition);
Create Dummy Bot(Hero(Widowmaker), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
End;
Global.isNewWaveGameLogicProcessing = False;
}
}
rule("GLOBAL: GAME LOGIC - MIN 3 - BALL")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.timeMinutes == 3;
}
actions
{
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Zenyatta)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.defaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Zenyatta))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.defaultCurrentBot));
Wait(1, Ignore Condition);
Create Dummy Bot(Hero(Wrecking Ball), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
}
}
rule("GLOBAL: GAME LOGIC - MIN 6 - BASTION")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.timeMinutes == 6;
}
actions
{
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Zenyatta))) > 0);
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Zenyatta)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.defaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Zenyatta))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.defaultCurrentBot));
Wait(1, Ignore Condition);
If(Count Of(All Players(Team 2)) < 11);
Create Dummy Bot(Hero(Reinhardt), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
Last Created Entity.isBoss[1] = True;
End;
End;
Create Dummy Bot(Hero(Bastion), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
}
}
rule("GLOBAL: GAME LOGIC - MIN 9 - ECHO, +1 BASTION")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.timeMinutes == 9;
}
actions
{
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Widowmaker))) > 0);
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Widowmaker)), 99999);
Global.defaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Widowmaker))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.defaultCurrentBot));
End;
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Echo))) == 0);
Wait(1, Ignore Condition);
Create Dummy Bot(Hero(Echo), Team 2, -1, Vector(0, 9999, 0), Vector(0, 0, 0));
End;
Wait Until(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Zenyatta))) == 0, 99999);
Create Dummy Bot(Hero(Bastion), Team 2, -1, Vector(0, 9999, 0), Vector(0, 0, 0));
}
}
rule("Ana Nano Variable")
{
event
{
Ongoing - Each Player;
Team 1;
Ana;
}
conditions
{
Is Using Ultimate(Event Player) == True;
}
actions
{
Player Closest To Reticle(Event Player, Team 1).isNanoed = 1;
}
}
rule("isNanoed")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.isNanoed == True;
}
actions
{
If(Is Dead(Event Player));
Event Player.isNanoed = 0;
End;
Wait(8, Ignore Condition);
Event Player.isNanoed = 0;
}
}
rule("money on kill")
{
event
{
Player Dealt Final Blow;
Team 1;
All;
}
actions
{
If(Global.upgradeMaxAmmoValue < Global.upgradeMaxAmmoMaxValue[2]);
Global.upgradeMaxAmmoValue += Victim.isBoss[0] == 1 ? 10 : 1;
End;
If(Hero Of(Victim) == Hero(Zenyatta));
All Players(Team 1).money[0] += 10 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
Global.startMoney += 10 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
Else If(Hero Of(Victim) == Hero(Reinhardt));
All Players(Team 1).money[0] += 20 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
Global.startMoney += 20 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
Else If(Hero Of(Victim) == Hero(Wrecking Ball));
All Players(Team 1).money[0] += 30 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
Global.startMoney += 30 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
Else If(Hero Of(Victim) == Hero(Widowmaker));
All Players(Team 1).money[0] += 50 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
Global.startMoney += 50 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
Else If(Hero Of(Victim) == Hero(Bastion));
All Players(Team 1).money[0] += 70 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
Global.startMoney += 70 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
Else If(Hero Of(Victim) == Hero(Echo));
All Players(Team 1).money[0] += 90 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
Global.startMoney += 90 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
Else If(Hero Of(Victim) == Hero(Orisa));
All Players(Team 1).money[0] += 120 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
Global.startMoney += 120 * (Victim.isBoss[0] ? 3 : 1) * Global.moneyMultiplier[0];
}
}
rule("Abilities and Hero Talents by Shingen and LemonAid")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
actions
{
Event Player.baseStats[0] = 100;
Event Player.baseStats[1] = 100;
Event Player.baseStats[2] = 100;
Event Player.baseStats[3] = 100;
Event Player.damageBoost[0] = 0;
Event Player.damageBoost[1] = 0;
Event Player.playerHealth = 0;
Event Player.healBoost = 0;
Event Player.speedBoost = 0;
Event Player.money[0] = 2400 + Global.startMoney;
If(Custom String("{0}", Event Player) == Custom String("ShuriZma"));
Create HUD Text(Event Player, Null, Custom String("Serverload: {0}, AVG {1}, Peak {2}", Server Load, Server Load Average,
Server Load Peak), Null, Right, -10000, Color(White), Color(Red), Color(White), Visible To and String,
Default Visibility);
Create HUD Text(Event Player, Null, Custom String("{0}{1}{2}", Custom String("damage: {0}\nhealth: {1}\nhealing: {2}\n",
Event Player.baseStats[0], Event Player.baseStats[1], Event Player.baseStats[2]), Custom String(
"speed: {0}\ndamageBoost[0]: {1}\ndamageBoost[1]: {2}\n", Event Player.baseStats[3], Event Player.damageBoost[0],
Event Player.damageBoost[1]), Custom String("playerHealth: {0}\nhealBoost: {1}\n{2}", Event Player.playerHealth,
Event Player.healBoost, Custom String("speedBoost: {0}\nkills: {1}", Event Player.speedBoost, Event Player.baseStats[4]))),
Null, Right, -10000, Color(White), Color(Red), Color(White), Visible To and String, Default Visibility);
End;
}
}
rule("Team 1 (Ability): Quick Fix")
{
event
{
Player Earned Elimination;
Team 1;
All;
}
conditions
{
Event Player.abilities[3] == True;
}
actions
{
If(Event Player.baseStats[5] != Event Player.abilities[3] * 20 && Event Player.baseStats[4] == True);
Event Player.speedBoost -= Event Player.baseStats[5];
End;
Heal(Event Player, Null, Event Player.abilities[3] * 50);
If(Event Player.baseStats[4] != True || Event Player.baseStats[5] != Event Player.abilities[3] * 20);
Event Player.baseStats[5] = Event Player.abilities[3] * 20;
Event Player.baseStats[4] = True;
Event Player.speedBoost += Event Player.baseStats[5];
Call Subroutine(UpdatePlayerStats);
End;
Wait(5, Restart When True);
Event Player.speedBoost -= Event Player.baseStats[5];
Event Player.baseStats[4] = False;
Call Subroutine(UpdatePlayerStats);
}
}
rule("Team 1 (Ability): Heavyweight")
{
event
{
Player Dealt Knockback;
Team 1;
All;
}
conditions
{
Event Player.abilities[4] == True;
}
actions
{
Damage(Victim, Event Player, Event Damage / (100 / (Event Player.abilities[4] * 25)));
}
}
rule("Team 1 (Ability): Charged")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.abilities[5] == True;
Ultimate Charge Percent(Event Player) < Event Player.abilities[5] * 20;
}
actions
{
Set Ultimate Charge(Event Player, Event Player.abilities[5] * 20);
If(Is Duplicating(Event Player));
Wait(0.100, Ignore Condition);
Set Ultimate Charge(Event Player, Event Player.abilities[5] * 20);
End;
Wait(0.250, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Team 1 (Ability): Haste Primary Fire")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.abilities[6] == True;
Ability Cooldown(Event Player, Button(Primary Fire)) > 0.100;
}
actions
{
Set Ability Cooldown(Event Player, Button(Primary Fire), (1 - 0.250 * Event Player.abilities[6]) * Ability Cooldown(Event Player,
Button(Primary Fire)));
}
}
rule("Team 1 (Ability): Haste Secondary Fire")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.abilities[6] == True;
Ability Cooldown(Event Player, Button(Secondary Fire)) > 0.100;
}
actions
{
Set Ability Cooldown(Event Player, Button(Secondary Fire), (1 - 0.250 * Event Player.abilities[6]) * Ability Cooldown(Event Player,
Button(Secondary Fire)));
}
}
rule("Team 1 (Ability): Haste Ability 1")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.abilities[6] == True;
Ability Cooldown(Event Player, Button(Ability 1)) > 0.100;
}
actions
{
Set Ability Cooldown(Event Player, Button(Ability 1), (1 - 0.250 * Event Player.abilities[6]) * Ability Cooldown(Event Player,
Button(Ability 1)));
}
}
rule("Team 1 (Ability): Haste Ability 2")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.abilities[6] == True;
Ability Cooldown(Event Player, Button(Ability 2)) > 0.100;
}
actions
{
Set Ability Cooldown(Event Player, Button(Ability 2), (1 - 0.250 * Event Player.abilities[6]) * Ability Cooldown(Event Player,
Button(Ability 2)));
}
}
rule("Team 1 (Ability): Haste Jump")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.abilities[6] == True;
Ability Cooldown(Event Player, Button(Jump)) > 0.100;
}
actions
{
Set Ability Cooldown(Event Player, Button(Jump), (1 - 0.250 * Event Player.abilities[6]) * Ability Cooldown(Event Player, Button(
Jump)));
}
}
rule("Team 1 (Ability): Haste Crouch")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.abilities[6] == True;
Ability Cooldown(Event Player, Button(Crouch)) > 0.100;
}
actions
{
Set Ability Cooldown(Event Player, Button(Crouch), (1 - 0.250 * Event Player.abilities[6]) * Ability Cooldown(Event Player, Button(
Crouch)));
}
}
rule("Team 1 (Ability): Heavy Impact")
{
event
{
Player Took Damage;
Team 2;
All;
}
conditions
{
Attacker.abilities[7] == True;
}
actions
{
Abort If(Random Real(-0.020, 1) > Event Damage / Max Health(Event Player));
Set Status(Event Player, Attacker, Stunned, 1 * Attacker.abilities[7]);
Wait(5, Ignore Condition);
}
}
rule("Team 1 (Ability): Resilience")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.abilities[11] == True;
Normalized Health(Event Player) < Event Player.abilities[11] * 0.300;
}
actions
{
Set Damage Received(Event Player, 70);
Wait Until(!(Event Player.abilities[11] && Normalized Health(Event Player) < Event Player.abilities[11] * 0.300), 99999);
Set Damage Received(Event Player, 100);
}
}
rule("Auto Repair")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.automaticRepair == True;
Global.gateHealth < Global.gateMaxHealth[0];
}
actions
{
If(Global.gateMaxHealth[0] - Global.gateHealth > 5 * Global.automaticRepair * (
Global.upgradeGateMaxHealthValue >= Global.upgradeGateMaxHealthMaxValue[2] ? 2 : 1));
Global.gateHealth += 5 * Global.automaticRepair * (
Global.upgradeGateMaxHealthValue >= Global.upgradeGateMaxHealthMaxValue[2] ? 2 : 1);
Global.upgradeGateMaxHealthValue += 5 * Global.automaticRepair;
Else;
Global.gateHealth += Global.gateMaxHealth[0] - Global.gateHealth;
Global.upgradeGateMaxHealthValue += Global.gateMaxHealth[0] - Global.gateHealth;
End;
"UPDATE GATE'S HEALTH BAR"
Start Rule(GateProgressBarColor, Restart Rule);
Wait(5, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
}
actions
{
If(Hero Of(Event Player) == Hero(Ana));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Ana), Button(Ability 1)), Custom String(
"Sleep Paralysis: Slept enemies will take a lot of damage when they wake up"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Ana), Button(Ability 2)), Custom String(
"Multinade: Ana throws multiple Biotic Grenades"));
Else If(Hero Of(Event Player) == Hero(Ashe));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Ashe), Button(Ability 2)), Custom String(
"Black Gunpowder: Coach gun stuns and sets enemies on fire"));
Event Player.heroTalentText[2] = Array(Icon String(Fire), Custom String(
"Dancing Flames: Eliminated enemies exlpode and burn others nearby"));
Else If(Hero Of(Event Player) == Hero(Baptiste));
Event Player.heroTalentText[1] = Array(Icon String(Poison), Custom String(
"Corrode: Regenerative Burst will damage and poison enemies"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Baptiste), Button(Ability 2)), Custom String(
"Aerial Ace: Exo-boots allow for gliding and deal bonus damage while gliding"));
Else If(Hero Of(Event Player) == Hero(Bastion));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Echo), Button(Secondary Fire)), Custom String(
"Fusillade: Automatically fire a tactical grenade every so often in sentry form"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Symmetra), Button(Ability 1)), Custom String(
"Trickshot: Landing tactical grenade on an enemy deals more damage and heals"));
Else If(Hero Of(Event Player) == Hero(Brigitte));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Brigitte), Button(Ability 1)), Custom String(
"Endeavor: Gain a boost in damage, armour and speed when your barrier breaks"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Brigitte), Button(Ultimate)), Custom String(
"Whiplash: Endpoint of whip shot generates a stunning shockwave"));
Else If(Hero Of(Event Player) == Hero(Cassidy));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Cassidy), Button(Ability 2)), Custom String(
"Standoff: Enemies cannot move once their skull is locked during deadeye"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Cassidy), Button(Ultimate)), Custom String(
"Flashpoint: Magnetic Grenade will heavily stun enemies if it sticks"));
Else If(Hero Of(Event Player) == Hero(D.Va));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(D.Va), Button(Secondary Fire)), Custom String(
"Voltage Grid: Defense matrix damages and roots enemies"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(D.Va), Button(Ability 1)), Custom String(
"Shooting Star: Boosters set enemies on fire"));
Else If(Hero Of(Event Player) == Hero(Doomfist));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Pharah), Button(Jump)), Custom String(
"Punch Card: Rocket Punch deals triple damage at full charge"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Doomfist), Button(Ultimate)), Custom String(
"Fissure: Seismic Slam leaves a large fire pool behind"));
Else If(Hero Of(Event Player) == Hero(Echo));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Echo), Button(Ability 2)), Custom String(
"Glass Bombs: Sticky Bombs deal double damage to enemies under half health"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Echo), Button(Secondary Fire)), Custom String(
"Focusing Optics: Focusing Beam boost starts at 90% hp instead of 50%"));
Else If(Hero Of(Event Player) == Hero(Genji));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Genji), Button(Ability 1)), Custom String(
"Venomous Strike: Swift Strike deals bleed damage; heal for bleed damage"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Genji), Button(Ultimate)), Custom String(
"Dragon's Breath: Dragonblade fires explosive spirit charges with every swing"));
Else If(Hero Of(Event Player) == Hero(Hanzo));
Event Player.heroTalentText[1] = Array(Icon String(Bolt), Custom String(
"Firebolt: Charging an arrow for more than 2s turns it into an explosive bolt"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Hanzo), Button(Ability 2)), Custom String(
"Stormbreak: Storm arrows have no cooldown for a short duration when earning a kill"));
Else If(Hero Of(Event Player) == Hero(Junkrat));
Event Player.heroTalentText[1] = Array(Icon String(Fire), Custom String("Pyromania: All explosive attacks deal fire damage"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Junkrat), Button(Ability 2)), Custom String(
"Trigger Happy: Gain +1 Concussion Mine every 4s, up to 5 max"));
Else If(Hero Of(Event Player) == Hero(Junker Queen));
Event Player.heroTalentText[1] = Array(Icon String(Fire), Custom String(
"Shout Louder: Commanding Shout wounds enemies in the area"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Junkrat), Button(Ability 2)), Custom String(
"Grace Period: Gracie deals extra damage upon pulling an enemy back"));
Else If(Hero Of(Event Player) == Hero(Kiriko));
Event Player.heroTalentText[1] = Array(Icon String(Fire), Custom String(
"Shinobi Tactics: Healing with abilities creates energy explosions around the target"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Junkrat), Button(Ability 2)), Custom String(
"Recession: Protection Suzu damages for 20% of health and freezes enemies"));
Else If(Hero Of(Event Player) == Hero(Lúcio));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Lúcio), Button(Secondary Fire)), Custom String(
"Power Skating: Soundwave deals more damage and knockback based on movement speed"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Lúcio), Button(Ability 1)), Custom String(
"Reverse Amp: Amp It Up inflicts the opposite song effect to enemies"));
Else If(Hero Of(Event Player) == Hero(Mei));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Mei), Button(Ultimate)), Custom String(
"Cold Snap: Instantly freeze nearby enemies once Cryo-Freeze breaks"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Mei), Button(Ability 2)), Custom String(
"Polar Vortex: Mei throws 3 blizzard drones instead of 1 at increased damage"));
Else If(Hero Of(Event Player) == Hero(Mercy));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Mercy), Button(Ability 2)), Custom String(
"Wings of Grand: Guardian Angel damages and knocks enemies down in its path"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Mercy), Button(Ultimate)), Custom String(
"Holy light missiles: Unleash blasts of holy light missiles during valkyrie"));
Else If(Hero Of(Event Player) == Hero(Moira));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Moira), Button(Secondary Fire)), Custom String(
"Flourish: Fading through allies heals and through enemies damages them"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Moira), Button(Ability 2)), Custom String(
"Catalyst: Holding primary during coalescence costs energy and speed, but boosts effectiveness"));
Else If(Hero Of(Event Player) == Hero(Orisa));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Orisa), Button(Ability 1)), Custom String(
"Steel Pinwheel: Javelin spin deals a large sweep attack when it ends"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Orisa), Button(Secondary Fire)), Custom String(
"Flaming Harpoon: Energy Javelin stuns for longer and burns enemies"));
Else If(Hero Of(Event Player) == Hero(Pharah));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Pharah), Button(Ability 2)), Custom String(
"Head Trauma: Concussive Blast deals damage and tazes enemies below half health"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Pharah), Button(Ability 1)), Custom String(
"Weaponized Storm: Every 6th rocket flies faster and detonates several clusters"));
Else If(Hero Of(Event Player) == Hero(Ramattra));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Ramattra), Button(Ability 1)), Custom String(
"Vile Dominance: Move faster and root enemies with every punch in nemesis form"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Ramattra), Button(Ultimate)), Custom String(
"Nether Sector: Heal and gain bonus ultimate charge for every enemy grounded with vortex"));
Else If(Hero Of(Event Player) == Hero(Reaper));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Reaper), Button(Ability 1)), Custom String(
"Wraith Wrath: Shooting is enabled during wraith form with increased damage"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Reaper), Button(Ultimate)), Custom String(
"Gloom: Wraith form instantly tazes all enemies in sight"));
Else If(Hero Of(Event Player) == Hero(Reinhardt));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Reinhardt), Button(Ability 2)), Custom String(
"Fire Blast: Fire Strike explodes as it deals damage, igniting enemies"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Reinhardt), Button(Ultimate)), Custom String(
"Epicenter: Earth shatter travels in all directions"));
Else If(Hero Of(Event Player) == Hero(Roadhog));
Event Player.heroTalentText[1] = Array(Icon String(Poison), Custom String(
"Stench: Constantly inflict toxic damage to nearby enemeis"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Roadhog), Button(Ability 1)), Custom String(
"Chainsnap: Chain Hook deals 4x more damage; resets upon eliminations"));
Else If(Hero Of(Event Player) == Hero(Sigma));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Sigma), Button(Ability 1)), Custom String(
"Accretion Disk: Accretion flies straight and has increased damage and stun"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Sigma), Button(Ultimate)), Custom String(
"String Theory: When kinetic grasp ends, fire a blast that scales based on the amount of damage collected"));
Else If(Hero Of(Event Player) == Hero(Sojourn));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Sigma), Button(Ability 1)), Custom String(
"Thunderous kicks: Kickslide Jump initiates a powerful energy blast"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Sigma), Button(Ultimate)), Custom String(
"Matter Splatter: Critical railgun hits are explosive"));
Else If(Hero Of(Event Player) == Hero(Soldier: 76));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Pharah), Button(Ultimate)), Custom String(
"Triple Threat: Helix Rockets fires two adjacent mini rockets"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Soldier: 76), Button(Ability 1)), Custom String(
"Espionage: Allies in biotic field revive faster and become harder to hit"));
Else If(Hero Of(Event Player) == Hero(Sombra));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Sombra), Button(Secondary Fire)), Custom String(
"Going Viral: Cancelling stealth will trigger a small hack explosion"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Sombra), Button(Ultimate)), Custom String(
"Cyberattack: Using translocator will damage and hack nearby enemies"));
Else If(Hero Of(Event Player) == Hero(Symmetra));
Event Player.heroTalentText[1] = Array(Icon String(Bolt), Custom String(
"Sentry Paragon: Each sentry turret deals 50% more damage"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Symmetra), Button(Ultimate)), Custom String(
"Shield Generator: Gain increased damage and speed, and grant all players shields with kills"));
Else If(Hero Of(Event Player) == Hero(Torbjörn));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Torbjörn), Button(Ability 2)), Custom String(
"Heatwaves: Unleash waves of fire when overload or molten core is active"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Torbjörn), Button(Ultimate)), Custom String(
"melting point: Every turret kill boosts its damage to 200% for a short duration"));
Else If(Hero Of(Event Player) == Hero(Tracer));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Tracer), Button(Ability 2)), Custom String(
"Vortex: Recall drags and roots nearby enemies to its activation point"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Tracer), Button(Ultimate)), Custom String(
"Chain Reaction: Pulse Bomb explosions can chain onto other enemies"));
Else If(Hero Of(Event Player) == Hero(Widowmaker));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Widowmaker), Button(Ultimate)), Custom String(
"Baiser de Soie: Scoped critical hits instantly kill enemies below 30% hp"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Widowmaker), Button(Ability 2)), Custom String(
"Felt More Alive: Gain low gravity and deal 40% more damage when scoping airbourne"));
Else If(Hero Of(Event Player) == Hero(Winston));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Winston), Button(Ability 2)), Custom String(
"Lightning Strikes Twice: Direct zap hits will trigger twice"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Winston), Button(Ultimate)), Custom String(
"Quake: Jump Pack landing force is much more powerful and stuns enemies"));
Else If(Hero Of(Event Player) == Hero(Wrecking Ball));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Wrecking Ball), Button(Ultimate)), Custom String(
"Mirror Ball: Reflect 100% of received damage to nearby enemies"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Wrecking Ball), Button(Ability 2)), Custom String(
"Distortion: Adaptive shields triggers explosions and tazes nearby enemies"));
Else If(Hero Of(Event Player) == Hero(Zarya));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Zarya), Button(Ability 1)), Custom String(
"Combusta-Bubble: Barriers explode when they expire"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Echo), Button(Ability 2)), Custom String(
"Power Surge: Personal barrier grants energy upon activation"));
Else If(Hero Of(Event Player) == Hero(Zenyatta));
Event Player.heroTalentText[1] = Array(Ability Icon String(Hero(Baptiste), Button(Ability 2)), Custom String(
"Stress Relief: Fully charged orb volleys deal 50% more damage"));
Event Player.heroTalentText[2] = Array(Ability Icon String(Hero(Zenyatta), Button(Ultimate)), Custom String(
"Perfect Balance: Transcendence damages enemies in the area of effect"));
End;
}
}
rule("Subroutine: Cancel player momentum")
{
event
{
Subroutine;
CancelMomentum;
}
actions
{
Apply Impulse(Event Player, -1 * Direction From Angles(Horizontal Angle From Direction(Velocity Of(Event Player)), 0), 0.001,
To World, Cancel Contrary Motion XYZ);
}
}
rule("Ana: Sleep Paralysis")
{
event
{
Player Dealt Damage;
Team 1;
Ana;
}
actions
{
Abort If(!Event Player.abilities[8]);
Abort If(Event Ability != Button(Ability 1));
Play Effect(All Players(All Teams), Good Explosion, Color(Black), Victim, 2);
Wait(0.500, Ignore Condition);
Wait Until(!Has Status(Victim, Asleep), 5);
Play Effect(All Players(All Teams), Explosion Sound, Color(Black), Eye Position(Victim), 150);
Play Effect(All Players(All Teams), Good Explosion, Color(Black), Victim, 6);
Play Effect(All Players(All Teams), Ring Explosion, Color(Black), Victim, 12);
Damage(Players Within Radius(Victim, 6, Team 2, Surfaces), Event Player, 150);
Set Status(Players Within Radius(Eye Position(Victim), 6, Team 2, Surfaces), Null, Hacked, 1.500);
}
}
rule("Ana: Multinade")
{
event
{
Ongoing - Each Player;
Team 1;
Ana;
}
conditions
{
Event Player.abilities[12] == True;
Is Using Ability 2(Event Player) == True;
}
actions
{
For Player Variable(Event Player, loopIterator, 0, 4, 1);
Wait(0.030, Ignore Condition);
Set Ability Cooldown(Event Player, Button(Ability 2), False);
Cancel Primary Action(Event Player);
Wait(0.050, Ignore Condition);
Press Button(Event Player, Button(Ability 2));
End;
Wait(2, Ignore Condition);
}
}
rule("Ashe: Taunt")
{
event
{
Player Dealt Knockback;
Team 1;
Ashe;
}
conditions
{
Event Player.abilities[8] == True;
Event Ability == Button(Ability 1);
Victim != Event Player;
}
actions
{
Start Damage Over Time(Victim, Event Player, 3, Event Damage * 2.500);
Set Status(Victim, Null, Burning, 3);
Set Status(Victim, Null, Stunned, 3);
}
}
rule("Ashe: Dancing Flames")
{
event
{
Player Earned Elimination;
Team 1;
Ashe;
}
conditions
{
Event Player.abilities[12] == True;
}
actions
{
Play Effect(All Players(All Teams), Explosion Sound, Color(Orange), Victim.deathPosition, 120);
Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Victim.deathPosition, 5);
Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Yellow), Victim.deathPosition, 5);
Start Damage Over Time(Players Within Radius(Victim.deathPosition, 5, Team 2, Surfaces), Event Player, 3, 15);
Set Status(Players Within Radius(Victim.deathPosition, 5, Team 2, Surfaces), Event Player, Burning, 3);
Damage(Players Within Radius(Victim.deathPosition, 5, Team 2, Surfaces), Event Player, 30);
}
}
rule("Baptiste: Corrode")
{
event
{
Ongoing - Each Player;
Team 1;
Baptiste;
}
conditions
{
Is Using Ability 1(Event Player) == True;
Event Player.abilities[8] == True;
}
actions
{
For Player Variable(Event Player, loopIterator, 0, 3, 1);
Play Effect(All Players(All Teams), Ring Explosion, Color(Purple), Position Of(Event Player), 20);
Damage(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player, 25);
Start Damage Over Time(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player, 5, 30);
Wait(0.200, Ignore Condition);
End;
}
}
rule("Baptiste: Aerial Ace - Jump")
{
event
{
Ongoing - Each Player;
All;
Baptiste;
}
conditions
{
Event Player.abilities[12] == True;
Is Crouching(Event Player) == True;
Has Status(Event Player, Hacked) == False;
}
actions
{
Wait Until(!Is Crouching(Event Player), 9999);
Wait Until(Is Jumping(Event Player), 1);
Event Player.abilityAvailable = True;
Wait(0.250, Ignore Condition);
Event Player.damageBoost[1] += 30;
Call Subroutine(UpdatePlayerStats);
Wait Until(Is On Ground(Event Player), 99999);
Event Player.abilityAvailable = False;
Event Player.damageBoost[1] -= 30;
Call Subroutine(UpdatePlayerStats);
}
}
rule("Baptiste: Aerial Ace - Slower fall")
{
event
{
Ongoing - Each Player;
All;
Baptiste;
}
conditions
{
Event Player.abilities[12] == True;
Event Player.abilityAvailable == True;
Is Alive(Event Player) == True;
Is Button Held(Event Player, Button(Jump)) == True;
(Has Status(Event Player, Stunned) && Has Status(Event Player, Hacked)) == False;
Altitude Of(Event Player) >= 1;
Vertical Speed Of(Event Player) < 0;
}
actions
{
Set Gravity(Event Player, 7.500);
Wait(0.333, Ignore Condition);
Play Effect(All Players(Team Of(Event Player)), Ring Explosion, Color(Orange), Position Of(Event Player), 2);
Loop If Condition Is True;
Set Gravity(Event Player, 100);
}
}
rule("Bastion: Fusillade")
{
event
{
Ongoing - Each Player;
All;
Bastion;
}
conditions
{
Event Player.abilities[8] == True;
Is Firing Primary(Event Player) == True;
Is In Alternate Form(Event Player) == True;
}
actions
{
Wait(1.500, Abort When False);
Cancel Primary Action(Event Player);
Set Ability Cooldown(Event Player, Button(Secondary Fire), 0);
Wait(0.100, Ignore Condition);
Press Button(Event Player, Button(Secondary Fire));
Loop If Condition Is True;
}
}
rule("Bastion: Trickshot")
{
event
{
Player Dealt Damage;
All;
Bastion;
}
actions
{
Abort If(!Event Player.abilities[12]);
Abort If(Event Ability != Button(Secondary Fire));
Abort If(Event Damage > 30);
Wait(0.500, Ignore Condition);
Set Ability Cooldown(Event Player, Button(Secondary Fire), Ability Cooldown(Event Player, Button(Secondary Fire)) - 3);
Damage(Players Within Radius(Victim, 5, Team 2, Surfaces), Event Player, 30);
Heal(Event Player, Event Player, 50);
}
}
rule("Brigitte: Endeavor")
{
event
{
Ongoing - Each Player;
Team 1;
Brigitte;
}
conditions
{
Event Player.abilities[8] == True;
Ability Cooldown(Event Player, Button(Secondary Fire)) >= 0.100;
}
actions
{
Create Effect(All Players(All Teams), Echo Cloning Effect, Team 1, Event Player, 0.400, Visible To Position and Radius);
Event Player.effects[1] = Last Created Entity;
Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Eye Position(Event Player), 15);
Heal(Players Within Radius(Event Player, 15, Team 1, Off), Event Player, 200);
Event Player.damageBoost[1] += 150;
Event Player.speedBoost += 75;
Call Subroutine(UpdatePlayerStats);
Add Health Pool To Player(Event Player, Armor, Max Health(Event Player) / 3, False, True);
Event Player.hpPool[1] = Last Created Health Pool;
Wait Until(!Event Player.abilities[8] || Is Dead(Event Player), 6);
Event Player.damageBoost[1] -= 150;
Event Player.speedBoost -= 75;
Call Subroutine(UpdatePlayerStats);
Remove Health Pool From Player(Event Player.hpPool[1]);
Destroy Effect(Event Player.effects[1]);
}
}
rule("Brigitte: Whiplash")
{
event
{
Player Dealt Knockback;
Team 1;
Brigitte;
}
conditions
{
Event Player.abilities[12] == True;
Is Using Ability 1(Event Player) == True;
}
actions
{
Play Effect(All Players(All Teams), Ring Explosion Sound, Color(Green), Victim, 100);
Play Effect(All Players(All Teams), Bad Explosion, Color(Orange), Victim, 2.500);
Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Orange), Victim, 2.500);
Damage(Players Within Radius(Victim, 2.500, Team 2, Surfaces), Event Player, 100);
Set Status(Players Within Radius(Victim, 2.500, Team 2, Surfaces), Event Player, Stunned, 1.500);
}
}
rule("Cassidy: Standoff")
{
event
{
Ongoing - Each Player;
Team 1;
Cassidy;
}
conditions
{
Is Using Ultimate(Event Player) == True;
Event Player.abilities[8] == True;
}
actions
{
Wait(0.200, Ignore Condition);
Event Player.abilityCountdown = False;
Chase Player Variable At Rate(Event Player, abilityCountdown, 9999, 100, Destination and Rate);
Wait(0.500, Ignore Condition);
Chase Player Variable At Rate(Event Player, abilityCountdown, 9999, 275, Destination and Rate);
Wait(0.500, Ignore Condition);
Chase Player Variable At Rate(Event Player, abilityCountdown, 9999, 550, Destination and Rate);
}
}
rule("Cassidy: Standoff - Set root")
{
event
{
Ongoing - Each Player;
Team 1;
Cassidy;
}
conditions
{
Is Using Ultimate(Event Player) == True;
Event Player.abilities[8] == True;
}
actions
{
Wait(0.200, Ignore Condition);
For Player Variable(Event Player, loopIterator, 0, 5, 1);
Wait(1, Abort When False);
Play Effect(Event Player, Explosion Sound, Color(White), Event Player, 15);
Set Status(Filtered Array(Players in View Angle(Event Player, Team 2, 103), Health(Current Array Element)
<= Event Player.abilityCountdown && Is In Line of Sight(Event Player, Current Array Element, Barriers Do Not Block LOS)),
Event Player, Rooted, 2);
End;
Stop Chasing Player Variable(Event Player, abilityCountdown);
}
}
rule("Cassidy: Flashpoint")
{
event
{
Player Dealt Damage;
Team 1;
Cassidy;
}
actions
{
Abort If(!Event Player.abilities[12]);
Abort If(Event Ability != Button(Ability 2));
If(Event Damage <= 5);
Wait(1.250, Ignore Condition);
Damage(Players Within Radius(Victim, 6, Team 2, Surfaces), Event Player, 35);
Set Status(Players Within Radius(Victim, 6, Team 2, Surfaces), Event Player, Stunned, 1);
End;
}
}
rule("D.Va: Voltage Grid")
{
event
{
Ongoing - Each Player;
Team 1;
D.Va;
}
conditions
{
Is Firing Secondary(Event Player) == True;
Event Player.abilities[8] == True;
}
actions
{
Play Effect(All Players(All Teams), Bad Explosion, Color(Turquoise), Eye Position(Event Player) + Facing Direction Of(Event Player)
* 2, 0.150);
Play Effect(All Players(All Teams), Bad Explosion, Color(Turquoise), Eye Position(Event Player) + Facing Direction Of(Event Player)
* 5, 0.150);
Play Effect(All Players(All Teams), Bad Explosion, Color(Turquoise), Eye Position(Event Player) + Facing Direction Of(Event Player)
* 8, 0.150);
Wait(0.300, Ignore Condition);
Damage(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 2, 2.500, Team 2, Off), Event Player,
20);
Damage(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 5, 2.500, Team 2, Off), Event Player,
20);
Damage(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 8, 2.500, Team 2, Off), Event Player,
20);
Set Status(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 2, 2.500, Team 2, Off),
Event Player, Rooted, 0.400);
Set Status(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 5, 2.500, Team 2, Off),
Event Player, Rooted, 0.400);
Set Status(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 8, 2.500, Team 2, Off),
Event Player, Rooted, 0.400);
Loop If Condition Is True;
}
}
rule("D.Va: Shooting Star")
{
event
{
Player Dealt Knockback;
Team 1;
D.Va;
}
conditions
{
Event Ability == Button(Ability 1);
Event Player.abilities[12] == True;
}
actions
{
Damage(Victim, Event Player, 30);
Set Status(Victim, Null, Burning, 3);
Start Damage Over Time(Victim, Event Player, 3, 35);
Play Effect(All Players(All Teams), Bad Explosion, Color(Red), Victim, 1);
}
}
rule("Doomfist: Punch Card")
{
event
{
Ongoing - Each Player;
Team 1;
Doomfist;
}
conditions
{
Event Player.abilities[8] == True;
Is Firing Secondary(Event Player) == True;
}
actions
{
Wait(1, Abort When False);
Event Player.damageBoost[1] += 200;
Call Subroutine(UpdatePlayerStats);
Wait Until(Ability Cooldown(Event Player, Button(Secondary Fire)) > 0.100, 1);
Event Player.damageBoost[1] -= 200;
Call Subroutine(UpdatePlayerStats);
}
}
rule("Doomfist: Fissure")
{
event
{
Ongoing - Each Player;
Team 1;
Doomfist;
}
conditions
{
Is Using Ability 1(Event Player) == True;
Event Player.abilities[12] == True;
}
actions
{
Wait(1.250, Abort When False);
Wait Until(Is On Ground(Event Player), 10);
Abort If(!Is On Ground(Event Player));
Event Player.abilityProjectile = Position Of(Event Player);
Event Player.abilityActive = True;
Wait Until(Is Dead(Event Player), 5);
Event Player.abilityActive = False;
}
}
rule("Doomfist: Fissure")
{
event
{
Ongoing - Each Player;
Team 1;
Doomfist;
}
conditions
{
Event Player.abilityActive == True;
Event Player.abilities[12] == True;
}
actions
{
Create Effect(All Players(All Teams), Ring, Color(Orange), Event Player.abilityProjectile, 8, Visible To Position and Radius);
Event Player.effects[1] = Last Created Entity;
Create Effect(All Players(All Teams), Cloud, Color(Orange), Event Player.abilityProjectile, 8, Visible To Position and Radius);
Event Player.effects[2] = Last Created Entity;
Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Event Player.abilityProjectile, 16);
While(Event Player.abilityActive && Event Player.abilities[12]);
Damage(Players Within Radius(Event Player.abilityProjectile, 8, Team 2, Off), Event Player, 20);
Wait(0.235, Ignore Condition);
End;
Destroy Effect(Event Player.effects[1]);
Destroy Effect(Event Player.effects[2]);
}
}
rule("Echo: Silver Lining")
{
event
{
Player Dealt Damage;
Team 1;
Echo;
}
actions
{
Abort If(!Event Player.abilities[8]);
Abort If(Event Ability != Button(Secondary Fire));
Abort If(Is Duplicating(Event Player));
Abort If(Normalized Health(Victim) > 0.500);
Damage(Victim, Event Player, Event Damage);
}
}
rule("Echo: Focusing Optics")
{
event
{
Player Dealt Damage;
Team 1;
Echo;
}
actions
{
Abort If(!Event Player.abilities[12]);
Abort If(Event Ability != Button(Ability 2));
Abort If(Is Duplicating(Event Player));
Abort If(Normalized Health(Victim) <= 0.500);
Abort If(Normalized Health(Victim) > 0.900);
Damage(Victim, Event Player, Event Damage * 3);
Play Effect(All Players(All Teams), Bad Explosion, Color(Violet), Victim, 0.500);
}
}
rule("Genji: Venomous Strike")
{
event
{
Player Dealt Damage;
Team 1;
Genji;
}
actions
{
Abort If(!Event Player.abilities[8]);
Abort If(Event Ability != Button(Ability 1));
Start Heal Over Time(Event Player, Event Player, 3, 15);
Start Damage Over Time(Victim, Event Player, 3, 15);
Heal(Event Player, Event Player, 5);
Wait(0.250, Restart When True);
Wait(2, Ignore Condition);
}
}
rule("Genji: Dragon's Breath")
{
event
{
Ongoing - Each Player;
Team 1;
Genji;
}
conditions
{
Event Player.abilities[12] == True;
Is Using Ultimate(Event Player) == True;
Is Firing Primary(Event Player) == True;
}
actions
{
Create Effect(All Players(All Teams), Good Aura, Color(Lime Green), Event Player.abilityProjectile, 1,
Visible To Position and Radius);
Event Player.effects[1] = Last Created Entity;
Event Player.abilityProjectile = Eye Position(Event Player);
Chase Player Variable At Rate(Event Player, abilityProjectile, Event Player.abilityEnd, 80, Destination and Rate);
Event Player.abilityEnd = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
Event Player) * 60, All Living Players(Team 2), All Players(Team 1), True);
Wait Until(!Event Player.abilities[12] || Event Player.abilityEnd == Event Player.abilityProjectile, 1);
Destroy Effect(Event Player.effects[1]);
Play Effect(All Players(All Teams), Ring Explosion Sound, Color(Green), Event Player.abilityProjectile, 100);
Play Effect(All Players(All Teams), Bad Explosion, Color(Lime Green), Event Player.abilityProjectile, 5);
Play Effect(All Players(All Teams), Bad Explosion, Color(Green), Event Player.abilityProjectile, 5);
Damage(Players Within Radius(Event Player.abilityProjectile, 5, Team 2, Surfaces), Event Player, 150);
Stop Chasing Player Variable(Event Player, abilityCountdown);
}
}
rule("Hanzo: Firebolt")
{
event
{
Ongoing - Each Player;
Team 1;
Hanzo;
}
conditions
{
Event Player.abilities[8] == True;
Is Firing Primary(Event Player) == True;
}
actions
{
For Player Variable(Event Player, loopIterator, 0, 1, 1);
Wait(1, Abort When False);
Play Effect(Event Player, Explosion Sound, Color(White), Event Player, 100);
End;
Play Effect(All Players(All Teams), Bad Explosion, Color(Sky Blue), Eye Position(Event Player) + Vector(0, -0.250, False)
+ Facing Direction Of(Event Player), 1);
Play Effect(All Players(All Teams), Ring Explosion Sound, Color(Team 1), Event Player, 100);
While(Is Firing Primary(Event Player));
Wait(0.100, Ignore Condition);
Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Eye Position(Event Player) + Vector(0, -0.250, False)
+ Facing Direction Of(Event Player) * 0.700, 0.001);
End;
Abort If(Has Status(Event Player, Stunned) || Is Dead(Event Player) || Is Button Held(Event Player, Button(Secondary Fire))
|| Has Status(Event Player, Asleep));
Event Player.abilityProjectile = Eye Position(Event Player) + Facing Direction Of(Event Player) * Vector(False, False, 2);
Event Player.abilityEnd = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
Event Player) * 200, All Living Players(All Teams), Event Player, False);
Set Projectile Speed(Event Player, 150);
Chase Player Variable At Rate(Event Player, abilityProjectile, Event Player.abilityEnd, 165, Destination and Rate);
While(Event Player.abilityProjectile != Event Player.abilityEnd);
Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Orange), Event Player.abilityProjectile, 3.500);
Play Effect(All Players(All Teams), Explosion Sound, Color(Team 1), Event Player.abilityProjectile, 35);
Wait(0.072, Ignore Condition);
End;
Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Event Player.abilityProjectile, 4);
Play Effect(All Players(All Teams), Ring Explosion Sound, Color(Team 1), Event Player.abilityProjectile, 150);
Damage(Players Within Radius(Event Player.abilityProjectile, 4, Team 2, Surfaces), Event Player, 175);
Set Projectile Speed(Event Player, 100);
Stop Chasing Player Variable(Event Player, abilityProjectile);
}
}
rule("Hanzo: Stormbreak")
{
event
{
Player Dealt Final Blow;
Team 1;
Hanzo;
}
conditions
{
Event Player.abilities[12] == True;
}
actions
{
Event Player.abilityCountdown = 4;
Chase Player Variable At Rate(Event Player, abilityCountdown, 0, 1, Destination and Rate);
}
}
rule("Hanzo: Stormbreak - Boost")
{
event
{
Ongoing - Each Player;
Team 1;
Hanzo;
}
conditions
{
Event Player.abilities[12] == True;
Event Player.abilityCountdown > 0;
}
actions
{
Create Effect(All Players(All Teams), Winston Primal Rage Effect, Color(Team 1), Event Player, 1, Visible To Position and Radius);
Event Player.effects[1] = Last Created Entity;
Wait Until(Is Dead(Event Player) || !Event Player.abilityCountdown || !Event Player.abilities[12], 99999);
Event Player.abilityCountdown = False;
Destroy Effect(Event Player.effects[1]);
Stop Chasing Player Variable(Event Player, abilityCountdown);
}
}
rule("Hanzo: Stormbreak - Reset Cooldowns For Storm Arrows")
{
event
{
Ongoing - Each Player;
Team 1;
Hanzo;
}
conditions
{
Event Player.abilityCountdown > 0;
Ability Cooldown(Event Player, Button(Ability 2)) > 0;
}
actions
{
Set Ability Cooldown(Event Player, Button(Ability 2), False);
}
}
rule("Junker Queen: Shout Very Loudly")
{
event
{
Ongoing - Each Player;
Team 1;
Junker Queen;
}
conditions
{
Event Player.abilities[8] == True;
Is Using Ability 1(Event Player) == True;
}
actions
{
Start Damage Over Time(Remove From Array(Players Within Radius(Event Player, 15, Team 2, Surfaces), Event Player), Event Player, 5,
8);
Start Heal Over Time(Event Player, Event Player, 5, 8 * Count Of(Players Within Radius(Event Player, 15, Team 2, Surfaces)));
}
}
rule("Junker Queen: Grace Period")
{
event
{
Player Dealt Knockback;
Team 1;
Junker Queen;
}
conditions
{
Event Player.abilities[12] == True;
Event Ability == Button(Secondary Fire);
Is Meleeing(Event Player) == False;
}
actions
{
Start Damage Over Time(Victim, Event Player, 2.500, 20);
Start Heal Over Time(Event Player, Event Player, 2.500, 20);
Heal(Event Player, Event Player, 60);
Damage(Victim, Event Player, 40);
Play Effect(All Players(All Teams), Bad Explosion, Color(Red), Victim, 0.250);
}
}
rule("Junkrat: Pyromania")
{
event
{
Player Dealt Knockback;
Team 1;
Junkrat;
}
actions
{
Abort If(!Event Player.abilities[8]);
Abort If(Event Ability == Button(Melee));
Abort If(Victim == Event Player);
Start Damage Over Time(Victim, Event Player, 2, 20);
Set Status(Victim, Null, Burning, 2);
}
}
rule("Junkrat: Trigger Happy")
{
event
{
Ongoing - Each Player;
Team 1;
Junkrat;
}
conditions
{
Event Player.abilities[12] == True;
Ability Charge(Event Player, Button(Ability 1)) < 5;
}
actions
{
Wait(4, Abort When False);
Set Ability Charge(Event Player, Button(Ability 1), Ability Charge(Event Player, Button(Ability 1)) + 1);
Loop If Condition Is True;
}
}
rule("Kiriko: Shinobi Tactics")
{
event
{
Player Dealt Healing;
Team 1;
Kiriko;
}
actions
{
Abort If(!Event Player.abilities[8]);
Abort If(Event Ability == Null);
Damage(Players Within Radius(Healee, 6, Team 2, Surfaces), Event Player, Event Healing * 2);
}
}
rule("Kiriko: Recession")
{
event
{
Player Dealt Knockback;
Team 1;
Kiriko;
}
conditions
{
Event Player.abilities[12] == True;
Event Ability == Button(Ability 2);
}
actions
{
Damage(Victim, Event Player, 75);
Set Status(Victim, Event Player, Frozen, 1.500);
Play Effect(All Players(All Teams), Good Explosion, Color(Gray), Victim, 1);
}
}
rule("Lucio: Power Skating - Damage")
{
event
{
Player Dealt Knockback;
Team 1;
Lúcio;
}
conditions
{
Event Player.abilities[8] == True;
Event Ability == Button(Secondary Fire);
}
actions
{
Damage(Victim, Event Player, Speed Of(Event Player) * 5);
Apply Impulse(Victim, Facing Direction Of(Event Player), Speed Of(Event Player) * 1.500, To World, Cancel Contrary Motion);
Apply Impulse(Victim, Up, 4, To World, Incorporate Contrary Motion);
Play Effect(All Players(All Teams), Good Explosion, Color(Green), Victim, 0.010);
}
}
rule("Lucio: Reverse Amp")
{
event
{
Ongoing - Each Player;
Team 1;
Lúcio;
}
conditions
{
Is Using Ability 2(Event Player) == True;
Event Player.abilities[12] == True;
}
actions
{
If(Is Using Ability 1(Event Player));
Set Status(Players Within Radius(Event Player, 12, Team 2, Surfaces), Event Player, Rooted, 0.750);
Else;
Damage(Players Within Radius(Event Player, 12, Team 2, Surfaces), Event Player, 30);
Wait(0.500, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Mei: Cold Snap")
{
event
{
Ongoing - Each Player;
Team 1;
Mei;
}
conditions
{
Event Player.abilities[8] == True;
Is Using Ability 1(Event Player) == True;
}
actions
{
Wait(0.500, Abort When False);
Wait Until(!Is Using Ability 1(Event Player), 99999);
Damage(Players Within Radius(Eye Position(Event Player), 10, Team 2, Surfaces), Event Player, 35);
Set Status(Players Within Radius(Eye Position(Event Player), 10, Team 2, Surfaces), Event Player, Frozen, 2);
Play Effect(All Players(All Teams), Ring Explosion, Color(Sky Blue), Position Of(Event Player), 20);
Play Effect(All Players(All Teams), Ring Explosion, Color(Aqua), Position Of(Event Player) + Vector(0, 1, False), 20);
}
}
rule("Mei: Polar Vortex")
{
event
{
Ongoing - Each Player;
All;
Mei;
}
conditions
{
Event Player.abilities[12] == True;
Is Using Ultimate(Event Player) == True;
}
actions
{
Event Player.damageBoost[1] += 75;
Call Subroutine(UpdatePlayerStats);
For Player Variable(Event Player, loopIterator, 0, 3, 1);
Wait(0.016, Ignore Condition);
Set Ultimate Charge(Event Player, 100);
Press Button(Event Player, Button(Ultimate));
Wait(0.510, Ignore Condition);
End;
Event Player.damageBoost[1] -= 75;
Call Subroutine(UpdatePlayerStats);
Set Ultimate Charge(Event Player, 0);
Wait(1, Ignore Condition);
}
}
rule("Mercy: Wings of Grand")
{
event
{
Ongoing - Each Player;
Team 1;
Mercy;
}
conditions
{
Event Player.abilities[8] == True;
Is Alive(Event Player) == True;
Is Using Ability 1(Event Player) == True;
}
actions
{
If(Speed Of(Event Player) > 10);
Damage(Filtered Array(Players Within Radius(Event Player, 4, Team 2, Surfaces), !Has Status(Current Array Element, Knocked Down)),
Event Player, 35);
Set Status(Players Within Radius(Event Player, 4, Team 2, Surfaces), Event Player, Knocked Down, 0.800);
Apply Impulse(Players Within Radius(Event Player, 4, Team 2, Surfaces), Normalize(Velocity Of(Event Player)) + Direction Towards(
Event Player, Throttle Of(Event Player)) + Up * 1.100, 7.500, To World, Cancel Contrary Motion);
Play Effect(All Players(All Teams), Bad Explosion, Color(Yellow), Position Of(Event Player), 0.150);
End;
Wait(0.250, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Mercy: Holy Light Missiles")
{
event
{
Ongoing - Each Player;
Team 1;
Mercy;
}
conditions
{
Event Player.abilities[12] == True;
Is Using Ultimate(Event Player) == True;
}
actions
{
Create Effect(All Players(All Teams), Orb, Color(Yellow), Event Player.abilityProjectile, 1, Visible To Position and Radius);
Event Player.effects[1] = Last Created Entity;
Event Player.abilityProjectile = Eye Position(Event Player);
Chase Player Variable At Rate(Event Player, abilityProjectile, Event Player.abilityEnd, 100, Destination and Rate);
Event Player.abilityEnd = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
Event Player) * 60, All Living Players(Team 2), All Players(Team 1), True);
Wait Until(!Event Player.abilities[12] || Event Player.abilityEnd == Event Player.abilityProjectile, 1);
Destroy Effect(Event Player.effects[1]);
Stop Chasing Player Variable(Event Player, abilityCountdown);
Play Effect(All Players(All Teams), Ring Explosion Sound, Color(Green), Event Player.abilityProjectile, 100);
Play Effect(All Players(All Teams), Bad Explosion, Color(Yellow), Event Player.abilityProjectile, 6);
Play Effect(All Players(All Teams), Good Pickup Effect, Color(White), Event Player.abilityProjectile, 6);
Damage(Players Within Radius(Event Player.abilityProjectile, 6, Team 2, Surfaces), Event Player, 150);
Heal(Players Within Radius(Event Player.abilityProjectile, 6, Team 1, Surfaces), Event Player, 150);
Wait(1.500, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Moira: Flourish")
{
event
{
Ongoing - Each Player;
Team 1;
Moira;
}
conditions
{
Is Using Ability 1(Event Player) == True;
Event Player.abilities[8] == True;
}
actions
{
Start Damage Over Time(Players Within Radius(Event Player, 3, Team 2, Surfaces), Event Player, 2, 25);
Start Heal Over Time(Players Within Radius(Event Player, 3, Team 1, Surfaces), Event Player, 2, 40);
Play Effect(All Players(All Teams), Ring Explosion, Color(Black), Position Of(Event Player), 6);
Wait(0.200, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Moira: Catalyst")
{
event
{
Ongoing - Each Player;
All;
Moira;
}
conditions
{
Event Player.abilities[12] == True;
Is Using Ultimate(Event Player) == True;
Is Button Held(Event Player, Button(Primary Fire)) == True;
Ability Resource(Event Player, Button(Primary Fire)) > 8;
}
actions
{
Event Player.damageBoost[1] += 300;
Event Player.healBoost[1] += 300;
Event Player.speedBoost -= 40;
Call Subroutine(UpdatePlayerStats);
Wait Until(!Is Button Held(Event Player, Button(Primary Fire)) || !Event Player.abilities[12] || !Is Using Ultimate(Event Player),
8);
Event Player.damageBoost[1] -= 300;
Event Player.speedBoost += 40;
Event Player.healBoost[1] -= 300;
Call Subroutine(UpdatePlayerStats);
Wait(0.250, Ignore Condition);
}
}
rule("Moira: Catalyst")
{
event
{
Ongoing - Each Player;
All;
Moira;
}
conditions
{
Event Player.abilities[12] == True;
Is Using Ultimate(Event Player) == True;
Is Button Held(Event Player, Button(Primary Fire)) == True;
Ability Resource(Event Player, Button(Primary Fire)) > 8;
}
actions
{
Set Ability Resource(Event Player, Button(Primary Fire), Ability Resource(Event Player, Button(Primary Fire)) - 15);
Play Effect(All Players(All Teams), Ring Explosion, Color(Purple), Eye Position(Event Player), 10);
Damage(Players Within Radius(Eye Position(Event Player), 5, Team 2, Surfaces), Event Player, 35);
Wait(0.500, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Orisa: Melting Point")
{
event
{
Ongoing - Each Player;
Team 1;
Orisa;
}
conditions
{
Event Player.abilities[8] == True;
Is Using Ability 2(Event Player) == True;
}
actions
{
Wait Until(!Is Using Ability 2(Event Player), 99999);
Damage(Players Within Radius(Event Player, 12, Team 2, Surfaces), Event Player, 70);
Play Effect(All Players(All Teams), Ring Explosion, Color(Lime Green), Position Of(Event Player), 24);
Apply Impulse(Players Within Radius(Event Player, 12, Team 2, Surfaces), Up, 8, To World, Cancel Contrary Motion);
Set Status(Players Within Radius(Event Player, 12, Team 2, Surfaces), Event Player, Rooted, 1.500);
}
}
rule("Orisa: Flaming Harpoon")
{
event
{
Player Dealt Knockback;
Team 1;
Orisa;
}
conditions
{
Event Ability == Button(Secondary Fire);
Event Player.abilities[12] == True;
}
actions
{
Start Damage Over Time(Victim, Event Player, 3, 20);
Set Status(Victim, Null, Burning, 3);
Set Status(Victim, Event Player, Stunned, 1);
}
}
rule("Pharah: Head Trauma")
{
event
{
Player Dealt Knockback;
Team 1;
Pharah;
}
conditions
{
Event Player.abilities[8] == True;
Event Ability == Button(Ability 2);
Victim != Event Player;
}
actions
{
Damage(Victim, Event Player, 60);
Play Effect(All Players(All Teams), Good Explosion, Color(Gray), Victim, 1);
Abort If(Normalized Health(Victim) > 0.500);
Set Status(Victim, Null, Hacked, 1);
}
}
rule("Pharah: Weaponized Storm")
{
event
{
Ongoing - Each Player;
All;
Pharah;
}
conditions
{
Event Player.abilities[12] == True;
Is Firing Primary(Event Player) == True;
Ammo(Event Player, False) % 6 == False;
}
actions
{
Set Projectile Speed(Event Player, 125);
Event Player.abilityEnd = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
Event Player) * 100, All Living Players(All Teams), Event Player, True);
Event Player.abilityProjectile = Eye Position(Event Player);
Create Effect(All Players(All Teams), Bad Aura, Color(Orange), Event Player.abilityProjectile, 1, Visible To Position and Radius);
Event Player.effects[7] = Last Created Entity;
Chase Player Variable At Rate(Event Player, abilityProjectile, Event Player.abilityEnd, 35, Destination and Rate);
Wait Until(!Event Player.abilities[12] || Event Player.abilityProjectile == Event Player.abilityEnd, 99999);
Destroy Effect(Event Player.effects[7]);
For Player Variable(Event Player, loopIterator, 0, 6, 1);
Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Orange), Event Player.abilityProjectile + Vector(Random Real(-1.500,
1.500), Random Real(-0.500, 0.500), Random Real(-1.500, 1.500)), 1);
Play Effect(All Players(All Teams), Explosion Sound, Color(Team 1), Event Player.abilityProjectile, 25);
Damage(Players Within Radius(Event Player.abilityProjectile, 4, Team 2, Surfaces), Event Player, 20);
Wait(0.100, Ignore Condition);
End;
Set Projectile Speed(Event Player, 100);
Stop Chasing Player Variable(Event Player, abilityProjectile);
}
}
rule("Ramattra: Vile Dominance")
{
event
{
Ongoing - Each Player;
Team 1;
Ramattra;
}
conditions
{
Event Player.abilities[8] == True;
Health Of Type(Event Player, Armor) >= 100;
}
actions
{
Event Player.speedBoost += 30;
Event Player.abilityActive = True;
Call Subroutine(UpdatePlayerStats);
Wait Until((Ability Cooldown(Event Player, Button(Ability 1)) > 0.100 && !Is Using Ultimate(Event Player))
|| !Event Player.abilities[8], 9999);
Event Player.speedBoost -= 30;
Event Player.abilityActive = False;
Call Subroutine(UpdatePlayerStats);
}
}
rule("Ramattra: Vile Dominance")
{
event
{
Player Dealt Damage;
Team 1;
Ramattra;
}
actions
{
Abort If(!Event Player.abilityActive);
Abort If(Event Ability == Null);
Abort If(Event Ability == Button(Ability 2));
Abort If(Event Ability == Button(Ultimate));
Set Status(Victim, Event Player, Rooted, 0.750);
}
}
rule("Ramattra: Nether Sector")
{
event
{
Player Dealt Damage;
Team 1;
Ramattra;
}
actions
{
Abort If(!Event Player.abilities[12]);
Abort If(!Is On Ground(Event Player));
Abort If(Event Ability != Button(Ability 2));
Heal(Event Player, Event Player, 20);
Set Ultimate Charge(Event Player, Ultimate Charge Percent(Event Player) + 1);
Wait(0.100, Ignore Condition);
}
}
rule("Reaper: Wraith Wrath")
{
event
{
Ongoing - Each Player;
Team 1;
Reaper;
}
conditions
{
Is Using Ability 1(Event Player) == True;
Event Player.abilities[8] == True;
}
actions
{
Wait(0.100, Abort When False);
Cancel Primary Action(Event Player);
Create Effect(All Players(All Teams), Reaper Wraith Form Effect, Color(Team 1), Event Player, True,
Visible To Position and Radius);
Event Player.effects[1] = Last Created Entity;
Event Player.damageBoost[1] += 30;
Event Player.speedBoost += 50;
Call Subroutine(UpdatePlayerStats);
Disallow Button(Event Player, Button(Ability 1));
Set Status(Event Player, Null, Phased Out, 3);
Wait Until(Is Dead(Event Player) || !Event Player.abilities[8], 3);
Allow Button(Event Player, Button(Ability 1));
Set Ability Cooldown(Event Player, Button(Ability 1), 8);
Event Player.damageBoost[1] -= 30;
Event Player.speedBoost -= 50;
Call Subroutine(UpdatePlayerStats);
Destroy Effect(Event Player.effects[1]);
}
}
rule("Reaper: Loom")
{
event
{
Ongoing - Each Player;
Team 1;
Reaper;
}
conditions
{
Is Using Ability 1(Event Player) == True;
Event Player.abilities[12] == True;
}
actions
{
Set Status(Filtered Array(Players in View Angle(Event Player, Team 2, 45), Is In Line of Sight(Event Player, Current Array Element,
Barriers Do Not Block LOS)), Event Player, Hacked, 2);
Damage(Filtered Array(Players in View Angle(Event Player, Team 2, 45), Is In Line of Sight(Current Array Element, Event Player,
Barriers Do Not Block LOS)), Event Player, 35);
}
}
rule("Reinhardt: Fire Blast")
{
event
{
Player Dealt Damage;
Team 1;
Reinhardt;
}
actions
{
Abort If(!Event Player.abilities[8]);
Abort If(Event Ability != Button(Ability 2));
Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Victim, 5);
Start Damage Over Time(Players Within Radius(Victim, 5, Team 2, Surfaces), Event Player, 5, 20);
Set Status(Players Within Radius(Victim, 5, Team 2, Surfaces), Event Player, Burning, 5);
}
}
rule("Reinhardt: Epicenter")
{
event
{
Ongoing - Each Player;
Team 1;
Reinhardt;
}
conditions
{
Event Player.abilities[12] == True;
Is Using Ultimate(Event Player) == True;
Is On Ground(Event Player) == True;
}
actions
{
Set Status(Players Within Radius(Event Player, 20, Team 2, Surfaces), Event Player, Knocked Down, 2.500);
For Player Variable(Event Player, loopIterator, 0, 3, 1);
Wait(0.032, Ignore Condition);
Damage(Players Within Radius(Event Player, Event Player.loopIterator * 10, Team 2, Surfaces), Event Player, 50);
Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Position Of(Event Player), Event Player.loopIterator * 20);
End;
Wait(5, Ignore Condition);
}
}
rule("Roadhog: Stench")
{
event
{
Ongoing - Each Player;
Team 1;
Roadhog;
}
conditions
{
Event Player.abilities[8] == True;
Is Alive(Event Player) == True;
}
actions
{
Create Effect(All Players(All Teams), Ring, Color(Violet), Event Player, 8, Visible To Position and Radius);
Event Player.effects[1] = Last Created Entity;
Wait Until(!Event Player.abilities[8] || Is Dead(Event Player), 99999);
Destroy Effect(Event Player.effects[1]);
Wait(0.100, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Roadhog: Stench effect")
{
event
{
Ongoing - Each Player;
Team 1;
Roadhog;
}
conditions
{
Distance Between(Event Player, Closest Player To(Event Player, Team 2)) <= 8;
Event Player.abilities[8] == True;
}
actions
{
Damage(Players Within Radius(Event Player, 8, Team 2, Surfaces), Event Player, 9);
Wait(0.400, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Roadhog: Chainsnap")
{
event
{
Ongoing - Each Player;
Team 1;
Roadhog;
}
conditions
{
Event Player.abilities[12] == True;
Is Alive(Event Player) == True;
}
actions
{
Start Damage Modification(Is Using Ability 1(Event Player) ? All Players(Team 2) : Empty Array, Event Player, 400,
Receivers Damagers and Damage Percent);
Event Player.damageMod = Last Damage Modification ID;
Wait Until(!Event Player.abilities[12] || Is Dead(Event Player), 99999);
Stop Damage Modification(Event Player.damageMod);
Wait(0.100, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Roadhog: Chainsnap - Reset cooldown")
{
event
{
Player Earned Elimination;
Team 1;
Roadhog;
}
conditions
{
Event Player.abilities[12] == True;
}
actions
{
Wait Until(!Is Using Ability 1(Event Player), 3);
Set Ability Cooldown(Event Player, Button(Ability 1), False);
}
}
rule("Sigma: Accretion Disk")
{
event
{
Ongoing - Each Player;
Team 1;
Sigma;
}
conditions
{
Event Player.abilities[8] == True;
Is Using Ability 2(Event Player) == True;
}
actions
{
Set Projectile Speed(Event Player, 150);
Set Projectile Gravity(Event Player, 0);
Wait Until(!Event Player.abilities[8] || !Is Using Ability 2(Event Player), 5);
Set Projectile Speed(Event Player, 100);
Set Projectile Gravity(Event Player, 100);
}
}
rule("Sigma: Accretion Disk")
{
event
{
Player Dealt Knockback;
Team 1;
Sigma;
}
actions
{
Abort If(!Event Player.abilities[8]);
Abort If(Event Ability != Button(Ability 2));
Abort If(Victim == Event Player);
Set Status(Victim, Event Player, Knocked Down, 1.500);
Damage(Victim, Event Player, Event Damage * 0.750);
}
}
rule("Sigma: String Theory")
{
event
{
Ongoing - Each Player;
Team 1;
Sigma;
}
conditions
{
Event Player.abilities[12] == True;
Is Using Ability 1(Event Player) == True;
}
actions
{
Wait(1.800, Abort When False);
Event Player.abilityProjectile = Eye Position(Event Player);
Event Player.abilityEnd = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
Event Player) * 50, All Players(Team 2), Event Player, True);
Chase Player Variable At Rate(Event Player, abilityProjectile, Event Player.abilityEnd, 40, Destination and Rate);
Create Effect(All Players(All Teams), Sphere, Color(Violet), Event Player.abilityProjectile, 0.600,
Visible To Position and Radius);
Event Player.effects[1] = Last Created Entity;
Create Effect(All Players(All Teams), Good Aura, Color(Violet), Event Player.abilityProjectile, 0.600,
Visible To Position and Radius);
Event Player.effects[2] = Last Created Entity;
Wait(0.250, Ignore Condition);
Event Player.abilityCountdown = Health Of Type(Event Player, Shields);
Wait Until(!Event Player.abilities[12] || Event Player.abilityProjectile == Event Player.abilityEnd, 5);
Stop Chasing Player Variable(Event Player, abilityProjectile);
Destroy Effect(Event Player.effects[1]);
Destroy Effect(Event Player.effects[2]);
Damage(Players Within Radius(Event Player.abilityProjectile, Min(10, 1.500 + Event Player.abilityCountdown * 0.017), Team 2, Off),
Event Player, Min(200, 100 + Event Player.abilityCountdown / 5));
Play Effect(All Players(All Teams), Debuff Impact Sound, Color(Violet), Event Player.abilityProjectile, 150);
Play Effect(All Players(All Teams), Bad Explosion, Color(Violet), Event Player.abilityProjectile, Min(10,
1.500 + Event Player.abilityCountdown * 0.017));
Play Effect(All Players(All Teams), Good Explosion, Color(Purple), Event Player.abilityProjectile, Min(10,
1.500 + Event Player.abilityCountdown * 0.017));
Play Effect(All Players(All Teams), Ring Explosion, Color(Violet), Event Player.abilityProjectile, Min(20,
3 + Event Player.abilityCountdown * 0.017));
}
}
rule("Sojourn: Thunderout Kicks")
{
event
{
Ongoing - Each Player;
Team 1;
Sojourn;
}
conditions
{
Event Player.abilities[8] == True;
Is Using Ability 1(Event Player) == True;
}
actions
{
Event Player.abilityActive = 1 + Total Time Elapsed;
Wait Until(Ability Cooldown(Event Player, Button(Ability 1)) > 1 || Is Button Held(Event Player, Button(Jump)), 1);
Abort If(Event Player.abilityActive < Total Time Elapsed);
Play Effect(All Players(All Teams), Ring Explosion, Color(Turquoise), Position Of(Event Player), 12);
Damage(Players Within Radius(Event Player, 6, Team 2, Surfaces), Event Player, 75);
}
}
rule("Sojourn: Matter Splatter")
{
event
{
Player Dealt Damage;
Team 1;
Sojourn;
}
actions
{
Abort If(!Event Player.abilities[12]);
Abort If(Event Ability != Button(Secondary Fire));
Abort If(!Event Was Critical Hit);
Play Effect(All Players(All Teams), Bad Explosion, Color(Turquoise), Eye Position(Victim), 3.500);
Damage(Remove From Array(Players Within Radius(Victim, 3.500, Team 2, Surfaces), Victim), Event Player, Event Damage);
}
}
rule("Soldier76: Triple Threat")
{
event
{
Ongoing - Each Player;
Team 1;
Soldier: 76;
}
conditions
{
Event Player.abilities[8] == True;
Is Firing Secondary(Event Player) == True;
}
actions
{
Event Player.abilityCountdown = Ray Cast Hit Position(Eye Position(Event Player), Ray Cast Hit Position(Eye Position(Event Player),
Eye Position(Event Player) + Facing Direction Of(Event Player) * 60, All Living Players(Team 2), Null, False)
+ World Vector Of(Vector(-2, False, False), Event Player, Rotation), All Living Players(Team 2), Null, False);
Event Player.abilityProjectile = Ray Cast Hit Position(Eye Position(Event Player), Ray Cast Hit Position(Eye Position(
Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 60, All Living Players(Team 2), Null, False)
+ World Vector Of(Vector(2, False, False), Event Player, Rotation), All Living Players(Team 2), Null, False);
Event Player.abilityAvailable = Eye Position(Event Player) + World Vector Of(Vector(False, -0.250, False), Event Player, Rotation);
Event Player.abilityEnd = Eye Position(Event Player) + World Vector Of(Vector(False, -0.250, False), Event Player, Rotation);
Chase Player Variable At Rate(Event Player, abilityAvailable, Event Player.abilityProjectile, 60, Destination and Rate);
Chase Player Variable At Rate(Event Player, abilityEnd, Event Player.abilityCountdown, 60, Destination and Rate);
}
}
rule("Soldier76: Triple Threat - First Rocket")
{
event
{
Ongoing - Each Player;
Team 1;
Soldier: 76;
}
conditions
{
Event Player.abilityProjectile != Event Player.abilityAvailable;
Event Player.abilities[8] == True;
Ability Cooldown(Event Player, Button(Secondary Fire)) > 0.100;
}
actions
{
Play Effect(All Players(All Teams), Good Explosion, Color(Aqua), Event Player.abilityAvailable, 0.400);
Wait(0.064, Ignore Condition);
Loop If Condition Is True;
Play Effect(All Players(All Teams), Good Explosion, Color(Sky Blue), Event Player.abilityAvailable, 2.500);
Stop Chasing Player Variable(Event Player, abilityAvailable);
Wait(0.016, Ignore Condition);
Damage(Players Within Radius(Event Player.abilityAvailable, 2.500, Team 2, Surfaces), Event Player, 80);
Stop Chasing Player Variable(Event Player, abilityAvailable);
Event Player.abilityAvailable = False;
Event Player.abilityProjectile = False;
Wait(0.016, Ignore Condition);
}
}
rule("Soldier76: Triple Threat - Second Rocket")
{
event
{
Ongoing - Each Player;
Team 1;
Soldier: 76;
}
conditions
{
Event Player.abilityCountdown != Event Player.abilityEnd;
Event Player.abilities[8] == True;
Ability Cooldown(Event Player, Button(Secondary Fire)) > 0.100;
}
actions
{
Play Effect(All Players(All Teams), Good Explosion, Color(Aqua), Event Player.abilityEnd, 0.400);
Wait(0.064, Ignore Condition);
Loop If Condition Is True;
Play Effect(All Players(All Teams), Good Explosion, Color(Sky Blue), Event Player.abilityEnd, 2.500);
Stop Chasing Player Variable(Event Player, abilityEnd);
Damage(Players Within Radius(Event Player.abilityEnd, 2.500, Team 2, Surfaces), Event Player, 80);
Event Player.abilityEnd = False;
Event Player.abilityCountdown = False;
}
}
rule("Soldier76: Triple Threat - Init rocket")
{
event
{
Ongoing - Each Player;
Team 1;
Soldier: 76;
}
conditions
{
Event Player.abilities[8] == True;
}
actions
{
Event Player.abilityProjectile = Event Player.abilityAvailable;
Event Player.abilityCountdown = Event Player.abilityEnd;
}
}
rule("Soldier76: Espionage")
{
event
{
Player Dealt Healing;
Team 1;
Soldier: 76;
}
actions
{
Abort If(!Event Player.abilities[12]);
Abort If(Event Ability != Button(Ability 2));
If(!Healee.soldierEspionage);
Healee.soldierEspionage = True;
End;
}
}
rule("Soldier76: Espionage - Allies effect")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.soldierEspionage == True;
}
actions
{
Event Player.soldierEspionage = False;
Wait(0.400, Ignore Condition);
}
}
rule("Sombra: Going Viral")
{
event
{
Ongoing - Each Player;
Team 1;
Sombra;
}
conditions
{
Event Player.abilities[8] == True;
Is Using Ability 1(Event Player) == True;
}
actions
{
Wait(0.500, Abort When False);
Wait Until(!Is Using Ability 1(Event Player), 20);
Create Effect(All Players(All Teams), Sphere, Color(Purple), Event Player, 24 * Total Time Elapsed % 12,
Visible To Position and Radius);
Event Player.effects[1] = Last Created Entity;
Set Ability Cooldown(Event Player, Button(Secondary Fire), 0);
Set Status(Event Player, Event Player, Invincible, 0.750);
Wait(0.500, Ignore Condition);
Damage(Players Within Radius(Event Player, 12, Team 2, Surfaces), Event Player, 50);
Set Status(Players Within Radius(Event Player, 12, Team 2, Surfaces), Event Player, Hacked, 8);
Destroy Effect(Event Player.effects[1]);
}
}
rule("Sombra: Cyberattack")
{
event
{
Ongoing - Each Player;
Team 1;
Sombra;
}
conditions
{
Event Player.abilities[12] == True;
Is Using Ability 2(Event Player) == True;
}
actions
{
Wait Until(!Is Using Ability 2(Event Player), 99999);
Abort If(Is Button Held(Event Player, Button(Interact)) || Ability Cooldown(Event Player, Button(Ability 2)) >= 2.800);
Abort If(Is Dead(Event Player));
Wait(0.250, Ignore Condition);
Damage(Players Within Radius(Event Player, 8, Team 2, Surfaces), Event Player, 80);
Play Effect(All Players(All Teams), Ring Explosion Sound, Color(White), Eye Position(Event Player), 20000);
Play Effect(All Players(All Teams), Good Explosion, Color(Purple), Eye Position(Event Player), 8);
Play Effect(All Players(All Teams), Ring Explosion, Color(Violet), Eye Position(Event Player), 16);
Set Status(Players Within Radius(Eye Position(Event Player), 8, Team 2, Surfaces), Event Player, Hacked, 3);
}
}
rule("Symmetra: Sentry Paragon")
{
event
{
Ongoing - Each Player;
Team 1;
Symmetra;
}
conditions
{
Event Player.abilities[8] == True;
Is Alive(Event Player) == True;
}
actions
{
Wait(0.500, Abort When False);
Start Damage Modification(All Players(Team 2), Event Player, 66.667, Receivers Damagers and Damage Percent);
Event Player.damageMod = Last Damage Modification ID;
Event Player.damageBoost[1] += 50;
Call Subroutine(UpdatePlayerStats);
Wait Until(!Event Player.abilities[8] || Is Dead(Event Player), 99999);
Event Player.damageBoost[1] -= 50;
Call Subroutine(UpdatePlayerStats);
Stop Damage Modification(Event Player.damageMod);
Wait(0.100, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Symmetra: Shield Generator")
{
event
{
Player Dealt Final Blow;
Team 1;
Symmetra;
}
conditions
{
Event Player.abilities[12] == True;
}
actions
{
Event Player.damageBoost[1] += 30;
Event Player.speedBoost += 30;
Call Subroutine(UpdatePlayerStats);
Add Health Pool To Player(All Players(Team 1), Shields, Min(200, Max Health(Event Player) * 0.250), False, False);
Event Player.hpPool[6] = Last Created Health Pool;
Create Effect(All Players(All Teams), Ana Nano Boosted Effect, Color(Team 1), Event Player, 1, Visible To Position and Radius);
Event Player.effects[1] = Last Created Entity;
Wait Until(!Event Player.abilities[12] || Is Dead(Event Player), 10);
Destroy Effect(Event Player.effects[1]);
Remove Health Pool From Player(Event Player.hpPool[6]);
Event Player.damageBoost[1] -= 30;
Event Player.speedBoost -= 30;
Call Subroutine(UpdatePlayerStats);
}
}
rule("Torbjorn: Heatwave")
{
event
{
Ongoing - Each Player;
Team 1;
Torbjörn;
}
conditions
{
Event Player.abilities[8] == True;
(Is Using Ability 2(Event Player) || Is Using Ultimate(Event Player)) == True;
}
actions
{
Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Position Of(Event Player), 11);
Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Position Of(Event Player), 12);
Start Damage Over Time(Remove From Array(Players Within Radius(Event Player, 6, Team 2, Surfaces), Event Player), Event Player, 3,
20);
Set Status(Remove From Array(Players Within Radius(Event Player, 6, Team 2, Surfaces), Event Player), Event Player, Burning, 3);
Damage(Players Within Radius(Event Player, 6, Team 2, Surfaces), Event Player, 15);
Wait(0.750, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Torbjorn: Melting Point")
{
event
{
Player Earned Elimination;
Team 1;
Torbjörn;
}
conditions
{
Event Player.abilities[12] == True;
Event Ability == Button(Ability 1);
}
actions
{
Event Player.abilityCountdown += 6;
Chase Player Variable At Rate(Event Player, abilityCountdown, 0, 1, Destination and Rate);
}
}
rule("Torbjorn: Melting Point - Boost")
{
event
{
Ongoing - Each Player;
Team 1;
Torbjörn;
}
conditions
{
Event Player.abilities[12] == True;
Event Player.abilityCountdown > 0;
}
actions
{
Start Damage Modification(All Players(Team 2), Event Player, 33, Receivers Damagers and Damage Percent);
Event Player.damageMod = Last Damage Modification ID;
Event Player.damageBoost[1] += 300;
Call Subroutine(UpdatePlayerStats);
Wait Until(Is Dead(Event Player) || !Event Player.abilityCountdown || !Event Player.abilities[12], 99999);
Event Player.abilityCountdown = False;
Stop Damage Modification(Event Player.damageMod);
Event Player.damageBoost[1] -= 300;
Call Subroutine(UpdatePlayerStats);
Stop Chasing Player Variable(Event Player, abilityCountdown);
}
}
rule("Tracer: Vortex")
{
event
{
Ongoing - Each Player;
Team 1;
Tracer;
}
conditions
{
Is Using Ability 2(Event Player) == True;
Event Player.abilities[8] == True;
}
actions
{
Heal(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player, 1);
Damage(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player, 25);
Play Effect(All Players(All Teams), Ring Explosion, Color(Red), Position Of(Event Player), 20);
Play Effect(All Players(All Teams), Ring Explosion, Color(Yellow), Position Of(Event Player), 18);
Play Effect(All Players(All Teams), Ring Explosion, Color(Green), Position Of(Event Player), 16);
Play Effect(All Players(All Teams), Ring Explosion, Color(Aqua), Position Of(Event Player), 14);
Set Environment Credit Player(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player);
}
}
rule("Tracer: Vortex 2")
{
event
{
Player Received Healing;
Team 2;
All;
}
actions
{
Abort If(!Healer.abilities[8]);
Abort If(!Is Using Ability 2(Healer));
Disable Movement Collision With Players(Event Player);
Apply Impulse(Event Player, Up, 3, To World, Cancel Contrary Motion);
Set Gravity(Event Player, False);
Wait(0.050, Ignore Condition);
Apply Impulse(Event Player, Direction Towards(Event Player, Healer), Distance Between(Event Player, Healer) * 3.400, To World,
Cancel Contrary Motion);
Set Status(Event Player, Null, Rooted, 1);
Wait(0.230, Ignore Condition);
Set Gravity(Event Player, 100);
Enable Movement Collision With Players(Event Player);
Call Subroutine(CancelMomentum);
}
}
rule("Tracer: Chain Reaction")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is True For Any(Filtered Array(All Living Players(Team 2), Current Array Element.chainReactionOn), Distance Between(Event Player,
Current Array Element) <= 7) == True;
Event Player.chainReactionImmune == False;
Event Player.chainReactionOn == False;
Is Alive(Event Player) == True;
}
actions
{
Wait(0.250, Ignore Condition);
Event Player.chainReactionOn = True;
}
}
rule("Tracer: Chain Reaction 2")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Event Player.chainReactionOn == True;
}
actions
{
Wait(0.100, Ignore Condition);
Play Effect(All Players(All Teams), Good Explosion, Color(Aqua), Event Player, 3);
Damage(Event Player, Players On Hero(Hero(Tracer), Team 1), 200);
Wait(0.500, Ignore Condition);
Event Player.chainReactionImmune = True;
Event Player.chainReactionOn = False;
Wait(2, Ignore Condition);
Event Player.chainReactionImmune = False;
}
}
rule("Tracer: Chain Reaction 3")
{
event
{
Player Dealt Damage;
Team 1;
Tracer;
}
actions
{
Abort If(!Event Player.abilities[12]);
Abort If(Event Ability != Button(Ultimate));
Abort If(Event Damage <= 20);
Victim.chainReactionOn = True;
}
}
rule("Widowmaker: Baiser De Soie")
{
event
{
Player Dealt Damage;
Team 1;
Widowmaker;
}
actions
{
Abort If(!Event Player.abilities[8]);
Abort If(Event Ability != Button(Primary Fire));
Abort If(!Is Firing Secondary(Event Player));
Abort If(!Event Was Critical Hit);
Abort If(Normalized Health(Victim) > 0.300);
Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Violet), Victim, 3);
Damage(Victim, Event Player, 10000);
Damage(Players Within Radius(Victim, 3, Team 2, Surfaces), Event Player, Event Damage);
}
}
rule("Widowmaker: Felt More Alive")
{
event
{
Ongoing - Each Player;
Team 1;
Widowmaker;
}
conditions
{
Event Player.abilities[12] == True;
Is Firing Secondary(Event Player) == True;
Is In Air(Event Player) == True;
}
actions
{
Set Gravity(Event Player, 20);
Event Player.damageBoost[1] += 40;
Call Subroutine(UpdatePlayerStats);
Wait Until(!Is Firing Secondary(Event Player) || !Event Player.abilities[12] || !Is In Air(Event Player), 99999);
Set Gravity(Event Player, 100);
Event Player.damageBoost[1] -= 40;
Call Subroutine(UpdatePlayerStats);
}
}
rule("Winston: Lightning Strikes Twice")
{
event
{
Player Dealt Damage;
Team 1;
Winston;
}
actions
{
Abort If(!Event Player.abilities[8]);
Abort If(Event Ability != Button(Secondary Fire));
Wait(1, Ignore Condition);
Abort If(Is Dead(Victim));
Damage(Victim, Event Player, Event Damage);
Play Effect(All Players(All Teams), Ring Explosion Sound, Color(White), Victim, 50);
Play Effect(All Players(All Teams), Bad Explosion, Color(Blue), Victim, 1);
}
}
rule("Winston: Quake")
{
event
{
Ongoing - Each Player;
Team 1;
Winston;
}
conditions
{
Event Player.abilities[12] == True;
Is Using Ability 1(Event Player) == True;
}
actions
{
Wait(0.250, Ignore Condition);
Wait Until(Is On Ground(Event Player), 99999);
Abort If(Is Dead(Event Player));
Damage(Players Within Radius(Event Player, 7.500, Team 2, Surfaces And All Barriers), Event Player, 30);
Play Effect(All Players(All Teams), Ring Explosion, Color(White), Position Of(Event Player), 15);
Play Effect(All Players(All Teams), Ring Explosion, Color(Gray), Position Of(Event Player), 14);
Set Status(Players Within Radius(Event Player, 7.500, Team 2, Surfaces And All Barriers), Event Player, Stunned, 1);
}
}
rule("Wrecking Ball: Mirror Ball")
{
event
{
Player Took Damage;
Team 1;
Wrecking Ball;
}
actions
{
Abort If(!Event Player.abilities[8]);
Damage(Players Within Radius(Event Player, 4, Team 2, Surfaces), Event Player, Event Damage * 0.600);
}
}
rule("Wrecking Ball: Distort")
{
event
{
Ongoing - Each Player;
Team 1;
Wrecking Ball;
}
conditions
{
Event Player.abilities[12] == True;
Is Using Ability 2(Event Player) == True;
}
actions
{
For Player Variable(Event Player, loopIterator, False, 4, 1);
Play Effect(All Players(All Teams), Ring Explosion, Color(Purple), Position Of(Event Player), 20);
Damage(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player, 25);
Set Status(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player, Hacked, 2);
Wait(0.100, Ignore Condition);
End;
}
}
rule("Zarya: Combusta-bubble - Detect Barrier Target")
{
event
{
Ongoing - Each Player;
Team 1;
Zarya;
}
conditions
{
Event Player.abilities[8] == True;
Is Using Ability 2(Event Player) == True;
}
actions
{
Wait(0.025, Ignore Condition);
Event Player.abilityEnd = First Of(Filtered Array(Players Within Radius(Event Player, 30, Team 1, Surfaces), Has Status(
Current Array Element, Invincible) && Is Alive(Current Array Element) && Is In View Angle(Event Player, Current Array Element,
103)));
Wait Until(!Is Using Ability 2(Event Player), 2);
Play Effect(All Players(All Teams), Explosion Sound, Color(Orange), Event Player.abilityEnd, 120);
Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Eye Position(Event Player.abilityEnd), 6);
Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Yellow), Eye Position(Event Player.abilityEnd), 6);
Damage(Players Within Radius(Eye Position(Event Player.abilityEnd), 6, Team 2, Surfaces), Event Player.abilityEnd, 100);
}
}
rule("Zarya: Combusta-Bubble - Self bubble")
{
event
{
Ongoing - Each Player;
Team 1;
Zarya;
}
conditions
{
Event Player.abilities[8] == True;
Is Using Ability 1(Event Player) == True;
}
actions
{
Wait(0.100, Abort When False);
Wait Until(!Is Using Ability 1(Event Player), 2);
Play Effect(All Players(All Teams), Explosion Sound, Color(Orange), Event Player, 120);
Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Eye Position(Event Player), 6);
Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Yellow), Eye Position(Event Player), 6);
Damage(Players Within Radius(Event Player, 6, Team 2, Surfaces), Event Player, 100);
}
}
rule("Zarya: Power Surge")
{
event
{
Ongoing - Each Player;
Team 1;
Zarya;
}
conditions
{
Event Player.abilities[12] == True;
Is Using Ability 1(Event Player) == True;
}
actions
{
Abort If(!Has Status(Event Player, Invincible));
Damage(Event Player, Null, 10000);
Wait(0.100, Ignore Condition);
Set Ability Cooldown(Event Player, Button(Ability 1), False);
Press Button(Event Player, Button(Ability 1));
Wait(3, Ignore Condition);
}
}
rule("Zenyatta: Stress Relief")
{
event
{
Ongoing - Each Player;
Team 1;
Zenyatta;
}
conditions
{
Event Player.abilities[8] == True;
Is Firing Secondary(Event Player) == True;
}
actions
{
Wait(2, Abort When False);
Play Effect(Event Player, Explosion Sound, Color(Black), Event Player, 150);
Event Player.damageBoost[1] += 50;
Call Subroutine(UpdatePlayerStats);
Wait(0.750, Ignore Condition);
Event Player.damageBoost[1] -= 50;
Call Subroutine(UpdatePlayerStats);
}
}
rule("Zenyatta: Perfect Balance")
{
event
{
Ongoing - Each Player;
Team 1;
Zenyatta;
}
conditions
{
Is Using Ultimate(Event Player) == True;
Event Player.abilities[12] == True;
}
actions
{
Start Damage Over Time(Players Within Radius(Event Player, 12, Team 2, Surfaces), Event Player, 1, 100);
Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Event Player, 24);
Wait(1, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Team 1 (perk): Bulletstorm")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Global.perk[1] == True;
(Ammo(Event Player, 0) < Max Ammo(Event Player, 0) || Ammo(Event Player, 1) < Max Ammo(Event Player, 1)) == True;
}
actions
{
Set Ammo(Event Player, 0, 1000);
Set Ammo(Event Player, 1, 1000);
}
}
rule("Team 1 Challenges")
{
event
{
Player Joined Match;
Team 1;
All;
}
actions
{
If(Global.perk[2] == 1);
Create HUD Text(Event Player, Null, Custom String("Up You Go"), Null, Left, 917, Color(White), Color(Green), Color(White),
Visible To and String, Default Visibility);
Event Player.abilityHUD[17] = Last Text ID;
End;
If(Global.perk[0] == 1);
Create HUD Text(Event Player, Null, Custom String("Sharpshooter"), Null, Left, 918, Color(White), Color(Green), Color(White),
Visible To and String, Default Visibility);
Event Player.abilityHUD[18] = Last Text ID;
End;
If(Global.perk[1] == 1);
Create HUD Text(Event Player, Null, Custom String("Bulletstorm"), Null, Left, 919, Color(White), Color(Green), Color(White),
Visible To and String, Default Visibility);
Event Player.abilityHUD[19] = Last Text ID;
End;
Call Subroutine(UpdatePlayerStats);
}
}
rule("Stuff to do when Player leaves")
{
event
{
Player Left Match;
Team 1;
All;
}
actions
{
Global.automaticRepair -= Event Player.abilities[16];
}
}
rule("Refund")
{
event
{
Subroutine;
Refund;
}
actions
{
"Refund Money"
Event Player.money[0] += Event Player.money[1];
Event Player.money[1] = 0;
"Reset Headhunter"
Event Player.abilities[1] = 0;
"Reset Ambush"
Event Player.abilities[2] = 0;
"Reset QuickFix"
Event Player.abilities[3] = 0;
"Reset HeavyWeight"
Event Player.abilities[4] = 0;
"Reset Charged"
Event Player.abilities[5] = 0;
"Reset Haste"
Event Player.abilities[6] = 0;
"Reset HeavyImpact"
Event Player.abilities[7] = 0;
"Reset HeroTalent1"
Event Player.abilities[8] = 0;
"Reset SecondWind"
Event Player.abilities[9] = 0;
"Reset BindingHeal"
Event Player.abilities[10] = 0;
"Reset Resilience"
Event Player.abilities[11] = 0;
"Reset HeroTalent2"
Event Player.abilities[12] = 0;
"Reset Damage"
Event Player.abilities[13] = 0;
"Reset Health"
Event Player.abilities[14] = 0;
"Reset Healing"
Event Player.abilities[15] = 0;
"Reset automaticRepair"
Global.automaticRepair -= Event Player.abilities[16];
Event Player.abilities[16] = 0;
Call Subroutine(UpdatePlayerStats);
}
}
rule("Brig Shield Bash Stun")
{
event
{
Player Dealt Knockback;
Team 1;
Brigitte;
}
actions
{
Set Status(Victim, Null, Stunned, 1);
}
}
rule("Lucio Dash HUD Creation")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Hero Of(Event Player) == Hero(Lúcio);
}
actions
{
If(Event Player.lucioDashActive == False);
Event Player.lucioDashActive = True;
Create HUD Text(Event Player, Null, Custom String("{0} Slam on ground - Press: {1}", Ability Icon String(Hero(Wrecking Ball),
Button(Crouch)), Input Binding String(Button(Crouch))), Null, Left, 1000, Color(White), Color(Green), Color(White),
Visible To and String, Default Visibility);
Event Player.lucioDashIcon = Last Text ID;
End;
}
}
rule("Lucio Dash Remove HUD")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Hero Of(Event Player) != Hero(Lúcio);
Event Player.lucioDashActive == True;
}
actions
{
Destroy HUD Text(Event Player.lucioDashIcon);
Event Player.lucioDashActive = False;
}
}
rule("Lucio Dash")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Hero Of(Event Player) == Hero(Lúcio);
Event Player.lucioDashActive == True;
Is On Ground(Event Player) == False;
Is Button Held(Event Player, Button(Crouch)) == True;
}
actions
{
Apply Impulse(Event Player, Down, 20, To World, Cancel Contrary Motion);
}
}
rule("Ana Self-Nano")
{
event
{
Ongoing - Each Player;
Team 1;
Ana;
}
conditions
{
Is Button Held(Event Player, Button(Ultimate)) == True;
Ultimate Charge Percent(Event Player) == 100;
Is Dummy Bot(Event Player) == False;
}
actions
{
Abort If(Global.selfNanoWorkshopSetting == False && Number Of Players(Team 1) > 1);
Wait(0.100, Ignore Condition);
If(Is Using Ultimate(Event Player) == False);
Create Dummy Bot(Hero(Ana), Team Of(Event Player), -1, Position Of(Event Player) + Backward, Eye Position(Event Player));
Event Player.anaEntityID = Last Created Entity;
Wait(0.100, Ignore Condition);
Set Ultimate Charge(Event Player.anaEntityID, 100);
Start Facing(Event Player.anaEntityID, Direction Towards(Eye Position(Event Player.anaEntityID), Position Of(Event Player) + Up),
1000, To World, Direction and Turn Rate);
Set Invisible(Event Player.anaEntityID, All);
Set Status(Event Player.anaEntityID, Null, Phased Out, 9999);
Wait(0.150, Ignore Condition);
Press Button(Event Player.anaEntityID, Button(Ultimate));
Set Ultimate Charge(Event Player, 0);
Wait(0.150, Ignore Condition);
Teleport(Event Player.anaEntityID, Position Of(First Of(Spawn Points(Team Of(Event Player)))));
Wait(10, Ignore Condition);
Destroy Dummy Bot(Team Of(Event Player), Slot Of(Event Player.anaEntityID));
End;
}
}
disabled rule("Map Editor Walls")
{
event
{
Ongoing - Global;
}
}
rule("Initial Global")
{
event
{
Ongoing - Global;
}
actions
{
Global.allPositions = Empty Array;
Global.allDirections = Empty Array;
Global.firstPosition = Empty Array;
Global.secondPosition = Empty Array;
Global.firstPoint = Empty Array;
Global.secondPoint = Empty Array;
Global.second = Empty Array;
Global.z = Empty Array;
Global.wallId = Empty Array;
Global.beamType = Empty Array;
}
}
rule("Initial Player")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
actions
{
Event Player.filterPosition = 0;
Event Player.lastSavedPosition = 0;
Event Player.closestBodyPosition = 0;
Event Player.fullBodyPosition = 0;
Event Player.previousPositionIntersection = 0;
Event Player.activeWall = Empty Array;
Event Player.closestWall = Empty Array;
}
}
rule("Collision Logic")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Has Spawned(Event Player) == True;
}
actions
{
Event Player.lastSavedPosition = (Eye Position(Event Player) + Position Of(Event Player)) / 2;
Wait(0.100, Ignore Condition);
Event Player.closestWall = Filtered Array(Global.allPositions, Distance Between(Global.allPositions[Current Array Index],
Event Player) <= Distance Between(Global.allPositions[Current Array Index], Global.firstPosition[Current Array Index])
|| Event Player.activeWall[Current Array Index] == 1 || (Dot Product(Direction Towards(Current Array Element,
Event Player.lastSavedPosition), Global.allDirections[Current Array Index]) > 0) != (Dot Product(Direction Towards(
Current Array Element, Event Player), Global.allDirections[Current Array Index]) > 0));
For Player Variable(Event Player, x, 0, Count Of(Event Player.closestWall), 1);
Global.z = Index Of Array Value(Global.allPositions, Event Player.closestWall[Event Player.x]);
If(Global.wallId[Global.z] == 1 || Global.wallId[Global.z] == 3 || Global.wallId[Global.z] == 5);
If(Y Component Of(Global.firstPosition[Global.z]) >= Y Component Of(Position Of(Event Player)) && Y Component Of(
Global.firstPosition[Global.z]) <= Y Component Of(Eye Position(Event Player) + Vector(Empty Array, 0.200, Empty Array)));
Event Player.closestBodyPosition = Global.firstPosition[Global.z];
Else If(Y Component Of(Global.secondPosition[Global.z]) >= Y Component Of(Position Of(Event Player)) && Y Component Of(
Global.secondPosition[Global.z]) <= Y Component Of(Eye Position(Event Player) + Vector(Empty Array, 0.200, Empty Array)));
Event Player.closestBodyPosition = Global.secondPosition[Global.z];
Else;
Event Player.closestBodyPosition = Position Of(Event Player);
End;
Event Player.fullBodyPosition = Vector(X Component Of(Eye Position(Event Player)), Y Component Of(
Event Player.closestBodyPosition), Z Component Of(Eye Position(Event Player)));
Event Player.filterPosition = Event Player.fullBodyPosition + Global.allDirections[Global.z] * Dot Product(
Global.allPositions[Global.z] - Event Player.fullBodyPosition, Global.allDirections[Global.z]) / Dot Product(
Global.allDirections[Global.z], Global.allDirections[Global.z]);
If(Global.wallId[Global.z] == 1 || Global.wallId[Global.z] == 3);
If((Dot Product(Direction Towards(Global.allPositions[Global.z], Event Player.lastSavedPosition), Global.allDirections[Global.z])
> 0) != (Dot Product(Direction Towards(Global.allPositions[Global.z], Event Player.fullBodyPosition),
Global.allDirections[Global.z]) > 0));
Event Player.intersectionLength = Dot Product(Global.allPositions[Global.z] - Event Player.fullBodyPosition,
Global.allDirections[Global.z]) / Dot Product(Direction Towards(Event Player.lastSavedPosition, Event Player.fullBodyPosition),
Global.allDirections[Global.z]);
Event Player.previousPositionIntersection = Event Player.fullBodyPosition + Direction Towards(Event Player.lastSavedPosition,
Event Player.fullBodyPosition) * Vector(1, Empty Array, 1) * Event Player.intersectionLength;
If(Dot Product(Direction Towards(Global.firstPosition[Global.z], Vector(X Component Of(Global.secondPosition[Global.z]),
Y Component Of(Global.firstPosition[Global.z]), Z Component Of(Global.secondPosition[Global.z]))), Direction Towards(
Global.firstPosition[Global.z], Event Player.previousPositionIntersection)) >= 0 && Dot Product(Direction Towards(
Global.firstPosition[Global.z], Vector(X Component Of(Global.firstPosition[Global.z]), Y Component Of(
Global.secondPosition[Global.z]), Z Component Of(Global.firstPosition[Global.z]))), Direction Towards(
Global.firstPosition[Global.z], Event Player.previousPositionIntersection)) >= 0 && Dot Product(Direction Towards(
Global.secondPosition[Global.z], Vector(X Component Of(Global.secondPosition[Global.z]), Y Component Of(
Global.firstPosition[Global.z]), Z Component Of(Global.secondPosition[Global.z]))), Direction Towards(
Global.secondPosition[Global.z], Event Player.previousPositionIntersection)) >= 0 && Dot Product(Direction Towards(
Global.secondPosition[Global.z], Vector(X Component Of(Global.firstPosition[Global.z]), Y Component Of(
Global.secondPosition[Global.z]), Z Component Of(Global.firstPosition[Global.z]))), Direction Towards(
Global.secondPosition[Global.z], Event Player.previousPositionIntersection)) >= 0);
Cancel Primary Action(Event Player);
Teleport(Event Player, Event Player.previousPositionIntersection + Direction Towards(Event Player.previousPositionIntersection,
Event Player.lastSavedPosition) * Vector(1, Empty Array, 1) * 2);
End;
End;
End;
Event Player.thickness = 0;
If(Global.wallId[Global.z] == 5);
Event Player.thickness = 4;
Else;
Event Player.thickness = 1;
End;
If(Distance Between(Event Player.fullBodyPosition, Event Player.filterPosition) <= Event Player.thickness && Dot Product(
Direction Towards(Global.firstPosition[Global.z], Vector(X Component Of(Global.secondPosition[Global.z]), Y Component Of(
Global.firstPosition[Global.z]), Z Component Of(Global.secondPosition[Global.z]))), Direction Towards(
Global.firstPosition[Global.z], Event Player.filterPosition)) >= 0 && Dot Product(Direction Towards(
Global.firstPosition[Global.z], Vector(X Component Of(Global.firstPosition[Global.z]), Y Component Of(
Global.secondPosition[Global.z]), Z Component Of(Global.firstPosition[Global.z]))), Direction Towards(
Global.firstPosition[Global.z], Event Player.filterPosition)) >= 0 && Dot Product(Direction Towards(
Global.secondPosition[Global.z], Vector(X Component Of(Global.secondPosition[Global.z]), Y Component Of(
Global.firstPosition[Global.z]), Z Component Of(Global.secondPosition[Global.z]))), Direction Towards(
Global.secondPosition[Global.z], Event Player.filterPosition)) >= 0 && Dot Product(Direction Towards(
Global.secondPosition[Global.z], Vector(X Component Of(Global.firstPosition[Global.z]), Y Component Of(
Global.secondPosition[Global.z]), Z Component Of(Global.firstPosition[Global.z]))), Direction Towards(
Global.secondPosition[Global.z], Event Player.filterPosition)) >= 0);
If(!Global.isGrounded);
Set Gravity(Event Player, 100);
End;
If(Event Player.activeWall[Global.z] == False);
Event Player.activeWall[Global.z] = 1;
If((Global.wallId[Global.z] == 1 || Global.wallId[Global.z] == 3) && Global.isGrounded == False);
Set Gravity(Event Player, 100);
Else If(Global.wallId[Global.z] == 5);
Disable Movement Collision With Environment(Event Player, False);
End;
End;
If(Global.wallId[Global.z] == 1);
Apply Impulse(Event Player, Direction Towards(Event Player.filterPosition, Event Player.fullBodyPosition) * Vector(1, Empty Array,
1), 0.001, To World, Cancel Contrary Motion);
Set Move Speed(Event Player, 100 - Dot Product(Direction Towards(Eye Position(Event Player), Eye Position(Event Player)
+ World Vector Of(Throttle Of(Event Player), Event Player, Rotation)), Direction Towards(Event Player.filterPosition,
Event Player.fullBodyPosition) * -1) * 100);
Else If(Global.wallId[Global.z] == 3);
Apply Impulse(Event Player, Direction Towards(Event Player.filterPosition, Event Player.fullBodyPosition), Speed Of(Event Player),
To World, Cancel Contrary Motion);
End;
Else;
Event Player.activeWall[Global.z] = 0;
Set Move Speed(Event Player, 100);
End;
End;
End;
Loop;
}
}
rule("Reset")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Count Of(Filtered Array(Event Player.activeWall, Current Array Element != 0)) == 0;
}
actions
{
Enable Movement Collision With Environment(Event Player);
}
}
rule("Wall Data")
{
event
{
Ongoing - Global;
}
actions
{
Global.allPositions = Array(Vector(155.968, 12.470, -30.507), Vector(155.962, 12.472, -62.500), Vector(81.153, 6.453, -103.851),
Vector(69.148, 6.474, -104.548));
Global.allDirections = Array(Vector(-1, 0, -0.002), Vector(1, 0, -0.001), Vector(0, 0, 1), Vector(0.001, 0, 1));
Global.firstPosition = Array(Vector(155.971, 11.047, -31.771), Vector(155.964, 11.050, -61.229), Vector(79.761, 5.030, -103.852),
Vector(67.738, 5.022, -104.547));
Global.secondPosition = Array(Vector(155.965, 13.894, -29.242), Vector(155.960, 13.894, -63.771), Vector(82.544, 7.876, -103.851),
Vector(70.558, 7.925, -104.550));
Global.firstPoint = Array(Vector(155.971, 13.894, -31.771), Vector(155.964, 13.894, -61.229), Vector(79.761, 7.876, -103.852),
Vector(67.738, 7.925, -104.547));
Global.secondPoint = Array(Vector(155.965, 11.047, -29.242), Vector(155.960, 11.050, -63.771), Vector(82.544, 5.030, -103.851),
Vector(70.558, 5.022, -104.550));
Global.z = 3;
Global.beamType = Array(1, 1, 1, 1);
Global.showWalls = True;
Global.wallId = Array(5, 5, 5, 5);
}
}
disabled rule("NEW SHOP")
{
event
{
Ongoing - Global;
}
}
rule("Setting Shop Position")
{
event
{
Ongoing - Global;
}
actions
{
Global.shopCamPosition = 900 * Up;
Global.shopPositionAngle[1] = Direction From Angles(Horizontal Angle From Direction(Forward), Vertical Angle From Direction(
Forward) - 90);
Global.shopPositionAngle[0] = Cross Product(Global.shopPositionAngle[1], Forward);
Global.shopBasePosition = Global.shopCamPosition - 9 * Global.shopPositionAngle[1] + 142 * Forward;
}
}
rule("Create Shop Buttons")
{
event
{
Ongoing - Global;
}
actions
{
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]), Custom String(
"┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃"),
Global.shopBasePosition - 41 * Global.shopPositionAngle[1] + 90 * Global.shopPositionAngle[0], 2.500, Do Not Clip, Visible To,
Color(White), Default Visibility);
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]), Custom String(
"┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃"),
Global.shopBasePosition - 41 * Global.shopPositionAngle[1] - 90 * Global.shopPositionAngle[0], 2.500, Do Not Clip, Visible To,
Color(White), Default Visibility);
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]), Custom String("Refund"),
Global.shopBasePosition + 45 * Global.shopPositionAngle[1] + 67.500 * Global.shopPositionAngle[0], 3, Do Not Clip, Visible To,
Color(Green), Default Visibility);
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]), Custom String("[{0}] Leave",
Input Binding String(Button(Reload))),
Global.shopBasePosition + 45 * Global.shopPositionAngle[1] - 67.500 * Global.shopPositionAngle[0], 3, Do Not Clip,
Visible To and String, Color(Green), Default Visibility);
Create In-World Text(Local Player.isInMenu[0] ? Local Player : Empty Array, Custom String("{0}$\n", Local Player.money[0]),
Global.shopBasePosition + 36.500 * Global.shopPositionAngle[1], 3, Do Not Clip, Visible To and String, Color(White),
Default Visibility);
Create In-World Text(Local Player.isInMenu[0] ? Local Player : Empty Array, Custom String("▲"), Update Every Frame(
Global.shopBasePosition - (4 + Vertical Facing Angle Of(Local Player))
* Global.shopPositionAngle[1] + Horizontal Facing Angle Of(Local Player) * Global.shopPositionAngle[0]), 4, Do Not Clip,
Visible To Position and Color, Custom Color(245 + 10 * Sine From Radians(4 * Total Time Elapsed), 205 + 50 * Sine From Radians(
4 * Total Time Elapsed), 200 * Sine From Radians(4 * Total Time Elapsed), 255), Default Visibility);
"Headhunter"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]),
Local Player.abilities[1] ? Custom String("Headhunter II\n800$") : Custom String("Headhunter I\n800$"),
Global.shopBasePosition + 20 * Global.shopPositionAngle[1] + 67.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.abilities[1] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Ambush"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]),
Local Player.abilities[2] ? Custom String("Ambush II\n 800$") : Custom String("Ambush I\n 800$"),
Global.shopBasePosition - 2.500 * Global.shopPositionAngle[1] + 67.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.abilities[2] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Quick Fix"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]),
Local Player.abilities[3] ? Custom String("Quick Fix II\n 700$") : Custom String("Quick Fix I\n 700$"),
Global.shopBasePosition - 25 * Global.shopPositionAngle[1] + 67.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.abilities[3] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Heavyweight"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]),
Local Player.abilities[4] ? Custom String("Heavyweight II\n1000$") : Custom String("Heavyweight I\n1000$"),
Global.shopBasePosition - 47.500 * Global.shopPositionAngle[1] + 67.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.abilities[4] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Charged"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]),
Local Player.abilities[5] ? Custom String("Charged II\n 700$") : Custom String("Charged I\n 700$"),
Global.shopBasePosition + 20 * Global.shopPositionAngle[1] + 22.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.abilities[5] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Haste"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]),
Local Player.abilities[6] ? Custom String("Haste II\n 700$") : Custom String("Haste I\n 700$"),
Global.shopBasePosition - 2.500 * Global.shopPositionAngle[1] + 22.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.abilities[6] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Heavy Impact"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]),
Local Player.abilities[7] ? Custom String("Heavy Impact II\n1000$") : Custom String("Heavy Impact I\n1000$"),
Global.shopBasePosition - 25 * Global.shopPositionAngle[1] + 22.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.abilities[7] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Hero Talent 1"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]), Custom String(
"Hero Talent 1\n1200$"),
Global.shopBasePosition - 47.500 * Global.shopPositionAngle[1] + 22.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.abilities[8] < 1 ? Color(Green) : Color(Gray), Default Visibility);
"Second Wind"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]),
Local Player.abilities[9] ? Custom String("Second Wind II\n 900$") : Custom String("Second Wind I\n 900$"),
Global.shopBasePosition + 20 * Global.shopPositionAngle[1] - 22.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.abilities[9] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Binding Heal"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]),
Local Player.abilities[10] ? Custom String("Binding Heal II\n 700$") : Custom String("Binding Heal I\n 700$"),
Global.shopBasePosition - 2.500 * Global.shopPositionAngle[1] - 22.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.abilities[10] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Resilience"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]),
Local Player.abilities[11] ? Custom String("Resilience II\n 800$") : Custom String("Resilience I\n 800$"),
Global.shopBasePosition - 25 * Global.shopPositionAngle[1] - 22.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.abilities[11] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Hero Talent 2"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]), Custom String(
"Hero Talent 2\n1200$"),
Global.shopBasePosition - 47.500 * Global.shopPositionAngle[1] - 22.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.abilities[12] < 1 ? Color(Green) : Color(Gray), Default Visibility);
"PlusDamage"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]), Custom String("+5% Damage\n400$"),
Global.shopBasePosition + 20 * Global.shopPositionAngle[1] - 67.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Color(Green), Default Visibility);
"PlusHealth"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]), Custom String(
"+5% Health\n 400$"),
Global.shopBasePosition - 2.500 * Global.shopPositionAngle[1] - 67.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Color(Green), Default Visibility);
"PlusHealing"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]), Custom String("+5% Healing\n400$"),
Global.shopBasePosition - 25 * Global.shopPositionAngle[1] - 67.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To and String, Color(Green), Default Visibility);
"PlusHealing"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu[0]), Custom String(
"+{0} Auto-Repair\n 400$", Global.upgradeGateMaxHealthValue >= Global.upgradeGateMaxHealthMaxValue[2] ? 10 : 5),
Global.shopBasePosition - 47.500 * Global.shopPositionAngle[1] - 67.500 * Global.shopPositionAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Global.automaticRepair < 5 ? Color(Green) : Color(Gray), Default Visibility);
"Use Update Every Frame to avoid showing the String when the cursor is out of bounds, resulting in 0\r\n ROW 0"
Create In-World Text(Update Every Frame(Local Player.isInMenu[0] && Absolute Value(Horizontal Facing Angle Of(Local Player))
< 90 && Absolute Value(Vertical Facing Angle Of(Local Player) + 11.250) < 47.500 ? Local Player : Empty Array),
Update Every Frame(Vertical Facing Angle Of(Local Player) < -33.750 ? Array(Custom String("Leave Buy Menu\n"), Custom String(
""), Custom String(""), Custom String("Refund your money\n"))[Round To Integer((Horizontal Facing Angle Of(Local Player) + 90)
/ 45, Down)] : Custom String("")), Global.shopBasePosition - 75 * Global.shopPositionAngle[1], 2.500, Do Not Clip,
Visible To and String, Color(White), Default Visibility);
"ROW 1"
Create In-World Text(Update Every Frame(Local Player.isInMenu[0] && Absolute Value(Horizontal Facing Angle Of(Local Player))
< 90 && Absolute Value(Vertical Facing Angle Of(Local Player) + 11.250) < 22.500 ? Local Player : Empty Array),
Update Every Frame(Vertical Facing Angle Of(Local Player) < -11.250 ? Array(Custom String("Increase your damage by 5%\n"),
Local Player.abilities[9] ? Custom String(
"Second Wind II: 60% chance to revive yourself after going down\nThis cannot occur more than once every 30 seconds")
: Custom String(
"Second Wind I: 30% chance to revive yourself after going down\n This cannot occur more than once every 30 seconds"),
Local Player.abilities[5] ? Custom String("Charged II: Ultimates cost 40% less\n") : Custom String(
"Charged I: Ultimates cost 20% less\n"), Local Player.abilities[1] ? Custom String(
"Headhunter II: Critical hits deal 60% more damage\n") : Custom String("Headhunter I: Critical hits deal 30% more damage\n"))
[Round To Integer((Horizontal Facing Angle Of(Local Player) + 90) / 45, Down)] : Custom String("")),
Global.shopBasePosition - 75 * Global.shopPositionAngle[1], 2.500, Do Not Clip, Visible To and String, Color(White),
Default Visibility);
"ROW 2"
Create In-World Text(Update Every Frame(Local Player.isInMenu[0] && Absolute Value(Horizontal Facing Angle Of(Local Player))
< 90 && Absolute Value(Vertical Facing Angle Of(Local Player) - 36.250) < 47.500 ? Local Player : Empty Array),
Update Every Frame(Vertical Facing Angle Of(Local Player) < 11.250 ? Array(Custom String("Increase your health by 5%\n"),
Local Player.abilities[10] ? Custom String("Binding Heal II: Heal yourself for 50% the amount when healing allies\n")
: Custom String("Binding Heal I: Heal yourself for 25% the amount when healing allies\n"),
Local Player.abilities[6] ? Custom String(
" Haste II: Ability cooldown is reduced by 50%\nDoes not affect abilities with multiple charges") : Custom String(
" Haste I: Ability cooldown is reduced by 25%\nDoes not affect abilities with multiple charges"),
Local Player.abilities[2] ? Custom String("Ambush II: Deal 60% more damage when attacking enemies from behind or above\n")
: Custom String("Ambush I: Deal 30% more damage when attacking enemies from behind or above\n"))[Round To Integer((
Horizontal Facing Angle Of(Local Player) + 90) / 45, Down)] : Custom String("")),
Global.shopBasePosition - 75 * Global.shopPositionAngle[1], 2.500, Do Not Clip, Visible To and String, Color(White),
Default Visibility);
"ROW 3"
Create In-World Text(Update Every Frame(Local Player.isInMenu[0] && Absolute Value(Horizontal Facing Angle Of(Local Player))
< 90 && Absolute Value(Vertical Facing Angle Of(Local Player) - 83.750) < 72.500 ? Local Player : Empty Array),
Update Every Frame(Vertical Facing Angle Of(Local Player) < 33.750 ? Array(Custom String("Increase your healing by 5%\n"),
Local Player.abilities[11] ? Custom String("Resilience II: Take 30% less damage while below 60% health\n") : Custom String(
"Resilience I: Take 30% less damage while below 30% health\n"), Local Player.abilities[7] ? Custom String(
"Heavy Impact II: Every hit has a chance to stun the enemy for 2 seconds\n") : Custom String(
"Heavy Impact I: Every hit has a chance to stun the enemy for 1 second\n"), Local Player.abilities[3] ? Custom String(
"Quick Fix II: Eliminations restore 100 HP and shortly increase speed by 40%\n") : Custom String(
"Quick Fix I: Eliminations restore 50 HP and shortly increase speed by 20%\n"))[Round To Integer((Horizontal Facing Angle Of(
Local Player) + 90) / 45, Down)] : Custom String("")), Global.shopBasePosition - 75 * Global.shopPositionAngle[1], 2.500,
Do Not Clip, Visible To and String, Color(White), Default Visibility);
"ROW 4"
Create In-World Text(Update Every Frame(Local Player.isInMenu[0] && Absolute Value(Horizontal Facing Angle Of(Local Player))
< 90 && Absolute Value(Vertical Facing Angle Of(Local Player) - 133) < 99.250 ? Local Player : Empty Array),
Update Every Frame(Vertical Facing Angle Of(Local Player) < 56.250 ? Array(Custom String(
"Increase your auto-repair by {0}/5s\n", Global.upgradeGateMaxHealthValue >= Global.upgradeGateMaxHealthMaxValue[2] ? 10 : 5),
Custom String("{0}", Local Player.heroTalentText[2][1]), Custom String("{0}", Local Player.heroTalentText[1][1]),
Local Player.abilities[4] ? Custom String(
"Heavyweight II: Your knock back attacks deal 50% more damage and knock back\nYou receive 33% less knock back")
: Custom String(
"Heavyweight I: Your knock back attacks deal 25% more damage and knock back\nYou receive 20% less knock back"))
[Round To Integer((Horizontal Facing Angle Of(Local Player) + 90) / 45, Down)] : Custom String("")),
Global.shopBasePosition - 75 * Global.shopPositionAngle[1], 2.500, Do Not Clip, Visible To and String, Color(White),
Default Visibility);
}
}
rule("Toggle Shop")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
!Is Dummy Bot(Event Player) == True;
Is Button Held(Event Player, Button(Reload)) == True;
!Is Communicating Any Emote(Event Player) == True;
}
actions
{
If(Event Player.isInMenu[0] == False);
Wait Until(!Is Button Held(Event Player, Button(Reload)), 0.500);
If(!Is Button Held(Event Player, Button(Reload)));
Abort;
End;
End;
Event Player.isInMenu[0] = !Event Player.isInMenu[0];
}
}
rule("Open Shop")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.isInMenu[0] == True;
}
actions
{
Event Player.playerFacing = Facing Direction Of(Event Player);
Start Camera(Event Player, Global.shopCamPosition, Global.shopCamPosition + Forward, 0);
Disable Hero HUD(Event Player);
Call Subroutine(DisablePlayer);
Set Aim Speed(Event Player, 200);
}
}
rule("Close Shop")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.isInMenu[0] == False;
}
actions
{
Stop Camera(Event Player);
Enable Hero HUD(Event Player);
Call Subroutine(EnablePlayer);
Set Aim Speed(Event Player, 100);
Set Facing(Event Player, Event Player.playerFacing, To World);
}
}
rule("Subroutine: Disable Player")
{
event
{
Subroutine;
DisablePlayer;
}
actions
{
Start Forcing Throttle(Event Player, 0, 0, 0, 0, 0, 0);
Set Primary Fire Enabled(Event Player, False);
Set Secondary Fire Enabled(Event Player, False);
Set Ability 1 Enabled(Event Player, False);
Set Ability 2 Enabled(Event Player, False);
Set Melee Enabled(Event Player, False);
Set Jump Enabled(Event Player, False);
Set Crouch Enabled(Event Player, False);
Disallow Button(Event Player, Button(Ultimate));
}
}
rule("Subroutine: Enable Player")
{
event
{
Subroutine;
EnablePlayer;
}
actions
{
Stop Forcing Throttle(Event Player);
Set Primary Fire Enabled(Event Player, True);
Set Secondary Fire Enabled(Event Player, True);
Set Ability 1 Enabled(Event Player, True);
Set Ability 2 Enabled(Event Player, True);
Set Melee Enabled(Event Player, True);
Set Jump Enabled(Event Player, True);
Set Crouch Enabled(Event Player, True);
Allow Button(Event Player, Button(Ultimate));
}
}
rule("Buy Ability")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.isInMenu[0] == True;
Is Button Held(Event Player, Button(Primary Fire)) == True;
(Absolute Value(Horizontal Facing Angle Of(Event Player)) < 90 && Absolute Value(Vertical Facing Angle Of(Event Player))
+ 11.250 < 67) == True;
}
actions
{
"ROW 0"
If(Vertical Facing Angle Of(Event Player) < -33.750);
"LEAVE SHOP"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
Event Player.isInMenu[0] = !Event Player.isInMenu[0];
"REFUND"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.money[1] != 0);
Call Subroutine(Refund);
Else;
Small Message(Local Player, Custom String("You don't have anything to refund!"));
End;
End;
"ROW 1"
Else If(Vertical Facing Angle Of(Event Player) < -11.250);
"+5% DAMAGE"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.money[0] >= 400);
Event Player.money[0] -= 400;
Event Player.money[1] += 400;
Event Player.abilities[13] += 1;
Call Subroutine(UpdatePlayerStats);
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
"SECOND WIND"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.abilities[9] != 2);
If(Event Player.money[0] >= 900);
Event Player.money[0] -= 900;
Event Player.money[1] += 900;
Event Player.abilities[9] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"CHARGED"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.abilities[5] != 2);
If(Event Player.money[0] >= 700);
Event Player.money[0] -= 700;
Event Player.money[1] += 700;
Event Player.abilities[5] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"HEADHUNTER"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.abilities[1] != 2);
If(Event Player.money[0] >= 800);
Event Player.money[0] -= 800;
Event Player.money[1] += 800;
Event Player.abilities[1] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
End;
"ROW 2"
Else If(Vertical Facing Angle Of(Event Player) < 11.250);
"+5% HEALTH"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.money[0] >= 400);
Event Player.money[0] -= 400;
Event Player.money[1] += 400;
Event Player.abilities[14] += 1;
Call Subroutine(UpdatePlayerStats);
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
"BINDING HEAL"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.abilities[10] != 2);
If(Event Player.money[0] >= 700);
Event Player.money[0] -= 700;
Event Player.money[1] += 700;
Event Player.abilities[10] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"HASTE"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.abilities[6] != 2);
If(Event Player.money[0] >= 700);
Event Player.money[0] -= 700;
Event Player.money[1] += 700;
Event Player.abilities[6] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"AMBUSH"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.abilities[2] != 2);
If(Event Player.money[0] >= 800);
Event Player.money[0] -= 800;
Event Player.money[1] += 800;
Event Player.abilities[2] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
End;
"ROW 3"
Else If(Vertical Facing Angle Of(Event Player) < 33.750);
"+5% HEALING"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.money[0] >= 400);
Event Player.money[0] -= 400;
Event Player.money[1] += 400;
Event Player.abilities[15] += 1;
Call Subroutine(UpdatePlayerStats);
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
"RESILIENCE"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.abilities[11] != 2);
If(Event Player.money[0] >= 800);
Event Player.money[0] -= 800;
Event Player.money[1] += 800;
Event Player.abilities[11] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"HEAVY IMPACT"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.abilities[7] != 2);
If(Event Player.money[0] >= 1000);
Event Player.money[0] -= 1000;
Event Player.money[1] += 1000;
Event Player.abilities[7] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"QUICK FIX"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.abilities[3] != 2);
If(Event Player.money[0] >= 700);
Event Player.money[0] -= 700;
Event Player.money[1] += 700;
Event Player.abilities[3] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
End;
"ROW 4"
Else If(Vertical Facing Angle Of(Event Player) < 56.250);
"+5 AUTO-REPAIR"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Global.automaticRepair != 5);
If(Event Player.money[0] >= 400);
Event Player.money[0] -= 400;
Event Player.money[1] += 400;
Global.automaticRepair += 1;
Event Player.abilities[16] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"HERO TALENT 2"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.abilities[12] != 1);
If(Event Player.money[0] >= 1200);
Event Player.money[0] -= 1200;
Event Player.money[1] += 1200;
Event Player.abilities[12] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"HERO TALENT 1"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.abilities[8] != 1);
If(Event Player.money[0] >= 1200);
Event Player.money[0] -= 1200;
Event Player.money[1] += 1200;
Event Player.abilities[8] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"HEAVYWEIGHT"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.abilities[4] != 2);
If(Event Player.money[0] >= 1000);
Event Player.money[0] -= 1000;
Event Player.money[1] += 1000;
Event Player.abilities[4] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
End;
End;
}
}
rule("Refund Single Ability")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.isInMenu[0] == True;
Is Button Held(Event Player, Button(Secondary Fire)) == True;
(Absolute Value(Horizontal Facing Angle Of(Event Player)) < 90 && Absolute Value(Vertical Facing Angle Of(Event Player))
+ 11.250 < 67) == True;
}
actions
{
"ROW 0"
If(Vertical Facing Angle Of(Event Player) < -33.750);
"LEAVE SHOP"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
"REFUND"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
End;
"ROW 1"
Else If(Vertical Facing Angle Of(Event Player) < -11.250);
"+5% DAMAGE"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.abilities[13] != 0);
Event Player.money[0] += 400;
Event Player.money[1] -= 400;
Event Player.abilities[13] -= 1;
Call Subroutine(UpdatePlayerStats);
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"SECOND WIND"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.abilities[9] != 0);
Event Player.money[0] += 900;
Event Player.money[1] -= 900;
Event Player.abilities[9] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"CHARGED"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.abilities[5] != 0);
Event Player.money[0] += 700;
Event Player.money[1] -= 700;
Event Player.abilities[5] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"HEADHUNTER"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.abilities[1] != 0);
Event Player.money[0] += 800;
Event Player.money[1] -= 800;
Event Player.abilities[1] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
End;
"ROW 2"
Else If(Vertical Facing Angle Of(Event Player) < 11.250);
"+5% HEALTH"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.abilities[14] != 0);
Event Player.money[0] += 400;
Event Player.money[1] -= 400;
Event Player.abilities[14] -= 1;
Call Subroutine(UpdatePlayerStats);
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"BINDING HEAL"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.abilities[10] != 0);
Event Player.money[0] += 700;
Event Player.money[1] -= 700;
Event Player.abilities[10] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"HASTE"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.abilities[6] != 0);
Event Player.money[0] += 700;
Event Player.money[1] -= 700;
Event Player.abilities[6] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"AMBUSH"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.abilities[2] != 0);
Event Player.money[0] += 800;
Event Player.money[1] -= 800;
Event Player.abilities[2] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
End;
"ROW 3"
Else If(Vertical Facing Angle Of(Event Player) < 33.750);
"+5% HEALING"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.abilities[15] != 0);
Event Player.money[0] += 400;
Event Player.money[1] -= 400;
Event Player.abilities[15] -= 1;
Call Subroutine(UpdatePlayerStats);
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"RESILIENCE"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.abilities[11] != 0);
Event Player.money[0] += 800;
Event Player.money[1] -= 800;
Event Player.abilities[11] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"HEAVY IMPACT"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.abilities[7] != 0);
Event Player.money[0] += 1000;
Event Player.money[1] -= 1000;
Event Player.abilities[7] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"QUICK FIX"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.abilities[3] != 0);
Event Player.money[0] += 700;
Event Player.money[1] -= 700;
Event Player.abilities[3] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
End;
"ROW 4"
Else If(Vertical Facing Angle Of(Event Player) < 56.250);
"+5 AUTO-REPAIR"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.abilities[16] != 0);
Event Player.money[0] += 400;
Event Player.money[1] -= 400;
Global.automaticRepair -= 1;
Event Player.abilities[16] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"HERO TALENT 2"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.abilities[12] != 0);
Event Player.money[0] += 1200;
Event Player.money[1] -= 1200;
Event Player.abilities[12] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"HERO TALENT 1"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.abilities[8] != 0);
Event Player.money[0] += 1200;
Event Player.money[1] -= 1200;
Event Player.abilities[8] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"HEAVYWEIGHT"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.abilities[4] != 0);
Event Player.money[0] += 1000;
Event Player.money[1] -= 1000;
Event Player.abilities[4] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
End;
End;
}
}
rule("Create Player HUD")
{
event
{
Player Joined Match;
Team 1;
All;
}
actions
{
Create HUD Text(All Players(Team 1), Custom String("{0}", Hero Icon String(Hero Of(Event Player))), Custom String("{0}{1}",
Event Player, Event Player.isInMenu[0] ? Custom String("(In Shop)") : Custom String("")), Custom String("{0}{1}", Is Alive(
Event Player) ? Custom String("{0} HP", Round To Integer(Health(Event Player), Up)) : Custom String("Dead"), Custom String(
", {0}$", Event Player.money)), Left, Local Player == Event Player ? -1 : Slot Of(Event Player), Is Dead(Event Player) ? Color(
Red) : (Health(Event Player) > Max Health(Event Player) * 0.500 ? Color(Green) : Color(Orange)), Is Dead(Event Player) ? Color(
Red) : (Health(Event Player) > Max Health(Event Player) * 0.500 ? Color(Green) : Color(Orange)), Is Dead(Event Player) ? Color(
Red) : (Health(Event Player) > Max Health(Event Player) * 0.500 ? Color(Green) : Color(Orange)),
Visible To Sort Order String and Color, Default Visibility);
Create HUD Text(Event Player.damageBoost[0] != 0 ? Event Player : Null, Null, Custom String("+{0}% Damage",
Event Player.damageBoost[0]), Null, Left, 913, Color(Green), Color(Green), Color(Green), Visible To and String,
Default Visibility);
Create HUD Text(Event Player.abilities[9] ? Event Player : Null, Null, Custom String("Second Wind {0}",
Event Player.abilities[9] == 1 ? Custom String("I") : Custom String("II")), Null, Left, 908, Color(Green), Color(Green), Color(
Green), Visible To and String, Default Visibility);
Create HUD Text(Event Player.abilities[5] ? Event Player : Null, Null, Custom String("Charged {0}",
Event Player.abilities[5] == 1 ? Custom String("I") : Custom String("II")), Null, Left, 905, Color(Green), Color(Green), Color(
Green), Visible To and String, Default Visibility);
Create HUD Text(Event Player.abilities[1] ? Event Player : Null, Null, Custom String("Headhunter {0}",
Event Player.abilities[1] == 1 ? Custom String("I") : Custom String("II")), Null, Left, 901, Color(Green), Color(Green), Color(
Green), Visible To and String, Default Visibility);
Create HUD Text(Event Player.playerHealth != 0 ? Event Player : Null, Null, Custom String("+{0}% Health",
Event Player.playerHealth), Null, Left, 914, Color(Green), Color(Green), Color(Green), Visible To and String,
Default Visibility);
Create HUD Text(Event Player.abilities[10] ? Event Player : Null, Null, Custom String("Binding Heal {0}",
Event Player.abilities[10] == 1 ? Custom String("I") : Custom String("II")), Null, Left, 909, Color(Green), Color(Green), Color(
Green), Visible To and String, Default Visibility);
Create HUD Text(Event Player.abilities[6] ? Event Player : Null, Null, Custom String("Haste {0}",
Event Player.abilities[6] == 1 ? Custom String("I") : Custom String("II")), Null, Left, 906, Color(Green), Color(Green), Color(
Green), Visible To and String, Default Visibility);
Create HUD Text(Event Player.abilities[2] ? Event Player : Null, Null, Custom String("Ambush {0}",
Event Player.abilities[2] == 1 ? Custom String("I") : Custom String("II")), Null, Left, 902, Color(Green), Color(Green), Color(
Green), Visible To and String, Default Visibility);
Create HUD Text(Event Player.healBoost[0] != 0 ? Event Player : Null, Null, Custom String("+{0}% Healing",
Event Player.healBoost[0]), Null, Left, 915, Color(Green), Color(Green), Color(Green), Visible To and String,
Default Visibility);
Create HUD Text(Event Player.speedBoost != 0 ? Event Player : Null, Null, Custom String("+{0}% Movement Speed",
Event Player.speedBoost), Null, Left, 915, Color(Green), Color(Green), Color(Green), Visible To and String, Default Visibility);
Create HUD Text(Event Player.abilities[11] ? Event Player : Null, Null, Custom String("Resilience {0}",
Event Player.abilities[11] == 1 ? Custom String("I") : Custom String("II")), Null, Left, 910, Color(Green), Color(Green), Color(
Green), Visible To and String, Default Visibility);
Create HUD Text(Event Player.abilities[7] ? Event Player : Null, Null, Custom String("Heavy Impact {0}",
Event Player.abilities[7] == 1 ? Custom String("I") : Custom String("II")), Null, Left, 907, Color(Green), Color(Green), Color(
Green), Visible To and String, Default Visibility);
Create HUD Text(Event Player.abilities[3] ? Event Player : Null, Null, Custom String("Quick Fix {0}",
Event Player.abilities[3] == 1 ? Custom String("I") : Custom String("II")), Null, Left, 903, Color(Green), Color(Green), Color(
Green), Visible To and String, Default Visibility);
Create HUD Text(Global.automaticRepair ? Event Player : Null, Null, Custom String("{0} total Auto-Repair/5s",
Global.automaticRepair * (Global.upgradeGateMaxHealthValue >= Global.upgradeGateMaxHealthMaxValue[2] ? 10 : 5)), Null, Left, 916,
Color(Green), Color(Green), Color(Green), Visible To and String, Default Visibility);
Create HUD Text(Event Player.abilities[12] ? Event Player : Null, Null, Custom String("{0} {1}",
Event Player.heroTalentText[2][0], Event Player.heroTalentText[2][1]), Null, Top, 902, Color(Green), Color(Green), Color(Green),
Visible To and String, Default Visibility);
Create HUD Text(Event Player.abilities[12] ? Event Player : Null, Null, Custom String("Hero Talent 2"), Null, Left, 912, Color(
Green), Color(Green), Color(Green), Visible To and String, Default Visibility);
Create HUD Text(Event Player.abilities[8] ? Event Player : Null, Null, Custom String("{0} {1}",
Event Player.heroTalentText[1][0], Event Player.heroTalentText[1][1]), Null, Top, 901, Color(Green), Color(Green), Color(Green),
Visible To and String, Default Visibility);
Create HUD Text(Event Player.abilities[8] ? Event Player : Null, Null, Custom String("Hero Talent 1"), Null, Left, 911, Color(
Green), Color(Green), Color(Green), Visible To and String, Default Visibility);
Create HUD Text(Event Player.abilities[4] ? Event Player : Null, Null, Custom String("Heavyweight {0}",
Event Player.abilities[4] == 1 ? Custom String("I") : Custom String("II")), Null, Left, 904, Color(Green), Color(Green), Color(
Green), Visible To and String, Default Visibility);
}
}
rule("Boss Rotation")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.activeBoss == True;
}
actions
{
If(Global.bossRotation == 0 || Global.bossRotation == 3);
Global.bossRotation = 1;
Global.lastBoss[1] = Hero Of(Global.activeBoss);
Else If(Global.bossRotation == 1);
Global.bossRotation = 2;
Global.lastBoss[2] = Hero Of(Global.activeBoss);
Else If(Global.bossRotation == 2);
Global.bossRotation = 3;
Global.lastBoss[3] = Hero Of(Global.activeBoss);
End;
}
}
rule("BOSS HUD")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.timeMinutes == 10;
}
actions
{
Create HUD Text(All Players(Team 1), Null, Global.activeBoss ? Custom String("Boss: {0}, HP: {1}/{2}", Hero Of(Global.activeBoss),
Health(Global.activeBoss), Max Health(Global.activeBoss)) : Custom String(""), Null, Top, 900, Color(White), Color(Red),
Color(White), Visible To and String, Default Visibility);
}
}
rule("DEBUG - SKIP TIME")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Global.isDebug == True;
(Is Button Held(Event Player, Button(Primary Fire)) && Is Button Held(Event Player, Button(Crouch))) == True;
}
actions
{
Global.timeSeconds = 59;
}
}
rule("DEBUG - SKIP TIME")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Global.isDebug == True;
(Is Button Held(Event Player, Button(Secondary Fire)) && Is Button Held(Event Player, Button(Crouch))) == True;
}
actions
{
Global.botEchoRespawnPosition = Vector(130, 23, -44);
}
}
rule("DEBUG COLLECTION - Make Invincible, Show Player Coords")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Global.isDebug == True;
}
actions
{
Create HUD Text(Local Player, Null, Custom String("{0}", Position Of(Event Player)), Null, Left, 0, Color(White), Color(Yellow),
Color(White), Visible To and String, Default Visibility);
Set Status(Event Player, Null, Invincible, 9999);
Set Status(Event Player, Null, Phased Out, 9999);
}
}
rule("OPTIONAL ENDING - CREATE EXFIL POINT")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.challengeCount >= 12;
}
actions
{
Create HUD Text(All Players(Team 1), Null, Custom String("Exfiltration available! (optional - ends the mode)"), Null, Top, 50,
Color(White), Color(Red), Color(White), Visible To and String, Default Visibility);
Global.globalHUDs[1] = Last Text ID;
Create In-World Text(All Players(Team 1), Custom String(
"Exfiltration available! Gather here!\n{0}/{1} Players ready to exfiltrate!", Count Of(Filtered Array(All Players(Team 1),
Distance Between(Vector(186, 11, -46.500), Current Array Element) <= 9)), Count Of(All Players(Team 1))), Vector(186, 15,
-46.500), 1.200, Do Not Clip, Visible To and String, Color(Green), Default Visibility);
Wait(3, Ignore Condition);
Destroy HUD Text(Global.globalHUDs[1]);
}
}
rule("OPTIONAL ENDING - EXFIL PLAYERS")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.challengeCount == 12;
Count Of(Filtered Array(All Players(Team 1), Distance Between(Vector(186, 11, -46.500), All Players(Team 1)) <= 9)) > Count Of(
All Players(Team 1)) / 2;
}
actions
{
Big Message(All Players(Team 1), Custom String("GG! YOU SUCCESSFULLY RAN AWAY, WHILE LEAVING THE GATE TO THE ENEMY!"));
Destroy All Dummy Bots;
Disable Movement Collision With Environment(All Players(Team 1), True);
Start Accelerating(All Players(Team 1), Up, 100, 5, To World, Direction Rate and Max Speed);
Wait(5, Ignore Condition);
Declare Team Victory(Team 1);
}
}
rule("Team 1 (Ability): Second Wind save life")
{
event
{
Player Took Damage;
Team 1;
All;
}
conditions
{
Event Player.abilities[9] == True;
Event Player.secondWindActive == True;
Health(Event Player) == 1;
}
actions
{
Small Message(All Players(All Teams), Custom String("{0} received a second wind!", Event Player));
Play Effect(All Players(Team 1), Good Pickup Effect, Color(Green), Event Player, 1);
Clear Status(Event Player, Unkillable);
Set Player Health(Event Player, Max Health(Event Player));
Event Player.lastSecondWind = 30;
Event Player.secondWindActive = 0;
}
}
rule("Team 1 (Ability): Second Wind after buying")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.abilities[9] == True;
Event Player.secondWindActive == False;
Event Player.lastSecondWind == 0;
}
actions
{
If(Random Integer(1, 100) > Event Player.abilities[9] * 30);
Wait(30, Ignore Condition);
Loop;
End;
Set Status(Event Player, Null, Unkillable, 9999);
Event Player.secondWindActive = 1;
}
}
rule("Team 1 (Ability): Second Wind counter")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
Event Player.lastSecondWind > 0;
}
actions
{
Wait(1, Ignore Condition);
Event Player.lastSecondWind -= 1;
Loop If Condition Is True;
}
}
rule("Team 1: Change Hero")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Distance Between(Vector(159, 11, -46.500), Event Player) <= 2;
Is Button Held(Event Player, Button(Interact)) == True;
}
actions
{
Set Player Allowed Heroes(Event Player, Hero(Pharah));
Set Player Allowed Heroes(Event Player, Hero(Ana));
Reset Player Hero Availability(Event Player);
Wait(0.500, Ignore Condition);
Wait Until(Has Spawned(Event Player), 99999);
Teleport(Event Player, Vector(159, 11, -46.500));
}
}
rule("Team 1: Player Dealt Healing")
{
event
{
Player Dealt Healing;
Team 1;
All;
}
actions
{
Abort If(Healee != Event Player);
If(Event Player.abilities[10] == True);
Set Player Health(Event Player, Health(Event Player) + Event Player.abilities[10] * 0.250 * Event Healing);
End;
}
}
rule("Team 1: Player Dealt Damage")
{
event
{
Player Dealt Damage;
Team 1;
All;
}
actions
{
If(Event Was Critical Hit == True);
If(Global.upgradeCriticalDamageValue >= Global.upgradeCriticalDamageMaxValue[0]);
Damage(Victim, Event Player, Event Damage * 0.500);
End;
If(Event Player.abilities[1] == True);
Damage(Victim, Event Player, Event Damage * Event Player.abilities[1] * 0.400);
End;
End;
If(Event Player.abilities[2] == True && Event Ability != Null && (Y Component Of(Position Of(Event Player)) - Y Component Of(
Position Of(Victim)) >= 3 || Absolute Value(Horizontal Angle Towards(Victim, Event Player)) >= 90) == True);
Damage(Victim, Event Player, Event Damage * Event Player.abilities[2] * 0.300);
End;
If(Global.perk[0] == True && Event Ability != Null && Distance Between(Event Player, Victim) >= 10);
Damage(Victim, Event Player, Event Damage * 0.500);
End;
}
}
rule("▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒【Josbird's Cursor Menu】▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒")
{
event
{
Ongoing - Global;
}
}
rule("Global init")
{
event
{
Ongoing - Global;
}
actions
{
Create HUD Text(Is Game In Progress == False && Host Player.isInMenu[1] ? Host Player : Null, Null, Custom String(
"Cursor Menu created by Josbird {0} Code: GETVX", Ability Icon String(Hero(Mercy), Button(Ultimate))), Null, Right, -100, Color(
White), Color(Turquoise), Color(White), Visible To and String, Default Visibility);
Create HUD Text(Global.timeSeconds == 0 && Global.timeMinutes == 0 && !Host Player.isInMenu[1] ? Host Player : Null, Null, Custom String(
"{0}", Custom String("Press {0} - Crouch to open workshop settings", Input Binding String(Button(Crouch)))), Null, Top,
1, Color(White), Color(Yellow), Color(White), Visible To and String, Default Visibility);
Create HUD Text(Is Game In Progress == False && Host Player.isInMenu[1] ? Host Player : Null, Null, Custom String("{0}", Custom String(
"Press {0} - Primary Fire to increase by X\nPress {1} - Secondary Fire to decrease by X", Input Binding String(Button(
Primary Fire)), Input Binding String(Button(Secondary Fire)))), Null, Right, 1, Color(White), Color(Yellow), Color(
White), Visible To and String, Default Visibility);
Global.extendedGlobalCollection[1] = 10;
Global.extendedGlobalCollection[2] = 5;
Global.extendedGlobalCollection[6] = True;
Global.exitButtonProperties = Array(Custom String("exit menu"), Global.extendedGlobalCollection[1] / 2 - 0.150,
Global.extendedGlobalCollection[2] / 2 - 0.150, 0.350);
}
}
rule("Create a menu button")
{
event
{
Subroutine;
createMenuButton;
}
actions
{
If(Count Of(Event Player.newButton) != 13);
Log To Inspector(Custom String("[CursorMenu.createMenuButton] Error: incorrect number of arguments (got {0}, expected {1})",
Event Player.destroyButtonID, 13));
Else;
Event Player.lastMenuButtonID = Count Of(Event Player.buttons);
Event Player.extendedPlayerCollection[2] = 0;
While(Event Player.extendedPlayerCollection[2] < Count Of(Event Player.buttons));
If(Event Player.buttons[Event Player.extendedPlayerCollection[2]] == Null);
Event Player.lastMenuButtonID = Event Player.extendedPlayerCollection[2];
Event Player.extendedPlayerCollection[2] = Count Of(Event Player.buttons);
End;
Event Player.extendedPlayerCollection[2] += 1;
End;
Event Player.buttons[Event Player.lastMenuButtonID] = Event Player.newButton;
End;
}
}
rule("Destroy a menu button")
{
event
{
Subroutine;
destroyMenuButton;
}
actions
{
If(Event Player.destroyButtonID >= Count Of(Event Player.buttons) || !Event Player.buttons[Event Player.destroyButtonID]);
Log To Inspector(Custom String("[CursorMenu.destroyMenuButton] Error: tried to destroy an invalid button ID ({0})",
Event Player.destroyButtonID));
Else;
Global.arrayBuilder = Event Player.buttons[Event Player.destroyButtonID];
Global.arrayBuilder[15] = True;
Event Player.buttons[Event Player.destroyButtonID] = Global.arrayBuilder;
End;
}
}
rule("Modify a menu button")
{
event
{
Subroutine;
modifyMenuButton;
}
actions
{
If(Count Of(Event Player.buttonModification) % 2 == 0 || Count Of(Event Player.buttonModification) < 3);
Log To Inspector(Custom String("[CursorMenu.modifyMenuButton] Error: incorrect number of arguments ({0})", Count Of(First Of(
Event Player.buttonModification))));
Else If(First Of(Event Player.buttonModification) >= Count Of(Event Player.buttons) || !Event Player.buttons[First Of(
Event Player.buttonModification)]);
Log To Inspector(Custom String("[CursorMenu.modifyMenuButton] Error: tried to modify an invalid button ID ({0})", First Of(
Event Player.buttonModification)));
Else;
Event Player.extendedPlayerCollection[2] = 1;
While(Event Player.extendedPlayerCollection[2] < Count Of(Event Player.buttonModification));
If(
Event Player.buttonModification[Event Player.extendedPlayerCollection[2]] < 0 || Event Player.buttonModification[Event Player.extendedPlayerCollection[2]] >= 13);
Log To Inspector(Custom String("[CursorMenu.modifyMenuButton] Error: tried to modify an invalid property index ({0})", Count Of(
Event Player.buttonModification[Event Player.extendedPlayerCollection[2]])));
Else;
Global.arrayBuilder = Event Player.buttons[First Of(Event Player.buttonModification)];
Global.arrayBuilder[Event Player.buttonModification[Event Player.extendedPlayerCollection[2]]] = Event Player.buttonModification[Event Player.extendedPlayerCollection[2] + 1];
Event Player.buttons[First Of(Event Player.buttonModification)] = Global.arrayBuilder;
End;
Event Player.extendedPlayerCollection[2] += 2;
End;
End;
}
}
rule("Get properties of a menu button")
{
event
{
Subroutine;
getButtonProperties;
}
actions
{
If(Event Player.getProperties >= Count Of(Event Player.buttons) || !Event Player.buttons[Event Player.getProperties]);
Log To Inspector(Custom String("[CursorMenu.getButtonProperties] Error: tried to access an invalid button ID ({0})",
Event Player.getProperties));
Else;
Event Player.getProperties = Array Slice(Event Player.buttons[Event Player.getProperties], 0, 13);
End;
}
}
rule("Toggle menu")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == False;
Event Player == Host Player;
!Is Dummy Bot(Event Player) == True;
Is Button Held(Event Player, Button(Crouch)) == True;
!Is Communicating Any Emote(Event Player) == True;
}
actions
{
Event Player.isInMenu[1] = !Event Player.isInMenu[1];
}
}
rule("Create menu cursor")
{
event
{
Subroutine;
createCursor;
}
actions
{
Create In-World Text(Filtered Array(Event Player, Total Time Elapsed % 0.032 < 0.016), Custom String("▲"), Update Every Frame(
Eye Position(Event Player) + 100 * (Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Horizontal Angle From Direction(Event Player.menuOriginalFacing)) * Cross Product(Facing Direction Of(Event Player),
Direction From Angles(Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Facing Direction Of(Event Player)) - 90)) + (Angle Difference(Vertical Angle From Direction(Facing Direction Of(Event Player)),
Vertical Angle From Direction(Event Player.menuOriginalFacing)) - 0.200) * Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90) + 3 * Facing Direction Of(Event Player))), 3, Do Not Clip, Visible To Position String and Color, Color(
White), Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
Create In-World Text(Filtered Array(Event Player, Total Time Elapsed % 0.032 >= 0.016), Custom String("▲"), Update Every Frame(
Eye Position(Event Player) + 100 * (Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Horizontal Angle From Direction(Event Player.menuOriginalFacing)) * Cross Product(Facing Direction Of(Event Player),
Direction From Angles(Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Facing Direction Of(Event Player)) - 90)) + (Angle Difference(Vertical Angle From Direction(Facing Direction Of(Event Player)),
Vertical Angle From Direction(Event Player.menuOriginalFacing)) - 0.200) * Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90) + 3 * Facing Direction Of(Event Player))), 3, Do Not Clip, Visible To Position String and Color, Color(
White), Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
}
}
rule("Do button update")
{
event
{
Subroutine;
doButtonUpdate;
}
actions
{
Event Player.extendedPlayerCollection[2] = 0;
While(Event Player.extendedPlayerCollection[2] < Count Of(Event Player.buttons));
If(Event Player.buttons[Event Player.extendedPlayerCollection[2]]);
If(Event Player.buttons[Event Player.extendedPlayerCollection[2]][15]);
If(Event Player.buttons[Event Player.extendedPlayerCollection[2]][14]);
Destroy In-World Text(Event Player.buttons[Event Player.extendedPlayerCollection[2]][13]);
End;
Event Player.buttons[Event Player.extendedPlayerCollection[2]] = Null;
Else If((
!Event Player.buttons[Event Player.extendedPlayerCollection[2]][12] && Event Player.buttons[Event Player.extendedPlayerCollection[2]][14])
|| !Event Player.isInMenu[1]);
Destroy In-World Text(Event Player.buttons[Event Player.extendedPlayerCollection[2]][13]);
Global.arrayBuilder = Event Player.buttons[Event Player.extendedPlayerCollection[2]];
Global.arrayBuilder[14] = False;
Event Player.buttons[Event Player.extendedPlayerCollection[2]] = Global.arrayBuilder;
Else If(
Event Player.buttons[Event Player.extendedPlayerCollection[2]][12] && !Event Player.buttons[Event Player.extendedPlayerCollection[2]][14]);
Create In-World Text(Event Player, Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])
][10] ? Custom String("{0}", First Of(Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])]))
: First Of(Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])]), Update Every Frame(Eye Position(
Event Player) + 100 * (Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])][4] * Cross Product(
Facing Direction Of(Event Player), Direction From Angles(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Vertical Angle From Direction(Facing Direction Of(Event Player)) - 90)) + (Event Player.buttons[Evaluate Once(
Event Player.extendedPlayerCollection[2])][5] - 0.200) * Direction From Angles(Horizontal Angle From Direction(
Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(Event Player)) - 90)
+ 3 * Facing Direction Of(Event Player))), Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])][3],
Do Not Clip, Visible To Position String and Color, Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])
][11] && Absolute Value(Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Horizontal Angle From Direction(Event Player.menuOriginalFacing)) - Event Player.buttons[Evaluate Once(
Event Player.extendedPlayerCollection[2])][4]) <= Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])
][6] / 2 && Absolute Value(Angle Difference(Vertical Angle From Direction(Facing Direction Of(Event Player)),
Vertical Angle From Direction(Event Player.menuOriginalFacing)) - Event Player.buttons[Evaluate Once(
Event Player.extendedPlayerCollection[2])][5]) <= Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])
][7] / 2 ? Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])
][9] : Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])][8], Default Visibility);
Global.arrayBuilder = Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])];
Global.arrayBuilder[13] = Last Text ID;
Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])] = Global.arrayBuilder;
Global.arrayBuilder = Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])];
Global.arrayBuilder[14] = True;
Event Player.buttons[Evaluate Once(Event Player.extendedPlayerCollection[2])] = Global.arrayBuilder;
End;
End;
Event Player.extendedPlayerCollection[2] += 1;
End;
}
}
rule("Close menu on start")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
Event Player.isInMenu[1] == True;
}
actions
{
Event Player.isInMenu[1] = False;
Set Aim Speed(Event Player, 100);
Set Primary Fire Enabled(Event Player, True);
Set Secondary Fire Enabled(Event Player, True);
Enable Hero HUD(Event Player);
Event Player.extendedPlayerCollection[2] = 0;
While(Event Player.extendedPlayerCollection[2] < Count Of(Event Player.menuFrame));
Destroy In-World Text(Event Player.menuFrame[Event Player.extendedPlayerCollection[2]]);
Event Player.extendedPlayerCollection[2] += 1;
End;
Destroy Icon(First Of(Event Player.extendedPlayerCollection));
Call Subroutine(doButtonUpdate);
Call Subroutine(EnablePlayer);
}
}
rule("Open menu")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == False;
!Is Dummy Bot(Event Player) == True;
Event Player.isInMenu[1] == True;
}
actions
{
Set Aim Speed(Event Player, 15);
Event Player.menuOriginalFacing = Facing Direction Of(Event Player);
Set Primary Fire Enabled(Event Player, False);
Set Secondary Fire Enabled(Event Player, False);
Disable Hero HUD(Event Player);
Disable Game Mode HUD(Event Player);
Event Player.menuFrame = Empty Array;
Call Subroutine(createCursor);
Wait(0.016, Ignore Condition);
Wait(0.016, Ignore Condition);
Wait(0.016, Ignore Condition);
Call Subroutine(doButtonUpdate);
Call Subroutine(DisablePlayer);
}
}
rule("Close menu")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == False;
!Is Dummy Bot(Event Player) == True;
!Event Player.isInMenu[1] == True;
}
actions
{
Set Aim Speed(Event Player, 100);
Set Primary Fire Enabled(Event Player, True);
Set Secondary Fire Enabled(Event Player, True);
Enable Hero HUD(Event Player);
Enable Game Mode HUD(Event Player);
Event Player.extendedPlayerCollection[2] = 0;
While(Event Player.extendedPlayerCollection[2] < Count Of(Event Player.menuFrame));
Destroy In-World Text(Event Player.menuFrame[Event Player.extendedPlayerCollection[2]]);
Event Player.extendedPlayerCollection[2] += 1;
End;
Destroy Icon(First Of(Event Player.extendedPlayerCollection));
Call Subroutine(doButtonUpdate);
Call Subroutine(EnablePlayer);
}
}
rule("Check for button update")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == False;
Event Player.isInMenu[1] == True;
Is True For Any(Event Player.buttons, Current Array Element && (Current Array Element[15] || (
!Current Array Element[12] && Current Array Element[14]) || (Current Array Element[12] && !Current Array Element[14])))
== True;
}
actions
{
Call Subroutine(doButtonUpdate);
Wait(0.016, Ignore Condition);
}
}
rule("Detect primary fire button press")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == False;
Event Player.isInMenu[1] == True;
Is Button Held(Event Player, Button(Primary Fire)) == True;
}
actions
{
If(Absolute Value(Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Horizontal Angle From Direction(Event Player.menuOriginalFacing)) - Global.exitButtonProperties[1])
<= Global.exitButtonProperties[3] / 2 && Absolute Value(Angle Difference(Vertical Angle From Direction(Facing Direction Of(
Event Player)), Vertical Angle From Direction(Event Player.menuOriginalFacing)) - Global.exitButtonProperties[2])
<= Global.exitButtonProperties[3] / 2);
Event Player.currActionID = First Of(Global.exitButtonProperties);
End;
Event Player.extendedPlayerCollection[3] = 0;
While(Event Player.extendedPlayerCollection[3] < Count Of(Event Player.buttons));
If(Event Player.buttons[Event Player.extendedPlayerCollection[3]][11] && Absolute Value(Angle Difference(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Horizontal Angle From Direction(
Event Player.menuOriginalFacing)) - Event Player.buttons[Event Player.extendedPlayerCollection[3]][4])
<= Event Player.buttons[Event Player.extendedPlayerCollection[3]][6] / 2 && Absolute Value(Angle Difference(
Vertical Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Event Player.menuOriginalFacing)) - Event Player.buttons[Event Player.extendedPlayerCollection[3]][5])
<= Event Player.buttons[Event Player.extendedPlayerCollection[3]][7] / 2);
Event Player.currActionID = Event Player.buttons[Event Player.extendedPlayerCollection[3]][1];
End;
Event Player.extendedPlayerCollection[3] += 1;
End;
If(Event Player.currActionID && Global.extendedGlobalCollection[6]);
Play Effect(Event Player, Explosion Sound, Color(White), Event Player, 30);
End;
Wait(0.016, Ignore Condition);
Event Player.currActionID = Null;
}
}
rule("Detect secondary fire button press")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == False;
Event Player.isInMenu[1] == True;
Is Button Held(Event Player, Button(Secondary Fire)) == True;
}
actions
{
If(Absolute Value(Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Horizontal Angle From Direction(Event Player.menuOriginalFacing)) - Global.exitButtonProperties[1])
<= Global.exitButtonProperties[3] / 2 && Absolute Value(Angle Difference(Vertical Angle From Direction(Facing Direction Of(
Event Player)), Vertical Angle From Direction(Event Player.menuOriginalFacing)) - Global.exitButtonProperties[2])
<= Global.exitButtonProperties[3] / 2);
Event Player.currActionID = First Of(Global.exitButtonProperties);
End;
Event Player.extendedPlayerCollection[4] = 0;
While(Event Player.extendedPlayerCollection[4] < Count Of(Event Player.buttons));
If(Event Player.buttons[Event Player.extendedPlayerCollection[4]][11] && Absolute Value(Angle Difference(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Horizontal Angle From Direction(
Event Player.menuOriginalFacing)) - Event Player.buttons[Event Player.extendedPlayerCollection[4]][4])
<= Event Player.buttons[Event Player.extendedPlayerCollection[4]][6] / 2 && Absolute Value(Angle Difference(
Vertical Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Event Player.menuOriginalFacing)) - Event Player.buttons[Event Player.extendedPlayerCollection[4]][5])
<= Event Player.buttons[Event Player.extendedPlayerCollection[4]][7] / 2);
Event Player.currActionID = Event Player.buttons[Event Player.extendedPlayerCollection[4]][2];
End;
Event Player.extendedPlayerCollection[4] += 1;
End;
If(Event Player.currActionID && Global.extendedGlobalCollection[6]);
Play Effect(Event Player, Explosion Sound, Color(White), Event Player, 30);
End;
Wait(0.016, Ignore Condition);
Event Player.currActionID = Null;
}
}
rule("Cursor bounds")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == False;
Event Player.isInMenu[1] == True;
(Absolute Value(Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Horizontal Angle From Direction(Event Player.menuOriginalFacing)))
> Global.extendedGlobalCollection[1] / 2 + 0.050 || Absolute Value(Angle Difference(Vertical Angle From Direction(
Facing Direction Of(Event Player)), Vertical Angle From Direction(Event Player.menuOriginalFacing)))
> Global.extendedGlobalCollection[2] / 2 + 0.050) == True;
}
actions
{
Set Facing(Event Player, Direction From Angles(Min(Max(Horizontal Angle From Direction(Event Player.menuOriginalFacing)
- Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)), Horizontal Angle From Direction(
Event Player.menuOriginalFacing)), Horizontal Angle From Direction(Event Player.menuOriginalFacing)
- Global.extendedGlobalCollection[1] / 2), Horizontal Angle From Direction(Event Player.menuOriginalFacing)
+ Global.extendedGlobalCollection[1] / 2), Min(Max(Vertical Angle From Direction(Event Player.menuOriginalFacing)
- Angle Difference(Vertical Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Event Player.menuOriginalFacing)), Vertical Angle From Direction(Event Player.menuOriginalFacing)
- Global.extendedGlobalCollection[2] / 2), Vertical Angle From Direction(Event Player.menuOriginalFacing)
+ Global.extendedGlobalCollection[2] / 2)), To World);
Wait(0.016, Ignore Condition);
Loop If Condition Is True;
}
}
rule("▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒a")
{
event
{
Ongoing - Global;
}
}
rule("workshop rules")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == False;
Event Player == Host Player;
}
actions
{
Global.gateMaxHealth[1] = 100;
Global.gateMaxHealth[2] = 1000;
Global.moneyMultiplier[1] = 0.500;
Global.moneyMultiplier[2] = 2;
Host Player.newButton = Array(Custom String("GATE MAX HEALTH: {0}", Global.gateMaxHealth[0]), Null, Null, 3, -1, 0.500, 0, 0.300,
Color(Green), Color(Green), True, True, True);
Call Subroutine(createMenuButton);
Host Player.workshopButtons[0] = Host Player.lastMenuButtonID;
Host Player.newButton = Array(Custom String("+/- 1"), Custom String("gateMaxHealthAddOne"), Custom String(
"gateMaxHealthSubtractOne"), 3, 0.650, 0.500, 0.500, 0.300, Color(Green), Color(Yellow), True, True, True);
Call Subroutine(createMenuButton);
Host Player.workshopButtons[1] = Host Player.lastMenuButtonID;
Host Player.newButton = Array(Custom String("+/- 10"), Custom String("gateMaxHealthAddTen"), Custom String(
"gateMaxHealthSubtractTen"), 3, 1.150, 0.500, 0.500, 0.300, Color(Green), Color(Yellow), True, True, True);
Call Subroutine(createMenuButton);
Host Player.workshopButtons[2] = Host Player.lastMenuButtonID;
Host Player.newButton = Array(Custom String("+/- 100"), Custom String("gateMaxHealthAddHundred"), Custom String(
"gateMaxHealthSubtractHundred"), 3, 1.700, 0.500, 0.500, 0.300, Color(Green), Color(Yellow), True, True, True);
Call Subroutine(createMenuButton);
Host Player.workshopButtons[3] = Host Player.lastMenuButtonID;
Host Player.newButton = Array(Custom String("Money Multiplier: {0}", Global.moneyMultiplier[0]), Null, Null, 3, -1, 0, 0, 0.300,
Color(Green), Color(Green), True, True, True);
Call Subroutine(createMenuButton);
Host Player.workshopButtons[4] = Host Player.lastMenuButtonID;
Host Player.newButton = Array(Custom String("+/- 0.01"), Custom String("moneyMultAddTen"), Custom String("moneyMultSubtractTen"),
3, 0.750, 0, 0.500, 0.300, Color(Green), Color(Yellow), True, True, True);
Call Subroutine(createMenuButton);
Host Player.workshopButtons[5] = Host Player.lastMenuButtonID;
Host Player.newButton = Array(Custom String("+/- 0.10"), Custom String("moneyMultAddHundred"), Custom String(
"moneyMultSubtractHundred"), 3, 1.500, 0, 0.500, 0.300, Color(Green), Color(Yellow), True, True, True);
Call Subroutine(createMenuButton);
Host Player.workshopButtons[6] = Host Player.lastMenuButtonID;
Host Player.newButton = Array(Custom String("Ana Self Nano: {0}", Global.selfNanoWorkshopSetting), Null, Null, 3, -1, -0.500, 0,
0.300, Color(Green), Color(Green), True, True, True);
Call Subroutine(createMenuButton);
Host Player.workshopButtons[7] = Host Player.lastMenuButtonID;
Host Player.newButton = Array(Custom String("Toggle"), Custom String("anaSelfNano"), Null, 3, 0.750, -0.500, 1, 0.300, Color(
Green), Color(Yellow), True, True, True);
Call Subroutine(createMenuButton);
Host Player.workshopButtons[8] = Host Player.lastMenuButtonID;
Wait Until(Is Game In Progress == True, 9999);
Host Player.destroyButtonID = Host Player.workshopButtons[0];
Call Subroutine(destroyMenuButton);
Host Player.destroyButtonID = Host Player.workshopButtons[1];
Call Subroutine(destroyMenuButton);
Host Player.destroyButtonID = Host Player.workshopButtons[2];
Call Subroutine(destroyMenuButton);
Host Player.destroyButtonID = Host Player.workshopButtons[3];
Call Subroutine(destroyMenuButton);
Host Player.destroyButtonID = Host Player.workshopButtons[4];
Call Subroutine(destroyMenuButton);
Host Player.destroyButtonID = Host Player.workshopButtons[5];
Call Subroutine(destroyMenuButton);
Host Player.destroyButtonID = Host Player.workshopButtons[6];
Call Subroutine(destroyMenuButton);
Host Player.destroyButtonID = Host Player.workshopButtons[7];
Call Subroutine(destroyMenuButton);
Host Player.destroyButtonID = Host Player.workshopButtons[8];
Call Subroutine(destroyMenuButton);
}
}
rule("Actions")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == False;
Event Player.currActionID != Null;
}
actions
{
If(Event Player.currActionID == Custom String("gateMaxHealthAddOne"));
If(Global.gateMaxHealth[0] + 1 <= Global.gateMaxHealth[2]);
Global.gateMaxHealth[0] += 1;
Else;
Global.gateMaxHealth[0] = Global.gateMaxHealth[2];
End;
Else If(Event Player.currActionID == Custom String("gateMaxHealthSubtractOne"));
If(Global.gateMaxHealth[0] - 1 >= Global.gateMaxHealth[1]);
Global.gateMaxHealth[0] -= 1;
Else;
Global.gateMaxHealth[0] = Global.gateMaxHealth[1];
End;
Else If(Event Player.currActionID == Custom String("gateMaxHealthAddTen"));
If(Global.gateMaxHealth[0] + 10 <= Global.gateMaxHealth[2]);
Global.gateMaxHealth[0] += 10;
Else;
Global.gateMaxHealth[0] = Global.gateMaxHealth[2];
End;
Else If(Event Player.currActionID == Custom String("gateMaxHealthSubtractTen"));
If(Global.gateMaxHealth[0] - 10 >= Global.gateMaxHealth[1]);
Global.gateMaxHealth[0] -= 10;
Else;
Global.gateMaxHealth[0] = Global.gateMaxHealth[1];
End;
Else If(Event Player.currActionID == Custom String("gateMaxHealthAddHundred"));
If(Global.gateMaxHealth[0] + 100 <= Global.gateMaxHealth[2]);
Global.gateMaxHealth[0] += 100;
Else;
Global.gateMaxHealth[0] = Global.gateMaxHealth[2];
End;
Else If(Event Player.currActionID == Custom String("gateMaxHealthSubtractHundred"));
If(Global.gateMaxHealth[0] - 100 >= Global.gateMaxHealth[1]);
Global.gateMaxHealth[0] -= 100;
Else;
Global.gateMaxHealth[0] = Global.gateMaxHealth[1];
End;
Else If(Event Player.currActionID == Custom String("moneyMultAddTen"));
If(Global.moneyMultiplier[0] + 0.010 <= Global.moneyMultiplier[2]);
Global.moneyMultiplier[0] += 0.010;
Else;
Global.moneyMultiplier[0] = Global.moneyMultiplier[2];
End;
Else If(Event Player.currActionID == Custom String("moneyMultSubtractTen"));
If(Global.moneyMultiplier[0] - 0.010 >= Global.moneyMultiplier[1]);
Global.moneyMultiplier[0] -= 0.010;
Else;
Global.moneyMultiplier[0] = Global.moneyMultiplier[1];
End;
Else If(Event Player.currActionID == Custom String("moneyMultAddHundred"));
If(Global.moneyMultiplier[0] + 0.100 <= Global.moneyMultiplier[2]);
Global.moneyMultiplier[0] += 0.100;
Else;
Global.moneyMultiplier[0] = Global.moneyMultiplier[2];
End;
Else If(Event Player.currActionID == Custom String("moneyMultSubtractHundred"));
If(Global.moneyMultiplier[0] - 0.100 >= Global.moneyMultiplier[1]);
Global.moneyMultiplier[0] -= 0.100;
Else;
Global.moneyMultiplier[0] = Global.moneyMultiplier[1];
End;
Else If(Event Player.currActionID == Custom String("anaSelfNano"));
Global.selfNanoWorkshopSetting = !Global.selfNanoWorkshopSetting;
End;
Global.upgradeGateMaxHealthMaxValue[0] = Round To Integer(Global.gateMaxHealth[0] + Global.gateMaxHealth[0] * 0.500, Up) > 1000 ? 1000 : Round To Integer(Global.gateMaxHealth[0] + Global.gateMaxHealth[0] * 0.500, Up);
Global.upgradeGateMaxHealthMaxValue[1] = Round To Integer(Global.upgradeGateMaxHealthMaxValue[0] + Global.upgradeGateMaxHealthMaxValue[0] * 0.500, Up);
Global.upgradeGateMaxHealthMaxValue[2] = Round To Integer(Global.upgradeGateMaxHealthMaxValue[1] + Global.upgradeGateMaxHealthMaxValue[1] * 0.500, Up);
Event Player.buttonModification = Array(Event Player.workshopButtons[0], 0, Custom String("GATE MAX HEALTH: {0}",
Global.gateMaxHealth[0]));
Call Subroutine(modifyMenuButton);
Event Player.buttonModification = Array(Event Player.workshopButtons[4], 0, Custom String("Money Multiplier: {0}",
Global.moneyMultiplier[0]));
Call Subroutine(modifyMenuButton);
Event Player.buttonModification = Array(Event Player.workshopButtons[7], 0, Custom String("Ana Self Nano: {0}",
Global.selfNanoWorkshopSetting));
Call Subroutine(modifyMenuButton);
}
}