diff --git a/src/facilities/fsDecoration.js b/src/facilities/fsDecoration.js index 9b57c9b92c6f860706fd60360596bb1485da494e..cd6b618079de45f8a2f18d299dd1485ca3f76ece 100644 --- a/src/facilities/fsDecoration.js +++ b/src/facilities/fsDecoration.js @@ -1,31 +1,148 @@ /** Replaces <<SetFacilityDecoration>> widget - * @param {string} variable - global property name for the facility decoration (no $ etc) * @returns {DocumentFragment} */ -App.UI.facilityRedecoration = function(variable) { - const frag = new DocumentFragment(); +App.UI.facilityRedecoration = function() { + const el = new DocumentFragment(); + const activeFacilities = new Map([]); + const options = new App.UI.OptionsGroup(); const arc = V.arcologies[0]; - for (const FS of FutureSocieties.activeFSes(arc)) { - if (arc[FS] > 20) { - const decorationName = FutureSocieties.decorationName(FS); - if (decorationName && V[variable] !== decorationName) { - const link = App.UI.DOM.link(`${decorationName} Redecoration`, () => { - V[variable] = decorationName; - cashX(-5000, "capEx"); - App.UI.reload(); - }); - App.UI.DOM.appendNewElement("div", frag, link, "indent"); + + FutureSocieties.DecorationCleanup(); + + const applicableFS = FutureSocieties.activeFSes(arc).filter(name => (arc[name] > 20)); + const decorationNames = Array.from(applicableFS, FS => FutureSocieties.decorationName(FS)); + + if (V.brothel > 0) { + activeFacilities.set(V.brothelName, "brothelDecoration"); + } + + if (V.club > 0) { + activeFacilities.set(V.clubName, "clubDecoration"); + } + + if (V.dairy > 0) { + activeFacilities.set(V.dairyName, "dairyDecoration"); + } + + if (V.farmyard > 0) { + activeFacilities.set(V.farmyardName, "farmyardDecoration"); + } + + if (V.spa > 0) { + activeFacilities.set(V.spaName, "spaDecoration"); + } + + if (V.nursery > 0) { + activeFacilities.set(V.nurseryName, "nurseryDecoration"); + } + + if (V.clinic > 0) { + activeFacilities.set(V.clinicName, "clinicDecoration"); + } + + if (V.schoolroom > 0) { + activeFacilities.set(V.schoolroomName, "schoolroomDecoration"); + } + + if (V.cellblock > 0) { + activeFacilities.set(V.cellblockName, "cellblockDecoration"); + } + + if (V.servantsQuarters > 0) { + activeFacilities.set(V.servantsQuartersName, "servantsQuartersDecoration"); + } + + if (V.arcade > 0) { + activeFacilities.set(V.arcadeName, "arcadeDecoration"); + } + + if (V.masterSuite > 0) { + activeFacilities.set(V.masterSuiteName, "masterSuiteDecoration"); + } + + options.addOption(`Change style for all facilities`) + .addCustomDOM(modifyAll()); + + for (const [name, decoration] of activeFacilities) { + options.addOption(`The decoration style of ${name} is`) + .addCustomDOM(createPulldown(decoration)); + } + el.append(options.render()); + + return el; + + function createPulldown(variable) { + const select = document.createElement("select"); + select.classList.add("rajs-list"); + + // Standard decorations + const choice = App.UI.DOM.appendNewElement("option", select, "Standard"); + choice.value = "standard"; + if (V[variable] === "standard") { + choice.selected = true; + } + + // FS decorations + for (const decorationName of decorationNames) { + const choice = App.UI.DOM.makeElement("option", decorationName); + if (V[variable] === decorationName) { + choice.selected = true; } + select.append(choice); } + + select.onchange = () => { + const O = select.options[select.selectedIndex]; + if (O.value !== "standard") { + cashX(-5000, "capEx"); + } + V[variable] = O.value; + App.UI.reload(); + }; + return select; } - if (V[variable] !== "standard") { - const link = App.UI.DOM.link(`Remove all decorations`, () => { - V[variable] = "standard"; + + function modifyAll() { + const select = document.createElement("select"); + select.classList.add("rajs-list"); + + // Standard decorations + const standard = App.UI.DOM.appendNewElement("option", select, "Standard"); + standard.value = "standard"; + + // FS decorations + for (const decorationName of decorationNames) { + App.UI.DOM.appendNewElement("option", select, decorationName); + } + + // Round Robin + App.UI.DOM.appendNewElement("option", select, "Distribute Evenly"); + + select.onchange = () => { + const O = select.options[select.selectedIndex]; + if (O.value === "Distribute Evenly") { // Cycles through the list of available FS decorations, and distributes them to facilities round robin style. + let i = 0; + for (const decoration of activeFacilities.values()) { + cashX(-5000, "capEx"); + V[decoration] = decorationNames[i]; + i++; + if (i >= decorationNames.length) { + i = 0; + } + } + } else { + for (const decoration of activeFacilities.values()) { + if (O.value !== "standard") { + cashX(-5000, "capEx"); + } + V[decoration] = O.value; + } + } App.UI.reload(); - }); - App.UI.DOM.appendNewElement("div", frag, link, "indent"); + }; + select.selectedIndex = -1; + return select; } - return frag; }; /** diff --git a/src/gui/options/options.js b/src/gui/options/options.js index f4ad29f7a0ecf6353d51a332d513d23adb284d9d..b5fda9d20ff1980ce0b1c9e132aa8c74c5f68a4d 100644 --- a/src/gui/options/options.js +++ b/src/gui/options/options.js @@ -124,6 +124,17 @@ App.UI.OptionsGroup = (function() { return this; } + /** + * @param {Node} node + * @returns {Option} + */ + addCustomDOM(node) { + this.valuePairs.push({ + value: node, mode: "DOM" + }); + return this; + } + /* modify last added option */ /** @@ -193,6 +204,10 @@ App.UI.OptionsGroup = (function() { /* insert custom SC markup and go to next element */ $(buttonGroup).wiki(value.value); continue; + } else if (value.mode === "DOM") { + /* insert DOM and go to next element */ + buttonGroup.append(value.value); + continue; } const button = document.createElement("button"); button.append(value.name); diff --git a/src/uncategorized/futureSociety.tw b/src/uncategorized/futureSociety.tw index 484373fc7b37379cb2733dffc11a32c8901941db..9ad7466dbc3285474fa50a2b0211d596727408bc 100644 --- a/src/uncategorized/futureSociety.tw +++ b/src/uncategorized/futureSociety.tw @@ -1719,64 +1719,4 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <h3>Facility Redecoration</h3> -<<run FutureSocieties.DecorationCleanup()>> - -<<if $brothel > 0>> - <div><<= capFirstChar($brothelName)>> is decorated in $brothelDecoration style.</div> - <<includeDOM App.UI.facilityRedecoration("brothelDecoration")>> -<</if>> - -<<if $club > 0>> - <div><<= capFirstChar($clubName)>> is decorated in $clubDecoration style.</div> - <<includeDOM App.UI.facilityRedecoration("clubDecoration")>> -<</if>> - -<<if $dairy > 0>> - <div><<= capFirstChar($dairyName)>> is decorated in $dairyDecoration style.</div> - <<includeDOM App.UI.facilityRedecoration("dairyDecoration")>> -<</if>> - -<<if $farmyard > 0>> - <div><<= capFirstChar($farmyardName)>> is decorated in $farmyardDecoration style.</div> - <<includeDOM App.UI.facilityRedecoration("farmyardDecoration")>> -<</if>> - -<<if $spa > 0>> - <div><<= capFirstChar($spaName)>> is decorated in $spaDecoration style.</div> - <<includeDOM App.UI.facilityRedecoration("spaDecoration")>> -<</if>> - -<<if $nursery > 0>> - <div><<= capFirstChar($nurseryName)>> is decorated in $nurseryDecoration style.</div> - <<includeDOM App.UI.facilityRedecoration("nurseryDecoration")>> -<</if>> - -<<if $clinic > 0>> - <div><<= capFirstChar($clinicName)>> is decorated in $clinicDecoration style.</div> - <<includeDOM App.UI.facilityRedecoration("clinicDecoration")>> -<</if>> - -<<if $schoolroom > 0>> - <div><<= capFirstChar($schoolroomName)>> is decorated in $schoolroomDecoration style.</div> - <<includeDOM App.UI.facilityRedecoration("schoolroomDecoration")>> -<</if>> - -<<if $cellblock > 0>> - <div><<= capFirstChar($cellblockName)>> is decorated in $cellblockDecoration style.</div> - <<includeDOM App.UI.facilityRedecoration("cellblockDecoration")>> -<</if>> - -<<if $servantsQuarters > 0>> - <div><<= capFirstChar($servantsQuartersName)>> is decorated in $servantsQuartersDecoration style.</div> - <<includeDOM App.UI.facilityRedecoration("servantsQuartersDecoration")>> -<</if>> - -<<if $arcade > 0>> - <div><<= capFirstChar($arcadeName)>> is decorated in $arcadeDecoration style.</div> - <<includeDOM App.UI.facilityRedecoration("arcadeDecoration")>> -<</if>> - -<<if $masterSuite > 0>> - <div><<= capFirstChar($masterSuiteName)>> is decorated in $masterSuiteDecoration style.</div> - <<includeDOM App.UI.facilityRedecoration("masterSuiteDecoration")>> -<</if>> +<<includeDOM App.UI.facilityRedecoration()>>