Stage Editor Translatable

This commit is contained in:
Furo
2025-07-23 19:49:43 +02:00
parent 8565bf280a
commit 17f072a40f
15 changed files with 271 additions and 109 deletions
@@ -1,4 +1,4 @@
<window width="550" height="570" title="Editing Character ${button.getName()}">
<window width="550" height="570" title="${translate('win-character-title', [button.getName()])}">
<set name="XOFFSET" value="30" />
<set name="YOFFSET" value="40" />
<set name="TO" value="64" />
@@ -16,7 +16,7 @@
}
</exec>
<title name="title" x="20" y="30 + 16" text="Character Data" />
<title name="title" x="20" y="30 + 16" text="${translate('character-title')}" />
<section>
<set name="curY" value="title.y + TO" />
@@ -24,51 +24,51 @@
<stepper name="xStepper" label="X" value="char.x" x="col(0)" y="curY" step="1" width="100" />
<stepper name="yStepper" label="Y" value="char.y" x="last.x + last.bWidth + XOFFSET - 20" y="curY" step="1" width="100" />
<stepper name="scrollXStepper" label="Scroll X" value="char.scrollFactor.x" x="col(1)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scrollYStepper" label="Scroll Y" value="char.scrollFactor.y" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scrollXStepper" label="${translate('scroll', ['X'])}" value="char.scrollFactor.x" x="col(1)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scrollYStepper" label="${translate('scroll', ['Y'])}" value="char.scrollFactor.y" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scaleXStepper" label="Scale X" value="char.scale.x / charScale" x="col(2)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scaleYStepper" label="Scale Y" value="char.scale.y / charScale" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scaleXStepper" label="${translate('scale', ['X'])}" value="char.scale.x / charScale" x="col(2)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scaleYStepper" label="${translate('scroll', ['Y'])}" value="char.scale.y / charScale" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
</section>
<section>
<set name="curY" value="xStepper.y + xStepper.bHeight + YOFFSET" />
<stepper name="camxStepper" label="Cam X" value="getEx('camX')" x="col(0)" y="curY" step="1" width="100" />
<stepper name="camyStepper" label="Cam Y" value="getEx('camY')" x="last.x + last.bWidth + XOFFSET - 20" y="curY" step="1" width="100" />
<stepper name="camxStepper" label="${translate('camera', ['X'])}" value="getEx('camX')" x="col(0)" y="curY" step="1" width="100" />
<stepper name="camyStepper" label="${translate('camera', ['Y'])}" value="getEx('camY')" x="last.x + last.bWidth + XOFFSET - 20" y="curY" step="1" width="100" />
<label name="spacingLabel" text="Spacing (X, Y)" x="col(1)" y="curY" size="15" />
<label name="spacingLabel" text="${translate('spacing')}" x="col(1)" y="curY" size="15" />
<stepper name="spacingXStepper" value="getEx('spacingX')" x="col(1)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="spacingYStepper" value="getEx('spacingY')" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<stepper name="skewXStepper" label="Skew X" value="char.skew.x" x="col(2)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="skewYStepper" label="Skew Y" value="char.skew.y" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<stepper name="skewXStepper" label="${translate('skew', ['X'])}" value="char.skew.x" x="col(2)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="skewYStepper" label="${translate('skew', ['Y'])}" value="char.skew.y" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
</section>
<section>
<set name="curY" value="camxStepper.y + camxStepper.bHeight + YOFFSET" />
<stepper name="alphaStepper" label="Alpha" value="char.alpha / 0.75" x="col(0)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="angleStepper" label="Angle" value="char.angle" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<stepper name="alphaStepper" label="${translate('alpha')}" value="char.alpha / 0.75" x="col(0)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="angleStepper" label="${translate('angle')}" value="char.angle" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<stepper name="zoomFactorStepper" label="Zoom Factor" value="char.zoomFactor" x="col(1)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="zoomFactorStepper" label="${translate('zoomFactor')" value="char.zoomFactor" x="col(1)" y="curY" precision="2" step="0.01" width="100" />
<section if="!StringTools.startsWith(char.name, 'NO_DELETE_')">
<textbox name="charName" label="Position Name" value="char.name" x="col(2)" y="curY" width="100"/>
<textbox name="charName" label="${translate('positionName')}" value="char.name" x="col(2)" y="curY" width="100"/>
</section>
</section>
<section>
<set name="curY" value="alphaStepper.y + alphaStepper.bHeight + YOFFSET - 20" />
<checkbox name="flipXCheckbox" text="Flip X" value="char.isPlayer" x="col(0)" y="curY" />
<checkbox name="flipXCheckbox" text="${translate('flipX')}" value="char.isPlayer" x="col(0)" y="curY" />
<radio for="memoryCheck" name="highMemoryRadio" text="High Memory Only" value="getEx('highMemory')" x="last.field.x + last.field.width + XOFFSET * 2" y="curY" />
<radio for="memoryCheck" name="lowMemoryRadio" text="Low Memory Only" value="getEx('lowMemory')" x="last.field.x + last.field.width + XOFFSET * 2" y="curY" />
<radio for="memoryCheck" name="highMemoryRadio" text="${translate('highMemory')}" value="getEx('highMemory')" x="last.field.x + last.field.width + XOFFSET * 2" y="curY" />
<radio for="memoryCheck" name="lowMemoryRadio" text="${translate('lowMemory')}" value="getEx('lowMemory')" x="last.field.x + last.field.width + XOFFSET * 2" y="curY" />
</section>
<section if="previewSprite != null">
<title name="previewTitle" x="20" y="self.winHeight - 220" text="Preview Transform:" size="15" />
<title name="previewTitle" x="20" y="self.winHeight - 220" text="${translate('transformPreview')}" size="15" />
</section>
<section if="previewSprite == null">
<exec>
@@ -1,4 +1,4 @@
<window width="1056" height="520" title="Editing Sprite ${button.getName()}">
<window width="1056" height="520" title="${translate('win-sprite-title', [button.getName()])}">
<set name="MARGIN" value="20" />
<set name="XOFFSET" value="50" />
<set name="YOFFSET" value="40" />
@@ -17,15 +17,15 @@
}
</exec>
<title name="title" x="20" y="30 + 16" text="Sprite Data" />
<title name="title" x="20" y="30 + 16" text="${translate('sprite-title')}" />
<section> <!-- ROW 1 -->
<set name="curY" value="title.y + TO" />
<textbox name="nameTextBox" label="Name Identifier" value="button.getName()" x="col(0)" y="curY" width="200" height="32" />
<textbox name="nameTextBox" label="${translate('nameID')}" value="button.getName()" x="col(0)" y="curY" width="200" height="32" />
<textbox name="spriteTextBox" value="getEx('imageFile')" x="last.x + last.bWidth + XOFFSET" y="curY" width="200" height="32" />
<stepper name="alphaStepper" label="Alpha" value="sprite.alpha" x="spriteTextBox.x + spriteTextBox.bWidth + XOFFSET" y="curY" precision="2" step="0.01" width="100" />
<label name="imageFile" text="Image File (WIP: needs reload)&#10;In (${stage.spritesParentFolder})" x="spriteTextBox.x" y="spriteTextBox.y - 14" size="15" />
<label name="imageFile" text="${translate('imageFile')}" x="spriteTextBox.x" y="spriteTextBox.y - 14" size="15" />
</section>
<section> <!-- ROW 2 -->
@@ -34,36 +34,36 @@
<stepper name="xStepper" label="X" value="sprite.x" x="col(0)" y="curY" step="1" width="100" />
<stepper name="yStepper" label="Y" value="sprite.y" x="last.x + last.bWidth + XOFFSET - 20" y="curY" step="1" width="100" />
<stepper name="scrollXStepper" label="Scroll X" value="sprite.scrollFactor.x" x="spriteTextBox.x" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scrollYStepper" label="Scroll Y" value="sprite.scrollFactor.y" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scrollXStepper" label="${translate('scroll', ['X'])}" value="sprite.scrollFactor.x" x="spriteTextBox.x" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scrollYStepper" label="${translate('scroll', ['Y'])}" value="sprite.scrollFactor.y" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scaleXStepper" label="Scale X" value="sprite.scale.x" x="col(2)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scaleYStepper" label="Scale Y" value="sprite.scale.y" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scaleXStepper" label="${translate('scale', ['X'])}" value="sprite.scale.x" x="col(2)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="scaleYStepper" label="${translate('scroll', ['Y'])}" value="sprite.scale.y" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
</section>
<section> <!-- ROW 3 -->
<set name="curY" value="xStepper.y + xStepper.bHeight + YOFFSET" />
<stepper name="angleStepper" label="Angle" value="sprite.angle" x="col(0)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="zoomFactorStepper" label="Zoom Factor" value="sprite.zoomFactor" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<stepper name="angleStepper" label="${translate('angle')}" value="sprite.angle" x="col(0)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="zoomFactorStepper" label="${translate('zoomFactor')}" value="sprite.zoomFactor" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<!-- TODO: Simplify this -->
<dropdown name="animType" label="Animation Type" value="sprite.spriteAnimType" x="col(1)" y="curY" width="150" height="32">
<item label="NONE" value="0" />
<item label="BEAT" value="1" />
<item label="LOOP" value="2" />
<dropdown name="animType" label="${translate('animType')}" value="sprite.spriteAnimType" x="col(1)" y="curY" width="150" height="32">
<item label="${translate('animType.none')}" value="0" />
<item label="${translate('animType.beat')}" value="1" />
<item label="${translate('animType.loop')}" value="2" />
</dropdown>
<stepper name="skewXStepper" label="Skew X" value="sprite.skew.x" x="col(2)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="skewYStepper" label="Skew Y" value="sprite.skew.y" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
<stepper name="skewXStepper" label="${translate('skew', ['X'])}" value="sprite.skew.x" x="col(2)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="skewYStepper" label="${translate('skew', ['Y'])}" value="sprite.skew.y" x="last.x + last.bWidth + XOFFSET - 20" y="curY" precision="2" step="0.01" width="100" />
</section>
<section> <!-- ROW 4 -->
<set name="curY" value="angleStepper.y + angleStepper.bHeight + YOFFSET" />
<checkbox name="antialiasingCheckbox" text="Antialiasing" value="sprite.antialiasing" x="col(0)" y="curY" />
<radio for="memoryCheck" name="highMemoryRadio" text="High Memory Only" value="getEx('highMemory')" x="col(1)" y="curY" />
<radio for="memoryCheck" name="lowMemoryRadio" text="Low Memory Only" value="getEx('lowMemory')" x="col(2)" y="curY" />
<checkbox name="antialiasingCheckbox" text="${translate('antialiasing')}" value="sprite.antialiasing" x="col(0)" y="curY" />
<radio for="memoryCheck" name="highMemoryRadio" text="${translate('highMemory')}" value="getEx('highMemory')" x="col(1)" y="curY" />
<radio for="memoryCheck" name="lowMemoryRadio" text="${translate('lowMemory')}" value="getEx('lowMemory')" x="col(2)" y="curY" />
<!-- TODO: Animation list -->
</section>
@@ -72,7 +72,7 @@
<set name="curY" value="title.y + TO" />
<set name="listWidth" value="250" />
<buttonlist name="animations" label="Animations (TODO)" x="col(3)" y="curY" width="listWidth" height="330" buttonSizeX="listWidth-10" buttonSizeY="35" buttonSpacing="5">
<buttonlist name="animations" label="${translate('animations')}" x="col(3)" y="curY" width="listWidth" height="330" buttonSizeX="listWidth-10" buttonSizeY="35" buttonSpacing="5">
<texture path="editors/ui/inputbox" />
<camSpacing value="0" />
@@ -103,14 +103,14 @@
</code> -->
</buttonlist>
<text text="Tip: To access custom properties,&#10;hold shift when clicking edit" x="col(2) - 60" y="self.winHeight - 50" size="15" />
<text text="${translate('tipCustomProperties')}" x="col(2) - 60" y="self.winHeight - 50" size="15" />
</section>
<!-- Preview Transform -->
<section if="previewSprite != null">
<title name="previewTitle" x="20" y="self.winHeight - 150" text="Preview Transform:" size="15" />
<title name="previewTitle" x="20" y="self.winHeight - 150" text="${translate('transformPreview')}" size="15" />
</section>
<exec>
@@ -1,4 +1,4 @@
<window width="470" height="620" title="Editing Stage Info '${stage.stageName}'">
<window width="470" height="620" title="${translate('win-title', [stage.stageName])}">
<set name="MARGIN" value="20" />
<set name="XOFFSET" value="50" />
<set name="YOFFSET" value="40" />
@@ -28,31 +28,31 @@
}
</exec>
<title name="title" x="MARGIN" y="30 + 16" text="Stage Info" />
<title name="title" x="MARGIN" y="30 + 16" text="${translate('title')}" />
<section> <!-- ROW 1 -->
<set name="curY" value="title.y + TO" />
<textbox name="nameTextBox" label="Stage Name" value="stage.stageName" x="col(0)" y="curY" width="200" height="32" />
<textbox name="nameTextBox" label="${translate('stageName')}" value="stage.stageName" x="col(0)" y="curY" width="200" height="32" />
<textbox name="spritePathTextBox" value="stage.spritesParentFolder" x="col(1)" y="curY" width="200" height="32" />
<label text="Sprite Path&#10;(Needs Refresh)" x="spritePathTextBox.x" y="spritePathTextBox.y - 14" size="15" />
<label text="${translate('spritePath')}" x="spritePathTextBox.x" y="spritePathTextBox.y - 14" size="15" />
</section>
<section> <!-- ROW 2 -->
<set name="curY" value="nameTextBox.y + nameTextBox.bHeight + YOFFSET" />
<label text="Start Cam Pos (X, Y)" x="col(0)" y="curY" />
<label text="${translate('startCamPos')}" x="col(0)" y="curY" />
<stepper name="camxStepper" value="stage.startCam.x" x="col(0)" y="curY" step="1" width="120" />
<stepper name="camyStepper" value="stage.startCam.y" x="last.x + last.bWidth + XOFFSET - 30" y="curY" step="1" width="120" />
<stepper name="zoomStepper" label="Zoom" value="stage.defaultZoom" x="col(1)" y="curY" precision="2" step="0.01" width="100" />
<stepper name="zoomStepper" label="${translate('zoom')}" value="stage.defaultZoom" x="col(1)" y="curY" precision="2" step="0.01" width="100" />
</section>
<section>
<set name="curY" value="camxStepper.y + camxStepper.bHeight + YOFFSET" />
<set name="listWidth" value="self.winWidth - MARGIN * 2" />
<buttonlist name="attributesList" label="Custom Attributes" x="col(0)" y="curY" width="listWidth" height="290" buttonSizeX="listWidth-10" buttonSizeY="35" buttonSpacing="5">
<buttonlist name="attributesList" label="${translate('customAttributes')}" x="col(0)" y="curY" width="listWidth" height="290" buttonSizeX="listWidth-10" buttonSizeY="35" buttonSpacing="5">
<texture path="editors/ui/inputbox" />
<camSpacing value="0" />
@@ -1,4 +1,4 @@
<window width="350" height="570" title="Editing XML <${button.getName()} />">
<window width="350" height="570" title="${translate('win-title', [button.getName()])}">
<set name="MARGIN" value="20" />
<set name="XOFFSET" value="30" />
<set name="YOFFSET" value="40" />
@@ -10,25 +10,25 @@
}
</exec>
<title name="title" x="MARGIN" y="30 + 16" text="Xml Data" />
<title name="title" x="MARGIN" y="30 + 16" text="${translate('title')}" />
<section>
<set name="curY" value="title.y + TO" />
<textbox name="nodeNameTextBox" label="Element Name" value="button.getName()" x="col(0)" y="curY" width="280" height="32" />
<textbox name="nodeNameTextBox" label="${translate('elementName')}" value="button.getName()" x="col(0)" y="curY" width="280" height="32" />
</section>
<section>
<set name="curY" value="nodeNameTextBox.y + nodeNameTextBox.bHeight + YOFFSET - 30" />
<radio for="memoryCheck" name="highMemoryRadio" text="High Memory Only" value="button.highMemory" x="col(0)" y="curY" />
<radio for="memoryCheck" name="lowMemoryRadio" text="Low Memory Only" value="button.lowMemory" x="col(0)" y="last.y + last.check.height + YOFFSET - 30" />
<radio for="memoryCheck" name="highMemoryRadio" text="${translate('highMemory')}" value="button.highMemory" x="col(0)" y="curY" />
<radio for="memoryCheck" name="lowMemoryRadio" text="${translate('lowMemory')}" value="button.lowMemory" x="col(0)" y="last.y + last.check.height + YOFFSET - 30" />
</section>
<section>
<set name="curY" value="lowMemoryRadio.y + lowMemoryRadio.check.height + YOFFSET" />
<set name="listWidth" value="self.winWidth - MARGIN * 2" />
<buttonlist name="attributesList" label="Attributes" x="col(0)" y="curY" width="listWidth" height="260" buttonSizeX="listWidth-10" buttonSizeY="35" buttonSpacing="5">
<buttonlist name="attributesList" label="${translate('attributes')}" x="col(0)" y="curY" width="listWidth" height="260" buttonSizeX="listWidth-10" buttonSizeY="35" buttonSpacing="5">
<texture path="editors/ui/inputbox" />
<camSpacing value="0" />
@@ -1,4 +1,4 @@
<window width="450" height="570" title="Editing XML ${type}">
<window width="450" height="570" title="${translate('win-title', [type])}">
<!-- BASED ON unknownEditScreen.xml -->
<set name="MARGIN" value="20" />
<set name="XOFFSET" value="30" />
@@ -11,13 +11,13 @@
}
</exec>
<title name="title" x="MARGIN" y="30 + 16" text="Xml Data" />
<title name="title" x="MARGIN" y="30 + 16" text="${translate('title')}" />
<section>
<set name="curY" value="title.y + TO" />
<set name="listWidth" value="self.winWidth - MARGIN * 2" />
<buttonlist name="attributesList" label="Attributes" x="col(0)" y="curY" width="listWidth" height="400" buttonSizeX="listWidth-10" buttonSizeY="35" buttonSpacing="5">
<buttonlist name="attributesList" label="${translate('attributes')}" x="col(0)" y="curY" width="listWidth" height="400" buttonSizeX="listWidth-10" buttonSizeY="35" buttonSpacing="5">
<texture path="editors/ui/inputbox" />
<camSpacing value="0" />
+131 -3
View File
@@ -24,19 +24,19 @@
<str id="foundAtlas">{0} Spritemap Found</str>
<str id="foundAtlasplural">{0} Spritemaps Found</str>
<str id="fileAlreadyExists">The following files alreadly exist: \n\n{0}\n\nIMPORTANT: OVERRIDING CAN NOT BE UNDONE!!!!!!!!</str>
<str id="fileAlreadyExists">The following files alreadly exist: \n\n{0}\n\nIMPORTANT: OVERRIDING CAN NOT BE UNDONE!</str>
<str id="override">Override Files</str>
<str id="useExisting">Use Existing</str>
</group>
<group name="EditorPicker" prefix="editor.">
<str id="alphabet.name">Alphabet Editor</str>
<str id="chart.name">Chart Editor</str>
<str id="character.name">Character Editor</str>
<str id="stage.name">Stage Editor</str>
<str id="uiDebug.name">UI Debug State</str>
<str id="wiki.name">Wiki</str>
<str id="debugOptions.name">Debug Options</str>
<str id="alphabet.name">Alphabet Editor</str>
</group>
<group name="ChartEditor">
@@ -429,7 +429,6 @@
<str id="charImageFile">Character Image File $* Required$</str>
</group>
</group>
<str id="name">Character Editor</str>
</group>
<group name="CharacterCreationScreen" prefix="characterCreationScreen.">
@@ -497,6 +496,135 @@
</group>
</group>
<group name="StageEditor">
<group name="StageSelection" prefix="stageSelection.">
<str id="desc">Select a stage to edit. HSCRIPT only stages are not supported.</str>
<str id="acceptStage">Press ACCEPT to edit this stage.</str>
<str id="newStage">New Stage</str>
<str id="acceptNewStage">Press ACCEPT to create a new stage.</str>
</group>
<group name="StageEditor" prefix="stageEditor.">
<group name="TopBar">
<str id="topBar.file">File</str>
<group name="FileMenu" prefix="file.">
<str id="save">Save</str>
<str id="saveAs">Save As...</str>
<str id="exit">Exit</str>
</group>
<str id="topBar.edit">Edit</str>
<group name="EditMenu" prefix="edit.">
<str id="undo">Undo</str>
<str id="redo">Redo</str>
<str id="editStageInfo">Edit Stage Info</str>
</group>
<str id="topBar.select">Selection</str>
<group name="SelectionMenu" prefix="select.">
<str id="all">Select All</str>
<str id="deselect">Deselect</str>
<str id="inverse">Inverse Selection</str>
</group>
<str id="topBar.view">View</str>
<group name="ViewMenu" prefix="view.">
<str id="zoomIn">Zoom in</str>
<str id="zoomOut">Zoom out</str>
<str id="zoomReset">Reset Zoom</str>
<str id="focusDad">Focus Dad</str>
<str id="focusGF">Focus GF</str>
<str id="focusBF">Focus BF</str>
</group>
<str id="topBar.editor">Editor</str>
<group name="EditorMenu" prefix="editor.">
<str id="showCharacters">Show Characters</str>
</group>
<group name="StageSpriteScreen" prefix="stageSpriteScreen.">
<str id="win-title">Edit stage sprite</str>
<str id="stageImageFile">Stage Image File $* Required$</str>
</group>
</group>
</group>
<group name="StageCreationScreen" prefix="stageCreationScreen.">
<str id="win-title">Creating New Stage</str>
<str id="title">Stage Info</str>
<str id="stageName">Stage Name</str>
<str id="stagePath">Stage Path</str>
</group>
<group name="StageInfoScreen" prefix="stageInfoScreen">
<str id="win-title">Editing Stage "{0}" Infos</str>
<str id="title">Stage Info</str>
<str id="stageName">Stage Name</str>
<str id="spritePath">Sprite Path\n(Needs Refresh)</str>
<str id="startCamPos">Start Camera Position (X, Y)</str>
<str id="zoom">Zoom</str>
</group>
<group name="StageElementEditScreen" prefix="stageElementEditScreen.">
<str id="win-character-title">Editing Character "{0}"</str>
<str id="win-sprite-title">Editing Sprite "{0}"</str>
<str id="win-title">Editing XML &lt;{0} /&gt;</str>
<str id="character-title">Character Data</str>
<str id="sprite-title">Sprite Data</str>
<str id="title">XML Data</str>
<str id="elementName">Element Name</str>
<str id="nameID">Name Identifier</str>
<str id="imageFile">Image File (WIP: needs reload)\nIn (${stage.spritesParentFolder})</str>
<str id="scroll">Scroll {0}</str>
<str id="scale">Scale {0}</str>
<str id="camera">Camera {0}</str>
<str id="spacing">Spacing (X, Y)</str>
<str id="skew">Skew {0}</str>
<str id="alpha">Alpha</str>
<str id="angle">Angle</str>
<str id="zoomFactor">Zoom Factor</str>
<str id="positionName">Position Name</str>
<str id="flipX">Flip X</str>
<str id="antialiasing">Antialiasing</str>
<str id="highMemory">High Memory</str>
<str id="lowMemory">Low Memory</str>
<str id="attributes">Attributes</str>
<str id="transformPreview">Transform Preview:</str>
<str id="animType">Animation Type</str>
<group name="AnimTypeDropdown" prefix="animType.">
<str id="none">NONE</str>
<str id="beat">BEAT</str>
<str id="loop">LOOP</str>
</group>
<str id="tipCustomProperties">Tip: To access custom properties,\nHold Shift when clicking edit</str>
</group>
<group name="StageXMLEditScreen" prefix="stageXMLEditScreen.">
<str id="win-title">Editing {0} XML</str>
<str id="title">Xml Data</str>
<str id="attributes">Attributes</str>
</group>
<str id="stageCharacters.requiredPosition">This character position is required in stages!</str>
<str id="stageCharacters.noDeleteGirlfriend">You can't delete Girlfriend</str>
<group name="StageElement" prefix="stageElement.">
<str id="scale">Scale: {0}, {1}</str>
<str id="scroll">Scroll: {0}, {1}</str>
</group>
<group name="StageSprites" prefix="stageSprites.">
<str id="win-title">Stage Sprites</str>
<str id="sprite">Sprite</str>
<str id="box">Box</str>
<str id="character">Character</str>
<str id="warnings.not-implemented">Creating a box isnt implemented yet!</str>
</group>
</group>
<!-- PlayTesting and SaveWarning are almost the same but with some small differences -->
<!-- PlayTesting allows color in the description by doing *hello* -->
<!-- SaveWarning doesn't allow color in the description -->
@@ -73,7 +73,7 @@ class CharacterEditor extends UIState {
undos = new UndoList<CharacterEditorChange>();
WindowUtils.suffix = " (" + translate("name") + ")";
WindowUtils.suffix = " (" + TU.translate("editor.character.name") + ")";
SaveWarning.selectionClass = CharacterSelection;
SaveWarning.saveFunc = () -> {_file_save(null);};
@@ -20,8 +20,11 @@ class StageCreationScreen extends UISubstateWindow {
if (onSave != null) this.onSave = onSave;
}
inline function translate(id:String, ?args:Array<Dynamic>)
return TU.translate("stageCreationScreen." + id, args);
public override function create() {
winTitle = "Creating New Stage";
winTitle = translate("win-title");
winWidth = 748 - 32 + 40;
winHeight = 220;
@@ -35,13 +38,13 @@ class StageCreationScreen extends UISubstateWindow {
}
var stageInfo:UIText;
add(stageInfo = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, "Stage Info", 28));
add(stageInfo = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, translate("title"), 28));
add(stageNameTextBox = new UITextBox(stageInfo.x, stageInfo.y + stageInfo.height + 36, "Stage Name"));
addLabelOn(stageNameTextBox, "Stage Name");
add(stageNameTextBox = new UITextBox(stageInfo.x, stageInfo.y + stageInfo.height + 36, translate("stage-name")));
addLabelOn(stageNameTextBox, translate("stage-name"));
add(stagePathTextBox = new UITextBox(stageNameTextBox.x + 320 + 26, stageNameTextBox.y, "Stage Path"));
addLabelOn(stagePathTextBox, "Stage Path");
add(stagePathTextBox = new UITextBox(stageNameTextBox.x + 320 + 26, stageNameTextBox.y, translate("stage-path")));
addLabelOn(stagePathTextBox, translate("stage-path"));
add(saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20 - 125, windowSpr.y + windowSpr.bHeight - 16 - 32, TU.translate("editor.saveClose"), function() {
saveStageInfo();
+35 -25
View File
@@ -71,6 +71,9 @@ class StageEditor extends UIState {
return "stageEditor." + id;
}
inline function translate(id:String, ?args:Array<Dynamic>)
return TU.translate("stageEditor." + id, args);
public function new(stage:String) {
super();
if (stage != null) __stage = stage;
@@ -79,47 +82,47 @@ class StageEditor extends UIState {
public override function create() {
super.create();
WindowUtils.suffix = " (Stage Editor)";
WindowUtils.suffix = " (" + TU.translate("editor.stage.name") + ")";
SaveWarning.selectionClass = StageSelection;
SaveWarning.saveFunc = () -> {_file_save(null);};
topMenu = [
{
label: "File",
label: translate("topBar.file"),
childs: [
{
label: "Save",
label: translate("file.save"),
keybind: [CONTROL, S],
onSelect: _file_save,
},
{
label: "Save As...",
label: translate("file.saveAs"),
keybind: [CONTROL, SHIFT, S],
onSelect: _file_saveas,
},
null,
{
label: "Exit",
label: translate("file.exit"),
onSelect: _file_exit
}
]
},
{
label: "Edit",
label: translate("topBar.edit"),
childs: [
{
label: "Undo",
label: translate("edit.undo"),
keybind: [CONTROL, Z],
onSelect: _edit_undo,
},
{
label: "Redo",
label: translate("edit.redo"),
keybind: [CONTROL, SHIFT, Z],
onSelect: _edit_redo,
},
null,
{
label: "Edit Stage Info",
label: translate("edit.editStageInfo"),
onSelect: (_) -> {
openSubState(new UISoftcodedWindow(
"layouts/stage/stageInfoScreen",
@@ -130,7 +133,10 @@ class StageEditor extends UIState {
"stage" => stage,
"Stage" => Stage,
"exID" => exID,
"CEditInfo" => StageChange.CEditInfo
"CEditInfo" => StageChange.CEditInfo,
"translate" => function (id:String, ?args:Array<Dynamic>) {
return TU.translate("stageInfoScreen." + id, args);
}
]
));
},
@@ -138,56 +144,56 @@ class StageEditor extends UIState {
]
},
{
label: "Select",
label: translate("topBar.select"),
childs: [
{
label: "All",
label: translate("select.all"),
keybind: [CONTROL, A],
onSelect: (_) -> _select_all(_),
},
{
label: "Deselect",
label: translate("select.deselect"),
keybind: [CONTROL, D],
onSelect: (_) -> _select_deselect(_),
},
{
label: "Inverse",
label: translate("select.inverse"),
keybind: [CONTROL, SHIFT, I],
onSelect: (_) -> _select_inverse(_),
},
]
},
{
label: "View",
label: translate("topBar.view"),
childs: [
{
label: "Zoom in",
label: translate("view.zoomIn"),
keybind: [CONTROL, NUMPADPLUS],
onSelect: _view_zoomin
},
{
label: "Zoom out",
label: translate("view.zoomOut"),
keybind: [CONTROL, NUMPADMINUS],
onSelect: _view_zoomout
},
{
label: "Reset zoom",
label: translate("view.zoomReset"),
keybind: [CONTROL, NUMPADZERO],
onSelect: _view_zoomreset
},
null,
{
label: "Focus Dad",
label: translate("view.focusDad"),
//keybind: [CONTROL, NUMPADZERO],
onSelect: _view_focusdad
},
{
label: "Focus Gf",
label: translate("view.focusGF"),
//keybind: [CONTROL, NUMPADZERO],
onSelect: _view_focusgf
},
{
label: "Focus BF",
label: translate("view.focusBF"),
//keybind: [CONTROL, NUMPADZERO],
onSelect: _view_focusbf
},
@@ -195,10 +201,10 @@ class StageEditor extends UIState {
]
},
{
label: "Editor",
label: translate("topBar.editor"),
childs: [
{
label: "Show Characters",
label: translate("editor.showCharacters"),
//keybind: [CONTROL, NUMPADMINUS],
onSelect: _editor_showCharacters,
icon: showCharacters ? 1 : 0
@@ -808,7 +814,7 @@ class StageEditor extends UIState {
var sprite:FunkinSprite = cast sprite;
sprite.extra.set(exID("selected"), true);
sprite.extra.get(exID("button")).selected = true;
Logs.trace("Selected " + sprite.name);
//Logs.trace("Selected " + sprite.name);
}
}
}
@@ -1350,6 +1356,9 @@ class StageXMLEditScreen extends UISoftcodedWindow {
public var xml:Access;
public var saveCallback:Void->Void;
inline function translate(id:String, ?args:Array<Dynamic>)
return TU.translate("stageXMLEditScreen." + id, args);
public function new(xml:Access, saveCallback:Void->Void, type:String = "Unknown") {
this.xml = xml;
this.saveCallback = saveCallback;
@@ -1357,7 +1366,8 @@ class StageXMLEditScreen extends UISoftcodedWindow {
"stage" => StageEditor.instance.stage,
"xml" => xml,
"exID" => StageEditor.exID,
"type" => type
"type" => type,
"translate" => translate
]);
}
@@ -21,20 +21,20 @@ class StageSelection extends EditorTreeMenu
var list:Array<OptionType> = [
for (stage in (modsList.length == 0 ? Stage.getList(false, true) : modsList)) {
stages.push(stage);
new TextOption(stage, "Press ACCEPT to edit this stage.",
new TextOption(stage, TU.translate("stageSelection.acceptStage"),
function() {
FlxG.switchState(new StageEditor(stage));
});
}
];
list.insert(0, new NewOption("New Stage", "Press ACCEPT to create a new stage.", function() {
list.insert(0, new NewOption(TU.translate("stageSelection.newStage"), TU.translate("stageSelection.acceptNewStage"), function() {
FlxG.state.openSubState(new StageCreationScreen(saveStage));
}));
main = new OptionsScreen("Stage Editor", "Select a stage to edit. HSCRIPT only stages are not supported.", list);
main = new OptionsScreen(TU.translate("editor.stage.name"), TU.translate("stageSelection.desc"), list);
//DiscordUtil.call("onEditorTreeLoaded", ["Stage Editor"]);
DiscordUtil.call("onEditorTreeLoaded", ["Stage Editor"]);
}
public function saveStage(creation:StageCreationData) {
@@ -51,7 +51,7 @@ class StageSelection extends EditorTreeMenu
#end
// Add to List
var option = new TextOption(creation.name, "Press ACCEPT to edit this stage.", function() {
var option = new TextOption(creation.name, TU.translate("stageSelection.acceptStage"), function() {
FlxG.switchState(new StageEditor(creation.name));
});
optionsTree.members[optionsTree.members.length-1].insert(1, option);
@@ -4,8 +4,12 @@ import funkin.editors.stage.elements.StageElementButton;
import funkin.editors.stage.elements.*;
class StageSpritesWindow extends UIButtonList<StageElementButton> {
inline function translate(id:String, ?args:Array<Dynamic>)
return TU.translate("stageSprites." + id, args);
public function new(x:Float, y:Float) {
super(x, y, 400, FlxG.height-25, "Stage Sprites", FlxPoint.get(400, 64));
super(x, y, 400, FlxG.height-25, translate("win-title"), FlxPoint.get(400, 64));
collapsable = true;
topAlpha = 0.9;
@@ -23,22 +27,22 @@ class StageSpritesWindow extends UIButtonList<StageElementButton> {
var screenPos = addButton.getScreenPosition(null, lastDrawCam == null ? FlxG.camera : lastDrawCam);
StageEditor.instance.openContextMenu([
{
label: "Sprite",
label: translate("sprite"),
onSelect: StageEditor.instance._sprite_new,
color: 0xFF00FF00,
icon: 2
},
{
label: "Box",
label: translate("box"),
onSelect: function(_) {
UIState.state.displayNotification(new UIBaseNotification("Creating a box isnt implemented yet!", 2, BOTTOM_LEFT));
UIState.state.displayNotification(new UIBaseNotification(translate("warnings.not-implemented"), 2, BOTTOM_LEFT));
CoolUtil.playMenuSFX(WARNING, 0.45);
},
color: 0xFF00FF00,
icon: 2
},
{
label: "Character",
label: translate("character"),
onSelect: StageEditor.instance._character_new,
color: 0xFF00FF00,
icon: 2
@@ -12,6 +12,9 @@ class StageCharacterButton extends StageElementButton {
public var char:Character;
public var charScale(get, null):Float;
inline function translate(id:String, ?args:Array<Dynamic>)
return TU.translate("stageCharacters." + id, args);
public function new(x:Float,y:Float, char:Character, xml:Access) {
this.char = char;
super(x,y, xml);
@@ -61,9 +64,9 @@ class StageCharacterButton extends StageElementButton {
public override function onDelete() {
if (char.name.startsWith("NO_DELETE_")) {
var text = "This character position is required in stages!";
if (char.name == "NO_DELTE_girlfriend" && FlxG.random.bool(1))
text = "You can't delete Girlfriend";
var text = translate("requiredPosition");
if (char.name == "NO_DELETE_girlfriend" && FlxG.random.bool(1))
text = translate("noDeleteGirlfriend");
UIState.state.displayNotification(new UIBaseNotification(text, 2, BOTTOM_LEFT));
return;
}
@@ -100,6 +103,9 @@ class StageCharacterEditScreen extends UISoftcodedWindow {
public var button:StageCharacterButton;
public var char:Character;
inline function translate(id:String, ?args:Array<Dynamic>)
return TU.translate("stageElementEditScreen." + id, args);
public function new(button:StageCharacterButton) {
this.button = button;
this.char = button.char;
@@ -117,6 +123,7 @@ class StageCharacterEditScreen extends UISoftcodedWindow {
"setEx" => function(name:String, value:Dynamic) {
char.extra.set(StageEditor.exID(name), value);
},
"translate" => translate,
]);
}
@@ -209,8 +209,10 @@ class StageElementButton extends UIButton {
var text = '${getName()} (${CoolUtil.quantize(pos.x, 100)}, ${CoolUtil.quantize(pos.y, 100)})';
var sprite = getSprite();
if(sprite != null) {
text += '\nScale: (${CoolUtil.quantize(sprite.scale.x, 100)}, ${CoolUtil.quantize(sprite.scale.y, 100)})';
text += '\nScroll: (${CoolUtil.quantize(sprite.scrollFactor.x, 100)}, ${CoolUtil.quantize(sprite.scrollFactor.y, 100)})';
var scaleText = TU.getRaw("stageElement.scale");
var scrollText = TU.getRaw("stageElement.scroll");
text += '\n${scaleText.format([CoolUtil.quantize(sprite.scale.x, 100), CoolUtil.quantize(sprite.scale.y, 100)])}';
text += '\n${scrollText.format([CoolUtil.quantize(sprite.scrollFactor.x, 100), CoolUtil.quantize(sprite.scrollFactor.y, 100)])}';
}
pos.put();
return text;
@@ -76,6 +76,9 @@ class StageSpriteEditScreen extends UISoftcodedWindow {
public var sprite:FunkinSprite;
var isSaving:Bool = false;
inline function translate(id:String, ?args:Array<Dynamic>)
return TU.translate("stageElementEditScreen." + id, args);
public function new(button:StageSpriteButton) {
this.button = button;
this.sprite = button.getSprite();
@@ -91,6 +94,7 @@ class StageSpriteEditScreen extends UISoftcodedWindow {
"setEx" => function(name:String, value:Dynamic) {
sprite.extra.set(StageEditor.exID(name), value);
},
"translate" => translate,
]);
}
@@ -75,7 +75,7 @@ class StageUnknownButton extends StageElementButton {
}
public override function getInfoText():String {
return 'Unknown\n<${getName()} />';
return TU.translate("stageElement.unknown", [getName()]);
}
public override function updatePos() {
@@ -86,13 +86,17 @@ class StageUnknownButton extends StageElementButton {
class StageUnknownEditScreen extends UISoftcodedWindow {
public var button:StageUnknownButton;
inline function translate(id:String, ?args:Array<Dynamic>)
return TU.translate("stageElementEditScreen." + id, args);
public function new(button:StageUnknownButton) {
this.button = button;
super("layouts/stage/unknownEditScreen", [
"stage" => StageEditor.instance.stage,
"button" => button,
"xml" => button.xml,
"exID" => StageEditor.exID
"exID" => StageEditor.exID,
"translate" => translate,
]);
}