Fallout: Cascadia
Role: Narrative Designer | Tools: Creation Kit, Papyrus, GitHub, Notion

Overview
Fallout: Cascadia is a standalone total conversion mod for Fallout 4, set in a post-apocalyptic Seattle. As a narrative and quest designer, I helped craft original faction questlines, branching dialogue, and world-reactive storytelling that embraces Fallout’s signature moral ambiguity.
My Responsibilities
- Designed and implemented multi-path, open world quests across multiple factions.
- Wrote branching dialogue using Papyrus scripting and the Creation Kit.
- Scripted reactive conversations with emotional arcs and faction-specific variations.
- Built narrative worldbuilding through in-game terminals, holotapes, and set dressing.
- Collaborated with Level Design, Scripting, and QA to implement story beats across zones.
- Playtested and iterated on content based on feedback loops and vertical slice reviews.
Quest Design Philosophy
I center quests around political conflict, faction power shifts, and moral complexity. Here's a sample from my original side quest, "A Bad Hand":
Quest Premise: Johnny Bradshaw, a failed politician indebted to the Orcas crime syndicate, becomes a pawn in a deadly political game. The player must decide whether to protect, manipulate, or eliminate him.
Branching Outcomes: Align with the Hearts and fake Johnny’s death; obey the Clubs and publicly execute him; or negotiate a perfect compromise under Granddaddy’s watch. Each path alters faction reputation, city stability, and access to unique perks.
Dialogue Design & Structure
My dialogue design emphasizes reactivity, layered choices, and skill-check driven paths. Here's a smart example from "A Bad Hand"—a confrontation with Johnny Bradshaw that rewards high Perception:
Player [Perception 8+]: "Your cufflinks. Pretty high-end stuff—seems a bit lavish for a broke man."
Johnny (Surprised, defeated):
"You've got sharp eyes. They're from Alicia Wu—a gift. Meant as proof that Security wouldn't dare touch me... but she's probably set me up from the start. Damned Hearts, always two-faced."
Papyrus Scripting & Creation Kit Integration
This encounter script from "A Bad Hand" drives a pivotal branching moment involving Johnny Bradshaw. I implemented it directly in the Fallout 4 Creation Kit using a combination of trigger volumes, dialogue conditions, and scripted quest logic.
What this script controls:
- Skill-based branching dialogue: The script checks player stats (e.g. Perception, Intimidation) and routes to different outcomes in real-time.
- Dynamic quest stage control: Dialogue choices update quest objectives, modify global variables, and shift faction reputations.
- World state manipulation: Fake death sequences are staged using XMarker references, disabled/enabled actors, and custom sounds.
- Creation Kit Integration: Properties like
JohnnyBradshaw
,ABH_Quest
, andGunshotFX
were manually linked in the CK interface by selecting scene objects and populating the script’s properties. - Debug trace logging: Integrated trace calls help QA verify branching logic and trigger sequences during testing builds.
Expand to view script inline
// ABH_JohnnyEncounterScript.psc – Fallout Cascadia
ScriptName ABH_JohnnyEncounterScript extends ObjectReference
;======= PROPERTIES =======
Quest Property ABH_Quest Auto
Actor Property JohnnyBradshaw Auto
Faction Property HeartsFaction Auto
Faction Property OrcasFaction Auto
ObjectReference Property JohnnyCorpseMarker Auto
ObjectReference Property JohnnyFakeCorpse Auto
GlobalVariable Property PlayerReputation_Hearts Auto
GlobalVariable Property PlayerReputation_Orcas Auto
Message Property PerceptionOptionMessage Auto
Message Property IntimidateOptionMessage Auto
Message Property BluffOptionMessage Auto
Sound Property GunshotFX Auto
;======= STATES =======
Bool Property HasFakeKilledJohnny = False Auto
Bool Property HasRevealedOrcasPlan = False Auto
;======= MAIN TRIGGER =======
Event OnActivate(ObjectReference akActionRef)
If akActionRef == Game.GetPlayer()
If Game.GetPlayer().GetAV("Perception") >= 8
PerceptionOptionMessage.Show()
HandlePerceptionBranch()
ElseIf Game.GetPlayer().GetAV("Intimidation") >= 60
IntimidateOptionMessage.Show()
HandleIntimidationBranch()
Else
BluffOptionMessage.Show()
HandleBluffBranch()
EndIf
EndIf
EndEvent
;======= BRANCH FUNCTIONS =======
Function HandlePerceptionBranch()
Debug.Trace("[ABH] Player used Perception to uncover Johnny's allegiance.")
ABH_Quest.SetObjectiveCompleted(10)
ABH_Quest.SetStage(20)
PlayerReputation_Hearts.Mod(5)
EndFunction
Function HandleIntimidationBranch()
Debug.Trace("[ABH] Player used Intimidation to force Johnny's cooperation.")
ABH_Quest.SetObjectiveCompleted(10)
ABH_Quest.SetStage(30)
JohnnyBradshaw.EvaluatePackage()
PlayerReputation_Orcas.Mod(-3)
EndFunction
Function HandleBluffBranch()
Debug.Trace("[ABH] Player failed all checks, triggering default conflict.")
ABH_Quest.SetObjectiveCompleted(10)
ABH_Quest.SetStage(40)
JohnnyBradshaw.StartCombat(Game.GetPlayer())
PlayerReputation_Hearts.Mod(-2)
EndFunction
Function TriggerFakeDeath()
If HasFakeKilledJohnny
Return
EndIf
Debug.Trace("[ABH] Triggering fake death sequence for Johnny.")
JohnnyBradshaw.Disable()
GunshotFX.Play(Game.GetPlayer())
Utility.Wait(1.0)
JohnnyFakeCorpse.MoveTo(JohnnyCorpseMarker)
JohnnyFakeCorpse.Enable()
ABH_Quest.SetStage(50)
HasFakeKilledJohnny = True
EndFunction
Function RevealOrcasPlanToHearts()
If HasRevealedOrcasPlan
Return
EndIf
Debug.Trace("[ABH] Player revealed Orcas plot to Hearts.")
ABH_Quest.SetStage(60)
PlayerReputation_Hearts.Mod(10)
HasRevealedOrcasPlan = True
EndFunction
Function ResetEncounterState()
HasFakeKilledJohnny = False
HasRevealedOrcasPlan = False
JohnnyBradshaw.Enable()
JohnnyFakeCorpse.Disable()
ABH_Quest.SetStage(10)
EndFunction
Samples
You can view more selected quest samples and dialogue trees in my Writing Samples folder.