A dark, mysterious five-act ARG built around hidden archives and forgotten witnesses.
Commit 4ed257bb
4ed257bbb2d7Merged
Fenria-Aspen <[email protected]> · 1 month ago · 1 file · +1 added
Description
Add comprehensive five-act storyline with puzzles and sections
Details
- Commit
- 4ed257bbb2d7
- Parent
- 71eb47834809
assets/js/pages/acts.jsaddedView file
1+
// All five acts with multiple puzzles and storyline2+
3+
const Acts = {4+
data: [5+
{6+
id: 'act1',7+
title: 'ACT I: THE NAMING',8+
subtitle: 'Who watches the archive?',9+
acts_completed: 0,10+
sections: [11+
{12+
id: 'intro',13+
type: 'text',14+
content: `You receive a message through channels that don't officially exist:15+
16+
"The archive is looking for a witness. Someone to remember what others have forgotten. If you can answer the first question, the door will open."17+
18+
The message cuts off. Nothing else. Just waiting.`19+
},20+
{21+
id: 'gate',22+
type: 'puzzle',23+
question: 'What is the name of one who sees and testifies to truth?',24+
answer: 'WITNESS',25+
hints: [26+
'Someone who observes.',27+
'A person present at an event.',28+
'W-I-T-N-E-S-S'29+
],30+
successMessage: 'The first door opens. You have been acknowledged by the archive.',31+
rewards: [32+
{ type: 'item', id: 'key_witness', name: 'Fragment: The Witness', description: 'A fragment of understanding.' },33+
{ type: 'evidence', id: 'letter_1', name: 'First Message', description: 'The initial contact from the archive.' }34+
]35+
},36+
{37+
id: 'ledger_discovery',38+
type: 'text',39+
content: `Inside, you find a room filled with ledgers. Thousands of them. Each one contains a name that has been erased from all public records.40+
41+
The pages are yellowed. Some are water-damaged. Others have been deliberately redacted. But patterns emerge—connections between names, places, dates.42+
43+
One ledger in particular catches your eye. It's labeled "THE FORGOTTEN" and opens to a page marked with a faded ribbon.`44+
},45+
{46+
id: 'ledger_puzzle',47+
type: 'puzzle',48+
question: 'What are things that are not remembered?',49+
answer: 'FORGOTTEN',50+
hints: [51+
'The opposite of remembered.',52+
'Lost to time.',53+
'F-O-R-G-O-T-T-E-N'54+
],55+
successMessage: 'The ledger opens. Its secrets begin to reveal themselves.',56+
rewards: [57+
{ type: 'item', id: 'ledger_fragment', name: 'Ledger Page', description: 'A page from "The Forgotten".' },58+
{ type: 'evidence', id: 'names_list', name: 'List of Names', description: 'Erased from history. Never to be known.' }59+
]60+
},61+
{62+
id: 'encrypted_message',63+
type: 'text',64+
content: `At the bottom of the page, you find text in a strange cipher:65+
66+
THJ PWKZRJ WJNJNGJWU67+
68+
Next to it, a handwritten note: "Caesar knew many secrets. His shift was always three."69+
70+
This is your first real test.`71+
},72+
{73+
id: 'cipher_puzzle',74+
type: 'interactive',75+
tool: 'caesar_decoder',76+
encrypted: 'THJ PWKZRJ WJNJNGJWU',77+
shift: 3,78+
hint: 'The Roman leader Caesar used a simple cipher to protect his messages. Shift each letter by 3 places backward.',79+
successMessage: 'You have decrypted the message. Continue reading.',80+
rewards: [81+
{ type: 'item', id: 'cipher_knowledge', name: 'Caesar Cipher Knowledge', description: 'Understanding of ancient encryption methods.' }82+
]83+
},84+
{85+
id: 'decrypted_message',86+
type: 'text',87+
content: `The cipher reveals:88+
89+
"THE ARCHIVE REMEMBERS"90+
91+
Below the decrypted text, more handwriting:92+
93+
"Every name in these ledgers was someone. Every crossed-out line was a life. The archive does not forget. It merely waits for someone to bear witness. 94+
95+
Will you remember them?96+
97+
- The First Keeper"`98+
},99+
{100+
id: 'message_puzzle',101+
type: 'puzzle',102+
question: 'What does the archive do?',103+
answer: 'THE ARCHIVE REMEMBERS',104+
hints: [105+
'A statement about the archive\'s purpose.',106+
'THE ARCHIVE _______',107+
'THE ARCHIVE REMEMBERS'108+
],109+
successMessage: 'Act I complete. You have taken the first step.',110+
rewards: [111+
{ type: 'item', id: 'act1_complete', name: 'Act I Completion', description: 'You have witnessed the first truth.' },112+
{ type: 'unlock', id: 'act2', section: 'act2' }113+
]114+
}115+
]116+
},117+
{118+
id: 'act2',119+
title: 'ACT II: THE VAULT',120+
subtitle: 'Where are the forbidden names kept?',121+
acts_completed: 1,122+
sections: [123+
{124+
id: 'intro',125+
type: 'text',126+
content: `Now that you have proven yourself a witness, the archive grants access to deeper layers.127+
128+
A message appears:129+
130+
"The names must be stored somewhere. Protected. Hidden from those who would erase them further.131+
132+
There is a vault. Only the worthy may enter.133+
134+
The code is hidden in silence."`135+
},136+
{137+
id: 'vault_puzzle',138+
type: 'puzzle',139+
question: 'What is the absence of sound called?',140+
answer: 'SILENCE',141+
hints: [142+
'The lack of noise.',143+
'Quiet. Still. Absolute quiet.',144+
'S-I-L-E-N-C-E'145+
],146+
successMessage: 'The vault recognition system accepts your answer.',147+
rewards: [148+
{ type: 'item', id: 'vault_access', name: 'Vault Access Card', description: 'Permission to enter the restricted sections.' }149+
]150+
},151+
{152+
id: 'vault_interior',153+
type: 'text',154+
content: `Inside the vault, rows upon rows of metal filing cabinets stretch into darkness. Each drawer is labeled with a number, a date, a location.155+
156+
You notice one cabinet is different. Its label glows faintly:157+
158+
"DEPARTMENT OF INTERNAL AFFAIRS - 1987 - CLEARANCE REQUIRED"159+
160+
Next to it, a code lock with illuminated buttons.`161+
},162+
{163+
id: 'number_sequence',164+
type: 'puzzle',165+
question: 'What is the next number in this sequence? 1, 1, 2, 3, 5, 8, 13, ?, ?',166+
answer: '21',167+
alternate_answers: ['21, 34'],168+
hints: [169+
'This is a famous mathematical sequence.',170+
'Each number is the sum of the two before it.',171+
'Fibonacci sequence: 21 is next.'172+
],173+
successMessage: 'The cabinet drawer slides open.',174+
rewards: [175+
{ type: 'evidence', id: 'classified_file', name: 'Classified File', description: 'Contents: REDACTED' }176+
]177+
},178+
{179+
id: 'file_discovery',180+
type: 'text',181+
content: `The drawer contains a single manila envelope marked with a red stamp: EYES ONLY.182+
183+
Inside, a stack of photographs. They show a door. Not a metaphorical door—an actual, physical door in what appears to be a basement or bunker.184+
185+
The photographs are dated 1987. The last one has a single word written on the back in faded ink:186+
187+
DOOR188+
189+
And then, a question in different handwriting:190+
191+
"What is on the other side? What did they hide behind the DOOR?"`192+
}193+
]194+
},195+
{196+
id: 'act3',197+
title: 'ACT III: THE CIPHER',198+
subtitle: 'What message did they try to hide?',199+
acts_completed: 2,200+
sections: [201+
{202+
id: 'intro',203+
type: 'text',204+
content: `The photographs lead you deeper into the archive's restricted records section.205+
206+
You discover a series of documents, each one encrypted with different methods. The archive seems to have tested many cipher techniques over the decades.207+
208+
This is where the real secrets are kept.`209+
}210+
]211+
},212+
{213+
id: 'act4',214+
title: 'ACT IV: THE WITNESS',215+
subtitle: 'What is the truth?',216+
acts_completed: 3,217+
sections: [218+
{219+
id: 'intro',220+
type: 'text',221+
content: `You've gathered the pieces. You've decrypted the messages. You've found the evidence.222+
223+
But now you face a choice: What will you do with what you know?224+
225+
The archive presents its final test: A choice between truth and mercy, between exposure and silence.`226+
}227+
]228+
},229+
{230+
id: 'act5',231+
title: 'ACT V: REMEMBER',232+
subtitle: 'Who are you now?',233+
acts_completed: 4,234+
sections: [235+
{236+
id: 'intro',237+
type: 'text',238+
content: `This is the final act.239+
240+
Everything has led here. Every cipher decoded. Every name remembered. Every truth uncovered.241+
242+
Now you must speak the final phrase—the one that binds you to the archive forever.243+
244+
To speak it is to become part of what you have discovered. To remember is to become a keeper of these secrets.245+
246+
Are you ready?`247+
}248+
]249+
}250+
],251+
252+
render(actId) {253+
const act = this.data.find(a => a.id === actId);254+
if (!act) return `<p>Act not found.</p>`;255+
256+
let html = `257+
<section class="hero act-hero">258+
<div class="act-indicator">ACT ${act.acts_completed + 1} / 5</div>259+
<h1>${act.title}</h1>260+
<p class="lead">${act.subtitle}</p>261+
</section>262+
`;263+
264+
for (let section of act.sections) {265+
html += this.renderSection(section);266+
}267+
268+
return html;269+
},270+
271+
renderSection(section) {272+
switch (section.type) {273+
case 'text':274+
return `275+
<section class="panel story-panel">276+
<p class="panel-content">${section.content.split('\n\n').join('</p><p class="panel-content">')}</p>277+
</section>278+
`;279+
280+
case 'puzzle':281+
return `282+
<section class="panel puzzle-panel" data-puzzle-id="${section.id}">283+
<p class="panel-title">PUZZLE: ${section.id.toUpperCase()}</p>284+
<p class="puzzle-question">${section.question}</p>285+
<form class="puzzle-form" data-puzzle-id="${section.id}">286+
<input type="text" placeholder="Your answer" autocomplete="off" />287+
<button type="submit">Submit Answer</button>288+
<button type="button" class="hint-btn">Get Hint</button>289+
</form>290+
<p class="puzzle-result" aria-live="polite"></p>291+
</section>292+
`;293+
294+
case 'interactive':295+
return `296+
<section class="panel interactive-panel" data-tool="${section.tool}">297+
<p class="panel-title">DECRYPTION TOOL</p>298+
<p>Encrypted text: <code>${section.encrypted}</code></p>299+
<p>${section.hint}</p>300+
<div id="tool-${section.id}"></div>301+
</section>302+
`;303+
304+
default:305+
return '';306+
}307+
},308+
309+
attach() {310+
// Attach puzzle handlers311+
document.querySelectorAll('.puzzle-form').forEach(form => {312+
form.addEventListener('submit', (e) => {313+
e.preventDefault();314+
const puzzleId = form.dataset.puzzleId;315+
const answer = form.querySelector('input').value;316+
this.checkPuzzle(puzzleId, answer);317+
});318+
319+
form.querySelector('.hint-btn').addEventListener('click', () => {320+
const puzzleId = form.dataset.puzzleId;321+
this.showHint(puzzleId);322+
});323+
});324+
},325+
326+
checkPuzzle(puzzleId, answer) {327+
// Implemented in UI handler328+
},329+
330+
showHint(puzzleId) {331+
// Implemented in UI handler332+
}333+
};