diff --git a/orga/deleteLevels.txt b/orga/deleteLevels.txt new file mode 100644 index 0000000..0b95d01 --- /dev/null +++ b/orga/deleteLevels.txt @@ -0,0 +1 @@ +310,131, \ No newline at end of file diff --git a/public/html/application/end.html b/public/html/application/end.html new file mode 100644 index 0000000..ca57716 --- /dev/null +++ b/public/html/application/end.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/public/index.html b/public/index.html index 271be21..41ead69 100755 --- a/public/index.html +++ b/public/index.html @@ -28,7 +28,7 @@ - Stories + WordRotator @@ -52,7 +52,7 @@
- Stories + WordRotator
{ + this.getLevel().checkHasWon(new Promise((resolve, reject) => { this.element.addEventListener("animationend", resolve); })); // return new DelayPromise(250); - return new Promise(function(resolve) { + return new Promise(function (resolve) { setTimeout(resolve, 250); }); } } + sameAs(otherSegment) { + if (!(otherSegment instanceof ParentSegment) || otherSegment.children.length !== this.children.length) { + return false; + } + for (let i = 0; i < this.children.length; i++) { + if (!this.children[i].sameAs(otherSegment.children[i])) { + return false; + } + } + return true; + } + applyRotations(rotations) { // debugger; this.rotation = rotations[0]; @@ -3129,7 +3145,9 @@ class ParentSegment extends Segment { return false; } } - return super.isSolved(); + return (this.rotation === 0 || ( + this.children[0].sameAs(this.children[2]) && this.children[1].sameAs(this.children[3]) && ( + this.rotation === 2 || this.children[0].sameAs(this.children[1])))) } setChildren(children) { @@ -3173,19 +3191,21 @@ class ParentSegment extends Segment { } } -class LeafSegment extends Segment{ +class LeafSegment extends Segment { constructor(element, leaf) { super(element); this.leaf = 'A'; - if (Helper.isNotNull(leaf)) - { + if (Helper.isNotNull(leaf)) { this.setLeaf(leaf); } } - - setLeaf(leaf) - { + + sameAs(otherSegment) { + return (otherSegment instanceof LeafSegment && otherSegment.leaf === this.leaf); + } + + setLeaf(leaf) { this.leaf = leaf; } @@ -3359,6 +3379,24 @@ class RowLevel extends Level { } } +class SimpleLevel extends RowLevel{ + constructor(container) { + super(container, 6); + } +} + +class RowLevel8 extends RowLevel{ + constructor(container) { + super(container, 8); + } +} + +class RowLevel10 extends RowLevel{ + constructor(container) { + super(container, 10); + } +} + class LevelHelper { static setLevelType(typeId, level) { LevelHelper.types[typeId] = level; @@ -3384,16 +3422,11 @@ class LevelHelper { } } -LevelHelper.types = {}; - -class SimpleLevel extends RowLevel{ - - constructor(container) { - super(container, 6); - } -} - -LevelHelper.setLevelType(20, SimpleLevel); +LevelHelper.types = { + 20: SimpleLevel, + 40: RowLevel8, + 60: RowLevel10, +}; class WordRotatorDb extends MyDb { @@ -3433,13 +3466,23 @@ class WordRotatorDb extends MyDb { async loadNextLevel(rendererTypes) { const levels = await this.loadMany("difficulty", IDBKeyRange.lowerBound(0), WordRotatorDb.OBJECT_STORE.LEVEL); + let wrongLevels = []; let newLevels = []; + let difficulty = -1; for (let i = 0, n = levels.length; i < n; i++) { - if (!levels[i]["deleted"] && !levels[i]["played"] && rendererTypes.indexOf(levels[i]["rendererType"]) !== -1) { + if ((difficulty < 0 || difficulty === levels[i]["difficulty"]) && !levels[i]["deleted"] && !levels[i]["played"] && rendererTypes.indexOf(levels[i]["rendererType"]) !== -1) { newLevels.push(levels[i]); + difficulty = levels[i]["difficulty"]; + } + else if (levels[i]["difficulty"] !== 0 && !levels[i]["deleted"] && !levels[i]["played"] ) { + wrongLevels.push(levels[i]); } } + console.log("levels count:", newLevels.length); + console.log("new levels:", newLevels); + console.log("wrong levels:", wrongLevels); + if (newLevels.length === 0) { return null; } @@ -3447,8 +3490,7 @@ class WordRotatorDb extends MyDb { return newLevels[Math.round(Math.random() * newLevels.length) % newLevels.length]; } - async saveLevelPlayed(levelId) - { + async saveLevelPlayed(levelId) { const level = await this.loadLevel(levelId); level.played = true; return await this.saveObj(level, WordRotatorDb.OBJECT_STORE.LEVEL); @@ -3460,15 +3502,22 @@ WordRotatorDb.OBJECT_STORE = { }; WordRotatorDb.instance = null; +class EndSite extends AbstractSite$1{ + constructor(siteManager) { + super(siteManager, "html/application/end.html"); + } +} + class LevelSite extends AbstractSite$1 { constructor(siteManager) { - super(siteManager, "html/application/level.html", "level"); + super(siteManager, "html/application/level.html"); } createActionBarMenu(menu) { menu = super.createActionBarMenu(menu); - this.levelCounterAction = new MenuAction("", function(){}, Menu.SHOW_ALWAYS, 0); + this.levelCounterAction = new MenuAction("", function () { + }, Menu.SHOW_ALWAYS, 0); this.levelCounterAction.setShouldTranslate(false); menu.addAction(this.levelCounterAction); @@ -3476,10 +3525,7 @@ class LevelSite extends AbstractSite$1 { } onConstruct(args) { - this.setTitle("Level"); - this.levelCounter = Helper.nonNull(localStorage.getItem("levelCounter"), 1); - return super.onConstruct(args); } @@ -3500,7 +3546,7 @@ class LevelSite extends AbstractSite$1 { let self = this; let continueButton = this.findBy("#continue-button"); - continueButton.addEventListener("click", ()=> { + continueButton.addEventListener("click", () => { self.nextLevel(); }); @@ -3520,7 +3566,12 @@ class LevelSite extends AbstractSite$1 { this._siteContent.classList.remove('won'); const db = WordRotatorDb.getInstance(); - const nextLevelJson = await db.loadNextLevel([20]); + const nextLevelJson = await db.loadNextLevel([40]); + if (nextLevelJson === null) + { + this.startSite(EndSite); + return; + } const level = LevelHelper.inflateLevel(nextLevelJson, this.templateContainer); const self = this; @@ -3534,7 +3585,7 @@ class LevelSite extends AbstractSite$1 { let levelSegment = this.findBy("#level"); levelSegment.removeAllChildren().appendChild(level.getRootSegment().getElement()); let scaleHelper = new ScaleHelper(); - scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 2,level.words[0].length * 2); + scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 2, level.words[0].length * 2); this.level = level; } @@ -3543,16 +3594,22 @@ class LevelSite extends AbstractSite$1 { } } - async levelWon(level){ - const db = WordRotatorDb.getInstance(); - // db.saveLevelPlayed(level); + async levelWon(level) { + try { + const db = WordRotatorDb.getInstance(); + const savePromise = db.saveLevelPlayed(level.getId()); - this.levelCounter++; - localStorage.setItem("levelCounter", this.levelCounter); - this.levelCounterAction.setTitle(this.levelCounter); - this.levelCounterAction.redraw(); + this.levelCounter++; + localStorage.setItem("levelCounter", this.levelCounter); + this.levelCounterAction.setTitle(this.levelCounter); + this.levelCounterAction.redraw(); - this._siteContent.classList.add('won'); + this._siteContent.classList.add('won'); + await savePromise; + } + catch (e) { + console.error(e); + } } } diff --git a/src/module/Application/pwa/html/application/end.html b/src/module/Application/pwa/html/application/end.html new file mode 100644 index 0000000..6b995c4 --- /dev/null +++ b/src/module/Application/pwa/html/application/end.html @@ -0,0 +1,3 @@ +
+
+
\ No newline at end of file diff --git a/src/module/Application/pwa/js/WordRotatorDb.js b/src/module/Application/pwa/js/WordRotatorDb.js index 7eb4c2c..a28deed 100644 --- a/src/module/Application/pwa/js/WordRotatorDb.js +++ b/src/module/Application/pwa/js/WordRotatorDb.js @@ -38,13 +38,23 @@ export class WordRotatorDb extends MyDb { async loadNextLevel(rendererTypes) { const levels = await this.loadMany("difficulty", IDBKeyRange.lowerBound(0), WordRotatorDb.OBJECT_STORE.LEVEL); + let wrongLevels = []; let newLevels = []; + let difficulty = -1; for (let i = 0, n = levels.length; i < n; i++) { - if (!levels[i]["deleted"] && !levels[i]["played"] && rendererTypes.indexOf(levels[i]["rendererType"]) !== -1) { + if ((difficulty < 0 || difficulty === levels[i]["difficulty"]) && !levels[i]["deleted"] && !levels[i]["played"] && rendererTypes.indexOf(levels[i]["rendererType"]) !== -1) { newLevels.push(levels[i]); + difficulty = levels[i]["difficulty"]; + } + else if (levels[i]["difficulty"] !== 0 && !levels[i]["deleted"] && !levels[i]["played"] ) { + wrongLevels.push(levels[i]); } } + console.log("levels count:", newLevels.length); + console.log("new levels:", newLevels); + console.log("wrong levels:", wrongLevels); + if (newLevels.length === 0) { return null; } @@ -52,8 +62,7 @@ export class WordRotatorDb extends MyDb { return newLevels[Math.round(Math.random() * newLevels.length) % newLevels.length]; } - async saveLevelPlayed(levelId) - { + async saveLevelPlayed(levelId) { const level = await this.loadLevel(levelId); level.played = true; return await this.saveObj(level, WordRotatorDb.OBJECT_STORE.LEVEL); diff --git a/src/module/Application/pwa/js/site/EndSite.js b/src/module/Application/pwa/js/site/EndSite.js new file mode 100644 index 0000000..ef4fcac --- /dev/null +++ b/src/module/Application/pwa/js/site/EndSite.js @@ -0,0 +1,7 @@ +import {AbstractSite} from "../../../../../js/lib/pwa-lib"; + +export class EndSite extends AbstractSite{ + constructor(siteManager) { + super(siteManager, "html/application/end.html"); + } +} \ No newline at end of file diff --git a/src/module/Application/pwa/js/site/LevelSite.js b/src/module/Application/pwa/js/site/LevelSite.js index 6d61e33..a9ae631 100644 --- a/src/module/Application/pwa/js/site/LevelSite.js +++ b/src/module/Application/pwa/js/site/LevelSite.js @@ -6,16 +6,18 @@ import {SimpleLevel} from "../wordrotator/Level/SimpleLevel"; import {LevelHelper} from "../wordrotator/Level/LevelHelper"; import {WordRotatorDb} from "../WordRotatorDb"; import {ScaleHelper} from "../../../../../js/lib/pwa-assets"; +import {EndSite} from "./EndSite"; export class LevelSite extends AbstractSite { constructor(siteManager) { - super(siteManager, "html/application/level.html", "level"); + super(siteManager, "html/application/level.html"); } createActionBarMenu(menu) { menu = super.createActionBarMenu(menu); - this.levelCounterAction = new MenuAction("", function(){}, Menu.SHOW_ALWAYS, 0); + this.levelCounterAction = new MenuAction("", function () { + }, Menu.SHOW_ALWAYS, 0); this.levelCounterAction.setShouldTranslate(false); menu.addAction(this.levelCounterAction); @@ -23,10 +25,7 @@ export class LevelSite extends AbstractSite { } onConstruct(args) { - this.setTitle("Level"); - this.levelCounter = Helper.nonNull(localStorage.getItem("levelCounter"), 1); - return super.onConstruct(args); } @@ -47,7 +46,7 @@ export class LevelSite extends AbstractSite { let self = this; let continueButton = this.findBy("#continue-button"); - continueButton.addEventListener("click", ()=> { + continueButton.addEventListener("click", () => { self.nextLevel(); }); @@ -67,7 +66,13 @@ export class LevelSite extends AbstractSite { this._siteContent.classList.remove('won'); const db = WordRotatorDb.getInstance(); - const nextLevelJson = await db.loadNextLevel([20]); + // const nextLevelJson = await db.loadNextLevel([20,40,60]); + const nextLevelJson = await db.loadNextLevel([40]); + if (nextLevelJson === null) + { + this.startSite(EndSite); + return; + } const level = LevelHelper.inflateLevel(nextLevelJson, this.templateContainer); const self = this; @@ -81,7 +86,7 @@ export class LevelSite extends AbstractSite { let levelSegment = this.findBy("#level"); levelSegment.removeAllChildren().appendChild(level.getRootSegment().getElement()); let scaleHelper = new ScaleHelper(); - scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 2,level.words[0].length * 2); + scaleHelper.scaleToFull(levelSegment, levelSegment.parentElement, false, false, 2, level.words[0].length * 2); this.level = level; } @@ -90,15 +95,21 @@ export class LevelSite extends AbstractSite { } } - async levelWon(level){ - const db = WordRotatorDb.getInstance(); - // db.saveLevelPlayed(level); + async levelWon(level) { + try { + const db = WordRotatorDb.getInstance(); + const savePromise = db.saveLevelPlayed(level.getId()); - this.levelCounter++; - localStorage.setItem("levelCounter", this.levelCounter); - this.levelCounterAction.setTitle(this.levelCounter); - this.levelCounterAction.redraw(); + this.levelCounter++; + localStorage.setItem("levelCounter", this.levelCounter); + this.levelCounterAction.setTitle(this.levelCounter); + this.levelCounterAction.redraw(); - this._siteContent.classList.add('won'); + this._siteContent.classList.add('won'); + await savePromise; + } + catch (e) { + console.error(e); + } } } \ No newline at end of file diff --git a/src/module/Application/pwa/js/wordrotator/Level/LevelHelper.js b/src/module/Application/pwa/js/wordrotator/Level/LevelHelper.js index 6a866a4..2f0f419 100644 --- a/src/module/Application/pwa/js/wordrotator/Level/LevelHelper.js +++ b/src/module/Application/pwa/js/wordrotator/Level/LevelHelper.js @@ -1,3 +1,7 @@ +import {SimpleLevel} from "./SimpleLevel"; +import {RowLevel8} from "./RowLevel8"; +import {RowLevel10} from "./RowLevel10"; + export class LevelHelper { static setLevelType(typeId, level) { LevelHelper.types[typeId] = level; @@ -23,4 +27,8 @@ export class LevelHelper { } } -LevelHelper.types = {}; \ No newline at end of file +LevelHelper.types = { + 20: SimpleLevel, + 40: RowLevel8, + 60: RowLevel10, +}; \ No newline at end of file diff --git a/src/module/Application/pwa/js/wordrotator/Level/RowLevel10.js b/src/module/Application/pwa/js/wordrotator/Level/RowLevel10.js new file mode 100644 index 0000000..6cfd4a4 --- /dev/null +++ b/src/module/Application/pwa/js/wordrotator/Level/RowLevel10.js @@ -0,0 +1,7 @@ +import {RowLevel} from "./RowLevel"; + +export class RowLevel10 extends RowLevel{ + constructor(container) { + super(container, 10); + } +} diff --git a/src/module/Application/pwa/js/wordrotator/Level/RowLevel8.js b/src/module/Application/pwa/js/wordrotator/Level/RowLevel8.js new file mode 100644 index 0000000..85b234d --- /dev/null +++ b/src/module/Application/pwa/js/wordrotator/Level/RowLevel8.js @@ -0,0 +1,7 @@ +import {RowLevel} from "./RowLevel"; + +export class RowLevel8 extends RowLevel{ + constructor(container) { + super(container, 8); + } +} diff --git a/src/module/Application/pwa/js/wordrotator/Level/SimpleLevel.js b/src/module/Application/pwa/js/wordrotator/Level/SimpleLevel.js index d45f728..76d9fae 100644 --- a/src/module/Application/pwa/js/wordrotator/Level/SimpleLevel.js +++ b/src/module/Application/pwa/js/wordrotator/Level/SimpleLevel.js @@ -1,11 +1,7 @@ import {RowLevel} from "./RowLevel"; -import {LevelHelper} from "./LevelHelper"; export class SimpleLevel extends RowLevel{ - constructor(container) { super(container, 6); } -} - -LevelHelper.setLevelType(20, SimpleLevel); \ No newline at end of file +} \ No newline at end of file diff --git a/src/module/Application/pwa/js/wordrotator/Segment/LeafSegment.js b/src/module/Application/pwa/js/wordrotator/Segment/LeafSegment.js index 8e4a60f..bcd2935 100644 --- a/src/module/Application/pwa/js/wordrotator/Segment/LeafSegment.js +++ b/src/module/Application/pwa/js/wordrotator/Segment/LeafSegment.js @@ -1,19 +1,21 @@ import {Segment} from "./Segment"; import {Helper} from "../../../../../../js/lib/pwa-lib"; -export class LeafSegment extends Segment{ +export class LeafSegment extends Segment { constructor(element, leaf) { super(element); this.leaf = 'A'; - if (Helper.isNotNull(leaf)) - { + if (Helper.isNotNull(leaf)) { this.setLeaf(leaf); } } - - setLeaf(leaf) - { + + sameAs(otherSegment) { + return (otherSegment instanceof LeafSegment && otherSegment.leaf === this.leaf); + } + + setLeaf(leaf) { this.leaf = leaf; } diff --git a/src/module/Application/pwa/js/wordrotator/Segment/ParentSegment.js b/src/module/Application/pwa/js/wordrotator/Segment/ParentSegment.js index 43beeea..3d47763 100644 --- a/src/module/Application/pwa/js/wordrotator/Segment/ParentSegment.js +++ b/src/module/Application/pwa/js/wordrotator/Segment/ParentSegment.js @@ -14,16 +14,28 @@ export class ParentSegment extends Segment { this.rotation %= 360; this._updateRotationClass(); - this.getLevel().checkHasWon(new Promise((resolve, reject)=>{ + this.getLevel().checkHasWon(new Promise((resolve, reject) => { this.element.addEventListener("animationend", resolve); })); // return new DelayPromise(250); - return new Promise(function(resolve) { + return new Promise(function (resolve) { setTimeout(resolve, 250); }); } } + sameAs(otherSegment) { + if (!(otherSegment instanceof ParentSegment) || otherSegment.children.length !== this.children.length) { + return false; + } + for (let i = 0; i < this.children.length; i++) { + if (!this.children[i].sameAs(otherSegment.children[i])) { + return false; + } + } + return true; + } + applyRotations(rotations) { // debugger; this.rotation = rotations[0]; @@ -40,7 +52,9 @@ export class ParentSegment extends Segment { return false; } } - return super.isSolved(); + return (this.rotation === 0 || ( + this.children[0].sameAs(this.children[2]) && this.children[1].sameAs(this.children[3]) && ( + this.rotation === 2 || this.children[0].sameAs(this.children[1])))) } setChildren(children) { diff --git a/src/module/Application/pwa/js/wordrotator/Segment/Segment.js b/src/module/Application/pwa/js/wordrotator/Segment/Segment.js index d0fd4bb..b41337a 100644 --- a/src/module/Application/pwa/js/wordrotator/Segment/Segment.js +++ b/src/module/Application/pwa/js/wordrotator/Segment/Segment.js @@ -7,6 +7,10 @@ export class Segment{ this.parent = null; } + sameAs(otherSegment){ + return false; + } + setParent(parent) { this.parent = parent;