Fix the numbers
This commit is contained in:
parent
5ab3778074
commit
81f498c804
@ -106,6 +106,7 @@ export type SuccessorOption = {
|
||||
name: string;
|
||||
title: string;
|
||||
template: Thrall;
|
||||
nImprovements: number;
|
||||
note: string | null; // ex "already a vampire"
|
||||
stats: Record<Stat, number>;
|
||||
talents: Record<Stat, number>;
|
||||
|
@ -206,7 +206,9 @@ export class HuntMode {
|
||||
this.floatingPlayer = this.floatingPlayer.offset(displacement);
|
||||
this.velocity = dxy;
|
||||
// let friction do it
|
||||
getPlayerProgress().spendBlood(displacement.distance(new Point(0, 0)) * 10);
|
||||
if (this.map.imposesBloodCosts) {
|
||||
getPlayerProgress().spendBlood(displacement.distance(new Point(0, 0)) * 10 / 3);
|
||||
}
|
||||
}
|
||||
|
||||
#updateFov() {
|
||||
|
@ -34,6 +34,7 @@ const BASIC_PLAN = Grid.createGridFromMultilineString(`
|
||||
|
||||
export function generateManor(): LoadedNewMap {
|
||||
let map = new LoadedNewMap("manor", BASIC_PLAN.size);
|
||||
map.imposesBloodCosts = false;
|
||||
let thralls = getThralls().getAll();
|
||||
|
||||
for (let y = 0; y < BASIC_PLAN.size.h; y++) {
|
||||
|
@ -15,8 +15,8 @@ import {
|
||||
import { getPlayerProgress } from "./playerprogress.ts";
|
||||
import { ItemStage } from "./thralls.ts";
|
||||
|
||||
const WIDTH = 21;
|
||||
const HEIGHT = 21;
|
||||
const WIDTH = 19;
|
||||
const HEIGHT = 19;
|
||||
|
||||
const MIN_VAULTS = 1;
|
||||
const MAX_VAULTS = 2;
|
||||
@ -24,7 +24,7 @@ const NUM_VAULT_TRIES = 90;
|
||||
const NUM_ROOM_TRIES = 90;
|
||||
const NUM_STAIRCASE_TRIES = 90;
|
||||
const NUM_STAIRCASES_DESIRED = 3;
|
||||
const NUM_ROOMS_DESIRED = 4;
|
||||
const NUM_ROOMS_DESIRED = 1;
|
||||
|
||||
const EXTRA_CONNECTOR_CHANCE = 0.15;
|
||||
const WINDING_PERCENT = 50;
|
||||
|
@ -30,6 +30,7 @@ export class LoadedNewMap {
|
||||
#id: string;
|
||||
#size: Size;
|
||||
#entrance: Point | null;
|
||||
#imposesBloodCosts: boolean;
|
||||
#architecture: Grid<Architecture>;
|
||||
#pickups: Grid<Pickup | null>;
|
||||
#provinces: Grid<string | null>; // TODO: Does this just duplicate zoneLabels
|
||||
@ -40,6 +41,7 @@ export class LoadedNewMap {
|
||||
this.#id = id;
|
||||
this.#size = size;
|
||||
this.#entrance = null;
|
||||
this.#imposesBloodCosts = true;
|
||||
this.#architecture = new Grid<Architecture>(size, () => Architecture.Wall);
|
||||
this.#pickups = new Grid<Pickup | null>(size, () => null);
|
||||
this.#provinces = new Grid<string | null>(size, () => null);
|
||||
@ -58,6 +60,14 @@ export class LoadedNewMap {
|
||||
return this.#entrance;
|
||||
}
|
||||
|
||||
set imposesBloodCosts(value: boolean) {
|
||||
this.#imposesBloodCosts = value;
|
||||
}
|
||||
|
||||
get imposesBloodCosts() {
|
||||
return this.#imposesBloodCosts;
|
||||
}
|
||||
|
||||
get size(): Size {
|
||||
return this.#size;
|
||||
}
|
||||
|
@ -201,7 +201,7 @@ export class StatPickupCallbacks {
|
||||
}
|
||||
|
||||
get cost(): number {
|
||||
return 100;
|
||||
return 30;
|
||||
}
|
||||
|
||||
obtain() {
|
||||
@ -248,7 +248,7 @@ export class ExperiencePickupCallbacks {
|
||||
constructor() {}
|
||||
|
||||
get cost(): number {
|
||||
return 100;
|
||||
return 30;
|
||||
}
|
||||
|
||||
obtain() {
|
||||
@ -319,7 +319,9 @@ export class LadderPickup {
|
||||
update() {}
|
||||
|
||||
onClick(): boolean {
|
||||
getPlayerProgress().addBlood(1000);
|
||||
if (getHuntMode().map.imposesBloodCosts) {
|
||||
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;
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import { getThralls, ItemStage, LifeStage, Thrall } from "./thralls.ts";
|
||||
export class PlayerProgress {
|
||||
#name: string;
|
||||
#thrallTemplate: number;
|
||||
#nImprovements: number;
|
||||
#stats: Record<Stat, number>;
|
||||
#talents: Record<Stat, number>;
|
||||
#isInPenance: boolean;
|
||||
@ -22,6 +23,7 @@ export class PlayerProgress {
|
||||
constructor(asSuccessor: SuccessorOption, withWish: Wish | null) {
|
||||
this.#name = asSuccessor.name;
|
||||
this.#thrallTemplate = asSuccessor.template.id;
|
||||
this.#nImprovements = asSuccessor.nImprovements;
|
||||
this.#stats = { ...asSuccessor.stats };
|
||||
this.#talents = { ...asSuccessor.talents };
|
||||
this.#isInPenance = asSuccessor.inPenance;
|
||||
@ -53,12 +55,16 @@ export class PlayerProgress {
|
||||
return { id: this.#thrallTemplate };
|
||||
}
|
||||
|
||||
get nImprovements(): number {
|
||||
return this.#nImprovements;
|
||||
}
|
||||
|
||||
get isInPenance(): boolean {
|
||||
return this.#isInPenance;
|
||||
}
|
||||
|
||||
refill() {
|
||||
this.#blood = 2000;
|
||||
this.#blood = 1000;
|
||||
|
||||
let learnableSkills = []; // TODO: Also include costing info
|
||||
for (let skill of getSkills()
|
||||
|
@ -122,7 +122,7 @@ class Scorer {
|
||||
vampiricSkills,
|
||||
mortalServants,
|
||||
};
|
||||
let successorOptions = generateSuccessors(0, 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";
|
||||
|
@ -38,16 +38,22 @@ 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,
|
||||
};
|
||||
let data = this.get(skill);
|
||||
|
||||
let governingStatValue = 0;
|
||||
for (let stat of data.governing.stats.values()) {
|
||||
governingStatValue +=
|
||||
getPlayerProgress().getStat(stat) / data.governing.stats.length;
|
||||
getPlayerProgress().getStat(stat) * _STAT_TO_TRIPS[stat] / data.governing.stats.length;
|
||||
}
|
||||
|
||||
if (data.governing.flipped) {
|
||||
governingStatValue = -governingStatValue + 10;
|
||||
governingStatValue = -governingStatValue + 1;
|
||||
}
|
||||
|
||||
let mult = getCostMultiplier(getPlayerProgress().getWish(), skill);
|
||||
@ -94,7 +100,7 @@ function geomInterpolate(
|
||||
return lowOut * Math.pow(highOut / lowOut, proportion);
|
||||
}
|
||||
|
||||
type Difficulty = 0 | 1 | 1.25 | 2 | 3;
|
||||
type Difficulty = -0.25 | -0.125 | 0 | 1 | 1.25 | 2 | 3;
|
||||
type GoverningTemplate = {
|
||||
stats: Stat[];
|
||||
note: string;
|
||||
@ -158,34 +164,46 @@ function governing(
|
||||
let cost: number;
|
||||
let mortalServantValue: number;
|
||||
switch (difficulty) {
|
||||
case -0.25:
|
||||
underTarget = 0.0;
|
||||
target = 3.9;
|
||||
cost = 50;
|
||||
mortalServantValue = 1;
|
||||
break;
|
||||
case -0.125:
|
||||
underTarget = 0.25;
|
||||
target = 4.25;
|
||||
cost = 50;
|
||||
mortalServantValue = 1;
|
||||
break;
|
||||
case 0:
|
||||
underTarget = 5;
|
||||
target = 15;
|
||||
underTarget = 0.5;
|
||||
target = 4.5;
|
||||
cost = 50;
|
||||
mortalServantValue = 1;
|
||||
break;
|
||||
case 1:
|
||||
underTarget = 15;
|
||||
target = 40;
|
||||
cost = 100;
|
||||
underTarget = 4;
|
||||
target = 10;
|
||||
cost = 50;
|
||||
mortalServantValue = 2;
|
||||
break;
|
||||
case 1.25:
|
||||
underTarget = 17;
|
||||
target = 42;
|
||||
cost = 100;
|
||||
underTarget = 5;
|
||||
target = 12;
|
||||
cost = 50;
|
||||
mortalServantValue = 2;
|
||||
break;
|
||||
case 2:
|
||||
underTarget = 30;
|
||||
target = 70;
|
||||
cost = 125;
|
||||
underTarget = 10;
|
||||
target = 18;
|
||||
cost = 75;
|
||||
mortalServantValue = 3;
|
||||
break;
|
||||
case 3:
|
||||
underTarget = 50;
|
||||
target = 100;
|
||||
cost = 150;
|
||||
underTarget = 14;
|
||||
target = 23;
|
||||
cost = 100;
|
||||
mortalServantValue = 10;
|
||||
break;
|
||||
}
|
||||
@ -247,7 +265,7 @@ export let bat3 = table.add({
|
||||
});
|
||||
|
||||
export let stealth0 = table.add({
|
||||
governing: governing("stealth", 0),
|
||||
governing: governing("stealth", -0.25),
|
||||
profile: {
|
||||
name: "Be Quiet",
|
||||
description:
|
||||
@ -284,7 +302,7 @@ export let stealth3 = table.add({
|
||||
});
|
||||
|
||||
export let charm0 = table.add({
|
||||
governing: governing("charm", 0),
|
||||
governing: governing("charm", -0.125),
|
||||
profile: {
|
||||
name: "Flatter",
|
||||
description:
|
||||
|
@ -10,6 +10,7 @@ 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;
|
||||
|
||||
@ -34,6 +35,7 @@ export class StateManager {
|
||||
{
|
||||
name: generateName(),
|
||||
template: choose(photogenicThralls),
|
||||
nImprovements: 0,
|
||||
title: "",
|
||||
note: null,
|
||||
stats: { AGI: 10, INT: 10, CHA: 10, PSI: 10 },
|
||||
|
@ -37,6 +37,7 @@ export function generateSuccessorFromPlayer(): SuccessorOption {
|
||||
let successor = {
|
||||
name: progress.name,
|
||||
template: progress.template,
|
||||
nImprovements: progress.nImprovements - 2,
|
||||
title: "Penitent",
|
||||
note: "Failed at Master's bidding",
|
||||
stats: { ...progress.getStats() },
|
||||
@ -78,8 +79,9 @@ export function generateSuccessor(nImprovements: number): SuccessorOption {
|
||||
talents[choose(ALL_STATS)] += 1;
|
||||
},
|
||||
];
|
||||
let nTotalImprovements = nImprovements + 5;
|
||||
for (let i = 0; i < nTotalImprovements; i++) {
|
||||
let nTotalImprovements = nImprovements;
|
||||
let mult = 1;
|
||||
for (let i = 0; i < nTotalImprovements * mult; i++) {
|
||||
let improvement =
|
||||
improvements[Math.floor(Math.random() * improvements.length)];
|
||||
improvement();
|
||||
@ -91,6 +93,7 @@ export function generateSuccessor(nImprovements: number): SuccessorOption {
|
||||
return {
|
||||
name,
|
||||
template,
|
||||
nImprovements,
|
||||
title,
|
||||
note,
|
||||
stats,
|
||||
|
@ -140,7 +140,7 @@ export let thrallParty = table.add({
|
||||
'"Oh, that? Yeah, I won it." And then lost it, apparently.\n\nHe\'s elated. He will never leave.',
|
||||
rewardMessage: "Garrett showers you with INT!",
|
||||
rewardCallback: (spawn) => {
|
||||
for (let i = 0; i < 30; i++) {
|
||||
for (let i = 0; i < 12; i++) {
|
||||
spawn("INT");
|
||||
}
|
||||
},
|
||||
@ -216,7 +216,7 @@ export let thrallLore = table.add({
|
||||
"Lupin looks at his own reflection -- with interest, confusion, dismissal, and then deep satisfaction. He loves it. He will never leave.",
|
||||
rewardMessage: "Lupin showers you with AGI!",
|
||||
rewardCallback: (spawn) => {
|
||||
for (let i = 0; i < 30; i++) {
|
||||
for (let i = 0; i < 12; i++) {
|
||||
spawn("AGI");
|
||||
}
|
||||
},
|
||||
@ -289,10 +289,10 @@ export let thrallBat = table.add({
|
||||
'Monica salivates. "This is... this is... simply exquisite!"\n\nShe is happy. She will never leave.',
|
||||
rewardMessage: "Monica showers you with CHA and INT!",
|
||||
rewardCallback: (spawn) => {
|
||||
for (let i = 0; i < 15; i++) {
|
||||
for (let i = 0; i < 8; i++) {
|
||||
spawn("CHA");
|
||||
}
|
||||
for (let i = 0; i < 15; i++) {
|
||||
for (let i = 0; i < 4; i++) {
|
||||
spawn("INT");
|
||||
}
|
||||
},
|
||||
@ -365,7 +365,7 @@ export let thrallCharm = table.add({
|
||||
"Renfield inhales sharply and widens his stance, trying to hide his physical reaction to your face. He is elated and will never leave.",
|
||||
rewardMessage: "Renfield showers you with PSI!",
|
||||
rewardCallback: (spawn) => {
|
||||
for (let i = 0; i < 24; i++) {
|
||||
for (let i = 0; i < 12; i++) {
|
||||
spawn("PSI");
|
||||
}
|
||||
},
|
||||
@ -439,10 +439,10 @@ export let thrallStealth = table.add({
|
||||
"\"That? That's not mine.\" But she wants it. Now it's hers. She will never leave.",
|
||||
rewardMessage: "Narthyss showers you with CHA and AGI!",
|
||||
rewardCallback: (spawn) => {
|
||||
for (let i = 0; i < 15; i++) {
|
||||
for (let i = 0; i < 8; i++) {
|
||||
spawn("CHA");
|
||||
}
|
||||
for (let i = 0; i < 15; i++) {
|
||||
for (let i = 0; i < 4; i++) {
|
||||
spawn("AGI");
|
||||
}
|
||||
},
|
||||
@ -516,7 +516,7 @@ export let thrallStare = table.add({
|
||||
"Ridley admires the gear but -- to your surprise -- refuses to jam it into its brain.\n\nThe pup is elated and will never leave.",
|
||||
rewardMessage: "Ridley showers you with EXP!",
|
||||
rewardCallback: (spawn) => {
|
||||
for (let i = 0; i < 10; i++) {
|
||||
for (let i = 0; i < 12; i++) {
|
||||
spawn("EXP");
|
||||
}
|
||||
},
|
||||
|
Loading…
x
Reference in New Issue
Block a user