Road Remains
"Don't worry, the road is going to be fixed this time."
Overview & Vision Statement
A politician has been promising to fix your road since 2010. Six weeks before the election, you try to make sure your community can actually vote, sorting through WhatsApp misinformation, registration queues, and election-day confusion.
You're going to believe, at some point, that the road might finally happen. That's the design. You won't find out until the very end whether you were right. The game doesn't tell you what to think. It shows you the evidence, a Road File that proves every application was processed correctly, a 2010 manifesto with a road section that is 94% identical to the current one, and lets you draw the conclusion yourself.
The emotional core of this game. Every writer, artist, and developer reads this before touching anything else.
The Promise
Mahinda Bandara's campaign is everywhere. Calendars. Posters. His manifesto has a section about the road. It sounds specific. It sounds achievable. The player has no reason to doubt him yet. Uncle Sirisena says he's always supported Mahinda because he finally gets things done. Mudalali says the road will be sorted before the monsoon hits. The ambient optimism is real, and it's the game's most important lie.
The Crack Shows
If the player clicks Nandadasa's filing cabinet, not Nandadasa, the cabinet, they find the Road File. Every repair application filed since 2007. Every one processed correctly. Every one forwarded correctly. Every one received and filed. The road is not fixed because the budget was reallocated at a level above Nandadasa's jurisdiction. He has known this since 2009. He has never mentioned it. It is not his place. This scene is 90 seconds. It recontextualises everything without a single didactic line.
The Manifesto
If the player has read the current manifesto AND clicks an unmarked box in the campaign tent, a side-by-side comparison appears. The road section of the 2010 manifesto vs the current one. 94% identical. The only change: "within the next term" became "as a priority." The game says nothing. It just shows it.
The Road Remains
The election happens. Mahinda Bandara may win or lose. The road is still broken. This is not a twist ending, it is the premise. The game is called Road Remains. Every ending shares the same name. The player voted anyway. Aunty Soma has been voting since 1983 with no illusions. That's the point.
The reference point is GTA: San Andreas, not Civics 101. That game's power came from portraying a flawed, corrupt, alive world where you still had agency — where the system was broken but you moved through it anyway. The characters were not heroes or villains; they were people with contradictions, loyalties, and bad information doing what made sense to them.
Road Remains operates in the same register. The difference is the lens: instead of gang politics, it's electoral politics. Same grounded world-logic. Same moral complexity. Same refusal to tell you what to feel.
It Has Edge
Uncle Sirisena runs a WhatsApp group called "Alupotha Patriots" with 847 members and forwards everything without reading it. He is not a villain, his motivations are entirely good. His information hygiene is catastrophic. Both things are true at the same time, and the game never smooths the contradiction.
It's Not Safe
Mudalali has voted for the same party since 1977 and regards this as a form of integrity. His father ran the boutique before him. The 1977 receipt is behind the counter. He has never mentioned it to anyone. The game does not tell you what to make of that. It just leaves it there.
It's Honest
Sergeant Wickramasinghe is the most competent person in Alupotha and has made peace with the fact that this does not make him the most influential. He finds most situations mildly amusing. He requested this posting specifically and will not explain why. That thread does not resolve. It is simply there for players paying attention.
0. Canonical Definitions
This section exists solely to resolve conflicts identified between GDD v1.0 and supporting design documents. Every developer, artist, writer, and translator uses this section as the final authority. No other document overrides these definitions.
0.1 Week Numbering - Canonical Definition
The week counter is a countdown. The game opens at Week 6 (six weeks until election day) and ends at Week 0 (election day). The counter decrements by 1 each time the player completes a chapter. Week 4 means four weeks remain before the election. Registration closes when the counter reaches Week 4. The campaign period ends when the counter reaches Week 1. Voting day is Week 0. This convention is used in all documents, all code, all UI labels without exception.
| Counter Display | Meaning | Locks / Events |
|---|---|---|
| Week 6 | Game start - 6 weeks until election | All locations accessible except Polling Station |
| Week 5 | Community momentum | Rumours begin escalating. Uncle Sirisena's frequency increases. |
| Week 4 | Registration deadline | Voter registration permanently closes if not completed |
| Week 3 | Candidate list notice posted | Elections Commission board updated with official candidate list. Sandya's note appears. |
| Week 2 | Mid-campaign | Mahinda Bandara's manifesto comparison becomes available |
| Week 1 | Campaign period closes | Mahinda Bandara no longer gives interviews. Campaign tent still accessible. |
| Week 0 | Election day | Polling Station unlocks. All other locations become read-only. |
0.2 Character Name - Canonical Spelling
The third playable character is named Kumaran. Not Kumar. Not Kumaran Pillai. Kumaran. This spelling is used in all code variable names, all dialogue files, all UI labels, all translation files. Any supporting document that uses "Kumar" is incorrect and must be updated before production.
0.3 Skeptics Cafe - Canonical Status
Skeptics Cafe is a discoverable unlockable space, not a mapped location. It does not appear on the town map at the start of the game. It becomes accessible only after the player verifies three or more messages using the Elections Commission board in a single playthrough. It is referenced in dialogue by Nandadasa Mahaththaya as "a group of people who check things before they share them" - not named directly. Players who find it discover a secondary information network. Its existence is not documented anywhere the player can read before unlocking it.
Technical note: in map-data.json, Skeptics Cafe is the only location entry carrying an unlockedBy field (value: verifiedAtBoardCount_gte_3). All 12 other locations omit this field entirely rather than setting it to a falsy value, so checkMapUnlocks() can treat "no field" as "always visible" without a special case.
0.4 Difficulty Scope - MVP vs Post-Launch
MVP scope includes Standard mode only. Hard mode, Expert mode, and Speedrun mode are documented in Section 22.2 as post-launch features. They are not built in the initial release. The game state architecture must be designed to support them without refactoring, but they are not activated in v1.0 of the product.
0.5 Platform Scope - MVP
MVP is web browser only. Both Component A and Component B are web applications. Android packaging (Android 12+) is a post-launch deliverable documented in Section 22.2. The web build must be responsive and function correctly on mobile browsers as a prerequisite for eventual Android packaging.
0.6 Premise Disclosure vs Mechanical Instruction, Canonical Distinction
Early itch.io playtesting confirmed: first-time players reported not understanding the goal of the game at all. This is the single most critical implementation problem on this project. Screen 15 (the mandatory Premise Card) is the fix. It is not optional.
"It does not lecture" (Section 1.1) governs how the player is taught to play. It does not govern whether the player is told what the game is. These are two different kinds of telling, and conflating them is the single most common implementation mistake on this project.
Withhold: the correct response to a misinformation message, the existence of Skeptics Cafe, the consequence of a specific choice before it happens. Do not withhold: the premise (six weeks before an election; three numbers track community and personal outcomes), the stakes (gauge values at Week 0 determine which ending is reachable), and the fact that choices made early compound later. The second category must reach every first-time player before gameplay begins, through a mandatory screen (Section 18, row 15), never through an opt-in "About" panel that a player only finds if they go looking for it.
1. Vision Statement
Road Remains is a single-player, top-down isometric game set in the fictional Sri Lankan town of Alupotha — not Colombo, not a village, but the kind of semi-urban junction town most Sri Lankans either come from or pass through. There is a kovil on one side of the main road and a temple on the other. One traffic light that is technically functional. A bus that comes when it comes. Coconut trees everywhere, including in places where coconut trees probably should not be.
The player navigates the town for six weeks before an election, making decisions about what to share, who to trust, when to verify, and what to ignore. Three numbers track the consequences — Civic Trust, Information Health, Voter Participation — and they move based on every choice made. The town reacts. Characters remember. Mahinda Bandara keeps promising to fix the road.
The game does not tell the player who to vote for, what the correct politics are, or what conclusions to draw. It puts the player inside a system — flawed, functional, frustrating, real — and asks them to participate in it anyway. The road is not fixed at the end. This is not a failure state. This is the point.
1.1 What This Game Is Not
- It does not resolve the road. The road is still not fixed at the end of the game. Every ending shares the same title: "The Road Remains." This is the premise, not the punchline. The game is called Road Remains for a reason, and players should feel the weight of that title when they reach it, not surprise.
- It does not reward cynicism. Non-participation makes the imperfections worse, not better. The game asks the player to participate in the system with full awareness of its flaws. Aunty Soma has voted since 1983 with no illusions about what it will or won't fix. That's the model, not the exception.
- It does not tell the player who to vote for. Mahinda Bandara is fictional. No real party is named. The Elections Commission is referenced as an institution, no real officials depicted. The game has no endorsed candidate and does not signal one through consequence design.
- It does not claim the system is perfect. Nandadasa Mahaththaya's Road File exists precisely to show that correct process and good outcomes are not the same thing. The system can work exactly as designed and still fail the people it serves.
- It does not lecture. The situation speaks. The player learns by experiencing consequences, not by being told what the consequences are, not by a character explaining the lesson, not by a UI element marking the correct choice. The game trusts the player to work it out.
Screen 15, Premise & Stakes Card MVP · Mandatory · First Launch Only
Every first-time player sees this screen before the game begins. It cannot be skipped on the first launch. It is not an "About" panel. It is not in a menu. It appears once, in sequence, and is then permanently gone. This is the solution to the playtesting problem documented in Section 0.6, confirmed directly: first-time players reported not understanding the goal of the game at all.
The mockup below is the canonical design reference for the implementation of Screen 15. Implement this exactly. Do not move the road-promise statement. Do not soften it. Do not move it to an info panel.
Six weeks before the election. Alupotha, Sri Lanka.
The road outside your house has been broken for years. The candidate says this time it will be fixed. People in your community are getting messages about the election — some of them aren't true.
Over the next six weeks, three numbers track what's happening: community trust, how accurately you understand the process, and how many people in Alupotha will actually vote. What you share, verify, or ignore affects all three. Deadlines are real. Some close and do not reopen.
Civic Trust
Does this community believe the election is worth participating in?
Information Health
How accurate is your understanding of how the process actually works?
Voter Participation
How many people in Alupotha are going to vote on election day?
One thing to know before you start
The road is still broken at the end, whatever you do. The game is not about fixing it. It is about what you do anyway.
The "Begin — Week 6" button is the only interactive element on this screen. There is no "skip" option, no settings link, no back button. The screen is shown exactly once per device. The premiseCardShown flag is set in localStorage before the character select screen loads.
World, Locations & Characters
2. The Town, Alupotha
Alupotha means Middle Town. It is a composite of everywhere in Sri Lanka, not Colombo, not a village, but the kind of semi-urban junction town that most Sri Lankans either come from or pass through. There is a kovil on one side of the main road and a temple on the other. One traffic light that is technically functional. A bus that comes when it comes. Coconut trees everywhere, including in places where coconut trees probably should not be.
The road through the centre of town has been broken since before anyone can agree on exactly when. There are three competing stories about why. Mahinda Bandara's campaign posters are everywhere. His calendar is on the wall of Mudalali's boutique, the police station, the Grama Sevaka Office, and four other locations. The road is in his manifesto. It has been in his manifesto since 2010.
The game world is a clickable illustrated town map on a 1920×1080 canvas. Twelve of the thirteen locations are accessible from the start; the thirteenth unlocks only if the player verifies three or more messages at the Elections Commission board. The week countdown and three gauges are always visible, the player is never without information about where they stand.
3. The 13 Map Locations
The map has been expanded to 13 locations to improve atmospheric depth and world-building. Interactive hubs drive the narrative, while atmospheric nodes provide texture.
Interactive Hubs
Grama Sevaka Office

Procedural core. Voter registration, NIC issues.
Uncle Sirisena's House

Main misinformation mechanic.
EC Notice Board

The verification authority. Updates automatically.
Mudalali's Boutique

Informal information exchange and junction shop.
Police Station

Election law enforcement and violation reporting.
Campaign Tent

Political promises and manifesto comparison.
Skeptics Cafe

Hidden location unlocked after 3 successful verifications.
Polling Station

Locked until Week 0. The climax of the game.
Atmospheric / Secondary Nodes
Kovil

Peaceful spot. "Whatever you came here for, it is not here."
Temple

Peaceful spot. "Whatever you came here for, it is not here."
The Bar

Quiet daytime spot. "No election talk. Owner's orders."
Community Hall

Empty space with notices for next week.
Boarding House

Kumaran's residence. Includes bilingual paperwork hurdles for his specific path.
4. The Three Playable Characters
The player selects one character at the start. Each character experiences the same town and the same election but enters from a different position, has a different relationship with the community, and has one mechanical advantage and one mechanical disadvantage that changes how the game feels without changing what it teaches. The educational content is identical across all three - what changes is the texture of reaching it.
Karunasena (Playable MVP)
Background: He has just moved to Alupotha to live with his uncle while attending a vocational training programme. He is not particularly political. He has opinions but is not sure yet where they come from. Uncle Sirisena is his actual uncle, which means the WhatsApp group is not optional - he is a member by default and receives every notification in the game whether he wants to or not.
Perk - Curiosity: At every location he gets one additional dialogue option the other characters do not - he can ask why something works the way it does and receive a deeper explanation. This makes him the character best suited to players who want to understand the system from the ground up.
Disadvantage - Exposure: Because Uncle Sirisena is family, ignoring his messages has a social cost. Civic Trust takes a penalty of -10 CT for every 3 messages Karunasena dismisses without engaging. He cannot simply opt out of the misinformation - he has to navigate it.
Starting Gauges: Civic Trust 60 | Information Health 70 | Voter Participation 50
Best suited to: Players who want to understand the system from the ground up. First playthrough recommended character.
Kamala (Locked - Coming Soon)
Background: She has lived in Alupotha for eight years. She knows most people. She voted in the last two elections and filled in her ballot the way she always had, assuming she was doing it correctly. She was mostly right. Mostly.
Perk - Network: She has social capital in every location - queues are slightly shorter, characters share information more readily, and she occasionally gets warned about a problem before it becomes one.
Disadvantage - Assumption: The game periodically gives her information she believes she already knows but has subtly wrong - a detail about the preference vote system, a rule about polling station conduct, a deadline she thought was later than it is. She must recognise and correct these assumptions to maintain her Information Health score. Correcting a false assumption gives a +15 IH bonus. The lesson is that experience without attention accumulates errors.
Starting Gauges: Civic Trust 75 | Information Health 65 | Voter Participation 65
Best suited to: Players who want the social texture of the game. Second playthrough recommended character.
Kumaran (Locked - Coming Soon)
Background: He moved to Alupotha two years ago for work. His voter registration is in his home district. He needs to transfer it. The process involves more steps than it should and some of those steps involve forms that exist only in Sinhala, being processed by an officer who is doing his best but whose Tamil is limited. Kumaran's story is harder. It is also more complete.
Perk - Persistence: He earns significantly more points for completing each step because each step costs him more. He also unlocks a separate thread of content - conversations and situations that only arise when the player is navigating the system in a second language. The bilingual ballot. The Tamil notice on the Elections Commission board that contradicts the Sinhala notice because it was printed at a different time. The polling officer who mispronounced his name on the register.
Disadvantage - Distance: He does not have the social network Kamala has or the family anchor Karunasena has. He has fewer informal information sources, which makes accurate information harder to find and misinformation slightly harder to counter without the Elections Commission board.
Starting Gauges: Civic Trust 50 | Information Health 75 | Voter Participation 40
Language note: Kumaran's presence in the game is the reason the trilingual support is not cosmetic. For Kumaran, the language of the ballot and the language of the instructions at the polling station are the literal difference between a valid vote and a spoiled one.
Best suited to: Players who want to experience the full scope of the game's electoral justice content. Third playthrough recommended character.
Character Visual Specifications & Emotional States
Art Style Direction: Illustrated, flat vector style with clean lines. Colors must adhere to the Visual Style Bible (garnet red, slate, off-white). Proportions should be semi-realistic to ground the serious subject matter.
| Character | Visual Age & Build | Clothing Style | Skin Tone | Required Sprites (States) |
|---|---|---|---|---|
| Karunasena | 19, slim/youthful build, average height | Casual but neat (e.g., untucked short-sleeve button-up or polo) | Medium brown | Neutral, Talking, Happy, Worried, Surprised |
| Kamala | 34, confident posture, slightly taller than Karunasena | Professional/Teacher attire (e.g., modest saree or formal dress) | Warm brown | Neutral, Talking, Happy, Worried, Surprised |
| Kumaran | 28, athletic/labor-accustomed build | Practical workwear (e.g., simple collared shirt, slightly worn) | Dark brown | Neutral, Talking, Happy, Worried, Surprised |
NPC Portrait Specifications (8 Characters)
- Nandadasa Mahaththaya: 50s, stern, spectacles, government issued short-sleeve shirt. States: Neutral (stamping), Talking, Annoyed.
- Uncle Sirisena: 60s, expressive, slightly unbuttoned shirt, welcoming. States: Neutral, Talking, Enthusiastic.
- Sergeant Wickramasinghe: 40s, sharp uniform, relaxed posture. States: Neutral, Talking, Amused.
- Mudalali Perera: 50s, apron, leaning forward. States: Neutral, Talking, Loud.
- Mahinda Bandara: 40s/50s, overly groomed, politician's smile, maroon sash/accent. States: Neutral, Talking, Evasive.
- Aunty Soma: 50s, kind eyes, traditional modest dress. States: Neutral, Talking, Warm/Reflective.
- Elderly Woman (Queue): 70s, frail but determined, glasses. States: Neutral, Confused, Relieved.
- Sandya (Reference): Profile picture style, anxious but hopeful. States: Neutral.
5. The Supporting Cast
Nandadasa Mahaththaya
The grama sevaka. Has been at this posting since 1994. Processes approximately 40 files per day at a consistent pace that has never been observed to vary based on external conditions including urgency, rainfall, or the proximity of election day. He is not obstructing anyone. He is being thorough, which in this context is indistinguishable from obstruction. He secretly thinks the democratic system is one of the better things human beings have managed to build and would be embarrassed if anyone found out.
Uncle Sirisena

Retired. Connected to everything. Correct about nothing election-related. Runs the WhatsApp group Alupotha Patriots with 847 members. Has a television that is always on. Has a framed photo of every president since 1978, including some he later removed from the wall and then quietly put back. Feeds everyone who enters his house regardless of the political situation. His motivations are entirely good. His information hygiene is catastrophic.
Sergeant Wickramasinghe

Eleven years at this posting. Has seen voter fraud attempts, illegal poster campaigns, election violence, and one incident involving a candidate's supporter and a loudhailer that he is not at liberty to discuss. He finds most situations mildly amusing. He gives accurate information efficiently. He is the most competent person in Alupotha and has made peace with the fact that this does not make him the most influential.
Mudalali Perera

Junction shop owner. Has voted for the same party since 1977 and regards this as a form of integrity. Generous with short eats and political commentary in roughly equal measure. Not malicious. Just very certain and very loud. His father ran this boutique before him. The 1977 receipt is behind the counter. He has never mentioned it to anyone.
Mahinda Bandara

Provincial Council candidate. Has been in politics long enough to have several hairstyles documented in public records. Gives out calendars every election cycle with a new photo but the same smile. Has a manifesto. The manifesto has a section about the road. The section about the road has been in every manifesto since 2010, with minor edits. The road section of the 2010 manifesto and the current one are being compared somewhere in this game, if the player looks hard enough.
Aunty Soma

Karunasena's mother. Appears in his storyline directly; referenced by name in the other two characters' storylines. Has voted in every election since she turned eligible in 1983. Does not regard this as exceptional. Regards not voting the same way she regards not eating - technically survivable but why would you. She appears at the beginning of the game and at the end. Her scene at the end, outside the polling station, is the emotional anchor of the whole thing.
The Queue People

At the polling station, three people are around the player in the queue. An elderly woman who needs help locating her name on the voter register. A young man who left his NIC at home and is conducting a crisis in real time. A couple who have discovered they are in the wrong queue and are handling this differently from each other. Helping any of them is optional. The game does not tell you to. It just presents the situation and lets you choose. These three characters represent the highest single-source Voter Participation gains available in the game.
Game Systems, Mechanics & Consequences
6. The Three Gauges
All three gauges are always visible at the top of the screen. Gauges run from 0 to 100. They are shown as: a labelled bar, an icon, and a numerical value. Colour is never the sole indicator of information - gauge states are also shown with icons and numerical values (WCAG 1.4.1 compliance). All animations on gauge changes can be disabled for players with motion sensitivity.
- Civic Trust (CT): Does this community believe the election is legitimate and worth participating in? This is a community score, not a personal one. It drops when misinformation spreads, when violations go unreported, when the player chooses cynicism over engagement. It rises when the player verifies information before sharing, reports illegal campaign activity, and helps others navigate the process.
- Information Health (IH): How accurate is the player's personal understanding of the electoral process? This drops when the player accepts false information, skips verification, or follows Mahinda Bandara's instructions about voting procedure without checking official sources. It rises when the player reads the Elections Commission board, asks Nandadasa Mahaththaya direct questions, and resists the pressure to share things they have not confirmed.
- Voter Participation (VP): How many eligible people in Alupotha are going to vote? This is affected most by what the player does in the community rather than for themselves. Helping the queue people at the polling station raises this permanently. Spreading the fake story about the 4am voting time drops it. One action the player takes in Week 5 determines whether the elderly woman's family comes with her on election day.
6.1 Gauge Delta Table
Every action in the game and its exact gauge impact. CT = Civic Trust. IH = Information Health. VP = Voter Participation. Values marked with * are permanent and cannot be recovered through any subsequent action.
| Action | CT | IH | VP |
|---|---|---|---|
| Misinformation Decisions | |||
| Share Uncle Sirisena's fake 4am voting time message | -20 | -15 | -20 |
| Share Uncle Sirisena's fake candidate list | -15 | -20 | -10 |
| Share accurate information from a verified source | +10 | +10 | +10 |
| Verify message at Elections Commission board before acting | +10 | +15 | +5 |
| Ask Nandadasa Mahaththaya and follow his advice | +5 | +20 | +5 |
| Ignore ALL Uncle Sirisena messages - blanket distrust across entire playthrough | -5 | -5 | -5 |
| Karunasena only: every 3 Uncle Sirisena messages dismissed without engagement | -10 | - | - |
| Registration and Civic Process | |||
| Complete voter registration before Week 4 deadline | +10 | +15 | +20 |
| Miss voter registration deadline - permanent, cannot be recovered* | -5 | -20* | -30* |
| Check Elections Commission notice board (first visit per notice) | +5 | +10 | +5 |
| Report illegal campaign posters to Sergeant Wickramasinghe | +15 | +5 | +10 |
| Ignore voter intimidation scenario when presented | -20 | -5 | -15 |
| Report voter intimidation to Sergeant Wickramasinghe | +20 | +5 | +20 |
| Kumaran only: complete each step of district transfer (extra reward per step) | - | +20 | +30 |
| Information Gathering and Research | |||
| Read Mahinda Bandara's current manifesto in full | +5 | +15 | +5 |
| Find and complete the 2010 vs current manifesto comparison | +10 | +20 | +10 |
| Find the Road File in the Grama Sevaka Office filing cabinet | +5 | +25 | +5 |
| Find the 1977 receipt behind Mudalali's counter | +5 | +10 | - |
| Follow Mahinda Bandara's voting advice without checking an official source | -5 | -15 | - |
| Kamala only: correctly identify and correct a false assumption she held | - | +15 | - |
| Accept pol roti from Uncle Sirisena | +3 | - | - |
| Ask Mudalali Perera a critical follow-up question about a political claim | - | +5 | - |
| Polling Station - Week 0 Only | |||
| Help elderly woman find her name on the voter register - permanent* | +10 | +5 | +25* |
| Help young man who forgot his NIC understand his options | +5 | +5 | +10 |
| Help lost couple find their correct queue | +10 | +5 | +15 |
| Leave polling station without helping any of the queue people | -5 | - | -10 |
| Cast a valid ballot correctly | +10 | +10 | +20 |
| Spoil ballot due to acting on misinformation about the fold | -10 | -20 | -10 |
| Bulletin Board Thread - Cumulative Across Weeks 3 to 0 | |||
| Find Sandya's note in Week 3 and follow the thread each subsequent week | +10 total | +10 total | +15 total |
Glitch Prevention: Gauge increases for verifying EC notices are hard-capped to once per week/notice using the verifiedAtBoardCount flags to prevent players from artificially inflating their Information Health.
7. The Consequence System - Cross-Zone Reactivity
Every significant decision in one location leaves a trace in at least one other location. The town remembers what the player did. This is the most technically complex system in the game and the most educationally important.
The system works by reading the gameState.flags object when a new location is loaded. If a relevant flag is true, the location renders a modified version of itself. These modifications are additive - multiple flags can combine in the same location simultaneously.
7.1 Confirmed Consequence Chains
| Trigger (Player Action) | Affected Location | World Change |
|---|---|---|
| Player shares fake 4am voting message | Grama Sevaka Office | 23 confused people in queue who came at 4am. Wait is visibly longer. Nandadasa has heard about it and references it directly. |
| Player shares fake 4am voting message | Mudalali Perera's Boutique | Mudalali references the confusion. New dialogue available: "Can you believe people came at 4am?" |
| Player shares fake 4am voting message | Elections Commission Board | Formal correction notice posted on the board, referencing the circulating rumour. Board now shows the debunked version. |
| Player shares fake 4am voting message | Police Station | Sergeant Wickramasinghe has received three calls about it. New dialogue option available about community misinformation spread. |
| Player reads Mahinda's current manifesto | Police Station | Sergeant will comment on it if player asks - shares specific thoughts on the infrastructure promises relative to the actual known budget allocation. |
| Player reads Mahinda's current manifesto | Campaign Tent | Mahinda notices the player read it. Slightly different opening dialogue - slightly more careful with his specific claims than before. |
| Player helps elderly woman at polling station queue | Ending screen statistics | Her granddaughter registers to vote the following cycle - this fact is shown in the ending screen statistics panel. |
| Player finds Road File in Grama Sevaka Office | Campaign Tent | The 2010 manifesto comparison becomes available if the player subsequently finds the unmarked box in the corner of the tent. |
| Player reports illegal posters to Sergeant Wickramasinghe | Campaign Tent | Sergeant has spoken to Mahinda's supporters. Fewer posters visible. Mahinda is more guarded in his opening dialogue. |
| Sandya's note found and followed across Weeks 3 to 0 | Polling Station - voter register | Sandya's name appears on the voter register. Visible if player checks the register before voting. |
| Player verifies 3 or more messages at Elections Commission board in one playthrough | Town map | Skeptics Cafe becomes visible - a small unlabelled icon appears near the notice board on the map. Player must click it to discover it. |
| Player reports voter intimidation scenario to Sergeant Wickramasinghe | Polling Station | Increased security presence visible. Presiding officer references the earlier report. Gauge: additional +10 VP on election day. |
8. The Countdown Mechanic and Permanent Consequences
The election is in 6 weeks. The countdown is always visible. Some doors close as time passes and do not reopen. The game does not announce these closures in advance - they are discovered by absence. The player's first playthrough teaches them that deadlines are real. Their second playthrough shows them what to do about it.
- Week 4 - Registration closes: If the player has not completed the registration chapter by the end of Week 4, voter registration is permanently unavailable. Information Health takes a permanent reduction of -20 that cannot be recovered. The game does not stop. The player can still vote if they were already registered - but the lesson is built into the experience, not delivered as a message.
- Week 3 - Official candidate list posted: Players who visit the Elections Commission board at or after Week 3 can compare this list to Uncle Sirisena's circulating version, which has two candidates who do not exist and is missing one who does.
- Week 2 - Manifesto comparison unlocks: Mahinda Bandara's manifesto comparison mechanic becomes available. The 2010 copy can be found in the campaign tent from this point.
- Week 1 - Campaign period closes: Mahinda Bandara no longer gives interviews. His manifesto can still be read. His calendar is still on walls everywhere. But the conversation about his promises is no longer available.
- Week 0 - Election day: The Polling Station unlocks. All other locations become read-only. This is the only day the player can vote. Consequences of all previous weeks are visible in this one location simultaneously.
8.1 Difficulty Modes
Standard mode is the MVP. Hard, Expert, and Speedrun modes are post-launch features. The game state architecture must support them without refactoring - they are not activated in v1.0.
Standard Mode - MVP
Misinformation: Moderate difficulty. False content is plausible but detectable with attention.
Deadlines: Missed deadlines reduce gauges but do not block the ending.
Gauges: Fully visible at all times.
Status: Built in v1.0.
Hard Mode - Post-launch
Misinformation: High difficulty. Lies are highly plausible and well-sourced-seeming.
Deadlines: Missed deadlines lock specific ending paths.
Gauges: Progress bars hidden. Numbers only.
Status: Documented, not built in v1.0.
Expert Mode - Post-launch
Misinformation: Extreme difficulty. Context-heavy, requires cross-referencing.
Consequences: Permanent credibility loss for a single mistake. Some locations become permanently inaccessible.
Gauges: Completely hidden.
Status: Documented, not built in v1.0.
Speedrun Mode - Post-launch
Timeline: 6 weeks compressed to 2. All decisions are faster.
Mechanic: Rapid decisions, instant cross-zone ripples. Leaderboard integration required.
Challenge: Reach the secret ending in under 10 minutes.
Status: Documented, not built in v1.0. Requires backend for leaderboard.
Scenarios, Misinformation Flow & Endings
9. Linear Chapter / Scene Breakdown (Karunasena Template)
This path outlines the expected chronological flow for Karunasena from Week 6 to Week 0. This serves as the narrative map for DOM scene connections and dialogue sequencing.
| Week | Location | NPC Encountered | Decision Point / Action | Consequence / Next Step |
|---|---|---|---|---|
| Week 6 | Uncle Sirisena's House | Uncle Sirisena, Aunty Soma | Receives first fake message (Registration Deadline). Choose to share or verify. | Triggers urgency. Player navigates to Town Map. |
| Week 6 | Grama Sevaka Office | Nandadasa Mahaththaya | Ask about registration deadline. Discover it is actually Week 4. | IH increases. Registration process initiated. |
| Week 5 | Mudalali's Boutique | Mudalali Perera | Overhear rumors about polling station assignments. | Introduces the Week 5 misinformation voice note. |
| Week 4 | Police Station | Sgt. Wickramasinghe | Report 4am voting rumor (or deal with fallout if shared). | Registration closes. Notice board updates. |
| Week 3 | EC Notice Board | None (Sandya's Note) | Read official candidate list. Find Sandya's note. | Bulletin Board thread begins. EC verification taught. |
| Week 2 | Campaign Tent | Mahinda Bandara | Read current manifesto. Uncover 2010 box. | Manifesto comparison unlocks. Sergeant commentary unlocks. |
| Week 1 | Police / Grama Office | Sgt / Nandadasa | Verify the ballot fold procedure. | Final preparation for election day. Campaign closes. |
| Week 0 | Polling Station | Queue NPCs, PO | Help the queue people. Cast the ballot correctly. | Triggers Ending calculations. |
10. The Misinformation Mechanic, Detailed Design
Uncle Sirisena sends content in four formats that mirror exactly how misinformation actually circulates. He is not a bot. He is not a bad person. He is a retired man with a lot of time, a phone, and 847 WhatsApp contacts who trusts him. The game does not reward blanket distrust any more than it rewards blanket trust, because one of Uncle Sirisena's messages is correct, and ignoring everything means missing it.
The educational design is in the asymmetry: the false content is faster and easier to act on. The verification requires navigating to another location. That friction is the point. Real misinformation spreads because checking takes effort and sharing takes a second.
10.1 Content Formats
- Text forward: Looks like a news article. Has a headline, a body, and a source that sounds plausible.
- Voice note: Cannot be easily fact-checked because there is no text to search. Player reads a written transcript summary, not the audio itself - because audio is inaccessible without transcripts (WCAG compliance).
- Screenshot: An image of something allegedly said by a real institution. Player must evaluate whether the institution would say this and whether the formatting looks correct.
- Video clip: Shown as a still frame with a caption. The caption may or may not accurately describe what is in the video.
10.2 Player Response Options
- Share immediately: Fastest option. Requires no navigation. If the content is false, triggers the cross-zone consequence system immediately.
- Ignore completely: Safe if content is false. Costly if content is accurate - some accurate information comes through Uncle Sirisena and ignoring everything he sends means missing it.
- Check the Elections Commission board: Always available but takes time - the player must physically navigate to the town square and find the relevant notice. This simulates the real friction of verification.
- Ask Nandadasa Mahaththaya: Slowest option. Only available during office hours (posted on the door and not generous). But he is always right. He has never forwarded anything in his life.
10.3 Uncle Sirisena's Complete Message Schedule
| Week | Format | Content | True or False | Verification Source |
|---|---|---|---|---|
| Week 6 | Text forward | Claims registration deadline is Week 6. It is actually Week 4. Creates urgency and panic. | False | Elections Commission board, Nandadasa Mahaththaya |
| Week 5 | Voice note | Claims that voters can vote at any polling station on election day. This is incorrect - voters must attend their assigned station only. | False | Elections Commission board |
| Week 4 | Screenshot | A fake Elections Commission notice about voting time change to 4am. The EC logo is slightly wrong. The footer is missing. | False | Elections Commission board (real opening hours posted there) |
| Week 3 | Text forward | States that voters need to bring their NIC or passport to vote. This is correct information. | True - sharing this is the correct action | N/A - this one should be shared. Not sharing it is a missed opportunity. |
| Week 2 | Video clip | A fake candidate list - two names that do not exist, one real candidate's name missing. Circulated to cause confusion about who is actually on the ballot. | False | Elections Commission board's official candidate list notice (posted at Week 3) |
| Week 1 | Voice note | Claims about where to fold the ballot. The procedure described is incorrect. Acting on this advice produces a spoiled ballot. | False | Nandadasa Mahaththaya, Sergeant Wickramasinghe |
10.4 Interactive Decision Trees - All Six Scenarios
Click any choice to reveal its consequence and gauge impact. Each scenario maps to one Uncle Sirisena message in the schedule above.
10.5 Kumaran's Language Barrier Scenarios (Documented - Locked Path)
Kumaran's path explicitly involves trilingual inclusion mechanics that impact his ability to participate. Kumaran himself remains locked until a later phase (see Section 22.1), but these scenarios are fully designed now so they're ready to activate the moment his path unlocks.
Scenario A: The Sinhala-Only Form (Grama Sevaka Office)
Context: Kumaran attempts to transfer his voter registration. The required form is only available in Sinhala. Nandadasa is trying to help, but his Tamil is limited.
Scenario B: Polling Station Instructions (Week 0)
Context: At the polling station, the presiding officer mispronounces Kumaran's name and issues verbal instructions in rapid Sinhala. Kumaran needs to ensure he doesn't spoil his ballot.
11. Secret Content, Easter Eggs, and Hidden Threads
None of this content is required to complete the game. All of it adds something. It is intentionally designed to reward players who look carefully and play more than once. None of it is flagged, signposted, or marked as interactive in the UI. The player either finds it or they do not.
11.1 The Road File

How to find it: In the Grama Sevaka Office, click on Nandadasa Mahaththaya's filing cabinet rather than on Nandadasa himself. No prompt is given. The interaction is available from Week 3 onwards.
What happens: A 90-second exchange. Nandadasa retrieves a thick folder - a paper trail of every road repair application submitted since 2007. Each application was processed correctly. Each was forwarded. Each was received and filed. The road is not fixed because the budget was reallocated at a level above his jurisdiction. He has known this since 2009. He pulls out a thinner folder - his personal correspondence attempting to escalate the issue. He has never mentioned this to anyone because it is not his place.
What it does: Recontextualises Mahinda Bandara without exonerating him. Also recontextualises Nandadasa entirely. Gauge: +25 IH, +5 CT. Unlocks achievement "Thirty Years in the Same Room".
11.2 The 1977 Receipt

How to find it: In Mudalali Perera's boutique, click specifically on the wall behind the counter. Not on Mudalali himself. No prompt given.
What happens: A framed receipt from 1977 - a food order from a political rally. Mudalali's father ran this boutique before him and catered the rally for the party that won that election. The party Mudalali has voted for every election since. He did not choose it for ideological reasons. The game says nothing about what this means. The player decides.
What it does: Gauge: +10 IH, +5 CT. Unlocks achievement "Pol Roti and Politics".
11.3 The Manifesto Comparison

How to find it: The player must have already read the current manifesto AND click on a specific unmarked box in the corner of the campaign tent. Two conditions required. No prompt given for the box.
What happens: The game generates a side-by-side comparison of the 2010 and current manifesto. The road section is highlighted. The wording is 94% identical. The only substantive change is that 2010 says "within the next term" and the current version says "as a priority." The game says nothing about this comparison. It just shows it.
What it does: Gauge: +20 IH, +10 CT. Unlocks achievement "Actually Read the Fine Print".
11.4 The Sergeant's Transfer

How to find it: The player must first hear about the 2016 road repair attempt from Mudalali Perera. Then visit the Police Station and specifically ask Sergeant Wickramasinghe about 2016. Two conditions required. No hint given.
What happens: He pauses longer than usual. He says he arrived at this posting in 2017. He does not know the specific history of every infrastructure project. If the player waits rather than clicking through dialogue, he adds one more line: that he requested this posting specifically and he is not going to explain why. This thread does not resolve. It is simply there for players who are paying attention.
What it does: No gauge impact. Unlocks achievement "Somebody Had to Ask".
11.5 The Bulletin Board Thread

How to find it: Visit the Elections Commission board in Week 3. A small handwritten note is pinned in the corner, not from the Elections Commission. It says: "My name is not on the list. Has anyone else had this problem. Please contact Sandya." The phone number given is fictional.
What happens: If the player returns to the notice board each week from Week 3 to Week 0, the note changes. Someone has replied by hand underneath. Then someone else. By election day, there is a small cluster of handwritten notes from people helping each other navigate the registration problem. Sandya's name appears on the voter register inside the polling station on Week 0. She made it.
What it does: Gauge across all weeks: +10 IH, +10 CT, +15 VP total. Unlocks achievement "Sandya Made It".
11.6 Skeptics Cafe

How to find it: Verify three or more messages using the Elections Commission board in a single playthrough. A small unlabelled icon appears near the notice board on the town map. No announcement. No notification. Player must click it.
What happens: A secondary information network - community members who evaluate content before sharing. They provide additional misinformation commentary and context on any content currently circulating. Nandadasa is not a member. He was invited once. He did not reply to the invitation, which itself took six weeks.
What it does: Provides an additional response option (Share with Skeptics Cafe) for all subsequent Uncle Sirisena messages. Unlocks achievement "You Found the Cafe".
12. Endings
The ending is determined by the player's gauge scores and flag states at Week 0, after voting. Endings are evaluated in order from secret to bad, the game checks for the secret ending first, then good, then neutral, then bad.
Design Note — Why All Four Endings Have the Same Name
Every ending in this game is called "The Road Remains." Good, Bad, Neutral, and Secret. The road does not get fixed in any of them. This is not a mistake. It is the entire argument of the game made structural: the outcome of the election does not depend on whether the candidate fixes the road — it depends on whether the community participated with accurate information. The title of the ending is the same. What changes is the community that reaches it.
12.1 Bad Ending
Trigger: Any single gauge below 30 at Week 0, OR registration was missed, OR ballot was spoiled due to misinformation.
The town is quieter. The turnout is low. Characters comment on what happened without editorialising. The election happens. The result is announced. Mahinda Bandara may win or lose depending on Voter Participation score - but the ending focuses on the community, not the candidate. The ending screen shows statistics: what percentage of Alupotha voted, where Civic Trust ended, how many people the player helped versus how many were confused by what the player shared.
12.2 Neutral Ending
Trigger: All gauges between 30 and 60 at Week 0. Valid ballot cast. Registration completed.
The player voted and tried. Some things went wrong. Some went right. The game acknowledges both without sentimentality. The community participated but not at full strength. The ending screen reflects a mixed picture - some people helped, some misinformation still spread, some opportunities missed.
12.3 Good Ending
Trigger: All gauges above 60 at Week 0. Registration completed. Valid ballot cast.
Karunasena walks out of the polling station. Aunty Soma is waiting outside. The moment passes without dialogue - just the two of them and the quiet of a street that has been through an election. The closing card shows community statistics. Strong turnout. High Civic Trust. A note that the elderly woman's granddaughter registered to vote for the next cycle if the player helped her find her name.
12.4 Secret Ending
Trigger: All three gauges above 75 at Week 0. Manifesto comparison completed. Road File found. All three queue people helped. Valid ballot cast.
The standard good ending plays in full. After the closing card, there is one more scene. Aunty Soma takes a worn voter registration card from her purse, her original card from 1983. She shows it to Karunasena. She says, in whichever language the player has selected, that she has carried this since the first time she voted. That it is not the card that matters. That the road will probably not be fixed. That Mahinda Bandara will probably win again. That she comes every time anyway because the alternative is to let other people make all the decisions, and she has never found a convincing argument for that.
She puts the card away. The game ends. There are no further statistics or scores. Just the closing.
Technical Architecture & UI Standards
13. Game State Specification (Vanilla JS)
The game is built entirely using HTML5, CSS3, and JavaScript. The Godot engine approach was deprecated to ensure immediate web compatibility and lightweight DOM manipulation. The game operates in a fixed 1920x1080 canvas scaled dynamically via script.js.
All progression is tracked locally and stored via localStorage (using keys: plv_save, plv_achievements, plv_completed_chars, plv_textsize).
window.gameState = {
core: {
character: 'karunasena' | 'kamala' | 'kumaran',
language: 'en' | 'si' | 'ta',
textSize: 'standard' | 'large' | 'extra-large',
week: 6,
sessionStart: timestamp,
sessionId: uuid,
sessionCount: 1
},
gauges: {
civicTrust: Number,
informationHealth: Number,
voterParticipation: Number
},
flags: {
visitedLocs: [],
completedLocs: [],
achievements: [],
endingReached: null,
secretEndingReached: false,
registrationComplete: false,
sharedFake4amMessage: false,
verifiedAtBoardCount: 0,
skepticsCafeUnlocked: false
},
dialogue: { active: false, currentLine: 0, lines: [] }
}
14. Visual Style Bible
- Color Palette: Garnet Red (#8B1A2B), Slate (#3D4A5C), Gold (#D4AF37) for Civic Trust, Green (#6B9080) for Info Health.
- UI Treatment & Philosophy: The UI strictly follows a grounded "2006 card" aesthetic. Avoid modern floating glassmorphism entirely. Panels should feel solid, tactile, and editorial with hard beveled edges (
.game-btn). - Typography: Cormorant Garamond for display, Source Serif 4 for body, DM Sans for UI, and JetBrains Mono for mono.
15. DOM Engine Structure & Technology Stack
The game relies on a bespoke Visual Novel DOM engine located in script.js.
| System Component | Purpose |
|---|---|
_renderLine() | Parses external JSON scenes to render standard dialogue, narration, and dynamic media cards. |
Media Cards | Renders simulated WhatsApp bubbles, Voice Notes (with transcript), Screenshots (with forensic cues), and EC Notices. |
checkMapUnlocks() | Evaluates window.gameState.flags to pulse map nodes (radar ripple) indicating current objectives. |
showWeekBanner() | Interrupts gameplay with a modal to safely transition weeks only after mandatory tasks are completed. |
_evalCondition() | Safely parses JSON string conditions against the current state to dynamically alter dialogue branches. |
checkAchievements() | Owns all 28 achievement trigger conditions. Called after every flag mutation and gauge update. Does not live in config.js - that file holds only the static achievement data, not the evaluation logic. |
applyConsequenceFlags() | Owns all 12 cross-zone consequence chains from Section 7. Reads window.gameState.flags on location load and renders the modified location variant. Single source of truth for consequence logic so it is never duplicated inside individual scene JSON files. |
15.1 Component B - Technical Architecture
Component A above is specified down to function names and state shape. Component B is currently specified only as feature bullets - "real-time session management," "WebSocket communication," "CSV export" - with no architecture behind them. This is the largest unresolved gap in this document and must be closed before Week 4-5 of the production timeline (Section 18.3), since Component B needs infrastructure Component A deliberately avoids: a server.
Decision required before build: Component A's "strictly vanilla, no backend" constraint cannot extend to Component B. A facilitator dashboard pushing live scenario state to multiple participant devices needs either a WebSocket server or a polling fallback; static hosting alone cannot do this. This must be resolved as an explicit, named hosting decision, not discovered mid-build.
| Open Question | Why It Matters |
|---|---|
| Where does the WebSocket server run? | Determines hosting cost, whether Component B can ship on the same static host as Component A, and who maintains the server after handover to LIRNEasia. |
| What identifies a session - a join code, a QR code, both? | Affects the Facilitator Dashboard and Participant Mobile View screens (Section 18, rows 16-17) directly and cannot be wireframed without this answer. |
| What is the participant data model - is any participant identity stored, even anonymised? | Determines what the component_b_response analytics event (Section 16) can capture, and what the CSV export contains. |
| What happens to an in-progress session if the facilitator's connection drops? | Undefined failure mode. Needs a stated behaviour - session persists server-side vs. session ends - before the Section 18.4 "minimum 10 simultaneous participants" test can be considered complete. |
Does Component B share gameState shape with Component A, or use a separate schema? | If separate, the two components drift independently over time. If shared, Component A schema changes (Section 13) become breaking changes for Component B with no versioning plan in place. |
16. Analytics Event Taxonomy
Every event below is fired to the analytics backend at the moment it occurs. The analytics dashboard shows aggregate data - never individual player data. All data is anonymised by session ID. The funder receives dashboard access. No raw event logs are exposed publicly.
| Event Name | Fired When | Data Payload |
|---|---|---|
session_start | Game loads and character is selected | character, language, timestamp, sessionId, sessionCount |
session_end | Any ending is reached | character, language, duration, endingReached, finalGauges{ct, ih, vp}, sessionId |
language_switched | Player uses the language switcher mid-session | from, to, week, sessionId, character |
location_visited | Player navigates to any location | locationId, week, character, sessionId, visitCount |
gauge_update | Any gauge value changes | gauge, oldValue, newValue, delta, trigger, week, locationId, character, sessionId |
misinformation_choice | Player responds to any Uncle Sirisena message | messageId, week, choice (share|ignore|verify|ask), isCorrectChoice, character, sessionId |
secret_found | Player discovers any secret content | secretId, week, character, sessionId |
deadline_outcome | Week 4 passes (registration window closes) | registrationComplete, character, sessionId |
queue_person | Player interacts with any queue person at polling station | personId (elderly|youngman|couple), helped (true|false), character, sessionId |
vote_cast | Player casts their ballot at Week 0 | outcome (valid|spoiled), character, finalIH, sessionId |
achievement_unlocked | Any achievement is unlocked | achievementId, week, character, sessionId, timestamp |
component_b_session | Facilitator starts a Component B session | sessionCode, participantCount, scenarioPlaylist, language, timestamp |
component_b_response | Participant responds to a scenario in Component B | sessionCode, scenarioId, choice, anonymous_participantId, responseTime |
17. Accessibility - WCAG Compliance Requirements
Accessibility is not a post-launch feature. Every requirement listed below is a production prerequisite that is tested and confirmed before release. The game failing any of these tests is a build failure, not a nice-to-have fix.
| Requirement | WCAG Standard | Implementation |
|---|---|---|
| Minimum tap target size | WCAG 2.5.5 | Every tappable element minimum 44×44 pixels. Applies to all interactive elements including map locations, dialogue choices, NPC click targets, and navigation buttons. |
| Text size options | WCAG 1.4.4 | Three display text sizes - standard (1x), large (1.18x), extra-large (1.4x) - applied via a single --text-scale CSS custom property consumed by every reading-path font-size rule (dialogue text, choice options, speaker names, media and document cards). Persisted via localStorage key plv_textsize, restored on load before first paint. This setting is independent of the 1920x1080 canvas scale transform (Section 13) and must never be implemented as a multiplier on that transform, since canvas scale is constrained by viewport fit and would clip content on narrow screens. |
| Colour independence | WCAG 1.4.1 | Gauge states shown with icon, numerical value, AND colour. Colour is never the sole indicator of information. Positive/negative gauge changes also shown with +/- symbols, not just green/red. |
| Motion sensitivity | WCAG 2.3.3 | All animations can be disabled in settings. Also automatically respected via prefers-reduced-motion media query. Setting persists across sessions. |
| Screen reader navigation | WCAG 4.1.2 | All menu systems navigable via screen reader. All interactive elements have ARIA labels. All sections have aria-labelledby headings. Skip-to-main-content link at top of page. |
| Sinhala and Tamil font rendering | Best practice - essential for trilingual content | Noto Sans Sinhala and Noto Sans Tamil loaded for all Sinhala and Tamil text. :lang(si) and :lang(ta) CSS rules apply correct font, line-height, and letter-spacing. |
| Contrast ratio - body text | WCAG 1.4.3 | All body text meets minimum 4.5:1 contrast ratio. Garnet red (#8B1A2B) on off-white (#F5F0EA) verified. Slate (#3D4A5C) on off-white verified. |
| Contrast ratio - large text and UI elements | WCAG 1.4.3 | All large text and UI components meet minimum 3:1 contrast ratio. |
| Audio descriptions | WCAG 1.2.3 | Available for all significant visual elements via settings toggle. Voice note content always displayed as written transcript - audio is never the only format. |
| Keyboard navigation | WCAG 2.1.1 | Full game navigable by keyboard. Tab order is logical. Focus states are visible. No keyboard traps. All interactive elements reachable without a mouse or touchscreen. |
| Focus visibility | WCAG 2.4.7 | All focusable elements have a visible focus indicator with sufficient contrast. Custom focus ring applied consistently across all interactive elements. |
Systems Network Map
Interactive visualisation of all characters, locations, and systems. Click any node to view its connections and GDD details.
Production Plan & AI Tool Assignments
18. Screen Inventory
All 17 required screens must be wireframed in Figma before DOM/CSS implementation begins.
| # | Screen Name | Section | Priority |
|---|---|---|---|
| 1 | Splash / Loading Screen | Component A | MVP |
| 2 | Language Selection (EN/SI/TA) | Component A | MVP |
| 3 | Main Menu | Component A | MVP |
| 4 | Character Selection | Component A | MVP |
| 5 | Town Map Navigation | Component A | MVP |
| 6 | Location Scene Template (Applies to all 7) | Component A | MVP |
| 7 | Dialogue Box UI | Component A | MVP |
| 8 | WhatsApp Message Card | Component A | MVP |
| 9 | Gauge HUD | Component A | MVP |
| 10 | Week Counter Display | Component A | MVP |
| 11 | EC Notice Board View | Component A | MVP |
| 12 | Ending / Results Screen | Component A | MVP |
| 13 | Achievements Screen | Component A | MVP |
| 14 | Settings / Accessibility Panel | Component A | MVP |
| 15 | Premise & Stakes Card (mandatory, first launch only - see Section 0.6) | Component A | MVP |
| 16 | Facilitator Dashboard | Component B | MVP |
| 17 | Participant Mobile View | Component B | MVP |
18.1 Asset Production Checklist
Master list of all required assets. Must be completed before generating art in Firefly or DALL-E.
| Asset Name | Type | AI Tool | Web Format | Status |
|---|---|---|---|---|
| 7 Location Backgrounds | Background | Adobe Firefly | 1920x1080 webp | Pending |
| 1 Town Map Illustration | Background | Adobe Firefly | 1920x1080 webp | Pending |
| 3 Playable Character Sprites (x5 states) | Character | Adobe Firefly | Transparent webp | Pending |
| 8 NPC Portraits (x3 states) | NPC | DALL-E 3 | Transparent webp | Pending |
| 6 WhatsApp UI Cards | UI | Canva / DALL-E | webp | Pending |
| UI Kit (Buttons, Gauges, Dialogue Box) | UI | Canva AI | CSS / SVG | Pending |
| Mahinda Bandara Posters & Calendars | UI / Prop | DALL-E 3 | webp | Pending |
| EC Notice Board Elements | UI / Prop | Canva AI | webp | Pending |
| 7 Ambient Location Audio Tracks | Audio | Suno | OGG | Pending |
| UI Sounds & WhatsApp Notifications | Audio | Freesound | WAV | Pending |
18.2 Visual Style Bible (UI Focus)
Core visual parameters to be defined as Figma components in Week 1.
- Color Palette: Garnet Red (#8B1A2B) for primary accents/critical actions, Slate (#3D4A5C) for typography/secondary, Off-White (#F5F0EA) for backgrounds.
- UI Treatment: The UI strictly follows a grounded "2006 card" aesthetic. Avoid modern floating glassmorphism entirely. Panels should feel solid, tactile, and editorial with hard beveled edges.
- Typography: Cormorant Garamond, Source Serif 4, DM Sans, and JetBrains Mono. Note: Sinhala and Tamil characters render larger than Latin at the same font size. All UI elements (buttons, dialogue boxes) must use flexible auto-layout in Figma to accommodate language switching without text clipping.
18.3 6-Week Production Timeline & Milestones
| Week | Phase | Deliverables | Dependencies |
|---|---|---|---|
| Week 1 | Foundation | Visual Style Bible, Screen Inventory, Asset Checklist, Linear Scene Breakdown, Karunasena Dialogue Drafts. | GDD finalized. Character Brief completed. |
| Week 2 | Design | Figma wireframes (all 17 screens). Kamala/Kumaran dialogues. Component B flows. Figma-to-DOM handoff protocol. | Week 1 specifications approved. |
| Week 3 | Art & Audio | Generate all 7 backgrounds, character sprites, NPC portraits, UI assets, and audio. Submit dialogue for Sinhala/Tamil review. | Figma wireframes locked. Visual style locked. |
| Week 4 | DOM Build (Core) | DOM scene structure setup. Town Map, Gauge HUD, Week Counter, dialogue engine implementation, State save/load system. | All Week 3 art and audio exported in correct formats. |
| Week 5 | DOM Build (Content) & Review | All 7 location scenes built. Cross-zone consequence chains implemented. Formal Milestone: Legal/Accuracy Review of Electoral Law content. Component B coded. | Dialogue system fully functional. Translation review completed. |
| Week 6 | Testing & Polish | Manual playtest of 12 consequence chains and 28 achievements. WCAG accessibility checks. Delivery prep. | Feature freeze. No new mechanics allowed. |
18.4 Critical Production Warnings
Sri Lankan electoral law accuracy: The voter registration steps, polling rules, and election commission procedures must be verified against real Sri Lankan sources before writing the dialogue. Do not use AI memory for these facts. Cross-check against the Elections Commission of Sri Lanka's official published materials.
Trilingual final review - non-negotiable: AI translation of Sinhala and Tamil produces a first draft only. One native Sinhala speaker and one native Tamil speaker who understands the electoral context must review all translated content before it goes live. This especially applies to Kumaran's path and all ballot instructions.
Consequence chain testing: All 12 consequence chains in Section 7 must be manually triggered and verified by a human player before release. This takes one focused day of playtesting, not a week. Do not skip it. Automated testing cannot replace this - the chains involve state combinations that require playing through as a human.
Achievement testing: All 28 achievements must be manually triggered in a test environment to confirm their conditions fire correctly. Pay particular attention to "The Road Remains" - it must fire on every single ending including the bad ending, and must not fire before an ending is reached.
Achievements & Subtle Clue System
28 total achievements. 4 hidden. The system exists to give an education game a reason to be replayed.
19. Achievement System - Design Philosophy
Half the achievements are funny. Half are genuinely meaningful. None of them tell the player what to do next. The funny ones should make a first-time player laugh when they read the name before they understand it. The meaningful ones should feel like quiet acknowledgments of something the player actually did, without applause.
This system exists for one practical reason: an education game that takes itself too seriously is one nobody finishes. The achievements give players a reason to replay and reward the curiosity that drives deeper learning.
Storage and Display
- Achievements are stored in the same
gameStatelocalStorage object as everything else. No external platform required for MVP. - The Achievements screen is accessible from the main menu only. It is not accessible mid-game.
- The screen shows all 28 achievements including locked ones. Locked achievements show their name but the description is replaced with a placeholder dash. The player has to earn it to read what it says.
- Four achievements are fully hidden when locked - they appear as a blank tile with a question mark. The player does not know these exist until they unlock them.
- The screen shows a simple counter: X / 28 Unlocked. No percentage. No rarity. No global statistics. Just the number.
Notification Types
- Silent: Achievement appears in the Achievements screen with no in-game notification. Player discovers it when they next visit the screen. The majority of achievements are silent.
- Immediate pop-up: A small card appears at the bottom right of the screen for 3 seconds before fading. Used only for 5 specific achievements that benefit from immediate acknowledgment. No sound. Subtle animation only.
Hidden Achievements (4 total)
These four achievements show as question marks until unlocked. Their names and descriptions are only visible after being earned:
- The Unbroken Chain - secret ending
- Thirty Years in the Same Room - Road File
- Somebody Had to Ask - Sergeant's Transfer thread
- You Found the Cafe - Skeptics Cafe
20. All 28 Achievements - Complete List
| Name | Description (visible after unlock) | Trigger Condition | Notification Type |
|---|---|---|---|
| You started. Brave. | |||
| Big Mistake | Started the game. | sessionCount equals 1. Fires before character select screen on first ever launch. The first thing that happens. | Immediate pop-up - this one fires before the game even begins. The player will laugh or be confused. Both are correct. |
| Democracy, They Said | Selected a character and began your first playthrough. | Character selection confirmed. Week 6 begins. sessionCount equals 1. | Silent |
| You are learning. Slowly. | |||
| Read the Fine Print | Read Mahinda Bandara's manifesto. The whole thing. | readCurrentManifesto flag set to true. | Silent |
| Actually Read the Fine Print | Found and compared the 2010 manifesto to the current one. Side by side. The road section. | manifestoComparisonDone flag set to true. | Silent |
| The Algorithm Would Hate You | Verified a message at the Elections Commission board instead of sharing it immediately. | First time player selects Verify option at the Elections Commission board. | Silent |
| Professional Skeptic | Verified three or more messages in a single playthrough. Unlocked something. | verifiedAtBoardCount reaches 3. Skeptics Cafe unlocks simultaneously. | Silent - the unlocked Cafe is the bigger discovery moment |
| Nandadasa Approved | Asked Nandadasa Mahaththaya before acting on information. He was right. He is always right. | First time player selects Ask Nandadasa and follows his advice. | Silent |
| You found things. (4 are hidden until found) | |||
| Thirty Years in the Same Room [HIDDEN until unlocked] | Found the Road File. You know why the road is not fixed. It is not the reason you expected. | foundRoadFile flag set to true. | Silent |
| Pol Roti and Politics | Found the 1977 receipt behind Mudalali's counter. Political loyalty has stranger origins than you think. | found1977Receipt flag set to true. | Silent |
| Sandya Made It | Followed Sandya's handwritten note from Week 3 to Week 0. Her name is on the register. | sandyaOnRegister flag set to true at Week 0. | Silent |
| Somebody Had to Ask [HIDDEN until unlocked] | Found the thread about Sergeant Wickramasinghe's 2016 transfer request. He still will not explain why. | foundSergeantTransferThread flag set to true. | Silent |
| You Found the Cafe [HIDDEN until unlocked] | Found the Skeptics Cafe. It does not have a sign. Nandadasa was invited once. He did not reply. | skepticsCafeUnlocked flag set to true. | Silent |
| You helped people. | |||
| Not Your Job | Helped the elderly woman find her name on the voter register. It was not your job. You did it anyway. | helpedElderlyWoman flag set to true. | Silent |
| At Least Someone Asked | Helped all three people in the polling station queue in a single playthrough. They noticed. | helpedElderlyWoman AND helpedNICYoungMan AND helpedLostCouple all true in same session. | Immediate pop-up - this one earns the notification |
| It Spreads Both Ways | Shared accurate, verified information through Uncle Sirisena's WhatsApp chain. It works in both directions. | First time player correctly identifies the Week 3 true message and shares it. | Silent |
| You made things worse. | |||
| 847 Members | Shared a false message through Uncle Sirisena's WhatsApp group. 847 people received it. This is why the queue at the Grama Sevaka Office looks like that. | First time sharedFake4amMessage OR sharedFakeCandidateList is set to true. | Silent - player finds this in the screen while dealing with the consequence in the game world. The timing lands better that way. |
| You Were So Confident | Acted on Mahinda Bandara's voting instructions without checking an official source. The fold was wrong. | Player follows Mahinda's voting advice without verification and casts a spoiled ballot. | Silent |
| The 4am People | Shared the fake voting time message. Twenty-three people came at 4am. Nandadasa has heard about it. | sharedFake4amMessage flag set to true. Separate from "847 Members" - this one is specific to the 4am scenario because the world consequence is the most visible. | Silent |
| Blanket Policy | Ignored every single message Uncle Sirisena sent. Including the one that was true. | All 6 Uncle Sirisena messages ignored in a single playthrough without any engagement. | Silent |
| You missed things. On purpose or not. | |||
| The Door Was Right There | Missed the voter registration deadline. The door to the Grama Sevaka Office was open every week. | registrationDeadlineMissed flag set to true when Week 4 passes. | Silent |
| The Road Remains | Reached any ending. The road is still not fixed. | ANY ending reached - bad, neutral, good, or secret. Every playthrough. Every character. Every time without exception. | Silent - this achievement is always there. That is the point. |
| You played well. | |||
| Information Health: 100 | Reached Week 0 with perfect Information Health. You verified everything. You trusted no one blindly. You trusted no one not at all. | informationHealth at exactly 100 at the start of Week 0. | Silent |
| The Unbroken Chain [HIDDEN until unlocked] | Found the secret ending. Aunty Soma's 1983 card. The road is still not fixed. She comes anyway. | Secret ending reached - all gauges above 75, manifesto comparison done, Road File found, all three queue people helped. | Immediate pop-up - this one earns it |
| You Finished an Education Game | Reached any ending. Voluntarily. Most people do not. | First time any ending is reached in the very first playthrough. sessionCount equals 1 and endingReached is not null. | Immediate pop-up |
| Character-specific | |||
| Uncle's Nephew | As Karunasena, dismissed more than 5 of Uncle Sirisena's messages. The family WhatsApp group still has 847 members. He knows. | character equals karunasena AND karunasena_dismissedCount exceeds 5. | Silent |
| She Was Mostly Right | As Kamala, identified and corrected all of her false assumptions in a single playthrough. | character equals kamala AND kamala_assumptionsCorrected reaches maximum value for the playthrough. | Silent |
| Every Step Cost More | As Kumaran, completed every step of the district transfer process. The bilingual form. The officer who mispronounced your name. All of it. | character equals kumaran AND kumaran_transferStepsComplete reaches maximum value. | Silent |
| Three Perspectives | Completed at least one full playthrough with each of the three characters. You have seen Alupotha from every angle it has. | All three characters have reached an ending across any number of sessions. Tracked in localStorage across playthroughs. | Immediate pop-up |
21. The Subtle Clue System
Clues only exist for 3 of the 6 secrets. The other three - the Sergeant's Transfer thread, the 1977 Receipt, and Sandya's Bulletin Board Thread - have no clues at all. Players either find them or they do not.
Clues are delivered as casual NPC dialogue only - not UI tooltips, not tutorial text, not highlight effects. Each clue is a single line delivered once per playthrough. It does not repeat on subsequent visits. The visual treatment is the same dialogue box as all other NPC speech, but in a slightly more muted style, like an afterthought. No special sound. No icon. No signal that this was a clue.
Clue 1 - For The Road File
Delivered by: Mudalali Perera, during any visit to his boutique after Week 4.
Trigger condition: Player has visited the Grama Sevaka Office at least once but has NOT yet found the Road File (foundRoadFile is false).
Dialogue: Said while arranging something behind the counter, not making eye contact with the player:
"You know Nandadasa has been in that office since 1994. Thirty years. You would think a man in the same room for thirty years would run out of things to look at. He never has."
He does not explain this. He moves on. That is the entire clue.
Clue 2 - For the Manifesto Comparison
Delivered by: Sergeant Wickramasinghe, during any visit to the police station after the player has read the current manifesto.
Trigger condition: readCurrentManifesto is true AND player has visited the police station AND foundOldManifesto is false.
Dialogue: Said as a parting comment while turning back to his desk, after finishing his main dialogue:
"That manifesto of his. You read it? I have a copy of the 2010 one somewhere in my files. I was going to compare them once. Never got around to it. Probably not worth the time."
He says this while walking away. The player cannot ask a follow-up question. That is the entire clue.
Clue 3 - For Skeptics Cafe
Delivered by: Nandadasa Mahaththaya, at the end of any conversation after the player has verified at least one message at the Elections Commission board but has not yet unlocked the Cafe.
Trigger condition: verifiedAtBoardCount is 1 or 2 (not 0, not 3 or more) AND skepticsCafeUnlocked is false.
Dialogue: Completely deadpan, while stamping a form, without looking up:
"You have been to the notice board more than most people. There are others who go there regularly. I do not know them personally. I was invited to their group once. I did not reply."
He does not look up. He does not explain. That is the entire clue.
Implementation Note for Developers
Each clue fires exactly once per playthrough and is tracked by a boolean flag in gameState:
flags: {
clue_roadFile_delivered: false,
clue_manifesto_delivered: false,
clue_cafe_delivered: false
}
Once a clue flag is true, that NPC's parting line reverts to standard dialogue on all subsequent visits. The clue is never repeated within the same playthrough.
Scope Definition, MVP vs Post-Launch
What is built in v1.0. What is documented but deferred. What the codebase must support without activation.
22.1 MVP Scope, v1.0, Web Only
Every item listed here is built, tested, and delivered at launch. Nothing in this list is optional.
- All 13 locations, Karunasena fully playable (Kamala/Kumaran locked), all 3 gauges with full delta system.
- Full consequence system with all 12 documented cross-zone chains.
- All 4 endings including the secret ending.
- All 6 secret content pieces: Road File, 1977 Receipt, Manifesto Comparison, Sergeant's Transfer, Bulletin Board Thread, Skeptics Cafe.
- Full misinformation mechanic with all 6 Uncle Sirisena messages and all 4 response options.
- 3 subtle clue dialogues as specified in the Clue System.
- All 28 achievements with correct trigger conditions and notification types.
- Component B facilitator tool with real-time session management, WebSocket communication, and CSV export.
- Trilingual support: English, Sinhala, Tamil - all UI, all dialogue, all system text.
- Standard difficulty mode only.
- Web browser delivery only - no Android application in v1.0.
- Analytics dashboard with all 13 events from Section 16 tracked and accessible.
- WCAG accessibility compliance as specified in Section 17.
- Unencrypted source code delivered via GitHub repository.
22.2 Post-Launch - v1.x and v2.0
Every item listed here is architecturally supported by the v1.0 codebase but not activated. Documentation is complete. Implementation is deferred.
- Android application packaging - Component A wrapped as APK. Compatible with Android 12 and above. Offline-capable core gameplay. Requires no code changes to game logic.
- Hard mode - misinformation more plausible, missed deadlines lock ending paths, gauge progress bars hidden.
- Expert mode - permanent credibility loss for single mistakes, some locations become inaccessible, gauges fully hidden.
- Speedrun mode - 6 weeks compressed to 2, leaderboard integration required, backend changes needed for persistent high scores.
- Additional misinformation scenarios - election violence reporting module, deepfake video content module.
- Expanded Kumaran content - Northern Province electoral context, full bilingual form navigation module, additional Tamil-language dialogue threads.
- Facilitator account system for Component B - persistent session history, multiple facilitator profiles, session comparison across workshops.
- External achievement platform integration - Steam, if the game is eventually published commercially. Current in-game system is designed to be compatible with Steam achievement API calls with minimal changes.
22.3 Delivery Checklist
All items must be confirmed complete before handover to LIRNEasia.
| Deliverable | Format | Notes |
|---|---|---|
| Component A - Web application | Deployed URL + GitHub repository | Tested on Chrome, Firefox, Safari, Edge, mobile browsers |
| Component B - Facilitator tool | Deployed URL + same GitHub repository | Tested with minimum 10 simultaneous participants |
| Source code | GitHub repository - unencrypted, public or client-access private | README with setup instructions. No dependency on proprietary tools. |
| Content JSON files | Three files: content.en.json, content.si.json, content.ta.json | All trilingual content finalised and native-speaker reviewed |
| Analytics dashboard | Live URL accessible to LIRNEasia staff | All 13 event types tracked and displaying aggregate data |
| GDD v2.0 | This document - HTML + Word export | Final authority on all design decisions |
| Deployment documentation | Markdown file in repository | How to host, how to run a Component B session, how to add new scenarios |
Visual Progress & Process Gallery
Investigation boards, raw assets, and work-in-progress snapshots.
Investigation & Process Work
Development Status & Patch Notes
Current Phase: Early Alpha · Web Only Build
23. Version History
| Version | Focus | Key Changes & Developer Notes |
|---|---|---|
| v2.0.3 | Architecture & Audio | Modularised JS engine into dedicated files (engine.js, state.js, ui.js, config.js). CSS split into component sheets (variables.css, base.css, dialogue.css, map.css). Map data externalised to map-data.json. Full audio layer integrated: BGM tracks for gameplay and credits, ambient audio for the Grama Sevaka Office, and SFX suite (click, hover, pause, slider tick, loading start). |
| v2.0.2 | Alpha Core Loop | Integrated custom Visual Novel UI, WhatsApp media cards, and the strict 6-week countdown state machine. Karunasena's path made fully playable. Achievements system built and persistent via localStorage. Map expanded to 13 locations. |
| v2.0.1 | UI Standardization | System-wide pass to eliminate modern glassmorphism. Enforced the strict "2006 card" design aesthetic for all panels, buttons, and dialogue boxes to properly ground the visual identity. |
| v2.0.0 | The Web Pivot | Project officially renamed from "Play. Learn. Vote." to "Road Remains." Godot engine dependency entirely scrapped in favor of a lightweight, accessible Vanilla JS and HTML5 DOM engine. |
| v1.5.3 | Critical Exploit Fix | Fixed a major logic loop glitch where the player could infinitely farm/increase their score by repeatedly interacting with the same single notice on the Elections Commission notice board. Hard-capped verification gains to once per week/notice. |
| v1.2.0 | Systems & Scenarios | First major pass at scene JSONs and dialogue logic trees. Implemented the base misinformation mechanics and the core gauges. |
| v1.0.0 | Pre-Production | Initial "Play. Learn. Vote." concept pitched, focusing on information integrity. Core game design documents drafted with early UI asset generation. |
24. Where We Are At
We are still in the early stages of development. The core infrastructure is established, but significant content pipelines remain open. Based on standard indie dev cycles, we are pivoting towards finalizing narrative branches before expanding platform support.
Current Limitations
- Web Only: The game currently only runs in web browsers. Native Android/APK builds are deferred.
- English Only (MVP): While the trilingual UI framework is active, Sinhala and Tamil dialogue content is still being translated. Those languages are currently locked.
- Locked Characters: Kamala and Kumaran narrative paths exist in the GDD but are gated in the live build.
Development Roadmap
- Phase 1: Complete Karunasena logic and bug-fix core DOM engine (Current).
- Phase 2: Integrate Sinhala/Tamil localization for Karunasena's path.
- Phase 3: Unlock Kamala's narrative and specific assumption mechanics.
- Phase 4: Audio integration, final UI polish, and server-side Component B scaling.
25. Contributions & Co-Creation
An Independent, Purpose-Driven Project
This game is a completely independent, unfunded initiative. The project has been in active development since April 28th, 2026, with over 400+ hours invested into the engine, design, and narrative logic.
I am building this because you rarely see games tackling civic realism and systemic literacy in Sri Lanka. My ultimate goal is to help shape more informed citizens, inspire local game developers, and prove that interactive media can be a powerful educational tool. Currently, there is no financial backing or studio budget—if I had the funds, everyone would be paid for their craft. Until then, I am looking for passionate collaborators who share this vision to help cross the finish line.
Join the Project (Time & Skills)
We are looking for dedicated contributors to help bring this world to life. Here is exactly what the tasks look like at this stage:
- Localization: Translating JSON dialogue files while maintaining character voices.
- Playtesting: Purposefully breaking consequence chains and testing browser compatibility.
- 2D Art: Illustrating top-down isometric assets based on the Visual Style Bible.
Want to co-create?
Become a ContributorBack the Project (Funding)
If you don't have the time to contribute skills but believe in this mission, financial support is the most direct way to help. 100% of all funds will be used to transform this from a passion project into a fully resourced production.
Donations go directly toward:
- Compensating Talent: Paying translators, actors, and artists for their craft.
- Infrastructure: Server hosting and backend architecture.
- Outreach: Educational workshops once the game launches.
Support Financially
Make a DonationProject Credits
The team behind the Alupotha precinct.