diff --git a/source/funkin/backend/chart/EventsData.hx b/source/funkin/backend/chart/EventsData.hx index 397e46fb..38b49201 100644 --- a/source/funkin/backend/chart/EventsData.hx +++ b/source/funkin/backend/chart/EventsData.hx @@ -52,7 +52,8 @@ class EventsData { type: TDropDown(['In', 'Out', 'InOut']), defValue: "In" }, - {name: "Multiplicative?", type: TBool, defValue: false} + {name: "Multiplicative?", type: TBool, defValue: true}, + {name: "Mode", type: TDropDown(['stage', 'direct']), defValue: "stage"} ], "Camera Modulo Change" => [ {name: "Modulo Interval (Beats)", type: TInt(1, 9999999, 1), defValue: 4}, diff --git a/source/funkin/backend/chart/VSliceParser.hx b/source/funkin/backend/chart/VSliceParser.hx index f970a38a..c0bcf5bb 100644 --- a/source/funkin/backend/chart/VSliceParser.hx +++ b/source/funkin/backend/chart/VSliceParser.hx @@ -152,7 +152,7 @@ class VSliceParser { result.events.push({ time: event.t, name: "Camera Zoom", // we dont support the direct mode since welp, its kind of useless here - Nex - params: [values.ease != "INSTANT", values.zoom == null ? 1 : values.zoom, "camGame", values.duration == null ? 4 : values.duration, cneEase[0], cneEase[1], false] + params: [values.ease != "INSTANT", values.zoom == null ? 1 : values.zoom, "camGame", values.duration == null ? 4 : values.duration, cneEase[0], cneEase[1], false, values.mode] }); } } diff --git a/source/funkin/game/PlayState.hx b/source/funkin/game/PlayState.hx index a593a23e..b2e27a10 100644 --- a/source/funkin/game/PlayState.hx +++ b/source/funkin/game/PlayState.hx @@ -1488,8 +1488,10 @@ class PlayState extends MusicBeatState var name = (event.params[2] == "camHUD" ? "camHUD" : "camGame") + ".zoom"; // avoiding having different values from these 2 - Nex var tween = eventsTween.get(name); if (tween != null) tween.cancel(); + var ease = CoolUtil.flxeaseFromString(event.params[4], event.params[5]); + var direct = event.params[7] == 'direct'; - var finalZoom:Float = event.params[1]; + var finalZoom:Float = event.params[1] * (direct ? FlxCamera.defaultZoom : stage.defaultZoom); if (event.params[6] == true) finalZoom *= cam.zoom; if (event.params[0] == false) { @@ -1497,7 +1499,7 @@ class PlayState extends MusicBeatState if (cam == camHUD) defaultHudZoom = finalZoom; else defaultCamZoom = finalZoom; } else - eventsTween.set(name, FlxTween.tween(cam, {zoom: finalZoom}, (Conductor.stepCrochet / 1000) * event.params[3], {ease: CoolUtil.flxeaseFromString(event.params[4], event.params[5]), onUpdate: function(_) { + eventsTween.set(name, FlxTween.tween(cam, {zoom: finalZoom}, (Conductor.stepCrochet / 1000) * event.params[3], {ease: ease, onUpdate: function(_) { if (cam == camHUD) defaultHudZoom = cam.zoom; else defaultCamZoom = cam.zoom; }})); diff --git a/source/funkin/game/Stage.hx b/source/funkin/game/Stage.hx index b8c62a61..35d926f7 100644 --- a/source/funkin/game/Stage.hx +++ b/source/funkin/game/Stage.hx @@ -27,6 +27,9 @@ class Stage extends FlxBasic implements IBeatReceiver { public var characterPoses:Map = []; public var xmlImportedScripts:Array = []; + public var defaultZoom:Float = 1.05; + public var startCam = new FlxPoint(); + private var spritesParentFolder = ""; /** @@ -63,14 +66,19 @@ class Stage extends FlxBasic implements IBeatReceiver { var event = null; if (stageXML != null) { + var parsed:Null; + if((parsed = Std.parseFloat(stageXML.getAtt("startCamPosX"))).isNotNull()) startCam.x = parsed; + if((parsed = Std.parseFloat(stageXML.getAtt("startCamPosY"))).isNotNull()) startCam.y = parsed; + if((parsed = Std.parseFloat(stageXML.getAtt("zoom"))).isNotNull()) defaultZoom = parsed; + stageName = stageXML.getAtt("name").getDefault(stage); - if (PlayState.instance != null) { - var parsed:Null; - if(stageXML.has.startCamPosX && (parsed = Std.parseFloat(stageXML.att.startCamPosX)) != null) PlayState.instance.camFollow.x = parsed; - if(stageXML.has.startCamPosY && (parsed = Std.parseFloat(stageXML.att.startCamPosY)) != null) PlayState.instance.camFollow.y = parsed; - if(stageXML.has.zoom && (parsed = Std.parseFloat(stageXML.att.zoom)) != null) PlayState.instance.defaultCamZoom = parsed; + if (PlayState.instance == state) { + if(stageXML.has.startCamPosX) PlayState.instance.camFollow.x = startCam.x; + if(stageXML.has.startCamPosY) PlayState.instance.camFollow.y = startCam.y; + if(stageXML.has.zoom) PlayState.instance.defaultCamZoom = defaultZoom; } + if (stageXML.has.folder) { spritesParentFolder = stageXML.att.folder; if (!spritesParentFolder.endsWith("/")) spritesParentFolder += "/"; @@ -333,6 +341,7 @@ class StageCharPos extends FlxObject { public override function destroy() { scale.put(); + startCam.put(); super.destroy(); }