Enhance ending sounds
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								src/art/sounds/vn_bat.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/art/sounds/vn_bat.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/art/sounds/vn_breath.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/art/sounds/vn_breath.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/art/sounds/vn_dance.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/art/sounds/vn_dance.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/art/sounds/vn_doorbell.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/art/sounds/vn_doorbell.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/art/sounds/vn_ghost.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/art/sounds/vn_ghost.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/art/sounds/vn_page.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/art/sounds/vn_page.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/art/sounds/vn_phone.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/art/sounds/vn_phone.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -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.", | ||||
| ]); | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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,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"; | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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"; | ||||
|   | ||||
| @@ -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(); | ||||
|   | ||||
| @@ -1,7 +1,9 @@ | ||||
| import { Sound } from "./sound.ts"; | ||||
|  | ||||
| export type VNSceneMessage = { | ||||
|   type: "message"; | ||||
|   text: string; | ||||
|   sfx?: string; | ||||
|   sfx?: Sound; | ||||
| }; | ||||
|  | ||||
| export type VNSceneCallback = { | ||||
|   | ||||
| @@ -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