Skip to content

Commit de1f46e

Browse files
committed
Make SaveHandler a UniqueKeyHandler and cleanup
1 parent b74b157 commit de1f46e

File tree

5 files changed

+39
-66
lines changed

5 files changed

+39
-66
lines changed

src/ts/handler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export class Handler<T> implements Iterable<T> {
22
/** This stores the stringified Identifier as the key and then the values is obviously T. We store the identifier stringified because objects are never equal so we can't `get()` from the Map without using the same obj reference. */
3-
private registered: Map<string, T>;
3+
protected registered: Map<string, T>;
44
/** the number of registered items in the handler */
55
public get length(): number {
66
return this.registered.size;
@@ -68,7 +68,7 @@ export class Handler<T> implements Iterable<T> {
6868
* This handler does not use {@link Identifier}s and instead uses unique strings.
6969
*/
7070
export class UniqueKeyHandler<T> implements Iterable<T> {
71-
private registered: Map<string, T>;
71+
protected registered: Map<string, T>;
7272
/** the number of registered items in the handler */
7373
public get length(): number {
7474
return this.registered.size;

src/ts/handlers.ts

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -347,27 +347,17 @@ export class ModHandler extends UniqueKeyHandler<Mod> {
347347
}
348348
}
349349

350-
//* for technical reasons i don't think this can actually be a UniqueKeyHandler :(
351-
export class SaveHandler {
352-
private providers: Record<string, SaveProvider>;
353-
constructor() {
354-
this.providers = {};
355-
}
356-
350+
export class SaveHandler extends UniqueKeyHandler<SaveProvider> {
357351
dumpSaveData(): Record<string, unknown> {
358352
const saveData: Record<string, unknown> = {};
359-
for (const namespace in this.providers) {
360-
saveData[namespace] = this.providers[namespace].getSaveData();
353+
for (const namespace in this.registered) {
354+
saveData[namespace] = this.registered.get(namespace).getSaveData();
361355
}
362356
return saveData;
363357
}
364358

365-
register(namespace: string, provider: SaveProvider) {
366-
this.providers[namespace] = provider;
367-
}
368-
369359
getProviders() { //! can we avoid this?
370-
return this.providers;
360+
return this.registered;
371361
}
372362
}
373363

src/ts/helper.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,6 @@ export function parseGithubIssue(input: string): string {
1111
});
1212
}
1313

14-
/**
15-
* @deprecated use {@link Array.from}
16-
*/
17-
export function convertCollectionToArray(HTMLCollection: HTMLCollection): Element[] {
18-
const array: Element[] = [];
19-
for (const item of HTMLCollection) {
20-
array.push(item);
21-
}
22-
return array;
23-
}
24-
2514
/**
2615
* Clamps a number to a specified minimum/maximum
2716
* @param value The number you're clamping
@@ -168,4 +157,4 @@ export function countVisibleChildren(element: HTMLElement): number {
168157
}
169158
}
170159
return count;
171-
}
160+
}

src/ts/main.ts

Lines changed: 29 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,30 +22,14 @@ import { NewMod } from "./exmod.js"; //* note: this import is intentionally left
2222
// ------------------------------------
2323
const version: string = "0.7";
2424

25-
// ------------------------------------
26-
// Variable & Object Definitions
27-
// ------------------------------------
28-
// dev variables
25+
// temp dev variables
2926
const dev = {} as {
3027
devMode: boolean,
31-
CPSGiven: number,
3228

33-
setDevMode(value: boolean | "on" | "off"): void,
34-
setCookies(number: number): void,
35-
setCPS(number: number): void,
36-
toggleSaving(): void
29+
setDevMode(value: boolean | "on" | "off"): void
3730
};
3831

3932
dev.devMode = false;
40-
dev.CPSGiven = 0;
41-
42-
// middle other occupiers
43-
let statsUp = false;
44-
let infoUp = false;
45-
let optionsUp = false;
46-
47-
// misc
48-
let mobile: boolean; // defined in initialization
4933

5034
// Global Events
5135
interface MousePosition {
@@ -57,7 +41,7 @@ window.addEventListener("mousemove", (event) => {
5741
mousePos.x = event.clientX;
5842
mousePos.y = event.clientY;
5943

60-
if (Game.IN_DEVELOPMENT && !mobile)
44+
if (Game.IN_DEVELOPMENT)
6145
document.getElementById("mousePosDevText").innerText = `Mouse Pos: (${mousePos.x}, ${mousePos.y})`;
6246
});
6347

@@ -118,6 +102,24 @@ export class Game extends SaveProvider {
118102
return this._INSTANCE;
119103
}
120104

105+
/**
106+
* Switches the current {@link window.location.href} to a given {@link VersionBranch}
107+
* @param branch The branch to switch to
108+
*/
109+
public static switchToBranch(branch: VersionBranch) {
110+
switch (branch) {
111+
case VersionBranch.MAIN:
112+
window.location.href = "/";
113+
break;
114+
case VersionBranch.BETA:
115+
window.location.href = "/beta";
116+
break;
117+
case VersionBranch.DEVELOP:
118+
window.location.href = "/develop";
119+
break;
120+
}
121+
}
122+
121123
/** Said to be the physical manifestation of the cookie gods themselves... */
122124
public clickercookie: ClickerCookie;
123125

@@ -260,7 +262,7 @@ export class Game extends SaveProvider {
260262
document.getElementById("infoButton").addEventListener("click", () => {this.toggleMiddle("info")});
261263
// middle content
262264
for (const element of Array.from(document.getElementsByClassName("middle-x"))) { //? i don't like how we have to do this, can we find another way? maybe somehow only one X button? actually we should probably refactor how the entire middle section works... todo: make an issue for that
263-
element.addEventListener("click", () => {closeMiddle()});
265+
element.addEventListener("click", () => {this.toggleMiddle("none")});
264266
}
265267
document.getElementById("creditsButton").addEventListener("click", () => {new SimplePopup({x: 320, y: 175, text: object2HTML(Game.CREDITS), title: "Credits"})});
266268
document.getElementById("backgroundSelect").addEventListener("change", () => {Handlers.BACKGROUND.setBackground((document.getElementById("backgroundSelect") as HTMLFormElement).value)});
@@ -280,7 +282,12 @@ export class Game extends SaveProvider {
280282
document.getElementById("upgradesHolder").addEventListener("mouseout", () => {expandUpgradesHolder(true)});
281283
// misc
282284
document.getElementById("cookie").addEventListener("click", () => {this.cookieClicked()});
283-
document.getElementById("versionNumber").addEventListener("click", () => {versionSwitch()});
285+
if (Game.VERSION_BRANCH === VersionBranch.MAIN) {
286+
document.getElementById("versionNumber").addEventListener("click", () => { Game.switchToBranch(VersionBranch.BETA) });
287+
} else { // develop or beta
288+
document.getElementById("versionNumber").addEventListener("click", () => { Game.switchToBranch(VersionBranch.MAIN) });
289+
}
290+
284291
document.getElementById("versionNumber").addEventListener("mouseover", () => {versionNumberMousedOver()});
285292
document.getElementById("versionNumber").addEventListener("mouseout", () => {versionNumberMousedOver(true)});
286293

@@ -329,7 +336,7 @@ export class Game extends SaveProvider {
329336
text.style.display = "none";
330337
}
331338

332-
if (this.currentMiddleState === middleButton) {
339+
if (this.currentMiddleState === middleButton || middleButton === "none") {
333340
this.currentMiddleState = "none";
334341
// we already set display to none on all our things
335342
} else { // middle state is something else
@@ -393,25 +400,12 @@ dev.setDevMode = function(value: boolean | "on" | "off") {
393400
// ------------------------------------
394401
// Random Functions
395402
// ------------------------------------
396-
function closeMiddle() {
397-
optionsUp = false;
398-
infoUp = false;
399-
statsUp = false;
400-
401-
document.getElementById("optionsMiddleText").style.display = "none";
402-
document.getElementById("statsMiddleText").style.display = "none";
403-
document.getElementById("infoMiddleText").style.display = "none";
404-
document.getElementById("middle").style.background = url(Handlers.BACKGROUND.getCurrentBackground().src);
405-
}
406403
function versionNumberMousedOver(undo=false) {
407404
if (!undo)
408405
document.getElementById("versionSwitchInfo").style.display = "block";
409406
else
410407
document.getElementById("versionSwitchInfo").style.display = "none";
411408
}
412-
function versionSwitch() {
413-
window.location.href = (Game.VERSION_BRANCH === VersionBranch.MAIN) ? "/beta" : "/";
414-
}
415409

416410
console.log(`you seem smart, how 'bout you contribute to the project? ${Game.GITHUB_REPO}`);
417411

src/ts/saving.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,12 @@ export class Savinator {
8888
const providers = this.saveHandler.getProviders();
8989
for (const namespace in providers) { //? should this go over providers or the localStorageSave.getNamespaces()? is there any benefit to one or the other?
9090
if (localStorageSave.getNamespaces().includes(namespace) && namespace !== "game") { // if the provider namespace is present in the local storage save
91-
providers[namespace].loadSaveData(localStorageSave.getData(namespace));
91+
providers.get(namespace).loadSaveData(localStorageSave.getData(namespace));
9292
console.log(`Loaded save data for ${namespace} namespace.`);
9393
}
9494
}
95-
if (providers["game"] !== undefined) { // game should always be there, but just in case it isn't we check
96-
providers["game"].loadSaveData(localStorageSave.getData("game"));
95+
if (providers.get("game") !== undefined) { // game should always be there, but just in case it isn't we check
96+
providers.get("game").loadSaveData(localStorageSave.getData("game"));
9797
console.log(`Loaded save data for game namespace.`);
9898
}
9999

0 commit comments

Comments
 (0)