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.
- star_freight-1.0.1/.github/workflows/ci.yml +59 -0
- star_freight-1.0.1/.github/workflows/pages.yml +50 -0
- star_freight-1.0.1/.github/workflows/publish.yml +33 -0
- star_freight-1.0.1/.gitignore +12 -0
- star_freight-1.0.1/ACCEPTANCE_CRITERIA.md +110 -0
- star_freight-1.0.1/BUILD_PLAN.md +161 -0
- star_freight-1.0.1/CHANGELOG.md +47 -0
- star_freight-1.0.1/FORK_MAP.md +105 -0
- star_freight-1.0.1/HANDBOOK.md +302 -0
- star_freight-1.0.1/LICENSE +21 -0
- star_freight-1.0.1/PKG-INFO +163 -0
- star_freight-1.0.1/README.es.md +137 -0
- star_freight-1.0.1/README.fr.md +137 -0
- star_freight-1.0.1/README.hi.md +137 -0
- star_freight-1.0.1/README.it.md +137 -0
- star_freight-1.0.1/README.ja.md +137 -0
- star_freight-1.0.1/README.ko.md +86 -0
- star_freight-1.0.1/README.md +137 -0
- star_freight-1.0.1/README.pt-BR.md +137 -0
- star_freight-1.0.1/README.zh.md +137 -0
- star_freight-1.0.1/SCORECARD.md +49 -0
- star_freight-1.0.1/SECURITY.md +28 -0
- star_freight-1.0.1/SHIP_GATE.md +80 -0
- star_freight-1.0.1/STATE_MODEL.md +184 -0
- star_freight-1.0.1/design/00_THESIS_LOCK.md +103 -0
- star_freight-1.0.1/design/01_EXPERIENCE_CONTRACT.md +140 -0
- star_freight-1.0.1/design/02_SYSTEM_LAWS.md +465 -0
- star_freight-1.0.1/design/03_PROGRESSION_ECONOMY.md +287 -0
- star_freight-1.0.1/design/04_CONTENT_ARCHITECTURE.md +217 -0
- star_freight-1.0.1/design/05_INTERFACE_FEEL.md +572 -0
- star_freight-1.0.1/design/06_PRODUCTION_TRUTH.md +392 -0
- star_freight-1.0.1/design/CONTENT_PASS_HOUSES_AUDITS_SEIZURES.md +44 -0
- star_freight-1.0.1/design/CONTENT_PASS_SHORTAGES_SANCTIONS_CONVOYS.md +48 -0
- star_freight-1.0.1/design/CONTENT_PASS_WORKING_LIVES.md +38 -0
- star_freight-1.0.1/design/PLAYTEST_TUI_CHECKLIST.md +161 -0
- star_freight-1.0.1/design/PROOF_ECONOMY.md +532 -0
- star_freight-1.0.1/design/PROOF_ENCOUNTER.md +518 -0
- star_freight-1.0.1/design/PROOF_GOLDEN_PATH.md +562 -0
- star_freight-1.0.1/design/REGISTRY_CONTENT_BUDGET.md +133 -0
- star_freight-1.0.1/design/REGISTRY_CUTS.md +101 -0
- star_freight-1.0.1/design/REGISTRY_NUMBERS.md +171 -0
- star_freight-1.0.1/design/REGISTRY_RISKS.md +52 -0
- star_freight-1.0.1/design/REGISTRY_STATE_DICTIONARY.md +205 -0
- star_freight-1.0.1/design/TUI_SCREEN_AUDIT.md +217 -0
- star_freight-1.0.1/design/TUI_SURFACE_SPEC.md +370 -0
- star_freight-1.0.1/design/templates/CIV_INTERACTION.md +30 -0
- star_freight-1.0.1/design/templates/CONTENT_HEADER.md +29 -0
- star_freight-1.0.1/design/templates/CONTENT_PASS.md +39 -0
- star_freight-1.0.1/design/templates/CONTRACT.md +43 -0
- star_freight-1.0.1/design/templates/CREW.md +49 -0
- star_freight-1.0.1/design/templates/ENCOUNTER.md +45 -0
- star_freight-1.0.1/design/templates/INVESTIGATION_THREAD.md +53 -0
- star_freight-1.0.1/design/templates/LANE.md +45 -0
- star_freight-1.0.1/design/templates/STATION.md +54 -0
- star_freight-1.0.1/design/templates/TRADE_GOOD.md +34 -0
- star_freight-1.0.1/dogfood/DOGFOOD_MATRIX.md +97 -0
- star_freight-1.0.1/dogfood/DOGFOOD_REPORT_TEMPLATE.md +94 -0
- star_freight-1.0.1/dogfood/DOGFOOD_VERDICTS.md +89 -0
- star_freight-1.0.1/dogfood/WAVE1_VERDICT.md +153 -0
- star_freight-1.0.1/dogfood/WAVE2_VERDICT.md +139 -0
- star_freight-1.0.1/dogfood/WAVE3_VERDICT.md +97 -0
- star_freight-1.0.1/dogfood/run_wave1.py +156 -0
- star_freight-1.0.1/dogfood/run_wave2.py +192 -0
- star_freight-1.0.1/dogfood/run_wave3.py +334 -0
- star_freight-1.0.1/dogfood/scenarios/gray_baseline_90d_s42.json +19 -0
- star_freight-1.0.1/dogfood/scenarios/gray_seizure_60d_s17.json +22 -0
- star_freight-1.0.1/dogfood/scenarios/honor_baseline_90d_s42.json +19 -0
- star_freight-1.0.1/dogfood/scenarios/honor_escalation_60d_s17.json +25 -0
- star_freight-1.0.1/dogfood/scenarios/recovery_broke_hull_45d_s99.json +24 -0
- star_freight-1.0.1/dogfood/scenarios/recovery_burned_rep_45d_s99.json +24 -0
- star_freight-1.0.1/dogfood/scenarios/recovery_injured_crew_45d_s99.json +23 -0
- star_freight-1.0.1/dogfood/scenarios/relief_baseline_90d_s42.json +19 -0
- star_freight-1.0.1/dogfood/scenarios/relief_shortage_60d_s17.json +23 -0
- star_freight-1.0.1/dogfood/scenarios/tui_combat_heavy_s01.json +22 -0
- star_freight-1.0.1/dogfood/scenarios/tui_first_hour_s01.json +20 -0
- star_freight-1.0.1/dogfood/scenarios/tui_investigation_s01.json +20 -0
- star_freight-1.0.1/dogfood/wave1_results.json +1019 -0
- star_freight-1.0.1/dogfood/wave2_results.json +64 -0
- star_freight-1.0.1/dogfood/wave3_results.json +122 -0
- star_freight-1.0.1/logo.png +0 -0
- star_freight-1.0.1/pyproject.toml +41 -0
- star_freight-1.0.1/site/astro.config.mjs +30 -0
- star_freight-1.0.1/site/package-lock.json +7898 -0
- star_freight-1.0.1/site/package.json +18 -0
- star_freight-1.0.1/site/src/content/docs/handbook/captain-paths.md +50 -0
- star_freight-1.0.1/site/src/content/docs/handbook/getting-started.md +49 -0
- star_freight-1.0.1/site/src/content/docs/handbook/index.md +26 -0
- star_freight-1.0.1/site/src/content/docs/handbook/reference.md +96 -0
- star_freight-1.0.1/site/src/content/docs/handbook/the-world.md +49 -0
- star_freight-1.0.1/site/src/content.config.ts +4 -0
- star_freight-1.0.1/site/src/pages/index.astro +33 -0
- star_freight-1.0.1/site/src/site-config.ts +88 -0
- star_freight-1.0.1/site/src/styles/global.css +3 -0
- star_freight-1.0.1/site/src/styles/starlight-custom.css +18 -0
- star_freight-1.0.1/site/tsconfig.json +5 -0
- star_freight-1.0.1/src/portlight/__init__.py +3 -0
- star_freight-1.0.1/src/portlight/__main__.py +5 -0
- star_freight-1.0.1/src/portlight/app/__init__.py +1 -0
- star_freight-1.0.1/src/portlight/app/cli.py +3156 -0
- star_freight-1.0.1/src/portlight/app/combat_views.py +760 -0
- star_freight-1.0.1/src/portlight/app/formatting.py +183 -0
- star_freight-1.0.1/src/portlight/app/session.py +1201 -0
- star_freight-1.0.1/src/portlight/app/sf_views.py +907 -0
- star_freight-1.0.1/src/portlight/app/tui/__init__.py +1 -0
- star_freight-1.0.1/src/portlight/app/tui/app.py +158 -0
- star_freight-1.0.1/src/portlight/app/tui/screens/__init__.py +1 -0
- star_freight-1.0.1/src/portlight/app/tui/screens/combat.py +149 -0
- star_freight-1.0.1/src/portlight/app/tui/screens/dashboard.py +274 -0
- star_freight-1.0.1/src/portlight/app/tui/screens/encounter.py +712 -0
- star_freight-1.0.1/src/portlight/app/tui/screens/market.py +213 -0
- star_freight-1.0.1/src/portlight/app/tui/screens/routes.py +208 -0
- star_freight-1.0.1/src/portlight/app/tui/theme.py +268 -0
- star_freight-1.0.1/src/portlight/app/views.py +2126 -0
- star_freight-1.0.1/src/portlight/balance/__init__.py +1 -0
- star_freight-1.0.1/src/portlight/balance/aggregates.py +160 -0
- star_freight-1.0.1/src/portlight/balance/collectors.py +210 -0
- star_freight-1.0.1/src/portlight/balance/policies.py +915 -0
- star_freight-1.0.1/src/portlight/balance/reporting.py +241 -0
- star_freight-1.0.1/src/portlight/balance/runner.py +211 -0
- star_freight-1.0.1/src/portlight/balance/scenarios.py +77 -0
- star_freight-1.0.1/src/portlight/balance/types.py +202 -0
- star_freight-1.0.1/src/portlight/content/__init__.py +1 -0
- star_freight-1.0.1/src/portlight/content/armor.py +107 -0
- star_freight-1.0.1/src/portlight/content/campaign.py +386 -0
- star_freight-1.0.1/src/portlight/content/companions.py +303 -0
- star_freight-1.0.1/src/portlight/content/contracts.py +468 -0
- star_freight-1.0.1/src/portlight/content/crew_roles.py +94 -0
- star_freight-1.0.1/src/portlight/content/cross_port_networks.py +445 -0
- star_freight-1.0.1/src/portlight/content/culture.py +657 -0
- star_freight-1.0.1/src/portlight/content/factions.py +494 -0
- star_freight-1.0.1/src/portlight/content/fighting_styles.py +393 -0
- star_freight-1.0.1/src/portlight/content/goods.py +45 -0
- star_freight-1.0.1/src/portlight/content/infrastructure.py +442 -0
- star_freight-1.0.1/src/portlight/content/injuries.py +157 -0
- star_freight-1.0.1/src/portlight/content/loot_tables.py +192 -0
- star_freight-1.0.1/src/portlight/content/melee_weapons.py +140 -0
- star_freight-1.0.1/src/portlight/content/merchants.py +213 -0
- star_freight-1.0.1/src/portlight/content/officer_names.py +50 -0
- star_freight-1.0.1/src/portlight/content/port_institutions.py +4407 -0
- star_freight-1.0.1/src/portlight/content/port_institutions_east.py +797 -0
- star_freight-1.0.1/src/portlight/content/port_politics.py +533 -0
- star_freight-1.0.1/src/portlight/content/ports.py +454 -0
- star_freight-1.0.1/src/portlight/content/ranged_weapons.py +214 -0
- star_freight-1.0.1/src/portlight/content/routes.py +119 -0
- star_freight-1.0.1/src/portlight/content/sea_culture.py +808 -0
- star_freight-1.0.1/src/portlight/content/seasons.py +306 -0
- star_freight-1.0.1/src/portlight/content/ships.py +113 -0
- star_freight-1.0.1/src/portlight/content/skills.py +155 -0
- star_freight-1.0.1/src/portlight/content/star_freight.py +1448 -0
- star_freight-1.0.1/src/portlight/content/upgrades.py +159 -0
- star_freight-1.0.1/src/portlight/content/world.py +89 -0
- star_freight-1.0.1/src/portlight/engine/__init__.py +1 -0
- star_freight-1.0.1/src/portlight/engine/bounty.py +126 -0
- star_freight-1.0.1/src/portlight/engine/campaign.py +1304 -0
- star_freight-1.0.1/src/portlight/engine/captain_identity.py +719 -0
- star_freight-1.0.1/src/portlight/engine/captain_memory.py +419 -0
- star_freight-1.0.1/src/portlight/engine/combat.py +927 -0
- star_freight-1.0.1/src/portlight/engine/companion_engine.py +299 -0
- star_freight-1.0.1/src/portlight/engine/consequences.py +477 -0
- star_freight-1.0.1/src/portlight/engine/contracts.py +714 -0
- star_freight-1.0.1/src/portlight/engine/crew.py +616 -0
- star_freight-1.0.1/src/portlight/engine/cultural_knowledge.py +669 -0
- star_freight-1.0.1/src/portlight/engine/culture_engine.py +196 -0
- star_freight-1.0.1/src/portlight/engine/custom_captain.py +274 -0
- star_freight-1.0.1/src/portlight/engine/dogfood_runner.py +210 -0
- star_freight-1.0.1/src/portlight/engine/duel.py +205 -0
- star_freight-1.0.1/src/portlight/engine/economy.py +321 -0
- star_freight-1.0.1/src/portlight/engine/encounter.py +443 -0
- star_freight-1.0.1/src/portlight/engine/fleet.py +214 -0
- star_freight-1.0.1/src/portlight/engine/grid_combat.py +807 -0
- star_freight-1.0.1/src/portlight/engine/hunting.py +178 -0
- star_freight-1.0.1/src/portlight/engine/infrastructure.py +1255 -0
- star_freight-1.0.1/src/portlight/engine/injuries.py +185 -0
- star_freight-1.0.1/src/portlight/engine/investigation.py +1070 -0
- star_freight-1.0.1/src/portlight/engine/loot.py +138 -0
- star_freight-1.0.1/src/portlight/engine/merchant.py +142 -0
- star_freight-1.0.1/src/portlight/engine/models.py +653 -0
- star_freight-1.0.1/src/portlight/engine/narrative.py +817 -0
- star_freight-1.0.1/src/portlight/engine/naval.py +351 -0
- star_freight-1.0.1/src/portlight/engine/playtest.py +626 -0
- star_freight-1.0.1/src/portlight/engine/port_arrival_engine.py +222 -0
- star_freight-1.0.1/src/portlight/engine/reputation.py +368 -0
- star_freight-1.0.1/src/portlight/engine/save.py +1420 -0
- star_freight-1.0.1/src/portlight/engine/sea_culture_engine.py +389 -0
- star_freight-1.0.1/src/portlight/engine/sf_campaign.py +489 -0
- star_freight-1.0.1/src/portlight/engine/ship_stats.py +321 -0
- star_freight-1.0.1/src/portlight/engine/skill_engine.py +160 -0
- star_freight-1.0.1/src/portlight/engine/training.py +65 -0
- star_freight-1.0.1/src/portlight/engine/underworld.py +255 -0
- star_freight-1.0.1/src/portlight/engine/voyage.py +868 -0
- star_freight-1.0.1/src/portlight/engine/weapon_provenance.py +275 -0
- star_freight-1.0.1/src/portlight/engine/weapon_quality.py +327 -0
- star_freight-1.0.1/src/portlight/printandplay/__init__.py +1 -0
- star_freight-1.0.1/src/portlight/printandplay/assets.py +147 -0
- star_freight-1.0.1/src/portlight/printandplay/board.py +228 -0
- star_freight-1.0.1/src/portlight/printandplay/cards.py +403 -0
- star_freight-1.0.1/src/portlight/printandplay/generator.py +346 -0
- star_freight-1.0.1/src/portlight/printandplay/rules.py +312 -0
- star_freight-1.0.1/src/portlight/receipts/__init__.py +1 -0
- star_freight-1.0.1/src/portlight/receipts/core.py +45 -0
- star_freight-1.0.1/src/portlight/receipts/models.py +55 -0
- star_freight-1.0.1/src/portlight/stress/__init__.py +1 -0
- star_freight-1.0.1/src/portlight/stress/invariants.py +421 -0
- star_freight-1.0.1/src/portlight/stress/reporting.py +98 -0
- star_freight-1.0.1/src/portlight/stress/runner.py +157 -0
- star_freight-1.0.1/src/portlight/stress/scenarios.py +148 -0
- star_freight-1.0.1/src/portlight/stress/types.py +78 -0
- star_freight-1.0.1/tests/__init__.py +0 -0
- star_freight-1.0.1/tests/balance/__init__.py +0 -0
- star_freight-1.0.1/tests/balance/test_captain_parity.py +104 -0
- star_freight-1.0.1/tests/balance/test_finance_infra.py +79 -0
- star_freight-1.0.1/tests/balance/test_scenarios.py +130 -0
- star_freight-1.0.1/tests/balance/test_victory_paths.py +99 -0
- star_freight-1.0.1/tests/stress/__init__.py +0 -0
- star_freight-1.0.1/tests/stress/test_campaign_under_stress.py +227 -0
- star_freight-1.0.1/tests/stress/test_invariants.py +438 -0
- star_freight-1.0.1/tests/stress/test_save_load_crisis.py +395 -0
- star_freight-1.0.1/tests/stress/test_scenarios.py +133 -0
- star_freight-1.0.1/tests/test_armor.py +158 -0
- star_freight-1.0.1/tests/test_blacksmith_skill.py +259 -0
- star_freight-1.0.1/tests/test_bounty.py +108 -0
- star_freight-1.0.1/tests/test_breach.py +128 -0
- star_freight-1.0.1/tests/test_brokers_licenses.py +562 -0
- star_freight-1.0.1/tests/test_bugfixes.py +432 -0
- star_freight-1.0.1/tests/test_campaign.py +1280 -0
- star_freight-1.0.1/tests/test_captain_identity.py +358 -0
- star_freight-1.0.1/tests/test_captain_memory.py +329 -0
- star_freight-1.0.1/tests/test_captain_paths.py +346 -0
- star_freight-1.0.1/tests/test_captain_select.py +196 -0
- star_freight-1.0.1/tests/test_companions.py +316 -0
- star_freight-1.0.1/tests/test_consequences.py +208 -0
- star_freight-1.0.1/tests/test_contracts.py +754 -0
- star_freight-1.0.1/tests/test_convoy.py +92 -0
- star_freight-1.0.1/tests/test_credit.py +431 -0
- star_freight-1.0.1/tests/test_crew_binding.py +573 -0
- star_freight-1.0.1/tests/test_crew_roles.py +329 -0
- star_freight-1.0.1/tests/test_cross_port_networks.py +117 -0
- star_freight-1.0.1/tests/test_cultural_knowledge.py +571 -0
- star_freight-1.0.1/tests/test_culture.py +315 -0
- star_freight-1.0.1/tests/test_custom_captain.py +284 -0
- star_freight-1.0.1/tests/test_depth.py +334 -0
- star_freight-1.0.1/tests/test_dogfood_fixes.py +273 -0
- star_freight-1.0.1/tests/test_dogfood_runner.py +69 -0
- star_freight-1.0.1/tests/test_economy.py +311 -0
- star_freight-1.0.1/tests/test_encounter_flow.py +417 -0
- star_freight-1.0.1/tests/test_faction_politics.py +197 -0
- star_freight-1.0.1/tests/test_fighting_styles.py +256 -0
- star_freight-1.0.1/tests/test_fleet.py +267 -0
- star_freight-1.0.1/tests/test_grid_combat.py +784 -0
- star_freight-1.0.1/tests/test_hunting.py +130 -0
- star_freight-1.0.1/tests/test_infrastructure.py +516 -0
- star_freight-1.0.1/tests/test_injuries.py +274 -0
- star_freight-1.0.1/tests/test_insurance.py +459 -0
- star_freight-1.0.1/tests/test_investigation.py +540 -0
- star_freight-1.0.1/tests/test_loot.py +181 -0
- star_freight-1.0.1/tests/test_map.py +129 -0
- star_freight-1.0.1/tests/test_maritime_guard.py +163 -0
- star_freight-1.0.1/tests/test_melee_weapons.py +166 -0
- star_freight-1.0.1/tests/test_merchants.py +164 -0
- star_freight-1.0.1/tests/test_naval_combat.py +457 -0
- star_freight-1.0.1/tests/test_p1_tuning.py +549 -0
- star_freight-1.0.1/tests/test_personal_combat.py +638 -0
- star_freight-1.0.1/tests/test_pirate_ecosystem.py +376 -0
- star_freight-1.0.1/tests/test_port_arrival_engine.py +139 -0
- star_freight-1.0.1/tests/test_port_institutions.py +255 -0
- star_freight-1.0.1/tests/test_port_politics.py +170 -0
- star_freight-1.0.1/tests/test_printandplay.py +144 -0
- star_freight-1.0.1/tests/test_ranged_weapons.py +122 -0
- star_freight-1.0.1/tests/test_receipts.py +85 -0
- star_freight-1.0.1/tests/test_reputation.py +475 -0
- star_freight-1.0.1/tests/test_save.py +161 -0
- star_freight-1.0.1/tests/test_sea_culture.py +206 -0
- star_freight-1.0.1/tests/test_sea_culture_engine.py +201 -0
- star_freight-1.0.1/tests/test_seasons.py +167 -0
- star_freight-1.0.1/tests/test_session.py +345 -0
- star_freight-1.0.1/tests/test_ship_capture.py +152 -0
- star_freight-1.0.1/tests/test_ship_stats.py +274 -0
- star_freight-1.0.1/tests/test_sparing_flow.py +198 -0
- star_freight-1.0.1/tests/test_star_freight_content.py +730 -0
- star_freight-1.0.1/tests/test_tui_encounter.py +334 -0
- star_freight-1.0.1/tests/test_tui_integration.py +189 -0
- star_freight-1.0.1/tests/test_tui_smoke.py +205 -0
- star_freight-1.0.1/tests/test_tui_surfaces.py +443 -0
- star_freight-1.0.1/tests/test_tui_voyage_legacy.py +311 -0
- star_freight-1.0.1/tests/test_upgrades.py +200 -0
- star_freight-1.0.1/tests/test_vertical_slice.py +419 -0
- star_freight-1.0.1/tests/test_views.py +248 -0
- star_freight-1.0.1/tests/test_voyage.py +299 -0
- star_freight-1.0.1/tests/test_voyage_culture.py +182 -0
- star_freight-1.0.1/tests/test_weapon_provenance.py +243 -0
- star_freight-1.0.1/tests/test_weapon_quality.py +292 -0
- star_freight-1.0.1/tests/test_world.py +86 -0
- star_freight-1.0.1/verify +19 -0
- star_freight-1.0.1/world/ports/al-manar.json +402 -0
- star_freight-1.0.1/world/ports/coral-throne.json +379 -0
- star_freight-1.0.1/world/ports/corsairs-rest.json +314 -0
- star_freight-1.0.1/world/ports/crosswind-isle.json +346 -0
- star_freight-1.0.1/world/ports/dragons-gate.json +362 -0
- star_freight-1.0.1/world/ports/ember-isle.json +326 -0
- star_freight-1.0.1/world/ports/iron-point.json +192 -0
- star_freight-1.0.1/world/ports/ironhaven.json +303 -0
- star_freight-1.0.1/world/ports/jade-port.json +414 -0
- star_freight-1.0.1/world/ports/monsoon-reach.json +375 -0
- star_freight-1.0.1/world/ports/palm-cove.json +192 -0
- star_freight-1.0.1/world/ports/pearl-shallows.json +246 -0
- star_freight-1.0.1/world/ports/porto-novo.json +411 -0
- star_freight-1.0.1/world/ports/silk-haven.json +368 -0
- star_freight-1.0.1/world/ports/silva-bay.json +308 -0
- star_freight-1.0.1/world/ports/spice-narrows.json +360 -0
- star_freight-1.0.1/world/ports/stormwall.json +241 -0
- star_freight-1.0.1/world/ports/sun-harbor.json +273 -0
- star_freight-1.0.1/world/ports/thornport.json +237 -0
- 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,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.
|