game-dev-combat-skill-polish
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseGame dev: combat skill polish
游戏开发:战斗 Skill 打磨
A skill is the cast (the caster's body), the effect (what it throws, raises or tears open), and the result (the target's reaction and what it leaves behind). Polish all three, judged from real footage by people who did not make it.
There are two bars. Know which one the user means:
| Bar | Asks | Rubric | Typical target |
|---|---|---|---|
| Readability | Does it read as itself? Does the result land when and where the blow arrives? Is the pose its own? | | every skill 6+ |
| Art | Detail and texture, light, motion and trails, impact, art direction, against a named reference | | 7+ per skill |
A skill can score 7 on readability and 3 on art. Never quote a score without naming its rubric.
一个 Skill 由三部分组成:施法(施法者的身体动作)、效果(投掷、升起或撕开的对象),以及结果(目标的反应和留下的痕迹)。三者都要打磨,并由未参与制作的人根据真实画面进行评判。
有两个标准。需要确认用户指的是哪一个:
| 标准 | 考察内容 | 评分细则 | 典型目标 |
|---|---|---|---|
| 可读性(Readability) | 它能读懂自身吗?结果会在攻击命中时、于命中位置产生吗?姿态是否具有辨识度? | | 每个 Skill 6 分以上 |
| 美术(Art) | 细节与纹理、光照、运动与拖尾、冲击力、艺术方向,并与指定的参考作品比较 | | 每个 Skill 7 分以上 |
一个 Skill 的可读性可能是 7 分,而美术只有 3 分。引用分数时,必须同时注明对应的评分标准。
1. Pin down the job
1. 明确任务
- Which skills: all of them (a survey), or named ones (a rebuild). One skill per thread when several run at once.
- The bar and the reference. If the user shows a reference image, save it into the project so judges can open it; otherwise describe it in words in the rubric.
- Read the project reference first (, if there is one): where each skill's code lives, the harness settings, the scorecard so far, and what other threads already learned.
references/<project>.md - Before designing, and check what other threads are changing; several skill threads edit the same effect and animation files.
git fetch
- 需要处理哪些 Skill:全部 Skill(整体评估),还是指定 Skill(重建)。多个任务同时进行时,每个线程处理一个 Skill。
- 确定标准与参考作品。如果用户提供了参考图片,将其保存到项目中,以便评委打开;否则在评分细则中用文字描述。
- 首先阅读项目参考文件(如果存在 ):各 Skill 的代码位置、harness 设置、当前评分表,以及其他线程已经总结出的经验。
references/<project>.md - 开始设计前执行 ,并检查其他线程正在修改什么;多个 Skill 线程可能会编辑相同的特效和动画文件。
git fetch
2. Film the real thing
2. 录制真实效果
- Work in your own git worktree off the main branch. Serve it on a free port; serve a clean main worktree on a second port for the "before".
- Film headlessly on a stopped, stepped clock: freeze the game clock, step it 0.05 s per frame, wait for a rendered frame, shoot. A loaded machine then still gives evenly spaced frames. (; staging per skill in a scenarios file like
scripts/film.mjs.) The game needs review-only hooks for this: stage a state, issue a command, aim the camera, freeze and step the clock (the contract is at the top ofscripts/scenarios.example.mjs; HOOK, PAGE, READY, SETTINGS_KEY and CHROME are set from the environment).film.mjs - Stage each cast so the caster, the target, the hero object and the landing are in the crop and clear of the HUD (,
frame,span). A thing hidden behind a panel scores as "a speck".points - Build a contact strip per cast (, N=16 and TAIL=3 to keep the aftermath) and a close-up of the key frames (
scripts/strips.py). Judges need both: strips show timing, close-ups show art.scripts/close.py - Measure what can be measured: the frame the foe moves against the frame the blow lands (per-frame action and time), draw calls and triangles during the cast (
meta.json), and download size.scripts/perf.mjs - Never edit served source files during a film; the dev server reloads mid-capture.
- 基于 main 分支创建自己的 git worktree。使用一个空闲端口启动服务;另用一个端口启动干净的 main worktree,作为“before”版本。
- 使用无头浏览器,在停止、逐帧推进的时钟下录制:冻结游戏时钟,每帧推进 0.05 s,等待渲染完成后截图。这样,即使机器负载较高,也能获得间隔均匀的画面。(;每个 Skill 的场景配置位于类似
scripts/film.mjs的文件中。)游戏需要提供仅供评审使用的 hooks:布置场景状态、执行命令、调整相机、冻结并推进时钟(相关契约位于scripts/scenarios.example.mjs顶部;HOOK、PAGE、READY、SETTINGS_KEY 和 CHROME 均通过 environment 设置)。film.mjs - 布置每次施法,使施法者、目标、英雄道具和落点都位于裁切范围内,并且不被 HUD 遮挡(、
frame、span)。被面板遮住的对象只能被视为一个模糊小点。points - 为每次施法生成一条 contact strip(,N=16、TAIL=3,以保留命中后的余波),并生成关键帧的特写(
scripts/strips.py)。评委需要两者:帧条展示时序,特写展示美术表现。scripts/close.py - 尽可能量化:对比敌人开始移动的帧与攻击命中的帧(记录每帧的动作和时间),统计施法期间的 draw call 和三角形数量,并记录下载大小。
meta.json - 录制期间绝不修改已提供给服务的源文件;dev server 会在录制中途重新加载。
3. Judge blind, two at a time
3. 每次两名评委进行盲评
- Spawn two fresh general-purpose subagents per round. Give them the rubric, a list file and the image paths, and tell them to open no other files: no code, no earlier scores, no keys. anonymises strips under neutral ids and writes the list and a key;
scripts/judge-set.pyhas the two prompts.templates/judge-prompt.md - Ask for JSON: part scores, a total, the biggest fault and the single change that would raise it most. Save every reply under .
judges/ - Keep the lower of the two. Never round up. Never score your own captures.
- Judge spread is about ±0.5 to 1. Before calling a 7 solid, re-judge the same pictures or mix a calibration strip (an old version) into the set. One lucky round is not a pass.
- The judges' "next" lines are the work list. When both name the same thing, do that first.
- 每轮启动两个全新的通用 subagent。向它们提供评分细则、列表文件和图片路径,并要求不得打开任何其他文件:代码、此前分数或答案对照表均不可查看。会使用中性 ID 匿名处理帧条,并写出列表和对照表;
scripts/judge-set.py包含两份提示词。templates/judge-prompt.md - 要求返回 JSON:分项得分、总分、最大的问题,以及最能把分数提高的一项改动。将每次回复保存在 下。
judges/ - 采用两名评委中的较低分。绝不向上取整,也绝不为自己的录制画面评分。
- 评委之间的分差通常约为 ±0.5 到 1 分。在认定 7 分已经稳妥之前,重新评判同一组图片,或在评分集中混入一条校准帧条(旧版本)。一轮好运不能算通过。
- 评委的“next”意见就是待办清单。如果两名评委都指出同一个问题,优先处理它。
4. Raise it, round by round
4. 逐轮提升
Fix the criterion costing the most points. These moved scores before:
Timing and readability
- Results must land on the beat: the target reacts, is pushed or gets its status when the blow, missile or wave arrives, never on the click. Check the scene layer that draws units at their rules position every frame; it will happily show a push before the blow (the first and biggest fix on the project this skill was built on).
- A skill that borrows another's schedule (its duration and contact moment) cannot have its own body. Give it its own schedule and keyed move: a kneel then rise, a gather then throw, a bow then welcome. Then update every place that branched on the old schedule's name.
- Travel time for waves and missiles: the hit waits for the arrival.
- Hits across an arc are staggered along the measured blade path, not fired together.
- The target's reaction: a recoil, buckle, daze or knock-back is half the read. Status labels alone score low.
Art
- The hero object's modelling is the ceiling. Scripted primitives and hand-built meshes plateau at 5.5 to 6.5 ("plain prism", "toy"). A painted concept (gpt_image_2_5) turned into a textured model with image-to-3D (Higgsfield , Meshy, textured + PBR, about 12k triangles) took two skills past 7. Without any hero element, a skill tends to plateau around 6 (a wind skill with nothing modelled stopped at 6 after 20 rounds).
image_to_3d - When the hero is a small world prop, keep the prop readable and make the effect painted wisps round it (a modelled "hand of force" never read from the tactical camera).
- Painted textures on black for additive blending (craters, crescents, ribbons, shockwave rings, vortices) beat procedural rings and streaks. Gradient-map them to the skill's palette before shipping (lava red next to a red target marker reads wrong).
- Ribbons and trails: camera-facing across the path, width growing with the path drawn, soft across their width, sampled back along the motion itself (not frame by frame). A thin uniform line reads as "a laser" or "a debug line"; a wide single band reads as "a flat card".
- Metals need something to reflect. A tactical scene often has no environment map; give a model its own small equirect sky and a tight fresnel rim. A broad rim or warm tint washes gold to cream or copper.
- Light: put it on the object or beside the body toward the caster, about a metre out. A light inside the body lights nothing; a light pool under a projectile reads as "a detached disc"; too bright bleaches the target.
- Impact: a small hot core, debris flung and falling, dust low and dark, a mark left in the ground that cools or fades, and a strong recoil. A big white disc that hides the target always loses points.
Things judges always mark down: borrowed looks (another skill's ring, flash or pose); flat cream or white placeholder flashes; even radial streaks; pillars or lances of light over the target; additive dust rings that brighten the ground to cream; stretched white sparks ("white dashes"); long lingering trails ("laser", "lightning"); crack decals that read as electric; anything under the HUD.
Keep guardrails while climbing: frame budget, first-scene download budget (load new assets only when a fight that can use them starts), the readability score, the tests, and other skills' looks. Commit WIP locally each round; a restart then costs nothing.
优先修复失分最多的标准项。以下做法曾有效提高分数:
时序与可读性
- 结果必须踩准节拍:攻击、导弹或波纹抵达时,目标才应产生反应、被击退或获得状态,绝不能在点击时触发。检查每帧按照规则位置绘制单位的场景层;它会若无其事地在攻击落下前显示击退效果(这是该 Skill 原始项目中最大且最先修复的问题)。
- 如果一个 Skill 借用了另一个 Skill 的时序(持续时间和接触时刻),它就无法拥有自己的身体表现。为它提供自己的时序和 keyed move:例如先蓄力再投掷、先躬身再起身、先鞠躬再迎接。然后更新所有依赖旧时序名称进行分支判断的位置。
- 波纹和导弹的飞行时间:命中必须等待其抵达。
- 弧形范围内的攻击应沿实测的刀剑轨迹错开命中,而不是同时触发。
- 目标的反应很重要:后仰、踉跄、眩晕或击退构成了一半的读感。仅显示状态标签得分较低。
美术
- **英雄道具的建模质量决定上限。**脚本生成的基础几何体和手工搭建的网格通常会停留在 5.5 到 6.5 分(表现为“平淡的棱柱”或“玩具感”)。将绘制概念图(gpt_image_2_5)通过 image-to-3D 转换为带纹理的模型(Higgsfield 、Meshy、textured + PBR,约 1.2 万个三角形),曾让两个 Skill 突破 7 分。如果完全没有英雄元素,Skill 往往会停在 6 分左右(一个没有任何建模内容的风系 Skill 在 20 轮后仍停在 6 分)。
image_to_3d - 当英雄元素是小型世界道具时,应保持道具清晰可读,并在其周围制作绘制的能量丝缕。建模出的“力量之手”从战术视角中永远不够清晰。
- 对于 crater、crescent、ribbon、shockwave ring 和 vortex,在黑底上绘制纹理并使用 additive blending,效果优于程序生成的圆环和条纹。发布前使用 gradient map 将其映射到 Skill 的配色;熔岩红紧挨红色目标标记时会显得不对。
- Ribbon 和 trail:沿路径延展时朝向相机,宽度随路径增长,横向边缘柔和,并沿运动轨迹本身向后采样(而不是逐帧采样)。细而均匀的线看起来像“激光”或“调试线”;宽而单一的带状物看起来像“一张扁平的卡片”。
- **金属需要可供反射的内容。**战术场景通常没有 environment map;应给模型配置自己的小型 equirect 天空贴图和紧凑的 Fresnel 边缘光。宽泛的边缘光或暖色调会将金色洗成米色或铜色。
- 光照:将光源放在物体上,或放在身体靠近施法者的一侧、约一米外。置于身体内部的光源照不到任何东西;投射物下方的光池看起来像“脱离主体的圆盘”;过亮则会漂白目标。
- 冲击力:小型高亮核心、向外飞散并落下的碎片、低处且偏暗的尘土、留在地面上逐渐冷却或淡去的痕迹,以及强烈的回弹。遮住目标的大型白色圆盘总会失分。
评委经常扣分的内容:借用其他 Skill 的视觉元素(圆环、闪光或姿态);平坦的米白色或纯白色占位闪光;均匀的放射状条纹;覆盖在目标上方的光柱或光枪;使用 additive blending 的尘环将地面提亮成米色;被拉伸的白色火花(“白色虚线”);停留过久的拖尾(看起来像“激光”“闪电”);看起来像电击的裂纹贴花;以及任何被 HUD 遮挡的内容。
提升分数时仍要遵守护栏:帧数预算、首场景下载预算(只有能够使用新资源的战斗开始时才加载它们)、可读性分数、测试,以及其他 Skill 的视觉风格。每轮都在本地提交 WIP;这样即使重启也不会丢失进度。
5. Stop, lock in, ship
5. 停止、锁定成果并发布
- Stop when the bar is met on the lower judge (and a re-judge agrees), or when a skill plateaus for several rounds. Then say plainly what it would take (usually a modelled hero element).
- Ship the version the judges scored, not an unjudged tweak of it.
- Add a test that locks the skill's own schedule, model or recipes in place.
- Write the scorecard: a round table (change, both scores, kept), what moved it, what is left, cost, and a before/after sheet ().
scripts/beforeafter.py - Ship it as its own version with three pictures (start, key moment, result), following the project's ship routine (), with measured sizes.
workflow-ship-change - Update the project memory with what moved scores and the new traps, so the next skill starts further on.
- 当较低分的评委已经达到标准且复评结果一致,或 Skill 在数轮后进入平台期时停止。然后明确说明还需要什么,通常是加入建模的英雄元素。
- 发布评委实际评分过的版本,而不是未经评分的微调版本。
- 添加测试,锁定 Skill 自己的时序、模型或配方。
- 编写评分表:用轮次表记录改动、两名评委的分数、是否保留,说明哪些改动提高了分数、还剩什么问题、成本,以及 before/after 对照表()。
scripts/beforeafter.py - 按照项目的发布流程(),将 Skill 作为独立版本发布,并附上三张图片(起始帧、关键时刻、结果帧)及实测大小。
workflow-ship-change - 更新项目记忆,记录哪些改动提高了分数,以及新发现的陷阱,让下一个 Skill 能从更高的起点继续。
Report
报告
Lead with the result per skill, on its named rubric: "Summon Hammer 4 → 7 (art, two blind judges, lower kept)". Then the round table, how it was judged and from what footage, where it still falls short in the judges' words, the cost, and the before/after pictures sent inline. Label captures as headless browser captures, not device tests.
先按每个 Skill 对应的评分标准报告结果:“Summon Hammer 4 → 7(美术,两名盲评评委,采用较低分)”。然后给出轮次表、评判方式及所用素材、评委原话指出的不足、成本,并内联展示 before/after 图片。将这些素材明确标注为无头浏览器录制,而非设备测试。