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;