Ship the 0.8.0 first-hour and campaign milestone
Add the campaign shell, pause-safe checkpoint resume, post-shift campaign continue, confirmed campaign reset, difficulty presets, searchable Help, content-matrix validation, recovery events, contextual dialogue, policy/debrief context and eligible-event previews. Extend persistence with atomic separate files and add campaign/checkpoint/tutorial smokes. Headless 247/247, Python 94/94, tutorial/campaign/session/scenario smokes green.
This commit is contained in:
1 parent
86332cd401
commit
aa51ee331e
38 files changed
+1361
-1144
No files matched your search
@@ -61,10 +61,27 @@ const Rules := preload("res://src/core/rules.gd")
|
||||
## Dialogue lines this NPC uses. Falls back to generic lines when empty.
|
||||
@export var dialogue_lines: Array[String] = []
|
||||
|
||||
## Context-specific dialogue: keys such as "reason", "refusal", "deescalation",
|
||||
## "recognition" and "group". Missing contexts fall back to `dialogue_lines`.
|
||||
@export var context_lines: Dictionary = {}
|
||||
|
||||
## Items the NPC is carrying, used by the handheld wand (The Joke Shop).
|
||||
## Values are item names: "keys", "belt", "phone", "weapon", "knife", etc.
|
||||
@export var carried_items: Array[String] = []
|
||||
|
||||
func line_for(context: String, rng: RandomNumberGenerator = null) -> String:
|
||||
var pool: Array = []
|
||||
if context_lines.has(context):
|
||||
pool = context_lines[context]
|
||||
elif context == "reason":
|
||||
pool = dialogue_lines
|
||||
if pool.is_empty():
|
||||
return ""
|
||||
var index := 0
|
||||
if rng != null:
|
||||
index = rng.randi_range(0, pool.size() - 1)
|
||||
return str(pool[index])
|
||||
|
||||
func pickup_reactions_per_level(level: int) -> Dictionary:
|
||||
if reactions_by_level.has(level):
|
||||
return reactions_by_level[level]
|
||||
|
||||
Reference in new issue
Block a user