Skip to content
This repository has been archived by the owner on Oct 25, 2022. It is now read-only.

Commit

Permalink
refactor(ui): Dedicated policy/tech panels
Browse files Browse the repository at this point in the history
  • Loading branch information
oliversalzburg committed Oct 10, 2022
1 parent b697a71 commit ad892e0
Show file tree
Hide file tree
Showing 6 changed files with 329 additions and 203 deletions.
120 changes: 79 additions & 41 deletions packages/userscript/source/options/PolicySettings.ts
Original file line number Diff line number Diff line change
@@ -1,55 +1,66 @@
import { difference } from "../tools/Array";
import { objectEntries } from "../tools/Entries";
import { cwarn } from "../tools/Log";
import { GamePage, Policy } from "../types";
import { Setting } from "./Settings";
import { SettingsSection } from "./SettingsSection";
import { KittenStorageType } from "./SettingsStorage";

export class PolicySettings extends SettingsSection {
items: {
[item in Policy]: Setting;
} = {
authocracy: new Setting("authocracy", false),
bigStickPolicy: new Setting("bigStickPolicy", false),
carnivale: new Setting("carnivale", false),
cityOnAHill: new Setting("cityOnAHill", false),
clearCutting: new Setting("clearCutting", false),
communism: new Setting("communism", false),
conservation: new Setting("conservation", false),
culturalExchange: new Setting("culturalExchange", false),
diplomacy: new Setting("diplomacy", false),
environmentalism: new Setting("environmentalism", false),
epicurianism: new Setting("epicurianism", false),
expansionism: new Setting("expansionism", false),
extravagance: new Setting("extravagance", false),
fascism: new Setting("fascism", false),
frugality: new Setting("frugality", false),
fullIndustrialization: new Setting("fullIndustrialization", false),
isolationism: new Setting("isolationism", false),
knowledgeSharing: new Setting("knowledgeSharing", false),
liberalism: new Setting("liberalism", false),
liberty: new Setting("liberty", false),
militarizeSpace: new Setting("militarizeSpace", false),
monarchy: new Setting("monarchy", false),
mysticism: new Setting("mysticism", false),
necrocracy: new Setting("necrocracy", false),
openWoodlands: new Setting("openWoodlands", false),
outerSpaceTreaty: new Setting("outerSpaceTreaty", false),
radicalXenophobia: new Setting("radicalXenophobia", false),
rationality: new Setting("rationality", false),
rationing: new Setting("rationing", false),
republic: new Setting("republic", false),
socialism: new Setting("socialism", false),
stoicism: new Setting("stoicism", false),
stripMining: new Setting("stripMining", false),
sustainability: new Setting("sustainability", false),
technocracy: new Setting("technocracy", false),
theocracy: new Setting("theocracy", false),
tradition: new Setting("tradition", false),
transkittenism: new Setting("transkittenism", false),
zebraRelationsAppeasement: new Setting("zebraRelationsAppeasement", false),
zebraRelationsBellicosity: new Setting("zebraRelationsBellicosity", false),
};

constructor(
id = "policies",
enabled = false,
items = {
authocracy: new Setting("authocracy", false),
bigStickPolicy: new Setting("bigStickPolicy", false),
carnivale: new Setting("carnivale", false),
cityOnAHill: new Setting("cityOnAHill", false),
clearCutting: new Setting("clearCutting", false),
communism: new Setting("communism", false),
conservation: new Setting("conservation", false),
culturalExchange: new Setting("culturalExchange", false),
diplomacy: new Setting("diplomacy", false),
environmentalism: new Setting("environmentalism", false),
epicurianism: new Setting("epicurianism", false),
expansionism: new Setting("expansionism", false),
extravagance: new Setting("extravagance", false),
fascism: new Setting("fascism", false),
frugality: new Setting("frugality", false),
fullIndustrialization: new Setting("fullIndustrialization", false),
isolationism: new Setting("isolationism", false),
knowledgeSharing: new Setting("knowledgeSharing", false),
liberalism: new Setting("liberalism", false),
liberty: new Setting("liberty", false),
militarizeSpace: new Setting("militarizeSpace", false),
monarchy: new Setting("monarchy", false),
mysticism: new Setting("mysticism", false),
necrocracy: new Setting("necrocracy", false),
openWoodlands: new Setting("openWoodlands", false),
outerSpaceTreaty: new Setting("outerSpaceTreaty", false),
radicalXenophobia: new Setting("radicalXenophobia", false),
rationality: new Setting("rationality", false),
rationing: new Setting("rationing", false),
republic: new Setting("republic", false),
socialism: new Setting("socialism", false),
stoicism: new Setting("stoicism", false),
stripMining: new Setting("stripMining", false),
sustainability: new Setting("sustainability", false),
technocracy: new Setting("technocracy", false),
theocracy: new Setting("theocracy", false),
tradition: new Setting("tradition", false),
transkittenism: new Setting("transkittenism", false),
zebraRelationsAppeasement: new Setting("zebraRelationsAppeasement", false),
zebraRelationsBellicosity: new Setting("zebraRelationsBellicosity", false),
}
) {
super(id, enabled);
this.items = items;
}

static validateGame(game: GamePage, settings: PolicySettings) {
const inSettings = Object.keys(settings.items);
const inGame = game.science.policies.map(policy => policy.name);
Expand All @@ -64,4 +75,31 @@ export class PolicySettings extends SettingsSection {
cwarn(`The policy '${policy}' is not a policy in Kitten Game!`);
}
}

load(settings: PolicySettings) {
this.enabled = settings.enabled;

for (const [name, item] of objectEntries(settings.items)) {
this.items[name].enabled = item.enabled;
}
}

static toLegacyOptions(settings: PolicySettings, subject: KittenStorageType) {
subject.items["toggle-policies"] = settings.enabled;

for (const [name, item] of objectEntries(settings.items)) {
subject.items[`toggle-policy-${name}` as const] = item.enabled;
}
}

static fromLegacyOptions(subject: KittenStorageType) {
const options = new PolicySettings();
options.enabled = subject.items["toggle-policies"] ?? options.enabled;

for (const [name, item] of objectEntries(options.items)) {
item.enabled = subject.items[`toggle-policy-${name}` as const] ?? item.enabled;
}

return options;
}
}
34 changes: 6 additions & 28 deletions packages/userscript/source/options/ScienceSettings.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { objectEntries } from "../tools/Entries";
import { GamePage } from "../types";
import { PolicySettings } from "./PolicySettings";
import { SettingsSection } from "./SettingsSection";
Expand Down Expand Up @@ -30,44 +29,23 @@ export class ScienceSettings extends SettingsSection {
load(settings: ScienceSettings) {
this.enabled = settings.enabled;

this.policies.enabled = settings.policies.enabled;
this.techs.enabled = settings.techs.enabled;

for (const [name, item] of objectEntries(settings.policies.items)) {
this.policies.items[name].enabled = item.enabled;
}
for (const [name, item] of objectEntries(settings.techs.items)) {
this.techs.items[name].enabled = item.enabled;
}
this.policies.load(settings.policies);
this.techs.load(settings.techs);
}

static toLegacyOptions(settings: ScienceSettings, subject: KittenStorageType) {
subject.toggles.upgrade = settings.enabled;

subject.items["toggle-policies"] = settings.policies.enabled;
subject.items["toggle-techs"] = settings.techs.enabled;

for (const [name, item] of objectEntries(settings.policies.items)) {
subject.items[`toggle-policy-${name}` as const] = item.enabled;
}
for (const [name, item] of objectEntries(settings.techs.items)) {
subject.items[`toggle-tech-${name}` as const] = item.enabled;
}
PolicySettings.toLegacyOptions(settings.policies, subject);
TechSettings.toLegacyOptions(settings.techs, subject);
}

static fromLegacyOptions(subject: KittenStorageType) {
const options = new ScienceSettings();
options.enabled = subject.toggles.upgrade;

options.policies.enabled = subject.items["toggle-policies"] ?? options.policies.enabled;
options.techs.enabled = subject.items["toggle-techs"] ?? options.techs.enabled;

for (const [name, item] of objectEntries(options.policies.items)) {
item.enabled = subject.items[`toggle-policy-${name}` as const] ?? item.enabled;
}
for (const [name, item] of objectEntries(options.techs.items)) {
item.enabled = subject.items[`toggle-tech-${name}` as const] ?? item.enabled;
}
options.policies = PolicySettings.fromLegacyOptions(subject);
options.techs = TechSettings.fromLegacyOptions(subject);

return options;
}
Expand Down
164 changes: 101 additions & 63 deletions packages/userscript/source/options/TechSettings.ts
Original file line number Diff line number Diff line change
@@ -1,77 +1,88 @@
import { difference } from "../tools/Array";
import { objectEntries } from "../tools/Entries";
import { cwarn } from "../tools/Log";
import { GamePage, Technology } from "../types";
import { Setting } from "./Settings";
import { SettingsSection } from "./SettingsSection";
import { KittenStorageType } from "./SettingsStorage";

export class TechSettings extends SettingsSection {
items: {
[item in Technology]: Setting;
} = {
acoustics: new Setting("acoustics", true),
advExogeology: new Setting("advExogeology", true),
agriculture: new Setting("agriculture", true),
ai: new Setting("ai", true),
animal: new Setting("animal", true),
antimatter: new Setting("antimatter", true),
archeology: new Setting("archeology", true),
archery: new Setting("archery", true),
architecture: new Setting("architecture", true),
artificialGravity: new Setting("artificialGravity", true),
astronomy: new Setting("astronomy", true),
biochemistry: new Setting("biochemistry", true),
biology: new Setting("biology", true),
blackchain: new Setting("blackchain", true),
brewery: new Setting("brewery", true),
calendar: new Setting("calendar", true),
chemistry: new Setting("chemistry", true),
chronophysics: new Setting("chronophysics", true),
civil: new Setting("civil", true),
combustion: new Setting("combustion", true),
construction: new Setting("construction", true),
cryptotheology: new Setting("cryptotheology", true),
currency: new Setting("currency", true),
dimensionalPhysics: new Setting("dimensionalPhysics", true),
drama: new Setting("drama", true),
ecology: new Setting("ecology", true),
electricity: new Setting("electricity", true),
electronics: new Setting("electronics", true),
engineering: new Setting("engineering", true),
exogeology: new Setting("exogeology", true),
exogeophysics: new Setting("exogeophysics", true),
genetics: new Setting("genetics", true),
hydroponics: new Setting("hydroponics", true),
industrialization: new Setting("industrialization", true),
machinery: new Setting("machinery", true),
math: new Setting("math", true),
mechanization: new Setting("mechanization", true),
metal: new Setting("metal", true),
metalurgy: new Setting("metalurgy", true),
metaphysics: new Setting("metaphysics", true),
mining: new Setting("mining", true),
nanotechnology: new Setting("nanotechnology", true),
navigation: new Setting("navigation", true),
nuclearFission: new Setting("nuclearFission", true),
oilProcessing: new Setting("oilProcessing", true),
orbitalEngineering: new Setting("orbitalEngineering", true),
paradoxalKnowledge: new Setting("paradoxalKnowledge", true),
particlePhysics: new Setting("particlePhysics", true),
philosophy: new Setting("philosophy", true),
physics: new Setting("physics", true),
quantumCryptography: new Setting("quantumCryptography", true),
robotics: new Setting("robotics", true),
rocketry: new Setting("rocketry", true),
sattelites: new Setting("sattelites", true),
steel: new Setting("steel", true),
superconductors: new Setting("superconductors", true),
tachyonTheory: new Setting("tachyonTheory", true),
terraformation: new Setting("terraformation", true),
theology: new Setting("theology", true),
thorium: new Setting("thorium", true),
voidSpace: new Setting("voidSpace", true),
writing: new Setting("writing", true),
};

constructor(
id = "techs",
enabled = false,
items = {
acoustics: new Setting("acoustics", true),
advExogeology: new Setting("advExogeology", true),
agriculture: new Setting("agriculture", true),
ai: new Setting("ai", true),
animal: new Setting("animal", true),
antimatter: new Setting("antimatter", true),
archeology: new Setting("archeology", true),
archery: new Setting("archery", true),
architecture: new Setting("architecture", true),
artificialGravity: new Setting("artificialGravity", true),
astronomy: new Setting("astronomy", true),
biochemistry: new Setting("biochemistry", true),
biology: new Setting("biology", true),
blackchain: new Setting("blackchain", true),
brewery: new Setting("brewery", true),
calendar: new Setting("calendar", true),
chemistry: new Setting("chemistry", true),
chronophysics: new Setting("chronophysics", true),
civil: new Setting("civil", true),
combustion: new Setting("combustion", true),
construction: new Setting("construction", true),
cryptotheology: new Setting("cryptotheology", true),
currency: new Setting("currency", true),
dimensionalPhysics: new Setting("dimensionalPhysics", true),
drama: new Setting("drama", true),
ecology: new Setting("ecology", true),
electricity: new Setting("electricity", true),
electronics: new Setting("electronics", true),
engineering: new Setting("engineering", true),
exogeology: new Setting("exogeology", true),
exogeophysics: new Setting("exogeophysics", true),
genetics: new Setting("genetics", true),
hydroponics: new Setting("hydroponics", true),
industrialization: new Setting("industrialization", true),
machinery: new Setting("machinery", true),
math: new Setting("math", true),
mechanization: new Setting("mechanization", true),
metal: new Setting("metal", true),
metalurgy: new Setting("metalurgy", true),
metaphysics: new Setting("metaphysics", true),
mining: new Setting("mining", true),
nanotechnology: new Setting("nanotechnology", true),
navigation: new Setting("navigation", true),
nuclearFission: new Setting("nuclearFission", true),
oilProcessing: new Setting("oilProcessing", true),
orbitalEngineering: new Setting("orbitalEngineering", true),
paradoxalKnowledge: new Setting("paradoxalKnowledge", true),
particlePhysics: new Setting("particlePhysics", true),
philosophy: new Setting("philosophy", true),
physics: new Setting("physics", true),
quantumCryptography: new Setting("quantumCryptography", true),
robotics: new Setting("robotics", true),
rocketry: new Setting("rocketry", true),
sattelites: new Setting("sattelites", true),
steel: new Setting("steel", true),
superconductors: new Setting("superconductors", true),
tachyonTheory: new Setting("tachyonTheory", true),
terraformation: new Setting("terraformation", true),
theology: new Setting("theology", true),
thorium: new Setting("thorium", true),
voidSpace: new Setting("voidSpace", true),
writing: new Setting("writing", true),
}
) {
super(id, enabled);
this.items = items;
}

static validateGame(game: GamePage, settings: TechSettings) {
const inSettings = Object.keys(settings.items);
const inGame = game.science.techs.map(tech => tech.name);
Expand All @@ -86,4 +97,31 @@ export class TechSettings extends SettingsSection {
cwarn(`The technology '${tech}' is not a technology in Kitten Game!`);
}
}

load(settings: TechSettings) {
this.enabled = settings.enabled;

for (const [name, item] of objectEntries(settings.items)) {
this.items[name].enabled = item.enabled;
}
}

static toLegacyOptions(settings: TechSettings, subject: KittenStorageType) {
subject.items["toggle-techs"] = settings.enabled;

for (const [name, item] of objectEntries(settings.items)) {
subject.items[`toggle-tech-${name}` as const] = item.enabled;
}
}

static fromLegacyOptions(subject: KittenStorageType) {
const options = new TechSettings();
options.enabled = subject.items["toggle-policies"] ?? options.enabled;

for (const [name, item] of objectEntries(options.items)) {
item.enabled = subject.items[`toggle-tech-${name}` as const] ?? item.enabled;
}

return options;
}
}

0 comments on commit ad892e0

Please sign in to comment.