@its-not-rocket-science/ananke 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/CHANGELOG.md +135 -0
  2. package/LICENSE +21 -0
  3. package/README.md +2199 -0
  4. package/STABLE_API.md +266 -0
  5. package/dist/src/anatomy/anatomy-compiler.d.ts +14 -0
  6. package/dist/src/anatomy/anatomy-compiler.js +277 -0
  7. package/dist/src/anatomy/anatomy-contracts.d.ts +94 -0
  8. package/dist/src/anatomy/anatomy-contracts.js +1 -0
  9. package/dist/src/anatomy/anatomy-helpers.d.ts +82 -0
  10. package/dist/src/anatomy/anatomy-helpers.js +233 -0
  11. package/dist/src/anatomy/anatomy-schema.d.ts +28 -0
  12. package/dist/src/anatomy/anatomy-schema.js +388 -0
  13. package/dist/src/anatomy/index.d.ts +4 -0
  14. package/dist/src/anatomy/index.js +4 -0
  15. package/dist/src/archetypes.d.ts +87 -0
  16. package/dist/src/archetypes.js +285 -0
  17. package/dist/src/arena.d.ts +173 -0
  18. package/dist/src/arena.js +695 -0
  19. package/dist/src/bridge/bridge-engine.d.ts +46 -0
  20. package/dist/src/bridge/bridge-engine.js +252 -0
  21. package/dist/src/bridge/index.d.ts +4 -0
  22. package/dist/src/bridge/index.js +5 -0
  23. package/dist/src/bridge/interpolation.d.ts +64 -0
  24. package/dist/src/bridge/interpolation.js +130 -0
  25. package/dist/src/bridge/mapping.d.ts +33 -0
  26. package/dist/src/bridge/mapping.js +54 -0
  27. package/dist/src/bridge/types.d.ts +94 -0
  28. package/dist/src/bridge/types.js +2 -0
  29. package/dist/src/campaign.d.ts +141 -0
  30. package/dist/src/campaign.js +235 -0
  31. package/dist/src/channels.d.ts +15 -0
  32. package/dist/src/channels.js +20 -0
  33. package/dist/src/chronicle.d.ts +124 -0
  34. package/dist/src/chronicle.js +232 -0
  35. package/dist/src/collective-activities.d.ts +154 -0
  36. package/dist/src/collective-activities.js +247 -0
  37. package/dist/src/competence/acoustic.d.ts +101 -0
  38. package/dist/src/competence/acoustic.js +242 -0
  39. package/dist/src/competence/catalogue.d.ts +30 -0
  40. package/dist/src/competence/catalogue.js +241 -0
  41. package/dist/src/competence/crafting.d.ts +35 -0
  42. package/dist/src/competence/crafting.js +88 -0
  43. package/dist/src/competence/engineering.d.ts +53 -0
  44. package/dist/src/competence/engineering.js +108 -0
  45. package/dist/src/competence/framework.d.ts +68 -0
  46. package/dist/src/competence/framework.js +694 -0
  47. package/dist/src/competence/index.d.ts +12 -0
  48. package/dist/src/competence/index.js +13 -0
  49. package/dist/src/competence/interspecies.d.ts +81 -0
  50. package/dist/src/competence/interspecies.js +108 -0
  51. package/dist/src/competence/language.d.ts +79 -0
  52. package/dist/src/competence/language.js +115 -0
  53. package/dist/src/competence/naturalist.d.ts +97 -0
  54. package/dist/src/competence/naturalist.js +187 -0
  55. package/dist/src/competence/navigation.d.ts +24 -0
  56. package/dist/src/competence/navigation.js +48 -0
  57. package/dist/src/competence/performance.d.ts +125 -0
  58. package/dist/src/competence/performance.js +210 -0
  59. package/dist/src/competence/teaching.d.ts +64 -0
  60. package/dist/src/competence/teaching.js +121 -0
  61. package/dist/src/competence/willpower.d.ts +74 -0
  62. package/dist/src/competence/willpower.js +114 -0
  63. package/dist/src/crafting/index.d.ts +55 -0
  64. package/dist/src/crafting/index.js +229 -0
  65. package/dist/src/crafting/manufacturing.d.ts +83 -0
  66. package/dist/src/crafting/manufacturing.js +165 -0
  67. package/dist/src/crafting/materials.d.ts +53 -0
  68. package/dist/src/crafting/materials.js +120 -0
  69. package/dist/src/crafting/recipes.d.ts +75 -0
  70. package/dist/src/crafting/recipes.js +233 -0
  71. package/dist/src/crafting/workshops.d.ts +61 -0
  72. package/dist/src/crafting/workshops.js +170 -0
  73. package/dist/src/debug.d.ts +86 -0
  74. package/dist/src/debug.js +76 -0
  75. package/dist/src/derive.d.ts +21 -0
  76. package/dist/src/derive.js +88 -0
  77. package/dist/src/describe.d.ts +29 -0
  78. package/dist/src/describe.js +276 -0
  79. package/dist/src/dialogue.d.ts +122 -0
  80. package/dist/src/dialogue.js +266 -0
  81. package/dist/src/dist.d.ts +20 -0
  82. package/dist/src/dist.js +39 -0
  83. package/dist/src/downtime.d.ts +89 -0
  84. package/dist/src/downtime.js +391 -0
  85. package/dist/src/economy.d.ts +116 -0
  86. package/dist/src/economy.js +182 -0
  87. package/dist/src/emotional-contagion.d.ts +142 -0
  88. package/dist/src/emotional-contagion.js +274 -0
  89. package/dist/src/equipment.d.ts +206 -0
  90. package/dist/src/equipment.js +598 -0
  91. package/dist/src/faction.d.ts +102 -0
  92. package/dist/src/faction.js +237 -0
  93. package/dist/src/generate.d.ts +35 -0
  94. package/dist/src/generate.js +166 -0
  95. package/dist/src/index.d.ts +42 -0
  96. package/dist/src/index.js +54 -0
  97. package/dist/src/inheritance.d.ts +69 -0
  98. package/dist/src/inheritance.js +136 -0
  99. package/dist/src/inventory.d.ts +194 -0
  100. package/dist/src/inventory.js +637 -0
  101. package/dist/src/item-durability.d.ts +69 -0
  102. package/dist/src/item-durability.js +308 -0
  103. package/dist/src/legend.d.ts +97 -0
  104. package/dist/src/legend.js +269 -0
  105. package/dist/src/lod.d.ts +9 -0
  106. package/dist/src/lod.js +84 -0
  107. package/dist/src/metrics.d.ts +51 -0
  108. package/dist/src/metrics.js +91 -0
  109. package/dist/src/model3d.d.ts +138 -0
  110. package/dist/src/model3d.js +214 -0
  111. package/dist/src/mythology.d.ts +101 -0
  112. package/dist/src/mythology.js +308 -0
  113. package/dist/src/narrative-render.d.ts +42 -0
  114. package/dist/src/narrative-render.js +194 -0
  115. package/dist/src/narrative-stress.d.ts +123 -0
  116. package/dist/src/narrative-stress.js +183 -0
  117. package/dist/src/narrative.d.ts +44 -0
  118. package/dist/src/narrative.js +257 -0
  119. package/dist/src/party.d.ts +70 -0
  120. package/dist/src/party.js +226 -0
  121. package/dist/src/polity.d.ts +262 -0
  122. package/dist/src/polity.js +398 -0
  123. package/dist/src/presets.d.ts +42 -0
  124. package/dist/src/presets.js +170 -0
  125. package/dist/src/progression.d.ts +170 -0
  126. package/dist/src/progression.js +256 -0
  127. package/dist/src/quest-generators.d.ts +76 -0
  128. package/dist/src/quest-generators.js +534 -0
  129. package/dist/src/quest.d.ts +239 -0
  130. package/dist/src/quest.js +520 -0
  131. package/dist/src/relationships-effects.d.ts +75 -0
  132. package/dist/src/relationships-effects.js +219 -0
  133. package/dist/src/relationships.d.ts +104 -0
  134. package/dist/src/relationships.js +347 -0
  135. package/dist/src/replay.d.ts +47 -0
  136. package/dist/src/replay.js +82 -0
  137. package/dist/src/rng.d.ts +9 -0
  138. package/dist/src/rng.js +37 -0
  139. package/dist/src/settlement-services.d.ts +67 -0
  140. package/dist/src/settlement-services.js +267 -0
  141. package/dist/src/settlement.d.ts +143 -0
  142. package/dist/src/settlement.js +419 -0
  143. package/dist/src/sim/action.d.ts +28 -0
  144. package/dist/src/sim/action.js +12 -0
  145. package/dist/src/sim/aging.d.ts +95 -0
  146. package/dist/src/sim/aging.js +243 -0
  147. package/dist/src/sim/ai/decide.d.ts +10 -0
  148. package/dist/src/sim/ai/decide.js +267 -0
  149. package/dist/src/sim/ai/perception.d.ts +12 -0
  150. package/dist/src/sim/ai/perception.js +54 -0
  151. package/dist/src/sim/ai/personality.d.ts +54 -0
  152. package/dist/src/sim/ai/personality.js +202 -0
  153. package/dist/src/sim/ai/presets.d.ts +2 -0
  154. package/dist/src/sim/ai/presets.js +28 -0
  155. package/dist/src/sim/ai/system.d.ts +6 -0
  156. package/dist/src/sim/ai/system.js +13 -0
  157. package/dist/src/sim/ai/targeting.d.ts +8 -0
  158. package/dist/src/sim/ai/targeting.js +42 -0
  159. package/dist/src/sim/ai/types.d.ts +14 -0
  160. package/dist/src/sim/ai/types.js +1 -0
  161. package/dist/src/sim/body.d.ts +9 -0
  162. package/dist/src/sim/body.js +32 -0
  163. package/dist/src/sim/bodyplan.d.ts +161 -0
  164. package/dist/src/sim/bodyplan.js +677 -0
  165. package/dist/src/sim/capability.d.ts +135 -0
  166. package/dist/src/sim/capability.js +8 -0
  167. package/dist/src/sim/combat.d.ts +21 -0
  168. package/dist/src/sim/combat.js +77 -0
  169. package/dist/src/sim/commandBuilders.d.ts +11 -0
  170. package/dist/src/sim/commandBuilders.js +39 -0
  171. package/dist/src/sim/commands.d.ts +71 -0
  172. package/dist/src/sim/commands.js +8 -0
  173. package/dist/src/sim/condition.d.ts +35 -0
  174. package/dist/src/sim/condition.js +21 -0
  175. package/dist/src/sim/cone.d.ts +40 -0
  176. package/dist/src/sim/cone.js +44 -0
  177. package/dist/src/sim/context.d.ts +68 -0
  178. package/dist/src/sim/context.js +1 -0
  179. package/dist/src/sim/density.d.ts +14 -0
  180. package/dist/src/sim/density.js +33 -0
  181. package/dist/src/sim/disease.d.ts +141 -0
  182. package/dist/src/sim/disease.js +353 -0
  183. package/dist/src/sim/entity.d.ts +251 -0
  184. package/dist/src/sim/entity.js +19 -0
  185. package/dist/src/sim/events.d.ts +25 -0
  186. package/dist/src/sim/events.js +5 -0
  187. package/dist/src/sim/explosion.d.ts +40 -0
  188. package/dist/src/sim/explosion.js +40 -0
  189. package/dist/src/sim/formation-unit.d.ts +138 -0
  190. package/dist/src/sim/formation-unit.js +197 -0
  191. package/dist/src/sim/formation.d.ts +12 -0
  192. package/dist/src/sim/formation.js +54 -0
  193. package/dist/src/sim/frontage.d.ts +30 -0
  194. package/dist/src/sim/frontage.js +84 -0
  195. package/dist/src/sim/grapple.d.ts +100 -0
  196. package/dist/src/sim/grapple.js +480 -0
  197. package/dist/src/sim/hazard.d.ts +104 -0
  198. package/dist/src/sim/hazard.js +201 -0
  199. package/dist/src/sim/hydrostatic.d.ts +58 -0
  200. package/dist/src/sim/hydrostatic.js +117 -0
  201. package/dist/src/sim/impairment.d.ts +20 -0
  202. package/dist/src/sim/impairment.js +162 -0
  203. package/dist/src/sim/indexing.d.ts +7 -0
  204. package/dist/src/sim/indexing.js +7 -0
  205. package/dist/src/sim/injury.d.ts +54 -0
  206. package/dist/src/sim/injury.js +66 -0
  207. package/dist/src/sim/intent.d.ts +26 -0
  208. package/dist/src/sim/intent.js +7 -0
  209. package/dist/src/sim/kernel.d.ts +45 -0
  210. package/dist/src/sim/kernel.js +1992 -0
  211. package/dist/src/sim/kinds.d.ts +64 -0
  212. package/dist/src/sim/kinds.js +56 -0
  213. package/dist/src/sim/knockback.d.ts +50 -0
  214. package/dist/src/sim/knockback.js +82 -0
  215. package/dist/src/sim/limb.d.ts +48 -0
  216. package/dist/src/sim/limb.js +78 -0
  217. package/dist/src/sim/medical.d.ts +32 -0
  218. package/dist/src/sim/medical.js +33 -0
  219. package/dist/src/sim/morale.d.ts +69 -0
  220. package/dist/src/sim/morale.js +92 -0
  221. package/dist/src/sim/mount.d.ts +150 -0
  222. package/dist/src/sim/mount.js +225 -0
  223. package/dist/src/sim/nutrition.d.ts +74 -0
  224. package/dist/src/sim/nutrition.js +168 -0
  225. package/dist/src/sim/occlusion.d.ts +8 -0
  226. package/dist/src/sim/occlusion.js +71 -0
  227. package/dist/src/sim/push.d.ts +11 -0
  228. package/dist/src/sim/push.js +79 -0
  229. package/dist/src/sim/ranged.d.ts +44 -0
  230. package/dist/src/sim/ranged.js +69 -0
  231. package/dist/src/sim/seeds.d.ts +3 -0
  232. package/dist/src/sim/seeds.js +16 -0
  233. package/dist/src/sim/sensory-extended.d.ts +103 -0
  234. package/dist/src/sim/sensory-extended.js +181 -0
  235. package/dist/src/sim/sensory.d.ts +38 -0
  236. package/dist/src/sim/sensory.js +109 -0
  237. package/dist/src/sim/skills.d.ts +70 -0
  238. package/dist/src/sim/skills.js +69 -0
  239. package/dist/src/sim/sleep.d.ts +107 -0
  240. package/dist/src/sim/sleep.js +215 -0
  241. package/dist/src/sim/spatial.d.ts +8 -0
  242. package/dist/src/sim/spatial.js +59 -0
  243. package/dist/src/sim/step/capability.d.ts +8 -0
  244. package/dist/src/sim/step/capability.js +77 -0
  245. package/dist/src/sim/step/concentration.d.ts +9 -0
  246. package/dist/src/sim/step/concentration.js +25 -0
  247. package/dist/src/sim/step/effects.d.ts +17 -0
  248. package/dist/src/sim/step/effects.js +96 -0
  249. package/dist/src/sim/step/energy.d.ts +3 -0
  250. package/dist/src/sim/step/energy.js +31 -0
  251. package/dist/src/sim/step/hazards.d.ts +4 -0
  252. package/dist/src/sim/step/hazards.js +19 -0
  253. package/dist/src/sim/step/injury.d.ts +10 -0
  254. package/dist/src/sim/step/injury.js +353 -0
  255. package/dist/src/sim/step/morale.d.ts +11 -0
  256. package/dist/src/sim/step/morale.js +130 -0
  257. package/dist/src/sim/step/movement.d.ts +5 -0
  258. package/dist/src/sim/step/movement.js +172 -0
  259. package/dist/src/sim/step/push.d.ts +11 -0
  260. package/dist/src/sim/step/push.js +79 -0
  261. package/dist/src/sim/step/substances.d.ts +3 -0
  262. package/dist/src/sim/step/substances.js +75 -0
  263. package/dist/src/sim/substance.d.ts +38 -0
  264. package/dist/src/sim/substance.js +57 -0
  265. package/dist/src/sim/systemic-toxicology.d.ts +109 -0
  266. package/dist/src/sim/systemic-toxicology.js +263 -0
  267. package/dist/src/sim/team.d.ts +9 -0
  268. package/dist/src/sim/team.js +37 -0
  269. package/dist/src/sim/tech.d.ts +36 -0
  270. package/dist/src/sim/tech.js +46 -0
  271. package/dist/src/sim/terrain.d.ts +121 -0
  272. package/dist/src/sim/terrain.js +141 -0
  273. package/dist/src/sim/testing.d.ts +13 -0
  274. package/dist/src/sim/testing.js +100 -0
  275. package/dist/src/sim/thermoregulation.d.ts +77 -0
  276. package/dist/src/sim/thermoregulation.js +161 -0
  277. package/dist/src/sim/tick.d.ts +3 -0
  278. package/dist/src/sim/tick.js +3 -0
  279. package/dist/src/sim/toxicology.d.ts +52 -0
  280. package/dist/src/sim/toxicology.js +104 -0
  281. package/dist/src/sim/trace.d.ts +141 -0
  282. package/dist/src/sim/trace.js +1 -0
  283. package/dist/src/sim/tuning.d.ts +16 -0
  284. package/dist/src/sim/tuning.js +42 -0
  285. package/dist/src/sim/vec3.d.ts +14 -0
  286. package/dist/src/sim/vec3.js +31 -0
  287. package/dist/src/sim/weapon_dynamics.d.ts +102 -0
  288. package/dist/src/sim/weapon_dynamics.js +142 -0
  289. package/dist/src/sim/weather.d.ts +95 -0
  290. package/dist/src/sim/weather.js +105 -0
  291. package/dist/src/sim/world.d.ts +52 -0
  292. package/dist/src/sim/world.js +1 -0
  293. package/dist/src/sim/wound-aging.d.ts +120 -0
  294. package/dist/src/sim/wound-aging.js +223 -0
  295. package/dist/src/species.d.ts +106 -0
  296. package/dist/src/species.js +664 -0
  297. package/dist/src/story-arcs.d.ts +17 -0
  298. package/dist/src/story-arcs.js +276 -0
  299. package/dist/src/tech-diffusion.d.ts +80 -0
  300. package/dist/src/tech-diffusion.js +185 -0
  301. package/dist/src/traits.d.ts +25 -0
  302. package/dist/src/traits.js +178 -0
  303. package/dist/src/types.d.ts +117 -0
  304. package/dist/src/types.js +1 -0
  305. package/dist/src/units.d.ts +41 -0
  306. package/dist/src/units.js +64 -0
  307. package/dist/src/weapons.d.ts +20 -0
  308. package/dist/src/weapons.js +824 -0
  309. package/dist/src/world-generation.d.ts +52 -0
  310. package/dist/src/world-generation.js +301 -0
  311. package/package.json +74 -0
@@ -0,0 +1,664 @@
1
+ /**
2
+ * Phase 31 — Species & Race System
3
+ *
4
+ * Data-driven species definitions that compose Archetype + BodyPlan + innate traits
5
+ * + capabilities + physiological overrides into a single declarative record.
6
+ *
7
+ * Covers:
8
+ * Fantasy humanoids — elf, dwarf, halfling, orc, ogre, goblin, troll (7)
9
+ * Sci-fi humanoids — Vulcan, Klingon, Romulan (3)
10
+ * Mythological — dragon, centaur, satyr (3)
11
+ * Fictional — Heechee (1)
12
+ */
13
+ import { q, to } from "./units.js";
14
+ import { generateIndividual } from "./generate.js";
15
+ import { applyTraitsToAttributes } from "./traits.js";
16
+ import { HUMANOID_PLAN, AVIAN_PLAN, CENTAUR_PLAN } from "./sim/bodyplan.js";
17
+ // ── Factory ────────────────────────────────────────────────────────────────────
18
+ /**
19
+ * Generate an individual from a species definition using a deterministic seed.
20
+ * Applies innate traits via `applyTraitsToAttributes` (which deep-copies attrs).
21
+ */
22
+ export function generateSpeciesIndividual(species, seed) {
23
+ const base = generateIndividual(seed >>> 0, species.archetype);
24
+ const attrs = species.innateTraits?.length
25
+ ? applyTraitsToAttributes(base, species.innateTraits)
26
+ : base;
27
+ const spec = {
28
+ attributes: attrs,
29
+ innateTraits: species.innateTraits ?? [],
30
+ innateCapabilities: species.innateCapabilities ?? [],
31
+ naturalWeapons: species.naturalWeapons ?? [],
32
+ };
33
+ if (species.physiology !== undefined)
34
+ spec.physiology = species.physiology;
35
+ if (species.bodyPlan !== undefined)
36
+ spec.bodyPlan = species.bodyPlan;
37
+ if (species.skillAptitudes !== undefined)
38
+ spec.skillAptitudes = species.skillAptitudes;
39
+ return spec;
40
+ }
41
+ // ── Natural weapons ────────────────────────────────────────────────────────────
42
+ /** Dragon fore-claw — heavy rending/piercing natural weapon. */
43
+ const DRAGON_CLAW = {
44
+ id: "dragon_claw",
45
+ name: "Dragon claw",
46
+ kind: "weapon",
47
+ mass_kg: to.kg(2.0),
48
+ bulk: q(0), // natural weapon — zero carry bulk
49
+ reach_m: to.m(2.0),
50
+ readyTime_s: to.s(0.5),
51
+ handlingMul: q(1.10),
52
+ strikeEffectiveMassFrac: q(0.28),
53
+ strikeSpeedMul: q(1.30),
54
+ momentArm_m: to.m(0.80),
55
+ handedness: "natural",
56
+ damage: {
57
+ surfaceFrac: q(0.45),
58
+ internalFrac: q(0.40),
59
+ structuralFrac: q(0.15),
60
+ bleedFactor: q(0.90),
61
+ penetrationBias: q(0.65),
62
+ },
63
+ };
64
+ /** Satyr horn — short horn-thrust natural weapon. */
65
+ const SATYR_HORN = {
66
+ id: "satyr_horn",
67
+ name: "Satyr horn",
68
+ kind: "weapon",
69
+ mass_kg: to.kg(0.30),
70
+ bulk: q(0),
71
+ reach_m: to.m(0.28),
72
+ readyTime_s: to.s(0.40),
73
+ handlingMul: q(1.00),
74
+ strikeEffectiveMassFrac: q(0.50),
75
+ strikeSpeedMul: q(0.90),
76
+ momentArm_m: to.m(0.14),
77
+ handedness: "natural",
78
+ damage: {
79
+ surfaceFrac: q(0.25),
80
+ internalFrac: q(0.60),
81
+ structuralFrac: q(0.15),
82
+ bleedFactor: q(0.65),
83
+ penetrationBias: q(0.80),
84
+ },
85
+ };
86
+ // ── Dragon capabilities ────────────────────────────────────────────────────────
87
+ /** Dragon fire breath — 60° forward cone, 1-second sustained burst. */
88
+ const DRAGON_FIRE_BREATH_CAP = {
89
+ id: "dragon_fire_breath",
90
+ label: "Dragon fire breath",
91
+ tags: ["biological", "fire"],
92
+ reserve_J: 24_000,
93
+ maxReserve_J: 24_000,
94
+ regenModel: { type: "rest", regenRate_W: 6 }, // slow regen — ~4 000 s to refill
95
+ effects: [{
96
+ id: "fire_cone",
97
+ castTime_ticks: 0,
98
+ cost_J: 4_000,
99
+ coneHalfAngle_rad: Math.PI / 3, // 60° half-angle
100
+ coneDir: "facing",
101
+ sustainedTicks: 20, // fires for 1 s at 20 Hz
102
+ payload: {
103
+ kind: "weaponImpact",
104
+ profile: {
105
+ surfaceFrac: q(0.80), // mostly surface burns
106
+ internalFrac: q(0.15),
107
+ structuralFrac: q(0.05),
108
+ bleedFactor: q(0.05),
109
+ penetrationBias: q(0.05),
110
+ },
111
+ energy_J: 800,
112
+ },
113
+ }],
114
+ };
115
+ // ── Fantasy humanoids ──────────────────────────────────────────────────────────
116
+ /** Elf — graceful, keen-sensed, sylvan endurance. */
117
+ export const ELF_SPECIES = {
118
+ id: "elf",
119
+ name: "Elf",
120
+ description: "Tall, slender humanoid with exceptional senses, dexterity, and long lifespan.",
121
+ bodyPlan: HUMANOID_PLAN,
122
+ physiology: { bmrMultiplier: q(0.85) },
123
+ archetype: {
124
+ stature_m: to.m(1.85), mass_kg: to.kg(62),
125
+ visionRange_m: to.m(500), visionArcDeg: 140, hearingRange_m: to.m(80),
126
+ decisionLatency_s: to.s(0.40), attentionDepth: 5, threatHorizon_m: to.m(60),
127
+ statureVar: q(0.06), massVar: q(0.10),
128
+ reachVar: q(0.08), actuatorScaleVar: q(0.14), structureScaleVar: q(0.12),
129
+ actuatorMassFrac: q(0.38), actuatorMassVar: q(0.14),
130
+ peakForce_N: to.N(1600), peakForceVar: q(0.18),
131
+ peakPower_W: to.W(1100), peakPowerVar: q(0.22),
132
+ continuousPower_W: to.W(240), continuousPowerVar: q(0.20),
133
+ reserveEnergy_J: to.J(22_000), reserveEnergyVar: q(0.28),
134
+ conversionEfficiency: q(0.88), efficiencyVar: q(0.08),
135
+ reactionTime_s: to.s(0.17), reactionTimeVar: q(0.20),
136
+ controlQuality: q(0.82), controlVar: q(0.16),
137
+ stability: q(0.72), stabilityVar: q(0.18),
138
+ fineControl: q(0.88), fineControlVar: q(0.14),
139
+ surfaceIntegrity: q(0.95), surfaceVar: q(0.14),
140
+ bulkIntegrity: q(0.95), bulkVar: q(0.14),
141
+ structureIntegrity: q(0.95), structVar: q(0.14),
142
+ distressTolerance: q(0.40), distressVar: q(0.28),
143
+ shockTolerance: q(0.50), shockVar: q(0.28),
144
+ concussionTolerance: q(0.48), concVar: q(0.28),
145
+ heatTolerance: q(0.45), heatVar: q(0.28),
146
+ coldTolerance: q(0.70), coldVar: q(0.22),
147
+ fatigueRate: q(0.80), fatigueVar: q(0.20),
148
+ recoveryRate: q(1.10), recoveryVar: q(0.22),
149
+ cognition: { linguistic: q(0.80), logicalMathematical: q(0.72), spatial: q(0.80), bodilyKinesthetic: q(0.75), musical: q(0.85), interpersonal: q(0.70), intrapersonal: q(0.75), naturalist: q(0.78), interSpecies: q(0.60) },
150
+ },
151
+ lore: "Long-lived woodland folk; keen senses and fine motor precision exceed human norms.",
152
+ };
153
+ /** Dwarf — stocky, dense-boned, underground-adapted. */
154
+ export const DWARF_SPECIES = {
155
+ id: "dwarf",
156
+ name: "Dwarf",
157
+ description: "Compact, heavily-built humanoid adapted to subterranean environments.",
158
+ bodyPlan: HUMANOID_PLAN,
159
+ innateTraits: ["reinforcedStructure"],
160
+ archetype: {
161
+ stature_m: to.m(1.40), mass_kg: to.kg(78),
162
+ visionRange_m: to.m(100), visionArcDeg: 110, hearingRange_m: to.m(80),
163
+ decisionLatency_s: to.s(0.50), attentionDepth: 4, threatHorizon_m: to.m(30),
164
+ statureVar: q(0.05), massVar: q(0.12),
165
+ reachVar: q(0.08), actuatorScaleVar: q(0.16), structureScaleVar: q(0.12),
166
+ actuatorMassFrac: q(0.45), actuatorMassVar: q(0.16),
167
+ peakForce_N: to.N(2200), peakForceVar: q(0.20),
168
+ peakPower_W: to.W(1300), peakPowerVar: q(0.24),
169
+ continuousPower_W: to.W(260), continuousPowerVar: q(0.22),
170
+ reserveEnergy_J: to.J(22_000), reserveEnergyVar: q(0.28),
171
+ conversionEfficiency: q(0.87), efficiencyVar: q(0.09),
172
+ reactionTime_s: to.s(0.24), reactionTimeVar: q(0.22),
173
+ controlQuality: q(0.76), controlVar: q(0.18),
174
+ stability: q(0.85), stabilityVar: q(0.14),
175
+ fineControl: q(0.74), fineControlVar: q(0.20),
176
+ surfaceIntegrity: q(1.10), surfaceVar: q(0.14),
177
+ bulkIntegrity: q(1.10), bulkVar: q(0.14),
178
+ structureIntegrity: q(1.20), structVar: q(0.14),
179
+ distressTolerance: q(0.70), distressVar: q(0.24),
180
+ shockTolerance: q(0.72), shockVar: q(0.24),
181
+ concussionTolerance: q(0.68), concVar: q(0.22),
182
+ heatTolerance: q(0.65), heatVar: q(0.26),
183
+ coldTolerance: q(0.72), coldVar: q(0.22),
184
+ fatigueRate: q(0.92), fatigueVar: q(0.22),
185
+ recoveryRate: q(1.15), recoveryVar: q(0.20),
186
+ cognition: { linguistic: q(0.55), logicalMathematical: q(0.75), spatial: q(0.65), bodilyKinesthetic: q(0.90), musical: q(0.55), interpersonal: q(0.50), intrapersonal: q(0.65), naturalist: q(0.45), interSpecies: q(0.25) },
187
+ },
188
+ lore: "Dense-boned mountain folk; superior structural integrity and acute hearing in tunnels.",
189
+ };
190
+ /** Halfling — small, nimble, with surprising resilience. */
191
+ export const HALFLING_SPECIES = {
192
+ id: "halfling",
193
+ name: "Halfling",
194
+ description: "Small, light-footed humanoid with remarkable balance and composure.",
195
+ bodyPlan: HUMANOID_PLAN,
196
+ physiology: { bmrMultiplier: q(1.10) },
197
+ archetype: {
198
+ stature_m: to.m(1.10), mass_kg: to.kg(35),
199
+ visionRange_m: to.m(150), visionArcDeg: 130, hearingRange_m: to.m(60),
200
+ decisionLatency_s: to.s(0.45), attentionDepth: 4, threatHorizon_m: to.m(35),
201
+ statureVar: q(0.06), massVar: q(0.14),
202
+ reachVar: q(0.10), actuatorScaleVar: q(0.16), structureScaleVar: q(0.14),
203
+ actuatorMassFrac: q(0.40), actuatorMassVar: q(0.18),
204
+ peakForce_N: to.N(900), peakForceVar: q(0.22),
205
+ peakPower_W: to.W(600), peakPowerVar: q(0.26),
206
+ continuousPower_W: to.W(140), continuousPowerVar: q(0.24),
207
+ reserveEnergy_J: to.J(14_000), reserveEnergyVar: q(0.30),
208
+ conversionEfficiency: q(0.86), efficiencyVar: q(0.10),
209
+ reactionTime_s: to.s(0.15), reactionTimeVar: q(0.22),
210
+ controlQuality: q(0.80), controlVar: q(0.18),
211
+ stability: q(0.82), stabilityVar: q(0.16),
212
+ fineControl: q(0.80), fineControlVar: q(0.20),
213
+ surfaceIntegrity: q(1.0), surfaceVar: q(0.18),
214
+ bulkIntegrity: q(1.0), bulkVar: q(0.18),
215
+ structureIntegrity: q(1.0), structVar: q(0.18),
216
+ distressTolerance: q(0.60), distressVar: q(0.28),
217
+ shockTolerance: q(0.55), shockVar: q(0.28),
218
+ concussionTolerance: q(0.52), concVar: q(0.28),
219
+ heatTolerance: q(0.52), heatVar: q(0.30),
220
+ coldTolerance: q(0.55), coldVar: q(0.28),
221
+ fatigueRate: q(0.88), fatigueVar: q(0.22),
222
+ recoveryRate: q(1.05), recoveryVar: q(0.22),
223
+ cognition: { linguistic: q(0.70), logicalMathematical: q(0.55), spatial: q(0.65), bodilyKinesthetic: q(0.80), musical: q(0.70), interpersonal: q(0.82), intrapersonal: q(0.60), naturalist: q(0.65), interSpecies: q(0.55) },
224
+ },
225
+ lore: "Unassuming but surprisingly tenacious; nimble feet give exceptional balance.",
226
+ };
227
+ /** Orc — powerful, pain-ignorant, high metabolic rate. */
228
+ export const ORC_SPECIES = {
229
+ id: "orc",
230
+ name: "Orc",
231
+ description: "Heavily-muscled, aggressive humanoid with a high pain threshold.",
232
+ bodyPlan: HUMANOID_PLAN,
233
+ physiology: { bmrMultiplier: q(1.15) },
234
+ archetype: {
235
+ stature_m: to.m(1.95), mass_kg: to.kg(105),
236
+ visionRange_m: to.m(150), visionArcDeg: 120, hearingRange_m: to.m(50),
237
+ decisionLatency_s: to.s(0.55), attentionDepth: 3, threatHorizon_m: to.m(35),
238
+ statureVar: q(0.08), massVar: q(0.16),
239
+ reachVar: q(0.10), actuatorScaleVar: q(0.18), structureScaleVar: q(0.16),
240
+ actuatorMassFrac: q(0.46), actuatorMassVar: q(0.18),
241
+ peakForce_N: to.N(2600), peakForceVar: q(0.22),
242
+ peakPower_W: to.W(1600), peakPowerVar: q(0.26),
243
+ continuousPower_W: to.W(300), continuousPowerVar: q(0.24),
244
+ reserveEnergy_J: to.J(26_000), reserveEnergyVar: q(0.30),
245
+ conversionEfficiency: q(0.85), efficiencyVar: q(0.10),
246
+ reactionTime_s: to.s(0.24), reactionTimeVar: q(0.24),
247
+ controlQuality: q(0.72), controlVar: q(0.20),
248
+ stability: q(0.74), stabilityVar: q(0.20),
249
+ fineControl: q(0.62), fineControlVar: q(0.24),
250
+ surfaceIntegrity: q(1.05), surfaceVar: q(0.16),
251
+ bulkIntegrity: q(1.05), bulkVar: q(0.16),
252
+ structureIntegrity: q(1.05), structVar: q(0.16),
253
+ distressTolerance: q(0.80), distressVar: q(0.22),
254
+ shockTolerance: q(0.75), shockVar: q(0.22),
255
+ concussionTolerance: q(0.60), concVar: q(0.24),
256
+ heatTolerance: q(0.55), heatVar: q(0.28),
257
+ coldTolerance: q(0.52), coldVar: q(0.28),
258
+ fatigueRate: q(1.10), fatigueVar: q(0.22),
259
+ recoveryRate: q(1.00), recoveryVar: q(0.22),
260
+ cognition: { linguistic: q(0.45), logicalMathematical: q(0.45), spatial: q(0.55), bodilyKinesthetic: q(0.75), musical: q(0.55), interpersonal: q(0.50), intrapersonal: q(0.40), naturalist: q(0.50), interSpecies: q(0.30) },
261
+ },
262
+ lore: "High aggression correlates with high metabolic drain; remarkable pain tolerance.",
263
+ };
264
+ /** Ogre — massive, brutish, very slow decision-making. */
265
+ export const OGRE_SPECIES = {
266
+ id: "ogre",
267
+ name: "Ogre",
268
+ description: "Giant humanoid with immense strength but poor coordination and slow cognition.",
269
+ bodyPlan: HUMANOID_PLAN,
270
+ archetype: {
271
+ stature_m: to.m(2.90), mass_kg: to.kg(320),
272
+ visionRange_m: to.m(120), visionArcDeg: 120, hearingRange_m: to.m(40),
273
+ decisionLatency_s: to.s(1.0), attentionDepth: 2, threatHorizon_m: to.m(30),
274
+ statureVar: q(0.10), massVar: q(0.20),
275
+ reachVar: q(0.12), actuatorScaleVar: q(0.20), structureScaleVar: q(0.18),
276
+ actuatorMassFrac: q(0.44), actuatorMassVar: q(0.20),
277
+ peakForce_N: to.N(6000), peakForceVar: q(0.24),
278
+ peakPower_W: to.W(3000), peakPowerVar: q(0.28),
279
+ continuousPower_W: to.W(500), continuousPowerVar: q(0.26),
280
+ reserveEnergy_J: to.J(50_000), reserveEnergyVar: q(0.30),
281
+ conversionEfficiency: q(0.82), efficiencyVar: q(0.12),
282
+ reactionTime_s: to.s(0.45), reactionTimeVar: q(0.28),
283
+ controlQuality: q(0.55), controlVar: q(0.24),
284
+ stability: q(0.78), stabilityVar: q(0.22),
285
+ fineControl: q(0.45), fineControlVar: q(0.28),
286
+ surfaceIntegrity: q(1.10), surfaceVar: q(0.18),
287
+ bulkIntegrity: q(1.10), bulkVar: q(0.18),
288
+ structureIntegrity: q(1.20), structVar: q(0.18),
289
+ distressTolerance: q(0.75), distressVar: q(0.24),
290
+ shockTolerance: q(0.78), shockVar: q(0.24),
291
+ concussionTolerance: q(0.65), concVar: q(0.26),
292
+ heatTolerance: q(0.60), heatVar: q(0.28),
293
+ coldTolerance: q(0.62), coldVar: q(0.28),
294
+ fatigueRate: q(1.05), fatigueVar: q(0.24),
295
+ recoveryRate: q(0.95), recoveryVar: q(0.24),
296
+ cognition: { linguistic: q(0.25), logicalMathematical: q(0.25), spatial: q(0.40), bodilyKinesthetic: q(0.65), musical: q(0.20), interpersonal: q(0.30), intrapersonal: q(0.30), naturalist: q(0.50), interSpecies: q(0.20) },
297
+ },
298
+ lore: "Raw power constrained by poor fine motor skill and sluggish cognition.",
299
+ };
300
+ /** Goblin — small, cowardly, extremely fast reactions. */
301
+ export const GOBLIN_SPECIES = {
302
+ id: "goblin",
303
+ name: "Goblin",
304
+ description: "Small, scrappy humanoid with the fastest reflexes of any humanoid species.",
305
+ bodyPlan: HUMANOID_PLAN,
306
+ archetype: {
307
+ stature_m: to.m(1.20), mass_kg: to.kg(28),
308
+ visionRange_m: to.m(120), visionArcDeg: 130, hearingRange_m: to.m(55),
309
+ decisionLatency_s: to.s(0.35), attentionDepth: 4, threatHorizon_m: to.m(30),
310
+ statureVar: q(0.08), massVar: q(0.16),
311
+ reachVar: q(0.10), actuatorScaleVar: q(0.18), structureScaleVar: q(0.16),
312
+ actuatorMassFrac: q(0.40), actuatorMassVar: q(0.18),
313
+ peakForce_N: to.N(700), peakForceVar: q(0.24),
314
+ peakPower_W: to.W(450), peakPowerVar: q(0.28),
315
+ continuousPower_W: to.W(110), continuousPowerVar: q(0.26),
316
+ reserveEnergy_J: to.J(10_000), reserveEnergyVar: q(0.30),
317
+ conversionEfficiency: q(0.84), efficiencyVar: q(0.12),
318
+ reactionTime_s: to.s(0.13), reactionTimeVar: q(0.22),
319
+ controlQuality: q(0.68), controlVar: q(0.22),
320
+ stability: q(0.60), stabilityVar: q(0.22),
321
+ fineControl: q(0.72), fineControlVar: q(0.24),
322
+ surfaceIntegrity: q(0.85), surfaceVar: q(0.20),
323
+ bulkIntegrity: q(0.85), bulkVar: q(0.20),
324
+ structureIntegrity: q(0.85), structVar: q(0.20),
325
+ distressTolerance: q(0.25), distressVar: q(0.30),
326
+ shockTolerance: q(0.30), shockVar: q(0.30),
327
+ concussionTolerance: q(0.38), concVar: q(0.30),
328
+ heatTolerance: q(0.45), heatVar: q(0.30),
329
+ coldTolerance: q(0.45), coldVar: q(0.30),
330
+ fatigueRate: q(1.05), fatigueVar: q(0.24),
331
+ recoveryRate: q(0.95), recoveryVar: q(0.24),
332
+ cognition: { linguistic: q(0.50), logicalMathematical: q(0.60), spatial: q(0.70), bodilyKinesthetic: q(0.75), musical: q(0.40), interpersonal: q(0.55), intrapersonal: q(0.35), naturalist: q(0.60), interSpecies: q(0.40) },
333
+ },
334
+ lore: "Survival instinct manifests as extreme flight reflex; low pain threshold accelerates retreat.",
335
+ };
336
+ /** Troll — massive regenerator, devastatingly vulnerable to fire. */
337
+ export const TROLL_SPECIES = {
338
+ id: "troll",
339
+ name: "Troll",
340
+ description: "Large, fast-regenerating humanoid with thick hide — but fire halts healing entirely.",
341
+ bodyPlan: HUMANOID_PLAN,
342
+ innateTraits: ["reinforcedStructure"],
343
+ physiology: {
344
+ naturalInsulation_m2KW: 0.08, // thick hide — cold-adapted
345
+ },
346
+ archetype: {
347
+ stature_m: to.m(2.50), mass_kg: to.kg(180),
348
+ visionRange_m: to.m(100), visionArcDeg: 120, hearingRange_m: to.m(55),
349
+ decisionLatency_s: to.s(0.65), attentionDepth: 3, threatHorizon_m: to.m(30),
350
+ statureVar: q(0.10), massVar: q(0.18),
351
+ reachVar: q(0.12), actuatorScaleVar: q(0.20), structureScaleVar: q(0.18),
352
+ actuatorMassFrac: q(0.44), actuatorMassVar: q(0.20),
353
+ peakForce_N: to.N(5000), peakForceVar: q(0.24),
354
+ peakPower_W: to.W(2500), peakPowerVar: q(0.28),
355
+ continuousPower_W: to.W(400), continuousPowerVar: q(0.26),
356
+ reserveEnergy_J: to.J(40_000), reserveEnergyVar: q(0.30),
357
+ conversionEfficiency: q(0.84), efficiencyVar: q(0.12),
358
+ reactionTime_s: to.s(0.35), reactionTimeVar: q(0.26),
359
+ controlQuality: q(0.65), controlVar: q(0.22),
360
+ stability: q(0.80), stabilityVar: q(0.20),
361
+ fineControl: q(0.42), fineControlVar: q(0.28),
362
+ surfaceIntegrity: q(1.15), surfaceVar: q(0.16),
363
+ bulkIntegrity: q(1.15), bulkVar: q(0.16),
364
+ structureIntegrity: q(1.20), structVar: q(0.16),
365
+ distressTolerance: q(0.70), distressVar: q(0.24),
366
+ shockTolerance: q(0.72), shockVar: q(0.24),
367
+ concussionTolerance: q(0.60), concVar: q(0.26),
368
+ heatTolerance: q(0.15), heatVar: q(0.20), // catastrophically fire-vulnerable
369
+ coldTolerance: q(0.80), coldVar: q(0.18),
370
+ fatigueRate: q(1.00), fatigueVar: q(0.22),
371
+ recoveryRate: q(2.00), recoveryVar: q(0.20), // rapid regeneration
372
+ cognition: { linguistic: q(0.20), logicalMathematical: q(0.20), spatial: q(0.35), bodilyKinesthetic: q(0.60), musical: q(0.15), interpersonal: q(0.25), intrapersonal: q(0.20), naturalist: q(0.55), interSpecies: q(0.20) },
373
+ },
374
+ lore: "Legendary regeneration is suppressed by fire damage — the classical trollslayer strategy.",
375
+ };
376
+ // ── Sci-fi humanoids ───────────────────────────────────────────────────────────
377
+ /** Vulcan — disciplined, strong, meditative metabolism; very low individual variance. */
378
+ export const VULCAN_SPECIES = {
379
+ id: "vulcan",
380
+ name: "Vulcan",
381
+ description: "Logically disciplined desert humanoid with exceptional strength and pain mastery.",
382
+ bodyPlan: HUMANOID_PLAN,
383
+ physiology: { bmrMultiplier: q(0.72) }, // meditative metabolism — slow starvation
384
+ archetype: {
385
+ stature_m: to.m(1.85), mass_kg: to.kg(85),
386
+ visionRange_m: to.m(250), visionArcDeg: 120, hearingRange_m: to.m(60),
387
+ decisionLatency_s: to.s(0.35), attentionDepth: 5, threatHorizon_m: to.m(50),
388
+ statureVar: q(0.04), massVar: q(0.06), // uniform society — low variance
389
+ reachVar: q(0.05), actuatorScaleVar: q(0.08), structureScaleVar: q(0.07),
390
+ actuatorMassFrac: q(0.44), actuatorMassVar: q(0.08),
391
+ peakForce_N: to.N(2800), peakForceVar: q(0.08),
392
+ peakPower_W: to.W(1400), peakPowerVar: q(0.10),
393
+ continuousPower_W: to.W(280), continuousPowerVar: q(0.10),
394
+ reserveEnergy_J: to.J(28_000), reserveEnergyVar: q(0.12),
395
+ conversionEfficiency: q(0.90), efficiencyVar: q(0.05),
396
+ reactionTime_s: to.s(0.16), reactionTimeVar: q(0.10),
397
+ controlQuality: q(0.85), controlVar: q(0.08),
398
+ stability: q(0.80), stabilityVar: q(0.10),
399
+ fineControl: q(0.88), fineControlVar: q(0.08),
400
+ surfaceIntegrity: q(1.05), surfaceVar: q(0.08),
401
+ bulkIntegrity: q(1.05), bulkVar: q(0.08),
402
+ structureIntegrity: q(1.05), structVar: q(0.08),
403
+ distressTolerance: q(0.90), distressVar: q(0.08), // Vulcan pain suppression
404
+ shockTolerance: q(0.75), shockVar: q(0.10),
405
+ concussionTolerance: q(0.62), concVar: q(0.10),
406
+ heatTolerance: q(0.70), heatVar: q(0.12), // desert-origin heat adaptation
407
+ coldTolerance: q(0.75), coldVar: q(0.12),
408
+ fatigueRate: q(0.85), fatigueVar: q(0.08),
409
+ recoveryRate: q(1.10), recoveryVar: q(0.08),
410
+ cognition: { linguistic: q(0.80), logicalMathematical: q(0.95), spatial: q(0.85), bodilyKinesthetic: q(0.70), musical: q(0.65), interpersonal: q(0.50), intrapersonal: q(0.95), naturalist: q(0.70), interSpecies: q(0.65) },
411
+ },
412
+ lore: "Meditative disciplines reduce basal metabolic demand and suppress pain response.",
413
+ };
414
+ /** Klingon — aggressive warrior with redundant organs and thick cranial ridges. */
415
+ export const KLINGON_SPECIES = {
416
+ id: "klingon",
417
+ name: "Klingon",
418
+ description: "Warrior humanoid with redundant organ systems and exceptional shock tolerance.",
419
+ bodyPlan: HUMANOID_PLAN,
420
+ physiology: { bmrMultiplier: q(1.20) }, // high-aggression metabolism
421
+ archetype: {
422
+ stature_m: to.m(1.90), mass_kg: to.kg(95),
423
+ visionRange_m: to.m(200), visionArcDeg: 120, hearingRange_m: to.m(50),
424
+ decisionLatency_s: to.s(0.50), attentionDepth: 4, threatHorizon_m: to.m(40),
425
+ statureVar: q(0.07), massVar: q(0.14),
426
+ reachVar: q(0.08), actuatorScaleVar: q(0.16), structureScaleVar: q(0.14),
427
+ actuatorMassFrac: q(0.46), actuatorMassVar: q(0.16),
428
+ peakForce_N: to.N(2400), peakForceVar: q(0.20),
429
+ peakPower_W: to.W(1500), peakPowerVar: q(0.24),
430
+ continuousPower_W: to.W(300), continuousPowerVar: q(0.22),
431
+ reserveEnergy_J: to.J(30_000), reserveEnergyVar: q(0.26),
432
+ conversionEfficiency: q(0.87), efficiencyVar: q(0.09),
433
+ reactionTime_s: to.s(0.20), reactionTimeVar: q(0.20),
434
+ controlQuality: q(0.78), controlVar: q(0.18),
435
+ stability: q(0.78), stabilityVar: q(0.18),
436
+ fineControl: q(0.74), fineControlVar: q(0.20),
437
+ surfaceIntegrity: q(1.25), surfaceVar: q(0.12), // cranial ridges, thick skin
438
+ bulkIntegrity: q(1.10), bulkVar: q(0.14),
439
+ structureIntegrity: q(1.10), structVar: q(0.14),
440
+ distressTolerance: q(0.85), distressVar: q(0.16),
441
+ shockTolerance: q(0.88), shockVar: q(0.14), // redundant organs (brak'lul)
442
+ concussionTolerance: q(0.72), concVar: q(0.18), // thick forehead ridges
443
+ heatTolerance: q(0.60), heatVar: q(0.24),
444
+ coldTolerance: q(0.60), coldVar: q(0.24),
445
+ fatigueRate: q(1.05), fatigueVar: q(0.20),
446
+ recoveryRate: q(1.20), recoveryVar: q(0.18),
447
+ cognition: { linguistic: q(0.60), logicalMathematical: q(0.55), spatial: q(0.65), bodilyKinesthetic: q(0.80), musical: q(0.70), interpersonal: q(0.65), intrapersonal: q(0.50), naturalist: q(0.60), interSpecies: q(0.30) },
448
+ },
449
+ lore: "Redundant cardiovascular and digestive systems (brak'lul) provide extreme shock resilience.",
450
+ };
451
+ /** Romulan — disciplined but more emotionally variable than Vulcans. */
452
+ export const ROMULAN_SPECIES = {
453
+ id: "romulan",
454
+ name: "Romulan",
455
+ description: "Cunning, disciplined humanoid sharing Vulcan physiology but greater emotional range.",
456
+ bodyPlan: HUMANOID_PLAN,
457
+ physiology: { bmrMultiplier: q(0.85) },
458
+ archetype: {
459
+ stature_m: to.m(1.80), mass_kg: to.kg(80),
460
+ visionRange_m: to.m(220), visionArcDeg: 120, hearingRange_m: to.m(55),
461
+ decisionLatency_s: to.s(0.40), attentionDepth: 5, threatHorizon_m: to.m(45),
462
+ statureVar: q(0.06), massVar: q(0.12),
463
+ reachVar: q(0.07), actuatorScaleVar: q(0.14), structureScaleVar: q(0.12),
464
+ actuatorMassFrac: q(0.43), actuatorMassVar: q(0.14),
465
+ peakForce_N: to.N(2200), peakForceVar: q(0.16),
466
+ peakPower_W: to.W(1300), peakPowerVar: q(0.20),
467
+ continuousPower_W: to.W(270), continuousPowerVar: q(0.18),
468
+ reserveEnergy_J: to.J(26_000), reserveEnergyVar: q(0.22),
469
+ conversionEfficiency: q(0.89), efficiencyVar: q(0.07),
470
+ reactionTime_s: to.s(0.19), reactionTimeVar: q(0.18),
471
+ controlQuality: q(0.82), controlVar: q(0.15),
472
+ stability: q(0.78), stabilityVar: q(0.16),
473
+ fineControl: q(0.82), fineControlVar: q(0.16),
474
+ surfaceIntegrity: q(1.02), surfaceVar: q(0.12),
475
+ bulkIntegrity: q(1.02), bulkVar: q(0.12),
476
+ structureIntegrity: q(1.02), structVar: q(0.12),
477
+ distressTolerance: q(0.70), distressVar: q(0.20),
478
+ shockTolerance: q(0.68), shockVar: q(0.20),
479
+ concussionTolerance: q(0.58), concVar: q(0.22),
480
+ heatTolerance: q(0.65), heatVar: q(0.22),
481
+ coldTolerance: q(0.68), coldVar: q(0.22),
482
+ fatigueRate: q(0.88), fatigueVar: q(0.16),
483
+ recoveryRate: q(1.08), recoveryVar: q(0.16),
484
+ cognition: { linguistic: q(0.75), logicalMathematical: q(0.80), spatial: q(0.75), bodilyKinesthetic: q(0.65), musical: q(0.55), interpersonal: q(0.75), intrapersonal: q(0.80), naturalist: q(0.55), interSpecies: q(0.45) },
485
+ },
486
+ lore: "Shared ancestry with Vulcans produces similar physical capability; emotional volatility creates wider variance.",
487
+ };
488
+ // ── Mythological ───────────────────────────────────────────────────────────────
489
+ /** Dragon — immense fire-breathing reptilian with scales and flight capability. */
490
+ export const DRAGON_SPECIES = {
491
+ id: "dragon",
492
+ name: "Dragon",
493
+ description: "Massive scaled flier with natural armour, devastating fire breath, and powerful claws.",
494
+ bodyPlan: AVIAN_PLAN,
495
+ innateCapabilities: [DRAGON_FIRE_BREATH_CAP],
496
+ naturalWeapons: [DRAGON_CLAW],
497
+ physiology: {
498
+ naturalInsulation_m2KW: 0.05, // dense scales
499
+ },
500
+ archetype: {
501
+ stature_m: to.m(5.00), mass_kg: to.kg(2000),
502
+ visionRange_m: to.m(1000), visionArcDeg: 180, hearingRange_m: to.m(200),
503
+ decisionLatency_s: to.s(0.40), attentionDepth: 6, threatHorizon_m: to.m(200),
504
+ statureVar: q(0.12), massVar: q(0.20),
505
+ reachVar: q(0.10), actuatorScaleVar: q(0.18), structureScaleVar: q(0.16),
506
+ actuatorMassFrac: q(0.42), actuatorMassVar: q(0.18),
507
+ peakForce_N: to.N(50000), peakForceVar: q(0.22),
508
+ peakPower_W: to.W(40000), peakPowerVar: q(0.26),
509
+ continuousPower_W: to.W(8000), continuousPowerVar: q(0.24),
510
+ reserveEnergy_J: to.J(400_000), reserveEnergyVar: q(0.28),
511
+ conversionEfficiency: q(0.85), efficiencyVar: q(0.10),
512
+ reactionTime_s: to.s(0.22), reactionTimeVar: q(0.20),
513
+ controlQuality: q(0.75), controlVar: q(0.18),
514
+ stability: q(0.88), stabilityVar: q(0.14),
515
+ fineControl: q(0.68), fineControlVar: q(0.22),
516
+ surfaceIntegrity: q(2.00), surfaceVar: q(0.14), // dragon scales
517
+ bulkIntegrity: q(1.60), bulkVar: q(0.14),
518
+ structureIntegrity: q(1.80), structVar: q(0.14),
519
+ distressTolerance: q(0.82), distressVar: q(0.18),
520
+ shockTolerance: q(0.80), shockVar: q(0.18),
521
+ concussionTolerance: q(0.85), concVar: q(0.16),
522
+ heatTolerance: q(0.95), heatVar: q(0.06), // fire-producing endotherm
523
+ coldTolerance: q(0.60), coldVar: q(0.22),
524
+ fatigueRate: q(0.90), fatigueVar: q(0.20),
525
+ recoveryRate: q(1.30), recoveryVar: q(0.20),
526
+ cognition: { linguistic: q(0.50), logicalMathematical: q(0.75), spatial: q(0.95), bodilyKinesthetic: q(0.80), musical: q(0.40), interpersonal: q(0.40), intrapersonal: q(0.90), naturalist: q(0.80), interSpecies: q(0.55) },
527
+ },
528
+ lore: "An apex predator. Fire breath is a biological weapon; scales provide armour equivalent to plate.",
529
+ };
530
+ /** Centaur — horse body with human torso; CENTAUR_PLAN anatomy. */
531
+ export const CENTAUR_SPECIES = {
532
+ id: "centaur",
533
+ name: "Centaur",
534
+ description: "Horse-bodied humanoid with equine lower body and human upper torso.",
535
+ bodyPlan: CENTAUR_PLAN,
536
+ archetype: {
537
+ stature_m: to.m(2.20), mass_kg: to.kg(350),
538
+ visionRange_m: to.m(300), visionArcDeg: 150, hearingRange_m: to.m(80),
539
+ decisionLatency_s: to.s(0.45), attentionDepth: 4, threatHorizon_m: to.m(60),
540
+ statureVar: q(0.08), massVar: q(0.16),
541
+ reachVar: q(0.08), actuatorScaleVar: q(0.18), structureScaleVar: q(0.16),
542
+ actuatorMassFrac: q(0.42), actuatorMassVar: q(0.18),
543
+ peakForce_N: to.N(8000), peakForceVar: q(0.22),
544
+ peakPower_W: to.W(3500), peakPowerVar: q(0.26),
545
+ continuousPower_W: to.W(1000), continuousPowerVar: q(0.22),
546
+ reserveEnergy_J: to.J(80_000), reserveEnergyVar: q(0.28),
547
+ conversionEfficiency: q(0.88), efficiencyVar: q(0.09),
548
+ reactionTime_s: to.s(0.22), reactionTimeVar: q(0.22),
549
+ controlQuality: q(0.78), controlVar: q(0.18),
550
+ stability: q(0.88), stabilityVar: q(0.14), // four-legged stability
551
+ fineControl: q(0.74), fineControlVar: q(0.20),
552
+ surfaceIntegrity: q(1.10), surfaceVar: q(0.16),
553
+ bulkIntegrity: q(1.10), bulkVar: q(0.16),
554
+ structureIntegrity: q(1.15), structVar: q(0.16),
555
+ distressTolerance: q(0.65), distressVar: q(0.24),
556
+ shockTolerance: q(0.68), shockVar: q(0.24),
557
+ concussionTolerance: q(0.55), concVar: q(0.26),
558
+ heatTolerance: q(0.55), heatVar: q(0.28),
559
+ coldTolerance: q(0.65), coldVar: q(0.24),
560
+ fatigueRate: q(0.88), fatigueVar: q(0.22),
561
+ recoveryRate: q(1.05), recoveryVar: q(0.22),
562
+ cognition: { linguistic: q(0.55), logicalMathematical: q(0.60), spatial: q(0.80), bodilyKinesthetic: q(0.85), musical: q(0.65), interpersonal: q(0.65), intrapersonal: q(0.60), naturalist: q(0.85), interSpecies: q(0.55) },
563
+ },
564
+ lore: "Equine lower body grants exceptional speed and endurance; combat reach advantage from height.",
565
+ };
566
+ /** Satyr — goat-human hybrid with natural horn and extraordinary balance. */
567
+ export const SATYR_SPECIES = {
568
+ id: "satyr",
569
+ name: "Satyr",
570
+ description: "Goat-legged humanoid with a natural horn attack and excellent rough-terrain balance.",
571
+ bodyPlan: HUMANOID_PLAN,
572
+ naturalWeapons: [SATYR_HORN],
573
+ archetype: {
574
+ stature_m: to.m(1.55), mass_kg: to.kg(70),
575
+ visionRange_m: to.m(180), visionArcDeg: 150, hearingRange_m: to.m(70),
576
+ decisionLatency_s: to.s(0.45), attentionDepth: 4, threatHorizon_m: to.m(40),
577
+ statureVar: q(0.07), massVar: q(0.14),
578
+ reachVar: q(0.10), actuatorScaleVar: q(0.18), structureScaleVar: q(0.16),
579
+ actuatorMassFrac: q(0.42), actuatorMassVar: q(0.18),
580
+ peakForce_N: to.N(1600), peakForceVar: q(0.22),
581
+ peakPower_W: to.W(1100), peakPowerVar: q(0.26),
582
+ continuousPower_W: to.W(240), continuousPowerVar: q(0.24),
583
+ reserveEnergy_J: to.J(22_000), reserveEnergyVar: q(0.30),
584
+ conversionEfficiency: q(0.88), efficiencyVar: q(0.10),
585
+ reactionTime_s: to.s(0.19), reactionTimeVar: q(0.22),
586
+ controlQuality: q(0.80), controlVar: q(0.18),
587
+ stability: q(0.88), stabilityVar: q(0.14), // goat-footing balance
588
+ fineControl: q(0.72), fineControlVar: q(0.22),
589
+ surfaceIntegrity: q(1.0), surfaceVar: q(0.18),
590
+ bulkIntegrity: q(1.0), bulkVar: q(0.18),
591
+ structureIntegrity: q(1.0), structVar: q(0.18),
592
+ distressTolerance: q(0.55), distressVar: q(0.28),
593
+ shockTolerance: q(0.55), shockVar: q(0.28),
594
+ concussionTolerance: q(0.52), concVar: q(0.28),
595
+ heatTolerance: q(0.55), heatVar: q(0.28),
596
+ coldTolerance: q(0.58), coldVar: q(0.28),
597
+ fatigueRate: q(0.72), fatigueVar: q(0.22), // vigorous constitution
598
+ recoveryRate: q(1.10), recoveryVar: q(0.22),
599
+ cognition: { linguistic: q(0.60), logicalMathematical: q(0.50), spatial: q(0.60), bodilyKinesthetic: q(0.80), musical: q(0.95), interpersonal: q(0.75), intrapersonal: q(0.55), naturalist: q(0.72), interSpecies: q(0.60) },
600
+ },
601
+ lore: "Goat hooves provide unmatched balance on rough terrain; horn delivers surprising impact force.",
602
+ };
603
+ // ── Fictional ──────────────────────────────────────────────────────────────────
604
+ /**
605
+ * Heechee — Fred Pohl's Gateway aliens.
606
+ * Thin, soft-bodied, technologically advanced; fragile but extraordinarily precise.
607
+ */
608
+ export const HEECHEE_SPECIES = {
609
+ id: "heechee",
610
+ name: "Heechee",
611
+ description: "Slender, soft-bodied alien with exceptional fine motor precision and large sensory organs.",
612
+ bodyPlan: HUMANOID_PLAN,
613
+ innateTraits: ["fragileStructure"],
614
+ physiology: { bmrMultiplier: q(0.90) },
615
+ archetype: {
616
+ stature_m: to.m(1.60), mass_kg: to.kg(50),
617
+ visionRange_m: to.m(280), visionArcDeg: 160, hearingRange_m: to.m(90),
618
+ decisionLatency_s: to.s(0.35), attentionDepth: 6, threatHorizon_m: to.m(55),
619
+ statureVar: q(0.06), massVar: q(0.12),
620
+ reachVar: q(0.08), actuatorScaleVar: q(0.14), structureScaleVar: q(0.12),
621
+ actuatorMassFrac: q(0.36), actuatorMassVar: q(0.14),
622
+ peakForce_N: to.N(900), peakForceVar: q(0.20),
623
+ peakPower_W: to.W(500), peakPowerVar: q(0.24),
624
+ continuousPower_W: to.W(120), continuousPowerVar: q(0.22),
625
+ reserveEnergy_J: to.J(14_000), reserveEnergyVar: q(0.28),
626
+ conversionEfficiency: q(0.85), efficiencyVar: q(0.10),
627
+ reactionTime_s: to.s(0.18), reactionTimeVar: q(0.20),
628
+ controlQuality: q(0.88), controlVar: q(0.14),
629
+ stability: q(0.68), stabilityVar: q(0.20),
630
+ fineControl: q(0.92), fineControlVar: q(0.10), // exceptional precision
631
+ surfaceIntegrity: q(0.60), surfaceVar: q(0.18), // soft body
632
+ bulkIntegrity: q(0.65), bulkVar: q(0.18),
633
+ structureIntegrity: q(0.55), structVar: q(0.16), // minimal skeletal density
634
+ distressTolerance: q(0.42), distressVar: q(0.28),
635
+ shockTolerance: q(0.45), shockVar: q(0.28),
636
+ concussionTolerance: q(0.48), concVar: q(0.28),
637
+ heatTolerance: q(0.48), heatVar: q(0.28),
638
+ coldTolerance: q(0.52), coldVar: q(0.28),
639
+ fatigueRate: q(0.95), fatigueVar: q(0.22),
640
+ recoveryRate: q(0.90), recoveryVar: q(0.22),
641
+ cognition: { linguistic: q(0.40), logicalMathematical: q(0.95), spatial: q(0.90), bodilyKinesthetic: q(0.55), musical: q(0.30), interpersonal: q(0.45), intrapersonal: q(0.85), naturalist: q(0.65), interSpecies: q(0.90) },
642
+ },
643
+ lore: "Evolved for technological manipulation, not combat; their engineering precision is unmatched.",
644
+ };
645
+ // ── Collections ────────────────────────────────────────────────────────────────
646
+ export const FANTASY_HUMANOID_SPECIES = [
647
+ ELF_SPECIES, DWARF_SPECIES, HALFLING_SPECIES, ORC_SPECIES,
648
+ OGRE_SPECIES, GOBLIN_SPECIES, TROLL_SPECIES,
649
+ ];
650
+ export const SCIFI_HUMANOID_SPECIES = [
651
+ VULCAN_SPECIES, KLINGON_SPECIES, ROMULAN_SPECIES,
652
+ ];
653
+ export const MYTHOLOGICAL_SPECIES = [
654
+ DRAGON_SPECIES, CENTAUR_SPECIES, SATYR_SPECIES,
655
+ ];
656
+ export const FICTIONAL_SPECIES = [
657
+ HEECHEE_SPECIES,
658
+ ];
659
+ export const ALL_SPECIES = [
660
+ ...FANTASY_HUMANOID_SPECIES,
661
+ ...SCIFI_HUMANOID_SPECIES,
662
+ ...MYTHOLOGICAL_SPECIES,
663
+ ...FICTIONAL_SPECIES,
664
+ ];