Added 13 new Coots

note: Faint and Hurt abilities NYI, and none of these are tested
This commit is contained in:
thepaperpilot 2023-02-25 14:47:37 -06:00
parent 3f8240e00e
commit db31fbb796
18 changed files with 439 additions and 12 deletions

View file

@ -57,6 +57,19 @@
<link rel="prefetch" href="Victory Button.png" />
<link rel="prefetch" href="Defeat Button.png" />
<link rel="prefetch" href="Tie Button.png" />
<link rel="prefetch" href="cdawg va.png" />
<link rel="prefetch" href="chessboxing coots.png" />
<link rel="prefetch" href="frog Coots.png" />
<link rel="prefetch" href="hasan coots.png" />
<link rel="prefetch" href="ironmouse coots.png" />
<link rel="prefetch" href="luddy Coots.png" />
<link rel="prefetch" href="mario coots.png" />
<link rel="prefetch" href="mr beast coots.png" />
<link rel="prefetch" href="nick coots.png" />
<link rel="prefetch" href="SlimeCoots.png" />
<link rel="prefetch" href="smash coots.png" />
<link rel="prefetch" href="streamer award coots.png" />
<link rel="prefetch" href="aimen coots.png" />
<title>Profectus</title>
<meta name="description" content="A project made in Profectus"/>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
public/SlimeCoots.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
public/aimen coots.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
public/cdawg va.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
public/frog Coots.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
public/hasan coots.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
public/ironmouse coots.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
public/luddy Coots.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
public/mario coots.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
public/mr beast coots.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
public/nick coots.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
public/smash coots.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -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<string, CharacterInfo> = {
<>
<i>Livestream joined</i>: Deal {char.exp >= 6 ? 6 : char.exp >= 3 ? 4 : 2}{" "}
<img src={heart_small} />
<span style="color: red">Relevancy</span> damage to every character on a stream
<span style="color: red">Relevancy</span> damage to every Coots on either
livestream
</>
)),
performAbility(char) {
@ -80,7 +94,7 @@ export const characters: Record<string, CharacterInfo> = {
<>
<i>Livestream joined</i>: Gain {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}{" "}
<img src={star_small} />
<span style="color: gold">Presence</span> for every character on that livestream
<span style="color: gold">Presence</span> for every Coots on that livestream
</>
)),
performAbility(char) {
@ -117,6 +131,86 @@ export const characters: Record<string, CharacterInfo> = {
main.gold.value += goldGain;
}
},
mario: {
nickname: "Mario Coots",
initialPresence: 1,
initialRelevancy: 1,
display: mario,
abilityType: "LivestreamJoined",
abilityDescription: char =>
jsx(() => (
<>
<i>Livestream joined</i>: Deal {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}{" "}
<img src={star_small} />
<span style="color: gold">Presence</span> 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(() => (
<>
<i>Sold</i>: Give {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}{" "}
<img src={heart_small} />
<span style="color: red">Relevancy</span> 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(() => (
<>
<i>Livestream ended</i>: Each coots on this livestream gain{" "}
{char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1} <img src={star_small} />
<span style="color: gold">Presence</span>
</>
)),
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<string, CharacterInfo> = {
abilityDescription: char =>
jsx(() => (
<>
<i>Level up</i>: Every character gains {char.exp >= 3 ? 2 : 1}{" "}
<i>Level up</i>: Give every Coots {char.exp >= 3 ? 2 : 1}{" "}
<img src={heart_small} />
<span style="color: red">Relevancy</span> and <img src={star_small} />
<span style="color: gold">Presence</span>
@ -153,10 +247,10 @@ export const characters: Record<string, CharacterInfo> = {
jsx(() => (
<>
<i>Livestream joined</i>: 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'
<img src={heart_small} />
<span style="color: red">Relevancy</span> and <img src={star_small} />
<span style="color: gold">Presence</span>.
<span style="color: gold">Presence</span>
</>
)),
performAbility(char) {
@ -189,9 +283,9 @@ export const characters: Record<string, CharacterInfo> = {
<>
<i>Livestream ended</i>: Gain {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}{" "}
<img src={heart_small} />
<span style="color: red">Relevancy</span> for every character on either
livestream with more <img src={heart_small} />
<span style="color: red">Relevancy</span>.
<span style="color: red">Relevancy</span> for every Coots on either livestream
with more <img src={heart_small} />
<span style="color: red">Relevancy</span>
</>
)),
performAbility(char) {
@ -206,6 +300,135 @@ export const characters: Record<string, CharacterInfo> = {
.length);
}
},
chessbox: {
nickname: "Chessboxing Coots",
initialRelevancy: 3,
initialPresence: 2,
display: chessboxing,
abilityType: "StreamStarted",
abilityDescription: char =>
jsx(() => (
<>
<i>Stream started</i>: Permanently gain{" "}
{char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1} <img src={heart_small} />
<span style="color: red">Relevancy</span> and swap <img src={heart_small} />
<span style="color: red">Relevancy</span> and <img src={star_small} />
<span style="color: gold">Presence</span>
</>
)),
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(() => (
<>
<i>Turn started</i>: If you won the last battle, all Coots gain
{char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1} <img src={heart_small} />
<span style="color: red">Relevancy</span>
</>
)),
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(() => (
<>
<i>Turn started</i>: Gain
{char.exp >= 6 ? 6 : char.exp >= 3 ? 4 : 2} <img src={money_small} />
<span style="color: yellow">Moguls</span>
</>
)),
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(() => (
<>
<i>Either stat hits 0</i>: Summon a lv{" "}
{char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1} Mogul Mail Coots with this Coots'
<img src={heart_small} />
<span style="color: red">Relevancy</span> and <img src={star_small} />
<span style="color: gold">Presence</span>
</>
)),
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(() => (
<>
<i>Livestream joined</i>: Gain {char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1}{" "}
<img src={heart_small} />
<span style="color: red">Relevancy</span> 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<string, CharacterInfo> = {
{char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1} <img src={star_small} />
<span style="color: gold">Presence</span> if you have 2 or more
<img src={money_small} />
<span style="color: yellow">Moguls</span>.
<span style="color: yellow">Moguls</span>
</>
)),
performAbility(char) {
@ -239,10 +462,10 @@ export const characters: Record<string, CharacterInfo> = {
abilityDescription: () =>
jsx(() => (
<>
<i>Livestream joined</i>: Set the character that most recently joined the enemy
<i>Livestream joined</i>: Set the Coots that most recently joined the enemy
livestream's <img src={star_small} />
<span style="color: gold">Presence</span> to 0. This effect does not improve on
level up.
level up
</>
)),
performAbility(char) {
@ -263,6 +486,184 @@ export const characters: Record<string, CharacterInfo> = {
}
}
}
},
smash: {
nickname: "Smash Coots",
initialRelevancy: 2,
initialPresence: 4,
display: smash,
abilityType: "Hurt",
abilityDescription: char =>
jsx(() => (
<>
<i>Hurt</i>: Gain {char.exp >= 6 ? 6 : char.exp >= 3 ? 4 : 2}{" "}
<img src={star_small} />
<span style="color: gold">Relevancy</span>
</>
)),
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(() => (
<>
<i>Either stat hits 0</i>: 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(() => (
<>
<i>Livestream ended</i>: Deal {char.exp >= 6 ? 9 : char.exp >= 3 ? 6 : 3}{" "}
<img src={star_small} />
<span style="color: gold">Presence</span> damage to the Coots on the enemy
livestream with the highest <img src={star_small} />
<span style="color: gold">Presence</span>
</>
)),
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(() => (
<>
<i>Livestream joined</i>: Give {char.exp >= 6 ? 4 : char.exp >= 3 ? 3 : 2}{" "}
<img src={heart_small} />
<span style="color: red">Relevancy</span> and <img src={star_small} />
<span style="color: gold">Presence</span> 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(() => (
<>
<i>Turn Started</i>: If you won the last battle, gain{" "}
{char.exp >= 6 ? 3 : char.exp >= 3 ? 2 : 1} <img src={money_small} />
<span style="color: yellow">Moguls</span> 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(() => (
<>
<i>Livestream joined</i>: Gain {char.exp >= 6 ? 6 : char.exp >= 3 ? 4 : 2}{" "}
<img src={heart_small} />
<span style="color: red">Relevancy</span> and <img src={star_small} />
<span style="color: gold">Presence</span>
</>
)),
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;
}
}
};

View file

@ -144,6 +144,13 @@ function setupSocket(socket: Socket<ServerToClientEvents, ClientToServerEvents>)
}, 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--;

8
src/data/types.d.ts vendored
View file

@ -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;