Skip to content

Commit bd82448

Browse files
committed
experimental stage saving remake (MAY BE REVERTED!)
if it is reverted, note to self to keep the xml changes
1 parent 5ee25fa commit bd82448

7 files changed

Lines changed: 160 additions & 98 deletions

File tree

assets/data/editors/layouts/stage/solidEditScreen.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,17 @@
132132
button.xml.set("name", nameTextBox.label.text);
133133
button.xml.set("x", xStepper.value);
134134
button.xml.set("y", yStepper.value);
135-
button.xml.set("zoom", zoomFactorStepper.value);
135+
button.xml.set("zoomfactor", zoomFactorStepper.value);
136136
button.xml.set("angle", angleStepper.value);
137137
button.xml.set("alpha", alphaStepper.value);
138+
button.xml.remove("blend");
139+
if (sprite.blend != null)
140+
button.xml.set("blend", blendMode.value);
138141

139142
saveXY(sprite.scrollFactor, "scroll", scrollXStepper, scrollYStepper);
140143
saveXY(sprite.skew, "skew", skewXStepper, skewYStepper);
144+
if (isSolid)
145+
button.xml.remove("updateHitbox");
141146
for (att in ["width", "height", "color"])
142147
button.xml.remove(att);
143148
XMLUtil.loadSpriteFromXML(sprite, button.xml, "", 0, false);

assets/data/editors/layouts/stage/spriteEditScreen.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,14 @@
236236
button.xml.set("sprite", spriteTextBox.label.text);
237237
button.xml.set("x", xStepper.value);
238238
button.xml.set("y", yStepper.value);
239-
button.xml.set("zoom", zoomFactorStepper.value);
239+
button.xml.set("zoomfactor", zoomFactorStepper.value);
240240
button.xml.set("type", animTypeToString(animType.value));
241241
button.xml.set("antialiasing", antialiasingCheckbox.checked);
242242
button.xml.set("angle", angleStepper.value);
243243
button.xml.set("alpha", alphaStepper.value);
244+
button.xml.remove("blend");
245+
if (sprite.blend != null)
246+
button.xml.set("blend", blendMode.value);
244247

245248
getEx('anims').clear();
246249
var allowedAnims:Array<String> = [for (b in animations.buttons.members) b.animData.name];

assets/data/stages/test.xml

Lines changed: 0 additions & 12 deletions
This file was deleted.

source/funkin/editors/stage/StageEditor.hx

Lines changed: 10 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,7 @@ class StageEditor extends UIState {
647647
saveToXml(xml, "folder", stage.spritesParentFolder);
648648
saveToXml(xml, "startCamPosX", stage.startCam.x, 0);
649649
saveToXml(xml, "startCamPosY", stage.startCam.y, 0);
650+
xml.attributeOrder = ["name", "folder", "zoom", "startCamPosX", "startCamPosY"];
650651

651652
for(prop in stage.extra.keys())
652653
if(!Stage.DEFAULT_ATTRIBUTES.contains(prop) && !prop.startsWith("stageEditor."))
@@ -655,94 +656,19 @@ class StageEditor extends UIState {
655656
var group:Xml = null;
656657
var curGroup:String = null;
657658

658-
for(sprite in getSprites()) {
659-
var button:StageElementButton = sprite.extra.get(exID("button"));
660-
var newNode:Xml = null;
659+
for(button in stageSpritesWindow.buttons.members) {
660+
button.cleanupXML();
661661
var sprite:FunkinSprite = button.getSprite();
662-
if(button is StageSolidButton) {
663-
var button:StageSolidButton = cast button;
664-
var node:Access = cast sprite.extra.get(exID("node"));
665-
Logs.trace("SOLID / BOX isnt implemented yet!");
666-
} else if(button is StageSpriteButton) {
667-
var button:StageSpriteButton = cast button;
668-
var node:Access = cast sprite.extra.get(exID("node"));
669-
var spriteXML = Xml.createElement("sprite");
670-
saveToXml(spriteXML, "name", sprite.name);
671-
saveToXml(spriteXML, "x", sprite.x, 0);
672-
saveToXml(spriteXML, "y", sprite.y, 0);
673-
saveToXml(spriteXML, "sprite", sprite.extra.get(exID("imageFile")));
674-
savePointToXml(spriteXML, "scale", sprite.scale, 1);
675-
savePointToXml(spriteXML, "scroll", sprite.scrollFactor, 1);
676-
saveToXml(spriteXML, "skewx", sprite.skew.x, 0);
677-
saveToXml(spriteXML, "skewy", sprite.skew.y, 0);
678-
saveToXml(spriteXML, "alpha", sprite.alpha, 1);
679-
saveToXml(spriteXML, "angle", sprite.angle, 0);
680-
//saveToXml(spriteXML, "graphicSize", sprite.width, sprite.width);
681-
//saveToXml(spriteXML, "graphicSizex", sprite.height, sprite.height);
682-
//saveToXml(spriteXML, "graphicSizey", sprite.height, sprite.height);
683-
saveToXml(spriteXML, "zoomfactor", sprite.zoomFactor, 1);
684-
saveToXml(spriteXML, "updateHitbox", getBoolOfNode(node, "updateHitbox"), false);
685-
saveToXml(spriteXML, "antialiasing", sprite.antialiasing, true);
686-
//saveToXml(spriteXML, "width", sprite.width);
687-
//saveToXml(spriteXML, "height", sprite.height);
688-
saveToXml(spriteXML, "playOnCountdown", getBoolOfNode(node, "playOnCountdown"), false);
689-
saveToXml(spriteXML, "interval", node.getAtt("beatInterval"), 2);
690-
saveToXml(spriteXML, "interval", node.getAtt("interval"), 2);
691-
saveToXml(spriteXML, "beatOffset", node.getAtt("beatOffset"), 0);
692-
if(sprite.spriteAnimType != LOOP)
693-
spriteXML.set("type", sprite.spriteAnimType.toString());
694-
saveToXml(spriteXML, "color", sprite.color.toWebString(), "#FFFFFF");
695-
@:privateAccess saveToXml(spriteXML, "blend", sprite.blend.toString(), null);
696-
// TODO: save custom parameters
697-
//saveToXml(spriteXML, "flipX", sprite.flipX, false);
698-
if (node.hasNode.anim) for (animNode in node.nodes.anim)
699-
spriteXML.addChild(animNode.x);
700-
newNode = spriteXML;
701-
} else if(button is StageCharacterButton) {
702-
var button:StageCharacterButton = cast button;
703-
var char:Character = button.char;
704-
var node:Access = cast char.extra.get(exID("node"));
705-
var defaultPos = Stage.getDefaultPos(char.name.replace("NO_DELETE_", ""));
706-
var charXML:Xml = Xml.createElement(node.name);
707-
if(!char.name.startsWith("NO_DELETE_"))
708-
saveToXml(charXML, "name", char.name);
709-
saveToXml(charXML, "x", char.x, defaultPos.x);
710-
saveToXml(charXML, "y", char.y, defaultPos.y);
711-
saveToXml(charXML, "camxoffset", char.extra.get(exID("camX")), 0);
712-
saveToXml(charXML, "camyoffset", char.extra.get(exID("camY")), 0);
713-
saveToXml(charXML, "skewx", char.skew.x, 0);
714-
saveToXml(charXML, "skewy", char.skew.y, 0);
715-
saveToXml(charXML, "spacingx", char.extra.get(exID("spacingX")), 20);
716-
saveToXml(charXML, "spacingy", char.extra.get(exID("spacingY")), 0);
717-
saveToXml(charXML, "alpha", char.alpha / 0.75, 1);
718-
saveToXml(charXML, "angle", char.angle, 0);
719-
saveToXml(charXML, "zoomfactor", char.zoomFactor, 1);
720-
saveToXml(charXML, "flipX", char.isPlayer, defaultPos.flip);
721-
savePointToXml(charXML, "scroll", char.scrollFactor, defaultPos.scroll);
722-
savePointToXml(charXML, "scale", char.scale.scaleNew(button.charScale), 1);
723-
// TODO: save custom parameters
724-
newNode = charXML;
725-
} else if(button is StageUnknownButton) {
726-
var button:StageUnknownButton = cast button;
727-
newNode = button.xml.x;
728-
}
729-
else {
730-
Logs.trace("Unknown Stage Type : " + Type.getClassName(Type.getClass(button)));
731-
Logs.trace("> Sprite : " + Type.getClassName(Type.getClass(sprite)));
732-
}
662+
var newNode:Xml = button.xml.x;
733663

734664
if(newNode != null && sprite != null) {
735-
var isLowMemory = sprite.extra.get(exID("lowMemory")) == true;
736-
var isHighMemory = sprite.extra.get(exID("highMemory")) == true;
737-
/* // Only if this compiled :sob:
738-
var groupName:String = null;
739-
if ((groupName = isLowMemory ? "low-memory" : isHighMemory ? "high-memory" : null) != null) {
740-
var a = group != null && groupName != curGroup && ((group = cast xml.addChild(group)) != null);
741-
(group = (group == null ? Xml.createElement(curGroup = groupName) : group)).addChild(newNode);
742-
}else xml.addChild(newNode);
743-
*/
665+
var groupName = (sprite == null ? null :
666+
(
667+
(sprite.extra.get(exID("lowMemory")) == true) ? "low-memory" :
668+
(sprite.extra.get(exID("highMemory")) == true) ? "high-memory" : null
669+
)
670+
);
744671

745-
var groupName = isLowMemory ? "low-memory" : isHighMemory ? "high-memory" : null;
746672
if(group != null && groupName != curGroup) {
747673
xml.addChild(group);
748674
group = null;

source/funkin/editors/stage/elements/StageCharacterButton.hx

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,50 @@ class StageCharacterButton extends StageElementButton {
4141
return char;
4242
}
4343

44+
override public function getDefaults():Map<String, Dynamic> {
45+
return [
46+
"flip" => false,
47+
"flipX" => false,
48+
"camxoffset" => 0,
49+
"camyoffset" => 0,
50+
"spacingx" => 0,
51+
"spacingy" => 0,
52+
"scale" => 1,
53+
"scroll" => 1,
54+
"zoomfactor" => 1,
55+
"alpha" => 1,
56+
"angle" => 0,
57+
"skew" => 0
58+
];
59+
}
60+
61+
override public function getPointAttributes():Array<String> {
62+
return ["scale", "scroll", "skew"];
63+
}
64+
65+
override public function getAttributeOrder():Array<String> {
66+
return [
67+
"name",
68+
"x",
69+
"y",
70+
"camxoffset",
71+
"camyoffset",
72+
"scale",
73+
"scalex",
74+
"scaley",
75+
"scroll",
76+
"scrollx",
77+
"scrolly",
78+
"zoomfactor",
79+
"alpha",
80+
"angle",
81+
"skewx",
82+
"skewy",
83+
"flip",
84+
"flipX"
85+
];
86+
}
87+
4488
public override function onSelect() {
4589
StageEditor.instance.selectSprite(char);
4690
}

source/funkin/editors/stage/elements/StageElementButton.hx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,18 @@ class StageElementButton extends UIButton {
184184
return "UNKNOWN";
185185
}
186186

187+
public function getDefaults():Map<String, Dynamic> {
188+
return [];
189+
}
190+
191+
public function getPointAttributes():Array<String> {
192+
return [];
193+
}
194+
195+
public function getAttributeOrder():Array<String> {
196+
return ["name"];
197+
}
198+
187199
public function onSelect() {
188200
// TODO: implement
189201
}
@@ -217,4 +229,30 @@ class StageElementButton extends UIButton {
217229
pos.put();
218230
return text;
219231
}
232+
233+
public function cleanupXML() {
234+
var defaults = getDefaults();
235+
var queuedPoints = [];
236+
xml.x.attributeOrder = getAttributeOrder();
237+
for (a in xml.x.attributes()) {
238+
var attribIsPoint:Bool = isPoint(a);
239+
var attrib = attribIsPoint ? a.substring(0, a.length - 1) : a;
240+
241+
var def:Dynamic = defaults[attrib];
242+
def = def is Bool ? Std.string(def) : def;
243+
244+
var value:Dynamic = def is Float ? Std.parseFloat(xml.x.get(attrib)) : xml.x.get(attrib);
245+
if (value == def || (def is Float && Math.abs(def - value) < 0.001)) {
246+
if (!attribIsPoint || queuedPoints.contains(attrib))
247+
xml.x.remove(a);
248+
else
249+
queuedPoints.push(attrib);
250+
}
251+
}
252+
}
253+
public function isPoint(attrib:String):Bool {
254+
var lastChar = attrib.charCodeAt(attrib.length - 1);
255+
var points = getPointAttributes();
256+
return (lastChar == 'x'.code || lastChar == 'y'.code) && points.contains(attrib.substring(0, attrib.length - 1));
257+
}
220258
}

source/funkin/editors/stage/elements/StageSpriteButton.hx

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,64 @@ class StageSpriteButton extends StageElementButton {
3232
return sprite;
3333
}
3434

35+
override public function getDefaults():Map<String, Dynamic> {
36+
return [
37+
"scale" => 1,
38+
"scroll" => 1,
39+
"zoomfactor" => 1,
40+
"updateHitbox" => false,
41+
"antialiasing" => true,
42+
"alpha" => 1,
43+
"angle" => 0,
44+
"skew" => 0,
45+
"type" => "loop",
46+
"beatOffset" => 0,
47+
"beatInterval" => 2,
48+
"interval" => 2,
49+
"flipX" => false,
50+
"flipY" => false
51+
];
52+
}
53+
54+
override public function getPointAttributes():Array<String> {
55+
return ["scale", "scroll", "skew"];
56+
}
57+
58+
override public function getAttributeOrder():Array<String> {
59+
return [
60+
"name",
61+
"sprite",
62+
"x",
63+
"y",
64+
"scale",
65+
"scalex",
66+
"scaley",
67+
"updateHitbox",
68+
"scroll",
69+
"scrollx",
70+
"scrolly",
71+
"zoomfactor",
72+
"antialiasing",
73+
"alpha",
74+
"blend",
75+
"angle",
76+
"skewx",
77+
"skewy",
78+
"color",
79+
"flipX",
80+
"flipY",
81+
"width",
82+
"height",
83+
"graphicSize",
84+
"graphicSizex",
85+
"graphicSizey",
86+
"beatInterval",
87+
"interval",
88+
"beatOffset",
89+
"playOnCountdown"
90+
];
91+
}
92+
3593
public override function onSelect() {
3694
StageEditor.instance.selectSprite(sprite);
3795
}

0 commit comments

Comments
 (0)