docs+game: staff-lore factions gameplay cinematics pitch

This commit is contained in:
staff-lore 2026-09-07 01:17:41 +02:00
parent 9f4034806c
commit 0b3d835963
10 changed files with 388 additions and 0 deletions

27
README.md Normal file
View file

@ -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 D1D3)
```bash
./scripts/smoke/run_all.sh
```
Headless tick · IP-FENCE scan · Pitch economy sim (`game/sim/`). Notes: `kitchen/patches/`.

10
REPORT-pitchwell.txt Normal file
View file

@ -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

View file

@ -0,0 +1 @@
{"id":"first-contact","width":1280,"height":720,"fps":24,"seconds":6,"license":"original","pipeline":"ffmpeg-stub"}

21
docs/CINEMATICS.md Normal file
View file

@ -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/<id>/out/` + `META.json`.
Stub: `scripts/cinematics/make_stub.sh`

117
docs/FACTIONS.md Normal file
View file

@ -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, 8s) | **Core Dump** (EMP + fire, 6s) |
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 4s 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 | 15s | 1 |
| `coven_yard` | T1 / T2 infantry | 180 | 20s | 1 |
| `cot_hall` | +8 pop | 80 | 12s | 1 |
| `ward_post` | Turret, Ward armor, hex bolts | 150 | 18s | 1 |
| `beast_pens` | Crookhound, Gutter Wyrm | 220 | 22s | 2 |
| `hex_circle` | Unlocks T2, Hexer, Ley-Cart | 250 | 25s | 2 |
| `rookery` | Air | 280 | 28s | 3 |
| `eclipse_spire` | Super charge | 600 | 45s | 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 2s |
| `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 — 12s visible sky-darken, then 8s 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** (15s). 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 | 15s | 1 |
| `bolt_hall` | T1 / T2 infantry | 180 | 20s | 1 |
| `frame_rack` | +8 pop | 80 | 12s | 1 |
| `can_turret` | Turret, Plate, shells | 150 | 18s | 1 |
| `track_barn` | Vehicles + repair aura | 240 | 24s | 2 |
| `dynamo` | Unlocks T2, Howl, Breaker | 250 | 25s | 2 |
| `rotor_deck` | Air | 280 | 28s | 3 |
| `core_stack` | Super charge | 600 | 45s | 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 — 10s siren, then 6s 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.

143
docs/GAMEPLAY.md Normal file
View file

@ -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 opponents 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: 1220 min 1v1, 2035 min 2v2.
## Economy
| Item | Rule |
|------|------|
| Resource | **Pitch** only. No power grid. |
| Nodes | **Sump Wells** — finite (2500 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 / 12s. T1 75120. T2 200350. T3 450700. 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, 20Hz 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 Staffs edge. Single-target armor is Hosts. 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-5min, visible charge, dodgeable. They are not instant GG.
## Campaign
Two campaigns × **8** missions (0 = tutorial, 17 = 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 Fonts 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 | 2090s. Skip with Enter after 2s. |
| 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 elses frames, Nintendo likenesses, named characters from other games.
File layout: `media/briefings/<campaign>/<nn>_<slug>.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, 20Hz | 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 | 8s 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 09.
## Build slices
| Slice | Ship |
|-------|------|
| **v0** | One map, both workers, one well, T1 melee, fog, win on HQ |
| **v1** | Full T1T2, turrets, 2 skirmish maps, LAN 1v1 ENet |
| **v2** | T3 + air + one super, campaign 03 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.

16
docs/IP-FENCE.md Normal file
View file

@ -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`.

40
kitchen/EXPERTISE.md Normal file
View file

@ -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** — 1228 Zeilen Küche / längere Lemmy-Bodies / Bonfire bis ~800 Zeichen ok.
Temperature (Ollama): **0.951.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 D1D3 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 S01E01E05 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 (6001200 for kitchen).

13
kitchen/raw/P2.json Normal file
View file

@ -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: 812 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"
}