diff --git a/assets/images/play/princess-lima/actor-atlas-v2.png b/assets/images/play/princess-lima/actor-atlas-v2.png old mode 100644 new mode 100755 diff --git a/assets/images/play/princess-lima/effects-atlas-v2.png b/assets/images/play/princess-lima/effects-atlas-v2.png old mode 100644 new mode 100755 diff --git a/assets/images/play/princess-lima/portrait-atlas-v2.png b/assets/images/play/princess-lima/portrait-atlas-v2.png old mode 100644 new mode 100755 diff --git a/assets/images/play/princess-lima/world-tiles-v2.png b/assets/images/play/princess-lima/world-tiles-v2.png old mode 100644 new mode 100755 diff --git a/assets/maps/princess-lima/bossArena.json b/assets/maps/princess-lima/bossArena.json old mode 100644 new mode 100755 diff --git a/assets/maps/princess-lima/camp.json b/assets/maps/princess-lima/camp.json old mode 100644 new mode 100755 diff --git a/assets/maps/princess-lima/chamber.json b/assets/maps/princess-lima/chamber.json old mode 100644 new mode 100755 diff --git a/assets/maps/princess-lima/forest.json b/assets/maps/princess-lima/forest.json old mode 100644 new mode 100755 diff --git a/assets/maps/princess-lima/fortressExterior.json b/assets/maps/princess-lima/fortressExterior.json old mode 100644 new mode 100755 diff --git a/assets/maps/princess-lima/fortressInterior.json b/assets/maps/princess-lima/fortressInterior.json old mode 100644 new mode 100755 diff --git a/assets/maps/princess-lima/mountain.json b/assets/maps/princess-lima/mountain.json old mode 100644 new mode 100755 diff --git a/assets/maps/princess-lima/ruins.json b/assets/maps/princess-lima/ruins.json old mode 100644 new mode 100755 diff --git a/assets/maps/princess-lima/village.json b/assets/maps/princess-lima/village.json old mode 100644 new mode 100755 diff --git a/assets/maps/princess-lima/world-tiles.tsj b/assets/maps/princess-lima/world-tiles.tsj old mode 100644 new mode 100755 diff --git a/assets/scripts/pages/princess-lima-v2-data.js b/assets/scripts/pages/princess-lima-v2-data.js old mode 100644 new mode 100755 index 2d1042d..a06bc34 --- a/assets/scripts/pages/princess-lima-v2-data.js +++ b/assets/scripts/pages/princess-lima-v2-data.js @@ -63,7 +63,7 @@ briar_wolf: { role: "boss", boss: true, phases: 2, health: 30, damage: 14, speed: 118, awareness: 430, attackRange: 56, cooldown: 950, telegraph: 380 }, stone_guardian: { role: "boss", boss: true, phases: 3, health: 42, damage: 17, speed: 54, awareness: 430, attackRange: 74, cooldown: 1350, telegraph: 620 }, captain: { role: "boss", boss: true, phases: 2, health: 36, damage: 15, speed: 78, awareness: 430, attackRange: 54, cooldown: 1050, telegraph: 360 }, - malrec: { role: "boss", boss: true, phases: 3, health: 64, damage: 18, speed: 70, awareness: 520, attackRange: 190, cooldown: 1200, telegraph: 520 } + malrec: { role: "boss", boss: true, phases: 3, health: 52, damage: 13, speed: 60, awareness: 520, attackRange: 190, cooldown: 1600, telegraph: 760 } }); const ITEMS = Object.freeze({ diff --git a/assets/scripts/pages/princess-lima-v2-game.js b/assets/scripts/pages/princess-lima-v2-game.js old mode 100644 new mode 100755 diff --git a/assets/scripts/pages/princess-lima-v2-maps.js b/assets/scripts/pages/princess-lima-v2-maps.js old mode 100644 new mode 100755 diff --git a/assets/scripts/pages/princess-lima-v2-scenes.js b/assets/scripts/pages/princess-lima-v2-scenes.js old mode 100644 new mode 100755 index fc3509f..055c75a --- a/assets/scripts/pages/princess-lima-v2-scenes.js +++ b/assets/scripts/pages/princess-lima-v2-scenes.js @@ -143,6 +143,7 @@ this.pathTick = 0; this.puzzleProgress = {}; this.spawnedObjects = new Set(); + this.sunAidUsed = false; } create() { controller.scene = this; @@ -366,10 +367,23 @@ return; } if (action === "boss-mechanic") { + if (this.sunAidUsed) return controller.status("The Sun Crystal is gathering its light again."); + const malrec = this.enemies.getChildren().find((enemy) => enemy.active && enemy.getData("actorId") === "malrec"); + if (!malrec) return controller.status("The Sun Crystal is warm, but its moment has not come."); + this.sunAidUsed = true; controller.state.flags.sun_veil_broken = true; + controller.state.health = Math.min(controller.state.maxHealth, controller.state.health + 25); + malrec.setData("health", Math.max(1, malrec.getData("health") - 12)); + malrec.setData("stunnedUntil", this.time.now + 2100); + malrec.setData("state", "hurt"); + malrec.setVelocity(0).setTint(0xffe39a).setTintMode(Phaser.TintModes.FILL); + this.projectiles.forEach((projectile) => projectile.active && projectile.destroy()); + this.projectiles = []; + this.time.delayedCall(350, () => malrec.active && malrec.clearTint()); controller.save(); + controller.updateHud(); this.cameras.main.flash(200, 255, 230, 150); - controller.status("The Sun Crystal tears open Malrec's veil."); + controller.status("Lima channels the Sun Crystal: Malrec's veil breaks, and your strength returns."); return; } if (action === "block-tutorial") return controller.status("Hold Shift to block. Release and strike during an enemy's recovery."); @@ -553,11 +567,15 @@ const id = enemy.getData("actorId"); const phase = enemy.getData("phase"); if (["ranged", "caster", "support"].includes(spec.role) || id === "malrec") { - const count = id === "malrec" ? phase * 2 + 1 : 1; + const count = id === "malrec" ? phase + 1 : 1; + const preparedReduction = id === "malrec" + ? (controller.state.flags.defences_disabled ? 2 : 0) + (controller.state.flags.prisoners_freed ? 2 : 0) + : 0; + const damage = Math.max(8, spec.damage - preparedReduction); for (let index = 0; index < count; index += 1) { const base = Phaser.Math.Angle.Between(enemy.x, enemy.y, this.player.x, this.player.y); - const angle = base + (index - (count - 1) / 2) * 0.22; - this.spawnProjectile(enemy.x, enemy.y, angle, spec.damage, id === "malrec" ? 185 : 145); + const angle = base + (index - (count - 1) / 2) * (id === "malrec" ? 0.3 : 0.22); + this.spawnProjectile(enemy.x, enemy.y, angle, damage, id === "malrec" ? 150 : 145); } return; } diff --git a/assets/scripts/pages/princess-lima-v2-state.js b/assets/scripts/pages/princess-lima-v2-state.js old mode 100644 new mode 100755 diff --git a/assets/scripts/pages/princess-lima-v2-systems.js b/assets/scripts/pages/princess-lima-v2-systems.js old mode 100644 new mode 100755 diff --git a/assets/scripts/pages/princess-lima-v2-ui.js b/assets/scripts/pages/princess-lima-v2-ui.js old mode 100644 new mode 100755 diff --git a/assets/scripts/vendor/easystar-0.4.4.min.js b/assets/scripts/vendor/easystar-0.4.4.min.js old mode 100644 new mode 100755 diff --git a/build-logs/gitea-build-monitor.log b/build-logs/gitea-build-monitor.log index 34a5873..3b4ae60 100755 --- a/build-logs/gitea-build-monitor.log +++ b/build-logs/gitea-build-monitor.log @@ -816,3 +816,9 @@ at , /home/zaine/master-folder/org-platform/org_web/build-logs/gite 2026-07-30T13:59:09.5410036+01:00 [INFO] Running authoring server tests with /home/zaine/master-folder/org-platform/authoring-service/.venv/bin/python. 2026-07-30T13:59:09.6127470+01:00 [INFO] Authoring server tests passed: ran=0, failures=0, errors=0, skipped=0, exit=0 2026-07-30T13:59:09.8840005+01:00 [INFO] Sent authoring server test notification. +2026-07-30T15:01:49.5468944+01:00 [INFO] Prepared current build status for zaine/org_web: severity=Info, status=success +2026-07-30T15:01:49.5644329+01:00 [INFO] Fetching recent Gitea Actions runs for zaine/org_web. +2026-07-30T15:01:51.1104245+01:00 [INFO] Sent build status notification with 1 embed(s). +2026-07-30T15:01:51.1476262+01:00 [INFO] Running authoring server tests with /home/zaine/master-folder/org-platform/authoring-service/.venv/bin/python. +2026-07-30T15:01:51.2921733+01:00 [INFO] Authoring server tests passed: ran=0, failures=0, errors=0, skipped=0, exit=0 +2026-07-30T15:01:51.6686257+01:00 [INFO] Sent authoring server test notification. diff --git a/docs/princess-lima-v2-implementation.md b/docs/princess-lima-v2-implementation.md old mode 100644 new mode 100755 diff --git a/posts/posts-list.org b/posts/posts-list.org index ab0754e..9e5c1b1 100755 --- a/posts/posts-list.org +++ b/posts/posts-list.org @@ -4,7 +4,7 @@ See the categories: @@html:Categories@@ * Posts: -- [[file:career/career-list.org][Career List]] @@html:30-07-2026 14:54@@ +- [[file:career/career-list.org][Career List]] @@html:30-07-2026 15:01@@ - [[file:career/cross-site-scripting-xss.org][Cross-Site Scripting (XSS)]] @@html:01-06-2026 10:21@@ @@html:@@ @@html:@@ - [[file:career/ha-dr.org][High Availability, Disaster Recovery and Business Continuity]] @@html:11-03-2026 17:18@@ @@html:@@ @@html:@@ - [[file:career/javascript.org][Understands the Javascript language]] @@html:11-03-2026 16:52@@ @@html:@@ @@html:@@ diff --git a/sitemap.org b/sitemap.org index 36cbb37..cec4043 100755 --- a/sitemap.org +++ b/sitemap.org @@ -104,17 +104,17 @@ flowchart TD n43 --> n49 n50["Tag: website"] n43 --> n50 - n51["Tag: update"] + n51["Tag: life"] n43 --> n51 - n52["Tag: life"] + n52["Tag: update"] n43 --> n52 - n53["Tag: education"] + n53["Tag: insights"] n43 --> n53 - n54["Tag: insights"] + n54["Tag: education"] n43 --> n54 - n55["Tag: emacs"] + n55["Tag: reading"] n43 --> n55 - n56["Tag: reading"] + n56["Tag: emacs"] n43 --> n56 n57["Tag: maths"] n43 --> n57 @@ -224,12 +224,12 @@ flowchart TD click n48 "tags/notes.html" "Tag: notes" click n49 "tags/review.html" "Tag: review" click n50 "tags/website.html" "Tag: website" - click n51 "tags/update.html" "Tag: update" - click n52 "tags/life.html" "Tag: life" - click n53 "tags/education.html" "Tag: education" - click n54 "tags/insights.html" "Tag: insights" - click n55 "tags/emacs.html" "Tag: emacs" - click n56 "tags/reading.html" "Tag: reading" + click n51 "tags/life.html" "Tag: life" + click n52 "tags/update.html" "Tag: update" + click n53 "tags/insights.html" "Tag: insights" + click n54 "tags/education.html" "Tag: education" + click n55 "tags/reading.html" "Tag: reading" + click n56 "tags/emacs.html" "Tag: emacs" click n57 "tags/maths.html" "Tag: maths" click n59 "posts/posts-intro.html" "Posts Introduction" click n60 "posts/posts-list.html" "Posts List" @@ -318,12 +318,12 @@ flowchart TD - [[file:tags/notes.org][Tag: notes]] - [[file:tags/review.org][Tag: review]] - [[file:tags/website.org][Tag: website]] - - [[file:tags/update.org][Tag: update]] - [[file:tags/life.org][Tag: life]] - - [[file:tags/education.org][Tag: education]] + - [[file:tags/update.org][Tag: update]] - [[file:tags/insights.org][Tag: insights]] - - [[file:tags/emacs.org][Tag: emacs]] + - [[file:tags/education.org][Tag: education]] - [[file:tags/reading.org][Tag: reading]] + - [[file:tags/emacs.org][Tag: emacs]] - [[file:tags/maths.org][Tag: maths]] - posts - [[file:posts/posts-intro.org][Posts Introduction]] diff --git a/tests/princess-lima-polish.test.cjs b/tests/princess-lima-polish.test.cjs index 768fec6..3c9d834 100755 --- a/tests/princess-lima-polish.test.cjs +++ b/tests/princess-lima-polish.test.cjs @@ -92,3 +92,17 @@ test("combat phases, hitboxes and enemy states are deterministic", () => { stunned: false, telegraphDone: true, attackDone: true, cooldownDone: true }), "telegraph"); }); + +test("Malrec is demanding but leaves readable counterplay", () => { + const malrec = data.ENEMIES.malrec; + assert.equal(malrec.phases, 3); + assert.ok(malrec.health <= 52); + assert.ok(malrec.damage <= 13); + assert.ok(malrec.telegraph >= 750); + assert.ok(malrec.cooldown >= 1500); + const scenes = source("assets/scripts/pages/princess-lima-v2-scenes.js"); + assert.match(scenes, /phase \+ 1/); + assert.match(scenes, /state\.health \+ 25/); + assert.match(scenes, /defences_disabled/); + assert.match(scenes, /prisoners_freed/); +}); diff --git a/tests/princess-lima-v2-state.test.cjs b/tests/princess-lima-v2-state.test.cjs old mode 100644 new mode 100755 diff --git a/tools/generate-princess-lima-maps.mjs b/tools/generate-princess-lima-maps.mjs old mode 100644 new mode 100755 diff --git a/tools/generate-princess-lima-v2-assets.py b/tools/generate-princess-lima-v2-assets.py old mode 100644 new mode 100755