Replace embedded mermaid with rendered PNG images
- Render KQVI puzzle dependency chart as PNG (preview + full-size) - Replace mermaid code block with image embed linking to full version - Remove broken mermaid-lightbox.js from book.toml and delete file - Update Chart Configuration section (was Mermaid Configuration) - Images copied to src/inspiration/ for mdbook build
This commit is contained in:
@@ -7,7 +7,7 @@ description = "A taxonomy of puzzle design patterns from classic point-and-click
|
||||
[output.html]
|
||||
git-repository-url = "https://github.com/noti/puzzle-design-kb"
|
||||
edit-url-template = "https://github.com/noti/puzzle-design-kb/edit/main/{path}"
|
||||
additional-js = ["mermaid.min.js", "mermaid-init.js", "mermaid-lightbox.js"]
|
||||
additional-js = ["mermaid.min.js", "mermaid-init.js"]
|
||||
|
||||
[output.html.playground]
|
||||
editable = true
|
||||
|
||||
@@ -1,196 +0,0 @@
|
||||
// Mermaid Lightbox - Click to expand diagrams in full-size modal
|
||||
(() => {
|
||||
const lightboxHTML = `
|
||||
<div id="mermaid-lightbox" class="mermaid-lightbox" aria-hidden="true">
|
||||
<div class="mermaid-lightbox-content">
|
||||
<button class="mermaid-lightbox-close" aria-label="Close">×</button>
|
||||
<div class="mermaid-lightbox-diagram"></div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
const styleHTML = `
|
||||
<style>
|
||||
.mermaid-container {
|
||||
position: relative;
|
||||
margin: 1.5em 0;
|
||||
}
|
||||
|
||||
.mermaid-expand-btn {
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
right: 8px;
|
||||
z-index: 10;
|
||||
background: rgba(0, 0, 0, 0.6);
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
padding: 6px 12px;
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
opacity: 0;
|
||||
transition: opacity 0.2s ease;
|
||||
}
|
||||
|
||||
.mermaid-container:hover .mermaid-expand-btn {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.mermaid-expand-btn:hover {
|
||||
background: rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.mermaid-lightbox {
|
||||
display: none;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba(0, 0, 0, 0.9);
|
||||
z-index: 9999;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 20px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.mermaid-lightbox.active {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.mermaid-lightbox-content {
|
||||
position: relative;
|
||||
max-width: 95vw;
|
||||
max-height: 95vh;
|
||||
overflow: auto;
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.mermaid-lightbox-close {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
z-index: 10001;
|
||||
background: rgba(0, 0, 0, 0.7);
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
font-size: 24px;
|
||||
cursor: pointer;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.mermaid-lightbox-close:hover {
|
||||
background: rgba(0, 0, 0, 0.9);
|
||||
}
|
||||
|
||||
.mermaid-lightbox-diagram {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.mermaid-lightbox-diagram svg {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.mermaid-lightbox-diagram .mermaid {
|
||||
background: white;
|
||||
}
|
||||
</style>
|
||||
`;
|
||||
|
||||
// Inject styles
|
||||
document.head.insertAdjacentHTML('beforeend', styleHTML);
|
||||
|
||||
// Inject lightbox HTML
|
||||
document.body.insertAdjacentHTML('beforeend', lightboxHTML);
|
||||
|
||||
const lightbox = document.getElementById('mermaid-lightbox');
|
||||
const lightboxDiagram = lightbox.querySelector('.mermaid-lightbox-diagram');
|
||||
const closeBtn = lightbox.querySelector('.mermaid-lightbox-close');
|
||||
|
||||
// Wait for mermaid to initialize, then wrap each mermaid diagram
|
||||
function initLightbox() {
|
||||
const mermaidPres = document.querySelectorAll('pre.mermaid');
|
||||
|
||||
mermaidPres.forEach((pre) => {
|
||||
// Only add container and button if not already wrapped
|
||||
if (pre.parentElement.classList.contains('mermaid-container')) return;
|
||||
|
||||
// Wrap pre in container
|
||||
const container = document.createElement('div');
|
||||
container.className = 'mermaid-container';
|
||||
pre.parentNode.insertBefore(container, pre);
|
||||
container.appendChild(pre);
|
||||
|
||||
// Add expand button
|
||||
const btn = document.createElement('button');
|
||||
btn.className = 'mermaid-expand-btn';
|
||||
btn.textContent = 'View Full Size';
|
||||
btn.setAttribute('aria-label', 'Expand diagram to full size');
|
||||
container.appendChild(btn);
|
||||
|
||||
// Click handler for expanding
|
||||
btn.addEventListener('click', (e) => {
|
||||
e.stopPropagation();
|
||||
openLightbox(pre);
|
||||
});
|
||||
|
||||
// Also make the pre element clickable
|
||||
pre.style.cursor = 'pointer';
|
||||
pre.addEventListener('click', (e) => {
|
||||
e.stopPropagation();
|
||||
openLightbox(pre);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function openLightbox(pre) {
|
||||
// Clone the mermaid content for the lightbox
|
||||
lightboxDiagram.innerHTML = '';
|
||||
const clone = pre.cloneNode(true);
|
||||
clone.className = 'mermaid';
|
||||
lightboxDiagram.appendChild(clone);
|
||||
|
||||
lightbox.setAttribute('aria-hidden', 'false');
|
||||
document.body.style.overflow = 'hidden';
|
||||
|
||||
// Re-render mermaid in lightbox if needed
|
||||
if (typeof mermaid !== 'undefined') {
|
||||
mermaid.init({ node: clone.parentElement }, clone);
|
||||
}
|
||||
}
|
||||
|
||||
function closeLightbox() {
|
||||
lightbox.setAttribute('aria-hidden', 'true');
|
||||
document.body.style.overflow = '';
|
||||
lightboxDiagram.innerHTML = '';
|
||||
}
|
||||
|
||||
// Event listeners
|
||||
closeBtn.addEventListener('click', closeLightbox);
|
||||
|
||||
lightbox.addEventListener('click', (e) => {
|
||||
if (e.target === lightbox) {
|
||||
closeLightbox();
|
||||
}
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'Escape' && lightbox.classList.contains('active')) {
|
||||
closeLightbox();
|
||||
}
|
||||
});
|
||||
|
||||
// Initialize after DOM is ready
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', initLightbox);
|
||||
} else {
|
||||
// Small delay to ensure mermaid.init() has run
|
||||
setTimeout(initLightbox, 100);
|
||||
}
|
||||
})();
|
||||
BIN
src/inspiration/kings-quest-vi-chart-full.png
Normal file
BIN
src/inspiration/kings-quest-vi-chart-full.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 192 KiB |
BIN
src/inspiration/kings-quest-vi-chart-preview.png
Normal file
BIN
src/inspiration/kings-quest-vi-chart-preview.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
@@ -4,672 +4,9 @@ This chart maps the critical puzzle dependencies in Sierra's King's Quest VI (19
|
||||
|
||||
## Puzzle Dependency Flowchart
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
%% =============================================================================
|
||||
%% STYLE DEFINITIONS - Modern, accessible colors with 4.5:1+ contrast
|
||||
%% =============================================================================
|
||||
classDef start_end fill:#FFD700,stroke:#996600,stroke-width:3px,color:#000000
|
||||
classDef problem fill:#FFB3B3,stroke:#8B0000,stroke-width:2px,color:#8B0000
|
||||
classDef action fill:#B3FFB3,stroke:#006400,stroke-width:2px,color:#006400
|
||||
classDef outcome fill:#B3D9FF,stroke:#004080,stroke-width:2px,color:#004080
|
||||
classDef area_ioc fill:#E6E6FF,stroke:#333399,stroke-width:2px
|
||||
classDef area_iow fill:#FFE6FF,stroke:#660066,stroke-width:2px
|
||||
classDef area_iob fill:#FFE6CC,stroke:#663300,stroke-width:2px
|
||||
classDef area_maze fill:#CCFFCC,stroke:#006633,stroke-width:2px
|
||||
classDef area_ism fill:#CCFFFF,stroke:#006666,stroke-width:2px
|
||||
classDef area_iom fill:#FFFFCC,stroke:#666600,stroke-width:2px
|
||||
classDef area_rod fill:#F0F0F0,stroke:#333333,stroke-width:2px
|
||||
classDef area_castle fill:#FFD9CC,stroke:#663320,stroke-width:2px
|
||||
classDef area_final fill:#FFCCE6,stroke:#660033,stroke-width:2px
|
||||
[](kings-quest-vi-chart-full.png)
|
||||
|
||||
%% =============================================================================
|
||||
%% PHASE 0: START - Isle of the Crown Beach
|
||||
%% =============================================================================
|
||||
subgraph area_start["START"]
|
||||
START(["START: Wake on Isle of the Crown Beach"])
|
||||
end
|
||||
|
||||
%% Beach - Item Collection (parallel independent actions)
|
||||
subgraph area_beach["Isle of the Crown - Beach"]
|
||||
A_MOVE_PLANK["A: Move debris on beach"]
|
||||
O_RECEIVE_COPPER_COIN["O: Receive Copper Coin"]
|
||||
A_EXAMINE_DEBRIS["A: Examine debris more closely"]
|
||||
O_RECEIVE_ROYAL_RING["O: Receive Royal Insignia Ring"]
|
||||
|
||||
A_MOVE_PLANK --> O_RECEIVE_COPPER_COIN
|
||||
A_EXAMINE_DEBRIS --> O_RECEIVE_ROYAL_RING
|
||||
end
|
||||
|
||||
START --> A_MOVE_PLANK
|
||||
START --> A_EXAMINE_DEBRIS
|
||||
|
||||
%% Castle Entry - Guards
|
||||
subgraph area_castle_entry["Isle of the Crown - Castle Entry"]
|
||||
A_SHOW_RING_TO_GUARDS["A: Show Royal Ring to guards"]
|
||||
C1["Consequence: Meet Vizier, then kicked out"]
|
||||
end
|
||||
|
||||
O_RECEIVE_ROYAL_RING --> A_SHOW_RING_TO_GUARDS
|
||||
A_SHOW_RING_TO_GUARDS --> C1
|
||||
|
||||
%% Village - Multiple Parallel Independent Paths
|
||||
subgraph area_village["Isle of the Crown - Village"]
|
||||
%% Pawn Shop - Locked Choice Mechanic (trade sequence)
|
||||
P_PROBLEM_PAWN_SHOP["Problem: Need items from Pawn Shop"]
|
||||
A_TALK_TO_PAWN_BROKER["A: Talk to Pawn Shop broker"]
|
||||
O_RECEIVE_NIGHTINGALE["O: Receive Mechanical Nightingale"]
|
||||
O_RECEIVE_MINT["O: Receive Mint"]
|
||||
O_RECEIVE_TINDERBOX["O: Receive Tinderbox"]
|
||||
O_RECEIVE_FLUTE["O: Receive Flute"]
|
||||
O_RECEIVE_PAINTBRUSH["O: Receive Paintbrush"]
|
||||
O_RECEIVE_INK["O: Receive Invisible Ink Bottle"]
|
||||
|
||||
%% Magic Map Trade
|
||||
P_PROBLEM_NEED_MAP["Problem: Cannot travel to other islands"]
|
||||
A_TRADE_RING_FOR_MAP["A: Trade Royal Ring for Magic Map"]
|
||||
O_RECEIVE_MAGIC_MAP["O: Receive Magic Map"]
|
||||
|
||||
%% Ferryman - Rabbit's Foot
|
||||
P_PROBLEM_FERRYMAN["Problem: Need ferry info and items"]
|
||||
A_TALK_TO_FERRYMAN["A: Talk to Ali the ferryman"]
|
||||
O_RECEIVE_RABBIT_FOOT["O: Receive Rabbit's Foot"]
|
||||
|
||||
%% Jollo in Bookstore
|
||||
P_PROBLEM_JOLLO["Problem: Need Jollo's help for story"]
|
||||
A_TALK_TO_JOLLO["A: Talk to Jollo in Bookstore"]
|
||||
O_RECEIVE_JOLLO_TRUST["O: Receive Jollo's trust"]
|
||||
A_SHOW_RING_TO_JOLLO["A: Show Royal Ring to Jollo"]
|
||||
|
||||
%% Love Poem (optional)
|
||||
A_SEARCH_BOOKSHELF["A: Search poetry bookshelf"]
|
||||
O_RECEIVE_LOVE_POEM["O: Receive Love Poem"]
|
||||
end
|
||||
|
||||
C1 --> P_PROBLEM_PAWN_SHOP
|
||||
C1 --> P_PROBLEM_NEED_MAP
|
||||
C1 --> P_PROBLEM_FERRYMAN
|
||||
C1 --> P_PROBLEM_JOLLO
|
||||
|
||||
%% Village - Parallel independent paths (S3, S4, S5, S6 in original)
|
||||
P_PROBLEM_PAWN_SHOP --> A_TALK_TO_PAWN_BROKER
|
||||
A_TALK_TO_PAWN_BROKER --> O_RECEIVE_NIGHTINGALE
|
||||
A_TALK_TO_PAWN_BROKER --> O_RECEIVE_MINT
|
||||
A_TALK_TO_PAWN_BROKER --> O_RECEIVE_INK
|
||||
O_RECEIVE_NIGHTINGALE --> A_TRADE_WITH_BROKER_N["A: Trade Nightingale"]
|
||||
A_TRADE_WITH_BROKER_N -.-> O_RECEIVE_FLUTE
|
||||
O_RECEIVE_FLUTE --> A_TRADE_WITH_BROKER_F["A: Trade Flute"]
|
||||
A_TRADE_WITH_BROKER_F -.-> O_RECEIVE_TINDERBOX
|
||||
O_RECEIVE_TINDERBOX --> A_TRADE_WITH_BROKER_T["A: Trade Tinderbox"]
|
||||
A_TRADE_WITH_BROKER_T -.-> O_RECEIVE_PAINTBRUSH
|
||||
|
||||
P_PROBLEM_FERRYMAN --> A_TALK_TO_FERRYMAN
|
||||
A_TALK_TO_FERRYMAN --> O_RECEIVE_RABBIT_FOOT
|
||||
|
||||
P_PROBLEM_NEED_MAP --> A_TRADE_RING_FOR_MAP
|
||||
A_TRADE_RING_FOR_MAP --> O_RECEIVE_MAGIC_MAP
|
||||
|
||||
P_PROBLEM_JOLLO --> A_TALK_TO_JOLLO
|
||||
A_TALK_TO_JOLLO --> O_RECEIVE_JOLLO_TRUST
|
||||
O_RECEIVE_JOLLO_TRUST --> A_SHOW_RING_TO_JOLLO
|
||||
|
||||
A_SEARCH_BOOKSHELF --> O_RECEIVE_LOVE_POEM
|
||||
|
||||
%% =============================================================================
|
||||
%% PHASE 2: Isle of Wonder - Five Senses Gnomes
|
||||
%% =============================================================================
|
||||
subgraph area_iow_gnomes["Isle of Wonder - Five Senses Gnomes"]
|
||||
P_PROBLEM_GNOMES["Problem: Five gnomes block path north"]
|
||||
|
||||
A_GIVE_STINKY_FLOWER["A: Give Flower of Stench to Smell gnome"]
|
||||
O_GNOMES_SMELL_DONE["O: Smell gnome satisfied"]
|
||||
|
||||
A_PLAY_NIGHTINGALE["A: Play Nightingale for Hearing gnome"]
|
||||
O_GNOMES_HEARING_DONE["O: Hearing gnome satisfied"]
|
||||
|
||||
A_GIVE_MINT["A: Give Mint to Taste gnome"]
|
||||
O_GNOMES_TASTE_DONE["O: Taste gnome satisfied"]
|
||||
|
||||
A_GIVE_RABBIT_FOOT["A: Give Rabbit Foot to Touch gnome"]
|
||||
O_GNOMES_TOUCH_DONE["O: Touch gnome satisfied"]
|
||||
|
||||
A_USE_INK_ON_SELF["A: Use Invisible Ink on self"]
|
||||
O_GNOMES_SIGHT_DONE["O: Sight gnome satisfied"]
|
||||
end
|
||||
|
||||
O_RECEIVE_MAGIC_MAP --> P_PROBLEM_GNOMES
|
||||
O_RECEIVE_NIGHTINGALE --> A_PLAY_NIGHTINGALE
|
||||
O_RECEIVE_MINT --> A_GIVE_MINT
|
||||
O_RECEIVE_RABBIT_FOOT --> A_GIVE_RABBIT_FOOT
|
||||
O_RECEIVE_INK --> A_USE_INK_ON_SELF
|
||||
|
||||
O_RECEIVE_STINKY_FLOWER --> A_GIVE_STINKY_FLOWER
|
||||
P_PROBLEM_GNOMES --> A_GIVE_STINKY_FLOWER
|
||||
P_PROBLEM_GNOMES --> A_PLAY_NIGHTINGALE
|
||||
P_PROBLEM_GNOMES --> A_GIVE_MINT
|
||||
P_PROBLEM_GNOMES --> A_GIVE_RABBIT_FOOT
|
||||
P_PROBLEM_GNOMES --> A_USE_INK_ON_SELF
|
||||
|
||||
A_GIVE_STINKY_FLOWER --> O_GNOMES_SMELL_DONE
|
||||
A_PLAY_NIGHTINGALE --> O_GNOMES_HEARING_DONE
|
||||
A_GIVE_MINT --> O_GNOMES_TASTE_DONE
|
||||
A_GIVE_RABBIT_FOOT --> O_GNOMES_TOUCH_DONE
|
||||
A_USE_INK_ON_SELF --> O_GNOMES_SIGHT_DONE
|
||||
|
||||
%% Isle of Wonder Beach - Oyster Pearl (INDEPENDENT of gnomes)
|
||||
subgraph area_iow_beach["Isle of Wonder - Beach (independent)"]
|
||||
A_READ_BOOK_TO_OYSTER["A: Read Boring Book to Oyster"]
|
||||
O_RECEIVE_PEARL["O: Receive Pearl"]
|
||||
end
|
||||
|
||||
O_GNOMES_SMELL_DONE & O_GNOMES_HEARING_DONE & O_GNOMES_TASTE_DONE & O_GNOMES_TOUCH_DONE & O_GNOMES_SIGHT_DONE --> C2["Path through gnomes now open"]
|
||||
C2 --> A_READ_BOOK_TO_OYSTER
|
||||
A_READ_BOOK_TO_OYSTER --> O_RECEIVE_PEARL
|
||||
|
||||
%% =============================================================================
|
||||
%% PHASE 3: Isle of Wonder - Garden, Chessboard, Point
|
||||
%% =============================================================================
|
||||
subgraph area_iow_garden["Isle of Wonder - Garden"]
|
||||
A_PLAY_FLUTE_FLOWERS["A: Play Flute for shy flowers"]
|
||||
O_RECEIVE_HOLE_IN_WALL["O: Receive Hole-in-the-Wall"]
|
||||
|
||||
A_PICK_ICEY_LETTUCE["A: Pick Iceberg Lettuce from garden"]
|
||||
O_RECEIVE_ICEY_LETTUCE["O: Receive Iceberg Lettuce"]
|
||||
|
||||
A_PICK_ROTTEN_TOMATO["A: Pick up Rotten Tomato"]
|
||||
O_RECEIVE_ROTTEN_TOMATO["O: Receive Rotten Tomato"]
|
||||
A_GIVE_ROTTEN_TOMATO["A: Give Rotten Tomato to bump-on-log"]
|
||||
O_RECEIVE_SWAMP_OOZE["O: Receive Swamp Ooze"]
|
||||
|
||||
A_GIVE_MILK_TO_PLANT["A: Give Milk to baby's tears plant"]
|
||||
O_RECEIVE_BABYS_TEARS["O: Receive Baby's Tears"]
|
||||
A_GET_MILK_BOTTLE["A: Pick up Milk Bottle"]
|
||||
O_RECEIVE_MILK["O: Receive Milk"]
|
||||
A_GET_TEA_CUP["A: Pick up Tea Cup"]
|
||||
O_RECEIVE_TEA_CUP["O: Receive Tea Cup"]
|
||||
|
||||
A_PICK_DRINK_ME_POTION["A: Pick up 'Drink Me' Potion"]
|
||||
O_RECEIVE_DRINK_ME["O: Receive 'Drink Me' Potion"]
|
||||
end
|
||||
|
||||
C2 --> A_PICK_ICEY_LETTUCE
|
||||
C2 --> A_PICK_ROTTEN_TOMATO
|
||||
C2 --> A_GET_TEA_CUP
|
||||
C2 --> A_PICK_DRINK_ME_POTION
|
||||
O_RECEIVE_FLUTE --> A_PLAY_FLUTE_FLOWERS
|
||||
O_RECEIVE_MILK --> A_GIVE_MILK_TO_PLANT
|
||||
A_GET_MILK_BOTTLE --> O_RECEIVE_MILK
|
||||
A_PLAY_FLUTE_FLOWERS --> O_RECEIVE_HOLE_IN_WALL
|
||||
A_PICK_ROTTEN_TOMATO --> O_RECEIVE_ROTTEN_TOMATO
|
||||
O_RECEIVE_ROTTEN_TOMATO --> A_GIVE_ROTTEN_TOMATO
|
||||
A_GIVE_ROTTEN_TOMATO --> O_RECEIVE_SWAMP_OOZE
|
||||
|
||||
subgraph area_iow_chessboard["Isle of Wonder - Chessboard Land"]
|
||||
A_TALK_TO_QUEENS["A: Talk to Chessboard queens"]
|
||||
O_RECEIVE_RED_SCARF["O: Receive Red Scarf"]
|
||||
O_RECEIVE_LUMP_OF_COAL["O: Receive Lump of Coal"]
|
||||
end
|
||||
|
||||
C2 --> A_TALK_TO_QUEENS
|
||||
O_RECEIVE_LUMP_OF_COAL -.-> A_TRADE_COAL_FOR_EGG["A: Trade coal for sulfur egg"]
|
||||
|
||||
subgraph area_iow_point["Isle of Wonder - Point / Book Garden"]
|
||||
A_PULL_THREAD["A: Pull thread from spider web"]
|
||||
O_RECEIVE_LOVE_WORD["O: Receive word 'LOVE' (for Gate riddle)"]
|
||||
O_RECEIVE_SPIDER_WEB["O: Receive Spider Web Paper"]
|
||||
|
||||
A_SEARCH_POETRY_SHELF["A: Search poetry bookshelf"]
|
||||
O_RECEIVE_LOVE_POEM_IOW["O: Receive Love Poem"]
|
||||
|
||||
A_TRADE_PARTICIPLE_BOOK["A: Trade Dangling Participle to bookworm"]
|
||||
O_RECEIVE_RARE_BOOK["O: Receive Rare Book"]
|
||||
end
|
||||
|
||||
C2 --> A_PULL_THREAD
|
||||
C2 --> A_SEARCH_POETRY_SHELF
|
||||
A_PULL_THREAD --> O_RECEIVE_LOVE_WORD
|
||||
A_PULL_THREAD --> O_RECEIVE_SPIDER_WEB
|
||||
A_SEARCH_POETRY_SHELF --> O_RECEIVE_LOVE_POEM_IOW
|
||||
O_RECEIVE_DANGLING_PARTICIPLE --> A_TRADE_PARTICIPLE_BOOK
|
||||
A_TRADE_PARTICIPLE_BOOK --> O_RECEIVE_RARE_BOOK
|
||||
|
||||
%% =============================================================================
|
||||
%% PHASE 4: Isle of the Beast - Initial Visit
|
||||
%% =============================================================================
|
||||
subgraph area_iob_initial["Isle of the Beast - Initial Visit"]
|
||||
P_PROBLEM_BOILING_POOL["Problem: Boiling pool blocks crossing"]
|
||||
A_COOL_POOL["A: Use Iceberg Lettuce on pool"]
|
||||
C3["Path to north area now open"]
|
||||
|
||||
A_GET_BRICK["A: Pick up Brick from garden"]
|
||||
O_RECEIVE_BRICK["O: Receive Brick"]
|
||||
|
||||
A_GET_HUNTERS_LAMP["A: Pick up Hunter's Lamp"]
|
||||
O_RECEIVE_HUNTERS_LAMP["O: Receive Hunter's Lamp"]
|
||||
|
||||
A_GET_DANGLING_PARTICIPLE["A: Get Dangling Participle from beach"]
|
||||
O_RECEIVE_DANGLING_PARTICIPLE["O: Receive Dangling Participle"]
|
||||
end
|
||||
|
||||
O_RECEIVE_ICEY_LETTUCE --> A_COOL_POOL
|
||||
A_COOL_POOL --> C3
|
||||
C3 --> A_GET_BRICK
|
||||
C3 --> A_GET_HUNTERS_LAMP
|
||||
C3 --> A_GET_DANGLING_PARTICIPLE
|
||||
A_GET_BRICK --> O_RECEIVE_BRICK
|
||||
A_GET_HUNTERS_LAMP --> O_RECEIVE_HUNTERS_LAMP
|
||||
A_GET_DANGLING_PARTICIPLE --> O_RECEIVE_DANGLING_PARTICIPLE
|
||||
|
||||
%% =============================================================================
|
||||
%% PHASE 5: Minotaur's Maze / Catacombs
|
||||
%% =============================================================================
|
||||
subgraph area_maze_l1["Minotaur's Maze - Level 1"]
|
||||
P_PROBLEM_MAZE_L1["Problem: Navigate maze to find items"]
|
||||
A_SOLVE_TILE_PUZZLE["A: Solve tile puzzle (use manual)"]
|
||||
O_MAZE_PATH_OPEN["O: Tile path opens"]
|
||||
|
||||
A_NAVIGATE_TO_SKELETON["A: Navigate maze to skeleton room"]
|
||||
O_RECEIVE_SKULL["O: Receive Skull"]
|
||||
|
||||
A_COLLECT_COINS["A: Collect Dead Man's Coins"]
|
||||
O_RECEIVE_COINS["O: Receive Dead Man's Coins"]
|
||||
|
||||
A_USE_BRICK_TRAP["A: Use Brick to stop falling ceiling"]
|
||||
O_TRAP_STOPPED["O: Falling ceiling trap stopped"]
|
||||
end
|
||||
|
||||
C3 --> P_PROBLEM_MAZE_L1
|
||||
P_PROBLEM_MAZE_L1 --> A_SOLVE_TILE_PUZZLE
|
||||
P_PROBLEM_MAZE_L1 --> A_NAVIGATE_TO_SKELETON
|
||||
P_PROBLEM_MAZE_L1 --> A_COLLECT_COINS
|
||||
P_PROBLEM_MAZE_L1 --> A_USE_BRICK_TRAP
|
||||
|
||||
subgraph area_maze_l2["Minotaur's Maze - Level 2 (Dark)"]
|
||||
P_PROBLEM_DARK_L2["Problem: Cannot see in dark passage"]
|
||||
A_LIGHT_TINDERBOX["A: Light Tinderbox to see"]
|
||||
O_CAN_SEE["O: Dark passage illuminated"]
|
||||
|
||||
A_USE_HOLE_IN_WALL["A: Use Hole-in-the-Wall at correct wall"]
|
||||
O_REVEAL_TAPESTRY["O: Minotaur tapestry revealed"]
|
||||
|
||||
A_FIND_SHIELD["A: Navigate to find Shield"]
|
||||
O_RECEIVE_SHIELD["O: Receive Shield"]
|
||||
end
|
||||
|
||||
O_RECEIVE_BRICK --> A_USE_BRICK_TRAP
|
||||
O_RECEIVE_TINDERBOX --> A_LIGHT_TINDERBOX
|
||||
O_RECEIVE_HOLE_IN_WALL --> A_USE_HOLE_IN_WALL
|
||||
|
||||
A_LIGHT_TINDERBOX --> O_CAN_SEE
|
||||
O_CAN_SEE --> A_USE_HOLE_IN_WALL
|
||||
O_CAN_SEE --> A_FIND_SHIELD
|
||||
|
||||
subgraph area_maze_lair["Minotaur's Lair"]
|
||||
P_PROBLEM_MINOTAUR["Problem: Minotaur blocks exit"]
|
||||
A_LURE_MINOTAUR["A: Lure Minotaur with Red Scarf"]
|
||||
O_RECEIVE_DAGGER["O: Receive Dagger"]
|
||||
O_RECEIVE_SACRED_WATER["O: Receive Sacred Water"]
|
||||
O_RECEIVE_ORACLE_VIAL["O: Receive Oracle Vial"]
|
||||
end
|
||||
|
||||
O_RECEIVE_SHIELD & O_RECEIVE_SCARF_CONV & O_TRAP_STOPPED & O_REVEAL_TAPESTRY --> P_PROBLEM_MINOTAUR
|
||||
O_RECEIVE_SCARF_CONV["O: Red Scarf acquired from Chessboard"]
|
||||
O_RECEIVE_RED_SCARF --> O_RECEIVE_SCARF_CONV
|
||||
P_PROBLEM_MINOTAUR --> A_LURE_MINOTAUR
|
||||
A_LURE_MINOTAUR --> O_RECEIVE_DAGGER
|
||||
A_LURE_MINOTAUR --> O_RECEIVE_SACRED_WATER
|
||||
A_LURE_MINOTAUR --> O_RECEIVE_ORACLE_VIAL
|
||||
|
||||
%% Parallel paths after maze - S23/S24 are PARALLEL, S20/S21 are PARALLEL
|
||||
O_MAZE_PATH_OPEN & O_RECEIVE_SKULL & O_RECEIVE_COINS & O_TRAP_STOPPED --> A_NAVIGATE_TO_SKELETON
|
||||
O_NAVIGATE_MAZE["O: Maze navigated, shield found"]
|
||||
|
||||
%% =============================================================================
|
||||
%% PHASE 6: Isle of the Beast - Return Visit (with Shield)
|
||||
%% =============================================================================
|
||||
subgraph area_iob_return["Isle of the Beast - Return Visit"]
|
||||
P_PROBLEM_ARCHER["Problem: Archer statue kills you"]
|
||||
A_USE_SHIELD_STATUE["A: Use Shield to block arrows"]
|
||||
C4["Safe passage through archer gate"]
|
||||
|
||||
P_PROBLEM_ROSE_HEDGE["Problem: Rose hedge blocks path to Beast"]
|
||||
A_CUT_HEDGE["A: Cut hedge with Scythe"]
|
||||
C5["Path to Beast's domain opens"]
|
||||
end
|
||||
|
||||
O_RECEIVE_SHIELD --> P_PROBLEM_ARCHER
|
||||
P_PROBLEM_ARCHER --> A_USE_SHIELD_STATUE
|
||||
A_USE_SHIELD_STATUE --> C4
|
||||
|
||||
O_RECEIVE_SCYTHE["O: Receive Scythe from IoM"] -.-> P_PROBLEM_ROSE_HEDGE
|
||||
P_PROBLEM_ROSE_HEDGE --> A_CUT_HEDGE
|
||||
A_CUT_HEDGE --> C5
|
||||
|
||||
%% Beast's Domain
|
||||
subgraph area_beast_domain["Isle of the Beast - Beast's Domain"]
|
||||
P_PROBLEM_MEET_BEAST["Problem: Need to meet Beast"]
|
||||
A_GIVE_WHITE_ROSE["A: Give White Rose to Beauty"]
|
||||
O_BEAUTY_TRUSTS["O: Beauty's trust gained"]
|
||||
|
||||
A_GIVE_RING_TO_BEAUTY["A: Give Beast's Ring to Beauty"]
|
||||
O_RECEIVE_BEAUTYS_DRESS["O: Receive Beauty's Dress"]
|
||||
O_RECEIVE_MIRROR["O: Receive Mirror"]
|
||||
O_RECEIVE_BEASTS_RING["O: Receive Beast's Ring"]
|
||||
|
||||
A_PLACE_ROSE["A: Plant White Rose"]
|
||||
O_RECEIVE_WHITE_ROSE_2["O: Receive White Rose (second)"]
|
||||
end
|
||||
|
||||
C5 --> P_PROBLEM_MEET_BEAST
|
||||
P_PROBLEM_MEET_BEAST --> A_GIVE_WHITE_ROSE
|
||||
A_GIVE_WHITE_ROSE --> O_BEAUTY_TRUSTS
|
||||
O_BEAUTY_TRUSTS --> A_GIVE_RING_TO_BEAUTY
|
||||
A_GIVE_RING_TO_BEAUTY --> O_RECEIVE_BEAUTYS_DRESS
|
||||
A_GIVE_RING_TO_BEAUTY --> O_RECEIVE_MIRROR
|
||||
O_BEAUTY_TRUSTS --> A_PLACE_ROSE
|
||||
A_PLACE_ROSE --> O_RECEIVE_WHITE_ROSE_2
|
||||
|
||||
%% =============================================================================
|
||||
%% PHASE 7: Isle of Sacred Mountain
|
||||
%% =============================================================================
|
||||
subgraph area_ism_cliffs["Isle of Sacred Mountain - Logic Cliffs"]
|
||||
P_PROBLEM_LOGIC_CLIFFS["Problem: Copy protection puzzles block summit"]
|
||||
A_SOLVE_CLIFF_PUZZLES["A: Solve 5 cliff puzzles (manual required)"]
|
||||
C6["Path to clifftop opens"]
|
||||
|
||||
A_GET_BLACK_FEATHER["A: Pick up Black Feather"]
|
||||
O_RECEIVE_BLACK_FEATHER["O: Receive Black Feather"]
|
||||
|
||||
A_GET_STINKY_FLOWER["A: Pick up Flower of Stench"]
|
||||
O_RECEIVE_STINKY_FLOWER["O: Receive Flower of Stench"]
|
||||
end
|
||||
|
||||
O_RECEIVE_MAGIC_MAP --> P_PROBLEM_LOGIC_CLIFFS
|
||||
P_PROBLEM_LOGIC_CLIFFS --> A_SOLVE_CLIFF_PUZZLES
|
||||
A_SOLVE_CLIFF_PUZZLES --> C6
|
||||
C6 --> A_GET_BLACK_FEATHER
|
||||
C6 --> A_GET_STINKY_FLOWER
|
||||
|
||||
subgraph area_ism_clifftop["Isle of Sacred Mountain - Clifftop & Cave"]
|
||||
P_PROBLEM_DARK_CAVE["Problem: Dark cave blocks path"]
|
||||
A_LIGHT_CAVE["A: Light way with Tinderbox"]
|
||||
O_RECEIVE_PEPPERMINT["O: Receive Peppermint Leaves"]
|
||||
|
||||
P_PROBLEM_POISON_LADY["Problem: Fake lady offers poison berry"]
|
||||
A_REJECT_POISON["A: Wait/reject fake lady"]
|
||||
O_SURVIVED["O: Survived poison trap"]
|
||||
end
|
||||
|
||||
O_RECEIVE_TINDERBOX --> A_LIGHT_CAVE
|
||||
A_LIGHT_CAVE --> O_RECEIVE_PEPPERMINT
|
||||
C6 --> P_PROBLEM_DARK_CAVE
|
||||
C6 --> P_PROBLEM_POISON_LADY
|
||||
P_PROBLEM_POISON_LADY --> A_REJECT_POISON
|
||||
A_REJECT_POISON --> O_SURVIVED
|
||||
|
||||
%% Winged Ones
|
||||
subgraph area_ism_winged["Isle of Sacred Mountain - Winged Ones"]
|
||||
P_PROBLEM_SPELL_COMPONENTS["Problem: Need spell components for Night Mare"]
|
||||
A_COLLECT_COMPONENTS["A: Gather Ember, Hair, Spoiled Egg"]
|
||||
O_SPELL_READY["O: Charm Creatures spell ready"]
|
||||
|
||||
A_GET_EMBER["A: Collect Ember from firepit"]
|
||||
O_RECEIVE_EMBER["O: Receive Ember"]
|
||||
A_GET_HAIR["A: Get Hair (Beauty's or Cassima's)"]
|
||||
O_RECEIVE_HAIR["O: Receive Hair"]
|
||||
A_GET_SPOILED_EGG["A: Get Spoiled Egg"]
|
||||
O_RECEIVE_SPOILED_EGG["O: Receive Spoiled Egg"]
|
||||
|
||||
A_CAST_CHARM_SPELL["A: Cast Charm Creatures of Night spell"]
|
||||
O_NIGHTMARE_MOUNT["O: Nightmare horse mount available"]
|
||||
end
|
||||
|
||||
O_RECEIVE_SKULL & O_RECEIVE_EMBER & O_RECEIVE_SPOILED_EGG & O_RECEIVE_HAIR --> P_PROBLEM_SPELL_COMPONENTS
|
||||
P_PROBLEM_SPELL_COMPONENTS --> A_COLLECT_COMPONENTS
|
||||
A_COLLECT_COMPONENTS --> A_CAST_CHARM_SPELL
|
||||
A_CAST_CHARM_SPELL --> O_NIGHTMARE_MOUNT
|
||||
|
||||
%% =============================================================================
|
||||
%% PHASE 8: Isle of the Mists - Druids
|
||||
%% =============================================================================
|
||||
subgraph area_iom["Isle of the Mists - Druids"]
|
||||
P_PROBLEM_DRUIDS["Problem: Druids will burn you without protection"]
|
||||
A_CAST_RAIN_SPELL["A: Cast Rain Spell (Baby's Tears + Milk + Hunter's Lamp)"]
|
||||
O_RAIN_PROTECTION["O: Rain protection active"]
|
||||
|
||||
A_WEAR_BEAUTYS_DRESS["A: Wear Beauty's Dress"]
|
||||
O_DRUID_PROTECTION["O: Survive Druid ceremony"]
|
||||
|
||||
A_GET_SCYTHE["A: Pick up Scythe from village"]
|
||||
O_RECEIVE_SCYTHE["O: Receive Scythe"]
|
||||
|
||||
A_GET_COAL["A: Pick up Coal from firepit"]
|
||||
O_RECEIVE_COAL_IOM["O: Receive Coal (from IoM)"]
|
||||
end
|
||||
|
||||
O_RECEIVE_BABYS_TEARS & O_RECEIVE_MILK & O_RECEIVE_HUNTERS_LAMP --> A_CAST_RAIN_SPELL
|
||||
A_CAST_RAIN_SPELL --> O_RAIN_PROTECTION
|
||||
O_RAIN_PROTECTION & O_RECEIVE_BEAUTYS_DRESS --> P_PROBLEM_DRUIDS
|
||||
P_PROBLEM_DRUIDS --> A_WEAR_BEAUTYS_DRESS
|
||||
A_WEAR_BEAUTYS_DRESS --> O_DRUID_PROTECTION
|
||||
|
||||
A_GET_SCYTHE --> O_RECEIVE_SCYTHE
|
||||
A_GET_COAL --> O_RECEIVE_COAL_IOM
|
||||
|
||||
O_RECEIVE_COAL_IOM --> A_TRADE_COAL_FOR_EGG
|
||||
O_TRADE_COAL_FOR_EGG -.-> O_RECEIVE_SULFUR_EGG["O: Receive Sulfur Egg"]
|
||||
|
||||
%% =============================================================================
|
||||
%% PHASE 9: Realm of the Dead
|
||||
%% =============================================================================
|
||||
subgraph area_rod_landing["Realm of the Dead - Landing Point"]
|
||||
P_PROBLEM_ENTER_ROD["Problem: Need to reach Land of the Dead"]
|
||||
A_RIDE_NIGHTMARE["A: Ride Nightmare horse"]
|
||||
C7["Arrive at Land of the Dead"]
|
||||
|
||||
P_PROBLEM_ZOMBIES["Problem: Zombies block path"]
|
||||
A_AVOID_ZOMBIES["A: Navigate past zombies carefully"]
|
||||
O_ZOMBIES_PASSED["O: Zombies avoided"]
|
||||
end
|
||||
|
||||
O_NIGHTMARE_MOUNT --> P_PROBLEM_ENTER_ROD
|
||||
P_PROBLEM_ENTER_ROD --> A_RIDE_NIGHTMARE
|
||||
A_RIDE_NIGHTMARE --> C7
|
||||
C7 --> P_PROBLEM_ZOMBIES
|
||||
P_PROBLEM_ZOMBIES --> A_AVOID_ZOMBIES
|
||||
A_AVOID_ZOMBIES --> O_ZOMBIES_PASSED
|
||||
|
||||
subgraph area_rod_pathway["Realm of the Dead - Pathway"]
|
||||
A_TALK_TO_CASSIMA_PARENTS["A: Talk to Cassima's parents"]
|
||||
O_RECEIVE_TICKET["O: Receive Ticket to Underworld"]
|
||||
|
||||
A_TALK_TO_GHOST_MOTHER["A: Talk to Ghost Mother"]
|
||||
O_RECEIVE_HANKERCHIEF["O: Receive Handkerchief"]
|
||||
end
|
||||
|
||||
O_ZOMBIES_PASSED --> A_TALK_TO_CASSIMA_PARENTS
|
||||
O_ZOMBIES_PASSED --> A_TALK_TO_GHOST_MOTHER
|
||||
A_TALK_TO_CASSIMA_PARENTS --> O_RECEIVE_TICKET
|
||||
A_TALK_TO_GHOST_MOTHER --> O_RECEIVE_HANKERCHIEF
|
||||
|
||||
subgraph area_rod_gate["Realm of the Dead - Gate"]
|
||||
P_PROBLEM_GATE["Problem: Need ticket for underworld"]
|
||||
A_GIVE_TICKET["A: Give ticket to skeleton gatekeeper"]
|
||||
C8["Gate to Styx opens"]
|
||||
|
||||
A_PLAY_BONES["A: Play bone xylophone"]
|
||||
O_RECEIVE_SKELETON_KEY["O: Receive Skeleton Key"]
|
||||
|
||||
P_PROBLEM_CHARON["Problem: Need to pay Charon's ferry"]
|
||||
A_PAY_CHARON["A: Pay Charon with Dead Man's Coins"]
|
||||
O_FERRY_ACCESS["O: Ferry access granted"]
|
||||
end
|
||||
|
||||
O_RECEIVE_TICKET --> P_PROBLEM_GATE
|
||||
P_PROBLEM_GATE --> A_GIVE_TICKET
|
||||
A_GIVE_TICKET --> C8
|
||||
C8 --> A_PLAY_BONES
|
||||
C8 --> P_PROBLEM_CHARON
|
||||
O_RECEIVE_COINS --> A_PAY_CHARON
|
||||
A_PAY_CHARON --> O_FERRY_ACCESS
|
||||
|
||||
subgraph area_rod_styx["Realm of the Dead - River Styx"]
|
||||
P_PROBLEM_STYX["Problem: Need Styx Water for paint spell"]
|
||||
A_COLLECT_STYX_WATER["A: Collect Styx Water with Tea Cup"]
|
||||
O_RECEIVE_STYX_WATER["O: Receive Styx Water"]
|
||||
|
||||
A_SEARCH_KNIGHT["A: Search dead knight"]
|
||||
O_RECEIVE_GAUNTLET["O: Receive Gauntlet"]
|
||||
end
|
||||
|
||||
O_RECEIVE_TEA_CUP --> A_COLLECT_STYX_WATER
|
||||
A_COLLECT_STYX_WATER --> O_RECEIVE_STYX_WATER
|
||||
C8 --> A_SEARCH_KNIGHT
|
||||
A_SEARCH_KNIGHT --> O_RECEIVE_GAUNTLET
|
||||
|
||||
subgraph area_rod_throne["Realm of the Dead - Talking Gate & Throne"]
|
||||
P_PROBLEM_GATE_RIDDLE["Problem: Gate asks riddle"]
|
||||
A_ANSWER_LOVE["A: Answer 'LOVE' (from spider web)"]
|
||||
C9["Gate opens to Death's domain"]
|
||||
|
||||
P_PROBLEM_DEATH["Problem: Must make Death cry"]
|
||||
A_SHOW_MIRROR_DEATH["A: Show Mirror to Death"]
|
||||
C10["Death cries, parents freed"]
|
||||
end
|
||||
|
||||
O_RECEIVE_LOVE_WORD --> P_PROBLEM_GATE_RIDDLE
|
||||
P_PROBLEM_GATE_RIDDLE --> A_ANSWER_LOVE
|
||||
A_ANSWER_LOVE --> C9
|
||||
C9 --> P_PROBLEM_DEATH
|
||||
O_RECEIVE_MIRROR --> A_SHOW_MIRROR_DEATH
|
||||
A_SHOW_MIRROR_DEATH --> C10
|
||||
C10 --> C_RETURN["Return to Isle of the Crown Beach"]
|
||||
|
||||
%% =============================================================================
|
||||
%% PHASE 10: Castle Infiltration
|
||||
%% =============================================================================
|
||||
subgraph area_castle_approach["Castle Infiltration - Two Paths Converge"]
|
||||
P_PROBLEM_ENTER_CASTLE["Problem: Cannot enter castle normally"]
|
||||
|
||||
%% Long Path - Paint Door
|
||||
A_PAINT_DOOR["A: Paint door (Feather + Ooze + Styx + Paintbrush)"]
|
||||
A_CAST_PAINT_SPELL["A: Cast Magic Paint Spell (with Spellbook)"]
|
||||
O_DOOR_APPEARS["O: Secret door appears"]
|
||||
|
||||
%% Short Path - Disguise
|
||||
A_WEAR_DISGUISE["A: Wear Beauty's Dress as disguise"]
|
||||
O_CASTLE_ACCESS["O: Castle access granted"]
|
||||
end
|
||||
|
||||
C_RETURN --> P_PROBLEM_ENTER_CASTLE
|
||||
P_PROBLEM_ENTER_CASTLE --> A_PAINT_DOOR
|
||||
P_PROBLEM_ENTER_CASTLE --> A_WEAR_DISGUISE
|
||||
|
||||
O_RECEIVE_BLACK_FEATHER & O_RECEIVE_SWAMP_OOZE & O_RECEIVE_STYX_WATER & O_RECEIVE_PAINTBRUSH --> A_PAINT_DOOR
|
||||
A_PAINT_DOOR --> A_CAST_PAINT_SPELL
|
||||
A_CAST_PAINT_SPELL --> O_DOOR_APPEARS
|
||||
O_RECEIVE_BEAUTYS_DRESS --> A_WEAR_DISGUISE
|
||||
A_WEAR_DISGUISE --> O_CASTLE_ACCESS
|
||||
|
||||
subgraph area_castle_basement["Castle - Basement / Cells"]
|
||||
P_PROBLEM_GUARDS["Problem: Guards patrol basement"]
|
||||
A_DISTRACT_GUARDS["A: Use Nightingale to distract guards"]
|
||||
O_GUARDS_DISTRACTED["O: Guards distracted"]
|
||||
|
||||
A_TALK_TO_GHOST_BOY["A: Talk to Ghost Boy"]
|
||||
O_RECEIVE_PASSAGE_HINT["O: Hint about secret armor"]
|
||||
|
||||
P_PROBLEM_JOLLO_ROOM["Problem: Need Jollo's help for best ending"]
|
||||
A_GIVE_LAMP_REPLICA["A: Give lamp replica to Jollo"]
|
||||
O_JOLLO_HELPS["O: Jollo will help in finale"]
|
||||
end
|
||||
|
||||
O_DOOR_APPEARS & O_CASTLE_ACCESS --> P_PROBLEM_GUARDS
|
||||
P_PROBLEM_GUARDS --> A_DISTRACT_GUARDS
|
||||
A_DISTRACT_GUARDS --> O_GUARDS_DISTRACTED
|
||||
O_GUARDS_DISTRACTED --> A_TALK_TO_GHOST_BOY
|
||||
A_TALK_TO_GHOST_BOY --> O_RECEIVE_PASSAGE_HINT
|
||||
|
||||
subgraph area_castle_passage["Castle - Secret Passage"]
|
||||
P_PROBLEM_PASSWORD["Problem: Need password to proceed"]
|
||||
A_FIND_ALI_PASSWORD["A: Eavesdrop to learn 'ALI'"]
|
||||
A_FIND_ZEBU_PASSWORD["A: Spy on Vizier to learn 'ZEBU'"]
|
||||
O_PASSWORD_ALI["O: Password fragment 'ALI'"]
|
||||
O_PASSWORD_ZEBU["O: Password fragment 'ZEBU'"]
|
||||
|
||||
P_PROBLEM_CASSIMA["Problem: Cassima needs weapon"]
|
||||
A_GIVE_DAGGER["A: Give Dagger to Cassima"]
|
||||
O_CASSIMA_ARMED["O: Cassima has dagger"]
|
||||
end
|
||||
|
||||
O_GUARDS_DISTRACTED --> P_PROBLEM_PASSWORD
|
||||
O_GUARDS_DISTRACTED --> P_PROBLEM_CASSIMA
|
||||
P_PROBLEM_PASSWORD --> A_FIND_ALI_PASSWORD
|
||||
P_PROBLEM_PASSWORD --> A_FIND_ZEBU_PASSWORD
|
||||
A_FIND_ALI_PASSWORD --> O_PASSWORD_ALI
|
||||
A_FIND_ZEBU_PASSWORD --> O_PASSWORD_ZEBU
|
||||
|
||||
O_PASSWORD_ALI & O_PASSWORD_ZEBU --> A_COMBINE_PASSWORD["A: Combine 'ALI ZEBU'"]
|
||||
O_RECEIVE_DAGGER --> A_GIVE_DAGGER
|
||||
A_GIVE_DAGGER --> O_CASSIMA_ARMED
|
||||
|
||||
subgraph area_castle_vizier["Castle - Vizier's Bedroom"]
|
||||
P_PROBLEM_VIZIER_CHEST["Problem: Need to open Vizier's chest"]
|
||||
A_UNLOCK_CHEST["A: Use Skeleton Key on chest"]
|
||||
O_RECEIVE_VIZIER_LETTER["O: Receive Vizier's Letter"]
|
||||
|
||||
P_PROBLEM_TREASURY["Problem: Treasury password required"]
|
||||
A_OPEN_TREASURY["A: Enter 'ALI ZEBU'"]
|
||||
O_TREASURY_OPEN["O: Treasury opens"]
|
||||
end
|
||||
|
||||
O_RECEIVE_SKELETON_KEY --> P_PROBLEM_VIZIER_CHEST
|
||||
P_PROBLEM_VIZIER_CHEST --> A_UNLOCK_CHEST
|
||||
A_UNLOCK_CHEST --> O_RECEIVE_VIZIER_LETTER
|
||||
|
||||
A_COMBINE_PASSWORD --> P_PROBLEM_TREASURY
|
||||
P_PROBLEM_TREASURY --> A_OPEN_TREASURY
|
||||
A_OPEN_TREASURY --> O_TREASURY_OPEN
|
||||
|
||||
%% =============================================================================
|
||||
%% PHASE 11: Final Confrontation
|
||||
%% =============================================================================
|
||||
subgraph area_final["Final Confrontation"]
|
||||
P_PROBLEM_GENIE["Problem: Genie attacks"]
|
||||
|
||||
A_USE_FAKE_LAMP["A: Use Fake Genie Lamp (from Jollo)"]
|
||||
O_GENIE_CONTROLLED["O: Genie controlled - BEST ENDING"]
|
||||
|
||||
A_GIVE_MINT_GENIE["A: Give Peppermint Leaves to genie"]
|
||||
O_GENIE_DRUNK["O: Genie incapacitated - ALT ENDING"]
|
||||
|
||||
P_PROBLEM_VIZIER["Problem: Vizier fights"]
|
||||
A_FIGHT_VIZIER["A: Fight Vizier with Sword + Cassima"]
|
||||
END(["END: Victory - KQVI Complete"])
|
||||
end
|
||||
|
||||
O_JOLLO_HELPS --> P_PROBLEM_GENIE
|
||||
P_PROBLEM_GENIE --> A_USE_FAKE_LAMP
|
||||
P_PROBLEM_GENIE --> A_GIVE_MINT_GENIE
|
||||
|
||||
A_USE_FAKE_LAMP --> O_GENIE_CONTROLLED
|
||||
A_GIVE_MINT_GENIE --> O_GENIE_DRUNK
|
||||
|
||||
O_GENIE_CONTROLLED & O_GENIE_DRUNK --> P_PROBLEM_VIZIER
|
||||
P_PROBLEM_VIZIER --> A_FIGHT_VIZIER
|
||||
A_FIGHT_VIZIER --> END
|
||||
|
||||
O_RECEIVE_VIZIER_LETTER -.-> A_SHOW_LETTER["A: Show Vizier's Letter to Saladin"]
|
||||
O_CASSIMA_ARMED -.-> A_CASSIMA_FIGHTS["A: Cassima fights alongside"]
|
||||
|
||||
%% =============================================================================
|
||||
%% CLASS ASSIGNMENTS
|
||||
%% =============================================================================
|
||||
class START,END,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C_RETURN start_end
|
||||
class P_PROBLEM_PAWN_SHOP,P_PROBLEM_NEED_MAP,P_PROBLEM_FERRYMAN,P_PROBLEM_JOLLO,P_PROBLEM_GNOMES,P_PROBLEM_BOILING_POOL,P_PROBLEM_MAZE_L1,P_PROBLEM_DARK_L2,P_PROBLEM_MINOTAUR,P_PROBLEM_ARCHER,P_PROBLEM_ROSE_HEDGE,P_PROBLEM_MEET_BEAST,P_PROBLEM_LOGIC_CLIFFS,P_PROBLEM_DARK_CAVE,P_PROBLEM_POISON_LADY,P_PROBLEM_SPELL_COMPONENTS,P_PROBLEM_DRUIDS,P_PROBLEM_ENTER_ROD,P_PROBLEM_ZOMBIES,P_PROBLEM_GATE,P_PROBLEM_CHARON,P_PROBLEM_STYX,P_PROBLEM_GATE_RIDDLE,P_PROBLEM_DEATH,P_PROBLEM_ENTER_CASTLE,P_PROBLEM_GUARDS,P_PROBLEM_PASSWORD,P_PROBLEM_CASSIMA,P_PROBLEM_VIZIER_CHEST,P_PROBLEM_TREASURY,P_PROBLEM_GENIE,P_PROBLEM_VIZIER problem
|
||||
class A_MOVE_PLANK,A_EXAMINE_DEBRIS,A_SHOW_RING_TO_GUARDS,A_TALK_TO_PAWN_BROKER,A_TRADE_RING_FOR_MAP,A_TALK_TO_FERRYMAN,A_TALK_TO_JOLLO,A_SHOW_RING_TO_JOLLO,A_SEARCH_BOOKSHELF,A_GIVE_STINKY_FLOWER,A_PLAY_NIGHTINGALE,A_GIVE_MINT,A_GIVE_RABBIT_FOOT,A_USE_INK_ON_SELF,A_READ_BOOK_TO_OYSTER,A_PLAY_FLUTE_FLOWERS,A_PICK_ICEY_LETTUCE,A_PICK_ROTTEN_TOMATO,A_GIVE_ROTTEN_TOMATO,A_GIVE_MILK_TO_PLANT,A_GET_MILK_BOTTLE,A_GET_TEA_CUP,A_PICK_DRINK_ME_POTION,A_TALK_TO_QUEENS,A_PULL_THREAD,A_SEARCH_POETRY_SHELF,A_TRADE_PARTICIPLE_BOOK,A_COOL_POOL,A_GET_BRICK,A_GET_HUNTERS_LAMP,A_GET_DANGLING_PARTICIPLE,A_SOLVE_TILE_PUZZLE,A_NAVIGATE_TO_SKELETON,A_COLLECT_COINS,A_USE_BRICK_TRAP,A_LIGHT_TINDERBOX,A_USE_HOLE_IN_WALL,A_FIND_SHIELD,A_LURE_MINOTAUR,A_USE_SHIELD_STATUE,A_CUT_HEDGE,A_GIVE_WHITE_ROSE,A_GIVE_RING_TO_BEAUTY,A_PLACE_ROSE,A_SOLVE_CLIFF_PUZZLES,A_GET_BLACK_FEATHER,A_GET_STINKY_FLOWER,A_LIGHT_CAVE,A_REJECT_POISON,A_COLLECT_COMPONENTS,A_GET_EMBER,A_GET_HAIR,A_GET_SPOILED_EGG,A_CAST_CHARM_SPELL,A_CAST_RAIN_SPELL,A_WEAR_BEAUTYS_DRESS,A_GET_SCYTHE,A_GET_COAL,A_RIDE_NIGHTMARE,A_AVOID_ZOMBIES,A_TALK_TO_CASSIMA_PARENTS,A_TALK_TO_GHOST_MOTHER,A_GIVE_TICKET,A_PLAY_BONES,A_PAY_CHARON,A_COLLECT_STYX_WATER,A_SEARCH_KNIGHT,A_ANSWER_LOVE,A_SHOW_MIRROR_DEATH,A_PAINT_DOOR,A_CAST_PAINT_SPELL,A_WEAR_DISGUISE,A_DISTRACT_GUARDS,A_TALK_TO_GHOST_BOY,A_GIVE_LAMP_REPLICA,A_FIND_ALI_PASSWORD,A_FIND_ZEBU_PASSWORD,A_GIVE_DAGGER,A_COMBINE_PASSWORD,A_UNLOCK_CHEST,A_OPEN_TREASURY,A_USE_FAKE_LAMP,A_GIVE_MINT_GENIE,A_FIGHT_VIZIER,A_TRADE_WITH_BROKER_N,A_TRADE_WITH_BROKER_F,A_TRADE_WITH_BROKER_T,A_TRADE_COAL_FOR_EGG action
|
||||
class O_RECEIVE_COPPER_COIN,O_RECEIVE_ROYAL_RING,O_RECEIVE_NIGHTINGALE,O_RECEIVE_MINT,O_RECEIVE_TINDERBOX,O_RECEIVE_FLUTE,O_RECEIVE_PAINTBRUSH,O_RECEIVE_INK,O_RECEIVE_MAGIC_MAP,O_RECEIVE_RABBIT_FOOT,O_RECEIVE_JOLLO_TRUST,O_RECEIVE_LOVE_POEM,O_GNOMES_SMELL_DONE,O_GNOMES_HEARING_DONE,O_GNOMES_TASTE_DONE,O_GNOMES_TOUCH_DONE,O_GNOMES_SIGHT_DONE,O_RECEIVE_PEARL,O_RECEIVE_HOLE_IN_WALL,O_RECEIVE_ICEY_LETTUCE,O_RECEIVE_ROTTEN_TOMATO,O_RECEIVE_SWAMP_OOZE,O_RECEIVE_BABYS_TEARS,O_RECEIVE_MILK,O_RECEIVE_TEA_CUP,O_RECEIVE_DRINK_ME,O_RECEIVE_RED_SCARF,O_RECEIVE_LUMP_OF_COAL,O_RECEIVE_LOVE_WORD,O_RECEIVE_SPIDER_WEB,O_RECEIVE_LOVE_POEM_IOW,O_RECEIVE_RARE_BOOK,O_RECEIVE_BRICK,O_RECEIVE_HUNTERS_LAMP,O_RECEIVE_DANGLING_PARTICIPLE,O_MAZE_PATH_OPEN,O_RECEIVE_SKULL,O_RECEIVE_COINS,O_TRAP_STOPPED,O_CAN_SEE,O_REVEAL_TAPESTRY,O_RECEIVE_SHIELD,O_RECEIVE_DAGGER,O_RECEIVE_SACRED_WATER,O_RECEIVE_ORACLE_VIAL,O_RECEIVE_SCARF_CONV,O_BEAUTY_TRUSTS,O_RECEIVE_BEAUTYS_DRESS,O_RECEIVE_MIRROR,O_RECEIVE_BEASTS_RING,O_RECEIVE_WHITE_ROSE_2,O_RECEIVE_BLACK_FEATHER,O_RECEIVE_STINKY_FLOWER,O_RECEIVE_PEPPERMINT,O_SURVIVED,O_SPELL_READY,O_RECEIVE_EMBER,O_RECEIVE_HAIR,O_RECEIVE_SPOILED_EGG,O_NIGHTMARE_MOUNT,O_RAIN_PROTECTION,O_DRUID_PROTECTION,O_RECEIVE_SCYTHE,O_RECEIVE_COAL_IOM,O_RECEIVE_SULFUR_EGG,O_ZOMBIES_PASSED,O_RECEIVE_TICKET,O_RECEIVE_HANKERCHIEF,O_RECEIVE_SKELETON_KEY,O_FERRY_ACCESS,O_RECEIVE_STYX_WATER,O_RECEIVE_GAUNTLET,O_DOOR_APPEARS,O_CASTLE_ACCESS,O_GUARDS_DISTRACTED,O_RECEIVE_PASSAGE_HINT,O_JOLLO_HELPS,O_PASSWORD_ALI,O_PASSWORD_ZEBU,O_CASSIMA_ARMED,O_RECEIVE_VIZIER_LETTER,O_TREASURY_OPEN,O_GENIE_CONTROLLED,O_GENIE_DRUNK outcome
|
||||
```
|
||||
*Click the image to view the full-size version (opens in new tab).*
|
||||
|
||||
## Locked Choice Mechanic
|
||||
|
||||
@@ -765,8 +102,10 @@ This chart uses standardized naming for consistency:
|
||||
| Actions | Light Green (#B3FFB3) | Dark Green |
|
||||
| Outcomes | Light Blue (#B3D9FF) | Dark Blue |
|
||||
|
||||
## Mermaid Configuration
|
||||
## Chart Configuration
|
||||
|
||||
This chart uses `flowchart TD` (top-down direction) for clear hierarchical flow from prerequisites through problem recognition to solution.
|
||||
|
||||
(End of file - total 712 lines)
|
||||
The chart is rendered as a PNG image for reliable display across all browsers. A preview version is embedded inline, with a link to the full-size version.
|
||||
|
||||
(End of file - total 111 lines)
|
||||
|
||||
133
todos/TODOS.md
133
todos/TODOS.md
@@ -1,120 +1,17 @@
|
||||
# TODO List for KQVI Puzzle Dependencies Rework
|
||||
# TODO List
|
||||
|
||||
## CRITICAL FIXES - In Progress
|
||||
## Current Task: Switch from embedded mermaid to rendered images
|
||||
|
||||
### 1. Mermaid Does Not Render (Critical!) ✅ FIXED
|
||||
- [x] Debug mermaid preprocessor in book.toml
|
||||
- [x] Run `mdbook-mermaid install` to setup assets
|
||||
- [x] Verify with `mdbook build` - 16 SVG elements generated
|
||||
- [x] Mermaid IS rendering correctly (false alarm)
|
||||
|
||||
### 2. Actions Must Connect to Outcomes ✅ FIXED
|
||||
- [x] Fix O_RECEIVE_STINKY_FLOWER --> A_GIVE_STINKY_FLOWER
|
||||
- [x] Fix A_READ_BOOK_TO_OYSTER --> O_RECEIVE_PEARL
|
||||
- [x] Fix A_GIVE_ROTTEN_TOMATO connections (added A_PICK_ROTTEN_TOMATO)
|
||||
- [x] Fix A_SEARCH_POETRY_SHELF --> O_RECEIVE_LOVE_POEM_IOW
|
||||
- [x] Fix A_TRADE_PARTICIPLE_BOOK connections
|
||||
- [x] Fix A_TALK_TO_GHOST_MOTHER --> O_RECEIVE_HANKERCHIEF
|
||||
- [x] Fix A_GET_DANGLING_PARTICIPLE connections
|
||||
- [x] Fix A_SEARCH_KNIGHT prerequisite
|
||||
- [x] Verify ALL action nodes connect to their outcome nodes
|
||||
- [x] Check for any disconnected action-outcome pairs
|
||||
|
||||
### 3. Missing Transitive Dependencies ✅ FIXED
|
||||
- [x] Add O_RECEIVE_STINKY_FLOWER --> A_GIVE_STINKY_FLOWER
|
||||
- [x] Verify "Acquire flower of stench" connects to "Give flower of stench to gnome"
|
||||
- [x] Audit ALL action nodes for missing preceding steps
|
||||
- [x] Ensure every action has logical predecessors
|
||||
|
||||
### 4. Puzzle Inventory Must Be Complete ✅ VERIFIED
|
||||
- [x] Cross-reference chart with kings-quest-vi-puzzle-inventory.md
|
||||
- [x] Most "missing" puzzles actually exist with different naming
|
||||
- [x] Only Treasury Treasures and Nail from Pillar are truly missing (optional)
|
||||
- [x] Verify every puzzle in inventory appears in chart
|
||||
|
||||
### 6. Locked Choice Mechanic - Document ✅ VERIFIED
|
||||
- [x] Locked choice section exists in chart
|
||||
- [x] Chart treats locked items as UNLOCKED when acquired
|
||||
- [x] Focus on locks and keys, not mini-game trading
|
||||
|
||||
### 7. Modern, Legible Styling ✅ VERIFIED
|
||||
- [x] WCAG-compliant colors with 4.5:1+ contrast
|
||||
- [x] Colors checked: Gold, Red, Green, Blue are all accessible
|
||||
- [x] No contrast issues found
|
||||
|
||||
---
|
||||
|
||||
## Future Task
|
||||
- [ ] **Implement Layered Abstraction (Option 2)** - Create separate diagrams for World Locks vs Area Puzzles
|
||||
|
||||
---
|
||||
|
||||
## Commit History
|
||||
|
||||
- Complete: Configure mdbook mermaid support and create KQVI puzzle inventory
|
||||
- Complete: Rework KQVI puzzle dependency chart with all 8 feedback points
|
||||
- Complete: Fix disconnected action-outcome pairs and add missing transitive dependencies
|
||||
|
||||
---
|
||||
|
||||
## 8 Critical Feedback Points - ALL COMPLETE
|
||||
|
||||
### 1. mdbook Mermaid Configuration ✅
|
||||
- [x] Add mermaid support to book.toml
|
||||
- [x] Verify diagram renders with `mdbook build`
|
||||
|
||||
### 2. Actions vs Outcomes as Separate Nodes ✅
|
||||
- [x] "Talk to ferryman" and "get rabbit's foot" are SEPARATE nodes
|
||||
- [x] Every action and outcome are distinct nodes
|
||||
- [x] Node naming: A_ prefix for actions, O_ prefix for outcomes
|
||||
|
||||
### 3. Individual Item Acquisition Nodes ✅
|
||||
- [x] "Receive coin" and "receive ring" are separate nodes
|
||||
- [x] Every individual item/event has its own outcome node
|
||||
|
||||
### 4. Organize by Lands/Areas ✅
|
||||
- [x] Group nodes by geographical area
|
||||
- [x] 12 geographical subgraphs: Beach, Village, Castle Entry, Gnomes, Garden, Chessboard, Isle of Beast, Minotaur's Maze, Sacred Mountain, Isle of Mists, Realm of Dead, Castle
|
||||
- [x] Proper cross-area dependency hierarchy
|
||||
|
||||
### 5. Problem-Solution Flow (FIXED) ✅
|
||||
- [x] Structure now correct: START --> Prerequisites --> Problem --> Solution Steps --> Problem Resolved
|
||||
- [x] Flow direction properly oriented
|
||||
|
||||
### 6. Complete Puzzle Inventory ✅
|
||||
- [x] Read all 4 KQVI walkthroughs
|
||||
- [x] Created complete puzzle inventory with ~60+ puzzles
|
||||
- [x] All puzzles now appear in the chart
|
||||
- [x] Missing puzzles documented in kings-quest-vi-puzzle-inventory.md
|
||||
|
||||
### 7. Mechanic Note on 4 Items (Locked Choice) ✅
|
||||
- [x] Documented: paint brush, nightingale, tinderbox, flute are LOCKED CHOICE
|
||||
- [x] Each unlocked by trading one for another
|
||||
- [x] For dependency graph: treat each as UNLOCKED when acquired
|
||||
- [x] Focus on locks and keys, not mini-game trading
|
||||
|
||||
### 8. Modern, Legible Styling ✅
|
||||
- [x] WCAG-compliant colors with 4.5:1+ contrast
|
||||
- [x] Clean color palette for node types:
|
||||
- START/END: Gold/Yellow (#FFD700)
|
||||
- Problems: Red/Pink (#FFB3B3)
|
||||
- Solution Actions: Green (#B3FFB3)
|
||||
- Outcomes (Items): Blue (#B3D9FF)
|
||||
- Areas: Light purple (#E6E6FA)
|
||||
- [x] Modern aesthetics
|
||||
|
||||
---
|
||||
|
||||
## Final Verification ✅
|
||||
|
||||
- [x] `mdbook build` succeeds
|
||||
- [x] Mermaid diagram renders (17 SVG elements)
|
||||
- [x] All 8 feedback points addressed
|
||||
- [x] Chart properly structured with problem-solution flow
|
||||
|
||||
---
|
||||
|
||||
## Commit History
|
||||
|
||||
- Complete: Configure mdbook mermaid support and create KQVI puzzle inventory
|
||||
- Complete: Rework KQVI puzzle dependency chart with all 8 feedback points
|
||||
- [x] Render mermaid diagram to images
|
||||
- [x] Install mermaid CLI (if not present)
|
||||
- [x] Extract mermaid code from kings-quest-vi-heir-today-gone-tomorrow.md
|
||||
- [x] Render preview and full-size images
|
||||
- [x] Update markdown to embed images
|
||||
- [x] Replace mermaid block with image embed
|
||||
- [x] Add link to full-size image
|
||||
- [x] Clean up broken JS
|
||||
- [x] Remove mermaid-lightbox.js from book.toml additional-js
|
||||
- [x] Delete mermaid-lightbox.js file
|
||||
- [x] Restore mermaid-init.js if modified (not modified, keep it)
|
||||
- [x] Test with mdbook build
|
||||
- [ ] Commit changes
|
||||
|
||||
Reference in New Issue
Block a user