diff --git a/index.html b/index.html
index f2bf39d..46f9aba 100644
--- a/index.html
+++ b/index.html
@@ -57,6 +57,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Profectus
diff --git a/public/Mogul Money Coots.png b/public/Mogul Money Coots.png
index 8a9d71b..a72a5be 100644
Binary files a/public/Mogul Money Coots.png and b/public/Mogul Money Coots.png differ
diff --git a/public/SlimeCoots.png b/public/SlimeCoots.png
new file mode 100644
index 0000000..0c04ae6
Binary files /dev/null and b/public/SlimeCoots.png differ
diff --git a/public/aimen coots.png b/public/aimen coots.png
new file mode 100644
index 0000000..7995380
Binary files /dev/null and b/public/aimen coots.png differ
diff --git a/public/cdawg va.png b/public/cdawg va.png
new file mode 100644
index 0000000..19ade4b
Binary files /dev/null and b/public/cdawg va.png differ
diff --git a/public/chessboxing coots.png b/public/chessboxing coots.png
new file mode 100644
index 0000000..f000c0c
Binary files /dev/null and b/public/chessboxing coots.png differ
diff --git a/public/frog Coots.png b/public/frog Coots.png
new file mode 100644
index 0000000..b406168
Binary files /dev/null and b/public/frog Coots.png differ
diff --git a/public/hasan coots.png b/public/hasan coots.png
new file mode 100644
index 0000000..1903191
Binary files /dev/null and b/public/hasan coots.png differ
diff --git a/public/ironmouse coots.png b/public/ironmouse coots.png
new file mode 100644
index 0000000..63812f0
Binary files /dev/null and b/public/ironmouse coots.png differ
diff --git a/public/luddy Coots.png b/public/luddy Coots.png
new file mode 100644
index 0000000..90b5743
Binary files /dev/null and b/public/luddy Coots.png differ
diff --git a/public/mario coots.png b/public/mario coots.png
new file mode 100644
index 0000000..b5f33ee
Binary files /dev/null and b/public/mario coots.png differ
diff --git a/public/mr beast coots.png b/public/mr beast coots.png
new file mode 100644
index 0000000..00ce77a
Binary files /dev/null and b/public/mr beast coots.png differ
diff --git a/public/nick coots.png b/public/nick coots.png
new file mode 100644
index 0000000..5c60c48
Binary files /dev/null and b/public/nick coots.png differ
diff --git a/public/smash coots.png b/public/smash coots.png
new file mode 100644
index 0000000..59739be
Binary files /dev/null and b/public/smash coots.png differ
diff --git a/public/streamer award coots.png b/public/streamer award coots.png
new file mode 100644
index 0000000..cd92a8b
Binary files /dev/null and b/public/streamer award coots.png differ
diff --git a/src/data/projEntry.tsx b/src/data/projEntry.tsx
index cf675e5..735828f 100644
--- a/src/data/projEntry.tsx
+++ b/src/data/projEntry.tsx
@@ -37,6 +37,19 @@ import tieButton from "../../public/Tie Button.png";
import vespa from "../../public/Vespa Coots.png";
import victoryButton from "../../public/Victory Button.png";
import victoryFace from "../../public/win face.png";
+import connor from "../../public/cdawg va.png";
+import chessboxing from "../../public/chessboxing coots.png";
+import frog from "../../public/frog Coots.png";
+import hasan from "../../public/hasan coots.png";
+import ironmouse from "../../public/ironmouse coots.png";
+import luddy from "../../public/luddy Coots.png";
+import mario from "../../public/mario coots.png";
+import beast from "../../public/mr beast coots.png";
+import nick from "../../public/nick coots.png";
+import slime from "../../public/SlimeCoots.png";
+import smash from "../../public/smash coots.png";
+import awards from "../../public/streamer award coots.png";
+import aimen from "../../public/aimen coots.png";
import CharacterSlot from "./CharacterSlot.vue";
import "./common.css";
import "./socket";
@@ -57,7 +70,8 @@ export const characters: Record = {
<>
Livestream joined: Deal {char.exp >= 6 ? 6 : char.exp >= 3 ? 4 : 2}{" "}
- Relevancy damage to every character on a stream
+ Relevancy damage to every Coots on either
+ livestream
>
)),
performAbility(char) {
@@ -80,7 +94,7 @@ export const characters: Record = {
<>
Livestream joined: Gain {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}{" "}
- Presence for every character on that livestream
+ Presence for every Coots on that livestream
>
)),
performAbility(char) {
@@ -117,6 +131,86 @@ export const characters: Record = {
main.gold.value += goldGain;
}
},
+ mario: {
+ nickname: "Mario Coots",
+ initialPresence: 1,
+ initialRelevancy: 1,
+ display: mario,
+ abilityType: "LivestreamJoined",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Livestream joined: Deal {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}{" "}
+
+ Presence damage to 2 Coots that most recently
+ joined the enemy livestream
+ >
+ )),
+ performAbility(char) {
+ if (main.battle.value == null) {
+ return;
+ }
+ const damage = char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1;
+ let opposingTeam: Character[];
+ if (main.battle.value.streamers.includes(char)) {
+ opposingTeam = main.battle.value.enemyStreamers;
+ } else {
+ opposingTeam = main.battle.value.streamers;
+ }
+ for (let i = 0; i < 2 && i < opposingTeam.length; i++) {
+ opposingTeam[i].presence -= damage;
+ }
+ }
+ },
+ aimen: {
+ nickname: "Aimen Coots",
+ initialPresence: 1,
+ initialRelevancy: 2,
+ display: aimen,
+ abilityType: "Sold",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Sold: Give {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}{" "}
+
+ Relevancy to leftmost Coots
+ >
+ )),
+ performAbility(char) {
+ const team = main.team.value.filter(m => m != null);
+ if (team.length === 0) {
+ return;
+ }
+ const relevancyGain = char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1;
+ team[team.length - 1]!.relevancy += relevancyGain;
+ }
+ },
+ nick: {
+ nickname: "Nick Coots",
+ initialPresence: 2,
+ initialRelevancy: 1,
+ display: nick,
+ abilityType: "LivestreamEnded",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Livestream ended: Each coots on this livestream gain{" "}
+ {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}
+ Presence
+ >
+ )),
+ performAbility(char) {
+ if (main.battle.value == null) {
+ return;
+ }
+ const gain = char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1;
+ if (main.battle.value.streamers.includes(char)) {
+ main.battle.value.streamers.forEach(s => (s.presence += gain));
+ } else {
+ main.battle.value.enemyStreamers.forEach(s => (s.presence += gain));
+ }
+ }
+ },
// Tier 2
maid: {
nickname: "Maid Coots",
@@ -127,7 +221,7 @@ export const characters: Record = {
abilityDescription: char =>
jsx(() => (
<>
- Level up: Every character gains {char.exp >= 3 ? 2 : 1}{" "}
+ Level up: Give every Coots {char.exp >= 3 ? 2 : 1}{" "}
Relevancy and
Presence
@@ -153,10 +247,10 @@ export const characters: Record = {
jsx(() => (
<>
Livestream joined: Summon a lv{" "}
- {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1} Ludwig Coots with this character's
+ {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1} Ludwig Coots with this Coots'
Relevancy and
- Presence.
+ Presence
>
)),
performAbility(char) {
@@ -189,9 +283,9 @@ export const characters: Record = {
<>
Livestream ended: Gain {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}{" "}
- Relevancy for every character on either
- livestream with more
- Relevancy.
+ Relevancy for every Coots on either livestream
+ with more
+ Relevancy
>
)),
performAbility(char) {
@@ -206,6 +300,135 @@ export const characters: Record = {
.length);
}
},
+ chessbox: {
+ nickname: "Chessboxing Coots",
+ initialRelevancy: 3,
+ initialPresence: 2,
+ display: chessboxing,
+ abilityType: "StreamStarted",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Stream started: Permanently gain{" "}
+ {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}
+ Relevancy and swap
+ Relevancy and
+ Presence
+ >
+ )),
+ performAbility(char) {
+ const gain = char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1;
+ const temp = char.relevancy + gain;
+ char.relevancy = char.presence;
+ char.presence = temp;
+ }
+ },
+ hasan: {
+ nickname: "Chessboxing Coots",
+ initialRelevancy: 2,
+ initialPresence: 3,
+ display: hasan,
+ abilityType: "StartTurn",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Turn started: If you won the last battle, all Coots gain
+ {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}
+ Relevancy
+ >
+ )),
+ performAbility(char) {
+ if (main.outcome.value !== "Victory") {
+ return;
+ }
+ const gain = char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1;
+ main.team.value.forEach(m => {
+ if (m != null) {
+ m.relevancy += gain;
+ }
+ });
+ }
+ },
+ beast: {
+ nickname: "Mr.Beast Coots",
+ initialRelevancy: 2,
+ initialPresence: 2,
+ display: beast,
+ abilityType: "StartTurn",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Turn started: Gain
+ {char.exp >= 6 ? 6 : char.exp >= 3 ? 4 : 2}
+ Moguls
+ >
+ )),
+ performAbility(char) {
+ const gain = char.exp >= 6 ? 6 : char.exp >= 3 ? 4 : 2;
+ main.gold.value += gain;
+ }
+ },
+ frog: {
+ nickname: "Mr.Beast Coots",
+ initialRelevancy: 1,
+ initialPresence: 2,
+ display: frog,
+ abilityType: "Faint",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Either stat hits 0: Summon a lv{" "}
+ {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1} Mogul Mail Coots with this Coots'
+
+ Relevancy and
+ Presence
+ >
+ )),
+ performAbility(char) {
+ if (main.battle.value == null) {
+ return;
+ }
+ const level = char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1;
+ const newChar = {
+ type: "mail",
+ exp: level === 3 ? 6 : level === 2 ? 3 : 1,
+ presence: char.presence,
+ relevancy: char.relevancy
+ };
+ main.queue.value.push({ action: "LivestreamJoined", target: newChar });
+ if (main.battle.value.streamers.includes(char)) {
+ main.battle.value.streamers.push(newChar);
+ } else {
+ main.battle.value.enemyStreamers.push(newChar);
+ }
+ }
+ },
+ moves: {
+ nickname: "Mogul Moves Coots",
+ initialRelevancy: 1,
+ initialPresence: 2,
+ display: moves,
+ abilityType: "LivestreamJoined",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Livestream joined: Gain {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}{" "}
+
+ Relevancy for every battle you've won
+ >
+ )),
+ performAbility(char) {
+ if (main.battle.value == null) {
+ return;
+ }
+ const gain = char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1;
+ if (main.battle.value.streamers.includes(char)) {
+ char.relevancy += gain * main.wins.value;
+ } else {
+ char.relevancy += gain * main.battle.value.enemyWins;
+ }
+ }
+ },
// Tier 3
money: {
nickname: "Mogul Money Coots",
@@ -220,7 +443,7 @@ export const characters: Record = {
{char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}
Presence if you have 2 or more
- Moguls.
+ Moguls
>
)),
performAbility(char) {
@@ -239,10 +462,10 @@ export const characters: Record = {
abilityDescription: () =>
jsx(() => (
<>
- Livestream joined: Set the character that most recently joined the enemy
+ Livestream joined: Set the Coots that most recently joined the enemy
livestream's
Presence to 0. This effect does not improve on
- level up.
+ level up
>
)),
performAbility(char) {
@@ -263,6 +486,184 @@ export const characters: Record = {
}
}
}
+ },
+ smash: {
+ nickname: "Smash Coots",
+ initialRelevancy: 2,
+ initialPresence: 4,
+ display: smash,
+ abilityType: "Hurt",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Hurt: Gain {char.exp >= 6 ? 6 : char.exp >= 3 ? 4 : 2}{" "}
+
+ Relevancy
+ >
+ )),
+ performAbility(char) {
+ if (main.battle.value == null) {
+ return;
+ }
+ const gain = char.exp >= 6 ? 6 : char.exp >= 3 ? 4 : 2;
+ char.relevancy += gain;
+ }
+ },
+ connor: {
+ nickname: "CDawgVA Coots",
+ initialRelevancy: 2,
+ initialPresence: 2,
+ display: connor,
+ abilityType: "Faint",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Either stat hits 0: Summon a lv{" "}
+ {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1} Ironmouse Coots
+ >
+ )),
+ performAbility(char) {
+ if (main.battle.value == null) {
+ return;
+ }
+ const level = char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1;
+ const newChar = {
+ type: "ironmouse",
+ exp: level === 3 ? 6 : level === 2 ? 3 : 1,
+ presence: characters.ironmouse.initialPresence,
+ relevancy: characters.ironmouse.initialRelevancy
+ };
+ main.queue.value.push({ action: "LivestreamJoined", target: newChar });
+ if (main.battle.value.streamers.includes(char)) {
+ main.battle.value.streamers.push(newChar);
+ } else {
+ main.battle.value.enemyStreamers.push(newChar);
+ }
+ }
+ },
+ luddy: {
+ nickname: "Luddy Coots",
+ initialRelevancy: 2,
+ initialPresence: 3,
+ display: luddy,
+ abilityType: "LivestreamEnded",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Livestream ended: Deal {char.exp >= 6 ? 9 : char.exp >= 3 ? 6 : 3}{" "}
+
+ Presence damage to the Coots on the enemy
+ livestream with the highest
+ Presence
+ >
+ )),
+ performAbility(char) {
+ if (main.battle.value == null) {
+ return;
+ }
+ if (main.battle.value.streamers.includes(char)) {
+ const m = main.battle.value.enemyStreamers.reduce((a, b) => {
+ if (a.presence > b.presence) {
+ return a;
+ }
+ return b;
+ });
+ if (m != null) {
+ m.presence -= 3;
+ }
+ } else {
+ const m = main.battle.value.streamers.reduce((a, b) => {
+ if (a.presence > b.presence) {
+ return a;
+ }
+ return b;
+ });
+ if (m != null) {
+ m.presence -= 3;
+ }
+ }
+ }
+ },
+ slime: {
+ nickname: "Slime Coots",
+ initialRelevancy: 3,
+ initialPresence: 3,
+ display: slime,
+ abilityType: "LivestreamJoined",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Livestream joined: Give {char.exp >= 6 ? 4 : char.exp >= 3 ? 3 : 2}{" "}
+
+ Relevancy and
+ Presence to the Coots who most recently joined
+ this livestream.
+ >
+ )),
+ performAbility(char) {
+ if (main.battle.value == null) {
+ return;
+ }
+ const gain = char.exp >= 6 ? 4 : char.exp >= 3 ? 3 : 2;
+ if (main.battle.value.streamers.includes(char)) {
+ if (main.battle.value.streamers.length > 1) {
+ main.battle.value.streamers[1].relevancy += gain;
+ main.battle.value.streamers[1].presence += gain;
+ }
+ } else {
+ if (main.battle.value.enemyStreamers.length > 1) {
+ main.battle.value.enemyStreamers[1].relevancy += gain;
+ main.battle.value.enemyStreamers[1].presence += gain;
+ }
+ }
+ }
+ },
+ awards: {
+ nickname: "Streamer Awards Coots",
+ initialRelevancy: 3,
+ initialPresence: 3,
+ display: awards,
+ abilityType: "StartTurn",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Turn Started: If you won the last battle, gain{" "}
+ {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}
+ Moguls for every battle you've won
+ >
+ )),
+ performAbility(char) {
+ if (main.outcome.value !== "Victory") {
+ return;
+ }
+ const gain = char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1;
+ main.gold.value += gain * main.wins.value;
+ }
+ },
+ // Other
+ ironmouse: {
+ nickname: "Ironmouse Coots",
+ initialRelevancy: 5,
+ initialPresence: 5,
+ display: ironmouse,
+ abilityType: "LivestreamJoined",
+ abilityDescription: char =>
+ jsx(() => (
+ <>
+ Livestream joined: Gain {char.exp >= 6 ? 6 : char.exp >= 3 ? 4 : 2}{" "}
+
+ Relevancy and
+ Presence
+ >
+ )),
+ performAbility(char) {
+ if (main.battle.value == null) {
+ return;
+ }
+ const gain = char.exp >= 6 ? 6 : char.exp >= 3 ? 4 : 2;
+ char.relevancy += gain;
+ char.presence += gain;
+ }
}
};
diff --git a/src/data/socket.tsx b/src/data/socket.tsx
index 5ab38b0..9888e03 100644
--- a/src/data/socket.tsx
+++ b/src/data/socket.tsx
@@ -144,6 +144,13 @@ function setupSocket(socket: Socket)
}, 0);
main.showRefreshAnim.value = true;
setTimeout(() => (main.showRefreshAnim.value = false), 500);
+ setTimeout(() => {
+ main.team.value.forEach(m => {
+ if (m != null && characters[m.type].abilityType === "StartTurn") {
+ characters[m.type].performAbility(m);
+ }
+ });
+ }, 1250);
});
socket.on("reroll", shop => {
main.gold.value--;
diff --git a/src/data/types.d.ts b/src/data/types.d.ts
index 3a2fb68..6470e4b 100644
--- a/src/data/types.d.ts
+++ b/src/data/types.d.ts
@@ -1,6 +1,12 @@
import { CoercableComponent } from "features/feature";
-type AbilityTypes = "LivestreamJoined" | "Sold" | "LevelUp" | "LivestreamEnded" | "StreamStarted";
+type AbilityTypes =
+ | "LivestreamJoined"
+ | "Sold"
+ | "LevelUp"
+ | "LivestreamEnded"
+ | "StreamStarted"
+ | "StartTurn";
interface CharacterInfo {
nickname: string;