"매 Papers Please는 매 bureaucratic friction 의 매 procedural rhetoric 으로 매 totalitarianism 의 매 critique". 매 Lucas Pope 2013 의 매 indie classic — 매 document-validation gameplay 가 매 매 player 의 매 매 moral compromise 의 매 force, 매 mechanics-as-message 의 매 canonical example.
매 핵심
매 Core Loop
Inspect document: 매 passport / work permit / ID supplement 의 매 cross-check.
Detect discrepancy: 매 expired date, 매 wrong gender, 매 photo mismatch, 매 missing seal.
Approve/Deny stamp: 매 매 decision (red/green stamp).
Manage family: 매 매 daily wage 의 매 food/heat/medicine 의 매 spend.
매 Procedural Rhetoric
매 매 rules 의 매 daily expansion → 매 매 cognitive load 의 매 bureaucratic violence 의 매 simulate.
매 매 family suffering 의 매 매 moral compromise (rule-bend, bribe accept) 의 매 force.
매 매 매 player 의 매 매 complicity 의 매 자각.
매 응용
Beholder (Warm Lamp Games) — 매 surveillance landlord variant.
The Westport Independent — 매 newspaper censorship.
Not Tonight, Headliner — 매 bureaucratic-puzzle descendants.
# Game day -> active rulesRULES_BY_DAY={1:['passport_required'],2:['passport_required','photo_match'],3:['passport_required','photo_match','work_permit_for_workers'],4:['passport_required','photo_match','work_permit_for_workers','no_kolechia'],# ...escalating bureaucratic burden}defactive_rules(day:int)->list[str]:keys=sorted(kforkinRULES_BY_DAY.keys()ifk<=day)returnRULES_BY_DAY[keys[-1]]
Cross-document comparison
// Check passport name vs work-permit name
functioncrossCheckNames(passport: Document,permit: Document):Discrepancy|null{constp=passport.fields.name;constw=permit.fields.name;if(p!==w)return{field:'name',documents:['passport','work_permit'],description:`Mismatch: passport=${p}, permit=${w}`};returnnull;}
Family resource management
# Daily wage allocation — must balance survivalclassFamilyState:members:list[str]# son, wife, mother, uncle, nieceneeds:dict[str,dict[str,int]]# member -> {food, heat, meds}defcost_to_keep_alive(self,day_temperature:float)->int:cost=0forminself.members:cost+=FOOD_COST# alwaysifday_temperature<0:cost+=HEAT_COSTifself.needs[m]['meds']>0:cost+=MEDS_COSTreturncost# Player wage: starts ~$5/day, cost ~$8/day with full family — forced to choose
Moral-compromise branching (M. Vonel storyline)
// EZIC resistance asks player to wave through agents
typeMoralChoice=|{type:'approve_invalid';bribe?: number}|{type:'deny_valid';reason: string}|{type:'follow_rules'};interfaceStoryline{endings:{id: string;conditions:(state: GameState)=>boolean}[];}constENDINGS: Storyline['endings']=[{id:'ezic_revolution',conditions: s=>s.ezicHelpCount>=5&&!s.familyDead},{id:'arstotzka_loyal',conditions: s=>s.citationCount===0&&!s.bribeAccepted},{id:'family_dies',conditions: s=>s.familyDead},{id:'arrested',conditions: s=>s.ezicTraitor&&s.exposed},// 20 endings total — branching procedural narrative
];
Citation/penalty system
// Each error = warning; 3+ warnings = pay cut
classWorkLog{warnings:{day: number;rule: string}[]=[];finalizeDay(day: number,wageBefore: number):number{consttodays=this.warnings.filter(w=>w.day===day).length;if(todays===0)returnwageBefore;if(todays===1)returnwageBefore;// free pass
returnMath.max(0,wageBefore-(todays-1)*5);// -$5 per extra
}}
매 결정 기준
상황
Approach
Mechanics-as-message narrative
매 Papers Please 의 매 procedural-rhetoric 의 매 reference
Bureaucratic puzzle design
매 daily-expanding rule set + 매 cross-document comparison
Moral-choice branching
매 endings array + 매 condition predicates (vs hard scripts)
Family/survival pressure
매 daily wage + 매 cost > 매 wage 의 매 forced compromise
기본값: 매 document-validation engine + 매 daily-rule expansion + 매 family-resource constraint + 매 multi-ending branching — 매 Papers Please canonical pattern.
언제: 매 narrative game 의 procedural rhetoric design, 매 bureaucratic puzzle mechanic, 매 moral-choice branching.
언제 X: 매 reflex-action game (매 paperwork mechanic 의 매 mismatch).
❌ 안티패턴
Linear-only narrative: 매 매 multi-ending 없으면 매 매 procedural-rhetoric 의 매 power 의 매 dilute.
No survival pressure: 매 매 family/wage system 없으면 매 매 moral compromise 의 매 매 toothless.
Static rule set: 매 매 daily expansion 없으면 매 매 bureaucratic-load metaphor 의 매 lose.
🧪 검증 / 중복
Verified (Lucas Pope dev blog, Papers Please postmortem GDC 2014, Ian Bogost "Procedural Rhetoric" framework).