Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
41b75cf
-added new aspects
ThreeEelsinaJellyfishCoat Oct 15, 2026
d6e07b2
-added aspect sacrifices
ThreeEelsinaJellyfishCoat Oct 15, 2026
d301796
-added new modifier for aspects
ThreeEelsinaJellyfishCoat Oct 15, 2026
00549d0
-added aspect sacrifices to the existence field and updated template
ThreeEelsinaJellyfishCoat Oct 15, 2026
1412560
-fixed indentation mistakes
ThreeEelsinaJellyfishCoat Oct 15, 2026
97f29bd
-added new gateway messages
ThreeEelsinaJellyfishCoat Oct 15, 2026
188df42
-added changelog entry
ThreeEelsinaJellyfishCoat Oct 15, 2026
1ea36c3
-fixed tpyos in seaApplesToScience and seagrassToScience
ThreeEelsinaJellyfishCoat Oct 15, 2026
a27ebd4
-added new aspect
ThreeEelsinaJellyfishCoat Oct 17, 2026
8f48ab8
-added a new tab name
ThreeEelsinaJellyfishCoat Oct 26, 2026
1f1489e
-added my name to the contributors!
ThreeEelsinaJellyfishCoat Oct 26, 2026
825804c
-rewrote changelog entry for next update
ThreeEelsinaJellyfishCoat Oct 26, 2026
2b52049
-fixed tpyo and added two off messages
ThreeEelsinaJellyfishCoat Oct 28, 2026
090055b
-added shore planet and mudskipper homeaction spritesheet locations
ThreeEelsinaJellyfishCoat Oct 28, 2026
b120bcb
-delete spritesheet
ThreeEelsinaJellyfishCoat Oct 28, 2026
97e32ed
-added new spritesheet
ThreeEelsinaJellyfishCoat Oct 28, 2026
190a1db
-I FORGOT TO ADD THE SHORE LOCATION
ThreeEelsinaJellyfishCoat Oct 28, 2026
1147835
-added new aspect
ThreeEelsinaJellyfishCoat Oct 31, 2026
bdb0f75
-added beast and bloom fields to dissections
ThreeEelsinaJellyfishCoat Nov 1, 2026
f8b45d4
-added beast and bloom field to haven's seaApplesToScience
ThreeEelsinaJellyfishCoat Nov 1, 2026
fa2829f
-added beast and bloom field to seagrassToScience
ThreeEelsinaJellyfishCoat Nov 1, 2026
21aa07a
-added more stuff to the changelog entry
ThreeEelsinaJellyfishCoat Nov 1, 2026
616c777
-removed deprecated dancing leaves modifier
ThreeEelsinaJellyfishCoat Nov 1, 2026
7776f04
Update resourcetable.js
ThreeEelsinaJellyfishCoat Nov 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions contributors.html
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,10 @@ <h2>SHARK GAME: NEW FRONTIERS</h2>
<td><a href="https://http.cat/404">Adr</a></td>
<td>Playtester, Code contributor</td>
</tr>
<tr>
<td><a href="https://github.com/ThreeEelsinaJellyfishCoat">Three Eels in a Jellyfish Coat</a></td>
<td>Concept Artist, Developer</td> <!-- Could I be considered a playtester? I playtested Chaotic... -->
</tr>
</table>
<br />
<ul>
Expand Down
Binary file modified img/sprites.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
277 changes: 277 additions & 0 deletions js/data/aspects.js
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,115 @@ SharkGame.Aspects = {
tree.handleClickedAspect(this);
},
},
pathOfLoyalty: { // old name: pathOfResearch
posX: 450,
posY: 450,
width: 40,
height: 40,

max: 10,
level: 0,
name: "Path of Loyalty",
description: "Good leadership attracts lasting effects, and undying loyalty.",
// old desc: "Knowledge leads to curiosity, and curiosity leads to progress, and progress leads to ascension."
getCost(level) {
return 3 * level + 2;
},
getEffect(level) {
return (
"Multiply the income of " +
sharktext.getResourceName("sand", false, 69, sharkcolor.getElementColor("tooltipbox", "background-color")) +
" by <strong>" +
(level + 1) +
"×</strong>."
);
},
getUnlocked() {
if (!SharkGame.Aspects.pathOfEnlightenment.level) {
return "???";
}
if (gateway.completedWorlds.length < 3) {
return "Scout at least two worlds to unlock this aspect.";
}
},
prerequisites: ["apotheosis"],
clicked(_event) {
tree.handleClickedAspect(this);
},
apply(when) {
if (when === "init") {
res.applyModifier("aspectResourceIncomeBoost", "sand", this.level + 1);
// res.applyModifier("pathOfLoyalty", "ray", this.level + 0.5);
// res.applyModifier("pathOfLoyalty", "sandDigger", this.level + 1);
// res.applyModifier("pathOfLoyalty", "eel", this.level + 1);
// res.applyModifier("pathOfLoyalty", "sifter", this.level + 0.5);
// res.applyModifier("pathOfLoyalty", "urchin", this.level + 0.5);
// res.applyModifier("pathOfLoyalty", "miller", this.level + 1);
// res.applyModifier("pathOfLoyalty", "pulveriser", this.level + 1);
}
},
},
arcaneAssistance: {
posX: 500,
posY: 550,
width: 40,
height: 40,

max: 10,
level: 0,
name: "Arcane Assistance",
description: "Curiosity yields risk, but is the seed of lasting progress.",
getCost(level) {
return 3 * level + 2;
},
getEffect(level) {
return (
"Start with <strong>" +
1 * 2 ** level +
"</strong> " +
sharktext.getResourceName("sacrifice", false, 69, sharkcolor.getElementColor("tooltipbox", "background-color")) +
". Each world will receive different resource boosts."
);
},
getUnlocked() {
return gateway.completedWorlds.includes("shrouded") ? "" : "Complete the Shrouded worldtype to unlock this aspect.";
},
prerequisites: ["pathOfLoyalty"],
clicked(_event) {
tree.handleClickedAspect(this);
},
apply(when) {
if (when === "init" && res.getResource("kelpAspectSacrifice") === 0 && !SharkGame.flags.arcaneAssistanceApplied) {
const base = 1 * 2 ** this.level;
switch (world.worldType) {
case "shrouded":
res.changeResource("jellyAspectSacrifice", base);
break;
case "haven":
res.changeResource("coralAspectSacrifice", base);
break;
case "volcanic":
res.changeResource("volcanicAspectSacrifice", base);
break;
case "tempestuous":
res.changeResource("seagrassAspectSacrifice", base);
break;
case "marine":
res.changeResource("clamAspectSacrifice", base);
break;
case "abandoned":
res.changeResource("spongeAspectSacrifice", base);
break;
case "shore":
res.changeResource("seagrassAspectSacrifice", base);
break;
default:
res.changeResource("kelpAspectSacrifice", base);
}
SharkGame.flags.arcaneAssistanceApplied = true;
}
},
},
pathOfTime: {
posX: 450,
posY: 250,
Expand Down Expand Up @@ -841,6 +950,174 @@ SharkGame.Aspects = {
tree.handleClickedAspect(this);
},
},
dancingLeaves: {
posX: 330,
posY: 440,
width: 40,
height: 40,

max: 10,
level: 0,
name: "Dancing Leaves",
description: "Faceless. Mindless. Boundless.",
getCost(level) {
return 3 * level + 2;
},
getEffect(level) {
return (
"Multiply the income of " +
sharktext.getResourceName("kelp", false, 69, sharkcolor.getElementColor("tooltipbox", "background-color")) +
" or " +
sharktext.getResourceName("seagrass", false, 69, sharkcolor.getElementColor("tooltipbox", "background-color")) +
" by <strong>" +
(level + 1) +
"×</strong>."
);
},
getUnlocked() {},
prerequisites: ["apotheosis"],
clicked(_event) {
tree.handleClickedAspect(this);
},
apply(when) {
if (when === "init") {
res.applyModifier("aspectResourceIncomeBoost", "kelp", this.level + 1);
res.applyModifier("aspectResourceIncomeBoost", "seagrass", this.level + 1);
// res.applyModifier("dancingLeaves", "planter", this.level + 1);
// res.applyModifier("dancingLeaves", "stormgoer", this.level + 1);
// res.applyModifier("dancingLeaves", "stabilizer", this.level + 1);
// res.applyModifier("dancingLeaves", "seagrassFarm", this.level + 1);
// res.applyModifier("dancingLeaves", "urchin", this.level + 0.5);
// res.applyModifier("dancingLeaves", "connoisseur", this.level + 1);
// res.applyModifier("dancingLeaves", "seagrassPicker", this.level + 1);
// res.applyModifier("dancingLeaves", "shoreQueller", this.level + 0.25);
}
},
},
beastAndBloom: {
posX: 315,
posY: 500,
width: 40,
height: 40,

max: 4,
level: 0,
name: "Beast and Bloom",
description: "There's a lot to learn from simplicity.",
core: true,
getCost(level) {
return 2 * level + 3;
},
getEffect(level) {
return (
"Gain <strong>" +
(level + 1) +
"x</strong> more " +
sharktext.getResourceName("science", false, 69, sharkcolor.getElementColor("tooltipbox", "background-color")) +
" from dissections."
);
},
getUnlocked() {},
prerequisites: ["dancingLeaves"],
clicked(_event) {
tree.handleClickedAspect(this);
},
},
nativeKnowledge: {
posX: 444,
posY: 595,
width: 40,
height: 40,

max: 10,
level: 0,
name: "Native Knowledge",
description: "Those in their element are the best to learn from.",
getCost(level) {
return 2 * level + 2;
},
getEffect(level) {
return (
"Multiply the efficiency of a world's unique frenzy members by <strong>" +
(level + 1) +
"×</strong>."
);
},
getUnlocked() {
if (!SharkGame.Aspects.pathOfEnlightenment.level) {
return "???";
}
if (gateway.completedWorlds.length < 3) {
return "Scout at least two worlds to unlock this aspect.";
}
},
prerequisites: ["apotheosis"],
clicked(_event) {
tree.handleClickedAspect(this);
},
apply(when) {
if (when === "init") {
res.applyModifier("pathOfIndustry", "octopus", this.level + 1);
res.applyModifier("pathOfIndustry", "squid", this.level + 1);
res.applyModifier("pathOfIndustry", "urchin", this.level + 1);
res.applyModifier("pathOfIndustry", "dolphin", this.level + 1);
res.applyModifier("pathOfIndustry", "whale", this.level + 1);
res.applyModifier("pathOfIndustry", "billfish", this.level + 1);
res.applyModifier("pathOfIndustry", "chimaera", this.level + 1);
res.applyModifier("pathOfIndustry", "eel", this.level + 1);
res.applyModifier("pathOfIndustry", "lobster", this.level + 1);
res.applyModifier("pathOfIndustry", "shrimp", this.level + 1);
// res.applyModifier("pathOfIndustry", "mudskipper", this.level + 1);
// res.applyModifier("pathOfIndustry", "caracara", this.level + 1);
}
},
},
buriedBlueprints: {
posX: 555,
posY: 676,
width: 40,
height: 40,

max: 10,
level: 0,
name: "Buried Blueprints",
description: "Every world has its secrets, waiting to be uncovered.",
getCost(level) {
return 2 * level + 2;
},
getEffect(level) {
return (
"Multiply the efficiency of a world's unique machines by <strong>" +
(level + 1) +
"×</strong>."
);
},
getUnlocked() {},
prerequisites: ["nativeKnowledge"],
clicked(_event) {
tree.handleClickedAspect(this);
},
apply(when) {
if (when === "init") {
res.applyModifier("pathOfIndustry", "heater", this.level + 1);
res.applyModifier("pathOfIndustry", "tirelessCrafter", this.level + 1);
res.applyModifier("pathOfIndustry", "kelpCultivator", this.level + 1);
res.applyModifier("pathOfIndustry", "crimsonCombine", this.level + 1);
res.applyModifier("pathOfIndustry", "clamCollector", this.level + 1);
res.applyModifier("pathOfIndustry", "sprongeSmelter", this.level + 1);
res.applyModifier("pathOfIndustry", "eggBrooder", this.level + 1);
res.applyModifier("pathOfIndustry", "seabedStripper", this.level + 1);
res.applyModifier("pathOfIndustry", "calciniumConverter", this.level + 1);
res.applyModifier("pathOfIndustry", "clamScavenger", this.level + 1);
// res.applyModifier("pathOfIndustry", "shoreQueller", this.level + 1);
// res.applyModifier("pathOfIndustry", "driftwoodSnarer", this.level + 1);
// res.applyModifier("pathOfIndustry", "hardbarkSmith", this.level + 1);
res.applyModifier("pathOfIndustry", "shoveler", this.level + 1);
res.applyModifier("pathOfIndustry", "farmer", this.level + 1);
res.applyModifier("pathOfIndustry", "researcher", this.level + 1);
}
},
},

// deprecated

Expand Down
20 changes: 13 additions & 7 deletions js/data/homeactions.js
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,9 @@ SharkGame.HomeActions = {
name: "Study sea apples",
effect: {
resource: {
science: 4,
get science() {
return 4 + 4 * SharkGame.Aspects.beastAndBloom.level;
},
},
},
cost: [{ resource: "seaApple", costFunction: "constant", priceIncrease: 1 }],
Expand All @@ -317,7 +319,7 @@ SharkGame.HomeActions = {
"This is perhaps maybe insightful!",
"Why are we even doing this? Who knows! Science!",
"What is even the point of these things? Why are they named for fruit? They're squirming!",
"Results still inconclusive! Unsurpsingly...",
"Results still inconclusive! Unsurprisingly...",
],
helpText: "Dissect the sea apples our kelp attracts to gain additional science. Research!",
},
Expand Down Expand Up @@ -1877,7 +1879,7 @@ SharkGame.HomeActions = {
effect: {
resource: {
get science() {
return 4 * (1 + 0.01 * res.getResource("historian"));
return (4 * SharkGame.Aspects.beastAndBloom.level) + 4 * (1 + 0.01 * res.getResource("historian"));
},
},
},
Expand Down Expand Up @@ -2618,7 +2620,9 @@ SharkGame.HomeActions = {
name: "Dismantle jellyfish",
effect: {
resource: {
science: 4,
get science() {
return 4 + 4 * SharkGame.Aspects.beastAndBloom.level;
},
},
},
cost: [{ resource: "jellyfish", costFunction: "constant", priceIncrease: 1 }],
Expand Down Expand Up @@ -3250,7 +3254,9 @@ SharkGame.HomeActions = {
name: "Study sea apples",
effect: {
resource: {
science: 4,
get science() {
return 4 + 4 * SharkGame.Aspects.beastAndBloom.level;
},
},
},
cost: [{ resource: "seaApple", costFunction: "constant", priceIncrease: 1 }],
Expand Down Expand Up @@ -4296,7 +4302,7 @@ SharkGame.HomeActions = {
effect: {
resource: {
get science() {
return SharkGame.Upgrades.purchased.includes("supernaturalSeagrass") ? 10 : 1;
return SharkGame.Upgrades.purchased.includes("supernaturalSeagrass") ? 10 * SharkGame.Aspects.beastAndBloom.level + 10 : 1 * SharkGame.Aspects.beastAndBloom.level + 1;
},
},
},
Expand All @@ -4313,7 +4319,7 @@ SharkGame.HomeActions = {
"The cause of science is advanced!",
"This is perhaps maybe insightful!",
"Why are we even doing this? Who knows! Science!",
"Results still inconclusive! Unsurpsingly...",
"Results still inconclusive! Unsurprisingly...",
"Quick question. What's a flower?",
"At least it's not gross.",
"We would learn a lot more from these if they weren't so absolutely tiny.",
Expand Down
22 changes: 22 additions & 0 deletions js/data/modifiertypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -587,6 +587,28 @@ SharkGame.ModifierTypes = {
return input * (input > 0 && out !== "tar" ? genDegree : 1);
},
},
aspectResourceIncomeBoost: { // used for aspects which boost the generation of a base resource, e.g. sand or kelp
defaultValue: 1,
apply(current, degree, boostedResource) {
SharkGame.ResourceMap.forEach((generatingResource) => {
$.each(generatingResource.income, (generatedResource, amount) => {
if (generatedResource === boostedResource && amount > 0) {
generatingResource.income[generatedResource] = amount * degree;
}
});
});
return current * degree;
},
effectDescription(degree, resource, background) {
return "All " + sharktext.getResourceName(resource, undefined, undefined, background) + " production × " + degree;
},
getEffect(_genDegree, outDegree, gen, out) {
return SharkGame.ResourceMap.get(gen).income[out] > 0 && out !== "tar" ? outDegree : 1;
},
applyToInput(input, _genDegree, outDegree, _gen, _out) {
return input > 0 ? input * outDegree : input;
},
},
constructedConception: {
defaultValue: 1,
apply(current, degree, resource) {
Expand Down
Loading