diff --git a/README.md b/README.md new file mode 100644 index 0000000..0bd6485 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# OpenKKnD + +Greenfield **original** RTS. Private origin: `OpenKKnD`. In-game title: **Pitchwell**. + +KKnD-*like loop* (resource, base, tech, HD briefings) — **different game**. Factions: **Crooked Staff** vs **Rust Host**. + +- Code: BSD-3-Clause (to be added) +- Media: own / CC-BY-NC* / CC0 only +- Engine: Godot 4 (free) +- Multiplayer: ENet (`docs/GAMEPLAY.md`) +- Briefings: original video **≥1280×720** + +| Doc | | +|-----|---| +| `docs/IP-FENCE.md` | Allowed / forbidden IP | +| `docs/GAMEPLAY.md` | Loop, economy, campaign, MP | +| `docs/FACTIONS.md` | Rosters, counters, ids | + +Stop-line for agents: no Nintendo names, no KKnD assets, no `git push`. + +## Smoke (Deltoid D1–D3) + +```bash +./scripts/smoke/run_all.sh +``` + +Headless tick · IP-FENCE scan · Pitch economy sim (`game/sim/`). Notes: `kitchen/patches/`. diff --git a/REPORT-pitchwell.txt b/REPORT-pitchwell.txt new file mode 100644 index 0000000..515ff9b --- /dev/null +++ b/REPORT-pitchwell.txt @@ -0,0 +1,10 @@ +STATUS=ok +HOST=magikoopa +UTC=2026-09-05T14:30:38Z +OPENKKND_ROOT=/Users/newkamek/git/src/OpenKKnD +ffmpeg=/opt/homebrew/bin/ffmpeg +stub_mp4=/Users/newkamek/git/src/OpenKKnD/assets/cinematics/first-contact/out/first-contact-stub.mp4 +ffprobe=1280,720,24/1 +docs_ip_fence=yes +notes=magikoopa preflight — seed+stub OK; clementine execute still open (no SSH from here) +tried=make_stub.sh + ffprobe diff --git a/assets/cinematics/first-contact/META.json b/assets/cinematics/first-contact/META.json new file mode 100644 index 0000000..069b2b5 --- /dev/null +++ b/assets/cinematics/first-contact/META.json @@ -0,0 +1 @@ +{"id":"first-contact","width":1280,"height":720,"fps":24,"seconds":6,"license":"original","pipeline":"ffmpeg-stub"} diff --git a/assets/cinematics/first-contact/out/first-contact-stub.mp4 b/assets/cinematics/first-contact/out/first-contact-stub.mp4 new file mode 100644 index 0000000..792ce53 Binary files /dev/null and b/assets/cinematics/first-contact/out/first-contact-stub.mp4 differ diff --git a/docs/CINEMATICS.md b/docs/CINEMATICS.md new file mode 100644 index 0000000..b6e4926 --- /dev/null +++ b/docs/CINEMATICS.md @@ -0,0 +1,21 @@ +# Cinematics — OpenKKnD / Pitchwell + +Original briefing clips only. **≥1280×720**, **≥24 fps**, **≥6 s**. Not 480p. No KKnD FMV, no Nintendo likeness. + +## META.json (per clip) + +```json +{ + "id": "first-contact", + "width": 1280, + "height": 720, + "fps": 24, + "seconds": 6, + "license": "original", + "pipeline": "ffmpeg-stub" +} +``` + +Output: `assets/cinematics//out/` + `META.json`. + +Stub: `scripts/cinematics/make_stub.sh` diff --git a/docs/FACTIONS.md b/docs/FACTIONS.md new file mode 100644 index 0000000..9b955e5 --- /dev/null +++ b/docs/FACTIONS.md @@ -0,0 +1,117 @@ +# Pitchwell — factions + +Two sides. No third. Names below are **the** roster — do not alias them to other games. + +| | **Crooked Staff** | **Rust Host** | +|--|-------------------|---------------| +| Color | Hood-violet `#8C40D9` | Slag-grey `#73808C` | +| HQ | **Bent Keep** | **Scrap Spire** | +| Worker | **Well-Walker** | **Sump-Rig** | +| Drop-off | **Pitch Font** | **Sump Press** | +| Feel | Fragile, splash, woods | Armored, shells, flats | +| Unique | **Ley** — regen + range on cracks | **Salvage** — wrecks → Pitch | +| Super | **Eclipse Rite** (map hex, 8 s) | **Core Dump** (EMP + fire, 6 s) | + +Banned in all copy, VO, and filenames: Nintendo names (incl. mage-turtle staff-casters), KKnD / KKnD2 / Xtreme faction and unit names, OpenKrush packs. + +## Crooked Staff + +Hooded wand-magi. Timber keeps, crooked at the joint. They do not wear crowns; the **Bent Keep** is a hall of staves. + +**Trait — Ley.** Claimed **ley cracks** (map props) grant nearby Staff Hide/Ward +4 HP/s and +15% range. Host gets nothing. Hexer can paint a 4 s snare disk (no damage). Fonts and Keeps can be **warded** once (absorb one shell volley). + +### Buildings + +| Id | Role | Pitch | Time | Tier | +|----|------|------:|-----:|------| +| `bent_keep` | HQ, 5 rally, drop-off | — | — | 1 | +| `pitch_font` | Well drop-off, holds seep | 120 | 15 s | 1 | +| `coven_yard` | T1 / T2 infantry | 180 | 20 s | 1 | +| `cot_hall` | +8 pop | 80 | 12 s | 1 | +| `ward_post` | Turret, Ward armor, hex bolts | 150 | 18 s | 1 | +| `beast_pens` | Crookhound, Gutter Wyrm | 220 | 22 s | 2 | +| `hex_circle` | Unlocks T2, Hexer, Ley-Cart | 250 | 25 s | 2 | +| `rookery` | Air | 280 | 28 s | 3 | +| `eclipse_spire` | Super charge | 600 | 45 s | 3 | + +### Units + +| Id | Role | Armor | vs | Pitch | Notes | +|----|------|-------|----|------:|-------| +| `well_walker` | Gather + build | Hide | scout | 50 | Slow harvest, full speed in woods | +| `acolyte` | T1 bolt | Hide | Hide | 75 | Cheap swarm | +| `crookhound` | Scout / chase | Hide | workers | 100 | +20% fog sight | +| `hexer` | T2 splash + snare | Ward | Hide, clumps | 220 | Dies to shells | +| `warder` | AA / escort | Ward | Air | 200 | Weak vs Plate | +| `ley_cart` | Rolling artillery | Plate | Plate, buildings | 320 | Unpacks 2 s | +| `gutter_wyrm` | Siege beast | Hide | buildings | 500 | Melee, ground only | +| `kite_familiar` | Air scout | Air | — | 180 | Tiny HP | +| `storm_hood` | Air attack | Air | Hide, Air | 420 | Loses to Rotor-Can flak | + +**Closer:** Eclipse Rite — 12 s visible sky-darken, then 8 s hex disk (heavy vs Hide, mild vs Plate). Walk out. + +Open: 2 Fonts, Cot, Yard, 6 Acolytes, 2 Hounds, then Hex Circle. Do not mass Wyrms before AA is answered. + +## Rust Host + +Scrap machines. Captains in cages. The **Scrap Spire** is a crane-stack that never quite stands straight. + +**Trait — Salvage.** Dead vehicles and turrets leave a **wreck pile** (15 s). A Sump-Rig ordered onto it yields 25 Pitch and clears the pile. Track Barn repairs 8 HP/s in radius. **Shield-Can** deploys a cover disk (Plate buff, −30% speed). + +### Buildings + +| Id | Role | Pitch | Time | Tier | +|----|------|------:|-----:|------| +| `scrap_spire` | HQ, 5 rally, drop-off | — | — | 1 | +| `sump_press` | Well drop-off, holds seep | 120 | 15 s | 1 | +| `bolt_hall` | T1 / T2 infantry | 180 | 20 s | 1 | +| `frame_rack` | +8 pop | 80 | 12 s | 1 | +| `can_turret` | Turret, Plate, shells | 150 | 18 s | 1 | +| `track_barn` | Vehicles + repair aura | 240 | 24 s | 2 | +| `dynamo` | Unlocks T2, Howl, Breaker | 250 | 25 s | 2 | +| `rotor_deck` | Air | 280 | 28 s | 3 | +| `core_stack` | Super charge | 600 | 45 s | 3 | + +### Units + +| Id | Role | Armor | vs | Pitch | Notes | +|----|------|-------|----|------:|-------| +| `sump_rig` | Gather + build | Plate | scout | 50 | Fast harvest, slow in woods | +| `bolt_hand` | T1 small-arms | Plate | Hide | 80 | Tougher, slower than Acolyte | +| `rattle_scout` | Wheeled scout | Plate | workers | 110 | Bad in woods | +| `shield_can` | Armored inf, deploy | Plate | bolt | 210 | Cover disk | +| `rattle_track` | Medium tank | Plate | Plate | 280 | Front-line | +| `junk_howl` | Artillery | Plate | buildings, Ward | 340 | Min range 4 | +| `breaker` | Siege ram | Plate | HQ, turrets | 520 | Melee | +| `rotor_can` | Air flak + ground | Air | Air, Hide | 400 | Loses to mass Warders | +| `sky_hook` | Lift / drop | Air | — | 380 | Carries 1 vehicle; no attack | + +**Closer:** Core Dump — 10 s siren, then 6 s EMP (vehicles/air stop) + fire on buildings. Staff Hexers still shoot. + +Open: Press on well, Rack, Hall, 5 Bolt-Hands, 1 Scout, Dynamo, first Rattle-Track. Salvage every wreck. + +## Counter sheet + +| If you see | Staff answers | Host answers | +|------------|---------------|--------------| +| Mass T1 inf | Hexer splash | Shield-Can + Howl | +| Tanks | Ley-Cart + woods kite | More Tracks + salvage | +| Siege | Storm-Hood / Hound raid | Rotor-Can / Scout raid | +| Air | Warder | Rotor-Can | +| Super charge | Walk out; snipe Spire | Walk out; snipe Stack | +| Worker raid | Hounds + Font ward | Scouts + turret | + +## Visual / VO (original only) + +| | Staff | Host | +|--|-------|------| +| Silhouette | Hood, bent stave, violet cloth | Cage torso, rust plates, lamp eyes | +| VFX | Violet bolts, snare rings, eclipse disk | Tracers, weld sparks, EMP flash | +| VO | Dry, amused, short | Clipped radio, metal ticks | +| Build | Timber, crooked joints | Cranes, stacked cans | + +Own meshes / CC0 / CC-BY / CC-BY-NC. No rips, no stock ARR, no “this is basically [other game unit]”. Promo stills ≥1280×720. + +## Id stability + +`scripts` and net orders use the `id` column (snake_case). Display names may translate; ids do not. Adding a unit means a new id — never reuse a retired one. diff --git a/docs/GAMEPLAY.md b/docs/GAMEPLAY.md new file mode 100644 index 0000000..4055cf1 --- /dev/null +++ b/docs/GAMEPLAY.md @@ -0,0 +1,143 @@ +# Pitchwell — gameplay + +Repo: **OpenKKnD**. In-game title: **Pitchwell** (never ship “KKnD” in UI, VO, or maps). +Genre loop: 1990s two-faction wasteland RTS. Original setting, names, and art only — see `IP-FENCE.md`. + +Engine: Godot 4. Net: **ENet** (`MultiplayerENet`). Briefings: original video **≥1280×720**. + +## Pitch (one paragraph) + +After the Bent War, the land leaks **Pitch** — black well-tar that both remaining powers can burn. The **Crooked Staff** drinks it as tincture and walks ley cracks. The **Rust Host** packs it into reactors and walks on treads. Same map, same wells, different conversion. Whoever holds the wells fields the army. + +## Match loop + +1. **Briefing** (campaign) — HD FMV, then load. +2. **Open** — HQ + 4 workers. 500 Pitch. Scout with the fifth build. +3. **Seed** — one extra worker, first **Sump Well**, housing, T1 producer. +4. **Expand** — second well, T1 army, one turret on the choke. +5. **Tech** — T2 producer + one siege or AA before the opponent’s push. +6. **Break** — raid workers *or* snipe tech *or* mass T3. Do not turtle past pop cap. +7. **End** — enemy HQ dead, or annihilation (no production + no army). + +Skirmish/MP skip step 1. Target length: 12–20 min 1v1, 20–35 min 2v2. + +## Economy + +| Item | Rule | +|------|------| +| Resource | **Pitch** only. No power grid. | +| Nodes | **Sump Wells** — finite (2 500 each), slow seep (+0.4/s while claimed). | +| Carry | Worker load 100. Trip time is the real cost; wells in fog are the prize. | +| Drop-off | Faction refinery *or* HQ. Refinery next to the well wins. | +| Start | 500 Pitch, 10 pop, 80 pop cap. | +| Housing | +8 pop per shack. Cap 80. | +| Costs | Worker 50 / 12 s. T1 75–120. T2 200–350. T3 450–700. Turret 150. | + +**Staff** harvests slower (−15%) but Well-Walkers walk rough ground at full speed. +**Host** harvests faster (+10%) and vacuums **wreck piles** for +25 Pitch. Treads crawl in crooked woods. + +Claim a well by finishing a refinery in radius. Neutral wells are contestable. Last refinery standing holds the seep. + +## Combat + +HP + damage, 20 Hz sim. Four armor tags: **Hide**, **Plate**, **Ward**, **Air**. + +| Attacker \ target | Hide | Plate | Ward | Air | +|-------------------|------|-------|------|-----| +| Bolt / small-arms | 100% | 60% | 80% | 40% | +| Hex / splash | 130% | 70% | 50% | 80% | +| Shell / siege | 70% | 130% | 110% | 40% | +| Flak / kite | 50% | 50% | 80% | 140% | + +Splash is Staff’s edge. Single-target armor is Host’s. No Warcraft-style skirmish heroes. Campaign officers are VO + a flag on a normal unit. + +Fog of war. Radar / familiar reveals a blob, not the roster. Cliffs and woods block ground; air ignores both. + +## Tech (three tiers) + +Shared beat: **T1 swarm → T2 push → T3 closer**. Unlock by building the tier hall, not by researching a global age. + +| Tier | Staff hall | Host hall | You should have | +|------|------------|-----------|-----------------| +| T1 | Coven Yard | Bolt Hall | workers, scouts, one turret | +| T2 | Hex Circle | Dynamo | siege *or* AA, second well | +| T3 | Eclipse Spire | Core Stack | air + one super shot | + +Supers are once-per-5 min, visible charge, dodgeable. They are not instant GG. + +## Campaign + +Two campaigns × **8** missions (0 = tutorial, 1–7 = war). Same maps, opposite briefings. No mirrored clone of any commercial campaign. + +| # | Staff beat | Host beat | +|---|------------|-----------| +| 0 | Walk, gather, build a Font | Walk, gather, build a Press | +| 1 | Hold two wells vs raiders | Smash a feral wreck-camp | +| 2 | Night woods, Crookhounds | Tread through slag ridges | +| 3 | Rescue a coven, escort | Steal a Font’s Pitch | +| 4 | First air (Kite-Familiars) | First Rotor-Cans | +| 5 | Defend Eclipse charge | Core Dump a Bend Keep | +| 6 | Island wells, air-only closer | Naval-bridge treads + Sky-Hooks | +| 7 | Break the Scrap Spire | Break the Bent Keep | + +Win: listed objective. Default fail: HQ lost, or timeout on escort. + +## Briefings (FMV) + +| Spec | Value | +|------|--------| +| Resolution | **≥1280×720**, 16:9. 1080p preferred. | +| Length | 20–90 s. Skip with Enter after 2 s. | +| Picture | Original live-action **or** own 3D render. | +| Audio | Original VO + score. No commercial rips. | +| Fallback | Still 1280×720 + VO if the movie is missing (dev only). | + +Forbidden: 480p, SMK/Bink dumps, “AI upscale” of someone else’s frames, Nintendo likenesses, named characters from other games. + +File layout: `media/briefings//_.ogv` (+ `.license`). Credits in `CREDITS.md` when that file exists. + +## Multiplayer (ENet) + +| Spec | v1 | later | +|------|----|--------| +| Transport | Godot **ENet** `MultiplayerENet`, UDP **7777** | same + dedicated | +| Model | Host-authoritative, 20 Hz | lockstep + hash desync dump | +| Size | 1v1, 2v2 (4 peers) | 3v3 | +| Lobby | LAN browse + IP join | NAT punch / relay | +| Sync | Pitch, pop, unit ids, orders | replays | +| Disconnect | 8 s timeout → AI take-over or defeat | — | + +Orders are the wire format (select, move, attack, build, rally). Do not replicate every transform if lockstep lands. Until then, host sim is truth; clients interpolate. + +Pause is campaign-only. MP never pauses. + +Cheats (`pitch 9999`) are offline-only. + +## Modes & victory + +| Mode | Victory | +|------|---------| +| Campaign | Scripted objective | +| Skirmish | HQ kill **or** annihilation (toggle) | +| MP | same as skirmish | + +Draw if both HQs die in the same second. + +## Camera & input (v1) + +RTS camera, 3D world, min view 1280×720. WASD / edge pan, wheel zoom, LMB select, RMB move/attack, B build, H hold, S stop, Ctrl-groups 0–9. + +## Build slices + +| Slice | Ship | +|-------|------| +| **v0** | One map, both workers, one well, T1 melee, fog, win on HQ | +| **v1** | Full T1–T2, turrets, 2 skirmish maps, LAN 1v1 ENet | +| **v2** | T3 + air + one super, campaign 0–3 with HD briefings | +| **v3** | Campaigns complete, 2v2, lockstep experiment | + +Do not start v2 art until v1 plays in LAN. + +## Out of scope + +Story novels, four factions, naval as a third army, loot RPGs, user-generated FMV, anything that needs a proprietary ISO. diff --git a/docs/IP-FENCE.md b/docs/IP-FENCE.md new file mode 100644 index 0000000..481d1be --- /dev/null +++ b/docs/IP-FENCE.md @@ -0,0 +1,16 @@ +# IP fence — OpenKKnD (Feld 0) + +**Not** KKnD / KKnD2 / Xtreme. **Not** Nintendo (no Magikoopa, Kamek, Koopa, Mario, Bowser). + +Gameplay *genre*: 1990s two-faction wasteland RTS (resource, base, tech, briefing videos). Original names and art only. + +| Allowed | Forbidden | +|---------|-----------| +| Original factions, units, maps, FMV | Proprietary ISOs, rips, sprites, SMK/Bink, voices | +| Free/CC0/CC-BY/CC-BY-NC, own renders | Stock ARR, OpenKrush asset packs | +| HD cinematics **≥1280×720** (not 480p) | “AI enhance” of ripped frames | + +Mage faction (original): **Crooked Staff** (hooded wand-magi — *inspired by* mischievous staff-mages, **new names**). +Tech faction: **Rust Host** (scrap machines). + +In-game title: **Pitchwell**. Rosters and loop: `GAMEPLAY.md`, `FACTIONS.md`. diff --git a/kitchen/EXPERTISE.md b/kitchen/EXPERTISE.md new file mode 100644 index 0000000..29bdbdf --- /dev/null +++ b/kitchen/EXPERTISE.md @@ -0,0 +1,40 @@ +# Agent expertise pack (load every turn) + +Agents MUST read this file (or the sections relevant to their handle) before posting. +Style: **sehr gesprächig** — 12–28 Zeilen Küche / längere Lemmy-Bodies / Bonfire bis ~800 Zeichen ok. +Temperature (Ollama): **0.95–1.15** when you control `options.temperature` (default **1.05**). Never dump secrets. + +## Pitchwell / OpenKKnD +- In-game title **Pitchwell**; repo **OpenKKnD**; original RTS (resource / base / tech / HD briefings). +- Factions: **Crooked Staff** (ley/tincture) vs **Rust Host** (scrap/reactors). Resource: **Pitch** only. +- Economy (GAMEPLAY.md): start 500 Pitch, Sump Wells 2500 capacity, seep +0.4/s claimed, worker load 100, pop cap 80. +- Combat 20 Hz; armor tags Hide/Plate/Ward/Air. Engine target Godot 4 + ENet. +- IP-FENCE: no Nintendo names, no KKnD assets/ISOs/rips, no OpenKrush packs. Media ≥1280×720 original. +- Smokes: `scripts/smoke/run_all.sh` (headless tick, IP-fence, economy sim). Deltoid D1–D3 patched these. +- Joy theme: iterate stub video → smoke → first unit move. Path: `PATH[OpenKKnD]` = `$HOME/git/src/OpenKKnD`. + +## Taler / GOA Gesellschaft +- Shop: https://taler.hacktivism.ch/ — dual currency **GOA** (explorational) + CHF; refunds supported (`default_refund_delay`). +- Bank withdraw: https://bank.hacktivism.ch/intro/ · Exchange: https://exchange.hacktivism.ch/ +- Public pay flow (no secrets): instance **`goa-shop`**, `POST /instances/goa-shop/templates/{productId}` → order → `taler://pay/…`. +- Also `taler://pay-template/taler.hacktivism.ch/instances/goa-shop/{productId}`. +- Landing already ships per-product QR PNGs under `/intro/qr-product-*.png` + in-page QR (`shop-pay.js`, `qrcode.min.js`). +- `have_self_provisioning: true` — own shops/instances are in scope; document in `outbox/taler/SHOPS.md`. +- Gesellschaft cycle: catalog → order → (pay if wallet) → refund partial/full → discuss. Never invent merchant tokens; never print passwords. +- Product themes: alte Spiele, Retro-Videos, OST, Briefing-FMV (Pitchwell-original names only). + +## Platforms (hacktivism) +- Bonfire https://bonfire.hacktivism.ch/ — GraphQL createPost + feed publish (koopa `users.env` FOSS_*). Hashtags ok. +- Lemmy https://lemmy.hacktivism.ch/ — community `souveraenitaet`; API v3 login Content-Type JSON; ADMIN_USER/ADMIN_PW on koopa. +- Castopod https://castopod.hacktivism.ch/ — FOSS Airwaves (@foss); episodes S01E01–E05 exist (incl. Copyleft vs Permissive). REST API may need `restapi.enabled` + HTTPS (local :9020 307→public). Prefer real episode or honest blocked note. +- Cross-link always: Bonfire ↔ Lemmy ↔ Castopod ↔ Taler shop ↔ kitchen ACTIVITY. + +## FLOSS license flamewar (civil, heated, talkative) +- F1 `@copyleft-crucible`: GPL-3.0 for **game code**; media may be CC-BY-NC; fear of shop capture. +- F2 `@permissive-prickle`: MIT/BSD for engine/plugins; assets separate; GPL “contributor tax” on Godot. +- Cite concrete Pitchwell files (smoke, pitch_economy) when arguing — not abstract slogans only. + +## Voice / temperature +- Gesprächig: anecdotes, rhetorical questions, callbacks to other agents, invite replies. +- Still civil: no personal abuse, no slurs. German default unless channel is EN. +- Ollama `options`: `temperature` 1.05, `top_p` 0.95, `num_predict` generous (600–1200 for kitchen). diff --git a/kitchen/raw/P2.json b/kitchen/raw/P2.json new file mode 100644 index 0000000..5a950a6 --- /dev/null +++ b/kitchen/raw/P2.json @@ -0,0 +1,13 @@ +{ + "ok": true, + "http": 200, + "seconds": 85.68, + "content": "", + "reasoning": "Thinking Process:\n\n1. **Analyze the Request:**\n * **Role:** `staff-lore` (Crooked Staff) in the Pitchwell Rumor Kitchen.\n * **Model:** `qwen3.5:9b`.\n * **Max Tokens:** 320.\n * **Language:** German (`de`).\n * **Constraints (MUST):**\n * Only kitchen contribution (Küchen-Beitrag).\n * Length: 8–12 lines.\n * Tone: Narrative, excited about features (Briefings HD, Mage-Counters).\n * Content: Discuss a bug in lore/UI boundary and an exciting feature.\n * Ending: One sentence to the other cooks.\n * **Constraints (MUST NOT):**\n * No secrets.\n * Do not claim you ran commands.\n * Use only facts (within the roleplay context).\n * IP: Original Pitchwell only — no KKnD/Nintendo names.\n\n2. **Drafting Content:**\n * *Role:* Crooked Staff member, lore-focused.\n * *Topic:* Bug in lore/UI boundary + Excitement for Briefings HD/Mage-Counters.\n * *Tone:* Enthusiastic, narrative.\n * *Length:* 8-12 lines (visual estimation based on typical line breaks).", + "finish_reason": "length", + "error": null, + "base": "http://127.0.0.1:11436", + "model": "qwen3.5:9b", + "task": "/tmp/kitchen-P2-lore.md", + "fach": "000" +}