Charter translatable

This commit is contained in:
Ne_Eo
2024-08-17 01:26:10 +02:00
parent c6a42bb661
commit d8d4c5907d
14 changed files with 454 additions and 190 deletions
+239 -5
View File
@@ -2,14 +2,248 @@
<language>
<group name="General Editor Translations">
<str id="editor.autosavingIn">Autosaving in {0} seconds{1}</str>
<str id="editor.autosavingCanceledSuffix">(Canceled)!</str>
<str id="editor.saveClose">Save &amp; Close</str>
<str id="editor.save">Save</str>
<str id="editor.close">Close</str>
<str id="editor.ok">Ok</str>
</group>
<group name="ChartEditor">
<str id="charter.name">Chart Editor</str>
<group name="CharterSelection" prefix="charterSelection.">
<str id="desc">Select a song to modify the charts from."</str>
<str id="accept-song">Press ACCEPT to choose a difficulty to edit.</str>
<str id="accept-difficulty">Press ACCEPT to edit the chart for the selected difficulty.</str>
<str id="selectDifficulty">Select a difficulty to continue.</str>
<str id="newDifficulty">New Difficulty</str>
<str id="newSong">New Song</str>
<str id="charter.addEvent">Add Event</str>
<str id="charter.editEvent">Edit</str> <!-- Should maybe be "Edit Event" -->
<str id="charter.deleteEvent">Delete Event</str>
<group name="Warnings" prefix="warnings.">
<str id="song-exists-title">Creating Song: Error!</str>
<str id="song-exists-body">The song you are trying to create already exists, if you would like to override it delete the song first!</str>
<str id="chart-exists-title">Creating Chart: Error!</str>
<str id="chart-exists-body">The chart you are trying to create already exists, if you would like to override it delete the chart first!</str>
</group>
</group>
<group name="ChartCreationScreen" prefix="chartCreation.">
<str id="title">Creating New Chart</str>
<str id="info">Chart Info</str>
<str id="diffName">Difficulty Name</str>
<str id="stage">Stage</str>
<str id="scrollSpeed">Scroll Speed</str>
<str id="strumLineList">Strumlines $* Atleast 1 Strumline Required$</str>
</group>
<group name="ChartDataScreen" prefix="chartDataScreen.">
<str id="title">Chart Properties</str>
<str id="editChartData">Edit Chart Data</str>
<str id="stage">Stage</str>
<str id="scrollSpeed">Scroll Speed</str>
</group>
<group name="CharterEventScreen" prefix="charterEventScreen.">
<str id="title-creating">Create Event Group</str>
<str id="title-editing">Edit Event Group</str>
<str id="noEvent">No Event</str>
</group>
<group name="CharterEventTypeSelection" prefix="charterEventTypeSelection.">
<str id="title">Choose an event type...</str>
</group>
<group name="CharterMetaDataScreen" prefix="charterMetaDataScreen.">
<str id="title">Edit Metadata</str>
<str id="songData">Song Data</str>
<str id="songName">Song Name</str>
<str id="bpm">BPM</str>
<str id="timeSignature">Time Signature</str>
<str id="menusData">Menus Data (Freeplay/Story)</str>
<str id="displayName">Display Name</str>
<str id="icon">Icon</str>
<str id="modesAllowed">Modes Allowed</str>
<str id="color">Color</str>
<str id="difficulties">Difficulties</str>
<str id="customValues">Custom Values (Advanced)</str>
<str id="opponentMode">Opponent Mode</str>
<str id="coopAllowed">Co-op Mode</str>
</group>
<group name="CharterNoteTypesList" prefix="charterNoteTypesList.">
<str id="title">Note Types List Editor</str>
<str id="editNoteTypes">Edit Note Types</str>
<str id="editType">Note Type {0}</str>
</group>
<group name="CharterStrumlineScreen" prefix="charterStrumlineScreen.">
<str id="win-title-creating">Creating strumline {0}</str>
<str id="win-title-editing">Editing strumline {0} properties</str>
<str id="title-creating">Create New Strumline</str>
<str id="title-editing">Edit Strumline Properties</str>
</group>
<group name="SongCreationScreen" prefix="songCreationScreen.">
<str id="win-title">Creating New Song</str>
<str id="title">Song Info</str>
<str id="instAudio">Inst Audio File $* Required*$</str>
<str id="voicesAudio">Vocal Audio File $* Required*$</str>
<str id="back">Back</str>
<str id="next">Next</str>
</group>
<group name="StrumlineOptions" prefix="charterStrumLine.">
<str id="characters">Characters</str>
<str id="newChar">New Char</str>
<str id="type">Type</str>
<str id="scrollSpeed">Scroll Speed</str>
<str id="stagePos">Stage Position</str>
<str id="scale">Scale</str>
<str id="hudPos">Hud Position (X [Ratio 0-1],Y)</str>
<str id="visible">Visible?</str>
<str id="useChartScrollSpeed">Uses charts scroll speed?</str>
<str id="vocalSuffix">Vocal Suffix</str>
</group>
<group name="ChartEditor" prefix="charter.">
<str id="name">Chart Editor</str>
<!-- Charter.hx -->
<group name="TopBar">
<str id="topBar.file">File</str>
<group name="FileMenu" prefix="file.">
<str id="new">New</str>
<str id="save">Save</str>
<str id="saveAs">Save As...</str>
<str id="saveWithoutEvents">Save Without Events</str>
<str id="saveWithoutEventsAs">Save Without Events As...</str>
<str id="saveEventsSeparately">Save Events Separately</str>
<str id="saveEventsSeparatelyAs">Save Events Separately As...</str>
<str id="saveMeta">Save Meta</str>
<str id="saveMetaAs">Save Meta As...</str>
<str id="exportFnfLegacy">Export For FNF Legacy...</str>
<str id="exportPsych">Export For Psych Engine...</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="copy">Copy</str>
<str id="paste">Paste</str>
<str id="cut">Cut</str>
<str id="delete">Delete</str>
</group>
<str id="topBar.chart">Chart</str>
<group name="ChartMenu" prefix="chart.">
<str id="playtest">Playtest</str>
<str id="playtestHere">Playtest here</str>
<str id="playtestOpponent">Playtest as opponent</str>
<str id="playtestOpponentHere">Playtest as opponent here</str>
<str id="enableScripts">Enable scripts during playtesting</str>
<str id="editChartData">Edit chart data</str>
<str id="editMetadata">Edit metadata information</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="resetZoom">Reset Zoom</str>
<str id="showSectionsSeparator">Show Sections Separator</str>
<str id="showBeatsSeparator">Show Beats Separator</str>
<str id="lowDetailWaveforms">Low Detail Waveforms</str>
</group>
<str id="topBar.song">Song</str>
<group name="SongMenu" prefix="song.">
<str id="goStart">Go back to the start</str>
<str id="goEnd">Go forward to the end</str> <!-- used to be "Go to the end" -->
<str id="muteInst">Mute instrumental</str>
<str id="muteVoices">Mute voices</str>
</group>
<str id="topBar.note">Note</str>
<group name="NoteMenu" prefix="note.">
<str id="addSustainLength">Add sustain length</str>
<str id="subtractSustainLength">Subtract sustain length</str>
<str id="selectAll">Select all</str>
<str id="selectMeasure">Select measure</str>
<str id="editNoteTypesList">Edit Note Types List</str>
</group>
<str id="topBar.snap">Snap</str>
<group name="SnapMenu" prefix="snap.">
<str id="increaseSnap">↑ Grid Snap</str>
<str id="resetSnap">Reset Grid Snap</str>
<str id="decreaseSnap">↓ Grid Snap</str>
<str id="snap">{0}x Grid Snap</str>
</group>
<str id="topBar.playback">Playback</str>
<group name="PlaybackMenu" prefix="playback.">
<str id="play">Play/Pause</str>
<str id="speedRaise">↑ Speed {0}%</str>
<str id="speedReset">Reset Speed</str>
<str id="speedLower">↓ Speed {0}%</str>
<str id="sectionBack">Go back a section</str>
<str id="sectionForward">Go forward a section</str>
<str id="metronome">Metronome</str>
<str id="visualMetronome">Visual metronome</str>
</group>
</group>
<group name="NoteTypes" prefix="noteTypes.">
<str id="default">Default Note</str>
</group>
<group name="EventTypes" prefix="events.">
<!-- You can add your custom event types here! -->
<!-- Just need to do some conversion from the raw name to the id -->
<!-- Example: HScript Call -> hscriptCall -->
<!-- Example: Change Character -> changeCharacter -->
<str id="hscriptCall">HScript Call</str>
<str id="cameraMovement">Camera Movement</str>
<str id="addCameraZoom">Add Camera Zoom</str>
<str id="cameraModuloChange">Camera Modulo Change</str>
<str id="cameraFlash">Camera Flash</str>
<str id="bpmChange">BPM Change</str>
<str id="scrollSpeedChange">Scroll Speed Change</str>
<str id="altAnimationToggle">Alt Animation Toggle</str>
<str id="playAnimation">Play Animation</str>
</group>
<group name="StrumlineOptions" prefix="strumLine.">
<str id="button-name">Options ↓</str>
<str id="hitsounds">Hitsounds</str>
<str id="muteVocals">Mute Vocals</str>
<str id="edit">Edit</str>
<str id="delete">Delete</str>
<str id="noWaveform">No Waveform</str>
</group>
<str id="createNew">Create New</str>
<str id="lock-unlock">Lock/Unlock</str>
<!-- CharterEventAdd.hx -->
<str id="addEvent">Add Event</str>
<str id="editEvent">Edit</str> <!-- Should maybe be "Edit Event" -->
<str id="deleteEvent">Delete Event</str>
<group name="Notifications" prefix="popup.">
<str id="savedChartAt">Saved chart at {0}!</str>
</group>
</group>
<group name="CharacterEditor">
@@ -111,7 +111,7 @@ final class TranslationUtil
* If `id` is `null` then it's gonna search using `defString`.
*/
public static inline function get(?id:String, ?params:Array<Dynamic>, ?def:String):String
return getUnformatted(id, def).format(params);
return getRaw(id, def).format(params);
public static inline function translate(?id:String, ?params:Array<Dynamic>, ?def:String):String
return get(id, params, def);
@@ -126,7 +126,7 @@ final class TranslationUtil
return false;
#end
public static function getUnformatted(id:String, ?def:String):IFormatInfo
public static function getRaw(id:String, ?def:String):IFormatInfo
{
#if TRANSLATIONS_SUPPORT
if (stringMap.exists(id)) return stringMap.get(id);
@@ -154,7 +154,7 @@ final class TranslationUtil
public static function raw2Id(str:String):String
{
var result:String = "";
for(i => s in str.split(" ")) result += (i == 0 ? s.charAt(0).toLowerCase() : s.charAt(0).toUpperCase()) + s.substr(1);
for(i => s in str.split(" ")) result += (i == 0 ? s.charAt(0).toLowerCase() : s.charAt(0).toUpperCase()) + s.substr(1).toLowerCase();
return result.length == 0 ? str : result;
}
@@ -260,6 +260,7 @@ final class TranslationUtil
if(node.getAtt("notrim").getDefault("true") != "true") value = value.trim();
value = value.replace("\\n", "\n").replace("\r", ""); // remove stupid windows line breaks and convert newline literals to newlines
leMap.set(id, FormatUtil.get(value));
//leMap.set(id, FormatUtil.getStr("{" + id + "}"));
//Logs.trace("Added " + id + " -> `" + value + "`", "Language");
}
@@ -26,7 +26,7 @@ class ChartCreationScreen extends UISubstateWindow {
}
public override function create() {
winTitle = "Creating New Chart";
winTitle = TU.translate("chartCreation.title");
winWidth = 652;
winHeight = 600;
@@ -43,11 +43,11 @@ class ChartCreationScreen extends UISubstateWindow {
if (charFileList.length == 0) charFileList = Character.getList(false);
var chartTitle:UIText;
add(chartTitle = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, "Chart Info", 28));
add(chartTitle = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, TU.translate("chartCreation.info"), 28));
difficultyNameTextBox = new UITextBox(chartTitle.x, chartTitle.y + chartTitle.height + 36, "difficulty", 200);
add(difficultyNameTextBox);
addLabelOn(difficultyNameTextBox, "Difficulty Name");
addLabelOn(difficultyNameTextBox, TU.translate("chartCreation.diffName"));
var stageFileList = Stage.getList(true);
if (stageFileList.length == 0) stageFileList = Stage.getList(false);
@@ -55,7 +55,7 @@ class ChartCreationScreen extends UISubstateWindow {
stageTextBox = new UIAutoCompleteTextBox(difficultyNameTextBox.x + 200 + 26, difficultyNameTextBox.y, "stage", 180);
stageTextBox.suggestItems = stageFileList;
add(stageTextBox);
addLabelOn(stageTextBox, "Stage");
addLabelOn(stageTextBox, TU.translate("chartCreation.stage"));
scrollSpeedTextBox = new UINumericStepper(stageTextBox.x + 180 + 26, difficultyNameTextBox.y, 1.0, 0.1, 2, null, null, 90);
scrollSpeedTextBox.onChange = function (text:String) {
@@ -65,7 +65,7 @@ class ChartCreationScreen extends UISubstateWindow {
button.scrollSpeedStepper.value = scrollSpeedTextBox.value;
}
add(scrollSpeedTextBox);
addLabelOn(scrollSpeedTextBox, "Scroll Speed");
addLabelOn(scrollSpeedTextBox, TU.translate("chartCreation.scrollSpeed"));
strumLineList = new UIButtonList<StrumLineButton>(difficultyNameTextBox.x, difficultyNameTextBox.y+difficultyNameTextBox.bHeight+36, 620, (552-179)-16, "", FlxPoint.get(620, 246), null, 6);
strumLineList.frames = Paths.getFrames('editors/ui/inputbox');
@@ -113,20 +113,20 @@ class ChartCreationScreen extends UISubstateWindow {
}, strumLineList));
add(strumLineList);
addLabelOn(strumLineList, "Strumlines").applyMarkup(
"Strumlines $* Atleast 1 Strumline Required$",
addLabelOn(strumLineList, "").applyMarkup(
TU.translate("chartCreation.strumLineList"),
[new FlxTextFormatMarkerPair(new FlxTextFormat(0xFFAD1212), "$")]);
strumLineList.dragCallback = (object:StrumLineButton, oldIndex:Int, newIndex:Int) -> {object.idText.text = 'Strumline - #${newIndex}';};
scrollSpeedTextBox.onChange(scrollSpeedTextBox.label.text);
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20 - 125, windowSpr.y + windowSpr.bHeight - 16 - 32, "Save & Close", function() {
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20 - 125, windowSpr.y + windowSpr.bHeight - 16 - 32, TU.translate("editor.saveClose"), function() {
createChart();
close();
}, 125);
add(saveButton);
closeButton = new UIButton(saveButton.x - 20 - saveButton.bWidth, saveButton.y, "Cancel", function() {
closeButton = new UIButton(saveButton.x - 20 - saveButton.bWidth, saveButton.y, TU.translate("editor.close"), function() {
close();
}, 125);
add(closeButton);
@@ -212,7 +212,7 @@ class StrumLineButton extends UIButton {
charactersList.cameraSpacing = 0;
charactersList.addButton.callback = function()
charactersList.add(new CompactCharacterButton("New Char", subState.charFileList, charactersList));
charactersList.add(new CompactCharacterButton(TU.translate("charterStrumLine.newChar"), subState.charFileList, charactersList));
for (character in strumLine.characters)
charactersList.add(new CompactCharacterButton(character, subState.charFileList, charactersList));
@@ -225,17 +225,17 @@ class StrumLineButton extends UIButton {
typeDropdown = new UIDropDown(charactersList.x + charactersList.bWidth + 16, 8+26, 200, 32, ["OPPONENT", "PLAYER", "ADDITIONAL"], strumLine.type);
members.push(typeDropdown);
addLabelOn(typeDropdown, "Type");
addLabelOn(typeDropdown, TU.translate("charterStrumLine.type"));
var stagePositionI = strumLine.position == null ? strumLine.type : ["DAD", "BOYFRIEND", "GIRLFRIEND"].indexOf(strumLine.position.toUpperCase());
stagePositionDropdown = new UIDropDown(typeDropdown.x + 200 - 32 + 26, typeDropdown.y, 200, 32, ["DAD", "BOYFRIEND", "GIRLFRIEND"], stagePositionI);
members.push(stagePositionDropdown);
addLabelOn(stagePositionDropdown, "Stage Position");
addLabelOn(stagePositionDropdown, TU.translate("charterStrumLine.stagePos"));
hudScaleStepper = new UINumericStepper(typeDropdown.x, typeDropdown.y + 64, strumLine.strumScale == null ? 1 : strumLine.strumScale, 0.001, 2, null, null, 74);
members.push(hudScaleStepper);
addLabelOn(hudScaleStepper, "Scale");
addLabelOn(hudScaleStepper, TU.translate("charterStrumLine.scale"));
var strOffset:Float = strumLine.strumLinePos == null ? (strumLine.type == 1 ? 0.75 : 0.25) : strumLine.strumLinePos;
@@ -245,22 +245,22 @@ class StrumLineButton extends UIButton {
hudXStepper = new UINumericStepper(hudScaleStepper.x + 80 - 32 + 26, hudScaleStepper.y, startingPos.x, 0.01, 2, 0, 2, 84);
members.push(hudXStepper);
addLabelOn(hudXStepper, "Hud Position (X [Ratio 0-1],Y)");
addLabelOn(hudXStepper, TU.translate("charterStrumLine.hudPos"));
members.push(XYComma = new UIText(hudXStepper.x + 84 - 32 + 0, hudXStepper.y + 9, 0, ",", 22));
hudYStepper = new UINumericStepper(hudXStepper.x + 84 - 32 + 26, hudXStepper.y, startingPos.y, 0.001, 2, null, null, 84);
members.push(hudYStepper);
visibleCheckbox = new UICheckbox(hudYStepper.x + hudYStepper.bWidth + 42, hudYStepper.y + 9, "Visible?", strumLine.visible == null ? true : strumLine.visible);
visibleCheckbox = new UICheckbox(hudYStepper.x + hudYStepper.bWidth + 42, hudYStepper.y + 9, TU.translate("charterStrumLine.visible"), strumLine.visible == null ? true : strumLine.visible);
members.push(visibleCheckbox);
scrollSpeedStepper = new UINumericStepper(typeDropdown.x, typeDropdown.y + 128, strumLine.scrollSpeed, 0.1, 2, 0, 10, 82);
scrollSpeedStepper.selectable = strumLine.scrollSpeed != null;
members.push(scrollSpeedStepper);
addLabelOn(scrollSpeedStepper, "Scroll Speed");
addLabelOn(scrollSpeedStepper, TU.translate("charterStrumLine.scrollSpeed"));
usesChartscrollSpeed = new UICheckbox(scrollSpeedStepper.x + 104, typeDropdown.y + 135, "Uses charts scroll speed?", strumLine.scrollSpeed == null);
usesChartscrollSpeed = new UICheckbox(scrollSpeedStepper.x + 104, typeDropdown.y + 135, TU.translate("charterStrumLine.useChartScrollSpeed"), strumLine.scrollSpeed == null);
usesChartscrollSpeed.onChecked = function(b) {
if(b) {
scrollSpeedStepper.value = subState.scrollSpeedTextBox.value;
@@ -24,7 +24,7 @@ class ChartDataScreen extends UISubstateWindow {
FlxG.sound.music.pause();
Charter.instance.vocals.pause();
winTitle = 'Chart Properties';
winTitle = TU.translate("chartDataScreen.title");
winWidth = 420; winHeight = 230; // guys look, the funny numbers!
super.create();
@@ -33,7 +33,7 @@ class ChartDataScreen extends UISubstateWindow {
add(new UIText(ui.x, ui.y - 24, 0, text));
var title:UIText;
add(title = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, "Edit Chart Data", 28));
add(title = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, TU.translate("chartDataScreen.editChartData"), 28));
var stageFileList = Stage.getList(true);
if (stageFileList.length == 0) stageFileList = Stage.getList(false);
@@ -41,19 +41,19 @@ class ChartDataScreen extends UISubstateWindow {
stageTextBox = new UIAutoCompleteTextBox(title.x, title.y + title.height + 38, PlayState.SONG.stage, 200);
stageTextBox.suggestItems = stageFileList;
add(stageTextBox);
addLabelOn(stageTextBox, "Stage");
addLabelOn(stageTextBox, TU.translate("chartDataScreen.stage"));
scrollSpeedStepper = new UINumericStepper(stageTextBox.x + 200 + 26, stageTextBox.y, data.scrollSpeed, 0.1, 2, 0, 10, 82);
add(scrollSpeedStepper);
addLabelOn(scrollSpeedStepper, "Scroll Speed");
addLabelOn(scrollSpeedStepper, TU.translate("chartDataScreen.scrollSpeed"));
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20 - 125, windowSpr.y + windowSpr.bHeight - 16 - 32, "Save & Close", function() {
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20 - 125, windowSpr.y + windowSpr.bHeight - 16 - 32, TU.translate("editor.saveClose"), function() {
saveInfo();
close();
}, 125);
add(saveButton);
closeButton = new UIButton(saveButton.x - 20, saveButton.y, "Close", function() {
closeButton = new UIButton(saveButton.x - 20, saveButton.y, TU.translate("editor.close"), function() {
close();
}, 125);
add(closeButton);
+72 -68
View File
@@ -100,152 +100,152 @@ class Charter extends UIState {
public override function create() {
super.create();
WindowUtils.suffix = " (Chart Editor)";
WindowUtils.suffix = " (" + TU.translate("charter.name") + ")";
SaveWarning.selectionClass = CharterSelection;
SaveWarning.saveFunc = () -> {_file_save(null);};
topMenu = [
{
label: "File",
label: TU.translate("charter.topBar.file"),
childs: [
{
label: "New"
label: TU.translate("charter.file.new")
},
null,
{
label: "Save",
label: TU.translate("charter.file.save"),
keybind: [CONTROL, S],
onSelect: _file_save,
},
{
label: "Save As...",
label: TU.translate("charter.file.saveAs"),
keybind: [CONTROL, SHIFT, S],
onSelect: _file_saveas,
},
null,
{
label: "Save Without Events",
label: TU.translate("charter.file.saveWithoutEvents"),
keybind: [CONTROL, ALT, TAB, S],
onSelect: _file_save_no_events,
},
{
label: "Save Without Events As...",
label: TU.translate("charter.file.saveWithoutEventsAs"),
keybind: [CONTROL, SHIFT, ALT, TAB, S],
onSelect: _file_saveas_no_events,
},
{
label: "Save Events Separately",
label: TU.translate("charter.file.saveEventsSeparately"),
keybind: [CONTROL, TAB, S],
onSelect: _file_events_save,
},
{
label: "Save Events Separately As...",
label: TU.translate("charter.file.saveEventsSeparatelyAs"),
keybind: [CONTROL, SHIFT, TAB, S],
onSelect: _file_events_saveas,
},
null,
{
label: "Save Meta",
label: TU.translate("charter.file.saveMeta"),
keybind: [CONTROL, ALT, S],
onSelect: _file_meta_save,
},
{
label: "Save Meta As...",
label: TU.translate("charter.file.saveMetaAs"),
keybind: [CONTROL, ALT ,SHIFT, S],
onSelect: _file_meta_saveas,
},
null,
{
label: "Export For FNF Legacy...",
label: TU.translate("charter.file.exportFnfLegacy"),
onSelect: _file_saveas_fnflegacy,
},
{
label: "Export For Psych Engine...",
label: TU.translate("charter.file.exportPsych"),
onSelect: _file_saveas_psych,
},
null,
{
label: "Exit",
label: TU.translate("charter.file.exit"),
onSelect: _file_exit
}
]
},
{
label: "Edit",
label: TU.translate("charter.topBar.edit"),
childs: [
{
label: "Undo",
label: TU.translate("charter.edit.undo"),
keybind: [CONTROL, Z],
onSelect: _edit_undo
},
{
label: "Redo",
label: TU.translate("charter.edit.redo"),
keybinds: [[CONTROL, Y], [CONTROL, SHIFT, Z]],
onSelect: _edit_redo
},
null,
{
label: "Copy",
label: TU.translate("charter.edit.copy"),
keybind: [CONTROL, C],
onSelect: _edit_copy
},
{
label: "Paste",
label: TU.translate("charter.edit.paste"),
keybind: [CONTROL, V],
onSelect: _edit_paste
},
null,
{
label: "Cut",
label: TU.translate("charter.edit.cut"),
keybind: [CONTROL, X],
onSelect: _edit_cut
},
{
label: "Delete",
label: TU.translate("charter.edit.delete"),
keybind: [DELETE],
onSelect: _edit_delete
}
]
},
{
label: "Chart",
label: TU.translate("charter.topBar.chart"),
childs: [
{
label: "Playtest",
label: TU.translate("charter.chart.playtest"),
keybind: [ENTER],
onSelect: _chart_playtest
},
{
label: "Playtest here",
label: TU.translate("charter.chart.playtestHere"),
keybind: [SHIFT, ENTER],
onSelect: _chart_playtest_here
},
null,
{
label: "Playtest as opponent",
label: TU.translate("charter.chart.playtestOpponent"),
keybind: [CONTROL, ENTER],
onSelect: _chart_playtest_opponent
},
{
label: "Playtest as opponent here",
label: TU.translate("charter.chart.playtestOpponentHere"),
keybind: [CONTROL, SHIFT, ENTER],
onSelect: _chart_playtest_opponent_here
},
null,
{
label: 'Enable scripts during playtesting',
label: TU.translate("charter.chart.enableScripts"),
onSelect: _chart_enablescripts,
icon: Options.charterEnablePlaytestScripts ? 1 : 0
},
null,
{
label: "Edit chart data",
label: TU.translate("charter.chart.editChartData"),
color: 0xFF959829, icon: 4,
onCreate: function (button:UIContextMenuOptionSpr) {button.label.offset.x = button.icon.offset.x = -2;},
onSelect: chart_edit_data
},
{
label: "Edit metadata information",
label: TU.translate("charter.chart.editMetadata"),
color: 0xFF959829, icon: 4,
onCreate: function (button:UIContextMenuOptionSpr) {button.label.offset.x = button.icon.offset.x = -2;},
onSelect: chart_edit_metadata
@@ -253,114 +253,114 @@ class Charter extends UIState {
]
},
{
label: "View",
label: TU.translate("charter.topBar.view"),
childs: [
{
label: "Zoom in",
label: TU.translate("charter.view.zoomIn"),
keybind: [CONTROL, NUMPADPLUS],
onSelect: _view_zoomin
},
{
label: "Zoom out",
label: TU.translate("charter.view.zoomOut"),
keybind: [CONTROL, NUMPADMINUS],
onSelect: _view_zoomout
},
{
label: "Reset zoom",
label: TU.translate("charter.view.resetZoom"),
keybind: [CONTROL, NUMPADZERO],
onSelect: _view_zoomreset
},
null,
{
label: 'Show Sections Separator',
label: TU.translate("charter.view.showSectionsSeparator"),
onSelect: _view_showeventSecSeparator,
icon: Options.charterShowSections ? 1 : 0
},
{
label: 'Show Beats Separator',
label: TU.translate("charter.view.showBeatsSeparator"),
onSelect: _view_showeventBeatSeparator,
icon: Options.charterShowBeats ? 1 : 0
},
null,
{
label: 'Low Detail Waveforms',
label: TU.translate("charter.view.lowDetailWaveforms"),
onSelect: _view_switchWaveformDetail,
icon: Options.charterLowDetailWaveforms ? 1 : 0
}
]
},
{
label: "Song",
label: TU.translate("charter.topBar.song"),
childs: [
{
label: "Go back to the start",
label: TU.translate("charter.song.goStart"),
keybind: [HOME],
onSelect: _song_start
},
{
label: "Go to the end",
label: TU.translate("charter.song.goEnd"),
keybind: [END],
onSelect: _song_end
},
null,
{
label: "Mute instrumental",
label: TU.translate("charter.song.muteInst"),
onSelect: _song_muteinst
},
{
label: "Mute voices",
label: TU.translate("charter.song.muteVoices"),
onSelect: _song_mutevoices
}
]
},
{
label: "Note >",
label: TU.translate("charter.topBar.note") + " >",
childs: buildNoteTypesUI()
},
{
label: "Snap >",
label: TU.translate("charter.topBar.snap") + " >",
childs: buildSnapsUI()
},
{
label: "Playback >",
label: TU.translate("charter.topBar.playback") + " >",
childs: [
{
label: "Play/Pause",
label: TU.translate("charter.playback.play"),
keybind: [SPACE],
onSelect: _playback_play
},
null,
{
label: "↑ Speed 25%",
label: TU.translate("charter.playback.speedRaise", ["25"]),
onSelect: _playback_speed_raise
},
{
label: "Reset Speed",
label: TU.translate("charter.playback.speedReset"),
onSelect: _playback_speed_reset
},
{
label: "↓ Speed 25%",
label: TU.translate("charter.playback.speedLower", ["25"]),
onSelect: _playback_speed_lower
},
null,
{
label: "Go back a section",
label: TU.translate("charter.playback.sectionBack"),
keybind: [A],
onSelect: _playback_back
},
{
label: "Go forward a section",
label: TU.translate("charter.playback.sectionForward"),
keybind: [D],
onSelect: _playback_forward
},
null,
{
label: "Metronome",
label: TU.translate("charter.playback.metronome"),
onSelect: _playback_metronome,
icon: Options.charterMetronomeEnabled ? 1 : 0
},
{
label: "Visual metronome"
label: TU.translate("charter.playback.visualMetronome")
},
]
}
@@ -406,7 +406,7 @@ class Charter extends UIState {
topMenuSpr = new UITopMenu(topMenu);
topMenuSpr.cameras = uiGroup.cameras = [uiCamera];
noteTypeText = new UIText(0, 0, 0, "(0) Default Note");
noteTypeText = new UIText(0, 0, 0, "(0) " + TU.translate("charter.noteTypes.default"));
noteTypeText.cameras = [uiCamera];
scrollBar = new UIScrollBar(FlxG.width - 20, topMenuSpr.bHeight, 1000, 0, 100);
@@ -444,12 +444,12 @@ class Charter extends UIState {
autoSaveNotif = new CharterAutoSaveUI(20, strumlineInfoBG.y + strumlineInfoBG.height + 20);
uiGroup.add(autoSaveNotif);
strumlineAddButton = new CharterStrumlineButton("editors/new", "Create New");
strumlineAddButton = new CharterStrumlineButton("editors/new", TU.translate("charter.createNew"));
strumlineAddButton.onClick = createStrumWithUI;
strumlineAddButton.animationOnClick = false;
strumlineAddButton.textColorLerp = 0.5;
strumlineLockButton = new CharterStrumlineButton("editors/charter/lock-strumline", "Lock/Unlock");
strumlineLockButton = new CharterStrumlineButton("editors/charter/lock-strumline", TU.translate("charter.lock-unlock"));
strumlineLockButton.onClick = function () {
if (strumLines != null) {
strumLines.draggable = !strumLines.draggable;
@@ -697,9 +697,9 @@ class Charter extends UIState {
if (autoSaveTimer < Options.charterAutoSaveWarningTime && !autoSaveNotif.cancelled && !autoSaveNotif.showedAnimation) {
if (Options.charterAutoSavesSeperateFolder)
__autoSaveLocation = __diff.toLowerCase() + DateTools.format(Date.now(), "%m-%d_%H-%M");
var filename = !Options.charterAutoSavesSeperateFolder ? '${__diff.toLowerCase()}.json' : '${__autoSaveLocation}.json';
autoSaveNotif.startAutoSave(autoSaveTimer,
!Options.charterAutoSavesSeperateFolder ? 'Saved chart at ${__diff.toLowerCase()}.json!' :
'Saved chart at $__autoSaveLocation.json!'
TU.translate("charter.popup.savedChartAt", [filename])
);
}
if (autoSaveTimer <= 0) {
@@ -1182,7 +1182,7 @@ class Charter extends UIState {
noteTypeText.x = noteTopButton.x + noteTopButton.bWidth + 6;
noteTypeText.y = Std.int((noteTopButton.bHeight - noteTypeText.height) / 2);
}
noteTypeText.text = '($noteType) ${noteTypes[noteType-1] == null ? "Default Note" : noteTypes[noteType-1]}';
noteTypeText.text = '($noteType) ${noteTypes[noteType-1] == null ? TU.translate("noteTypes.default") : noteTypes[noteType-1]}';
super.update(elapsed);
@@ -1220,6 +1220,7 @@ class Charter extends UIState {
for (strumLine in strumLines.members) strumLine.vocals.pause();
}
// TODO: make this translatable?
songPosInfo.text = '${CoolUtil.timeToStr(Conductor.songPosition)} / ${CoolUtil.timeToStr(songLength)}'
+ '\nStep: ${curStep}'
+ '\nBeat: ${curBeat}'
@@ -1614,25 +1615,27 @@ class Charter extends UIState {
var snapsTopButton:UITopMenuButton = topMenuSpr == null ? null : cast topMenuSpr.members[snapIndex];
var newChilds:Array<UIContextMenuOption> = [
{
label: "↑ Grid Snap",
label: TU.translate("charter.snap.increaseSnap"),
keybind: [X],
onSelect: _snap_increasesnap
},
{
label: "Reset Grid Snap",
label: TU.translate("charter.snap.resetSnap"),
onSelect: _snap_resetsnap
},
{
label: "↓ Grid Snap",
label: TU.translate("charter.snap.decreaseSnap"),
keybind: [Z],
onSelect: _snap_decreasesnap
},
null
];
var snapStr = TU.getRaw("charter.snap.snap");
for (_quant in quants)
newChilds.push({
label: '${_quant}x Grid Snap',
label: snapStr.format([_quant]),
onSelect: (_) -> {setquant(_quant); buildSnapsUI();},
icon: _quant == quant ? 1 : 0
});
@@ -1700,29 +1703,29 @@ class Charter extends UIState {
var noteTopButton:UITopMenuButton = topMenuSpr == null ? null : cast topMenuSpr.members[noteIndex];
var newChilds:Array<UIContextMenuOption> = [
{
label: "Add sustain length",
label: TU.translate("charter.note.addSustainLength"),
keybind: [E],
onSelect: _note_addsustain
},
{
label: "Subtract sustain length",
label: TU.translate("charter.note.subtractSustainLength"),
keybind: [Q],
onSelect: _note_subtractsustain
},
null,
{
label: "Select all",
label: TU.translate("charter.note.selectAll"),
keybind: [CONTROL, A],
onSelect: _note_selectall
},
{
label: "Select measure",
label: TU.translate("charter.note.selectMeasure"),
keybind: [CONTROL, SHIFT, A],
onSelect: _note_selectmeasure
},
null,
{
label: "(0) Default Note",
label: "(0) " + TU.translate("charter.noteTypes.default"),
keybind: [ZERO],
onSelect: (_) -> {changeNoteType(0);},
icon: this.noteType == 0 ? 1 : 0
@@ -1733,6 +1736,7 @@ class Charter extends UIState {
for (i=>type in noteTypes) {
var realNoteID:Int = i+1; // Default Note not stored
var newChild:UIContextMenuOption = {
// TODO: make this translatable?
label: '(${realNoteID}) ${type}',
onSelect: (_) -> {changeNoteType(realNoteID);},
icon: this.noteType == realNoteID ? 1 : 0
@@ -1741,7 +1745,7 @@ class Charter extends UIState {
newChilds.push(newChild);
}
newChilds.push({
label: "Edit Note Types List",
label: TU.translate("charter.note.editNoteTypesList"),
color: 0xFF959829, icon: 4,
onCreate: function (button:UIContextMenuOptionSpr) {button.label.offset.x = button.icon.offset.x = -2;},
onSelect: editNoteTypesList
@@ -45,7 +45,8 @@ class CharterAutoSaveUI extends UISliceSprite {
icon.animation.curAnim.curFrame = 2;
(new FlxTimer()).start(1, (_) -> {disappearAnimation(true);});
autosavingText.text += " (Canceled)!"; cancelButton.visible = false;
autosavingText.text += " " + TU.translate("editor.autosavingCanceledSuffix");
cancelButton.visible = false;
for (member in [this, autosavingText]) member.color = 0xFFE67F7F;
for (member in [progressBar, progressBarBack]) member.color = 0xFFE67F7F;
}, 24, 14);
@@ -36,7 +36,7 @@ class CharterEventScreen extends UISubstateWindow {
var creatingEvent:Bool = chartEvent == null;
if (creatingEvent) chartEvent = new CharterEvent(step, []);
winTitle = creatingEvent ? "Create Event Group" : "Edit Event Group";
winTitle = TU.translate("charterEventScreen.title" + (creatingEvent ? "-creating" : "-editing"));
winWidth = 960;
super.create();
@@ -64,7 +64,7 @@ class CharterEventScreen extends UISubstateWindow {
paramsPanel = new FlxGroup();
add(paramsPanel);
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20, windowSpr.y + windowSpr.bHeight - 16 - 32, "Save & Close", function() {
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20, windowSpr.y + windowSpr.bHeight - 16 - 32, TU.translate("editor.saveClose"), function() {
saveCurTab();
chartEvent.refreshEventIcons();
@@ -92,7 +92,7 @@ class CharterEventScreen extends UISubstateWindow {
saveButton.x -= saveButton.bWidth;
add(saveButton);
closeButton = new UIButton(saveButton.x - 10, saveButton.y, "Close", ()->close());
closeButton = new UIButton(saveButton.x - 10, saveButton.y, TU.translate("editor.close"), ()->close());
closeButton.color = 0xFFFF0000;
closeButton.x -= closeButton.bWidth;
add(closeButton);
@@ -189,7 +189,7 @@ class CharterEventScreen extends UISubstateWindow {
y += cast(lastAdded, FlxSprite).height + 6;
}
} else {
eventName.text = "No event";
eventName.text = TU.translate("charterEventScreen.noEvent"); // Maybe should be No Events?
curEvent = -1;
}
}
@@ -19,7 +19,7 @@ class CharterEventTypeSelection extends UISubstateWindow {
}
public override function create() {
winTitle = "Choose an event type...";
winTitle = TU.translate("charterEventTypeSelection.title");
super.create();
var w:Int = winWidth - 20;
@@ -33,7 +33,11 @@ class CharterEventTypeSelection extends UISubstateWindow {
add(buttonsBG);
for(k=>eventName in EventsData.eventsList) {
var button = new UIButton(0, (32 * k), eventName, function() {
var visualName = eventName;
var tuId = "charter.events." + TU.raw2Id(eventName);
if(TU.exists(tuId))
visualName = TU.translate(tuId);
var button = new UIButton(0, (32 * k), visualName, function() {
close();
callback(eventName);
}, w);
@@ -56,7 +60,7 @@ class CharterEventTypeSelection extends UISubstateWindow {
windowSpr.bHeight = 61 + (32 * (17));
add(new UIButton(10, windowSpr.bHeight-42, "Cancel", function() {
add(new UIButton(10, windowSpr.bHeight-42, TU.translate("editor.cancel"), function() {
close();
}, w));
@@ -30,8 +30,11 @@ class CharterMetaDataScreen extends UISubstateWindow {
this.metadata = metadata;
}
inline function translate(id:String):String
return TU.translate("charterMetaDataScreen." + id);
public override function create() {
winTitle = "Edit Metadata";
winTitle = translate("title");
winWidth = 1056;
winHeight = 520;
@@ -44,52 +47,52 @@ class CharterMetaDataScreen extends UISubstateWindow {
add(new UIText(ui.x, ui.y - 24, 0, text));
var title:UIText;
add(title = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, "Song Data", 28));
add(title = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, translate("songData"), 28));
songNameTextBox = new UITextBox(title.x, title.y + title.height + 36, metadata.name);
add(songNameTextBox);
addLabelOn(songNameTextBox, "Song Name");
addLabelOn(songNameTextBox, translate("songName"));
bpmStepper = new UINumericStepper(songNameTextBox.x + 320 + 26, songNameTextBox.y, metadata.bpm, 1, 2, 1, null, 90);
add(bpmStepper);
addLabelOn(bpmStepper, "BPM");
addLabelOn(bpmStepper, translate("bpm"));
beatsPerMeasureStepper = new UINumericStepper(bpmStepper.x + 60 + 26, bpmStepper.y, metadata.beatsPerMeasure, 1, 0, 1, null, 54);
add(beatsPerMeasureStepper);
addLabelOn(beatsPerMeasureStepper, "Time Signature");
addLabelOn(beatsPerMeasureStepper, translate("timeSignature"));
add(new UIText(beatsPerMeasureStepper.x + 30, beatsPerMeasureStepper.y + 3, 0, "/", 22));
stepsPerBeatStepper = new UINumericStepper(beatsPerMeasureStepper.x + 30 + 24, beatsPerMeasureStepper.y, metadata.stepsPerBeat, 1, 0, 1, null, 54);
add(stepsPerBeatStepper);
add(title = new UIText(songNameTextBox.x, songNameTextBox.y + 10 + 46, 0, "Menus Data (Freeplay/Story)", 28));
add(title = new UIText(songNameTextBox.x, songNameTextBox.y + 10 + 46, 0, translate("menusData"), 28));
displayNameTextBox = new UITextBox(title.x, title.y + title.height + 36, metadata.displayName);
add(displayNameTextBox);
addLabelOn(displayNameTextBox, "Display Name");
addLabelOn(displayNameTextBox, translate("displayName"));
iconTextBox = new UITextBox(displayNameTextBox.x + 320 + 26, displayNameTextBox.y, metadata.icon, 150);
iconTextBox.onChange = (newIcon:String) -> {updateIcon(newIcon);}
add(iconTextBox);
addLabelOn(iconTextBox, "Icon");
addLabelOn(iconTextBox, translate("icon"));
updateIcon(metadata.icon);
opponentModeCheckbox = new UICheckbox(displayNameTextBox.x, iconTextBox.y + 10 + 32 + 26, "Opponent Mode", metadata.opponentModeAllowed);
opponentModeCheckbox = new UICheckbox(displayNameTextBox.x, iconTextBox.y + 10 + 32 + 26, translate("opponentMode"), metadata.opponentModeAllowed);
add(opponentModeCheckbox);
addLabelOn(opponentModeCheckbox, "Modes Allowed");
addLabelOn(opponentModeCheckbox, translate("modesAllowed"));
coopAllowedCheckbox = new UICheckbox(opponentModeCheckbox.x + 150 + 26, opponentModeCheckbox.y, "Co-op Mode", metadata.coopAllowed);
coopAllowedCheckbox = new UICheckbox(opponentModeCheckbox.x + 150 + 26, opponentModeCheckbox.y, translate("coopAllowed"), metadata.coopAllowed);
add(coopAllowedCheckbox);
colorWheel = new UIColorwheel(iconTextBox.x, coopAllowedCheckbox.y, metadata.parsedColor);
add(colorWheel);
addLabelOn(colorWheel, "Color");
addLabelOn(colorWheel, translate("color"));
difficulitesTextBox = new UITextBox(opponentModeCheckbox.x, opponentModeCheckbox.y + 6 + 32 + 26, metadata.difficulties.join(", "));
add(difficulitesTextBox);
addLabelOn(difficulitesTextBox, "Difficulties");
addLabelOn(difficulitesTextBox, translate("difficulties"));
customPropertiesButtonList = new UIButtonList<PropertyButton>(stepsPerBeatStepper.x + 80 + 26 + 105, songNameTextBox.y, 290, 316, '', FlxPoint.get(280, 35), null, 5);
customPropertiesButtonList.frames = Paths.getFrames('editors/ui/inputbox');
@@ -100,19 +103,19 @@ class CharterMetaDataScreen extends UISubstateWindow {
for (val in Reflect.fields(metadata.customValues))
customPropertiesButtonList.add(new PropertyButton(val, Reflect.field(metadata.customValues, val), customPropertiesButtonList));
add(customPropertiesButtonList);
addLabelOn(customPropertiesButtonList, "Custom Values (Advanced)");
addLabelOn(customPropertiesButtonList, translate("customValues"));
for (checkbox in [opponentModeCheckbox, coopAllowedCheckbox])
{checkbox.y += 6; checkbox.x += 4;}
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20, windowSpr.y + windowSpr.bHeight - 20, "Save & Close", function() {
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20, windowSpr.y + windowSpr.bHeight - 20, TU.translate("editor.saveClose"), function() {
saveMeta();
close();
}, 125);
saveButton.x -= saveButton.bWidth;
saveButton.y -= saveButton.bHeight;
closeButton = new UIButton(saveButton.x - 20, saveButton.y, "Close", function() {
closeButton = new UIButton(saveButton.x - 20, saveButton.y, TU.translate("editor.close"), function() {
close();
}, 125);
closeButton.color = 0xFFFF0000;
@@ -14,32 +14,37 @@ class CharterNoteTypesList extends UISubstateWindow {
FlxG.sound.music.pause();
Charter.instance.vocals.pause();
winTitle = 'Note Types List Editor';
winTitle = TU.translate("charterNoteTypesList.title");
winWidth = 380; winHeight = 390;
super.create();
var title:UIText;
add(title = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, "Edit Note Types", 28));
add(title = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, TU.translate("charterNoteTypesList.editNoteTypes"), 28));
var noteTypesFileList = getNoteTypesList(true);
if (noteTypesFileList.length == 0) noteTypesFileList = getNoteTypesList(false);
noteTypesList = new UIButtonList<NoteTypeButton>(20, title.y + title.height + 10, winWidth - 40, 342 - 85 - 16, "", FlxPoint.get(winWidth - 40, (342 - 85 - 16)/4), null, 0);
noteTypesList.addButton.callback = () -> noteTypesList.add(new NoteTypeButton(0, 0, 'Note Type ${noteTypesList.buttons.members.length}', noteTypesList.buttons.members.length, noteTypesFileList, noteTypesList));
noteTypesList.addButton.callback = () -> {
noteTypesList.add(new NoteTypeButton(0, 0,
TU.translate("charterNoteTypesList.editType", [noteTypesList.buttons.members.length]),
noteTypesList.buttons.members.length, noteTypesFileList, noteTypesList));
}
noteTypesList.cameraSpacing = 0; noteTypesList.dragCallback = (object:NoteTypeButton, oldIndex:Int, newIndex:Int) -> {object.IDText.text = '${newIndex}.';};
for (i=>noteType in Charter.instance.noteTypes)
// TODO: make this translatable
noteTypesList.add(new NoteTypeButton(0, 0, noteType, i, noteTypesFileList, noteTypesList));
add(noteTypesList);
noteTypesList.frames = Paths.getFrames('editors/ui/inputbox');
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20 - 125, windowSpr.y + windowSpr.bHeight - 16 - 32, "Save & Close", function() {
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20 - 125, windowSpr.y + windowSpr.bHeight - 16 - 32, TU.translate("editor.saveClose"), function() {
saveList();
close();
}, 125);
add(saveButton);
closeButton = new UIButton(saveButton.x - 20, saveButton.y, "Close", function() {
closeButton = new UIButton(saveButton.x - 20, saveButton.y, TU.translate("editor.close"), function() {
close();
}, 125);
add(closeButton);
@@ -26,26 +26,28 @@ class CharterSelection extends EditorTreeMenu {
freeplayList = FreeplaySonglist.get(false);
var list:Array<OptionType> = [
for(s in freeplayList.songs) new EditorIconOption(s.name, "Press ACCEPT to choose a difficulty to edit.", s.icon, function() {
for(s in freeplayList.songs) new EditorIconOption(s.name, TU.translate("charterSelection.accept-song"), s.icon, function() {
curSong = s;
var list:Array<OptionType> = [
for(d in s.difficulties) if (d != "")
new TextOption(d, "Press ACCEPT to edit the chart for the selected difficulty", function() {
new TextOption(d, TU.translate("charterSelection.accept-difficulty"), function() {
FlxG.switchState(new Charter(s.name, d));
})
];
list.push(new NewOption("New Difficulty", "New Difficulty", function() {
var newDiff = TU.translate("charterSelection.newDifficulty");
list.push(new NewOption(newDiff, newDiff, function() {
FlxG.state.openSubState(new ChartCreationScreen(saveChart));
}));
optionsTree.add(new OptionsScreen(s.name, "Select a difficulty to continue.", list));
optionsTree.add(new OptionsScreen(s.name, TU.translate("charterSelection.selectDifficulty"), list));
}, s.parsedColor.getDefault(0xFFFFFFFF))
];
list.insert(0, new NewOption("New Song", "New Song", function() {
var newSong = TU.translate("charterSelection.newSong");
list.insert(0, new NewOption(newSong, newSong, function() {
FlxG.state.openSubState(new SongCreationScreen(saveSong));
}));
main = new OptionsScreen("Chart Editor", "Select a song to modify the charts from.", list);
main = new OptionsScreen(TU.translate("charter.name"), TU.translate("charterSelection.desc"), list);
DiscordUtil.call("onEditorTreeLoaded", ["Chart Editor"]);
}
@@ -92,8 +94,8 @@ class CharterSelection extends EditorTreeMenu {
var songAlreadlyExsits:Bool = [for (s in freeplayList.songs) s.name.toLowerCase()].contains(creation.meta.name.toLowerCase());
if (songAlreadlyExsits) {
openSubState(new UIWarningSubstate("Creating Song: Error!", "The song you are trying to create alreadly exists, if you would like to override it delete the song first!", [
{label: "Ok", color: 0xFFFF0000, onClick: function(t) {}}
openSubState(new UIWarningSubstate(TU.translate("chartCreation.warnings.song-exists-title"), TU.translate("chartCreation.warnings.song-exists-body"), [
{label: TU.translate("editor.ok"), color: 0xFFFF0000, onClick: function(t) {}},
]));
return;
}
@@ -114,18 +116,20 @@ class CharterSelection extends EditorTreeMenu {
if (creation.voicesBytes != null) sys.io.File.saveBytes('$songFolder/song/Voices.${Paths.SOUND_EXT}', creation.voicesBytes);
#end
var option = new EditorIconOption(creation.meta.name, "Press ACCEPT to choose a difficulty to edit.", creation.meta.icon, function() {
// duplicated code, todo: fix this
var option = new EditorIconOption(creation.meta.name, TU.translate("charterSelection.accept-song"), creation.meta.icon, function() {
curSong = creation.meta;
var list:Array<OptionType> = [
for(d in creation.meta.difficulties)
if (d != "") new TextOption(d, "Press ACCEPT to edit the chart for the selected difficulty", function() {
if (d != "") new TextOption(d, TU.translate("charterSelection.accept-difficulty"), function() {
FlxG.switchState(new Charter(creation.meta.name, d));
})
];
list.push(new NewOption("New Difficulty", "New Difficulty", function() {
var newDiff = TU.translate("charterSelection.newDifficulty");
list.push(new NewOption(newDiff, newDiff, function() {
FlxG.state.openSubState(new ChartCreationScreen(saveChart));
}));
optionsTree.insert(1, new OptionsScreen(creation.meta.name, "Select a difficulty to continue.", list));
optionsTree.insert(1, new OptionsScreen(creation.meta.name, TU.translate("charterSelection.selectDifficulty"), list));
}, creation.meta.parsedColor.getDefault(0xFFFFFFFF));
// Add to List
@@ -137,8 +141,8 @@ class CharterSelection extends EditorTreeMenu {
var difficultyAlreadlyExsits:Bool = curSong.difficulties.contains(name);
if (difficultyAlreadlyExsits) {
openSubState(new UIWarningSubstate("Creating Chart: Error!", "The chart you are trying to create alreadly exists, if you would like to override it delete the chart first!", [
{label: "Ok", color: 0xFFFF0000, onClick: function(t) {}}
openSubState(new UIWarningSubstate(TU.translate("chartCreation.warnings.chart-exists-title"), TU.translate("chartCreation.warnings.chart-exists-body"), [
{label: TU.translate("editor.ok"), color: 0xFFFF0000, onClick: function(t) {}},
]));
return;
}
@@ -150,8 +154,9 @@ class CharterSelection extends EditorTreeMenu {
CoolUtil.safeSaveFile('$songFolder/charts/${name}.json', Json.stringify(data, "\t"));
// Add to List
// duplicated code, todo: fix this
curSong.difficulties.push(name);
var option = new TextOption(name, "Press ACCEPT to edit the chart for the selected difficulty", function() {
var option = new TextOption(name, TU.translate("charterSelection.accept-difficulty"), function() {
FlxG.switchState(new Charter(curSong.name, name));
});
optionsTree.members[optionsTree.members.length-1].insert(optionsTree.members[optionsTree.members.length-1].length-1, option);
@@ -123,7 +123,8 @@ class CharterStrumline extends UISprite {
class CharterStrumlineOptions extends UITopMenuButton {
var strLine:CharterStrumline;
public function new(parent:CharterStrumline) {
super(0, 95, null, "Options ↓", []);
// TODO: better id for this
super(0, 95, null, TU.translate("charter.strumLine.button-name"), []);
strLine = parent;
bWidth = 40 * 4;
this.label.fieldWidth = bWidth;
@@ -137,14 +138,14 @@ class CharterStrumlineOptions extends UITopMenuButton {
public override function openContextMenu() {
contextMenu = [
{
label: "Hitsounds",
label: TU.translate("charter.strumLine.hitsounds"),
onSelect: function(_) {
strLine.hitsounds = !strLine.hitsounds;
},
icon: strLine.hitsounds ? 1 : 0
},
{
label: "Mute Vocals",
label: TU.translate("charter.strumLine.muteVocals"),
onSelect: function(_) {
strLine.vocals.volume = strLine.vocals.volume > 0 ? 0 : 1;
},
@@ -152,7 +153,7 @@ class CharterStrumlineOptions extends UITopMenuButton {
},
null,
{
label: "Edit",
label: TU.translate("charter.strumLine.edit"),
onSelect: function (_) {
Charter.instance.editStrumline(strLine.strumLine);
},
@@ -160,7 +161,7 @@ class CharterStrumlineOptions extends UITopMenuButton {
icon: 4
},
{
label: "Delete",
label: TU.translate("charter.strumLine.delete"),
onSelect: function (_) {
Charter.instance.deleteStrumlineFromData(strLine.strumLine);
},
@@ -170,7 +171,7 @@ class CharterStrumlineOptions extends UITopMenuButton {
];
contextMenu.insert(0, {
label: "No Waveform",
label: TU.translate("charter.strumLine.noWaveform"),
onSelect: function(_) {strLine.selectedWaveform = -1;},
icon: strLine.selectedWaveform == -1 ? 1 : 0
});
@@ -46,7 +46,7 @@ class CharterStrumlineScreen extends UISubstateWindow {
visible: true
};
winTitle = creatingStrumLine ? 'Creating strumline #$strumLineID' : 'Editing strumline #$strumLineID properties';
winTitle = TU.translate("charterStrumlineScreen.win-title" + (creatingStrumLine ? "-creating" : "-editing"), ["#" + strumLineID]);
winWidth = 690; winHeight = 400;
FlxG.sound.music.pause();
@@ -58,26 +58,26 @@ class CharterStrumlineScreen extends UISubstateWindow {
add(new UIText(ui.x, ui.y - 24, 0, text));
var title:UIText;
add(title = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, creatingStrumLine ? "Create New Strumline" : "Edit Strumline Properties", 28));
add(title = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, TU.translate("charterStrumlineScreen.title" + (creatingStrumLine ? "-creating" : "-editing")), 28));
var charFileList = Character.getList(true);
if (charFileList.length == 0) charFileList = Character.getList(false);
charactersList = new UIButtonList<CharacterButton>(15, title.y + title.height + 36, 250, 269, "", FlxPoint.get(250, 54), null, 0);
charactersList.addButton.callback = () -> charactersList.add(new CharacterButton(0, 0, "New Char", charFileList, charactersList));
charactersList.addButton.callback = () -> charactersList.add(new CharacterButton(0, 0, TU.translate("charterStrumLine.newChar"), charFileList, charactersList));
charactersList.cameraSpacing = 0;
for (i in strumLine.characters)
charactersList.add(new CharacterButton(0, 0, i, charFileList, charactersList));
add(charactersList);
addLabelOn(charactersList, "Characters");
addLabelOn(charactersList, TU.translate("charterStrumLine.characters"));
charactersList.frames = Paths.getFrames('editors/ui/inputbox');
typeDropdown = new UIDropDown(charactersList.x + charactersList.bWidth + 16, charactersList.y, 200, 32, ["OPPONENT", "PLAYER", "ADDITIONAL"], strumLine.type);
add(typeDropdown);
addLabelOn(typeDropdown, "Type");
addLabelOn(typeDropdown, TU.translate("charterStrumLine.type"));
usesChartscrollSpeed = new UICheckbox(typeDropdown.x + 104, typeDropdown.y + 135, "Uses charts scroll speed?", strumLine.scrollSpeed == null);
usesChartscrollSpeed = new UICheckbox(typeDropdown.x + 104, typeDropdown.y + 135, TU.translate("charterStrumLine.useChartScrollSpeed"), strumLine.scrollSpeed == null);
usesChartscrollSpeed.onChecked = function(b) {
if(b)
{
@@ -97,17 +97,17 @@ class CharterStrumlineScreen extends UISubstateWindow {
scrollSpeedStepper.selectable = true;
}
add(scrollSpeedStepper);
addLabelOn(scrollSpeedStepper, "Scroll Speed");
addLabelOn(scrollSpeedStepper, TU.translate("charterStrumLine.scrollSpeed"));
var stagePositionI = strumLine.position == null ? strumLine.type : ["DAD", "BOYFRIEND", "GIRLFRIEND"].indexOf(strumLine.position.toUpperCase());
stagePositionDropdown = new UIDropDown(typeDropdown.x + 200 - 32 + 26, typeDropdown.y, 200, 32, ["DAD", "BOYFRIEND", "GIRLFRIEND"], stagePositionI);
add(stagePositionDropdown);
addLabelOn(stagePositionDropdown, "Stage Position");
addLabelOn(stagePositionDropdown, TU.translate("charterStrumLine.stagePos"));
hudScaleStepper = new UINumericStepper(typeDropdown.x, typeDropdown.y + 64, strumLine.strumScale == null ? 1 : strumLine.strumScale, 0.001, 2, null, null, 74);
add(hudScaleStepper);
addLabelOn(hudScaleStepper, "Scale");
addLabelOn(hudScaleStepper, TU.translate("charterStrumLine.scale"));
var strOffset:Float = strumLine.strumLinePos == null ? (strumLine.type == 1 ? 0.75 : 0.25) : strumLine.strumLinePos;
@@ -117,23 +117,23 @@ class CharterStrumlineScreen extends UISubstateWindow {
hudXStepper = new UINumericStepper(hudScaleStepper.x + 80 - 32 + 26, hudScaleStepper.y, startingPos.x, 0.01, 2, 0, 2, 84);
add(hudXStepper);
addLabelOn(hudXStepper, "Hud Position (X [Ratio 0-1],Y)");
addLabelOn(hudXStepper, TU.translate("charterStrumLine.hudPos"));
add(new UIText(hudXStepper.x + 84 - 32 + 0, hudXStepper.y + 9, 0, ",", 22));
hudYStepper = new UINumericStepper(hudXStepper.x + 84 - 32 + 26, hudXStepper.y, startingPos.y, 0.001, 2, null, null, 84);
add(hudYStepper);
visibleCheckbox = new UICheckbox(hudYStepper.x + hudYStepper.bWidth + 42, hudYStepper.y + 9, "Visible?", strumLine.visible);
visibleCheckbox = new UICheckbox(hudYStepper.x + hudYStepper.bWidth + 42, hudYStepper.y + 9, TU.translate("charterStrumLine.visible"), strumLine.visible);
add(visibleCheckbox);
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20 - 125, windowSpr.y + windowSpr.bHeight - 16 - 32, "Save & Close", function() {
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20 - 125, windowSpr.y + windowSpr.bHeight - 16 - 32, TU.translate("editor.saveClose"), function() {
saveStrumline();
close();
}, 125);
add(saveButton);
closeButton = new UIButton(saveButton.x - 20 - saveButton.bWidth, saveButton.y, creatingStrumLine ? "Cancel" : "Close", function() {
closeButton = new UIButton(saveButton.x - 20 - saveButton.bWidth, saveButton.y, TU.translate("editor." + (creatingStrumLine ? "cancel" : "close")), function() {
if (creatingStrumLine && onSave != null) onSave(null);
close();
}, 125);
@@ -155,7 +155,7 @@ class CharterStrumlineScreen extends UISubstateWindow {
vocalsSuffixDropDown = new UIDropDown(typeDropdown.x, hudScaleStepper.y + 128, 200, 32, suffixlist, strumLine.vocalsSuffix != null && strumLine.vocalsSuffix != "" ? suffixlist.indexOf(strumLine.vocalsSuffix) : 0);
add(vocalsSuffixDropDown);
addLabelOn(vocalsSuffixDropDown, "Vocal Suffix");
addLabelOn(vocalsSuffixDropDown, TU.translate("charterStrumLine.vocalSuffix"));
}
function saveStrumline() {
@@ -46,8 +46,14 @@ class SongCreationScreen extends UISubstateWindow {
if (onSave != null) this.onSave = onSave;
}
inline function translate(id:String):String
return TU.translate("songCreationScreen." + id);
inline function translateMeta(id:String):String
return TU.translate("charterMetaDataScreen." + id);
public override function create() {
winTitle = "Creating New Song";
winTitle = translate("win-title");
winWidth = 748 - 32 + 40;
winHeight = 520;
@@ -61,19 +67,19 @@ class SongCreationScreen extends UISubstateWindow {
}
var songTitle:UIText;
songDataGroup.add(songTitle = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, "Song Info", 28));
songDataGroup.add(songTitle = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, translate("title"), 28));
songNameTextBox = new UITextBox(songTitle.x, songTitle.y + songTitle.height + 36, "Song Name");
songNameTextBox = new UITextBox(songTitle.x, songTitle.y + songTitle.height + 36, translateMeta("songName"));
songDataGroup.add(songNameTextBox);
addLabelOn(songNameTextBox, "Song Name");
addLabelOn(songNameTextBox, translateMeta("songName"));
bpmStepper = new UINumericStepper(songNameTextBox.x + 320 + 26, songNameTextBox.y, 100, 1, 2, 1, null, 90);
songDataGroup.add(bpmStepper);
addLabelOn(bpmStepper, "BPM");
addLabelOn(bpmStepper, translateMeta("bpm"));
beatsPerMeasureStepper = new UINumericStepper(bpmStepper.x + 60 + 26, bpmStepper.y, 4, 1, 0, 1, null, 54);
songDataGroup.add(beatsPerMeasureStepper);
addLabelOn(beatsPerMeasureStepper, "Time Signature");
addLabelOn(beatsPerMeasureStepper, translateMeta("timeSignature"));
songDataGroup.add(new UIText(beatsPerMeasureStepper.x + 30, beatsPerMeasureStepper.y + 3, 0, "/", 22));
@@ -88,8 +94,8 @@ class SongCreationScreen extends UISubstateWindow {
instExplorer.uiElement = audioPlayer;
});
songDataGroup.add(instExplorer);
addLabelOn(instExplorer, "Inst Audio File").applyMarkup(
"Inst Audio File $* Required$",
addLabelOn(instExplorer, "").applyMarkup(
translate("instAudio"),
[new FlxTextFormatMarkerPair(new FlxTextFormat(0xFFAD1212), "$")]);
voicesExplorer = new UIFileExplorer(instExplorer.x + 320 + 26, instExplorer.y, null, null, Paths.SOUND_EXT, function (res) {
@@ -99,44 +105,44 @@ class SongCreationScreen extends UISubstateWindow {
});
songDataGroup.add(voicesExplorer);
voicesUIText = addLabelOn(voicesExplorer, "Vocal Audio File");
voicesUIText = addLabelOn(voicesExplorer, "");
voicesUIText.applyMarkup(
"Vocal Audio File $* Required$",
translate("voicesAudio"),
[new FlxTextFormatMarkerPair(new FlxTextFormat(0xFFAD1212), "$")]);
var menuTitle:UIText;
menuDataGroup.add(menuTitle = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, "Menus Data (Freeplay/Story)", 28));
menuDataGroup.add(menuTitle = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, translateMeta("menusData"), 28));
displayNameTextBox = new UITextBox(menuTitle.x, menuTitle.y + menuTitle.height + 36, "Display Name");
displayNameTextBox = new UITextBox(menuTitle.x, menuTitle.y + menuTitle.height + 36, translateMeta("displayName"));
menuDataGroup.add(displayNameTextBox);
addLabelOn(displayNameTextBox, "Display Name");
addLabelOn(displayNameTextBox, translateMeta("displayName"));
iconTextBox = new UITextBox(displayNameTextBox.x + 320 + 26, displayNameTextBox.y, "Icon", 150);
iconTextBox = new UITextBox(displayNameTextBox.x + 320 + 26, displayNameTextBox.y, "face", 150);
iconTextBox.onChange = (newIcon:String) -> {updateIcon(newIcon);}
menuDataGroup.add(iconTextBox);
addLabelOn(iconTextBox, "Icon");
addLabelOn(iconTextBox, translateMeta("icon"));
updateIcon("Icon");
updateIcon("face");
opponentModeCheckbox = new UICheckbox(displayNameTextBox.x, iconTextBox.y + 10 + 32 + 26, "Opponent Mode", true);
opponentModeCheckbox = new UICheckbox(displayNameTextBox.x, iconTextBox.y + 10 + 32 + 26, translateMeta("opponentMode"), true);
menuDataGroup.add(opponentModeCheckbox);
addLabelOn(opponentModeCheckbox, "Modes Allowed");
addLabelOn(opponentModeCheckbox, translateMeta("modesAllowed"));
coopAllowedCheckbox = new UICheckbox(opponentModeCheckbox.x + 150 + 26, opponentModeCheckbox.y, "Co-op Mode", true);
coopAllowedCheckbox = new UICheckbox(opponentModeCheckbox.x + 150 + 26, opponentModeCheckbox.y, translateMeta("coopAllowed"), true);
menuDataGroup.add(coopAllowedCheckbox);
colorWheel = new UIColorwheel(iconTextBox.x, coopAllowedCheckbox.y, 0xFFFFFF);
menuDataGroup.add(colorWheel);
addLabelOn(colorWheel, "Color");
addLabelOn(colorWheel, translateMeta("color"));
difficulitesTextBox = new UITextBox(opponentModeCheckbox.x, opponentModeCheckbox.y + 6 + 32 + 26, "");
menuDataGroup.add(difficulitesTextBox);
addLabelOn(difficulitesTextBox, "Difficulties");
addLabelOn(difficulitesTextBox, translateMeta("difficulties"));
for (checkbox in [opponentModeCheckbox, coopAllowedCheckbox])
{checkbox.y += 6; checkbox.x += 4;}
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20 - 125, windowSpr.y + windowSpr.bHeight - 16 - 32, "Save & Close", function() {
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20 - 125, windowSpr.y + windowSpr.bHeight - 16 - 32, TU.translate("editor.saveClose"), function() {
if (curPage == pages.length-1) {
saveSongInfo();
close();
@@ -149,7 +155,7 @@ class SongCreationScreen extends UISubstateWindow {
}, 125);
add(saveButton);
backButton = new UIButton(saveButton.x - 20 - saveButton.bWidth, saveButton.y, "< Back", function() {
backButton = new UIButton(saveButton.x - 20 - saveButton.bWidth, saveButton.y, "< " + translate("back"), function() {
curPage--;
refreshPages();
@@ -157,7 +163,7 @@ class SongCreationScreen extends UISubstateWindow {
}, 125);
add(backButton);
closeButton = new UIButton(backButton.x - 20 - saveButton.bWidth, saveButton.y, "Cancel", function() {
closeButton = new UIButton(backButton.x - 20 - saveButton.bWidth, saveButton.y, TU.translate("editor.close"), function() {
close();
}, 125);
add(closeButton);
@@ -197,10 +203,10 @@ class SongCreationScreen extends UISubstateWindow {
titleSpr.x = windowSpr.x + 25;
titleSpr.y = windowSpr.y + ((30 - titleSpr.height) / 2);
saveButton.field.text = curPage == pages.length-1 ? "Save & Close" : 'Next >';
titleSpr.text = 'Creating New Song (${curPage+1}/${pages.length})';
saveButton.field.text = curPage == pages.length-1 ? TU.translate("editor.saveClose") : translate("next") + " >";
titleSpr.text = translate("win-title") + ' (${curPage+1}/${pages.length})';
backButton.field.text = '< Back';
backButton.field.text = '< ' + translate("back");
backButton.visible = backButton.exists = curPage > 0;
backButton.x = (saveButton.x = windowSpr.x + windowSpr.bWidth - 20 - 125) - 20 - saveButton.bWidth;