diff --git a/assets/data/stages/test.xml b/assets/data/stages/test.xml
new file mode 100644
index 00000000..f74dbd01
--- /dev/null
+++ b/assets/data/stages/test.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/assets/data/states/StageEditor.hx b/assets/data/states/StageEditor.hx
new file mode 100644
index 00000000..e37acc0b
--- /dev/null
+++ b/assets/data/states/StageEditor.hx
@@ -0,0 +1,133 @@
+/**
+ * THIS FILE IS TEMPORARY UNTIL TRANSFORMS ARE AT A USEABLE STATE.
+ * TODO:
+ * - !!!! MOVE BACK TO SOURCE !!!!
+ * - Rotation
+ * - Skewing
+ * - Angle + Scale (like already at a angle)
+ */
+
+import funkin.editors.stage.StageEditor;
+import funkin.backend.utils.WindowUtils;
+import openfl.Lib;
+
+var exID = StageEditor.exID;
+
+function tryUpdateHitbox(sprite) {
+ var spriteNode = sprite.extra.get(exID("node"));
+ if (spriteNode.exists("updateHitbox") && spriteNode.get("updateHitbox") == "true") {
+ sprite.updateHitbox();
+ return true;
+ }
+
+ if (!FlxG.keys.pressed.ALT) {
+ sprite.x = storedPos.x - (sprite.frameWidth * (storedScale.x - sprite.scale.x) * 0.5);
+ sprite.y = storedPos.y - (sprite.frameHeight * (storedScale.y - sprite.scale.y) * 0.5);
+ }
+ return false;
+}
+
+function create() {
+ WindowUtils.preventClosing = true;
+ WindowUtils.resetClosing();
+ WindowUtils.onClosing = function() {
+ if(!FlxG.keys.pressed.ALT) {
+ Lib.application.window.onClose.cancel();
+ FlxG.switchState(new StageEditor("test"));
+ trace("you dont need to close doofus goofus");
+ }
+ }
+}
+
+function update() {
+ if(FlxG.keys.justPressed.R) {
+ trace("reloading");
+ FlxG.switchState(new StageEditor("test"));
+ }
+}
+
+function genericScale(sprite, relative, doX, doY) {
+ if (FlxG.keys.pressed.ALT) {
+ relative.x *= 2;
+ relative.y *= 2;
+ }
+
+ var width = sprite.frameWidth * storedScale.x;
+ var height = sprite.frameHeight * storedScale.y;
+ if(doX) width -= relative.x;
+ if(doY) height -= relative.y;
+ CoolUtil.setGraphicSizeFloat(sprite, width, height);
+
+ if(FlxG.keys.pressed.SHIFT) {
+ var nscale = Math.max(sprite.scale.x, sprite.scale.y);
+ sprite.scale.set(nscale, nscale);
+ }
+
+ var updatedHitbox = tryUpdateHitbox(sprite);
+ if (FlxG.keys.pressed.ALT) {
+ sprite.x = storedPos.x;
+ sprite.y = storedPos.y;
+ if(updatedHitbox) {
+ sprite.x += (sprite.frameWidth * (storedScale.x - sprite.scale.x) * 0.5);
+ sprite.y += (sprite.frameHeight * (storedScale.y - sprite.scale.y) * 0.5);
+ }
+ return true;
+ }
+ return !updatedHitbox;
+}
+
+function genericOppositeScale(sprite, relative, scaleX, scaleY, repositionX, repositionY) {
+ if(repositionX) relative.x *= -1;
+ if(repositionY) relative.y *= -1;
+ var repositioned = genericScale(sprite, relative, scaleX, scaleY);
+ if (!repositioned) {
+ if(repositionX) sprite.x = storedPos.x + (sprite.frameWidth * (storedScale.x - sprite.scale.x));
+ if(repositionY) sprite.y = storedPos.y + (sprite.frameHeight * (storedScale.y - sprite.scale.y));
+ } else if (!FlxG.keys.pressed.ALT) {
+ if(repositionX) sprite.x += (sprite.frameWidth * (storedScale.x - sprite.scale.x));
+ if(repositionY) sprite.y += (sprite.frameHeight * (storedScale.y - sprite.scale.y));
+ }
+}
+
+function SCALE_BOTTOM_RIGHT(sprite, relative) {
+ genericScale(sprite, relative, true, true);
+}
+
+function SCALE_TOP_RIGHT(sprite, relative) {
+ genericOppositeScale(sprite, relative, true, true, false, true);
+}
+
+function SCALE_TOP_LEFT(sprite, relative) {
+ genericOppositeScale(sprite, relative, true, true, true, true);
+}
+
+function SCALE_BOTTOM_LEFT(sprite, relative) {
+ genericOppositeScale(sprite, relative, true, true, true, false);
+}
+
+function SCALE_LEFT(sprite, relative) {
+ genericOppositeScale(sprite, relative, true, false, true, false);
+}
+
+function SCALE_RIGHT(sprite, relative) {
+ genericScale(sprite, relative, true, false);
+}
+
+function SCALE_TOP(sprite, relative) {
+ genericOppositeScale(sprite, relative, false, true, false, true);
+}
+
+function SCALE_BOTTOM(sprite, relative) {
+ genericScale(sprite, relative, false, true);
+}
+
+function SKEW_LEFT(sprite, relative) {}
+
+function SKEW_BOTTOM(sprite, relative) {}
+
+function SKEW_TOP(sprite, relative) {}
+
+function SKEW_RIGHT(sprite, relative) {}
+
+function ROTATE(sprite, relative) {}
+
diff --git a/source/funkin/backend/utils/CoolUtil.hx b/source/funkin/backend/utils/CoolUtil.hx
index 36f817e8..240e2dde 100644
--- a/source/funkin/backend/utils/CoolUtil.hx
+++ b/source/funkin/backend/utils/CoolUtil.hx
@@ -416,6 +416,21 @@ class CoolUtil
sprite.scale.set(nScale, nScale);
}
+ public static function setGraphicSizeFloat(sprite:FlxSprite, Width:Float = 0, Height:Float = 0):Void
+ {
+ if (Width <= 0 && Height <= 0)
+ return;
+
+ var newScaleX:Float = Width / sprite.frameWidth;
+ var newScaleY:Float = Height / sprite.frameHeight;
+ sprite.scale.set(newScaleX, newScaleY);
+
+ if (Width <= 0)
+ sprite.scale.x = newScaleY;
+ else if (Height <= 0)
+ sprite.scale.y = newScaleX;
+ }
+
/**
* Returns a simple string representation of a FlxKey. Used in Controls options.
* @param key Key
diff --git a/source/funkin/editors/stage/StageEditor.hx b/source/funkin/editors/stage/StageEditor.hx
index d8b9cd31..fa737305 100644
--- a/source/funkin/editors/stage/StageEditor.hx
+++ b/source/funkin/editors/stage/StageEditor.hx
@@ -1,5 +1,6 @@
package funkin.editors.stage;
+import lime.ui.MouseCursor;
import flixel.math.FlxAngle;
import flixel.math.FlxPoint;
import flixel.math.FlxRect;
@@ -13,6 +14,7 @@ import funkin.game.Character;
import funkin.game.Stage;
import haxe.xml.Access;
import haxe.xml.Printer;
+import openfl.ui.Mouse;
using funkin.backend.utils.MatrixUtil;
@@ -32,7 +34,6 @@ class StageEditor extends UIState {
public var uiGroup:FlxTypedGroup = new FlxTypedGroup();
public var stageSpritesWindow:UIButtonList;
- public var stageSprites:FlxTypedGroup = new FlxTypedGroup();
public var xmlMap:Map = new Map();
@@ -43,7 +44,12 @@ class StageEditor extends UIState {
public var guideCamera:FlxCamera;
public var uiCamera:FlxCamera;
- public static var selection:Selection;
+ public var selection:Selection = new Selection();
+ public var mouseMode:StageEditorMouseMode = NONE;
+ public var mousePoint:FlxPoint = new FlxPoint();
+ public var clickPoint:FlxPoint = new FlxPoint();
+ public var storedPos:FlxPoint = new FlxPoint();
+ public var storedScale:FlxPoint = new FlxPoint();
public var showOutlines:Bool = true;
public var showCharacters:Bool = true;
@@ -182,6 +188,7 @@ class StageEditor extends UIState {
if(sprite is FunkinSprite) {
var sprite:FunkinSprite = cast sprite;
name = sprite.name;
+ sprite.extra.set(exID("node"), node);
sprite.extra.set(exID("type"), node.name);
sprite.extra.set(exID("imageFile"), '${node.getAtt("sprite").getDefault(sprite.name)}');
//sprite.active = false;
@@ -217,10 +224,6 @@ class StageEditor extends UIState {
order.push(sprite);
xmlMap.set(sprite, node);
- //var t = new StageSprite(name, sprite);
- //t.node = node;
- //stageSprites.add(t);
-
return sprite;
}
stage.loadXml(stage.stageXML, true);
@@ -234,12 +237,6 @@ class StageEditor extends UIState {
charMap[charPos.name] = char;
}
- add(stageSprites);
-
- for(spr in order) {
-
- }
-
setZoom(stage.defaultZoom);
topMenuSpr = new UITopMenu(topMenu);
@@ -251,6 +248,8 @@ class StageEditor extends UIState {
var buttonSize:FlxPoint = FlxPoint.get(width-margin*2, 32);
stageSpritesWindow = new UIButtonList(Std.int(FlxG.width - width), TOP_MENU_HEIGHT, width, Std.int(FlxG.height - TOP_MENU_HEIGHT), "Stage Sprites", buttonSize);
stageSpritesWindow.collapsable = true;
+ stageSpritesWindow.middleAlpha = 0.5;
+ stageSpritesWindow.bottomAlpha = 0.5;
stageSpritesWindow.addButton.callback = () -> {
// TODO: implement this
}
@@ -311,6 +310,8 @@ class StageEditor extends UIState {
//if (character != null)
// characterPropertiresWindow.characterInfo.text = '${character.getNameList().length} Animations\nFlipped: ${character.flipX}\nSprite: ${character.sprite}\nAnim: ${character.getAnimName()}\nOffset: (${character.frameOffset.x}, ${character.frameOffset.y})';
+ currentCursor = ARROW;
+
if ((!stageSpritesWindow.hovered && !stageSpritesWindow.dragging) && !topMenuSpr.hovered) {
if (FlxG.mouse.wheel != 0) {
zoom += 0.25 * FlxG.mouse.wheel;
@@ -370,17 +371,23 @@ class StageEditor extends UIState {
}
}*/
+ for(sprite in selection) {
+ if(sprite is FunkinSprite) {
+ handleSelection(cast sprite);
+ }
+ }
+
//if (FlxG.mouse.justReleasedRight) {
// closeCurrentContextMenu();
// openContextMenu(topMenu[2].childs);
//}
- if (FlxG.mouse.pressed) {
+
+ if (FlxG.mouse.pressed && mouseMode == NONE) {
nextScroll.set(nextScroll.x - FlxG.mouse.deltaScreenX, nextScroll.y - FlxG.mouse.deltaScreenY);
currentCursor = HAND;
- } else
- currentCursor = ARROW;
- } else if (!FlxG.mouse.pressed)
- currentCursor = ARROW;
+ }
+ }/* else if (!FlxG.mouse.pressed)
+ currentCursor = ARROW;*/
stageCamera.scroll.set(
lerp(stageCamera.scroll.x, nextScroll.x, 0.35),
@@ -394,6 +401,7 @@ class StageEditor extends UIState {
}
public function selectSprite(_sprite:FunkinSprite) {
+ selection = new Selection([]);
var sprites = stageSpritesWindow.buttons.members.map((o) -> o.getSprite()).filter((o) -> o != null);// && o.animateAtlas == null);
for(sprite in sprites) {
if(sprite is FunkinSprite) {
@@ -406,6 +414,8 @@ class StageEditor extends UIState {
var sprite:FunkinSprite = cast _sprite;
sprite.extra.set(exID("selected"), true);
sprite.extra.get(exID("button")).selected = true;
+ selection = new Selection([sprite]);
+ Logs.trace("Selected " + sprite.name);
}
}
@@ -592,28 +602,23 @@ class StageEditor extends UIState {
super.draw();
if(!showOutlines) return;
-
+ mousePoint = FlxG.mouse.getWorldPosition(stageCamera, mousePoint);
if(dot == null) {
- dot = new FlxSprite().makeGraphic(10, 10, FlxColor.WHITE);
+ dot = new FlxSprite().makeGraphic(30, 30, FlxColor.WHITE);
dot.camera = stageCamera;
dot.forceIsOnScreen = true;
}
- for(sprite in stage.stageSprites) {
- if(sprite.visible && sprite.isOnScreen(stageCamera)) {
+ for(sprite in selection) {
+ if(sprite is FunkinSprite) {
@:privateAccess if(sprite._frame == null) continue;
- drawGuides(sprite);
- }
- }
- if(showCharacters) {
- for(char in chars) {
- if(char.visible && char.isOnScreen(stageCamera)) {
- @:privateAccess if(char._frame == null) continue;
- drawGuides(char);
- }
+ drawGuides(cast sprite);
}
}
}
+ var lineColor = 0xFFb794b6;
+ var circleColor = 0xFF99a8f2;
+
function drawGuides(sprite:FlxSprite) {
var oldWidth = sprite.width;
var oldHeight = sprite.height;
@@ -652,30 +657,125 @@ class StageEditor extends UIState {
}
cast(sprite.extra.get(exID("bounds")), FlxRect).set(minX, minY, maxX - minX, maxY - minY);
}
+ var funkinSprite = sprite is FunkinSprite ? cast(sprite, FunkinSprite) : null;
- dot.color = FlxColor.RED;
- if(sprite is FunkinSprite) {
- var sprite:FunkinSprite = cast sprite;
- if(sprite.extra.get(exID("selected")) == true) {
- dot.color = FlxColor.GREEN;
+ if(funkinSprite != null) {
+ if(funkinSprite.extra.exists(exID("buttonBoxes"))) {
+ var oldButtonBoxes:Array = cast funkinSprite.extra.get(exID("buttonBoxes"));
+ if(oldButtonBoxes != null) {
+ for(point in oldButtonBoxes) {
+ point.put();
+ }
+ }
}
}
-
- for(corner in corners) {
- drawDot(corner.x, corner.y);
- corner.put();
+ var buttonBoxes = [];
+ if(funkinSprite != null) {
+ funkinSprite.extra.set(exID("buttonBoxes"), buttonBoxes);
}
+ dot.color = lineColor;
+
drawLine(corners[0], corners[1]); // tl - tr
drawLine(corners[0], corners[2]); // tl - bl
drawLine(corners[1], corners[3]); // tr - br
drawLine(corners[2], corners[3]); // bl - br
+ // cross
+ //drawLine(corners[0], corners[3]); // tl - br
+ //drawLine(corners[1], corners[2]); // tr - bl
+
+ dot.color = circleColor;
+
+ for(corner in corners) {
+ drawDot(corner.x, corner.y);
+ buttonBoxes.push(corner);
+ }
+
+ if(funkinSprite == null) {
+ for(corner in buttonBoxes) {
+ corner.put();
+ }
+ }
// reset hitbox to old values
sprite.width = oldWidth;
sprite.height = oldHeight;
}
+ var edges:Array = [
+ //// corners
+ TOP_LEFT, //FlxPoint.get(0, 0),
+ TOP_RIGHT, //FlxPoint.get(1, 0),
+ BOTTOM_LEFT, //FlxPoint.get(0, 1),
+ BOTTOM_RIGHT, //FlxPoint.get(1, 1),
+ //// edges
+ MIDDLE_LEFT, //FlxPoint.get(0, 0.5),
+ MIDDLE_RIGHT, //FlxPoint.get(1, 0.5),
+ BOTTOM_MIDDLE, //FlxPoint.get(0.5, 1),
+ TOP_MIDDLE, //FlxPoint.get(0.5, 0),
+ ];
+
+ function tryUpdateHitbox(sprite:FunkinSprite) {
+ call("tryUpdateHitbox", [sprite]);
+ }
+
+ function handleSelection(sprite:FunkinSprite) {
+ var buttonBoxes = sprite.extra.get(exID("buttonBoxes"));
+
+ dotCheckSize = dot.frameWidth / 0.7/stageCamera.zoom; // basically adjust it to the zoom.
+
+ if(FlxG.mouse.justPressed) {
+ for(i=>edge in edges) {
+ if(checkDot(buttonBoxes[i])) {
+ mouseMode = switch(edge) {
+ case TOP_LEFT: SCALE_TOP_LEFT;
+ case TOP_MIDDLE: SCALE_TOP;
+ case TOP_RIGHT: SCALE_TOP_RIGHT;
+ case MIDDLE_LEFT: SCALE_LEFT;
+ case MIDDLE_RIGHT: SCALE_RIGHT;
+ case BOTTOM_LEFT: SCALE_BOTTOM_LEFT;
+ case BOTTOM_MIDDLE: SCALE_BOTTOM;
+ case BOTTOM_RIGHT: SCALE_BOTTOM_RIGHT;
+ default: NONE;
+ }
+ Logs.trace("Clicked Dot: " + mouseMode.toString());
+ mousePoint.copyTo(clickPoint);
+ storedPos.set(sprite.x, sprite.y);
+ storedScale.copyFrom(sprite.scale);
+ }
+ }
+ }
+ for(i=>edge in edges) {
+ if(checkDot(buttonBoxes[i])) {
+ currentCursor = switch(edge) {
+ // RESIZE_NESW; //RESIZE_NS; //RESIZE_NWSE; //RESIZE_WE;
+ case TOP_LEFT | BOTTOM_RIGHT: MouseCursor.RESIZE_NWSE;
+ case TOP_MIDDLE | BOTTOM_MIDDLE: MouseCursor.RESIZE_NS;
+ case TOP_RIGHT | BOTTOM_LEFT: MouseCursor.RESIZE_NESW;
+ case MIDDLE_LEFT | MIDDLE_RIGHT: MouseCursor.RESIZE_WE;
+ default: ARROW;
+ }
+ break;
+ }
+ }
+
+ mouseMode = (FlxG.mouse.justReleased) ? NONE : mouseMode;
+ if(mouseMode == NONE) return;
+ var relative = clickPoint.subtractNew(mousePoint);
+ // todo: make this origin based
+ relative.rotateByDegrees(sprite.angle);
+ call(mouseMode.toString(), [sprite, relative]);
+ cast(sprite.extra.get(exID("button")), StageElementButton).updateInfo(sprite);
+ relative.put();
+ }
+
+ var dotCheckSize:Float = 50;
+
+ function checkDot(point:FlxPoint):Bool {
+ var rect = new FlxRect(point.x - dotCheckSize/2, point.y - dotCheckSize/2, dotCheckSize, dotCheckSize);
+ return rect.containsPoint(mousePoint);
+ }
+
inline function drawDot(x:Float, y:Float) {
dot.setPosition(x, y);
dot.scale.set(0.7/stageCamera.zoom, 0.7/stageCamera.zoom);
@@ -712,8 +812,8 @@ enum StageChange {
CEditInfo(oldInfo:Xml, newInfo:Xml);
}
-@:forward abstract Selection(Array) from Array to Array {
- public inline function new(?array:Array)
+@:forward abstract Selection(Array) from Array to Array {
+ public inline function new(?array:Array)
this = array == null ? [] : array;
// too lazy to put this in every for loop so i made it a abstract
@@ -727,112 +827,70 @@ enum StageChange {
//}
}
-class StageSprite extends UISprite {
- public var tracker:FlxObject;
- public var funkinTracker:FunkinSprite;
- public var node:Access;
+enum abstract StageEditorMouseMode(Int) {
+ var NONE;
- public var name:String;
+ var SCALE_LEFT;
+ var SCALE_BOTTOM;
+ var SCALE_TOP;
+ var SCALE_RIGHT;
+ var SCALE_TOP_LEFT;
+ var SCALE_TOP_RIGHT;
+ var SCALE_BOTTOM_LEFT;
+ var SCALE_BOTTOM_RIGHT;
- public var extra:Map = new Map();
+ var SKEW_LEFT;
+ var SKEW_BOTTOM;
+ var SKEW_TOP;
+ var SKEW_RIGHT;
- public var scrollX:Float;
- public var scrollY:Float;
- public var scaleX:Float;
- public var scaleY:Float;
- public var zoomFactor:Float = 1; // TODO: implement this
- public var skewX:Float;
- public var skewY:Float;
- public var spriteAnimType:XMLAnimType;
+ var ROTATE;
- public var skipNegativeBeats:Bool = false;
- public var beatInterval:Int = 0;
- public var beatOffset:Int = 0;
-
- public var lowMemory:Bool;
- public var highMemory:Bool;
-
- public var selected:Bool = false;
- public var draggable:Bool = false;
-
- public function new(name:String, sprite:FlxObject) {
- super(x, y);
- this.name = name;
- this.tracker = sprite;
-
- scrollX = tracker.scrollFactor.x;
- scrollY = tracker.scrollFactor.y;
- if(tracker is FunkinSprite) {
- var tracker:FunkinSprite = cast tracker;
- scaleX = tracker.scale.x;
- scaleY = tracker.scale.y;
- funkinTracker = tracker;
- }
- else if (tracker is StageCharPos) {
- var tracker:StageCharPos = cast tracker;
- var char:Character = tracker.extra.get(StageEditor.exID("char"));
- scaleX = tracker.scale.x;
- scaleY = tracker.scale.y;
- funkinTracker = char;
- }
-
- lowMemory = node.x.parent.nodeName == "low-memory";
- highMemory = node.x.parent.nodeName == "high-memory";
-
- if(funkinTracker != null) {
- skewX = funkinTracker.skew.x;
- skewY = funkinTracker.skew.y;
- alpha = funkinTracker.alpha;
- spriteAnimType = funkinTracker.spriteAnimType;
- antialiasing = funkinTracker.antialiasing;
- width = funkinTracker.width;
- height = funkinTracker.height;
- color = funkinTracker.color;
-
- skipNegativeBeats = funkinTracker.skipNegativeBeats;
- beatInterval = funkinTracker.beatInterval;
- beatOffset = funkinTracker.beatOffset;
- }
-
- }
-
- public override function update(elapsed:Float) {
- super.update(elapsed);
- if (tracker.exists) {
- tracker.x = x;
- tracker.y = y;
- tracker.scrollFactor.set(scrollX, scrollY);
- if(tracker is FlxSprite) {
- var tracker:FlxSprite = cast tracker;
- }
- else if (tracker is StageCharPos) {
- var tracker:StageCharPos = cast tracker;
- tracker.skewX = skewX;
- tracker.skewY = skewY;
- }
-
- if(funkinTracker != null) {
- funkinTracker.scale.set(scaleX, scaleY);
- funkinTracker.skew.set(skewX, skewY);
- funkinTracker.alpha = alpha;
- funkinTracker.spriteAnimType = spriteAnimType;
- funkinTracker.antialiasing = antialiasing;
- funkinTracker.width = width;
- funkinTracker.height = height;
-
- funkinTracker.skipNegativeBeats = skipNegativeBeats;
- funkinTracker.beatInterval = beatInterval;
- funkinTracker.beatOffset = beatOffset;
-
- funkinTracker.color = color;
- }
+ public function toString():String {
+ return switch(cast this) {
+ case NONE: "NONE";
+ case SCALE_LEFT: "SCALE_LEFT";
+ case SCALE_BOTTOM: "SCALE_BOTTOM";
+ case SCALE_TOP: "SCALE_TOP";
+ case SCALE_RIGHT: "SCALE_RIGHT";
+ case SCALE_TOP_LEFT: "SCALE_TOP_LEFT";
+ case SCALE_TOP_RIGHT: "SCALE_TOP_RIGHT";
+ case SCALE_BOTTOM_LEFT: "SCALE_BOTTOM_LEFT";
+ case SCALE_BOTTOM_RIGHT: "SCALE_BOTTOM_RIGHT";
+ case SKEW_LEFT: "SKEW_LEFT";
+ case SKEW_BOTTOM: "SKEW_BOTTOM";
+ case SKEW_TOP: "SKEW_TOP";
+ case SKEW_RIGHT: "SKEW_RIGHT";
+ case ROTATE: "ROTATE";
}
}
+}
- public function handleSelection(selectionBox:UISliceSprite):Bool {
- return false;
- };
- public function handleDrag(change:FlxPoint):Void {
+enum abstract StageEditorEdge(Int) {
+ var NONE;
- };
+ var TOP_LEFT;
+ var TOP_MIDDLE;
+ var TOP_RIGHT;
+ var MIDDLE_LEFT;
+ var MIDDLE_MIDDLE;
+ var MIDDLE_RIGHT;
+ var BOTTOM_LEFT;
+ var BOTTOM_MIDDLE;
+ var BOTTOM_RIGHT;
+
+ function toString():String {
+ return switch(cast this) {
+ case NONE: "NONE";
+ case TOP_LEFT: "TOP_LEFT";
+ case TOP_MIDDLE: "TOP_MIDDLE";
+ case TOP_RIGHT: "TOP_RIGHT";
+ case MIDDLE_LEFT: "MIDDLE_LEFT";
+ case MIDDLE_MIDDLE: "MIDDLE_MIDDLE";
+ case MIDDLE_RIGHT: "MIDDLE_RIGHT";
+ case BOTTOM_LEFT: "BOTTOM_LEFT";
+ case BOTTOM_MIDDLE: "BOTTOM_MIDDLE";
+ case BOTTOM_RIGHT: "BOTTOM_RIGHT";
+ }
+ }
}
\ No newline at end of file
diff --git a/source/funkin/editors/stage/elements/StageCharacterButton.hx b/source/funkin/editors/stage/elements/StageCharacterButton.hx
index 538ae0eb..2ccf6051 100644
--- a/source/funkin/editors/stage/elements/StageCharacterButton.hx
+++ b/source/funkin/editors/stage/elements/StageCharacterButton.hx
@@ -53,8 +53,8 @@ class StageCharacterButton extends StageElementButton {
return charPos.name;
}
- public override function getInfoText():String {
- return '${getName()} (${charPos.x}, ${charPos.y})';
+ public override function getPos():FlxPoint {
+ return FlxPoint.get(charPos.x, charPos.y);
}
public override function updatePos() {
diff --git a/source/funkin/editors/stage/elements/StageElementButton.hx b/source/funkin/editors/stage/elements/StageElementButton.hx
index c2df186a..ae88b66b 100644
--- a/source/funkin/editors/stage/elements/StageElementButton.hx
+++ b/source/funkin/editors/stage/elements/StageElementButton.hx
@@ -136,7 +136,14 @@ class StageElementButton extends UIButton {
// TODO: implement
}
+ public function getPos():FlxPoint {
+ return FlxPoint.get(-1, -1);
+ }
+
public function getInfoText():String {
- return 'NOT IMPLEMENTED';
+ var pos = getPos();
+ var text = '${getName()} (${CoolUtil.quantize(pos.x, 100)}x${CoolUtil.quantize(pos.y, 100)})';
+ pos.put();
+ return text;
}
}
\ No newline at end of file
diff --git a/source/funkin/editors/stage/elements/StageSpriteButton.hx b/source/funkin/editors/stage/elements/StageSpriteButton.hx
index 96a9981e..09cc061e 100644
--- a/source/funkin/editors/stage/elements/StageSpriteButton.hx
+++ b/source/funkin/editors/stage/elements/StageSpriteButton.hx
@@ -59,8 +59,8 @@ class StageSpriteButton extends StageElementButton {
return xml.att.name;
}
- public override function getInfoText():String {
- return '${getName()} (${sprite.x}, ${sprite.y})';
+ public override function getPos():FlxPoint {
+ return FlxPoint.get(sprite.x, sprite.y);
}
public override function updatePos() {
diff --git a/source/funkin/editors/ui/UISliceSprite.hx b/source/funkin/editors/ui/UISliceSprite.hx
index 664ede98..a6a6afd5 100644
--- a/source/funkin/editors/ui/UISliceSprite.hx
+++ b/source/funkin/editors/ui/UISliceSprite.hx
@@ -31,6 +31,18 @@ class UISliceSprite extends UISprite {
bHeight = h;
}
+ override function set_alpha(value:Float) {
+ super.set_alpha(value);
+ topAlpha = alpha;
+ middleAlpha = alpha;
+ bottomAlpha = alpha;
+ return value;
+ }
+
+ public var topAlpha:Float = 1;
+ public var middleAlpha:Float = 1;
+ public var bottomAlpha:Float = 1;
+
public var drawTop:Bool = true;
public var drawMiddle:Bool = true;
public var drawBottom:Bool = true;
@@ -87,8 +99,10 @@ class UISliceSprite extends UISprite {
var y:Float = this.y;
if (visible && !(bWidth == 0 || bHeight == 0)) {
+ var oldAlpha = alpha;
// TOP
if (drawTop) {
+ super.set_alpha(topAlpha);
// TOP LEFT
frame = topleft;
setPosition(x, y);
@@ -118,6 +132,7 @@ class UISliceSprite extends UISprite {
// MIDDLE
if (drawMiddle && bHeight > top.frame.height + bottom.frame.height) {
+ super.set_alpha(middleAlpha);
var middleHeight:Float = bHeight - (topleft.frame.height * Math.min(bHeight/(topleft.frame.height*2), 1)) -
bottomleft.frame.height * Math.min(bHeight/(bottomleft.frame.height*2), 1);
@@ -144,6 +159,7 @@ class UISliceSprite extends UISprite {
// BOTTOM
if (drawBottom) {
+ super.set_alpha(bottomAlpha);
// BOTTOM LEFT
frame = bottomleft;
setPosition(x, y + bHeight - (bottomleft.frame.height * Math.min(bHeight/(bottomleft.frame.height*2), 1)));
@@ -172,7 +188,9 @@ class UISliceSprite extends UISprite {
bottomright.frame.height * Math.min(bHeight/(bottomright.frame.height*2), 1)
);
super.drawSuper();
+
}
+ super.set_alpha(oldAlpha);
}
setPosition(x, y);
diff --git a/source/funkin/game/Stage.hx b/source/funkin/game/Stage.hx
index b04c8c13..c890c82b 100644
--- a/source/funkin/game/Stage.hx
+++ b/source/funkin/game/Stage.hx
@@ -288,6 +288,7 @@ class Stage extends FlxBasic implements IBeatReceiver {
for (path in Paths.getFolderContent("data/stages/", false, mods ? MODS : BOTH)) {
var extension = Path.extension(path);
if (extensions.contains(extension)) {
+ list.pushOnce("test");
list.pushOnce(Path.withoutExtension(path));
}
}