Enhance ending sounds

This commit is contained in:
2025-02-23 17:50:02 -08:00
parent 81f498c804
commit f2f20b820e
19 changed files with 94 additions and 29 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+51 -8
View File
@@ -1,9 +1,18 @@
import { compile, VNScene, VNSceneBasisPart } from "./vnscene.ts";
import {
sndVnBat,
sndVnBreath,
sndVnDance,
sndVnDoorbell,
sndVnGhost,
sndVnPage,
sndVnPhone,
} from "./sounds.ts";
const squeak: VNSceneBasisPart = {
type: "message",
text: "...",
sfx: "squeak.mp3",
sfx: sndVnBat,
};
export const sceneBat: VNScene = compile([
@@ -25,7 +34,7 @@ export const sceneBat: VNScene = compile([
const doorbell: VNSceneBasisPart = {
type: "message",
text: "...",
sfx: "doorbell.mp3",
sfx: sndVnDoorbell,
};
export const sceneStealth: VNScene = compile([
@@ -33,7 +42,7 @@ export const sceneStealth: VNScene = compile([
"Yeah, you can let yourself in.",
doorbell,
"I'll have it moved.",
"Just -- don't call Susan, OK?",
"Just -- don't call Liz, OK?",
doorbell,
"Believe me, I'm good for the money.",
"I'm doing... a lot better than it looks like.",
@@ -46,7 +55,7 @@ export const sceneStealth: VNScene = compile([
const phoneBeep: VNSceneBasisPart = {
type: "message",
text: "...",
sfx: "phonebeep.mp3",
sfx: sndVnPhone,
};
export const sceneCharm: VNScene = compile([
@@ -61,7 +70,7 @@ export const sceneCharm: VNScene = compile([
"Can you put me through?",
phoneBeep,
"I really want it.",
"It's for my boyfriend. First boyfriend, sorry.",
"It's for my boyfriend. My old boyfriend, sorry.",
phoneBeep,
"*chuckle*",
"Yeah. I guess I do.",
@@ -72,7 +81,7 @@ export const sceneCharm: VNScene = compile([
const sleepyBreath: VNSceneBasisPart = {
type: "message",
text: "...",
sfx: "sleepyBreath.mp3",
sfx: sndVnBreath,
};
export const sceneStare: VNScene = compile([
@@ -93,7 +102,7 @@ export const sceneStare: VNScene = compile([
const party: VNSceneBasisPart = {
type: "message",
text: "...",
sfx: "party.mp3",
sfx: sndVnDance,
};
export const sceneParty: VNScene = compile([
@@ -111,7 +120,7 @@ export const sceneParty: VNScene = compile([
const ghost: VNSceneBasisPart = {
type: "message",
text: "...",
sfx: "ghost.mp3",
sfx: sndVnGhost,
};
export const sceneLore: VNScene = compile([
@@ -127,3 +136,37 @@ export const sceneLore: VNScene = compile([
"Yeah. They remember.",
ghost,
]);
const page: VNSceneBasisPart = {
type: "message",
text: "...",
sfx: sndVnPage,
};
export const sceneTrueEnding: VNScene = compile([
page,
"(This is a taxonomy. It's what nerds write instead of poetry.)",
page,
"INSECTIVORE. INSECTIPHAGE. INSECT-EATER. INSECT-EATING INSECT BAT.",
"CONSUMER OF BUGS.",
"We eat -- flies? They eat beetles.",
"We eat -- various bugs. Yes. And we hang in caves --",
"We deposit the shells in a heap. An absolutely massive heap --",
page,
"FRUCTIVORE. FRUITIPHAGE. FRUIT-EATING FRUIT BAT.",
"We eat -- grapes, melons, that kind of thing.",
"We unearth the heap.",
"We lay the shells in trenches in the furrows of a vineyard.",
page,
"There are two clades and in addition to that is a secret clade.",
page,
"(The pages are stuck together.)",
page,
"HEMOPHAGE. HEMOVORE. HEMATOPHAGE. BLOOD EATER.",
"It is not yet time to announce the sentence of fate.",
"We -- take the wine that grows from the branches.",
"That's a simplification.",
"This is the night deeper than any night that cannot be spoken of.",
page,
"OK -- now roll it.",
]);
+1 -1
View File
@@ -67,7 +67,7 @@ export class Hud {
D.drawText("BLD", new Point(0, 160), FG_BOLD);
let bloodAmount = prog.getBlood();
let bloodColor = FG_TEXT;
if (bloodAmount > 2000) {
if (bloodAmount >= 2000) {
bloodColor = FG_TEXT_ENDORSED;
}
if (bloodAmount < 100) {
+3 -1
View File
@@ -207,7 +207,9 @@ export class HuntMode {
this.velocity = dxy;
// let friction do it
if (this.map.imposesBloodCosts) {
getPlayerProgress().spendBlood(displacement.distance(new Point(0, 0)) * 10 / 3);
getPlayerProgress().spendBlood(
(displacement.distance(new Point(0, 0)) * 10) / 3,
);
}
}
+1 -8
View File
@@ -1,16 +1,9 @@
import { Architecture, LoadedNewMap } from "./newmap.ts";
import { Grid, Point } from "./engine/datatypes.ts";
import {
getThralls,
thrallCharm,
thrallLore,
thrallParty,
thrallStealth,
} from "./thralls.ts";
import { getThralls } from "./thralls.ts";
import {
LadderPickup,
ThrallCollectionPlatePickup,
ThrallPickup,
ThrallPosterPickup,
ThrallRecruitedPickup,
} from "./pickups.ts";
+1 -1
View File
@@ -320,7 +320,7 @@ export class LadderPickup {
onClick(): boolean {
if (getHuntMode().map.imposesBloodCosts) {
getPlayerProgress().addBlood(100); // this used to award 1k; 100 now is equivalent to what 300 blood used to be
getPlayerProgress().addBlood(100); // this used to award 1k; 100 now is equivalent to what 300 blood used to be
}
initHuntMode(new HuntMode(getHuntMode().depth + 1, generateMap()));
return false;
+11 -2
View File
@@ -9,6 +9,7 @@ import {
sceneParty,
sceneStare,
sceneStealth,
sceneTrueEnding,
} from "./endings.ts";
import { generateWishes, getWishes, isWishCompleted } from "./wishes.ts";
import { generateSuccessors } from "./successors.ts";
@@ -81,7 +82,12 @@ class Scorer {
// TODO: Award different ranks depending on second-to-top skill
// TODO: Award different domiciles based on overall score
// TODO: Force the rank to match the wish if one existed
else if (isMax("stare", 3)) {
else if (vampiricSkills >= 24) {
scene = sceneTrueEnding;
rank = "Master Vampire";
domicile = "Third Clade";
reignSentence = "You know the truth, or at least your character does.";
} else if (isMax("stare", 3)) {
scene = sceneStare;
rank = "Hypno-Chiropteran";
domicile = "Village of Brainwashed Mortals";
@@ -122,7 +128,10 @@ class Scorer {
vampiricSkills,
mortalServants,
};
let successorOptions = generateSuccessors(getPlayerProgress().nImprovements + 2, penance); // TODO: generate nImprovements from mortalServants and the player's bsae improvements
let successorOptions = generateSuccessors(
getPlayerProgress().nImprovements + 2,
penance,
); // TODO: generate nImprovements from mortalServants and the player's bsae improvements
let wishOptions = generateWishes(penance);
let progenerateVerb = penance ? "Repent" : "Progenerate";
+6 -5
View File
@@ -39,17 +39,18 @@ class SkillsTable {
computeCost(skill: Skill) {
const _STAT_TO_TRIPS: Record<Stat, number> = {
"AGI": 1/7.2, // 8.4 is what I measured, but this seems very overpriced in practice
"INT": 1/5.4,
"CHA": 1/4.8,
"PSI": 1/7.0,
AGI: 1 / 7.2, // 8.4 is what I measured, but this seems very overpriced in practice
INT: 1 / 5.4,
CHA: 1 / 4.8,
PSI: 1 / 7.0,
};
let data = this.get(skill);
let governingStatValue = 0;
for (let stat of data.governing.stats.values()) {
governingStatValue +=
getPlayerProgress().getStat(stat) * _STAT_TO_TRIPS[stat] / data.governing.stats.length;
(getPlayerProgress().getStat(stat) * _STAT_TO_TRIPS[stat]) /
data.governing.stats.length;
}
if (data.governing.flipped) {
+14
View File
@@ -10,6 +10,13 @@ import audRewardMedium from "./art/sounds/reward_medium.mp3";
import audRewardSmall from "./art/sounds/reward_small.mp3";
import audSilence from "./art/sounds/silence.mp3";
import audSleep from "./art/sounds/sleep.mp3";
import audVnBat from "./art/sounds/vn_bat.mp3";
import audVnBreath from "./art/sounds/vn_breath.mp3";
import audVnDance from "./art/sounds/vn_dance.mp3";
import audVnDoorbell from "./art/sounds/vn_doorbell.mp3";
import audVnGhost from "./art/sounds/vn_ghost.mp3";
import audVnPage from "./art/sounds/vn_page.mp3";
import audVnPhone from "./art/sounds/vn_phone.mp3";
import { Sound } from "./sound.ts";
export let sndBite = new Sound(audBite);
@@ -24,6 +31,13 @@ export let sndRewardMedium = new Sound(audRewardMedium);
export let sndRewardSmall = new Sound(audRewardSmall);
export let sndSilence = new Sound(audSilence);
export let sndSleep = new Sound(audSleep);
export let sndVnBat = new Sound(audVnBat);
export let sndVnBreath = new Sound(audVnBreath);
export let sndVnDance = new Sound(audVnDance);
export let sndVnDoorbell = new Sound(audVnDoorbell);
export let sndVnGhost = new Sound(audVnGhost);
export let sndVnPage = new Sound(audVnPage);
export let sndVnPhone = new Sound(audVnPhone);
export function sndRewardFor(amount: number) {
if (amount <= 1) {
-1
View File
@@ -10,7 +10,6 @@ import { openingScene } from "./openingscene.ts";
import { generateName } from "./namegen.ts";
import { photogenicThralls } from "./thralls.ts";
import { choose } from "./utils.ts";
import {generateSuccessor} from "./successors.ts";
const N_TURNS: number = 9;
+1
View File
@@ -85,6 +85,7 @@ interface SceneCathexis {
function createCathexis(part: VNScenePart): SceneCathexis {
switch (part.type) {
case "message":
part?.sfx?.play({ volume: 0.5 });
return new SceneMessageCathexis(part);
case "callback":
part?.callback();
+3 -1
View File
@@ -1,7 +1,9 @@
import { Sound } from "./sound.ts";
export type VNSceneMessage = {
type: "message";
text: string;
sfx?: string;
sfx?: Sound;
};
export type VNSceneCallback = {
+2 -1
View File
@@ -31,6 +31,7 @@ import {
} from "./skills.ts";
import { compile, VNSceneBasisPart } from "./vnscene.ts";
import { getPlayerProgress } from "./playerprogress.ts";
import { sndVnBreath } from "./sounds.ts";
class WishesTable {
#wishes: WishData[];
@@ -68,7 +69,7 @@ export function getWishes(): WishesTable {
const whisper: VNSceneBasisPart = {
type: "message",
text: "...",
sfx: "whisper.mp3",
sfx: sndVnBreath,
};
export const celebritySocialite = table.add({