star-freight 1.0.1__tar.gz

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 (313) hide show
  1. star_freight-1.0.1/.github/workflows/ci.yml +59 -0
  2. star_freight-1.0.1/.github/workflows/pages.yml +50 -0
  3. star_freight-1.0.1/.github/workflows/publish.yml +33 -0
  4. star_freight-1.0.1/.gitignore +12 -0
  5. star_freight-1.0.1/ACCEPTANCE_CRITERIA.md +110 -0
  6. star_freight-1.0.1/BUILD_PLAN.md +161 -0
  7. star_freight-1.0.1/CHANGELOG.md +47 -0
  8. star_freight-1.0.1/FORK_MAP.md +105 -0
  9. star_freight-1.0.1/HANDBOOK.md +302 -0
  10. star_freight-1.0.1/LICENSE +21 -0
  11. star_freight-1.0.1/PKG-INFO +163 -0
  12. star_freight-1.0.1/README.es.md +137 -0
  13. star_freight-1.0.1/README.fr.md +137 -0
  14. star_freight-1.0.1/README.hi.md +137 -0
  15. star_freight-1.0.1/README.it.md +137 -0
  16. star_freight-1.0.1/README.ja.md +137 -0
  17. star_freight-1.0.1/README.ko.md +86 -0
  18. star_freight-1.0.1/README.md +137 -0
  19. star_freight-1.0.1/README.pt-BR.md +137 -0
  20. star_freight-1.0.1/README.zh.md +137 -0
  21. star_freight-1.0.1/SCORECARD.md +49 -0
  22. star_freight-1.0.1/SECURITY.md +28 -0
  23. star_freight-1.0.1/SHIP_GATE.md +80 -0
  24. star_freight-1.0.1/STATE_MODEL.md +184 -0
  25. star_freight-1.0.1/design/00_THESIS_LOCK.md +103 -0
  26. star_freight-1.0.1/design/01_EXPERIENCE_CONTRACT.md +140 -0
  27. star_freight-1.0.1/design/02_SYSTEM_LAWS.md +465 -0
  28. star_freight-1.0.1/design/03_PROGRESSION_ECONOMY.md +287 -0
  29. star_freight-1.0.1/design/04_CONTENT_ARCHITECTURE.md +217 -0
  30. star_freight-1.0.1/design/05_INTERFACE_FEEL.md +572 -0
  31. star_freight-1.0.1/design/06_PRODUCTION_TRUTH.md +392 -0
  32. star_freight-1.0.1/design/CONTENT_PASS_HOUSES_AUDITS_SEIZURES.md +44 -0
  33. star_freight-1.0.1/design/CONTENT_PASS_SHORTAGES_SANCTIONS_CONVOYS.md +48 -0
  34. star_freight-1.0.1/design/CONTENT_PASS_WORKING_LIVES.md +38 -0
  35. star_freight-1.0.1/design/PLAYTEST_TUI_CHECKLIST.md +161 -0
  36. star_freight-1.0.1/design/PROOF_ECONOMY.md +532 -0
  37. star_freight-1.0.1/design/PROOF_ENCOUNTER.md +518 -0
  38. star_freight-1.0.1/design/PROOF_GOLDEN_PATH.md +562 -0
  39. star_freight-1.0.1/design/REGISTRY_CONTENT_BUDGET.md +133 -0
  40. star_freight-1.0.1/design/REGISTRY_CUTS.md +101 -0
  41. star_freight-1.0.1/design/REGISTRY_NUMBERS.md +171 -0
  42. star_freight-1.0.1/design/REGISTRY_RISKS.md +52 -0
  43. star_freight-1.0.1/design/REGISTRY_STATE_DICTIONARY.md +205 -0
  44. star_freight-1.0.1/design/TUI_SCREEN_AUDIT.md +217 -0
  45. star_freight-1.0.1/design/TUI_SURFACE_SPEC.md +370 -0
  46. star_freight-1.0.1/design/templates/CIV_INTERACTION.md +30 -0
  47. star_freight-1.0.1/design/templates/CONTENT_HEADER.md +29 -0
  48. star_freight-1.0.1/design/templates/CONTENT_PASS.md +39 -0
  49. star_freight-1.0.1/design/templates/CONTRACT.md +43 -0
  50. star_freight-1.0.1/design/templates/CREW.md +49 -0
  51. star_freight-1.0.1/design/templates/ENCOUNTER.md +45 -0
  52. star_freight-1.0.1/design/templates/INVESTIGATION_THREAD.md +53 -0
  53. star_freight-1.0.1/design/templates/LANE.md +45 -0
  54. star_freight-1.0.1/design/templates/STATION.md +54 -0
  55. star_freight-1.0.1/design/templates/TRADE_GOOD.md +34 -0
  56. star_freight-1.0.1/dogfood/DOGFOOD_MATRIX.md +97 -0
  57. star_freight-1.0.1/dogfood/DOGFOOD_REPORT_TEMPLATE.md +94 -0
  58. star_freight-1.0.1/dogfood/DOGFOOD_VERDICTS.md +89 -0
  59. star_freight-1.0.1/dogfood/WAVE1_VERDICT.md +153 -0
  60. star_freight-1.0.1/dogfood/WAVE2_VERDICT.md +139 -0
  61. star_freight-1.0.1/dogfood/WAVE3_VERDICT.md +97 -0
  62. star_freight-1.0.1/dogfood/run_wave1.py +156 -0
  63. star_freight-1.0.1/dogfood/run_wave2.py +192 -0
  64. star_freight-1.0.1/dogfood/run_wave3.py +334 -0
  65. star_freight-1.0.1/dogfood/scenarios/gray_baseline_90d_s42.json +19 -0
  66. star_freight-1.0.1/dogfood/scenarios/gray_seizure_60d_s17.json +22 -0
  67. star_freight-1.0.1/dogfood/scenarios/honor_baseline_90d_s42.json +19 -0
  68. star_freight-1.0.1/dogfood/scenarios/honor_escalation_60d_s17.json +25 -0
  69. star_freight-1.0.1/dogfood/scenarios/recovery_broke_hull_45d_s99.json +24 -0
  70. star_freight-1.0.1/dogfood/scenarios/recovery_burned_rep_45d_s99.json +24 -0
  71. star_freight-1.0.1/dogfood/scenarios/recovery_injured_crew_45d_s99.json +23 -0
  72. star_freight-1.0.1/dogfood/scenarios/relief_baseline_90d_s42.json +19 -0
  73. star_freight-1.0.1/dogfood/scenarios/relief_shortage_60d_s17.json +23 -0
  74. star_freight-1.0.1/dogfood/scenarios/tui_combat_heavy_s01.json +22 -0
  75. star_freight-1.0.1/dogfood/scenarios/tui_first_hour_s01.json +20 -0
  76. star_freight-1.0.1/dogfood/scenarios/tui_investigation_s01.json +20 -0
  77. star_freight-1.0.1/dogfood/wave1_results.json +1019 -0
  78. star_freight-1.0.1/dogfood/wave2_results.json +64 -0
  79. star_freight-1.0.1/dogfood/wave3_results.json +122 -0
  80. star_freight-1.0.1/logo.png +0 -0
  81. star_freight-1.0.1/pyproject.toml +41 -0
  82. star_freight-1.0.1/site/astro.config.mjs +30 -0
  83. star_freight-1.0.1/site/package-lock.json +7898 -0
  84. star_freight-1.0.1/site/package.json +18 -0
  85. star_freight-1.0.1/site/src/content/docs/handbook/captain-paths.md +50 -0
  86. star_freight-1.0.1/site/src/content/docs/handbook/getting-started.md +49 -0
  87. star_freight-1.0.1/site/src/content/docs/handbook/index.md +26 -0
  88. star_freight-1.0.1/site/src/content/docs/handbook/reference.md +96 -0
  89. star_freight-1.0.1/site/src/content/docs/handbook/the-world.md +49 -0
  90. star_freight-1.0.1/site/src/content.config.ts +4 -0
  91. star_freight-1.0.1/site/src/pages/index.astro +33 -0
  92. star_freight-1.0.1/site/src/site-config.ts +88 -0
  93. star_freight-1.0.1/site/src/styles/global.css +3 -0
  94. star_freight-1.0.1/site/src/styles/starlight-custom.css +18 -0
  95. star_freight-1.0.1/site/tsconfig.json +5 -0
  96. star_freight-1.0.1/src/portlight/__init__.py +3 -0
  97. star_freight-1.0.1/src/portlight/__main__.py +5 -0
  98. star_freight-1.0.1/src/portlight/app/__init__.py +1 -0
  99. star_freight-1.0.1/src/portlight/app/cli.py +3156 -0
  100. star_freight-1.0.1/src/portlight/app/combat_views.py +760 -0
  101. star_freight-1.0.1/src/portlight/app/formatting.py +183 -0
  102. star_freight-1.0.1/src/portlight/app/session.py +1201 -0
  103. star_freight-1.0.1/src/portlight/app/sf_views.py +907 -0
  104. star_freight-1.0.1/src/portlight/app/tui/__init__.py +1 -0
  105. star_freight-1.0.1/src/portlight/app/tui/app.py +158 -0
  106. star_freight-1.0.1/src/portlight/app/tui/screens/__init__.py +1 -0
  107. star_freight-1.0.1/src/portlight/app/tui/screens/combat.py +149 -0
  108. star_freight-1.0.1/src/portlight/app/tui/screens/dashboard.py +274 -0
  109. star_freight-1.0.1/src/portlight/app/tui/screens/encounter.py +712 -0
  110. star_freight-1.0.1/src/portlight/app/tui/screens/market.py +213 -0
  111. star_freight-1.0.1/src/portlight/app/tui/screens/routes.py +208 -0
  112. star_freight-1.0.1/src/portlight/app/tui/theme.py +268 -0
  113. star_freight-1.0.1/src/portlight/app/views.py +2126 -0
  114. star_freight-1.0.1/src/portlight/balance/__init__.py +1 -0
  115. star_freight-1.0.1/src/portlight/balance/aggregates.py +160 -0
  116. star_freight-1.0.1/src/portlight/balance/collectors.py +210 -0
  117. star_freight-1.0.1/src/portlight/balance/policies.py +915 -0
  118. star_freight-1.0.1/src/portlight/balance/reporting.py +241 -0
  119. star_freight-1.0.1/src/portlight/balance/runner.py +211 -0
  120. star_freight-1.0.1/src/portlight/balance/scenarios.py +77 -0
  121. star_freight-1.0.1/src/portlight/balance/types.py +202 -0
  122. star_freight-1.0.1/src/portlight/content/__init__.py +1 -0
  123. star_freight-1.0.1/src/portlight/content/armor.py +107 -0
  124. star_freight-1.0.1/src/portlight/content/campaign.py +386 -0
  125. star_freight-1.0.1/src/portlight/content/companions.py +303 -0
  126. star_freight-1.0.1/src/portlight/content/contracts.py +468 -0
  127. star_freight-1.0.1/src/portlight/content/crew_roles.py +94 -0
  128. star_freight-1.0.1/src/portlight/content/cross_port_networks.py +445 -0
  129. star_freight-1.0.1/src/portlight/content/culture.py +657 -0
  130. star_freight-1.0.1/src/portlight/content/factions.py +494 -0
  131. star_freight-1.0.1/src/portlight/content/fighting_styles.py +393 -0
  132. star_freight-1.0.1/src/portlight/content/goods.py +45 -0
  133. star_freight-1.0.1/src/portlight/content/infrastructure.py +442 -0
  134. star_freight-1.0.1/src/portlight/content/injuries.py +157 -0
  135. star_freight-1.0.1/src/portlight/content/loot_tables.py +192 -0
  136. star_freight-1.0.1/src/portlight/content/melee_weapons.py +140 -0
  137. star_freight-1.0.1/src/portlight/content/merchants.py +213 -0
  138. star_freight-1.0.1/src/portlight/content/officer_names.py +50 -0
  139. star_freight-1.0.1/src/portlight/content/port_institutions.py +4407 -0
  140. star_freight-1.0.1/src/portlight/content/port_institutions_east.py +797 -0
  141. star_freight-1.0.1/src/portlight/content/port_politics.py +533 -0
  142. star_freight-1.0.1/src/portlight/content/ports.py +454 -0
  143. star_freight-1.0.1/src/portlight/content/ranged_weapons.py +214 -0
  144. star_freight-1.0.1/src/portlight/content/routes.py +119 -0
  145. star_freight-1.0.1/src/portlight/content/sea_culture.py +808 -0
  146. star_freight-1.0.1/src/portlight/content/seasons.py +306 -0
  147. star_freight-1.0.1/src/portlight/content/ships.py +113 -0
  148. star_freight-1.0.1/src/portlight/content/skills.py +155 -0
  149. star_freight-1.0.1/src/portlight/content/star_freight.py +1448 -0
  150. star_freight-1.0.1/src/portlight/content/upgrades.py +159 -0
  151. star_freight-1.0.1/src/portlight/content/world.py +89 -0
  152. star_freight-1.0.1/src/portlight/engine/__init__.py +1 -0
  153. star_freight-1.0.1/src/portlight/engine/bounty.py +126 -0
  154. star_freight-1.0.1/src/portlight/engine/campaign.py +1304 -0
  155. star_freight-1.0.1/src/portlight/engine/captain_identity.py +719 -0
  156. star_freight-1.0.1/src/portlight/engine/captain_memory.py +419 -0
  157. star_freight-1.0.1/src/portlight/engine/combat.py +927 -0
  158. star_freight-1.0.1/src/portlight/engine/companion_engine.py +299 -0
  159. star_freight-1.0.1/src/portlight/engine/consequences.py +477 -0
  160. star_freight-1.0.1/src/portlight/engine/contracts.py +714 -0
  161. star_freight-1.0.1/src/portlight/engine/crew.py +616 -0
  162. star_freight-1.0.1/src/portlight/engine/cultural_knowledge.py +669 -0
  163. star_freight-1.0.1/src/portlight/engine/culture_engine.py +196 -0
  164. star_freight-1.0.1/src/portlight/engine/custom_captain.py +274 -0
  165. star_freight-1.0.1/src/portlight/engine/dogfood_runner.py +210 -0
  166. star_freight-1.0.1/src/portlight/engine/duel.py +205 -0
  167. star_freight-1.0.1/src/portlight/engine/economy.py +321 -0
  168. star_freight-1.0.1/src/portlight/engine/encounter.py +443 -0
  169. star_freight-1.0.1/src/portlight/engine/fleet.py +214 -0
  170. star_freight-1.0.1/src/portlight/engine/grid_combat.py +807 -0
  171. star_freight-1.0.1/src/portlight/engine/hunting.py +178 -0
  172. star_freight-1.0.1/src/portlight/engine/infrastructure.py +1255 -0
  173. star_freight-1.0.1/src/portlight/engine/injuries.py +185 -0
  174. star_freight-1.0.1/src/portlight/engine/investigation.py +1070 -0
  175. star_freight-1.0.1/src/portlight/engine/loot.py +138 -0
  176. star_freight-1.0.1/src/portlight/engine/merchant.py +142 -0
  177. star_freight-1.0.1/src/portlight/engine/models.py +653 -0
  178. star_freight-1.0.1/src/portlight/engine/narrative.py +817 -0
  179. star_freight-1.0.1/src/portlight/engine/naval.py +351 -0
  180. star_freight-1.0.1/src/portlight/engine/playtest.py +626 -0
  181. star_freight-1.0.1/src/portlight/engine/port_arrival_engine.py +222 -0
  182. star_freight-1.0.1/src/portlight/engine/reputation.py +368 -0
  183. star_freight-1.0.1/src/portlight/engine/save.py +1420 -0
  184. star_freight-1.0.1/src/portlight/engine/sea_culture_engine.py +389 -0
  185. star_freight-1.0.1/src/portlight/engine/sf_campaign.py +489 -0
  186. star_freight-1.0.1/src/portlight/engine/ship_stats.py +321 -0
  187. star_freight-1.0.1/src/portlight/engine/skill_engine.py +160 -0
  188. star_freight-1.0.1/src/portlight/engine/training.py +65 -0
  189. star_freight-1.0.1/src/portlight/engine/underworld.py +255 -0
  190. star_freight-1.0.1/src/portlight/engine/voyage.py +868 -0
  191. star_freight-1.0.1/src/portlight/engine/weapon_provenance.py +275 -0
  192. star_freight-1.0.1/src/portlight/engine/weapon_quality.py +327 -0
  193. star_freight-1.0.1/src/portlight/printandplay/__init__.py +1 -0
  194. star_freight-1.0.1/src/portlight/printandplay/assets.py +147 -0
  195. star_freight-1.0.1/src/portlight/printandplay/board.py +228 -0
  196. star_freight-1.0.1/src/portlight/printandplay/cards.py +403 -0
  197. star_freight-1.0.1/src/portlight/printandplay/generator.py +346 -0
  198. star_freight-1.0.1/src/portlight/printandplay/rules.py +312 -0
  199. star_freight-1.0.1/src/portlight/receipts/__init__.py +1 -0
  200. star_freight-1.0.1/src/portlight/receipts/core.py +45 -0
  201. star_freight-1.0.1/src/portlight/receipts/models.py +55 -0
  202. star_freight-1.0.1/src/portlight/stress/__init__.py +1 -0
  203. star_freight-1.0.1/src/portlight/stress/invariants.py +421 -0
  204. star_freight-1.0.1/src/portlight/stress/reporting.py +98 -0
  205. star_freight-1.0.1/src/portlight/stress/runner.py +157 -0
  206. star_freight-1.0.1/src/portlight/stress/scenarios.py +148 -0
  207. star_freight-1.0.1/src/portlight/stress/types.py +78 -0
  208. star_freight-1.0.1/tests/__init__.py +0 -0
  209. star_freight-1.0.1/tests/balance/__init__.py +0 -0
  210. star_freight-1.0.1/tests/balance/test_captain_parity.py +104 -0
  211. star_freight-1.0.1/tests/balance/test_finance_infra.py +79 -0
  212. star_freight-1.0.1/tests/balance/test_scenarios.py +130 -0
  213. star_freight-1.0.1/tests/balance/test_victory_paths.py +99 -0
  214. star_freight-1.0.1/tests/stress/__init__.py +0 -0
  215. star_freight-1.0.1/tests/stress/test_campaign_under_stress.py +227 -0
  216. star_freight-1.0.1/tests/stress/test_invariants.py +438 -0
  217. star_freight-1.0.1/tests/stress/test_save_load_crisis.py +395 -0
  218. star_freight-1.0.1/tests/stress/test_scenarios.py +133 -0
  219. star_freight-1.0.1/tests/test_armor.py +158 -0
  220. star_freight-1.0.1/tests/test_blacksmith_skill.py +259 -0
  221. star_freight-1.0.1/tests/test_bounty.py +108 -0
  222. star_freight-1.0.1/tests/test_breach.py +128 -0
  223. star_freight-1.0.1/tests/test_brokers_licenses.py +562 -0
  224. star_freight-1.0.1/tests/test_bugfixes.py +432 -0
  225. star_freight-1.0.1/tests/test_campaign.py +1280 -0
  226. star_freight-1.0.1/tests/test_captain_identity.py +358 -0
  227. star_freight-1.0.1/tests/test_captain_memory.py +329 -0
  228. star_freight-1.0.1/tests/test_captain_paths.py +346 -0
  229. star_freight-1.0.1/tests/test_captain_select.py +196 -0
  230. star_freight-1.0.1/tests/test_companions.py +316 -0
  231. star_freight-1.0.1/tests/test_consequences.py +208 -0
  232. star_freight-1.0.1/tests/test_contracts.py +754 -0
  233. star_freight-1.0.1/tests/test_convoy.py +92 -0
  234. star_freight-1.0.1/tests/test_credit.py +431 -0
  235. star_freight-1.0.1/tests/test_crew_binding.py +573 -0
  236. star_freight-1.0.1/tests/test_crew_roles.py +329 -0
  237. star_freight-1.0.1/tests/test_cross_port_networks.py +117 -0
  238. star_freight-1.0.1/tests/test_cultural_knowledge.py +571 -0
  239. star_freight-1.0.1/tests/test_culture.py +315 -0
  240. star_freight-1.0.1/tests/test_custom_captain.py +284 -0
  241. star_freight-1.0.1/tests/test_depth.py +334 -0
  242. star_freight-1.0.1/tests/test_dogfood_fixes.py +273 -0
  243. star_freight-1.0.1/tests/test_dogfood_runner.py +69 -0
  244. star_freight-1.0.1/tests/test_economy.py +311 -0
  245. star_freight-1.0.1/tests/test_encounter_flow.py +417 -0
  246. star_freight-1.0.1/tests/test_faction_politics.py +197 -0
  247. star_freight-1.0.1/tests/test_fighting_styles.py +256 -0
  248. star_freight-1.0.1/tests/test_fleet.py +267 -0
  249. star_freight-1.0.1/tests/test_grid_combat.py +784 -0
  250. star_freight-1.0.1/tests/test_hunting.py +130 -0
  251. star_freight-1.0.1/tests/test_infrastructure.py +516 -0
  252. star_freight-1.0.1/tests/test_injuries.py +274 -0
  253. star_freight-1.0.1/tests/test_insurance.py +459 -0
  254. star_freight-1.0.1/tests/test_investigation.py +540 -0
  255. star_freight-1.0.1/tests/test_loot.py +181 -0
  256. star_freight-1.0.1/tests/test_map.py +129 -0
  257. star_freight-1.0.1/tests/test_maritime_guard.py +163 -0
  258. star_freight-1.0.1/tests/test_melee_weapons.py +166 -0
  259. star_freight-1.0.1/tests/test_merchants.py +164 -0
  260. star_freight-1.0.1/tests/test_naval_combat.py +457 -0
  261. star_freight-1.0.1/tests/test_p1_tuning.py +549 -0
  262. star_freight-1.0.1/tests/test_personal_combat.py +638 -0
  263. star_freight-1.0.1/tests/test_pirate_ecosystem.py +376 -0
  264. star_freight-1.0.1/tests/test_port_arrival_engine.py +139 -0
  265. star_freight-1.0.1/tests/test_port_institutions.py +255 -0
  266. star_freight-1.0.1/tests/test_port_politics.py +170 -0
  267. star_freight-1.0.1/tests/test_printandplay.py +144 -0
  268. star_freight-1.0.1/tests/test_ranged_weapons.py +122 -0
  269. star_freight-1.0.1/tests/test_receipts.py +85 -0
  270. star_freight-1.0.1/tests/test_reputation.py +475 -0
  271. star_freight-1.0.1/tests/test_save.py +161 -0
  272. star_freight-1.0.1/tests/test_sea_culture.py +206 -0
  273. star_freight-1.0.1/tests/test_sea_culture_engine.py +201 -0
  274. star_freight-1.0.1/tests/test_seasons.py +167 -0
  275. star_freight-1.0.1/tests/test_session.py +345 -0
  276. star_freight-1.0.1/tests/test_ship_capture.py +152 -0
  277. star_freight-1.0.1/tests/test_ship_stats.py +274 -0
  278. star_freight-1.0.1/tests/test_sparing_flow.py +198 -0
  279. star_freight-1.0.1/tests/test_star_freight_content.py +730 -0
  280. star_freight-1.0.1/tests/test_tui_encounter.py +334 -0
  281. star_freight-1.0.1/tests/test_tui_integration.py +189 -0
  282. star_freight-1.0.1/tests/test_tui_smoke.py +205 -0
  283. star_freight-1.0.1/tests/test_tui_surfaces.py +443 -0
  284. star_freight-1.0.1/tests/test_tui_voyage_legacy.py +311 -0
  285. star_freight-1.0.1/tests/test_upgrades.py +200 -0
  286. star_freight-1.0.1/tests/test_vertical_slice.py +419 -0
  287. star_freight-1.0.1/tests/test_views.py +248 -0
  288. star_freight-1.0.1/tests/test_voyage.py +299 -0
  289. star_freight-1.0.1/tests/test_voyage_culture.py +182 -0
  290. star_freight-1.0.1/tests/test_weapon_provenance.py +243 -0
  291. star_freight-1.0.1/tests/test_weapon_quality.py +292 -0
  292. star_freight-1.0.1/tests/test_world.py +86 -0
  293. star_freight-1.0.1/verify +19 -0
  294. star_freight-1.0.1/world/ports/al-manar.json +402 -0
  295. star_freight-1.0.1/world/ports/coral-throne.json +379 -0
  296. star_freight-1.0.1/world/ports/corsairs-rest.json +314 -0
  297. star_freight-1.0.1/world/ports/crosswind-isle.json +346 -0
  298. star_freight-1.0.1/world/ports/dragons-gate.json +362 -0
  299. star_freight-1.0.1/world/ports/ember-isle.json +326 -0
  300. star_freight-1.0.1/world/ports/iron-point.json +192 -0
  301. star_freight-1.0.1/world/ports/ironhaven.json +303 -0
  302. star_freight-1.0.1/world/ports/jade-port.json +414 -0
  303. star_freight-1.0.1/world/ports/monsoon-reach.json +375 -0
  304. star_freight-1.0.1/world/ports/palm-cove.json +192 -0
  305. star_freight-1.0.1/world/ports/pearl-shallows.json +246 -0
  306. star_freight-1.0.1/world/ports/porto-novo.json +411 -0
  307. star_freight-1.0.1/world/ports/silk-haven.json +368 -0
  308. star_freight-1.0.1/world/ports/silva-bay.json +308 -0
  309. star_freight-1.0.1/world/ports/spice-narrows.json +360 -0
  310. star_freight-1.0.1/world/ports/stormwall.json +241 -0
  311. star_freight-1.0.1/world/ports/sun-harbor.json +273 -0
  312. star_freight-1.0.1/world/ports/thornport.json +237 -0
  313. star_freight-1.0.1/world/ports/typhoon-anchorage.json +323 -0
@@ -0,0 +1,59 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ paths:
6
+ - "src/**"
7
+ - "tests/**"
8
+ - "pyproject.toml"
9
+ - ".github/workflows/**"
10
+ pull_request:
11
+ paths:
12
+ - "src/**"
13
+ - "tests/**"
14
+ - "pyproject.toml"
15
+ - ".github/workflows/**"
16
+ workflow_dispatch:
17
+
18
+ concurrency:
19
+ group: ${{ github.workflow }}-${{ github.ref }}
20
+ cancel-in-progress: true
21
+
22
+ jobs:
23
+ test:
24
+ runs-on: ubuntu-latest
25
+ strategy:
26
+ matrix:
27
+ python-version: ["3.11", "3.12"]
28
+ steps:
29
+ - uses: actions/checkout@v4
30
+
31
+ - name: Set up Python ${{ matrix.python-version }}
32
+ uses: actions/setup-python@v5
33
+ with:
34
+ python-version: ${{ matrix.python-version }}
35
+
36
+ - name: Install dependencies
37
+ run: |
38
+ python -m pip install --upgrade pip
39
+ pip install -e ".[dev,tui]"
40
+
41
+ - name: Run tests
42
+ run: |
43
+ python -m pytest tests/ -x -q --ignore=tests/test_tui_voyage_legacy.py
44
+
45
+ - name: Run tests with coverage (3.12 only)
46
+ if: matrix.python-version == '3.12'
47
+ run: |
48
+ python -m pytest tests/ --cov=src/portlight --cov-report=xml --ignore=tests/test_tui_voyage_legacy.py
49
+
50
+ - name: Upload coverage
51
+ if: matrix.python-version == '3.12'
52
+ uses: codecov/codecov-action@v5
53
+ with:
54
+ file: coverage.xml
55
+ fail_ci_if_error: false
56
+
57
+ - name: Maritime term guard
58
+ run: |
59
+ python -m pytest tests/test_maritime_guard.py -v
@@ -0,0 +1,50 @@
1
+ name: Deploy site to GitHub Pages
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - 'site/**'
8
+ - '.github/workflows/pages.yml'
9
+ workflow_dispatch:
10
+
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ permissions:
16
+ contents: read
17
+ pages: write
18
+ id-token: write
19
+
20
+ jobs:
21
+ build:
22
+ runs-on: ubuntu-latest
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+
26
+ - uses: actions/setup-node@v4
27
+ with:
28
+ node-version: 22
29
+
30
+ - name: Install site dependencies
31
+ working-directory: site
32
+ run: npm ci
33
+
34
+ - name: Build site
35
+ working-directory: site
36
+ run: npm run build
37
+
38
+ - uses: actions/upload-pages-artifact@v3
39
+ with:
40
+ path: site/dist
41
+
42
+ deploy:
43
+ needs: build
44
+ runs-on: ubuntu-latest
45
+ environment:
46
+ name: github-pages
47
+ url: ${{ steps.deployment.outputs.page_url }}
48
+ steps:
49
+ - id: deployment
50
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,33 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch:
7
+
8
+ concurrency:
9
+ group: ${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ jobs:
13
+ publish:
14
+ runs-on: ubuntu-latest
15
+ environment: pypi
16
+ permissions:
17
+ id-token: write
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - name: Set up Python
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.12"
25
+
26
+ - name: Install build tools
27
+ run: python -m pip install --upgrade pip build
28
+
29
+ - name: Build wheel + sdist
30
+ run: python -m build
31
+
32
+ - name: Publish to PyPI
33
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,12 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .pytest_cache/
4
+ dist/
5
+ build/
6
+ *.egg-info/
7
+ saves/
8
+ .venv/
9
+ site/.astro/
10
+ site/dist/
11
+ site/node_modules/
12
+ .polyglot-cache.json
@@ -0,0 +1,110 @@
1
+ # Acceptance Criteria — Star Freight
2
+
3
+ > Derived directly from the 3 GDOS Proof Artifacts.
4
+ > These are not vague goals — they are explicit pass/fail conditions.
5
+ > The vertical slice ships when all three pass.
6
+
7
+ ---
8
+
9
+ ## Proof 1: Golden Path
10
+
11
+ **Tests:** The game feels like one captain's life, not three stacked systems.
12
+
13
+ ### Pass conditions:
14
+
15
+ 1. **Continuous session:** A 15–30 minute play session flows through trade, combat, culture, and narrative without hard mode switches or menu-wall transitions.
16
+
17
+ 2. **Pressure creates movement:** The player takes a contract not because it's the "next quest" but because crew pay is due, ship needs fuel, or a debt is closing in.
18
+
19
+ 3. **Trade feeds tactics:** A trade decision (accepting a risky route, carrying contraband, docking at a hostile station) directly creates or modifies a combat encounter.
20
+
21
+ 4. **Tactics feed plot:** A combat outcome (victory, loss, retreat) changes reputation, opens or closes a narrative lead, or shifts faction standing.
22
+
23
+ 5. **Plot feeds trade:** An investigation lead or narrative event changes which stations are safe, which goods are valuable, or which contacts are available.
24
+
25
+ 6. **Crew matters:** At least one moment where having a specific crew member changes available options (trade access, combat ability, cultural knowledge, or narrative lead).
26
+
27
+ 7. **State change:** The player ends the session in a measurably different campaign state: different credits, reputation, crew condition, knowledge, obligations, or investigation progress.
28
+
29
+ ### Fail conditions:
30
+
31
+ - Any system feels decorative (can be ignored without consequence)
32
+ - Combat can be avoided entirely with no tradeoff
33
+ - Trade is just "buy low, sell high" disconnected from narrative
34
+ - Plot feels like a separate quest log
35
+ - Crew members are interchangeable stat buffs
36
+
37
+ ---
38
+
39
+ ## Proof 2: Encounter
40
+
41
+ **Tests:** Combat is a campaign event, not a detached tactics minigame.
42
+
43
+ ### Pass conditions:
44
+
45
+ 1. **Causal origin:** The encounter exists because of a trade decision, faction standing, bounty status, contract obligation, or investigation pursuit — not random spawn.
46
+
47
+ 2. **Crew binding active:** At least one tactical option exists only because a specific crew member is present, and at least one option is unavailable because a crew member is absent or injured.
48
+
49
+ 3. **Cultural context:** Cultural knowledge affects at least one of: whether combat starts, deployment setup, available surrender terms, reinforcement likelihood, salvage legality, or reputation consequences.
50
+
51
+ 4. **Three valid outcomes:** Victory, loss, and retreat all produce distinct and interesting campaign state changes.
52
+
53
+ - **Victory:** Not just "credits and loot." Reputation shift, faction standing change, potential crew injury, investigation lead, or new obligation.
54
+ - **Loss:** Not "reload." Cargo seized, crew injured, ship damaged, forced to a specific station, reputation hit, debt incurred.
55
+ - **Retreat:** Not "free escape." Fuel/supply cost, reputation as coward, contract failure, route now dangerous, crew morale hit.
56
+
57
+ 5. **Compact resolution:** 5–8 turns. If it takes longer, the design is wrong.
58
+
59
+ 6. **Aftermath feeds loop:** After the encounter, the player's next trade/route/contract decision is materially different than it would have been before the fight.
60
+
61
+ ### Fail conditions:
62
+
63
+ - Combat feels like a random interruption
64
+ - Crew members don't change tactical options
65
+ - All three outcomes feel the same (just different numbers)
66
+ - The player can ignore encounters without consequence
67
+ - Encounter takes more than 10 turns regularly
68
+
69
+ ---
70
+
71
+ ## Proof 3: Economy
72
+
73
+ **Tests:** Pressure remains meaningful over repeated runs and different captain styles.
74
+
75
+ ### Pass conditions:
76
+
77
+ 1. **Early squeeze:** Hours 1–2 feel tight. The player cannot ignore crew pay, maintenance, or fuel. Contracts are taken out of need, not preference.
78
+
79
+ 2. **First momentum:** By hour 3–4, the player has made enough decisions that their captain has a visible economic identity: a preferred route, a trusted contact, a known culture, a recurring risk.
80
+
81
+ 3. **Viable paths:** Legal (merchant), gray (opportunist), and predatory (pirate) play are all economically sustainable. None is obviously dominant.
82
+
83
+ 4. **Setback recovery:** After a major loss (ship damage, cargo seizure, crew injury), recovery takes 2–4 play sessions, costs something real (dignity, time, leverage, or future options), and creates new decisions rather than dead air.
84
+
85
+ 5. **Late pressure:** By hour 6–8, the player has more capability but also more obligations. Pressure has changed shape (from survival to strategy) but not disappeared.
86
+
87
+ 6. **No chores:** Crew pay and maintenance create route/contract/allegiance decisions, not repetitive busywork. The player feels squeezed into choices, not squeezed into grind.
88
+
89
+ 7. **Anti-soft-lock:** A player who makes bad decisions can always recover. Recovery is ugly, slow, and interesting — never painless, never impossible.
90
+
91
+ 8. **Income curve:** Starting income ~200–400cr/run. By hour 6–8, income ~2000–4000cr/run. Growth comes from better routes, crew capability, cultural access, and reputation — not just bigger numbers.
92
+
93
+ ### Fail conditions:
94
+
95
+ - Player can grind one safe route forever without pressure
96
+ - Gray/pirate play is either broken or obviously dominant
97
+ - Setbacks create dead time (nothing to do while recovering)
98
+ - Late game has no pressure (player is rich and safe)
99
+ - Anti-soft-lock mechanism is invisible or breaks the economy
100
+ - Crew pay feels like a tax instead of a decision driver
101
+
102
+ ---
103
+
104
+ ## Verification Protocol
105
+
106
+ Each proof is verified by playing the game (or running a deterministic test harness) and checking every pass condition. A proof passes when ALL conditions are met. A proof fails if ANY fail condition is triggered.
107
+
108
+ The vertical slice (Phase 6) ships when all three proofs pass.
109
+
110
+ No proof is "close enough." Either the loop works or it doesn't.
@@ -0,0 +1,161 @@
1
+ # Build Plan — Star Freight
2
+
3
+ > Phase 0 is complete when the fork runs, the seams are mapped, and the build order is locked.
4
+ > Production phases are ordered by thesis risk, not feature completeness.
5
+
6
+ ---
7
+
8
+ ## Phase 0: Fork Truth (current)
9
+
10
+ **Goal:** Inherit Portlight, prove the fork runs, map every inherited vs new system.
11
+
12
+ - [x] Create repo (mcp-tool-shop-org/star-freight)
13
+ - [x] Copy Portlight source, tests, world data
14
+ - [x] Update pyproject.toml for Star Freight
15
+ - [x] Write FORK_MAP.md (inherited vs replaced vs new vs removed)
16
+ - [ ] Write ACCEPTANCE_CRITERIA.md (proof-derived pass conditions)
17
+ - [ ] Write STATE_MODEL.md (code-facing canonical state)
18
+ - [ ] Verify inherited tests pass (`pytest`)
19
+ - [ ] Initial commit and push
20
+ - [ ] Strip removed modules (printandplay, medieval weapons/armor, fleet)
21
+ - [ ] Verify tests still pass after strip
22
+
23
+ **Exit condition:** Fork runs green. Every system is tagged inherited/replace/new/remove. Build order is locked.
24
+
25
+ ---
26
+
27
+ ## Phase 1: Crew Binding Spine
28
+
29
+ **Goal:** Build the thesis seam. Crew members are the binding constraint across trade, tactics, and narrative.
30
+
31
+ **Why first:** If crew binding is weak, the game becomes three stacked systems. This is the single highest-risk design decision.
32
+
33
+ - [ ] Design crew data model (identity, abilities, cultural knowledge, loyalty, fitness, ship role)
34
+ - [ ] Implement crew roster management (recruit, dismiss, injury, recovery)
35
+ - [ ] Wire crew to trade (cultural access, negotiation modifiers, merchant relationships)
36
+ - [ ] Wire crew to combat (abilities determined by crew, absence limits options)
37
+ - [ ] Wire crew to narrative (crew unlock plot leads, cultural knowledge gates)
38
+ - [ ] Wire crew to ship (engineer → repair ability, gunner → weapon power, pilot → evasion)
39
+ - [ ] Crew morale and pressure (pay, injury, loyalty shifts, departure risk)
40
+ - [ ] Tests for all crew bindings
41
+
42
+ **Exit condition:** Adding/removing a crew member visibly changes trade options, combat abilities, and narrative access in a test harness.
43
+
44
+ ---
45
+
46
+ ## Phase 2: Grid Combat Engine
47
+
48
+ **Goal:** One tactical combat system that works for ground encounters and ship battles.
49
+
50
+ **Why second:** Combat is the second most visible system. It must be unified before content.
51
+
52
+ - [ ] Grid model (hex or square, obstacles, cover, positioning)
53
+ - [ ] Turn system (initiative, action points, move/attack/ability/item)
54
+ - [ ] Ground combat entities (crew as combatants, enemy archetypes)
55
+ - [ ] Ship combat entities (ships-as-characters, same grid, bigger numbers)
56
+ - [ ] Crew abilities wired to combat (determined by crew binding spine)
57
+ - [ ] Victory/loss/retreat with real state consequences
58
+ - [ ] Boarding transition (ship combat → ground combat mid-encounter)
59
+ - [ ] Encounter state machine (replaces Portlight's 4-phase escalation)
60
+ - [ ] Combat views (TUI grid renderer)
61
+ - [ ] Tests: full encounter with state change verification
62
+
63
+ **Exit condition:** Can play a ship encounter that transitions to boarding, with crew abilities active, and aftermath changes campaign state.
64
+
65
+ ---
66
+
67
+ ## Phase 3: Cultural Knowledge System
68
+
69
+ **Goal:** Civilizations feel alive and knowledge matters mechanically.
70
+
71
+ - [ ] Cultural knowledge model (per-civilization understanding level)
72
+ - [ ] Knowledge gates (trade access, diplomatic options, safe passage, ritual participation)
73
+ - [ ] Knowledge acquisition (crew members, time in culture, cultural events, study)
74
+ - [ ] Customs and consequences (violate customs → reputation damage, respect them → access)
75
+ - [ ] Civilization-specific mechanics (Keth seasons, Veshan debt, Orryn drift markets, Sable Reach silence protocols)
76
+ - [ ] Tests: cultural knowledge changes available options at a station
77
+
78
+ **Exit condition:** Player with Keth crew member can access Keth seasonal markets that a culturally ignorant player cannot.
79
+
80
+ ---
81
+
82
+ ## Phase 4: Investigation System
83
+
84
+ **Goal:** The conspiracy plot layer that gives the campaign its arc.
85
+
86
+ - [ ] Investigation state (leads, evidence, connections, dead ends)
87
+ - [ ] Lead acquisition (crew contacts, station events, trade encounters, faction relationships)
88
+ - [ ] Evidence gates (investigation progress unlocks plot beats)
89
+ - [ ] Investigation cost (time, reputation, money — the plot competes with survival)
90
+ - [ ] 10 investigation beats mapped to campaign progression
91
+ - [ ] Tests: investigation progress changes available narrative and gameplay options
92
+
93
+ **Exit condition:** Investigation feels like a real campaign thread with economic and political cost, not a separate quest log.
94
+
95
+ ---
96
+
97
+ ## Phase 5: Content Rewrite
98
+
99
+ **Goal:** Replace all Portlight content with Star Freight world.
100
+
101
+ - [ ] 5 civilizations fully defined in code (from Content Architecture)
102
+ - [ ] 20 stations (4 per civ) with markets, services, cultural rules
103
+ - [ ] Space lanes between stations with distance, risk, encounter tables
104
+ - [ ] 20 trade goods with civilization affinities
105
+ - [ ] Ship classes (sci-fi vessels replacing sailing ships)
106
+ - [ ] 7 crew members with full identity, abilities, cultural knowledge, loyalty arcs
107
+ - [ ] Contract families reskinned for sci-fi
108
+ - [ ] Encounter tables (pirates, patrols, faction conflicts, hazards)
109
+ - [ ] Station NPCs with cross-station relationships
110
+ - [ ] Transit events (replacing sea culture)
111
+
112
+ **Exit condition:** Portlight maritime content fully replaced. No medieval language, no ocean references, no sailing terminology in gameplay.
113
+
114
+ ---
115
+
116
+ ## Phase 6: Vertical Slice
117
+
118
+ **Goal:** Prove the three-layer loop works end to end.
119
+
120
+ - [ ] 5 stations (one per civ), 8 lanes, 5 trade goods
121
+ - [ ] 2 crew members recruited and wired
122
+ - [ ] 3 contract types available
123
+ - [ ] At least 1 ground combat and 1 ship combat encounter
124
+ - [ ] Cultural knowledge check at 1 station
125
+ - [ ] 1 investigation lead discoverable
126
+ - [ ] Economy runs for ~30 minutes of play without collapse
127
+ - [ ] All 3 acceptance criteria pass
128
+
129
+ **Exit condition:** Golden Path, Encounter, and Economy proofs all pass as playable sequences.
130
+
131
+ ---
132
+
133
+ ## Phase 7: Full Build
134
+
135
+ **Goal:** Scale from vertical slice to full game.
136
+
137
+ - [ ] All 20 stations live
138
+ - [ ] All 7 crew members recruitable
139
+ - [ ] Full investigation chain (10 beats)
140
+ - [ ] All 5 civilization cultural mechanics active
141
+ - [ ] Balance harness adapted and running
142
+ - [ ] Stress harness extended with new invariants
143
+ - [ ] Full playthrough possible: disgrace → merchant/pirate → resolution
144
+
145
+ **Exit condition:** The full designed game is playable. GDOS Thesis Lock is honored.
146
+
147
+ ---
148
+
149
+ ## Build Order Law
150
+
151
+ The order above is not arbitrary. It follows thesis risk:
152
+
153
+ 1. **Crew binding** — if this fails, no game
154
+ 2. **Combat** — if this is boring, players leave
155
+ 3. **Culture** — if this is shallow, the world is dead
156
+ 4. **Investigation** — if this is missing, no campaign arc
157
+ 5. **Content** — if this is wrong, it can be rewritten
158
+ 6. **Slice** — proof of integration
159
+ 7. **Full** — scale
160
+
161
+ Never skip ahead. Never build content before systems. Never build systems before the thesis seam.
@@ -0,0 +1,47 @@
1
+ # Changelog
2
+
3
+ All notable changes to Star Freight are documented here.
4
+
5
+ ## [1.0.0] - 2026-03-24
6
+
7
+ ### Added
8
+ - Complete game engine: crew binding, grid combat, cultural knowledge, investigation
9
+ - Campaign integration layer wiring all four system truths
10
+ - 3 expansion packs: Working Lives, Houses/Audits/Seizures, Shortages/Sanctions/Convoys
11
+ - 3 proved captain paths: Relief/Legitimacy, Gray/Document, Honor/Frontier
12
+ - 10 TUI view functions rendering from campaign state
13
+ - Star Freight TUI surface (StarFreightApp) with void palette
14
+ - Captain pressure bar (persistent header)
15
+ - Maritime term guard CI test (12 assertions)
16
+ - Dogfood system: 12-scenario matrix, 3 waves completed
17
+ - P1 economy tuning: credit ratio 4.78x (target 3-5x)
18
+ - Fear classifier: 3/3 distinct captain fears
19
+ - Scenario override system: danger_multiplier, initial_state support
20
+ - README in 8 languages, HANDBOOK as operating manual
21
+
22
+ ### Changed
23
+ - TUI cutover from Portlight (maritime) to Star Freight (space)
24
+ - App class: PortlightApp -> StarFreightApp
25
+ - Theme: ocean palette -> void palette
26
+ - Currency: silver -> credits (₡)
27
+ - Navigation: 12 maritime tabs -> 8 Star Freight tabs
28
+ - Station services: "shipyard" -> "drydock"
29
+
30
+ ### Fixed
31
+ - Scenario overrides now applied before simulation (not after)
32
+ - simulate_run respects starting station from initial_state
33
+ - Honor escalation stress now actually stresses (was mislabeled baseline)
34
+
35
+ ## [0.1.1-dogfood] - 2026-03-24
36
+
37
+ ### Fixed
38
+ - P1 tuning confirmed under corrected scenario infrastructure
39
+ - Wave 3: 8/8 pass criteria met
40
+
41
+ ## [0.1.0-dogfood] - 2026-03-23
42
+
43
+ ### Added
44
+ - Initial dogfood release
45
+ - GDOS game design framework
46
+ - All four system truth modules
47
+ - Wave 1 and Wave 2 dogfood runs
@@ -0,0 +1,105 @@
1
+ # Fork Map — Star Freight ← Portlight
2
+
3
+ > What we inherited, what we keep, what we replace, what we build new.
4
+ > This is the single source of truth for fork decisions.
5
+
6
+ ---
7
+
8
+ ## Inherited Intact (use as-is, reskin content only)
9
+
10
+ These systems are architecturally sound and map directly to the sci-fi setting.
11
+
12
+ | Portlight Module | Star Freight Role | Notes |
13
+ |---|---|---|
14
+ | `engine/economy.py` | Trade engine | Scarcity-ratio pricing, stock mutation, buy/sell receipts — identical mechanic, different goods |
15
+ | `engine/voyage.py` | Travel engine | Depart/advance/arrive state machine — "sailing" becomes "transit between stations" |
16
+ | `engine/contracts.py` | Contract system | 7 contract families map cleanly (procurement, smuggling, reputation charter, etc.) |
17
+ | `engine/reputation.py` | Reputation engine | Regional standing + commercial trust + decay — per-civilization instead of per-region |
18
+ | `engine/infrastructure.py` | Station services | Warehouses, broker offices, credit lines, insurance — rename, keep mechanics |
19
+ | `engine/models.py` | Core state schema | Dataclass foundation — extend, don't replace |
20
+ | `engine/save.py` | Save/load | JSON serialization — extend for new state |
21
+ | `engine/port_arrival_engine.py` | Station arrival | Dock → pay fee → refresh prices → offers — same flow |
22
+ | `engine/captain_identity.py` | Captain background | 9 archetypes → rework for military pilot backstory variants |
23
+ | `engine/narrative.py` | Milestone engine | Campaign milestone evaluation — extend for investigation |
24
+ | `engine/campaign.py` | Campaign state | Arc tracking, unlocks, victory conditions — extend |
25
+ | `engine/underworld.py` | Pirate factions | Faction standing, hostility — rename factions to sci-fi |
26
+ | `engine/loot.py` | Salvage/loot | Post-encounter drops — reskin |
27
+ | `balance/` | Balance harness | Seed-deterministic simulation with policy bots — invaluable, keep whole |
28
+ | `stress/` | Stress harness | Invariant checking per tick — keep, extend invariants |
29
+ | `receipts/` | Trade ledger | Deterministic receipt hashing — keep intact |
30
+
31
+ ## Must Be Replaced (same role, new implementation)
32
+
33
+ | Portlight Module | Why Replace | Star Freight Replacement |
34
+ |---|---|---|
35
+ | `engine/combat.py` | Stance-triangle melee doesn't fit sci-fi grid combat | New: grid-based tactical combat (shared for ground + ship) |
36
+ | `engine/duel.py` | Sword duel orchestrator — no equivalent in sci-fi | Remove entirely |
37
+ | `engine/naval.py` | Broadside/close/evade — ship combat is now grid combat with ships-as-characters | Replace with unified grid engine |
38
+ | `engine/encounter.py` | 4-phase naval escalation — replace with encounter → grid combat (ground or ship) | New encounter state machine |
39
+ | `engine/skill_engine.py` | Medieval skill tree — replace with crew ability system | New: crew binding spine |
40
+ | `engine/companion_engine.py` | Simple morale + role bonus — too thin for crew-as-binding-constraint | New: deep crew system (tactical + cultural + narrative) |
41
+ | `engine/culture_engine.py` | Sea culture flavor injection — replace with civilization knowledge system | New: cultural knowledge engine |
42
+ | `engine/sea_culture_engine.py` | Voyage-day flavor — replace with transit encounter system | New: transit event engine |
43
+ | `engine/injuries.py` | Personal injury tracking — extend to crew + ship damage model | New: unified damage/repair |
44
+ | `engine/hunting.py` | Forage/hunt at port — no direct equivalent | Remove or rethink as salvage ops |
45
+ | `engine/weapon_quality.py` | Melee weapon condition — no equivalent | Remove |
46
+ | `engine/weapon_provenance.py` | Weapon pedigree — no equivalent | Remove |
47
+ | `app/combat_views.py` | Duel rendering — replace with grid combat UI | New: grid combat renderer |
48
+ | `app/tui/screens/combat.py` | Stance selection screen — replace | New: tactical grid screen |
49
+ | `app/tui/screens/encounter.py` | Naval encounter flow — replace | New: encounter screen |
50
+
51
+ ## Must Be Built New (no Portlight equivalent)
52
+
53
+ | System | Design Doc Source | Priority |
54
+ |---|---|---|
55
+ | **Crew Binding Spine** | System Laws §Crew | **P0 — thesis seam** |
56
+ | **Grid Combat Engine** | System Laws §Combat | P1 — shared ground/ship |
57
+ | **Cultural Knowledge System** | System Laws §Cultural Knowledge | P2 — civilization depth |
58
+ | **Investigation System** | System Laws §Investigation | P3 — conspiracy plot layer |
59
+ | **Civilization Content** | Content Architecture (5 civs) | P1 — parallel with systems |
60
+ | **Ship-as-Character Model** | System Laws §Combat | P1 — unified with grid |
61
+ | **Debt Ledger (Veshan)** | Progression Economy §Veshan | P2 — civ-specific pressure |
62
+ | **The Telling (Keth)** | Content Architecture §Keth | P2 — civ-specific ritual |
63
+ | **Transit Events** | Experience Contract §sub-loop | P2 — replaces sea culture |
64
+
65
+ ## Remove (Portlight-specific, no Star Freight equivalent)
66
+
67
+ | Module | Reason |
68
+ |---|---|
69
+ | `printandplay/` | Board game generator — not applicable |
70
+ | `content/melee_weapons.py` | Medieval weapons |
71
+ | `content/ranged_weapons.py` | Medieval ranged |
72
+ | `content/armor.py` | Medieval armor |
73
+ | `content/fighting_styles.py` | Regional sword traditions |
74
+ | `content/sea_culture.py` | Maritime flavor text — replaced by civilization culture |
75
+ | `content/port_institutions.py` | Mediterranean institutions |
76
+ | `content/port_institutions_east.py` | East Indies institutions |
77
+ | `engine/fleet.py` | Multi-ship management (planned, never active) |
78
+ | All `world/ports/*.json` | Maritime port data — replaced by station data |
79
+
80
+ ## Content Reskin (keep structure, replace data)
81
+
82
+ | Content Module | Reskin Target |
83
+ |---|---|
84
+ | `content/ports.py` | 20 ports → 20 stations (4 per civilization) |
85
+ | `content/routes.py` | 65 sea routes → space lanes between stations |
86
+ | `content/goods.py` | 35 maritime goods → 20 sci-fi trade goods |
87
+ | `content/ships.py` | 5 ship classes → sci-fi vessel classes |
88
+ | `content/seasons.py` | 4 seasons → Keth seasonal cycle or remove |
89
+ | `content/companions.py` | 15 companions → 7 crew members (deeper) |
90
+ | `content/merchants.py` | Merchant archetypes → station vendor types |
91
+ | `content/factions.py` | 8 pirate factions → sci-fi criminal/rival factions |
92
+ | `content/contracts.py` | Contract templates → sci-fi contract families |
93
+ | `content/skills.py` | 10 skills → crew abilities |
94
+ | `content/upgrades.py` | Ship upgrades → sci-fi ship modules |
95
+ | `content/crew_roles.py` | Crew roles → Star Freight crew roles |
96
+
97
+ ---
98
+
99
+ ## Fork Rules
100
+
101
+ 1. **Inherit first.** Don't rewrite working systems that map cleanly.
102
+ 2. **Portlight is not sacred.** Anything that fights the sci-fi captain fantasy is provisional.
103
+ 3. **One combat engine.** Grid-based, shared between ground and ship. No mode split.
104
+ 4. **Crew is the new seam.** The companion system must be rebuilt from scratch — it's the thesis.
105
+ 5. **Content is the last step.** Systems first, then stations/goods/NPCs.