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

Commit

Permalink
refactor: Cycles as named settings
Browse files Browse the repository at this point in the history
  • Loading branch information
oliversalzburg committed Oct 16, 2022
1 parent 87009ca commit 5400836
Show file tree
Hide file tree
Showing 5 changed files with 180 additions and 99 deletions.
8 changes: 5 additions & 3 deletions packages/userscript/source/TimeControlManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ export class TimeControlManager {

// If skipping during this cycle was disabled, bail out.
const currentCycle = this._host.gamePage.calendar.cycle;
if (!this.settings.timeSkip[currentCycle]) {
if (!this.settings.timeSkip.cycles[currentCycle]) {
return;
}

Expand Down Expand Up @@ -389,14 +389,16 @@ export class TimeControlManager {
let skipCycles = 1;
while (
yearsPerCycle < canSkip &&
this.settings.timeSkip[((currentCycle + skipCycles) % cyclesPerEra) as CycleIndices]
this.settings.timeSkip.cycles[((currentCycle + skipCycles) % cyclesPerEra) as CycleIndices]
) {
willSkip += yearsPerCycle;
canSkip -= yearsPerCycle;
skipCycles += 1;
}
if (
this.settings.timeSkip[((currentCycle + skipCycles) % cyclesPerEra) as CycleIndices] &&
this.settings.timeSkip.cycles[
((currentCycle + skipCycles) % cyclesPerEra) as CycleIndices
] &&
0 < canSkip
) {
willSkip += canSkip;
Expand Down
127 changes: 92 additions & 35 deletions packages/userscript/source/options/TimeSkipSettings.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,67 @@
import { SettingTrigger } from "./Settings";
import { SettingWithCycles } from "../ui/components/CyclesList";
import { Setting, SettingTrigger } from "./Settings";
import { LegacyStorage } from "./SettingsStorage";
import { CycleIndices } from "./TimeControlSettings";

export class TimeSkipSettings extends SettingTrigger {
export class TimeSkipSettings extends SettingTrigger implements SettingWithCycles {
max = 50;

spring = true;
summer = false;
autumn = false;
winter = false;

0 = false;
1 = false;
2 = false;
3 = false;
4 = false;
5 = false;
6 = false;
7 = false;
8 = false;
9 = false;
charon: Setting;
umbra: Setting;
yarn: Setting;
helios: Setting;
cath: Setting;
redmoon: Setting;
dune: Setting;
piscine: Setting;
terminus: Setting;
kairo: Setting;

constructor() {
get cycles() {
return [
this.charon,
this.umbra,
this.yarn,
this.helios,
this.cath,
this.redmoon,
this.dune,
this.piscine,
this.terminus,
this.kairo,
];
}

constructor(
cycles = {
charon: new Setting(false),
umbra: new Setting(false),
yarn: new Setting(false),
helios: new Setting(false),
cath: new Setting(false),
redmoon: new Setting(false),
dune: new Setting(false),
piscine: new Setting(false),
terminus: new Setting(false),
kairo: new Setting(false),
}
) {
super(false, 5);

this.charon = cycles.charon;
this.umbra = cycles.umbra;
this.yarn = cycles.yarn;
this.helios = cycles.helios;
this.cath = cycles.cath;
this.redmoon = cycles.redmoon;
this.dune = cycles.dune;
this.piscine = cycles.piscine;
this.terminus = cycles.terminus;
this.kairo = cycles.kairo;
}

load(settings: TimeSkipSettings) {
Expand All @@ -34,9 +73,16 @@ export class TimeSkipSettings extends SettingTrigger {
this.summer = settings.summer;
this.winter = settings.winter;

for (let cycleIndex = 0; cycleIndex < 10; ++cycleIndex) {
this[cycleIndex as CycleIndices] = settings[cycleIndex as CycleIndices];
}
this.charon.load(settings.charon);
this.umbra.load(settings.umbra);
this.yarn.load(settings.yarn);
this.helios.load(settings.helios);
this.cath.load(settings.cath);
this.redmoon.load(settings.redmoon);
this.dune.load(settings.dune);
this.piscine.load(settings.piscine);
this.terminus.load(settings.terminus);
this.kairo.load(settings.kairo);
}

static toLegacyOptions(settings: TimeSkipSettings, subject: LegacyStorage) {
Expand All @@ -48,29 +94,40 @@ export class TimeSkipSettings extends SettingTrigger {
subject.items["toggle-timeSkip-summer"] = settings.summer;
subject.items["toggle-timeSkip-winter"] = settings.winter;

for (let cycleIndex = 0; cycleIndex < 10; ++cycleIndex) {
subject.items[`toggle-timeSkip-${cycleIndex as CycleIndices}` as const] =
settings[cycleIndex as CycleIndices];
}
subject.items[`toggle-timeSkip-0`] = settings.charon.enabled;
subject.items[`toggle-timeSkip-1`] = settings.umbra.enabled;
subject.items[`toggle-timeSkip-2`] = settings.yarn.enabled;
subject.items[`toggle-timeSkip-3`] = settings.helios.enabled;
subject.items[`toggle-timeSkip-4`] = settings.cath.enabled;
subject.items[`toggle-timeSkip-5`] = settings.redmoon.enabled;
subject.items[`toggle-timeSkip-6`] = settings.dune.enabled;
subject.items[`toggle-timeSkip-7`] = settings.piscine.enabled;
subject.items[`toggle-timeSkip-8`] = settings.terminus.enabled;
subject.items[`toggle-timeSkip-9`] = settings.kairo.enabled;
}

static fromLegacyOptions(subject: LegacyStorage) {
const options = new TimeSkipSettings();
options.enabled = subject.items["toggle-timeSkip"] ?? options.enabled;
const settings = new TimeSkipSettings();
settings.enabled = subject.items["toggle-timeSkip"] ?? settings.enabled;

options.trigger = subject.items["set-timeSkip-trigger"] ?? options.trigger;
options.max = subject.items["set-timeSkip-max"] ?? options.max;
options.autumn = subject.items["toggle-timeSkip-autumn"] ?? options.autumn;
options.spring = subject.items["toggle-timeSkip-spring"] ?? options.spring;
options.summer = subject.items["toggle-timeSkip-summer"] ?? options.summer;
options.winter = subject.items["toggle-timeSkip-winter"] ?? options.winter;
settings.trigger = subject.items["set-timeSkip-trigger"] ?? settings.trigger;
settings.max = subject.items["set-timeSkip-max"] ?? settings.max;
settings.autumn = subject.items["toggle-timeSkip-autumn"] ?? settings.autumn;
settings.spring = subject.items["toggle-timeSkip-spring"] ?? settings.spring;
settings.summer = subject.items["toggle-timeSkip-summer"] ?? settings.summer;
settings.winter = subject.items["toggle-timeSkip-winter"] ?? settings.winter;

for (let cycleIndex = 0; cycleIndex < 10; ++cycleIndex) {
options[cycleIndex as CycleIndices] =
subject.items[`toggle-timeSkip-${cycleIndex as CycleIndices}` as const] ??
options[cycleIndex as CycleIndices];
}
settings.charon.enabled = subject.items[`toggle-timeSkip-0`] ?? settings.charon.enabled;
settings.umbra.enabled = subject.items[`toggle-timeSkip-1`] ?? settings.umbra.enabled;
settings.yarn.enabled = subject.items[`toggle-timeSkip-2`] ?? settings.yarn.enabled;
settings.helios.enabled = subject.items[`toggle-timeSkip-3`] ?? settings.helios.enabled;
settings.cath.enabled = subject.items[`toggle-timeSkip-4`] ?? settings.cath.enabled;
settings.redmoon.enabled = subject.items[`toggle-timeSkip-5`] ?? settings.redmoon.enabled;
settings.dune.enabled = subject.items[`toggle-timeSkip-6`] ?? settings.dune.enabled;
settings.piscine.enabled = subject.items[`toggle-timeSkip-7`] ?? settings.piscine.enabled;
settings.terminus.enabled = subject.items[`toggle-timeSkip-8`] ?? settings.terminus.enabled;
settings.kairo.enabled = subject.items[`toggle-timeSkip-9`] ?? settings.kairo.enabled;

return options;
return settings;
}
}
2 changes: 1 addition & 1 deletion packages/userscript/source/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export type Cycle =
| "redmoon"
| "dune"
| "piscine"
| "t-minus"
| "terminus"
| "kairo";

export type ResourceCraftable =
Expand Down
140 changes: 81 additions & 59 deletions packages/userscript/source/ui/components/CyclesList.ts
Original file line number Diff line number Diff line change
@@ -1,36 +1,27 @@
import { CycleIndices } from "../../options/TimeControlSettings";
import { Setting } from "../../options/Settings";
import { Cycle } from "../../types";
import { UserScript } from "../../UserScript";
import { SettingListItem } from "./SettingListItem";
import { SettingsList } from "./SettingsList";

export type SettingWithCycles = {
0: boolean;
1: boolean;
2: boolean;
3: boolean;
4: boolean;
5: boolean;
6: boolean;
7: boolean;
8: boolean;
9: boolean;
};
export type SettingWithCycles = Record<Cycle, Setting>;

/**
* A list of settings correlating to the planetary cycles in the game.
*/
export class CyclesList extends SettingsList {
readonly setting: SettingWithCycles;

readonly 0: JQuery<HTMLElement>;
readonly 1: JQuery<HTMLElement>;
readonly 2: JQuery<HTMLElement>;
readonly 3: JQuery<HTMLElement>;
readonly 4: JQuery<HTMLElement>;
readonly 5: JQuery<HTMLElement>;
readonly 6: JQuery<HTMLElement>;
readonly 7: JQuery<HTMLElement>;
readonly 8: JQuery<HTMLElement>;
readonly 9: JQuery<HTMLElement>;
readonly charon: SettingListItem;
readonly umbra: SettingListItem;
readonly yarn: SettingListItem;
readonly helios: SettingListItem;
readonly cath: SettingListItem;
readonly redmoon: SettingListItem;
readonly dune: SettingListItem;
readonly piscine: SettingListItem;
readonly terminus: SettingListItem;
readonly kairo: SettingListItem;

/**
* Constructs a `SeasonsList`.
Expand All @@ -42,47 +33,78 @@ export class CyclesList extends SettingsList {
super(host);
this.setting = setting;

for (let cycleIndex = 0; cycleIndex < 10; ++cycleIndex) {
this[cycleIndex as CycleIndices] = this._getCycle(cycleIndex as CycleIndices, this.setting);
this.element.append(this[cycleIndex as CycleIndices]);
}
}

private _getCycle(index: CycleIndices, option: SettingWithCycles): JQuery<HTMLElement> {
const cycle = this._host.gamePage.calendar.cycles[index];

const element = $("<li/>");

const label = $("<label/>", {
text: cycle.title,
});
this.charon = this._makeCycle(
this._host.engine.i18n("$space.planet.charon.label"),
this.setting.charon
);
this.umbra = this._makeCycle(
this._host.engine.i18n("$space.planet.umbra.label"),
this.setting.umbra
);
this.yarn = this._makeCycle(
this._host.engine.i18n("$space.planet.yarn.label"),
this.setting.yarn
);
this.helios = this._makeCycle(
this._host.engine.i18n("$space.planet.helios.label"),
this.setting.helios
);
this.cath = this._makeCycle(
this._host.engine.i18n("$space.planet.cath.label"),
this.setting.cath
);
this.redmoon = this._makeCycle(
this._host.engine.i18n("$space.planet.redmoon.label"),
this.setting.redmoon
);
this.dune = this._makeCycle(
this._host.engine.i18n("$space.planet.dune.label"),
this.setting.dune
);
this.piscine = this._makeCycle(
this._host.engine.i18n("$space.planet.piscine.label"),
this.setting.piscine
);
this.terminus = this._makeCycle(
this._host.engine.i18n("$space.planet.terminus.label"),
this.setting.terminus
);
this.kairo = this._makeCycle(
this._host.engine.i18n("$space.planet.kairo.label"),
this.setting.kairo
);

const input = $("<input/>", {
type: "checkbox",
});
this.addChildren([
this.charon,
this.umbra,
this.yarn,
this.helios,
this.cath,
this.redmoon,
this.dune,
this.piscine,
this.terminus,
this.kairo,
]);
}

input.on("change", () => {
if (input.is(":checked") && option[index] === false) {
this._host.updateSettings(() => (option[index] = true));
this._host.engine.imessage("time.skip.cycle.enable", [cycle.title]);
} else if (!input.is(":checked") && option[index] === true) {
this._host.updateSettings(() => (option[index] = false));
this._host.engine.imessage("time.skip.cycle.disable", [cycle.title]);
}
private _makeCycle(label: string, setting: Setting) {
return new SettingListItem(this._host, label, setting, {
onCheck: () => this._host.engine.imessage("time.skip.cycle.enable", [label]),
onUnCheck: () => this._host.engine.imessage("time.skip.cycle.disable", [label]),
});

label.prepend(input);
element.append(label);

return element;
}

refreshUi() {
for (let cycleIndex = 0; cycleIndex < 10; ++cycleIndex) {
$("input", this[cycleIndex as CycleIndices]).prop(
"checked",
this.setting[cycleIndex as CycleIndices]
);
}
this.charon.refreshUi();
this.umbra.refreshUi();
this.yarn.refreshUi();
this.helios.refreshUi();
this.cath.refreshUi();
this.redmoon.refreshUi();
this.dune.refreshUi();
this.piscine.refreshUi();
this.terminus.refreshUi();
this.kairo.refreshUi();
}
}
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,5 @@
"skipLibCheck": true,
"types": ["@types/web"]
},
"exclude": ["**/*.js"]
"exclude": ["**/*.c?js"]
}

0 comments on commit 5400836

Please sign in to comment.