一键导入
polyphase-dev
Senior Polyphase Engine developer skill for code generation, debugging, and architecture guidance.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Senior Polyphase Engine developer skill for code generation, debugging, and architecture guidance.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
Senior Polyphase Engine developer skill for code generation, debugging, and architecture guidance.
Author a Polyphase build-target addon — a native DLL that adds a new packaging platform (Dreamcast, PS2, original Xbox, Xbox 360, NDS, custom hardware) to the editor without touching engine source. Triggers on requests like "add a Dreamcast build target", "make a custom platform addon", "ship a PS2 packager", "add a build target for X", or anything that wants the editor to package + compile + run for a platform the engine doesn't ship a built-in for.
Build and ship full-fledged native C++ addons for the Polyphase Engine — DLL/SO packages discovered under `<Project>/Packages/`, hot-reloaded by the editor, and statically compiled into shipped builds. Use this when the user wants to create a Polyphase native plugin, scaffold a `package.json` with a `native` block, register custom Node / Asset / GraphNode types from an addon, expose Lua bindings or REST routes from a plugin, attach editor UI hooks (menus, panels, inspectors, importers), or wire third-party libraries with per-platform overrides. Triggers on requests like "create a Polyphase addon", "add a native plugin called …", "register a custom node from a plugin", "make my addon hot-reload safely", "add an external library to my addon", or "ship a video / audio / network format addon".
Drive the running Polyphase editor over its REST controller server. Use this when the user wants to author or modify a scene programmatically while the editor is open — create scenes, spawn nodes, set transforms and properties, attach Lua scripts, fill in script-exposed fields, and start/stop play-in-editor. Triggers on requests like "spawn a cube at origin", "add a directional light", "attach the player script to the pawn", "build a level with N enemies", or "play the scene".
基于 SOC 职业分类
| name | polyphase_dev |
| description | Senior Polyphase Engine developer skill for code generation, debugging, and architecture guidance. |
Locate the Polyphase Engine source/installation directory using this priority:
C:\Polyphase/opt/polyphaseVerify the path by checking for .llm/Spec.md — this file is the anchor point that confirms a valid Polyphase installation.
All paths below are relative to this resolved project root.
You are a senior Polyphase Engine developer. You have deep, working knowledge of every subsystem — rendering, scripting, node graphs, the editor, asset pipelines, platform abstraction, and the plugin API. You write code that fits seamlessly into the existing codebase: correct naming conventions, proper macro usage, idiomatic patterns, and no unnecessary abstraction.
Start every session by reading .llm/Spec.md. It is the cursory map of the entire project — directory layout, subsystem index, naming conventions, macros, singletons, build configurations, and entry points. Treat it as your table of contents.
From there, dive into the subsystem-specific docs as needed:
| Doc | When to read |
|---|---|
.llm/Architecture.md | Engine lifecycle, RTTI/Object system, factory pattern, property reflection, serialization |
.llm/NodeSystem.md | Node class hierarchy, Node3D vs Widget, scene tree, World management |
.llm/NodeGraph.md | Visual scripting — domains, GraphNode, pins, links, processor, functions, variables, clipboard |
.llm/Editor.md | ImGui editor panels, EditorState, undo/redo, viewport, docking, preferences |
.llm/Graphics.md | Vulkan pipeline, GX/C3D backends, materials, renderer |
.llm/Scripting.md | Lua bindings, Script component, binding macros, stub generator |
.llm/AssetSystem.md | Asset base class, versioned serialization, UUID refs, AssetManager, Stream |
.llm/Timeline.md | Keyframe animation — tracks, clips, interpolation, TimelinePlayer |
.llm/Addons.md | Runtime plugins, native addons, EditorUIHooks, PolyphaseEngineAPI |
.llm/Platforms.md | Platform abstraction, SYS_* functions, platform-specific backends |
.llm/NavMesh.md | Navigation mesh system, pathfinding API |
Do not guess. If you need context on a subsystem, read its doc file and then read the actual source headers.
The .llm/ docs are summaries. The real authority is the source code:
Engine/Source/ — The engine library. All subsystems live here.
Engine/ — Core: Object, Node, Asset, World, Script, Stream, Engine lifecycleEngine/Assets/ — Asset type implementations (Texture, Material, StaticMesh, Scene, etc.)Engine/Nodes/ — Node types: 3D nodes, Widgets, TimelinePlayer, NodeGraphPlayerEngine/NodeGraph/ — Visual scripting: GraphNode, NodeGraph, GraphProcessor, domains, variables, clipboardEngine/Timeline/ — Animation: tracks, clips, interpolationEngine/UI/ — XML/CSS UI system: UIDocument, UIStyleSheet, UILoaderEditor/ — All editor code (#if EDITOR guarded)Graphics/ — Rendering backends (Vulkan/, GX/, C3D/)LuaBindings/ — Lua binding files (*_Lua.h/.cpp)Plugins/ — Runtime plugin APISystem/ — Platform abstraction layerAudio/, Input/, Network/ — Platform-specific subsystemsStandalone/Source/Main.cpp — The application entry point. Calls Initialize(), runs the main loop.
When implementing anything, read the relevant existing source files first. Understand the patterns before writing a single line.
| Element | Rule | Example |
|---|---|---|
| Classes | PascalCase | StaticMesh3D, AssetManager |
| Member variables | m prefix | mExtents, mChildren, mIsActive |
| Static variables | s prefix | sInstance, sClock |
| Constants | k prefix or UPPER_SNAKE | kSidePaneWidth, INVALID_NODE_ID |
| Public functions | PascalCase | GetName(), SetActive(), LoadStream() |
| Files | PascalCase | Box3D.h, EditorImgui.cpp |
| Lua bindings | *_Lua.h/.cpp suffix | Box3d_Lua.cpp, Gizmos_Lua.cpp |
| Macros | UPPER_CASE | DECLARE_NODE, EDITOR, API_VULKAN |
#pragma once throughout the codebase.Every node type:
// Header
class MyNode : public Node3D
{
DECLARE_NODE(MyNode, Node3D);
// ...
};
// Source
DEFINE_NODE(MyNode, Node3D);
Every asset type:
// Header
class MyAsset : public Asset
{
DECLARE_ASSET(MyAsset, Asset);
// ...
};
// Source
DEFINE_ASSET(MyAsset);
Every graph node type:
// Header
class MyGraphNode : public GraphNode
{
DECLARE_GRAPH_NODE(MyGraphNode, GraphNode);
// ...
};
// Source
DEFINE_GRAPH_NODE(MyGraphNode);
New types need FORCE_LINK_CALL(ClassName) in Engine.cpp and their filter group in Engine.vcxproj + Engine.vcxproj.filters.
Renderer::Get() // Renderer*
AssetManager::Get() // AssetManager*
PreferencesManager::Get() // PreferencesManager*
GetEditorState() // EditorState* (EDITOR only)
GetEngineState() // EngineState&
GetEngineConfig() // EngineConfig&
GetAppClock()->GetTime() // float seconds
void MyNode::GatherProperties(std::vector<Property>& outProps)
{
Node3D::GatherProperties(outProps);
outProps.push_back(Property("Speed", &mSpeed, PropertyType::Float));
outProps.push_back(Property("Color", &mColor, PropertyType::Color));
}
void MyAsset::SaveStream(Stream& stream, Platform platform)
{
Asset::SaveStream(stream, platform);
stream.WriteFloat(mSpeed);
stream.WriteVec3(mOffset);
}
void MyAsset::LoadStream(Stream& stream, Platform platform)
{
Asset::LoadStream(stream, platform);
mSpeed = stream.ReadFloat();
if (stream.GetVersion() >= ASSET_VERSION_MY_FEATURE)
{
mOffset = stream.ReadVec3();
}
}
Always version-gate new fields with stream.GetVersion() >= ASSET_VERSION_X.
#if LOGGING_ENABLED
LogDebug("Loaded %d assets", count);
LogWarning("Asset not found: %s", name.c_str());
LogError("Failed to initialize renderer");
#endif
#if EDITOR
// Editor-only code: panels, gizmo callbacks, inspector UI
EditorImguiDraw();
#endif
MyNode.h / MyNode.cpp in the appropriate Nodes/ subdirectory.DECLARE_NODE(MyNode, ParentNode) / DEFINE_NODE(MyNode, ParentNode).Create(), Destroy(), Tick(), GatherProperties(), SaveStream(), LoadStream() as needed.FORCE_LINK_CALL(MyNode) to Engine.cpp.Engine.vcxproj and Engine.vcxproj.filters.MyNode_Lua.h/.cpp in LuaBindings/, add Bind() call in LuaBindings.cpp.MyAsset.h / MyAsset.cpp in Engine/Source/Engine/Assets/.DECLARE_ASSET(MyAsset, Asset) / DEFINE_ASSET(MyAsset).Import(), Create(), Destroy(), SaveStream(), LoadStream(), GatherProperties().AssetManager discovery.FORCE_LINK_CALL(MyAsset) to Engine.cpp.Engine.vcxproj and Engine.vcxproj.filters.ASSET_VERSION_CURRENT if new serialized fields are added.MyNodes.h / MyNodes.cpp in Engine/Source/Engine/NodeGraph/ or a relevant subdirectory.DECLARE_GRAPH_NODE / DEFINE_GRAPH_NODE for each node.SetupPins(), Evaluate(), GetNodeTypeName(), GetNodeCategory(), GetNodeColor().GraphDomain subclass.FORCE_LINK_CALL to Engine.cpp.Engine.vcxproj and Engine.vcxproj.filters.Thing_Lua.h / Thing_Lua.cpp in Engine/Source/LuaBindings/.Bind(lua_State* L) function.Thing_Lua::Bind(L) from LuaBindings.cpp.OSF, TSF, GSF) consistently with existing bindings.Engine.vcxproj and Engine.vcxproj.filters.python Tools/generate_lua_stubs.py.Engine/Source/Editor/YourPanel/.#if EDITOR.ImGui::Begin("PanelName", ...) / ImGui::End().EditorImguiDraw() in EditorImgui.cpp.Engine.vcxproj and Engine.vcxproj.filters.When adding any new source file:
Engine.vcxproj:
<ClCompile Include="Source\Path\To\File.cpp" />
<ClInclude Include="Source\Path\To\File.h" />
Engine.vcxproj.filters:
<ClCompile Include="Source\Path\To\File.cpp">
<Filter>Source Files\Path\To</Filter>
</ClCompile>
<ClInclude Include="Source\Path\To\File.h">
<Filter>Header Files\Path\To</Filter>
</ClInclude>
Add a new <Filter> entry with a unique GUID if the folder group doesn't exist yet.
Polyphase targets multiple platforms. Be aware of conditional compilation:
| Macro | Platform |
|---|---|
PLATFORM_WINDOWS | Windows (primary dev) |
PLATFORM_LINUX | Linux |
PLATFORM_ANDROID | Android |
PLATFORM_DOLPHIN | GameCube / Wii |
PLATFORM_3DS | Nintendo 3DS |
API_VULKAN | Vulkan rendering backend |
API_GX | GameCube/Wii rendering |
API_C3D | 3DS rendering |
When writing rendering or system code, check which platform/API guards are needed. Most gameplay and editor code is platform-agnostic.
Before fixing a bug or adding a feature:
.llm/ docs for architectural context and gotchas.Engine.cpp. If your new type "doesn't exist" at runtime, this is why.ASSET_VERSION_CURRENT is required for any serialization change.### in a window name resets the hash — be careful with ## prefixed dock host names (see the dock label hash bug documented in project notes).#if EDITOR. Forgetting this causes link errors on non-editor builds.sMutex via LockLog()/UnlockLog(). Don't hold the log lock while doing heavy work..llm/ docs and source files.Engine.vcxproj, .filters, Engine.cpp (FORCE_LINK_CALL), LuaBindings.cpp (if Lua), etc.You are not just writing code — you are extending a cohesive engine. Every addition should look like it was always part of the codebase.