ワンクリックで
lemur-ui
Build user interfaces using Lemur UI framework. Use when creating menus, HUD elements, buttons, labels, or other GUI components.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Build user interfaces using Lemur UI framework. Use when creating menus, HUD elements, buttons, labels, or other GUI components.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
ArenaModule interface (api/) — arena-composition contract per ADR-0008. ModuleCatalog, ModuleLoader, and ArenaModuleSystem are live. Author new ArenaModule classes under infinity-server/src/main/java/infinity/modules/<category>/ and register them in ModuleCatalog.
Work with Subspace Infinity arena settings — the per-arena `arena.groovy` files under `zone/arenas/`, the Groovy `conf/` preset fragment library (section/shipSection/shipSections DSL), the recursive `include` directive, the `SettingsSystem` typed accessors, and the `~loadArena`/`~swapMap` commands. Use when adding or reading settings, creating a new arena, or splitting settings fragments.
Explains the api ↔ server ↔ client layering of Subspace Infinity — which module new code belongs in, how data flows between layers, which packages live in which Gradle module, and the SimEthereal + RMI boundaries. Use when deciding where a new file should live, tracing data across layers, or explaining the project structure.
Overview of Subspace Infinity project structure, tech stack, and conventions. Use when understanding the codebase, finding files, or learning project patterns.
Create Zay-ES EntityComponent classes for the ECS architecture. Use when creating new components, data holders, or entity attributes.
Debug Entity-Component-System issues including EntitySet problems, memory leaks, and component queries. Use when troubleshooting ECS bugs or entity processing issues.
| name | lemur-ui |
| description | Build user interfaces using Lemur UI framework. Use when creating menus, HUD elements, buttons, labels, or other GUI components. |
Lemur is the UI framework for building game interfaces. Documentation from official wiki.
// In simpleInitApp() or app initialization
GuiGlobals.initialize(this);
// Load the 'glass' style (requires Groovy dependency)
BaseStyles.loadGlassStyle();
// Set 'glass' as default style
GuiGlobals.getInstance().getStyles().setDefaultStyle("glass");
Important: GUI elements are positioned by their upper left corner and grow down and right. This is a compromise between OpenGL (0,0 at lower left) and traditional UI (0,0 at upper left).
// Put window at upper area - elements grow DOWN from this point
myWindow.setLocalTranslation(300, 300, 0);
Spatial
└── Panel (base: background, border, insets, alpha)
├── Container (adds layout support)
└── Label (adds text, icon, font, color)
└── Button (adds click commands, highlight)
background: Background component (QuadComponent)border: Border component (underneath background)insets: Insets3f - space around element within parent (like CSS margin)alpha: Fade in/out entire hierarchy// Create with default SpringGridLayout
Container myWindow = new Container();
guiNode.attachChild(myWindow);
// Or with specific layout
Container c = new Container(new BorderLayout());
text: Display texticon: Icon componentfont, fontSize: Text renderingtextVAlignment: VAlignment.Top/Bottom/CentertextHAlignment: HAlignment.Left/Right/Centercolor: Text colorshadowColor, shadowOffset: Text shadowLabel label = new Label("Hello, World.");
label.setFontSize(16);
label.setColor(ColorRGBA.White);
Extends Label with click support.
Button clickMe = myWindow.addChild(new Button("Click Me"));
clickMe.addClickCommands(new Command<Button>() {
@Override
public void execute(Button source) {
System.out.println("Clicked!");
}
});
// Or with lambda
clickMe.addClickCommands(source -> System.out.println("Clicked!"));
Button Actions: ButtonAction.Down, Up, Click, HighlightOn, HighlightOff
text: Entered text valuesingleLine: true (default) or false for multilinepreferredWidth: Width hint for layoutsTextField field = new TextField("default");
String value = field.getText();
Row-major by default. Children added to grid cells.
Container c = new Container(); // SpringGridLayout by default
// Explicit grid positions (row, column)
c.addChild(new Label("Foo"), 0, 0);
c.addChild(new Label("Bar"), 1, 0);
// Shortcut - auto-increments row
c.addChild(new Label("Foo"));
c.addChild(new Label("Bar"));
// Two-column layout - specify column only
c.addChild(new Label("Name:"));
c.addChild(new TextField("value"), 1); // column 1
c.addChild(new Label("Age:"));
c.addChild(new TextField("25"), 1); // column 1
Container c = new Container(new BorderLayout());
c.addChild(new Label("Top"), Position.North);
c.addChild(new Label("Bottom"), Position.South);
c.addChild(new Label("Center"), Position.Center);
c.addChild(new Label("Left"), Position.West);
c.addChild(new Label("Right"), Position.East);
Slider slider = new Slider(); // x-axis default
slider.setDelta(1); // increment amount
double value = slider.getModel().getValue();
ProgressBar progress = new ProgressBar();
progress.setProgressPercent(0.5); // 50%
progress.setMessage("Loading...");
ListBox<String> listBox = new ListBox<>();
listBox.getModel().add("Item 1");
listBox.getModel().add("Item 2");
// Add to state manager once
stateManager.attach(new OptionPanelState());
// Show modal dialogs
getState(OptionPanelState.class).show("Title", "Message");
getState(OptionPanelState.class).showError("Error", "Something went wrong");
Define style hierarchy: container.contained.contained
// Create with ElementId
Container window = new Container(new ElementId("mywindow"));
Button btn = new Button("Click", new ElementId("mywindow.button"));
// Style all elements of 'glass' style
selector('glass') {
fontSize = 20
}
// Style specific element ID
selector('button', 'glass') {
color = color(0.5, 0.75, 0.75, 0.85)
background = new QuadBackgroundComponent(color(0, 1, 0, 1))
}
// Containment selector - only buttons inside sliders
selector('slider', 'button', 'glass') {
fontSize = 10
}
Styles styles = GuiGlobals.getInstance().getStyles();
Attributes attrs = styles.getSelector("button", "glass");
attrs.set("color", new ColorRGBA(0.5f, 0.75f, 0.75f, 0.85f));
attrs.set("fontSize", 14);
import com.simsilica.lemur.ActionButton;
import com.simsilica.lemur.CallMethodAction;
ActionButton btn = new ActionButton(
new CallMethodAction("Button Text", this, "methodName")
);
btn.setInsets(new Insets3f(5, 10, 5, 10));
window.addChild(btn);
// Method called when clicked
protected void methodName() {
log.info("Button clicked");
}
public class MainMenuState extends BaseAppState {
private Container mainWindow;
@Override
protected void initialize(Application app) {
mainWindow = new Container();
// Build UI...
}
@Override
protected void onEnable() {
((SimpleApplication) getApplication()).getGuiNode().attachChild(mainWindow);
GuiGlobals.getInstance().requestCursorEnabled(this);
}
@Override
protected void onDisable() {
mainWindow.removeFromParent();
GuiGlobals.getInstance().releaseCursorEnabled(this);
}
}
infinity/assets/Interface/