diff --git a/.eslintrc.json b/.eslintrc.json
index 1ab1085..37be63d 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -2,13 +2,18 @@
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
- "plugin:@typescript-eslint/recommended-requiring-type-checking"
+ "plugin:@typescript-eslint/recommended-requiring-type-checking",
+ "prettier"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {"project": "tsconfig.json"},
- "plugins": ["@typescript-eslint"],
+ "plugins": [
+ "@typescript-eslint",
+ "prettier"
+ ],
"rules": {
"@typescript-eslint/triple-slash-reference": "off",
- "@typescript-eslint/no-unused-vars": "off"
+ "@typescript-eslint/no-unused-vars": "off",
+ "prettier/prettier": "warn"
}
}
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 0000000..544138b
--- /dev/null
+++ b/.prettierrc.json
@@ -0,0 +1,3 @@
+{
+ "singleQuote": true
+}
diff --git a/package-lock.json b/package-lock.json
index 3bab0ed..ec5d00d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,6 +9,9 @@
"@typescript-eslint/parser": "^4.30.0",
"@typescript-eslint/typescript-estree": "^4.30.0",
"eslint": "^7.32.0",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-prettier": "^4.0.0",
+ "prettier": "^2.3.2",
"typescript": "^4.4.2",
"typescript-eslint-language-service": "^4.1.5",
"typescript-language-server": "^0.6.2"
@@ -762,6 +765,39 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/eslint-config-prettier": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
+ "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz",
+ "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.28.0",
+ "prettier": ">=2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
"node_modules/eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -910,6 +946,12 @@
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
+ "node_modules/fast-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
+ },
"node_modules/fast-glob": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
@@ -1483,6 +1525,30 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/prettier": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz",
+ "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
@@ -2561,6 +2627,22 @@
"v8-compile-cache": "^2.0.3"
}
},
+ "eslint-config-prettier": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
+ "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-plugin-prettier": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz",
+ "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==",
+ "dev": true,
+ "requires": {
+ "prettier-linter-helpers": "^1.0.0"
+ }
+ },
"eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -2671,6 +2753,12 @@
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
+ "fast-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
+ },
"fast-glob": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
@@ -3112,6 +3200,21 @@
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true
},
+ "prettier": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz",
+ "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==",
+ "dev": true
+ },
+ "prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "requires": {
+ "fast-diff": "^1.1.2"
+ }
+ },
"progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
diff --git a/package.json b/package.json
index aad4b7a..00fb540 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,9 @@
"@typescript-eslint/parser": "^4.30.0",
"@typescript-eslint/typescript-estree": "^4.30.0",
"eslint": "^7.32.0",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-prettier": "^4.0.0",
+ "prettier": "^2.3.2",
"typescript": "^4.4.2",
"typescript-eslint-language-service": "^4.1.5",
"typescript-language-server": "^0.6.2"
diff --git a/src/logging/ConsoleLogger.ts b/src/logging/ConsoleLogger.ts
index a4da7c3..d08b996 100644
--- a/src/logging/ConsoleLogger.ts
+++ b/src/logging/ConsoleLogger.ts
@@ -1,9 +1,9 @@
class ConsoleLogger implements ILogger {
- public msg (text: string): void {
+ public msg(text: string): void {
console.log(text);
}
- public unsafeMsg (text: string): void {
+ public unsafeMsg(text: string): void {
console.error(text);
}
}
diff --git a/src/logging/DebugLogger.ts b/src/logging/DebugLogger.ts
index 126136e..06b1e60 100644
--- a/src/logging/DebugLogger.ts
+++ b/src/logging/DebugLogger.ts
@@ -1,19 +1,19 @@
class DebugLogger implements ILogger {
private readonly _container: HTMLElement;
- constructor (container: HTMLElement) {
+ constructor(container: HTMLElement) {
this._container = container;
}
- public msg (text: string): void {
+ public msg(text: string): void {
this._doMsg(text, true);
}
- public unsafeMsg (text: string): void {
+ public unsafeMsg(text: string): void {
this._doMsg(text, false);
}
- private _doMsg (text: string, safe: boolean): void {
+ private _doMsg(text: string, safe: boolean): void {
const el = document.createElement('p');
if (safe) {
el.innerText = text;
diff --git a/src/main.ts b/src/main.ts
index c4129ef..7d032d3 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -8,10 +8,10 @@ let globalStartTime = 0;
let globalTimeout: number | null = null;
const cycleLength = 250;
-function gameLoop (state: GameState, renderer: IRenderer): void {
+function gameLoop(state: GameState, renderer: IRenderer): void {
// figure out how much actual time has passed
- const elapsedTime: number = globalStartTime > 0
- ? new Date().getTime() - globalStartTime : 0;
+ const elapsedTime: number =
+ globalStartTime > 0 ? new Date().getTime() - globalStartTime : 0;
state.advance(elapsedTime);
renderer.render(state);
@@ -23,14 +23,15 @@ function gameLoop (state: GameState, renderer: IRenderer): void {
}, cycleLength);
}
-function startGame (state: GameState, renderer: IRenderer): void {
+function startGame(state: GameState, renderer: IRenderer): void {
state.load(); // load saved game if one exists
gameLoop(state, renderer); // start the main loop
}
-function initialRender (state: GameState): void {
+function initialRender(state: GameState): void {
if (state.logger === null) return;
- state.logger.unsafeMsg(`Welcome to irreligio.us! alpha v${versionMajor}.${versionMinor}
+ state.logger
+ .unsafeMsg(`Welcome to irreligio.us! alpha v${versionMajor}.${versionMinor}
The game is still in an active state of development and nowhere near its final form. This is a debugging interface that can show all resources even before they're unlocked, and many factors may be sped up significantly to aid in development. There is a chance that playing it now may spoil aspects of the game for you later when it's closer to being finished.
@@ -63,7 +64,8 @@ The game's source code on Github
});
if (document.readyState !== 'loading') startGame(state, renderer);
- else document.addEventListener('DOMContentLoaded', (): void => {
- startGame(state, renderer);
- });
+ else
+ document.addEventListener('DOMContentLoaded', (): void => {
+ startGame(state, renderer);
+ });
})();
diff --git a/src/model/GameConfig.ts b/src/model/GameConfig.ts
index c844061..110aa9d 100644
--- a/src/model/GameConfig.ts
+++ b/src/model/GameConfig.ts
@@ -79,55 +79,108 @@ class GameConfig {
public cfgTitheAmount = 10;
public cfgTitheCredibilityHitFactor = 3;
- constructor (
- public versionMajor: number,
- public versionMinor: number,
- ) {}
+ constructor(public versionMajor: number, public versionMinor: number) {}
- public generateState (): GameState {
+ public generateState(): GameState {
const state = new GameState(this);
// create player organization
state.addResource(ResourceKey.followers, new Follower());
// create world religions
- state.addResource(ResourceKey.christianity, new Religion(
- 'Christianity', 'christian', 'christians', 'God, Jesus, Bible, churches.',
- (this.cfgReligion.christianity ?? 0) * this.worldPopulation));
+ state.addResource(
+ ResourceKey.christianity,
+ new Religion(
+ 'Christianity',
+ 'christian',
+ 'christians',
+ 'God, Jesus, Bible, churches.',
+ (this.cfgReligion.christianity ?? 0) * this.worldPopulation
+ )
+ );
- state.addResource(ResourceKey.islam, new Religion(
- 'Islam', 'muslim', 'muslims', 'God, Muhammad, Quran, mosques.',
- (this.cfgReligion.islam ?? 0) * this.worldPopulation));
+ state.addResource(
+ ResourceKey.islam,
+ new Religion(
+ 'Islam',
+ 'muslim',
+ 'muslims',
+ 'God, Muhammad, Quran, mosques.',
+ (this.cfgReligion.islam ?? 0) * this.worldPopulation
+ )
+ );
- state.addResource(ResourceKey.hinduism, new Religion(
- 'Hinduism', 'hindu', 'hindus', 'Dogma-free spiritualism.',
- (this.cfgReligion.hinduism ?? 0) * this.worldPopulation));
+ state.addResource(
+ ResourceKey.hinduism,
+ new Religion(
+ 'Hinduism',
+ 'hindu',
+ 'hindus',
+ 'Dogma-free spiritualism.',
+ (this.cfgReligion.hinduism ?? 0) * this.worldPopulation
+ )
+ );
- state.addResource(ResourceKey.buddhism, new Religion(
- 'Buddhism', 'buddhist', 'buddhists', 'The minimization of suffering.',
- (this.cfgReligion.buddhism ?? 0) * this.worldPopulation));
+ state.addResource(
+ ResourceKey.buddhism,
+ new Religion(
+ 'Buddhism',
+ 'buddhist',
+ 'buddhists',
+ 'The minimization of suffering.',
+ (this.cfgReligion.buddhism ?? 0) * this.worldPopulation
+ )
+ );
- state.addResource(ResourceKey.sikhism, new Religion(
- 'Sikhism', 'sikh', 'sikhs', 'Meditation and ten Gurus',
- (this.cfgReligion.sikhism ?? 0) * this.worldPopulation));
+ state.addResource(
+ ResourceKey.sikhism,
+ new Religion(
+ 'Sikhism',
+ 'sikh',
+ 'sikhs',
+ 'Meditation and ten Gurus',
+ (this.cfgReligion.sikhism ?? 0) * this.worldPopulation
+ )
+ );
- state.addResource(ResourceKey.judaism, new Religion(
- 'Judaism', 'jew', 'jews', 'God, Abraham, Torah, synagogues.',
- (this.cfgReligion.judaism ?? 0) * this.worldPopulation));
+ state.addResource(
+ ResourceKey.judaism,
+ new Religion(
+ 'Judaism',
+ 'jew',
+ 'jews',
+ 'God, Abraham, Torah, synagogues.',
+ (this.cfgReligion.judaism ?? 0) * this.worldPopulation
+ )
+ );
- state.addResource(ResourceKey.other, new Religion(
- 'Other', 'person from other faiths', 'people from other faiths', 'A variety of belief systems.',
- (this.cfgReligion.other ?? 0) * this.worldPopulation));
+ state.addResource(
+ ResourceKey.other,
+ new Religion(
+ 'Other',
+ 'person from other faiths',
+ 'people from other faiths',
+ 'A variety of belief systems.',
+ (this.cfgReligion.other ?? 0) * this.worldPopulation
+ )
+ );
- state.addResource(ResourceKey.atheism, new Religion(
- 'Non-Religious', 'atheist', 'atheists', 'Atheists and agnostics.',
- (this.cfgReligion.atheism ?? 0) * this.worldPopulation));
+ state.addResource(
+ ResourceKey.atheism,
+ new Religion(
+ 'Non-Religious',
+ 'atheist',
+ 'atheists',
+ 'Atheists and agnostics.',
+ (this.cfgReligion.atheism ?? 0) * this.worldPopulation
+ )
+ );
// add jobs
state.addResource(ResourceKey.pastors, new Pastor());
// add resources
- state.addResource(ResourceKey.money, new Money(3.50));
+ state.addResource(ResourceKey.money, new Money(3.5));
state.addResource(ResourceKey.cryptoCurrency, new CryptoCurrency(this));
state.addResource(ResourceKey.tents, new Tent(this));
state.addResource(ResourceKey.houses, new House(this));
diff --git a/src/model/GameState.ts b/src/model/GameState.ts
index 0d37912..1118ae3 100644
--- a/src/model/GameState.ts
+++ b/src/model/GameState.ts
@@ -11,27 +11,27 @@ class GameState {
private _timeSinceSave = 0;
private readonly _timeBetweenSaves = 10000;
- private _resources: { [key in ResourceKey]?: IResource } = { };
+ private _resources: { [key in ResourceKey]?: IResource } = {};
private readonly _resourceKeys: ResourceKey[] = [];
- constructor (config: GameConfig) {
+ constructor(config: GameConfig) {
this.config = config;
}
- public get resource (): { [key in ResourceKey]?: IResource } {
+ public get resource(): { [key in ResourceKey]?: IResource } {
return this._resources;
}
- public get resources (): ResourceKey[] {
+ public get resources(): ResourceKey[] {
return this._resourceKeys;
}
- public addResource (key: ResourceKey, resource: IResource): void {
+ public addResource(key: ResourceKey, resource: IResource): void {
this._resourceKeys.push(key);
this._resources[key] = resource;
}
- public advance (time: number): void {
+ public advance(time: number): void {
this.now = new Date().getTime();
this._timeSinceSave += time;
@@ -54,9 +54,11 @@ class GameState {
const resource = this._resources[rkey];
if (resource === undefined || !resource.isUnlocked(this)) continue;
- if (resource.inc !== undefined && (resource.max === undefined
- || resource.value < resource.max(this))) {
- resource.addValue(resource.inc(this) * time / 1000, this);
+ if (
+ resource.inc !== undefined &&
+ (resource.max === undefined || resource.value < resource.max(this))
+ ) {
+ resource.addValue((resource.inc(this) * time) / 1000, this);
}
if (resource.max !== undefined && resource.value > resource.max(this)) {
@@ -68,11 +70,15 @@ class GameState {
}
}
- public performAction (resourceKey: ResourceKey, actionIndex: number): void {
+ public performAction(resourceKey: ResourceKey, actionIndex: number): void {
const resource = this._resources[resourceKey];
- if (resource === undefined || resource.userActions === undefined
- || actionIndex > resource.userActions.length
- || !resource.isUnlocked(this)) return;
+ if (
+ resource === undefined ||
+ resource.userActions === undefined ||
+ actionIndex > resource.userActions.length ||
+ !resource.isUnlocked(this)
+ )
+ return;
const action = resource.userActions[actionIndex];
@@ -82,7 +88,7 @@ class GameState {
}
}
- public deductCost (cost: ResourceNumber | null): boolean {
+ public deductCost(cost: ResourceNumber | null): boolean {
if (cost === null) return true;
if (!this.isPurchasable(cost)) return false;
for (const key in cost) {
@@ -95,7 +101,7 @@ class GameState {
return true;
}
- public isPurchasable (cost?: ResourceNumber): boolean {
+ public isPurchasable(cost?: ResourceNumber): boolean {
if (cost === undefined) return true;
for (const key in cost) {
const rkey = key;
@@ -106,13 +112,13 @@ class GameState {
return true;
}
- public log (text: string): void {
+ public log(text: string): void {
if (this.logger !== null) {
this.logger.msg(text);
}
}
- public save (): void {
+ public save(): void {
const saveObj: SaveData = {
version: {
maj: this.config.versionMajor,
@@ -137,7 +143,7 @@ class GameState {
localStorage.setItem('savegame', saveStr);
}
- public load (): void {
+ public load(): void {
const saveStr: string | null = localStorage.getItem('savegame');
if (saveStr !== null) {
try {
@@ -153,8 +159,10 @@ class GameState {
resource.value = saveRes.value;
// @ts-expect-error writing read-only cost from save data
resource.cost = saveRes.cost;
- if (saveRes.config !== undefined
- && resource.restoreConfig !== undefined) {
+ if (
+ saveRes.config !== undefined &&
+ resource.restoreConfig !== undefined
+ ) {
resource.restoreConfig(saveRes.config);
}
}
@@ -172,7 +180,7 @@ class GameState {
}
}
- public reset (): void {
+ public reset(): void {
const newState: GameState = this.config.generateState();
localStorage.clear();
this._resources = newState._resources;
diff --git a/src/model/Utils.ts b/src/model/Utils.ts
index a50dbec..3ac5d80 100644
--- a/src/model/Utils.ts
+++ b/src/model/Utils.ts
@@ -1,7 +1,7 @@
const numberFormatDigits = 1;
-function formatNumber (num: number): string {
- type UnitLookup = { value: number, symbol: string };
+function formatNumber(num: number): string {
+ type UnitLookup = { value: number; symbol: string };
const lookup: UnitLookup[] = [
{ value: 1, symbol: '' },
{ value: 1e3, symbol: 'K' },
@@ -17,7 +17,7 @@ function formatNumber (num: number): string {
if (num >= item.value) break;
}
return item !== undefined
- ? (num / item.value).toFixed(
- numberFormatDigits).replace(rx, '$1') + item.symbol
+ ? (num / item.value).toFixed(numberFormatDigits).replace(rx, '$1') +
+ item.symbol
: num.toFixed(numberFormatDigits).replace(rx, '$1');
}
diff --git a/src/model/resource/BuildingPermit.ts b/src/model/resource/BuildingPermit.ts
index f7e268d..620cf42 100644
--- a/src/model/resource/BuildingPermit.ts
+++ b/src/model/resource/BuildingPermit.ts
@@ -1,16 +1,17 @@
///
class BuildingPermit extends Research {
- constructor (config: GameConfig) {
+ constructor(config: GameConfig) {
super(
'Building Permit',
'building permit',
'building permits',
- 'Unlocks several new buildings you can build outside of your compounds.');
- this.cost.money = config.cfgInitialMax.buildingPermit;
+ 'Unlocks several new buildings you can build outside of your compounds.'
+ );
+ this.cost.money = config.cfgInitialCost.buildingPermit;
}
- public isUnlocked (state: GameState): boolean {
+ public isUnlocked(state: GameState): boolean {
if (this._isUnlocked) return true;
const compounds = state.resource.compounds;
if (compounds !== undefined && compounds.value > 0) {
diff --git a/src/model/resource/Church.ts b/src/model/resource/Church.ts
index 948cd06..24986ae 100644
--- a/src/model/resource/Church.ts
+++ b/src/model/resource/Church.ts
@@ -1,21 +1,24 @@
///
class Church extends Infrastructure {
- constructor (config: GameConfig) {
+ constructor(config: GameConfig) {
super(
'Churches',
'church',
'churches',
- `Preaching grounds for ${formatNumber(config.cfgCapacity.churches?.pastors ?? 0)} pastors.`);
+ `Preaching grounds for ${formatNumber(
+ config.cfgCapacity.churches?.pastors ?? 0
+ )} pastors.`
+ );
this.cost.money = config.cfgInitialCost.churches;
this._costMultiplier.money = config.cfgCostMultiplier.churches;
}
public max: (state: GameState) => number = (state) =>
- (state.resource.compounds?.value ?? 0)
- * (state.config.cfgCapacity.compounds?.churches ?? 0);
+ (state.resource.compounds?.value ?? 0) *
+ (state.config.cfgCapacity.compounds?.churches ?? 0);
- public isUnlocked (state: GameState): boolean {
+ public isUnlocked(state: GameState): boolean {
if (this._isUnlocked) return true;
const compounds = state.resource.compounds;
if (compounds !== undefined && compounds.value > 0) {
diff --git a/src/model/resource/Compound.ts b/src/model/resource/Compound.ts
index 89bc73a..8310f4d 100644
--- a/src/model/resource/Compound.ts
+++ b/src/model/resource/Compound.ts
@@ -1,21 +1,24 @@
///
class Compound extends Infrastructure {
- constructor (config: GameConfig) {
+ constructor(config: GameConfig) {
super(
'Compounds',
'compound',
'compounds',
- 'Provides space for tents, houses, and churches and a place to hide more money.');
+ 'Provides space for tents, houses, and churches and a place to hide more money.'
+ );
this.cost.money = config.cfgInitialCost.compounds;
this._costMultiplier.money = config.cfgCostMultiplier.compounds;
}
- public isUnlocked (state: GameState): boolean {
+ public isUnlocked(state: GameState): boolean {
if (this._isUnlocked) return true;
const tents = state.resource.tents;
- if (tents !== undefined
- && tents.value >= (state.config.cfgInitialMax.tents ?? 0)) {
+ if (
+ tents !== undefined &&
+ tents.value >= (state.config.cfgInitialMax.tents ?? 0)
+ ) {
this._isUnlocked = true;
}
return this._isUnlocked;
diff --git a/src/model/resource/Credibility.ts b/src/model/resource/Credibility.ts
index 3212528..0af14e3 100644
--- a/src/model/resource/Credibility.ts
+++ b/src/model/resource/Credibility.ts
@@ -1,12 +1,13 @@
///
class Credibility extends Passive {
- constructor (config: GameConfig) {
+ constructor(config: GameConfig) {
super(
'Credibility',
'credibility',
'credibilities',
- 'Affects your ability to recruit and retain followers.');
+ 'Affects your ability to recruit and retain followers.'
+ );
this.value = config.cfgPassiveMax;
}
diff --git a/src/model/resource/CryptoCurrency.ts b/src/model/resource/CryptoCurrency.ts
index f50d5c6..4eb2496 100644
--- a/src/model/resource/CryptoCurrency.ts
+++ b/src/model/resource/CryptoCurrency.ts
@@ -1,12 +1,13 @@
///
class CryptoCurrency extends Purchasable {
- constructor (config: GameConfig) {
+ constructor(config: GameConfig) {
super(
'FaithCoin',
'faithcoin',
'faithcoins',
- "A crypto coin that can't be spent directly, but provides a steady stream of passive income.");
+ "A crypto coin that can't be spent directly, but provides a steady stream of passive income."
+ );
this.cost.money = config.cfgInitialCost.cryptoCurrency;
this._costMultiplier.money = config.cfgCostMultiplier.cryptoCurrency;
this.valueInWholeNumbers = false;
diff --git a/src/model/resource/Follower.ts b/src/model/resource/Follower.ts
index f774eca..3d3dc26 100644
--- a/src/model/resource/Follower.ts
+++ b/src/model/resource/Follower.ts
@@ -22,19 +22,21 @@ class Follower implements IResource {
private _timeSinceLastLost = 0;
private _lastRecruitmentLog = 0;
- private _followerSources: ResourceNumber = { };
- private _followerDests: ResourceNumber = { };
+ private _followerSources: ResourceNumber = {};
+ private _followerDests: ResourceNumber = {};
- public max (state: GameState): number {
+ public max(state: GameState): number {
let max = state.config.cfgInitialMax.followers ?? 0;
- max += (state.resource.tents?.value ?? 0)
- * (state.config.cfgCapacity.tents?.followers ?? 0);
- max += (state.resource.houses?.value ?? 0)
- * (state.config.cfgCapacity.houses?.followers ?? 0);
+ max +=
+ (state.resource.tents?.value ?? 0) *
+ (state.config.cfgCapacity.tents?.followers ?? 0);
+ max +=
+ (state.resource.houses?.value ?? 0) *
+ (state.config.cfgCapacity.houses?.followers ?? 0);
return max;
}
- public inc (state: GameState): number {
+ public inc(state: GameState): number {
let inc = 0;
// pastor recruiting
@@ -48,7 +50,7 @@ class Follower implements IResource {
return inc;
}
- public addValue (amount: number, state: GameState): void {
+ public addValue(amount: number, state: GameState): void {
const oldValue = this.value;
this.value += amount;
const diff = Math.floor(this.value) - Math.floor(oldValue);
@@ -76,23 +78,24 @@ class Follower implements IResource {
}
}
- public isUnlocked (_state: GameState): boolean {
+ public isUnlocked(_state: GameState): boolean {
return true;
}
- public advanceAction (time: number, state: GameState): void {
+ public advanceAction(time: number, state: GameState): void {
// chance to lose some followers every 10s if credibility < 100%
this._timeSinceLastLost += time;
if (this._timeSinceLastLost > state.config.cfgCredibilityFollowerLossTime) {
if (this.value > 0) {
const creds = state.resource.credibility;
if (creds?.max !== undefined) {
- const ratio =
- Math.ceil(creds.value) / creds.max(state);
+ const ratio = Math.ceil(creds.value) / creds.max(state);
if (Math.random() > ratio) {
- const lost = Math.ceil(this.value
- * state.config.cfgCredibilityFollowerLossRatio
- * (1 - ratio));
+ const lost = Math.ceil(
+ this.value *
+ state.config.cfgCredibilityFollowerLossRatio *
+ (1 - ratio)
+ );
this.addValue(lost * -1, state);
}
}
@@ -101,10 +104,12 @@ class Follower implements IResource {
}
// log lost and gained followers every 10s
- if (state.now
- - this._lastRecruitmentLog > state.config.cfgFollowerGainLossLogTimer
- && (Object.keys(this._followerSources).length > 0
- || Object.keys(this._followerDests).length > 0)) {
+ if (
+ state.now - this._lastRecruitmentLog >
+ state.config.cfgFollowerGainLossLogTimer &&
+ (Object.keys(this._followerSources).length > 0 ||
+ Object.keys(this._followerDests).length > 0)
+ ) {
if (Object.keys(this._followerDests).length > 0) {
let msg = '';
let total = 0;
@@ -114,12 +119,18 @@ class Follower implements IResource {
const followers = this._followerDests[rkey];
if (religion !== undefined && followers !== undefined) {
if (msg !== '') msg += ', ';
- msg += `${formatNumber(followers)} ${followers > 1 ? religion.pluralName : religion.singularName}`;
+ msg += `${formatNumber(followers)} ${
+ followers > 1 ? religion.pluralName : religion.singularName
+ }`;
total += followers;
delete this._followerDests[rkey];
}
}
- state.log(`You lost ${formatNumber(total)} ${total > 1 ? this.pluralName : this.singularName}: ${msg}`);
+ state.log(
+ `You lost ${formatNumber(total)} ${
+ total > 1 ? this.pluralName : this.singularName
+ }: ${msg}`
+ );
}
if (Object.keys(this._followerSources).length > 0) {
let msg = '';
@@ -130,19 +141,24 @@ class Follower implements IResource {
const followers = this._followerSources[rkey];
if (religion !== undefined && followers !== undefined) {
if (msg !== '') msg += ', ';
- msg +=
- `${formatNumber(followers)} ${followers > 1 ? religion.pluralName : religion.singularName}`;
+ msg += `${formatNumber(followers)} ${
+ followers > 1 ? religion.pluralName : religion.singularName
+ }`;
total += followers;
delete this._followerSources[rkey];
}
}
- state.log(`You gained ${formatNumber(total)} ${total > 1 ? this.pluralName : this.singularName}: ${msg}`);
+ state.log(
+ `You gained ${formatNumber(total)} ${
+ total > 1 ? this.pluralName : this.singularName
+ }: ${msg}`
+ );
}
this._lastRecruitmentLog = state.now;
}
}
- private _recruitFollower (state: GameState): void {
+ private _recruitFollower(state: GameState): void {
// don't exceed max
if (this.value >= this.max(state)) {
state.log('You have no room for more followers.');
@@ -163,11 +179,19 @@ class Follower implements IResource {
this.addValue(1, state);
}
- private _getRandomReligion (
- state: GameState): [ResourceKey, IResource] | null {
- const religs = [ResourceKey.christianity, ResourceKey.islam,
- ResourceKey.hinduism, ResourceKey.buddhism, ResourceKey.sikhism,
- ResourceKey.judaism, ResourceKey.other, ResourceKey.atheism];
+ private _getRandomReligion(
+ state: GameState
+ ): [ResourceKey, IResource] | null {
+ const religs = [
+ ResourceKey.christianity,
+ ResourceKey.islam,
+ ResourceKey.hinduism,
+ ResourceKey.buddhism,
+ ResourceKey.sikhism,
+ ResourceKey.judaism,
+ ResourceKey.other,
+ ResourceKey.atheism,
+ ];
const source = religs[Math.floor(Math.random() * 8)];
const resource = state.resource[source];
return resource !== undefined ? [source, resource] : null;
diff --git a/src/model/resource/House.ts b/src/model/resource/House.ts
index 5561b59..1797a3d 100644
--- a/src/model/resource/House.ts
+++ b/src/model/resource/House.ts
@@ -1,21 +1,24 @@
///
class House extends Infrastructure {
- constructor (config: GameConfig) {
+ constructor(config: GameConfig) {
super(
'Houses',
'house',
'houses',
- `Provides room to house ${formatNumber(config.cfgCapacity.houses?.followers ?? 0)} followers.`);
+ `Provides room to house ${formatNumber(
+ config.cfgCapacity.houses?.followers ?? 0
+ )} followers.`
+ );
this.cost.money = config.cfgInitialCost.houses;
this._costMultiplier.money = config.cfgCostMultiplier.houses;
}
public max: (state: GameState) => number = (state) =>
- (state.resource.compounds?.value ?? 0)
- * (state.config.cfgCapacity.compounds?.houses ?? 0);
+ (state.resource.compounds?.value ?? 0) *
+ (state.config.cfgCapacity.compounds?.houses ?? 0);
- public isUnlocked (state: GameState): boolean {
+ public isUnlocked(state: GameState): boolean {
if (this._isUnlocked) return true;
const compounds = state.resource.compounds;
if (compounds !== undefined && compounds.value > 0) {
diff --git a/src/model/resource/IResource.ts b/src/model/resource/IResource.ts
index 0f02949..e9b7bbb 100644
--- a/src/model/resource/IResource.ts
+++ b/src/model/resource/IResource.ts
@@ -20,6 +20,7 @@ interface IResource {
isUnlocked: (state: GameState) => boolean;
emitConfig?: () => { [key: string]: string | number | boolean };
- restoreConfig?: (
- config: { [key: string]: string | number | boolean }) => void;
+ restoreConfig?: (config: {
+ [key: string]: string | number | boolean;
+ }) => void;
}
diff --git a/src/model/resource/Job.ts b/src/model/resource/Job.ts
index 250ce80..ad812c3 100644
--- a/src/model/resource/Job.ts
+++ b/src/model/resource/Job.ts
@@ -4,7 +4,7 @@ abstract class Job implements IResource {
public readonly resourceType = ResourceType.job;
public readonly valueInWholeNumbers = true;
public value = 0;
- public readonly cost: ResourceNumber = { };
+ public readonly cost: ResourceNumber = {};
public max?: (state: GameState) => number = undefined;
public inc?: (state: GameState) => number = undefined;
@@ -14,8 +14,8 @@ abstract class Job implements IResource {
name: 'Hire',
description: 'Promote one of your followers.',
isEnabled: (state: GameState): boolean =>
- (this.max === undefined || this.value < this.max(state))
- && this._availableJobs(state) > 0,
+ (this.max === undefined || this.value < this.max(state)) &&
+ this._availableJobs(state) > 0,
performAction: (state: GameState): void => {
this._promoteFollower(state);
},
@@ -30,26 +30,26 @@ abstract class Job implements IResource {
},
];
- protected _costMultiplier: { [key in ResourceKey]?: number } = { };
+ protected _costMultiplier: { [key in ResourceKey]?: number } = {};
protected _isUnlocked = false;
- constructor (
+ constructor(
public readonly label: string,
public readonly singularName: string,
public readonly pluralName: string,
public readonly description: string
- ) { }
+ ) {}
- public addValue (amount: number): void {
+ public addValue(amount: number): void {
this.value += amount;
if (this.value < 0) this.value = 0;
}
- public isUnlocked (_state: GameState): boolean {
+ public isUnlocked(_state: GameState): boolean {
return this._isUnlocked;
}
- public advanceAction (_time: number, state: GameState): void {
+ public advanceAction(_time: number, state: GameState): void {
// if we're out of followers then the jobs also vacate
const avail = this._availableJobs(state);
if (avail < 0 && this.value > 0) {
@@ -58,42 +58,49 @@ abstract class Job implements IResource {
return;
}
- protected _availableJobs (state: GameState): number {
+ protected _availableJobs(state: GameState): number {
// number of followers minus the number of filled jobs
const followers = state.resource.followers?.value ?? 0;
const hired = state.resources.reduce(
(tot: number, rkey: ResourceKey): number => {
const res = state.resource[rkey];
- return res?.resourceType === ResourceType.job
- ? tot + res.value
- : tot;
- }, 0);
+ return res?.resourceType === ResourceType.job ? tot + res.value : tot;
+ },
+ 0
+ );
return followers - hired;
}
- protected _totalPayroll (state: GameState): number {
+ protected _totalPayroll(state: GameState): number {
// number of followers minus the number of filled jobs
const followers = state.resource.followers?.value ?? 0;
const hired = state.resources.reduce(
(tot: number, rkey: ResourceKey): number => {
const res = state.resource[rkey];
- return res?.resourceType === ResourceType.job
- ? tot + res.value
- : tot;
- }, 0);
+ return res?.resourceType === ResourceType.job ? tot + res.value : tot;
+ },
+ 0
+ );
return followers - hired;
}
- protected _hireLog (amount: number, _state: GameState): string {
+ protected _hireLog(amount: number, _state: GameState): string {
return amount > 0
- ? `You hired ${amount} ${amount > 1 ? this.pluralName : this.singularName}.`
- : `You fired ${amount * -1} ${amount * -1 > 1 ? this.pluralName : this.singularName}.`;
+ ? `You hired ${amount} ${
+ amount > 1 ? this.pluralName : this.singularName
+ }.`
+ : `You fired ${amount * -1} ${
+ amount * -1 > 1 ? this.pluralName : this.singularName
+ }.`;
}
- private _promoteFollower (state: GameState): void {
+ private _promoteFollower(state: GameState): void {
if (this._availableJobs(state) <= 0) return;
- if (this.max !== undefined && this.value < this.max(state)
- && state.deductCost(this.cost)) {
+ if (
+ this.max !== undefined &&
+ this.value < this.max(state) &&
+ state.deductCost(this.cost)
+ ) {
this.addValue(1);
state.log(this._hireLog(1, state));
for (const key in this._costMultiplier) {
@@ -104,7 +111,7 @@ abstract class Job implements IResource {
}
}
- private _demoteFollower (state: GameState): void {
+ private _demoteFollower(state: GameState): void {
if (this.value <= 0) return;
this.addValue(-1);
state.log(this._hireLog(-1, state));
diff --git a/src/model/resource/Megachurch.ts b/src/model/resource/Megachurch.ts
index 34ffdb4..0cf9c9d 100644
--- a/src/model/resource/Megachurch.ts
+++ b/src/model/resource/Megachurch.ts
@@ -1,12 +1,15 @@
///
class Megachurch extends Infrastructure {
- constructor (config: GameConfig) {
+ constructor(config: GameConfig) {
super(
'Megachurches',
'megachurch',
'megachurches',
- `Room for ${formatNumber(config.cfgCapacity.megaChurches?.pastors ?? 0)} pastors`);
+ `Room for ${formatNumber(
+ config.cfgCapacity.megaChurches?.pastors ?? 0
+ )} pastors`
+ );
this.cost.money = config.cfgInitialCost.megaChurches;
this._costMultiplier.money = config.cfgCostMultiplier.megaChurches;
}
@@ -14,7 +17,7 @@ class Megachurch extends Infrastructure {
public max: (state: GameState) => number = (state) =>
state.config.cfgInitialMax.megaChurches ?? 0;
- public isUnlocked (state: GameState): boolean {
+ public isUnlocked(state: GameState): boolean {
if (this._isUnlocked) return true;
const permit = state.resource.buildingPermit;
if (permit !== undefined && permit.value > 0) {
diff --git a/src/model/resource/Money.ts b/src/model/resource/Money.ts
index 674ff26..11087e0 100644
--- a/src/model/resource/Money.ts
+++ b/src/model/resource/Money.ts
@@ -13,8 +13,8 @@ class Money implements IResource {
name: 'Collect Tithes',
description: 'Voluntary contributions from followers.',
isEnabled: (state: GameState): boolean =>
- this.value < this.max(state)
- && (state.resource.followers?.value ?? 0) >= 1,
+ this.value < this.max(state) &&
+ (state.resource.followers?.value ?? 0) >= 1,
performAction: (state: GameState): void => {
this._collectTithes(state);
},
@@ -23,20 +23,19 @@ class Money implements IResource {
private _lastCollectionTime = 0;
- constructor (
- public value: number
- ) {}
+ constructor(public value: number) {}
public isUnlocked = (_state: GameState): boolean => true;
- public addValue (amount: number, _state: GameState): void {
+ public addValue(amount: number, _state: GameState): void {
this.value += amount;
}
public max: (state: GameState) => number = (state: GameState) => {
let max = state.config.cfgInitialMax.money ?? 0;
- max += (state.resource.compounds?.value ?? 0)
- * (state.config.cfgCapacity.compounds?.money ?? 0);
+ max +=
+ (state.resource.compounds?.value ?? 0) *
+ (state.config.cfgCapacity.compounds?.money ?? 0);
return max;
};
@@ -44,17 +43,19 @@ class Money implements IResource {
let inc = 0;
// crypto currency
- inc += (state.resource.cryptoCurrency?.value ?? 0)
- * state.config.cfgCryptoReturnAmount;
+ inc +=
+ (state.resource.cryptoCurrency?.value ?? 0) *
+ state.config.cfgCryptoReturnAmount;
// salaries
- inc -= (state.resource.pastors?.value ?? 0)
- * (state.config.cfgSalary.pastors ?? 0);
+ inc -=
+ (state.resource.pastors?.value ?? 0) *
+ (state.config.cfgSalary.pastors ?? 0);
return inc;
};
- protected _collectTithes (state: GameState): void {
+ protected _collectTithes(state: GameState): void {
if (this.value >= this.max(state)) return;
const followers = state.resource.followers?.value ?? 0;
@@ -63,8 +64,10 @@ class Money implements IResource {
// collecting too frequently hurts credibility
const diff = state.now - this._lastCollectionTime;
if (diff < state.config.cfgTimeBetweenTithes) {
- const lost = state.config.cfgTimeBetweenTithes
- / diff / state.config.cfgTitheCredibilityHitFactor;
+ const lost =
+ state.config.cfgTimeBetweenTithes /
+ diff /
+ state.config.cfgTitheCredibilityHitFactor;
state.resource.credibility?.addValue(lost * -1, state);
}
@@ -77,10 +80,14 @@ class Money implements IResource {
}
}
- protected _purchaseLog (amount: number, state: GameState): string {
+ protected _purchaseLog(amount: number, state: GameState): string {
const followers = state.resource.followers;
if (followers !== undefined) {
- return `You collected $${formatNumber(amount)} from ${formatNumber(followers.value)} ${followers.value > 1 ? followers.pluralName : followers.singularName}.`;
+ return `You collected $${formatNumber(amount)} from ${formatNumber(
+ followers.value
+ )} ${
+ followers.value > 1 ? followers.pluralName : followers.singularName
+ }.`;
}
return `You collected $${formatNumber(amount)} in tithings.`;
}
diff --git a/src/model/resource/Passive.ts b/src/model/resource/Passive.ts
index 5d4d1c9..60391e5 100644
--- a/src/model/resource/Passive.ts
+++ b/src/model/resource/Passive.ts
@@ -7,20 +7,18 @@ abstract class Passive implements IResource {
public advanceAction?: (time: number, state: GameState) => void = undefined;
- constructor (
+ constructor(
public readonly label: string,
public readonly singularName: string,
public readonly pluralName: string,
public readonly description: string
- ) { }
+ ) {}
-
- public addValue (amount: number, _state: GameState): void {
+ public addValue(amount: number, _state: GameState): void {
this.value += amount;
}
- public isUnlocked (_state: GameState): boolean {
+ public isUnlocked(_state: GameState): boolean {
return true;
}
-
}
diff --git a/src/model/resource/Pastor.ts b/src/model/resource/Pastor.ts
index 6178c66..0267d3c 100644
--- a/src/model/resource/Pastor.ts
+++ b/src/model/resource/Pastor.ts
@@ -3,46 +3,58 @@
class Pastor extends Job {
private _timeSinceLastTithe = 0;
- constructor () {
+ constructor() {
super(
'Pastors',
'pastor',
'pastors',
- 'Collect tithings for you and recruit new members from other faiths automatically.');
+ 'Collect tithings for you and recruit new members from other faiths automatically.'
+ );
}
public max: (state: GameState) => number = (state) => {
- let max = (state.resource.churches?.value ?? 0)
- * (state.config.cfgCapacity.churches?.pastors ?? 0);
- max += (state.resource.megaChurches?.value ?? 0)
- * (state.config.cfgCapacity.megaChurches?.pastors ?? 0);
+ let max =
+ (state.resource.churches?.value ?? 0) *
+ (state.config.cfgCapacity.churches?.pastors ?? 0);
+ max +=
+ (state.resource.megaChurches?.value ?? 0) *
+ (state.config.cfgCapacity.megaChurches?.pastors ?? 0);
return max;
};
- public isUnlocked (state: GameState): boolean {
+ public isUnlocked(state: GameState): boolean {
if (this._isUnlocked) return true;
this._isUnlocked = state.resource.churches?.isUnlocked(state) === true;
return this._isUnlocked;
}
- public advanceAction (time: number, state: GameState): void {
+ public advanceAction(time: number, state: GameState): void {
super.advanceAction(time, state);
this._timeSinceLastTithe += time;
if (this._timeSinceLastTithe >= state.config.cfgTimeBetweenTithes) {
const money = state.resource.money;
const followers = state.resource.followers;
- let tithed = Math.floor(this.value
- * state.config.cfgPastorTitheCollectionFollowerMax);
+ let tithed = Math.floor(
+ this.value * state.config.cfgPastorTitheCollectionFollowerMax
+ );
if (Math.floor(followers?.value ?? 0) < tithed)
tithed = Math.floor(followers?.value ?? 0);
let collected = tithed * state.config.cfgTitheAmount;
- if (money?.max !== undefined
- && collected > money.max(state) - money.value)
+ if (
+ money?.max !== undefined &&
+ collected > money.max(state) - money.value
+ )
collected = money.max(state) - money.value;
if (collected > 0) {
money?.addValue(collected, state);
if (followers !== undefined) {
- state.log(`Your pastors collected $${formatNumber(collected)} in tithings from ${formatNumber(tithed)} ${tithed > 1 ? followers.pluralName : followers.singularName}.`);
+ state.log(
+ `Your pastors collected $${formatNumber(
+ collected
+ )} in tithings from ${formatNumber(tithed)} ${
+ tithed > 1 ? followers.pluralName : followers.singularName
+ }.`
+ );
}
}
this._timeSinceLastTithe = 0;
diff --git a/src/model/resource/Purchasable.ts b/src/model/resource/Purchasable.ts
index 58b1de2..f83b0bc 100644
--- a/src/model/resource/Purchasable.ts
+++ b/src/model/resource/Purchasable.ts
@@ -4,7 +4,7 @@ abstract class Purchasable implements IResource {
public readonly resourceType: ResourceType = ResourceType.consumable;
public valueInWholeNumbers = true;
public value = 0;
- public readonly cost: ResourceNumber = { };
+ public readonly cost: ResourceNumber = {};
public inc?: (state: GameState) => number = undefined;
public max?: (_state: GameState) => number = undefined;
@@ -14,46 +14,48 @@ abstract class Purchasable implements IResource {
name: this._purchaseButtonText,
description: this._purchaseDescription,
isEnabled: (state: GameState): boolean =>
- (this.max === undefined || this.value < this.max(state))
- && state.isPurchasable(this.cost),
+ (this.max === undefined || this.value < this.max(state)) &&
+ state.isPurchasable(this.cost),
performAction: (state: GameState): void => {
this._purchase(state);
},
},
];
- protected _costMultiplier: ResourceNumber = { };
+ protected _costMultiplier: ResourceNumber = {};
protected _isUnlocked = false;
- constructor (
+ constructor(
public readonly label: string,
public readonly singularName: string,
public readonly pluralName: string,
public readonly description: string,
private readonly _purchaseButtonText: string = 'Purchase',
- private readonly _purchaseDescription: string = `Buy a ${singularName}.`,
- ) { }
+ private readonly _purchaseDescription: string = `Buy a ${singularName}.`
+ ) {}
- public addValue (amount: number, _state: GameState): void {
+ public addValue(amount: number, _state: GameState): void {
this.value += amount;
}
- public isUnlocked (state: GameState): boolean {
+ public isUnlocked(state: GameState): boolean {
if (!this._isUnlocked && state.isPurchasable(this.cost)) {
this._isUnlocked = true;
}
return this._isUnlocked;
}
- public advanceAction (_time: number, _state: GameState): void {
+ public advanceAction(_time: number, _state: GameState): void {
return;
}
- protected _purchaseLog (amount: number, _state: GameState): string {
- return `You purchased ${amount} ${amount > 1 ? this.pluralName : this.singularName}.`;
+ protected _purchaseLog(amount: number, _state: GameState): string {
+ return `You purchased ${amount} ${
+ amount > 1 ? this.pluralName : this.singularName
+ }.`;
}
- private _purchase (state: GameState): void {
+ private _purchase(state: GameState): void {
if (this.max !== undefined && this.value >= this.max(state)) return;
if (state.deductCost(this.cost)) {
this.value += 1;
diff --git a/src/model/resource/Religion.ts b/src/model/resource/Religion.ts
index b7e6dee..d42bc9e 100644
--- a/src/model/resource/Religion.ts
+++ b/src/model/resource/Religion.ts
@@ -4,19 +4,19 @@ class Religion implements IResource {
public readonly resourceType = ResourceType.religion;
public readonly valueInWholeNumbers = true;
- constructor (
+ constructor(
public readonly label: string,
public readonly singularName: string,
public readonly pluralName: string,
public readonly description: string,
- public value: number,
- ) { }
+ public value: number
+ ) {}
- public addValue (amount: number, _state: GameState): void {
+ public addValue(amount: number, _state: GameState): void {
this.value += amount;
}
- public isUnlocked (_state: GameState): boolean {
+ public isUnlocked(_state: GameState): boolean {
return true;
}
}
diff --git a/src/model/resource/Research.ts b/src/model/resource/Research.ts
index f68c4f1..88a1f9a 100644
--- a/src/model/resource/Research.ts
+++ b/src/model/resource/Research.ts
@@ -4,7 +4,7 @@ abstract class Research extends Purchasable {
public readonly resourceType = ResourceType.research;
public inc = undefined;
- constructor (
+ constructor(
public readonly label: string,
public readonly singularName: string,
public readonly pluralName: string,
@@ -16,7 +16,8 @@ abstract class Research extends Purchasable {
pluralName,
description,
'Learn',
- 'Complete this research.');
+ 'Complete this research.'
+ );
this.value = 0;
}
diff --git a/src/model/resource/SharedTypes.ts b/src/model/resource/SharedTypes.ts
index 01e73db..0484f80 100644
--- a/src/model/resource/SharedTypes.ts
+++ b/src/model/resource/SharedTypes.ts
@@ -47,6 +47,6 @@ type ResourceConfig = {
};
type SaveData = {
- version: { maj: number, min: number };
+ version: { maj: number; min: number };
resources: { [key in ResourceKey]?: ResourceConfig };
};
diff --git a/src/model/resource/Tent.ts b/src/model/resource/Tent.ts
index cd29579..9786d82 100644
--- a/src/model/resource/Tent.ts
+++ b/src/model/resource/Tent.ts
@@ -1,12 +1,15 @@
///
class Tent extends Infrastructure {
- constructor (config: GameConfig) {
+ constructor(config: GameConfig) {
super(
'Tents',
'tent',
'tents',
- `Provides room to house ${formatNumber(config.cfgCapacity.tents?.followers ?? 0)} followers.`);
+ `Provides room to house ${formatNumber(
+ config.cfgCapacity.tents?.followers ?? 0
+ )} followers.`
+ );
this.cost.money = config.cfgInitialCost.tents;
this._costMultiplier.money = config.cfgCostMultiplier.tents;
}
@@ -14,8 +17,9 @@ class Tent extends Infrastructure {
public max: (state: GameState) => number = (state) => {
// ten extra tents per compound
let max = state.config.cfgInitialMax.tents ?? 0;
- max += (state.resource.compounds?.value ?? 0)
- * (state.config.cfgCapacity.compounds?.tents ?? 0);
+ max +=
+ (state.resource.compounds?.value ?? 0) *
+ (state.config.cfgCapacity.compounds?.tents ?? 0);
return max;
};
}
diff --git a/src/render/DebugRenderer.ts b/src/render/DebugRenderer.ts
index 9e52e1e..fd406ca 100644
--- a/src/render/DebugRenderer.ts
+++ b/src/render/DebugRenderer.ts
@@ -6,7 +6,7 @@ class DebugRenderer implements IRenderer {
private _initialized = false;
private _handleClick = true;
- public render (state: GameState): void {
+ public render(state: GameState): void {
const rkeys = state.resources;
const container = document.getElementById('irreligious-game');
if (!this._initialized) {
@@ -46,7 +46,8 @@ class DebugRenderer implements IRenderer {
const resource = state.resource[rkey];
if (resource === undefined || resource.label === undefined) continue;
const resContainer = document.getElementById(
- `resource-container-${resource.resourceType}`);
+ `resource-container-${resource.resourceType}`
+ );
if (resContainer === null) continue;
const el = document.createElement('div');
el.className = 'resource locked';
@@ -70,8 +71,10 @@ class DebugRenderer implements IRenderer {
${this._escape(action.name)}`;
}
}
- if (resource.cost !== undefined
- && Object.keys(resource.cost).length !== 0) {
+ if (
+ resource.cost !== undefined &&
+ Object.keys(resource.cost).length !== 0
+ ) {
content += " Cost: ";
}
el.innerHTML = content;
@@ -93,8 +96,9 @@ class DebugRenderer implements IRenderer {
Reset Game
`;
resDiv.appendChild(footer);
- document.getElementById('dbg-btn-reset')?.addEventListener('click',
- (): void => {
+ document
+ .getElementById('dbg-btn-reset')
+ ?.addEventListener('click', (): void => {
state.reset();
container.innerHTML = '';
this._initialized = false;
@@ -112,9 +116,10 @@ class DebugRenderer implements IRenderer {
? Math.floor(resource.value)
: resource.value;
elV.innerHTML = formatNumber(value);
- elT.innerHTML = resource.max !== undefined
- ? ` / ${formatNumber(resource.max(state))}`
- : '';
+ elT.innerHTML =
+ resource.max !== undefined
+ ? ` / ${formatNumber(resource.max(state))}`
+ : '';
if (resource.userActions !== undefined) {
for (let i = 0; i < resource.userActions.length; i++) {
const elB = document.getElementById(`resource-btn-${rkey}-${i}`);
@@ -128,8 +133,7 @@ class DebugRenderer implements IRenderer {
}
if (resource.inc !== undefined && resource.inc(state) > 0) {
const elI = el.getElementsByClassName('resource-inc')[0];
- elI.innerHTML =
- ` +${formatNumber(resource.inc(state))}/s`;
+ elI.innerHTML = ` +${formatNumber(resource.inc(state))}/s`;
}
if (this._handleClick) {
const elC = el.getElementsByClassName('resource-cost');
@@ -150,7 +154,7 @@ class DebugRenderer implements IRenderer {
this._initialized = true;
}
- private _escape (text: string): string {
+ private _escape(text: string): string {
const escapes: { [key: string]: string } = {
'&': '&',
'<': '<',
@@ -160,11 +164,10 @@ class DebugRenderer implements IRenderer {
'/': '/',
};
const escaper = /[&<>"'/]/g;
- return text.replace(escaper, (match: string): string =>
- escapes[match]);
+ return text.replace(escaper, (match: string): string => escapes[match]);
}
- private _getCostStr (resource: IResource, state: GameState): string {
+ private _getCostStr(resource: IResource, state: GameState): string {
let cost = '';
for (const rkey of state.resources) {
if (resource.cost?.[rkey] !== undefined) {