diff --git a/.gitignore b/.gitignore
index 273d7da..a717dcc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
-practicefieldexpanse.workshop.txt
+practicefieldexpanse.*.txt
+# ravensaidome.*.txt
+ravensaidome.ow.txt
diff --git a/Makefile b/Makefile
index af24a8c..37e697f 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,10 @@ SHELL = /bin/bash
.SUFFIXES:
.SUFFIXES: .owh .ow
-MODEFILE=practicefieldexpanse.workshop.txt
+BUILDDATE=$(shell date -u +%Y%m%d)
+
+MODENAME=ravensaidome
+MODEFILE=$(MODENAME).ow.txt
FILES= \
src/main.owh \
@@ -53,8 +56,9 @@ FILES= \
src/ai/ai_Zenyatta.ow
$(MODEFILE): $(FILES)
- cat $(FILES) | ./tools/overwatch_workshop_minifier.sh > $(MODEFILE)
- cat $(MODEFILE) | clip.exe
+ cat $(FILES) > $(MODEFILE)
+ sed -i "s/__BUILDDATE__/$(BUILDDATE)/" $(MODEFILE)
+ ./tools/overwatch_workshop_minifier.sh $(MODEFILE)
clean:
rm -f $(MODEFILE)
diff --git a/README.md b/README.md
index 064022a..d675776 100644
--- a/README.md
+++ b/README.md
@@ -1,30 +1,72 @@
-# Practice Field: Expanse
-Practice Field: Expanse is a sandbox practice game mode for the Overwatch Workshop.
+# Raven's AI Dome
+
+Raven's AI Dome is a sandbox practice game mode for the Overwatch
+Workshop.
## Summary
-Up to six players are spread across the map "Workshop Expanse". Each player is put in a bubble against an enemy dummy bot. The player kills the enemy bot and progresses to the next hero in the list when the "Kill Goal" is met. The player can select any hero they would like to practice on. The enemy spawn distances and play area will automatically be adapted to the optimal sizes for the chosen hero.
-For more info, see: [Practice Field: Expanse](https://snowlune.github.io/PracticeFieldExpanse/)
+Up to six players are spread across the map "Workshop Expanse". Each player is
+put in a bubble against an enemy dummy bot. The player kills the enemy bot and
+progresses to the next hero in the list when the "Kill Goal" is met. The player
+can select any hero they would like to practice on. The enemy spawn distances
+and play area will automatically be adapted to the optimal sizes for the chosen
+hero.
+
+For more info, see:
+[Raven's AI Dome](https://snowlune.github.io/RavensAIDome/)
+
## Files
-`src/` contains all the text files of groups of rules that are compiled into the mode file `practicefieldexpanse.workshop.txt` with Make.
+
+`src/` contains all the text files of groups of rules that are compiled into the
+mode file `ravensaidome.ow.txt` with Make.
+
## How to use
-A premade release can be downloaded and imported into Overwatch right away. Just open `practicefieldexpanse.workshop.txt` in your favorite editor or notepad. Select All (ctrl-a), then Copy (ctrl-c).
-The mode text file will now be in your clipboard. Go to Game Browser >> Create >> Settings. There will be an orange button in the top right that will paste from your clipboard when you click it.
-Info: You can also import the code `5DPKQ` in Overwatch to get a recent build. However, sometimes this isn't always up to date with the git version.
+
+A premade release can be downloaded and imported into Overwatch right away.
+
+- Open `ravensaidome.ow.txt` in your favorite editor or notepad.
+- Select All (**ctrl-a**), then Copy (**ctrl-c**). The mode text file will now
+ be in your clipboard.
+- Go to the Game Browser in _Overwatch_ >> Create >> Settings. There will be an
+ orange button in the top right that will paste from your clipboard when you
+ click it.
+
+**You can also import the code **`BWGAP`** in Overwatch to get a recent build.
+However, sometimes this isn't always up to date with the git version.**
+
### How to build
-I build under WSL2 Ubuntu, but any kind of linux with GNU Make should work.
-From the project directory, run `make`. This creates `practicefieldexpanse.workshop.txt` which can be imported as described above.
+
+I build under WSL2 Ubuntu, but any kind of linux with GNU Make should work. From
+the project root directory, run `make`. This creates `ravensaidome.ow.txt` which can be
+imported as described above.
+
## Additional Information
-The mode itself is over 12,000 lines of text and reaching even the new Overwatch Workshop limit of 35,000 objects.
-For this reason, it is __**NOT RECOMMENDED**__ to attempt to open it in the Workshop Editor within Overwatch, as it will almost surely crash your game client as it does mine. I use Visual Studio Code to edit and *highly* recommend it for anyone attempting to make a moderately large Overwatch Workshop mode. In my experience, hand-coding Workshop modes furthers understanding of Workshop actions and syntax. It also allows you to edit and think faster, ultimately creating better code.
+The mode itself is over 12,000 lines of text and reaching even the new Overwatch
+Workshop limit of 35,000 objects.
+
+For this reason, it is \***\*NOT RECOMMENDED\*\*** to attempt to open it in the
+Workshop Editor within Overwatch, as it will almost surely crash your game
+client as it does mine. I use Visual Studio Code to edit and _highly_ recommend
+it for anyone attempting to make a moderately large Overwatch Workshop mode. In
+my experience, hand-coding Workshop modes furthers understanding of Workshop
+actions and syntax. It also allows you to edit and think faster, ultimately
+creating better code.
-After a version is ready for release, I import it into a custom game, then recopy it and save *that* as the mode file. This formats the text and eliminates any parenthetical discrepancies, making math bugs easier to identify.
## Development History
-I started this project in January 2020 as soon as the "Workshop Expanse" map was released on the PTR. The idea came from my first practice mode on the Practice Range that spawned random types of enemies and gave them *very* rudimentary movement. I knew I wanted something that would spawn enemies at random distances from me and facing a random direction. Initially I only intended it to be a small Widowmaker warm-up and flick practice mode. It is currently in the pre-release stage with changes happening rapidly.
+
+I started this project in January 2020 as soon as the "Workshop Expanse" map was
+released on the PTR. The idea came from my first practice mode on the Practice
+Range that spawned random types of enemies and gave them _very_ rudimentary
+movement. I knew I wanted something that would spawn enemies at random distances
+from me and facing a random direction. Initially I only intended it to be a
+small Widowmaker warm-up and flick practice mode. It is currently in the
+pre-release stage with changes happening rapidly.
+
## Support Me
-I've put more hours into this project than I have an any one job most likely. It's been a passion project, but I have put my soul
-and *a lot* of time into it.
+
+I've put more hours into this project than I have an any one job most likely.
+It's been a passion project, but I have put my soul and _a lot_ of time into it.
Consider supporting me if you enjoy this project.
CashApp: $RavenQueenLuna
@@ -32,4 +74,3 @@ BTC: 3ApiPv3yjmZKo9T5SGSNTyNQVyPthobBEE
ETH: 0x3e1C67b95Db61f7F444bbDb74Dad8e2a689eA8a4
DOGE: DEAbvFjBbJb6yyABDjVrmJr8Z3Afi2qwSQ
Email snowluna@protonmail.com for different coin addresses not listed here
+ is a sandbox practice game mode for the Overwatch Workshop.
+
+
+ Up to six players are spread across the map "Workshop
+ Expanse". Each player is put in a bubble against an enemy
+ dummy bot.
The player kills the enemy bot and progresses to
+ the next hero in the list when the "Kill Goal" is met.
The
+ player can select any hero they would like to practice on. The
+ enemy spawn distances and play area will automatically be
+ adapted to the optimal sizes for the chosen hero.
+
+
+
+
AI Bots
+
+ The bots have AI scripting for every hero that I have
+ meticulously programmed over many months.
+
+
+
+
Scaling Difficulties
+
+ The are currently 11 difficulties ranging from "No AI Easy" ('No
+ AI' meaning they do not have AI or attack, but simply move.) to
+ "AI Bronze" to "AI Top 500". The difficulties named for
+ competitive tiers approximately reflect the aim, movement, and
+ reaction time of real players at those tiers.
+
+
+
+
In-Game Menu
+
+ The custom in-game menu can be accessed at any time with a quick
+ key combination. The menu is navigated with the WASD keys.
+
+
The menu allows the player to:
+
+
Set difficulty to the desired level
+
Enable or Disable various modes that affect play
+
Set the language
+
and more...
+
+
+
+
Sandbox Approach To Practice
+
+ Raven's AI Dome is designed so that players can configure
+ their own settings to best aid what they would like to practice.
+
+
A few examples:
+
+ The player wishes to get better at
+ Roadhog's
+ Chain Hook combo against supports.
+
+
+
Open the in-game menu,
+
+ set the "1 Second Cooldown" mode to "Player" so that the
+ player's cooldowns are automatically refreshed
+
+
+ While still in the menu, set the "Hero Class" to "Support"
+
+
Close the menu and hook to your heart's content
+
+
+ The player would just like to practice a
+ Widowmaker 1v1 as long as they are
+ in queue.
+
+
+
+ Select Widowmaker * Using the
+ key combination described in the top left to select a specific
+ enemy hero, select Widowmaker
+
+
+ Open the in-game menu, set the difficulty to the desired
+ difficulty and set the "Kill Goal" to "Infinite"
+
+
Close the menu and begin the 1v1
+
+
+
Development History
+
+ I started this project in January 2020 as soon as the "Workshop
+ Expanse" map was released on the PTR.
+
+
+ The idea came from my first practice mode on the Practice Range that
+ spawned random types of enemies and gave them
+ very rudimentary movement.
+
+
+ I knew I wanted something that would spawn enemies at random
+ distances from me facing a random direction. Initially I only
+ intended it to be a small Widowmaker warmup and flick practice mode.
+
+
+ It is currently in the pre-release stage with changes happening
+ rapidly.
+
+
+
Donate
+
+ I greatly appreciate any and all donations. This is a passion
+ project of mine that I have put countless hours into. Any support
+ is very welcome. ๐ฅฐ
+
+ Donations are via PayPal®
+
+
+
+
+
+
+
diff --git a/docs/index.md b/docs/index.md
deleted file mode 100644
index 4992b1a..0000000
--- a/docs/index.md
+++ /dev/null
@@ -1,32 +0,0 @@
-![Promotional Image](https://raw.githubusercontent.com/SnowRoberge/PracticeFieldExpanse/master/docs/PFEPromo.png)
-### ***Practice Field: Expanse*** *is a sandbox practice game mode for the Overwatch Workshop.*
-Up to six players are spread across the map "Workshop Expanse". Each player is put in a bubble against an enemy dummy bot. The player kills the enemy bot and progresses to the next hero in the list when the "Kill Goal" is met. The player can select any hero they would like to practice on. The enemy spawn distances and play area will automatically be adapted to the optimal sizes for the chosen hero.
-### AI Bots
-The bots have AI scripting for every hero that I have programmed from scratch.
-### Scaling Difficulties
-The are currently 11 difficulties ranging from "No AI Easy" ('No AI' meaning they do not have AI or attack, but simply move.) to "AI Bronze" to "AI Top 500".
-The difficulties named for competitive tiers approximately reflect the aim, movement, and reaction time of real players at those tiers.
-### In-Game Menu
-The custom in-game menu can be accessed at any time with a quick key combination.
-The menu allows the player to:
-* Set difficulty to the desired level
-* Enable or Disable various modes that affect play
-* Set the language
-* and more...
-
-### Sandbox Approach to Practice
-**Practice Field: Expanse** is designed so that players can configure their own settings to best aid what they would like to practice.
-
-A few examples:
-* The player wishes to get better at ***Roadhog***'s *Chain Hook* combo against supports.
- * Open the in-game menu, set the "1 Second Cooldown" mode to "Player" so that the player's cooldowns are automatically refreshed
- * While still in the menu, set the "Hero Class" to "Support"
- * Close the menu and hook to your heart's content
-* The player would just like to practice a ***Widowmaker*** 1v1 as long as they are in queue.
- * Select ***Widowmaker***
- * Using the key combination described in the top left to select a specific enemy hero, select ***Widowmaker***
- * Open the in-game menu, set the difficulty to the desired difficulty and set the "Kill Goal" to "Infinite"
- * Close the menu and begin the 1v1
-
-### Development History
-I started this project in January 2020 as soon as the "Workshop Expanse" map was released on the PTR. The idea came from my first practice mode on the Practice Range that spawned random types of enemies and gave them *very* rudimentary movement. I knew I wanted something that would spawn enemies at random distances from me facing a random direction. Initially I only intended it to be a small Widowmaker warmup and flick practice mode. It is currently in the pre-release stage with changes happening rapidly. **I anticipate to release version 1.0.0 by January 1, 2020 at the latest.**
diff --git a/ravensaidome.min.ow.txt b/ravensaidome.min.ow.txt
new file mode 100644
index 0000000..2872238
--- /dev/null
+++ b/ravensaidome.min.ow.txt
@@ -0,0 +1 @@
+settings { main { Description: "Raven's AI Dome is a tool for practicing against dummy bots with AI for all Heroes. (ํ๊ตญ์ด ์ต์ ํฌํจ!)\nโฅ This is a Pre-Release Beta Version!\nโฅ Import Code: BWGAP\nโฅ Created by Raven#112503\nโฅ If you modify this mode and share your modification, please prepend \"Modified by: [your battletag]\"to this description." Mode Name: "Raven's AI Dome" } lobby { Allow Players Who Are In Queue: Yes Max Spectators: 4 Max Team 2 Players: 0 Return To Lobby: Never } modes { Skirmish { enabled maps { Workshop Expanse } } General { Game Mode Start: Immediately Hero Limit: Off Respawn Time Scalar: 0% Spawn Health Packs: Disabled } } heroes { Team 1 { Mercy { Weapons Enabled: Caduceus Blaster Only } } General { Ultimate Generation: 250% Wrecking Ball { Jump Vertical Speed: 300% } } } } variables { global: 0: a 1: b 2: c 3: d 4: e 5: f 6: g 7: h 8: i 9: j 10: k 11: l 12: m 13: n 14: o 15: p 16: q 17: r 18: s 19: t 20: u 21: v 22: w 23: x 24: y 25: z 26: A 27: B 28: C 29: D 30: E 31: F 32: G 33: H 54: ac 55: ad 34: I 35: J 36: K 37: L 38: M 39: N 40: O 41: P 42: Q 43: R 44: S 45: T 46: U 48: W 49: X 50: Y 51: Z 52: aa 53: ab player: 0: a 1: b 2: c 3: d 4: e 5: f 6: g 7: h 8: i 9: j 10: k 11: l 12: m 13: n 14: o 15: p 16: q 17: r 18: s 19: t 20: u 21: v 22: w 23: x 24: y 25: z 26: A 27: B 28: C 29: D 30: E 31: F 32: G 33: H 34: I 35: J 36: K 37: L 38: M 39: N 40: O 41: P 42: Q 43: R 44: S 45: T 46: U 47: V 48: W 49: X 50: Y 51: Z 52: aa 53: ab 54: ac 55: ad 56: ae 57: af 58: ag 59: ah 60: ai 61: aj 62: ak 63: al 64: am 65: an 66: ao 67: ap 68: aq 69: ar 70: as 71: at 72: au 73: av 74: aw 75: ax 76: ay 77: az 78: ba 79: bb 80: bc 81: bd 82: be 83: bf 84: bg 85: bh 86: bi 87: bj 88: bk 89: bl 90: bm 91: bn 92: bo 93: bp 94: bq 95: br 96: bs 97: bt 98: bu 99: bv 100: bw 101: bx 102: by 103: bz 104: ca 105: cb 106: cc } subroutines { 0: a 1: b 2: c 3: d 4: e 5: f 6: g 7: h 8: i 9: j 10: k 11: l 12: m 13: n 14: o 15: p 16: q 17: r 18: s 19: t 20: u 21: v 22: w 23: x 24: y 25: z 26: A 27: B 28: C 29: D 30: E 31: F 32: G 33: H 34: I 35: J 36: K 37: L 38: M 39: N 40: O 41: P 69: ar 42: Q 43: R 44: S 65: an 66: ao 45: T 46: U 47: V 48: W 49: X 50: Y 51: Z 52: aa 53: ab 54: ac 55: ad 56: ae 57: af 58: ag 59: ah 60: ai 61: aj 62: ak 63: al 64: am 67: ap 68: aq } rule("Global Settings") { event { Ongoing - Global; } actions { Global.R = Workshop Setting Combo ( Custom String("Default Settings / ๊ธฐ๋ณธ ์ค์ "), Custom String("Language / ์ธ์ด"), 0, Array(Custom String("English"), Custom String("ํ๊ตญ์ด")), 0 ); Global.N = Workshop Setting Combo ( Custom String("Default Settings / ๊ธฐ๋ณธ ์ค์ "), Custom String("Difficulty / ๋์ด๋"), 6, Array ( Custom String("No AI Easy"), Custom String("No AI Medium"), Custom String("No AI Hard"), Custom String("AI Bronze"), Custom String("AI Silver"), Custom String("AI Gold"), Custom String("AI Platinum"), Custom String("AI Diamond"), Custom String("AI Master"), Custom String("AI Grand Master"), Custom String("AI Top 500") ), 1 ); Global.Q = Workshop Setting Integer ( Custom String("Default Settings / ๊ธฐ๋ณธ ์ค์ "), Custom String("Kill Goal / ํ์ํ ํฌ ์"), 4, 4, 64, 2 ); If(Global.Q % 4 != 0 && Global.Q > 4); Global.Q = Global.Q - Global.Q % 4; End; Global.O = Workshop Setting Combo ( Custom String("Default Settings / ๊ธฐ๋ณธ ์ค์ "), Custom String("Bot Hero Role / ์์ ์ ํ"), 0, Array ( Custom String("All"), Custom String("Tank"), Custom String("Damage"), Custom String("Support") ), 3 ); Global.T = Workshop Setting Toggle ( Custom String("Default Settings / ๊ธฐ๋ณธ ์ค์ "), Custom String("Player Healing / ํ๋ ์ด์ด ์น์ "), True, 4 ); Global.I = Workshop Setting Toggle ( Custom String("Default Settings / ๊ธฐ๋ณธ ์ค์ "), Custom String("Bot Healing / ์ธ๊ณต์ง๋ ์น์ "), False, 5 ); Global.X = Workshop Setting Toggle ( Custom String("Default Settings / ๊ธฐ๋ณธ ์ค์ "), Custom String("Random Names For Bots"), True, 5.5 ); Global.M = Workshop Setting Toggle ( Custom String("Debug Settings / ๋๋ฒ๊ทธ ์ค์ "), Custom String("Debug Mode / ๋๋ฒ๊ทธ ๋ชจ๋"), False, 6 ); Global.L = Workshop Setting Toggle ( Custom String("Debug Settings / ๋๋ฒ๊ทธ ์ค์ "), Custom String("Debug HUD / ๋๋ฒ๊ทธ HUD"), False, 7 ); Global.S = Workshop Setting Toggle ( Custom String("Debug Settings / ๋๋ฒ๊ทธ ์ค์ "), Custom String ("Global 1 Second Cooldown Mode / ๊ธ๋ก๋ฒ ์ฟจ ๋ค์ด ์๋ก ๊ณ ์นจ"), False, 8 ); Global.K = Array(); Global.K[0] = Workshop Setting Toggle ( Custom String("Debug Settings / ๋๋ฒ๊ทธ ์ค์ "), Custom String("Debug Hero Enabled / ๋๋ฒ๊ทธ ์์ ํ์ฑํ"), False, 9 ); If(Global.K[0] == True); Global.K[1] = Workshop Setting Hero ( Custom String("Debug Settings / ๋๋ฒ๊ทธ ์ค์ "), Custom String("Debug Hero / ๋๋ฒ๊ทธ ์์ "), Genji, 10 ); End; If(Global.M == True); Enable Inspector Recording; Else; Disable Inspector Recording; End; Disable Built-In Game Mode Completion; } } rule("Global Main Tick Loop") { event { Ongoing - Global; } conditions { Is Game In Progress == True; } actions { For Global Variable(W, 0, 60, 1); If(Server Load >= 240); Wait(2 / 60, Ignore Condition); Else If(Server Load >= 225); Wait(1 / 60, Ignore Condition); Else; Wait(0.500 / 60, Ignore Condition); End; End; Loop If Condition Is True; } } rule("Global Defines") { event { Ongoing - Global; } actions { Global.P = False; Global.D = Custom String("1.0.0"); Global.c = Custom String(20220623); Global.G = Custom String("BWGAP"); Global.j = Custom String("Raven#112503"); Global.C = Custom String("twitch.tv/RavenLuna"); Global.l = Custom String ("github.com/SnowLune/RavensAIDome"); Global.k = Custom String("TBA"); Global.o = 65; Global.r = 50; Global.A = 35; Global.E = 20; Global.H = 20; Global.b = 80; Global.q = 10; Global.y = 999999; Global.m = Array(); Global.m[0] = All Heroes; Global.m[1] = All Tank Heroes; Global.m[2] = All Damage Heroes; Global.m[3] = All Support Heroes; Global.p = Array(); Global.p[0] = Hero(Widowmaker); Global.s = Array(); Global.s[0] = Hero(Ana); Global.s[1] = Hero(Ashe); Global.s[2] = Hero(Baptiste); Global.s[3] = Hero(Hanzo); Global.B = Array(); Global.B[0] = Hero(Bastion); Global.B[1] = Hero(Lรบcio); Global.B[2] = Hero(Cassidy); Global.B[3] = Hero(Mei); Global.B[4] = Hero(Orisa); Global.B[5] = Hero(Soldier: 76); Global.B[6] = Hero(Torbjรถrn); Global.B[7] = Hero(Zenyatta); Global.B[8] = Hero(Roadhog); Global.F = Array(); Global.F[0] = Hero(Brigitte); Global.F[1] = Hero(D.Va); Global.F[2] = Hero(Moira); Global.F[3] = Hero(Reaper); Global.F[4] = Hero(Reinhardt); Global.F[5] = Hero(Sigma); Global.F[6] = Hero(Symmetra); Global.F[7] = Hero(Winston); Global.F[8] = Hero(Zarya); Global.F[9] = Hero(Doomfist); Global.x = Array(); Global.x[0] = Hero(Ana); Global.x[1] = Hero(Ashe); Global.x[2] = Hero(Baptiste); Global.x[3] = Hero(Bastion); Global.x[4] = Hero(D.Va); Global.x[5] = Hero(Echo); Global.x[6] = Hero(Genji); Global.x[7] = Hero(Hanzo); Global.x[8] = Hero(Junkrat); Global.x[9] = Hero(Lรบcio); Global.x[10] = Hero(Cassidy); Global.x[11] = Hero(Mercy); Global.x[12] = Hero(Orisa); Global.x[13] = Hero(Pharah); Global.x[14] = Hero(Reaper); Global.x[15] = Hero(Roadhog); Global.x[16] = Hero(Sigma); Global.x[17] = Hero(Soldier: 76); Global.x[18] = Hero(Sombra); Global.x[19] = Hero(Torbjรถrn); Global.x[20] = Hero(Tracer); Global.x[21] = Hero(Widowmaker); Global.x[22] = Hero(Wrecking Ball); Global.x[23] = Hero(Zenyatta); Global.n = Array(); Global.n[0] = Hero(Echo); Global.n[1] = Hero(Genji); Global.n[2] = Hero(Junkrat); Global.n[3] = Hero(Mercy); Global.n[4] = Hero(Pharah); Global.n[5] = Hero(Sombra); Global.n[6] = Hero(Tracer); Global.n[7] = Hero(Wrecking Ball); Global.z = Array(); Global.z[0] = Hero(Ana); Global.z[1] = Hero(Ashe); Global.z[2] = Hero(Widowmaker); Global.t = Array(); Global.t[0] = Forward; Global.t[1] = Backward; Global.t[2] = Left; Global.t[3] = Right; Global.t[4] = Vector(1, 0, 1); Global.t[5] = Vector(-1, 0, 1); Global.t[6] = Vector(1, 0, -1); Global.t[7] = Vector(-1, 0, -1); Global.v = Array(); Global.v[0] = Forward; Global.v[1] = Left; Global.v[2] = Right; Global.v[3] = Vector(1, 0, 1); Global.v[4] = Vector(-1, 0, 1); Global.u = Array(); Global.u[0] = Backward; Global.u[1] = Left; Global.u[2] = Right; Global.u[3] = Vector(1, 0, -1); Global.u[4] = Vector(-1, 0, -1); Global.w = Array(); Global.w[0] = Left; Global.w[1] = Right; Global.h = Custom Color(255, 195, 216, 255); Global.d = Custom Color(255, 135, 176, 255); Global.i = Custom Color(190, 235, 233, 255); Global.e = Custom Color(138, 198, 209, 255); Global.g = Custom Color(230, 230, 230, 255); Global.f = Array(); Global.f[0] = Color(White); Global.f[1] = Color(Gray); Global.f[2] = Color(Black); Global.f[3] = Color(Red); Global.f[4] = Color(Green); Global.f[5] = Color(Blue); Global.f[6] = Color(Rose); Global.f[7] = Color(Lime Green); Global.f[8] = Color(Sky Blue); Global.f[9] = Color(Violet); Global.J = Array(); Global.a = Array(); Global.a[0] = Custom String("Amanda"); Global.a[1] = Custom String("Amber"); Global.a[2] = Custom String("Aphrodite"); Global.a[3] = Custom String("CatShark"); Global.a[4] = Custom String("BeepBoop"); Global.a[5] = Custom String("BitsAndBytes"); Global.a[6] = Custom String("Blue"); Global.a[7] = Custom String("Mochi"); Global.a[8] = Custom String("BronzeSmurf"); Global.a[9] = Custom String("Comfort"); Global.a[10] = Custom String("Enceladus"); Global.a[11] = Custom String("Dirt"); Global.a[12] = Custom String("Ganymede"); Global.a[13] = Custom String("DoomfistOTP"); Global.a[14] = Custom String("DoomSlayer"); Global.a[15] = Custom String("DPSDiff"); Global.a[16] = Custom String("DPSLucio"); Global.a[17] = Custom String("DPSMercy"); Global.a[18] = Custom String("DrinkWater"); Global.a[19] = Custom String("Error"); Global.a[20] = Custom String("Fallout"); Global.a[21] = Custom String("Fear"); Global.a[22] = Custom String("Friend"); Global.a[23] = Custom String("GenjiMain"); Global.a[24] = Custom String("GGILY"); Global.a[25] = Custom String("GiveMeHanzo"); Global.a[26] = Custom String("GlaDOS"); Global.a[27] = Custom String("Triton"); Global.a[28] = Custom String("Greg"); Global.a[29] = Custom String("HammerOnly"); Global.a[30] = Custom String("HealPls"); Global.a[31] = Custom String("SRVacuum"); Global.a[32] = Custom String("Eris"); Global.a[33] = Custom String("HotTopic"); Global.a[34] = Custom String("IBMPC"); Global.a[35] = Custom String("IDontMiss"); Global.a[36] = Custom String("IMainSupport"); Global.a[37] = Custom String("ImSorry"); Global.a[38] = Custom String("Instalock"); Global.a[39] = Custom String("IntMain"); Global.a[40] = Custom String("JustLikeBart"); Global.a[41] = Custom String("ICantDoMore"); Global.a[42] = Custom String("Aaron"); Global.a[43] = Custom String("Player"); Global.a[44] = Custom String("Mars"); Global.a[45] = Custom String("Mercury"); Global.a[46] = Custom String("MercyMainBTW"); Global.a[47] = Custom String("MercyOnly"); Global.a[48] = Custom String("Mint"); Global.a[49] = Custom String("MoicyIsCanon"); Global.a[50] = Custom String("Mother"); Global.a[51] = Custom String("Neptune"); Global.a[52] = Custom String("NotABot"); Global.a[53] = Custom String("NotASmurf"); Global.a[54] = Custom String("NotScripting"); Global.a[55] = Custom String("NotSmurfing"); Global.a[56] = Custom String("OatMilk"); Global.a[57] = Custom String("OnesAndZeros"); Global.a[58] = Custom String("Overclocked"); Global.a[59] = Custom String("Deimos"); Global.a[60] = Custom String("Persephone"); Global.a[61] = Custom String("Phobos"); Global.a[62] = Custom String("Princess"); Global.a[63] = Custom String("Ramen"); Global.a[64] = Custom String("Reboot"); Global.a[65] = Custom String("Samantha"); Global.a[66] = Custom String("Sedna"); Global.a[67] = Custom String("Deadbeat"); Global.a[68] = Custom String("SupportDiff"); Global.a[69] = Custom String("Takoyaki"); Global.a[70] = Custom String("TankDiff"); Global.a[71] = Custom String("Tempest"); Global.a[72] = Custom String("TheBoyMayor"); Global.a[73] = Custom String("Titan"); Global.a[74] = Custom String("TokyoFool"); Global.a[75] = Custom String("TryRustLang"); Global.a[76] = Custom String("Venus"); Global.a[77] = Custom String("Veronica"); Global.a[78] = Custom String("ZaryaMain"); Global.a[79] = Custom String("ZenMainBTW"); Global.a[80] = Custom String("HelloWorld"); Global.a[81] = Custom String("Alien"); Global.a[82] = Custom String("MyMainIsT500"); Global.a[83] = Custom String("SuperFan"); Global.a[84] = Custom String("Europa"); Global.a[85] = Custom String("Callisto"); Global.a[86] = Custom String("Io"); Global.a[87] = Custom String("LoveYourself"); Global.a[88] = Custom String("GoodLuck"); Global.a[89] = Custom String("ILoveCats"); Global.a[90] = Custom String("LoveDVa"); Global.a[91] = Custom String("Brig1Trick"); Global.a[92] = Custom String("Monke"); Global.a[93] = Custom String("GravNanoRein"); Global.a[94] = Custom String("StanLOONA"); Global.a[95] = Custom String("OverTuned"); Global.U = Array(); Global.ac = Array(); Global.ac[0] = Custom String("None"); Global.ac[1] = Custom String("Widowmaker 1v1"); Global.ac[2] = Custom String("Reinhardt 1v1"); Global.ac[3] = Custom String("Roadhog Hook Practice"); Global.ac[4] = Custom String("Ana Sleepdart Practice"); Global.ac[5] = Custom String("Hard, Thorough Warmup"); Global.ac[6] = Custom String("Easy, Thorough Warmup"); Global.ad = Array(); Global.ad[0] = Color(White); Global.ad[1] = Color(White); Global.ad[2] = Color(White); Global.ad[3] = Custom Color(190, 130, 93, 255); Global.ad[4] = Custom Color(212, 212, 212, 255); Global.ad[5] = Custom Color(242, 217, 114, 255); Global.ad[6] = Custom Color(235, 241, 235, 255); Global.ad[7] = Custom Color(178, 186, 255, 255); Global.ad[8] = Custom Color(255, 208, 128, 255); Global.ad[9] = Custom Color(255, 255, 212, 255); Global.ad[10] = Custom Color(226, 237, 255, 255); Global.P = True; } } rule("aa") { event { Subroutine; aa; } actions { If(Count Of(Players In Slot(Slot Of(Event Player), Team 1).aj) > 0); Call Subroutine(af); End; If(Count Of(Players In Slot(Slot Of(Event Player), Team 1).ag) > 0); Call Subroutine(ab); End; If(Count Of(Players In Slot(Slot Of(Event Player), Team 1).ai) > 0); Call Subroutine(ac); End; Wait(3 / 60, Ignore Condition); If(Count Of(Players In Slot(Slot Of(Event Player), Team 1).ad) > 0); For Player Variable(Players In Slot(Slot Of(Event Player), Team 1), af, Count Of(Players In Slot(Slot Of(Event Player), Team 1) .ad), -1, -1); Destroy HUD Text(Players In Slot(Slot Of(Event Player), Team 1).ad[Players In Slot(Slot Of(Event Player), Team 1).af]); Players In Slot(Slot Of(Event Player), Team 1).ad = Remove From Array(Players In Slot(Slot Of(Event Player), Team 1) .ad, Players In Slot(Slot Of(Event Player), Team 1).ad[Players In Slot(Slot Of(Event Player), Team 1).af]); End; Players In Slot(Slot Of(Event Player), Team 1).ae = False; If(Count Of(Players In Slot(Slot Of(Event Player), Team 1).ai) <= 0); Call Subroutine(ac); End; Else; Players In Slot(Slot Of(Event Player), Team 1).ad = Array(); Players In Slot(Slot Of(Event Player), Team 1).ae = True; Create HUD Text(Players In Slot(Slot Of(Event Player), Team 1), Custom String("Server Load: {0}% ({1})", Round To Integer( Server Load / 2.550, Down), Server Load), Custom String("Average: {0}% ({1})", Round To Integer(Server Load Average / 2.550, Down), Server Load Average), Custom String("Peak: {0}% ({1})", Round To Integer(Server Load Peak / 2.550, Down), Server Load Peak), Top, 100, Global.h, Global.i, Global.e, Visible To and String, Default Visibility); Modify Player Variable(Players In Slot(Slot Of(Event Player), Team 1), ad, Append To Array, Last Text ID); Create HUD Text(Players In Slot(Slot Of(Event Player), Team 1), Null, Custom String("Enemy Pos: {0}", Position Of(Players In Slot( Slot Of(Event Player), Team 2))), Custom String("Player Pos: {0}", Position Of(Event Player)), Left, 4, Color(White), Global.h, Global.i, Visible To and String, Default Visibility); Modify Player Variable(Players In Slot(Slot Of(Event Player), Team 1), ad, Append To Array, Last Text ID); Create HUD Text(Players In Slot(Slot Of(Event Player), Team 1), Null, Custom String("Enemy Dist From Home: {0}", Distance Between( Players In Slot(Slot Of(Event Player), Team 2), Players In Slot(Slot Of(Event Player), Team 1).bm)), Custom String( "Player Dist From Home: {0}", Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of( Event Player), Team 1).bm)), Left, 5, Color(White), Global.h, Global.i, Visible To and String, Default Visibility); Modify Player Variable(Players In Slot(Slot Of(Event Player), Team 1), ad, Append To Array, Last Text ID); Create HUD Text(Players In Slot(Slot Of(Event Player), Team 1), Custom String("Enemy Distance From Player: {0}", Distance Between( Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 2))), Null, Null, Left, 5.200, Global.h, Color(White), Color(White), Visible To and String, Default Visibility); Modify Player Variable(Players In Slot(Slot Of(Event Player), Team 1), ad, Append To Array, Last Text ID); Create HUD Text(Players In Slot(Slot Of(Event Player), Team 1), Custom String("Enemy Ult Charge: {0}", Ultimate Charge Percent( Players In Slot(Slot Of(Event Player), Team 2))), Null, Null, Right, 6, Global.g, Color(White), Color(White), Visible To and String, Default Visibility); Modify Player Variable(Players In Slot(Slot Of(Event Player), Team 1), ad, Append To Array, Last Text ID); Create HUD Text(Players In Slot(Slot Of(Event Player), Team 1), Custom String("Player Facing Dir: {0}", Facing Direction Of( Event Player)), Null, Custom String("Enemy Facing Dir: {0}", Facing Direction Of(Players In Slot(Slot Of(Event Player), Team 2))), Left, 6.100, Global.i, Color(White), Global.h, Visible To and String, Default Visibility); Modify Player Variable(Players In Slot(Slot Of(Event Player), Team 1), ad, Append To Array, Last Text ID); End; } } rule("ab") { event { Subroutine; ab; } actions { If(Count Of(Players In Slot(Slot Of(Event Player), Team 1).aj) > 0); Call Subroutine(af); End; If(Count Of(Players In Slot(Slot Of(Event Player), Team 1).ad) > 0); Call Subroutine(aa); End; Wait(3 / 60, Ignore Condition); If(Players In Slot(Slot Of(Event Player), Team 1).ah == True); Modify Global Variable(Y, Remove From Array By Value, Event Player); Modify Global Variable(Z, Remove From Array By Value, Event Player); Players In Slot(Slot Of(Event Player), Team 1).ah = False; Else; If(Players In Slot(Slot Of(Event Player), Team 1).bo == 1); Modify Global Variable(Y, Remove From Array By Value, Event Player); Modify Global Variable(Z, Append To Array, Event Player); Else; Modify Global Variable(Z, Remove From Array By Value, Event Player); Modify Global Variable(Y, Append To Array, Event Player); End; Players In Slot(Slot Of(Event Player), Team 1).ah = True; Wait(20, Ignore Condition); If(Event Player.ah == True); Call Subroutine(ab); End; End; } } rule("ac") { event { Subroutine; ac; } actions { If(Count Of(Players In Slot(Slot Of(Event Player), Team 1).ai) > 0); For Player Variable(Players In Slot(Slot Of(Event Player), Team 1), af, Count Of(Players In Slot(Slot Of(Event Player), Team 1) .ai), -1, -1); Destroy HUD Text(Players In Slot(Slot Of(Event Player), Team 1).ai[Players In Slot(Slot Of(Event Player), Team 1).af]); Players In Slot(Slot Of(Event Player), Team 1).ai = Remove From Array(Players In Slot(Slot Of(Event Player), Team 1) .ai, Players In Slot(Slot Of(Event Player), Team 1).ai[Players In Slot(Slot Of(Event Player), Team 1).af]); End; Else; Wait(3 / 60, Ignore Condition); Players In Slot(Slot Of(Event Player), Team 1).ai = Array(); Create HUD Text(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("{0} ํฌ: {1} / {2}", Hero Icon String(Players In Slot(Slot Of(Event Player), Team 1) .bj[Players In Slot(Slot Of(Event Player), Team 1).ar]), Players In Slot(Slot Of(Event Player), Team 1) .Q, Players In Slot(Slot Of(Event Player), Team 1).bn == Global.y ? Custom String("๋ฌดํ") : Players In Slot(Slot Of(Event Player), Team 1).bn) : Custom String("{0} Kills: {1} / {2}", Hero Icon String( Players In Slot(Slot Of(Event Player), Team 1).bj[Players In Slot(Slot Of(Event Player), Team 1).ar]), Players In Slot(Slot Of(Event Player), Team 1).Q, Players In Slot(Slot Of(Event Player), Team 1) .bn == Global.y ? Custom String("Infinite") : Players In Slot(Slot Of(Event Player), Team 1).bn), Null, Null, Right, -3, Color(White), Color(White), Color(White), Visible To and String, Default Visibility); Modify Player Variable(Players In Slot(Slot Of(Event Player), Team 1), ai, Append To Array, Last Text ID); Create HUD Text(Players In Slot(Slot Of(Event Player), Team 1), Null, Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("{0} ๋น์ ์ {1} ๋ฒ ์ฃฝ์์ต๋๋ค", Hero Of(Players In Slot(Slot Of(Event Player), Team 2)), Players In Slot(Slot Of(Event Player), Team 2).Q) : Custom String("{0} killed you {1} time(s).", Hero Of( Players In Slot(Slot Of(Event Player), Team 2)), Players In Slot(Slot Of(Event Player), Team 2).Q), Null, Right, -2.900, Color(White), Global.h, Color(Red), Visible To and String, Default Visibility); Modify Player Variable(Players In Slot(Slot Of(Event Player), Team 1), ai, Append To Array, Last Text ID); Create HUD Text(Players In Slot(Slot Of(Event Player), Team 1), Null, Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("์์ ์ ํ: {0}", Players In Slot(Slot Of(Event Player), Team 1).bk) : Custom String( "Hero Type: {0}", Players In Slot(Slot Of(Event Player), Team 1).bk), Players In Slot(Slot Of(Event Player), Team 1).bo == 1 ? Custom String("์์ : {0} / {1}", 1 + Players In Slot(Slot Of(Event Player), Team 1).ar, Count Of(Players In Slot(Slot Of(Event Player), Team 1).bj)) : Custom String("Hero: {0} / {1}", 1 + Players In Slot( Slot Of(Event Player), Team 1).ar, Count Of(Players In Slot(Slot Of(Event Player), Team 1).bj)), Right, -2.200, Color(White), Color(White), Global.i, Visible To and String, Default Visibility); Modify Player Variable(Players In Slot(Slot Of(Event Player), Team 1), ai, Append To Array, Last Text ID); Create HUD Text(Players In Slot(Slot Of(Event Player), Team 1), Null, Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("๋ค์ ์์ : {0}", Players In Slot(Slot Of(Event Player), Team 1) .bu == True ? Custom String("?") : Hero Icon String(Players In Slot(Slot Of(Event Player), Team 1) .bj[Players In Slot(Slot Of(Event Player), Team 1).as])) : Custom String("Next Hero: {0}", Players In Slot(Slot Of(Event Player), Team 1).bu == True ? Custom String("?") : Hero Icon String( Players In Slot(Slot Of(Event Player), Team 1).bj[Players In Slot(Slot Of(Event Player), Team 1) .as])), Null, Right, -2, Color(White), Global.e, Color(Aqua), Visible To and String, Default Visibility); Modify Player Variable(Players In Slot(Slot Of(Event Player), Team 1), ai, Append To Array, Last Text ID); Create HUD Text(Players In Slot(Slot Of(Event Player), Team 1), Null, Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("๋์ด๋: {0}", Players In Slot(Slot Of(Event Player), Team 1).az[Players In Slot( Slot Of(Event Player), Team 1).ay]) : Custom String("Difficulty: {0}", Players In Slot(Slot Of(Event Player), Team 1) .az[Players In Slot(Slot Of(Event Player), Team 1).ay]), Null, Right, -0.900, Color(White), Global.g, Color(White), Visible To and String, Default Visibility); Modify Player Variable(Players In Slot(Slot Of(Event Player), Team 1), ai, Append To Array, Last Text ID); End; } } rule("ae") { event { Subroutine; ae; } actions { If(Event Player.an == 0); Play Effect(Event Player, Buff Impact Sound, Color(White), Players In Slot(Slot Of(Event Player), Team 1).am - Vector(0, 15, 0), 20); Else If(Event Player.an == 1); Play Effect(Event Player, Debuff Impact Sound, Color(White), Players In Slot(Slot Of( Event Player), Team 1).am - Vector(0, 15, 0), 20); Else If(Event Player.an == 2); Play Effect(Event Player, Explosion Sound, Color(White), Players In Slot(Slot Of(Event Player), Team 1).am - Vector(0, 15, 0), 15); Else; Play Effect(Event Player, Explosion Sound, Color(White), Players In Slot(Slot Of(Event Player), Team 1).am - Vector(0, 15, 0), 10); End; } } rule("af") { event { Subroutine; af; } actions { If(Event Player.ah == True); Call Subroutine(ab); End; If(Count Of(Event Player.ad) > 0); Call Subroutine(aa); End; If(Count Of(Event Player.ai) > 0); Call Subroutine(ac); End; Wait(3 / 60, Ignore Condition); If(Count Of(Event Player.aj) > 0); For Player Variable(Event Player, af, Count Of(Event Player .aj), -1, -1); Destroy In-World Text(Event Player.aj[Event Player .af]); Event Player.aj = Remove From Array(Event Player .aj, Event Player.aj[Event Player .af]); End; Destroy Effect(Event Player.ba[10]); Destroy Effect(Event Player.ba[11]); If(Event Player.bv != 2); Clear Status(Event Player, Phased Out); End; Stop Forcing Player Position(Event Player); Stop Facing(Event Player); Call Subroutine(Q); Wait(6 / 60, Ignore Condition); Event Player.al = False; Event Player.ap = Null; Event Player.ak[0] = Null; Event Player.ak[1] = Null; Stop Camera(Event Player); Enable Hero HUD(Event Player); Call Subroutine(ac); If(Event Player.cc != Global.ac[Event Player.cb]); Event Player.cc = Global.ac[Event Player.cb]; Call Subroutine(aq); End; If(Event Player.bk != Event Player .bi[Event Player.aq]); Event Player.ar = 0; Event Player.bl = 0; Call Subroutine(ak); Call Subroutine(X); Else; Call Subroutine(Y); End; Else; If(Players In Slot(Slot Of(Event Player), Team 2).c == True); Call Subroutine(W); End; Set Status(Event Player, Null, Phased Out, Global.y); If(Event Player.bc == True); Start Forcing Player Position(Event Player, Event Player .bm + Vector(0, Event Player.bd, 0), False); Else; Start Forcing Player Position(Event Player, Event Player .bm, False); End; Start Facing(Event Player, Facing Direction Of(Event Player), 100, To World, Direction and Turn Rate); Call Subroutine(R); Clear Status(Event Player, Burning); Clear Status(Event Player, Knocked Down); Clear Status(Event Player, Asleep); Clear Status(Event Player, Frozen); Clear Status(Event Player, Stunned); Clear Status(Event Player, Rooted); Heal(Event Player, Null, Max Health(Event Player)); Event Player.ap = Event Player; Call Subroutine(ad); Disable Hero HUD(Event Player); Event Player.ao = Array(); For Player Variable(Event Player, af, -1, 15, 1); Modify Player Variable(Event Player, ao, Append To Array, Vector(0, 45, 1.250 * Event Player.af)); End; Event Player.am = Event Player .ao[0]; Event Player.ak = Array(Null, Null); Event Player.aj = Array(); Create In-World Text(Event Player.ak[0], Icon String(Arrow: Left), Event Player.am + Vector(4.500, 0, 0), 1.250, Clip Against Surfaces, Visible To Position and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ak[1], Icon String(Arrow: Right), Event Player.am + Vector(-4.500, 0, 0), 1.250, Clip Against Surfaces, Visible To Position and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create Beam Effect(Event Player, Bad Beam, Event Player .am + Vector(-4.500, 0, -0.500), Event Player .am + Vector(4.500, 0, -0.500), Event Player.bb, Position Radius and Color); Event Player.ba[10] = Last Created Entity; Create Beam Effect(Event Player, Bad Beam, Event Player .am + Vector(-4.500, 0, -1.500), Event Player .am + Vector(4.500, 0, -1.500), Event Player.bb, Position Radius and Color); Event Player.ba[11] = Last Created Entity; Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("๋์ด๋: {0}", Event Player .az[Event Player.ay]) : Custom String("Difficulty: {0}", Event Player.az[Event Player.ay]), Event Player.ao[0], 1.500, Clip Against Surfaces, Visible To String and Color, Global.ad[Event Player.ay], Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("ํ์ํ ํฌ ์: {0}", Event Player .bn == Global.y ? Custom String("๋ฌดํ") : Event Player.bn) : Custom String("Kill Goal: {0}", Event Player .bn == Global.y ? Custom String("Infinite") : Event Player.bn), Event Player.ao[1], 1.500, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Custom String("Preset: {0}", Global.ac[Event Player.cb]), Event Player.ao[2], 1.250, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("์์ ์ ํ: {0}", Event Player .bi[Event Player.aq]) : Custom String("Bot Hero Role: {0}", Event Player.bi[Event Player .aq]), Event Player.ao[3], 1.500, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("๋น ๋ฅธ ๋ชจ๋: {0}", Event Player .bu == True ? Custom String("ํ์ฑํ") : Custom String("๋นํ์ฑํ")) : Custom String("Quick Mode: {0}", Players In Slot( Slot Of(Event Player), Team 1).bu == True ? Custom String("On") : Custom String("Off")), Players In Slot( Slot Of(Event Player), Team 1).ao[4], 1.500, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("๊ฐ์ ์์ ๋ชจ๋: {0}", Event Player .bq == True ? Custom String("ํ์ฑํ") : Custom String("๋นํ์ฑํ")) : Custom String("Mirror Mode: {0}", Event Player.bq == True ? Custom String("On") : Custom String("Off")), Event Player.ao[5], 1.500, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("1 ์ด ์ฟจ ๋ค์ด ๋ชจ๋: {0}", Event Player .br == 3 ? Custom String("ํ๋ ์ด์ด + ์ธ๊ณต ์ง๋ฅ") : (Event Player .br == 2 ? Custom String("์ธ๊ณต์ง๋") : (Event Player .br == 1 ? Custom String("ํ๋ ์ด์ด") : Custom String("๋นํ์ฑํ")))) : Custom String("1 Sec Cooldown Mode: {0}", Event Player.br == 3 ? Custom String("Player & Bot") : (Players In Slot( Slot Of(Event Player), Team 1).br == 2 ? Custom String("Bot") : (Event Player .br == 1 ? Custom String("Player") : Custom String("Off")))), Event Player .ao[6], 1.250, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("ํฌ ์ ์ ํจ๋ํฐ: {0}", Event Player .bp) : Custom String("Points Lost On Death: {0}", Event Player.bp == Global.y ? Custom String("All") : Event Player.bp), Event Player.ao[7], 1.500, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("ํ๋ ์ด์ด ์น์ : {0}", Event Player .by == True ? Custom String("ํ์ฑํ") : Custom String("๋นํ์ฑํ")) : Custom String("Player Healing: {0}", Event Player.by == True ? Custom String("On") : Custom String("Off")), Event Player.ao[8], 1.500, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("์ธ๊ณต์ง๋ ์น์ : {0}", Event Player .bz == True ? Custom String("ํ์ฑํ") : Custom String("๋นํ์ฑํ")) : Custom String("Bot Healing: {0}", Event Player.bz == True ? Custom String("On") : Custom String("Off")), Event Player.ao[9], 1.500, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("ํ๋ ์ด์ด๋ ์ฃฝ์ผ ์ ์๋ค: {0}", Event Player .bv == True ? Custom String("ํ์ฑํ") : Custom String("๋นํ์ฑํ")) : Custom String("Player Unkillable: {0}", Event Player.bv == 3 ? Custom String("On (Invincible)") : Event Player.bv == 2 ? Custom String("On (Phased Out)") : Event Player.bv == 1 ? Custom String("On (Unkillable)") : Custom String("Off")), Event Player.ao[10], 1.500, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("์ธ๊ณต์ง๋ ๊ถ๊ทน์ ์ธ ์ฅ์ ์ธ: {0}", Event Player .ca == True ? Custom String("ํ์ฑํ") : Custom String("๋นํ์ฑํ")) : Custom String("Disable Bot Ultimate: {0}", Event Player.ca == True ? Custom String("On") : Custom String("Off")), Event Player.ao[11], 1.500, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("์ธ๊ณต์ง๋ ๊น๋ฐ๊ฑฐ๋ฆฌ๋: {0}", Event Player .bx == True ? Custom String("ํ์ฑํ") : Custom String("๋นํ์ฑํ")) : Custom String("Bot Flicker: {0}", Event Player.bx == True ? Custom String("On") : Custom String("Off")), Event Player.ao[12], 1.500, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("ํ๋ ์ด์ด ์๋ฆฌ๋ฒ ์ดํฐ: {0}", Event Player .bc == True ? Custom String("ํ์ฑํ") : Custom String("๋นํ์ฑํ")) : Custom String("Player Elevator: {0}", Event Player.bc == True ? Custom String("On") : Custom String("Off")), Event Player.ao[13], 1.500, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("์๊น: {0}", Event Player.bb) : Custom String("Bubble & Effect Color: {0}", Event Player.bb), Players In Slot( Slot Of(Event Player), Team 1).ao[14], 1.500, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Create In-World Text(Event Player.ap, Event Player.bo == 1 ? Custom String("์ธ์ด: {0}", Event Player .bo == 1 ? Custom String("ํ๊ตญ์ด") : Custom String("English")) : Custom String("Language: {0}", Players In Slot(Slot Of( Event Player), Team 1).bo == 1 ? Custom String("ํ๊ตญ์ด") : Custom String("English")), Players In Slot(Slot Of( Event Player), Team 1).ao[15], 1.500, Clip Against Surfaces, Visible To and String, Color(White), Default Visibility); Modify Player Variable(Event Player, aj, Append To Array, Last Text ID); Call Subroutine(ad); Stop Camera(Event Player); Call Subroutine(S); Start Camera(Event Player, Event Player .am - Vector(0, 15, 0.001), Event Player.am, 30); Event Player.al = True; Big Message(Event Player, Event Player .bo == 1 ? Custom String("๋ฉ๋ด๋ฅผ ํ์ํ๋ ค๋ฉด WASD ๋ฒํผ์ ์ฌ์ฉํ์ญ์์ค") : Custom String("Use WASD to navigate the menu")); Big Message(Event Player, Event Player .bo == 1 ? Custom String("[{0} ๋ฐ {1}]๋ฅผ ๊ธธ๊ฒ ๋๋ฅด๋ฉด ๋ฉ๋ด๊ฐ ๋ซํ๋๋ค", Input Binding String(Button(Reload)), Input Binding String( Button(Melee))) : Custom String("Press {0} and {1} to close the menu", Input Binding String(Button(Reload)), Input Binding String(Button(Melee)))); End; Play Effect(Event Player, Buff Explosion Sound, Color(White), Players In Slot(Slot Of( Event Player), Team 1).am - Vector(0, 15, 0), 75); } } rule("Global HUD") { event { Ongoing - Global; } conditions { Is Game In Progress == True; } actions { Create HUD Text(All Players(All Teams), Null, Custom String(" "), Custom String(" "), Left, -20, Color(White), Color(White), Color( White), Visible To, Default Visibility); Create HUD Text(All Players(All Teams), Null, Custom String(" "), Custom String(" "), Left, -20, Color(White), Color(White), Color( White), Visible To, Default Visibility); Create HUD Text(All Players(All Teams), Custom String("{0}", Global.G), Custom String("{0}+{1}, {2}", Global.D, Global.c, Global.j), Custom String("Raven's AI Dome"), Left, -3, Global.h, Global.g, Global.i, Visible To, Default Visibility); Create HUD Text(Global.aa, Custom String(""), Custom String("Press {0} and {1} to show/hide info", Input Binding String(Button(Crouch)), Input Binding String(Button(Interact))), Null, Left, -1.890, Color(White), Color(White), Color(White), Visible To and String, Default Visibility); Create HUD Text(Global.aa, Custom String(""), Custom String("Hold {0} and {1} to change heroes", Input Binding String(Button(Crouch)), Input Binding String(Button(Reload))), Null, Left, -1.800, Color(White), Color(White), Color(White), Visible To and String, Default Visibility); Create HUD Text(Global.aa, Custom String(""), Custom String("Hold {0} and press {1} or {2} to cycle enemy hero", Input Binding String(Button(Interact)), Input Binding String(Button(Primary Fire)), Input Binding String(Button( Secondary Fire))), Null, Left, -1.600, Color(White), Color(White), Color(Yellow), Visible To and String, Default Visibility); Create HUD Text(Global.aa, Custom String(""), Custom String("Hold {0} and {1} to select specific enemy hero", Input Binding String(Button(Interact)), Input Binding String(Button(Reload))), Custom String( "Press {0} and {1} to open/close the menu", Input Binding String(Button(Reload)), Input Binding String(Button(Melee))), Left, -1.500, Color(White), Color(White), Global.d, Visible To and String, Default Visibility); Create HUD Text(Global.ab, Custom String(""), Custom String("๋ฒํผ์ [{0} ๋ฐ {1}] ๋๋ฌ ํํธ ์ฐฝ์ ๋ซ์ต๋๋ค", Input Binding String( Button(Crouch)), Input Binding String(Button(Interact))), Null, Left, -1.890, Color(White), Color(White), Color(White), Visible To and String, Default Visibility); Create HUD Text(Global.ab, Custom String(""), Custom String("๋ฒํผ [{0} ๋ฐ {1}] ๋ฅผ ๊ธธ๊ฒ ๋๋ฌ ์์ ์ ํ", Input Binding String( Button(Crouch)), Input Binding String(Button(Reload))), Null, Left, -1.800, Color(White), Color(White), Color(White), Visible To and String, Default Visibility); Create HUD Text(Global.ab, Custom String(""), Custom String("๋ฒํผ [{0} ๋ฐ {1}] ๋ฅผ ๊ธธ๊ฒ ๋๋ฌ AI ์์ ์ ์ํํฉ๋๋ค.", Input Binding String(Button(Interact)), Input Binding String(Button(Primary Fire)), Input Binding String(Button( Secondary Fire))), Null, Left, -1.600, Color(White), Color(White), Color(Yellow), Visible To and String, Default Visibility); Create HUD Text(Global.ab, Custom String(""), Custom String("๋ฒํผ [{0} ๋ฐ {1}] ๋ฅผ ๊ธธ๊ฒ ๋๋ฌ AI ์์ ์ ์ ํํฉ๋๋ค", Input Binding String(Button(Interact)), Input Binding String(Button(Reload))), Custom String("[{0} ๋ฐ {1}] ๋ฒํผ์ ๊ธธ๊ฒ ๋๋ฌ ๋ฉ๋ด๋ฅผ ์ ํํฉ๋๋ค", Input Binding String(Button(Reload)), Input Binding String(Button(Melee))), Left, -1.500, Color(White), Color(White), Global.d, Visible To and String, Default Visibility); Create HUD Text(Global.Y, Custom String("Welcome to Raven's AI Dome!"), Global.C, Custom String( "Created by {0}", Global.j), Top, 3, Global.i, Global.h, Global.h, Visible To and String, Default Visibility); Create HUD Text(Global.Y, Custom String(""), Custom String( "This workshop mode allows you to thoroughly warm up/practice your movement and aim on and against ALL heroes."), Custom String( "You are placed in a bubble against one bot opponent. When you kill them enough times it progresses to the next hero in the list."), Top, 5, Color(Yellow), Color(White), Global.d, Visible To and String, Default Visibility); Create HUD Text(Global.Y, Custom String(""), Null, Custom String( "The AI modes contain AI for all heroes written from scratch by myself. The bots do not attack below the difficulty \"AI Bronze\"."), Top, 5.100, Color(Yellow), Color(White), Color(White), Visible To and String, Default Visibility); Create HUD Text(Global.Y, Custom String(""), Null, Custom String( "There are many difficulties and they correspond to many variables that affect the bots' movement, aim, and reaction time."), Top, 5.120, Color(Yellow), Color(White), Color(White), Visible To and String, Default Visibility); Create HUD Text(Global.Y, Custom String(""), Null, Custom String("Press {0} and {1} to toggle the menu!", Input Binding String(Button(Reload)), Input Binding String(Button(Melee))), Top, 5.200, Color(White), Color(White), Global.e, Visible To and String, Default Visibility); Create HUD Text(Global.Y, Custom String(""), Custom String( "There are many settings so you can customize your warmup!"), Custom String("See the top left corner for controls."), Top, 5.300, Color(Yellow), Color(White), Global.e, Visible To and String, Default Visibility); Create HUD Text(Global.Y, Custom String(""), Custom String("{0}", Global.l), Custom String("For the most recent version: Please import code: {0}", Global.G), Top, 7, Color(Yellow), Global.i, Global.h, Visible To and String, Default Visibility); Create HUD Text(Global.Y, Custom String(""), Custom String("Press {0} and {1} to hide this text", Input Binding String(Button(Crouch)), Input Binding String(Button(Interact))), Null, Top, 8, Color(Yellow), Global.g, Color(Sky Blue), Visible To and String, Default Visibility); Create HUD Text(Global.Z, Custom String("Raven's AI Dome ์ด์ ์ค์ญ์์ค!"), Global.C, Custom String( "์ฐฝ์กฐ์: {0}", Global.j), Top, 3, Global.i, Global.h, Global.h, Visible To and String, Default Visibility); Create HUD Text(Global.Z, Custom String(""), Custom String("์ด ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฐ์ ํ๊ณ ์ฒ ์ ํ๊ฒ ์ฐ์ต ํ ์ ์์ต๋๋ค."), Custom String( "์ ์ ์ถฉ๋ถํ ํ์๋ก ์ฒ์นํ๋ฉด ๋ค์ ์์ ์ด ์์ฑ๋ฉ๋๋ค."), Top, 5, Color(Yellow), Color(White), Global.d, Visible To and String, Default Visibility); Create HUD Text(Global.Z, Custom String(""), Null, Custom String( "๋๋ ๋ชจ๋ ์์ ์ ์ํด ์ธ๊ณต ์ง๋ฅ์ ํ๋ก๊ทธ๋๋ฐํ์ต๋๋ค. ๋์ด๋๊ฐ \"์ธ๊ณต์ง๋ฅ ๋ธ๋ก ์ฆ\" ๋ฏธ๋ง์ด๋ฉด ๋ด์ ๊ณต๊ฒฉํ์ง ์์ต๋๋ค."), Top, 5.100, Color(Yellow), Color(White), Color(White), Visible To and String, Default Visibility); Create HUD Text(Global.Z, Custom String(""), Null, Custom String("๋์ด๋์ ์ธ๊ณต ์ง๋ฅ์ ์์ง์, ๊ฒจ๋ฅ, ๋ฐ์ ์๊ฐ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค."), Top, 5.120, Color(Yellow), Color(White), Color(White), Visible To and String, Default Visibility); Create HUD Text(Global.Z, Custom String(""), Null, Custom String("[{0} ๋ฐ {1}] ๋ฒํผ์ ๊ธธ๊ฒ ๋๋ฌ ๋ฉ๋ด๋ฅผ ์ ํํฉ๋๋ค!", Input Binding String(Button(Reload)), Input Binding String(Button(Melee))), Top, 5.200, Color(White), Color(White), Global.e, Visible To and String, Default Visibility); Create HUD Text(Global.Z, Custom String(""), Custom String("๋น์ ์ด ๋น์ ์ ์ฐ์ต ๋ฃจํด์ ์ฌ์ฉ์ ์ ์ ํ ์ ์๋๋ก ๋ง์ ์ค์ ์ด ์์ต๋๋ค!"), Custom String("์ปจํธ๋กค์ ์ผ์ชฝ ์๋จ์ ์ฐธ์กฐํ์ญ์์ค."), Top, 5.300, Color(Yellow), Color(White), Global.e, Visible To and String, Default Visibility); Create HUD Text(Global.Z, Custom String(""), Custom String( "{0}", Global.l), Custom String( "์ต์ ๋ฒ์ ์ ์ป์ผ๋ ค๋ฉด ์ฝ๋ {0}๋ฅผ ์ฌ์ฉํ์ญ์์ค!", Global.G), Top, 7, Color(Yellow), Global.i, Global.h, Visible To and String, Default Visibility); Create HUD Text(Global.Z, Custom String(""), Custom String("์ด ์ ๋ณด๋ฅผ ์จ๊ธฐ๋ ค๋ฉด {0} ๋ฐ {1} ๋ฒํผ์ ์ฌ์ฉํ์ญ์์ค", Input Binding String(Button(Crouch)), Input Binding String(Button(Interact))), Null, Top, 8, Color(Yellow), Global.g, Color(Sky Blue), Visible To and String, Default Visibility); If(Global.L == True); Create HUD Text(Null, Custom String("Server Load: {0}% ({1})", Round To Integer(Server Load / 2.550, Down), Server Load), Custom String("Average: {0}% ({1})", Round To Integer(Server Load Average / 2.550, Down), Server Load Average), Custom String( "Peak: {0}% ({1})", Round To Integer(Server Load Peak / 2.550, Down), Server Load Peak), Top, 100, Global.h, Global.i, Global.e, Visible To and String, Visible Always); End; } } rule("Player Sky Menu Toggle") { event { Ongoing - Each Player; Team 1; All; } conditions { Is Button Held(Event Player, Button(Melee)) == True; Is Button Held(Event Player, Button(Reload)) == True; Event Player.bt == True; } actions { Call Subroutine(S); Call Subroutine(af); } } rule("Player Sky Menu Move Selection Up") { event { Ongoing - Each Player; Team 1; All; } conditions { Event Player.al == True; Throttle Of(Event Player) == Forward; } actions { Event Player.an = 3; Call Subroutine(ae); If(Event Player.am == Event Player.ao[0]); Event Player.am = Last Of(Event Player.ao); Else; Event Player.am = Event Player.ao[Index Of Array Value(Event Player.ao, Event Player.am) - 1]; End; Call Subroutine(ad); } } rule("Player Sky Menu Move Selection Down") { event { Ongoing - Each Player; Team 1; All; } conditions { Event Player.al == True; Throttle Of(Event Player) == Backward; } actions { Event Player.an = 3; Call Subroutine(ae); If(Event Player.am == Event Player.ao[Count Of(Event Player.ao) - 1]); Event Player.am = Event Player.ao[0]; Else; Event Player.am = Event Player.ao[Index Of Array Value(Event Player.ao, Event Player.am) + 1]; End; Call Subroutine(ad); } } rule("Player Sky Menu Move Selection Decrease") { event { Ongoing - Each Player; Team 1; All; } conditions { Event Player.al == True; Throttle Of(Event Player) == Left; } actions { If(Event Player.am == Event Player.ao[0] && Event Player.ay > 0); Event Player.an = 2; Call Subroutine(ae); Event Player.ay -= 1; Call Subroutine(ai); Else If(Event Player.am == Event Player.ao[1] && Event Player.bu == False); Event Player.an = 2; Call Subroutine(ae); If(Event Player.bn <= 4); Event Player.bn = Global.y; Else If(Event Player.bn == Global.y); Event Player.bn = 64; Else; Event Player.bn -= 4; End; If(Event Player.Q >= Event Player.bn); Event Player.Q = Event Player.bn - 1; End; Else If(Event Player.am == Event Player.ao[2]); Event Player.an = 2; Call Subroutine(ae); If(Event Player.cb == 0); Event Player.cb = Count Of(Global.ac) - 1; Else; Event Player.cb -= 1; End; Else If(Event Player.am == Event Player.ao[3]); Event Player.an = 2; Call Subroutine(ae); If(Event Player.aq > 0); Event Player.aq -= 1; Else; Event Player.aq = 3; End; Else If(Event Player.am == Event Player.ao[4] && Event Player.bu == True); Event Player.an = 1; Call Subroutine(ae); Call Subroutine(ah); Else If(Event Player.am == Event Player.ao[5] && Event Player.bq == True); Event Player.an = 1; Call Subroutine(ae); Event Player.bq = False; Else If(Event Player.am == Event Player.ao[6]); Event Player.an = 2; Call Subroutine(ae); If(Event Player.br == 0); Event Player.br = 3; Else; Event Player.br -= 1; End; Else If(Event Player.am == Event Player.ao[7]); Event Player.an = 1; Call Subroutine(ae); If(Event Player.bp == 0); Event Player.bp = Global.y; Else If(Event Player.bp == Global.y); Event Player.bp = 10; Else; Event Player.bp -= 1; End; Else If(Event Player.am == Event Player.ao[8] && Event Player.by == True); Event Player.an = 1; Call Subroutine(ae); Event Player.by = False; Else If(Event Player.am == Event Player.ao[9] && Event Player.bz == True); Event Player.an = 1; Call Subroutine(ae); Event Player.bz = False; Else If(Event Player.am == Event Player.ao[10]); Event Player.an = 1; Call Subroutine(ae); If(Event Player.bv > 0); Event Player.bv -= 1; Else; Event Player.bv = 3; End; Call Subroutine(ap); Else If(Event Player.am == Event Player.ao[11] && Event Player.ca == True); Event Player.an = 1; Call Subroutine(ae); Set Ultimate Ability Enabled(Players In Slot(Slot Of(Event Player), Team 2), True); Event Player.ca = False; Else If(Event Player.am == Event Player.ao[12] && Event Player.bx == True); Event Player.an = 1; Call Subroutine(ae); Event Player.bx = False; Else If(Event Player.am == Event Player.ao[13] && Event Player.bc == True); Event Player.an = 1; Call Subroutine(ae); Event Player.bc = False; Stop Chasing Player Variable(Event Player, bd); Event Player.bd = 0; Stop Accelerating(Event Player); Set Jump Enabled(Event Player, True); Set Crouch Enabled(Event Player, True); Set Gravity(Event Player, 100); Else If(Event Player.am == Event Player.ao[14]); Event Player.an = 2; Call Subroutine(ae); If(Event Player.bb == Global.f[0]); Event Player.bb = Global.f[Count Of(Global.f) - 1]; Else; Event Player.bb = Global.f[Index Of Array Value(Global.f, Event Player.bb) - 1]; End; Else If(Event Player.am == Event Player.ao[15] && Event Player.bo == 1); Event Player.an = 2; Call Subroutine(ae); Event Player.bo = 0; Call Subroutine(am); Call Subroutine(al); End; Call Subroutine(ad); } } rule("Player Sky Menu Move Selection Increase") { event { Ongoing - Each Player; Team 1; All; } conditions { Event Player.al == True; Throttle Of(Event Player) == Right; } actions { If(Event Player.am == Event Player.ao[0] && Event Player.ay < 10); Event Player.an = 2; Call Subroutine(ae); Event Player.ay += 1; Call Subroutine(ai); Else If(Event Player.am == Event Player.ao[1] && Event Player.bu == False); Event Player.an = 2; Call Subroutine(ae); If(Event Player.bn == 64); Event Player.bn = Global.y; Else If(Event Player.bn == Global.y); Event Player.bn = 4; Else; Event Player.bn += 4; End; If(Event Player.Q >= Event Player.bn); Event Player.Q = Event Player.bn - 1; End; Else If(Event Player.am == Event Player.ao[2]); Event Player.an = 2; Call Subroutine(ae); If(Event Player.cb == Count Of(Global.ac) - 1); Event Player.cb = 0; Else; Event Player.cb += 1; End; Else If(Event Player.am == Event Player.ao[3]); Event Player.an = 2; Call Subroutine(ae); If(Event Player.aq < 3); Event Player.aq += 1; Else; Event Player.aq = 0; End; Else If(Event Player.am == Event Player.ao[4] && Event Player.bu == False); Event Player.an = 0; Call Subroutine(ae); Call Subroutine(ah); Else If(Event Player.am == Event Player.ao[5] && Event Player.bq == False); Event Player.an = 0; Call Subroutine(ae); Event Player.bq = True; Start Forcing Dummy Bot Name(Players In Slot(Slot Of(Event Player), Team 2), Event Player); Else If(Event Player.am == Event Player.ao[6]); Event Player.an = 2; Call Subroutine(ae); If(Event Player.br == 3); Event Player.br = 0; Else; Event Player.br += 1; End; Else If(Event Player.am == Event Player.ao[7]); Event Player.an = 0; Call Subroutine(ae); If(Event Player.bp == Global.y); Event Player.bp = 0; Else If(Event Player.bp == 10); Event Player.bp = Global.y; Else; Event Player.bp += 1; End; Else If(Event Player.am == Event Player.ao[8] && Event Player.by == False); Event Player.an = 0; Call Subroutine(ae); Event Player.by = True; Else If(Event Player.am == Event Player.ao[9] && Event Player.bz == False); Event Player.an = 0; Call Subroutine(ae); Event Player.bz = True; Else If(Event Player.am == Event Player.ao[10]); Event Player.an = 0; Call Subroutine(ae); If(Event Player.bv < 3); Event Player.bv += 1; Else; Event Player.bv = 0; End; Call Subroutine(ap); Else If(Event Player.am == Event Player.ao[11] && Event Player .ca == False); Event Player.an = 0; Call Subroutine(ae); Set Ultimate Ability Enabled(Players In Slot(Slot Of(Event Player), Team 2), False); Event Player.ca = True; Else If(Event Player.am == Event Player.ao[12] && Event Player .bx == False); Event Player.an = 0; Call Subroutine(ae); Event Player.bx = True; Else If(Event Player.am == Event Player.ao[13] && Event Player .bc == False); Event Player.an = 0; Call Subroutine(ae); Event Player.bc = True; Set Jump Enabled(Event Player, False); Set Crouch Enabled(Event Player, False); Set Gravity(Event Player, 0); Small Message(Event Player, Event Player.bo == 1 ? Custom String("{0} = ์ฌ๋ฆฌ๋ค / {1} = ๋ฎ์ถ๋ค", Input Binding String(Button(Jump)), Input Binding String(Button(Crouch))) : Custom String("{0} to go Up / {1} to go Down", Input Binding String(Button(Jump)), Input Binding String(Button(Crouch)))); Else If(Event Player.am == Event Player.ao[14]); Event Player.an = 2; Call Subroutine(ae); If(Event Player.bb == Global.f[Count Of(Global.f) - 1]); Event Player.bb = Global.f[0]; Else; Event Player.bb = Global.f[Index Of Array Value(Global.f, Event Player.bb) + 1]; End; Else If(Event Player.am == Event Player.ao[15] && Event Player.bo == 0); Event Player.an = 2; Call Subroutine(ae); Event Player.bo = 1; Call Subroutine(am); Call Subroutine(al); End; Call Subroutine(ad); } } rule("Player Sky Menu Arrow Visibility") { event { Subroutine; ad; } actions { If(Event Player.am == Event Player.ao[0]); If(Event Player.ay == 0); Event Player.ak[0] = Null; Event Player.ak[1] = Event Player; Else If(Event Player.ay == 10); Event Player.ak[0] = Event Player; Event Player.ak[1] = Null; Else; Event Player.ak[0] = Event Player; Event Player.ak[1] = Event Player; End; Else If(Event Player.am == Event Player.ao[1]); Event Player.ak[0] = Event Player; Event Player.ak[1] = Event Player; Else If(Event Player.am == Event Player.ao[2]); Event Player.ak[0] = Event Player; Event Player.ak[1] = Event Player; Else If(Event Player.am == Event Player.ao[3]); Event Player.ak[0] = Event Player; Event Player.ak[1] = Event Player; Else If(Event Player.am == Event Player.ao[4]); If(Event Player.bu == False); Event Player.ak[0] = Null; Event Player.ak[1] = Event Player; Else If(Event Player.bu == True); Event Player.ak[1] = Null; Event Player.ak[0] = Event Player; End; Else If(Event Player.am == Event Player.ao[5]); If(Event Player.bq == False); Event Player.ak[0] = Null; Event Player.ak[1] = Event Player; Else If(Event Player.bq == True); Event Player.ak[1] = Null; Event Player.ak[0] = Event Player; End; Else If(Event Player.am == Event Player.ao[6]); Event Player.ak[0] = Event Player; Event Player.ak[1] = Event Player; Else If(Event Player.am == Event Player.ao[7]); Event Player.ak[0] = Event Player; Event Player.ak[1] = Event Player; Else If(Event Player.am == Event Player.ao[8]); If(Event Player.by == False); Event Player.ak[0] = Null; Event Player.ak[1] = Event Player; Else If(Event Player.by == True); Event Player.ak[1] = Null; Event Player.ak[0] = Event Player; End; Else If(Event Player.am == Event Player.ao[9]); If(Event Player.bz == False); Event Player.ak[0] = Null; Event Player.ak[1] = Event Player; Else If(Event Player.bz == True); Event Player.ak[1] = Null; Event Player.ak[0] = Event Player; End; Else If(Event Player.am == Event Player.ao[10]); Event Player.ak[0] = Event Player; Event Player.ak[1] = Event Player; Else If(Event Player.am == Event Player.ao[11]); If(Event Player.ca == False); Event Player.ak[0] = Null; Event Player.ak[1] = Event Player; Else If(Event Player.ca == True); Event Player.ak[1] = Null; Event Player.ak[0] = Event Player; End; Else If(Event Player.am == Event Player.ao[12]); If(Event Player.bx == False); Event Player.ak[0] = Null; Event Player.ak[1] = Event Player; Else If(Event Player.bx == True); Event Player.ak[1] = Null; Event Player.ak[0] = Event Player; End; Else If(Event Player.am == Event Player.ao[13]); If(Event Player.bc == False); Event Player.ak[0] = Null; Event Player.ak[1] = Event Player; Else If(Event Player.bc == True); Event Player.ak[1] = Null; Event Player.ak[0] = Event Player; End; Else If(Event Player.am == Event Player.ao[14]); If(Event Player.bo == 0); Event Player.ak[0] = Null; Event Player.ak[1] = Event Player; Else; Event Player.ak[1] = Null; Event Player.ak[0] = Event Player; End; Else; Event Player.ak[0] = Event Player; Event Player.ak[1] = Event Player; End; } } rule("Debug Toggle") { event { Ongoing - Each Player; Team 1; All; } conditions { Is Button Held(Event Player, Button(Ability 2)) == True; Is Button Held(Event Player, Button(Reload)) == True; Is Button Held(Event Player, Button(Jump)) == True; } actions { Wait(0.500, Abort When False); Call Subroutine(aa); } } rule("Info Toggle") { event { Ongoing - Each Player; Team 1; All; } conditions { Is Button Held(Event Player, Button(Interact)) == True; Is Button Held(Event Player, Button(Crouch)) == True; } actions { Start Rule(ab, Restart Rule); } } rule("ai") { event { Subroutine; ai; } actions { If(Event Player.ay == 3); Else If(Event Player.ay == 4); Else If(Event Player.ay == 5); Else If(Event Player.ay == 6); Else If(Event Player.ay == 7); Else If(Event Player.ay == 8); Else If(Event Player.ay == 9); Else If(Event Player.ay == 10); End; Players In Slot(Slot Of(Event Player), Team 2).p = Players In Slot(Slot Of(Event Player), Team 1).ay / 25; Players In Slot(Slot Of(Event Player), Team 2).s = 150 + 10 * Players In Slot(Slot Of(Event Player), Team 1) .ay; Players In Slot(Slot Of(Event Player), Team 2).t = 0.225 + 0.005 * Players In Slot(Slot Of(Event Player), Team 1) .ay; Players In Slot(Slot Of(Event Player), Team 2).u = 540 + 18 * Players In Slot(Slot Of(Event Player), Team 1) .ay; Players In Slot(Slot Of(Event Player), Team 2).v = 540 + 9 * Players In Slot(Slot Of(Event Player), Team 1) .ay; Players In Slot(Slot Of(Event Player), Team 2).w = 300 + 5 * Players In Slot(Slot Of(Event Player), Team 1) .ay; Players In Slot(Slot Of(Event Player), Team 2).x = 200 + 5 * Players In Slot(Slot Of(Event Player), Team 1) .ay; Players In Slot(Slot Of(Event Player), Team 2).I = 0.250 + 0.050 * (Global.q - Players In Slot(Slot Of( Event Player), Team 1).ay); Players In Slot(Slot Of(Event Player), Team 2).T = 0.100 + Players In Slot(Slot Of(Event Player), Team 1) .ay * 0.010; Players In Slot(Slot Of(Event Player), Team 2).V = 0.080 * Players In Slot(Slot Of(Event Player), Team 1) .ay; Players In Slot(Slot Of(Event Player), Team 2).W = 0.160 + Players In Slot(Slot Of(Event Player), Team 1) .ay * 0.030; Players In Slot(Slot Of(Event Player), Team 2).Y = 1 + Players In Slot(Slot Of(Event Player), Team 1) .ay * 0.070; Players In Slot(Slot Of(Event Player), Team 2).aa = 2 - 0.100 * Players In Slot(Slot Of(Event Player), Team 1) .ay; If(Players In Slot(Slot Of(Event Player), Team 1).ay < 3); Clear Status(Players In Slot(Slot Of(Event Player), Team 2), Unkillable); End; } } rule("ak") { event { Subroutine; ak; } actions { If(Array Contains(All Heroes, Global.K[1])); Players In Slot(Slot Of(Event Player), Team 1).bn = Global.y; Players In Slot(Slot Of(Event Player), Team 1).bj = Array(Global.K[1]); Players In Slot(Slot Of(Event Player), Team 1).bk = Global.K[1]; Else; If(Players In Slot(Slot Of(Event Player), Team 1).bk != Players In Slot(Slot Of(Event Player), Team 1) .bi[Players In Slot(Slot Of(Event Player), Team 1).aq]); Players In Slot(Slot Of(Event Player), Team 1).bj = Randomized Array(Global.m[Players In Slot(Slot Of( Event Player), Team 1).aq]); Players In Slot(Slot Of(Event Player), Team 1).bk = Players In Slot(Slot Of(Event Player), Team 1) .bi[Players In Slot(Slot Of(Event Player), Team 1).aq]; End; End; } } rule("Player Set Language") { event { Subroutine; am; } actions { If(Event Player.bo == 1); Modify Global Variable(aa, Remove From Array By Value, Event Player); Modify Global Variable(ab, Append To Array, Event Player); Else; Modify Global Variable(ab, Remove From Array By Value, Event Player); Modify Global Variable(aa, Append To Array, Event Player); End; } } rule("Player Set Names") { event { Subroutine; al; } actions { Players In Slot(Slot Of(Event Player), Team 1).az = Array(); Players In Slot(Slot Of(Event Player), Team 1).az[0] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("์์ ํ๊ณ ์ฌ์") : Custom String("No AI Easy"); Players In Slot(Slot Of(Event Player), Team 1).az[1] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("์์ ํ๊ณ ์ค๊ฐ") : Custom String("No AI Medium"); Players In Slot(Slot Of(Event Player), Team 1).az[2] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("์์ ํ๊ณ ๊ณค๋ํ") : Custom String("No AI Hard"); Players In Slot(Slot Of(Event Player), Team 1).az[3] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("์ธ๊ณต์ง๋ฅ ๋ธ๋ก ์ฆ") : Custom String("AI Bronze"); Players In Slot(Slot Of(Event Player), Team 1).az[4] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("์ธ๊ณต์ง๋ฅ ์ค๋ฒ") : Custom String("AI Silver"); Players In Slot(Slot Of(Event Player), Team 1).az[5] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("์ธ๊ณต์ง๋ฅ ๊ณจ๋") : Custom String("AI Gold"); Players In Slot(Slot Of(Event Player), Team 1).az[6] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("์ธ๊ณต์ง๋ฅ ํ๋ํฐ๋") : Custom String("AI Platinum"); Players In Slot(Slot Of(Event Player), Team 1).az[7] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("์ธ๊ณต์ง๋ฅ ๋ค์ด์๋ชฌ๋") : Custom String("AI Diamond"); Players In Slot(Slot Of(Event Player), Team 1).az[8] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("์ธ๊ณต์ง๋ฅ ๋ง์คํฐ") : Custom String("AI Master"); Players In Slot(Slot Of(Event Player), Team 1).az[9] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("์ธ๊ณต์ง๋ฅ ๊ทธ๋๋๋ง์คํฐ") : Custom String("AI Grandmaster"); Players In Slot(Slot Of(Event Player), Team 1).az[10] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("์ธ๊ณต์ง๋ฅ ์์500์") : Custom String("AI Top 500"); Players In Slot(Slot Of(Event Player), Team 1).bi = Array(); Players In Slot(Slot Of(Event Player), Team 1).bi[0] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("๋ชจ๋ ") : Custom String("All"); Players In Slot(Slot Of(Event Player), Team 1).bi[1] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("๋๊ฒฉ") : Custom String("Tank"); Players In Slot(Slot Of(Event Player), Team 1).bi[2] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("๊ณต๊ฒฉ") : Custom String("Damage"); Players In Slot(Slot Of(Event Player), Team 1).bi[3] = Players In Slot(Slot Of(Event Player), Team 1) .bo == 1 ? Custom String("์ง์") : Custom String("Support"); } } rule("Player Set Distances") { event { Subroutine; aj; } actions { Players In Slot(Slot Of(Event Player), Team 1).bw = Global.H; If(Array Contains(Global.p, Hero Of(Players In Slot(Slot Of(Event Player), Team 1))) == True); Players In Slot(Slot Of(Event Player), Team 1).bf = Global.o; Else If(Array Contains(Global.s, Hero Of(Players In Slot(Slot Of(Event Player), Team 1))) == True); Players In Slot(Slot Of(Event Player), Team 1).bf = Global.r; Else If(Array Contains(Global.B, Hero Of(Players In Slot(Slot Of(Event Player), Team 1))) == True); Players In Slot(Slot Of(Event Player), Team 1).bf = Global.A; Else If(Array Contains(Global.n, Hero Of(Players In Slot(Slot Of(Event Player), Team 1))) == True); Players In Slot(Slot Of(Event Player), Team 1).bf = Global.A; Players In Slot(Slot Of(Event Player), Team 1).bw = Players In Slot(Slot Of(Event Player), Team 1).bf; Else If(Array Contains(Global.F, Hero Of(Players In Slot(Slot Of(Event Player), Team 1))) == True); Players In Slot(Slot Of(Event Player), Team 1).bf = Global.E; Players In Slot(Slot Of(Event Player), Team 1).bw = Players In Slot(Slot Of(Event Player), Team 1).bf; End; } } rule("ah") { event { Subroutine; ah; } actions { If(Event Player.bu); Event Player.bn = Global.Q; Event Player.bu = False; Else; Event Player.Q = 0; Event Player.bn = 1; Event Player.bu = True; End; } } rule("ag") { event { Subroutine; ag; } actions { Start Forcing Throttle(Event Player, 0, 0, 0, 0, 0, 0); Stop Chasing Player Variable(Event Player, bd); Start Forcing Player Position(Event Player, Vector(X Component Of(Event Player.bm), Event Player.bd, Z Component Of(Event Player.bm)), True); Chase Player Variable Over Time(Event Player, bd, (Event Player.R[0] == 1 ? 2 : -2) + Event Player.bd - Event Player.bd % 2, 0.250, None); Wait(0.250, Ignore Condition); Loop If Condition Is True; Wait(0.250, Ignore Condition); Stop Forcing Player Position(Event Player); Stop Forcing Throttle(Event Player); Event Player.be = Array(); Event Player.be[0] = Position Of(Event Player); Wait(0.100, Ignore Condition); Event Player.be[1] = Position Of(Event Player); Apply Impulse(Event Player, Direction Towards(Event Player.be[1], Event Player.be[0]), Speed Of In Direction(Event Player, Direction Towards(Event Player.be[0], Event Player.be[1])), To World, Incorporate Contrary Motion); Small Message(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bo == 1 ? Custom String("๋์ด: {0} ๋ฏธํฐ", Event Player.bd) : Custom String("Height: {0} Meters", Event Player.bd)); } } rule("ap") { event { Subroutine; ap; } actions { Clear Status(Event Player, Unkillable); Clear Status(Event Player, Phased Out); Clear Status(Event Player, Invincible); If(Event Player.bv == 1); Set Status(Event Player, Null, Unkillable, Global.y); Else If(Event Player.bv == 2); Set Status(Event Player, Null, Phased Out, Global.y); Else If(Event Player.bv == 3); Set Status(Event Player, Null, Invincible, Global.y); End; } } rule("aq") { event { Subroutine; aq; } actions { If(Event Player.cb == 0); Event Player.cc = Global.ac[Event Player.cb]; Event Player.bn = Global.Q; Event Player.bp = 0; Event Player.br = 0; Small Message(Event Player, Custom String("Preset Cleared")); Else If(Event Player.cb == 1); If(Event Player.aq != 0); Event Player.aq = 0; Call Subroutine(ak); End; Event Player.ar = Index Of Array Value(Event Player.bj, Hero(Widowmaker)); Call Subroutine(X); If(Hero Of(Event Player) != Hero(Widowmaker)); Start Forcing Player To Be Hero(Event Player, Hero(Widowmaker)); Stop Forcing Player To Be Hero(Event Player); End; Event Player.br = 0; Event Player.bn = Global.y; Small Message(Event Player, Custom String("Preset: Widowmaker 1v1")); Else If(Event Player.cb == 2); If(Event Player.aq != 0); Event Player.aq = 0; Call Subroutine(ak); End; Event Player.ar = Index Of Array Value(Event Player.bj, Hero(Reinhardt)); Call Subroutine(X); If(Hero Of(Event Player) != Hero(Reinhardt)); Start Forcing Player To Be Hero(Event Player, Hero(Reinhardt)); Stop Forcing Player To Be Hero(Event Player); End; Event Player.br = 0; Event Player.bp = 2; Event Player.bn = 32; Small Message(Event Player, Custom String("Preset: Reinhardt 1v1")); Else If(Event Player.cb == 3); If(Hero Of(Event Player) != Hero(Roadhog)); Start Forcing Player To Be Hero(Event Player, Hero(Roadhog)); Stop Forcing Player To Be Hero(Event Player); End; Event Player.br = 1; Event Player.bn = Global.Q; Small Message(Event Player, Custom String("Preset: Roadhog Low Cooldown")); Else If(Event Player.cb == 4); If(Hero Of(Event Player) != Hero(Ana)); Start Forcing Player To Be Hero(Event Player, Hero(Ana)); Stop Forcing Player To Be Hero(Event Player); End; Event Player.br = 1; Event Player.bn = Global.Q; Small Message(Event Player, Custom String("Preset: Ana Low Cooldown")); Else If(Event Player.cb == 5); Event Player.bn = 8; Event Player.bp = 1; Event Player.by = True; Event Player.bz = True; Event Player.br = 0; Event Player.ay = 9; Call Subroutine(ai); Small Message(Event Player, Custom String("Preset: Hard, Thorough Warmup")); Else If(Event Player.cb == 6); Event Player.bn = 8; Event Player.bp = 0; Event Player.by = True; Event Player.bz = False; Event Player.br = 0; Event Player.ay = 0; Call Subroutine(ai); Small Message(Event Player, Custom String("Preset: Easy, Thorough Warmup")); End; Call Subroutine(aj); } } rule("Player Init") { event { Ongoing - Each Player; Team 1; All; } conditions { Global.P == True; Event Player.bt == False; Has Spawned(Event Player) == True; } actions { Call Subroutine(R); Start Facing(Event Player, Vector(0, 0, 0), 1000, To World, None); Start Forcing Throttle(Event Player, 0, 0, 0, 0, 0, 0); Event Player.bo = Global.R; Call Subroutine(am); Start Rule(ab, Restart Rule); Disable Game Mode HUD(Event Player); Disable Hero HUD(Event Player); Event Player.au = Vector(0, Global.b * 2, 0); Event Player.av = Vector(0, 200, 0); Start Camera(Event Player, Event Player.au, Event Player.av, 10); Call Subroutine(al); Event Player.Q = 0; Event Player.ar = 0; Event Player.aq = Global.O; Event Player.bl = 0; Event Player.bn = Global.Q; Call Subroutine(ak); Event Player.ah = False; Event Player.by = Global.T; Event Player.br = False; Event Player.bp = 0; Event Player.bq = False; Event Player.cb = 0; Event Player.cc = Global.ac[Event Player.cb]; Event Player.ay = Global.N; Event Player.bb = Global.f[0]; Event Player.bw = Global.H; Event Player.bs = Hero Of(Event Player); Call Subroutine(aj); Event Player.ag = Array(); Event Player.ad = Array(); Event Player.aj = Array(); If(Slot Of(Event Player) == 0); Event Player.bm = Vector(-380 + Global.b, 0, 380 - Global.b); Else If(Slot Of(Event Player) == 1); Event Player.bm = Vector(380 - Global.b, 0, -380 + Global.b); Else If(Slot Of(Event Player) == 2); Event Player.bm = Vector(380 - Global.b, 0, 380 - Global.b); Else If(Slot Of(Event Player) == 3); Event Player.bm = Vector(-380 + Global.b, 0, -380 + Global.b); Else If(Slot Of(Event Player) == 4); Event Player.bm = Vector(0, 0, 380 - Global.b); Else If(Slot Of(Event Player) == 5); Event Player.bm = Vector(0, 0, -380 + Global.b); End; Event Player.ba = Array(); Create Effect(All Players(All Teams), Sphere, Event Player.bb, Event Player.bm, Global.b, Color); Event Player.ba[0] = Last Created Entity; Create Effect(All Players(All Teams), Ring, Event Player.bb, Event Player.bm, Event Player.bw + 1.250, Position Radius and Color); Event Player.ba[1] = Last Created Entity; Create Effect(All Players(All Teams), Light Shaft, Event Player.bb, Event Player.bm, Event Player.bf + 1.250, Position Radius and Color); Event Player.ba[2] = Last Created Entity; Wait(1, Ignore Condition); Event Player.av = Event Player.bm; Small Message(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bo == 1 ? Custom String("๋ฉ๋ด๋ฅผ ์ด์ด ํ๊ฒฝ ์ค์ ์ ๊ตฌ์ฑํ์ญ์์ค.") : Custom String("Open menu for options")); Wait(1, Ignore Condition); Event Player.au = Event Player.bm + Vector(0, Global.b * 2, 0.001); Small Message(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bo == 1 ? Custom String("ํ์ฑํํ๋ ค๋ฉด ๋ด์ ๊ณต๊ฒฉํ์ญ์์ค.") : Custom String("Attack the bot to start")); Wait(1, Ignore Condition); Event Player.au = Event Player.bm + Vector(0, 5, 0.001); For Player Variable(Event Player, N, 0, Count Of(All Heroes), 1); Preload Hero(Event Player, All Heroes[Event Player.N]); Wait(1 / 60, Ignore Condition); End; If(Global.S == True); Event Player.br = 3; End; Teleport(Event Player, Event Player.bm); Event Player.au = Eye Position(Event Player); Event Player.av = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 1, Null, Event Player, False); Wait(0.500, Ignore Condition); Stop Camera(Event Player); Call Subroutine(ac); Enable Hero HUD(Event Player); Call Subroutine(Q); Stop Forcing Throttle(Event Player); Event Player.bt = True; Log To Inspector(Custom String("{0} spawned as {1} at vector {2}", Custom String("{0}: {1}", Total Time Elapsed, Event Player), Hero Of(Event Player), Event Player.bm)); If(Global.X == True && Count Of(Global.U) < 256); Modify Global Variable(U, Append To Array, Custom String("{0}", Event Player)); End; Wait(0.100, Ignore Condition); Call Subroutine(X); Call Subroutine(ai); Event Player.bz = Global.I; Stop Facing(Event Player); Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Players In Slot(Slot Of(Event Player), Team 2))), Angle Between Vectors(Facing Direction Of(Event Player), Direction Towards(Eye Position(Event Player), Eye Position( Players In Slot(Slot Of(Event Player), Team 2)))) * 10, To World, None); Wait(12 / 60, Ignore Condition); Stop Facing(Event Player); } } rule("Player Died") { event { Player Died; Team 1; All; } conditions { Event Player.ay >= 3; } actions { Stop Heal Over Time(Event Player.O); Set Status(Event Player, Null, Invincible, 2.250); Stop Forcing Player Position(Event Player); } } rule("Player Heal After Elim") { event { Player Dealt Final Blow; Team 1; All; } conditions { Is Alive(Event Player) == True; Health(Event Player) != Max Health(Event Player); Event Player.by == True; } actions { Call Subroutine(an); } } rule("Player Heal After Damage") { event { Player Dealt Damage; Team 1; All; } conditions { Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 2)) == True; Event Player.by == True; Total Time Elapsed >= Event Player.P + 1; Event Damage > 5; } actions { Call Subroutine(ao); } } rule("Increment Kills") { event { Player Dealt Final Blow; Team 1; All; } conditions { Players In Slot(Slot Of(Event Player), Team 2) == Victim; } actions { Event Player.Q += 1; } } rule("Next Hero") { event { Ongoing - Each Player; Team 1; All; } conditions { Is Game In Progress == True; Event Player.Q == Event Player.bn; } actions { If(Is Duplicating(Event Player)); Damage(Event Player, Null, 9999); Wait(5, Ignore Condition); End; If(Event Player.cb > 0 && Event Player.cb <= 2); Event Player.cb = 0; Call Subroutine(aq); End; Event Player.bl = 1; Call Subroutine(X); } } rule("Reset Player At Home") { event { Ongoing - Each Player; Team 1; All; } conditions { Distance Between(Vector(X Component Of(Position Of(Event Player)), 0, Z Component Of(Position Of(Event Player))), Event Player.bm) > Event Player.bw; Is Alive(Event Player) == True; Has Spawned(Event Player) == True; Event Player.bt == True; } actions { If(((Hero Of(Event Player) == Hero(Widowmaker) && Is Using Ability 1(Event Player)) || (Hero Of(Event Player) == Hero(Doomfist) && Is Using Ability 2(Event Player))) == True); Cancel Primary Action(Event Player); End; Play Effect(Event Player, Debuff Impact Sound, Color(White), Event Player, 75); Play Effect(Event Player, Bad Pickup Effect, Color(White), Event Player.bm, 1); If(Is In View Angle( Event Player, Eye Position(Players In Slot(Slot Of(Event Player), Team 2)) - Vector(0, Y Component Of(Eye Position(Event Player)), 0),20 ) == True ); Teleport(Event Player, Event Player.bm); Wait(1 / 60, Ignore Condition); Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Players In Slot(Slot Of(Event Player), Team 2))), Angle Between Vectors(Facing Direction Of(Event Player), Direction Towards(Eye Position(Event Player), Eye Position( Players In Slot(Slot Of(Event Player), Team 2)))) * 5, To World, None); Wait(0.200, Ignore Condition); Stop Facing(Event Player); Else; Teleport(Event Player, Event Player.bm); End; If(Event Player.bc == True); Start Forcing Player Position(Event Player, Vector(X Component Of(Event Player.bm), Event Player.bd, Z Component Of(Event Player.bm)), False); Wait(0.250, Ignore Condition); Stop Forcing Player Position(Event Player); End; Allow Button(Event Player, Button(Jump)); } } rule("Player Change Self Hero") { event { Ongoing - Each Player; Team 1; All; } conditions { Is Button Held(Event Player, Button(Crouch)) == True; Is Button Held(Event Player, Button(Reload)) == True; Event Player.M == False; Players In Slot(Slot Of(Event Player), Team 2).M == False; Event Player.bt == True; } actions { Wait(15 / 60, Abort When False); If(Event Player.bq == True); Small Message(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bo == 1 ? Custom String( "๊ฐ์ ์์ ๋ชจ๋๊ฐ ํ์ฑํ ๋ ๋์์๋ ์์ ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.") : Custom String("Cannot change heroes while Mirror Mode is on")); Abort; End; Small Message(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bo == 1 ? Custom String( "{0} ๋ฐ {1} ๋ฒํผ์ ๊ณ์ ๋๋ฅด๊ณ ์์ผ๋ฉด ์์ ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.", Input Binding String(Button(Crouch)), Input Binding String(Button(Reload))) : Custom String("Continue holding {0} and {1} to change heroes", Input Binding String(Button(Crouch)), Input Binding String( Button(Reload)))); Set Status(Event Player, Null, Phased Out, 1); Wait(15 / 60, Abort When False); Set Player Allowed Heroes(Event Player, Remove From Array(All Heroes, Hero Of(Event Player))); Event Player.M = True; Wait(1, Ignore Condition); Reset Player Hero Availability(Event Player); } } rule("Player Self Hero Change Teleport Enemy On Spawn") { event { Ongoing - Each Player; Team 1; All; } conditions { Is In Spawn Room(Event Player) == False; Has Spawned(Event Player) == True; Event Player.M == True; Players In Slot(Slot Of(Event Player), Team 2).M == False; } actions { Wait(6 / 60, Abort When False); Call Subroutine(aj); Call Subroutine(ap); Call Subroutine(Y); Event Player.M = False; } } rule("Player Change Bot Hero") { event { Ongoing - Each Player; Team 1; All; } conditions { Is Button Held(Event Player, Button(Interact)) == True; Is Button Held(Event Player, Button(Reload)) == True; Players In Slot(Slot Of(Event Player), Team 2).M == False; Event Player.M == False; Event Player.bt == True; } actions { Wait(15 / 60, Abort When False); Small Message(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bo == 1 ? Custom String( "{0} ๋ฐ {1} ๋ฒํผ์ ๊ณ์ ๋๋ฅด๊ณ ์์ผ๋ฉด ์ ์์ ์ ์ ํํฉ๋๋ค.", Input Binding String(Button(Interact)), Input Binding String(Button(Reload))) : Custom String("Continue holding {0} and {1} to change bot hero", Input Binding String(Button(Interact)), Input Binding String(Button(Reload)))); Set Status(Event Player, Null, Phased Out, 1); Wait(15 / 60, Abort When False); Event Player.bs = Hero Of(Event Player); Start Camera(Event Player, Position Of(Players In Slot(Slot Of(Event Player), Team 2) + Vector(0, 10, 10)), Position Of( Players In Slot(Slot Of(Event Player), Team 2)), 45); Set Player Allowed Heroes(Event Player, Remove From Array(All Heroes, Hero Of(Event Player))); Players In Slot(Slot Of(Event Player), Team 2).M = True; Wait(1, Ignore Condition); Reset Player Hero Availability(Event Player); } } rule("Player Change Bot Hero On Spawn") { event { Ongoing - Each Player; Team 1; All; } conditions { Is In Spawn Room(Event Player) == False; Has Spawned(Event Player) == True; Event Player.M == False; Players In Slot(Slot Of(Event Player), Team 2).M == True; } actions { Wait(9 / 60, Abort When False); If(Event Player.aq != 0); Event Player.aq = 0; Call Subroutine(ak); End; Event Player.ar = Index Of Array Value(Event Player.bj, Hero Of(Event Player)); Start Forcing Player To Be Hero(Event Player, Event Player.bs); Wait(1 / 60, Ignore Condition); Stop Forcing Player To Be Hero(Event Player); Call Subroutine(ap); Call Subroutine(X); Players In Slot(Slot Of(Event Player), Team 2).M = False; Set Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Players In Slot(Slot Of(Event Player), Team 2)) - Vector(0, 0.250, 0)), To World); Wait(0.350, Ignore Condition); Stop Camera(Event Player); } } rule("Disable Primary Secondary Skip") { event { Ongoing - Each Player; Team 1; All; } conditions { Is Button Held(Event Player, Button(Interact)) == True; Has Spawned(Event Player) == True; } actions { Disallow Button(Event Player, Button(Primary Fire)); Disallow Button(Event Player, Button(Secondary Fire)); Wait Until(Is Button Held(Event Player, Button(Interact)) == False, 9999); Wait(0.750, Ignore Condition); Allow Button(Event Player, Button(Primary Fire)); Allow Button(Event Player, Button(Secondary Fire)); } } rule("Skip Hero") { event { Ongoing - Each Player; Team 1; All; } conditions { Is Button Held(Event Player, Button(Interact)) == True; (Is Button Held(Event Player, Button(Primary Fire)) == True || Is Button Held(Event Player, Button(Secondary Fire)) == True) == True; } actions { If(Event Player.cb > 0 && Event Player.cb <= 2); Event Player.cb = 0; Call Subroutine(aq); End; If(Is Button Held(Event Player, Button(Primary Fire)) == True); Event Player.bl = 1; Else; Event Player.bl = -1; End; Call Subroutine(X); } } rule("Help Skip Message") { event { Player Died; Team 1; All; } conditions { Is Game In Progress == True; Players In Slot(Slot Of(Event Player), Team 2).Q >= 2; Players In Slot(Slot Of(Event Player), Team 2).Q > Event Player.Q; Players In Slot(Slot Of(Event Player), Team 2).Q % 2 == 0; Event Player.ay >= 3; } actions { If(Players In Slot(Slot Of(Event Player), Team 2).Q % 4 == 0); Small Message(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bo == 1 ? Custom String( "์กฐ์ธ: ๋ฉ๋ด์์ ๋์ด๋๋ฅผ ๋ฎ์ถ ์ ์์ต๋๋ค") : Custom String("Tip: Difficulty can be lowered in the menu")); End; Small Message(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bo == 1 ? Custom String( "{1} ๋ฐ {2} ์ ๋๋ฌ {0} ๊ฑด๋ ๋ฐ๊ธฐ", Hero Icon String(Hero Of(Players In Slot(Slot Of(Event Player), Team 2))), Input Binding String( Button(Interact)), Input Binding String(Button(Primary Fire))) : Custom String("To skip {0} hold {1} and press {2}", Hero Icon String(Hero Of(Players In Slot(Slot Of(Event Player), Team 2))), Input Binding String(Button(Interact)), Input Binding String(Button(Primary Fire)))); } } rule("Player Mirror Mode On") { event { Ongoing - Each Player; Team 1; All; } conditions { Event Player.bq == True; Event Player.al == False; Event Player.M == False; Players In Slot(Slot Of(Event Player), Team 2).M == False; Hero Of(Event Player) != Hero Of(Players In Slot(Slot Of(Event Player), Team 2)); Entity Exists(Players In Slot(Slot Of(Event Player), Team 2)) == True; } actions { Start Forcing Player To Be Hero(Event Player, Hero Of(Players In Slot(Slot Of(Event Player), Team 2))); Wait(1 / 60, Ignore Condition); Stop Forcing Player To Be Hero(Event Player); Call Subroutine(aj); } } rule("Player 1 Second Cooldown Resets") { event { Ongoing - Each Player; Team 1; All; } conditions { Event Player.br > 0; Event Player.al == False; Is Alive(Event Player) == True; } actions { Wait(1, Abort When False); If(Event Player.br != 2); If(Ability Cooldown(Event Player, Button(Primary Fire)) != 0); Set Ability Cooldown(Event Player, Button(Primary Fire), 0); End; If(Ability Cooldown(Event Player, Button(Secondary Fire)) != 0 && Is Using Ability 1(Event Player) == False); Set Ability Cooldown(Event Player, Button(Secondary Fire), 0); End; If(Ability Cooldown(Event Player, Button(Ability 1)) != 0 && Is Using Ability 1(Event Player) == False); Set Ability Cooldown(Event Player, Button(Ability 1), 0); End; If(Ability Cooldown(Event Player, Button(Ability 2)) != 0 && Is Using Ability 2(Event Player) == False); Set Ability Cooldown(Event Player, Button(Ability 2), 0); End; If(Ability Cooldown(Event Player, Button(Crouch)) != 0); Set Ability Cooldown(Event Player, Button(Crouch), 0); End; If(Ultimate Charge Percent(Event Player) < 100 && Is Using Ultimate(Event Player) == False); Set Ultimate Charge(Event Player, 100); End; Set Ammo(Event Player, 0, Max Ammo(Event Player, 0)); Set Ammo(Event Player, 1, Max Ammo(Event Player, 1)); Set Ability Charge(Event Player, Button(Ability 1), 3); Set Ability Charge(Event Player, Button(Ability 2), 3); Set Ability Resource(Event Player, Button(Secondary Fire), 100); Set Ability Resource(Event Player, Button(Jump), 100); End; If(Event Player.br != 1 && Round To Integer(Total Time Elapsed, Down) % 2 == 0); If(Ability Cooldown(Players In Slot(Slot Of(Event Player), Team 2), Button(Primary Fire)) != 0); Set Ability Cooldown(Players In Slot(Slot Of(Event Player), Team 2), Button(Primary Fire), 0); End; If(Ability Cooldown(Players In Slot(Slot Of(Event Player), Team 2), Button(Secondary Fire)) != 0 && Is Using Ability 1( Players In Slot(Slot Of(Event Player), Team 2)) == False); Set Ability Cooldown(Players In Slot(Slot Of(Event Player), Team 2), Button(Secondary Fire), 0); End; If(Ability Cooldown(Players In Slot(Slot Of(Event Player), Team 2), Button(Ability 1)) != 0 && Is Using Ability 1(Players In Slot( Slot Of(Event Player), Team 2)) == False); Set Ability Cooldown(Players In Slot(Slot Of(Event Player), Team 2), Button(Ability 1), 0); End; If(Ability Cooldown(Players In Slot(Slot Of(Event Player), Team 2), Button(Ability 2)) != 0 && Is Using Ability 2(Players In Slot( Slot Of(Event Player), Team 2)) == False); Set Ability Cooldown(Players In Slot(Slot Of(Event Player), Team 2), Button(Ability 2), 0); End; If(Ability Cooldown(Players In Slot(Slot Of(Event Player), Team 2), Button(Crouch)) != 0); Set Ability Cooldown(Players In Slot(Slot Of(Event Player), Team 2), Button(Crouch), 0); End; If(Ultimate Charge Percent(Players In Slot(Slot Of(Event Player), Team 2)) < 100 && Is Using Ultimate(Players In Slot(Slot Of( Event Player), Team 2)) == False); Set Ultimate Charge(Players In Slot(Slot Of(Event Player), Team 2), 100); End; Set Ammo(Players In Slot(Slot Of(Event Player), Team 2), 0, Max Ammo(Players In Slot(Slot Of(Event Player), Team 2), 0)); Set Ammo(Players In Slot(Slot Of(Event Player), Team 2), 1, Max Ammo(Players In Slot(Slot Of(Event Player), Team 2), 1)); Set Ability Charge(Players In Slot(Slot Of(Event Player), Team 2), Button(Ability 1), 3); Set Ability Charge(Players In Slot(Slot Of(Event Player), Team 2), Button(Ability 2), 3); Set Ability Resource(Players In Slot(Slot Of(Event Player), Team 2), Button(Secondary Fire), 100); Set Ability Resource(Players In Slot(Slot Of(Event Player), Team 2), Button(Jump), 100); End; Loop If Condition Is True; } } rule("Player Elevator Up") { event { Ongoing - Each Player; Team 1; All; } conditions { Event Player.bc == True; Event Player.bd < 32; Event Player.bd % 2 == 0; Vertical Speed Of(Event Player) >= 0; Is Alive(Event Player) == True; Is Button Held(Event Player, Button(Jump)) == True; Is Button Held(Event Player, Button(Crouch)) == False; } actions { Event Player.R[0] = 1; Call Subroutine(ag); Loop If Condition Is True; } } rule("Player Elevator Down") { event { Ongoing - Each Player; Team 1; All; } conditions { Event Player.bc == True; Event Player.bd > 0; Event Player.bd % 2 == 0; Vertical Speed Of(Event Player) <= 0; Is Alive(Event Player) == True; Is Button Held(Event Player, Button(Crouch)) == True; Is Button Held(Event Player, Button(Jump)) == False; Is Button Held(Event Player, Button(Reload)) == False; } actions { Event Player.R[0] = 2; Call Subroutine(ag); Loop If Condition Is True; } } rule("Player Elevator Movement Start") { event { Ongoing - Each Player; Team 1; All; } conditions { Event Player.bc == True; Is Alive(Event Player) == True; Throttle Of(Event Player) != Vector(0, 0, 0); } actions { Stop Accelerating(Event Player); Start Accelerating(Event Player, Throttle Of(Event Player), 100, Speed Of(Event Player), To Player, Direction Rate and Max Speed); } } rule("Player Elevator Movement Stop") { event { Ongoing - Each Player; Team 1; All; } conditions { Event Player.bc == True; Is Alive(Event Player) == True; Throttle Of(Event Player) == Vector(0, 0, 0); Speed Of(Event Player) > 0; } actions { Stop Accelerating(Event Player); Event Player.be = Array(); Event Player.be[0] = Position Of(Event Player); Wait(0.100, Ignore Condition); Event Player.be[1] = Position Of(Event Player); Apply Impulse(Event Player, Direction Towards(Event Player.be[1], Event Player.be[0]), Speed Of In Direction(Event Player, Direction Towards(Event Player.be[0], Event Player.be[1])), To World, Incorporate Contrary Motion); } } rule("W") { event { Subroutine; W; } actions { Players In Slot(Slot Of(Event Player), Team 2).S = False; If(Players In Slot(Slot Of(Event Player), Team 2).c == True && Global.M == False); Players In Slot(Slot Of(Event Player), Team 2).c = False; Players In Slot(Slot Of(Event Player), Team 2).Z = False; Players In Slot(Slot Of(Event Player), Team 2).U = False; Players In Slot(Slot Of(Event Player), Team 2).X = False; Players In Slot(Slot Of(Event Player), Team 2).A = False; Players In Slot(Slot Of(Event Player), Team 2).z = False; Players In Slot(Slot Of(Event Player), Team 2).J = 5; End; Cancel Primary Action(Players In Slot(Slot Of(Event Player), Team 2)); Call Subroutine(I); Call Subroutine(Z); Stop Facing(Players In Slot(Slot Of(Event Player), Team 2)); Call Subroutine(S); If( Hero Of(Players In Slot(Slot Of(Event Player), Team 2)) != Players In Slot(Slot Of(Event Player), Team 1).bj [Players In Slot(Slot Of(Event Player), Team 1).ar] ); If(Entity Exists(Players In Slot(Slot Of(Event Player), Team 2))); Call Subroutine(S); Destroy Dummy Bot(Team 2, Slot Of(Event Player)); Wait Until(Entity Exists(Players In Slot(Slot Of(Event Player), Team 2)) == False, 5); End; Call Subroutine(S); Create Dummy Bot( Players In Slot(Slot Of(Event Player), Team 1).bj [Players In Slot(Slot Of(Event Player), Team 1).ar], Team 2, Slot Of(Event Player), Vector(0, 0, 0), Vector(0, 0, 0) ); Wait Until(Entity Exists(Players In Slot(Slot Of(Event Player), Team 2)), 5); If(Players In Slot(Slot Of(Event Player), Team 1).bq == True); Start Forcing Dummy Bot Name( Players In Slot(Slot Of(Event Player), Team 2), Custom String("{0}", Players In Slot(Slot Of(Event Player), Team 1)) ); Else If(Global.X == True); If( Count Of(Global.J) - Count Of(Mapped Array(All Players(Team 1), Custom String("{0}", Current Array Element))) <= 0 ); Global.J = Append To Array(Global.a, Global.U); End; Players In Slot(Slot Of(Event Player), Team 2).ab = Random Value In Array( Remove From Array( Global.J, Mapped Array(All Players(Team 1), Custom String("{0}", Current Array Element)) ) ); Modify Global Variable( J, Remove From Array By Value, Players In Slot(Slot Of(Event Player), Team 2).ab ); Stop Forcing Dummy Bot Name(Players In Slot(Slot Of(Event Player), Team 2)); Start Forcing Dummy Bot Name( Players In Slot(Slot Of(Event Player), Team 2), Players In Slot(Slot Of(Event Player), Team 2).ab ); End; Call Subroutine(ai); Disable Built-In Game Mode Respawning(Players In Slot(Slot Of(Event Player), Team 2)); Call Subroutine(S); Set Invisible(Players In Slot(Slot Of(Event Player), Team 2), All); Call Subroutine(S); Small Message( Players In Slot(Slot Of(Event Player), Team 1), Custom String( "{0} {1}!", Hero Icon String( Hero Of(Players In Slot(Slot Of(Event Player), Team 2)) ), Hero Of(Players In Slot(Slot Of(Event Player), Team 2)) ) ); End; Call Subroutine(S); If( Players In Slot(Slot Of(Event Player), Team 1).ay >= 3 && (Global.K[0] == False && Global.M == False) == True ); Set Status(Players In Slot(Slot Of(Event Player), Team 2), Null, Unkillable, 9999); End; If(Players In Slot(Slot Of(Event Player), Team 1).ay >= 3); Players In Slot(Slot Of(Event Player), Team 2).J = 5; If(Global.K[0] == True || Global.M == True); Call Subroutine(J); End; End; If(Players In Slot(Slot Of(Event Player), Team 1).ca == True); Set Ultimate Ability Enabled(Players In Slot(Slot Of(Event Player), Team 2), False); End; Players In Slot(Slot Of(Event Player), Team 2).S = True; } } rule("X") { event { Subroutine; X; } actions { If( Health(Players In Slot(Slot Of(Event Player), Team 1)) != Max Health(Players In Slot(Slot Of(Event Player), Team 1)) ); Heal( Players In Slot(Slot Of(Event Player), Team 1), Null, Max Health(Players In Slot(Slot Of(Event Player), Team 1)) ); End; Players In Slot(Slot Of(Event Player), Team 1).Q = 0; Players In Slot(Slot Of(Event Player), Team 2).Q = 0; If(Players In Slot(Slot Of(Event Player), Team 1).bl == 1); If(Players In Slot(Slot Of(Event Player), Team 1).ar == Count Of(Event Player.bj) - 1); Players In Slot(Slot Of(Event Player), Team 1).ar = 0; Else; Players In Slot(Slot Of(Event Player), Team 1).ar = Players In Slot(Slot Of(Event Player), Team 1).as; End; Else If(Players In Slot(Slot Of(Event Player), Team 1).bl == -1); If(Players In Slot(Slot Of(Event Player), Team 1).ar == 0); Players In Slot(Slot Of(Event Player), Team 1).ar = Count Of(Players In Slot(Slot Of(Event Player), Team 1).bj) - 1; Else; Players In Slot(Slot Of(Event Player), Team 1).ar -= 1; End; End; If( Players In Slot(Slot Of(Event Player), Team 1).ar == Count Of(Players In Slot(Slot Of(Event Player), Team 1).bj) - 1 ); Players In Slot(Slot Of(Event Player), Team 1).as = 0; Else; Players In Slot(Slot Of(Event Player), Team 1).as = Players In Slot(Slot Of(Event Player), Team 1).ar + 1; End; Players In Slot(Slot Of(Event Player), Team 1).bl = 0; Call Subroutine(W); Call Subroutine(Y); } } rule("Y") { event { Subroutine; Y; } actions { Stop Forcing Player Position(Players In Slot(Slot Of(Event Player), Team 2)); Call Subroutine(S); Set Invisible(Players In Slot(Slot Of(Event Player), Team 2), All); Call Subroutine(S); Set Facing( Players In Slot(Slot Of(Event Player), Team 2), Vector( Random Real(-1, 1), Random Real(-0.500, 0.500), Random Real(-1, 1) ), To Player ); Call Subroutine(S); Players In Slot(Slot Of(Event Player), Team 1).bg = Players In Slot(Slot Of(Event Player), Team 1).bf / Players In Slot(Slot Of(Event Player), Team 1).bn * 2; Call Subroutine(S); If( Players In Slot(Slot Of(Event Player), Team 1).bn != 1 && Players In Slot(Slot Of(Event Player), Team 1).bn != Global.y ); Players In Slot(Slot Of(Event Player), Team 1).at = Array(); Players In Slot(Slot Of(Event Player), Team 1).at[0] = ( Players In Slot(Slot Of(Event Player), Team 1).bn - 1 - Players In Slot(Slot Of(Event Player), Team 1).Q ) % (Players In Slot(Slot Of(Event Player), Team 1).bn / 2) * Players In Slot(Slot Of(Event Player), Team 1).bg; Players In Slot(Slot Of(Event Player), Team 1).at[1] = Players In Slot(Slot Of(Event Player), Team 1).at[0] + Players In Slot(Slot Of(Event Player), Team 1).bg; If( Players In Slot(Slot Of(Event Player), Team 1).Q == 0 || Players In Slot(Slot Of(Event Player), Team 1).Q == Players In Slot(Slot Of(Event Player), Team 1).bn / 2 ); Players In Slot(Slot Of(Event Player), Team 1).at[1] = Players In Slot(Slot Of(Event Player), Team 1).at[1] - 2.500; End; Call Subroutine(S); Teleport( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles(Random Integer(1, 360), 0) * Random Integer( Players In Slot(Slot Of(Event Player), Team 1).at[0], Players In Slot(Slot Of(Event Player), Team 1).at[1] ) + Players In Slot(Slot Of(Event Player), Team 1).bm ); Else; Call Subroutine(S); Teleport( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles(Random Integer(1, 360), 0) * Random Real(0, Players In Slot(Slot Of(Event Player), Team 1).bf) + Players In Slot(Slot Of(Event Player), Team 1).bm ); End; Call Subroutine(S); Play Effect( Players In Slot(Slot Of(Event Player), Team 1), Buff Impact Sound, Color(White), Players In Slot(Slot Of(Event Player), Team 2), 180 ); Call Subroutine(S); Play Effect( Players In Slot(Slot Of(Event Player), Team 1), Bad Pickup Effect, Color(White), Players In Slot(Slot Of(Event Player), Team 2), 1 ); Call Subroutine(S); Set Invisible(Players In Slot(Slot Of(Event Player), Team 2), None); } } rule("V") { event { Subroutine; V; } actions { Start Throttle In Direction( Players In Slot(Slot Of(Event Player), Team 2), Players In Slot(Slot Of(Event Player), Team 2).ac, 1, To Player, Replace existing throttle, None ); Wait( Random Real( Players In Slot(Slot Of(Event Player), Team 2).aa / Players In Slot(Slot Of(Event Player), Team 1).ay, Players In Slot(Slot Of(Event Player), Team 2).aa ), Ignore Condition ); } } rule("T") { event { Subroutine; T; } actions { Call Subroutine(P); If(Random Real(0, 1) < Players In Slot(Slot Of(Event Player), Team 2).T); Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Crouch)); Start Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Crouch)); Wait( Random Real( Players In Slot(Slot Of(Event Player), Team 2).V / 5, Players In Slot(Slot Of(Event Player), Team 2).V ), Ignore Condition ); End; Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Crouch)); } } rule("U") { event { Subroutine; U; } actions { If(Random Real(0, 1) < Players In Slot(Slot Of(Event Player), Team 2).W); Press Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Jump)); End; Wait( Random Real( Players In Slot(Slot Of(Event Player), Team 2).Y / 5, Players In Slot(Slot Of(Event Player), Team 2).Y ), Ignore Condition ); } } rule("Z") { event { Subroutine; Z; } actions { Wait(4 / 60, Ignore Condition); Stop Throttle In Direction(Players In Slot(Slot Of(Event Player), Team 2)); } } rule("Player Leave Destroy All Objects") { event { Ongoing - Each Player; Team 2; All; } conditions { Entity Exists(Players In Slot(Slot Of(Event Player), Team 1)) == False; Is In Spawn Room(Players In Slot(Slot Of(Event Player), Team 1)) == False; Has Spawned(Players In Slot(Slot Of(Event Player), Team 1)) == False; } actions { If(Count Of(Players In Slot(Slot Of(Event Player), Team 1).aj) > 0); Call Subroutine(af); End; If(Count Of(Players In Slot(Slot Of(Event Player), Team 1).ad) > 0); Call Subroutine(aa); End; If(Count Of(Players In Slot(Slot Of(Event Player), Team 1).ag) > 0); Call Subroutine(ab); End; If(Count Of(Players In Slot(Slot Of(Event Player), Team 1).ai) > 0); Call Subroutine(ac); End; If(Count Of(Players In Slot(Slot Of(Event Player), Team 1).ba) > 0); For Player Variable(Players In Slot(Slot Of(Event Player), Team 1), N, Count Of(Players In Slot(Slot Of(Event Player), Team 1) .ba), -1, -1); Destroy Effect(Players In Slot(Slot Of(Event Player), Team 1).ba[Players In Slot(Slot Of(Event Player), Team 1).N]); Players In Slot(Slot Of(Event Player), Team 1).ba = Remove From Array(Players In Slot(Slot Of(Event Player), Team 1) .ba, Players In Slot(Slot Of(Event Player), Team 1).ba[Players In Slot(Slot Of(Event Player), Team 1).N]); End; End; Destroy Dummy Bot(Team 2, Slot Of(Event Player)); } } rule("Bot Respawn") { event { Player Died; Team 2; All; } conditions { Players In Slot(Slot Of(Event Player), Team 1).Q < Players In Slot(Slot Of(Event Player), Team 1).bn; } actions { Wait(0.250, Abort When False); Call Subroutine(I); Event Player.z = False; Event Player.A = False; Stop Heal Over Time(Event Player.O); Stop Facing(Event Player); Call Subroutine(S); Respawn(Event Player); Call Subroutine(Y); } } rule("Bot Elimination") { event { Player Dealt Final Blow; Team 2; All; } conditions { Is Game In Progress == True; } actions { Event Player.Q += 1; If( Players In Slot(Slot Of(Event Player), Team 1).bp > 0 && Players In Slot(Slot Of(Event Player), Team 1).Q > 0 ); If( Players In Slot(Slot Of(Event Player), Team 1).bp > Players In Slot(Slot Of(Event Player), Team 1).Q ); Players In Slot(Slot Of(Event Player), Team 1).Q = 0; Else; Players In Slot(Slot Of(Event Player), Team 1).Q -= Players In Slot(Slot Of(Event Player), Team 1).bp; End; End; If(Random Real(0, 1) < 0.600); Event Player.l = Random Integer(1, 4); Wait(Random Real(0.650, 1.150), Ignore Condition); If(Event Player.l == 1); Communicate(Event Player, Hello); Else If(Event Player.l == 2); Communicate(Event Player, Thanks); Else If(Event Player.l == 3); Communicate(Event Player, Sorry); Else If(Event Player.l == 4); Communicate(Event Player, Goodbye); End; End; Call Subroutine(P); Call Subroutine(I); } } rule("Bot Heal After Elim") { event { Player Dealt Final Blow; Team 2; All; } conditions { Is Alive(Event Player) == True; Health(Event Player) != Max Health(Event Player); Players In Slot(Slot Of(Event Player), Team 1).bz == True; } actions { Call Subroutine(an); } } rule("Bot Heal After Damage") { event { Player Dealt Damage; Team 2; All; } conditions { Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Players In Slot(Slot Of(Event Player), Team 1).bz == True; Total Time Elapsed >= Event Player.P + 1; Event Damage > 5; } actions { Call Subroutine(ao); } } rule("Bot Reset Position Non AI Difficulty") { event { Ongoing - Each Player; Team 2; All; } conditions { Is Game In Progress == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bm) >= Players In Slot(Slot Of( Event Player), Team 1).bf - 1; Players In Slot(Slot Of(Event Player), Team 1).ay < 3; } actions { Stop Facing(Event Player); Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player) + World Vector Of(Vector(0, 0, -5), Event Player, Rotation)), Random Integer(300, 500), To Player, None); } } rule("Bot Reset Position Out Of Bounds") { event { Ongoing - Each Player; Team 2; All; } conditions { Is Game In Progress == True; Has Spawned(Event Player) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bm) > Players In Slot(Slot Of( Event Player), Team 1).bf + 15; } actions { Wait(0.750, Abort When False); Call Subroutine(Y); } } rule("Bot Hello") { event { Ongoing - Each Player; Team 1; All; } conditions { Is Game In Progress == True; Is Communicating(Event Player, Hello) == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 2)) == True; } actions { Wait(Random Real(1, 1.250), Ignore Condition); Communicate(Players In Slot(Slot Of(Event Player), Team 2), Hello); } } rule("Bot You Are Welcome") { event { Ongoing - Each Player; Team 1; All; } conditions { Is Game In Progress == True; Is Communicating(Event Player, Thanks) == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 2)) == True; } actions { Wait(Random Real(1.500, 2), Ignore Condition); Communicate(Players In Slot(Slot Of(Event Player), Team 2), You are Welcome); } } rule("Bot Asleep Thanks") { event { Ongoing - Each Player; Team 1; Ana; } conditions { Is Alive(Players In Slot(Slot Of(Event Player), Team 2)) == True; Has Status(Players In Slot(Slot Of(Event Player), Team 2), Asleep) == True; } actions { If(Random Real(0, 1) < 0.750); Wait(Random Real(0.750, 1), Ignore Condition); Communicate(Players In Slot(Slot Of(Event Player), Team 2), Thanks); End; } } rule("Hard Mode WASD") { event { Ongoing - Each Player; Team 1; All; } conditions { Event Player.ay == 2; Is Alive(Players In Slot(Slot Of(Event Player), Team 2)) == True; Players In Slot(Slot Of(Event Player), Team 2).S == True; } actions { Players In Slot(Slot Of(Event Player), Team 2).ac = Random Value In Array(Global.t); Start Rule(V, Do Nothing); Start Rule(T, Do Nothing); Start Rule(U, Do Nothing); Wait(0.250, Ignore Condition); Loop If Condition Is True; Stop Throttle In Direction(Players In Slot(Slot Of(Event Player), Team 2)); Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Crouch)); Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Jump)); } } rule("Medium Mode WASD") { event { Ongoing - Each Player; Team 1; All; } conditions { Event Player.ay == 1; Is Alive(Players In Slot(Slot Of(Event Player), Team 2)) == True; (Event Player.Q >= Event Player.bn / 2 || ( Event Player.bn == Global.y && Event Player.Q % 2 == 1)) == True; Players In Slot(Slot Of(Event Player), Team 2).S == True; } actions { Players In Slot(Slot Of(Event Player), Team 2).ac = Random Value In Array(Global.v); Start Rule(V, Do Nothing); Start Rule(T, Do Nothing); Start Rule(U, Do Nothing); Wait(0.250, Ignore Condition); Loop If Condition Is True; Stop Throttle In Direction(Players In Slot(Slot Of(Event Player), Team 2)); Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Crouch)); Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Jump)); } } rule("Easy Mode WASD") { event { Ongoing - Each Player; Team 1; All; } conditions { Event Player.ay == 0; Is Alive(Players In Slot(Slot Of(Event Player), Team 2)) == True; (Event Player.Q >= Event Player.bn / 2 || ( Event Player.bn == Global.y && Event Player.Q % 2 == 1)) == True; Players In Slot(Slot Of(Event Player), Team 2).S == True; } actions { Start Throttle In Direction(Players In Slot(Slot Of(Event Player), Team 2), Forward, 1, To Player, Replace existing throttle, Direction and Magnitude); Wait(1, Ignore Condition); Loop If Condition Is True; Stop Throttle In Direction(Players In Slot(Slot Of(Event Player), Team 2)); } } rule("Non AI Scope Hero Scope In") { event { Ongoing - Each Player; Team 2; All; } conditions { Is Alive(Event Player) == True; Players In Slot(Slot Of(Event Player), Team 1).ay < 3; Array Contains(Global.z, Hero Of(Event Player)) == True; Event Player.S == True; } actions { If(Players In Slot(Slot Of(Event Player), Team 1).ay < 2 && Players In Slot(Slot Of(Event Player), Team 1) .bn == Global.y); If(Players In Slot(Slot Of(Event Player), Team 1).Q % 4 == 0 || (Players In Slot(Slot Of(Event Player), Team 1) .Q - 1) % 4 == 0); Stop Holding Button(Event Player, Button(Secondary Fire)); Wait(3 / 60, Ignore Condition); Start Holding Button(Event Player, Button(Secondary Fire)); Event Player.X = False; Else; Skip If(Is Button Held(Event Player, Button(Secondary Fire)) == False, 1); Stop Holding Button(Event Player, Button(Secondary Fire)); Event Player.X = True; End; Else; If(Players In Slot(Slot Of(Event Player), Team 1).Q % 2 == 0); Stop Holding Button(Event Player, Button(Secondary Fire)); Wait(3 / 60, Ignore Condition); Start Holding Button(Event Player, Button(Secondary Fire)); Event Player.X = False; Else; Skip If(Is Button Held(Event Player, Button(Secondary Fire)) == False, 1); Stop Holding Button(Event Player, Button(Secondary Fire)); Event Player.X = True; End; End; } } rule("Bot Flicker") { event { Ongoing - Each Player; Team 2; All; } conditions { Is Alive(Event Player) == True; Players In Slot(Slot Of(Event Player), Team 1).bx == True; Event Player.S == True; } actions { Cancel Primary Action(Event Player); Set Invisible(Event Player, All); Event Player.m = False; Event Player.n = False; Event Player.o = False; Set Status(Event Player, Null, Phased Out, 9999); Wait(Random Real(0.300, 3), Ignore Condition); Set Invisible(Event Player, None); Event Player.m = True; Event Player.n = True; Event Player.o = True; Clear Status(Event Player, Phased Out); Wait(Random Real(0.250, 2.500), Ignore Condition); Loop If Condition Is True; } } rule("S") { event { Subroutine; S; } actions { Wait Until(((Slot Of(Event Player) % 2 == 0 && Global.W % 2 == 0) || (Slot Of(Event Player) % 2 != 0 && Global.W % 2 != 0)) == True, 2 / 60); Wait(0.500 / 60, Ignore Condition); } } rule("ao") { event { Subroutine; ao; } actions { If(Event Player.O != 0); Stop Heal Over Time(Event Player.O); End; Start Heal Over Time(Event Player, Null, 6, 15); Event Player.O = Last Heal Over Time ID; Event Player.P = Total Time Elapsed; } } rule("an") { event { Subroutine; an; } actions { Wait(6 / 60, Ignore Condition); Start Heal Over Time(Event Player, Null, 2, 55); } } rule("R") { event { Subroutine; R; } actions { Disallow Button(Event Player, Button(Primary Fire)); Disallow Button(Event Player, Button(Secondary Fire)); Disallow Button(Event Player, Button(Ability 1)); Disallow Button(Event Player, Button(Ability 2)); Disallow Button(Event Player, Button(Ultimate)); Disallow Button(Event Player, Button(Jump)); Disallow Button(Event Player, Button(Crouch)); Disallow Button(Event Player, Button(Melee)); Disallow Button(Event Player, Button(Reload)); } } rule("Q") { event { Subroutine; Q; } actions { Allow Button(Event Player, Button(Primary Fire)); Allow Button(Event Player, Button(Secondary Fire)); Allow Button(Event Player, Button(Ability 1)); Allow Button(Event Player, Button(Ability 2)); Allow Button(Event Player, Button(Ultimate)); Allow Button(Event Player, Button(Jump)); Allow Button(Event Player, Button(Crouch)); Allow Button(Event Player, Button(Melee)); Allow Button(Event Player, Button(Reload)); } } rule("Special Rule: Doomfist Rocket Punch Start") { event { Ongoing - Each Player; All; Doomfist; } conditions { Is Firing Secondary(Event Player) == True; Is Alive(Event Player) == True; } actions { Event Player.r = Total Time Elapsed; Event Player.q = 0; } } rule("Special Rule: Doomfist Rocket Punch") { event { Ongoing - Each Player; All; Doomfist; } conditions { Is Firing Secondary(Event Player) == False; Is Alive(Event Player) == True; Event Player.r != 0; } actions { Event Player.q = (Total Time Elapsed - Event Player.r) / 1.400 * 100.750 + 49.250; If(Event Player.q > 150); Event Player.q = 150; End; } } rule("Special Rule: Doomfist Rocket Punch Damage") { event { Ongoing - Each Player; All; Doomfist; } conditions { Has Status(Players In Slot(Slot Of(Event Player), Opposite Team Of(Team Of(Event Player))), Stunned) == True; Distance Between(Players In Slot(Slot Of(Event Player), Opposite Team Of(Team Of(Event Player))), Players In Slot(Slot Of( Event Player), Team 1).bm) >= Players In Slot(Slot Of(Event Player), Team 1).bw - 2.500; } actions { Apply Impulse(Players In Slot(Slot Of(Event Player), Opposite Team Of(Team Of(Event Player))), Direction Towards(Players In Slot( Slot Of(Event Player), Opposite Team Of(Team Of(Event Player))), Event Player), 1, To World, Cancel Contrary Motion); Damage(Players In Slot(Slot Of(Event Player), Opposite Team Of(Team Of(Event Player))), Event Player, Event Player.q); Event Player.r = 0; Event Player.q = 0; } } rule("Special Rule: Reinhardt Charge") { event { Ongoing - Each Player; All; Reinhardt; } conditions { Is Alive(Event Player) == True; Is Using Ability 1(Event Player) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bm) >= Players In Slot(Slot Of(Event Player), Team 1).bw - 2.500; Distance Between( Position Of(Event Player) + World Vector Of(Vector(0, 0, -5), Event Player, Rotation), Players In Slot(Slot Of(Event Player), Team 1).bm ) <= Players In Slot(Slot Of(Event Player), Team 1).bw - 2.500; } actions { If(Players In Slot(Slot Of(Event Player), Team 1).ay >= 3); Stop Facing(Players In Slot(Slot Of(Event Player), Team 2)); End; Set Status(Event Player, Null, Stunned, 0.650); Start Forcing Player Position(Event Player, Position Of(Event Player), False); If(Has Status(Players In Slot(Slot Of(Event Player), Opposite Team Of(Team Of(Event Player))), Stunned) && Distance Between( Event Player, Players In Slot(Slot Of(Event Player), Opposite Team Of(Team Of(Event Player)))) < 2); Start Forcing Player Position(Players In Slot(Slot Of(Event Player), Opposite Team Of(Team Of(Event Player))), Position Of( Players In Slot(Slot Of(Event Player), Opposite Team Of(Team Of(Event Player)))), False); Damage(Players In Slot(Slot Of(Event Player), Opposite Team Of(Team Of(Event Player))), Event Player, 300); End; Wait(0.650, Ignore Condition); Stop Forcing Player Position(Event Player); Stop Forcing Player Position(Players In Slot(Slot Of(Event Player), Opposite Team Of(Team Of(Event Player)))); If(Players In Slot(Slot Of(Event Player), Team 1).ay >= 3); Call Subroutine(L); End; If(Event Player == Players In Slot(Slot Of(Event Player), Team 2)); Event Player.X = True; End; } } rule("Special Rule: Player Ana Self Nano Boost") { event { Ongoing - Each Player; Team 1; Ana; } conditions { Is Alive(Event Player) == True; Ultimate Charge Percent(Event Player) == 100; Is Button Held(Event Player, Button(Ultimate)) == True; } actions { Set Ultimate Charge(Event Player, 0); Wait(0.150, Abort When False); Set Ultimate Ability Enabled(Event Player, False); Disallow Button(Event Player, Button(Ultimate)); Big Message(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bo == 1 ? Custom String("{0} ํ์ฑํ!", Ability Icon String(Hero(Ana), Button(Ultimate))) : Custom String("{0} ACTIVATED!", Ability Icon String(Hero(Ana), Button( Ultimate)))); Play Effect(All Players(All Teams), Good Pickup Effect, Color(Blue), Event Player, 2); Play Effect(All Players(All Teams), Explosion Sound, Color(White), Event Player, 60); Heal(Event Player, Event Player, 250); Start Damage Modification(Players In Slot(Slot Of(Event Player), Team 2), Event Player, 150, Receivers Damagers and Damage Percent); Call Subroutine(S); Event Player.aw = Last Damage Modification ID; Start Damage Modification(Event Player, Players In Slot(Slot Of(Event Player), Team 2), 50, Receivers Damagers and Damage Percent); Call Subroutine(S); Event Player.ax = Last Damage Modification ID; Wait Until(Is Dead(Event Player), 8); Set Ultimate Ability Enabled(Event Player, True); Allow Button(Event Player, Button(Ultimate)); Stop Damage Modification(Event Player.aw); Stop Damage Modification(Event Player.ax); } } rule("Special Rule: Player Sombra Disable Enemy Attack") { event { Ongoing - Each Player; Team 1; Sombra; } conditions { Players In Slot(Slot Of(Event Player), Team 2).c == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 2)) == True; Is Using Ability 1(Event Player) == True; } actions { Wait(Random Real(0.250, 0.500), Ignore Condition); Players In Slot(Slot Of(Event Player), Team 2).U = False; Players In Slot(Slot Of(Event Player), Team 2).n = False; Players In Slot(Slot Of(Event Player), Team 2).o = False; While(Is Using Ability 1(Event Player) == True && Hero Of(Event Player) == Hero(Sombra)); Players In Slot(Slot Of(Event Player), Team 2).B = Vector(Random Real(-5, 5), Random Real(1, 2), Random Real(-5, 5)) + Position Of(Players In Slot(Slot Of(Event Player), Team 2)); Call Subroutine(K); Wait(Random Real(0.250, 1.250), Ignore Condition); Players In Slot(Slot Of(Event Player), Team 2).m = True; If(Random Real(0, 1) < 0.050); Communicate(Players In Slot(Slot Of(Event Player), Team 2), Hello); End; End; Wait(Random Real(0.250, 0.500), Ignore Condition); Players In Slot(Slot Of(Event Player), Team 2).n = True; Players In Slot(Slot Of(Event Player), Team 2).o = True; Players In Slot(Slot Of(Event Player), Team 2).U = True; } } rule("J") { event { Subroutine; J; } actions { Call Subroutine(S); Clear Status(Players In Slot(Slot Of(Event Player), Team 2), Unkillable); Players In Slot(Slot Of(Event Player), Team 2).Z = True; Players In Slot( Slot Of(Event Player), Team 2).U = True; Players In Slot(Slot Of(Event Player), Team 2).X = True; Players In Slot(Slot Of(Event Player), Team 2).c = True; Call Subroutine(L); } } rule("P") { event { Subroutine; P; } actions { Wait( Random Real( Players In Slot(Slot Of(Event Player), Team 2).I / 4, Players In Slot(Slot Of(Event Player), Team 2).I), Ignore Condition ); } } rule("I") { event { Subroutine; I; } actions { Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Primary Fire)); Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Secondary Fire)); Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Ability 1)); Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Ability 2)); Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Ultimate)); Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Jump)); Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Crouch)); Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Melee)); Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Reload)); Wait(1 / 60, Ignore Condition); } } rule("M") { event { Subroutine; M; } actions { Call Subroutine(S); Abort If(Players In Slot(Slot Of(Event Player), Team 2).m == False); Stop Facing(Players In Slot(Slot Of(Event Player), Team 2)); If(Players In Slot(Slot Of(Event Player), Team 2).j == 0); If(Players In Slot(Slot Of(Event Player), Team 2).d == 0); Start Facing( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles( Horizontal Angle Towards( Players In Slot(Slot Of(Event Player), Team 2), Eye Position( Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0) ) + Players In Slot(Slot Of(Event Player), Team 2).f, Vertical Angle From Direction( Direction Towards( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Eye Position( Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0) ) ) + Players In Slot(Slot Of(Event Player), Team 2).g ), Players In Slot(Slot Of(Event Player), Team 2).i, To Player, Direction and Turn Rate ); Else If( Players In Slot(Slot Of(Event Player), Team 2).d == 1); Start Facing( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles( Horizontal Angle Towards( Players In Slot(Slot Of(Event Player), Team 2), Eye Position( Players In Slot(Slot Of(Event Player), Team 1)) ) + Players In Slot(Slot Of(Event Player), Team 2).f, Vertical Angle From Direction( Direction Towards( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Eye Position( Players In Slot(Slot Of(Event Player), Team 1)) ) ) + Players In Slot(Slot Of(Event Player), Team 2).g ), Players In Slot(Slot Of(Event Player), Team 2).i, To Player, Direction and Turn Rate ); Else If( Players In Slot(Slot Of(Event Player), Team 2).d == 2); Start Facing( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles( Horizontal Angle Towards( Players In Slot(Slot Of(Event Player), Team 2), Position Of(Players In Slot(Slot Of(Event Player), Team 1)) ) + Players In Slot(Slot Of(Event Player), Team 2).f, Vertical Angle From Direction( Direction Towards( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) ) + Players In Slot(Slot Of(Event Player), Team 2).g ), Players In Slot(Slot Of(Event Player), Team 2).i, To Player, Direction and Turn Rate ); Else If( Players In Slot(Slot Of(Event Player), Team 2).d == 3); Start Facing( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles( Horizontal Angle Towards( Players In Slot(Slot Of(Event Player), Team 2), Position Of(Players In Slot(Slot Of(Event Player), Team 1)) + Players In Slot( Slot Of(Event Player), Team 2).y ) + Players In Slot(Slot Of(Event Player), Team 2).f, Vertical Angle From Direction( Direction Towards( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) + Players In Slot( Slot Of(Event Player), Team 2).y ) ) + Players In Slot(Slot Of(Event Player), Team 2).g ), Players In Slot(Slot Of(Event Player), Team 2).i, To Player, Direction and Turn Rate ); End; Else If(Players In Slot(Slot Of(Event Player), Team 2).j == 1); If(Players In Slot(Slot Of(Event Player), Team 2).d == 0); Start Facing( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles( Horizontal Angle Towards( Players In Slot(Slot Of(Event Player), Team 2), World Vector Of( Speed Of(Players In Slot(Slot Of(Event Player), Team 1)) * Throttle Of( Players In Slot(Slot Of(Event Player), Team 1)), Players In Slot(Slot Of(Event Player), Team 1), Rotation ) * ( Distance Between( Position Of( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) / Players In Slot( Slot Of(Event Player), Team 2).G ) + Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) + Players In Slot(Slot Of(Event Player), Team 2).f, Vertical Angle From Direction( Direction Towards( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Eye Position( Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0) ) ) + Players In Slot(Slot Of(Event Player), Team 2).g ), Players In Slot(Slot Of(Event Player), Team 2).i, To Player, Direction and Turn Rate ); Else If( Players In Slot(Slot Of(Event Player), Team 2).d == 1); Start Facing( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles( Horizontal Angle Towards( Players In Slot(Slot Of(Event Player), Team 2), World Vector Of( Speed Of(Players In Slot(Slot Of(Event Player), Team 1)) * Throttle Of( Players In Slot(Slot Of(Event Player), Team 1)), Players In Slot(Slot Of(Event Player), Team 1), Rotation ) * ( Distance Between( Position Of( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) / Players In Slot( Slot Of(Event Player), Team 2).G ) + Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) + Players In Slot(Slot Of(Event Player), Team 2).f, Vertical Angle From Direction( Direction Towards( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Eye Position( Players In Slot(Slot Of(Event Player), Team 1)) ) ) + Players In Slot(Slot Of(Event Player), Team 2).g ), Players In Slot(Slot Of(Event Player), Team 2).i, To Player, Direction and Turn Rate ); Else If( Players In Slot(Slot Of(Event Player), Team 2).d == 2); Start Facing( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles( Horizontal Angle Towards( Players In Slot(Slot Of(Event Player), Team 2), World Vector Of( Speed Of(Players In Slot(Slot Of(Event Player), Team 1)) * Throttle Of( Players In Slot(Slot Of(Event Player), Team 1)), Players In Slot(Slot Of(Event Player), Team 1), Rotation ) * ( Distance Between( Position Of( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) / Players In Slot( Slot Of(Event Player), Team 2).G ) + Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) + Players In Slot(Slot Of(Event Player), Team 2).f, Vertical Angle From Direction( Direction Towards( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) ) + Players In Slot(Slot Of(Event Player), Team 2).g ), Players In Slot(Slot Of(Event Player), Team 2).i, To Player, Direction and Turn Rate ); Else If( Players In Slot(Slot Of(Event Player), Team 2).d == 3); Start Facing( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles( Horizontal Angle Towards( Players In Slot(Slot Of(Event Player), Team 2), World Vector Of( Speed Of(Players In Slot(Slot Of(Event Player), Team 1)) * Throttle Of( Players In Slot(Slot Of(Event Player), Team 1)), Players In Slot(Slot Of(Event Player), Team 1), Rotation ) * ( Distance Between( Position Of( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) / Players In Slot( Slot Of(Event Player), Team 2).G ) + Position Of( Players In Slot(Slot Of(Event Player), Team 1)) + Players In Slot( Slot Of(Event Player), Team 2).y ) + Players In Slot(Slot Of(Event Player), Team 2).f, Vertical Angle From Direction( Direction Towards( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) + Players In Slot( Slot Of(Event Player), Team 2).y ) ) + Players In Slot(Slot Of(Event Player), Team 2).g ), Players In Slot(Slot Of(Event Player), Team 2).i, To Player, Direction and Turn Rate ); End; Else If(Players In Slot(Slot Of(Event Player), Team 2).j == 2); If(Players In Slot(Slot Of(Event Player), Team 2).d == 0); Start Facing( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles( Horizontal Angle Towards( Players In Slot(Slot Of(Event Player), Team 2), World Vector Of( Speed Of(Players In Slot(Slot Of(Event Player), Team 1)) * Throttle Of( Players In Slot(Slot Of(Event Player), Team 1)), Players In Slot(Slot Of(Event Player), Team 1), Rotation ) * ( Distance Between( Position Of( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) / Players In Slot( Slot Of(Event Player), Team 2).G ) + Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) + Players In Slot(Slot Of(Event Player), Team 2).f, Vertical Angle From Direction( Direction Towards( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Eye Position( Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0) ) ) + Players In Slot(Slot Of(Event Player), Team 2).g + Arcsine In Degrees( -15.800 * ( Distance Between( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Eye Position( Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0) ) ) / Players In Slot( Slot Of(Event Player), Team 2).G ^ 2 ) / 2 ), Players In Slot(Slot Of(Event Player), Team 2).i, To Player, Direction and Turn Rate ); Else If( Players In Slot(Slot Of(Event Player), Team 2).d == 1); Start Facing( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles( Horizontal Angle Towards( Players In Slot(Slot Of(Event Player), Team 2), World Vector Of( Speed Of(Players In Slot(Slot Of(Event Player), Team 1)) * Throttle Of( Players In Slot(Slot Of(Event Player), Team 1)), Players In Slot(Slot Of(Event Player), Team 1), Rotation ) * ( Distance Between( Position Of( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) / Players In Slot( Slot Of(Event Player), Team 2).G ) + Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) + Players In Slot(Slot Of(Event Player), Team 2).f, Vertical Angle From Direction( Direction Towards( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Eye Position( Players In Slot(Slot Of(Event Player), Team 1)) ) ) + Players In Slot(Slot Of(Event Player), Team 2).g + Arcsine In Degrees( -15.800 * ( Distance Between( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Eye Position( Players In Slot(Slot Of(Event Player), Team 1)) ) ) / Players In Slot( Slot Of(Event Player), Team 2).G ^ 2 ) / 2 ), Players In Slot(Slot Of(Event Player), Team 2).i, To Player, Direction and Turn Rate ); Else If( Players In Slot(Slot Of(Event Player), Team 2).d == 2); Start Facing( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles( Horizontal Angle Towards( Players In Slot(Slot Of(Event Player), Team 2), World Vector Of( Speed Of(Players In Slot(Slot Of(Event Player), Team 1)) * Throttle Of( Players In Slot(Slot Of(Event Player), Team 1)), Players In Slot(Slot Of(Event Player), Team 1), Rotation ) * ( Distance Between( Position Of( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) / Players In Slot( Slot Of(Event Player), Team 2).G ) + Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) + Players In Slot(Slot Of(Event Player), Team 2).f, Vertical Angle From Direction( Direction Towards( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) ) + Players In Slot(Slot Of(Event Player), Team 2).g + Arcsine In Degrees( -15.800 * ( Distance Between( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) ) / Players In Slot( Slot Of(Event Player), Team 2).G ^ 2 ) / 2 ), Players In Slot(Slot Of(Event Player), Team 2).i, To Player, Direction and Turn Rate ); Else If( Players In Slot(Slot Of(Event Player), Team 2).d == 3); Start Facing( Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles( Horizontal Angle Towards( Players In Slot(Slot Of(Event Player), Team 2), World Vector Of( Speed Of(Players In Slot(Slot Of(Event Player), Team 1)) * Throttle Of( Players In Slot(Slot Of(Event Player), Team 1)), Players In Slot(Slot Of(Event Player), Team 1), Rotation ) * ( Distance Between( Position Of( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) ) / Players In Slot( Slot Of(Event Player), Team 2).G ) + Position Of( Players In Slot(Slot Of(Event Player), Team 1)) + Players In Slot( Slot Of(Event Player), Team 2).y ) + Players In Slot(Slot Of(Event Player), Team 2).f, Vertical Angle From Direction( Direction Towards( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) + Players In Slot( Slot Of(Event Player), Team 2).y ) ) + Players In Slot(Slot Of(Event Player), Team 2).g + Arcsine In Degrees( -15.800 * ( Distance Between( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)), Position Of( Players In Slot(Slot Of(Event Player), Team 1)) + Players In Slot( Slot Of(Event Player), Team 2).y ) ) / Players In Slot( Slot Of(Event Player), Team 2).G ^ 2 ) / 2 ), Players In Slot(Slot Of(Event Player), Team 2).i, To Player, Direction and Turn Rate ); End; End; } } rule("K") { event { Subroutine; K; } actions { Players In Slot(Slot Of(Event Player), Team 2).m = False; Wait(2 / 60, Ignore Condition); Players In Slot(Slot Of(Event Player), Team 2).i = Random Real( Players In Slot(Slot Of(Event Player), Team 2).v, Players In Slot( Slot Of(Event Player), Team 2).v * 1.500 ); Stop Facing(Players In Slot(Slot Of(Event Player), Team 2)); Start Facing(Players In Slot(Slot Of(Event Player), Team 2), Direction Towards( Eye Position(Players In Slot(Slot Of(Event Player), Team 2)), Players In Slot(Slot Of(Event Player), Team 2).B), Evaluate Once( Random Real( Players In Slot(Slot Of(Event Player), Team 2).v, Players In Slot(Slot Of(Event Player), Team 2).u)), To World, Direction and Turn Rate); Wait Until( Is In View Angle( Players In Slot(Slot Of(Event Player), Team 2), Players In Slot(Slot Of(Event Player), Team 2).B - Vector( 0, Y Component Of( Eye Position( Players In Slot(Slot Of(Event Player), Team 2))), 0), 12.500), 2); Stop Facing(Players In Slot(Slot Of(Event Player), Team 2)); } } rule("L") { event { Subroutine; L; } actions { Players In Slot(Slot Of(Event Player), Team 2).j = Players In Slot(Slot Of(Event Player), Team 2).k; Players In Slot(Slot Of(Event Player), Team 2).d = Players In Slot(Slot Of(Event Player), Team 2).e; Call Subroutine(M); } } rule("AI Aim Mod Calculation") { event { Subroutine; H; } actions { Stop Chasing Player Variable(Event Player, f); Stop Chasing Player Variable(Event Player, g); If(Array Contains(Global.z, Hero Of(Event Player)) && Is Firing Secondary(Event Player)); If( Horizontal Angle Towards( Event Player, Players In Slot(Slot Of(Event Player), Team 1) ) > 0); Chase Player Variable Over Time( Event Player, f, Random Real(0, (Global.q - Players In Slot( Slot Of(Event Player), Team 1).ay) * 0.250 + 0.250), Random Real(0.100, 0.250), None ); Else; Chase Player Variable Over Time( Event Player, f, Random Real( (Global.q - Players In Slot( Slot Of(Event Player), Team 1).ay) * -0.250 - 0.250, 0), Random Real(0.100, 0.250), None ); End; Event Player.g = Random Real( (Global.q - Players In Slot( Slot Of(Event Player), Team 1).ay) * -0.250 - 0.250, (Global.q - Players In Slot( Slot Of(Event Player), Team 1).ay) * 0.250 + 0.250 ); Else; If( Horizontal Angle Towards( Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 0); Chase Player Variable Over Time( Event Player, f, Random Real(0, (Global.q - Players In Slot( Slot Of(Event Player), Team 1).ay) * 0.500 + 0.500 ), Random Real(0.100, 0.250), None ); Else; Chase Player Variable Over Time( Event Player, f, Random Real( (Global.q - Players In Slot( Slot Of(Event Player), Team 1).ay) * -0.500 - 0.500, 0 ), Random Real(0.100, 0.250), None ); End; Event Player.g = Random Real( (Global.q - Players In Slot( Slot Of(Event Player), Team 1).ay) * -0.350 - 0.350, (Global.q - Players In Slot( Slot Of(Event Player), Team 1).ay) * 0.350 + 0.350 ); End; } } rule("AI Aim Calculation") { event { Subroutine; G; } actions { Call Subroutine(S); If(Event Player.i == 0); Start Rule(H, Restart Rule); Chase Player Variable Over Time( Event Player, i, Random Real(Event Player.x, Event Player.w) / 1.5, Random Real(0.025, 0.200), None ); Wait(Random Real(0.025, 0.200), Ignore Condition); Stop Chasing Player Variable(Event Player, i); Else If(Event Player.L < 10 && Random Real(0, 1) < 0.900 - Event Player.p); Call Subroutine(ar); Else; Event Player.i = ( Event Player.s * Angle Between Vectors( Facing Direction Of(Event Player), Direction Towards( Eye Position(Event Player), Eye Position(Players In Slot( Slot Of(Event Player), Team 1)) - Vector(0, 0.300, 0) ) ) ) ^ Event Player.t + Random Real(Event Player.x, Event Player.w); End; If(Array Contains(Global.z, Hero Of(Event Player)) && Is Firing Secondary(Event Player)); Event Player.i = Event Player.i / 1.500; End; } } rule("AI Aim Mouse Stop") { event { Subroutine; ar; } actions { If(Global.L == True); Small Message(Event Player, Custom String("aim stop")); End; Event Player.h = Total Time Elapsed + Random Real(0.450, 0.900) - Event Player.p; Stop Chasing Player Variable(Event Player, i); Chase Player Variable At Rate(Event Player, i, 0, Random Integer(360, 720), None); Wait Until(Event Player.i == 0, 0.9); Stop Chasing Player Variable(Event Player, i); } } rule("N") { event { Subroutine; N; } actions { Stop Facing(Players In Slot(Slot Of(Event Player), Team 2)); If(Players In Slot(Slot Of(Event Player), Team 2).d == 0); Start Facing(Players In Slot(Slot Of(Event Player), Team 2), Direction Towards( Eye Position(Event Player), Eye Position(Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0)), Evaluate Once( Random Integer( Players In Slot(Slot Of(Event Player), Team 2).u - 180, Players In Slot( Slot Of(Event Player), Team 2).u)), To World, Direction and Turn Rate); Wait Until( Is In View Angle( Players In Slot(Slot Of(Event Player), Team 2), Vector( X Component Of( Eye Position( Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0)), Y Component Of( Eye Position(Players In Slot(Slot Of(Event Player),Team 1)) - Vector(0, 0.250, 0)) - Y Component Of( Eye Position( Players In Slot(Slot Of(Event Player), Team 2)) - Vector(0, 0.250, 0)), Z Component Of( Eye Position( Players In Slot(Slot Of(Event Player), Team 1)))), 0.500), 1); Else If(Players In Slot(Slot Of(Event Player), Team 2).d == 1); Start Facing(Players In Slot(Slot Of(Event Player), Team 2), Direction Towards(Eye Position(Event Player), Eye Position(Players In Slot(Slot Of(Event Player), Team 1))), Evaluate Once( Random Integer( Players In Slot(Slot Of(Event Player), Team 2).u - 180, Players In Slot( Slot Of(Event Player), Team 2).u)), To World, Direction and Turn Rate); Wait Until( Is In View Angle(Players In Slot(Slot Of(Event Player), Team 2), Vector( X Component Of( Eye Position( Players In Slot(Slot Of(Event Player), Team 1))), Y Component Of( Eye Position( Players In Slot(Slot Of(Event Player), Team 1))) - Y Component Of( Eye Position( Players In Slot(Slot Of(Event Player), Team 2))), Z Component Of( Eye Position( Players In Slot(Slot Of(Event Player), Team 1)))), 0.500), 1); End; } } rule("O") { event { Subroutine; O; } actions { Stop Facing(Players In Slot(Slot Of(Event Player), Team 2)); Start Facing(Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles( Horizontal Facing Angle Of( Players In Slot(Slot Of(Event Player), Team 2)) - Random Real(0.600, 1), Vertical Facing Angle Of( Players In Slot(Slot Of(Event Player),Team 2)) - Random Real(0.300, 0.700)), Evaluate Once( Random Integer( Players In Slot(Slot Of(Event Player), Team 2).u - 180, Players In Slot(Slot Of(Event Player), Team 2).u)), To World, None); Wait(Random Real(0.100, 0.200), Ignore Condition); Call Subroutine(L); } } rule("AI Enable") { event { Player Took Damage; Team 2; All; } conditions { Event Player.c == False; Players In Slot(Slot Of(Event Player), Team 1).ay >= 3; Players In Slot(Slot Of(Event Player), Team 1).al == False; Event Player.S == True; } actions { Wait(0.250, Ignore Condition); Heal(Event Player, Null, Max Health(Event Player)); Call Subroutine(J); } } rule("AI Aim Calculation Loop") { event { Ongoing - Each Player; Team 2; All; } conditions { Is Alive(Event Player) == True; Event Player.S == True; Event Player.c == True; Event Player.m == True; Players In Slot(Slot Of(Event Player), Team 1).ay >= 3; Total Time Elapsed >= Event Player.h; ( (Slot Of(Event Player) % 2 == 0 && Global.W % 2 == 0) || (Slot Of(Event Player) % 2 != 0 && Global.W % 2 != 0) ) == True; Global.W % 5 == 0; } actions { Event Player.L = Distance Between ( Ray Cast Hit Position ( Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * Distance Between ( Event Player, Players In Slot(Slot Of(Event Player), Team 1) ), All Players(Team 1), Event Player, True ), Eye Position(Players In Slot(Slot Of(Event Player), Team 1)) ); Start Rule(G, Do Nothing); } } rule("AI Aim Stop") { event { Ongoing - Each Player; Team 2; All; } conditions { Is Alive(Event Player) == True; Event Player.S == True; Event Player.c == True; Event Player.m == True; Players In Slot(Slot Of(Event Player), Team 1).ay >= 3; Event Player.L <= 1; } actions { If(Random Real(0, 1) < 0.900 - Event Player.p); Call Subroutine(ar); End; } } rule("AI Aim Flick") { event { Ongoing - Each Player; Team 2; All; } conditions { Is Alive(Event Player) == True; Event Player.S == True; Event Player.c == True; Event Player.m == True; Players In Slot(Slot Of(Event Player), Team 1).ay >= 3; Event Player.L > 3 - Players In Slot(Slot Of(Event Player), Team 1).ay * 0.250; } actions { If(Global.L == True); Small Message(Event Player, Custom String("aim flick")); End; Start Rule(G, Restart Rule); } } rule("AI Attack Melee") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Event Player.n == True; Is Alive(Event Player) == True; Distance Between (Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 2.500; Event Player.L <= 2; Health(Players In Slot(Slot Of(Event Player), Team 1)) <= 30; Health(Players In Slot(Slot Of(Event Player), Team 1)) > 0; } actions { Call Subroutine(P); Press Button(Event Player, Button(Melee)); } } rule("AI Aim Start") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Event Player.z == True; Is Alive(Event Player) == True; Event Player.m == True; } actions { Call Subroutine(M); } } rule("AI Rule Can Aim") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Event Player.z == True; Is Alive(Event Player) == True; Has Status(Event Player, Knocked Down) == False; Has Status(Event Player, Asleep) == False; Has Status(Event Player, Frozen) == False; Has Status(Event Player, Stunned) == False; } actions { Event Player.m = True; } } rule("AI Rule Can Attack") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Is Alive(Event Player) == True; Has Status(Event Player, Knocked Down) == False; Has Status(Event Player, Asleep) == False; Has Status(Event Player, Frozen) == False; Has Status(Event Player, Phased Out) == False; Has Status(Event Player, Stunned) == False; } actions { Event Player.n = True; } } rule("AI Rule Can Use Abilities") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Is Alive(Event Player) == True; Has Status(Event Player, Hacked) == False; Has Status(Event Player, Knocked Down) == False; Has Status(Event Player, Asleep) == False; Has Status(Event Player, Frozen) == False; Has Status(Event Player, Phased Out) == False; Has Status(Event Player, Stunned) == False; } actions { Event Player.o = True; } } rule("AI Rule Status Hacked") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Is Alive(Event Player) == True; Has Status(Event Player, Hacked) == True; } actions { Event Player.o = False; } } rule("AI Rule Status Knocked Down") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Is Alive(Event Player) == True; Has Status(Event Player, Knocked Down) == True; } actions { Event Player.m = False; Event Player.n = False; Event Player.o = False; Stop Facing(Players In Slot(Slot Of(Event Player), Team 2)); } } rule("AI Rule Status Asleep") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Is Alive(Event Player) == True; Has Status(Event Player, Asleep) == True; } actions { Event Player.m = False; Event Player.n = False; Event Player.o = False; Stop Facing(Players In Slot(Slot Of(Event Player), Team 2)); } } rule("AI Rule Status Frozen") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Is Alive(Event Player) == True; Has Status(Event Player, Frozen) == True; } actions { Event Player.m = False; Event Player.n = False; Event Player.o = False; Stop Facing(Players In Slot(Slot Of(Event Player), Team 2)); } } rule("AI Rule Status Phased Out") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Is Alive(Event Player) == True; Has Status(Event Player, Phased Out) == True; } actions { Event Player.o = False; Event Player.n = False; } } rule("AI Rule Status Stunned") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Is Alive(Event Player) == True; Has Status(Event Player, Stunned) == True; } actions { Event Player.m = False; Event Player.n = False; Event Player.o = False; Stop Facing(Players In Slot(Slot Of(Event Player), Team 2)); } } rule("AI Movement WASD Strafe On Dmg") { event { Player Took Damage; Team 2; All; } conditions { Event Player.c == True; Event Player.Z == True; Event Player.z == True; Is Alive(Event Player) == True; Distance Between (Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > Event Player.E + Event Player.J; Event Damage > 25; } actions { If(Random Real(0, 1) < 0.100 + Event Player.p); Call Subroutine(P); Event Player.ac = Random Value In Array(Global.w); Start Rule(V, Restart Rule); End; } } rule("AI Movement WASD Move Closer") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Event Player.Z == True; Event Player.z == True; Is Alive(Event Player) == True; Distance Between ( Event Player, Vector ( X Component Of (Position Of(Players In Slot(Slot Of(Event Player), Team 1))), 0, Z Component Of (Position Of(Players In Slot(Slot Of(Event Player), Team 1))) ) ) >= Event Player.E; } actions { If ( Distance Between (Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > Event Player.E + Event Player.J ); Event Player.ac = Random Value In Array ( Remove From Array ( Global.v, Array(Left, Right, Event Player.ac) ) ); Else; Event Player.ac = Random Value In Array ( Remove From Array (Global.v, Event Player.ac) ); End; Call Subroutine(V); Loop If Condition Is True; } } rule("AI Movement WASD Move Farther") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Event Player.Z == True; Event Player.z == True; Is Alive(Event Player) == True; Distance Between ( Event Player, Vector ( X Component Of (Position Of(Players In Slot(Slot Of(Event Player), Team 1))), 0, Z Component Of (Position Of(Players In Slot(Slot Of(Event Player), Team 1))) ) ) < Event Player.E; } actions { Event Player.ac = Random Value In Array ( Remove From Array (Global.u, Event Player.ac) ); Call Subroutine(V); Loop If Condition Is True; } } rule("AI Optimal Distance Default Resize") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Is Alive(Event Player) == True; Distance Between ( Event Player, Players In Slot(Slot Of(Event Player), Team 1).bm ) >= Players In Slot(Slot Of(Event Player), Team 1).bf - 2.500; } actions { Event Player.E = Random Real(2.500, 5); Wait(Random Real(1.500, 3), Ignore Condition); Loop If Condition Is True; Event Player.E = Event Player.F; } } rule("AI Movement Crouch") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Event Player.U == True; Is Alive(Event Player) == True; Is On Ground(Event Player) == True; Event Player.L < 5; } actions { Call Subroutine(T); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Crouch)); } } rule("AI Movement Jump") { event { Ongoing - Each Player; Team 2; All; } conditions { Event Player.c == True; Event Player.X == True; Is Alive(Event Player) == True; Is On Ground(Event Player) == True; } actions { Call Subroutine(U); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Jump)); } } rule("Quick Mode AI Enable") { event { Ongoing - Each Player; Team 2; All; } conditions { Players In Slot(Slot Of(Event Player), Team 1).bu == True; Players In Slot(Slot Of(Event Player), Team 1).ay >= 3; Players In Slot(Slot Of(Event Player), Team 1).al == False; Is Alive(Event Player) == True; Event Player.S == True; } actions { Call Subroutine(J); } } rule("AI Ana") { event { Subroutine; a; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 1); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); If(Is Button Held(Event Player, Button(Secondary Fire))); Stop Holding Button(Event Player, Button(Secondary Fire)); Call Subroutine(L); Else; Event Player.X = False; Start Holding Button(Event Player, Button(Secondary Fire)); Event Player.j = 0; Event Player.d = 0; Call Subroutine(M); End; Else If(Event Player.a == Button(Ability 1)); Call Subroutine(I); Event Player.j = 1; Event Player.d = 0; Event Player.G = Event Player.H[2]; Call Subroutine(M); Press Button(Event Player, Button(Ability 1)); Wait(0.300, Ignore Condition); Call Subroutine(L); Else If(Event Player.a == Button(Ability 2)); Call Subroutine(I); If(Event Player.b == 0); Event Player.j = 2; Event Player.d = 2; Event Player.G = Event Player.H[3]; Call Subroutine(M); Wait(Random Real(0.300, 0.400), Ignore Condition); Press Button(Event Player, Button(Ability 2)); Wait(0.250, Ignore Condition); Call Subroutine(L); Else If(Event Player.b == 1); Event Player.B = Position Of(Event Player) + World Vector Of(Vector(0, 0, 0.250), Event Player, Rotation); Call Subroutine(K); Press Button(Event Player, Button(Ability 2)); Wait(0.100, Ignore Condition); Event Player.m = True; End; Event Player.j = 1; Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); End; Event Player.A = False; } } rule("AI Ana General") { event { Ongoing - Each Player; Team 2; Ana; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(15, 20); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.k = 1; Event Player.H[0] = 125; Event Player.H[2] = 60; Event Player.H[3] = 30; Call Subroutine(L); Event Player.z = True; } } rule("AI Ana Scope In") { event { Ongoing - Each Player; Team 2; Ana; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= Global.b; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 15; Event Player.L < 5; Is Button Held(Event Player, Button(Secondary Fire)) == False; Has Status(Players In Slot(Slot Of(Event Player), Team 1), Asleep) == False; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(a); } } rule("AI Ana Scope Out") { event { Ongoing - Each Player; Team 2; Ana; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 15; Is Button Held(Event Player, Button(Secondary Fire)) == True; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(a); } } rule("AI Ana Attack") { event { Ongoing - Each Player; Team 2; Ana; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 50; Event Player.L < 2; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(a); Wait(0.800, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Ana Sleep Dart") { event { Ongoing - Each Player; Team 2; Ana; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 15; Event Player.L < 1; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 1); Call Subroutine(a); } } rule("AI Ana Sleep Dart Face Enemy Asleep") { event { Ongoing - Each Player; Team 2; Ana; } conditions { Event Player.c == True; Event Player.m == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Has Status(Players In Slot(Slot Of(Event Player), Team 1), Asleep) == True; } actions { Call Subroutine(P); Event Player.j = 1; Event Player.d = 3; Event Player.y = Vector(0, 0.250, 0); Call Subroutine(M); If(Ability Cooldown(Event Player, Button(Ability 2)) <= 4 && Ability Cooldown(Event Player, Button(Ability 2)) > 0); Event Player.n = False; Wait Until(Ability Cooldown(Event Player, Button(Ability 2)) == 0, 4); Event Player.n = True; End; Wait Until(Has Status(Players In Slot(Slot Of(Event Player), Team 1), Asleep) == False, 6); Call Subroutine(L); } } rule("AI Ana Biotic Grenade") { event { Ongoing - Each Player; Team 2; Ana; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 35; Event Player.L < 1.25; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; Health(Event Player) > 100; Is On Ground(Event Player) == True; Altitude Of(Players In Slot(Slot Of(Event Player), Team 1)) <= 2; } actions { Event Player.a = Button(Ability 2); Event Player.b = 0; Call Subroutine(a); } } rule("AI Ana Biotic Grenade Self") { event { Ongoing - Each Player; Team 2; Ana; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Health(Event Player) <= 100; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Event Player.b = 1; Call Subroutine(a); } } rule("AI Ana Nano Boost") { event { Ongoing - Each Player; Team 2; Ana; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= Event Player.E; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Ultimate); Call Subroutine(a); } } rule("AI Ashe") { event { Subroutine; b; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); If(Event Player.j != 0 || Event Player.d != 0); Event Player.j = 0; Event Player.d = 0; Call Subroutine(M); End; Press Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); If(Is Button Held(Event Player, Button(Secondary Fire))); Stop Holding Button(Event Player, Button(Secondary Fire)); Else; Start Holding Button(Event Player, Button(Secondary Fire)); Wait(0.250, Ignore Condition); End; Else If(Event Player.a == Button(Reload)); Call Subroutine(I); Press Button(Event Player, Button(Reload)); Wait Until(Ammo(Event Player, 0) == Random Integer(8, Max Ammo(Event Player, 0)), 3.500); Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Wait(0.100, Ignore Condition); Wait Until(Is Using Ability 1(Event Player) == False, 1); Else If(Event Player.a == Button(Ability 2)); Event Player.j = 2; Event Player.d = 2; Event Player.G = Event Player.H[3]; Call Subroutine(M); Wait(Random Real(0.300, 0.400), Ignore Condition); Press Button(Event Player, Button(Ability 2)); Wait(0.250, Ignore Condition); Call Subroutine(L); Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); Wait(0.250, Ignore Condition); End; Event Player.A = False; } } rule("AI Ashe General") { event { Ongoing - Each Player; Team 2; Ashe; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(15, 25); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.k = 0; Event Player.H[3] = 25; Call Subroutine(L); Event Player.z = True; } } rule("AI Ashe Attack Scope In") { event { Ongoing - Each Player; Team 2; Ashe; } conditions { Event Player.c == True; Event Player.m == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 7.500; Is Reloading(Event Player) == False; Is Firing Secondary(Event Player) == False; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(b); } } rule("AI Ashe Attack Scope Out") { event { Ongoing - Each Player; Team 2; Ashe; } conditions { Event Player.c == True; Event Player.m == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 7.500; Is Firing Secondary(Event Player) == True; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(b); } } rule("AI Ashe Attack Scoped") { event { Ongoing - Each Player; Team 2; Ashe; } conditions { Event Player.c == True; Event Player.m == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 1.25; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 50; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 7.500; Is Reloading(Event Player) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(b); Wait(0.700, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Secondary Fire)); } } rule("AI Ashe Attack Unscoped") { event { Ongoing - Each Player; Team 2; Ashe; } conditions { Event Player.c == True; Event Player.m == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 1.5; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 7.500; Is Button Held(Event Player, Button(Secondary Fire)) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(b); Wait(0.250, Ignore Condition); Loop If Condition Is True; } } rule("AI Ashe Reload") { event { Ongoing - Each Player; Team 2; Ashe; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Ammo(Event Player, 0) == 0; } actions { Event Player.a = Button(Reload); Call Subroutine(b); } } rule("AI Ashe Reload After Kill") { event { Player Dealt Final Blow; Team 2; Ashe; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; } actions { Event Player.a = Button(Reload); Call Subroutine(b); } } rule("AI Ashe Coach Gun Defensive") { event { Ongoing - Each Player; Team 2; Ashe; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 9.400; Health(Event Player) <= 125; } actions { Event Player.a = Button(Ability 1); Call Subroutine(b); } } rule("AI Ashe Coach Gun Finishing") { event { Ongoing - Each Player; Team 2; Ashe; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 5; Health(Players In Slot(Slot Of(Event Player), Team 1)) < 90; } actions { Event Player.a = Button(Ability 1); Call Subroutine(b); } } rule("AI Ashe Dynamite") { event { Ongoing - Each Player; Team 2; Ashe; } conditions { Event Player.c == True; Event Player.m == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 30; Event Player.L < 2; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Altitude Of(Players In Slot(Slot Of(Event Player), Team 1)) <= 2; Is Reloading(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(b); } } rule("AI Ashe B.O.B.") { event { Ongoing - Each Player; Team 2; Ashe; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 10; Event Player.L < 1; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Ultimate); Call Subroutine(b); } } rule("AI Baptiste") { event { Subroutine; c; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Reload)); Press Button(Event Player, Button(Reload)); Wait Until(Ammo(Event Player, 0) == Max Ammo(Event Player, 0), 1.500); Else If(Event Player.a == Button(Ability 1)); Call Subroutine(I); Press Button(Event Player, Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); Call Subroutine(I); Event Player.B = Position Of(Event Player); Call Subroutine(K); Press Button(Event Player, Button(Ability 2)); Call Subroutine(P); Event Player.m = True; Else If(Event Player.a == Button(Ultimate)); Call Subroutine(I); Press Button(Event Player, Button(Ultimate)); Event Player.B = Position Of(Event Player) + World Vector Of(Vector(0, 0, 5), Event Player, Rotation); Call Subroutine(K); Press Button(Event Player, Button(Primary Fire)); Call Subroutine(P); Event Player.m = True; End; Event Player.A = False; } } rule("AI Baptiste General") { event { Ongoing - Each Player; Team 2; Baptiste; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(14, 18); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.d = Event Player.e; Event Player.j = 0; Event Player.z = True; } } rule("AI Baptiste Attack") { event { Ongoing - Each Player; Team 2; Baptiste; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < Global.b; Event Player.L < 2; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(c); Wait(0.580, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Baptiste Reload") { event { Ongoing - Each Player; Team 2; Baptiste; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Ammo(Event Player, 0) <= 0; } actions { Event Player.a = Button(Reload); Call Subroutine(c); } } rule("AI Baptiste Regenerative Burst") { event { Ongoing - Each Player; Team 2; Baptiste; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; Health(Event Player) <= 100; } actions { Event Player.a = Button(Ability 1); Call Subroutine(c); } } rule("AI Baptiste Immortality Field") { event { Player Took Damage; Team 2; Baptiste; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; Health(Event Player) <= 75; Altitude Of(Event Player) < 3; } actions { Event Player.a = Button(Ability 2); Call Subroutine(c); } } rule("AI Baptiste Amplification Matrix") { event { Ongoing - Each Player; Team 2; Baptiste; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Is On Ground(Event Player) == True; } actions { Event Player.a = Button(Ultimate); Call Subroutine(c); } } rule("AI Bastion") { event { Subroutine; d; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Start Holding Button(Event Player, Button(Secondary Fire)); Wait((Max Health(Event Player) - Health(Event Player)) / 75, Ignore Condition); Stop Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Event Player.j = 1; Event Player.G = Event Player.H[4]; Press Button(Event Player, Button(Ultimate)); Event Player.d = 2; Wait(0.250, Ignore Condition); End; Event Player.A = False; } } rule("AI Bastion General") { event { Ongoing - Each Player; Team 2; Bastion; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(18, 22); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.d = Event Player.e; Event Player.j = 0; Event Player.H[4] = 60; Event Player.z = True; } } rule("AI Bastion Attack") { event { Ongoing - Each Player; Team 2; Bastion; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 40; Event Player.L < 2; Is Using Ability 1(Event Player) == False; Is Firing Secondary(Event Player) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(d); Wait(0.500, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Bastion Reconfigure") { event { Ongoing - Each Player; Team 2; Bastion; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= Event Player.E; Event Player.L < 3; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; Is Moving(Event Player) == True; } actions { If(Random Real(0, 1) < 0.250 + Event Player.p); Event Player.a = Button(Ability 1); Call Subroutine(d); End; } } rule("AI Bastion Self-Repair") { event { Player Took Damage; Team 2; Bastion; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Health(Event Player) <= Max Health(Event Player) / 2; Is Firing Secondary(Event Player) == False; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(d); } } rule("AI Bastion Configuration: Tank") { event { Ongoing - Each Player; Team 2; Bastion; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Health(Event Player) >= 100; } actions { Event Player.a = Button(Ultimate); Call Subroutine(d); Wait Until(Is Using Ultimate(Event Player) == False, 8); Event Player.j = 0; Event Player.d = 0; } } rule("AI Brigitte") { event { Subroutine; e; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); If(Event Player.b == 0); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Start Holding Button(Event Player, Button(Primary Fire)); Wait(0.200, Ignore Condition); Else If(Event Player.b == 1); Stop Holding Button(Event Player, Button(Primary Fire)); Start Holding Button(Event Player, Button(Secondary Fire)); Wait(Random Real(0.100, 0.150), Ignore Condition); Press Button(Event Player, Button(Primary Fire)); Wait(0.100, Ignore Condition); Stop Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.b == 2); Event Player.X = False; Event Player.U = False; Event Player.Z = False; Start Throttle In Direction(Event Player, Forward, 1, To Player, Replace existing throttle, Direction and Magnitude); Start Holding Button(Event Player, Button(Secondary Fire)); Wait(Random Real(0.150, 0.250), Ignore Condition); Press Button(Event Player, Button(Primary Fire)); Wait(0.150, Ignore Condition); Start Holding Button(Event Player, Button(Jump)); Wait(0.500, Ignore Condition); Stop Holding Button(Event Player, Button(Secondary Fire)); Stop Holding Button(Event Player, Button(Jump)); Stop Throttle In Direction(Event Player); Event Player.Z = True; Event Player.X = True; Event Player.U = True; End; Else If(Event Player.a == Button(Secondary Fire)); Stop Holding Button(Event Player, Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Secondary Fire)), 1); Start Holding Button(Event Player, Button(Secondary Fire)); Wait(Random Real(0.500, 2), Ignore Condition); Stop Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); Call Subroutine(I); Event Player.j = 1; Wait(Random Real(0.100, 0.200), Ignore Condition); Press Button(Event Player, Button(Ability 1)); Wait(Random Real(0.100, 0.200), Ignore Condition); Event Player.j = 0; Else If(Event Player.a == Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); End; Event Player.A = False; } } rule("AI Brigitte General") { event { Ongoing - Each Player; Team 2; Brigitte; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(3, 6); Event Player.E = Event Player.F; Event Player.J = 0; Event Player.e = 0; Event Player.d = Event Player.e; Event Player.j = 0; Event Player.H[2] = 80; Event Player.z = True; } } rule("AI Brigitte Attack") { event { Ongoing - Each Player; Team 2; Brigitte; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 8; Event Player.L < 1.5; Is Firing Secondary(Event Player) == False; } actions { Event Player.a = Button(Primary Fire); Event Player.b = 0; Call Subroutine(e); Wait(0.600, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Brigitte Use Shield") { event { Ongoing - Each Player; Team 2; Brigitte; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 5; ( Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 6 || Health(Event Player) <= 100 ) == True; Distance Between( Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm ) < Global.b; } actions { If(Random Real(0, 1) < 0.300 + Event Player.p); Event Player.a = Button(Secondary Fire); Call Subroutine(e); End; Wait(0.500, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Secondary Fire)); } } rule("AI Brigitte Shield Bash") { event { Player Dealt Damage; Team 2; Brigitte; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 1; Altitude Of(Players In Slot(Slot Of(Event Player), Team 1)) < 2; Altitude Of(Event Player) < 2; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 6.850; Ability Cooldown(Event Player, Button(Primary Fire)) == 0; } actions { If(Random Real(0, 1) < 0.400 + Event Player.p); Event Player.a = Button(Primary Fire); Event Player.b = 1; Call Subroutine(e); End; } } rule("AI Brigitte Shield Bash Gap Closer") { event { Ongoing - Each Player; Team 2; Brigitte; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 12.500; Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; Ability Cooldown(Event Player, Button(Primary Fire)) == 0; } actions { Event Player.a = Button(Primary Fire); Event Player.b = 2; Call Subroutine(e); } } rule("AI Brigitte Whip Shot Final") { event { Ongoing - Each Player; Team 2; Brigitte; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 1; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Health(Players In Slot(Slot Of(Event Player), Team 1)) <= 70; Ability Cooldown(Event Player, Button(Ability 1)) == 0; } actions { Event Player.a = Button(Ability 1); Call Subroutine(e); } } rule("AI Brigitte Whip Shot Boop") { event { Ongoing - Each Player; Team 2; Brigitte; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 1; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 10; Health(Players In Slot(Slot Of(Event Player), Team 1)) > 100; Health(Event Player) < 100; Ability Cooldown(Event Player, Button(Ability 1)) == 0; } actions { Event Player.a = Button(Ability 1); Call Subroutine(e); } } rule("AI Brigitte Rally") { event { Ongoing - Each Player; Team 2; Brigitte; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 3; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 15; Health(Event Player) >= 50; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Ultimate); Call Subroutine(e); } } rule("AI Cassidy") { event { Subroutine; m; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 1); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Event Player.d = 2; Call Subroutine(P); Press Button(Event Player, Button(Secondary Fire)); Call Subroutine(P); Call Subroutine(L); Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); Press Button(Event Player, Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Call Subroutine(I); Press Button(Event Player, Button(Ultimate)); Wait Until(Event Player.C >= Health(Players In Slot(Slot Of(Event Player), Team 1)), 5); Call Subroutine(P); Stop Chasing Player Variable(Event Player, C); Start Holding Button(Event Player, Button(Primary Fire)); End; Event Player.A = False; } } rule("AI Cassidy General") { event { Ongoing - Each Player; Team 2; Cassidy; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(13, 16); Event Player.E = Event Player.F; Event Player.k = 0; Event Player.e = 0; Call Subroutine(L); Event Player.z = True; } } rule("AI Cassidy Attack Primary") { event { Ongoing - Each Player; Team 2; Cassidy; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 1.25; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 45; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(m); Wait(0.500, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Cassidy Attack Secondary") { event { Ongoing - Each Player; Team 2; Cassidy; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 1; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 7.500; (Has Status(Players In Slot(Slot Of(Event Player), Team 1), Stunned) == True || Health(Players In Slot(Slot Of(Event Player), Team 1)) <= 75) == True; Is Using Ultimate(Event Player) == False; Ammo(Event Player, 0) >= 3; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(m); } } rule("AI Cassidy Combat Roll") { event { Ongoing - Each Player; Team 2; Cassidy; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is In View Angle(Players In Slot(Slot Of(Event Player), Team 1), Eye Position(Event Player) - Vector(0, 0.250 + Y Component Of( Eye Position(Players In Slot(Slot Of(Event Player), Team 1))), 0), 15) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 8; Ability Cooldown(Event Player, Button(Ability 1)) == 0; } actions { If(Random Real(0, 1) < 0.350 + Event Player.p); Event Player.a = Button(Ability 1); Call Subroutine(m); End; } } rule("AI Cassidy Flashbang") { event { Ongoing - Each Player; Team 2; Cassidy; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 1.35; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 10; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Ammo(Event Player, 0) > 0; } actions { If(Random Real(0, 1) < 0.450 + Event Player.p); Event Player.a = Button(Ability 2); Call Subroutine(m); End; } } rule("AI Cassidy Deadeye Start") { event { Ongoing - Each Player; Team 2; Cassidy; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Event Player.L < 5; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 200; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 10; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 125; } actions { Event Player.a = Button(Ultimate); Call Subroutine(m); } } rule("AI Cassidy Deadeye Charge") { event { Ongoing - Each Player; Team 2; Cassidy; } conditions { Event Player.c == True; Is Using Ultimate(Event Player) == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; } actions { Event Player.C = 0; Event Player.D = 100; Wait(0.200, Ignore Condition); Chase Player Variable At Rate(Event Player, C, 2802.500, Event Player.D, Destination and Rate); Wait(0.800, Ignore Condition); Event Player.D = 275; Wait(0.500, Ignore Condition); Event Player.D = 550; Wait Until(Is Using Ultimate(Event Player) == False, 4.600); Event Player.C = 0; } } rule("AI Doomfist") { event { Subroutine; f; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Secondary Fire)); If(Event Player.b == 0); Start Holding Button(Event Player, Button(Secondary Fire)); Event Player.X = False; Wait(Random Real(0.900, 1.800), Ignore Condition); Stop Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.b == 1); Start Holding Button(Event Player, Button(Secondary Fire)); Wait(Random Real(0.750, 1.500), Ignore Condition); Stop Holding Button(Event Player, Button(Secondary Fire)); Wait(Random Real(0.100, 0.250), Ignore Condition); Press Button(Event Player, Button(Jump)); End; Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); Press Button(Event Player, Button(Jump)); Event Player.j = 0; Event Player.d = 3; Event Player.y = Vector(0, -2, 0); Call Subroutine(M); Wait(Random Real(0.150, 0.350), Ignore Condition); Press Button(Event Player, Button(Ability 2)); Call Subroutine(P); Call Subroutine(L); Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); Event Player.d = 2; Call Subroutine(M); Event Player.E = 0; While(Is Using Ultimate(Event Player)); Wait(10 / 60, Ignore Condition); If(Distance Between(Vector(X Component Of(Position Of(Event Player)), 0, Z Component Of(Position Of(Event Player))), Vector( X Component Of(Position Of(Players In Slot(Slot Of(Event Player), Team 1))), 0, Z Component Of(Position Of(Players In Slot( Slot Of(Event Player), Team 1))))) <= 2); Press Button(Event Player, Button(Primary Fire)); End; End; Event Player.E = Event Player.F; Call Subroutine(L); End; Event Player.A = False; } } rule("AI Doomfist General") { event { Ongoing - Each Player; Team 2; Doomfist; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(3, 6); Event Player.E = Event Player.F; Event Player.J = 3; Event Player.k = 1; Event Player.e = 0; Event Player.G = 80; Event Player.z = True; } } rule("AI Doomfist Attack") { event { Ongoing - Each Player; Team 2; Doomfist; } conditions { Event Player.c == True; Event Player.n == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 15; Event Player.L < 2.5; Is Firing Secondary(Event Player) == False; Ammo(Event Player, 0) > 0; Is Using Ultimate(Event Player) == False; } actions { Skip If(Is Button Held(Event Player, Button(Primary Fire)), 1); Start Holding Button(Event Player, Button(Primary Fire)); Wait(0.333, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Doomfist Rocket Punch") { event { Ongoing - Each Player; Team 2; Doomfist; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 50; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 12.500; Event Player.L < 2; Ability Cooldown(Event Player, Button(Secondary Fire)) == 0; (Ability Cooldown(Event Player, Button(Ability 1)) == 0 ? Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 5 : True) == True; } actions { Event Player.a = Button(Secondary Fire); Event Player.b = 0; Call Subroutine(f); Wait Until(Speed Of(Event Player) < 45, 2); Event Player.X = True; } } rule("AI Doomfist Rocket Punch Gap Closer") { event { Ongoing - Each Player; Team 2; Doomfist; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= Event Player.E * 3.500; Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; Ability Cooldown(Event Player, Button(Secondary Fire)) == 0; } actions { Event Player.a = Button(Secondary Fire); Event Player.b = 1; Call Subroutine(f); } } rule("AI Doomfist Uppercut") { event { Ongoing - Each Player; Team 2; Doomfist; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 5; Event Player.L < 1.5; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Button Held(Event Player, Button(Secondary Fire)) == False; } actions { Event Player.a = Button(Ability 1); Call Subroutine(f); } } rule("AI Doomfist Seismic Slam") { event { Ongoing - Each Player; Team 2; Doomfist; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is On Ground(Players In Slot(Slot Of(Event Player), Team 1)) == True; (Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 9 || Is In Air(Event Player)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 15; Event Player.L < 2; Is Button Held(Event Player, Button(Secondary Fire)) == False; Ability Cooldown(Event Player, Button(Ability 2)) == 0; } actions { Event Player.a = Button(Ability 2); Call Subroutine(f); } } rule("AI Doomfist Meteor Strike") { event { Ongoing - Each Player; Team 2; Doomfist; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Event Player.L < 5; Health(Players In Slot(Slot Of(Event Player), Team 1)) > 100; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 1.500; Is Button Held(Event Player, Button(Secondary Fire)) == False; } actions { Event Player.a = Button(Ultimate); Call Subroutine(f); } } rule("AI D.Va") { event { Subroutine; g; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Secondary Fire)); Call Subroutine(I); Start Holding Button(Event Player, Button(Secondary Fire)); Wait Until(Is Firing Secondary(Event Player), 0.100); Wait Until(Is Firing Secondary(Event Player) == False, Random Real(0.500, 1.250)); Stop Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 2)); Event Player.j = 1; Event Player.G = Event Player.H[3]; Press Button(Event Player, Button(Ability 2)); Wait Until(Is Using Ability 2(Event Player), 0.100); Wait Until(Is Using Ability 2(Event Player) == False, 2); Event Player.j = 0; Call Subroutine(L); Else If(Event Player.a == Button(Ultimate)); Call Subroutine(I); If(Event Player.b == 0); If(Ability Cooldown(Event Player, Button(Ability 1)) == 0); Event Player.j = 2; Event Player.d = 2; Event Player.G = Event Player.H[4]; Call Subroutine(M); Call Subroutine(P); Press Button(Event Player, Button(Ability 1)); Call Subroutine(P); Press Button(Event Player, Button(Ultimate)); Call Subroutine(P); Call Subroutine(L); Else; Press Button(Event Player, Button(Ultimate)); End; Wait Until(Is In Alternate Form(Event Player), 1.500); Else If(Event Player.b == 1); Wait(3, Ignore Condition); Press Button(Event Player, Button(Ultimate)); End; End; Event Player.A = False; } } rule("AI D.Va General") { event { Ongoing - Each Player; Team 2; D.Va; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(4, 8); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.d = Event Player.e; Event Player.j = 0; Event Player.H[0] = 50; Event Player.H[3] = 40; Event Player.H[4] = 12; Event Player.z = True; } } rule("AI D.Va Attack") { event { Ongoing - Each Player; Team 2; D.Va; } conditions { Event Player.c == True; Event Player.n == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 30; Event Player.L < 3.5; Is Firing Secondary(Event Player) == False; } actions { Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Wait(0.250, Abort When False); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI D.Va Defense Matrix") { event { Player Took Damage; Team 2; D.Va; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is In Alternate Form(Event Player) == False; Array Contains(Global.x, Hero Of(Attacker)) == True; Event Player.L < 8; Ability Cooldown(Event Player, Button(Secondary Fire)) == 0; Is Firing Secondary(Event Player) == False; Ability Resource(Event Player, Button(Secondary Fire)) > 0; } actions { If(Random Real(0, 1) < 0.400 + Event Player.p); Event Player.a = Button(Secondary Fire); Call Subroutine(g); End; } } rule("AI D.Va Boosters") { event { Ongoing - Each Player; Team 2; D.Va; } conditions { Event Player.c == True; Event Player.o == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is In Alternate Form(Event Player) == False; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 10; Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; Event Player.L < 10; Ultimate Charge Percent(Event Player) <= 95; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; } actions { Press Button(Event Player, Button(Ability 1)); Wait Until(Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 5, 2); Call Subroutine(P); Press Button(Event Player, Button(Ability 1)); } } rule("AI D.Va Micro Missiles") { event { Ongoing - Each Player; Team 2; D.Va; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is In Alternate Form(Event Player) == False; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 10; Event Player.L < 2; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(g); } } rule("AI D.Va Self-Destruct") { event { Ongoing - Each Player; Team 2; D.Va; } conditions { Event Player.c == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is In Alternate Form(Event Player) == False; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; } actions { Event Player.a = Button(Ultimate); Event Player.b = 0; Call Subroutine(g); } } rule("AI D.Va Call Mech") { event { Ongoing - Each Player; Team 2; D.Va; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Is In Alternate Form(Event Player) == True; } actions { Event Player.a = Button(Ultimate); Event Player.b = 1; Call Subroutine(g); } } rule("AI Echo") { event { Subroutine; h; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); If(Event Player.j != 1 || Event Player.d != 0); Event Player.j = 1; Event Player.d = 0; Call Subroutine(M); End; Event Player.G = Event Player.H[0]; Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Call Subroutine(I); If(Event Player.j != 1 || Event Player.d != 3); Event Player.j = 1; Event Player.d = 3; Event Player.y = Vector(0, 0.350, 0); Call Subroutine(M); End; Event Player.G = Event Player.H[1]; Press Button(Event Player, Button(Secondary Fire)); Wait(1, Ignore Condition); Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); If(Event Player.j != 0 || Event Player.d != 0); Event Player.j = 0; Event Player.d = 0; Call Subroutine(M); End; Press Button(Event Player, Button(Ability 2)); Wait Until(Is Using Ability 2(Event Player), 0.250); Wait Until(Is Using Ability 2(Event Player) == False, 2.500); Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); Wait Until(Is Using Ultimate(Event Player), 0.250); End; Event Player.A = False; } } rule("AI Echo General") { event { Ongoing - Each Player; Team 2; Echo; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(9, 13); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.k = 1; Event Player.H[0] = 75; Event Player.H[1] = 50; Call Subroutine(L); Event Player.z = True; } } rule("AI Echo Glide") { event { Ongoing - Each Player; Team 2; Echo; } conditions { Event Player.c == True; Event Player.o == True; Is Alive(Event Player) == True; Is In Air(Event Player) == True; } actions { Start Holding Button(Event Player, Button(Jump)); Wait Until(Is In Air(Event Player) == False, 30); Stop Holding Button(Event Player, Button(Jump)); } } rule("AI Echo Attack") { event { Ongoing - Each Player; Team 2; Echo; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 35; Event Player.L < 3.25; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(h); Wait(0.330, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Echo Flight") { event { Ongoing - Each Player; Team 2; Echo; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; } actions { Event Player.a = Button(Ability 1); Call Subroutine(h); } } rule("AI Echo Focusing Beam") { event { Ongoing - Each Player; Team 2; Echo; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Health(Players In Slot(Slot Of(Event Player), Team 1)) <= Max Health(Players In Slot(Slot Of(Event Player), Team 1)) / 2; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= Max Health(Players In Slot(Slot Of(Event Player), Team 1)) / 4; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 16; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(h); } } rule("AI Echo Sticky Bombs") { event { Ongoing - Each Player; Team 2; Echo; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= Max Health(Players In Slot(Slot Of(Event Player), Team 1)) / 2; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Ability Cooldown(Event Player, Button(Secondary Fire)) == 0; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(h); } } disabled rule("AI Echo Duplicate") { event { Ongoing - Each Player; Team 2; Echo; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Event Player.L < 0.75; } actions { Event Player.a = Button(Ultimate); Call Subroutine(h); } } rule("AI Genji") { event { Subroutine; i; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); If(Is Using Ultimate(Event Player)); Skip If(Event Player.j == 0 && Event Player.d == 0, 3); Event Player.j = 0; Event Player.d = 0; Call Subroutine(M); Else; Skip If(Event Player.j == 1 && Event Player.d == 0, 3); Event Player.j = 1; Event Player.d = 0; Call Subroutine(M); End; Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); If(Event Player.j != 1 || Event Player.d != 0); Event Player.j = 1; Event Player.d = 0; Call Subroutine(M); End; Skip If(Is Button Held(Event Player, Button(Secondary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); If(Event Player.b == 0); Press Button(Event Player, Button(Ability 1)); Else If(Event Player.b == 1); Event Player.d = 3; Event Player.y = Vector(0, 0.500, 0); Call Subroutine(M); Wait(Random Real(0.100, 0.200), Ignore Condition); Press Button(Event Player, Button(Ability 1)); Wait(0.100, Ignore Condition); Call Subroutine(L); End; Else If(Event Player.a == Button(Ability 2)); Press Button(Event Player, Button(Ability 2)); Wait(Random Real(1.5, 2), Ignore Condition); Else If(Event Player.a == Button(Ultimate)); If(Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 15 && Ability Cooldown(Event Player, Button( Ability 1)) != 0); Press Button(Event Player, Button(Ultimate)); Else; Event Player.B = Vector(X Component Of(Position Of(Players In Slot(Slot Of(Event Player), Team 1))), Random Real(5, 15), Z Component Of(Position Of(Players In Slot(Slot Of(Event Player), Team 1)))); Call Subroutine(K); Press Button(Event Player, Button(Ability 1)); Wait Until(Is Using Ability 1(Event Player) == False, 0.300); Event Player.m = True; Press Button(Event Player, Button(Ultimate)); End; Wait Until(Is Using Ultimate(Event Player) == True, 1); Event Player.J = 0; Event Player.E = Random Real(1.5, 3); Event Player.j = 0; Event Player.d = 0; Call Subroutine(M); End; Event Player.A = False; } } rule("AI Genji General") { event { Ongoing - Each Player; Team 2; Genji; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(5, 10); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.k = 1; Event Player.G = 60; Call Subroutine(L); Event Player.z = True; } } rule("AI Genji Attack Primary") { event { Ongoing - Each Player; Team 2; Genji; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 35; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 10; Event Player.L < 4; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(i); Wait(0.950, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Genji Attack Secondary") { event { Ongoing - Each Player; Team 2; Genji; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 10; Event Player.L < 2; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(i); Wait(0.750, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Secondary Fire)); } } rule("AI Genji Swift Strike Movement") { event { Ongoing - Each Player; Team 2; Genji; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 15; Event Player.L < 1.5; Is Using Ability 2(Event Player) == False; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ultimate(Event Player) == False; } actions { If(Random Real(0, 1) < 0.750 - Event Player.p); Event Player.a = Button(Ability 1); Event Player.b = 0; Call Subroutine(i); End; } } rule("AI Genji Swift Strike Final") { event { Ongoing - Each Player; Team 2; Genji; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 12.500; Event Player.L < 1.5; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Health(Players In Slot(Slot Of(Event Player), Team 1)) <= 50; Health(Players In Slot(Slot Of(Event Player), Team 1)) > 0; } actions { Event Player.a = Button(Ability 1); Event Player.b = 0; Call Subroutine(i); } } rule("AI Genji Deflect") { event { Ongoing - Each Player; Team 2; Genji; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 4; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; Array Contains(Global.x, Hero Of(Players In Slot(Slot Of(Event Player), Team 1))) == True; Is Button Held(Players In Slot(Slot Of(Event Player), Team 1), Button(Primary Fire)) == True; } actions { If(Random Real(0, 1) < 0.350 + Event Player.p); Event Player.a = Button(Ability 2); Call Subroutine(i); End; } } rule("AI Genji Deflect Deadeye") { event { Ongoing - Each Player; Team 2; Genji; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 5; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Hero Of(Players In Slot(Slot Of(Event Player), Team 1)) == Hero(Cassidy); Is Using Ultimate(Players In Slot(Slot Of(Event Player), Team 1)) == True; } actions { Event Player.a = Button(Ability 2); Call Subroutine(i); } } rule("AI Genji Dragonblde") { event { Ongoing - Each Player; Team 2; Genji; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 30; Event Player.L < 5; Is Using Ability 2(Event Player) == False; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 50; Health(Event Player) >= 75; } actions { Event Player.a = Button(Ultimate); Call Subroutine(i); Wait Until(Is Using Ultimate(Event Player) == False, 8); Event Player.E = Event Player.F; Event Player.J = Event Player.E + 5; } } rule("AI Genji Dragonblde Swift Strike Gap Closer") { event { Ongoing - Each Player; Team 2; Genji; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is Using Ultimate(Event Player) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 4.500; Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; Event Player.L < 1.5; Ability Cooldown(Event Player, Button(Ability 1)) == 0; } actions { Event Player.a = Button(Ability 1); Event Player.b = 1; Call Subroutine(i); } } rule("AI Genji Dragonblde Swing") { event { Ongoing - Each Player; Team 2; Genji; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 8; Event Player.L < 2; Is Using Ability 2(Event Player) == False; Is Using Ultimate(Event Player) == True; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(i); Wait(0.900, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Genji Double Jump") { event { Ongoing - Each Player; Team 2; Genji; } conditions { Event Player.c == True; Is Alive(Event Player) == True; Is In Air(Event Player) == True; } actions { If(Random Real(0, 1) < 0.375 + Event Player.p); Wait(Random Real(0.150, 0.250), Ignore Condition); Press Button(Event Player, Button(Jump)); End; } } rule("AI Hanzo") { event { Subroutine; j; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); If(Is Using Ability 2(Event Player)); Press Button(Event Player, Button(Primary Fire)); Else If(Is Button Held(Event Player, Button(Primary Fire))); Stop Holding Button(Event Player, Button(Primary Fire)); Else; Start Holding Button(Event Player, Button(Primary Fire)); Event Player.K = Total Time Elapsed; End; Else If(Event Player.a == Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); Press Button(Event Player, Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); Wait(0.900, Ignore Condition); End; Event Player.A = False; } } rule("AI Hanzo General") { event { Ongoing - Each Player; Team 2; Hanzo; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(15, 20); Event Player.E = Event Player.F; Event Player.e = 1; Event Player.k = 2; Event Player.G = 110; Call Subroutine(L); Event Player.z = True; } } rule("AI Hanzo Lunge") { event { Ongoing - Each Player; Team 2; Hanzo; } conditions { Event Player.c == True; Event Player.o == True; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 30; Is In Air(Event Player) == True; } actions { If(Random Real(0, 1) < 0.250 + Event Player.p); Wait(Random Real(0.150, 0.250), Ignore Condition); Press Button(Event Player, Button(Jump)); End; } } rule("AI Hanzo Attack Charge") { event { Ongoing - Each Player; Team 2; Hanzo; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Event Player.z == True; Is Using Ability 2(Event Player) == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 50; Is Button Held(Event Player, Button(Primary Fire)) == False; Event Player.L < 4; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(j); } } rule("AI Hanzo Attack") { event { Ongoing - Each Player; Team 2; Hanzo; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Event Player.z == True; Is Using Ability 2(Event Player) == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 2; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 50; Is Button Held(Event Player, Button(Primary Fire)) == True; Total Time Elapsed >= Event Player.K + 1.250; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(j); } } rule("AI Hanzo Sonic Arrow") { event { Ongoing - Each Player; Team 2; Hanzo; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 25; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 1); Call Subroutine(j); } } rule("AI Hanzo Storm Arrows Start") { event { Ongoing - Each Player; Team 2; Hanzo; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 15; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 100; Event Player.L < 4; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(j); } } rule("AI Hanzo Storm Arrows Fire") { event { Ongoing - Each Player; Team 2; Hanzo; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 2; Is Using Ability 2(Event Player) == True; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(j); Wait(0.333, Ignore Condition); Loop If Condition Is True; } } rule("AI Hanzo Dragonstrike") { event { Ongoing - Each Player; Team 2; Hanzo; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Using Ability 2(Event Player) == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 3; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 30; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 10; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Ultimate); Call Subroutine(j); } } rule("AI Junkrat") { event { Subroutine; k; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 1); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Wait(Random Real(0.450, 0.650), Ignore Condition); Press Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 2)); Event Player.B = Position Of(Event Player) + World Vector Of(Vector(Random Real(-5, 5), 0, Random Real(0, 2)), Event Player, Rotation); Call Subroutine(K); Press Button(Event Player, Button(Ability 2)); Call Subroutine(P); Event Player.m = True; Else If(Event Player.a == Button(Ultimate)); Call Subroutine(I); Press Button(Event Player, Button(Ultimate)); Wait(1, Ignore Condition); If(Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 10); Press Button(Event Player, Button(Primary Fire)); Else; Wait(Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) / 12, Ignore Condition); Press Button(Event Player, Button(Primary Fire)); End; End; Event Player.A = False; } } rule("AI Junkrat General") { event { Ongoing - Each Player; Team 2; Junkrat; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(9, 12); Event Player.E = Event Player.F; Event Player.e = 2; Event Player.k = 2; Event Player.G = 25; Call Subroutine(L); Event Player.z = True; } } rule("AI Junkrat Attack") { event { Ongoing - Each Player; Team 2; Junkrat; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 50; Event Player.L < 3.5; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(k); Wait(0.670, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Junkrat Concussion Mine") { event { Ongoing - Each Player; Team 2; Junkrat; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 10; Event Player.L < 3.5; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Ability Charge(Event Player, Button(Ability 1)) > 0; } actions { Event Player.a = Button(Ability 1); Call Subroutine(k); } } rule("AI Junkrat Steel Trap") { event { Ongoing - Each Player; Team 2; Junkrat; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 8; Event Player.L < 5; Ability Cooldown(Event Player, Button(Ability 2)) == 0; } actions { Event Player.a = Button(Ability 2); Call Subroutine(k); } } rule("AI Junkrat Riptire") { event { Ongoing - Each Player; Team 2; Junkrat; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 10; Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 100; } actions { Event Player.a = Button(Ultimate); Call Subroutine(k); } } rule("AI Lucio") { event { Subroutine; l; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Press Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); Press Button(Event Player, Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); Wait(0.750, Ignore Condition); End; Event Player.A = False; } } rule("AI Lucio General") { event { Ongoing - Each Player; Team 2; Lรบcio; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(5, 7.500); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.d = Event Player.e; Event Player.j = 1; Event Player.G = 50; Event Player.z = True; } } rule("AI Lucio Attack") { event { Ongoing - Each Player; Team 2; Lรบcio; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 30; Event Player.L < 3; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(l); Wait(0.935, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Lucio Crossfade Heal Self") { event { Ongoing - Each Player; Team 2; Lรบcio; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Health(Event Player) <= 100; Is In Alternate Form(Event Player) == True; } actions { Event Player.a = Button(Ability 1); Call Subroutine(l); } } rule("AI Lucio Crossfade Speed Self") { event { Ongoing - Each Player; Team 2; Lรบcio; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Health(Event Player) > 100; Is In Alternate Form(Event Player) == False; } actions { Event Player.a = Button(Ability 1); Call Subroutine(l); } } rule("AI Lucio Amp It Up") { event { Ongoing - Each Player; Team 2; Lรบcio; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; (Health(Event Player) <= 75 || Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 15) == True; Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; Ability Cooldown(Event Player, Button(Ability 2)) == 0; } actions { Event Player.a = Button(Ability 2); Call Subroutine(l); } } rule("AI Lucio Soundwave Boop") { event { Ongoing - Each Player; Team 2; Lรบcio; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Health(Event Player) <= 100; Event Player.L < 1.5; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 8; Ability Cooldown(Event Player, Button(Secondary Fire)) == 0; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(l); } } rule("AI Lucio Soundwave Final") { event { Ongoing - Each Player; Team 2; Lรบcio; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Health(Players In Slot(Slot Of(Event Player), Team 1)) <= 25; Event Player.L < 1.5; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 8; Ability Cooldown(Event Player, Button(Secondary Fire)) == 0; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(l); } } rule("AI Lucio Sound Barrier") { event { Ongoing - Each Player; Team 2; Lรบcio; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; (Is Using Ultimate(Players In Slot(Slot Of(Event Player), Team 1)) || Health(Event Player) <= 75) == True; } actions { Event Player.a = Button(Ultimate); Call Subroutine(l); } } rule("AI Mei") { event { Subroutine; n; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Event Player.G = Event Player.H[0]; Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Event Player.G = Event Player.H[1]; Skip If(Is Button Held(Event Player, Button(Secondary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Wait Until(Health(Event Player) >= 200, 4.250); Press Button(Event Player, Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); Event Player.U = False; Event Player.X = False; Press Button(Event Player, Button(Ability 2)); Event Player.B = Position Of(Players In Slot(Slot Of(Event Player), Team 1)) + World Vector Of(Vector(0, 0, 2.500), Event Player, Rotation); Call Subroutine(K); Press Button(Event Player, Button(Primary Fire)); Wait(0.100, Ignore Condition); Event Player.m = True; Event Player.U = True; Event Player.X = True; Else If(Event Player.a == Button(Ultimate)); Event Player.G = Event Player.H[4]; Event Player.d = 2; Wait(0.250, Ignore Condition); Press Button(Event Player, Button(Ultimate)); Wait(0.250, Ignore Condition); Call Subroutine(L); End; Event Player.A = False; } } rule("AI Mei General") { event { Ongoing - Each Player; Team 2; Mei; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(6, 10); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.d = Event Player.e; Event Player.j = 1; Event Player.H[0] = 20; Event Player.H[1] = 115; Event Player.H[4] = 20; Event Player.z = True; } } rule("AI Mei Attack Primary") { event { Ongoing - Each Player; Team 2; Mei; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 10; Event Player.L < 3; Is Using Ability 1(Event Player) == False; Has Status(Players In Slot(Slot Of(Event Player), Team 1), Frozen) == False; Health(Players In Slot(Slot Of(Event Player), Team 1)) > 75; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(n); Wait(0.150, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Mei Attack Secondary") { event { Ongoing - Each Player; Team 2; Mei; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 50; (Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 10 || Health(Players In Slot(Slot Of( Event Player), Team 1)) <= 75) == True; Event Player.L < 2.5; Is Using Ability 1(Event Player) == False; Has Status(Players In Slot(Slot Of(Event Player), Team 1), Frozen) == False; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(n); Wait(0.800, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Secondary Fire)); } } rule("AI Mei Attack Secondary Frozen") { event { Ongoing - Each Player; Team 2; Mei; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Event Player.L < 1; Is Using Ability 1(Event Player) == False; Has Status(Players In Slot(Slot Of(Event Player), Team 1), Frozen) == True; } actions { Event Player.U = False; Event Player.X = False; Event Player.d = 1; Event Player.a = Button(Secondary Fire); Call Subroutine(n); Wait(0.800, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Secondary Fire)); Call Subroutine(L); Event Player.U = True; Event Player.X = True; } } rule("AI Mei Cryo-Freeze") { event { Ongoing - Each Player; Team 2; Mei; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Health(Event Player) <= 70; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; } actions { Event Player.a = Button(Ability 1); Call Subroutine(n); } } rule("AI Mei Ice Wall") { event { Ongoing - Each Player; Team 2; Mei; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 10; Is On Ground(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(n); } } rule("AI Mei Blizzrd") { event { Ongoing - Each Player; Team 2; Mei; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 100; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 15; } actions { Event Player.a = Button(Ultimate); Call Subroutine(n); } } rule("AI Mercy") { event { Subroutine; o; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); Wait Until(Is Using Ultimate(Event Player), 1); If(Is Using Ultimate(Event Player)); Event Player.E = Random Real(12, 16); Event Player.U = False; Event Player.Z = False; Event Player.B = Vector(X Component Of(Position Of(Event Player)), 10, Z Component Of(Position Of(Event Player))); Call Subroutine(K); Start Throttle In Direction(Event Player, Forward, 1, To Player, Replace existing throttle, Direction and Magnitude); Wait(Random Real(0.500, 1), Ignore Condition); Event Player.m = True; Start Throttle In Direction(Event Player, Backward, 1, To Player, Replace existing throttle, Direction and Magnitude); Wait(Random Real(0.500, 1), Ignore Condition); Event Player.Z = True; Wait Until(Is Using Ultimate(Event Player) == False, 15); Event Player.U = True; Event Player.E = Event Player.F; End; End; Event Player.A = False; } } rule("AI Mercy General") { event { Ongoing - Each Player; Team 2; Mercy; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(8, 12); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.k = 1; Event Player.G = 50; Set Weapon(Event Player, 2); Call Subroutine(L); Event Player.z = True; } } rule("Non AI Mercy Wield Staff") { event { Ongoing - Each Player; Team 2; Mercy; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == False; } actions { Set Weapon(Event Player, 1); } } rule("AI Mercy Attack") { event { Ongoing - Each Player; Team 2; Mercy; } conditions { Event Player.c == True; Event Player.n == True; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 3.5; } actions { Skip If(Is Button Held(Event Player, Button(Primary Fire)), 1); Start Holding Button(Event Player, Button(Primary Fire)); Wait(0.250, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Mercy Valkyrie") { event { Ongoing - Each Player; Team 2; Mercy; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Ultimate); Call Subroutine(o); } } rule("AI Moira") { event { Subroutine; p; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Skip If(Is Button Held(Event Player, Button(Secondary Fire)), 1); Start Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); If(Event Player.b == 0); Press Button(Event Player, Button(Jump)); Wait(Random Real(0.150, 0.250), Ignore Condition); Press Button(Event Player, Button(Ability 1)); Wait(Random Real(0.500, 0.600), Ignore Condition); Press Button(Event Player, Button(Jump)); Else If(Event Player.b == 1); Press Button(Event Player, Button(Ability 1)); End; Else If(Event Player.a == Button(Ability 2)); Stop Holding Button(Event Player, Button(Secondary Fire)); Call Subroutine(P); Press Button(Event Player, Button(Ability 2)); Call Subroutine(P); If(Event Player.b == 0); Press Button(Event Player, Button(Primary Fire)); Else If(Event Player.b == 1); Press Button(Event Player, Button(Secondary Fire)); End; Else If(Event Player.a == Button(Ultimate)); If(Ability Cooldown(Event Player, Button(Ability 2)) == 0); Event Player.a = Button(Ability 2); Event Player.b = 1; Call Subroutine(p); End; Press Button(Event Player, Button(Ultimate)); Wait Until(Is Using Ultimate(Event Player), 1 / 60); Wait Until(Is Using Ultimate(Event Player) == False, 8); End; Event Player.A = False; } } rule("AI Moira General") { event { Ongoing - Each Player; Team 2; Moira; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(10, 15); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.k = 0; Call Subroutine(L); Event Player.z = True; } } rule("AI Moira Attack") { event { Ongoing - Each Player; Team 2; Moira; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 2; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(p); Wait(0.250, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Secondary Fire)); } } rule("AI Moira Fade") { event { Player Took Damage; Team 2; Moira; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Health(Event Player) <= 75; Ability Cooldown(Event Player, Button(Ability 1)) == 0; } actions { Event Player.a = Button(Ability 1); Event Player.b = 0; Call Subroutine(p); } } rule("AI Moira Fade Gap Closer") { event { Ongoing - Each Player; Team 2; Moira; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 25; Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; Ability Cooldown(Event Player, Button(Ability 1)) == 0; } actions { Event Player.a = Button(Ability 1); Event Player.b = 0; Call Subroutine(p); } } rule("AI Moira Fade Ultimate") { event { Ongoing - Each Player; Team 2; Moira; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is Using Ultimate(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ability Cooldown(Event Player, Button(Ability 1)) == 0; } actions { If(Random Real(0, 1) < 0.500 + Event Player.p); Event Player.a = Button(Ability 1); Event Player.b = 1; Call Subroutine(p); End; } } rule("AI Moira Biotic Orb Damage") { event { Ongoing - Each Player; Team 2; Moira; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 2.75; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 15; Ultimate Charge Percent(Event Player) < 80; Health(Event Player) >= 100; Health(Players In Slot(Slot Of(Event Player), Team 1)) > 75; Is Using Ability 1(Event Player) == False; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Event Player.b = 1; Call Subroutine(p); } } rule("AI Moira Biotic Orb Healing") { event { Ongoing - Each Player; Team 2; Moira; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Health(Event Player) <= 100; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Event Player.b = 0; Call Subroutine(p); } } rule("AI Moira Coalescence") { event { Ongoing - Each Player; Team 2; Moira; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 2; } actions { Event Player.a = Button(Ultimate); Call Subroutine(p); } } rule("AI Orisa") { event { Subroutine; q; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Secondary Fire)); Event Player.G = Event Player.H[1]; Event Player.d = 3; Event Player.y = Vector(Random Real(-2, 2), Random Real(3, 6), Random Real(-2, 2)); Call Subroutine(P); Press Button(Event Player, Button(Secondary Fire)); Wait(0.100, Ignore Condition); Event Player.G = Event Player.H[0]; Event Player.d = 0; If(Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 0.450 * Event Player.H[1]); Wait(Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) / Event Player.H[1], Ignore Condition); Else; Wait(0.450, Ignore Condition); End; Press Button(Event Player, Button(Secondary Fire)); Wait(0.500, Ignore Condition); Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); Event Player.B = Position Of(Event Player) + World Vector Of(Vector(0, 0, 4), Event Player, Rotation); Call Subroutine(K); Press Button(Event Player, Button(Ability 2)); Call Subroutine(P); Event Player.m = True; Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); End; Event Player.A = False; } } rule("AI Orisa General") { event { Ongoing - Each Player; Team 2; Orisa; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(15, 20); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.d = Event Player.e; Event Player.j = 1; Event Player.H[0] = 120; Event Player.H[1] = 25; Event Player.z = True; } } rule("AI Orisa Attack") { event { Ongoing - Each Player; Team 2; Orisa; } conditions { Event Player.c == True; Event Player.n == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 50; Event Player.L < 3; } actions { Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Wait(0.250, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Orisa Halt!") { event { Ongoing - Each Player; Team 2; Orisa; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 30; Event Player.L < 3; Ability Cooldown(Event Player, Button(Secondary Fire)) == 0; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(q); } } rule("AI Orisa Fortify") { event { Player Took Damage; Team 2; Orisa; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 30; Ability Cooldown(Event Player, Button(Ability 1)) == 0; } actions { If(Random Real(0, 1) < 0.333 + Event Player.p); Event Player.a = Button(Ability 1); Call Subroutine(q); End; } } rule("AI Orisa Protective Barrier") { event { Ongoing - Each Player; Team 2; Orisa; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= Event Player.E; Absolute Value( Horizontal Angle Towards( Event Player, Players In Slot(Slot Of(Event Player), Team 1) ) ) <= 12; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(q); } } rule("AI Orisa Supercharger") { event { Ongoing - Each Player; Team 2; Orisa; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= Event Player.E; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Ultimate); Call Subroutine(q); } } rule("AI Pharah") { event { Subroutine; r; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Event Player.G = Event Player.H[0]; Press Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Start Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); Event Player.G = Event Player.H[3]; Call Subroutine(P); Press Button(Event Player, Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Event Player.G = Event Player.H[4]; Press Button(Event Player, Button(Ultimate)); Wait Until(Is Using Ultimate(Event Player) == True, 0.250); Wait Until(Is Using Ultimate(Event Player) == False, 2.500); End; Event Player.A = False; } } rule("AI Pharah General") { event { Ongoing - Each Player; Team 2; Pharah; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(9, 12); Event Player.E = Event Player.F; Event Player.J = 10; Event Player.e = 2; Event Player.k = 1; Event Player.H[0] = 35; Event Player.H[3] = 60; Event Player.H[4] = 45; Call Subroutine(L); Event Player.z = True; } } rule("AI Pharah Hover Jets") { event { Ongoing - Each Player; Team 2; Pharah; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Altitude Of(Event Player) <= 20; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(r); Wait(Random Real(0.250, 1.250), Ignore Condition); Stop Holding Button(Event Player, Button(Secondary Fire)); Wait(Random Real(0.500, 1), Ignore Condition); Loop If Condition Is True; } } rule("AI Pharah Attack") { event { Ongoing - Each Player; Team 2; Pharah; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 35; Event Player.L < 3.5; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(r); Wait(0.850, Ignore Condition); Loop If Condition Is True; } } rule("AI Pharah Jump Jet") { event { Ongoing - Each Player; Team 2; Pharah; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Altitude Of(Event Player) <= 20; } actions { Event Player.a = Button(Ability 1); Call Subroutine(r); } } rule("AI Pharah Concussive Blast") { event { Ongoing - Each Player; Team 2; Pharah; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 3; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(r); } } rule("AI Pharah Barrage") { event { Ongoing - Each Player; Team 2; Pharah; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Altitude Of(Event Player) >= 3; Altitude Of(Event Player) <= 12; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 100; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 15; Event Player.L < 3; } actions { Event Player.a = Button(Ultimate); Call Subroutine(r); } } rule("AI Reaper") { event { Subroutine; s; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 1); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Ability 1)); Call Subroutine(I); Press Button(Event Player, Button(Ability 1)); Wait(Random Real(2, 3), Ignore Condition); Press Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Ability 2)); Press Button(Event Player, Button(Ability 2)); Event Player.B = Position Of(Players In Slot(Slot Of(Event Player), Team 1) + Vector(Random Real(0, 5), 0, Random Real(0, 5))); Call Subroutine(K); Press Button(Event Player, Button(Primary Fire)); Wait(1.500, Ignore Condition); Event Player.m = True; Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); Wait Until(Is Using Ultimate(Event Player), 0.500); Wait Until(Is Using Ultimate(Event Player) == False, 3); End; Event Player.A = False; } } rule("AI Reaper General") { event { Ongoing - Each Player; Team 2; Reaper; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(3, 7); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.k = 0; Call Subroutine(L); Event Player.z = True; } } rule("AI Reaper Attack") { event { Ongoing - Each Player; Team 2; Reaper; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Event Player.z == True; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; Is Using Ultimate(Event Player) == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 25; Event Player.L < 2; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(s); Wait(0.500, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Reaper Wraith Form") { event { Player Took Damage; Team 2; Reaper; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Health(Event Player) < 100; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; } actions { Event Player.a = Button(Ability 1); Call Subroutine(s); } } rule("AI Reaper Shadow Step") { event { Ongoing - Each Player; Team 2; Reaper; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 20; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; } actions { Wait(0.250, Abort When False); Event Player.a = Button(Ability 2); Call Subroutine(s); } } rule("AI Reaper Death Blossom") { event { Ongoing - Each Player; Team 2; Reaper; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 100; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 8; } actions { Event Player.a = Button(Ultimate); Call Subroutine(s); } } rule("AI Reinhardt") { event { Subroutine; t; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Call Subroutine(I); Start Holding Button(Event Player, Button(Secondary Fire)); Wait Until(Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 6.500, Random Real(0.500, 2.750)); Stop Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Event Player.X = False; Else If(Event Player.a == Button(Ability 2)); Call Subroutine(I); Event Player.j = 1; Event Player.d = 3; Event Player.y = Vector(0, 0.750, 0); Event Player.G = Event Player.H[3]; Call Subroutine(M); Wait(Random Real(0.150, 0.250), Ignore Condition); Press Button(Event Player, Button(Ability 2)); Wait(1.120, Ignore Condition); Call Subroutine(L); Else If(Event Player.a == Button(Ultimate)); Call Subroutine(I); Press Button(Event Player, Button(Ultimate)); Wait(0.950, Ignore Condition); If(Has Status(Players In Slot(Slot Of(Event Player), Team 1), Knocked Down)); Event Player.U = False; Event Player.E = Random Real(1.500, 3); If(Ability Cooldown(Event Player, Button(Ability 1)) == 0); Press Button(Event Player, Button(Ability 1)); End; End; End; Event Player.A = False; } } rule("AI Reinhardt General") { event { Ongoing - Each Player; Team 2; Reinhardt; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(3.5, 4.5); Event Player.E = Event Player.F; Event Player.J = 0; Event Player.e = 0; Event Player.k = 0; Event Player.H[3] = 25; Call Subroutine(L); Event Player.z = True; } } rule("AI Reinhardt Attack") { event { Ongoing - Each Player; Team 2; Reinhardt; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 8; Event Player.L < 3; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(t); Wait(0.960, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Reinhardt Use Shield") { event { Ongoing - Each Player; Team 2; Reinhardt; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is In View Angle(Players In Slot(Slot Of(Event Player), Team 1), Eye Position(Event Player) - Vector(0, 0.250 + Y Component Of( Eye Position(Players In Slot(Slot Of(Event Player), Team 1))), 0), 15) == True; (Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 7.500 || Health(Event Player) < 250) == True; Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; Has Status(Players In Slot(Slot Of(Event Player), Team 1), Knocked Down) == False; Is Using Ultimate(Event Player) == False; } actions { If(Random Real(0, 1) < 0.450 + Event Player.p); Event Player.a = Button(Secondary Fire); Call Subroutine(t); End; Loop If Condition Is True; Stop Holding Button(Event Player, Button(Secondary Fire)); } } rule("AI Reinhardt Block Earthshtter") { event { Ongoing - Each Player; Team 2; Reinhardt; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is In View Angle(Players In Slot(Slot Of(Event Player), Team 1), Eye Position(Event Player) - Vector(0, 0.250 + Y Component Of( Eye Position(Players In Slot(Slot Of(Event Player), Team 1))), 0), 30) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Ultimate Charge Percent(Players In Slot(Slot Of(Event Player), Team 1)) == 0; } actions { If(Random Real(0, 1) < 0.250 + Event Player.p); Event Player.a = Button(Secondary Fire); Call Subroutine(t); End; } } rule("AI Reinhardt Charge") { event { Ongoing - Each Player; Team 2; Reinhardt; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 2.5; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 10; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bm) < Players In Slot(Slot Of( Event Player), Team 1).bf - 2.500; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 75; Altitude Of(Players In Slot(Slot Of(Event Player), Team 1)) < 2; Altitude Of(Event Player) < 2; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Ultimate Charge Percent(Event Player) < 90; } actions { Event Player.a = Button(Ability 1); Call Subroutine(t); } } rule("AI Reinhardt Charge Gap Closer") { event { Ongoing - Each Player; Team 2; Reinhardt; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 4; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 20; Ability Cooldown(Event Player, Button(Ability 1)) == 0; } actions { Event Player.a = Button(Ability 1); Call Subroutine(t); } } rule("AI Reinhardt Firestrike") { event { Ongoing - Each Player; Team 2; Reinhardt; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 2.5; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 20; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Ultimate Charge Percent(Event Player) < 90; } actions { Event Player.a = Button(Ability 2); Call Subroutine(t); } } rule("AI Reinhardt Earthshtter") { event { Ongoing - Each Player; Team 2; Reinhardt; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Event Player.L < 3.5; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 16; Health(Players In Slot(Slot Of(Event Player), Team 1)) > 80; Health(Event Player) >= 50; Is On Ground(Event Player) == True; Is On Ground(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is Jumping(Event Player) == False; (Hero Of(Players In Slot(Slot Of(Event Player), Team 1)) == Hero(Reinhardt) ? Is Firing Secondary(Players In Slot(Slot Of( Event Player), Team 1)) == False : True) == True; } actions { Wait(Random Real(0.100, 0.500), Abort When False); Event Player.a = Button(Ultimate); Call Subroutine(t); Wait Until(Has Status(Players In Slot(Slot Of(Event Player), Team 1), Knocked Down) == False, 2.500); Event Player.U = True; Event Player.E = Event Player.F; } } rule("AI Roadhog") { event { Subroutine; u; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Event Player.G = Event Player.H[0]; Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Event Player.G = Event Player.H[0]; Skip If(Is Button Held(Event Player, Button(Secondary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); Event Player.G = Event Player.H[2]; Wait(Random Real(0.100, 0.250), Ignore Condition); Event Player.Z = False; Start Throttle In Direction(Event Player, Forward, 1, To Player, Replace existing throttle, None); Press Button(Event Player, Button(Ability 1)); Wait Until(Is Using Ability 1(Event Player), 1); Wait Until(Is Using Ability 1(Event Player) == False, 1); Start Holding Button(Event Player, Button(Primary Fire)); Wait(0.250, Ignore Condition); Press Button(Event Player, Button(Melee)); Wait(0.750, Ignore Condition); Stop Holding Button(Event Player, Button(Primary Fire)); Call Subroutine(Z); Event Player.Z = True; Else If(Event Player.a == Button(Ability 2)); Press Button(Event Player, Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); End; Event Player.A = False; } } rule("AI Roadhog General") { event { Ongoing - Each Player; Team 2; Roadhog; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(9, 12); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.d = Event Player.e; Event Player.j = 1; Event Player.H[0] = 80; Event Player.H[2] = 40; Event Player.z = True; } } rule("AI Roadhog Attack Primary") { event { Ongoing - Each Player; Team 2; Roadhog; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 15; Event Player.L < 2.5; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; Is Using Ultimate(Event Player) == False; Is Firing Secondary(Event Player) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(u); Wait(0.850, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Roadhog Attack Secondary") { event { Ongoing - Each Player; Team 2; Roadhog; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 15; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 38; Event Player.L < 3; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; Is Using Ultimate(Event Player) == False; Is Firing Primary(Event Player) == False; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(u); Wait(0.850, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Secondary Fire)); } } rule("AI Roadhog Chain Hook") { event { Ongoing - Each Player; Team 2; Roadhog; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Ammo(Event Player, 0) > 1; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 75; Event Player.L < 2.25; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1).bm) <= Players In Slot(Slot Of( Event Player), Team 1).bw; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Ability 1); Call Subroutine(u); } } rule("AI Roadhog Take A Breather") { event { Ongoing - Each Player; Team 2; Roadhog; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Health(Event Player) < 100; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(u); } } rule("AI Roadhog Whole Hog") { event { Ongoing - Each Player; Team 2; Roadhog; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 15; Event Player.L < 3; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ultimate); Call Subroutine(u); } } rule("AI Sigma") { event { Subroutine; v; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); If(Event Player.j != 2 || Event Player.d != 0); Event Player.j = 2; Event Player.d = 0; Call Subroutine(M); End; Event Player.G = Event Player.H[0]; Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); If(Event Player.j != 0 || Event Player.d != 0); Event Player.j = 0; Event Player.d = 0; Call Subroutine(M); End; Call Subroutine(I); Start Holding Button(Event Player, Button(Secondary Fire)); Wait(Random Real(0.150, 0.400), Ignore Condition); Stop Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); If(Event Player.j != 0 || Event Player.d != 0); Event Player.j = 0; Event Player.d = 0; Call Subroutine(M); End; Press Button(Event Player, Button(Ability 1)); Wait(0.100, Ignore Condition); Wait Until(Is Using Ability 1(Event Player) == False, 2); Else If(Event Player.a == Button(Ability 2)); If(Event Player.j != 2 || Event Player.d != 0); Event Player.j = 2; Event Player.d = 0; Call Subroutine(M); End; Event Player.G = Event Player.H[3]; Call Subroutine(P); Press Button(Event Player, Button(Ability 2)); Wait(0.650, Ignore Condition); Else If(Event Player.a == Button(Ultimate)); If(Event Player.j != 0 || Event Player.d != 2); Event Player.j = 0; Event Player.d = 2; Call Subroutine(M); End; Press Button(Event Player, Button(Ultimate)); Start Holding Button(Event Player, Button(Jump)); Wait(Random Real(0.750, 1.500), Ignore Condition); Wait Until(Event Player.L < 3, 4); Start Holding Button(Event Player, Button(Primary Fire)); Event Player.j = 0; Event Player.d = 0; Call Subroutine(M); Wait Until(Is Using Ultimate(Event Player) == False, 5); End; Event Player.A = False; } } rule("AI Sigma General") { event { Ongoing - Each Player; Team 2; Sigma; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(12, 15); Event Player.E = Event Player.F; Event Player.e = 2; Event Player.k = 2; Event Player.H[0] = 50; Event Player.H[3] = 37.500; Call Subroutine(L); Event Player.z = True; } } rule("AI Sigma Attack") { event { Ongoing - Each Player; Team 2; Sigma; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 25; Event Player.L < 3.25; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(v); Wait(1.500, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Sigma Experimental Barrier") { event { Ongoing - Each Player; Team 2; Sigma; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 3; Ability Cooldown(Event Player, Button(Secondary Fire)) == 0; Is Firing Secondary(Event Player) == False; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(v); Wait(4, Ignore Condition); Press Button(Event Player, Button(Secondary Fire)); Loop If Condition Is True; } } rule("AI Sigma Kinetic Grasp") { event { Player Took Damage; Team 2; Sigma; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 5; Is In View Angle(Players In Slot(Slot Of(Event Player), Team 1), Eye Position(Event Player) - Vector(0, 0.250 + Y Component Of( Eye Position(Players In Slot(Slot Of(Event Player), Team 1))), 0), 15) == True; Array Contains(Global.x, Hero Of(Players In Slot(Slot Of(Event Player), Team 1))) == True; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; } actions { If(Random Real(0, 1) < 0.450 + Event Player.p); Event Player.a = Button(Ability 1); Call Subroutine(v); End; } } rule("AI Sigma Accretion") { event { Ongoing - Each Player; Team 2; Sigma; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Event Player.L < 2.75; Speed Of(Players In Slot(Slot Of(Event Player), Team 1)) <= 6; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(v); } } rule("AI Sigma Gravitic Flux") { event { Ongoing - Each Player; Team 2; Sigma; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 125; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Event Player.L < 4; } actions { Event Player.a = Button(Ultimate); Call Subroutine(v); } } rule("AI Soldier: 76") { event { Subroutine; w; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Event Player.j = 1; Event Player.d = 2; Event Player.G = Event Player.H[1]; Call Subroutine(M); Wait(Random Real(0.150, 0.250), Ignore Condition); Press Button(Event Player, Button(Secondary Fire)); Wait(0.250, Ignore Condition); Call Subroutine(L); Else If(Event Player.a == Button(Ability 1)); Call Subroutine(I); Start Holding Button(Event Player, Button(Ability 1)); Wait Until(Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < Event Player.E + 5, 9999); Stop Holding Button(Event Player, Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); Press Button(Event Player, Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); End; Event Player.A = False; } } rule("AI Soldier: 76 General") { event { Ongoing - Each Player; Team 2; Soldier: 76; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(15, 20); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.k = 0; Event Player.H[1] = 50; Call Subroutine(L); Event Player.z = True; } } rule("AI Soldier: 76 Attack") { event { Ongoing - Each Player; Team 2; Soldier: 76; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 50; Event Player.L < 2.25; Is Using Ability 1(Event Player) == False; Is Firing Secondary(Event Player) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(w); Wait(0.250, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Soldier: 76 Helix Rockets") { event { Ongoing - Each Player; Team 2; Soldier: 76; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 2.75; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Ability Cooldown(Event Player, Button(Secondary Fire)) == 0; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(w); } } rule("AI Soldier: 76 Sprint") { event { Ongoing - Each Player; Team 2; Soldier: 76; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > Event Player.E + 5; Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; } actions { Event Player.a = Button(Ability 1); Call Subroutine(w); } } rule("AI Soldier: 76 Biotic Field") { event { Player Took Damage; Team 2; Soldier: 76; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Health(Event Player) < 100; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(w); } } rule("AI Soldier: 76 Tactical Visor") { event { Ongoing - Each Player; Team 2; Soldier: 76; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Health(Event Player) >= 50; } actions { Event Player.a = Button(Ultimate); Call Subroutine(w); } } rule("AI Sombra") { event { Subroutine; x; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); If(Is Using Ability 1(Event Player) == True); Press Button(Event Player, Button(Ability 1)); Wait(0.800, Ignore Condition); End; Start Holding Button(Event Player, Button(Secondary Fire)); Wait(0.750, Ignore Condition); Stop Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); If(Is Using Ability 2(Event Player)); If(Ability Cooldown(Event Player, Button(Ability 1)) == 0); Press Button(Event Player, Button(Ability 1)); Wait(1 / 60, Ignore Condition); End; Press Button(Event Player, Button(Ability 2)); Wait(0.250, Ignore Condition); Heal(Event Player, Null, 75); Else; Event Player.B = Position Of(Event Player) + World Vector Of(Vector(Random Real(-5, 5), Random Real(1, 3), Random Real(-10, -15)), Event Player, Rotation); Call Subroutine(K); Press Button(Event Player, Button(Ability 2)); Wait(0.100, Ignore Condition); Event Player.m = True; End; Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); Wait(0.100, Ignore Condition); Wait Until(Is Using Ultimate(Event Player) == False, 0.650); End; Event Player.A = False; } } rule("AI Sombra General") { event { Ongoing - Each Player; Team 2; Sombra; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(5, 8); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.d = Event Player.e; Event Player.j = 0; If(Ability Cooldown(Event Player, Button(Ability 1)) == 0); Press Button(Event Player, Button(Ability 1)); End; Event Player.z = True; } } rule("AI Sombra Attack") { event { Ongoing - Each Player; Team 2; Sombra; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 30; Event Player.L < 2.5; Is Using Ability 1(Event Player) == False; Is Button Held(Event Player, Button(Secondary Fire)) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(x); Wait(0.250, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Sombra Hack") { event { Ongoing - Each Player; Team 2; Sombra; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 10; Event Player.L < 1.5; Is In View Angle(Players In Slot(Slot Of(Event Player), Team 1), Eye Position(Event Player) - Vector(0, 0.250 + Y Component Of( Eye Position(Players In Slot(Slot Of(Event Player), Team 1))), 0), 15) == False; Ability Cooldown(Event Player, Button(Secondary Fire)) == 0; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(x); } } rule("AI Sombra Stealth") { event { Player Dealt Final Blow; Team 2; Sombra; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; } actions { Call Subroutine(P); Press Button(Event Player, Button(Ability 1)); } } rule("AI Sombra Translocator Place") { event { Ongoing - Each Player; Team 2; Sombra; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Using Ability 2(Event Player) == False; Is Firing Secondary(Event Player) == False; Ability Cooldown(Event Player, Button(Ability 2)) == 0; } actions { Event Player.a = Button(Ability 2); Call Subroutine(x); } } rule("AI Sombra Translocator Use") { event { Ongoing - Each Player; Team 2; Sombra; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Health(Event Player) <= 75; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == True; Ability Cooldown(Event Player, Button(Ability 2)) == 0; } actions { Event Player.a = Button(Ability 2); Call Subroutine(x); } } rule("AI Sombra EMP") { event { Ongoing - Each Player; Team 2; Sombra; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 75; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 15; } actions { Event Player.a = Button(Ultimate); Call Subroutine(x); } } rule("AI Symmetra") { event { Subroutine; y; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Event Player.j = 0; Event Player.d = 0; Call Subroutine(M); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Event Player.j = 1; Event Player.d = 0; Event Player.G = Event Player.H[1]; Call Subroutine(M); Call Subroutine(I); Start Holding Button(Event Player, Button(Secondary Fire)); Wait(Random Real(0.500, 1), Ignore Condition); Stop Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Ability 1)); Event Player.B = Position Of(Players In Slot(Slot Of(Event Player), Team 1)) + Vector(Random Real(-6, 6), 0, Random Real(-6, 6)); Call Subroutine(K); Press Button(Event Player, Button(Ability 1)); Wait(0.350, Ignore Condition); Event Player.m = True; Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); Wait(0.250, Ignore Condition); Press Button(Event Player, Button(Ultimate)); Wait(0.250, Ignore Condition); Press Button(Event Player, Button(Primary Fire)); End; Event Player.A = False; } } rule("AI Symmetra General") { event { Ongoing - Each Player; Team 2; Symmetra; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(6, 10); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.d = Event Player.e; Event Player.j = 0; Event Player.H[1] = 25; Event Player.z = True; } } rule("AI Symmetra Attack Primary") { event { Ongoing - Each Player; Team 2; Symmetra; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 12; Event Player.L < 2; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(y); Wait(0.250, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Symmetra Attack Secondary") { event { Ongoing - Each Player; Team 2; Symmetra; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 40; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 12; Event Player.L < 3.5; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(y); Loop If Condition Is True; Event Player.j = 0; } } rule("AI Symmetra Sentry Turret") { event { Ongoing - Each Player; Team 2; Symmetra; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is On Ground(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Ability Charge(Event Player, Button(Ability 1)) > 0; Ability Cooldown(Event Player, Button(Ability 1)) == 0; } actions { Event Player.a = Button(Ability 1); Call Subroutine(y); } } rule("AI Symmetra Photon Barrier") { event { Ongoing - Each Player; Team 2; Symmetra; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Ultimate); Call Subroutine(y); } } rule("AI Torbjorn") { event { Subroutine; z; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Event Player.G = Event Player.H[0]; Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Event Player.G = Event Player.H[1]; Skip If(Is Button Held(Event Player, Button(Secondary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); Event Player.B = Position Of(Event Player) + World Vector Of(Vector(Random Real(-8, 8), 0, Random Real(0, 3)), Event Player, Rotation); Call Subroutine(K); Press Button(Event Player, Button(Ability 1)); Call Subroutine(P); Event Player.m = True; Call Subroutine(L); Else If(Event Player.a == Button(Ability 2)); Press Button(Event Player, Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Call Subroutine(I); Event Player.G = Event Player.H[4]; Call Subroutine(P); Press Button(Event Player, Button(Ultimate)); Wait(1, Ignore Condition); While(Is Using Ultimate(Event Player)); Press Button(Event Player, Button(Primary Fire)); Wait(Random Real(0.150, 0.500), Ignore Condition); End; Call Subroutine(L); End; Event Player.A = False; } } rule("AI Torbjorn General") { event { Ongoing - Each Player; Team 2; Torbjรถrn; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(15, 20); Event Player.E = Event Player.F; Event Player.e = 1; Event Player.k = 2; Event Player.H[0] = 70; Event Player.H[1] = 120; Event Player.H[4] = 40; Call Subroutine(L); Event Player.z = True; } } rule("AI Torbjorn Attack Primary") { event { Ongoing - Each Player; Team 2; Torbjรถrn; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 40; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 10; Event Player.L < 2.25; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(z); Wait(0.600, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Torbjorn Attack Secondary") { event { Ongoing - Each Player; Team 2; Torbjรถrn; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 10; Event Player.L < 1.75; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(z); Wait(0.800, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Secondary Fire)); } } rule("AI Torbjorn Deploy Turret") { event { Ongoing - Each Player; Team 2; Torbjรถrn; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is Using Ultimate(Event Player) == False; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; Players In Slot(Slot Of(Event Player), Team 1).Q % 2 == 0; } actions { Event Player.a = Button(Ability 1); Call Subroutine(z); } } rule("AI Torbjorn Overload") { event { Player Took Damage; Team 2; Torbjรถrn; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Health(Event Player) <= 90; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(z); } } rule("AI Torbjorn Molten Core") { event { Ongoing - Each Player; Team 2; Torbjรถrn; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 30; } actions { Event Player.a = Button(Ultimate); Call Subroutine(z); } } rule("AI Tracer") { event { Subroutine; A; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 1); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Wait(0.100, Ignore Condition); Else If(Event Player.a == Button(Ability 2)); Press Button(Event Player, Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Event Player.G = Event Player.H[4]; Event Player.j = 2; Call Subroutine(M); Wait(Random Real(0.150, 0.250), Ignore Condition); Press Button(Event Player, Button(Ultimate)); Wait(0.150, Ignore Condition); Event Player.E = Event Player.F; Event Player.j = 0; Call Subroutine(M); End; Event Player.A = False; } } rule("AI Tracer General") { event { Ongoing - Each Player; Team 2; Tracer; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(4, 6); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.k = 0; Event Player.H[4] = 15; Call Subroutine(L); Event Player.z = True; } } rule("AI Tracer Attack") { event { Ongoing - Each Player; Team 2; Tracer; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 23; Event Player.L < 2; Is Reloading(Event Player) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(A); Wait(1, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Tracer Blink") { event { Ongoing - Each Player; Team 2; Tracer; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Is In View Angle(Players In Slot(Slot Of(Event Player), Team 1), Eye Position(Event Player) - Vector(0, 0.250 + Y Component Of( Eye Position(Players In Slot(Slot Of(Event Player), Team 1))), 0), 7.5) == True; Ability Charge(Event Player, Button(Ability 1)) > 0; Is Using Ability 1(Event Player) == False; } actions { If(Random Real(0, 1) < 0.300 + Event Player.p); Event Player.a = Button(Ability 1); Call Subroutine(A); End; } } rule("AI Tracer Recall") { event { Player Took Damage; Team 2; Tracer; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Health(Event Player) < 85; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(A); } } rule("AI Tracer Pulse Bomb Update Range") { event { Ongoing - Each Player; Team 2; Tracer; } conditions { Event Player.c == True; Event Player.o == True; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 100; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; } actions { Event Player.E = Random Real(1, 3); } } rule("AI Tracer Pulse Bomb Toss") { event { Ongoing - Each Player; Team 2; Tracer; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 75; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 5; Event Player.L < 1.5; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Ultimate); Call Subroutine(A); } } rule("AI Tracer Pulse Bomb Stick Recall") { event { Player Dealt Damage; Team 2; Tracer; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Damage == 5; Ultimate Charge Percent(Event Player) == 0; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(A); } } rule("AI Widowmaker") { event { Subroutine; B; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); If(Is Firing Secondary(Event Player)); If(Random Real(0, 1) < Players In Slot(Slot Of(Event Player), Team 1).ay / 20); Call Subroutine(N); Press Button(Event Player, Button(Primary Fire)); Call Subroutine(O); Else; Press Button(Event Player, Button(Primary Fire)); End; Event Player.K = Total Time Elapsed; Else; Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); End; Else If(Event Player.a == Button(Secondary Fire)); If(Is Button Held(Event Player, Button(Secondary Fire))); Stop Holding Button(Event Player, Button(Secondary Fire)); If(Event Player.j != 0 || Event Player.d != 0); Event Player.j = 0; Event Player.d = 0; Call Subroutine(M); End; Else; Event Player.X = False; Call Subroutine(I); Start Holding Button(Event Player, Button(Secondary Fire)); Wait(0.333, Ignore Condition); Event Player.K = Total Time Elapsed; If(Event Player.j != 0 || Event Player.d != 1); Call Subroutine(L); End; End; Else If(Event Player.a == Button(Ability 1)); Event Player.n = False; Call Subroutine(I); Call Subroutine(K); Press Button(Event Player, Button(Ability 1)); Stop Facing(Event Player); Wait Until(Is Using Ability 1(Event Player) == True, 2); Wait Until(Is Using Ability 1(Event Player) == False, 2); Event Player.m = True; Event Player.n = True; Else If(Event Player.a == Button(Ability 2)); Stop Holding Button(Event Player, Button(Secondary Fire)); Event Player.j = 2; Event Player.d = 2; Event Player.G = Event Player.H[3]; Call Subroutine(M); Call Subroutine(P); Press Button(Event Player, Button(Ability 2)); Wait(0.150, Ignore Condition); Call Subroutine(L); Else If(Event Player.a == Button(Ultimate)); Stop Holding Button(Event Player, Button(Secondary Fire)); Press Button(Event Player, Button(Ultimate)); End; Event Player.A = False; } } rule("AI Widowmaker General") { event { Ongoing - Each Player; Team 2; Widowmaker; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Integer(20, 35); Event Player.E = Event Player.F; Event Player.J = 10; Event Player.e = 1; Event Player.k = 0; Event Player.H[3] = 20; Call Subroutine(L); Event Player.z = True; } } rule("AI Widowmaker Scope In") { event { Ongoing - Each Player; Team 2; Widowmaker; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 7.500; Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; Is Using Ability 1(Event Player) == False; Is Button Held(Event Player, Button(Secondary Fire)) == False; Is Reloading(Event Player) == False; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(B); } } rule("AI Widowmaker Scope Out") { event { Ongoing - Each Player; Team 2; Widowmaker; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; (Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 7.500 || Is Alive(Players In Slot(Slot Of( Event Player), Team 1)) == False) == True; Is Using Ability 1(Event Player) == False; Is Firing Secondary(Event Player) == True; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(B); } } rule("AI Widowmaker Scope Out Reloading") { event { Ongoing - Each Player; Team 2; Widowmaker; } conditions { Event Player.c == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Using Ability 1(Event Player) == False; Is Button Held(Event Player, Button(Secondary Fire)) == True; Is Reloading(Event Player) == True; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(B); } } rule("AI Widowmaker Charge And Fire") { event { Ongoing - Each Player; Team 2; Widowmaker; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is Firing Secondary(Event Player) == True; Is Using Ability 1(Event Player) == False; Event Player.L <= 1.25; Total Time Elapsed >= Event Player.K + 1.250; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(B); } } rule("AI Widowmaker Attack SMG") { event { Ongoing - Each Player; Team 2; Widowmaker; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 7.500; Event Player.L < 2; Is Using Ability 1(Event Player) == False; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(B); Wait(0.250, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Widowmaker Grappling Hook Closer") { event { Ongoing - Each Player; Team 2; Widowmaker; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is Using Ability 1(Event Player) == False; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= Event Player.E + 10; Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; } actions { Event Player.B = Position Of(Event Player) + World Vector Of(Vector(Random Real(-8, 8), 0, Random Real(8, 16)), Event Player, Rotation); Event Player.a = Button(Ability 1); Call Subroutine(B); } } rule("AI Widowmaker Grappling Hook Farther") { event { Ongoing - Each Player; Team 2; Widowmaker; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is Using Ability 1(Event Player) == False; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= Event Player.E - 10; Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; } actions { Event Player.B = Position Of(Event Player) + World Vector Of(Vector(Random Real(-8, 8), 0, Random Real(-8, -16)), Event Player, Rotation); Event Player.a = Button(Ability 1); Call Subroutine(B); } } rule("AI Widowmaker Venom Mine") { event { Ongoing - Each Player; Team 2; Widowmaker; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is Using Ability 1(Event Player) == False; Is Using Ability 2(Event Player) == False; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= Event Player.E; } actions { Event Player.a = Button(Ability 2); Call Subroutine(B); } } rule("AI Widowmaker Infra-Sight") { event { Ongoing - Each Player; Team 2; Widowmaker; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Health(Event Player) >= 75; } actions { Event Player.a = Button(Ultimate); Call Subroutine(B); } } rule("AI Winston") { event { Subroutine; C; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); Event Player.Z = False; Start Throttle In Direction(Event Player, Direction Towards(Event Player, Players In Slot(Slot Of(Event Player), Team 1)), 1, To World, Replace existing throttle, Direction and Magnitude); Event Player.j = 2; Event Player.d = 2; Event Player.G = Event Player.H[2]; Call Subroutine(M); Wait(Random Real(0.250, 0.750), Ignore Condition); Press Button(Event Player, Button(Ability 1)); Wait(0.100, Ignore Condition); Event Player.Z = True; Call Subroutine(L); Else If(Event Player.a == Button(Ability 2)); Press Button(Event Player, Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); Event Player.E = Random Real(1.500, 3); Wait Until(Is Using Ultimate(Event Player) == True, 0.250); End; Event Player.A = False; } } rule("AI Winston General") { event { Ongoing - Each Player; Team 2; Winston; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(3, 6); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.k = 0; Event Player.H[2] = 30; Event Player.J = 1.500; Call Subroutine(L); Event Player.z = True; } } rule("AI Winston Attack") { event { Ongoing - Each Player; Team 2; Winston; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 8; Event Player.L < 2.75; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(C); Wait(0.250, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Winston Jump Pack") { event { Ongoing - Each Player; Team 2; Winston; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 3; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 12; Distance Between(Players In Slot(Slot Of(Event Player), Team 1), Players In Slot(Slot Of(Event Player), Team 1).bm) < Global.b; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; } actions { Event Player.a = Button(Ability 1); Call Subroutine(C); } } rule("AI Winston Barrier Projector") { event { Player Took Damage; Team 2; Winston; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Health(Event Player) <= 350; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= Event Player.E + 10; Ability Cooldown(Event Player, Button(Ability 2)) == 0; Is Using Ability 2(Event Player) == False; } actions { If(Random Real(0, 1) < 0.250 + Event Player.p); Event Player.a = Button(Ability 2); Call Subroutine(C); End; } } rule("AI Winston Primal Rage") { event { Ongoing - Each Player; Team 2; Winston; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Event Player.z == True; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 100; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 20; Event Player.L < 3; } actions { Event Player.a = Button(Ultimate); Call Subroutine(C); Wait Until(Is Using Ultimate(Event Player) == False, 10); Event Player.E = Event Player.F; } } rule("AI Wrecking Ball") { event { Subroutine; D; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Crouch)); Event Player.U = False; Press Button(Event Player, Button(Jump)); Wait(0.250, Ignore Condition); Press Button(Event Player, Button(Crouch)); Event Player.U = True; Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); Press Button(Event Player, Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); End; Event Player.A = False; } } rule("AI Wrecking Ball General") { event { Ongoing - Each Player; Team 2; Wrecking Ball; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(5, 10); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.d = Event Player.e; Event Player.X = False; Event Player.j = 0; Event Player.z = True; } } rule("AI Wrecking Ball Attack") { event { Ongoing - Each Player; Team 2; Wrecking Ball; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 10; Event Player.L < 2.25; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(D); Wait(0.250, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Wrecking Ball Roll") { event { Ongoing - Each Player; Team 2; Wrecking Ball; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 15; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; } actions { Event Player.a = Button(Ability 1); Call Subroutine(D); } } rule("AI Wrecking Ball Adaptive Shield") { event { Player Took Damage; Team 2; Wrecking Ball; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Health(Event Player) <= 150; Ability Cooldown(Event Player, Button(Ability 2)) == 0; } actions { Event Player.a = Button(Ability 2); Call Subroutine(D); } } rule("AI Wrecking Ball Piledriver") { event { Ongoing - Each Player; Team 2; Wrecking Ball; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 8; Ability Cooldown(Event Player, Button(Crouch)) == 0; } actions { Event Player.a = Button(Crouch); Call Subroutine(D); } } rule("AI Wrecking Ball Minefield") { event { Ongoing - Each Player; Team 2; Wrecking Ball; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Health(Players In Slot(Slot Of(Event Player), Team 1)) > 50; Is In Air(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 12.500; } actions { Event Player.a = Button(Ultimate); Call Subroutine(D); } } rule("AI Zarya") { event { Subroutine; E; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); If(Event Player.j != 0 || Event Player.d != 0); Call Subroutine(L); End; Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); If(Event Player.j != 2 || Event Player.d != 2); Event Player.j = 2; Event Player.d = 2; Event Player.G = Event Player.H[1]; Call Subroutine(M); End; Skip If(Is Button Held(Event Player, Button(Secondary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); Press Button(Event Player, Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Event Player.j = 2; Event Player.d = 2; Event Player.G = Event Player.H[4]; Call Subroutine(M); Call Subroutine(P); Press Button(Event Player, Button(Ultimate)); Wait(0.150, Ignore Condition); Call Subroutine(L); End; Event Player.A = False; } } rule("AI Zarya General") { event { Ongoing - Each Player; Team 2; Zarya; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(5, 10); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.k = 0; Event Player.H[1] = 25; Event Player.H[4] = 25; Call Subroutine(L); Event Player.z = True; } } rule("AI Zarya Attack Primary") { event { Ongoing - Each Player; Team 2; Zarya; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 15; Event Player.L < 2.5; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(E); Wait(0.250, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Zarya Attack Secondary") { event { Ongoing - Each Player; Team 2; Zarya; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 15; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 50; Event Player.L < 3.25; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(E); Wait(1, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Secondary Fire)); } } rule("AI Zarya Use Bubble") { event { Ongoing - Each Player; Team 2; Zarya; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is In View Angle(Players In Slot(Slot Of(Event Player), Team 1), Eye Position(Event Player) - Vector(0, 0.250 + Y Component Of( Eye Position(Players In Slot(Slot Of(Event Player), Team 1))), 0), 12) == True; Ability Cooldown(Event Player, Button(Ability 1)) == 0; Is Using Ability 1(Event Player) == False; } actions { If(Random Real(0, 1) < 0.300 + Event Player.p); Event Player.a = Button(Ability 1); Call Subroutine(E); End; } } rule("AI Zarya Graviton Surge") { event { Ongoing - Each Player; Team 2; Zarya; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 15; Event Player.L < 2.5; Health(Players In Slot(Slot Of(Event Player), Team 1)) >= 100; } actions { Event Player.a = Button(Ultimate); Call Subroutine(E); } } rule("AI Zenyatta") { event { Subroutine; F; } actions { Event Player.A = True; Call Subroutine(P); If(Event Player.a == Button(Primary Fire)); Skip If(Is Button Held(Event Player, Button(Primary Fire)), 2); Call Subroutine(I); Start Holding Button(Event Player, Button(Primary Fire)); Else If(Event Player.a == Button(Secondary Fire)); Call Subroutine(I); Start Holding Button(Event Player, Button(Secondary Fire)); Wait(Random Integer(3, 5) * 0.520, Ignore Condition); Stop Holding Button(Event Player, Button(Secondary Fire)); Else If(Event Player.a == Button(Ability 1)); Else If(Event Player.a == Button(Ability 2)); Press Button(Event Player, Button(Ability 2)); Else If(Event Player.a == Button(Ultimate)); Press Button(Event Player, Button(Ultimate)); End; Event Player.A = False; } } rule("AI Zenyatta General") { event { Ongoing - Each Player; Team 2; Zenyatta; } conditions { Is Game In Progress == True; Is Alive(Event Player) == True; Event Player.c == True; } actions { Event Player.F = Random Real(12, 16); Event Player.E = Event Player.F; Event Player.e = 0; Event Player.d = Event Player.e; Event Player.j = 1; Event Player.G = 90; Event Player.z = True; } } rule("AI Zenyatta Attack Primary") { event { Ongoing - Each Player; Team 2; Zenyatta; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is Using Ultimate(Event Player) == False; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 35; Event Player.L < 3; } actions { Event Player.a = Button(Primary Fire); Call Subroutine(F); Wait(0.400, Ignore Condition); Loop If Condition Is True; Stop Holding Button(Event Player, Button(Primary Fire)); } } rule("AI Zenyatta Attack Secondary") { event { Ongoing - Each Player; Team 2; Zenyatta; } conditions { Event Player.c == True; Event Player.n == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Is Using Ultimate(Event Player) == False; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) >= 10; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 12; Event Player.L < 2.5; Is Firing Primary(Event Player) == False; } actions { Event Player.a = Button(Secondary Fire); Call Subroutine(F); Loop If Condition Is True; } } rule("AI Zenyatta Orb of Discord") { event { Ongoing - Each Player; Team 2; Zenyatta; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Event Player.L < 1.25; Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) <= 75; Is Using Ability 2(Event Player) == False; Is Using Ultimate(Event Player) == False; } actions { Event Player.a = Button(Ability 2); Call Subroutine(F); } } rule("AI Zenyatta Transcendence") { event { Player Took Damage; Team 2; Zenyatta; } conditions { Event Player.c == True; Event Player.o == True; Event Player.A == False; Is Alive(Event Player) == True; Is Alive(Players In Slot(Slot Of(Event Player), Team 1)) == True; Ultimate Charge Percent(Event Player) == 100; Is Using Ultimate(Event Player) == False; Health(Event Player) < 50; } actions { Event Player.a = Button(Ultimate); Call Subroutine(F); } }
\ No newline at end of file
diff --git a/src/ai.ow b/src/ai.ow
index f41a6e5..e156f67 100644
--- a/src/ai.ow
+++ b/src/ai.ow
@@ -1,3 +1,7 @@
+// ai.ow
+// Primary event rules for hero AI
+
+// Heal AI and call subroutine to enable AI
rule("AI Enable")
{
event
@@ -23,6 +27,7 @@ rule("AI Enable")
}
}
+// Start AI aim calculation loop
rule("AI Aim Calculation Loop")
{
event
@@ -52,12 +57,18 @@ rule("AI Aim Calculation Loop")
actions
{
- // Distance between the ray cast of the bot's facing direction and the position of the Player
- Event Player.ai_RetCastDistance = Distance Between(
- Ray Cast Hit Position(
+ // Distance between the ray cast of the bot's facing direction and the
+ // position of the Player
+ Event Player.ai_RetCastDistance = Distance Between
+ (
+ Ray Cast Hit Position
+ (
Eye Position(Event Player),
Eye Position(Event Player) + Facing Direction Of(Event Player)
- * Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)),
+ * Distance Between
+ (
+ Event Player, Players In Slot(Slot Of(Event Player), Team 1)
+ ),
All Players(Team 1),
Event Player,
True
@@ -69,6 +80,7 @@ rule("AI Aim Calculation Loop")
}
}
+// Stop AI aiming
rule("AI Aim Stop")
{
event
@@ -96,6 +108,7 @@ rule("AI Aim Stop")
}
}
+// Flick aim when Player is far away from the Bot's reticle
rule("AI Aim Flick")
{
event
@@ -112,7 +125,8 @@ rule("AI Aim Flick")
Event Player.ai_AIEnabled == True;
Event Player.ai_CnAim == True;
Players In Slot(Slot Of(Event Player), Team 1).p_Difficulty >= 3;
- Event Player.ai_RetCastDistance > 3 - Players In Slot(Slot Of(Event Player), Team 1).p_Difficulty * 0.250;
+ Event Player.ai_RetCastDistance > 3
+ - Players In Slot(Slot Of(Event Player), Team 1).p_Difficulty * 0.250;
}
actions
@@ -125,6 +139,7 @@ rule("AI Aim Flick")
}
}
+// Bot melee Player when health is low
rule("AI Attack Melee")
{
event
@@ -139,7 +154,8 @@ rule("AI Attack Melee")
Event Player.ai_AIEnabled == True;
Event Player.ai_CnAttack == True;
Is Alive(Event Player) == True;
- Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 2.500;
+ Distance Between
+ (Event Player, Players In Slot(Slot Of(Event Player), Team 1)) < 2.500;
Event Player.ai_RetCastDistance <= 2;
Health(Players In Slot(Slot Of(Event Player), Team 1)) <= 30;
Health(Players In Slot(Slot Of(Event Player), Team 1)) > 0;
@@ -152,6 +168,7 @@ rule("AI Attack Melee")
}
}
+// Start Bot facing Player
rule("AI Aim Start")
{
event
@@ -175,6 +192,7 @@ rule("AI Aim Start")
}
}
+// Whether or not the Bot is able to and allowed to aim
rule("AI Rule Can Aim")
{
event
@@ -201,6 +219,7 @@ rule("AI Rule Can Aim")
}
}
+// Whether or not the Bot is able to and allowed to attack
rule("AI Rule Can Attack")
{
event
@@ -227,6 +246,7 @@ rule("AI Rule Can Attack")
}
}
+// Whether or not the Bot is able to and allowed to use abilities
rule("AI Rule Can Use Abilities")
{
event
@@ -254,6 +274,7 @@ rule("AI Rule Can Use Abilities")
}
}
+// If hacked, the Bot cannot use abilities
rule("AI Rule Status Hacked")
{
event
@@ -276,6 +297,7 @@ rule("AI Rule Status Hacked")
}
}
+// If knocked down, the Bot cannot aim, attack, or use abilities
rule("AI Rule Status Knocked Down")
{
event
@@ -301,6 +323,7 @@ rule("AI Rule Status Knocked Down")
}
}
+// If asleep, the Bot cannot aim, attack, or use abilities
rule("AI Rule Status Asleep")
{
event
@@ -326,6 +349,7 @@ rule("AI Rule Status Asleep")
}
}
+// If frozen, the Bot cannot aim, attack, or use abilities
rule("AI Rule Status Frozen")
{
event
@@ -351,6 +375,7 @@ rule("AI Rule Status Frozen")
}
}
+// If phased out, the Bot cannot attack or use abilities
rule("AI Rule Status Phased Out")
{
event
@@ -374,6 +399,7 @@ rule("AI Rule Status Phased Out")
}
}
+// If stunned, the Bot cannot aim, attack, or use abilities
rule("AI Rule Status Stunned")
{
event
@@ -399,6 +425,7 @@ rule("AI Rule Status Stunned")
}
}
+// Bot briefly strafe in a random direction upon taking damage
rule("AI Movement WASD Strafe On Dmg")
{
event
@@ -414,7 +441,8 @@ rule("AI Movement WASD Strafe On Dmg")
Event Player.bot_MoveWASDEnabled == True;
Event Player.ai_HeroInitialized == True;
Is Alive(Event Player) == True;
- Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1))
+ Distance Between
+ (Event Player, Players In Slot(Slot Of(Event Player), Team 1))
> Event Player.ai_OptimalDistance + Event Player.ai_StrafeDistanceMod;
Event Damage > 25;
}
@@ -423,12 +451,14 @@ rule("AI Movement WASD Strafe On Dmg")
{
If(Random Real(0, 1) < 0.100 + Event Player.ai_ChanceMod);
Call Subroutine(aiSub_ReactionDelay);
- Event Player.bot_ThrottleDir = Random Value In Array(Global.c_MoveDir_Strafe);
+ Event Player.bot_ThrottleDir
+ = Random Value In Array(Global.c_MoveDir_Strafe);
Start Rule(botSub_MoveWASD, Restart Rule);
End;
}
}
+// Bot move closer if further than `ai_OptimalDistance`
rule("AI Movement WASD Move Closer")
{
event
@@ -444,24 +474,52 @@ rule("AI Movement WASD Move Closer")
Event Player.bot_MoveWASDEnabled == True;
Event Player.ai_HeroInitialized == True;
Is Alive(Event Player) == True;
- Distance Between(Event Player, Vector(X Component Of(Position Of(Players In Slot(Slot Of(Event Player), Team 1))), 0,
- Z Component Of(Position Of(Players In Slot(Slot Of(Event Player), Team 1))))) >= Event Player.ai_OptimalDistance;
+ Distance Between
+ (
+ Event Player,
+ Vector
+ (
+ X Component Of
+ (Position Of(Players In Slot(Slot Of(Event Player), Team 1))),
+ 0,
+ Z Component Of
+ (Position Of(Players In Slot(Slot Of(Event Player), Team 1)))
+ )
+ )
+ >= Event Player.ai_OptimalDistance;
}
actions
{
- If(Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1))
- > Event Player.ai_OptimalDistance + Event Player.ai_StrafeDistanceMod);
- Event Player.bot_ThrottleDir = Random Value In Array(Remove From Array(Global.c_MoveDir_Forward, Array(Left, Right,
- Event Player.bot_ThrottleDir)));
+ If
+ (
+ Distance Between
+ (Event Player, Players In Slot(Slot Of(Event Player), Team 1))
+ > Event Player.ai_OptimalDistance + Event Player.ai_StrafeDistanceMod
+ );
+ Event Player.bot_ThrottleDir
+ = Random Value In Array
+ (
+ Remove From Array
+ (
+ Global.c_MoveDir_Forward,
+ Array(Left, Right, Event Player.bot_ThrottleDir)
+ )
+ );
Else;
- Event Player.bot_ThrottleDir = Random Value In Array(Remove From Array(Global.c_MoveDir_Forward, Event Player.bot_ThrottleDir));
+ Event Player.bot_ThrottleDir
+ = Random Value In Array
+ (
+ Remove From Array
+ (Global.c_MoveDir_Forward, Event Player.bot_ThrottleDir)
+ );
End;
Call Subroutine(botSub_MoveWASD);
Loop If Condition Is True;
}
}
+// Bot move further if closer than `ai_OptimalDistance`
rule("AI Movement WASD Move Farther")
{
event
@@ -477,18 +535,35 @@ rule("AI Movement WASD Move Farther")
Event Player.bot_MoveWASDEnabled == True;
Event Player.ai_HeroInitialized == True;
Is Alive(Event Player) == True;
- Distance Between(Event Player, Vector(X Component Of(Position Of(Players In Slot(Slot Of(Event Player), Team 1))), 0,
- Z Component Of(Position Of(Players In Slot(Slot Of(Event Player), Team 1))))) < Event Player.ai_OptimalDistance;
+ Distance Between
+ (
+ Event Player,
+ Vector
+ (
+ X Component Of
+ (Position Of(Players In Slot(Slot Of(Event Player), Team 1))),
+ 0,
+ Z Component Of
+ (Position Of(Players In Slot(Slot Of(Event Player), Team 1)))
+ )
+ )
+ < Event Player.ai_OptimalDistance;
}
actions
{
- Event Player.bot_ThrottleDir = Random Value In Array(Remove From Array(Global.c_MoveDir_Backward, Event Player.bot_ThrottleDir));
+ Event Player.bot_ThrottleDir
+ = Random Value In Array
+ (
+ Remove From Array
+ (Global.c_MoveDir_Backward, Event Player.bot_ThrottleDir)
+ );
Call Subroutine(botSub_MoveWASD);
Loop If Condition Is True;
}
}
+// i don't actually know what this does
rule("AI Optimal Distance Default Resize")
{
event
@@ -502,8 +577,15 @@ rule("AI Optimal Distance Default Resize")
{
Event Player.ai_AIEnabled == True;
Is Alive(Event Player) == True;
- Distance Between(Event Player, Players In Slot(Slot Of(Event Player), Team 1).p_HomeVector) >= Players In Slot(Slot Of(
- Event Player), Team 1).p_EnemyDistanceMax - 2.500;
+
+ Distance Between
+ (
+ Event Player,
+ Players In Slot(Slot Of(Event Player), Team 1).p_HomeVector
+ )
+ >=
+ Players In Slot(Slot Of(Event Player), Team 1).p_EnemyDistanceMax
+ - 2.500;
}
actions
@@ -515,6 +597,7 @@ rule("AI Optimal Distance Default Resize")
}
}
+// Bot crouch
rule("AI Movement Crouch")
{
event
@@ -541,6 +624,7 @@ rule("AI Movement Crouch")
}
}
+// Bot jump
rule("AI Movement Jump")
{
event
@@ -566,6 +650,7 @@ rule("AI Movement Jump")
}
}
+// Enable AI if Player just turned on Quick Mode
rule("Quick Mode AI Enable")
{
event
diff --git a/src/ai.owh b/src/ai.owh
index 74e4080..1598789 100644
--- a/src/ai.owh
+++ b/src/ai.owh
@@ -11,7 +11,8 @@ rule("aiSub_EnableAI")
Call Subroutine(allSub_WaitForFrame);
Clear Status(Players In Slot(Slot Of(Event Player), Team 2), Unkillable);
Players In Slot(Slot Of(Event Player), Team 2).bot_MoveWASDEnabled = True;
- Players In Slot(Slot Of(Event Player), Team 2).bot_MoveCrouchEnabled = True;
+ Players In Slot(
+ Slot Of(Event Player), Team 2).bot_MoveCrouchEnabled = True;
Players In Slot(Slot Of(Event Player), Team 2).bot_MoveJumpEnabled = True;
Players In Slot(Slot Of(Event Player), Team 2).ai_AIEnabled = True;
Call Subroutine(aiSub_FacingReset);
@@ -28,8 +29,12 @@ rule("aiSub_ReactionDelay")
actions
{
- Wait(Random Real(Players In Slot(Slot Of(Event Player), Team 2).ai_ReactionTime / 4, Players In Slot(Slot Of(Event Player), Team 2)
- .ai_ReactionTime), Ignore Condition);
+ Wait(
+ Random Real(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_ReactionTime / 4,
+ Players In Slot(Slot Of(Event Player), Team 2).ai_ReactionTime),
+ Ignore Condition
+ );
}
}
@@ -43,15 +48,24 @@ rule("aiSub_ButtonsReset")
actions
{
- Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Primary Fire));
- Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Secondary Fire));
- Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Ability 1));
- Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Ability 2));
- Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Ultimate));
- Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Jump));
- Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Crouch));
- Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Melee));
- Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2), Button(Reload));
+ Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2),
+ Button(Primary Fire));
+ Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2),
+ Button(Secondary Fire));
+ Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2),
+ Button(Ability 1));
+ Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2),
+ Button(Ability 2));
+ Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2),
+ Button(Ultimate));
+ Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2),
+ Button(Jump));
+ Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2),
+ Button(Crouch));
+ Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2),
+ Button(Melee));
+ Stop Holding Button(Players In Slot(Slot Of(Event Player), Team 2),
+ Button(Reload));
Wait(1 / 60, Ignore Condition);
}
}
@@ -87,13 +101,18 @@ rule("aiSub_FacingStart")
Direction From Angles(
Horizontal Angle Towards(
Players In Slot(Slot Of(Event Player), Team 2),
- Eye Position(Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0)
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1))
+ - Vector(0, 0.250, 0)
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModX,
Vertical Angle From Direction(
Direction Towards(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Eye Position(Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0)
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1))
+ - Vector(0, 0.250, 0)
)
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModY
@@ -104,20 +123,25 @@ rule("aiSub_FacingStart")
);
// Head
- Else If(Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 1);
- Start Facing(
+ Else If(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 1);
+
+ Start Facing(
Players In Slot(Slot Of(Event Player), Team 2),
Direction From Angles(
Horizontal Angle Towards(
Players In Slot(Slot Of(Event Player), Team 2),
- Eye Position(Players In Slot(Slot Of(Event Player), Team 1))
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModX,
Vertical Angle From Direction(
Direction Towards(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Eye Position(Players In Slot(Slot Of(Event Player), Team 1))
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModY
@@ -128,7 +152,8 @@ rule("aiSub_FacingStart")
);
// Position
- Else If(Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 2);
+ Else If(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 2);
Start Facing(
Players In Slot(Slot Of(Event Player), Team 2),
Direction From Angles(
@@ -140,8 +165,10 @@ rule("aiSub_FacingStart")
Vertical Angle From Direction(
Direction Towards(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModY
@@ -152,22 +179,28 @@ rule("aiSub_FacingStart")
);
// Relative
- Else If(Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 3);
+ Else If(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 3);
+
Start Facing(
Players In Slot(Slot Of(Event Player), Team 2),
Direction From Angles(
Horizontal Angle Towards(
Players In Slot(Slot Of(Event Player), Team 2),
Position Of(Players In Slot(Slot Of(Event Player), Team 1))
- + Players In Slot(Slot Of(Event Player), Team 2).ai_FacingRelPosMod
+ + Players In Slot(
+ Slot Of(Event Player), Team 2).ai_FacingRelPosMod
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModX,
Vertical Angle From Direction(
Direction Towards(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
- + Players In Slot(Slot Of(Event Player), Team 2).ai_FacingRelPosMod
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
+ + Players In Slot(
+ Slot Of(Event Player), Team 2).ai_FacingRelPosMod
)
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModY
@@ -182,10 +215,12 @@ rule("aiSub_FacingStart")
// Projectile
//
// Uses the horizontal angle towards the vector resulting from:
- // ((world vector of (speed * direction)) * (distance / projectile velocity)) + position of player
- // Basically taking the vector of "where the player will be in one second given current speed" and
- // scaling it based on distance from bot and projectile speed,
- // then adding the position of the player to offset it from (0, 0, 0)
+ // ((world vector of (speed * direction))
+ // * (distance / projectile velocity)) + position of player
+ // Basically taking the vector of "where the player will be in one
+ // second given current speed" and scaling it based on distance
+ // from bot and projectile speed, then adding the position of the
+ // player to offset it from (0, 0, 0)
//
Else If(Players In Slot(Slot Of(Event Player), Team 2).ai_AimType == 1);
@@ -198,25 +233,33 @@ rule("aiSub_FacingStart")
Players In Slot(Slot Of(Event Player), Team 2),
World Vector Of(
Speed Of(Players In Slot(Slot Of(Event Player), Team 1))
- * Throttle Of(Players In Slot(Slot Of(Event Player), Team 1)),
+ * Throttle Of(
+ Players In Slot(Slot Of(Event Player), Team 1)),
Players In Slot(Slot Of(Event Player), Team 1),
Rotation
)
* (
Distance Between(
- Position Of(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
- / Players In Slot(Slot Of(Event Player), Team 2).ai_ProjectileSpeed
+ / Players In Slot(
+ Slot Of(Event Player), Team 2).ai_ProjectileSpeed
)
- + Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ + Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModX,
Vertical Angle From Direction(
Direction Towards(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Eye Position(Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0)
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1))
+ - Vector(0, 0.250, 0)
)
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModY
@@ -227,7 +270,9 @@ rule("aiSub_FacingStart")
);
// Head
- Else If(Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 1);
+ Else If(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 1);
+
Start Facing(
Players In Slot(Slot Of(Event Player), Team 2),
Direction From Angles(
@@ -235,25 +280,32 @@ rule("aiSub_FacingStart")
Players In Slot(Slot Of(Event Player), Team 2),
World Vector Of(
Speed Of(Players In Slot(Slot Of(Event Player), Team 1))
- * Throttle Of(Players In Slot(Slot Of(Event Player), Team 1)),
+ * Throttle Of(
+ Players In Slot(Slot Of(Event Player), Team 1)),
Players In Slot(Slot Of(Event Player), Team 1),
Rotation
)
* (
Distance Between(
- Position Of(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
- / Players In Slot(Slot Of(Event Player), Team 2).ai_ProjectileSpeed
+ / Players In Slot(
+ Slot Of(Event Player), Team 2).ai_ProjectileSpeed
)
- + Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ + Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModX,
Vertical Angle From Direction(
Direction Towards(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Eye Position(Players In Slot(Slot Of(Event Player), Team 1))
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModY
@@ -264,7 +316,9 @@ rule("aiSub_FacingStart")
);
// Position
- Else If(Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 2);
+ Else If(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 2);
+
Start Facing(
Players In Slot(Slot Of(Event Player), Team 2),
Direction From Angles(
@@ -272,25 +326,32 @@ rule("aiSub_FacingStart")
Players In Slot(Slot Of(Event Player), Team 2),
World Vector Of(
Speed Of(Players In Slot(Slot Of(Event Player), Team 1))
- * Throttle Of(Players In Slot(Slot Of(Event Player), Team 1)),
+ * Throttle Of(
+ Players In Slot(Slot Of(Event Player), Team 1)),
Players In Slot(Slot Of(Event Player), Team 1),
Rotation
)
* (
Distance Between(
- Position Of(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
- / Players In Slot(Slot Of(Event Player), Team 2).ai_ProjectileSpeed
+ / Players In Slot(
+ Slot Of(Event Player), Team 2).ai_ProjectileSpeed
)
- + Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ + Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModX,
Vertical Angle From Direction(
Direction Towards(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModY
@@ -301,7 +362,9 @@ rule("aiSub_FacingStart")
);
// Relative
- Else If(Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 3);
+ Else If(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 3);
+
Start Facing(
Players In Slot(Slot Of(Event Player), Team 2),
Direction From Angles(
@@ -309,27 +372,36 @@ rule("aiSub_FacingStart")
Players In Slot(Slot Of(Event Player), Team 2),
World Vector Of(
Speed Of(Players In Slot(Slot Of(Event Player), Team 1))
- * Throttle Of(Players In Slot(Slot Of(Event Player), Team 1)),
+ * Throttle Of(
+ Players In Slot(Slot Of(Event Player), Team 1)),
Players In Slot(Slot Of(Event Player), Team 1),
Rotation
)
* (
Distance Between(
- Position Of(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
- / Players In Slot(Slot Of(Event Player), Team 2).ai_ProjectileSpeed
+ / Players In Slot(
+ Slot Of(Event Player), Team 2).ai_ProjectileSpeed
)
- + Position Of(Players In Slot(Slot Of(Event Player), Team 1))
- + Players In Slot(Slot Of(Event Player), Team 2).ai_FacingRelPosMod
+ + Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
+ + Players In Slot(
+ Slot Of(Event Player), Team 2).ai_FacingRelPosMod
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModX,
Vertical Angle From Direction(
Direction Towards(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
- + Players In Slot(Slot Of(Event Player), Team 2).ai_FacingRelPosMod
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
+ + Players In Slot(
+ Slot Of(Event Player), Team 2).ai_FacingRelPosMod
)
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModY
@@ -354,36 +426,48 @@ rule("aiSub_FacingStart")
Players In Slot(Slot Of(Event Player), Team 2),
World Vector Of(
Speed Of(Players In Slot(Slot Of(Event Player), Team 1))
- * Throttle Of(Players In Slot(Slot Of(Event Player), Team 1)),
+ * Throttle Of(
+ Players In Slot(Slot Of(Event Player), Team 1)),
Players In Slot(Slot Of(Event Player), Team 1),
Rotation
)
* (
Distance Between(
- Position Of(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
- / Players In Slot(Slot Of(Event Player), Team 2).ai_ProjectileSpeed
+ / Players In Slot(
+ Slot Of(Event Player), Team 2).ai_ProjectileSpeed
)
- + Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ + Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModX,
Vertical Angle From Direction(
Direction Towards(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Eye Position(Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0)
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1))
+ - Vector(0, 0.250, 0)
)
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModY
+ Arcsine In Degrees(
-15.800 * (
Distance Between(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Eye Position(Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0)
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1))
+ - Vector(0, 0.250, 0)
)
)
- / Players In Slot(Slot Of(Event Player), Team 2).ai_ProjectileSpeed ^ 2
+ / Players In Slot(
+ Slot Of(Event Player), Team 2).ai_ProjectileSpeed ^ 2
) / 2
),
Players In Slot(Slot Of(Event Player), Team 2).ai_AimTurnRate,
@@ -392,7 +476,9 @@ rule("aiSub_FacingStart")
);
// Head
- Else If(Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 1);
+ Else If(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 1);
+
Start Facing(
Players In Slot(Slot Of(Event Player), Team 2),
Direction From Angles(
@@ -400,36 +486,46 @@ rule("aiSub_FacingStart")
Players In Slot(Slot Of(Event Player), Team 2),
World Vector Of(
Speed Of(Players In Slot(Slot Of(Event Player), Team 1))
- * Throttle Of(Players In Slot(Slot Of(Event Player), Team 1)),
+ * Throttle Of(
+ Players In Slot(Slot Of(Event Player), Team 1)),
Players In Slot(Slot Of(Event Player), Team 1),
Rotation
)
* (
Distance Between(
- Position Of(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
- / Players In Slot(Slot Of(Event Player), Team 2).ai_ProjectileSpeed
+ / Players In Slot(
+ Slot Of(Event Player), Team 2).ai_ProjectileSpeed
)
- + Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ + Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModX,
Vertical Angle From Direction(
Direction Towards(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Eye Position(Players In Slot(Slot Of(Event Player), Team 1))
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModY
+ Arcsine In Degrees(
-15.800 * (
Distance Between(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Eye Position(Players In Slot(Slot Of(Event Player), Team 1))
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
)
- / Players In Slot(Slot Of(Event Player), Team 2).ai_ProjectileSpeed ^ 2
+ / Players In Slot(
+ Slot Of(Event Player), Team 2).ai_ProjectileSpeed ^ 2
) / 2
),
Players In Slot(Slot Of(Event Player), Team 2).ai_AimTurnRate,
@@ -438,7 +534,9 @@ rule("aiSub_FacingStart")
);
// Position
- Else If(Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 2);
+ Else If(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 2);
+
Start Facing(
Players In Slot(Slot Of(Event Player), Team 2),
Direction From Angles(
@@ -446,36 +544,46 @@ rule("aiSub_FacingStart")
Players In Slot(Slot Of(Event Player), Team 2),
World Vector Of(
Speed Of(Players In Slot(Slot Of(Event Player), Team 1))
- * Throttle Of(Players In Slot(Slot Of(Event Player), Team 1)),
+ * Throttle Of(
+ Players In Slot(Slot Of(Event Player), Team 1)),
Players In Slot(Slot Of(Event Player), Team 1),
Rotation
)
* (
Distance Between(
- Position Of(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
- / Players In Slot(Slot Of(Event Player), Team 2).ai_ProjectileSpeed
+ / Players In Slot(
+ Slot Of(Event Player), Team 2).ai_ProjectileSpeed
)
- + Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ + Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModX,
Vertical Angle From Direction(
Direction Towards(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModY
+ Arcsine In Degrees(
-15.800 * (
Distance Between(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
)
- / Players In Slot(Slot Of(Event Player), Team 2).ai_ProjectileSpeed ^ 2
+ / Players In Slot(
+ Slot Of(Event Player), Team 2).ai_ProjectileSpeed ^ 2
) / 2
),
Players In Slot(Slot Of(Event Player), Team 2).ai_AimTurnRate,
@@ -484,7 +592,9 @@ rule("aiSub_FacingStart")
);
// Relative
- Else If(Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 3);
+ Else If(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 3);
+
Start Facing(
Players In Slot(Slot Of(Event Player), Team 2),
Direction From Angles(
@@ -492,39 +602,52 @@ rule("aiSub_FacingStart")
Players In Slot(Slot Of(Event Player), Team 2),
World Vector Of(
Speed Of(Players In Slot(Slot Of(Event Player), Team 1))
- * Throttle Of(Players In Slot(Slot Of(Event Player), Team 1)),
+ * Throttle Of(
+ Players In Slot(Slot Of(Event Player), Team 1)),
Players In Slot(Slot Of(Event Player), Team 1),
Rotation
)
* (
Distance Between(
- Position Of(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
)
- / Players In Slot(Slot Of(Event Player), Team 2).ai_ProjectileSpeed
+ / Players In Slot(
+ Slot Of(Event Player), Team 2).ai_ProjectileSpeed
)
- + Position Of(Players In Slot(Slot Of(Event Player), Team 1))
- + Players In Slot(Slot Of(Event Player), Team 2).ai_FacingRelPosMod
+ + Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
+ + Players In Slot(
+ Slot Of(Event Player), Team 2).ai_FacingRelPosMod
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModX,
Vertical Angle From Direction(
Direction Towards(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
- + Players In Slot(Slot Of(Event Player), Team 2).ai_FacingRelPosMod
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
+ + Players In Slot(
+ Slot Of(Event Player), Team 2).ai_FacingRelPosMod
)
)
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimModY
+ Arcsine In Degrees(
-15.800 * (
Distance Between(
- Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
- Position Of(Players In Slot(Slot Of(Event Player), Team 1))
- + Players In Slot(Slot Of(Event Player), Team 2).ai_FacingRelPosMod
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2)),
+ Position Of(
+ Players In Slot(Slot Of(Event Player), Team 1))
+ + Players In Slot(
+ Slot Of(Event Player), Team 2).ai_FacingRelPosMod
)
)
- / Players In Slot(Slot Of(Event Player), Team 2).ai_ProjectileSpeed ^ 2
+ / Players In Slot(
+ Slot Of(Event Player), Team 2).ai_ProjectileSpeed ^ 2
) / 2
),
Players In Slot(Slot Of(Event Player), Team 2).ai_AimTurnRate,
@@ -548,15 +671,35 @@ rule("aiSub_FacingLookAt")
{
Players In Slot(Slot Of(Event Player), Team 2).ai_CnAim = False;
Wait(2 / 60, Ignore Condition);
- Players In Slot(Slot Of(Event Player), Team 2).ai_AimTurnRate = Random Real(Players In Slot(Slot Of(Event Player), Team 2)
- .ai_FacingCapMin, Players In Slot(Slot Of(Event Player), Team 2).ai_FacingCapMin * 1.500);
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimTurnRate
+ = Random Real(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_FacingCapMin,
+ Players In Slot(
+ Slot Of(Event Player), Team 2).ai_FacingCapMin * 1.500
+ );
Stop Facing(Players In Slot(Slot Of(Event Player), Team 2));
- Start Facing(Players In Slot(Slot Of(Event Player), Team 2), Direction Towards(Eye Position(Players In Slot(Slot Of(Event Player),
- Team 2)), Players In Slot(Slot Of(Event Player), Team 2).ai_LookAtVector), Evaluate Once(Random Real(Players In Slot(Slot Of(
- Event Player), Team 2).ai_FacingCapMin, Players In Slot(Slot Of(Event Player), Team 2).ai_FacingCapMax)), To World,
+ Start Facing(Players In Slot(Slot Of(Event Player), Team 2),
+ Direction Towards(
+ Eye Position(Players In Slot(Slot Of(Event Player), Team 2)),
+ Players In Slot(Slot Of(Event Player), Team 2).ai_LookAtVector),
+ Evaluate Once(
+ Random Real(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_FacingCapMin,
+ Players In Slot(Slot Of(Event Player), Team 2).ai_FacingCapMax)),
+ To World,
Direction and Turn Rate);
- Wait Until(Is In View Angle(Players In Slot(Slot Of(Event Player), Team 2), Players In Slot(Slot Of(Event Player), Team 2)
- .ai_LookAtVector - Vector(0, Y Component Of(Eye Position(Players In Slot(Slot Of(Event Player), Team 2))), 0), 12.500), 2);
+ Wait Until(
+ Is In View Angle(
+ Players In Slot(Slot Of(Event Player), Team 2),
+ Players In Slot(Slot Of(Event Player), Team 2).ai_LookAtVector
+ - Vector(
+ 0,
+ Y Component Of(
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2))),
+ 0),
+ 12.500),
+ 2);
Stop Facing(Players In Slot(Slot Of(Event Player), Team 2));
}
}
@@ -571,8 +714,10 @@ rule("aiSub_FacingReset")
actions
{
- Players In Slot(Slot Of(Event Player), Team 2).ai_AimType = Players In Slot(Slot Of(Event Player), Team 2).ai_AimTypeDefault;
- Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase = Players In Slot(Slot Of(Event Player), Team 2).ai_AimBaseDefault;
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimType
+ = Players In Slot(Slot Of(Event Player), Team 2).ai_AimTypeDefault;
+ Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase
+ = Players In Slot(Slot Of(Event Player), Team 2).ai_AimBaseDefault;
Call Subroutine(aiSub_FacingStart);
}
}
@@ -590,14 +735,22 @@ rule("AI Aim Mod Calculation")
Stop Chasing Player Variable(Event Player, ai_AimModX);
Stop Chasing Player Variable(Event Player, ai_AimModY);
- If(Array Contains(Global.c_ScopeHeroes, Hero Of(Event Player)) && Is Firing Secondary(Event Player));
- If(Horizontal Angle Towards(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 0);
+ If(Array Contains(Global.c_ScopeHeroes, Hero Of(Event Player))
+ && Is Firing Secondary(Event Player));
+
+ If(
+ Horizontal Angle Towards(
+ Event Player,
+ Players In Slot(Slot Of(Event Player), Team 1)
+ ) > 0);
+
Chase Player Variable Over Time(
Event Player,
ai_AimModX,
Random Real(0,
- (Global.c_MaxDifficulty - Players In Slot(Slot Of(Event Player), Team 1).p_Difficulty) * 0.250 + 0.250
- ),
+ (Global.c_MaxDifficulty - Players In Slot(
+ Slot Of(Event Player), Team 1).p_Difficulty) * 0.250
+ + 0.250),
Random Real(0.100, 0.250),
None
);
@@ -606,26 +759,34 @@ rule("AI Aim Mod Calculation")
Event Player,
ai_AimModX,
Random Real(
- (Global.c_MaxDifficulty - Players In Slot(Slot Of(Event Player), Team 1).p_Difficulty) * -0.250 - 0.250,
- 0
- ),
+ (Global.c_MaxDifficulty - Players In Slot(
+ Slot Of(Event Player), Team 1).p_Difficulty) * -0.250
+ - 0.250,
+ 0),
Random Real(0.100, 0.250),
None
);
End;
Event Player.ai_AimModY = Random Real(
- (Global.c_MaxDifficulty - Players In Slot(Slot Of(Event Player), Team 1).p_Difficulty) * -0.250 - 0.250,
- (Global.c_MaxDifficulty - Players In Slot(Slot Of(Event Player), Team 1).p_Difficulty) * 0.250 + 0.250
+ (Global.c_MaxDifficulty - Players In Slot(
+ Slot Of(Event Player), Team 1).p_Difficulty) * -0.250 - 0.250,
+ (Global.c_MaxDifficulty - Players In Slot(
+ Slot Of(Event Player), Team 1).p_Difficulty) * 0.250 + 0.250
);
Else;
- If(Horizontal Angle Towards(Event Player, Players In Slot(Slot Of(Event Player), Team 1)) > 0);
+ If(
+ Horizontal Angle Towards(
+ Event Player,
+ Players In Slot(Slot Of(Event Player), Team 1)) > 0);
Chase Player Variable Over Time(
Event Player,
ai_AimModX,
Random Real(0,
- (Global.c_MaxDifficulty - Players In Slot(Slot Of(Event Player), Team 1).p_Difficulty) * 0.500 + 0.500
+ (Global.c_MaxDifficulty - Players In Slot(
+ Slot Of(Event Player), Team 1).p_Difficulty)
+ * 0.500 + 0.500
),
Random Real(0.100, 0.250),
None
@@ -635,7 +796,9 @@ rule("AI Aim Mod Calculation")
Event Player,
ai_AimModX,
Random Real(
- (Global.c_MaxDifficulty - Players In Slot(Slot Of(Event Player), Team 1).p_Difficulty) * -0.500 - 0.500,
+ (Global.c_MaxDifficulty - Players In Slot(
+ Slot Of(Event Player), Team 1).p_Difficulty)
+ * -0.500 - 0.500,
0
),
Random Real(0.100, 0.250),
@@ -644,8 +807,10 @@ rule("AI Aim Mod Calculation")
End;
Event Player.ai_AimModY = Random Real(
- (Global.c_MaxDifficulty - Players In Slot(Slot Of(Event Player), Team 1).p_Difficulty) * -0.350 - 0.350,
- (Global.c_MaxDifficulty - Players In Slot(Slot Of(Event Player), Team 1).p_Difficulty) * 0.350 + 0.350
+ (Global.c_MaxDifficulty - Players In Slot(
+ Slot Of(Event Player), Team 1).p_Difficulty) * -0.350 - 0.350,
+ (Global.c_MaxDifficulty - Players In Slot(
+ Slot Of(Event Player), Team 1).p_Difficulty) * 0.350 + 0.350
);
End;
}
@@ -669,14 +834,19 @@ rule("AI Aim Calculation")
Chase Player Variable Over Time(
Event Player,
ai_AimTurnRate,
- Random Real(Event Player.ai_FacingPadMin, Event Player.ai_FacingPadMax) / 1.5,
+ Random Real(Event Player.ai_FacingPadMin,
+ Event Player.ai_FacingPadMax) / 1.5,
Random Real(0.025, 0.200),
None
);
Wait(Random Real(0.025, 0.200), Ignore Condition);
Stop Chasing Player Variable(Event Player, ai_AimTurnRate);
- Else If(Event Player.ai_RetCastDistance < 10 && Random Real(0, 1) < 0.900 - Event Player.ai_ChanceMod);
+
+ Else If(Event Player.ai_RetCastDistance < 10 && Random Real(0, 1)
+ < 0.900 - Event Player.ai_ChanceMod);
+
Call Subroutine(aiSub_AimMouseStop);
+
Else;
Event Player.ai_AimTurnRate = (
Event Player.ai_FacingAngleMod
@@ -684,15 +854,20 @@ rule("AI Aim Calculation")
Facing Direction Of(Event Player),
Direction Towards(
Eye Position(Event Player),
- Eye Position(Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.300, 0)
+ Eye Position(Players In Slot(
+ Slot Of(Event Player), Team 1)) - Vector(0, 0.300, 0)
)
)
- ) ^ Event Player.ai_FacingAnglePow + Random Real(Event Player.ai_FacingPadMin, Event Player.ai_FacingPadMax);
+ ) ^ Event Player.ai_FacingAnglePow
+ + Random Real(Event Player.ai_FacingPadMin,
+ Event Player.ai_FacingPadMax);
// Start Rule(aiSub_AimModSet, Restart Rule);
End;
- If(Array Contains(Global.c_ScopeHeroes, Hero Of(Event Player)) && Is Firing Secondary(Event Player));
+ If(Array Contains(Global.c_ScopeHeroes, Hero Of(Event Player))
+ && Is Firing Secondary(Event Player));
+
Event Player.ai_AimTurnRate = Event Player.ai_AimTurnRate / 1.500;
End;
}
@@ -712,10 +887,13 @@ rule("AI Aim Mouse Stop")
Small Message(Event Player, Custom String("aim stop"));
End;
- Event Player.ai_AimStopTime = Total Time Elapsed + Random Real(0.450, 0.900) - Event Player.ai_ChanceMod;
+ Event Player.ai_AimStopTime
+ = Total Time Elapsed
+ + Random Real(0.450, 0.900) - Event Player.ai_ChanceMod;
Stop Chasing Player Variable(Event Player, ai_AimTurnRate);
- Chase Player Variable At Rate(Event Player, ai_AimTurnRate, 0, Random Integer(360, 720), None);
+ Chase Player Variable At Rate(Event Player, ai_AimTurnRate,
+ 0, Random Integer(360, 720), None);
Wait Until(Event Player.ai_AimTurnRate == 0, 0.9);
Stop Chasing Player Variable(Event Player, ai_AimTurnRate);
}
@@ -733,22 +911,68 @@ rule("aiSub_FlickIn")
{
Stop Facing(Players In Slot(Slot Of(Event Player), Team 2));
If(Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 0);
- Start Facing(Players In Slot(Slot Of(Event Player), Team 2), Direction Towards(Eye Position(Event Player), Eye Position(
- Players In Slot(Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0)), Evaluate Once(Random Integer(Players In Slot(Slot Of(
- Event Player), Team 2).ai_FacingCapMax - 180, Players In Slot(Slot Of(Event Player), Team 2).ai_FacingCapMax)), To World,
+ Start Facing(Players In Slot(Slot Of(Event Player), Team 2),
+ Direction Towards(
+ Eye Position(Event Player),
+ Eye Position(Players In Slot(Slot Of(Event Player), Team 1))
+ - Vector(0, 0.250, 0)),
+ Evaluate Once(
+ Random Integer(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_FacingCapMax
+ - 180,
+ Players In Slot(
+ Slot Of(Event Player), Team 2).ai_FacingCapMax)),
+ To World,
Direction and Turn Rate);
- Wait Until(Is In View Angle(Players In Slot(Slot Of(Event Player), Team 2), Vector(X Component Of(Eye Position(Players In Slot(
- Slot Of(Event Player), Team 1)) - Vector(0, 0.250, 0)), Y Component Of(Eye Position(Players In Slot(Slot Of(Event Player),
- Team 1)) - Vector(0, 0.250, 0)) - Y Component Of(Eye Position(Players In Slot(Slot Of(Event Player), Team 2)) - Vector(0,
- 0.250, 0)), Z Component Of(Eye Position(Players In Slot(Slot Of(Event Player), Team 1)))), 0.500), 1);
+ Wait Until(
+ Is In View Angle(
+ Players In Slot(Slot Of(Event Player), Team 2),
+ Vector(
+ X Component Of(
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1))
+ - Vector(0, 0.250, 0)),
+ Y Component Of(
+ Eye Position(Players In Slot(Slot Of(Event Player),Team 1))
+ - Vector(0, 0.250, 0))
+ - Y Component Of(
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2))
+ - Vector(0, 0.250, 0)),
+ Z Component Of(
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1)))),
+ 0.500),
+ 1);
Else If(Players In Slot(Slot Of(Event Player), Team 2).ai_AimBase == 1);
- Start Facing(Players In Slot(Slot Of(Event Player), Team 2), Direction Towards(Eye Position(Event Player), Eye Position(
- Players In Slot(Slot Of(Event Player), Team 1))), Evaluate Once(Random Integer(Players In Slot(Slot Of(Event Player), Team 2)
- .ai_FacingCapMax - 180, Players In Slot(Slot Of(Event Player), Team 2).ai_FacingCapMax)), To World, Direction and Turn Rate);
- Wait Until(Is In View Angle(Players In Slot(Slot Of(Event Player), Team 2), Vector(X Component Of(Eye Position(Players In Slot(
- Slot Of(Event Player), Team 1))), Y Component Of(Eye Position(Players In Slot(Slot Of(Event Player), Team 1)))
- - Y Component Of(Eye Position(Players In Slot(Slot Of(Event Player), Team 2))), Z Component Of(Eye Position(Players In Slot(
- Slot Of(Event Player), Team 1)))), 0.500), 1);
+ Start Facing(Players In Slot(Slot Of(Event Player), Team 2),
+ Direction Towards(Eye Position(Event Player),
+ Eye Position(Players In Slot(Slot Of(Event Player), Team 1))),
+ Evaluate Once(
+ Random Integer(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_FacingCapMax
+ - 180,
+ Players In Slot(
+ Slot Of(Event Player), Team 2).ai_FacingCapMax)),
+ To World,
+ Direction and Turn Rate);
+ Wait Until(
+ Is In View Angle(Players In Slot(Slot Of(Event Player), Team 2),
+ Vector(
+ X Component Of(
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1))),
+ Y Component Of(
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1)))
+ - Y Component Of(
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 2))),
+ Z Component Of(
+ Eye Position(
+ Players In Slot(Slot Of(Event Player), Team 1)))),
+ 0.500),
+ 1);
End;
}
}
@@ -764,10 +988,21 @@ rule("aiSub_FlickOut")
actions
{
Stop Facing(Players In Slot(Slot Of(Event Player), Team 2));
- Start Facing(Players In Slot(Slot Of(Event Player), Team 2), Direction From Angles(Horizontal Facing Angle Of(Players In Slot(
- Slot Of(Event Player), Team 2)) - Random Real(0.600, 1), Vertical Facing Angle Of(Players In Slot(Slot Of(Event Player),
- Team 2)) - Random Real(0.300, 0.700)), Evaluate Once(Random Integer(Players In Slot(Slot Of(Event Player), Team 2)
- .ai_FacingCapMax - 180, Players In Slot(Slot Of(Event Player), Team 2).ai_FacingCapMax)), To World, None);
+ Start Facing(Players In Slot(Slot Of(Event Player), Team 2),
+ Direction From Angles(
+ Horizontal Facing Angle Of(
+ Players In Slot(Slot Of(Event Player), Team 2))
+ - Random Real(0.600, 1),
+ Vertical Facing Angle Of(
+ Players In Slot(Slot Of(Event Player),Team 2))
+ - Random Real(0.300, 0.700)),
+ Evaluate Once(
+ Random Integer(
+ Players In Slot(Slot Of(Event Player), Team 2).ai_FacingCapMax
+ - 180,
+ Players In Slot(Slot Of(Event Player), Team 2).ai_FacingCapMax)),
+ To World,
+ None);
Wait(Random Real(0.100, 0.200), Ignore Condition);
Call Subroutine(aiSub_FacingReset);
}
diff --git a/src/defines.ow b/src/defines.ow
index 80043d3..fd7734a 100644
--- a/src/defines.ow
+++ b/src/defines.ow
@@ -13,13 +13,13 @@ rule("Global Defines")
//
// Info: version, build, links...
//
- Global.c_Version = Custom String("0.15.1");
- Global.c_BuildDate = Custom String("20220203");
- Global.c_WorkshopCode = Custom String("5DPKQ");
+ Global.c_Version = Custom String("1.0.0");
+ Global.c_BuildDate = Custom String(__BUILDDATE__);
+ Global.c_WorkshopCode = Custom String("BWGAP");
Global.c_DeveloperName = Custom String("Raven#112503");
Global.c_TwitchURL = Custom String("twitch.tv/RavenLuna");
Global.c_GithubURL = Custom String
- ("github.com/SnowLune/PracticeFieldExpanse");
+ ("github.com/SnowLune/RavensAIDome");
Global.c_DiscordLink = Custom String("TBA");
//
diff --git a/src/hud.ow b/src/hud.ow
index d18321c..f3c0b5e 100644
--- a/src/hud.ow
+++ b/src/hud.ow
@@ -18,7 +18,7 @@ rule("Global HUD")
Create HUD Text(All Players(All Teams), Null, Custom String(" "), Custom String(" "), Left, -20, Color(White), Color(White), Color(
White), Visible To, Default Visibility);
Create HUD Text(All Players(All Teams), Custom String("{0}", Global.c_WorkshopCode), Custom String("{0}+{1}, {2}", Global.c_Version,
- Global.c_BuildDate, Global.c_DeveloperName), Custom String("Practice Field: Expanse"), Left, -3, Global.c_Color_LightPink,
+ Global.c_BuildDate, Global.c_DeveloperName), Custom String("Raven's AI Dome"), Left, -3, Global.c_Color_LightPink,
Global.c_Color_LightGrey, Global.c_Color_LightTeal, Visible To, Default Visibility);
// Create Left Side HUD Text EN
@@ -52,7 +52,7 @@ rule("Global HUD")
Global.c_Color_DarkPink, Visible To and String, Default Visibility);
// Create Info HUD EN
- Create HUD Text(Global.hud_InfoVisibleToEN, Custom String("Welcome to Practice Field: Expanse!"), Global.c_TwitchURL, Custom String(
+ Create HUD Text(Global.hud_InfoVisibleToEN, Custom String("Welcome to Raven's AI Dome!"), Global.c_TwitchURL, Custom String(
"Created by {0}", Global.c_DeveloperName), Top, 3, Global.c_Color_LightTeal, Global.c_Color_LightPink, Global.c_Color_LightPink,
Visible To and String, Default Visibility);
Create HUD Text(Global.hud_InfoVisibleToEN, Custom String(""), Custom String(
@@ -80,7 +80,7 @@ rule("Global HUD")
Global.c_Color_LightGrey, Color(Sky Blue), Visible To and String, Default Visibility);
// Create Info HUD KR
- Create HUD Text(Global.hud_InfoVisibleToKR, Custom String("Practice Field: Expanse ์ด์ ์ค์ญ์์ค!"), Global.c_TwitchURL, Custom String(
+ Create HUD Text(Global.hud_InfoVisibleToKR, Custom String("Raven's AI Dome ์ด์ ์ค์ญ์์ค!"), Global.c_TwitchURL, Custom String(
"์ฐฝ์กฐ์: {0}", Global.c_DeveloperName), Top, 3, Global.c_Color_LightTeal, Global.c_Color_LightPink, Global.c_Color_LightPink,
Visible To and String, Default Visibility);
Create HUD Text(Global.hud_InfoVisibleToKR, Custom String(""), Custom String("์ด ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฐ์ ํ๊ณ ์ฒ ์ ํ๊ฒ ์ฐ์ต ํ ์ ์์ต๋๋ค."), Custom String(
diff --git a/src/main.ow b/src/main.ow
index c601dda..7e43959 100644
--- a/src/main.ow
+++ b/src/main.ow
@@ -1,3 +1,8 @@
+// main.ow
+// The inital portion of the workshop mode containing global settings and
+// the main tick loop
+
+// Workshop Settings that can be modified in the game lobby
rule("Global Settings")
{
event
@@ -135,6 +140,7 @@ rule("Global Settings")
}
}
+// Main 60hz tick loop used by rules to spread computations over ticks
rule("Global Main Tick Loop")
{
event
diff --git a/src/main.owh b/src/main.owh
index 2cb70a5..b3ece74 100644
--- a/src/main.owh
+++ b/src/main.owh
@@ -2,8 +2,8 @@ settings
{
main
{
- Description: "Practice Field: Expanse is a tool for practicing against dummy bots with AI for all Heroes. (ํ๊ตญ์ด ์ต์ ํฌํจ!)\nโฅ This is a Pre-Release Beta Version!\nโฅ Import Code: 5DPKQ\nโฅ Created by Raven#112503\nโฅ If you modify this mode and share your modification, please prepend \"Modified by: [your battletag]\"to this description."
- Mode Name: "Practice Field: Expanse"
+ Description: "Raven's AI Dome is a tool for practicing against dummy bots with AI for all Heroes. (ํ๊ตญ์ด ์ต์ ํฌํจ!)\nโฅ This is a Pre-Release Beta Version!\nโฅ Import Code: BWGAP\nโฅ Created by Raven#112503\nโฅ If you modify this mode and share your modification, please prepend \"Modified by: [your battletag]\"to this description."
+ Mode Name: "Raven's AI Dome"
}
lobby
diff --git a/tools/overwatch_workshop_minifier.sh b/tools/overwatch_workshop_minifier.sh
index 01f9c91..d5bb686 100755
--- a/tools/overwatch_workshop_minifier.sh
+++ b/tools/overwatch_workshop_minifier.sh
@@ -1,6 +1,22 @@
#!/bin/bash
+# overwatch_workshop_minifier.sh
# Minify Overwatch Workshop scripts from stdin or file
+function rename_functions
+{
+ # New names for functions: a-z, A-Z, then all possible two letter combos
+ min_chars=(`echo {{a..z},{A..Z},{a..z}{a..z}}`)
+
+ # There aren't going to be more than 256 of any variable
+ for i in `seq 0 255`; do
+ # Iterate through functions with the current $i number
+ # then rename each to their respective minified names
+ for j in $(grep -e "^\s*$i:.*$" $1 | sed 's/^.*:\s*//g'); do
+ sed -i "s/$j/${min_chars[$i]}/g" $1
+ done
+ done
+}
+
function minify_pipe
{
sed 's/\/\/.*$//' `# Remove C++ style one line comments "//"` \
@@ -10,12 +26,41 @@ function minify_pipe
| sed 's/\/\*.*\*\///' `# Remove C style comments "/* */"`
}
-if [ $# -eq 0 ]; then
- # No arguments given. Using stdin...
- minify_pipe
-else
- basename=$(echo $1 | sed 's/\..*$//')
- cat "$1" | minify_pipe > "$basename.min.workshop"
+# Set our new name for the minified file
+basename=$(echo $1 | sed 's/\..*$//')
+new_file="$basename.min.ow.txt"
+echo "$new_file"
+
+# Check if it already exists and prompt for continue if it does
+if [ -f $new_file ]; then
+ echo
+ echo "WARNING: '$new_file' already exists"
+ while true; do
+ read -p "Would you like to overwrite it? (y/n): " yn
+ case $yn in
+ [Yy]* ) break;;
+ [Nn]* ) exit;;
+ * ) echo "Please answer yes or no.";;
+ esac
+ done
fi
+# Create a copy of the original file as our minified file
+cp "$1" "$new_file"
+
+# Do the minifying
+rename_functions "$new_file"
+cat "$new_file" | minify_pipe > "$new_file.tmp"
+mv "$new_file.tmp" "$new_file"
+
+# Get the file sizes
+old_file_size=$(du -b $1)
+new_file_size=$(du -b $new_file)
+
+# All done messages
+echo
+echo "Wrote minified Overwatch Workshop script file '$new_file'"
+echo "Old: $old_file_size"
+echo "New: $new_file_size"
+
exit
diff --git a/tools/trim_trailing_whitespace.sh b/tools/trim_trailing_whitespace.sh
new file mode 100755
index 0000000..08123b7
--- /dev/null
+++ b/tools/trim_trailing_whitespace.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+# trim_trailing_whitespace.sh
+# Find and trim trailing whitespace from project source
+find . -type f -iregex '\(.*.ow\|.*.owh\|.*Makefile\|.*.sh\)' \
+ -exec sed -i 's/\s\+$//g' '{}' \;
+
+exit