-
Notifications
You must be signed in to change notification settings - Fork 0
feat: add Ida Faber NPC variants #207
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -170,7 +170,8 @@ var dosAiDecisionDailyRequestLimitDefault = 1000; | |
| var dosAiDecisionDailyTokenBudgetDefault = 250000; | ||
| var dosAiDirectChatDailyRequestLimitDefault = 1000; | ||
| var dosAiDirectChatDailyTokenBudgetDefault = 250000; | ||
| var prototypeVisualVariantMax = 17; | ||
| var prototypeVisualVariantMax = 20; | ||
| var initialInhabitationFramePoolSize = 10; | ||
| var bodyArchetypePool = [ | ||
| { | ||
| archetype_id: "synthetic-sentinel", | ||
|
|
@@ -369,7 +370,10 @@ var permanentNpcFramePool = [ | |
| { npc_id: "npc-wasteland-courier-0733", display_name: "Route Courier 0733", archetype_id: "wasteland-courier", role: "Scout and courier body", visual_variant: 14, visual_prefab_key: "generated_visual_14_female_fighter", equipment_visual_id: 2 }, | ||
| { npc_id: "npc-clinic-operator-0819", display_name: "Clinic Operator 0819", archetype_id: "clinic-operator", role: "Support and researcher body", visual_variant: 17, visual_prefab_key: "generated_visual_17_crafter", equipment_visual_id: 1 }, | ||
| { npc_id: "npc-scrap-warden-0940", display_name: "Scrap Warden 0940", archetype_id: "scrap-warden", role: "Heavy salvage body", visual_variant: 15, visual_prefab_key: "generated_visual_15_heavy_fighter", equipment_visual_id: 9 }, | ||
| { npc_id: "npc-crossline-hunter-1058", display_name: "Crossline Surveyor 1058", archetype_id: "crossline-hunter", role: "Ranged survey body", visual_variant: 6, visual_prefab_key: "generated_visual_06_archer", equipment_visual_id: 6 } | ||
| { npc_id: "npc-crossline-hunter-1058", display_name: "Crossline Surveyor 1058", archetype_id: "crossline-hunter", role: "Ranged survey body", visual_variant: 6, visual_prefab_key: "generated_visual_06_archer", equipment_visual_id: 6 }, | ||
| { npc_id: "npc-neon-runner-1172", display_name: "Neon Runner 1172", archetype_id: "wasteland-courier", role: "Neon courier body", visual_variant: 18, visual_prefab_key: "generated_visual_18_idafaber_gamergirl", equipment_visual_id: 1 }, | ||
| { npc_id: "npc-vex-operative-2286", display_name: "Vex Operative 2286", archetype_id: "crossline-hunter", role: "Signal infiltrator body", visual_variant: 19, visual_prefab_key: "generated_visual_19_idafaber_vex", equipment_visual_id: 1 }, | ||
| { npc_id: "npc-redline-envoy-3398", display_name: "Redline Envoy 3398", archetype_id: "clinic-operator", role: "Redline liaison body", visual_variant: 20, visual_prefab_key: "generated_visual_20_idafaber_lucia", equipment_visual_id: 8 } | ||
|
Comment on lines
+374
to
+376
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
These three permanent NPC seeds assign visual variants 18-20, but this commit does not add distributable generated prefabs for those variants (the new source asset folders are also gitignored), so a clean checkout without the paid local packs will spawn these NPCs with missing visuals and fall back to placeholder rendering. Because these NPCs are in the shared Useful? React with 👍 / 👎. |
||
| ]; | ||
|
|
||
| var permanentNpcProfileOverrides: any = { | ||
|
|
@@ -452,6 +456,30 @@ var permanentNpcProfileOverrides: any = { | |
| soul: { name: "Scope-1058 Map", core_drive: "turn every threat sighting into a map someone can survive", temperament: "quiet, methodical, and unforgiving about sloppy reports", combat_style: "fire from clean lanes, avoid tunnel fights, and mark targets for allies", social_style: "questions first, trust later", long_term_goals: ["complete the north danger map", "prove the repeating signal is moving"], player_notes: "Permanent NPC seed for ranged mapping behavior." }, | ||
| story: { origin: "A survey body tuned to track moving threat clusters around the hub.", role: "Range cartographer", conflict: "Believes one mapped danger zone is alive.", rumor: "1058's map changes when no one is watching." }, | ||
| memory: [{ id: "memory-north-post", kind: "system", summary: "1058 remembers drawing the same threat path five times as if the ruins were walking.", importance: 7 }] | ||
| }, | ||
| "npc-neon-runner-1172": { | ||
| identity: { public_name: "Neon Runner 1172", callsign: "NEON-1172", public_role: "Relay crowd runner", faction_title: "Free Courier Line", profession: "social route scout", gender_identity: "female", pronouns: "she/her", age_years: 24, age_band: "young adult", home_base: "Neon Market Stairs", reputation_summary: "Looks like a carefree market runner, but remembers every gate debt and every fake smile." }, | ||
| stats: { level: 3, strength: 7, dexterity: 13, endurance: 8, perception: 11, focus: 8, presence: 9, intelligence: 8, luck: 7, max_health: 88, max_energy: 72, attack_power: 9, defense_power: 4 }, | ||
| characteristics: { curiosity: 9, courage: 6, empathy: 7, discipline: 5, aggression: 3, sociability: 10 }, | ||
| soul: { name: "Neon-1172 Pulse", core_drive: "turn social noise into safe routes before the crowd panics", temperament: "bright, evasive, and sharper than she lets on", combat_style: "avoid duels, keep moving, and use speed to escape bad trades", social_style: "friendly, teasing, and quick to redirect danger", long_term_goals: ["build a trusted route board", "find who is selling forged second tags"], player_notes: "Ida Faber GamerGirl visual seed for social courier behavior." }, | ||
| story: { origin: "A stylish market Frame rebuilt from a performance shell and courier reflex firmware.", role: "Relay crowd runner", conflict: "Uses charm to hide that her route map is full of missing people.", rumor: "1172 can tell when a second tag is fake by watching the buyer's hands." }, | ||
| memory: [{ id: "memory-neon-stairs", kind: "system", summary: "1172 remembers laughing through a blackout so a scared crowd would not stampede.", importance: 7 }] | ||
| }, | ||
| "npc-vex-operative-2286": { | ||
| identity: { public_name: "Vex Operative 2286", callsign: "VEX-2286", public_role: "Signal infiltrator", faction_title: "Crossline Survey", profession: "counter-signal scout", gender_identity: "female", pronouns: "she/her", age_years: 29, age_band: "young adult", home_base: "North Signal Post", reputation_summary: "Beautiful enough to be underestimated and disciplined enough to make that mistake expensive." }, | ||
| stats: { level: 4, strength: 8, dexterity: 12, endurance: 9, perception: 12, focus: 10, presence: 8, intelligence: 10, luck: 6, max_health: 96, max_energy: 70, attack_power: 11, defense_power: 5 }, | ||
| characteristics: { curiosity: 8, courage: 7, empathy: 4, discipline: 9, aggression: 5, sociability: 6 }, | ||
| soul: { name: "Vex-2286 Quiet", core_drive: "trace false signals before they lure living bodies out of the ward", temperament: "cool, observant, and difficult to impress", combat_style: "stay unarmed until close, then break contact before a clean counterattack", social_style: "low voice, exact questions, and no wasted confession", long_term_goals: ["identify the false north signal", "erase her old handler's route keys"], player_notes: "IdaFaber Vex visual seed for infiltration behavior." }, | ||
| story: { origin: "A sleek counter-signal body once used to walk through hostile markets without drawing weapons.", role: "Signal infiltrator", conflict: "Her old access keys still open doors that should have been sealed.", rumor: "2286 once carried a whole route cipher in a song no one remembers hearing." }, | ||
| memory: [{ id: "memory-vex-signal", kind: "system", summary: "2286 remembers standing under dead speakers while a fake rescue signal repeated her own voice.", importance: 8 }] | ||
| }, | ||
| "npc-redline-envoy-3398": { | ||
| identity: { public_name: "Redline Envoy 3398", callsign: "RED-3398", public_role: "Forbidden clinic liaison", faction_title: "Vinh Hai AMB Clinic", profession: "continuity negotiator", gender_identity: "female", pronouns: "she/her", age_years: 34, age_band: "adult", home_base: "Redline Ward", reputation_summary: "Too polished for the yard, too useful for the clinic to exile, and too careful to explain where she came from." }, | ||
| stats: { level: 4, strength: 7, dexterity: 8, endurance: 9, perception: 10, focus: 13, presence: 11, intelligence: 12, luck: 5, max_health: 98, max_energy: 88, attack_power: 8, defense_power: 5 }, | ||
| characteristics: { curiosity: 8, courage: 6, empathy: 8, discipline: 8, aggression: 2, sociability: 9 }, | ||
| soul: { name: "Red-3398 Velvet", core_drive: "negotiate body transfers without letting desperate people tear the clinic apart", temperament: "graceful, guarded, and quietly ruthless about triage", combat_style: "avoid combat, use distance, and protect the person with the least time left", social_style: "warm enough to calm panic, precise enough to end bargaining", long_term_goals: ["prove the Redline Ward did not lose its patients", "find a legal path for emergency reinhabitation"], player_notes: "Ida Faber Lucia visual seed for clinic liaison behavior." }, | ||
| story: { origin: "A high-fidelity liaison Frame from a sealed clinic wing, repurposed for public negotiation after the ward collapsed.", role: "Forbidden clinic liaison", conflict: "Knows more about body transfer than normal citizens should know.", rumor: "3398 can calm a dying body with one sentence, but never says who taught her." }, | ||
| memory: [{ id: "memory-redline-ward", kind: "system", summary: "3398 remembers a Redline Ward door closing while three families argued over one remaining body slot.", importance: 8 }] | ||
| } | ||
| }; | ||
|
|
||
|
|
@@ -5671,7 +5699,7 @@ function defaultAgentContext(playerId: string): any { | |
|
|
||
| function defaultBodyProfile(playerId: string, displayName: string, timestamp: string, seedSuffix?: string): any { | ||
| var assignmentSeed = playerId + ":" + (seedSuffix || "initial"); | ||
| var sourceFrame = selectPermanentNpcFrame(assignmentSeed); | ||
| var sourceFrame = selectInitialPermanentNpcFrame(assignmentSeed); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Useful? React with 👍 / 👎. |
||
| var archetype = sourceFrame | ||
| ? selectBodyArchetype(sourceFrame.archetype_id) | ||
| : selectBodyArchetype(assignmentSeed); | ||
|
|
@@ -5744,7 +5772,7 @@ function ensureAgentContext(context: any, playerId: string): any { | |
| ensureSecondBalance(context); | ||
| context.body = context.body || {}; | ||
| context.body.body_id = trimString(context.body.body_id) || "body-" + context.player.player_id; | ||
| var sourceFrame = selectPermanentNpcFrame(context.player.player_id + ":initial"); | ||
| var sourceFrame = selectInitialPermanentNpcFrame(context.player.player_id + ":initial"); | ||
| var archetype = selectBodyArchetype(context.body.archetype_id || | ||
| (sourceFrame && sourceFrame.archetype_id) || | ||
| context.player.player_id + ":initial"); | ||
|
|
@@ -5931,6 +5959,15 @@ function selectPermanentNpcFrame(seed: string): any { | |
| return permanentNpcFramePool[stableHashIndex(seed || "default-frame", permanentNpcFramePool.length)]; | ||
| } | ||
|
|
||
| function selectInitialPermanentNpcFrame(seed: string): any { | ||
| if (!permanentNpcFramePool || permanentNpcFramePool.length === 0) { | ||
| return null; | ||
| } | ||
|
|
||
| var poolSize = Math.min(initialInhabitationFramePoolSize, permanentNpcFramePool.length); | ||
| return permanentNpcFramePool[stableHashIndex(seed || "default-frame", poolSize)]; | ||
| } | ||
|
|
||
| function findPermanentNpcFrame(npcId: string): any { | ||
| var normalized = normalizeActorId(npcId); | ||
| for (var i = 0; i < permanentNpcFramePool.length; i += 1) { | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Switching
com.gamebooom.unity.mcpfrom a commit SHA to the mutable#v0.3.8tag makes dependency resolution non-deterministic when lockfiles are regenerated or absent, because retagging can change the resolved code without any manifest diff. This is a regression from the previous immutable pin and can cause hard-to-reproduce editor/tooling behavior across contributors and CI.Useful? React with 👍 / 👎.