@kitten-science/kitten-scientists
Version:
Add-on for the wonderful incremental browser game: https://kittensgame.com/web/
200 lines • 10.5 kB
JavaScript
import { isNil } from "@oliversalzburg/js-utils/data/nil.js";
import { cl } from "../tools/Log.js";
import stylesButton from "./components/Button.module.css";
import { Container } from "./components/Container.js";
import { Dialog } from "./components/Dialog.js";
import { HeaderListItem } from "./components/HeaderListItem.js";
import stylesLabelListItem from "./components/LabelListItem.module.css";
import { OptionsListItem } from "./components/OptionsListItem.js";
import { SettingListItem } from "./components/SettingListItem.js";
import { SettingMaxListItem } from "./components/SettingMaxListItem.js";
import { SettingsList } from "./components/SettingsList.js";
import { SettingsPanel } from "./components/SettingsPanel.js";
import { SettingTriggerListItem } from "./components/SettingTriggerListItem.js";
export class VillageSettingsUi extends SettingsPanel {
_hunt;
_festivals;
_promoteKittens;
_promoteLeader;
_electLeader;
constructor(parent, settings, locale) {
console.debug(...cl(`Constructing ${VillageSettingsUi.name}`));
const label = parent.host.engine.i18n("ui.distribute");
super(parent, settings, new SettingListItem(parent, settings, label, {
onCheck: (_isBatchProcess) => {
parent.host.engine.imessage("status.auto.enable", [label]);
},
onUnCheck: (_isBatchProcess) => {
parent.host.engine.imessage("status.auto.disable", [label]);
},
}).addChildrenHead([new Container(parent, { classes: [stylesLabelListItem.fillSpace] })]), {
onRefreshRequest: () => {
this.expando.ineffective =
settings.enabled && Object.values(settings.jobs).some(_ => _.enabled && 0 === _.max);
},
});
const listJobs = new SettingsList(this).addChildren(this.host.game.village.jobs
.filter(item => !isNil(this.setting.jobs[item.name]))
.map(job => this._getDistributeOption(this.setting.jobs[job.name], locale.selected, settings, job.title)));
this.addChildContent(listJobs);
const listAddition = new SettingsList(this, {
hasDisableAll: false,
hasEnableAll: false,
});
listAddition.addChild(new HeaderListItem(this, this.host.engine.i18n("ui.additional")));
this._hunt = new SettingTriggerListItem(this, this.setting.hunt, locale, this.host.engine.i18n("option.hunt"), {
onCheck: () => {
this.host.engine.imessage("status.sub.enable", [this.host.engine.i18n("option.hunt")]);
},
onRefreshRequest: () => {
this._hunt.triggerButton.inactive = !this.setting.hunt.enabled;
this._hunt.triggerButton.ineffective =
this.setting.enabled && this.setting.hunt.enabled && this.setting.hunt.trigger === -1;
},
onSetTrigger: async () => {
const value = await Dialog.prompt(this, this.host.engine.i18n("ui.trigger.prompt.percentage"), this.host.engine.i18n("ui.trigger.hunt.prompt", [
this.host.renderPercentage(this.setting.hunt.trigger, locale.selected, true),
]), this.host.renderPercentage(this.setting.hunt.trigger), this.host.engine.i18n("ui.trigger.hunt.promptExplainer"));
if (value === undefined || value === "" || value.startsWith("-")) {
return;
}
this.setting.hunt.trigger = this.host.parsePercentage(value);
},
onUnCheck: () => {
this.host.engine.imessage("status.sub.disable", [this.host.engine.i18n("option.hunt")]);
},
});
this._hunt.triggerButton.element.addClass(stylesButton.lastHeadAction);
listAddition.addChild(this._hunt);
this._festivals = new SettingListItem(this, this.setting.holdFestivals, this.host.engine.i18n("option.festival"), {
onCheck: () => {
this.host.engine.imessage("status.sub.enable", [
this.host.engine.i18n("option.festival"),
]);
},
onUnCheck: () => {
this.host.engine.imessage("status.sub.disable", [
this.host.engine.i18n("option.festival"),
]);
},
});
listAddition.addChild(this._festivals);
this._promoteKittens = new SettingTriggerListItem(this, this.setting.promoteKittens, locale, this.host.engine.i18n("option.promotekittens"), {
onCheck: () => {
this.host.engine.imessage("status.sub.enable", [
this.host.engine.i18n("option.promotekittens"),
]);
},
onRefresh: () => {
this._promoteKittens.triggerButton.inactive = !this.setting.promoteKittens.enabled;
this._promoteKittens.triggerButton.ineffective =
this.setting.enabled &&
this.setting.promoteKittens.enabled &&
this.setting.promoteKittens.trigger === -1;
},
onSetTrigger: async () => {
const value = await Dialog.prompt(this, this.host.engine.i18n("ui.trigger.promoteKittens.promptTitle"), this.host.engine.i18n("ui.trigger.promoteKittens.prompt", [
this.host.renderPercentage(this.setting.promoteKittens.trigger, locale.selected, true),
]), this.host.renderPercentage(this.setting.promoteKittens.trigger), this.host.engine.i18n("ui.trigger.promoteKittens.promptExplainer"));
if (value === undefined || value === "" || value.startsWith("-")) {
return;
}
this.setting.promoteKittens.trigger = this.host.parsePercentage(value);
},
onUnCheck: () => {
this.host.engine.imessage("status.sub.disable", [
this.host.engine.i18n("option.promotekittens"),
]);
},
});
this._promoteKittens.triggerButton.element.addClass(stylesButton.lastHeadAction);
listAddition.addChild(this._promoteKittens);
this._promoteLeader = new SettingListItem(this, this.setting.promoteLeader, this.host.engine.i18n("option.promote"), {
onCheck: () => {
this.host.engine.imessage("status.sub.enable", [this.host.engine.i18n("option.promote")]);
},
onUnCheck: () => {
this.host.engine.imessage("status.sub.disable", [
this.host.engine.i18n("option.promote"),
]);
},
});
listAddition.addChild(this._promoteLeader);
for (const option of this.setting.electLeader.job.options) {
if (option.value === "any") {
option.label = this.host.engine.i18n("option.elect.job.any");
}
else {
option.label = this.host.engine.i18n(`$village.job.${option.value}`);
}
}
for (const option of this.setting.electLeader.trait.options) {
option.label = this.host.engine.i18n(`$village.trait.${option.value}`);
}
this._electLeader = new SettingListItem(this, this.setting.electLeader, this.host.engine.i18n("option.elect"), {
onCheck: () => {
this.host.engine.imessage("status.sub.enable", [this.host.engine.i18n("option.elect")]);
},
onUnCheck: () => {
this.host.engine.imessage("status.sub.disable", [this.host.engine.i18n("option.elect")]);
},
}).addChildren([
new OptionsListItem(this, this.host.engine.i18n("option.elect.job"), this.setting.electLeader.job),
new OptionsListItem(this, this.host.engine.i18n("option.elect.trait"), this.setting.electLeader.trait),
]);
listAddition.addChild(this._electLeader);
this.addChildContent(listAddition);
}
_getDistributeOption(option, locale, sectionSetting, label, delimiter = false) {
const onSetMax = async () => {
const value = await Dialog.prompt(this, this.host.engine.i18n("ui.max.distribute.prompt", [label]), this.host.engine.i18n("ui.max.distribute.promptTitle", [
label,
this.host.renderAbsolute(option.max, locale),
]), this.host.renderAbsolute(option.max), this.host.engine.i18n("ui.max.distribute.promptExplainer"));
if (value === undefined) {
return;
}
if (value === "" || value.startsWith("-")) {
option.max = -1;
return;
}
if (value === "0") {
option.enabled = false;
}
option.max = this.host.parseAbsolute(value) ?? option.max;
};
const element = new SettingMaxListItem(this, option, label, {
delimiter,
onCheck: (isBatchProcess) => {
this.host.engine.imessage("status.sub.enable", [label]);
if (option.max === 0 && !isBatchProcess) {
return onSetMax();
}
},
onRefresh: () => {
element.maxButton.inactive = !option.enabled || option.max === -1;
element.maxButton.ineffective =
sectionSetting.enabled && option.enabled && option.max === 0;
},
onRefreshMax: () => {
element.maxButton.updateLabel(this.host.renderAbsolute(option.max));
element.maxButton.element[0].title =
option.max < 0
? this.host.engine.i18n("ui.max.distribute.titleInfinite", [label])
: option.max === 0
? this.host.engine.i18n("ui.max.distribute.titleZero", [label])
: this.host.engine.i18n("ui.max.distribute.title", [
this.host.renderAbsolute(option.max),
label,
]);
},
onSetMax,
onUnCheck: () => {
this.host.engine.imessage("status.sub.disable", [label]);
},
});
element.maxButton.element.addClass(stylesButton.lastHeadAction);
return element;
}
}
//# sourceMappingURL=VillageSettingsUi.js.map