---
name: Platform Strip Asset
slug: platform-strip-asset
category: Frontend
description: Platform Strip Asset generates non-pixel-art horizontal strip graphics from image sources as fixed Texture2D cells or AtlasTexture regions. Use it for floors, bridges, rails, pipes, ledges, and other repeatable side-scrolling level pieces.
github: "https://github.com/RandallLiuXin/GodotMaker/tree/main/skills/assets/platform-strip"
language: Python
stars: 515
forks: 44
install: "npx degit https://github.com/RandallLiuXin/GodotMaker/tree/main/skills/assets/platform-strip ~/.claude/skills/platform-strip"
installs_to: ~/.claude/skills/platform-strip
source_path: skills/assets/platform-strip/SKILL.md
collection_size: 25
category_size: 567
collection_url: "https://dirskills.com/collections/RandallLiuXin/GodotMaker"
added: 2026-08-26T05:12:28.979Z
last_synced: 2026-08-26T05:12:28.979Z
canonical_url: "https://dirskills.com/skills/platform-strip-asset"
---

# Platform Strip Asset

Platform Strip Asset generates non-pixel-art horizontal strip graphics from image sources as fixed Texture2D cells or AtlasTexture regions. Use it for floors, bridges, rails, pipes, ledges, and other repeatable side-scrolling level pieces.

**Install:**

```bash
npx degit https://github.com/RandallLiuXin/GodotMaker/tree/main/skills/assets/platform-strip ~/.claude/skills/platform-strip
```

## README

# Platform Strip Asset

Use for collision-aligned floors, bridges, rails, pipes, terrain ledges, and long horizontal hazards. Do not use for characters, UI, compact props, full backgrounds, or pixel art.

## Contract

Accept the shared Asset Skill request schema at `.godotmaker/asset-runtime/schema/asset-skill-request.schema.json` with `asset_type: "platform-strip"`.
Use the shared result schema and checker. This skill can be invoked directly or by an orchestrator with the same contract. Do not read or write `ASSETS.md`, tags, stage state, or generated manifests.

`spec` must contain exactly:

```json
{
  "kind": "single" | "atlas",
  "grid": {"columns": 3, "rows": 1, "cell_width": 160, "cell_height": 80},
  "segments": [
    {"name": "left_cap", "role": "left_cap", "slot": [0, 0]},
    {"name": "repeat_middle", "role": "repeat_middle", "slot": [1, 0]},
    {"name": "right_cap", "role": "right_cap", "slot": [2, 0]}
  ]
}
```

The fixed grid dimensions are positive integers. This v1 family is one closed horizontal row: `rows` must be `1`, `columns` must equal `segments.length`, and entries must be declared in left-to-right slot order as `[0, 0]` through `[columns - 1, 0]`. The first entry is the only `left_cap`, the last is the only `right_cap`, and every interior entry is `repeat_middle`. Empty slots, reordered entries, and a request without a repeatable middle segment are unsupported.

`references` is optional. With references, validate every path is readable, preserve each declared role, and pass the actual images to the selected provider. Do not replace image attachments with prompt text. If the pinned provider cannot accept the supplied images, return STOP. Without references, generate from the written brief.

Honor the requested provider exactly. `native`, `codex`, `gemini`, and `openai` never fall back to another provider. For Codex, call the image provider with `referenced_image_paths` containing each readable local reference image. If that attachment cannot be made, STOP. Record the provider, model, prompt, reference paths and roles, provider payload or trace, raw source path, and processing reports under `.godotmaker/asset-generation/` using the provider's controlled report or claim tool; never hand-write provenance JSON.

## Produce

1. Reject pixel-art requests. Request non-pixel-art painted, illustrated, or rendered source art. Do not use nearest-neighbor scaling.
2. Create a layout-only guide with `tools/asset_layout_guide.py` using the declared grid. The guide is not art and is not a runtime output.
3. Request one real provider source sheet with one horizontal slot per declared segment. Require a solid `#FF00FF` background, a shared walkable top height, no labels, UI, actors, text, props, or grid lines. Preserve the provider's returned pixels as the raw source even when its raster dimensions differ from the target grid.
4. Store the unmodified provider image at `.godotmaker/asset-generation/sources/<asset_id>_source.png`. For `codex`, follow `skills/core/gm-asset/references/providers/codex.md`: write the planned generated-path record and the runtime generated-path record, then run `python .godotmaker/asset-runtime/tools/codex_image_claim.py --plan <plan.json> --report <generated-paths.json> --project-root . --out-report .godotmaker/asset-generation/reports/<asset_id>_source.json`. Use that claim result as the provenance record. For API-backed providers, use `tools/asset_source_generate.py --spec` with its `report_path`. The report must be generated by those controlled tools, not hand-written. Do not create, draw, or alter visual source art with temporary scripts, Pillow, System.Drawing, ImageMagick, SVG, canvas, Godot drawing, or placeholder generation.
5. Split the raw provider sheet before any crop, resize, or padding. Never normalize the whole sheet as one image: doing so changes the declared grid coordinates. Use the owned deterministic tool with the declared source grid and names in declared slot order. It deterministically covers every source pixel even if the provider raster dimensions are not evenly divisible by the requested grid:

   ```powershell
   python tools/asset_sheet_process.py --source <raw-source> --out-dir <sliced-dir> --grid <columns>x1 --names <segment-names-in-slot-order> --background magenta --snap-mode grid --preserve-cell-bounds --report .godotmaker/asset-generation/reports/<asset_id>_sheet.json
   ```

   Use the report to reject missing art, opaque magenta pixels, edge-touching art that breaks the declared slot, or a cell that does not retain its fixed dimensions.

6. For each already-sliced cell, use `asset_sheet_process.py --grid 1x1 --background transparent --snap-mode grid` without `--preserve-cell-bounds` to crop that cell's visible AABB. Then finalize that cropped cell independently with `asset_image_finalize.py --resize <cell_width>x<cell_height> --no-origin`. Save each output under `<normalized-dir>/<segment>.png` and each finalize report at `.godotmaker/asset-generation/reports/<asset_id>_<segment>_normalize.json`. Do not recombine or resize the raw sheet between slicing and this per-cell finalization.

7. For `kind: "single"`, publish every normalized cell at `res://assets/generated/platform-strip/<asset_id>/<segment>.png` and return it as `Texture2D`.
8. For `kind: "atlas"`, create an explicit fixed-slot declaration from the normalized cells. Assemble it only with `tools/asset_atlas_assemble.py`; publish `<asset_id>.png` and `<asset_id>.json` in the stable platform-strip directory. Each metadata region uses the declared slot rectangle, `pivot: [0.5, 1.0]`, and `nine_slice: null`. Compile every logical region to `res://assets/generated/platform-strip/<asset_id>/<segment>.tres` as `AtlasTexture` with zero margin.
9. Run `standalone_validation.compile_and_validate()` with exactly `GM_EVAL_GODOT_PATH` or `GODOT_BIN` when either is configured; do not search for or substitute another Godot executable. When retaining `.godotmaker/asset-generation/reports/<asset_id>_validation.json`, write the validator's actual result rather than a self-reported verdict. `validation.levels` in the generic result is optional; include it only when it is the direct validator output.

## Result

Return exactly one shared generic result JSON object and no prose.

Before returning, persist the exact shared request/result pair at
`.godotmaker/asset-generation/<asset_id>-request.json` and
`.godotmaker/asset-generation/<asset_id>-result.json`.

For `single`, declare one `sources` entry with `layout: "single"` for every processed segment and one runtime `Texture2D` output per segment. For `atlas`, declare one `sources` entry for the physical atlas with `layout: "region_atlas"` and one runtime `AtlasTexture` output per segment. Use only stable platform-strip paths.

If the semantic strip contract, provider contract, source art, processing report, fixed slot assembly, compiler, or Godot check cannot complete, return the shared failed result with `outputs: []`, `validation.passed: false`, and explanatory notes. Do not publish partial runtime outputs.
