Enhance ending sounds
This commit is contained in:
1 parent
81f498c804
commit
f2f20b820e
19 files changed
+94
-29
No files matched your search
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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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({
|
||||
|
||||
Reference in new issue
Block a user