From 17742f3ee37a77a7d2ad4f019e70f1fcc4e742f2 Mon Sep 17 00:00:00 2001 From: emily <84390581+inky03@users.noreply.github.com> Date: Mon, 3 Feb 2025 19:11:20 -0600 Subject: [PATCH 01/73] initial changes --- source/funkin/backend/play/Chart.hx | 27 +-- source/funkin/backend/play/NoteEvent.hx | 183 +++++++++-------- source/funkin/backend/play/Scoring.hx | 2 +- source/funkin/backend/scripting/HScript.hx | 5 +- source/funkin/objects/HealthIcon.hx | 23 ++- source/funkin/objects/play/Lane.hx | 133 ++++++------ source/funkin/objects/play/Note.hx | 225 ++++++++++++--------- source/funkin/objects/play/Strumline.hx | 14 +- source/funkin/states/CharterState.hx | 7 +- source/funkin/states/PlayState.hx | 39 ++-- 10 files changed, 354 insertions(+), 304 deletions(-) diff --git a/source/funkin/backend/play/Chart.hx b/source/funkin/backend/play/Chart.hx index a32e1f1..7b1ad03 100644 --- a/source/funkin/backend/play/Chart.hx +++ b/source/funkin/backend/play/Chart.hx @@ -508,7 +508,8 @@ class Chart { return null; } } - + + /* public function generateNotes(singleSegmentHolds:Bool = false):Array { var time:Float = Sys.time(); Log.minor('generating notes from song'); @@ -566,6 +567,7 @@ class Chart { return noteArray; } + */ public function loadMusic(path:String, overwrite:Bool = true) { // this could be better if (instLoaded && !overwrite) return true; @@ -601,24 +603,17 @@ class Chart { } } -enum ChartFormat { - AUTO; - MODERN; - LEGACY; // psych / pre0.3 - STEPMANIA; - SHARK; - CNE; +enum abstract ChartFormat(String) to String { + var AUTO = 'auto'; + var MODERN = 'modern'; + var LEGACY = 'legacy'; // psych / pre0.3 + var STEPMANIA = 'stepmania'; + var SHARK = 'stepmaniashark'; + var CNE = 'codenameengine'; - UNKNOWN; + var UNKNOWN = 'unknown'; } -@:structInit class ChartNote implements ITimeSortable { - public var laneIndex:Int; - public var msTime:Float = 0; - public var kind:String = ''; - public var msLength:Float = 0; - public var player:Bool = true; -} @:structInit class ChartEvent implements ITimedEvent { public var name:String; public var msTime:Float = 0; diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index 54f3d22..5488d49 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -48,113 +48,119 @@ import funkin.objects.play.Strumline; if (targetCharacter != null) targetCharacter.volume = 1; - note.hitTime = lane.conductorInUse.songPosition; - if (!note.isHoldPiece) { - // if (lane.heldNote != null) - // lane.hitSustainsOf(lane.heldNote); - lane.heldNote = note; + note.hitTime = note.holdTime = lane.conductorInUse.songPosition; - if (playSound) - game.hitsound.play(true); + if (playSound) + game.hitsound.play(true); + + if (applyRating) { + scoring ??= scoreHandler?.judgeNoteHit(note, (lane.cpu ? 0 : note.msTime - lane.conductorInUse.songPosition)); + var rating:FunkinSprite = game.popRating(scoring.rating); + rating.velocity.y = -FlxG.random.int(140, 175); + rating.velocity.x = FlxG.random.int(0, 10); + rating.acceleration.y = 550; + applyExtraWindow(6); - if (applyRating) { - scoring ??= scoreHandler?.judgeNoteHit(note, (lane.cpu ? 0 : note.msTime - lane.conductorInUse.songPosition)); - var rating:FunkinSprite = game.popRating(scoring.rating); - rating.velocity.y = -FlxG.random.int(140, 175); - rating.velocity.x = FlxG.random.int(0, 10); - rating.acceleration.y = 550; - applyExtraWindow(6); + game.totalHits ++; + game.totalNotes ++; + game.health += note.healthGain * scoring.healthMod; + if (scoreHandler != null) { + scoreHandler.countRating(scoring.rating); + note.score = scoring; - game.totalHits ++; - game.totalNotes ++; - game.health += note.healthGain * scoring.healthMod; - if (scoreHandler != null) { - scoreHandler.countRating(scoring.rating); - note.score = scoring; - - scoreHandler.score += scoring.score; - scoreHandler.addMod(scoring.accuracyMod); - if (scoring.hitWindow != null && scoring.hitWindow.breaksCombo) { - scoreHandler.combo = 0; // maybe add the ghost note here? - } else { - scoreHandler.combo ++; - } + scoreHandler.score += scoring.score; + scoreHandler.addMod(scoring.accuracyMod); + if (scoring.hitWindow != null && scoring.hitWindow.breaksCombo) { + scoreHandler.combo = 0; // maybe add the ghost note here? + } else { + scoreHandler.combo ++; } - - game.updateScoreText(); } - if (doSplash && (scoring.hitWindow == null || scoring.hitWindow.splash)) - splash = lane.splash(); + game.updateScoreText(); } + if (doSplash && (scoring.hitWindow == null || scoring.hitWindow.splash)) + splash = lane.splash(); + if (playAnimation && targetCharacter != null) { var anim:String = 'sing${game.singAnimations[note.noteData]}'; var suffixAnim:String = anim + targetCharacter.animSuffix; if (targetCharacter.animationExists(suffixAnim)) { - if (!note.isHoldPiece) - targetCharacter.playAnimationSoft(suffixAnim, true); + targetCharacter.playAnimationSoft(suffixAnim, true); targetCharacter.timeAnimSteps(); } } - if (animateReceptor) lane.receptor.playAnimation('confirm', true); - if (!note.isHoldPiece) { - if (note.msLength > 0) { - lane.held = true; - for (child in note.children) { - child.canHit = true; - lane.updateNote(child); - } - } else if (!lane.cpu && animateReceptor) { - lane.receptor.grayBeat = note.beatTime + 1; - } + if (animateReceptor) + lane.receptor.playAnimation('confirm', true); + + if (note.isHoldNote) { + lane.held = true; + lane.heldNote = note; + } else if (animateReceptor && !lane.cpu) { + lane.receptor.grayBeat = note.beatTime + 1; } case HELD | RELEASED: var perfectRelease:Bool = true; final released:Bool = (type == RELEASED); final songPos:Float = lane.conductorInUse.songPosition; + perfect = (released && songPos >= note.endMs - Scoring.holdLeniencyMS); + if (applyRating) { perfectRelease = perfect; - } - /* ... ill do this later - if (applyRating) { - if (note.isHoldPiece && note.endMs > note.msTime) { - var prevHitTime:Float; - if (!note.held && note.hitTime <= note.msTime + Scoring.holdLeniencyMS) - prevHitTime = note.msTime; - else - prevHitTime = Math.max(note.hitTime, note.msTime); - - perfectRelease = (released && songPos >= note.endMs - Scoring.holdLeniencyMS); - var nextHitTime:Float; - if (perfectRelease) - nextHitTime = note.endMs; - else - nextHitTime = Math.min(songPos, note.endMs); - if (!note.held) trace('started hitting ${Math.round(note.msTime)} -> ${Math.round(prevHitTime)} / ${Math.round(note.endMs)}'); - if (released) trace('released ${Math.round(nextHitTime)} / ${Math.round(note.endMs)} (last : ${Math.round(prevHitTime)})'); - - final secondDiff:Float = Math.max(0, (nextHitTime - prevHitTime) * .001); - final scoreGain:Float = game.scoring.holdScorePerSecond * secondDiff; - scoring ??= {score: scoreGain, healthMod: secondDiff}; - note.hitTime = nextHitTime; + + var prevHitTime:Float; + if (!note.held && note.holdTime <= note.msTime + Scoring.holdLeniencyMS) { + prevHitTime = note.msTime; + } else { + prevHitTime = Math.max(note.holdTime, note.msTime); } - if (scoring != null) { - game.health += scoring.healthMod * note.healthGainPerSecond; - game.score += scoring.score; - game.updateRating(); + + var nextHitTime:Float; + if (perfectRelease) { + nextHitTime = note.endMs; + } else { + nextHitTime = Math.max(Math.min(songPos, note.endMs), prevHitTime); } - } else { - note.hitTime = songPos; - } */ - if (released && note.isHoldTail) { - if (lane.held && (lane.heldNote == null || lane.heldNote == note.parent)) { - lane.heldNote = null; + + final secondDiff:Float = Math.max(0, (nextHitTime - prevHitTime) * .001); + scoring ??= {score: 0, healthMod: secondDiff}; + + if (scoreHandler != null) { + scoring.score = scoreHandler.holdScorePerSecond * secondDiff; + scoreHandler.score += scoring.score; + } + + game.health += scoring.healthMod * note.healthGainPerSecond; + game.updateScoreText(); + + note.held = true; + note.holdTime = nextHitTime; + } + + if (playAnimation && targetCharacter != null) { + var anim:String = 'sing${game.singAnimations[note.noteData]}'; + var suffixAnim:String = anim + targetCharacter.animSuffix; + if (targetCharacter.animationExists(suffixAnim)) + targetCharacter.timeAnimSteps(); + } + + if (released && note.isHoldNote) { + note.consumed = true; + note.held = false; + + if (lane.heldNote == note) { lane.held = false; - if (!lane.cpu && animateReceptor) - lane.receptor.playAnimation('press', true); + lane.heldNote = null; + if (animateReceptor) { + if (lane.cpu) { + lane.receptor.playAnimation('static'); + } else { + lane.receptor.playAnimation('press'); + } + } } if (perfectRelease) { if (doSpark) @@ -166,7 +172,6 @@ import funkin.objects.play.Strumline; FunkinSound.playOnce(Paths.sound('gameplay/hitsounds/hitsoundFail'), .7); } } - note.held = true; case GHOST: if (animateReceptor) lane.receptor.playAnimation('press', true); @@ -234,14 +239,14 @@ import funkin.objects.play.Strumline; } } -enum NoteEventType { - SPAWNED; - DESPAWNED; +enum abstract NoteEventType(String) to String { + var SPAWNED = 'spawned'; + var DESPAWNED = 'despawned'; - HIT; - HELD; - RELEASED; + var HIT = 'hit'; + var HELD = 'held'; + var RELEASED = 'released'; - LOST; - GHOST; + var LOST = 'lost'; + var GHOST = 'ghost'; } \ No newline at end of file diff --git a/source/funkin/backend/play/Scoring.hx b/source/funkin/backend/play/Scoring.hx index 8e4e02c..11d948f 100644 --- a/source/funkin/backend/play/Scoring.hx +++ b/source/funkin/backend/play/Scoring.hx @@ -95,7 +95,7 @@ class Scoring { } } -@:structInit class Score { +@:structInit class Score { // TODO: move to typedef? public var hitWindow:HitWindow = null; public var accuracyMod:Float = 0; public var healthMod:Float = 1; diff --git a/source/funkin/backend/scripting/HScript.hx b/source/funkin/backend/scripting/HScript.hx index df19750..79a4280 100644 --- a/source/funkin/backend/scripting/HScript.hx +++ b/source/funkin/backend/scripting/HScript.hx @@ -61,9 +61,8 @@ class HScript extends Iris { 'CharacterGroup' => funkin.objects.CharacterGroup, 'RuntimeShader' => HScriptRuntimeShader, - 'Measure' => funkin.backend.rhythm.Metronome.Measure, - 'NoteEventType' => funkin.backend.play.NoteEvent.NoteEventType, - 'SpriteRenderType' => funkin.backend.FunkinSprite.SpriteRenderType, + 'NoteEventType' => {SPAWNED: 'spawned', DESPAWNED: 'despawned', HIT: 'hit', HELD: 'held', RELEASED: 'released', LOST: 'lost', GHOST: 'ghost'}, + // THIS WILL BE DEPRECATED 'STOP' => STOP, 'STOPALL' => STOPALL, diff --git a/source/funkin/objects/HealthIcon.hx b/source/funkin/objects/HealthIcon.hx index fbdbed9..837cdca 100644 --- a/source/funkin/objects/HealthIcon.hx +++ b/source/funkin/objects/HealthIcon.hx @@ -1,6 +1,10 @@ package funkin.objects; class HealthIcon extends FunkinSprite { + public var autoUpdateBop:Bool = true; + public var autoUpdateState:Bool = true; + public var autoUpdatePosition:Bool = true; + public var isPixel(default, set):Bool = false; public var state(default, set):IconState; public var icon(default, set):String; @@ -31,10 +35,10 @@ class HealthIcon extends FunkinSprite { } public override function update(elapsed:Float) { super.update(elapsed); - if (!canBop) - return; - var target:Float = Util.smoothLerp(scale.x, defaultSize / frameWidth, bopSpeed * elapsed * 15); - scale.set(target, target); + if (autoUpdateBop) { + var target:Float = Util.smoothLerp(scale.x, defaultSize / frameWidth, bopSpeed * elapsed * 15); + scale.set(target, target); + } } function set_state(newState:IconState):IconState { @@ -46,7 +50,8 @@ class HealthIcon extends FunkinSprite { case LOSING: 'losing'; }); if (currentAnimation != nextAnim) - playAnimation(currentAnimation); + playAnimation(nextAnim); + return state = newState; } function set_icon(newIcon:String) { @@ -56,12 +61,14 @@ class HealthIcon extends FunkinSprite { if (graphic == null) loadTexture('icons/icon-$newIcon'); var wFrameRatio:Int = Math.round(width / height); loadGraphic(graphic ?? Paths.image('icons/face'), true, Std.int(width / wFrameRatio), Std.int(height)); - animation.add('neutral', [0]); - animation.add('winning', [animation.numFrames > 2 ? 2 : 0]); - animation.add('losing', [1]); + + addAnimation('winning', [animation.numFrames > 2 ? 2 : 0]); + addAnimation('neutral', [0]); + addAnimation('losing', [1]); playAnimation('neutral'); snapToTargetScale(); origin.set(frameWidth * .5, frameHeight * .5); + return icon = newIcon; } function set_isPixel(butIsIt:Bool) { diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 0148c05..498f24e 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -1,6 +1,7 @@ package funkin.objects.play; import funkin.shaders.RGBSwap; +import funkin.objects.play.Note; import funkin.backend.play.Scoring; import funkin.backend.play.NoteEvent; import funkin.backend.rhythm.Conductor; @@ -39,7 +40,7 @@ class Lane extends FunkinSpriteGroup { public var notes:FunkinTypedSpriteGroup; public var noteSparks:FunkinTypedSpriteGroup; public var noteSplashes:FunkinTypedSpriteGroup; - public var queue:Array = []; + public var queue:Array = []; public var selfDraw:Bool = false; public var topMembers:Array = []; @@ -63,7 +64,7 @@ class Lane extends FunkinSpriteGroup { } public function new(x:Float, y:Float, data:Int) { super(x, y); - + inputFilter = (note:Note) -> { var time:Float = note.msTime - conductorInUse.songPosition; return (time <= note.hitWindow + extraWindow) && (time >= -note.hitWindow); @@ -72,7 +73,7 @@ class Lane extends FunkinSpriteGroup { var splashColors:Array = NoteSplash.makeSplashColors(Note.directionColors[data][0]); rgbShader = new RGBSwap(Note.directionColors[data][0], FlxColor.WHITE, Note.directionColors[data][1]); splashRGB = new RGBSwap(splashColors[0], FlxColor.WHITE, splashColors[1]); - + noteCover = new NoteCover(data); receptor = new Receptor(0, 0, data); notes = new FunkinTypedSpriteGroup(); @@ -98,14 +99,14 @@ class Lane extends FunkinSpriteGroup { var early:Bool; var limit:Int = 50; while (i < queue.length) { - var note:Note = queue[i]; + var note:ChartNote = queue[i]; if (note == null) { Log.warning('note was null in lane $noteData!!'); queue.remove(note); continue; } early = (note.msTime - conductorInUse.songPosition > spawnRadius); - if (!early && (oneWay || (note.endMs - conductorInUse.songPosition) >= -spawnRadius)) { + if (!early && (oneWay || (note.msTime + note.msLength - conductorInUse.songPosition) >= -spawnRadius)) { queue.remove(note); insertNote(note); limit --; @@ -126,7 +127,7 @@ class Lane extends FunkinSpriteGroup { while (i > 0) { i --; var note:Note = notes.members[i]; - if (note == null) continue; + if (note == null || !note.alive) continue; updateNote(note); } } @@ -147,13 +148,15 @@ class Lane extends FunkinSpriteGroup { FlxCamera._defaultCameras = oldDefaultCameras; } } - public function forEachNote(func:Note -> Void, includeQueued:Bool = false) { + public function forEachNote(func:ChartNote -> Void, includeQueued:Bool = false) { if (includeQueued) { for (note in queue) func(note); } - for (note in notes) - func(note); + for (note in notes) { + if (note.alive && note.chartNote != null) + func(note.chartNote); + } } public function fireInput(key:FlxKey, pressed:Bool):Bool { @@ -169,9 +172,9 @@ class Lane extends FunkinSpriteGroup { held = false; receptor.playAnimation('static', true); if (heldNote != null) { - killSustainsOf(heldNote); - heldNote.consumed = true; - heldNote = null; + var note:Note = heldNote; + _noteEvent(basicEvent(RELEASED, note)); + killNote(note); } } return true; @@ -187,18 +190,26 @@ class Lane extends FunkinSpriteGroup { public function getHighestNote(?filter:Note -> Bool) { var highNote:Null = null; for (note in notes) { + if (!note.alive) continue; + var valid:Bool = (filter == null ? true : filter(note)); - var canHit:Bool = (note.canHit && !note.isHoldPiece && valid); + var canHit:Bool = (note.canHit && !note.goodHit && valid); if (!canHit) continue; - if (highNote == null || (note.hitPriority >= highNote.hitPriority || (note.hitPriority == highNote.hitPriority && note.msTime < highNote.msTime))) + if (highNote == null || (note.hitPriority > highNote.hitPriority || (note.hitPriority == highNote.hitPriority && note.msTime < highNote.msTime))) highNote = note; } return highNote; } public function getAllNotes() { - var notes:Array = []; - for (note in this.notes) notes.push(note); - for (note in this.queue) notes.push(note); + var notes:Array = []; + + for (note in this.queue) + notes.push(note); + for (note in this.notes) { + if (note.alive && note.chartNote != null) + notes.push(note.chartNote); + } + return notes; } public function resetLane() { @@ -230,7 +241,7 @@ class Lane extends FunkinSpriteGroup { return spark; } - public function queueNote(note:Note, sorted:Bool = false):Note { + public function queueNote(note:ChartNote, sorted:Bool = false):ChartNote { if (!queue.contains(note)) { if (sorted) { for (i => otherNote in queue) { @@ -240,12 +251,11 @@ class Lane extends FunkinSpriteGroup { } } } - note.lane = this; queue.push(note); } return note; } - public function dequeueNote(note:Note) { + public function dequeueNote(note:ChartNote) { queue.remove(note); } public function clearNotes() { @@ -256,57 +266,58 @@ class Lane extends FunkinSpriteGroup { } public function updateNote(note:Note) { note.followLane(this, scrollSpeed); - if (note.ignore) return; - if ((cpu || (held && note.isHoldPiece)) && conductorInUse.songPosition >= note.msTime && !note.lost && note.canHit) { + + if (note.ignore) + return; + + var killingNote:Bool = false; + var songPos:Float = conductorInUse.songPosition; + if ((cpu || (held && note.goodHit)) && songPos >= note.msTime && !note.lost && note.canHit) { if (!note.goodHit) hitNote(note, false); - var canKillNote:Bool = (conductorInUse.songPosition >= note.endMs); - if (note.isHoldPiece) { - var holdEvent:NoteEvent = basicEvent(canKillNote ? RELEASED : HELD, note); - _noteEvent(holdEvent); - } - if (canKillNote) { + + if (songPos >= note.endMs) + note.consumed = killingNote = true; + + _noteEvent(basicEvent(HELD, note)); + + if (killingNote) { + _noteEvent(basicEvent(RELEASED, note)); killNote(note); return; } } + var canDespawn:Bool = !note.preventDespawn; - if (note.lost || note.goodHit || note.isHoldPiece) { - if (canDespawn && (note.endMs - conductorInUse.songPosition) < -spawnRadius) { - if (!oneWay) // bye bye note - queue.push(note); - killNote(note); - } + if (note.lost || note.goodHit) { + if (canDespawn && (note.endMs - conductorInUse.songPosition) < -spawnRadius) + killNote(note, !oneWay); } else { if (conductorInUse.songPosition - hitWindow > note.msTime) { note.lost = true; _noteEvent(basicEvent(LOST, note)); } } - if (!oneWay && (note.msTime - conductorInUse.songPosition) > spawnRadius) { - queue.push(note); - killNote(note); - } + + if (!oneWay && (note.msTime - conductorInUse.songPosition) > spawnRadius) + killNote(note, true); } - public function insertNote(note:Note, pos:Int = -1) { - if (notes.members.contains(note)) return; - if (note.parent != null && note.parent.consumed) return; + public function generateNote(songNote:ChartNote):Note { + return new Note(songNote, conductorInUse); + } + public function insertNote(songNote:ChartNote, pos:Int = 0) { + var note:Note = notes.recycle(Note, () -> generateNote(songNote)); - note.shader ??= rgbShader.shader; - note.hitWindow = hitWindow; note.lane = this; - + note.chartNote = songNote; + note.hitWindow = hitWindow; + + note.reload(); + note.shader = rgbShader.shader; note.scale.copyFrom(receptor.scale); note.updateHitbox(); - note.revive(); updateNote(note); - if (pos < 0) { - pos = 0; - for (note in notes) { - if (note.isHoldPiece) pos ++; - else break; - } - } + notes.insert(pos, note); _noteEvent(basicEvent(SPAWNED, note)); } @@ -316,24 +327,16 @@ class Lane extends FunkinSpriteGroup { var event:NoteEvent = basicEvent(HIT, note); _noteEvent(event); - if (kill && !note.ignore && !event.cancelled) + if (kill && !note.isHoldNote && !note.ignore && !event.cancelled) killNote(note); } - public function killNote(note:Note) { + public function killNote(note:Note, requeue:Bool = false) { + if (requeue) + queue.push(note.chartNote); + note.kill(); - notes.remove(note, true); _noteEvent(basicEvent(DESPAWNED, note)); } - public function killSustainsOf(note:Note) { - for (child in note.children) { - if (!child.alive) - continue; - child.lost = true; - child.canHit = false; - _noteEvent(basicEvent(RELEASED, child)); - killNote(child); - } - } public override function get_width() return receptor?.width ?? 0; diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 03dfd41..612dde9 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -2,12 +2,21 @@ package funkin.objects.play; import funkin.objects.play.Lane; import funkin.backend.play.Scoring; +import funkin.backend.rhythm.Event; import funkin.objects.CharacterGroup; import flixel.graphics.frames.FlxFrame; import flixel.addons.display.FlxTiledSprite; import flixel.graphics.frames.FlxFramesCollection; +@:structInit class ChartNote implements ITimeSortable { + public var laneIndex:Int; + public var kind:String = ''; + public var msTime:Float = 0; + public var msLength:Float = 0; + public var player:Bool = true; +} + class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affect society public static var directionNames:Array = ['left', 'down', 'up', 'right']; public static var directionColors:Array> = [ @@ -17,24 +26,26 @@ class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affec [FlxColor.fromRGB(249, 57, 63), FlxColor.fromRGB(101, 16, 56)], ]; public var conductorInUse:Conductor; // mostly charting stuff - - public var children:Array = []; - public var parent:Note; - public var tail:Note; - public var lane:Lane; + public var tail:NoteTail; + + public var lane:Lane; public var score:Score; + public var held:Bool = false; + public var hitTime:Float = -1; + public var holdTime:Float = -1; + public var chartNote(default, set):ChartNote; + + public var preventDespawn:Bool = false; public var consumed:Bool = false; public var goodHit:Bool = false; public var lost:Bool = false; + public var canHit:Bool = true; + public var noteOffset:FlxPoint; public var clipDistance:Float = 0; public var scrollDistance:Float = 0; - public var preventDespawn:Bool = false; public var followAngle:Bool = true; - public var canHit:Bool = true; - public var hitTime:Float = 0; - public var held:Bool = false; public var healthLoss:Float = 6.0 / 100; public var healthGain:Float = 1.5 / 100; @@ -56,70 +67,77 @@ class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affec public var beatTime(default, set):Float = 0; public var msLength(default, set):Float = 0; public var beatLength(default, set):Float = 0; - - public var isHoldPiece:Bool = false; - public var isHoldTail:Bool = false; + public var isHoldNote(default, null):Bool = false; public override function destroy() { - for (child in children) { - lane?.dequeueNote(child); - lane?.killNote(child); - child.destroy(); - } - lane?.dequeueNote(this); - lane?.killNote(this); + if (tail != null) + tail.destroy(); super.destroy(); + tail = null; } - public override function revive() { - hitTime = 0; - held = false; - lost = false; - goodHit = false; - consumed = false; - clipDistance = 0; - if (!isHoldPiece) { - canHit = true; - for (child in children) - child.canHit = false; - } - super.revive(); + public override function draw() { + if (isHoldNote && tail != null) + tail.draw(); + + if (!goodHit) + super.draw(); } - public function new(player:Bool, msTime:Float, noteData:Int, msLength:Float = 0, type:String = '', isHoldPiece:Bool = false, ?conductor:Conductor) { + public function new(songNote:ChartNote, ?conductor:Conductor) { super(); this.conductorInUse = conductor ?? FunkinState.getCurrentConductor(); - - this.player = player; - this.msTime = msTime; - this.noteKind = type; - this.noteData = noteData; - this.msLength = Math.max(msLength, 0); - this.isHoldPiece = isHoldPiece; - this.isHoldTail = (isHoldPiece && msLength <= 0); - noteOffset = FlxPoint.get(); + this.chartNote = songNote; + reload(); + } + public function set_chartNote(songNote:ChartNote):ChartNote { + if (songNote != null) { + this.player = songNote.player; + this.msTime = songNote.msTime; + this.noteKind = songNote.kind; + this.msLength = songNote.msLength; + this.noteData = songNote.laneIndex; + } + this.msLength = Math.max(this.msLength, 0); - if (isHoldPiece) this.multAlpha = .6; + return this.chartNote = songNote; + } + + public function reload() { + lost = goodHit = held = consumed = false; + holdTime = hitTime = -1; + clipDistance = 0; + if (noteOffset == null) { + noteOffset = FlxPoint.get(); + } else { + noteOffset.set(); + } + if (tail != null) + tail.clipRect = null; loadAtlas('notes'); reloadAnimations(); } - + public function reloadTail() { + isHoldNote = (msLength > 0); + if (tail == null && isHoldNote) { + tail = new NoteTail(this); + } + } public function reloadAnimations() { - animation.destroyAnimations(); var dirName:String = directionNames[noteData]; - addAnimation('hit', '$dirName note', 24, false); - playAnimation('hit', true); - if (isHoldPiece) { - addAnimation('tail', '$dirName hold tail', 24, false); - addAnimation('hold', '$dirName hold piece', 24, false); + addAnimation('hit-$noteData', '$dirName note', 24, false); + playAnimation('hit-$noteData', true); + /*if (isHoldPiece) { + addAnimation('tail-$noteData', '$dirName hold tail', 24, false); + addAnimation('hold-$noteData', '$dirName hold piece', 24, false); playAnimation(this.isHoldTail ? 'tail' : 'hold', true); - } + }*/ updateHitbox(); } - public function toChartNote():funkin.backend.play.Chart.ChartNote { - return {laneIndex: noteData, msTime: msTime, kind: noteKind, msLength: msLength, player: player}; + public function toChartNote():ChartNote { + return chartNote ?? {laneIndex: noteData, msTime: msTime, kind: noteKind, msLength: msLength, player: player}; } public function set_noteKind(newKind:String) { @@ -127,28 +145,32 @@ class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affec } public function set_msTime(newTime:Float) { if (msTime == newTime) return newTime; - @:bypassAccessor beatTime = conductorInUse.metronome.convertMeasure(newTime, MS, BEAT); + @:bypassAccessor beatTime = conductorInUse.convertMeasure(newTime, MS, BEAT); return msTime = newTime; } public function set_beatTime(newTime:Float) { if (beatTime == newTime) return newTime; - @:bypassAccessor msTime = conductorInUse.metronome.convertMeasure(newTime, BEAT, MS); + @:bypassAccessor msTime = conductorInUse.convertMeasure(newTime, BEAT, MS); return beatTime = newTime; } public function set_msLength(newLength:Float) { if (msLength == newLength) return newLength; - @:bypassAccessor beatLength = conductorInUse.metronome.convertMeasure(msTime + newLength, MS, BEAT) - beatTime; - return msLength = newLength; + msLength = newLength; + @:bypassAccessor beatLength = conductorInUse.convertMeasure(msTime + newLength, MS, BEAT) - beatTime; + reloadTail(); + return newLength; } public function set_beatLength(newLength:Float) { if (beatLength == newLength) return newLength; - @:bypassAccessor msLength = conductorInUse.metronome.convertMeasure(beatTime + newLength, BEAT, MS) - msTime; - return beatLength = newLength; + beatLength = newLength; + @:bypassAccessor msLength = conductorInUse.convertMeasure(beatTime + newLength, BEAT, MS) - msTime; + reloadTail(); + return newLength; } public function get_endMs() - return msTime + (isHoldPiece ? msLength : 0); + return msTime + msLength; public function get_endBeat() - return beatTime + (isHoldPiece ? beatLength : 0); + return beatTime + beatLength; public static function distanceToMS(distance:Float, scrollSpeed:Float) return distance / (.45 * scrollSpeed); @@ -163,21 +185,6 @@ class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affec var holdOffsetY:Float = 0; scrollDistance = Note.msToDistance(msTime - conductorInUse.songPosition, speed); - if (isHoldPiece) { - if (isHoldTail) { - scale.y = scale.x; updateHitbox(); - scrollDistance -= height; - } else { - scrollDistance -= scale.y; - } - setOffset(); - origin.set(frameWidth * .5); - holdOffsetX = (receptor.width - frameWidth) * .5; - holdOffsetY = receptor.height * .5; - angle = dir - 90; - } else if (followAngle) { - angle = lane.receptor.angle; - } var xP:Float = 0; var yP:Float = scrollDistance; @@ -185,31 +192,53 @@ class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affec x = receptor.x + noteOffset.x + Math.sin(rad) * xP + Math.cos(rad) * yP + holdOffsetX; y = receptor.y + noteOffset.y + Math.sin(rad) * yP + Math.cos(rad) * xP + holdOffsetY; alpha = lane.alpha * receptor.alpha * multAlpha; - - if (isHoldPiece) { //handle in DISTANCE to support scroll direction - if (canHit && lane.held) - clipDistance = Math.max(0, -scrollDistance); - - var cropTop:Float = 0; - var cropBottom:Float = frameHeight; - var cropY:Float = clipDistance / scale.y; - var cropHeight:Float = frameHeight; - if (!isHoldTail) { - final holdDist:Float = Note.msToDistance(msLength, scrollSpeed); - cropTop ++; - cropHeight --; - scale.y = holdDist / (cropHeight - cropTop); - tail = parent?.tail; - if (tail != null) - cropBottom += Math.min(0, (Note.msToDistance(tail.msTime - msTime, scrollSpeed) - tail.height) / scale.y - (cropHeight - cropTop)); - // if anyone can help me figure out how to make it clip exactly to the tail id appreciate it + + if (followAngle) + angle = lane.receptor.angle; + + if (isHoldNote && tail != null) { + var tailY:Float = height * .5; + tail.setGraphicSize(35, Note.msToDistance(msLength, speed) - tailY); + tail.angle = dir - 90; + tail.updateHitbox(); + tail.setPosition(x + (width - tail.width) * .5, y + tailY); + + if (goodHit && scrollDistance < 0) + clipDistance = -scrollDistance; + + if (clipDistance > 0) { + if (tail.clipRect == null) + tail.clipRect = new FlxRect(0, 0, tail.frameWidth); + + var clipDist:Float = (clipDistance / tail.height) * tail.frameHeight; + tail.clipRect.height = tail.frameHeight - clipDist; + tail.clipRect.y = clipDist; + + tail.clipRect = tail.clipRect; } - clipRect ??= new FlxRect(); - clipto(Math.max(cropTop, cropY), Math.min(cropHeight, cropBottom)); - - clipRect = clipRect; //refresh clip rect } } inline function clipto(ya:Float = 0, yb:Float = 0) clipRect.set(0, ya, frameWidth, yb - ya); +} + +class NoteTail extends FunkinSprite { + public var parent:Note; + + public var multAlpha:Float = .6; + + public function new(parent:Note) { + super(); + + makeGraphic(1, FlxG.height, FlxColor.WHITE); + origin.set(frameWidth * .5, 0); + this.parent = parent; + } + public override function draw() { + alpha = multAlpha; + if (parent != null) + alpha *= parent.alpha; + + super.draw(); + } } \ No newline at end of file diff --git a/source/funkin/objects/play/Strumline.hx b/source/funkin/objects/play/Strumline.hx index 14a1a03..0259cf5 100644 --- a/source/funkin/objects/play/Strumline.hx +++ b/source/funkin/objects/play/Strumline.hx @@ -1,5 +1,6 @@ package funkin.objects.play; +import funkin.objects.play.Note; import funkin.backend.play.Scoring; import funkin.backend.play.NoteEvent; @@ -149,12 +150,12 @@ class Strumline extends FunkinSpriteGroup { for (lane in lanes) func(lane); } - public function forEachNote(func:Note -> Void, includeQueued:Bool = false) { + public function forEachNote(func:ChartNote -> Void, includeQueued:Bool = false) { for (lane in lanes) lane.forEachNote(func, includeQueued); } public function getAllNotes() { - var notes:Array = []; + var notes:Array = []; for (lane in lanes) { for (note in lane.getAllNotes()) notes.push(note); @@ -210,12 +211,15 @@ class Strumline extends FunkinSpriteGroup { } } - public function queueNote(note:Note, ?laneIndex:Int) { - laneIndex ??= note.noteData; + public function queueNote(note:ChartNote, ?laneIndex:Int):ChartNote { + laneIndex ??= note.laneIndex; laneIndex = FlxMath.wrap(laneIndex, 0, lanes.length - 1); var lane:Lane = getLane(laneIndex); - if (lane != null) + if (lane != null) { lane.queueNote(note); + return note; + } + return null; } public function clearAllNotes() { for (lane in lanes) diff --git a/source/funkin/states/CharterState.hx b/source/funkin/states/CharterState.hx index 584d7d5..f9883d5 100644 --- a/source/funkin/states/CharterState.hx +++ b/source/funkin/states/CharterState.hx @@ -18,6 +18,9 @@ import flixel.input.keyboard.FlxKey; import flixel.addons.display.FlxBackdrop; class CharterState extends FunkinState { + // TODO: REWRITE THIS STATE TO ACCOMODATE TO THE NEW SYSTEM +} + /* public static var genericRGB:RGBSwap; public static var instance:CharterState; @@ -669,8 +672,6 @@ class CharterState extends FunkinState { scrollSpeed = newSpeed; for (strumline in strumlines) { strumline.scrollSpeed = visualScrollSpeed; - /*for (lane in strumline.lanes) - lane.spawnRadius *= 1.5;*/ } return newSpeed; } @@ -1589,4 +1590,4 @@ class CharterNote extends Note { point.scale(camera.zoom); return point; } -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 6008e7e..e43c8cb 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -10,6 +10,7 @@ import funkin.backend.play.Scoring; import funkin.backend.play.Chart; import funkin.objects.CharacterGroup; import funkin.objects.Character; +import funkin.objects.play.Note; import funkin.objects.play.*; import funkin.objects.*; @@ -53,7 +54,7 @@ class PlayState extends FunkinState { public var hudZoomIntensity:Float = 2; public static var chart:Chart = null; - public var notes:Array = []; + public var notes:Array = []; public var songName:String; public var simple:Bool; @@ -109,13 +110,13 @@ class PlayState extends FunkinState { music = new FunkinSoundGroup(); songName = chart.name; - var genNotes:Array = chart.generateNotes(); + // var genNotes:Array = chart.generateNotes(); if (!simple) { var loadedEvents:Array = []; var noteKinds:Array = []; - for (note in genNotes) { - var noteKind:String = note.noteKind; + for (note in chart.notes) { + var noteKind:String = note.kind; if (noteKind.trim() != '' && !noteKinds.contains(noteKind)) { hscripts.loadFromPaths('scripts/notekinds/$noteKind.hx'); noteKinds.push(noteKind); @@ -229,7 +230,7 @@ class PlayState extends FunkinState { playerStrumline.screenCenter(X); opponentStrumline.fitToSize(playerStrumline.leftBound - 50 - opponentStrumline.leftBound, 0, Y); } - for (note in genNotes) { + for (note in chart.notes) { var strumline:Strumline = (note.player ? playerStrumline : opponentStrumline); strumline.queueNote(note); notes.push(note); @@ -310,6 +311,7 @@ class PlayState extends FunkinState { Paths.image(img); } conductorInUse.beat = (playCountdown ? -5 : -1); + update(0); } inline function flipMembers(grp:FlxTypedSpriteGroup) { @@ -367,7 +369,7 @@ class PlayState extends FunkinState { FlxG.switchState(FreeplayState.new); return; } else if (FlxG.keys.justPressed.SEVEN) { - FlxG.switchState(() -> new CharterState(chart)); + // FlxG.switchState(() -> new CharterState(chart)); return; } @@ -441,10 +443,14 @@ class PlayState extends FunkinState { return; } - iconP1.offset.x = 0; - iconP2.offset.x = iconP2.frameWidth; - iconP2.setPosition(healthBar.barCenter.x - 60 + iconP2.width * .5, healthBar.barCenter.y - iconP2.height * .5); - iconP1.setPosition(healthBar.barCenter.x + 60 - iconP1.width * .5, healthBar.barCenter.y - iconP1.height * .5); + if (iconP1.autoUpdatePosition) { + iconP1.offset.x = 0; + iconP1.setPosition(healthBar.barCenter.x + 60 - iconP1.width * .5, healthBar.barCenter.y - iconP1.height * .5); + } + if (iconP2.autoUpdatePosition) { + iconP2.offset.x = iconP2.frameWidth; + iconP2.setPosition(healthBar.barCenter.x - 60 + iconP2.width * .5, healthBar.barCenter.y - iconP2.height * .5); + } super.update(elapsed); syncMusic(); @@ -794,16 +800,17 @@ class PlayState extends FunkinState { return maxHealth = newHealth; } public dynamic function set_health(newHealth:Float) { - newHealth = FlxMath.bound(newHealth, 0, maxHealth); + newHealth = Util.clamp(newHealth, 0, maxHealth); switch (newHealth) { case (_ <= .15) => true: - iconP1.state = LOSING; - iconP2.state = WINNING; + if (iconP1.autoUpdateState) iconP1.state = LOSING; + if (iconP2.autoUpdateState) iconP2.state = WINNING; case (_ >= maxHealth - .15) => true: - iconP1.state = WINNING; - iconP2.state = LOSING; + if (iconP1.autoUpdateState) iconP1.state = WINNING; + if (iconP2.autoUpdateState) iconP2.state = LOSING; default: - iconP1.state = iconP2.state = NEUTRAL; + if (iconP1.autoUpdateState) iconP1.state = NEUTRAL; + if (iconP2.autoUpdateState) iconP2.state = NEUTRAL; } if (newHealth <= 0 && !godmode && !dead) die(false); From 8e97db1375b9eee81c2e51ac89a57a2ab85273dc Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Tue, 4 Feb 2025 08:29:16 -0600 Subject: [PATCH 02/73] note extra data, fix receptors on release --- source/funkin/backend/FunkinSprite.hx | 16 +++++++++++++--- source/funkin/backend/play/Chart.hx | 1 + source/funkin/backend/play/NoteEvent.hx | 9 ++++++--- source/funkin/objects/play/Lane.hx | 8 +++++--- source/funkin/objects/play/Note.hx | 20 +++++++++++++++++++- 5 files changed, 44 insertions(+), 10 deletions(-) diff --git a/source/funkin/backend/FunkinSprite.hx b/source/funkin/backend/FunkinSprite.hx index 34b105b..4843b7d 100644 --- a/source/funkin/backend/FunkinSprite.hx +++ b/source/funkin/backend/FunkinSprite.hx @@ -14,9 +14,9 @@ class FunkinSprite extends FlxSprite implements IFunkinSpriteAnim { public var onAnimationFrame:FlxTypedSignal Void> = new FlxTypedSignal(); public var currentAnimation(get, never):Null; - public var extraData:Map = new Map(); - public var offsets:Map = new Map(); - public var animationList:Map = []; + public var animationList:Map = new Map(); + public var extraData:Map = new Map(); + public var offsets:Map = new Map(); public var smooth(default, set):Bool = true; public var spriteOffset:FlxPoint; public var animOffset:FlxPoint; @@ -34,6 +34,16 @@ class FunkinSprite extends FlxSprite implements IFunkinSpriteAnim { var _loadedAtlases:Array = []; var _transPoint:FlxPoint; + public function setVar(k:String, v:Dynamic):Dynamic { + if (extraData == null) extraData = new Map(); + extraData.set(k, v); + return v; + } + public function getVar(k:String):Dynamic { + if (extraData == null) return null; + return extraData.get(k); + } + public function new(x:Float = 0, y:Float = 0, isSmooth:Bool = true) { super(x, y); _transPoint = new FlxPoint(); diff --git a/source/funkin/backend/play/Chart.hx b/source/funkin/backend/play/Chart.hx index 7b1ad03..83d3d25 100644 --- a/source/funkin/backend/play/Chart.hx +++ b/source/funkin/backend/play/Chart.hx @@ -584,6 +584,7 @@ class Chart { inst.play(); inst.stop(); inst.volume = 1; + inst.looped = false; Log.info('instrumental loaded!! (${Math.round((Sys.time() - time) * 1000) / 1000}s)'); return true; } diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index 5488d49..015b3b3 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -136,7 +136,8 @@ import funkin.objects.play.Strumline; game.health += scoring.healthMod * note.healthGainPerSecond; game.updateScoreText(); - note.held = true; + if (!released) + note.held = true; note.holdTime = nextHitTime; } @@ -149,19 +150,19 @@ import funkin.objects.play.Strumline; if (released && note.isHoldNote) { note.consumed = true; - note.held = false; if (lane.heldNote == note) { lane.held = false; lane.heldNote = null; if (animateReceptor) { - if (lane.cpu) { + if (lane.cpu || !note.held) { lane.receptor.playAnimation('static'); } else { lane.receptor.playAnimation('press'); } } } + if (perfectRelease) { if (doSpark) spark = lane.spark(); @@ -171,6 +172,8 @@ import funkin.objects.play.Strumline; if (playSound) FunkinSound.playOnce(Paths.sound('gameplay/hitsounds/hitsoundFail'), .7); } + + note.held = false; } case GHOST: if (animateReceptor) diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 498f24e..65ed3c1 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -170,11 +170,13 @@ class Lane extends FunkinSpriteGroup { } } else { held = false; - receptor.playAnimation('static', true); - if (heldNote != null) { - var note:Note = heldNote; + var note:Note = heldNote; + if (note != null) { + note.held = false; _noteEvent(basicEvent(RELEASED, note)); killNote(note); + } else { + receptor.playAnimation('static'); } } return true; diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 612dde9..e1eb8c8 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -15,6 +15,17 @@ import flixel.graphics.frames.FlxFramesCollection; public var msTime:Float = 0; public var msLength:Float = 0; public var player:Bool = true; + public var extraData:Map = null; + + public function setVar(k:String, v:Dynamic):Dynamic { + if (extraData == null) extraData = new Map(); + extraData.set(k, v); + return v; + } + public function getVar(k:String):Dynamic { + if (extraData == null) return null; + return extraData.get(k); + } } class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affect society @@ -98,6 +109,12 @@ class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affec this.noteKind = songNote.kind; this.msLength = songNote.msLength; this.noteData = songNote.laneIndex; + + this.extraData.clear(); + if (songNote.extraData != null) { + for (k => v in songNote.extraData) + setVar(k, v); + } } this.msLength = Math.max(this.msLength, 0); @@ -105,7 +122,8 @@ class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affec } public function reload() { - lost = goodHit = held = consumed = false; + lost = goodHit = held = consumed = preventDespawn = ignore = false; + followAngle = canHit = true; holdTime = hitTime = -1; clipDistance = 0; if (noteOffset == null) { From 303fa1b9749926e66c7c4ee8284ef4151571b99d Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Mon, 24 Feb 2025 00:08:49 -0600 Subject: [PATCH 03/73] internal changes --- source/funkin/backend/play/IPlayEvent.hx | 8 + source/funkin/backend/play/NoteEvent.hx | 68 ++-- source/funkin/backend/play/SongEvent.hx | 270 ++++++++++++++ source/funkin/objects/play/Lane.hx | 68 ++-- source/funkin/objects/play/Note.hx | 225 +++++++++--- source/funkin/objects/play/Strumline.hx | 18 +- source/funkin/states/GameOverSubState.hx | 83 +++-- source/funkin/states/PlayState.hx | 445 +++++++++-------------- 8 files changed, 776 insertions(+), 409 deletions(-) create mode 100644 source/funkin/backend/play/IPlayEvent.hx create mode 100644 source/funkin/backend/play/SongEvent.hx diff --git a/source/funkin/backend/play/IPlayEvent.hx b/source/funkin/backend/play/IPlayEvent.hx new file mode 100644 index 0000000..d04c595 --- /dev/null +++ b/source/funkin/backend/play/IPlayEvent.hx @@ -0,0 +1,8 @@ +package funkin.backend.play; + +interface IPlayEvent { + public var cancelled:Bool; + + public function cancel():Void; + public function dispatch():Void; +} \ No newline at end of file diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index 015b3b3..7b021e4 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -7,13 +7,14 @@ import funkin.objects.play.Lane; import funkin.backend.play.Scoring; import funkin.objects.play.Strumline; -@:structInit class NoteEvent { +@:structInit class NoteEvent implements IPlayEvent { + public var type(default, null):NoteEventType; + public var cancelled:Bool = false; + public var note:Note; public var lane:Lane; public var receptor:Receptor; - public var type:NoteEventType; public var strumline:Strumline; - public var cancelled:Bool = false; public var animSuffix:String = ''; public var spark:NoteSpark = null; @@ -26,13 +27,15 @@ import funkin.objects.play.Strumline; public var doSpark:Bool = false; // many vars... public var doSplash:Bool = false; public var playSound:Bool = false; + public var popRating:Bool = true; public var applyRating:Bool = false; public var playAnimation:Bool = true; public var animateReceptor:Bool = true; - + public function cancel() cancelled = true; public function dispatch() { // hahaaa if (cancelled) return; + var game:PlayState; if (Std.isOfType(FlxG.state, PlayState)) { game = cast FlxG.state; @@ -41,6 +44,7 @@ import funkin.objects.play.Strumline; throw(new haxe.Exception('note event can\'t be dispatched outside of PlayState!!')); return; } + switch (type) { case HIT: if (game.genericVocals != null) @@ -55,10 +59,12 @@ import funkin.objects.play.Strumline; if (applyRating) { scoring ??= scoreHandler?.judgeNoteHit(note, (lane.cpu ? 0 : note.msTime - lane.conductorInUse.songPosition)); - var rating:FunkinSprite = game.popRating(scoring.rating); - rating.velocity.y = -FlxG.random.int(140, 175); - rating.velocity.x = FlxG.random.int(0, 10); - rating.acceleration.y = 550; + if (popRating) { + var rating:FunkinSprite = game.popRating(scoring.rating); + rating.velocity.y = -FlxG.random.int(140, 175); + rating.velocity.x = FlxG.random.int(0, 10); + rating.acceleration.y = 550; + } applyExtraWindow(6); game.totalHits ++; @@ -85,11 +91,9 @@ import funkin.objects.play.Strumline; if (playAnimation && targetCharacter != null) { var anim:String = 'sing${game.singAnimations[note.noteData]}'; - var suffixAnim:String = anim + targetCharacter.animSuffix; - if (targetCharacter.animationExists(suffixAnim)) { - targetCharacter.playAnimationSoft(suffixAnim, true); - targetCharacter.timeAnimSteps(); - } + var suffixAnim:String = anim + animSuffix; + if (targetCharacter.animationExists(suffixAnim + targetCharacter.animSuffix)) + targetCharacter.playAnimationSteps(suffixAnim, true); } if (animateReceptor) @@ -101,18 +105,32 @@ import funkin.objects.play.Strumline; } else if (animateReceptor && !lane.cpu) { lane.receptor.grayBeat = note.beatTime + 1; } + case PRESSED: + if (note != null) { + lane.hitNote(note); + } else { + lane.ghostTapped(); + } case HELD | RELEASED: - var perfectRelease:Bool = true; final released:Bool = (type == RELEASED); + + if (released && note == null) { + lane.held = false; + if (animateReceptor) + receptor.playAnimation('static'); + return; + } + + var perfectRelease:Bool = true; final songPos:Float = lane.conductorInUse.songPosition; - perfect = (released && songPos >= note.endMs - Scoring.holdLeniencyMS); + perfect = (released && (lane.cpu || songPos >= note.endMs - Scoring.holdLeniencyMS)); if (applyRating) { perfectRelease = perfect; var prevHitTime:Float; - if (!note.held && note.holdTime <= note.msTime + Scoring.holdLeniencyMS) { + if (!note.held && (lane.cpu || note.holdTime <= note.msTime + Scoring.holdLeniencyMS)) { prevHitTime = note.msTime; } else { prevHitTime = Math.max(note.holdTime, note.msTime); @@ -143,8 +161,8 @@ import funkin.objects.play.Strumline; if (playAnimation && targetCharacter != null) { var anim:String = 'sing${game.singAnimations[note.noteData]}'; - var suffixAnim:String = anim + targetCharacter.animSuffix; - if (targetCharacter.animationExists(suffixAnim)) + var suffixAnim:String = anim + animSuffix + targetCharacter.animSuffix; + if ((!targetCharacter.specialAnim || targetCharacter.currentAnimation == suffixAnim) && targetCharacter.animationExists(suffixAnim)) targetCharacter.timeAnimSteps(); } @@ -174,6 +192,7 @@ import funkin.objects.play.Strumline; } note.held = false; + lane.killNote(note); } case GHOST: if (animateReceptor) @@ -186,7 +205,7 @@ import funkin.objects.play.Strumline; targetCharacter.specialAnim = false; targetCharacter.playAnimationSteps('sing${game.singAnimations[lane.noteData]}miss', true); } - + applyExtraWindow(15); if (applyRating) { game.score -= 10; @@ -209,10 +228,12 @@ import funkin.objects.play.Strumline; if (applyRating) { scoring ??= scoreHandler?.judgeNoteMiss(note); - var rating:FunkinSprite = game.popRating('sadmiss'); - rating.velocity.y = -FlxG.random.int(80, 95); - rating.velocity.x = FlxG.random.int(-6, 6); - rating.acceleration.y = 240; + if (popRating) { + var rating:FunkinSprite = game.popRating('sadmiss'); + rating.velocity.y = -FlxG.random.int(80, 95); + rating.velocity.x = FlxG.random.int(-6, 6); + rating.acceleration.y = 240; + } if (scoreHandler != null) { game.totalNotes ++; @@ -248,6 +269,7 @@ enum abstract NoteEventType(String) to String { var HIT = 'hit'; var HELD = 'held'; + var PRESSED = 'pressed'; var RELEASED = 'released'; var LOST = 'lost'; diff --git a/source/funkin/backend/play/SongEvent.hx b/source/funkin/backend/play/SongEvent.hx new file mode 100644 index 0000000..f34db7e --- /dev/null +++ b/source/funkin/backend/play/SongEvent.hx @@ -0,0 +1,270 @@ +package funkin.backend.play; + +import funkin.states.PlayState; +import funkin.states.GameOverSubState; +import funkin.objects.Character; +import funkin.objects.CharacterGroup; +import funkin.backend.scripting.HScript; + +@:structInit class SongEvent implements IPlayEvent { + public var type(default, null):SongEventType; + public var cancelled:Bool = false; + + public var time:Null = null; + public var sprite:FlxSprite = null; + public var character:Character = null; + public var chartEvent:Chart.ChartEvent = null; + + public var countdown:Null = null; + public var countdownSprite:FunkinSprite = null; + + public var subState:FunkinState = null; + + public function cancel() cancelled = true; + public function dispatch() { // hahaaa + if (!Std.isOfType(FlxG.state, PlayState)) { + throw(new haxe.Exception('song event can\'t be dispatched outside of PlayState!!')); + return; + } + var game:PlayState = cast FlxG.state; + + if (cancelled) { + switch (type) { + case START_COUNTDOWN: + game.conductorInUse.paused = true; + + case SONG_START: + game.conductorInUse.songPosition = 0; + game.conductorInUse.paused = true; + + default: + } + return; + } + + switch (type) { + case START_COUNTDOWN: + for (strumline in game.strumlineGroup) + strumline.fadeIn(); + case TICK_COUNTDOWN: + var folder:String = 'funkin'; + FunkinSound.playOnce(Paths.sound('gameplay/countdown/$folder/intro$countdown')); + + countdownSprite = game.popCountdown(countdown); + + case SONG_START: + game.music.play(true); + game.syncMusic(true, true); + game.songStarted = true; + case SONG_FINISH: + if (HScript.stopped(game.hscripts.run('finishSong'))) { + game.conductorInUse.paused = true; + } else { + FlxG.switchState(() -> new funkin.states.FreeplayState()); + } + + case STEP_HIT: + game.stepHitEvent(time); + case BEAT_HIT: + game.beatHitEvent(time); + case BAR_HIT: + game.barHitEvent(time); + + case DEATH_FIRST: + if (Std.isOfType(subState, GameOverSubState)) + cast(subState, GameOverSubState).firstDeathEvent(); + case DEATH_START: + if (Std.isOfType(subState, GameOverSubState)) + cast(subState, GameOverSubState).startDeathEvent(); + case DEATH_CONFIRM: + if (Std.isOfType(subState, GameOverSubState)) + cast(subState, GameOverSubState).confirmDeathEvent(); + + case PUSH_EVENT: + PlayStateEventHandler.pushEvent(chartEvent, game); + case TRIGGER_EVENT: + PlayStateEventHandler.triggerEvent(chartEvent, game); + + default: + } + } +} + +enum abstract SongEventType(String) to String { + var SONG_START = 'songStart'; + var SONG_FINISH = 'songFinish'; + + var PUSH_EVENT = 'pushEvent'; + var TRIGGER_EVENT = 'triggerEvent'; + var CHANGE_SPOTLIGHT = 'changeSpotlight'; + + var START_COUNTDOWN = 'startCountdown'; + var TICK_COUNTDOWN = 'tickCountdown'; + + var DEATH_INIT = 'deathInit'; + var DEATH_FIRST = 'deathFirst'; + var DEATH_START = 'deathStart'; + var DEATH_CONFIRM = 'deathConfirm'; + + var STEP_HIT = 'stepHit'; + var BEAT_HIT = 'beatHit'; + var BAR_HIT = 'barHit'; +} + +class PlayStateEventHandler { + public static function pushEvent(chartEvent:Chart.ChartEvent, game:PlayState) { + var params:Map = chartEvent.params; + var simple:Bool = game.simple; + + switch (chartEvent.name) { + case 'PlayAnimation': + if (simple) return; + + var focusChara:Null = null; + switch (params['target']) { + case 'girlfriend', 'gf': focusChara = game.player3; + case 'boyfriend', 'bf': focusChara = game.player1; + case 'dad': focusChara = game.player2; + } + + if (focusChara != null) + focusChara.preloadAnimAsset(params['anim']); + } + + game.events.push(chartEvent); + game.hscripts.run('eventPushed', [chartEvent]); + } + + public static function triggerEvent(chartEvent:Chart.ChartEvent, game:PlayState) { + var params:Map = chartEvent.params; + var simple:Bool = game.simple; + + switch (chartEvent.name) { + case 'FocusCamera': + if (simple) return; + + var focusCharaInt:Int; + var focusChara:Null = null; + if (params.exists('char')) { + focusCharaInt = Util.parseInt(params['char']); + } else { + focusCharaInt = Util.parseInt(params['value']); + } + + switch (focusCharaInt) { + case 0: // player focus + focusChara = game.player1; + case 1: // opponent focus + focusChara = game.player2; + case 2: // gf focus + focusChara = game.player3; + } + + if (focusChara != null) { + game.focusOnCharacter(focusChara.current); + } else { + game.camFocusTarget.x = 0; + game.camFocusTarget.y = 0; + game.spotlight = null; + } + if (params.exists('x')) game.camFocusTarget.x += Util.parseFloat(params['x']); + if (params.exists('y')) game.camFocusTarget.y += Util.parseFloat(params['y']); + + FlxTween.cancelTweensOf(game.camGame.scroll); + switch (params['ease']) { + case 'CLASSIC' | null: + game.camGame.pauseFollowLerp = false; + case 'INSTANT': + game.camGame.snapToTarget(); + game.camGame.pauseFollowLerp = false; + default: + var duration:Float = Util.parseFloat(params['duration'], 4) * game.conductorInUse.stepCrochet * .001; + if (duration <= 0) { + game.camGame.snapToTarget(); + game.camGame.pauseFollowLerp = false; + } else { + var easeFunction:Null Float> = Reflect.field(FlxEase, params['ease'] ?? 'linear'); + if (easeFunction == null) { + Log.warning('FocusCamera event: ease function invalid'); + easeFunction = FlxEase.linear; + } + game.camGame.pauseFollowLerp = true; + FlxTween.tween(game.camGame.scroll, {x: game.camFocusTarget.x - FlxG.width * .5, y: game.camFocusTarget.y - FlxG.height * .5}, duration, {ease: easeFunction, onComplete: (_) -> { + game.camGame.pauseFollowLerp = false; + }}); + } + } + + case 'ZoomCamera': + if (simple) return; + + var targetZoom:Float = Util.parseFloat(params['zoom'], 1); + var direct:Bool = (params['mode'] ?? 'direct' == 'direct'); + targetZoom *= (direct ? FlxCamera.defaultZoom : (game.stage?.zoom ?? 1)); + game.camGame.zoomTarget = targetZoom; + FlxTween.cancelTweensOf(game.camGame, ['zoom']); + switch (params['ease']) { + case 'INSTANT': + game.camGame.zoom = targetZoom; + game.camGame.pauseZoomLerp = false; + default: + var duration:Float = Util.parseFloat(params['duration'], 4) * game.conductorInUse.stepCrochet * .001; + if (duration <= 0) { + game.camGame.zoom = targetZoom; + game.camGame.pauseZoomLerp = false; + } else { + var easeFunction:Null Float> = Reflect.field(FlxEase, params['ease'] ?? 'linear'); + if (easeFunction == null) { + Log.warning('FocusCamera event: ease function invalid'); + easeFunction = FlxEase.linear; + } + game.camGame.pauseZoomLerp = true; + FlxTween.tween(game.camGame, {zoom: targetZoom}, duration, {ease: easeFunction, onComplete: (_) -> { + game.camGame.pauseZoomLerp = false; + }}); + } + } + + case 'SetCameraBop': + var targetRate:Int = Util.parseInt(params['rate'], -1); + var targetIntensity:Float = Util.parseFloat(params['intensity'], 1); + + game.hudZoomIntensity = targetIntensity * 2; + game.camZoomIntensity = targetIntensity; + game.camZoomRate = targetRate; + + case 'PlayAnimation': + if (simple) return; + + var anim:String = params['anim']; + var target:String = params['target']; + var focus:FlxSprite = null; + + switch (target) { + case 'dad' | 'opponent': focus = game.player2; + case 'girlfriend' | 'gf': focus = game.player3; + case 'boyfriend' | 'bf' | 'player': focus = game.player1; + default: focus = game.stage?.getProp(target); + } + + if (focus != null) { + var forced:Bool = params['force']; + + if (Std.isOfType(focus, CharacterGroup)) { + var chara:CharacterGroup = cast focus; + if (chara.animationExists(anim)) { + chara.playAnimation(anim, forced); + chara.specialAnim = forced; + chara.timeAnimSteps(); + } + } else if (Std.isOfType(focus, FunkinSprite)) { + var funk:FunkinSprite = cast focus; + if (funk.animationExists(anim)) { + funk.playAnimation(anim, forced); + } + } + } + } + game.hscripts.run('eventTriggered', [chartEvent]); + } +} \ No newline at end of file diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 65ed3c1..27010b1 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -47,7 +47,7 @@ class Lane extends FunkinSpriteGroup { public function set_scrollSpeed(newSpeed:Float) { var cam = camera ?? FlxG.camera; - spawnRadius = Note.distanceToMS(camera.height / camera.zoom, newSpeed) + 50; + spawnRadius = Note.distanceToMS(camera.height / camera.zoom, Math.abs(newSpeed)) + 50; return scrollSpeed = newSpeed; } public function set_held(newHeld:Bool) { @@ -83,10 +83,10 @@ class Lane extends FunkinSpriteGroup { receptor.lane = this; //lol this.noteData = data; this.add(receptor); - topMembers.push(notes); - topMembers.push(noteCover); - topMembers.push(noteSparks); - topMembers.push(noteSplashes); + for (mem in [notes, noteCover, noteSparks, noteSplashes]) { + topMembers.push(mem); // render conditionally + this.add(mem); + } noteCover.shader = splashRGB.shader; @@ -105,7 +105,7 @@ class Lane extends FunkinSpriteGroup { queue.remove(note); continue; } - early = (note.msTime - conductorInUse.songPosition > spawnRadius); + early = (note.msTime - conductorInUse.songPosition > Math.max(spawnRadius, hitWindow)); if (!early && (oneWay || (note.msTime + note.msLength - conductorInUse.songPosition) >= -spawnRadius)) { queue.remove(note); insertNote(note); @@ -120,7 +120,6 @@ class Lane extends FunkinSpriteGroup { super.update(elapsed); extraWindow = Math.max(extraWindow - elapsed * 200, 0); - for (member in topMembers) member.update(elapsed); } public function updateNotes() { var i:Int = notes.length; @@ -132,15 +131,16 @@ class Lane extends FunkinSpriteGroup { } } public override function draw() { - super.draw(); - if (selfDraw) drawTop(); + drawThing(selfDraw ? null : false); } - public function drawTop() { + function drawThing(?top:Bool):Void { @:privateAccess { final oldDefaultCameras = FlxCamera._defaultCameras; if (_cameras != null) FlxCamera._defaultCameras = _cameras; - for (member in topMembers) { + for (member in members) { + if (top != null && topMembers.contains(member) != top) + continue; if (member != null && member.exists && member.visible) member.draw(); } @@ -162,22 +162,12 @@ class Lane extends FunkinSpriteGroup { public function fireInput(key:FlxKey, pressed:Bool):Bool { if (!inputKeys.contains(key) || !allowInput) return false; if (pressed) { - var note = getHighestNote(inputFilter); - if (note != null) { - hitNote(note); - } else { - ghostTapped(); - } + _noteEvent(basicEvent(PRESSED, getHighestNote(inputFilter))); } else { - held = false; var note:Note = heldNote; - if (note != null) { - note.held = false; - _noteEvent(basicEvent(RELEASED, note)); - killNote(note); - } else { - receptor.playAnimation('static'); - } + _noteEvent(basicEvent(RELEASED, note)); + if (note != null) + _noteEvent(basicEvent(RELEASED)); } return true; } @@ -223,8 +213,8 @@ class Lane extends FunkinSpriteGroup { } public function splash():NoteSplash { - var splash:NoteSplash = noteSplashes.recycle(NoteSplash, () -> new NoteSplash(noteData)); - splash.camera = camera; //silly. freaking silly + var splash:NoteSplash = noteSplashes.recycle(NoteSplash, () -> new NoteSplash(noteData), true); + preAdd(splash); splash.alpha = alpha * .7; splash.shader = splashRGB.shader; splash.splashOnReceptor(receptor); @@ -235,9 +225,9 @@ class Lane extends FunkinSpriteGroup { return noteCover; } public function spark():NoteSpark { - var spark:NoteSpark = noteSparks.recycle(NoteSpark, () -> new NoteSpark(noteData)); + var spark:NoteSpark = noteSparks.recycle(NoteSpark, () -> new NoteSpark(noteData), true); + preAdd(spark); spark.alpha = alpha; - spark.camera = camera; spark.shader = splashRGB.shader; spark.sparkOnReceptor(receptor); return spark; @@ -310,6 +300,7 @@ class Lane extends FunkinSpriteGroup { public function insertNote(songNote:ChartNote, pos:Int = 0) { var note:Note = notes.recycle(Note, () -> generateNote(songNote)); + preAdd(note); note.lane = this; note.chartNote = songNote; note.hitWindow = hitWindow; @@ -344,6 +335,25 @@ class Lane extends FunkinSpriteGroup { return receptor?.width ?? 0; public override function get_height() return receptor?.height ?? 0; + + override function set_zoomFactor(value:Float):Float { + super.set_zoomFactor(value); + for (sprite in topMembers) { + if (sprite == null) continue; + var funk:IZoomFactor = getFunk(sprite); + if (funk != null) funk.zoomFactor = value; + } + return zoomFactor = value; + } + override function set_initialZoom(value:Float):Float { + super.set_initialZoom(value); + for (sprite in topMembers) { + if (sprite == null) continue; + var funk:IZoomFactor = getFunk(sprite); + if (funk != null) funk.initialZoom = value; + } + return initialZoom = value; + } } class Receptor extends FunkinSprite { diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index e1eb8c8..ed2eb3f 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -3,13 +3,13 @@ package funkin.objects.play; import funkin.objects.play.Lane; import funkin.backend.play.Scoring; import funkin.backend.rhythm.Event; +import funkin.backend.FunkinSprite; import funkin.objects.CharacterGroup; +import flixel.math.FlxMatrix; import flixel.graphics.frames.FlxFrame; -import flixel.addons.display.FlxTiledSprite; -import flixel.graphics.frames.FlxFramesCollection; -@:structInit class ChartNote implements ITimeSortable { +@:structInit class ChartNote implements ISpriteVars implements ITimeSortable { public var laneIndex:Int; public var kind:String = ''; public var msTime:Float = 0; @@ -26,9 +26,17 @@ import flixel.graphics.frames.FlxFramesCollection; if (extraData == null) return null; return extraData.get(k); } + public function hasVar(k:String):Bool { + if (extraData == null) return false; + return extraData.exists(k); + } + public function removeVar(k:String):Bool { + if (extraData == null) return false; + return extraData.remove(k); + } } -class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affect society +class Note extends FunkinSprite { public static var directionNames:Array = ['left', 'down', 'up', 'right']; public static var directionColors:Array> = [ [FlxColor.fromRGB(194, 75, 153), FlxColor.fromRGB(60, 31, 86)], @@ -53,7 +61,6 @@ class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affec public var lost:Bool = false; public var canHit:Bool = true; - public var noteOffset:FlxPoint; public var clipDistance:Float = 0; public var scrollDistance:Float = 0; public var followAngle:Bool = true; @@ -122,36 +129,31 @@ class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affec } public function reload() { + healthLoss = 6.0 / 100; + healthGain = 1.5 / 100; + healthGainPerSecond = 7.5 / 100; lost = goodHit = held = consumed = preventDespawn = ignore = false; - followAngle = canHit = true; + followAngle = canHit = visible = true; holdTime = hitTime = -1; + multAlpha = 1; clipDistance = 0; - if (noteOffset == null) { - noteOffset = FlxPoint.get(); - } else { - noteOffset.set(); + if (tail != null) { + tail.loadAtlas('notes'); + tail.reload(); } - if (tail != null) - tail.clipRect = null; loadAtlas('notes'); reloadAnimations(); } - public function reloadTail() { + public function updateTail() { isHoldNote = (msLength > 0); - if (tail == null && isHoldNote) { + if (tail == null && isHoldNote) tail = new NoteTail(this); - } } public function reloadAnimations() { var dirName:String = directionNames[noteData]; addAnimation('hit-$noteData', '$dirName note', 24, false); playAnimation('hit-$noteData', true); - /*if (isHoldPiece) { - addAnimation('tail-$noteData', '$dirName hold tail', 24, false); - addAnimation('hold-$noteData', '$dirName hold piece', 24, false); - playAnimation(this.isHoldTail ? 'tail' : 'hold', true); - }*/ updateHitbox(); } public function toChartNote():ChartNote { @@ -175,14 +177,14 @@ class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affec if (msLength == newLength) return newLength; msLength = newLength; @:bypassAccessor beatLength = conductorInUse.convertMeasure(msTime + newLength, MS, BEAT) - beatTime; - reloadTail(); + updateTail(); return newLength; } public function set_beatLength(newLength:Float) { if (beatLength == newLength) return newLength; beatLength = newLength; @:bypassAccessor msLength = conductorInUse.convertMeasure(beatTime + newLength, BEAT, MS) - msTime; - reloadTail(); + updateTail(); return newLength; } public function get_endMs() @@ -198,65 +200,188 @@ class Note extends FunkinSprite { // todo: pooling?? maybe?? how will this affec var receptor:Receptor = lane.receptor; var speed:Float = scrollSpeed * scrollMultiplier; var dir:Float = lane.direction + directionOffset; - - var holdOffsetX:Float = 0; - var holdOffsetY:Float = 0; - - scrollDistance = Note.msToDistance(msTime - conductorInUse.songPosition, speed); + + scrollDistance = msToDistance(msTime - conductorInUse.songPosition, speed); var xP:Float = 0; var yP:Float = scrollDistance; var rad:Float = dir / 180 * Math.PI; - x = receptor.x + noteOffset.x + Math.sin(rad) * xP + Math.cos(rad) * yP + holdOffsetX; - y = receptor.y + noteOffset.y + Math.sin(rad) * yP + Math.cos(rad) * xP + holdOffsetY; + x = receptor.x + Math.sin(rad) * xP + Math.cos(rad) * yP; + y = receptor.y + Math.sin(rad) * yP + Math.cos(rad) * xP; alpha = lane.alpha * receptor.alpha * multAlpha; if (followAngle) angle = lane.receptor.angle; if (isHoldNote && tail != null) { + var absDistance:Float = msToDistance(msTime - conductorInUse.songPosition, Math.abs(speed)); var tailY:Float = height * .5; - tail.setGraphicSize(35, Note.msToDistance(msLength, speed) - tailY); + tail.offset.y = 0; tail.angle = dir - 90; - tail.updateHitbox(); + tail.scale.x = scale.x; + tail.scale.y = FlxMath.signOf(speed) * Math.abs(scale.x); tail.setPosition(x + (width - tail.width) * .5, y + tailY); + tail.sustainHeight = msToDistance(msLength, Math.abs(speed)); + tail.updateHitbox(); - if (goodHit && scrollDistance < 0) - clipDistance = -scrollDistance; - - if (clipDistance > 0) { - if (tail.clipRect == null) - tail.clipRect = new FlxRect(0, 0, tail.frameWidth); - - var clipDist:Float = (clipDistance / tail.height) * tail.frameHeight; - tail.clipRect.height = tail.frameHeight - clipDist; - tail.clipRect.y = clipDist; - - tail.clipRect = tail.clipRect; - } + if (goodHit && absDistance < 0) + tail.sustainClip = -absDistance; } } - inline function clipto(ya:Float = 0, yb:Float = 0) - clipRect.set(0, ya, frameWidth, yb - ya); } class NoteTail extends FunkinSprite { - public var parent:Note; + public var parent(default, set):Note; + public var noteData:Int; public var multAlpha:Float = .6; + public var sustainClip:Float = 0; + public var sustainHeight:Float = 0; + + var _tileMatrix:FlxMatrix = new FlxMatrix(); public function new(parent:Note) { super(); - makeGraphic(1, FlxG.height, FlxColor.WHITE); - origin.set(frameWidth * .5, 0); this.parent = parent; + this.reload(); + } + public override function destroy() { + _tileMatrix = null; + super.destroy(); + } + + function set_parent(note:Note):Note { + if (parent == note) return note; + noteData = note.noteData; + return parent = note; + } + + public function reload() { + reloadAnimations(); + sustainClip = 0; + } + public function reloadAnimations() { + var dirName:String = Note.directionNames[noteData]; + addAnimation('tail-$noteData', '$dirName hold tail', 24, false); + addAnimation('hold-$noteData', '$dirName hold piece', 24, false); + playAnimation('hold-$noteData', true); } public override function draw() { alpha = multAlpha; - if (parent != null) + if (parent != null) { + scrollFactor.copyFrom(parent.scrollFactor); + initialZoom = parent.initialZoom; + zoomFactor = parent.zoomFactor; + shader = parent.shader; alpha *= parent.alpha; + color = parent.color; + } super.draw(); } + // this is kinda mediocre tbh + public override function drawComplex(camera:FlxCamera) { + if (sustainHeight <= sustainClip) + return; + + updateShader(camera); + + var top:Float = 1; + var bottom:Float = 0; + var doTail:Bool = true; + playAnimation('tail-$noteData', true); + origin.set(frameWidth * .5, 0); + cropFrame(top, bottom); + getDrawMatrix(); + + var totalHeight:Float = sustainHeight; + var absScale:Float = Math.abs(scale.y); + + if (absScale < Math.max(Math.abs(scale.x), .05)) return; // TODO: add negative scale rendering (and flipY, i guess) + + var scaleSign:Int = FlxMath.signOf(scale.y); + var rad:Float = angle / 180 * Math.PI; + var sin:Float = Math.sin(rad); + var cos:Float = Math.cos(rad); + var cut:Bool = false; + + while (true) { + var pieceHeight:Float = (frameHeight - top - bottom) * absScale; + if (pieceHeight <= 0) return; + + totalHeight -= pieceHeight; + if (totalHeight <= sustainClip) { + var dist:Float = (sustainClip - totalHeight) / absScale; + _frame = frame.clipTo(_rect.set(0, dist, frameWidth, frameHeight - dist - bottom), _frame); + getDrawMatrix(); + cut = true; + } + + _tileMatrix.copyFrom(_matrix); + _tileMatrix.translate(-totalHeight * sin, totalHeight * cos * scaleSign); + FunkinSprite.transformMatrixZoom(_tileMatrix, camera, zoomFactor, initialZoom); + camera.drawPixels(_frame, framePixels, _tileMatrix, colorTransform, blend, antialiasing, shader); + + if (cut) break; + + if (doTail) { + bottom = 1; + doTail = false; + playAnimation('hold-$noteData', true); + origin.set(frameWidth * .5, 0); + cropFrame(top, bottom); + getDrawMatrix(); + } + } + } + function cropFrame(cropTop:Float = 0, cropBottom:Float = 0) { + _frame = frame.clipTo(_rect.set(0, cropTop, frameWidth, frameHeight - cropTop - cropBottom), _frame); + } + function getDrawMatrix() { + _frame.prepareMatrix(_matrix, FlxFrameAngle.ANGLE_0, checkFlipX(), checkFlipY()); + + _matrix.translate(-origin.x, -origin.y); + _matrix.scale(scale.x, scale.y); + + if (bakedRotationAngle <= 0) { + updateTrig(); + + if (angle != 0) + _matrix.rotateWithTrig(_cosAngle, _sinAngle); + } + + transformSpriteOffset(_transPoint); + getScreenPosition(_point, camera); + _point.add(-offset.x, -offset.y); + _point.add(-_transPoint.x, -_transPoint.y); + _matrix.translate(_point.x + origin.x, _point.y + origin.y); + + if (isPixelPerfectRender(camera)) { + _matrix.tx = Math.floor(_matrix.tx); + _matrix.ty = Math.floor(_matrix.ty); + } + } + public override function getScreenBounds(?newRect:FlxRect, ?camera:FlxCamera):FlxRect { + if (newRect == null) + newRect = FlxRect.get(); + + if (camera == null) + camera = getDefaultCamera(); + + newRect.setPosition(x, y); + if (pixelPerfectPosition) + newRect.floor(); + _scaledOrigin.set(origin.x * Math.abs(scale.x), origin.y * Math.abs(scale.y)); + newRect.x += -Std.int(camera.scroll.x * scrollFactor.x) - offset.x + origin.x - _scaledOrigin.x; + newRect.y += -Std.int(camera.scroll.y * scrollFactor.y) - offset.y + origin.y - _scaledOrigin.y; + if (isPixelPerfectRender(camera)) + newRect.floor(); + newRect.setSize(frameWidth * Math.abs(scale.x), sustainHeight); + if (scale.y < 0) newRect.y -= sustainHeight; + return newRect.getRotatedBounds(angle, _scaledOrigin, newRect); + } + public override function isSimpleRender(?camera:FlxCamera):Bool { + return false; // lazy zzz + } } \ No newline at end of file diff --git a/source/funkin/objects/play/Strumline.hx b/source/funkin/objects/play/Strumline.hx index 0259cf5..a2ffba6 100644 --- a/source/funkin/objects/play/Strumline.hx +++ b/source/funkin/objects/play/Strumline.hx @@ -62,27 +62,27 @@ class Strumline extends FunkinSpriteGroup { } //getters - public function get_leftBound() { + function get_leftBound() { var minX:Float = Math.POSITIVE_INFINITY; for (lane in lanes) minX = Math.min(minX, lane.receptor.x); return minX; } - public function get_rightBound() { + function get_rightBound() { var maxX:Float = Math.NEGATIVE_INFINITY; for (lane in lanes) maxX = Math.max(maxX, lane.receptor.x + lane.receptor.width); return maxX; } - public function get_topBound() { + function get_topBound() { var minY:Float = Math.POSITIVE_INFINITY; for (lane in lanes) minY = Math.min(minY, lane.receptor.y); return minY; } - public function get_bottomBound() { + function get_bottomBound() { var maxY:Float = Math.NEGATIVE_INFINITY; for (lane in lanes) maxY = Math.max(maxY, lane.receptor.y + lane.receptor.height); return maxY; } - public function get_strumlineWidth() { + function get_strumlineWidth() { var minX:Float = Math.POSITIVE_INFINITY; var maxX:Float = Math.NEGATIVE_INFINITY; for (lane in lanes) { @@ -91,7 +91,7 @@ class Strumline extends FunkinSpriteGroup { } return (maxX - minX); } - public function get_strumlineHeight() { + function get_strumlineHeight() { var minY:Float = Math.POSITIVE_INFINITY; var maxY:Float = Math.NEGATIVE_INFINITY; for (lane in lanes) { @@ -100,12 +100,12 @@ class Strumline extends FunkinSpriteGroup { } return (maxY - minY); } - public function get_receptorWidth() { + function get_receptorWidth() { var width:Float = 0; for (lane in lanes) width = Math.max(width, lane.receptor.width); return width; } - public function get_receptorHeight() { + function get_receptorHeight() { var height:Float = 0; for (lane in lanes) height = Math.max(height, lane.receptor.height); return height; @@ -143,7 +143,7 @@ class Strumline extends FunkinSpriteGroup { super.draw(); for (lane in lanes) { // draw on top if (!lane.selfDraw) - lane.drawTop(); + @:privateAccess lane.drawThing(true); } } public function forEachLane(func:Lane -> Void) { diff --git a/source/funkin/states/GameOverSubState.hx b/source/funkin/states/GameOverSubState.hx index 3e8368d..0135577 100644 --- a/source/funkin/states/GameOverSubState.hx +++ b/source/funkin/states/GameOverSubState.hx @@ -6,12 +6,7 @@ import funkin.objects.CharacterGroup; import openfl.media.Sound; class GameOverSubState extends FunkinState { - public var cam:FunkinCamera; - public var playState:PlayState; public var cameraZoom:Float = 1; - public var started:Bool = false; - public var confirmed:Bool = false; - public var wasInstant:Bool = false; public var character:Character = null; public var deathAnimationPostfix:String = ''; @@ -19,12 +14,20 @@ class GameOverSubState extends FunkinState { public var musicPath:String = 'gameplay/gameOver/gameOver'; public var startMusicPath:String = 'gameplay/gameOver/gameOverStart'; public var confirmMusicPath:String = 'gameplay/gameOver/gameOverEnd'; + public var musicVolume:Float = 1; public var sound:Sound; public var music:Sound; public var startMusic:Sound; public var confirmMusic:Sound; + var cam:FunkinCamera; + var playState:PlayState; + var waitTimer:FlxTimer = null; + public var started:Bool = false; + public var confirmed:Bool = false; + public var wasInstant:Bool = false; + public function new(instant:Bool = true) { super(); @@ -34,6 +37,7 @@ class GameOverSubState extends FunkinState { FlxG.camera = cam = playState.camGame; playState.hscripts.run('death', [instant, this]); + playState.dispatchSongEvent({type: DEATH_INIT, character: character, subState: this}); if (character != null) { cameraZoom = character.deathData?.cameraZoom ?? 1; @@ -53,27 +57,14 @@ class GameOverSubState extends FunkinState { public override function create() { FlxG.state.persistentDraw = false; FlxG.state.persistentUpdate = false; + if (character != null) { add(character); focusOnCharacter(character); playState.stage.remove(character); - var aniName:String = 'firstDeath$deathAnimationPostfix'; - if (character.animationExists(aniName, true)) { - character.playAnimation(aniName); - character.onAnimationComplete.add((anim:String) -> { - if (!started && anim == aniName) - startGameOver(); - }); - } - new FlxTimer().start(2.5, (_) -> { - if (!started && character.isAnimationFinished()) - startGameOver(); - }); - } else { - new FlxTimer().start(2.5, (_) -> startGameOver()); } - if (sound != null) - FunkinSound.playOnce(sound); + + playState.dispatchSongEvent({type: DEATH_FIRST, character: character, subState: this}); playState.hscripts.run('deathCreate', [wasInstant, this]); } public override function update(elapsed:Float) { @@ -83,14 +74,8 @@ class GameOverSubState extends FunkinState { FlxG.switchState(FreeplayState.new); return; } - if (FlxG.keys.justPressed.ENTER) { - if (!confirmed) { - endGameOver(); - if (playState != null) - playState.hscripts.run('deathConfirm'); - } else { - // g - } + if (FlxG.keys.justPressed.ENTER && !confirmed) { + endGameOver(); } super.update(elapsed); @@ -112,34 +97,62 @@ class GameOverSubState extends FunkinState { } } public function startGameOver() { + playState.dispatchSongEvent({type: DEATH_START, character: character, subState: this}); + } + public function endGameOver() { + playState.dispatchSongEvent({type: DEATH_CONFIRM, character: character, subState: this}); + } + + public function firstDeathEvent() { + if (character != null) { + var aniName:String = 'firstDeath$deathAnimationPostfix'; + if (character.animationExists(aniName, true)) { + character.playAnimation(aniName); + character.onAnimationComplete.addOnce((anim:String) -> { + if (!started && anim == aniName) + startGameOver(); + }); + } + new FlxTimer().start(2.5, (_) -> { + if (!started && character.isAnimationFinished()) + startGameOver(); + }); + } else { + new FlxTimer().start(2.5, (_) -> startGameOver()); + } + if (sound != null) + FunkinSound.playOnce(sound); + } + public function startDeathEvent() { character?.playAnimation('deathLoop$deathAnimationPostfix'); if (confirmed) return; if (startMusic != null) { - FlxG.sound.playMusic(startMusic, 1, false); + FlxG.sound.playMusic(startMusic, musicVolume, false); FlxG.sound.music.onComplete = () -> { if (music != null) - FlxG.sound.playMusic(music); + FlxG.sound.playMusic(music, musicVolume); }; } else if (music != null) { - FlxG.sound.playMusic(music); + FlxG.sound.playMusic(music, musicVolume); } started = true; playState.hscripts.run('deathStart', [this]); } - public function endGameOver() { + public function confirmDeathEvent() { + confirmed = true; if (!started) { started = true; + playState.dispatchSongEvent({type: DEATH_START, character: character, subState: this}); playState.hscripts.run('deathStart', [this]); } - confirmed = true; character?.playAnimation('deathConfirm$deathAnimationPostfix'); if (FlxG.sound.music != null) FlxG.sound.music.stop(); if (confirmMusic != null) - FlxG.sound.playMusic(confirmMusic, 1, false); + FlxG.sound.playMusic(confirmMusic, musicVolume, false); new FlxTimer().start(.7, (_) -> { FlxG.camera.fade(FlxColor.BLACK, 2, false, () -> { FlxG.resetState(); }); }); diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 30bf57c..1e18314 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -2,9 +2,12 @@ package funkin.states; import openfl.events.KeyboardEvent; import flixel.input.keyboard.FlxKey; +import flixel.util.FlxSignal.FlxTypedSignal; import funkin.backend.scripting.HScript; import funkin.backend.play.ScoreHandler; +import funkin.backend.play.IPlayEvent; +import funkin.backend.play.SongEvent; import funkin.backend.play.NoteEvent; import funkin.backend.play.Scoring; import funkin.backend.play.Chart; @@ -26,10 +29,9 @@ class PlayState extends FunkinState { public var simpleBG:FunkinSprite; public var healthBar:Bar; + public var scoreTxt:FlxText; public var iconP1:HealthIcon; public var iconP2:HealthIcon; - public var scoreTxt:FlxText; - public var debugTxt:FlxText; public var playerStrumline:Strumline; public var opponentStrumline:Strumline; @@ -40,6 +42,7 @@ class PlayState extends FunkinState { public var singAnimations:Array = ['LEFT', 'DOWN', 'UP', 'RIGHT']; public var keybinds:Array> = []; public var heldKeys:Array = []; + public var pauseDisabled:Bool = false; public var inputDisabled:Bool = false; public var playCountdown:Bool = true; public var autoUpdateRPC:Bool = true; @@ -48,9 +51,10 @@ class PlayState extends FunkinState { public var camGame:FunkinCamera; public var camOther:FunkinCamera; public var camFocusTarget:FlxObject; - public var spotlight:Null; + public var spotlight(default, set):Null; public var camZoomRate:Int = -1; // 0: no bop - <0: every measure (always) + public var camZooming:Bool = true; public var camZoomIntensity:Float = 1; public var hudZoomIntensity:Float = 2; @@ -64,6 +68,7 @@ class PlayState extends FunkinState { @:isVar public var misses(get, set):Int = 0; @:isVar public var combo(get, set):Int = 0; public var accuracy(get, null):Float = 0; + public var ghostTapping:Bool; public var maxHealth(default, set):Float = 1; public var health(default, dynamic):Float = .5; @@ -80,6 +85,7 @@ class PlayState extends FunkinState { public var downscroll:Bool; public var middlescroll:Bool; + public var songStarted:Bool = false; public var songFinished:Bool = false; public function new(chart:Chart, simple:Bool = false) { @@ -92,6 +98,11 @@ class PlayState extends FunkinState { comboBroken(scoring.combo); } else { popCombo(newCombo); + + if (stage != null) { + for (chara in stage.characters) + chara.playComboAnimation(newCombo); + } } }); super(); @@ -103,6 +114,7 @@ class PlayState extends FunkinState { godmode = false; // practice mode? downscroll = Options.data.downscroll; middlescroll = Options.data.middlescroll; + ghostTapping = Options.data.ghostTapping; conductorInUse = new Conductor(); conductorInUse.metronome.tempoChanges = chart.tempoChanges; @@ -111,8 +123,6 @@ class PlayState extends FunkinState { music = new FunkinSoundGroup(); songName = chart.name; - // var genNotes:Array = chart.generateNotes(); - if (!simple) { var loadedEvents:Array = []; var noteKinds:Array = []; @@ -129,17 +139,15 @@ class PlayState extends FunkinState { loadedEvents.push(eventName); hscripts.loadFromPaths('scripts/events/$eventName.hx'); } - events.push(event); - pushedEvent(event); } hscripts.loadFromFolder('scripts/global'); hscripts.loadFromFolder('scripts/songs/${chart.path}'); } - stepHit.add(stepHitEvent); - beatHit.add(beatHitEvent); - barHit.add(barHitEvent); + conductorInUse.stepHit.add((t:Int) -> dispatchSongEvent({type: STEP_HIT, time: t})); + conductorInUse.beatHit.add((t:Int) -> dispatchSongEvent({type: BEAT_HIT, time: t})); + conductorInUse.barHit.add((t:Int) -> dispatchSongEvent({type: BAR_HIT, time: t})); @:privateAccess FlxG.cameras.defaults.resize(0); camOther = new FunkinCamera(); @@ -162,7 +170,8 @@ class PlayState extends FunkinState { stage = new Stage(chart); stage.setup(chart.stage); add(stage); - + + Paths.library = stage.library; player1 = stage.getCharacter('bf'); player2 = stage.getCharacter('dad'); player3 = stage.getCharacter('gf'); @@ -182,8 +191,8 @@ class PlayState extends FunkinState { camHUD.zoomTarget = 1; camGame.snapToTarget(); - var path:String = 'data/songs/${chart.path}/'; - chart.loadMusic(path, false); + chart.loadMusic('data/songs/${chart.path}/', false); + if (!chart.instLoaded) chart.loadMusic('songs/${chart.path}/', false); if (chart.instLoaded) { music.add(chart.inst); music.syncBase = chart.inst; @@ -194,16 +203,19 @@ class PlayState extends FunkinState { conductorInUse.syncTracker = chart.inst; } else { Log.warning('chart instrumental not found...'); - Log.minor('verify path:'); - Log.minor('- $path${Util.pathSuffix('Inst', chart.audioSuffix)}.ogg'); + Log.minor('verify paths:'); + Log.minor('- songs/${chart.path}/${Util.pathSuffix('Inst', chart.audioSuffix)}.ogg'); + Log.minor('- data/songs/${chart.path}/${Util.pathSuffix('Inst', chart.audioSuffix)}.ogg'); } loadVocals(chart.path, chart.audioSuffix); uiGroup = new FunkinSpriteGroup(); - uiGroup.camera = camHUD; + uiGroup.cameras = [camHUD]; + uiGroup.zIndex = 75; add(uiGroup); strumlineGroup = new FunkinTypedSpriteGroup(); - strumlineGroup.camera = camHUD; + strumlineGroup.cameras = [camHUD]; + strumlineGroup.zIndex = 100; add(strumlineGroup); var scrollDir:Float = (Options.data.downscroll ? 270 : 90); @@ -237,7 +249,7 @@ class PlayState extends FunkinState { notes.push(note); } - ratingGroup = new FunkinTypedSpriteGroup(); + ratingGroup = new FunkinTypedSpriteGroup(); ratingGroup.setPosition(player3?.getMidpoint()?.x ?? FlxG.width * .5, player3?.getMidpoint()?.y ?? FlxG.height * .5); if (stage != null) { ratingGroup.zIndex = Util.getHighestZIndex(stage.characters, 50) + 5; @@ -256,40 +268,40 @@ class PlayState extends FunkinState { healthBar.screenCenter(X); healthBar.zIndex = 10; uiGroup.add(healthBar); - iconP1 = new HealthIcon(0, 0, player1?.healthIcon, player1?.current?.healthIconData?.isPixel); + iconP1 = new HealthIcon(0, 0, player1?.healthIconData, true); iconP1.origin.x = 0; - iconP1.flipX = true; // fuck you - iconP1.zIndex = 15; + iconP1.zIndex = 20; uiGroup.add(iconP1); - iconP2 = new HealthIcon(0, 0, player2?.healthIcon, player2?.current?.healthIconData?.isPixel); + iconP2 = new HealthIcon(0, 0, player2?.healthIconData, false); iconP2.origin.x = iconP2.frameWidth; iconP2.zIndex = 15; uiGroup.add(iconP2); if (player1 != null) { - player1.onCharacterChanged.add((name:String, char:Character) -> matchHealthIcon(iconP1, char)); - player2.onCharacterChanged.add((name:String, char:Character) -> matchHealthIcon(iconP2, char)); + player1.onCharacterChanged.add((name:String, char:Character) -> { + matchIconData(iconP1, char); + if (spotlight == player1.current) + focusOnCharacter(char); + }); + player2.onCharacterChanged.add((name:String, char:Character) -> { + matchIconData(iconP2, char); + if (spotlight == player2.current) + focusOnCharacter(char); + }); } scoreTxt = new FlxText(0, FlxG.height - 25, FlxG.width, 'Score: idk'); scoreTxt.setFormat(Paths.ttf('vcr'), 16, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); scoreTxt.y -= scoreTxt.height * .5; scoreTxt.borderSize = 1.25; + scoreTxt.zIndex = 30; uiGroup.add(scoreTxt); - updateScoreText(); - debugTxt = new FlxText(0, 12, FlxG.width, ''); - debugTxt.setFormat(Paths.ttf('vcr'), 16, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); - uiGroup.add(debugTxt); - strumlineGroup.add(playerStrumline); strumlineGroup.add(opponentStrumline); + strumlineGroup.add(playerStrumline); - if (downscroll) { - flipMembers(uiGroup); - flipMembers(strumlineGroup); - } - - for (i in 0...4) Paths.sound('gameplay/hitsounds/miss$i'); + for (i in 0...4) + Paths.sound('gameplay/hitsounds/miss$i'); Paths.sound('gameplay/hitsounds/hitsoundTail'); Paths.sound('gameplay/hitsounds/hitsoundFail'); @@ -298,25 +310,43 @@ class PlayState extends FunkinState { refreshRPCTitle(); + for (event in chart.events) + dispatchSongEvent({type: PUSH_EVENT, chartEvent: event}); + hscripts.run('createPost'); + uiGroup.sortZIndex(); + stage?.sortZIndex(); + updateScoreText(); sortZIndex(); + if (downscroll) + flipUI(); + if (playCountdown) { for (strumline in strumlineGroup) strumline.visible = false; - for (snd in ['THREE', 'TWO', 'ONE', 'GO']) - Paths.sound('gameplay/countdown/funkin/intro$snd'); - for (img in ['ready', 'set', 'go']) - Paths.image(img); + for (tick in ['THREE', 'TWO', 'ONE', 'GO']) { + Paths.sound('gameplay/countdown/funkin/intro$tick'); + Paths.image(tick); + } } - conductorInUse.beat = (playCountdown ? -5 : -1); + beginCountdown(); update(0); } - - inline function flipMembers(grp:FlxTypedSpriteGroup) { + function flipUI() { for (mem in uiGroup) mem.y = FlxG.height - mem.y - mem.height; + for (mem in strumlineGroup) + mem.y = FlxG.height - mem.y - mem.height; + } + function matchIconData(?icon:HealthIcon, ?char:Character) { + if (icon == null || char == null) return; + + icon.iconData = char.healthIconData; + + iconP1.origin.x = 0; + iconP2.origin.x = iconP2.frameWidth; } public function loadVocals(path:String, audioSuffix:String = '') { @@ -389,7 +419,7 @@ class PlayState extends FunkinState { music.pause(); music.time = 0; resetConductor(); - conductorInUse.beat = -5; + beginCountdown(); resetScore(); refreshRPCTitle(); @@ -411,18 +441,14 @@ class PlayState extends FunkinState { syncMusic(false, true); } if (FlxG.keys.justPressed.Z) { - var strumlineY:Float = 50; downscroll = !downscroll; - Options.data.downscroll = !Options.data.downscroll; - if (Options.data.downscroll) strumlineY = FlxG.height - opponentStrumline.receptorHeight - strumlineY; - for (strumline in strumlineGroup) { + for (strumline in strumlineGroup) strumline.direction += 180; - strumline.y = strumlineY; - } - flipMembers(uiGroup); + + flipUI(); } } else if (!dead) { - if (FlxG.keys.justPressed.ENTER) { + if (FlxG.keys.justPressed.ENTER && !pauseDisabled) { paused = !paused; var pauseVocals:Bool = (paused || conductorInUse.songPosition < 0); if (pauseVocals) { @@ -471,19 +497,51 @@ class PlayState extends FunkinState { super.draw(); hscripts.run('drawPost'); } - - public function finishSong() { - songFinished = true; - if (HScript.stopped(hscripts.run('finishSong'))) { - conductorInUse.paused = true; - return; + + public function stepHitEvent(step:Int) { + syncMusic(true); + hscripts.run('stepHit', [step]); + } + public function beatHitEvent(beat:Int) { + if (playCountdown) { + switch (beat) { + case -4: + dispatchSongEvent({type: START_COUNTDOWN, countdown: 'THREE'}); + dispatchSongEvent({type: TICK_COUNTDOWN, countdown: 'THREE'}); + case -3: + dispatchSongEvent({type: TICK_COUNTDOWN, countdown: 'TWO'}); + case -2: + dispatchSongEvent({type: TICK_COUNTDOWN, countdown: 'ONE'}); + case -1: + dispatchSongEvent({type: TICK_COUNTDOWN, countdown: 'GO'}); + default: + } } - FlxG.switchState(() -> new FreeplayState()); + if (beat >= 0 && !songStarted) + dispatchSongEvent({type: SONG_START}); + + if (DiscordRPC.supported && music.playing && DiscordRPC.presence.endTimestamp.toInt() == 0) + refreshRPCTime(); + if (camZoomRate > 0 && beat % camZoomRate == 0) + bopCamera(); + + iconP1.bop(); + iconP2.bop(); + if (stage != null) + stage.beatHit(beat); + + hscripts.run('beatHit', [beat]); + } + public function barHitEvent(beat:Int) { + if (camZoomRate < 0) + bopCamera(); + + hscripts.run('barHit', [beat]); } public function syncMusic(forceSongpos:Bool = false, forceTrackTime:Bool = false) { - var syncBase:FunkinSound = music.syncBase; - if (chart.instLoaded && syncBase != null && syncBase.playing && !conductorInUse.paused) { + var syncBase:FlxSound = conductorInUse.syncTracker; + if (syncBase != null && syncBase.playing && !conductorInUse.paused) { if ((forceSongpos && conductorInUse.songPosition < syncBase.time) || Math.abs(syncBase.time - conductorInUse.songPosition) > 75) conductorInUse.songPosition = syncBase.time; if (forceTrackTime) { @@ -493,138 +551,7 @@ class PlayState extends FunkinState { } } } - - public function pushedEvent(event:ChartEvent) { - var params:Map = event.params; // todo: move this outside of playstate? - switch (event.name) { - case 'PlayAnimation': - var focusChara:Null = null; - switch (params['target']) { - case 'girlfriend', 'gf': focusChara = player3; - case 'boyfriend', 'bf': focusChara = player1; - case 'dad': focusChara = player2; - } if (focusChara != null) focusChara.preloadAnimAsset(params['anim']); - } - hscripts.run('eventPushed', [event]); - } - public function triggerEvent(event:ChartEvent) { - var params:Map = event.params; // todo: also move this outside of playstate - switch (event.name) { - case 'FocusCamera': - if (simple) return; - var focusCharaInt:Int; - var focusChara:Null = null; - if (params.exists('char')) focusCharaInt = Util.parseInt(params['char']); - else focusCharaInt = Util.parseInt(params['value']); - switch (focusCharaInt) { - case 0: // player focus - focusChara = player1; - case 1: // opponent focus - focusChara = player2; - case 2: // gf focus - focusChara = player3; - } - - if (focusChara != null) { - focusOnCharacter(focusChara.current); - } else { - camFocusTarget.x = 0; - camFocusTarget.y = 0; - spotlight = null; - } - if (params.exists('x')) camFocusTarget.x += Util.parseFloat(params['x']); - if (params.exists('y')) camFocusTarget.y += Util.parseFloat(params['y']); - FlxTween.cancelTweensOf(camGame.scroll); - switch (params['ease']) { - case 'CLASSIC' | null: - camGame.pauseFollowLerp = false; - case 'INSTANT': - camGame.snapToTarget(); - camGame.pauseFollowLerp = false; - default: - var duration:Float = Util.parseFloat(params['duration'], 4) * conductorInUse.stepCrochet * .001; - if (duration <= 0) { - camGame.snapToTarget(); - camGame.pauseFollowLerp = false; - } else { - var easeFunction:Null Float> = Reflect.field(FlxEase, params['ease'] ?? 'linear'); - if (easeFunction == null) { - Log.warning('FocusCamera event: ease function invalid'); - easeFunction = FlxEase.linear; - } - camGame.pauseFollowLerp = true; - FlxTween.tween(camGame.scroll, {x: camFocusTarget.x - FlxG.width * .5, y: camFocusTarget.y - FlxG.height * .5}, duration, {ease: easeFunction, onComplete: (_) -> { - camGame.pauseFollowLerp = false; - }}); - } - } - case 'ZoomCamera': - if (simple) return; - var targetZoom:Float = Util.parseFloat(params['zoom'], 1); - var direct:Bool = (params['mode'] ?? 'direct' == 'direct'); - targetZoom *= (direct ? FlxCamera.defaultZoom : (stage?.zoom ?? 1)); - camGame.zoomTarget = targetZoom; - FlxTween.cancelTweensOf(camGame, ['zoom']); - switch (params['ease']) { - case 'INSTANT': - camGame.zoom = targetZoom; - camGame.pauseZoomLerp = false; - default: - var duration:Float = Util.parseFloat(params['duration'], 4) * conductorInUse.stepCrochet * .001; - if (duration <= 0) { - camGame.zoom = targetZoom; - camGame.pauseZoomLerp = false; - } else { - var easeFunction:Null Float> = Reflect.field(FlxEase, params['ease'] ?? 'linear'); - if (easeFunction == null) { - Log.warning('FocusCamera event: ease function invalid'); - easeFunction = FlxEase.linear; - } - camGame.pauseZoomLerp = true; - FlxTween.tween(camGame, {zoom: targetZoom}, duration, {ease: easeFunction, onComplete: (_) -> { - camGame.pauseZoomLerp = false; - }}); - } - } - case 'SetCameraBop': - var targetRate:Int = Util.parseInt(params['rate'], -1); - var targetIntensity:Float = Util.parseFloat(params['intensity'], 1); - hudZoomIntensity = targetIntensity * 2; - camZoomIntensity = targetIntensity; - camZoomRate = targetRate; - case 'PlayAnimation': - if (simple) return; - var anim:String = params['anim']; - var target:String = params['target']; - var focus:FlxSprite = null; - - switch (target) { - case 'dad' | 'opponent': focus = player2; - case 'girlfriend' | 'gf': focus = player3; - case 'boyfriend' | 'bf' | 'player': focus = player1; - default: focus = stage.getProp(target); - } - - if (focus != null) { - var forced:Bool = params['force']; - - if (Std.isOfType(focus, CharacterGroup)) { - var chara:CharacterGroup = cast focus; - if (chara.animationExists(anim)) { - chara.playAnimation(anim, forced); - chara.specialAnim = forced; - chara.animReset = 8; - } - } else if (Std.isOfType(focus, FunkinSprite)) { - var funk:FunkinSprite = cast focus; - if (funk.animationExists(anim)) { - funk.playAnimation(anim, forced); - } - } - } - } - hscripts.run('eventTriggered', [event]); - } + public function focusOnCharacter(chara:Character, center:Bool = false) { if (chara != null) { camFocusTarget.x = chara.getMidpoint().x + chara.cameraOffset.x + (center ? 0 : chara.stageCameraOffset.x); @@ -632,16 +559,16 @@ class PlayState extends FunkinState { spotlight = chara; } } - public function matchHealthIcon(icon:HealthIcon, ?chara:Character) { - if (chara != null) { - icon.icon = chara.healthIcon; - icon.isPixel = chara?.healthIconData?.isPixel; - } + function set_spotlight(?newSprite:FlxSprite):Null { + if (spotlight == newSprite) return newSprite; + + dispatchSongEvent({type: CHANGE_SPOTLIGHT, sprite: newSprite}); + return spotlight = newSprite; } - + // TODO: ok, maybe these could be in a single function public function refreshRPCTime() { - if (!autoUpdateRPC) + if (!DiscordRPC.supported || !autoUpdateRPC) return; if (music.playing) { @@ -656,7 +583,7 @@ class PlayState extends FunkinState { DiscordRPC.dirty = true; } public function refreshRPCTitle() { - if (!autoUpdateRPC) + if (!DiscordRPC.supported || !autoUpdateRPC) return; var detailsText:String = '${chart.name} on ${chart.difficulty.toUpperCase()}'; @@ -666,7 +593,7 @@ class PlayState extends FunkinState { refreshRPCDetails(); } public function refreshRPCDetails() { - if (!autoUpdateRPC) + if (!DiscordRPC.supported || !autoUpdateRPC) return; var detailsString:String; @@ -696,48 +623,27 @@ class PlayState extends FunkinState { DiscordRPC.state = detailsString; } - public function stepHitEvent(step:Int) { - syncMusic(true); - - hscripts.run('stepHit', [step]); - } - public function beatHitEvent(beat:Int) { - if (playCountdown) { - var folder:String = 'funkin'; - switch (beat) { - case -4: - FunkinSound.playOnce(Paths.sound('gameplay/countdown/$folder/introTHREE')); - for (strumline in strumlineGroup) - strumline.fadeIn(); - case -3: - popCountdown('ready'); - FunkinSound.playOnce(Paths.sound('gameplay/countdown/$folder/introTWO')); - case -2: - popCountdown('set'); - FunkinSound.playOnce(Paths.sound('gameplay/countdown/$folder/introONE')); - case -1: - popCountdown('go'); - FunkinSound.playOnce(Paths.sound('gameplay/countdown/$folder/introGO')); - case 0: - music.play(true); - syncMusic(true, true); - default: - } - } - if (music.playing && DiscordRPC.presence.endTimestamp.toInt() == 0) { - refreshRPCTime(); - } - if (camZoomRate > 0 && beat % camZoomRate == 0) - bopCamera(); + inline public function dispatchSongEvent(e:SongEvent) dispatchPlayEvent('songEvent', e); + public function dispatchPlayEvent(funcName:String, e:IPlayEvent) { + runAllHScript('${funcName}Pre', [e]); - iconP1.bop(); - iconP2.bop(); - if (stage != null) - stage.beatHit(beat); + try e.dispatch() + catch (e:haxe.Exception) Log.error('error dispatching event -> ${e.message}'); - hscripts.run('beatHit', [beat]); + runAllHScript(funcName, [e]); } - public function popCountdown(image:String) { + public function beginCountdown() { + songStarted = false; + conductorInUse.beat = (playCountdown ? -5 : -1); + } + public function finishSong() { + songFinished = true; + dispatchSongEvent({type: SONG_FINISH}); + } + public function popCountdown(image:String):FunkinSprite { + if (Paths.image(image) == null) + return null; + var pop = new FunkinSprite().loadTexture(image); pop.camera = camHUD; pop.screenCenter(); @@ -746,20 +652,30 @@ class PlayState extends FunkinState { remove(pop); pop.destroy(); }}); - hscripts.run('countdownPop', [image, pop]); - } - public function barHitEvent(bar:Int) { - if (camZoomRate < 0) - bopCamera(); - - hscripts.run('barHit', [bar]); + return pop; } public function bopCamera() { + if (!camZooming) + return; if (!camHUD.pauseZoomLerp) camHUD.zoom += .015 * hudZoomIntensity; if (!camGame.pauseZoomLerp) camGame.zoom += .015 * camZoomIntensity; } + function runAllHScript(func:String, ?args:Array):Bool { + var canContinue = true; + + canContinue = (canContinue && !HScript.stopped(hscripts.run(func, args))); + for (chara in stage.characters) { + if (chara == null || !chara.exists || !chara.alive) continue; + + var current:Character = chara.current; + if (current != null) + canContinue = (canContinue && !HScript.stopped(current.hscripts.run(func, args))); + } + + return canContinue; + } public function keyPressEvent(event:KeyboardEvent) { var key:FlxKey = event.keyCode; @@ -804,17 +720,14 @@ class PlayState extends FunkinState { e.doSplash = true; e.doSpark = true; - if (e.type == NoteEventType.GHOST && Options.data.ghostTapping) { + if (e.type == NoteEventType.GHOST && ghostTapping) { e.playAnimation = false; } else { e.playSound = true; e.applyRating = true; } - - hscripts.run('playerNoteEventPre', [e]); - try e.dispatch() - catch (e:haxe.Exception) Log.error('error dispatching note event -> ${e.message}'); - hscripts.run('playerNoteEvent', [e]); + + dispatchPlayEvent('playerNoteEvent', e); } public function opponentNoteEvent(e:NoteEvent) { e.targetCharacter = player2; @@ -822,11 +735,8 @@ class PlayState extends FunkinState { e.playSound = false; e.doSplash = false; e.doSpark = false; - - hscripts.run('opponentNoteEventPre', [e]); - try e.dispatch() - catch (e:haxe.Exception) Log.error('error dispatching note event -> ${e.message}'); - hscripts.run('opponentNoteEvent', [e]); + + dispatchPlayEvent('opponentNoteEvent', e); } public function popCombo(combo:Int) { var tempCombo:Int = combo; @@ -847,15 +757,17 @@ class PlayState extends FunkinState { } } public function popRating(ratingString:String, scale:Float = .7, beats:Float = 1) { - var rating:FunkinSprite = new FunkinSprite(0, 0); + var rating:FunkinSprite = ratingGroup.recycle(FunkinSprite, () -> new FunkinSprite()); + + @:privateAccess ratingGroup.preAdd(rating); rating.loadTexture(ratingString); rating.scale.set(scale, scale); rating.offset.set(rating.frameWidth * .5, rating.frameHeight * .5); - - ratingGroup.add(rating); + + rating.revive(); FlxTween.tween(rating, {alpha: 0}, .2, {onComplete: (tween:FlxTween) -> { ratingGroup.remove(rating, true); - rating.destroy(); + rating.kill(); }, startDelay: conductorInUse.crochet * .001 * beats}); return rating; } @@ -897,6 +809,7 @@ class PlayState extends FunkinState { FlxTween.cancelTweensOf(camGame.scroll); FlxTween.cancelTweensOf(camGame); camGame.pauseFollowLerp = false; + camGame.zoomOffset = 0; refreshRPCDetails(); gameOver = new GameOverSubState(instant); @@ -979,11 +892,17 @@ class PlayState extends FunkinState { } } public dynamic function comboBroken(oldCombo:Int) { - player3?.playAnimationSteps('sad', true, 8); popCombo(0); + + if (stage != null) { + for (chara in stage.characters) + chara.playComboDropAnimation(scoring.combo); + } } override public function destroy() { + Paths.library = ''; + DiscordRPC.details = DiscordRPC.state = ''; DiscordRPC.presence.startTimestamp = DiscordRPC.presence.endTimestamp = 0; FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPressEvent); From 89f0afc2ec05379c9ff290a4ff6865e484532844 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 8 Mar 2025 14:12:24 -0600 Subject: [PATCH 04/73] more big stuff - new watermark and debug display - updated notes spritesheet (strums are more centered) - updated score handler - updated conductor logic and event logic (conductor advance signal) - strumlineIndex for notes, laneIndex instead of noteData - Paths.video for videos paths --- assets/images/notes.png | Bin 548437 -> 632896 bytes assets/images/notes.xml | 103 ++++++++------- assets/images/x3.png | Bin 0 -> 162 bytes source/Main.hx | 13 +- source/funkin/backend/DiscordRpc.hx | 2 +- source/funkin/backend/FunkinState.hx | 96 +++++++++++--- source/funkin/backend/Paths.hx | 4 +- source/funkin/backend/play/Chart.hx | 86 ++----------- source/funkin/backend/play/NoteEvent.hx | 91 +++++++------ source/funkin/backend/play/ScoreHandler.hx | 31 ++++- source/funkin/backend/play/Scoring.hx | 11 +- source/funkin/backend/rhythm/Conductor.hx | 8 +- source/funkin/backend/scripting/HScript.hx | 19 ++- .../backend/scripting/HScriptClasses.hx | 6 +- source/funkin/debug/DebugDisplay.hx | 90 ++++++++++--- source/funkin/objects/Character.hx | 10 +- source/funkin/objects/play/Lane.hx | 6 + source/funkin/objects/play/Note.hx | 121 ++++++++++++------ source/funkin/objects/play/Strumline.hx | 32 ++++- source/funkin/states/CrashState.hx | 2 - source/funkin/states/FreeplaySubState.hx | 13 +- source/funkin/states/PlayState.hx | 95 +++++++------- source/funkin/states/TitleState.hx | 8 +- 23 files changed, 508 insertions(+), 339 deletions(-) create mode 100644 assets/images/x3.png diff --git a/assets/images/notes.png b/assets/images/notes.png index c188a448cd5523326da0e704f2a98e9505051cca..e68cdda6b68d67744d0844f4a334386550530cec 100644 GIT binary patch literal 632896 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Ⓢ68jmOVG48(~CCL@@z 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 F`>EoB}uR|EemEzPhY<)qfeL~|9U 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%0DH;SDj?1B=sLc0k02+BV6(sgp{ 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�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

yK>Gmei9ER>KiFCU)#Q0iRE8DD<1QOT!EEg zwLj=TB!G*m`5^<7=!8ogrHk8}S3xE`rE+Fa2jMaf?>?Hm6Zbcsw0W1UDk>&H zsNLW;h5g%0SCDzB3U$!SC!p|!)<$n|+XGs8D`ye+0AXAt9R(I8MuT14T|lBCd>#^n zWp>U*q0pB^$L~Y5-<+nUj;Or&)LA9(tKgop9#GY;dFwicr%&KyHWp=5)vX$Jp>#2) zxLbqraydMy6u(BGnN~|rK!<*Y#`ZL#EWw!3RN{9z^1c1Q%qX3N@>Hk6B+AhBBP+vxZ~W4)Byuz%v^7%zC^r{tODN(bZKcZnbmxx-{pnuqa5{j_`c0drg@aCq> zF@CLIa^JcD{Tx21odr)plpSm!KAbA?f_?Z;BeV zuW#h>?oyl7wce@`1)T`C=B)igc^m}Ex!MP<0<$^MIb}CNY7P>%gSSU|<9aAcEb73u zJ{u67Bl&ds5Tc?u8krWZVlZgf@vG;PCxJsIK3j^&=TmXm*{Hls)GxAQ^FF|v+!w3E zl61SZ&F0`;4`p4@!8kRcl?PEUTNYj*N@>Z~U%an~Lk-OIL$htb$Pl zhoj5DbIbeY@NuBp{G9)Z`l&JI&`G>$58sBN5?|9>IR=ws0GT>rJiBO4ql(|B^YY3$ zrNo#1#a1jF6Ichjk2Ae|s{O|=H9ovp0CdAFGXaquOmPuZX6>!64VqLAmtSp_Zb`j`31&FBc zQO=F4W&44UmZL~#5Z>5|$F8{{C#a?rDyw6@a%TGZf_Nw090(IFZAp(TZ5F`AGt{9B zn|z?%BbBE5$L2?yT#t>mLW3WRbC|`b^V@~d>7$S{qEmp+dDINAM%c}u9v94=PRl7M z>{5$$hwCdoefmMc+2w+>>H_Hmhm*2U6xLSnT>N2l(S zRpq)-`%?)~K2&#KJEUbX@o;vGDeoY5F?aw)OX0$dg3F0~J41Wc^Hg+5sdRsoO$)SY zXd=-5w`Y_#<6Xb`$J5*&{iwuu37x_FCoC>-TX?$c39SnhLjoUf{4SNu=!GbW#Avmu zB`HPAGK4s}z6z3sDLZK+S}^+oo((ztcs#}_04K$AVv28eGhyTXyy8V(mr_KEHNecgHs<=@0t~P!ghc-*ckr0s%XOH#xO%PI@!fQ+z@;=Vs0Mr< zxRIn!g?z?)-Kz>2qr{bM--EQg2v_4;(&>J6{)8o`Ikf#KVeknrLDlk^ELFrtJ^ffC z>%_H=Z~<3_P*SS#)3TRD#6UVBKI`%L>lB9y<&ckZAnMQ8H5RJiY^F*=5X~pJfZq zokVjy|0In2Y3E||bv1e0*y=is=u=3a-0caE9`yXd{{g8$R=?0B&Lo~pTum&gn08{x z#l?lBmOoOM7nPkWB(IZ6pIklm#;fVdcLz+KrKgbq0Q5eG{`9zh$H(u*&gEAX>HnzK z+(^BdtWW#sAp5T%x`O>$nWFCcz@`;?d3f$}GQSb+xxoK+-}h5K_5$AO9XJ{FCpOgp zllQl`svhr31Yqm_htXhl>c3OhZ~Npuc&C>470l%{iLI3onU)}Q~u zo7y`*4~UAS1Xl%J2_%Xu+*CvoJ!w%2m}p4uK|H9qB|%C8lcFYF3w&mo5Ibeuxw+e~ zkO1EV?fFyz*qW+j3WTdP<)-OsVlk*n3aOVS&{~+Z4$j@Upv%JPyMXONYzLBdNzOGi zXjIUMq78zX0t+?lgoGW5*!|89d;dX)J*=>g6&C03EkJ&mNr3IhztyOJiTu~7e+B#pAr2|i225!E&ygx&h{y&@0XQ_74a>D5e1hHcv(!c;9Ag)7#lo#5d zWK&i+Oj8O;Vf_$Eo3j6i@((i{qC`=)>2QQCDX2fTOfta5;Rx6O2O>d&B8ip2fWS=8 z%I<0O`nFqD`T57mwQk+_UavEa>3or|vg&44WmV7(bN{Q|%qJobFUJ^E&k zkO|pMpz{X4@4zm&0j#2pYce}sIsNrc)h(30Q|Q8}r$Pcl0w|<+%Fa3Us=jy6?LPbN z1@|7Bp!OHek-&pS;%{VA#ruB$!C_e{<1ao$?2YFd^se%z3yw zj)U-sYjNvvtEOZk?C0Anry;X9u_flf^r(TiD`_fTw}dJsJn z9b6IsoInsq$;My(+kH;M{|qSpr;t`a5hIGDNW$5T**e6Y`Sm0GQ5grA^OmnZOCB zl$p1>-z#bn?mXKI-p_-vvu<1R3rk#M;Xm(dg0w6lU>=0rzsyzO>ArsI92MylRGn36y(C zvaCoTn+D#a03ljQ%q|{9bLm(R5Zaw=H5?6=0;LcjFQ>bC^5NhM93Atbn9t+FgI~v~ z?|2f6;}?M+C-~zE`~wgFbG3y-{5B>OC?O%yv%mYv?I)l3j$@Dirh^kNoq9It>FF?$ z7OfJ>X4c6>W}@t5whQRGlbJYN=+^-53H(g3uI9gI%O8|^=3N`{!@|1cc6s?>p%nC{D;;w0FXZQ+2&39M$zCoOA3=@I2L) zGqHJ91Xv6F<+cLr`&j|p0{`D4>B=ksxKK>2)6iRh6oTqKoToGtOxe4s_c|A1E_8E( z>+rIHM%G2RLE(mL92&JeYXma|W(v%m$C~!o&=#A2r^O}~*u(-yPrnV=-2`|E@DcDY zke2yNz<&_zFMAZ1N~T?%yJl}4Q&&bw?#7)z)`WjF;T#6-Hy$tj^b+%e-)=TcK~?sUVy(M z@IRvHE-HEzbROu$p%cP!3hz9;^HA?W*TeT6JTAP>bLRy7d=DbK5blY`4jVs%xLv55 zKz)OzQTVA~Iu*JGtwhWYtLl)yjl=ii1g06Jt-#V#WII|8S7+cXJ#sz?OLpaCS@4!ep!oet!2oc&JN?&% z`0a@ZdI$wh`i81jxo^bD!b2xr&n=xvKi^gF=RmjH&vip~#R=wnf^G}I3O1n_^%%CoH_xc3h}lIo1P=9GDfIbh+!H5l~>2`gs+%Ub_2a9+Qu!>2Kj zzv|jj%m5M-vQ`_ z!S{~WC#skfol{O?-Ozpg8C zZ-M^00Q`LcC?d#6!hqqH#eNAsitQ@`KBCq?W>Z#M-UYA&U>gSfF9Ns#@B+Z|0M7w9 z2jFax&mA(4opW|%d(bt@-_Ki?bAX(;jB|iou#Af#Z`*T=t!E`Kj=WZ z=NHes%dk6GZMrHqkd8Ss}vft!>5YH%$W0-jj* z27IcV4e4FT@i$lG@xY0Fk!>}FNhdStB4~ygidnmchd%M|Vs_~m9MoJ$jtSh~5IC`{<)0`-Y*|VSYybct07*naR2$1t z*m2>~7e6H8o%t$Ksc?>7={pDSO#r}NZ!rB`NeTesQb2%CfHlnN#B(9Q9GICPz|%=X zCmo?4y|`AzH(oqc;G(sIC@5;{{ZYJAQFij_ou|HQn~S%^hg~xL1)x8l8P0p2{P40_ zJ~A_!fna6`h9Dyf0b<=U@L!4rfasH4YW}0}z^7wC`CIk!Qah@b$|yL<=V7V5e63h# zc>VmmQNtgEA0(6(C{I|vPgd+>yWYrSOSWHHABzx5-SUObYY_dfyjp=cRmu^|lVhBBgX#1iT6{=j?HjvZvg&#jY0s@ zD`}?xp1q^0l2Fy)hA&}Q6DZW{*DrqQiI$7IOVE}9;2{45pifx2Sxj;Nr@tSQcD6)+ z2LgW-FOAIS=YvESgKiKJvK0I2Q;mGGYJb%mx|+P=J(ce^4J%nx zxzswzk5%U=nlJHy?d`7jg$JtmM}vg2i)RF)Ww*DRi%+4<^^Q0N4`O|};2NrhBf zz*5yar*v?hs&uMs)cUnon`a;b%mv)j0j(|%tIOqE=_XA>3xHK0wdf3U0b2n@;X{xV zIQ81PzMV9Ubd$d4R79tw%p7D5)Hy`vB7U9lYf!E^ZQz^>=KqR`3!a@J_}}`G9vgqV z!v;ERpvA`N#{ldC+%xUJUu3Pn4@>>^eFpt8M?irn1UM)Lz?f9D03N`N0UuE!8NrbR zAwY^sN(0B}0rr3_0NS#5k$tb@%Z?42z}WD#nvWi$uX1~s-!LeLc8KP-iUXvnw`kHc zIdM4dY+?m~zwpw-_|k)4PRpA0|CyluZ9(@U(5j;C4YYKy6$9A!@H&CW6smK0zkuiV z>jbg}a*ZNuLfIxTSJ52^CQ#Raz5#n@A7Y`vbibFi>IEK@u9*I)-r^5AXy1G1O-ZE? z?}WynsI35?s$O4Soc^v1{xhSJwE9PD?f+e0cx*)Tzsdq&Xbs>I1Bl%;^tVsSpr8~2 zM2opxqn_^TuzFF$7|s2MIYXr~N9|=zW2J4tcHL$3AxC$Xwg;y01nzO zOn18P_dkMXKJsh%?mq+QuK;}3`V_-`2&A>h&5O@n(K0nh+j=fT;Yy+S(Sj56t*kh=ny7ImVc?y?Y(L&9K0%~~_@MFH5;XfJMvPVm`I&<6 zf(85wWwWvg^cA(1;VJI=%;R|eyMN2BbzI>87ec?++LB$9LeNhEa{sWlezQCKIM_T% z@pPmt&}xqf9D8<9aqLy;xQ$+b2GgmN1)a=%D}r6@uo3vV2?I6(TskuR%p57d0%Z zICuZk&>sZk{eXUYS;Udf3w>b0y@$TJc=3@Vvj?6McoRkuN`;cDK5WUb-Y!+?y_$7h zu&|>BH-MEdc36Iexv*R5TBIw80TAa;5pXJOc9pGH5{(x>@m?p5$b>y+B08g&IiTwx z*C3pW!y1$`(FxSK0RC)#f>{vq0b zAHjbl&r;JEgaS7O_z3L~Tcj(D-i1J*w|5~ezyO{xDavK!|H#Je|5*>_oyP!v91jjU zRx}}vl2HiY010hJ3HqZTU;^j_a1%hMII4|ZeeZUhxwMXcb0@4SAZUM9(f*f;MX#8m z!2*Jgg06As`v%%ipnV6=Db&y4u{WjPIYGC!1In6!Yf5bQ9#aQ5al%Q@S<=W^gM%ji z@?PFy(v{JlP^q1>Ab=XyDuzlArO=7@D)6d8_w3Ho@9x+J6Dj|>?u(WQp1Uijw0O^f{&vN9{{W$vEBRGHm(_r}C{AUDz*sMS*0f1x| zfXD(WfsWlBm$tw5aI^8|Z>Wb?*Lx*B;MGyJq1O&mxk2=Ir73cM0&EEa$Oiyh4!je3 zFCI>&bmFIb((F3%g!smZUv#!5#i3Wgt3pLxC!UZARUAA0{NBm8F4#ZpL~;b`!1t>J zH;$jrOyZq?{GK9OcnvHPQz=M7gc^7(2O1li{*Su{6!lVnvL2~LdC1!5_ca6rr4Rs> zV4&nghvih2gX>Ff6VtYi1pokJ%l!EQkf>PDY|k9;Ll9T#5NH7F9>E+t3eF0z6nkG; z(2&fJizgsLT#fL69!$Z&Tye~V69T~F=(CUD+>7@HR{%ghDBuSH{S+!;MRH+4q<6dh z4!0j?LlNl|(!h!1qzCrsgkt@6kG(X~N$Z_blvB2{*gFQUtDx0D1Gfd~#6I1+V*~_v7MSFF>aY z=q~~CK_pjzvOmOf9Q*%#@$B~w`4f$SaMmtLNq*=0n0sK!AADO}btHx62 zR=NS{pcnwFz(+7q3=t%qs$VoteA_@VL90^|Gg9Y0F;`*^>Ky9lkf8l<6pad+2AC)@ z3wbUcYtm!>*E`J7Vhsz-Pd$cg^1f$603QPW`95g=`w)V61pLP>hx?_^@d4oDh5(N^ z7>05J`YgbI6bMA{-vC?y;$Ws*4iF7OfK{efV>EskK6(svl3h zw4cDs6oM%{F5M+uKP_r*D+Fg0Oevf|(7^Q$t_d%3DkB=mYY9RwkNz4Fc0shORPBQ` zKcGaf!and2whY3V#p&;gYt@$EKlTy_Kz}-y@BG4h60={`L0;Nsxy+>X*RZ|m=r85v z{jBwmEOgD#j8F6#_-D{>O#8C-e_04n1N-sq@b^+&;KMdL6r~O|umC7omb6!zl_CNd z%Xk0L2XN{BXHr}BalkzQ@L5fLfw5mOE{MpWMYXGL?SA92+t%OojA~#`LR<^80O-xy zrHRbRb*I0pOh*7N1nW-FuVV*0I5MAs-9pG6A$#GT6F-4)Zy~Pj#WhYQ>=kU)lhRPd zyG|Oa5WRR%9D01cefb9xcpM4=0O&^ndC1CH`@e#D3^@Yi{a&J-la~)HduZI(iZ*I1 zfU@2&NqHycy0Mg@^>`YG4w;to?>T}%g#7s$RzLc}=jS(=oGbtkm-&mynP&_A3lW`09@Esq=*TiLQpAN5<1f834%|FZpMLk}}_FTKgZHOuW)q>`nrVgSUMs{sDRXjrjnW%~+TJ^p9EPPdQZ zjxW9!FTCs1kOu+%89;t^`H53GjQZp*#`N z2TQv6V3iQy8o$t6>D8DnCp>)Jn>iJ5TfklkuT(nr&Uw#CPfk^IDjqY4&gpd~($7iG z1(>RHaO%(mA;3fhQzd3X%s|W^@3D4Ik2!kGdxf5RJxu$*Fwn~uw!~kbgZ%9a{s;RU zf{#)IiQ;%jH+-rJqYn|<20%JwvwyYcPe8w9@6w7LR-l<8UznycxL zUg4tP0PaC6H;ZY~{*MX@s`9`e zIGO(6r1V#n%V&uCvuM)0Jh_(|{>aP?!GGM23jp%n%kB7)F`67-959+F56x3M$#5wx zA5}hqMBS|*g&Yi@YrcI9$G`DroPFd^^Syos(7%P`|D4VKOA7!^>%}kHv+ok|ze;+q z+IzC`fcD7+po|0X%Fy586SoRZd{2NiSge*k>;afhr)Yd9+-t=(Uc5K|>JB{|8UQ;$ z1E@Eje{(VJrS#+gd^hqL*#t*hLFL0}+H|it_tt-~r;SNd&Nu5J*svL7y176ET{j z0P8Q_hsnjG;E@aV1Rn(YcM$j!1Rvtu2YfM2$2WDpyYLR7Jn2N}*=Y+Uq=n;}sCaP= zwR1fe9Y8uUOBWUTR?q@)YD)oP1Hsq+Rho7Ln8RWy&5UM?fPjQoh|R4QEu|MKl->)K z;sHH*@rxhW>$l!A0V?hPn7~bc0+1*2@%#SG_oHcNh0ttyK#N~1Q()Lio+>GMOfJtX zdwZl533IIVziTZ77zzOLoLSEX!(8%;SW)LNeCzdKz2Y{2e-U_DCA1HtUJNM#8Tqnx zdrMy7wy(Ye=k9wN?OiVbKMBZh0`lqHg0eMX8h{9Jt~>o*w{iQk-W~0%-$JRhSQbh1 zFJdt*d=LUytcwKxi9idl;QV8d1@I8m@uFN)S`?Z;Rf#6xesSHU%&zl_AtTj`zF{u+F*LYEC3oP zoCmZMh*OBVkQ<1f0N9y>enYgmNN_5GsR*VNoj}Ogg9WNe-up^s~p4x~Rol@OEk z_Ee`L>VtWr7lHOF9_m0j+ns*5U>W>Z`H5UU{*5=Su7?sF41-&h$8Tc#1F+1v0P!JR`hZ_E}&2@SBKfnD5UYNE0GGI0(KTmAC`HyOSC&|~n z?dfmBg-5=MnlTs+XXmo{a3$9bwbCprW_MR z-i9&p1;h*BoHWi}1?V|0K#4p;>=*GJDgX*`^lNX#%kTOuk|6SL0sM({XG9T(NVWz* zXvZ#h->Hq4Rwkl7grd?Ds_3xI86iMJ6+i8SIuo|7kZS_Wfa#u~59}pH3|v?1ivwlX zdUd1#gjxgsBEldD2%;6C>uj#|VnP6jT-<)~zVnMy-(zkXQjKd%^!4q4{9LB16T$Dl zrojmG^V|}1Tt5P#&t#4)3ubG09mjB_c{U1NqrmEF2h7}7+ahf*2mFs-wAfjd_p=1J z$`nbYxNe@W^Jo_>0xI`C$#zhbdL-Rn7+|H_zwj6?eB{^d=uZLiBg;gS%3+7}^A~r& z_P*C`zUTk;@JhA*>p|3I2WX`9~0A4+o$T;87lX)qsz9vvNKx8{i`sQE&~hZb8Ekdncpw>>%$e063_f zgJVml6!oI*V(Ad)1aKa33KM8Bx5s3cfTKMNy`ATn1wI5o1*E}LCb+A89gcQ_-DVHF zm|}Nxg5B?%VE6y>m_|gfEpm1)JbOoyjG5pkfpj;c<@_vZVh-ixSL^Z%zTxU+t#yZFv&@fk+*50(OeH?OES z1o>mfN`J#|0s7mAreZ_@S=s_QT7XpLayu+9L;CT(;jv+R#W&z_h~=J0|?PT!B|)=~J43r60@0R9yP|0f3hX~(6W`i>>dkBO+diwD z^dOb!oDKBmx`GCRy&Fb-HUTce%UZ||7qa119A+RdiJx}jcb)hKLf?z0iie1A zdYO2Yo(pwQ@#ut55!Z>5a<1EYECDnbVI@D9%STQ=Y>la+|JMM+gg}yl^c4?KY_kwvW_DAGrlfV+>!k#D>iXCCV<|5`|Ta1{U*WyyffML<=0b)K#vUE{?~K$!w=3dj_|6oLuir>Y83fm5JyfKywF zY8sZKn!eLxdc>Bunl09V-D5EAe-r|=SpeXp=|A!;3lxQ+5P(Pl$oOgjAEnTu+%G}X zAu~O|-rfyk_A7FKKwfpu*m0s-d7-q%@UU;xBLrx~a`vz>DXwzZO3n)j#vdMNd&^x| z`2j5~mi7Yc0Pfv-J=U?n8WxzL#q7H~OkIbG^O!UqO+#n{h!dzPL>h=pLT&)In8)~CC6F&#Y zTdhj7bp&_+;YX@Ewb?+8-4cdNRHcayat;g3mY@`QAzEK-Qx&Ho4iba_Di)Ta^7eig6N5b6x)-B}k>0@n5NHC}7yKtFK_QcW#WjzI zx#>^}yet*oKV$s(im0YnK1UyPUfK4M=9S48=X4Un0z~0L6jDTqK?g;TJ9qBKv&X)S zIXbMN!}g;cW_S0Pyx3!+ipB|C1Gon0okF84fH;5?5Zjv~wlsPO{x_kx3CISj4X6&7 zsQDnTe96~39Y}u&D?3v~=)Ksw;UelN(o;k!>M0kybKiDgZ+SeI*H7JhS-mW>CV4v) z0K9hSPm8kYKSlrvB>)QiAbIf2+_N?d~Onsp0<62oTN^>ue>JidYcVG<#jeJX=!6 zP}n!5oV-NtK{;N$93S={Sq3vn%K4oE)wM4pl}Mr%^9zQ8mD0kf63PsOF|{gXOhB1G z%4GW}jz9Hwy!7p#HSqtF0RH*@yynrYOaPg#qVQA%+ z*8jDa4iW&2P|g&ETc)>)ypIEGN&EQ`Jsztar(zb6P z8ki8kE!GX_Rp3A7%LV_da(P}|ygunLHy8p8;P37e>DC<`hV1_72dsxivA ztp=8tckKI6B?tf{WOO*{`@G5t#&roZCRI1fjG^MtsNRf6Wl^p*f7 zBqvl%1TrzB6i%qxz|&j+*emvznp{h!=3x4R2wg8gFX+9f6Jc+`iRdX%FZ3n^*z>y& zH!B*R@>_Fxx^?7Gy{Vjbml=Uu^rwS2RBIx~z`tDPYbfUN(WjNf#1OVrX4J$>L4Q)v zA0@IQ9?|cV0DLn04_{ESIA^|d6!UW@;E%tYg#aG|^yh0Uks)}6*w&-Ho%D{*7AAHf za1opc+Ta4fPJ#K2qQ7gHW?|cg?F2xNb^?R-;a49JSkfQB?fjpZlBR~&SNL0sit1_K# zoP0fi{|^aXd>}tz?Km*}E`o*Mz1uq|ywY(httiMo2(t|QPpGo(sT2*T&TPRZwHO!{ zWbcmnqLx4Qt1+?51d#v~3_yu}qca!2^rNI-x0e~J)Eg@w1@KSu@#9au4eKx8x8lKb zf3>Zd&Kqd-h-*@qP&u!t68i>=SP~*Y3#2M&uEQN&Z4ddMX69xI{LZB=k^lf807*naR7=P}Fe?Sz5hOENy>vHf zJMsb`mfHUy`5aFxKnIKSMsUdWNpa9C_xGz)mJb6qhR3evJPgW*O{>mXF_=s64U^*A z#NU$WRSI{3!gO2&7BFxIV1WiR+`082zIps9a{)ky$#-;^{7Q$3tyT$j<_4f~mBAnc z5IP8?fk-3N28ssOVI72x1>%kko9s6eUF)l1|j{J?EQMszk5(03Dp>Q6+0*eJO^An)y08Bu(LOAhU2+#noMMKm6lbuBE&9>irOKCAt_O7}I2;5?3 zJt)_hGai?qvn$oC=};`T+*9lO)WU$e9#MvztM3*$Zv*Pf;)GmY);A6X zZ25S;J4TKV&#_cTFYv{a4DaPf?lENM?dXu^hi1~*Spz}vR%HT^Fb4_{-Kki-O`?8F zO*_ZN$wzVF!Eab2juZSLf*-G26wfa6cEA00-%UkCgwjh-Rf>|FiLEQHTu{XXS|RyX zFkJ|`3CxdvCLi&7t|E#Pu6(d8>3o&IpBQTWHT3GCB>+bD z$L_c)mu@mfOUt0TruqF+8jHdl7q|8eByBw;y8#3tK#UrE+bu+vV?71O03pM6=)F2?ljt+F^2ckI73t8YP?~q#;CoSWF=TAplU2TSuWAXK46Pap@L!g}-=e?$ z>971>pL>{e7{*2l5)zAYjtKt8>8}R+116OP_y^!6YLp)Zd6hTCiIjamQ_#A^p`K2kLNY$)A3>VA4x+Rk0%TTI7F#~%jcHYD6eWjA=F^m zjAdf}5gZjneGPq9(ZOZc^Aj=~~eo71eSGpVw+Rh}~2>&wZ zudNKqw_EcvM4a~!TmZsFD=Pr0wgj*l+yLTxmyZ(oczNAn%GaP1p|=$P2m}8Va{-9S z+yH_*002<)`~+ac{Qp&+CNMLG2H9#SrwdzO{aCcsC^t*#KL_ysynFX&Kax!U>vvxF zhK@q(}lh^-ERVE#|oF-e;9flG-H%G~qfC%(Lou}l$VHdtHsWgvX} z0@rXY$Xn?qN|!4D2qZE=z1Fc06ws)d|Er^?Bj`j#NvJ?H2D-^!%Vi{|7!nGJjF-Ve zu`NO2zFf=-;8C7)L%V)CL9aSq{(ca+*l&B7^Y%M;m@aqT9@dYOWjWxhfsa))Q3d{C z!2$_HU8XGy*aBPtXtCLyz*;xOv}rL#hbdZ2zq5n;wFXWJRoJ3=4TBp1ZE2=H7;1}% zfG!0G5Cs2YZ);aJ2b%w1Pv&Nv{!nTv7_IL>Qd}zcYpcHc)t8sGe8u2UY;V!u;jcNC zu8jVqD48znVERj6iS-vV4Mzd~uJ9-Vl0@}=Ep-cqu$1L_%h;1aIp zV?b^GTc2No$MNgRQr-G~b=|-=OXe-hF(Crt@u#RY^F=Qiw4na%%b>qJcllbYtp!Tp zu)2$tD|y8IXhY$#{8j4F5~$-?#x@v$sa*h~6G8kw9uR=^3H(Qa8jGii2I2tGTsm6) zf`?*zhTn2H`l+x}=~ShIBC?Fp{GSErX8`@SKSNpx!(w6J=CS~20f|5f05rX%)8G8W z_jtBGyECk3dIpw^2+m{~0`MZAI z_J0cCkA!x{`I)6Kz@ED8Fa3p`_Ql(E^3aRsN<9tWsfS=1ZqtVMc*_OgwU{nP0IMac!k;nE}No_Mh}mW?cy{z3QBzjb-H1Xa^$2cP$6{_)N*!IBp&C z>JST99DoHH%(2l=F>Q7*MT-eqOg1`9q(dVvfPb6YV_2Wqq%eId#6tg)R6rG^v#`!h z=FrUKaX1@Y&$NR6EPN(Wf{O6r96)c2P3`*Kdxnj?{^eWr_iCg+R~U{&dn*bHMxtQr zq}&f>Mqxl91dzNx-(JUJ<6LmuBJ>!-@_#iPt0LN$T&MyLUd##rFjL$Ryok{z{D#xt zRiqh!U69>U8y&njdKnyqZz(ZU(->$6##!iUpZnKcsz0bZq?W_J;8;%!T9S&Ua%m_U z$TgQoj|`e*P<2@6=fV}G6y6DSQD7W zH>X(kNCDDFn2}nB4H4w!y$BHFy`qChZdrcj+{*I3FZ|*WLd8*~g$l)1oUy=oy^zze z`izRL1Q5zxNCx~nD6IuT=3EFcE&bhpmUcj_$}s z2#D#$BRKZdn-D$Rt;hND4k-I~771|acYBxdUd4P`9SgY-VAtS(TmTTur~jQNajyS7 za30XTDQ@rHi{sC|JwIWX>ta*V@}g2N+nY7}!K_~tU>3!s?cDdAL|s7OG3S z76GiCz7HEuzX^K}f5j{SJ_hh#l^rfqzZI-C-@NqMAG-6l2Y)%t>=a=LC=&bhoEBaC zR(dU_D{%pUg=G)GgFAsqa{~HcVI)GKiY;0zgm;P%J55Rh#i0Xm8sCEija}cU3RfM(%IlThC zf>W{nKQ@C6KhE_^nf|h$Vgq6)-(S7B@QN5#obJO^GN=!UPqeJr9-dsT}79Nw{h7(uspgOD_})j+3K_BM1XJ zS=J=3ACa>-miif?0p|?GOD&1UUd;umD&R!Xk~w`=x$+4;O#$PjT++pF_WS z!Os5>Apb3K>E0J{&nLetKvoSx0EG4xuQRpImXckz5J2V)<6O&dte~$l4}pJPrgJ&S zUb}e_XWsTjTYDTpj~*}K_ptSyXK}}mz8`LVmdyR_odpXY$%63mK3M=Du;o3=vB|na zUg0`|eO&_oeVALVF837z-2TPKaOUB!*!6$P1OOEjN(3E_kXZC*-`Vx&)WE6$${xl9VIQfGMju&{gM;{B{^F_a@@|MzDgV5ixA}8-}3b zfNNFt%YBa2kNX3#GnTk=XaAJOZ^`3KBR~@(L24lp=70%efEj6Wh^Qg(9~zeejKgS$ znO}$E0yKjEyE-`OZSqq<9U!*!M34xS*Y2hSZOO4{lc`S7I|(=%!7osX!E%V+UUeOE zx8Hr_`V8%_%Eui~x9D$){=|t1!{Q&y5P=%@i(`dVLJjCMTQ=F*Kormk2zda@GKlyL zgU9In_K9f>WgQ#cIAGzBuX6Lz-_@jZ{r1C$s(9Wu-I2oy0Ip{`eD53=29&=YbZphV zWW{g$wXFs%Ln{QPU&@wnq{ebfmiJlhujY&D2>r31Pl3luAX;A&=?SJ=$B^HM1Q&qf zE`sH7O2FvBWcn{Egi6CcMaI9WlS~Qh27uJU7=%4Q90iWR9(H%1eQekdBK{}rbx{ER zgY*+7=T2bl<@+kIR%-r-xkv61J#uf!{ms6!3#BNS&Hn#^cZwEX%&s2_W?^h(eSnoh zfU}?Y9M1m6@5ApbLW`YkKSjth#JT_Vt5|#CUL1SsjnE}fpH2Srnlo9DR`>g&|Bn*x z@(@4N$`6GAWj_D#N%WsA1Xl6+KJyf|oPec+C)^+&dTi%WKT$;Dz1#dWJP8W%|I{u;& zx(9&ir7LgVzUdX>4{H@bz0b?oPgxFeY;0c&r=z$pMUcIbyzhX#&%;Ww9cJX-abN~e zMLv!Xka}4kvd7eKreRs(p?A?hj@TA10)GajOP++xOAg_sNRT}ED2WIU-pL9ROV6tQ$+I?9soRsG z`Ealp)=w<<=&zSIB97hb@1xw#@RFM#2yhHePXtKsckitF2aDAc;uYQp^ZyUE z+VzX*CVOdr9Q2pvdX4!AHoK5}C_0Jz4xKo(P_%Gp#i2!GWi%mA&`N_=8Z0Cn3;XFD zacB#h$-V6kPyeHj{5bd@7nCgz z@%cJ&Y1=U&K-s3|%$?|;*7O{GcyB!%wx2(Xr+?w&*m~}4dY_#*bm2Y4ZHuNl))nu# zOYc0qN0#49s&BWPhpq+70RrQqXGflXQyO>p(_#E!IU2>~L397yT|ED8NJkOzKo@{N zi%R7Hb1N9&Ybjl!1wi&05pe|f1ZmNsI1maWx@S6WK60_UmArKtAYLk_@99MV_hN~2 z9F8B>l96_<8dyfE-LP&y!lN>jC2WVxNir`h&Rtp~75V(J`v{hg%dp=62#T18uEF=qzQx&iGb#FGy|O(+w*#b5I;DMQI3{vU z4QH+>6+T-~naaf)v+c&k%K-c`a{LzkrSeTce_TO-OD4)3 z`C!$DU-gbTIIVowB8vCoSv^q?s7S(=>pDGs2IF75I(9A> zyXl@q8|QM}A?>cZ?yx7Wg2clVwPD_(|AuSjzL!|c(2cH~^p{&%_ssG}W9JUf9IH`H z7zeat*q*VsxL;cJ)^DX7lV*hM7%-AjOG*MQ1?2krBfqhI=?mYU=Y&XL65^(*@4H;d7XM`MsmyzXX5ruSa17RrJIN^E80IGKjWWY$c8-{Tf%T0HOszTn&IJ zNM|`cEKa_Rm;S{kuz2na5HrQYgA2}2-3Q&;gx|ObK1f>?;5Wh@%OL4#>(O@SA5(}I z=?FFyQ4fZA0BB)uJEXbM#+hgb=Du?)eJiKS;iQ)N2WbdwhaDx*2X%$m;?P3UOO{U& zK?o4=8?)kTnUDvdzZ@(gl8cA-og>Evkm8ZbdHcH0wZp;gO12}+^_6Z}lvje6fwX47 zW7TN`Ff#mB$uT(DB*V0NP0noU{oVxu0IUP`7Nai*R0>lefzoU_j`j)(^Ev7yK#rQ* z3rMwg#o5$_88uFkofIa>!&&TdIKInCE9ftRf5)Wu7hzQYdoK}sRTsEXX?Cf*~`|xwRCd#bCQC zE^=zGB>i1w+5@nFE<6*h7D=E~(MqALXs7}n(T!8UnWAod$Ql^na{zwWYV6(qGNyli ze>fupOJA_7bt+%o;JVe(Sgv35GU-bA+zexIZJwU=^dnupzRQ>yetqw3B){s@9~Ox3 zSFh~h%Qgm)v@$)^?{aw6XnM_bX8o2VJyrb%%18ndqW`bHPk!h1%HqpqRn?Sq;ZR3ImW=^ zf`11zo%LT7kJrU#m!+5P4(X6CsRb4#rKC~1Q7H+jC8blkQ&JjKYUxx^nvaBZNF%kd z`|$nY`5R{DHTT?m-sh}g3RbtrS1&(EU-p%{?;Klz?lk9Xcp%ZdId?l~s;*t8b(#R3_WO`FhTu zC#BtYW;_z%04y+v;+#)r5xWS28PAT?E%L^)!t2%?u_1T^iA9Tq^;lc+5r8JZRt;Z@ zyeXeFgRL}E@Y6_HiP+O}v!dRX^Q&jpXsCOq-Ip=4t%nwztg|T}1k%4R;AUfvAcDUl zx-P{_4dprIZolof8D-r!+!@S!I%K+%-rsZWHxg@;_vl^LFU9NK6# z#7#EiGtqtaHh7m*i(+p|Jv{Me%TLe3CKVkT2zFR)Rb?g+kJ3YZ#GIet@_7h5^*?Dy$F3#42o&_p`p`7#Tm zSF&DUzt*|Pbvk6K@Q*j1W&5%G-=-Rn-yF}8)Qi8ypWaZY(XAtntu%)w>Q1)09$fFB zJ>aeUoWg6g7qyAj~r4=$A)fC3t|`euAa(c z{+1i`T*h%okzd+E(!>i_ro&EbqD|2oMqx*%&{C>SD0t7 z#_oGhdAZkz`-E&Nf7@Fh z>P5da#A6}WO|jKQUObqHE!rT?9b@_Iw>z0epe=uA2JzcNubq=SMGVIgdX$?Fq}=_P zO9_?;(rptN+CDi6oxFgv$?;$TiCatbtoR_X!;|x&N$ab&OtMHqImkzjo$DJ((wuuB{e>d=UAiI7Pn8 zvt7gU7=cm$kw*zeD3bzW>b0#@@Kz313#%_t1u^7V>1+tQBE`9c=WS2q_a(ks>fOo) znqjT^0)P85z!p|du-E=$op;jC9V_6|*rSeEGI(B0$rd^GU+#B<(^TgL+na_zH6eT< zJNX@!$dt?@!QBR+j%Ou6nm!V%JQAj$lcE)y(fu-81N@^wG%RZ2JbO1pKow}Ly-yOh zK+K$3G#?#qQEA}0l`ph?BkSkdavh3X;CLxT5W6AEzxPCBRnwRuN`Yc(Zi(mU8T{mh zV)0KCW~m@QL(X{KLU{!}_1EQUHavZTlaq%e-wY*pr(ztM{k#GCgP!Q3kWk2F4Z^10 z$6)>Sf_`5aw#t7*PGh-Wy?^Dz(nJ?(CB9j1Ll0Rh^!)o2LIc2xs38#|NA;jP6;M*- z&BZm{!+Wo@*1H;HQ*=K`4d~%n@&4jdK`Kg|k~+f*phgL&fd)~+C(5dnWfyfDuSPj} z5rfU2PVW@a(qE=k`kE$GzPy~1>S`(Dxe1D$tFPLUxSqEO>r_xnT`TDd2L9+T1dL%JP(gR9Z-8*D_;i|3OX)+d~uM`N5@8J*0BSri1^(E z_7g1c#{<6Pnc_`#()f`~5iSz8(iBN?1AFS1e7hT9N+Swqsxh8_`v~|85tFD7b6^C| zpZK4(goCg1pCT{|h({(kEK<;jT9+N`|3b37hywy=72KuQ6n)}Rn7qVHYM=%d;*CG$ zS)rQazN>2%`w?x05OKBRy-&zoL&PQIwN6D@6g$s@kdJbI`_ihZ)pO&?AkYMYsyfOa z*)=XSVy6PcX3JQ>*9WFQ(oR!>HHqgTt=q*bLLowXZ~dcX^MtLwF!bnj1WO`V8`Qvm%m<`3;=u zRSAv$aJJX)Ibmi$j!m3cAucA1!u(NTK zS1qyk>J%O1cl(D5Pu+;_G`qyTsO)CpwmO9H@Gw#{gMR8RD(a``2TOXG=zY>bXA`}q zrW$FzS)%m6^U`n6{vC$>dP=Y3=MHWNH?_}Ufc*fhmN3#q<`;Jthy`SgIGIVQDt`9} z2VSxhb5~JOd8MD~arxCNHgw{~F*>|!FixlK@Mc&uV<5syNjeyG5<+y+lOr)ha~y=@ zxN_qE`(LZCKZ9vP#ZUCC zQY;peZ$7&5vihB3?&N=?kjqZYUz)-9KlMu~!G0QBMj8z!+N>w=cr(l&AE(R7h?pi_ zCTY}3=IOd`Ap7^mJGnm?zO_jTW`$5R+cj?VP+drW7)GYLn&y}&RMnNnxptM?+HT_D zLurxuUWGO;K7eCz&J5n@`yD!?G81L|_e{|HvjqyNN?ba9kd%atPD7)2s}X<$ z*;*JYYYqk%1hWSvhkijemH)pNAS8+OIy$>|Ov}{S!$3I|bU!%5{}Yl!(TaYvw(<1W zs$m5aU~n`V@yssQ;d0gBzk(&{>Xz-R)kDx{C0r8R5*5OC$OvWZUA8>ivq5a?Rbn;a zs~^YnSzaK;%-;JSheF0yOoJWF1U6%97K}5`^y;JH`d!sLg5~DlTUFgB?J&e>b{Z;- z1@f#Y5xlo*w47F97T;$pd%VRzQuHdYRKz5^eu)=!WS0=q%^rJTO1H;6UM1J=t;{14 zLuNL3&jTfVD@z_vTS|iOWu~F7%NO`bT)1uH)(& zh29#?3_&fk&VxoXWJWK{ks&H4$Aov2_9pN4nF@#84rmj5PIz1jG4CJ8B+S^<=n{U; z76AJ6>wXfYeg-fOF@rOo9{8B)(JRLv8#f^r3@05w+1RcIM81byYzb-K%)jas!k>up zfDUP4#x16g&;Cm08Ea|>$$a`uP@OfNbA!y{JQMmBn4eEPiH_4*4=ub;`uju_f|j91 zki7o59%rg}V!guupDZQ#q0K>#8b-1{xq2h}5b!f;4??N;VYI`zABgSfHAO-!(!}pv zzJV(Nr`7A_$6Zbo907z&jNe!{ok&-{<7xT-?^2ZV_#uXi+96-?Kwud&xsp4yzjmyNp5+LrsnKqx1mdOg!Kajyb zVMVeDM;ruT*_0)Nc5?F!9=!~0A`YguC=-ryNmU}o)qu^7+@p?unSf(6*R5xUht*w^ zU*E2|Ngk9OeU{IYpR2AuHdm3s&Q_ZEsLm%Q5>DDE6)6RaANh1zk}YEZn=R5fiE=09 z44G+w8srQVG5y9~J%)fsBav^lN~HlBx-yDKDB7pQg`}a+-0WV7lcxSE2ghkHcCR*0 za%MWujxVqT{>9|}+=i?h-=b;I826Fx+bWHr9p(vYq-r<|!+zR>{Q3!JnCd8t5HaM- zN@)b}+RQiES0u14LW2&9<+ozF&F@b#^B)U@FyaU(mm#ua=~4^~C9$)~YUoYBH;Zi{ z6vLYdGdsR1&1wt%xwghN%UJHQJ!@xKuoRVg;A@k`d8f-mL+I<0=AkJ7ti@i0fEpO| zergW|Sne@F>Oj#Hx}Tj*HyP-{hMiQ-aZe2gnWpyi=F?A%jPP-C5puu`o%mmo-*n_r z)_=ucgTf53d>%qUTT>qRaa&gd#}=mqMuuXsQnS$jhn)oNgyNyTpVXFXK<(GP(mLdDf?$9>qm&YO5XidOA()W!uz+B#UmpL&mt%4=uG?UeS8JI1t&^2pfx{~78Aes#!* zfEC_W?*Hkn{9?}6rrX2$vg)_ZeTuW?dv?AfA;D>sI+6vi*CwIQG!gf9^ z@M+OUeLi%i@#MJ2s?kFwMH!l)n4v-WywI$mxC=MgMZMjhSUyF!MRZT$e3~f4l1%Zt zq3cu(S)NQ7U&%I0D_NDcnjq|s8g76!kMj^F(Ey-7;d!1kHGpZ`$#7~J+<$n=+J!1UAXc*O%r6}$_13AEJ@KN)rB*wQv`Z@8MA}MGQ8}=u zSsfMsZdY)cA~B!2GtXmVO#v3K6x|F+ovtKuk2~r?Rk3^v@e%1JA90ibREoRB5!=XM z>O^PGE2TYsTYyrur|&LHeFR>_0iVh4rO<-SD1B#Gv;JMZ2p?pn4|MF@^83NWxpq8t zpRRKC$Ql-#;DtQmdJl#@0e02Iqyc~mGxyDMLoX~S^ z*>hHNuMbJQiB#bqv&KEgu7LLeJd;UzLl@ZxnMt8_3q~%1w$DRS0>9C~4f|tP6_Ea{*0mSM#R7a;0 z-<2cX7W2-*ZtRt5zF8y;3d`%Gqx)E2O&oZT_czcY>D$0cayB_57`r;HJH)P;yQ_(P#kNj(ex+$|DUZ(<5750~Z( zly#{UsJwJ$Cy6Z>zw?7{TDXAC1xl`L^40j3L8N7br4R-9mt}L{Q(9#N60N7{l$oKq z%UuCoQL184yLz2Ms`gei4=v^^UL3PW$Rdu0FD18-vEA<_EF`E97=g+$y zETX^<3`H-K_%^bM!oinP7or*tNC6i(*7Y-QM^=3zYQUkE{O+Z}8gb~ug|DOgtWxp3 z;`4v#D!Z4CRY?;2jskNS@Kif++qN4fv3D|{vl5frb3rz>LIw?WuhM+%id%fKN`l6u z0JNbGZwmqrkWzvp34I{a=tiL;nP%MQYavruoL`uNnKmusN}D#hRSDmZsz1wE3V9kf zR1|4ItNTwBaP7QHFhv32e0;5x zD3&}r$Qo)bp8`04>-kmk+-mnB6XqVtVtYJN1w|hV@2;v(6FPWdKqu``G*MJl$NFP- zp5_?7!EXW@7PyfaRa||9Ew3)}>mLfGX~-?DR)eu>7Sy;Dc|R2ysk3RFJmqrOjjogs zBhhty$^@&+jv(N}Nnev);+^W90*O$3JND4Q*&Uju1(f(|0doAQb~1iIFyR5<58xZd zsVK~OGg$R1S^N!P9D1{px?I_5$?W_)vn}E3*!M2-b0gm~OiMT~ewy#xTXa!`?uEjqpfe`in zR4wRzQC_GQeucr&tp%08zq$El%iAwU>)#kQk4j{2F}dMViKl=vF}106!?d}Jsr&NS zshQ~Raf}4*H+3_=6g40(0Vf-H zx=0L2P}rHQ1O)Ed6OoHvaIwr)uEk zf{UxZ@RWf6lE^vNu%#}3rP~^|lX092)pALEk`F7{UNt3RO$J;F)KMk?#~&PPv2&Q;S9uOz^3f|#Z*9W($`@2R!4QQ+@+3J zPZhzt8`%P{C4C+~nIPuZ%amrTj3nb%GKp~plCc@)9(iu@)Wvz37~7!n@zx(1Cb1{3Gd?2J15~)tW=2dFGrb}tcYU_;7~ayO7Z*asZ`6%AGo*)8y!7u=XoGlKiK=Vc?-#ur_?QEx77oEPz}I;S zF2%d$bU{x)Yyy(f#~J+Dexc8H!tX*S;Ogqd5il^VOoG@$8AI!KE6W9<2SEF)(T$Th zh_&4OF~AaQ-SS-gS;9kdzx68S%s32l`b$XA3o$L~>tX2`;3C2}(Hj1ma@-%8g3B8H zpJ)nw8<7`n9;FPi+7l=)?~3P-9Q?><;x|$W;{ujp4RwrVA63$W5pI!pY@>x-2-^u# zQGI=Vc7vj37!HTszmoCQElzzbRThm@AdDIi9;5``*>qEs;xhzDvNc*|@mG`$i8j)^ zIRC%`HSEn@N%~(JLJGX_Yp-tj{a07s={#2IW&6mid}zNw%WSQN6M-7-8Fg=tSkX`s zTmE>7f|Z;1!Njt1(7~Ef#0^tSQ@dFWg79b0zOL#ITwG`0=JjJl#y0v>&ov2gGzcR6 zPNE^6exMg?j>$Hnl%TB)vjlrtYzw1?~2htlBKw+G){JS`U|kL+W96VIo7 z+gr`=MWEsiOqZBZGb??Mv&lZOhV(uNDR1n!Wt9||oe!kN>p`o~S_Fc(%VQGC)d{EPbiXMNpizCnbaj!`Sgc!_WXZofe` zenH80E}pW5UD$6%)b%>;GPn7Jy$r){;_bbHJ@3ocBAJz6f+$H%v?14e{>d@#PgX;P z6`R91Ft-J4_~8q~znqwO<_sjgsn3cmnFPD&p5LF``)xX6sJ^LF-2N5}zl&80HfJ+J zqQMuLYdyaBh(ECV9L2o35ACL=;-Mi9oRh_m;|%r>-q#^JX}zz`ZuQ6i*6d+x(L4f- z;zcS_)+Q6UL{!g1{2sYl&(Z4bB2m;Y^*kIfZ(1pFE+eO+2Eee z{Y9g)poWmQxt59Fe$9~SZKPna6D3iJ`e`8SX|+_<*ghiF8iGZ&8H0YQ>E{gT7Um%qGC85a(t{Rs7@kfA}{))~Qto}YcvH8kWTG6FQ{Hz%=0iG`}~ z6Unlm)3%!ULORb32MtZ9H}|p!*Rqz~Q%(!|s9(|1bPWgR*vgEpcFLh%Ud9 z^uO;F^27_aN{`#$zW0Xgp2yMaEPq)g{JwM-2xS`&s7lZrfH{M#cyR9TPivy1Pm2`D zKsCQ~9WoWAiGp*9ayI@6q>wKzbM+MdlFLfz#m4F3O_GXV>WCOk(TV{5bRti*6Kwt+ ztO1FOS<@?3ZfioX2%|GR%3>0Ji`8yP29U)nn;iFkLov7bzz$J0m%nwH}i zscFC;ej0;U%{Mk+Gr;cRIe4p`#GLc$d`~Nw8t!x(j5D%w>)|^B!k^*xTguSaX=lr#Bbm_QwE~Mz@7$pJ2_pc?@*%zD;%;fefgQ0%}p=Fx#uD7{op+YO3 zn~sY1sl7dY{rCa}6Bj$yw z+Q+q+fo4O;{q3eB{fHdO8>hlt@gl!G^xPz^?R`T5$PZ^|93EzMeTK`L6Lp}m zC?y#lN)9K%4?Q`Wn!IyyR^cNNkG5X@LM{-B3AVJZLjae|qHL~|pJw7;7P6*2_J4Jf+R}(#fVq5h*xBnQY?r!tf^MMRc8Q{z7oiLt z1cVJ`H%CntW>gkcMr&q)tbr_b6#<0P?W9Z55{zQJ8`A;!oN@c_8R)65!@}ppNoh)) zW~Xk71nr68u)nsZ+FIK2GIkOoTx6m$?|1V-or~#>OTa|IXBT<20cEZh-rU-V_8?zy5vvE80Y; z?k|Cj{N<;P4?63OBxsSgH-2UH+@2qlf|poV$AXTMU(k~u%7+pU#*+k|CK#h}G0nVj zjTE-gO%x9LmnHDp&F@b#tWNvV!?tm9_!=Dj^Ezhox^rGx?Cal;RiAwGPG4 z=~sjai|4YMgJu9@6>{X^GcYCVBhYHP!$>AbxxkmzlkL#OO|4+xUd)+ z|GJhd4O1g}xR#B)K@HzP(q=2!m4nU#>DUuL!9_2zubjFnDTOq%oC>zjIJt6{PuRSNI$|ILg-mae*cJ}WB13u(ZP~39 zT@jk?V3R|xWL)m?3;>H9h)gOmZ2=l+85^ebp;}a8Yz>9ju#QG-)l26Yo7E{_4{3X{ ziM8t~V!CJi28MdX)BqMgf<_hnm^__EF;+D-potw;ta`iz>QL zGSQ_t(UBY_XbkUc>=-?;R2478<^fC7%XJ2`hhH4#GShVy*=r*1I_yamC9i~fZ%s-q z5gXvmPpqX_4LajHJd=iDcfpo!vPMC>a42QGX3uLVv#^OxLmlMa_7F|F=_vZ3mHT~u z90QBLkm0vhm7@f(xTe8lo{aj;Xe!>x%-}RUFuyu3!*T%rEm0i*^J3g<;4lAAY(&$M zq5&v+xh^!JJsjHoi^2VEJNE{>MrB zySI+XLc)20=)IXCPEj@*YOfw2?)B)DN;g@($8S*OFid&eX-#LE-%J=Nj;^fg8U+~TF_&W4eYSQ@Q zv}!1+3$rcdfJlC~^t0pWs!&uFj~3RE09xUGp+Oifm6}K4wW7pEy*(u%kws|)7?}ZC zS<2CBBO~D>22J4PhX5{DWLe<#8Fs>WW==u=onCBz@7RkNmxGT*6#`FxDDi`;qTl=4 zc^(=U7AT%kYa3AN&B2BHT&cj<&4@ewg|>J7rC*NF|Mia0$5{~T1sgc#jze)&;@O0S zO@Bu%sA7mxdw5v<*HR}C{=!I8`RhMHI8Voi6I!{(VceM-Y8gkK81X<;8-FfDu==1l zT#_-%;kBx;3ex}j#D0hh%Ut- zvErw%nzYtT_$8hTX3SM#jJ?VFGie<_4bT}Byo!H}qu1r6a8d#XBe_rjl25i}0R9SOzb6HIeNXQ7SS5-^; zd|vL{!pJq=pMieh<)Z!L1_5;CI zi=tMe;3DYJZ^i$T2h3GrpMPD~d*Uw4KS5+9eOID8Z~Jt7{baw;kD@{0U^HyzY)gvV z0lQ&li0bTPQ$2&+z3tW7ogm3SQGq0ei+L(f9c#T0@RrP=!zKwts85nsBHFTE_IgF} zZA|H`3n$m}cz)|s4LQTp+VypDgc)55j~_i!@e-O<7K(C5G;&DQR~RcVy`@K2=D5URuV}(vk!H8p74Yn$OZrQPu`GP2^6yr8nkTu@cE({EJe|j~M6($_=>dve)iG zPSw7}=4YT(h`WM5vf=hcoYn$V^_bRd3Y%CF0A5^OX@VMYc+o|B<}1V7wZ@*$QcI={ zH9=H~vNwNzY4TE~OFE~hm9DB7{G?7dS8D%>0Zj$?MT1OL!eVYwf9t<=Zj!Sl8eea8 za4GOZCidBl@-79UQ_2Ff=eru0dvyC%?~u0b%$WhfT*l#-g$T|f7SIh0gUTzDFsK0o zm#|0HnJ`5jsOM;u{%l-pdc82%QP(3K3jC@t+*CsI)U?Fg4~}dq@9j@nve@T^H@wE1 z>Hp6Zd`FvxH~3b7^tBOby}G$6`tkQ#k-w^Gf61H1hw<))-;*v~IIXa3bE`D_cPq|W zHK6oHSanmecIQL!btVZF^s8F`-wP1NPmpGYC2=WSOw1(vr~rPBp^KKF^|cC}8hiUN z%0U%+H9@RnQ4J#>sQmI^uCX#?ZqKJ;b*11xoad|N(rJowUPMr83<)xb3sO<`me^MUJ^lYedlf{Amv z-|lYl>u7zA1!(6EL_qG_pK(35yFVx~3aByCT1U-JT?zBf^vxiwrK!glQC^8~C9Wyy zS3;e?e)n*exW0SU2JmctbyLo~y*OJ!VPQZ;mMN%vafLQK2Q3sX0VU~OXMY+ChW+zR zYtQl|eUVxk%aAkavkmgNq~y(sd7{LgtLJ}T2Gkx?{8NG{)+X2eew)~f;Y;Yr3H=)U zH!7hW6IWC5_B!~#j`9~a`vVIx(UoWL2$M)xHuA%7F{xg?%jMOS90V&brp!bdST0I! zvx9i;u4gagJ{dxg)gRxKux* zLwpt8|x7EAi#8U>1d1Bf?)byZo^m+<_b ze3hPIBZh^oE3ks&4Os_bgC3bScqh`3M{FwnK-#@0#qFiCXMU~O%=yvfGF9dAIMU@1 zLjbno1&1*9ajX^gv0g1^jPt^qnzaB@u)p4OlB|kAxRTw>8|h}YS)dM-Wj*Y$(8}Ak zOSzq86YA{FqLg67)G68tuEzNXN$cY_l`sL4rNaEh_SMv*!?A&Qxfj@Fv7eiZf_|Gk zjNwTa0-Hi6py&p^I6fH>*F3T~W9w%Eul{7InWz)b8n1TED*PkFzl-DC4*Bx&p`#MR z1@twrnowPZ`Jc~7Zu$DPEJc-#=x-0RdVR> zk$6Duf@p0N-FxAT8V5g9g7KwbJ3>U~DXnj7* zCSvKlOoG&$C+D!QO{$zuxe_N?Lk{f`x14y|%_|IHKZH|&;@6`bu)vq4p(1RTQ}99a ziL*?cNuCONMmLt8pd!E2vp|*U4Ji8jE&0@soj)c*Vhe!AA%<^0RD_Py1&)91#r%yi zn&{7;WZDrBfa^gckV5eD{WE za=&q69272&f}J}{?BPaP??!tFvDETEvfBKPCu6Q`?WdnnpUIFK2)Bsk4@n!>4+Fxs z^!}aKy_P-AfobZBc0oS%>v_3v|3t2JwhB_Eb5M0|LhjDUkVUXnEy7H-uRc}Y?8bsq zsR5OPS*njeX6;85{06?jW&jGla=$O3`#O=dA!5uzAo{>M;F{yE9!jEiO zNK;pq&NIlbeaZeBg#yKVpXUd=O`awI1skW-EgN*#NxkSV#an;=q5i19|00^Cgr>b4 zcM5_tmSw6^ulj<~5g^c1=7tzV#}wv*kQ8oz_jiHbr*6ncaH0Qyd3C*z!z)+sZUV1- zS3Egqa3zNnLiyNv`X#OJ(00NXgK2~pABC{L_j6eKD^_6fe9`Gu!5u!o7pE3gbF`Qz z7@Of8@fesrlssJRbK%O_+qQ3?Fc~>@oPzqExDWf^UJMA?LtP8_e3toX4&qpwgpu5R z*wO+EmtX?|pFxycllR)mJzp%C{h)QA417fKWe+q*90ybGY_nt;mg?zF98W}m6=4?j zth|%RU`mvp<7p=K*c*^NvO0LIC-~(?5$_L6x5x~3=IL2&5Sr@Ns<;)V1YRH~Ld4Fq z*n9O(X5?4KrdF2xg5mgm5-Pbn%p6;4!ze5XPZfavQ$u538<@Y$HCzC-JDBOr)aa^~ zfS*yg#Je_suG3A+(x=(@rZdqCU8)p0b=BlYTx?OSsi4m;EU_*e|3p3i9Zcg8a;vAc z#M^YKxW`ck+}UO#>@EviPq&V-ifNP-=*n1^ACTo=8li*VfcNgIPPFE(02oIZ&2 zah}xE{~gB(Hm^(TC&fK{ zWwD6S&KumGwJ;<`xF8Ysrc2z7h5jopQtR1p#J@o$%=w8n%9WFDbpA1F*Pgv7ukXv> z56z?NLYj|{S~Cf3KBO3sW}~|z5U|xd0PDm(Zc)%t%q#wLdMu`q>RvOJcR<| z*LL_z<5i^GrDq(+pYSs(v>B_vH$pG3Y%Qi$Kq@B%8CwlcW4HK}iy-$~y14!?qU~B! zJUy+WGeErE;p|VUWyM<(U;l?p{L$cwlxa_psmQVo!>({@=iV(-=7vgy;;||iQOwrf zONENGv-*i1S?wz^g8S(GdGJT@)rM_b@9Bqk^a&qZqN5G_;u%45F}9o@6#@kj`9`nQ zP1DPLa%FLUr~AG|8HCidg8}w3A^~X%WKtjGcjj%8(53;|(2?zA6@J9S(}rNM39>jsO#UoH^U(+nZ`M`pYn*(5APc_*x%~WkhYy1O1uyGZ9m-!XDBrJvSb@?2Z z;Q0)oAdHhqV##K@FYUPMK7SMbx>8jE+MCWjh`rVULOl?aSWZ&D?)yxZ{qHQhf~J0H zdi;lU&l2)5pV}?&by8?*p;X(kjxb>n#{Lw*j+}VUvOe{DI`x|R6EOz5tAqmXl73or zZuoWGZ4C!4o_)~l5dsZ1Xz zs2SZ<5#r6%3Y)^FiFHT&c$M8Neh3zv$^J`_T-~UoXMOvTG*>^?cp=o;fwhv`5#0JY z{8Wob46!ukqz(PYxb}}0(%=j7tJ-YtT*<;~IPn>U?LcJ@2+T?6DxUaixxRe#LdGRu zZ~6Odbu*Y%1BTI`OB z!&Rc2idiI29HDn@tX@rx3C|Qxcz<8hu*7g6(Gu_FtWE-mm{AM)yW4_c`AUe=uOynQ zGHC#Dl=hRmEP8dqY>g0$=h+++3Yh4!b(gimEoU_j3-mC(j^RKK>b06N*HGAQpl6#p21UEci zU=%(RXQ2MH?jz;f-MUc}hVOPeD`PwkRZS!E@tXal_eRRnG(Pf^=~N5w1#8RcL@?pU z7`T_u#D>jNdPxYR*6s&G0&ZkpY1bpX*=P`_xJmxnp<*DzW|xzg=UgKk8r%6d#1n#0 zLeT;&@khVpu@3thaIBtIw!@cdI>|fTSwREEY)@5?d2|8W!l-2eSw-1iw`p6~w(x(h z-HEMf?VuSP8pIgxVF=87HLBw)rB3*11280r#Vq%#!AT?5b{?fw~7Vsrakp* zlSV@y^vRb|vn?C|TBDLZ3_+UsHnNZj(|6=jamWif#!cp1JQ1+0D5l?Wj$+ES8CJ$i z6WnVgc_-i3>$k94XZV#Jufxk^8-y#dTrT zCTy3lSql#`LyXRFefA^8v)-#mztAEj6^o`55MZ@t_pl4xxMk?Rp1Ns1rW~Pi>(y$( zMdLYiK@lN@Cq3{r73AFrU7p`?*B5kdd-zB!eY#Qzj~6Ir+6U*EHfzG>+Zc$S>8Rz6 z$PiG>*vTD-AT$TtC8(IbYJ-e$CD?Z-_r9UeNT|_0Www0|dkncVZv)g&^09lhW2;s& z!g^;YOSimdRo@@L*$0mx470$Fw91;B57wN8o4oi+EmRBeyCf{d%)y#z%+LjzqHEEi zZP0~Be`9{;EUYAEX@%muLxWhL*XOk8_gpT z=Qx7zzNdXi=!>TmjNzT#kI`0-=eb6od%NtaRgw2ouKnPhrRZlyjMgR(VhOP!Oq#&a zS0|MqDO{fm0YtwnLzMk>sqxi_uE#D`($ z^g`!eW_zAF?#datjDxZde@!H~c3UN{H!#Vo1|aj_e_#5!+GBlxXnBbDDxphMb6g;7 zjL^87P_C&G=VVolbBy$l*%SMJ0!yt1ua|SgUsE}NOtdHk2+WM9qN0rKSG)g}|FyK# zp7i?mkrlyzmJ>#=YR)hDgp>N;%6R;DSI3nsGg|sHr|5T};;&?vBThsEvcmbje%~h~ zRlj9_5++jDjEF*DlU2YMR3i6$687HWRbX0%C@J!~)~&TBSHW*m84$!Tfm_(mFa_2J zCIyf2zmhUjIEZnq+{P;GcQ^&*e?%(H_U}P3HSnO!)H3P9Bq@LimSGy+ps?JQw|LH% zyWo*#E;;JVSO~myQ%DewHigAp^WX#h1*ATeLy{ss&;>)QdBl0TP2$7gx%zp^pLiQX zT@%BjB|q^bt4-L|+DU118$Lrim0XPN%so*@`;L^_@6#^d@~8UV{jG(Cf2qHklNI%B z=8%_0Hg0Zx)?psj53!_uHWRPX{nqDvKWAB7-54CE^>E;EVS2HV$a~fTt{cHnk9~+nfdAO+?IC{!ZFM-qCxH(hauOPyq@Ei`8V_B zNQ3wyrnxffRq%!4qp8A3vw*)?zBZSmmc3>9B^QFv+oU#%JE$=RyrdDZCZZ8|*n>P0 z0m6QpbqcYD&Uz$KYTtoA_5uNwqz_ZkRYGrwI@C@^y9W!gJvJ?UDOUI_zzX-48`7ot z`(3ik!K6fnJd+#lU&%0L<{YN+T@zW_wm%MGD{g}_&@_tqN8fQLWpV%b5MM%+{SU1d zh2>9|SoMCk^x)px?Mk*yF)s|=#ik{z$1Tsx#nkG-1-5)tdSu)TrdE51SN=@YDNYnW z6TVCj&2yeXpNmfbux36dOqHaK2p+7?pdo^ynclBo*=iyj1&XFIcp7*1oou*3xJWcl zmX_~iC`|a6Qj$$ePU21G#3W=Qf`IgR6j>%Pqrn0ADOFH4lJ$bPG;lbDPoip8u0jG) z*@`{-W&SFQsod{*9I;=MT^r+F&|xtVob4s$^)+7oj+|e4kVw+>nk2saiS^c~j^Pw! zNb1=Av(PB|v_pv}ep)JUGP9y(#;5n~3r{ykX#Kt0$I{DcEi+O62Drg{&n$T?C)ip4 zeV8`?^r;=wb2-*H7h-q>T>Hmu6n4_g-{q4$28Dndd=EwP{4kD1Y5u{u7(y#dL+7zQ zxG26jEra1`gyxOH$)#e!S?@VhFTd=n%T}Z*T=T>-U{>Qv!EF@39^qQZq|QJ`l{b_6 zc)C7-5q--=P{4Z$SLu2818nL$hN!tba6Dzdta(r#!U=eYbhLhHCj*Wl5p>$@=j_sc z!Q2F&jp)0j-l^<%Vhah5Hr6H?sKFz}M_Y6-S>c?NS#$R9Gh%w57{fqA(trWG7BVZf z|Dv8x>$pm!BPfiw!ldI!$YZnd|7bevwy3_hi=PR)ySoJh38jY=q+2=!1-^7iGXqF> zr;9|)yk~$eJrFOB0ak2}TkQ9UbE-cS zfFu)Sa9mM`rFtct1l}T&grs?sc|y+mpCI@x$kip5%C z6RjOSOdXOCzYss7RFNe=tVYT>Ncr>xb&y`)f3!+-;THI-eOAJm9{QBm9nvvm!S@_ANuiMMazipF+ZGuottXP!>8=~UV}$L?&53sUg)*Xh zm#}&zBQu5&)=j^qGJR*|GX&vI7_#42r3$rt!~>7rB7k{3QbZ`7EGNfrdh+)|gFb5IV_T1mbC&k!MkaB#)Wyb{DmKTaKpzt{1 zndt*_G0l(E7CABUG9`$tqMnUQoYSBce_Lf7S9-nZEYhaN^Ih}j*PIG9d+B>$MMam|`|o44=MOiiZ)ixARG0JnvjVuyLl}A(A;WBz5^4KR%Lj6i3%w^mYMDq~he*1g zjayPL2lG4`&NN8kQ)MlT59PSmnPpPrNx<_67#BqJO;<%xDi|W}MLy6&$6_wyx;vgm zOiPmhd|~K&SRBar_cjdU-VEzbI>MRYvZjHX`)7^X9Bmky#kx@6WrPw?{a`LZXdTKZ zx-(hMx{kHu43#D?eiX=p78@0EiNVsZv^XaTY0g@p=V7)>_n7yzp&95$24`8FCo}+= zw3G}*2_-dRKcspSVrN<3x9QZB(jjesfx30I-iSzB{c2vkAzTL2?p8Uhi7AFhMedIxS@`p<57 zV-3M#w`Evvd*+rg%5-joNEq}u;F=*G=e|LvrLIT2xexz819C4}|^t0n-<%ZSaHPXbDY3C%r!Q9He z`kTb{Qu#v!PP5o(v`(@$E5(1h(>)v&Xl)%=T+T-GYV%Wq(R@E;0R6lHQ1O1zo^MQ_ zS7I+t$`2wHchfoUSqnC!|B$xpk-i(o^w$nY5M%X%`S|N#h(@B|noCq%K_(BOti(@j zr&bC#7hwzD({Euf@0TS|RZWJSYrluccea)}E2?a+i7Rr+e{kzE(3gi#TyDpMrl>xL1kRo)f6>vZ)>Kb>VrX1v$EBVhofVx& zMas!x_{Oy?aDN~depGbmdbjZlmM&|B7v`S;YTG%2cu9ufzDCTgqVsn9mJ41bql*bD4?frzyS+Io7O#7(e-goye}%~h2_}jV)zi28V!;Zi zYS;$d;A%^n(~4Bnj%#UIf?W2sWjry=BzKP_cCOoi^Jr+{4lIr_&DIBqodp*q954i9 z9@-|XI3~(j&9`q+r&PXq;eeTg7bInb703Um=g5YEtzotS&i{xF$cj}vZ7>?;_16t1 zOEK>;(tGT3e|y)0-53isAmX38+9z|U4}EjBLfD$VBl`48l%oa1K_ti;sXr9#>oLZr>3NgV`@&QB@Cz&Ln|=>V^di;+D8w%2~}z7Cuw@UU|NqsT-gC~!bFa-(MDhFA)*|MwOZV<#-4 zB^CB~>%cMz+?}BOpuCx!R&qkiAhspAV#xg}Pg0Wb`OU`5Nxz%MrSARjrfZi0W+hL| zZ1rd(6C^_{CWzV49%*yr zB3vS$v!+$^OFbF9za1!c*87F+r!~8CisJl?ehXg5q1LO=w9bj~FO^q?%8+3a%k-LCxa$0f>KuvH@13(bdls6w3JHB(hGmr-BJR zatH^^zEcIuV7>UM`tW3(7z@F>JNhiOzLG4-PVwp!&G!GY0EaLYqxglWdrl@P?~3k| z)9sEa7+Ihnj(SEkz^r&JqlM~mMZsw#zU$S(iTAlIW7)V|{^B6cGLdl0vWf*@8$h)5 z+=)+7bD=ib;Z>SSzI#DF>j!k*Sl8tJGJmb$5@#D)T3?#bA|c>J3~3BMNd-cx9#~8g zh&q3d<-r$;P{8b{siVlE7Sx%y#*k@}BB#ZqRaF}}+ug_di-U`~$n)8Au5e+#_io5x zG%=6S{_3{k`!@bbp$kIj7qj!GTB`~n)bU?GP36@VtRD4_CMq}8m@0Y3~LSsJktXB)v}bKGCSVI)e~ zG$~k*yj!c#aEAtt%9ecWAyiKsztum6l8ydB^=+KnYS`@W`w9m*oJO67-hhZsZY+`- z_$8N}*X;b3LO~MzLB;g*W7@@jEb2ct50$dwJ*jx z=(;!zw}Sl)pW^d1r{%r0sFv+FLUp_)=_Kx=iPr5~I&e@JgXnx~jqj)HVMAj`TKrb& z>A&0iA1_DlYo%uI>_R2mJ3zQYf7W*|25PVvb6uU+ayC}kS&=XQ0ihJKrz?*n$1Cd3 zOg>@{AzJ;e`D3kD4$$Ks(crRb6}tTg2912NuMY!jT^{}$Y%dSGvVGrMhyrjH%KDOP zJJ*AfbXAiV=TFi_5K*~NM@EpVf>$HO8m*j7(1%Y)=i!vpOd{a_WE=^|aRaGfweiHd2+GK|Zb3*G$6j(&t zkeWA+T%HokAoebn4%?qiZUSjT#rPou=k!Ibwfm4Dnz!$cXW&jTzN>c5$SA&Dd^EmJ z(5fh67FxqCq37$&(t_Aw1>heQoI#D^qgw!z48eR~9Ob)C<_rEP386h%R=4!X&xPjH zl)1M<-z!=JE_RJa3Vib4eXITzVFdgN7X$Xbr3&&iHk?-He~6Mhul?jn1nz5r`|b6ugs$7ztiathELZdB5*9uOM74v;+dn)=!_hwL@H_EF zb@I+XC#@3Rx!dj!1Vj*cVn|}StX-+8Yz#)7lp0cuyD*fQ$aaCRw1OUKyF0RYS~3iA zcviv9BqfiyjJW&+d>~N8-K@CBD(a06Jj{KAsc>wB3nBEQD~!bVPn2VPy|bYpjD99A zc!t(WTf@ZzTK@$V35I19-=G%)F0D)(I;0M6gB{OTx4jEIw~LauIN~QpRIFk%Ih1~r zu%$!#aJ~o`47it)et@KFSI)npa91kfUU=4`K&nDa{tq&2#YdKegKbUBOiW3d;)~Pu zj(sdn#D8qL{Zi^;b!GqZ_GEBxb>%kC^C+$)`6Wi9=K1d6-<1IG%bS|!?xRbO9IOTC zGWb>KCN1`HEE_zr8Q()!g>5{Byut^nkJ^jiOXr`*E=O^4szkN z_q~S^9?lK}PZ8jDd%>10hYZP5(jr@YZP^dxn619MOb@jWoP+TlbxWIQ0yQP=z0HKtoPe9UQe8%G2r)HZZ6tG; ziKWk1x0>7)b?*Uhr6(lFSNu1k}9&e#qX&p`ibHW zk-oyJ>+Y+|%z_<@+Vwni}=TMrU2VhTVtyY~HF4?0qd|a&R8(RUg^4?$GZw z3WCee2vF`m2>+E^_*N!Kt$5#r8W{YLk3jGH_fL7rFfjXim9_8Abvqq72FnfnR*X;9 zJT2Cj+SFZMuHpGOyt!qbL*Zvqeq&0zJTe+PwtSl5;~ew+k>+DOaS>R5qFN}h1L zC>Z*8HhiM=H1QqCZIKko=&tw%>qE_(xBT1Ygq%dbK?_<#X$bwr=R5Zj=FpuW?VlANN}_q7=+4p23=7QI}FgP;8)o ziZ<$PR=gtBp-d7eGLn}Ft&{!z@e(A#`gqc$poB_h9Wb6?4AXyvj)RSG=fA#G2w0XF z{b~HLOn0eoznabGxBW4j#?Bg(^0d(42cV=*j(fBi^miXthtBWW|85&KJu+(2ccf*^ui)` zXRx{7G$i2A5U1Ldmx81;0s72AjoqcZ!1&bee*<$%J>jAtVjkjmZm|SO!ZT6{CaD_* z@m9gKHNIX{Vz02PLwd@{hW@!$`RxUeyU{+mO5{JXn%pGkw)jNeYN>zS@p3_sjgjf( zB?IH<0?QS$3sS$cx?h?J{VN7vd?tjNCo*{!i^8;PO;`-uzOvj zZ9`)%;xN+H=y7Ak?G`2Zw3tdH^wOT-rk!(nmYeZ8t3P0dh2B?2#fz5r_{nQ3g99gS z=HP?tqyS^4B=ReNUeL|yKjKyMpPRl9R%6;4yI7>IY3sWqA1zKl%ogM>qFFTik{Ij% zJ2GypQI87W;6&>!no;+{&pb?zEce$cg+wvXK``d&IFN#*(FpT%BznGJTJq!4xIplE zHr4$GUZd%S>2nfAu@u~*QTA3Ok5W}LEK<0~{gI+`(Z zTG?(z>4JDzX~(0UYgc;kvkAI_!^styUt&fhJ1SV`y8mu0g6Cif&bJtqC zd5Uf~2GI))<|b+0_q5|{1uPdNI0BswqgzymzY6~D_e#GOm*gHUqXg+W0$50`CS)S^ zl?8~2;`j;RD&0jn=m^CgxSMcZ`iY)YYg~f;!ogr6QoyMr&x$PaonR}~&9g`{cM!aF z?K~e?L9GkJgkrxq`B8bX$F?kan~vujtHs-z5KhUEY@)(jY|A5>_BKn1?JX;9JFW33&2zl8 zvh(+n*(}K_9BjRxMFC+CkS^t~OT1mK@FpsiG0=%~Pt55hob3rfh~K@_jFx)-f(^Ky zKgDB*Y8M`c)v74stvS}3Pq66N$eK4m# z*ZC(YV&97cLNq(*nPZZD@1=LQs)#%<^D$PxiC#<=$Bf@7eDOD11K+xIRzU}y^Y6^Id20Hjf3mg-%+H-w~OESEbF~ea_A^0jUoo z_DiwzZqT0mklYck6gX`Xql=?wz+#f1xzl`YG;*O$#UGcp&&mV+~JG|mC~uXKf{Y@WZGiKQ#84`QX=YrBIz z+@5pzn_x%^v0e@O906lK2>fm6^!xj;UOs&XCChR9i&%$7TDYBrvb4q06!u|0ln>-N zPyCnjTH|7R?Y3?Wts9vmp_Oj};8TJWwDo7ic(-*#(XTb>@-;2Tw@g=kFIQvXjF087 zVIC>pd3+RjM40aGJ5-*ISp2H~VCPCEC3P+IR^WT_{Ic4@$+)WE;nn9F7tdIOjXL3w zPlunc*LuWnXs#Yx*9%0@=tli7+hD=!NO%8+yh>@Z+lnCJlolrE%r_a^7S)0rN2L9# zt*Y^xe9Ek9Hvf4{rws@jHhV)_X_6a;4kn+QJ9vVVhjKQ5lHo_Bk?Cgl$`FjS(k0N}pr;5d9V~}Fq5^B2(X z^#+@(^noO9+l^GBtnbcUB{~?cV%#(vVV@eu4M>1$KFo&av}xIg<350zNOnT)!!2$F zyhwKRwf&E4jpQLX2o8B?Nj1xJJmke&S!KbewkA5O@|9tg3U$baIqpA`K6#0Yjc}RG z(~KTIq0#my${BnC+r8No3eA64=m5alBF% zPssy5qtLNj@I=G1nz-CS7s_J?!}x8GwNe~wV{zIz#(N??UOeA=K4!X44&i>O#ydi% z+Su*FLR`&?PMAMHc!YS=py)@3^eaX zw0Berr_y`P`bpaN=|^<7tHk9=fs66|y(uew8H&#qTS1px5$mo z$ZJ(f5I1k}ras5rbgOEMnA;Tb zpFi>~&$24Af#`wDlw=Z^wVoJnY>Grkrj(&}Dk@di@_Y77h?aTf#!Cg?|DUwZp6x!<$uFkPfjU$*b^$Kw_ z^kVsv@%(&uzD4su!|qeR-p2$796w8arq1tXf?DcW0q@tl3T71qj&bHKO+jwUSo(5k zpO1!_Q<5Zg#<=<`o~G*?Yeu8zsrqon`87P089-DOiq^tyyY@%HeQmUws%4BBw>_k(0MuEA z0R_=@@aQhl@B) zu3CxEI*Qd#M^XrL5`UoRUB#G(K@Z^7Q>IJp;Ev71`Jm$}$Me7#a9#dr_30QSb+rPP zxR*ZN_vtG{9Wk;S{3ADWzyz`|XLGZ#t$%adcIpBY$Oom{#K>CXsX47lvM6ow?-s8jOm%#_;vo+=7V$i+1jy>Fs`R@P-e%1T>+W$A~<{nJZdFo>%47szH?uJi=wV}gZdk>ESX(F&y4*G)#^zJ~O zM9+X}EU;PbXH8p`@*&Hcl$0Kmi@$Anng5Dxlm}(DL|PG3)u6JcfZiHPgLpjtoI8A~ zl2(udBDlchBJNLWwUQ(X+(qv`$LWY%Hbld zil2X3T0LIxEQR*Sp5m??n=eDYAI}G&Bwz@5?Qf@L%9QWHnLJHYCQkF>?Yy<&qpK0(& z_BMK`r|ae~UFKf?>*faqf|=HP3r92?P(Xx|j21FoXIr~*J${TQ`kP%%G%AZHqacup zwcWy^ZOqA87%9QjjlYNdeYZnlXtPWYCN;xj0cK`S3C1@obL4QMR&>kF3eQ!+o}{v@ zRvtQn3iX32kUWwp&~0S^OAXNrwsJCKBWb~*)_m*)d36j!-1ah9MU4nHgQL2;_fJK= zak5M{3o(fg3f2XGtA^pp29*%2@&kwqCoM|9Ei+xAffN=&{}reb76${JbqE zr)y;XB4Q_LX0kav4)QgwDDNVa@AvPxA=VQ9-WErE#C_K)2Fev_ zIhf$mVb-Z4wrxhXlCrN;fOX`{hkpqwd8&9`idmb74 z-)h19&hmSH#?SiTZo}x|=FLvMm$<$Z`}00yE_IoN|B*($&hk78sqvb+XZ-kf2r6t> z!X8t|eohILi#uv;yE*dYG_~!c1_kVCEY}^*rARugbeC>yF+wahfQhhUM0)IQ#-(}u z-%+890-1LZR0IXWb$Z=I%_*<(qf6jvjikVJdyUstpRvSg#3UWqnKM{C(LD6w-BH(fYE`Xxp zlp~)=0AwY>?*;^3NLY|OR_IoJp7)0uF-N_$gJ-AN$|jT)`!Rn1EgOn(`n_t(2NfFi7^3CQna$kB?o(l}MZwZT@a>U1o~diB$F7$%5&E#H}eZ}!VJA&>`_NWdV=yF2&_rv-BmEKU8C*_TI+mqVz~ZDqA`VUK@B zxOm2VA6S?kBnGZSa^g%_rvhSQq*gW8vSG5J+Qi4fCwj2><}FKV0tw!s0?k)q;;s{S zRddk9oU!vW8gGx%U;-~vDgCgU`q>hMx1}OgI^T{w_vh?>GmI~k9RC5xC=T+rU-K(H zu7Qivx{Fj^*t78+^8Hh=hr_X>@y%P7{ez z4$TFIlmKK{?OURWwly{5Y+jt*4mV}jajb1PM0Iu<9=z3-WiL8-#|XzX`U^@&jE7kps9c6 zp%26;q8U2BfI1zp8=QPRP(~PvrMc9+oJODw6T+4IZz^kJk!ftNr&e}xB>$$nd z0T@T7rtZ}VK>3%G#%euL!aR)ELG`nZhS=4!g7uxHg_FI35*A$0$8A7 z;@js;Kh&9|a>u*(FBY78(9_q4M4{rdsGcgv`smRT3grp-d@8`uuuMEq{btG9Yr#WV zSt^u+412;%Hq09r>HP#5n_GKWQY|Cb5MUyOIB%&-z>-~G)c6 zysF=m?dG3`^Nv2#lHD%FghBzY<3b_)r%`g|%h$1R-#=LB%k&v(xZUFC=dTdGxP=0> zRL3_C>51MUT=*p~P56YF^2UB%9|Go99;&Yny#K1F$3(iyZ%?TpHq4LGNa>V&99=K9 z(BIgYVA=LN3C>IbN^~0kEz4+v@dNY@(Kilcq@y}rx%73#s^F{m-SO6={rheDLxQke zCu#Slt%bm?!Svk?Pt`p5*{|8Tu8X^a1tyjfRv(2AECCg10p2)&LQW4s~24`WA%- zOPt69iFKIxD_?|zOjDfupJ&Qu2V|OXhHZZ%M6@r{ma+5Tap;I=&kymj@v-nsrOS;( z<-??#?6DaT$cE;z8gE#*AX{O7hw0?&G}b$2+o5 zY6v_!7tox#^m|%2@s|Ae1N#sDZ^9?E@-z`?gSrt%p~zPBTh!nh4maorKu12REus)f zE9Cgfsz?=Ftu5@}14txLf~Eq?^;l(PU4!kVNvx=gF{l3q9%C{hhF-~A(F2^F4f;Xi zT-SM!MSRs+E#J-;A$&ozh&@VTZXGUlCD~+R9pMN+C~GGvP`}6a;0RmNU{bxlxC}p) zO@J8DhrZ|DAVIL<;HjCtpKTF&??yQ~TK}V2L7L|6iOHuVnahMz_Y|0k$UDX@r}{Sy zio?})HpTTgje_-x#YSR!#oSv>9q`-n74+U}|0P_D0JnmSxI6^}eRvJDLhceI(D;yN(iz zFcyT~pI>0^FgXgPU~FvLdLFee=)oUaPHTNVsfHzM9niK5VGGir6JsI(p!Yw`esLA!FW3$Y9Y^@j4x0i*-TBI(R@@a*u*8^7jxr|rB&v0wDY44I2^ zhQ|DF8%yepM?Z!8^criDwtnhmkpw)Wt@?iS@;^bnd6llDyryL_vHB3(Qt*%%e7X|` zBS-#KF}X}O{`T+R9X1LMpzJX6xxOsl2UkB0#{7R#mF3-Nu}UCQvJ9OK3JL2fk`2Po z4jM%~G}WJ}zhTNip*|L%6Kl1`Rx%i!cDrXwx;@1dBRLi;h(n4R&+U1-Z zny81Qdx!X7u$n*vUHF{|=`S4|`SJdv_`6$*X;Z10JFjmjBIWzAFt zTww|oYkdw}^`aXFtZBE~b^fJ*A)Q3gJSK}DFIKQ7Vn@k#l<4t)Jn>XwP+t=k1Tv-s$Ye?$D7 zaIAz{GzvW6WzaT7tQu^$kiT`{cRf6?{jtjo*n<{Bj@Al*`yYLRV?b&A(Ob!thX_+2 z^bK89)Khk$&=?gjE@{$repb>yxb4`k{Ozm(kpt4{)c5y|ncpfn(c*?HU#8Uf_^=G^ z7#w)rxD8U#QImhr&md@PKzg*+K0vRgo?oi%UNRIyN(*v);Y;PAXhwZA$F7If`tmk8 zDf}h+D&MYd58s=-Kv@93u8I1R2);}+d0{w+Q)K+}whR><1*zN19M?2~R8w6rf5<{4 znt|~4g=4!FOLOj-AX8PCBcSD){J@YZ5L4hVgMUvPp?E{-uy`sa00}X~50yjnDLZx9cxNh0(z}AAkp#e znLD0XK7(w9JLn*m1D>dRVc|yAQsBpX0XrKe6L1Oi%SFNWE@7A=xtQR*{~#}V(f&^c zcDZG~O=d;7fFq7|`-2Oy?#WoKrcdz;;nS?RpC}N5GbgSRU;?@O=jLR4{|4T#b7mG1?9_MB2S@>=YI=E+)rYT$Xee=fnD1fr5*}S^pfFyj>|4y!a8s zz_?@m^fA{r;X%eH*jUUqUf<Xi;>8t0tR|--dY7| zDI3rh9{F)529Z8-W_`idY~OWsuXqdlcSJ;beUa;S>eBS*K9IWBhpQ-=HokH+KG`f3G5mXW<#qSJ{@3uWfl}DnYb~&f71^Dq$AOo|UEB02hPC9{xnU!n z%;qF#WNBRQ(ki|zsfIqgoO{qA94+aSw@Og(<#6s9Pxruv%=o$WVxoHMvjv$$^t+D< zbHOpew-1U?^R72*azsWXyK=nQ0g1~Zw|Fog%iGnStr-4o_Kd-oH3?)wppCnJyLa$^ z1(x&v!%VFztdC#zSWpO;<|UrZdj-1hf1;1;4j82SQd;wu>kq&4n;qOg=y~~#EVba6 z#C-p+{N_rabKpn)qneBQ{8Ax~6V3G`An=afVt|Z4Q7c2ht(_2bY;U51Ek-rpqiV%f zXMSHSXi73{<~(R@LnxqVLXs~VmfgXUogLedlH!5O3d-Q-#7M~^MM4$#j9hGuMKb~l z`sImn6h62YR<86pVh2SbFK2Nb_p#l#1vZw0)}Zu<){tY@B+&gKK_ngkMM=x@+zX3= z9s3#;59-NRQGq5c+^o=cPxq*n}kaNp%D?%{4zXBCfE8Kd(UCm!K1{XH3M7-o6di^s_You@QKaqIeevKwY-McvK3|n}!4kG#gmRV$DcwGu z4;jV$*-i$0CcZp%JA%35gzqQ<>755fEe1C56&YdIr%hJA5u?#=l#WSYZnJ0EV^ zb3%)ay~B24OYF5yHWFxIOalkNUTJ31eIMet}xcVh&+ zcG+nJrXyZ_!_2xlWtzJp0s&e{ka=~otnQ?fOXJS(<(+$*Mt5Na3Vv7icTXZ)dc-+! z<4~Kvj~bi;Ih;kG`wST1@Tb|^bnSYFmbA&(eFj*mBS<+XzhR}m`cmD9m-^hEn)R_7JKvW&9c`9%FQ@A>7pZs957S<-gM z43+7F%zi@#Hp=1tW(q8c_{iAafc4QBM=YiWQu6(;Sy2#1=|=;q=P(rhY<+LP zFh%Bj3A$(wMT_+wRri7%%@CREebPU_)B{j_hxTNlJ7ltJezE|pc!n9kocl&_Z^1!Kru3#@_pzc!l@ zVD67s>YVPxqTLySzuPr^J#4=&vs@WCc!I>eS&%#o)d@4q0#i~WVU_Z+z$fI54P^*B zmlW&Bq+(IH70D1u39kqDGgegZ!4{)j?1zdkLi+3za)}h=+3|Q)_VzPRkX0n+gY++b zBGnYB)!&d6#|B9oe!xx1A=EJ<&x>TKvPp*QWf_bXE9uxtTIV@9C?WCRDIr0Go`fZ) zpSNJ`$0}zG$2i8>UwWWF&VPgO2c8sAx;=NBK{R3^oJnG#-%>`5`)g($9#?la$>AT$ zN|7^til-5uzX{3eCr1m7JuxMl&>O$shPkh$!&_EvHeIu(9UHnCL2k~PX@E!fhO=p- z06cT>35EvC6NLU?M6pcE2Y)5?>H3S33;2f5>_W>I^libpql_FlPKm3<(Ne@kEB?M# z!_tWrwa(~xNn04}UCF~=Eml4Ht5nM@55D;`(CPed&w32MGV-k`<{&1Qv`nJ$*L%x? zHUDdY(O+X&Rou*cNOnD_k)j_p+YmO}au%!7KMFN=jw3!lIRljMaB!Ng*Gfj~R&VEK zl>x3%!uJN8c_-3McsbU?HsmTU!QijXz!+Bux*+q!hz~%FX}a4hR&#Pt$`UItg&bm7 z3pYp?iY~2szpj+J9Kh?BP|G)^#b4zxdfrz088=E%FUBfV_#7J+&NrEE()@x{#41W~ zH4JSXU-ljX!$T<`f|Di~i@cyc`kZiuNcs>fgExF3$oXDVV}A5XcI z^V%6U=qd^}sY%62utmI-w^GG-x)IQfM##ovp`sp}->YwJSOt$lOlLN*7_2Sk=w;}v zN3Epd_C8U9UQq-^d>}TOCaVS0>#G=Yi-)JQ1!1U;$eM)MvzW@7$cllz6xX@&l|}eu z`OJ)>jF_9$qhp^h2+8vbH>>X?wctq@R*i>axpAY)rX;2uhetPbWMJ34j-<%`ypxRY zqLRP%-k0!sf!9YCR}ZfV9C{PhXahXoJWz+gIFI#!aZr|b z+ji}psnp@6MT{ELeZw$v72;Qnbt)}F{9NQgZ=&a6oaZF7Tl>W4WAxC!l=oY0=LQ0U z%E4DuMVk^&kK5E`hu#Uwvf8WIC(yc>f9&lg8Jx5xA^sZ)YuE8|s+B^>p<= zxfp9D8ppQ_$ak&8v8z~Fy*t(FZNrbSCBe0SVSc4TT%>)78C9WgTFV19ivj*5>})5V zApU3zbK3g8wVF;YQniTg z+^`QgMt>V#`;_hwySsl1gwTa++5P_YwwJ2JTOJ`^suJnhc$mKUmagjKz=^fas>CN6 zrero{V-A;}DYoLo{PfWW+#}}t<-DH^EJeMZKIi$g2&W)L#o!Pqo+5>}wc4qWRq)zJ zmh2mu>fu_Mmw@(Q)SbD!A8#_eGx!b_3x`z27WDET`I2Drqlxva@xMU#!mR7RzA44Q z5!4*K9R(^-GV_VBF22Q^#(Jk1RNA-NTRLO`5@jfSes5VTngY?Z+UCs

yy(w!D)F zoIKx{+QAk422{AXnRWCtOuG7Zz<;|gk9PUUOt}O{l93GIP6Pg-JdascaP@z;!`MdT zMrqp9KU3-5lvBz%RoSula8ne&D&v;?A=#2u1VGP4(|m^HJlPXTNockX_<;u34n4y6 zEX<^y)cs0CMafb2)-%%u+VZ+yF(`FUR+BHpdCHNWubFz$n$$6I@sA0BQ}kO^IhWm` z7+*KTwuuhFY=9jT`RT`QCa}}yB8324=o8J94yS$eL_aCUZXP_*elPe_***wQ7#KqS zXw+3X-T541s;%_u6(zaup_Ls=_Db8OPw-W5Rjm>g5xjp$IxgoYWX-LC1DfoVPP{E5ZF*Ws_o5$0C z*CHWP{|-!&Kj46n|90b2d2npwmltcXjxA*cM0`qw)U^DL`(_uI(6+Y;uK&c^9EXZM z>F?-#);fd({%QRkx4e@3rB?KPVu6;Qo-{jbN52>DN@6wqk*9C#?-_Pj?Pzh@K*u-k zmC+?z>lGSHf3nzVh0;jHM$FF;Q}N+__G2bR_3o&g#O!606i1@ zdc@1@nWR)P&5f*(E$E`ecv=h?YEx)pe8%Uu#?S}p@)kiBIH4@Ncl_h_I>E7*~lb6Sj7 zduzx^4W>coBi{vELQh@8CrB91!yLOD+)15mo(!{M7Pt!?TC)kPgl@H(_v!T+p;tl>Z;Qc=(QOmcQeQLjs{Jsv;D*wt7FrG6k!5z%gxXut()-+NDD zoca#&RKc4gVg@OX!1`moRTrf~8_I~$M_NC*E~XL`{Cm~B9g~~2_~ko5@fk7ESL!KedbS<#;jm%4mPJy9wcYapFe*+p06@(3-d9 zmHPs8V0Nn3T-MkWbgYUcIkn5&Lh{~Ng_7#>T?>BYg7`Eab88JElRP5oJ*H@{Q{zr? zjmQh$1#^ak@OBl!Vo$4=&!ixgNc~q};zG%SXFZ$!;9wNP$nC>6u}=WqZFgDflTR1_ zcFUn?1+eSmXkXjiGVEn*YvR)C$;t5U{dIa+p9FF%CvZc8Nt%<$-VJFAc?jVJxNLL? z04XRxy%X@VEd2glnczNa^G;BFTRrcC>-KI8(EO6mV`LRMyx10-u zsEd5i#d$a5L@yo_PLFTv%H8bYv{@yeL5wU0T8Ay>5(QIc(tv@Z{v)uO3?XsyPle;z z5wa-JQK~OcFoN)e+OZg{#2m?w@`xEVn4Tip0-#oZ)t_bz*~=gF(OCG`z#JIW-@Goe z=qJZ`6|O`;g7MVtg#<8j0IOnqboSqVqM+Nft^cErN15Cq#9Qo)vkjE6mI#MZgp^~V zZ%M)TgCn9FAbdxI`2Tb@%HIPAE|3w7BAU#`z7Xh6U{x?Lpcrc)GE=Ycic&k$mQokV z`k_QZG(jx@JqEk}^MEGdV7w{o)=b3^TUeR5U6>vy_gY%|bx_)~e4nf|n$8rUq+P=QS@EyxrMSBGiup;gQLv3Py@{njpd-%bE zzg|8*{~Z?^u*zYv|#q^N=~UIY*w{)QBY`1s;&UT zc$%Y7G$uHoyZ4t~|K5Y&$HEW3YCXX}KK2gC;64K13g9(b#|3!!&JUpMT*d8g`(~gt z^#(Tl{Oh{j*udP|si1#I6R2bIS4n`!Q~oxe`1R1`@Y(G4OSt)OeLX(@hPOkDK1k*S zq-W2ZBYCgYKZY%)I`-T#+Nh5R)4bvZ(cB^61F` zF+0czTC|308BiE*^kR%+DLUKow#%`y97`)b`2UiSzeg(@tqXXXsue(2CB)9^vNuG& z9J}q+WZV)CR$T0Mnn`NXZusI5?L1quF18}u0ax1Vl9vW)i%CKkDnQOgzyy>CBPOB)|)R{o6l+d%xvpamSlp ziFr4}0Pv@ve*nzZ9~T7m<7sFN2|GlH8DfeUYZn$6J^D3}3hM{kgZ?!c(EImKtoJs2 z|0nw**KPxj!N#;xj+>*0if6ZrznVsR89OlSVZsdACbdp;YbmYoGC>Ki$JcL{!oo8 zKsmf|WVweqAvbyyZ`{#&X5(TB0nrlCFu9l_15t`XoQ1*Va0O>kn3UiW=Q@N}vws!^ zvsz@iG0JjBwp~6})!xBu!d`>gxb)#AgqAXLawX3f|C5gA=aZ;jrO?95h$u&A-d zlE`@gt;m54*a}0$@N*U(Bx7Y3MRRAA=#0_!CjU%1j;30FdSHL|Nv;2r<+Cp7(NFmS z0I!}Nn9`8_vLIG-VBQjQpzBC99j$Buc}0|#IcLxda&|-zG(!zoTW8!RqxxJ$)g{rO zLBDAILgx=N%*!qfoa?l)LcIJMh#mzwM^|kMH4nsVE zHTdUvY~$_+%^)|=z1Diey5RV>P4*`)2~!IN7{JtTr_&b>>v=uxwmsnKbKvcl(a_*% zP>?IIKent>0J1I{pB-C|Rsey50!NF27Cv3LS}#Gh!C1)bFvz1Ij_TSDMIMQEDDX(+ zk&q6B^=F6mGaLza2=GAA5y?ZC9f&*t>;TZAU11m_r;ILgTT0n3P~%ARfN$5lf~^G19|QP!ygJp#Q~sPO z1w2S50`67K1~JJh4i3_+u0_!Lr3 z9Lc>u?v}!tyjY6D>>bVB8t;(3FnP!1oi*-kyjbH!*$cCmn3WEV7bGvtC76qcxnoue zaw(#NsmO8{W+gN$F1RBX@2>&N9wskg-YI#9aH~PjO4;&G zvtZ#GFzfTK?ky97AL_EF}}&H?5sY`Fuh3e^~S z*g@MyTLvPN4IPex)Z5m3^4|JhU>GcsK!Z-v>&X)`ta{_XX(p2sb^j3EjrYZs=Y#p7Gu-)%Tb5gnLJMb# zU~m4PD#-VgJZRP3gV`M^9621b2+L7|Av7LLF2IYDi`nIkE6Wv)M^7NolM8fXa%Y6Y zA~Cs&!ewER!j+fQvM_e%)~(gBl(k9h8#ozB3rVR zSRxgZN(9lgrJ)`XNe$=G^J2gI-t(y1d##lpdsm%0w{JIRs3tu`dN-g_LvV#+b#Ua@-z)HPZn8=3BMjjw z!~8Gqz*_O+k zYUB(;xw>Pc#M*ZwHvj-207*naRMDfa;poe6K>x|ExV3UfU5ZC%!-X$rh-MMZY;uyA z6)`79O=xmr%src&*yhe=slzOHIJ-9c&NqSgze#!a4Rt1SCi5n#dor+Bm!vRNwyK<| zij?`6P?e}EqM5<6l=s$9dKYSvV5=C_`&Ks=jj^%SrY&>gYEgy$S}*y*<|RT74jkNz z006$F^W=l}Zf$Ra008P>I9=dicYgt34lHgGeG9Zp=DY_qYf>99I%3X1Al)1y!eEY4 z(mMcB;kye;u#Qw&ox0d}5F$P(1DU4<#w^6TSn#q?$1u4Mp@6?D@IMyV_Y-IZ7T1Vp zUPQCG1mrXIn@qv~WPcp;iEYT_1e8n`O?L(Vz_H_FKm=2;KLC+wdO{7-XV?Oi>BgGL zKL8pu*==>>*n`&F?0Xy&kP8G3WLsqIWb|Ipw0xZlg} zfWm9s2mA919GqKk{Q&;`1n{pAC8%&1wSD#bD?phwV*s5vw_mDdfxKPN`bh}t6-V!&HX zTM{6fhnx_H*JWkM*_&*LDLZpU%tq$SsLD2HZxqh@o~>p!>e8r6tGzn!ZG0jncmpV)XuZUD>=*_Hc` zXOf}W7v`0rovXBKgExTzMnMbnj;#tqga-#ZWKsbOfIz6I_6wHd=!6@@1Qg{!WSIjZ zj?=POJrU3S)>rej=dF?e(@20V4N$*KN8pzM+$8vMz=PrNnXf?l85UPBO~605W;^^0 zJpQw6iGisne|WAI&!9D?0f}nu-EvYv|;V1y?&2jL9 z--*LNd==^TdVFjU%Pb(H5)HseHk7%PP$FKn!w-H9M-T7Ismp=0wW9)l1j~Vz3(!}U z5_+E)G+SdC(K4ceQL}}TD!`}-VlXjd)I8|oxR|ks1RALD;yQGSS#}i{Q!C>IAucon zRSnUVje+8=xFtFgXV&%ZF!R0<2U|}%ccqv#J@RJHlDga88SjI8VCy=|-iKg^M+b z0ci%zY?lPk0ES%cqJd)Os1Q1H=9z8T(0T@4S;Qcf(KEzD^S!Tt&2MLY@i|92e=-3u zkkZYP^3-SA*?;n1Q=YzND4Dhv35mIs+Cr%_5tz$6K@r^;yb=R2BtJT}^c(M+P~0P^ z-ysD4vSI$c2RQeY_t$fNY&*$at$?x?!?EJwAS(IC}K; zLI8ZWtalBQbuU>60J-obm7p0xQxH`I?HM(p&6!aG(BJmkmSzfuGziK?!nw!H4Ew<)V)!&M%`)dRI_02qGqD*W$S&Woy|=HY~3}M zv@N2z%Y`8v7;bs>`Y*hs#vQx^um8Kr-X64n5$$af0H4G$FC?%#FcP>*bo0uFc0}8t zO^Hnen^>V^C~p_7gM|nhQPNR`kXoR-vVWy2sT7pY;3)c}B*dK#^Sp3?UKj9Vu3w$l zOWCj*0q`o}pD!eU9SB?$a_VKwx<`O?8eboDOuwyTCrsE+dM$QeKZ1?vvEXD-GJuaM z5E;CaVS9e+rJVL`>YxeWOanYONBCzq;h8YD$aS$Z_54pg{>P&LPCB2d74Q!vKtg5* zWe=loYy|yWS@rZ=1^!A|y2w(=rBPOfuu`&m|G9*eNC9`Qyp-r$8n85mBNr?|9=XWU z97{lsj9fZx1!C!fr4dVlONTB&U%6ljv9$}0UjcT)t-U-hRz+B??jK`MDQ`#%>8Qj*ZzVgS_swtGQ~)U(?OPi7(pB1ok(8|B+N2LB|&S55T{88Vjh;48WOFm_7G2ZvL|uk+W|B zKLmN$7$)BTvJIp_qBkq7FLu;c@z0n>~vp40rjM_7(TGU+0fQ*u8Y_ZHMK&l!#ObW z@7btZ)ZU@yp?d$tl0@qz8gjJWqjm1)E|x_siCCY4na!*ZbE7P5-Ob)b_IIzgW1GhS z!_~Tb3&1I0zbClH!j=2`dw$vvDQMsj%FG}!3u! zLLw1Mz&!#C3eYVeMyI*KO(-%%Fcabm2ry?%-#vTu(=Vm#4{tm_#XCrV(V|OF0-p!) zPXPV}!sm|FW3M6|9OB^Br%{a&cSg-^$AUSvPBA49iXfqp@FwE)4}CXQm#<>;wVR^{aUcs6sLwBCU16iD57P_S z*g!A5ZrA^%z}c${Id!8DcjB4BGDI_@75j~rELsu$Y%0MQHA}2@FH4TUQq&MltucqI zu_=HbjhaGHyottKbT%9`Bb9VhiuH7JE(}yR!pO!qfaiYCEG9H9Ompj96m+sMC|nlV z(`N47UgM$N_p}j{w!?Zw?==|u16Www5lfhV2=Go0d^3Rm>&YQA$8ygrV4i~g<6g(I zlzZ2;(YAT)fqJ};LcXtnZiW*{fJkNyV2+@*Fm)troYuHmJhq9u&&`Zpz+y17U?Ly5 z*0%rpFXjBjBePpi0{PVTCnSLRTOmC6_hS6X|0%|w{4IBZS)h9hh_ht7W;8SeFHrz3 z41&xEMN?^q2t{yZ^25_hzyAI$*!R)%zXR|;>X?7;KF)pR18)=jV{)wm{H4glVC(&_ zx55|!P+|v46kQx%HAzY3u?@%ivVZjG>o^=D04D3&Aqtifj?Tu5f0PhZCFaaZptBI+ znN7}Ua_4RC+2-VJUfUvf)@IXra&Hod?3Cn;sV4UKPDw7Fovj+9nV{<5h?$i1J(FlA zu{<7vngkvCF3eTpp02vH3Yi;Lrwut6L>)KV2VVaN?N8L+fd;^df@HvWgIzS>I&tfU zmpZ8{tQIpuHblQ)QlRo0h_jL|qnQi=nw=rANN|ZU}muLJy8w03C`TU<43ZRhfs62W)dCaXc!ZXp5IR02vB}LpC6m zMyx<=97SQ@$&G^HBFvkNTpkM=V$e>aa$~-hS;?!CSpgp~$8C4u z%-czT`zE#fYk$Z+EH>y>iNKoWm;h@KC80+|!=70pqGe>pdapVf9Nd2X%)j!te*gAA z{dYEY_+bp`1F-Eq>^1kd-rxRv4*W3TKM&v|1loj`KK2jr_-}s<7hZlpraBtaGJwYg z0H?YDh2Y!mr(%MEQkMJQp#5!2h?T|t$-;i9=SyF5hqs~0?UN7T@xT64`0C&Mhp-!~ z3MjU|6|Kh#R&t;KixP!HWCuE5KYXaKoS)0ZFU@)Ja`7V4l);LJk*X|pw~W**RD-Bh z(LiIl$KlKhYSG__*{$R}x=SXY;#70fq8KijG<8y`szRz0nN$_3x?X&1U|G+>$DMsWQ)Bhy{#QGx4CAn1-9q`Z`O>`T4y~Bfo)2z zkw!QS!lq14=(NEs0+tn-0kH8*aS!kI-$T!x9zMnyn0CeE9c4|e;Wlb=mG3#Zjf-7(R)8#Ee}eUL+<}0|Nfsx{PYXB^1uEj zbaH+yqv<{#D>1%TuGcpB{EzZWf91CK|JzfuXTP8b-WyeG{=YI<0#(r%YVLor;l|Wx zUc~&&>8c1C%rzsZQ#7z@;%HDXXiv46qZ+dXl+DEPCu|m^Dbu z-t^H9=kvNR78Z(3TIlw?+XK=@%qR}5(63KfFWG?utSk6G17H~&yCv1jfAh41$sy+* z;UULZSn;m*`EIb;d$g}B3TQ=)_d0O<05~nc3czAbY+9@VENteT9RVKPt#S9@a4AB3 zP6yQ8TLZGVw*-Rtm;=|KEIu2|W}o~80KYJP2yX~TG?Ugnv;Z4bHh{pLD4Fe%DC8D% z`7(4C$UP9r($+L&)cuM{c z1pg$0Z`AR?UFP4NPr=FlHd4Z>2;h(!G}!u(J^;GA6fs@pPzq3TiLwdVEM}u*xMX$7 z*+VvlWDH4FGOS5}C(;vOiJT?S5=DC`6zpn2ZUAT<=n5AKchH@f8@P6IZs5v68o6f_ zwWYL%ppK(GL)bUmbT1%eD2DZQ=fnrV|3N#ky%Q0@Y4cDbTURZ4VN z@%VNjg#mojd4$JaI*le6!N+kTV7T@m1Q@VG0*nMegHjQoso$l($Hf->8xP~)Q`gX4 zW+4H%l@Xi@1P)B?bSxf55UcOHWnUc%MJf2lXt*yCqNL%Zvnu8U5NYO4VW%tg%8-T}svA<0QW+AiJ43}6| zz*6qzD30EYWmy75GbGBmQg_e%uG1g>`QN|&PqD5fK)F?i`TklZwddm z%hO){{@=jiV_(JNpZ_!P)SLkRE1(}H^+_4P9r3`S2X;t1_!zvi^9$a^{zj$# zkqDSBK6V!&#-X3&7h@0&Bf`Zqc>Hht6u$bYU%}?`%`s&_M-pJ0*O(`L2CIj{k%74J ztIyF^7Y@QR|J>R3hM-EQ7A*jEP&0!Xs2SAqxQvS#^`K5E0-P3dsWXmjq>4!{gqtae zOf#iZjiw^yoKaO6lnND66=J1&lvt*jP%LG4K`^j@eu^1ko)}D0w4UYz=!cY2NPXAZ zx0(GNYbTO(lRNEEFZAl~)QXm;LB8g4t4DLDHRQQ8VPos%Ocwi{b=pYBm0P#4eg7;XbRXLNdQzS0I$CBXi2`X%T(ZJ+0?;9*-Da2Nd7XaE2&+w1?vjm`Sf``SPC_dSRuG^PPH zCciOdQ^7wK)@YAl4wy4&wqO9%88pKyaThcL8aNz7B{$YFTfodBdv&@B%rj?Zsnrbi zz+?^Q78yNJU3(hl4K`i$rWb4W3>~6}je5t%16xm^-+bN^KOvTXzZpr+Wj? zijk3o2f~bARUu4jfi16*vH>u4nt)dPSTwjAjK*nM=HuJ6B%tqt`T=l{!26g?VLjIB zY#Km#7#5pTMQQ*=0%hXS_pJ!0POiJ%_fa2UC_Y`@*UNj0kL%a*vy?Y-6;Ur$an!t$ z00^1RY-CmoS;_1kva<*Rsx?{JBp_ta6W|Gy3|a!2KxQyxa1g|t)jpP4o_hGw&Bh zAt&sAnb<>NLb;o->%S?muMzl2T>#8(VRq_O$l?0{j}sPh@-0Wl!xSv|E7j;999W@DB+ zL+sS0?-_dyNFHYWT0|{awlvE}2Fub|7ISR&4LLgU!oa3fSUWUFcgo7@cN}=X4&(aG z8f@>c{SgX_4FU!&04Gez5DMNRIh4);jAh|%q}TO{lb7a?{@zAc{nC~n;P`1OXc*H0 z>bb#o{vm)@0sL4w>`&js@{w0?@ap?Oi{mx6B4U&M6H)`F`Nzjo0>EJg+|4Z>?1?q3 zf3QEFg!ym7|7EKIFzJ)6-N249*xwl2` z7`3z6nA4c7%{`i&y~!D~+_Ahqu}#UEoIGa5JY}>w%RH~yXp*@mZ8agP`9jy;n94#k z8(Yhs<_ya|*JQ12e4$CAne6FG8dHH;Ki4DUw~_tbtNqL{+8QnLjXTGY}pU;Ch;P?f$U&&E;aPI*AJm61a6bD>C z^cEIZE+K68M+#&V2*j2+Yp3{f)^8yqzONVp6(I#6)Cx|6BPhR&MXHSJo zU!pX9_SV#+Dogl(W>bVQgQ%i4V+r@yA&N&!-?PzD=1(+ftInu7(~NG!OfzYo8_g!> z4oem-(rQFbV?7(oje8f}U8AFQj~cyWcI3GybzjNCo$g1BK4U;H!CVe}#Rw7cC6fm( zd{6fL@OE!vO02(Xfy&k19gUy`rbO#0b4kh}vBB38rn4ZdNB z?6cHclRGpy+dTC)&z@%q+9Vh=j0w&JlMIstV}i9A)+)3$XsDYQ^gy9rkKK@?K~E{v z%6<-p)Hs5akpCM)$p8Li{yROL4}sme5O|R5|DfHYeFG5ycZ5U@2L@aM00GQ#>y+UP zfMvjPZ^ivhhxM!>`aPgsA*VUe08xANfozdr+CTzeYCxb+$r4TPfUraXs8rT0xVr)p z+yzLfy8uV9>diB6VLp@wiG`7OfyFxU|099FDbW8+pa%k*uW;^t|2x{3{xx8|kDXj# z;UooM02Z}Z-To{YqX%`T4B0d?0N4@*+usyBI1Yj_1)!{=wvTgIn&dJ_4y6HE(*e)` z-k?MQ#CommJI#OcG#bI}nC1io>K^gLxiBj?iy-|A5 zI|Vw2Y|ObD)c+k}rQ#cRS-VJQj?O|zFeVGGFea81)(m(?_4WgN`-s$r}w|>)ARL<*Wc_f z|6A_9*oNU_yw{7jeoF%QF93KI@c$X`Gr;ofb$t29{w|*RjUUJUtqY?kp?DXDF#p}? zfZ};Sp_JhC7-i8S0K|Q3y4C)+|JTno5Qu~49~?b}j$@Gk$H2-St)G0I)BMxua{;6IzIBUR7 z!MZgZoE04P7WY;Xm#{Q%1d?oHjy({T9Gj*^sWhI@18CX6ft^Tz1fbCd5**oqNQELG zK%p)S2ILwEa5~HnKfd_j&;82k_daDM!FgMDb21BLFCM!LK>j@fFF3+~39Qdw$E$z# z|G=f+{s_)iU4Y?>ANMrWS#Bg0P(im;;%+1jeTW4p+o%x9s-! z{m$mM9{s@lBma%a{HUbw1WSzSR;mJI3kCEWtuAFWYf!14{{(2ys6n$Dp+cH-p#n9b znq|?9Y=JXFyD&{lTg~RCy_irvBiUYOZfwoCfOOecR2LrjlGz2~J;nFYLOAoDxqAJx zubDg?F1*y5*z-ds7asUcCJ%DjuTH^#NEQ4)ev&uxgyU}q?<9S)XdA{M**(4p;Hm%@ z4YvWDJ_1&Iz}^b586W{`r^CfzEaRYyl)e{WPN1<;(z%~3`tG(&XIkDp_S|Vw=3Rqfhz79npF?Q~;_%c!L$ShAfY33> zjt(&kQpbwv(z$&6`rk08l8`aVwh(H`>xR+~k#X6vlO{LLmwtkH^O$KE_Rj_S(*paC1p3|p4NIJR`qNmv{-=Rk50`;RCmD-_*L_%!jB6rR zB0#n&Z|3#!YLi0_<&H`6gnj`0GTEQZI}V`gK9{j3)p_7p!Ikm&;Eq4o;)nO~^s@>6 zsWo)HHx7u?Y5?lHWdf&LszigcfuVsR(Lpz-o70TUN@k;|8Inop)Y&;@Z7yqP=+wC} zi#^Cxa-<|fyQA%lI{XH=kfFqVNZy914Zy#uoXILdTZW~Qz+U|n(B zYzsEHDC@-KSYOgd6M;DrdW}TLfHk8g03?=G=?yR6TnIK=M($$>9dYi0US+{ ze*gd=07*naRM`>=)9Vh$tXG--1J3{O^Jt%a5-)!0myy=Fo}Hxq4DWl~=Y;KzSQap= zOPl@+AD_n${RZXXx74F%FJ=4^Br6-uDynQ!_FBi-W36W_SuN&bclXo&7XN>re#{0ENi>=9o7S3iyBSAPO~Hzq_L2&upz)GJxF55qtRZ1ep`%N#IH zwT+TAP?}YyV44cx7yvoz_%V3%r$ik_Qf~VgYKcD|qXdSu!XZ@n{J;4_kjEdw8-M3B zHCn(&a8U>VsdmYcBp68n0Li<@U)X%^KYZWfNB^t9y=7)FHJFFFszEb?c}d~1%vN2^ zj6t1L0W>kH6WXy+Ayl%MKrL~ulGO}Qp_;TC*EG}l%p4TUOeS!T+_NL93$rKA4Om0C za6$H-;=nlwv-g~P&+IsgSTcLVXaVOT%pREhHfJuF;U<&I6#QT5y}A#M1ODUt-==LO z`KCkwu#*yS7ZP9q{w`JeLaIU49Rr^=l`5Cjk= zG&(`joOBA^1du@!0E8P2X6k0{X3j16clbyGC`wwL(V=uSH!nb?jwY38p925s@opqw z6#@k@3hq)MBK3zYj=JP^!?Z8yHpz?QDg($q)y=5{`p~mRH%6p6 zJRUJ>L?4YU0#p?t5T@n~UZ}-T3S&UT-C06moL<&BMLN`-o;;uTuqicDUEqNz1xElw zfI49=&><4wO9K7r0R35kK3~KE&pq)u9N?qCtxFh5-U0j**ijHCi$|2ec1Wpnf!Cj5 zYNLa1Xs160K&C{&NFod`usVPyZ2c$`@xl?fOwMEPjz3g5U&WGh+#(Ta(+4g?9vP6rdjV)=8?0FT&j&VB7W<$M48m)3vuiDka|kzpS4 zNd&;QFZaBE5%8ZN{O>sYBY?LFFMs6!g#YHB!`auKM#(d*L;y?Z@>CCC2kajg2dsJ^ zQWq_bEtZijrl~6+U}}HEbUo-A4B|ptjA_^nZZ?qH0OEpu2fx2fHi5vfc;Y;s{n@{S z7eDpO(973rgaXH$Xx8H?{ddP&+5yAr{E>eC&o|+@Ukl*_Uv|dq2ug1=AekOAFw3x* z2fH&gNiAkr$Ur3k9@yV~Xggj)VD~ezctkG)m=SOFj!S27)ouY{X1Mj3oIdj!%r;zc z?vMtHb!V%6gqiOd_FURkHq7UMZKT1>+?R~0wN2BHBtXuB7!h_!03tyFC1#OjDnr(IU+0q{d)2(t_4z9Re#PD7YSum24IoPz%=Kmq+1 z9Ju7=K7R?oSFjbryu&8mB{us`+g<10Vd#(qLot8r{werNfJUD1TMu8t8M^meywrH@UQvvlfLBd z52-MOO7XxCfd3@mKUU{~7g7(QtQ(*x;r@keDENQS@QO$t%7#!0fKVd>fb3que+}pN zUG@J#PiG(k#`GO*qXKNw17b8P8PtvCGUn=Zg-I4d#gL0gE;Cg!w36cm{43B@GN4mn zKCP;KmwVmnANm%6GbhYx54`>l+BdJgLk)mw`y}p>kBkyQcm#mN!T`*Gxg){BM6wB> zW+1XqcTpiqx0u|}fR>8#zZob59p)t*d8>H>0i9mf>xIm8&<);{B)4rSE~+=cYnUyt z%@y>X@P91uM+E-fGEnf~Rm_6|>&JFIbH{W3fq~kbxc@i-_S3}*Ci{2mC(qg0>UD*? z?=ft0?0J|zPf!@;V}GoMIQK&haBYL`@=!~5cT^b`FL#bO1Jo%&REoZFs5oY8ha|Wp zN67B6cSv#z*-d(f^sXVfhaM&g9(rh#;GvKK7#LMaWl)t2gj5FBrZTHR>t;aIvd!ui z?amEWLhBkWeR~H9e9y1CdmeXr4!*U6@BOzwYJdiXvjH^ILj+9$5s1T$qSG;%zenH+03Rwp=JJtO;6bst@)(Aj z-0O9Qod1zT7$ORe+2)v6e1dKH`1+IW&nLE5a*fONO}4qmJGIGWn~yx?1@Gi5Pr$`+ zqoIj7{X@@TbL}=Zm#<(~Vre(*@=g&ZoBYeM^Ecja=vGmleAPT;m}E!HZcTER>=v?V zC^ng6cEkjg3=jE%{oT*DW0%~0>`egY0Gt8vGO!e2KXadowfE%a9QO7Ov2i6qm^hNFmtHg}qyI zwqJZB-~2%%+HpRs_O-)u5FiA2!GR6Hj{_DIhwuF(G)Jc}zkU(hd2q1Hk|Jakql|Mk zC*FEYbU4Oy6IY@}!7i48NOE2CsKo*8Kj$P#FbFy6{hGvUsJBRHkl7-mL1u%DqO()@Yml!e&udu1Bpw`6Q9ipIitynkewlAk6GCy^O!SZQZ%X4ScUB8|ZYA5|iXaAp#`k*HzJk z7;x-f<2dM;_9JjVwl620$FcKM5@7haUe7nXq(R-zd{2XRugCHa6<{p6)x_9OH=CR< z!e?5-!>CYntzk8D?%i@Qf#@AfWs}YkIwyK}=^fI+*#nZ`J^>!X0E+1VdVHG(B-{&3 zyxr~XaULfRzW)Nj$Njgzs3=99DG((+2xtO`QyfkSHUGZSZW5s8WWB#jq@m+XyzoZn ztA3?N?;rF22U2RMpFH-D>W}%60wC58zm8^k8tu)8#;-Jl<4?i=a4kRK+P?FPY;*YU zW`9$#KV6i7ECD?g;BUb{D)`?5{$YO*1{*z&hY(I37Hr&q;doAg#9 z8tVS>Z8)Fo$}`C?pKjy>zweOjKsIM~A{#<-#N=Quk4b_{0r>9uf&JajwgV6*`wy{@ z07PNCUItbRtoAbxB>0vD2-x_N!U*?p0tqlHK~?A(7*8Mp0^A%7c2^R>M2ZiN#q%91 z2~c!)ixcre*tEI9tuROc+ zON`{454OC`*Y|;-ug{z6Y1~oPZvy^D@I93J8i=?N_)m%JEqSmD*te+x%7F|R1OhR> z5B6qQ{LAk}e|wGfuF%~$B_A3cc)27D$ZEqMf^h+=G{iU9B zqRo_MEsgY?d1A|sGgn4Q75rz3P(~V~XCak0^v&lC>CDulzuOb?SBd?3Appu4Fo6Co z_{WKT`RS&9s$s4z^Jai~1NEj504PL2*&-4u0kE@i+}FweaDGYvH(mXkxFYontJ!uYnn}7QU!2dz} z#@nBe008d3*cpxoW%6Sn#8+f$z$PGT14ajOhQ$cej2Hw?FW^47(*-7ORSe9<#Ywum zg9Vy+1=)_GNab!84Y@rj62OLt0H2TmF7Ou!TN3ynVXeSVy@Yw}A*-jhAbbE0Q=l!! zfjqXyV+6tQ+Q~I`KnQlPdm_M}?8^zyogRx0Vz7! z-#JE!0w~1*6^2b~=mN2S(;+@B{rSYk27o^R|M7SL^D+hYTV?WX6u|L)+_9BKkE4C|Va(qDC~m*-A~dHR@P886 zA2$rq043X4{q`f-u301R`?5162eX06U6MI7C?z5QlHkms)f&bR?C<`y5g;5J_<>y# zAQHGfApsuoh2P|6v%%ip!97R-rMpllaP&-!E)LQb(9qSqzI&4ZUP%A|lqm^d0A$F< zC(nkxn|o}(_?F&&-r)NrFx98nnsr^&!+|dW_{Ri(62Khj&tJppk=L;Q$}>en1l$UO za+~uzc=s`YdrtHAiGd{0fdm){0AMQoS3tx->{oJs0`{lCd>R3u^}UMz%^>twujj{K zL!gORJpU}@{3#s1@X`n>wt$~I$3C3*G8U}zl@FetedL!DgPH|Rm}$?(vbVZnW6DzA zbIn$>&dfN|o}#@6%iPyhZp~t}rOlKuH#WBBzV@^}UO+b94aoX{5n036bLw%=gK z)>*>;3jt8P{{{Fr$cV@YNK^3dRg~H*;IF+7qJb_ry!1K_f9*}^E5*Lc{Wq(A7L$Fiz{gNUq?8424I{lTqXb< z+-ky3f&7#(7@qHw*X#fk?!I>P`cE|nWD@Sr$z#LwhtKA_Bmf+vQW=^P|6F?y1?+#n z;MNOEq)wm`N`99BR(q8q7^UMTD22hbkN{Me9ql>73Y;Cevjan4NC0*qdw2Fu>EPCb zO$W0cuo`xJSK#sWK*+tki}wN?(?R!c129h5$Gc+y{^r=9YJdeGGD6kJ;85F=0VW2w zl0q12L_i4&@R~9}2Z4v%_x!=leDz{){d)lHfd8F{fa(4h0RJ+99|3$0Y%Y8a>xW*) z-fPc5EN(sW^(!7H6h;p|a17)R?+Z+AZo2pw7b621AlRk~v3e+v0soz{V^Yb00sIfZ ze@Xyg*meW^!-WIvefU}2{@oXm*PEJ`yiEbvRbrlsG>zKKa2T>*d6sCu6y(vbxl3}! z#SP zAk;fZ00J0DfH0B(`9u;R1OjM|kpNPw>j`aUthO<-;ze)7;2H{{k7eAD~9L)c!QZ5gLXQz#GsjT>)Gmtt)?6`v$f1U?Q^Rg zgQXNr+qtE*rz_~zg@`4|7gWFW^ zvG|z>wekDqxod{z1YH2y2ee z99%}TdJ?e31o&eYw2wr`VsU`9^di!PeK3j^T$Yp9TLE|pNR$_ zVn^7p77du466}4X!TQP?tE+|_A~X;=0673!`y94)SXC663T1|&6f85lehxhU1`t+G z=^SC>KnJpOmyOeVc-(;2!K4S`H0=0pA;^l80f=E2g!o8qHfX(>>jD`#!2F^Y=T)fBb$~ znRV~&p3$SFmbj-QBOhILD=RBc{(j%@`JQw3$^H9?zb;4mmk0srdxRfI0?48eQLhB( zW&f;>SbOQ$FnjbYv&YUJr~>Gt|3h-1Cjgv8w0oahSI>P9tV~_BHL5nJ14!#0TE`<^ zw_v$Z>kN^{eHj@A|B~&V{utWkF zxy+wgE~?v7qX-R2Adh*uiHAr?f@?s?{X5*M5}bDs7|E!;vD$e5qw)Ol8S&|v1Lz$~ z_I*pq1RH+_nF`v~K6CvlOIEmuIjb>%0^IU)GD%f{tkL!3{ZhpLven)BXMK{VvouT*>(9*Rb`G&tOejqz)|V z8I<=rP+G3xKuoQ#ROr1N#>x0a%JcE-uSHpwIH(+6Vl#-_||*dkKIA3DA9<5B9CRC-mI|E6@sLB22zz zObiX@Ki$vJQdI}Sa+b~as?ij#{Zy()QW|GnS+WXFWrnxJy!<|xq7dG zIU*vte|9c5=Az1p>f}exwx>@;;)&vZ%izD;hn}?hl;F1kw}KxN(#n+0Q=epf_G;?g zqst@$7a$b|N`PJskPq#b`^yp$upj}nBLZ|G^*70cq={y^@Z$fved*hQEs+4Q=o`L7 z02ryPeWa|u=$V)p+jl>BLEztQ4^seqF`a4aCVl+WxO(|}4Qb6oo9h5bbPuhGv{+~n zT5Nof{QuDZzF^x24)y{C$(QvU2a^EDY35su=TVyR7?oArV<7=jPXbgbjTmE=NdWec z01|R^tU^enq7&;$08fT!C>K28R^giAc@kKaar?FPRev$3z5j9BeLn7^JmKH-)e60^ z*!h11o&b4G2EaQv-bb~4gz>p67wVl(`oHksMVi4t{y+3n`u8o;2Iz={jx6W^ezt|m zfG&NY94mj#OLV?Fb1V2N69T!@2!#m9uPd+j4C<>Zjxhd)t2uwqC-EopCCI&4ynODU zdrA3Ev+4E6#|isq0D*E|nC3xCH#W zZ5^Zl$YL3S{=_mVaPAp*F?;J4>3-QWkojW!NVwuJ$9n9H6QW5K6Ov3y>s-;4ypG96 zaW0x7D{(H97_CayjyeM1Vg&h9z2^@a1Nq7!y$|gx$v)3EfEThSYmsub!J}mjoIejo zS7CP-RyUZ=o`6Y}TicI<&s(U?sVbgoCT*^0Dd!YuS);kJgBF;g!JP=`d5K;vy#Ft@y2&?;<0Z;&fc7L z@Pq=!Ll4qZ2hz(!E+vozV)+pvbXvlTT+V}@>wAwgINr^x4LmNtPsp>8!jm8g+(1_# ztYi|Pe3ezng1>8DzeaP_lzs3zcaJ#Z^l_ns28mP@q90NH;H%rV}id5 z{H@^610S_~=2icRYd`!lPTu{zGGQ1_tXb@L`SFW3f^GxpalVh8UT`ziQ0B{7fXC9p z0?>EG!#a@Bw@&iKB)_ZJ-+>YeC%5p!>_C7l?zXbW75~{c!ig0g`u*Er+LV*>-j@eZ zWf@avS1~{H?0Nj-o2&Y@w~MqbgjR$Wu@ZrBLQ??#q5pmHZK*Y2H(?)quLiiD zMSDPQHco#^&zuAlHtYs=^Z{GjYINra5RMrs>B{tRo3FG=STk@&yRCF0l*|ACAOJ~3 zK~(HarmR_|b0uLhRP7O?ZkW?BriKVoMH(tbKqC4Gaih)+?M0o`Lg?cHnkqabcTYsY zD+1p%zVQRs)yM9;ZTFsEG)pHlu{LP)H~hvF;QOzE`#}CTV8eO%9!fHKd%p^ zAG(H1_Y5!F9uZf>lB5ttP2EIYlB#(?Jz=UQqHZXXr^5Y>ChXtt>RjXkn{vRvgEE+X3_$G=Gk;Q8iV@LpmLH<8QXPTF^Z=1z-UY4u==kxc$ck)8^kwhecCNoKhCO1up zC%4=L#6*&cq(n+0A+-_`jGjs{+|TpA|7!J@L%SU8i%bB(7YBr_Gi$aP+bYz%5GSRx z35`~*jZ!eHB9fA)psvYXFjEaKhPj%%iHnN6tARR64ADfu+Bm<`@sJ1o5k`%hV^vpB zC}g=`l^<}nDWsoK(oYNVwWZSNRkw3ue2(hTZ!Cbn5CB~c{@!T4#JsJA1V{yp4~J&h zGaL-Y2pNtSd&z(UF14f#$R*}Oi>YV%T*`T9%pFU@N)G>*uP`DnSG;nCQ#ZA2{pyr3 z1@)Rv8M-u#K_&qfV^E38*r%T*;p)5d3lgA)BtwWWYM_l!H3fV;)g0psO=O1lWI$tJ zUri6$OXq*HG$K@uPt3hh5R2aGC^vZXBsaJ@AOe}P3 zFMuFZemUpQyNlA_wKBY=d!O?`#Biw?n8?1H)5wzk+%2Ia1Z?oV@;P>MMrW@N_xnd* zb~AFr2A}!Ww`LMx2}BH+y-NFhR`dAYzg>_1#$Sk7E7G*cs70Cs_Ky9qnI@-l{CR2h{ zijrDKSK1NOBj#)q2wukusUk_l%_?#xY(9j{-W|dJz|ofgerm-v zVlSMvfRy;Y%kph9c*+geCYew(d;!k$4V%bB{~&UYET;ZLAMD8t4gmkdTeZV-P8u~l z_?>U1x#IEsir;tS+kyAym-YS*vh+8M-SmM|YxSwW(xgeSq@@O-VM)YH#1eQ}o6+O5 zy`cX>;Ge;Mcd4E#pnoc_xtOnil>`5wEs+32GGI7U+WUWBC;^Z-m;mU&f6Cy$&4iMe zibxW-pkn5Dazq_7&%oc3s4d1&FDfQ3wE+tP1cl-|dQgF1lfLbHaSu zJ@8*1Q#%46llIjC1b{98{(&Tb7trtJxc4N0eKac*`@(;|sMC>;yPHW$b*h!@JGN=ct0%UN!n3F$e5kBdTmFJOKUP2tS^ zl-*ySbN+!+(RDbr=ycNu)S+?CUx}Yxhbtau0VcG743CJn;1OmKCQr51*k7Yb#ph#} z&i{xbW>rJ52@+bDG)H_TmwB+3pf$l@tdVHys?o)QM;8|XclED5`r_ZZZ|7qVoogR` zeTQe4!T*2+=>BgL{2zeb2L9$efq(qeUF@EGm>X|bE>7BCSYjMM8^M_C4|9Z-@SOX|40g z?}McW^>Z9PaR3Q$#5m1@1Tb3%Wr+mXPFLv4bZ)F{>29d4UafUw7i%XDHq)ADQy{c3 zsn?mat*eAo#|p1iqPAcaHG&XH2ow@PQlbhqhNB*FF)USXAz}nqPgEB8&h_X2+xPE$ z`i}eJnIDHfD!+_0r9XDRz)KweY0w{1{OR!7m%p3sYaZsh+g_cAsRH_OiuBl#!YDeq z%_#I-Soc|0cCr`bN8CdF(}Dd?<}b_V)hh)$%}!4^co{!CP}F~Fet#OxxcB>ii#To; z|I2SW{0R%vT{;o~_FbVX>+k-{c`{QxDJh9~&JL24L<%MoGpG}ctn?1QP?Yg=iT)q7 zeK9cq`Mi$5Ue5{Hb5}0eUhofJH~|0`B>;%vifBwCYGUe=6#*`&JL*EoC$-SwVME-C zAM8~Cq%Ow)av{BQr~ufj1jzf@d2~StxD-E>ArX*Kw}_H6c>_iu?TP+J&&52W_kcfQ z3*f((6v(})$Ybf+ERXf}5vcsGC@pog3z2nxAW;2^pmn+bbKJu231y2&cvfco?=8sgQ*d#{W{~66QWnEn^$ghUi$nZ^V*|nm4W< zH2TPEkFK7irFQis(Zy>&wf4MsjixJSPtWfEFQfQMAMtk>k^oR93nfk9cYsasH-jAm zU)$!MSG|p!-t#?$1SnCy67BD0ybLDyMkV=miW86mEe54J80I!-AdzLqgLY$RQ2-pU z2&Hw{K{vB6&aqc0T;K;Q2kI-iwUNfk6dSE< zX&Y*LVzt)sZfi^?sK=bJ&YY%=KC0K5%TzEWwn3$aOaeF)895$Z4UF0=lE>r_1f?R7 zTru}l;X&NUjo&Iue9PKR?|J(C#2tS+|MVM^+sP$(yCCrf$2P%#3GB^A`1b;@gw2~j z$^66_u7Ahhq-rOHgzJa^DcfD{ybeEM&`BU4H@ezB{X`${x&tid{`cp)yxpI>4^#|` zPh4!zPn_od?|dsZZu-~!ro)ex?eaWZxQ%yzKQEOW{gWUmDKiW8C~2G}m2na{}8_b?&MI34rB!V88BtuiTtoi1Mp~)bMFrPdms`9x&5|J^1mPSvylC7U;Wv#?fV9}ZrM(o*I8BlMMBC~tdqN#Q<))V zqGqT?aTl3bKKpvl*tq0lhjwU}wOv92;7N0$N;DG7u6oMhoU?VrIr1n>$FKs^X5x&_ zL%WKMq7x@HHlw0uVi1G5By~b51rTr&NN^8Hvj2*ECO1jqRWh?Ah#|El;)!{j9_h+y zIThxaeay^(k}Ag-FWArYJ|#XXq<^NQYjRzHbp1QoIQ>H8{8b>UeM&$F{G))h^p*EJ zMS$hh_~iYg9O#oMhoF8KryOiAj_+NDssJZT{!{+kP?ky{C{&@O0E|Ft%Dg8pW$qG= zDy#p<;Li)M_%BUVEd_g9+D;zvi!2!rIw~r}uns^w~3Vq-~E9fC2dL)^B(0^@9H< z_>JJBmU~|HHm>{dEgXCJ=}g)Yi^yLG{JjU>Ih)7{GE4*T-m?Y-TsN8V;%AF0<6Yel za@GG-av^PL**|GoR0W69C1FT#(1VTcR~!6-VRg*ve|H^cKYSjRoH==PKmu&r+7`-@DboW;09I>dw>2h}qS3H1EhueF z)GGm<+SnZ0{G5+<%Z|H_sAx43%!x9gB7!8Z5S-d0EnsNE2^B^pdO%J5n(?tmU#nmL zrrYLs|L|s&!Ske|*e0r!5-?{d`#Ue1vRZYofsM9(Q~nL_4| zSV*{5!J~XL#^CI`Ch3)!zhu z^kO)886&KRXZ@~9OhHCTC0YjmF{xBZOSDmN6G;hzfg4Q9`bmNRg@DP$fc=w!my5jq zuRG}9YYR2N-f{Sgb)AL;z+U#ZO94>uB*|1%lSopNlyNjJL2`pi~IG=wl6NuF!JBk?J+63R;g0Vz`-0b6EFEU<|1km)$)l}7bDmX?a(fJyTl5B zi^`#35sf?voK`q#a1OSvh9ld~6j+%vZH|&b$k=DL!>E=lTCJRrlu<~ec@f$xSnn=V~O9Yf4b1B-VPI9(PReF&?V?K(K&!bpU|GC{OfViFYaSCzSZl zmG}ZBh8gWOALRJ)73v4S6`FOhE)Ae40W1tu01c!Fk}?S()^oO9xo{su^Y=ym_YwgI zETZ}O-;oYV{+!CP}DO8$4^0y8$gg$iCm5p6C`} zwm#T71pZ$#yR`l{t%Q(jRzgdY0uq9Y&5=;KSa7T%s1R(#NMlI@NG@I>F5XJ=qt$iy z9Y1=_oA2KKi@&v#HeZepN76j2SOWjug#2URuLA#f;J1K}A`iUyJ)C{w1UKIHT2^i;_%7f?l?z5{u-#h5gzSy>pnERYa0Q5X8kpMN* zFuf=VFw;caWMfxgM4!s6$0d zBoJH-R&}!V9V^fK^>@zhJo8w)^}R^13xoVEJ21Zl#(x3ycJN`|ShS==g7L*9PN-bW4Nc}2lB=0`NSK)@2@5Hg=hx(+j%_t&6tax_Xf4 z;_6~8qMo-kI;Q@$N51(#e0KV&Pd_%h|NFh91h5nxm%)U*r~@_y|6%YqgMVlKhT9uw z`PAR|eQx~I*K+jqb@<{Ri><5z$N(agB}vJEq4T6d0_;h#>3fa$1VB#$^z{I8+R$(r zzP`_UJScq7J4*kXJ^uU;@aXeDRQ4Qx2>5N_|GV(J7i+1uKcBni&@Pod83};ECk7(T)TNvvC@&oY%BF^0-!O*lj(G2|I-ZFsWqT%vc#6 zq0(KSTVjlm;@GPS8d@fdJZXaj@zjdfsdj=>$K-9OJcIg#Cm_`B9)n8dP6{pNx2}EN z?|)+U&>bI}Km3M-uP#aLJr6;{J5>RG8~k?AcR0QQXTITs>|XOQ*S_m@RPDHDjwOrb z@ILf8G++Gfq5$Z+amdiuGVeJ=#wqD}{OxZqpIzSln~wk3@-xDFE9BCyf2Y#||O@4k7^< zthvDc9yyvW-4$^)*MvkhTyw>mOrc950fat+ zF2^#s-rYFOXy<4?R$zP=>mQC`%PO1xUsof?q*vhK{mBm__(M>?pBPwP54X3jdT{Z+ z4*chNZBYt!YuqE5`ADM4lbDN`AtsnBVj^ma79y^@_T!;%9nNzP?JLHB=rE^L3g@J19;jNWJRww2KC#P8G?`2!@(^Qg^jrLEXeK#}ev> zNkSxH!CWj7Q$(xON;>XwI&ru1V5l&!a@9~5tO|t)7?Uc=#R30`6920}e2vnqD{Yt( zZ+I6Qr(XzXZ|(tq>d1frDIg(}02Yf9U_b)U&1Uuh`hB@odx?R;qFU+=NS6Dn7ui4g z*I%RocwYwqqb1OKZU+9~(>~3a6AjK9i^uUB9X`-a!44`KKFq>8@knMCmL@ER_9eAT z>3?fJjXQ)2CN`n5)(MK3cvPYGv5&QNG4tr2Ndi|_iH=vOCU-Z#dUW%LC%S(2{^^}R z5=qBdOu!ES|CD2!g8yBxe+m8r^YT(cIy zqa~g-dD_P}Wc5vdKL5rj}Kfj^ZZq8*V32HG)3L~}9Y7#N4WF?uj7Nj<%O(JV1(l~4; zSo03lm9MZ@1+W(c((fMv`ma*EzyRRI9hw}i7WX8{%+*xHFi$QL+%QB_GSMKSR){lm z5b4(0%S9kPHxmQ9$4_(Qp_`x_?^|A4QJ@;0D{_}{b6I{L=tD*e0-*everCBh%FmJt zU~k3$VJCoubN>2!GUzY+9q`|q24F^C08qqSu)NN#I3n&5bEI-vfd732%%L6HSB!lL z2>{pwLY$t&@6ckc&N<9R$X-NeTM)cSWVED;58!2)wRsc%|&WAO@5@l z_P!U4uKuMvw*LI@H@5Tji~QRH{<%Mlt_Uzyh-L|F`$f@ei8+0qFMH zbv!46&bOhbHVf@WMb=~;64|!}-L<~_2qiCreCzWWc;?}b3Dr+V(Gm&F1vg0D7 zu4-@r{~H%l05I4u+lRpatJr+c_MW9Sq%x6Uf|`h$6i{m}7DSV~s!LLL2}!WrC#SUF zBqsxOqhIMQMZ(#>>LIRN8gDu%zh^8fzBF8S^8Zl$Z&5>_yt|j`GXV5i0kquWZ+{v< zx6IZydE%LO9w_-AE{>DLJs}oF%pn*4>(-J>BdDk)f{9c`1u)(_;2x3zhxQd?Ut$6P zE+R+X14OO_a5(PpgtL9bIkHpol3_Y`XS{~Aty2rc3F65m;H2a+G)Su4gLz2iR3S-n z!_-jA&khL*vxJ8vDJ484)FMVSB+lFUhF30`9UPURS9|bJ$51NC1MyRV_!GH9K)fZ; zqO?ap%f`xESb6wcVYW6X4%mVJkjViXqywZ>NPu!xQh6#qDGAVB;<9vzCUg;hEjj-c zgsKn#-MVaRV2UyW?mhXJJbvs68rJ*vD*rTLZ)?jFt}9y5kW0qT%DPz`Q@QFck;%3| zE2QXXg5*fBOcE?*i5}V|w@d7QRppX`&%+dKjFt`oq7xUIBKvQ>HTR&kizQbbxma{@ zcM`UIs`Dc7`0XQ7T z_ksT*2{6P1`B)upd`lIs-?oH9i!gF%L4s!=t-rwg>CnC~dnzOVz^BT3Kmwc|$=Q=D zb|Ou6ll4pjSgX57D}#wLAOUoJO}4gAQ;k=2tgT^V<{Eu$gjtJe4Ko@lg4cxv2x8uv zF`}XcY9ccqGm^$V&(imdoBYvL?d*y*fmjI{v%3o>9o(BCWjPdH6I>3liXhp#RW^5ACwHF9QJp2TXc~ zHjpBB>q2U8B{(vHnK>&fKAmsE*qnA1@#s=dLzA49V2ITot7LU@vr1i(nP6_AN|H!H zHMymPhLn{(BwVAU4F2&H2_ZJIIc{c^RgN*rx$%q1er`*WT>H8JTSEM&O7r&u@rRX` zidgS*^!j&l?94a9=BWcx0Xk*Co|*vSr7l3BM!N!m`$&M{rDeGg|3d1o1EAjl|9Y^_ z+ij>gFAaB}yp7Wf8oSGFcR%RvfL2>9r&LO7IuR^>tlvDx$2=u(5}b$ zAxrvYvrFiI5mqaKv_cbFA1C)Vj1kL3KnmiOnTx86MUSek9vxRy#l@1l)b1Yr#?|M% z`&e`3r|;YS#82e900%_=yJ%lW0-SgJ?+W(w;6Gn(veGK>+7G{s6Zbv4fPX0}09gS4 z=qJW-B$c@2@Op_Nx;p>>AOJ~3K~%L(?lrh1X-yf& zi8pnlBaJj>Ol0KA)q@$4N-H8s!~;%CF6-HvVr-cl+KK z4Ya{)`eQ?o(sc+ZDx8z{EGR*5oGHbE8pbVxGiMO)060 zMimn^+|3OUEqGRK!7P9|tUF83Cvj2Xa$6Xdarro;u{;+JZvn=`V za`&H%1jyij&ciQxC({#W@@wCBaRq?kMB+*kP0@4IzXe0aDPOBx08pa2O0c%80dV0m zK6`(ULp!v~&b~|p04%%uJ{w4pkwvd^)?sTKj;z9T7gp-rrp(U6*nHNmFsh@I%&W?6 zlEh;OE~#}v%tA<-%n0gcmb-VElpual189hnEE0%r79EKV?FoxM&Xa_q1n`h^iCjok zMOWx6cFS)l@sU9DQx$PN(1cyutN((HmB*+ad1;>#AXQNS%*%cu0W1|Fpi2ihfCSik z={oS=g)yscUF7`>1wftK{Z%!DF;wHcA4Y7d^U0Hc#OYDPF6&GQ%(j*0A3^gWqa_w` zf7doK;tTLUU0N#r`rBZ%CHPzk_j&E12!i>g~LBIx4DMcpy=qt(^-J#)SO)z9pF{6`|~ zwd^4Qa7vEvfCLc7e?{>7!F~z+7}%)gffv7*?W;b^^&h--0sgx@#9RkJmfWYO*anxP ztcN52g$RIyfjq5beQ18~8y(i5q!4%){qL{Bg2&zj zf2kvH6y!~gjpjV~ZSUa3M{<{dCEz`{QU&=e{eR~jdB6Kt(gp^{y4S>d&LgjQCtFXy zx4hS|`@p{sxP2JqXYf}Cbie}q>-No)7yQ>ZOQ0cJCK!gZ@`-nVe^|YLIF=p^{?9z?Bb<5O2Nvptgp>YY zxh}w>4!~e7;zX+q(S()ge;O(Pvi!dlcOeXF_#QZR9{TK|UH0~6Bmg?QXod1Y6!HXs z!-li9=^QaDmyJ7A78C(+RLTy+u+#tdgh)`#x^I|RAz!y-o? zb!;kPb38O6-a6h2M5M~thq*(2_^|x4*`@Qp-D*S?8&*8fgy7@UF4O>`=6H=*a#8ix z8dMc=T*chHqSEBS#aHEuN1uJ3bs-e+U*w>S${S`3su&;I zm(})>au*>15V&68{lF1}S~zo-b5~|Hz;PX0+}hM|WM$AMaBd@u+ODoySZjoxU8+f? zI~pyRb4126ZRY4`%$i0wODGVdx>q$5)P?At9H|3s3w4TUa6|$PP?20yg_As~x}ZTw zt_Eo0>60rz1N_ooHuwKb@^sSo&}&0q>%MeA;FlfwPlCL|VFS**;Dc=4a1YnN4q69xYW@coY8H;nlYi38vFld0$&k(VbRV*d&;)=UK!l#?liSEHNGanq;*e0 z&7znFF_)0cMIAEmMb)Lv3IIBNn=TOm-8LTuz6)k+=c#v((n0x9PN5s6ls@7g=mCG1 z`>%x<*rR1#jEzIEKTHd-1)$ISPuz3|k3IJT%-7E^lLogt>9+^f|2bF0YD?~a z*8w1j=B2Bj(4_&)N6!3$T^J7fT@LNgE-SkX2mpBMAf)S6Zn;7^+ps=@>55NRX1+2H zG?U=DIN8W0xl3i3i1H$(D4>*10X4~#*cAu-tP+1V(EePYeN9C}pdC*+`m}d)^vny<%~M4IFenbF z0a9Ct04>_6t~g-1TqeE5&{+omwG68Lcai^L&VL0u%D}&xK$viPw9Ut^_#@70#d%iP zV#LmN&F;?zrk~0+0j3ypA}vx#fJmevF~b(%e;1XbpAP!8yG(o+XDT8y!RNTlSyBKr zmTLh3tQvo9s1wpWBdGZZ@SK4|D|LS0N?~22_SY}T(2_S z-d=7K7)Z@D>C9C|YpWdJZM`1XYN7S5)P|9cZQRV+8CANbq{f3!ywx@;S|uG(k%&kV zN7R+%F;!F~mmqFb9$`=y09?e|(jh=Jg&XRVpE+3{ed8bReEb(%k55+smpshDqClW8 zzGwj+9|e6G`0qIKe3+g%!#)4`Z*lc)uV(FmoAM>_e0i1u`tq^;i!W`@PMqd}*S(cA zZWgfK-{$!DFH8N09?9af`oC0Z{i$14U;T#F>g1+lu7c-wVzn#D5pgAWqCu%$8~0p) zYz{<3D(~{DWuXFCyV$e((EfVcg}|sIGe>g&`iabQG+Wd(xn;&ZB-5mrrlg|cy3-ft z>$?C@(g1LS`}4gyUpvq0V|n}yi*eY{QvF})*InJ6VPe2A`rp+9p#$p$@aJ`(0?>i@ z`PwGuZn~2vPTf&}zbz96PdMoZ_mBvS?VfyhoLW~ulSC6Dsg**Gh**#+S-D;j_pAUI zwgEf@|A+RKX_pBB08asg$i80XB-rjMlqaSuM_HLS-i!m%jy$(1n}E%jSIH#>#=$UC zvkKFcOdv@hku-@~a?^ySgn1GP$z3BUM2Hcuqmg2pivxz9m2}Jl=1Q`h9uOT`7g|?h zP}=_~(Ee$l`Po3b9+-z2&D9^`_{yWyr(XzZEfWD+L7EpbK#CGTa$10BPXu(;Q+#mw zhSL8o@~=-K{nrU+#yfoc#2<4`1Lv8r#f0tc5!*jkv2%A|$Aw*oxfyeF8gp7pwAPYr zj@cBq9o%PIx(_)$;3qr#41y8=@|=OS$*SPNB)c+8!oMwUmDDFYC4XkT)>wEj1% zAjA=qs-dyqF+{J;TufZl2E_r@gGN_#7Zo>iuUtJzba(aZR-gT6Yt6>P_s{P5ad%(Y zR|5cFr~^!TH?e;p*dIFfX2Fg@8nrz5;`gw9)x%u#;ajNVxUZQ>UzBJ_0_=}Z$^iW5 zseeB?8Ojtp;I9Mef3F6ZZk*x%Z+i=IH0vW0n~r^#VIN(tRNTiJ_oo3k&M2IC_qFT) z#s3vel2B?qQ5I=j5Jx5@gJD?3_|X3@FI)KIBGsJ>k^t9|ANr5dkpO3}Jjw|>&n7LD zHi1n=+O??0%tkiSX4Wh^1XSZ%$AOg0b*{l_5;Kro9I&P$xyPEOY6+t5W{eP8Ce%a> z@ha7xLcCyI0QcZ(;)v<0%GTdH`i=kX+s}XeCpUffm0rL`ZVxDnZ5XO>9J^nTmpZ%& z+d2BFXK~GKuLfBl9y&MW7XsY8`3@d?@omKMy!WtQ^ITJ8 z;cheh-*R9^a+6>x$(zz|R|qaL^PJ~j(-x3FoJn(lETKY#zyX@>TA^_k?KnN^FBNK3==L+TS99eT_yFQ)dUgh&~v*=YWGIB|^ zSJm9xRG9>`kwvo*TqPw^$Z7!dgoMdG zkpdv4tzYPi{w=Ehcg6mS^gm2^aP401I`(I5GFgECtw+af{qvfgPt{CKnI>VDoLMp& za~eyu7Kzr7Y=+qmZo8;ek5&3LA4rC>Sv}O z`;lnPwG4Cr>9(^!E)fK87yR2C`wgg`m%q&8r|x2R;|x#x;H|7|Ub!a)KrWyH=&h4B zI>TB3J|F^yQGfQW&z-uHhri|Bq!RTv9J}AJzvI}R$iM9Y|9k&u9FD)|#$$i)f0-vU zEvbwB5)6W|s9d~Az41f;yIk$5k^rZGdx5Jd|F4`m%h{7Fej=fpU7J8_b#}C}mWjg5 zM%HQ_YHQcmBzKnERnykitp>5<4JPVzXSgw zE9DHffOQW2_0SHmgCo*~>}?wJ)yh4!!BS;5E&x|0q^Kq$Q3Xv&R3_obXSUKKKu2@y zz-x+qG;crgj5|61jJrw=9YImnAA1_3onwr5jmlP6By#rf;*Wp@1W1?WEz*l#-Nzjy54_##zcfAoJp0kBrz@ac&5mH(5NX_Znc z(f>ABE9SYTj{6LEm^@i0fI~a9%hoP40st-oLh{6B5skc(yf*scWC>;)OjqVPOg#eP z#KkO7Paz6b6+D=E8^lQob<6?;6Qfinmr!N!uhQ2bL82rQsu7n+NGZAYZjv&brtF=l6ZUCEOc84aoj9{S(qX`d?zPzjtcXbNzjA`5C)PzctwWeqrw5c;eHljrtxoATQ z>a^;bqHAzWDjLMQx&V;e6?YMDEf9iuti*4Tul>J279PC!6SIf^8^hPSir@~YJ4rhK z8+7IHToZsl0e;8f6*(o~{@1>R6aPPZZyGJxb)AQOd+&4at*SS5H_-qIkRS+x1WAdc zEE2RRin1u%iIiA_lV!(Cv8|P8S+U|_tvKegbDw=XR%JR|esrsLqP;DyKmK(e!NDD$TY>*81iu^LKVQrx!#MorLc?P{D?lJe zw>G!@z*jf#`gJ%Wq)+=-Bo;v=K|~+rXObKtb#wq!oZ1CdNP$x(BVs;>%7nlaK#jh< z&H-HHMig*k&tj+M@P%4EDH4&zB8kRGBHT69B-ABBB@pUR5d>wszWISC+As7;sKja- zS}OzKm4%M~$`2L_|A#j|2E~^LLg2TT#6Ul;r~b!sTouIui~PG-ZnE}VeR6F)0sQ}Q z5B%5L{;doBo%r1~K|q!Ii+lFE$6d_f>eS>E^?*bH*{A*oMd}cwUORDJQ1@i?f3t>e z>_uVr2mJ=lwhsXK-t`lw9ce8XH%7lm&VcR)q6r`$3#uB$38_W^GQ^dVDs=7$Q$!F| z3R0|pf>wd{g?hn03=u;}F+?@MARqy1P(eULAVE?crCIbU@2mX!{orcSqO46|SrNac zhzA7zPJ`EiqC~gz1yt6dn%_30{jY6HR5AekN_vstiQ z1FRpf@Y+uy^Z>*G#0~%)Qh7{p8X8jp=M>H;(gw8)MMk6y&5n|y?+9=LN3CP4Qxoh5 z{@s1mHg<-+u>R*}h#*oT0tpOI%%B0fT3@@bAldJW*qU;%F@zwEBFdZUoA16{o_<9a z?ah$27=^5~02c3f0i)Og_-TOm0{ljRBf!nEf7|C#suq(cZe4xxM z?#rSLpj`Dc3q63x?)nIx`pVzB3jF)G^x*%b^6@Ig@#@sYz$o4D3vW30r+&OZy$C!c z6=(9I;)Ui};S59xb*i~X6)qa^CLlRB{&&6GRsMKZG75mFhf$@E5@%q#4Qv<8rGZez zB$4f*bfXF?Gk_|Z16Aiz8UvGy&H||lX{CXqU@SE{Cp;z80=5XLqhXGK8kZ0K9uV~H z|KO1zB%p*0opD42LLyXqC>}jwEh4y>cAsh_-TmdV|LzzRDp%?JC-=GZZ2+wxesTck zUk`*irnfwT*@dUjJbe=+H^c9)z(25ht#11Ok9^ZlG{|AxKItE!`m<64E6COD`RQpweB^AR@xji2Nw&E&*wzYxm`Uz1Q;h&eD&^Q9QhM|4UL&N1)E z!d!1%q4juJicdAa*5ONOXf3k=Zk-%PEtgSG88|kMiBVRhr#39xz3o4nW`2n(Si4vM zUa8A>eGHhV6dKbROP98ORq{_WiLZqyJr^y{Z2o`txZ(LY4wGL zebRM|KQXV7+G?qKE1lcI3t_~Bl(Fg@e+7NSHMZ~R)RL&$A;gj5OvDBd%+j5!J57M6 zU7Ks+JHcTJZu@6^e*D7~O0Up!wo#c=m4amox&7Za680GN7&d33g^l0E(sm}8k(4u4y7Df%vj^qOmUO%V0{!GgyY+vme5O?hL*+- z!R;Nz7*4nn@&xued5F|xIc#ye@#{^Y+d3aLOgMQ=DK{%x;}c*iw+$L*8VsJHFG$`r`y*0&WB zyieq`q(>l-l;sN>i*JW`oQ%$)c_&>;*WIRaVKS(&f2%j!ezN{&TePwV3gyU`YxYs` zvGMq6XhS2`xABc*0|SY)=-`IAkM3aY2bm+_gDE(LXZ&I|e{V5R;L%_AZ;~!yzVrmM zH9KKo-r-D|*zb|t7#gE5aTwr1(Pq8t90SbyaZF-1D6Wg#tRHBN++iFO3ME&l$%L4| z3zZ{J{Qj2RdCbi}@G{Dv4y-&_yBylmTD;+gUj#qQ1HI2KR+;%$QL*2lnCg_}3Ht0_QJ+kSedMFWo1pJiA8GEJ$V>0U0lB=V>X(kFoi;!BCRMLg?Jq<=9a_z?UAPs zaZPB--UPIC_t#62CtXJ+$^#L6`yZi%>rYJ?@MiSU#&?_^5xq3SqERw%R6gg1qQ&1W z3)W@yjob6Y)l(6&vrzqjw4u}jXK}W8=Qb0$h};r64TVpx0O~)1 z`G?YLQ^YE1d$%P-QZ|+Vm+7hmStP^M#sf;7@~8m4zI~|zPZW9?@$}#x?_FgOI2Pkt zRw1&N=(+f9IL%<5r?k?8li~t;DfnbHGeYlnw<}Acr(EYqrr?6F@yXT zVoS&%_2F{Ved;^{Don{S`Z+|76c7gT0XYxge~^j2JPb9@7bcxB|V% zfQZArkEoZf22t8e=YOxPkJq2eaDwWunMOH4M&`BK*OOAR@sZ{XbgJRu!1XwQY8b~i zN%8CxWi%U2d4p~+cK@+cOmaTylfZyW)T0>xoh{&0XTlj~$rg>kE^(;CMkb+uR20v-dDAba)^adT*yVneyL#t3nEyc3mGLyJe7I`Y zaRM_SbBEOx#fAI<=`@9R!PdsWuf7HzgmgtsY(C#COZh?cH;@R>siMeQ^(GPsnfBnf zietKd4Mx8}KCEY3l%jq~*8hFbE>NNT9i9K~`0_jIm<>Uwphj~-8j>WdF#Q7&qhN|9 zItngkfsTj|2$b(;8x+$@_#RC)=-Er(<1=lzhHYX1?`_bp@k>o;!$Rg4;zV!xz*)$| zR35XanGM~zXh-swG7yMmb(!ph%0M*0UpOeX7lxUBbhv={+ z+`ccMkU9k`jG-?Wpc5m7ON!Sx-Yzfy81C=KtD1y|tzh&GPDG-DgVFCgfqbXDOoo&Oz<~H>;SQg9 zoyJk_KhG?r?rPn;H#tc^{k(*23Jv7Bn={N1oQ`+fg-C0}|W)EF;R zB8$To)^;PwlQkG`^1oRdA#UpZN(=ZgzxleZbzMXy9r^A5ZUIDpK6*))z2W#RD|q*CA}hBvXIdsX z?*u?dMElhMmU*rRQ%1W^oYc2I*I}W(4Fdp9YixK3 z=NcMRAd5f8u;v%5a&*f@C=iPCeC2_mWQmVaOY1$bZ#8M?exi0FyBLi7Sb20u#$-h7 z!T7mgl)&0*80ksAfyfIr=sA&yaL9j`ma74w?{+Yv^_YBX-5-_a*yxsk4Mhq#5e^PR zLdEz1`jwkM2M&;PPy5Bv>X>*Oq>Yg!kc<=S%}of+J&xe@LUt;`^GLBZ(|lFdS3b77 z3B7uPZLtTgko!okn%Zuy<&bIFk4L(tRE=a)z+?w1jOFqC)F6so{`>s0SMxW$R`qvxv2rtmCJ|V%lO((6d{k3U9gYpejBHC}=SKdu;&Yi?3kgUN4d-(M=N+J!UD<^GQgh{d&}XcluXmka@|h!%aH|)3*=<3BY3g zGRI>3=lHRssr!EsTaX?ByhB|=GGcu`bXt%Xp(8IUIH7}Bj00)(n-|KF?dg` zg6Jlh2sp!~RlZ=dfM_)`8TS9(8Jd41IPO6X#v!ENiy$YI4=;#h!W)+#54D((DcnVU zvPHe^#gDnUw3}m;i8If;#WDzTCPzpU15OSAJ_O*AqiLqwtlT5*tUr5NUx%YYwF$7& z6?d-_O=qLLlkDnlGtiTfXfYq^8xIZnpZwB9Yh7CwKVM$4d@7ea!UzQ>Fs8+s0wI6W z1e0-cKi$^oY&*UP7&FZ@C4<=;Fp^sVe+O@5ZC8!MNHEX+$FYh+PeyV9G$7#l4 z*+#QRv~X~w7eW&heiuaRwdk-=X=-lZr%PS%6aAPNeJH*w&%aF`P3hc-5@(Wthnc1W zJk>NI512@XqbATf@7?FO+pS}pYa3afzc{;aiXV(EL@=yjfJH8Wr*E%a;K6cNl%5lx z0qpVc%Yo^IZ+qFPFBbAAHXTCd;r7SXyH)WYx2HN8q`t=ZYmC46o4v_TYc^Oms)d0l zYqG~4PH6Es8q!8kO$d5Ua-FzQX(nJvH;9@47xi%i&OPu>SyL+>qm0CJq``#v3E=L( zE&12Pd?b?U4^62zm|WR&)Y3$Mx2R@~@7YwXFE1Mc%A8oFIs_FGijXHKKc@bE}&8*&Q!G* zm#Va7iE}s_DJpzYK8hC(p)W#%IqOpl|3l+2BVSH=*&$no7OCUBo*)b3P3%c3`$`bX zq<-pYY$rwrE<(rSYV6w_%zl#S^_l#e8C3tBGs-sXk6*&Wi}f&Of;K7#cQW8#94511 z1sH1lQ3mfh$6ccg{{C|cHaac%H9IwOovtpVlX0`};>Y%XXlvK=fu}n<<*Hk%3=y6a zQ0gf(tcU&4To1TBuAmm)9lamXM$3pjmY>O5eG;VWJa#=tj4%HnO&*X8EGZzv1>j{^ z!r^Zt^dwc87uuQC!`UL+6!jGeoFMY7&*WT+l;jdgAO)la=L&F0CJkJCK7fP@Od}5; zU4m!4BK8!jyZC{Oq(Z=%MdaSV^=6*uTYtii6yHRqQH9%9dSJ`-`HEk}n| zSh6HKG)dNf$JcdWJLf6vlFMCkdjs8|OcgS^xLdM#ZcLF+W8@Q#zv<$|etWlCtQnF` z!#%J|SiR#r`R7+mpYUiU(+U;KiU->~Xip+Yl^`Tos>IEo5OA7ZMXvB?IueljCxsXT z#xUY%)&G*F|I5!CC>(uv`xqUh9MZlahdZQxkOFLQGof&ZzXPlDR=j?(zrKcHNiHk5 zgee}EHwqjCxV&!>3#)seV|ZAwQWjEybKzN|v*NB-Ybox&Q{b#Yvy)$34fw2{tWIAf zjYT~&0tC(_DSNIG(5maJIOXVA9(NTk`kVFFK;$M>rlr^peckS({d&`-6W4Do8gDi_Ajv=HJ_Uaemm zC;_**Src~|%IlrIyT*pBvXEm*oURq5BUO2XSDHb*>YvGsqI#Bk;%Efbny-+kxWxz@ z4p#qYKq-qJxfcm@@q7hfT!>#=hjmDf$yeBgl;oVx!<1j*yLt@Of60{!c0YVw{~H`u zK0CHE37Fhh|0a-qSok4(qi;HbH$SI0P zA5XQg{mpv!cOG`Lc6 zW>6ze)Oqq2YCug2o+!YN=Z?hHm3zh}mMWR3@$AnCeqHcB^;z^89 zO4yA%EJ#jwrI4$o5a}88PcXTfmuk!-))rrtAdM!2CWAy+Ir|rtitqsQ!1etl=jqzk zio@qFj6|7I!@S~|325^J5HIUJq%;&2tun|oJ1!NP1yI5LZx%DZ%+`iS|WQKt^- zkRQ)*pTJl>Kmz$KC=rukS}|fHT>ds8itt21)k`!#7UIjRQf?24}>y-6bV1M%}LeXVrJU^qWe?i8Zvaeew_(0eKF*2>&T!#>~bJ_6?6lTBfVjY1+WCVE72YfLR_n$#y)}c{1E{bBGj0b`H6u zrHag$P}AJ=4`QA$%H0UI*UXHDzNDL+|9}khLfIQF`9z{tdS|=C8hy}X`){t#WDf+# z(sKllp9O`tY2Z5H8YfXxn^up@wHc8J{rgCz`|Rz;yE{Jc+EnZ5k0i@{|1XI%lyP1k z4bS-&1xa2_zIu7A+F*yPMP59L)EazQ{<2NfZvs)zv;9HObvs?DxN6xY{yFz}lmV+> zvZx!xIsz%C^p&{rFFK1p9vCu7~b2oB1?zMRw?|7yX z3c;eOUFeDjPAO?MyXpqce~CJN>*?Uyo)-+T&YMqo_!CiUZ-2ZNL^$RHZDkZXl2KY9 zZ#%^BCSGHPv%1hF4Cz*AVmM&!HB)T^PMR}8COdHw!S5Gq`z*fFTmDJq5IjRpB&|G^ zAVJ>zZh!5hS@oH0Yk%;SH5%`eX{#=BYP&Mo*0!FY9oWoA7DzC~~?;@k; zJ;FFHFZp4(A3H_%As_qfKdiq}ufaNLg<2%DbPklMjG(R0#(RT@E3ftwBE&SzG6a26Q|(QK-RnuSZP2zW^9oUr#Gix(7#>%S5BWM7)dzy zi)IRxkd>uR)9Gf`y!;!%Fp*)z8=&3)8Ef|&Uyd(wLB;t z&{kcQy-Z(=Q5Wb7PgQ9gRBvrk7cL9?kOhGr-|!mME^YP`ad zxW6@(O{Kb6ed@2CkegCgPmw50zQVJXTuC%qX&kC9%tb{5RpY3N21jCXyYO%oMh(|7 zptb|(GkQJ#b|v#NBQLoA+=fw7;(%80)^L%*6kUL4OHZR`?j4G+AIUp@xggQi97<o<+lULM`K)l2m23 zrk#N3;`}SkQbE)B;$EDT^D<(uSDhBnC58vu&g*x+QevTZ>CbCbQ10$@t*rf9)V+_v zlM>Aw$?oO28s#&l1leY-G5rO3&zAa@%6_l@xS5Ewy5|Ikt3O@mWEqFKYD1NpDX+}G z3;fzIA1q9C(!J_3!mamKr)Im1K|Ok;CPt>DV^r(_hqHS3vvocu#+0-2bT5^^qWh}- zyAF*j&QG>-If!CoIRav1lYcGsCy3=W#qJLI7P_NRUaJE4~hDm}@c6a3I&K%3_myPnHDo z+mHi`4;TryCZ_pOxh9-4j!`{C6aMEfuh5nIxfAr9p_4Y|EfWCA`W$;QG}_gtNzYGO zRw1Yo{r87xS(u2;5xJv;&323!-U5rW$oN}%V_ff}Oq9l(^_8HW=vA1TOfoV&>L_*y z1XtuqMu>B4nPli=JJ|~JbNQ4#}-l z$=XxTrjMF+Paj*orHkXBqOl%LNS-;I6yj`}DEb>hk(Q$~>XoD@Zw5dB*xt6T0@v+)(i zi597TOTyZcY^u!m+O`U@#6gi+VNYsoPjLUa|2%LiGK_nw7l-H~lUXnDuO9P>@@3P| z%Z7J%Ke_}ipF@zphTBYB4-Za<>MxpYrslJA#V*pONsJ7eY?Aux2mH&hnz+ia-gA}h z8R;GrYRKN?o*l)>eh04Kk{1}~uz_#C`ci=4;ea>}$}1kALZV5p^Irld5Kuk%w!97- zXZln|YV?HkTqJAL_=PDgbHjJ} zStX5mcl;|^4zmraFlru~cSOd>6&UDuO~^TrFo9k4J4c{*spbnn)lawW67$ZYdx=t8{=Md zIv+$|bdf1$u=tf7Rkqp=+h)G4>fwK_rCj!cl}R%b180pJR-2)!#)2awBZgjL?3|Lh zJ!Be`8E0$+J`|wYs68Vf*SKJ`2-DZvvX_T0Ip_mR=S!>bUja)=#h)3aPazD%C&whG z54}ROYVb^FUC);%DN32GsIJA!&h4<8{oIFwOukC8s;9`XxGMWnk-bUSKcmm2;V%wl zIZ7)61mKgkmolBj3oE)Gla>*E6;Cyp`zP^L1{%~lnEj^6S2CvCCS&wf?aq;R%B)mj2 zDoyU89t9HUtD~GH|FEZ*nShFTPAVCXf_ic*m!Zon=sZ~WGA&FwoyW|E4;cn!35XLs zQ&i*2jViL$jWgo$KRX;h>>1@tE@#yejoypG#{S5%*x|N`{QVL685_K2IL3J^n@GDF z@^>K}Fu_K<-o?foR@y%M>UFT_oFTgO#ma8S$gtANPTz^*SxW~SNIHI+r>tb6Rwy&q!F#M_r`*XCr|M26oXt!y*kM$`O-tk8#CFuL+_^=Qyw(o)XR=t1TcM6c) zInOff;+)^>rzBt?kb%iwhNV&lDq(;mTWkU$M#$6LrH9S#8btjjc^oO^MfTHSYE@>2 z;bu`SK`simZfVK@2Wbv;GAi6%rxkRdx=Sef*Z~%M8LtIDTYb{oYMPYcV({U%5nfV3 zfI%&nm|iTT@*dZPw?bd}$Dt~kJFRoNkjXcjKRCQ0FMfpBo~zvscBL3IKS=O}b0ndN zKfV>P1TD}FmDb%nEmizU-_gwUyEKZnld14--J59&LxG4{y5wIr!j2~yBPZ@}Gr(`U zt@@gw`Dnfy-Bu^{V#!Q1Z|sA2M`y}^iX#_pPixSnQ)cm_d=sCB99#2n;CT>44iEWn zF5^syb0BF_M$hkO0;?zeo8P;B75{)`!L77XfrvaZ6L=W#!{t-}eua0kTzuzDo3ZxlCHX+VQC!|YDj1;NhhUAGSZMN)D_U%i7PVXaW@p==c|X#uH42OAzK0QmdoP32bfNxa{%Tka;gO^35x>^gs8 zV^WK+JgP^`jQ1Fc7W^-v$&!s+^b<58LPwFafJ>j~GLr{OT?ii%&TFls*Wtkcln!&& zz5BPAKQi|2N&(`TNm5_+@|C7`f<_1yGVVI8OU0J=W#}JQ|JBpt;OV3F6Afl!ib3F> zgs||j>S?0`yg1Z^o+{(A;uL4{#EVxh%3NnDk)0`eQP4+^&USajyqT4`o+T;&O$Mau zk>A}dlKt$k-$d#Io=)e70BCI*kI`~zhT|69*z^Q~r2Ydu!rl&ZM~wRG@GX*t!@bHb zfy>OWdCNzmQe<+fMkL9tOwd6{#07G&cKyVoqY-_|80C5Q4GPp)4p!>UCO^z3sj3gF|?`g z_p|IJ9krc{Uv6`qMpt>VJFuueU+9^&CZOrh z-HE+PD4MVFVMH&|9>-6(Btz$8ftsAV+y};nwg%I_6U1b&aaAQvyGsL6#e(xriW0+`5%CMc}4?lpivd$2H0ierVFOy9(ERoT`MhwL1Se~BWzKsD<{ zylUpLHf+pxnqhwyL~FFf8&G`@xqkX&^?LQ!GK$|9ghg8LXkn%SejGxMFibKae5&w? zl6?(uHoKQ(24rLkQLO>qOXVm4QQAy=8n;I1OzAY4-dcZ&wGvkY4u2+B#R@0UIMPDe)0E`2DoXh_w{}hu!@8F<|b!{l-$=9_WrHG zqSv$T!?-*2ncQO5fem=cSl$9I~8y3$*#NC0U@4Zz<|p#Sg_ zK#-}oT>#ny1O0HSHm*%t*?y8XEU@IW9^-*Fyh7;s5D-uXDtRAceqV0!eo6!DZ!#Y$ z+Fl)4aUhzA8{jMEZf*ZT&OJ35MTSgnMzcr%-(m(N-VEej-E7Lt8p;p=b0GJnOLK-7e=>aLS`S9CUT>b@} zD!jo(!djIvrqMj?25Pz=3)LeQ5LGNykdm!>B{o(AoO$-GG2;6V(~6pKL_X*rcDOfS zfBaPdBll`emQqC^IbA9vT~{4j+zE%Wlj)U}!dmJSh7KW@H}oVshLxqPNZ2pK6row^ z40`>Y&Ar~YUvG4RjGyaE*(&d~IK9^rJcaVhf-E*@=yJGTLzW1GwR^C zmOxD!kSF&^wdCQx)SOWYbsr$UXnwme06MVyp+%xN6`?p~+xA5U2%}#!6MJN*K~ShH z5+hID+yW*D24eI2VPfc=tzVsvu>!Na-G%+} zsqSbCoEh+;{zi6@gm$m_8WwB`Tx*UIvB@16kv{%|XWRVp&0f~x1BA~Pv=Tf@#6!UVx&Jiu@Xn)Y7Q#)P6q7oX7=`KAj^63h zfiSCuf#0tCZ>f>>GLCb3+#F@^vw1&bV7wReGrFDH<9Xe;RJHXfVu0)un1aG3Evd|9 z!U==QP%+_k8$BcXlHUDpj=og-LG0?%zcFN)WjahAzh>a#teOuVDt$5i1NYtz2c?}1 z%G{QJDRou0mwBbt+O@~flz>efXZ=?V3g1Xh7in|~97RmZi@#k8JYvR?N=1Sc3FRfCHlRon0u}lE2~WPY8n{pPf1uY= zXQP$5Dw$IHW0;t&f6iKQP5xvPxois0!&9;{AHkhfL@x|(FJuFZU|9wUr3izM=2oP{ zW!?5>AJ(j>I3nx|* zf8kC2z=`-V!7F?IxIMqu7=N`p23!89ZklM8Nq6q%7bkcu9W+^QIyaK6hsiy9Q38f*HdCOPdPz+5Bds<%JhKx?5JpB9=Yz#W!C2*>%%|7 zDlg`PwN?b`6`myUdi(BQ(udvg2YcLQv`>;4;BWwBc$o#ge_@qHCDub&!B zMv0YQC-Nbds8~e|NXx}49s>5)x@?^mh2D?2$o%WVF4<(bx0-R^7#3juI0i<=es1Tv z?E;~n@@`5tgu0l|E`2nA+OfFTCWP5EGu^SXo*^Cb=X!?INhMk-$KQT@4n6%65V4tCD<+ z7_W3WBeOrZ7j6Hu;&@($UDCO(T10vNB+Jth9!lUvG%=i@f-pK-QMq5Ifbp#f!$a|e z&RVO%d&ZGy%ggqbdGfFVkxAUZ*sB|`Pt{> zz-%HW4ytMeYFH<$Pk{Pxz+~jPmQn#@u4h0XPMef^9P@(J8hft~w(`&6Ga{-%?ZVwo z9YT`F!^S5J`Y~c*$P5bo@KM}hx`80&Y2nv9B;S;V=XKhJy`0IP1DeVXXt(Y8XbQjJYNsAkJzO66^$aOzZ?AG4jDDPY>eYDk(=HS0ZPz zs3q{d-A9n8UbC~Gjo0S{FU?XbE@rb8_M_{)%hy7yPW4 z?W4YBGp_Vw7A5(!HZXc$NzQ;{AXTBFG_?SSgjB7cid2wU5gui&Di=M&`1GK=H~2Vk z_e3PDNpRI`rhH=V+Rj7vY6ZP+;fKga;u1g}wsSX_o};)XeVhJYMYv0oKN zMplKtW|cVc6|;o4$B%4=gP}^Pnp~e(DC-m2aSc5^3%=VQ>}@+;%}VhKk&%G`_@@5f zRYGExOE_nQT*z%CA8kTXk_;y~;v0n>+KgVmf&P9$%S2W-Jmg3bFL>!!u>$1C#_Cj6Q^-ge_lgO*`ELe0aQ-(&kQ;9L?69&)ddOG zU;_zr{e>Kbk#{pj4_lQjc9MicMr)ozuU~C^TDY$K>5cK?Rr_VntrhNUCmZ1S;bqaw zmL3<1$ZdymxRQ`_HcV~2zE2QJK*RBjoZ!1~@Yc*z#?`yr=;i9HHO7R1w~{UmVj%*M zeyoBnHV_4Fe=ka*#@XO7^kC*k-Ho-rJ7a{A#T4}(>@UI~{?m@m(<=5JX>-dZUJw3n z!H4}WPca_@L`?_(N3JrmcRw;9a&Yb8bO@5Yo8XaNhy9JLOYsC()W@pXm}1i52H)8} z@gd*^2?R=V#)dkM1fNWBaoSQjK4{vGV*r2v4j^+X{o4rwbOqm7g-pNy{S@USu^>CO znoXC-xcraRqwBiUij0USgGC-NQMw4n=hjjux-`tuee0VZ(~M>r$e>;jHzjtrWEECm z7s8)VD-0;!E%CVeN{BN5ovp6;Sg<|L8XY%An$ZN;t8*;}Rl@Mc@W8*JGSRBq;A~sr zL-Uh%?oUP}rn;Y5;>8S&+PHr&5!VX-=CSywNmBc>2>YA@H%8Ant^smAu7ib7qh4jJ z21H#lC`ZS^nc)$Uj2Lja`K(b_Z9wjhMnbnoEskN1^_dbIF+L>@{!YIr6U`$^T~#Ky zXu@s7ZOG_@j9Hi{h77|xtHFAh3sC1L*)Tcf2lRd*=>x{)sL#}$$IN)rkG2B`1ppYs zh|2jSU6*5;l_*|6(I_yVA;kE$(#UZ;v(5NooP#)G0G#xeCfc)zc@wS$nIqhzU^YiI zzx*Q>EoI;q>-Bk0s_>Av&$h%!@x8oWgu%?%rW){meYr7gP-sMA9ga`dmzpu`E!J$n*;WE z(ZKmxQx_3wiEJ|eqvnrIi?3rqffKQOKt_IS^&SZ$AjW=T{Z&ItFs}tfNjr)=)Mu1c z|CjBR>6=z|jTNu2pZVE&yS5y^l5_L_T;}upF%*1!bI7>!sxuz8@@wP!Xt{i92dq)6 z;aKA8{?#huciUKqKlF$JuZ0(G$sUwnaB0bX+5M(JE^t6re>(HSVOviNyA-+8s0=Yl zw7OCusTZ?jhS&>>=-_f1nKDpOvg3M=7M2v6g)jQgg>bT(Ij*s(f~0U29ktCA9f&P6 z!+u{F06m)ir~S(Ti20bRMt|tnt=`Rqef8*i%)@vM92TQnWb4*Jv&ZJH6!OiKDKhs? z$FgTu7LKF>8J?!~`&{b^&YW=mx#)OtLuN~(59XP=D&IVbN@{Or594j$Os5S~Y<;?M zf~wTD0|5}v@?rtF9>stEG3t!`2(VX^i=t20rGH34GLwYY&#@Hp6yeGV;*h7=8(Qj- zWU*=J@%@Z%Gq8cBvp1B|17d(IWLkdzov$D%R9=AhGkFpG&-AU7eS<3_mpsLH;W9UG zS8lYSciWr$MT@lZ&xv7P1KR<|{|Wg$Lt&IYJYV`O@vd==wYC^#H-D&7S0B)Byf~@guQx zzajUmvMwd$lRlyEZjxn*^;eyc@orEgmVyLiLHu!CjB!>t{~qw3yeJX(?8bI0?BT15 zhfQaa4|)}AO@H#^oyKZth^&|#h|Lo78`G9}Q4Ie|9XL+K$oZ*zRQAi`Z%5fDay;hB znXYNR_K%9u5?+1>b2ba^D6$2dHFaAk=>oG{dAhF=PA34y;n-ERy{1%74g zd+}@kk*(T)h^}_y+19Ob$|Q zfBk~av68o_av^wt1om(E;i}~AbaLs97VhUw6xfjaim;NKI{R6T?KFa&R)Pq7WK6+Z zEI3oY{k}n15j920T!UpYSO=_*v;lOqH0QVK6HN~mBt@853ai-W-x%Cx-L?N`^(TYW z{;U&m%FsX8Sh6tx(Sg~m(@CZTDEN7ul4BIOS@Zmr-92rDr#%G#^1xe@2Oqg`0-Vr} zY7tPzjzvCmL^`;kO6-WW6~I$a+Qkn?6kAo(ffAqxw5VD*8TbG zb3Mg_uS)Zg}xCoR9P zaU)6KqIOVGs=@f%UeA|M>baz<83#oa>mbxBsJTAb3{e}|Qm{Ev*(PV^oaF-WY~zUS zkDlskc}^Qa?92M<9d|D%vcps1iNF>C&LnMB7sa>R0m1@0IYZD_+zK8@k%#H|%CX!; zvS+;_-*LBLuwME7ar&BNM3YL7%s4;l8X4^a#Kq5U*HxJ;)JEBT*DdF zp3C+mza)%H!c3I>1Us`AoVzI})A;2bU0UTm-~)mF*)-ta?~}v+D4&wT-zwH^zz@waCClBssthUN z{GZlc9#_hec4-kWKiHDQy)L%mf%fsF;;%QdIcC)$lJ9vBTnPXQG7yr)Qn#i5dUl*8Xc%5iE}RD_woqv@@Wt`#NQWXQ|=hUSy!F zkaNKi^i2AVCs+=;q_Tj6%qx7cZ)x>Wbsr;eu(&n!Wgo>F)n9zjv5*va^7KXTbTSBb zD})D%@dp41$3u{2J6*WB%pPHLJ-HbjV2um_*NYvjQ{UKgi;G3Rv+EjWdfM)Bm%@rG z7OWhmq;ktEgxN>toZle32^+n4M!);MU-q*=M3bI#{1J3&;Rm*erHk9F>xbcJ=pZMr( zV^SYY>9O=3vdfj?z#Zn)`es~fyYj37(P5A^h8u54<5Lxayhid4!v zz&OGmw8E;p{2uuNa{S~V#CQWp#N{&p40!YwlB**~y=ZSf_kd=SNY>%yq?$H-D9 z+Zb#4^WuMDwUL48N`!@wbjSu z+!P16lWwJ9&t6nd|wH zt#8O_yddIx^ghi#@+#LCJ0@FF!1=LLmDSF-my+~e4;}s;!T*v%$8dGzs^!IfBOSgp%lwR>TtPu;jY(NSd7WiDJyG5U3o$DA7%CuvN7|$w zXNoCQ$Fxl*I2I-G;n}Y!Q@E4GMRBaDA?X6f8WBN-6ySDj6ipmQJNb53^bu%T{+Q0j zZ5?kK(qUvbpx8_-`@Sj7$8rPQ1wgfTOu{Gu?4w`?u3o_@}-LN0cEn5(;y_}|6~okxPcX3w@%k~(_Qu|wBkjdB5YlOlMVG-2ah@?|D@ z_hc#foijyW)Anj>q%gzY*d(5h`zMPx>lTYL8%wPMK4L&ME*tL?W*l{CU!sD& z5x3AFn^Q)QbW@H)kpxGc!w^-r?MP|^4 zx_>~@SL=Ufbj2K~Ek`fc7EF2sDltzxFfwVMemmUNX!$ewP&ucn*`WV2F-6^=JHBo1 zswnwc-AU~~ig^)ve4-|68tF&cGErtxS2fL4n4e7N%kVDA(1SV_MzNNjCx$V%tUry* zHifhHMPNokHT#&V4$y1ehu@=DeRB`P_8th5!ib^}%i_7$L*?3I=zCYC61kBG3s^iE z3AbLY-ebL7#gQ8(FNwmNB`?|IMxW@R>}o%T#dQC!7Pk(zg!{9Djyk3@2nyzks1{4+ zI7IDqGu(488JnQuav5JfVH9|;IbbNU3rQKACI+vbq|_fnPnrP2;?=@1g;%#-mOcIL7^WhP2wWI zX5J_*_fx0V-)Ox&s2fJy*Yxbm!85{|@9`Z8Y4_;{p99qukrem_hD#W zy{ami<0Cwc>e3m#Q%537Nfjj0 zOG8KK*gvS(+jiHOb2ikPmn_(6hcq>!b7TF#K7B~3Ju9|4MG-1Fy*Qcgi$wpUp7O@> zwX#jM_0D9GR}Yi~*rL2G^^|J$hP~CGf5el$9j4gLxl{%$7MW*9WP3d&k_F(fwM%wT z`Mn!lUkcIg=MI$e=~-Ol0I!-EMG*bcPLJk}09|Gt1zhaf3z+f+ir#85Oac|H(s45) z;CJh?RkvXH0uG!SKJ)}!qf8|ZM}6yWCBqemGsX7HM@5ep!9U~}W8V?(SD;_B|J=4L z%tVzo-{hSng{{5W3iRWuyXxG=!_jV34>9 zZ2oC;Db%F83Sxwxbr|LabA^+Q8P3_*l= ze4kas->}&N^P_^9)(+n5V1qBiiTyK84Wny}*o%w!TBCm@yMAls|JhPuB%!o0(`H20ScyfwK3!qB%3cG(w=}jK<8-}mrtC;s%R(Bj+Td~h zexE18c91+isyd3+i=H_{?EYsNcYf42ug$G&`5*y%)9>n@BiLfuEkn%xp$v^&OZD5zP<0c z9?;7Rz68_a4DviR75Ex%Ni#-S;Qb|lAqwd2C%%REn zSOvzeA<~~;c??xZYYe%mQ^=~>b)Gd-=upIQgNNakb0tRA(8mes#U^K&zYswcn2}m@ z;KRX}FoB~RfJ_RrLEh+r?h9N7k`ivbEtnMW2ZKyAncV=>plnF@g>F0>UokfYgVMLB zM9nW^eydLDvh&uPMspduWxwS$4$qcw3P`$3LKab3D)E)Vg=7gBX{T@9v1)l{by?RW zAcptGwyAq{@m!PAlB-_*UIzd$sRCDl=zs!K9x9QK+ARB+fFX$AUP?h2tP{1@1rx(~ z97{@{aDDqC3{IDyA0OTa%z$Ejvhn!`U`On+tVC@sbQV&pP+R(Bc=V>r+~l zKN7&%*4Sih(55}u%NpN84xGmVtKXQ*!Ge z;EK!pHSo})4-gr&(0ciM7^dRiEpJO&MIPh<~c4)xx$|CsO(l+2XK9~rruvX~r;s(N8 z)53ZX(oqalH$>zT1X=IAaA(_UMTS9i^hEz0$E$I0r*u9O#*FV)!l*UVv zq`ZsW_Om3_n{A|AFBg+-(7O2WmH^C9B=Pr0G^HbjI42lv*98AItXp%NWW zFG_IjkZ9whhcSkXK4V%TSBRMF8=`RRP}At1f$MIjC=0(F+^H3k*>IP$n|O%R<&7pJ z)6OP^6ep}YGaOYoT76*IHj#Eh3>o(fw#B_)ANDBj`-}dSqD9w-JpSG2 zj$3y#r_=90JCGgp_}}`**S|>3dLETo)u$o2+aLKW;qW3}1i2&w0mNl`#I#Yg(l@5 z%+Iluam;Y4jX!w6^eNe$#zP8%soa5ukhhe*cGRRw`E)uT-s`wg6n=4CQDD9xBRub~ zMA5gFflwC)3F-=Eu^`x3q0kCWVYI#8&rlSLN}&A5cuT zdc3)zILL<7ev6u7IF83cn9Ev|CaJ-~(xs6(#JFiVJb}ceB!Z9Oou^6Ooj5-609kL# ze7vF59XE^6Fp1eGqCL+o<8j(dl^;Uw_#AHUzhrHA^Tr%c$ETi{T1VB!&fL91TX9+z zZ8WF%M3~(Fn*~&CX(Jh&+i>2|9+@-X#mOC>%`zM8AvFhDX#dCuPw$Hgo{kGTr4hhk zVLC4Yl>lOG<2*+#_#xZKKK@sXko3|@p7=Saw32qiS9*F~7#`%ogQU8=Fsu}+G)zN7 zGc};{?79-l=Q#*}4oA}7|MPAZtL6tT$xw*vT_*l&6A39+O)(4Wy+RsF19`4#odH^` z9iQ|5V#)(C1;zwn$yWpjMcw2JqvUaz0A^d1TP>W8^ABV)9;CI>b;fT-?KM4-YChf1EkAWt9*eroB zbI-TT0u*rMH~Ur2Y_mGQ({=Awde^PkHZZOHopa~jV2GE`(&&dnqysqR>H_@`lC)~5 zbzYH|bureILt?wWh0wzcg1DCZta)LW_z(`fc)V&PE$Soxj-HtIFsAJw?l=)Z{iK=Y z3ybu*E2&?R||WmX)bqw`LzaEXh3|5y0>N=zJOxOaSY@=c$M6 z{S=GAm}Y>W+(8;ju9R1|mNF2e0(;sDYx}|oiT1|heuALABYS{nA8DW9(A#b*5a0Co zoK%ZMySCymz!-3QA0o`6DdO7be1-wHb~oOx8X`Hg6GD{{-13^m2KN{uD%?vF^Otu- z+ocaAn~26jQM|EiT|FaGJ>L=Hz!UPX?W#{7>3*ox;P^$VGDfmGK^QR*a&h|du$CKh z1V(?$Zhw)F?xf2Ga0uSFTpRL9&e0^7YoLZ-eq^pwk-&P&wqgKs|17$ z-txFjCPuu1Fc2WQu(M>g0ShMry8?`i`vXrAuU+y>+L^~6?j}Usq#!|Zqo|=Y0Bb~= zo6y?|%G}<5y`ZsNHaij|g6H7!YEP5JoyC%nKrZYsFm0QbIjb6e-u!urtvrjaN{Pef zF(XDeE|Qci=ISFFE}ClE(=1lXN$EslNuTBh4=}p)NIwFxgoXzn9_%!*fNe!=HSiF_ zXqohg1>UG*a28CQH*|fR{}r7cguYMs+bKvD5Bp$yAczW>YQ@~vgcWD@mU3TaNWSxky zT(lvJUlT-2{Vr;!LAs6#?Iw(NJJ5)|L3M%D!qC-91&+SN-9qdU4zNQG!}&?Y@mKcQ z{&EmQeQa=VQgGTN&b@{Y|K{F2fT99Jp8_4@%UYs8)IgD*06Wy&5wyaRoSSZLXR{s6 z1S!T5o4vjhgI|(jE4&WvdB#X+8I>L!N>|=R5??(BpziiC+d9vCUM3G%C01qE^w@pYOpu14$C`k@d;+#&YlYKOuoE<1w-8k)@@$fHKx6W!pkmsUjbJQJ zel29a-HYt+14h=X$oTZHon7Ex_PTYB}G{Oxxb5LSQ=rBxvtRZm>CT*(P-cFz{Io6 zazG@35IeL>P*!~p%V%UoW&SM9Hr#wj@V~2Ce)PHJ=2m!o#}@n_MF&g>L(0@+_hxdPf^x&qy6=?h4|8mt`c@U_Tsw73!gLj{ZWlv@a z>KYhkDfIuYk4OXrAOVDCf1SM{COG1+awnMNy60Vs&Tk(zg|Np%RB34`(Rz{f!(9@29Ua=GI zkZ>L8a?J7aE2?Vo^_qVx^M8ig!%oJ%Avd`H4s@HxDnq=>W#iJc*%0*qT@bp;<u9c1+axG%D}&eAOT(A7eKaz^h#=@2f$WKXCfchh#hOv z>wvvvVRbG2|DMG`5&!hUK#Ta2+8VMBnP)mW6pEEo8{hiv_BU6a3u6{I>V*d{x{r+8n(jm^@OqSK(An@LhUf;gzT4}$Q=YntnK8|%gg0WP8MKpgcg;4k<02Fjgsd=^e>SFKn zO)qD5DH&vyV#a@#4fil5b&WHN6S3ehCLjK=ARV-UKkp%HttYTLL3nLHXd^JgVi5_} zq{z7f~!r``-fk?s8%(qaqz4>BgLtH z-!=W5@uEStx^qb|;^E}p6TbTBhsgcn-{bOea;mhF*uggujw!WKW z)rn*GtsidEOo!H^CiF`NX5t}7!q*F$8%^N)e%KVTV~&R)JZrFHoZ9b)b>Q_xtxgHO zKAc|^Q@Z1$?T=SDQ=;z6dL1DYfy5<0H*M-_s&O40H#Nmsj`NS%;T8{~z8l1D!bWCg zD^iiLvU&RYUVT{YG%YzY4Z6#`RWiLKL;s}i=tZM;IyVo0U*8nX7`1xEQBza<8`qBd z+H7+&%+Qa1bn!}PsmSc};x-&Oeq2$|QbD|OBN!VNEqF`sGF*V_C$Q{-o?%z#?#*v% zqoJYqN$!WEQurBFuT0ypI~sg0`@E4WQ=?RmyPE4wzCjMUtx7e?%Wyv?w=^_(4PK%n znHM*L(PySJ|6-R~pnY(|UrOTv#KFO#y?kyauL>(d)*Y$<_~P~0Ik_3B0>X-6))vhG z-y7kQBuEzRISau+2y*;gL82E^3Q(xdQ%bJJ(8Blp4JhhTezqI*Xv+o@sUv z8ojR>Nu*;4)o-9X17c!cu^e6NFjge6D*YV0N_;2z> zB1RR7%4{HYf)M8$J>p7z<-U)jJkHmV4v%lRUrv}425Rc-!#!G1C!zL~W5&L;Rkthp zE2h^8%V?8;Kh$zz>9!PrHh=2J?^Z`6B4c4Rl0YrzJ`ZOv1aTL`#hV1T>LCPl64uGkCXrLz(P+_-%Ti)Es@c&)P;9py+ZQ^Kl^ z4eP>*ogyr8-tZ?7_}?a~n7(=B-VBCmtsXFf6=bm@ex?wl%Z83ySEoWu*5W!{7AKtE zFDolk=182KpTAezKnY0uWi2}hhH+Za+P9To#PFQk?pWwBt1=>o0=`1?>hg#ue_=p% zBKYyPy9mu`Sck_W-1FR>&CMa;BfndH^ZN5QTR5lVHZCU?tr)bk6^z|^b}FamzhtQb zBb9XT7k5qQN|FM^lLqkNCXOP$*__Etc@@U-7_WKwoM&Na*JZ~WvnA+%HWg18zI-Xq zDl`i?gHDsp9k@DWtXh;v^P9tCwUXHZr)khCPo2|k`}C13<8D52)WFBlH{id_=^=HF z2`3E)cAVM{+6e5bC-fFwQK{#$HRb{>+P@;>EpKm2Gt6v!8$h z{BbtDU0}ua<7~=2H^??nOyb72uR;?>r@u8^WC~Yw7n{Tu%;E77VY|uoz*xjmL+2@q6vg73?b?EX=AC zLcE|fk@L2A75)tk4H0p1aYdE_ZMWPeK37wy`0{XK^qJOLY7olCeh%ofAWc{2P=82m z<^l1u7!vz?zYj&F+VY|FLAyQMp29Uw05>JICl+ktx}~N_g!G-SN!);EfMKZYMa#FQ zrYP{<9M)6%&dU#x$;`idD;5q{Dq7p`E@VA8;?r$00sC$q(1A9G2{Sp=F$&TrgKUek z+=Pj5L?N!11W8kEOY4juuO7L+k3q08-n~(Px8&qS)NmS|)rNoh@?ib+ilYaeJmb6; zo@(k;s&aRvg=Uw%UhSJdea=nk!PX2xh-VOBzIpz-Uj# zv;r5PGTw%(r1t^Cx4BI;GDg4z@5@;*1Cu2AKowsg=CR%>;Kz?A82|f&`bP|w!pkW? z&DYCItP8|C$tDkZcMuDsh2D8hUu8(TvH_l=r-(s3kB_Ft#(n+$iVKr3mbcMM#LLnR z;4AY1LR6nChY|PSq%Wf)%#O&;uBl_E+PofND?7cqhbqy)96rK<{ocpY^T?KT<9%xL z6D>~hkBsUJr!g*sNHM*M8qnmC@&G+p3nE*^OFn&nQU-RX?L`xq%L^JBarai3W&(0t~?rURbep zk-y(*H}vExKrdy|JNOd&-(rK&>M-Ag6R&Osy@kMkyj3lpkl$5}0n{6!^R>brp=QM3 zahvQ(VpAng3m9fXN^JD$h%lEEuh;X#%SM+x#4%;J){e!+#Keeb(ONP$0b?(V@A5=r z%Cx!6tgRo!^22Dar3B^6_|-!&Si+8%bqy#5_E-$PV%OO+dJTu%_B~~C@lK}6&J^dY zps^A0`Xk-l(D!{7d?&%$6>CF{rag~M?}C<-Ui6$C&EXu;cV3Tu&@6VldaHE9je`Ve z+%L&mXkQDGRmGHp-PoMg!PPQS>iMw_T9sZ%arMJp41TYpbyu|u!l z-N3XTjDfK0tl*lnkFOp*gwK{}5xuDpVaWW@AFP(v8Fz^uoHfK?a^ZCzse&eK^aMO3 z^&@<&GuK7dG{Vi4P@v8A$XY)x^!V^}JY8J&FFtek+|9XYo)N#Lwe^<;*?LO7=_xFs zT?j)0Nk968N;{zN;YMc?g8-6wJfzt|HGw$VDVwMvgZN~c9nN)PEs`1F@9?2)JWPVv$|KIt&skiC z<>lBG^V{VPJtlha zHcKt7am6`-OjT_~kJ+Q2LBT``rZ;n04*WnFVX>d2>P;AcFXr53r4#U)xk^SR)#(H) zmhpS$HMF{IgKrjpEwLN?rlfc zip@-~q~X_yxI&XxiuwLf%$gfQ@+SPIl&hbp)Y+EmB#He zCo9?WE{a0hTqCr5NnJ-XFpT#7$$(!j|QPe_arlz>=&)2_-nEd+# zJO%r&L!g7qiy9~Cz$rlixLFKS>OhOP2xSuTQ8+6nv-luw&?ll#@!1_`GWx06Pv%B!IZi_`ImNfLBcpkrT zU}Vo>J6(4m*ROSGbmUST=0Lxg!HE!*@6C76#NW<;#>SL@{N3!XLH~=|B#1J%bM|#h zFsJikP;tXw4l+DPC#;hM8*^PH!u%C1Ogz=TVW&7Wwr^?88>E}eZTKf|@R48!7vLV| z;9g)BUNot$u7+1sR78uQ0{^YSG1FUnJr!7uA;D|1YAn7_wnu3&9H5F-xz1eFH0D+y zsehq%K8}ME(T|iDg$Tc*{q6HA^4S0Z09+mrN0yy1hrMoGCOY|+^U8-dLbYT8U;nf~ zFG==&I2ru;Oo=6pKuZ2tBTTfof|rjk-;j6uS`&MA(E z#idX1?}Z{^Y_!`i=;xwEQGvo+^mV0xF`2e<=w(^pT1qa5`Yh>yuC41jNixbB{S!WSlPw%rbiNxlLRbd z+uHG%^5Z(9ocM!7iyHBi7$=17Yc2bwh-21N`g2?&OAmnKy?EW%UsQfZ$t( zI>PKNTBlX5K}=rZXhr|Xph2JRcNODtI3$kTEG)Kce5nbqlLouT!c96mujn?|!mv;1 z87d_u#TD5fSM(LVB_R9w?Aup;893ls==(3hcFt-72~_aklAt^2AMdO)PdtEV;JlN9 z0F23eX)?PjO+j~(x+N4Hw^PuL=a>CoBi$WuKLK)~qRFcH+FY1Fy^oJY+FFXj|adC{&8|mI{tk3K62m6A7A zNQfMQ!qvtjT(=c?nG!4m1KUAq;j6ww#hv16!0)BS9x$mx#~t3v<{ti~(z|DdtNQSW zCwK7v)gYFczhr<~`e{p;lKsPy?EWw&K`5vR%M5g8nf}smw2B!vIp?u$Y`H@#6MlzQ@$Tf_Fm7z{}NKlVGOt6jumGC z9Mkyq^Jihygr)i&m(6m0rl`3soJU!!r@yCCkCS=MJr0fdBk`&E!+v5NIkJVRGN*a; z&qB0CP^~;4sx}?=Q7QK%Z*1pPjAu3gpbp9AGy3A5jPoA?#)qEQtKu{B)c3-5h`U?^ zR12730%I`4=?+-#-6dLMecLLC^>#Qmt; z*=hfyR|C7fUWRTkn0Jk^Cfv-CP1&Z7ssptVb9r_c483V>#i03h)O@l(b2M3NT2`^c z!^6|Q4W)oTOpk)l=;6R{k)86#%hY#L56h(|st28|Lf=E7i1#YByHcP7^QdF75qK;{ zXVzb7a1gUAJhxjv3%b$s^K|d~Sbyz2g12;|n zfLl0DZu8Lwha1A8hNcjy#^#$v!ifN-i6=B@zW3G$Ou^R+G+y zN#>rCY&@Y=wS;I3K%am?O;=wkvgKLL-9&DNRpcm&yRhwc7j&wRmx~J3TEVG8Ipsz^ zq6=_C7??~rC6Gm9zHQEOgVvc7FaonMWhArhFSL}~x(J~ku=UM+sl}QKRBHuw-!G>6 z_aF=-y_z`veNREfP;c@dorwqK561iFz^C!$^sez}0%&P%<6EZm5;7bkUqzRx%q*bU zh=vn(um6}TY#8@*>U6}v@Ho)h(*r*par~vM>2i${)J2rP==S4{M+mtCM;z~R5QJ30 zp{V6(cHi3jm$`w$>O)m_ZjUgZ;C`ebXcsPuLqWBf#;DTu;swr9_s%iI9zXu44?SZI z0p%eOT#Fh7?AR}3i>uR}10dpV*@3LPLMaOf&GVdW8RK%YfC&zwZ3oCS9n>n9AhRYz zC<6!)PhiRh5NFXC9Vel$eXdU)+iSvsR{|C5LVcQWp|`-1S%Ej4cpTh4ZH;i<3Y~TpQZ>v+r z9TSZZqRjn88KVFlDFM*=AggVWa6av!Nj3i@kwb1qk04LJj^Dt%yiOHZ!{0(Jg1=vCxzil&%2a08=A{bt2()8QcsLbAOO68w+_z=_+_mO1 zjuwI0yx>d98)oee6q0}!_e?p`V1EC%nPgM^Dq!l0wxpbAQHcn&lx7;ZzLo?7;nR0^ zqS6-uB}ZhSnnU>9vGovxQEb`&ZuAvTiIs44TwMIifrtMxjsfVMCsny%PzpP&*X*9J zS-_{h>L-T{?%Zs)bbj=G=tPd|ndn}xr_^C1SJk`Aio|Ac$HQ19^q#)O$0$1tTN>|A z1x$z}S0Wk3%DcZo%|=9k>)zjm%aL#a`@7CfcQ}ia5egpy)0kpe!dN5ci9cJui!B|Df)X4(}g?@>yi%f=D>54)>g?nKlO2^ zZ&{ces(rbO{;|uMr*^?VN*X<88c?afn>_jkgu3B^4_YL)H6;?|@MQWC5I7&Eozx`j zwSn@UXV19$u3wKNT_ptz-o)0WxY5B`&;H`E2awesY(FjBQ~1jmgGC}tM_np&9NWQG z-@qU<4At>=LlOkCS0z!`jmWhagPQgNHdEuFMzU=k-vw8)e9pXDh~N7m*-%Pw*R;DA zpc(D7Na-r$JsDD22vBHj+8a1Sx96@3`yg@>qHA!M#l`;3zN)pqj51gT`uf^j6xG!v zKAOJ94~u&61TAoY+?lcp!vF0Bc=|!ImkJpy;{KKr9a{bIT(~qt7Yh9-S^*)9h%WS4 z*CMm5B=!kh6BX{yURi4)>_xg6HMv5r0y?Ib4n?R@*r3;6p_RlHlZLHtH_^AP%Isu5 zx5opm?Z3GU>7Kw+^BFT_q6JKq?meU^R%8&o2wNJPS$iHyEg?Mac=6^=7`m$|`?ACMVL zx-%i=Rpv>-ydxGFVLQ$C;_7n3PgC;tJ_z_e{(CSZ^x)x(2v-V?qu>wa`8ddB>T3tb z!wWDu7mIB$13^c-%WJj4mn#1uixVlANMDB_*i&J3nKOd3AfDynR_3Qc_E|v59_-;< z9@cE8c%B_O4M8Wx0}rc}*JIR2;c+`VBuD>p{lE0N0}Z3VITP0A@Ft7r#>n$u37Wx=ac`FU>Bf!7h`5{SYhQiu>;5^j~!i&Z5O)v8&At%Z|dOVIk~Pa+4^|;WmIdm%ksPUQd$C;Ckuc~ zgx@PSuA-W!Fg|n98bS(Yyu_{yAx${K2!%v7$VLEz4+V{x5@K{F?(@yr{j!; zC~Y9@z*uPoSkc(-s}yNw`0yQL+~P0&%Yw^geEOGT2U^B6%XY5n25|BxCC}+5l>}f) zmyP4bgM5(o4;lEE0F5^-oWC#uP1=?xYIBK=AZXut2o0E#lGSinWUUh-oo)Zt))uQ< z66PTp2WAn|=C^_N^EZrr_`#>Cm&oNC#(=%6Cju@41xh*!p{s%(jCo4qp@s{IgRCMC zQZ-ERkBpEbk{)?%v~U59IX_wD9|e(`kf2C-t4pWo2YJHG#slYnv|BD-+>D8Q8%&*rPQ2LZ;H?T)75cv)?_aB+`}YcfBF!{^(3wh_If znHcFtYU7H^lIu6ZKqbg3Xs)3HGR5wA^JZ!dZ7i#d0=_Me5`VCsNm2}6UWB8-ep&P zQ-8_V8cqQB`teB8awM@B{_L+#1Rq70*pY9?fJrjLWZItuXT-8Q3wY`Q9I?L3GAr|y znadvzrt3u$%6vOfAFF_f=;d(iA&bAJ=06_8vJG8@7PXC?KDEJq8)u||%T`F(p)_xV zD9&DENu@Rk&lyMu1Tgz-d;GOrVNg!7kAoL4h|321kis@ zFB9c1myb3pe!0nVhw?j_5=JcT@X?#iX8}B8b+(Wqfjx{a4~VYdHG}zaw$_(Cm!kzt z%^32$|B)=(j!wz|KQf$=0y)2zPrK-TRIQ4?qrr^n%NR0kD`%VOzdR(Sf9Z7Na#I0e z=EDqhU~18~rHg)QBViSPd3CSuu>^iLx2WgHvw}O+;ES`Z?ma2UFF+H)jfffF$~R?t zfm!`iXEB(Li&zyCKJ)YSA(9tiq7P{N@};(4s;H`(vA=TxRpvD{gW~BUoVvkf(*UtL zgei~pw#2o%DYi9@a2t>fNrHV4p8UC*%$X0g%i(3AgP3U9wfnJK8mh8z1NaagU3*lS zEnwA*=QU!(qp`7S`;P!!xW^^gS#!#h;2-rA*voJ0Ru)so+pTK*yOx+bF6ZR>T<$W1 zW9F`|AOsGV|Gdxy5}$;-wMaqoIM&=Twq#W-JAC}@Pcx6|esmj(u;ai0q@0QK?#tY< zNl7&AH7s#4w}YVE3DClBsVqEulaWL72RHJE@L5Fj!siTIpT)#b#$UbU<*iDtnsD;G zY0?LaC!vq(gjyiu9)C7paS`%1M)=zY&cLw!7S*(($XTk7!Q$S>u`LH3w1G)$bd^!M zNjUm$(OBAhb?o?Dz*PD`DLId^`;CFH&=K?uoqjkdM=Bl7tIGw3oe;h$zF;k0)|d~@ zy#(l-yZqm3+C@iOE={=g8dykf)H{rB&7eZ zB1t~@rWUM)4O$5=zUuXx3sW{9xu|%`1;J&xrWSCh$}!mPY{;JoCb;Wsyn%rDI?|~| zSjdjgII4hOo%+qkB}CZNMJ&AHKmbp}HYDSF$jnb;&inXB^>*bpybo}WO9sSHfo-SG ze>yJ^{phtdRuE_D>+6GINp0F9S>KPIsxt0oMlT(n^;`|%4IfTCJ2E+x@SV5^J(7O>CYOL?;!;lR9|hsjLSKE2 z{AmEf`$NiqT02ra4(%^x6a7F;4fNs#YUqwx|<;+BMeHa#%J<`hV3rFfacr zA}-Bk+vm%5)-O}bT@(+HUSaI2q7y7e*d(wK3oa>nThHDmvC)byD6@!6s~Nah{b;m> zy!ipv2G()%Y&LRTB(jc9N4J{s(WG)d=PpVzu^qbqSIAp~L$U$OP8Y^Ju)<8zYiqPH zo^NLxa(&BH>ZwT*^bl4dYIgLOy9DB=gEI=P%QKw?^+hrGL-z{i+!tYv(Uf4_xVf2D z(OeW`-!9iooahM4cFa|HJu{9xkF71LOZ=fhe_dmpY4>C@SoU5&z5epAWN>-gw?lb- z(^`fWkiEmn-L9`UWea)}|L}&+-$%tp#Th$g$FjQ0m~hgQ(8rMid7TgB^aeJp$Tn2)=P=hlkh9!aJ?-3MQ(>M+mnwk< zKSgeiX8K(I!6;zrN7#Bo9i6dNNq%?JG}JRa1K+UrIE}x0k2Xn=n>cWJ&^sA7+yI0FSh)1IXVO}NB zGTij@qrJ}a)+Ta^xCQSaasN)#;c+&w<3Tr5g>$b(BdojBMi5(y7-`L-gYC=_8sJK_ z!U`kQEs;*&GQA%-LcHP`7Kf_X+^c`nNAZChx)74`UK;U*v@$RxYcD7w?$D|gq|j|3 zYkf+ybTqfT*taEnuF~dP=Fvv1nip$O9o{KV=cmC_(6N~eU=nKex?KjSv-BaJW8?PYvTmyq2j%a!eHBtEs6) zri;AL86N*?bsS%($OH zAon}^^Eq15V;7ARED=Y1SF5B`F$Fg1)zOA^Sd{ zp3q|sE=GsOnd1JBgH>GMj5C8}oFU~r2F(GhXP4C5WM_0DPW!$XZ`I`+eO^kTbQSh} zWZqkp-aUDtj%6&MsK&wkHatrjWb9tONR+dc!-FV2@3M_++9YivxR11ndvB5MLw2(0 z`8yquj3lXksT>&IcsmaNJ{~oIoSmITNKNg2jTF}Y$0@+lL+5c>r;!6`6R2wpr%KV) z@{B(yw=Ce9P{ILl$f2)C9W2Quv1FvgO#8kUem@wqX-k4vQa7-lq0hygWT#1tUNFYQ z#DMkx`o1f$IfK8$gYqJ9rTBO$GO6Z0>D^)1yY2m)u~Bj{H(O;&QZ0n1O)z-O_Gl{3P zw#CkRuVAnJq6e`{k+T1l!V5I=_p^<`mKt+^8{$Ui&ba->P0a^CnQ!m{&O*@}`4^t5 zWx?C(3?e^mCu%?;uC%w-h@bganB)-cPgT~BFv)C1u%BtTpQ#VIi1&K>3I} z=+v?k3bP^ROjL1n@owAP%)8*T)Hzz>#DT%EHo?N{`P-VWgjzk@B@1^ZF>o`TK?cMX zsX{l15(U;n#)_t=O9BK_Cm)tv00<*g9(M%pG7xt!k*7VIz)lQ?C!{(Rhv+3$SBS7S9SBP8eCw zC~U_sP{ytwz4X^O;BJ^2Otx+;Snb$vgcLu1x&MLStkkGd#mHVJGDGU;1y14n_SC!- zWCzMonH&u+Q=9Fm8Obb`E!RS?TUUGaK?!e z0hFZZ*G}D)iY{CZ|Ez%;=TY~U9m))+jf&QV%c11G%k4;N2mhIb;I;y-@7~gJ3V-dH z8U6v9Tf(Zyk{f1bvIRn-iL(tB{9-Mp0-29b74GiN*i9+vfsU))i(`=aW|~}(%bn&T zLp!sGmQ;5IJ`5z>Pv|86d*ZeV8Y1rPjN@xp@Y)A*pS4QF-Tks6_|!#6Y8mx;RSI(Z zoI9_wl5QNY8Y|G8$()~|>b|-}*x}vTzqwdy+wT3EX{f-o6>9t134Djwosal-wLn~l z2rz*SHYEC5eXy5M2=MPz;)K0QZTp!gq8)%^qon!im>8%+@7L=PoBuu%`Nko}#>Kt^ ztFjkFQOCe4$CfoMZmRj@2BZ8JSI4j3rt)S>>o^57-$Zr3{=RV*^25Pb_Sr*NUf`QD z471I6XanJ*uc~~G<0uzdirQRkuk8w&i1bS^eL?w4oKQr z5?C_F0*dr6I$s9c(va)tKvDv0`BNtzS}m&h_m5TMeK{fq@bU5Mr`_R|7iitpFHieB z$CTty0zx9x)yd!8l~?{eFC%@t`4J2CqZKTz2FXnAOP!l0s($$}wiSBz5=(LVV}1$R zLvUKm<8p2xn~$n~G~KR=!jUD$XTo49#G6SSIfDvdnB0j}`FfJ*xnBK?LxsJjqVuLt z@j`#suR=-#_;$@e!zJMnEe-aEOp9fMt$)6M#Ii!oGF}uV$P=Y?_aE-7cm*n``6Iz^ z7$v?tblvunvg_~E+HFbQfJ`b>N+!aN_PiwrW9as7=r0~c>}-JO!EI%SY5i?8%gr=l zth@o-5>%8J<#j`5-0PpuVB-NjX&=XYygCn62^F0O@2xwGlkRwoKL+cYq9qppikqOS z=5^+m<9l@f)&PAjM=V?FqG5su!1Dst1E)z?&(Sl%H{Qn`;l!AJPEwqRp&``@si)Ms zK*TIv0y1aC4r2Z+L`+2E9HoZk1aFXhN;JbMh=ufKqC=w=$^$7#-mxo%C$LDsd$9*3Se(4^3=E@Fa!kL&H+JiY1JA@^E zQdrNX!>qxeADpCF!YBFTYfq%?6$(g+s+jS98vOGT-q@VjuIH}H`=BU(ilX`v?{H}f z0eu}~4IR%z3d+KhfrS@(Q*xzCy9c|Km434QhE`ez-fl(L6&Joaho^x_@Xxkm?C`q2 zAcKI(NHO+3Ev);hk>F)S%F`!(W zGOiC)i3(fmz1#A5W{2gL10iw$2yyK-@Ba8~>6vu~H*>vNIo?d~K* zqp%d~ucdSil{{t+=e=i=7#x66Pnp@hqOlz<>XJjboy)Z#1@q3%H$r~|eWRL7rH{t+ zTqfoYgHNaV+WgL6t!td5cC>_{U*5T}GES)6BLl3T;rcQA8THNyJk!?las33S;cGQj zHoX6gc%(gu9*;VTz^})DbVNR3~dQEu}?W$Ubg7dD(%hipg z3U#}Usj``)-6;p~O=1K_@MUlBk3NUk^YsbSXx9;wm~_kDjTLq>f*yF0oz6g@#QU#x z*ARljhP^=?l7~et`?O!#4o=i(NMF9~JY-5y+nAq2Ygt7m$X#JpnY2fQ4{SoJ1NVOE z+CnTC`X)LEJ^dY_LJnoK;|P#OI=bK}{_yQx`{8VW*z;VoHvT&*v44cZ|MK4Hd7h=Wp=amU3+BSd@~rBk z!k<;qo>5$i>g5+_z+_6As=3rz#S6rA$ZxLSPMBfkz8OW$Q$?v>waAv=F?BEI4m$UU zqyyGO(lTXsmCR9Ji2N^WervAI?<( z%1a#yQ3;QOkNJP(NJ3V}2}-B9wV*I453hz*Hd8MK3}X!1#^3sB#ya^LRg9O51#9jK z3Rz83a>O-+x?+)r{?pEBB37~g?L`Kc!!hVLUp3Z51lk5&aK#lymSkTMf0EjK?}K{1 zO#9v8Zc`C|Irxfl#t_R)Uh50lZZn5PVG!_F*znS5UG`ZuoX6Vq$aKQcl~xq5^oVB( z!%fj#>!GG#PoLyE|3I+G5MfFoX{Ek`HE8&$*q6Z_5m-th>(y z)Y{I6O_4VOo$qpuZY1FCIlo3nN4W$NadaKjrP84A*kY0JroCh6SLaij*J?f2FTcR{ zRS2SyJ&9vmI%VO0-!wh4`9e(+GkZ zhL^kuu>m<6dCxz3A|m3!AzJh4FNheVqijrkgeH&W?sYc*?Eb=hcqO`i>N~l2&R>wt z#AP-!PBIHMGkr!884Rxod{a}lZ2Fq6{7$8pUtj41X4>2H7wi*qzJqStYtF>Pli){H za*{~93i62a*@#3nFc5`k%@4|j3C!(olrA0Z7hTEh(Kh?1pY#X5urAk*7;3#!mhG4= z7@E@LJohzPmuM1!xZVY-{&+)pD3d->uK#||s5|Pzzp=R!R8`L$ss^GbqUkSAwXg;) zF9}@p^|5uMk_ScBU3aSMfRUS3RjODAM{wc-I69ZRlbNP7 z9TqPH@DFm*4BYb{Eo4LlM#Gnd+%Gi zz!(Z-i3&=SayK3(hknKktko}T&KxnQG8wKrlfwu1qYN#qJ_*Xc{3s7iOs*3d2La!1 z&XxPWBC7DMnlKTt@#`!ZS=2hYcSbVTd+Eret{ovEdvS8W3({8GAVb>8o%qK-Shn}VH0VK!o1tl9r^LyOI>wkZn)N{D_@<^E zmD%YtlREN{DrVeMh8J(;67sCq1e0FmyMPEK?}|mTL+>)n`cJx-Jg`>}5n)86SELQU zR9-VKf^s2--)F+vdn_#MJL{Nm@F623gPpucMggp9!UvJ%lQEBW-7^%wqUACvGIQ1w z1~+t!8QzpT6ypFNHL^&NR{=T2PLxrv9O+2g?)@K{zB(+bK4|+aEZyDRA&nxP(%m49 zAV>+);4a-AA}ydaEb6xzgjxrb>Gc2a59%+pW0w- zeSh>1PvYMflHh~070``_c+Yx&+1L1hPE0aHgk(4#&>aF2KaWkrtT0b~O0yO zJ4O+1amhtsc8Yb;d)BeAB_2SBB4?1%`k(5LA!2oHV0Le12Uh9gu?*`vrRa&}QO%fp zEeGS1Cqb}f@qo6xAcF$8D#&u}>!01k9D~liONQtz=k!GmrR?2L=i`s{vQL^X+D_-_ zzC|@z)Y^xJ%Ipha+`a`Y%E&Bg(EDAU{G#HwRXq(vC6QBzK+BvB$GIKY&EeW=#5cK5 zh*Fv-8$8MV&9k|v8~(m0!{FJ@(^>Hc&ARH|Id(dR$(KX!X|)D`_nebeFo{I?lqMt! zmlgez6ky0;xn}sa-e5m@!EpuiJI+n^X@+>oxJ*W}1N$mR)I*v0CJdOC{yli?y<)2g zH`Viu>hjF4$}~0IH@yV~3^o)S9Cu9(CcWQoyAvFO>m}aj$w(eGT(PMhk3ioN3hvZD z1iFLe7v_J`dc7|pv*OBMhU$51mOHhFY?ojmyggmq;Gzk}i{78H8~=Xyi5RKH+PIp4 zppxV}o%Do$Cbsu4QZ&-yD8;T?_V%--`lmMOYIp?~Pt?;(=mnCGj6Owt?%XL7JYf43 zduXsC8cpu-l!Vn#0yh;qgC$z5E?Gw&4M~Y4%k-7Fd4K&YW#Mh!>$H9oIQK>heIMTP^$#@$RN&QRhVId?gFUN$GnRwd zKtv^}0{3&SmD8Kx{5w}#GPJ~=eX*okAi^L5lVUwBcheF)O#c8Q(}463zCV;J$WOKF z^Nz-rZYT!6lemHz^b5jt2r z0QpgV>cGyJ=v|5$OO;^=|6|B|zUFrl18DJfy2Mb(*Sa>QPkAjKt6&5WX`q?amA%W- z(!r4MI${Q07gd)O;-Ajs=^zh<@EK4sr9=zv>M?9T_M zzK#y>bGw_T!!BQjkv=O|5fhc6D26(0fH#~;C)1A}t&5qeD6Nl+{o6|t2flY`Icb@z zzZ5cmctiYwK%V}%l300;N9P(EyVGB7u<3@b7XDxo4$)I2$1~OIX-Lux74ugEcURe} zq{M1jN;(_;p;!N33qX-`mCin7desS@%(`}`bb8q!e$i40(f`FhlCI94l%>|)j6RcU zV}1e5WZSXQi#f{nBgrn9<<4XpUJka%<4<2H!DFRCbt0Wx1BF4|kEmzoU2u-ESf$o2OA z1-vHTQZ6fMk-TN9AOL48hRF){4#wI-B}^nq0Y4n+uDPnU1GpyU*_|`N!=buhiLL<9 z@?N&Iv@EhC7xqaCFX;H3JC8V|Pg^B+CStYrdQudfHMrEzmlOQ!Q9qurR-5skBo5NH z28NhxKLZo&!2gPsMwCg5q3D>y+$A*k8^YrsZ%s|R=Sq~32b)SP$w&XilK*Q=#vvvl z1)vJVy*aIcd{?d=Iv8-uAmt%1287Fojh}wzIaB;7p^O_!3GG{X48#7Z|JW#_wj=4v zcfpX*-E_dScSjZHCxP%EMB!z>!hLf}iGRTcbAZ2}R(ozRdkoox26PqwXU9)hJJ0r%4+loh7NQdvjys z|13U)**pIW@e;lBqYyG5Y36{Kbboc>aI+H)h=0yX!XK$aR;i%r2tHm=i9}?Z;-7Ju z6J30%!Oy?yPnhjFEYqEOP-Ef=8BYmV#d9)bA@)IWLbzTv0Th77b|XdKRHw)@Mc8ZQ8Vq1WfK|Kc8Z?4Aon18R2~z?LY~_HXA*lo|)@gnT(UBJgHn2yziv^Io8)&cT4+Xle^GmB(&V;wWTayJ9FH&kkCL+g_&iCZAC;=go3dszj(Ozf7x4{?3hmE`-pFQa3B6`%s0<6zqm(Yys%8KM$_AL ztYac=Mxc{?4CgA+7t!O^@p`TRRN-gVaQYa72_*#shr)oQV-B}sH`Iy$Sua1(RY3ywDvfvoyRocl0XLu*DFXwpWsVGjH77XeyfhY>RCcq|Fz)Uw-SW zM%y-(a}VQygcEt>O^=Q;_TBj}cKv&+tYIFok59P2Oaxa)`THxOTjAZ+HykCjgod`9 z3>iTHc&rumC|+x8PS36@VfEBR+?mTz3$QMRV0(gautHMo(I-wn9h_AQnOg3mI^?UC zZ>08%CEWP5a-dFZm@M!W=9am5`$*yFr+Lz5)elK)W5CN6^>(h5RR8C|U9=7wb3lUG zLXg<^i-Ph1&|s4$|ZiJs{Tk$rn#y#{QAyt@@|Y!BT}-;SJ{P^QqrI ze6PdW4(Z2th$ryNW5&uX0L5#|llu(aueUZz1m$*@=rF-HR@=<h~U|w6DwS#QQ3^A#v2PC4jpqx40kCczl)IQ_F zW0@L%+Fjag8l3IP*S*u~OFUUpKa*pL74G87`l|-88{??-rg&;DI=~jMP8oS0)veTw zzr36S4m$J50rS4#qCYuWFN&+h#ovN%N^HpV09@Y4_CEfN+H5cBfS3~XX5|R>cRjKh zLOr+7JE=gxJkSe2j54vOOTskD>KMC?7#O1FbKsZ$%5`T-j**0Ex?}e260JJ&+i=~s zMofAg8uOacFKJnaVcrSqmT$uIS7_Cl++zF4)$l*zP44;N2F+^>f(&J>4;dbbmsmw%f6!9ar-$lNMfJ>`yz^ zrv&cVD_5`oSdIvJd$qO$U=`QaoD#H7-CBTVZNHMNjwH8kPr42TSk5>16lK2(AHb8> z2Q=mR#_|qXe?@-YO}pQtu-@s!+_-*GHG+ufAnj&PCg+G1?k*zOORY}FWzK8ulhs^N zpLPvp-1>U3>kIQzb_ag(X=fj_7ET8_MNpS>ZO%<3=V_58Cu6k?{k8G`OW6>J?4dZdmV~0KuhOBk2rhB zlhW!AmOiD|yDh9y7_dwlV1?2?t-nX7r_-$O`Y7a+x+R0d`fF+JU` ztlU;y6oe@P%G_oJ+fOCBI`i~=8L?xw)HPimqcTr02U4{Re^K^5ZsXYkRIR|~iZ zNlI<>K}uN?wE#4Eyh}#^tY$+Dd28VJ8d$dT$aCFl`WX?oqXrv8%`8xcQ%;){x}ao| zj2NDVHI&-Zyo#XV)0KIpS6o_DWZh2vF?nS<5SfJrW%_ZPzw)Xf$q<863Hj#V#w`za zj1z$P21`zZ0WGJU2}f}Nyc%_ZkHu_|SQ9iYRogGJviee9V4rs5YfgczVmU_iAY;K0 zla9ZOEgIV=`)6BkomA=Me`(jmjj!E*dla@c;Er7yt1ma6yXuLS^qRI~Y^cvA+)Hso2nzWjViIX8&A8>uN^B8koNI&7YGBhn7FF zg>~}D<(6o-h+>tUbtZyKEKl1Xx&WRab=NG#KTOgG0u|AAN9T8Wv7C1o$PdwIX25Ln z?GPUG;^kUsY3~i*lP(_yVMTwOC0Rw+z+q0T^BV$BQ8&V&WzjZ{tH%|NOSufY35;nb z0e@8YR_~Y3(%TRJGHCPD=XMPRZv_x>e9Cc%!DvAhDc#!)Ko?L9L7+KkN4n>?RLi2n z8N1=LTbxv0FZ&@;B@jS-%Ugs6|N=mm!g0Pv?zIJVV3W_2O>`=f6bc15o~BwVm__@l?}?bj z1&hEj?8Lg{ip&=$^^#u4M{)pD3CQUEKzVB{6IQNz%;S|!+R^5=Haz1Ox>CWrQ1D#? zpr%WE0@2i$B_)FVq?QOzJ+2_E0;lrP;^ioAoP}NA`!Z9V(Yl3|qHUg%;l?-(;tNGc z$Z`|XuYaWHToYjs^;K4PGuo@O%PO__h$FDmODcU~zie||q8t#IbP<>ItmhpxVC6t+ z2qF0~AgM}w;>~&*kl8xMlL&_b03`xL5W!HroxMTXYp)O;kJ-vA^u8oa#3<1^!Y$LR zI&!aIP2#TYH{ekgOCc=yY9;lCCm!wl=L!mDj0M;XL%=0e^oKA$Iw*~hjxh&%Ns8hV z5#m3|t~^c6P4R{ACaGk;)5DfKqry74x}Rj{HeZm7WDhg8{GF$|FB?gH#S%{idh8A9 zLUwosmqR**utiAKBNZIOO4s};7?y0t%H#R@`3jS257L#5W3{cXs# z0Ig+Lj{`lZyudBbIcqnic^6uuh~7fRmWKwM+<2cMJbv?o7Aj;v)@;iELt=%A1aGFX zt@bj+uWxVw7hzkR$lB`o>%&X&<}KeDosMo&+1qp&mJ6^0iX!y@ZPCW~Oz|6~2u8*c24JKYST_IZo`Uszo*?d)5jL@`r;d z@C4;YbP1|;7j5D;ICi=l;MU1oy^~qAk?gqTn}=kt1b#{p1UHd-LY;6pTKhfDf- zHIXR!&SjcA2hQtYwH)0pyps`ER2R@0G(OQbM@BaIIuw4br%${!1^hSYfJu&j}jWYI_xP3Qa9ZO(NF@)5<2B6 zs`nPdR`Lw!@a?Y7?#DfB1osdfC8SBUiXr4vYR1KnFI}A=L}N1oOka>b`Qq;NUvYpo zz@GF+TbFM41R07dZO6<)a7paZA^QpSJp-&r(&Bw&N2v&boYx4ccz0fGXbWp#sqk4MpL=`U!OP3rm45hWmoejq)hXOPg)Xwk&M1)H2NX#H=iLiB9nSb@{P#1Ph^KW z%Z?p&rN)u$sCDdqM=v7>4s~x!2pG@8M`3pt$3-+GG|nNzVBm)!mg!;|D3BiQ4)mT` zuh5zkg(x%{2W6Gc@Mh~i->Lm-e}*lmQ=XCV-_Wb;^2DF(y$Se!a(j7UU>2{`WTEoq zd4CVrK@Vukd6gy)@HYo`B>NCAX9%s^qs^aqhK4UMV1ILOlD$NH*Non3wR`Gkh77yY zT6}$C4WsCLO|iv{4$25PAZ{dXSXpUb{e_|oWX>)aZH_!M11y^H@onxd)@~z>fBMFd zl@DLSi0E@qU3!PFM9V{JtLWLP2!J@B_1G22O5YMxce=U<1JT3EOiZ&k8+%Sud+_4a zP3rWwAEA`}$$~{6gRLpf5x||ZV0?x9W*bsFe%6=F`p%rXY}YgF%WX>A{L_UT()&u_ zflmdQn}nP8*w}nIpJ9fpft_MpL?qce1?06w6@XTf7h)AQ%Y?&5z^+3a@O8+HZAVEa`{jr80kz zlG?PC2;+7#wcfSuLa{5-9mu=+_)PqLf48S87vJHkbhPfa0hzvl9nil^$%QaGQpAzv zy<+Fk#>gQIIhI}KB(mWXZ=6#IQpfSXD&G4WAQHmvhzUb0?&+pN-vH?-3foL)8N zZ)4fPIODrWaQW!_8bj1vT(XfafZbge7V6hKR5;*h7L6+&s4|c?ZhW<6*;4JmZIXqI zH)ORhBuy1747^v#zj_|@E)SwzRgHw#?F)-4W4oCm*_ufCP0lY8-l(6wKza=tnI8Xk#DAog8 zr{^}8{m&pC&tMyz52Hzx3icc_L zJ~mKHCx7Zor8cnPeR!KBXVj3WtX7Hn3PWgEUYPKh zh2(u*GS|KGwnUYhwcFLeu9Nc-tgs6=#oP|y)PesDQ|3Ex4TMqv3lQj5PS7sEHfqJzZBh7{Cf^|)=R9p zB8Y58`nj}xE^aD6`)DKMNm3G;*@@2r#CRK8Xi|-#Prk^$_23afAJFgRnz71+>V!HS zX2d{o@5>`l0X`J4dn<>W6&rYzwpt~@{i867!G#wV^~x?Y>1)z0JjzI%eOsDcp)T0{ zpnk|*8!T;Z1=SpSgE;Nu!o;~(br++-QvzWI0_NE2B*%=il6aG_a!G_J7Ce?)0SVWq zTg_di-vBziR+G&0X?5p6Or0ZI5btubTsN062am@q*e;#vegwUCiHwU3=m3&bX>s6+mGC0hAoCrQ)cc6jyx1VR zYmGl&2+`huuQ)1Sin~xka#|nfKj|-Ly5_&%Z$pVRMZ*RN@d7+naYmL3L8J}hfBkS6 z37MxMfin~b{v1!siP9oUrF20QN3X6zKLQ3%%BM5a;)^VDC*6_QTfhwn9yfYlTe8Vl z_@`2Dj&v)|Jtz?D@fz#e$)F${wOwrx6)q$lPXN>0{31CF_*0ATBBq48N@%JT|D|;` zo(HnRRP2~k>_uLRkCASlLLxIFd4J(5rvFWP24X?54)c$Qk!j#dQh{Ko`1tOyx@~x^ z>Xr~j-k6&M9=szt!AAI~5k?yLZ|?;SFMg(ys;n-bMQu;6iuIOw&8L;+6ku9}?qHD; z85V){zyhqj;#=-5cXE2>=dJ#b+JX-*4HgMOg;oi-eQ=(p){C&d9>dq8N#KM#KW2f~ zGEJg5#Wf{gzWZ0iNT$+BPnnD8C2xr4yktLuGS^CbsX1IRa+tG$!6nI{EKQuL zZDAb!E6;0v=cbIJ=Lhy1kpnC5DKfbf(hjP*N{xlubb-rSf zsb2WP`HYTv$JWQ7+?}lf??*N`!;HY+VI&Q!wMByk9 z7rW%nU%vt60wJhP)1y2(!zNvv4bxHoBe~lI6z&tbYwlq?${?=9zH``jYWtprez=^z zLpW^1^yjPHoX<&|kVM-QObDeI=(=tpe{>(Y6e`!6IDCF2JI0H9e}^ABdbheo1?o0T z4d^b>wN7B?lQ{IVolM{oPI8r{DmkH#AWGLn1E~8HXRrtcqm&7G)PVfPn@~%fgMpSW z&(_Y0lUZaaNR@G@m0fN= z4K`#;X7JC@e=kR1^2Kx*1pZe@Ff#Z__}*Jleb<%u-RQQVp^IBBuXhIC9sdzrO4|9a ze+;e;s7mT~p^=F89L7=U$6)egdBchyUCl@fpmaJZJDn*oP;aBZ{y9-iUi&WC9viHC zd%yjI+YVb4tKn#tW@J=E$=qs&MV&NP`#|rdYXr=;>=7XA=!I!V@-uDQdPSKzY=%5_ z+@pNZN=^NU2r)`;%7;8SsFR{S8oDA)W}s9|W-bvyt-Q855{zdZv*Z0FaEXQ7QGy`P z6kIZ;f_}xNm6}R-b?UE)+g5N%Ut-NVE3XBvfuh=(NO+X$ghP0c^D5&5lfHuNQhP-B z0&&AJy2)(s*t*gQkVz5i4@6C3qRv!49bF_{^3jps68+GdS-8T3CCc3#bZYq?$$|fy z|B-aqm*1szEN5SQwnWHo(Hl6xiZX&}q#_;gW%d_f;nc$EFBmL-Ep3kBb6M0c&xenZ zAC}`UW=os&nR5u_eP^`#XiB@sbw9FwNk*}>7Ik__>%c8Z=K+$^0q!qk)E63Bs|E&S z8UD9hQBpXFrlw6%Ea|{@I0ysNa>YH7?DCBJ)~)ED7};V;>}P~}Ek5I7U=9il{oV@aR~Y3`$+!e_wK~!zPu1Q689gADC(N&yrBv>**Vp?FR(^&ZD~G$G7x@) z*+~DhvIA!ZL&jV5V;(@Ln;p(JLB|u4QS>S8d9~G-^l>Td$6X=hCIE-c;R>qh-f zo@47Etpeci^1y9HPadUM|CrRBCW?{vU<8SM{ zea_eKz*Nk-H3I-6M4$b*cF>Qd!huFznZh%60C~Ia^~3$ZFCl0Iiv$HfoqQCAZbI45ws*sdf{v&FDkgP)Od-c;w009^GgO$Yl2t8 ztvDeD@Z%hnQ^^+PQdUUeU98Y8-&8AnLf_~*prL}0KMS>1{-Z}cuJ#$)lXXK??wo7p zIJud;;dWXjhj>?`eMrPBNy=*Nvn6=@x=Qs1Qp4cFBQ)l3%EFk78hQnVZ1i%wH|x^%?i7iQe1m4`XZK8~JYZ{SIQ18U(_Xhj$LZtE$@L zCw1m(Id_Iel2{-ssg{s7i5@f&f|@6xxdY>UeF%rR&(F$C;I2)$6JoEyd*YYQW{jwL z{d)des9C^%BHe9u)v)LRk!{hH3t@Xu>bgmBu|6g_<*Py7c`}lS(i*>!6zkPtnY}JD zlTVmjILLy_8k1@SKOR_^9LV_haWV(}t*aBJV91TsWzU!(zIOm)O?Vr+0XlI6i3Nhh z_Dkr!!JJ1J!z5K$@JMoRO@(UhwUnA+VNDXA@IDSWtWS^^g=S-U#YxB{^ElctmmXxr zkrP>}%=EcoF1cXc6P!LIZEaNWAHl?gL79CbXq^8&=~F=vbS@o#L>z8rN7ooQD=h0C zH4^+N+y~LHdO83QErdF|R@tp1aqbIV^MVRrcM2A2wY0J-be#6R@m#bA@Ig&l+y6Eb zkfaCDg@w+R$Yh(5kHeqOES;bGRgFSAPp80qnhTxi4RKey`bz_VBx_}C`E&eq5^JwU z(9JCaeW@HE;|QdsabF%LEFIE?Gq0@mC4e{z)d#yC8wk)?SIv1E`;dG#mg`)yqv&fZ zI=to#4QC`}{y+hQv%x#5nd7F%tWU=#cW>fmR}O}j78iZdXTYn=J_$bdD9o3O0)-G{ zK;B2*?;^U{;@Y7onZYI`Xqbqs=90A!>S#`460sclKrNn_KzV*FWWM%*G+U7=tZ(wT+v+N!t{~ zmpVkHa;BKX?|Cs$VW(MbO%{)GKH&hM3_91M=heXWn0|@mGZ?zjU6{;o81IcYXDYxP z+t4FdNPq+x9sC~KT7W05r+)~fqh6m#%y&^ocS(U(759Gf)bNb61!7G$=`@~X`^2%? zl=V_bV_$VESHpO(ed?o&_}%&kj1@77JAcVhNR*Q3Whr>_gjG5&dJosHJVTv{edMul z_8YadC80!jctmX_^XHqh$TD}_#Lsi9dtC0Hu`sKz^9GZ{&V-=NjJ)w{oPlG7l3_Q8 zUmc!rQAjKSRg#L0S2)39oysJ2)FOG=oB-t|IHp_WAItDqdxM*u0xsV(ljA|8U1VeKOX4SW9HJkQfl6$jpFxaYD;p5Zq3V;D2jA8C4jCK%9tQ0>$qcl(AWG zh17k{P=yPJlO`YSGnHb-FGhLr!vrgR0y zj7FwwX=!<|1TG7bWuIC2fCX1d366cYTKJ|{t7fmnJ6Un=bUUBF>S0~ zl9h!;IOvTCM^}cf4227)->foRl)G4D%2wl_-d(7mdGf)_Ro|#<)~innUH0EiQ3Vd% zJ*E3zwv~E#BGQcLbx?n=FA{{6D7D>eewiT9BU-P{qxR*IyChaa|H#M zDGYynTq0{#Yx4l_8B67S1IJ!h!QF&uTkd`(Lj-aYA1(foBZh88)f)_g#qwC!?b6 zY+d5o;yKxreouLTT98z`;9%uS3Z(8#tK2tc*a`n|sd`e(g4}#H!gR*I`52VY#Y z@<*2@NN~*0Z}YT zHZ^e$T=4Ma`MGi81Am7tik>p1N$yX1&{Y(AVM8d%A`iWS5QllO!(^^eR>HqaZ3|r9 z(&<=Jl(~d)&4VAg7bbIf7yyrhkkRhoG>sxi-*s`@)h1!`Y zkEy(VWh;PsU%;<`1F%+0yak@8?}KBlM^Z4Q!D923A6+Ebtq*PO%fZ-6T&6D^N6ozA z3G(xa?%FJ2sT@LaHFSqJ`zUl_;=Wj6I%N?|H!)i7ci#`FD}T@bGqVU_6~`IZ9UWN# z{T~*Qi~yl`tH@j<%P&>?d>CF5HA*p`)lYm%KXt zDLE%vY++c|i{IM&oI^w_AQHZuzyrree=;%#i~Edz?KULuJyaIiN^#(vCx&el{|$M) z{103$n*R6i`{7(B_>)UhV+u>l=X>SrRgz6b&6k5JBBgJ5l}7D@{-~(Fz#c$71TnXW z(UvWp1i?p-u2j`!9v9_;L}JKQRQ)>G?VlKAhFP9RJibDWGe3Tq6su}K-9SDWV?4JX=2jaUv7BBq~U?r{uW?#u6PvJ*J<8O zb*SopJN9*liAWnLC$ZBi_E!V|5V59|^QDwIY2P|07~d{-UbPTI4`8~&{Szz(N*;7} zY<4o3h*4HUS#7jZDEaa+b)DoWDr9J;P!Ok?)5o1PHjP9QtqqiDX+erYcaP&PAtQ1D z^ka|m2Nw86UlnFhd)-6*jmI>`SBVLP=Ecml@qU0*-cTd;ay z*tq&PYUXrI2;U}K0>HihGW00SpEasn79cGjuLwK8v0@J*HT-N`fZtm_1=&Swm!*WI3Ty`Hl@3{L*ankC+O012$(0hxM9%)Y9f!fUH30dM6Iw{Da?>BH67T2Y}Md9$~XHR^4Af%8H+9gU+oOO|P-@@*{ zlR{BGxNLm3ymF0y8ln!o*geyQk}6K~)H5OX{|1^yGf{yUW9$4nxcVOCMaP6X?s-KH zj>eQY$p96fU(Uq95WuO9?zT?%HO=Q1pf^OmcG4J7_}?3*X<2i8&U2X(*+#R0$2^zC z;tZ46x&PS;3SX}1QQCS(a=7_Tdh3DS)l=P3cvRr#jm2zujP62AIhnLc6;(l(9PlzX zx=FllRwZSxJyxuH9QP+b+FJ6BX$rUPhD7b1Yz%6(>OL7Y{L~_aOo@!e-Fm6x5i;>| z&EO3v$L#XK(>>ikVjoNGG3gY zG`E`Rz4I`RutnS0!Hw1o-KD`!^V9dw%5iPl$F?q)zg=x@)6x?>5}IH?_+?W%4o*Wp zeX60WnKucRrond5tGX4KOI&bxCFMXMN#(O=v$=;Zce}(GiTJhsxDK*KStU=krfkqH z6Dra2q^F5X4qPASee)ZO8hBRi-2w9CAp435n#R)ynHCUVf?hY_S`SiNkMr%x6s$Mb2>J<7{u01|qDWnERr4k|YW^UW z;IYxkm)s)vh91;Ny&ZtXE!;cUp|=n5yh*{$?~q9WV=PyY2J(N|we~|{W8+dNiq|aV zk%BVw3{*GVUHi4RO|FVb4imieJ>rp3hwt`<(W73Z zzwaLwFw@Yn4du`k&SN`|HJoN?5){la97s0<#knBM- zG#*_n)2kU4f z1PA;ciZ-)pH*zgrOON=c_8#m9q*#u$GIv!NHV))OKEDG1pfNS)ZE(jgJ3k5mZ8g1J zR>K-N8}&agAv-c!+DZf9n)d%# z@uP&A@m7jd-u@PU18=1!DT9%s^=O->1&d;q&PP)INS99EUU}m&asn5@()Ow&1B#ss zEj2aEKYX=k`tJP#%XC5CQZ53E{_|4C=W_io%OQ#(*m@l+? zt#%iObsC;^0&_mei3?@A%#3bQNApswyt7enJ+#Uv&>MllD%EHVMAmgaqhE#MKO?ST zu#=RoK!R7Ml&oioI$S3ma?f?$!!m72(|x7aT`Pl|=eBP~90t738NZ?|AG#WZT4cXi;yP zV}_(!pP_oc@J6UoZspo4wG9?ejC@<)hv2HKuW$P%@WgYm8|EM**s{+gqxFB%Dly}zL` zZ>o%Vzoc^k|I^0)&@gb!Rn!~o2LbK1;&b>4dteB>)_!W zVI3d^Kh?iHgLi=hD1O9BQQ6E895v@=$W5;Iz>hR4Jv3^AvV@+^qHhdiG~wD3$GQ1v z!C95DoJPian?!WtRN@!YsD^@ z$f`A2M*yD&aP((h`}XK$Dve8>A;Zu)0vEAj19nc)O`bQY(iyOND4rt-!}~%?uZP;{ zBPv(vKh4*gh)oM_)dEElPXS8*|A?XR5zL-iKLl7+g!`X|!en@)yr8oDc7C!Nxj@S|Yjl zok{BM5rupiU$l$m&=}8u)q9eT=EdyE9Z2}M7}9yMpftsU-n&m;w&Z+BpAN8nUFBXM9;om7b z_>0+M>MW>*IIhA`XCM>qS;PfpW8l@w`fr#f#K3d*%>CnT8DVaf$YTRqt+}qe)cE8$ zS^%h_lGm4hAtbQt?(D_-)Qbxu`Q$559ncYUHm61g0ln3O-~_B?O>muI0TW^@poX@- z6aCR}9IGN}v4fA9(C^P|Ne#ij`4JcUyhr~u?;#*>9Y@QWhztFiWdIz3(=I+(q6J}q zYS?Eq|FHBd0{Xr!cSw>0Q{oP1EbDV6}eyzzZ&cY7lzTk zykp~x9(^Gxt@s8Yt!;WAJr-dvX7=}@q}2(nOzc4hNC0)0HK9N)t90BglN`oA3Znr| z-`pphYXI??Y1;ha2zFp5xX*g3*D&ZckE7JECqc;?z-{ zxqJ`mpt{#~AWVtWhZ^nmv|v(mAh{dioz{QHr@;HJmn&LWmciw}Ecf-ij&&o%exr-i z3O29`++7kpOa$;@fc;oxT|DWs^L~#DUCcT)+<( zQ>BvTPVV1gEWh%Bm24;fRcgq_Jj!?bHkkN_PC#q%a)RPIic}Y;hSzdK1{}C2uTO4N zZEW)jS-ky~utx~=L8Tsk9XZ8sXL!2*JU$GwZTK9L!U&K5aZ;=!AckE!vhb+@g&CxE z_7{S!!ZEXB1d589dB|~pijB@V42!C4f^9EgiE4-TAC>SWSEC%O!fcx3Z;}S&wE3JR zsWqm?l6Of&pA-3|ZjKliK-m@EAZ81EnaGgE3CDZu;)ewu8!$Q%tBf-+%;JF)M(+J% z;mdeuH@X}o*D7I`qd>l2d5|wLmMdP(VqBH}4okY?u$`|jMSMvs%ro?e#dgI0DfAs~M)P?)Z$9ZQdJu*9OhBnf7j}$0nxk?S=^95tJYAw z_2EpQDHA#UUhS1(rO{{4g;u-ZK(I6J{NnzP=U>z{ENJL{Y5BG`^la`1U|?d@=SYa%0m zDj3&i5_i!fGQx*WQA=OS?~Zm+rDvyDAHsMIT%3#d42hv&W8puo*X;%%S`9Gc7Y4oSBj>NnHrP1(CaZv@4;p5?#K<7q zn9-8{GZo`{BYVM!${5a$pYc1;pjKzyq&u{SS8*^BwaiXdBd| zZ_CQYAIa%J(knEHEMNJGW{^QTgtXQ|Vm{fOQ9)=hrZM6IenQAkPd?T20WS?xUH3`N zykvIH5~n3gs3;J=+`s0Gxyknn3JMC-QQ$I<&8F#r3tf&_eFszI99j@ZkmrA$sw(XE zli;iVQIK4Jc7B1)sy<6ah8W+x`ieF@`Kci6aR=M&SIF=WC;VV>$SceG`YCmkW2`bF z9x^RbPiyPzE3VOrBGA+2P2=5ra7k__Db2~L%C7^vk9A0+g{sUdB~ohB3Cxu5l)+fvL+a|0FHahH$V58)X1?2Vj& z3CrC3m0Z;<(-J0(-aPU}Xl(@8)e22J=K<_yF@!Fby>IZSdu8&7&_|-Cpn6!|qd7}4 zIXX}wuD3WnHW8e&O`pP?>PTf8_-qL~)~J_8pm~t`v>v&xE|J-$r&U)IlmN}fGi_oh z2^E?dJx6%$;$1)b`@e$lJ{3$LK891ipA1j{wHgT$+lqwUz3j;s zI4r-oF*esWOb+7?$_0whW~=PqK;A__C@*Jtj<{G2(AxZZS!@OX&8lCqa`ws96%I7wF*Z zsNPtF=JsLh@|ACzML{e%8?!YLU%7kMIkB)3E&#sG67)8->~SJP1@qbOOLRtetoHK2 zE9WY2SsN@vBDaAzvdT^fKHI-+?K6e%Bvadj*2q|6)mh-7l#Yqkk7kJ&v_7a+J^W5M zb1c3Aq?!=JIK_m^&rdlXp-G)&zWb*P#Q_yY%N8!=d35*94>=99k4!}aTb_Fa!p{B@ zy%MSnzF(+oHu#vu9IIu3UX4p3ld@x*#j|_H6^%SoPJ4D)LYrzyyShix+iC_iG^F4P zVI=fLjB(ZeQ_i1F_=|r;Xy(a(MoJ2qRlLbHXVTwlbK#yZY96)9+d^*3UOS`DS;JHZzJ; zdxOz`ru*?yBQX{^h_J#)qUykbc!cI1!<~ix;@n`;jx+J^d>LjmV~3MDG;{1I>VLs_ znZP9gp}&-HE;5`7S0advL4tBhUhcOtVEC12)#~f(AAxoj_x*{~*EJ?Ty!y<{%$iW8 zVgp|ZNv0xUyppFHH?>?Y0gE;UKuK0g2Qp}afauVo(t0>V)ixTlQaU)wtNPR>+|!v_WJtgJ~i~c ziPS=epmmQF5hTrGi}^D*fUE?6qZzh56l^Vkg^|teTRz8P7O6g$(9@QE>W{k*?gmm zJdjIw`w7D;z{%pq>lw&SCXthBG&=hG_|HZ{NXY14akeah3(BFuprVz@G)wWOfPic)m3GAS78{!xMgGpuzbYm3L`>^GH*p320M135_!R_`oEAt@Y^4~H+5lfFTn0%j@A!tF1o_OuTao*$cTWN;)lo;)8p}SyleMjX*qiSGyqHk6MX`B*$iCL$$eq$$ni)Gj3=Fr zp80`?ay4=`0a&c9dGXs8KMxr1tJ9OMgnw(Ic-bWJ`_6x}7#w1r>KOb$#n9f%&!JYt z3=ra9GtRfX%yO!>seyI22`M!f)w>qVvt5^&T{1(s!d4Fc9#6@&2oYN|YZ3iR_@)G6 zi*{elf|U^if0V8qLKDKzbaOp!{HM-M4E4Tisuv1WpnddBW=y_>_kC- z#64{uc_WHRYnO0~QA_jy92{w5=(loT-RZtD>FoY}67I<_6odliX<=Y16|kT{lYO1= z0i`UQ6~!kd3e-OVu6aU# zsA=t*zb}=z05{Ht#->2&_7Z~hs{Q1O)AS9WvZ|w1+JeKk-Ey|5yVj|0gZ|uX3nf7L zJ+TbGjkCSN#utma_)vrOlM+tMf*B}F;?6inqZT1w5A6eXIG{Ea+ztm{32w7V^W^qT z`hHLn<^dATfDvj*5;*}XlS0y`kihqwD3Xyb9$hxnt4SQLU)wXU`*b6|Lbz%;xRmI= zM8}>VWY1PzYYf~;nV}1YFVcEHg;#uug4{i-ps5JP1&ZF%Z#=4fgOt-W{*gsr8lOz` zzdZ0)kTC4x@}4M7BIA6A%-|=N+W6Q!Wxmrvz2-w{-@>~ z=>-QZ##fzS%5K&kh?^OD=htRW@vj|@jGdg@1?n$AUAT>5|16olgKhZAoFe8pYl&2t zDJ1nF#=V$R1RE|+ZQo^e6X_(%=1exP)|H7d?xadhR;gSHdFfU93G0yd)FnLV65FrN zz#SWDWY^x3?9m+0R1eso#{ICwnvJ2%VxP(JEesOcwcNT*V<|}>{}B^t$q;Do9zEn8L2JEoqd=`mG%Boid$J$)&)|L{Ly{%u&;d6SVj~s!Yhv{ z>>5CKN{MnQ_qqKEA@Xw9KX3Q_EAioPpdHICe7IV*ZGR0LKy|M0_|U&uZP^RR$5n=9Pp9B$W`3q9`oII5wwU8p z%@37`5qJywi(@K>=REl-tnX9m;>30o)Bwj%Jn?hEbdho+>%sdRB*5qNz0`o4het;D z<~muTZCO!grt@F-ASUYPuXRxIj{>mAhc~`>wui?8SuAFUSYTV|hNc|sViMK!EdeTr+h%J_%5kR-NZDCoeaK}2MC91!{aMG8>CWU zSGHnqKhtWCqd(khRtLH6kV6$Z$#zpqR-y>*hIB6xkh89W*1AUdW#wIUQGHNZu648i z&E)&0`9>o3kH;~xp@&%WbnZ3lokjI@U;IwZ`Jw*tE@R|#k4CTO?*R*^h|@7C!a@3b zWmWXybqqK-xN~J4@ef}FB`DeD>)_;45DZ)m&cQ4vmFqe`=O43VGze#&Dwc#0Sn37g z*GqI+g;YnVIv(r;yx0{qe@aY z?rAyvW{{54WTv(mc)$UtW@%b|@lGs8r8qztN#^^#CWTausk;{>BB$~*^TM_v>-=wDIr;O->W5FH6 z0rTbaM|50gdq_)D%=v`%Hare0E-SoNW_iudnl&Xg;0m>eY+ zW{vQ}0znV4m3%t5n)^FMBCUT5aD~K7^J~4+x;?wM{{_aI9;S<5&GXVjY!yGv|X{xBD&rBhd5!x09O+*Pu}%Gs&60$n`}5^ ze+OzcHEK@z1)b*_C*u3CIy!Jq6R?PWuL;Vr2_`(R$-6X&Q2eLYKv49b2iWasq7Mly zG~h4C+w0Y8@RS77mJsQitR;2UWujzFf_EV@-JDCo7dt;g+pZ;cPRGq>OKjY;qIBy^ z6v#o3bq#+%BK=lmOb(#5X=C7X6OKT{9~)O^%yb#2Z5A(E3>$-Wu*c4`w_y%xyENo} zg{D{fjP(17m*Uow6+IKIIce13cwyM8FHs(a{^G?-+z6O_kDPY5zYg5Eylbv6QGeF> zb3LuLsNzji_#d=;7gVO^P%@M*71}3o-PL~wnQ7efrX=M`*dT#G*f*sH;A4n=waE#&l;>|JZ4Ig??QQ?~4>xzD41kalL+tE&o{$ z2uFsDjH}}W6_uB>XD)DW#AH$j9AtJT-Hfope&z>vKj45b95@NHrRsuipBch`@iC_e zMG|F;tDy2sVrNO*U3n{Ig2TB28D@Hz{^EN3fg6J5>{-y4zy8?{^gEJ&2tefzW_=|Ta) zUggEn!&p^42=FTSx%Tz*TiW$wU{>4Q0OK9j|_d%#UZyMJV-KQv?qu*_Dqy0Qx+^G8U*2oIT z;KhB0^O_Twz(4*D0&G9F;H&L$LJC<&*Y|qW+a4ikum)Q1vj$vGT^y||bKT&%eCtni_H`!9M~boE3Uje^TW(5lTcf4E zXaWEERUe21uKo@AIGX!$W-cDh;7NdwPT!{sE9RiDb;&xGw) z3G3eXIlmpv%9E>+WxE9lvkx)T_~$HgaT1roXxTx`uO~V8W`=M6UWH^`(Zt=|R5~d< zW)gl&Q=UWClq>;yNtgQ(ZJP+TSNEuGeh7F!x&aHQokVT(*;xXO12SxF-;`k%Oe_eI z`U3%`r?dQc30Y_Ku?YP?#RO?6k-qO2pK9xE@?h2|l3RSMXfk1T<3_h)JCi*vw#s+d zKqCEHKik{VekRw9gfoOPAWdXw1i#OqJEu)!Sd?tD4SHvFU4-$wgN*;yd z+NWx>BUx+5bi&HC@`kO^ZfT^1uV0Q(eTPt3g1_?@?T{k!-yBEDKZVGzmC0he5{W`hN-MeFU7bMm3%_l`Q#YMd;}T##rU>!HPmve@|4XY7Z>x(}h(QRHVcoq>)K zJ>`P+tvAx*puTZp&jbCMI^_6k4KnN?LV?0=En%=7tv^)P*dF52={@`Ia=hu9@lDEC zlolXSUG2$jt!M!rkPdT>U~6m?2XO?y!_h_-ZsIpoUvJcfPKyjk_Kc#0Bv;Eq8|$F%59!RP#hhltcrmMb5jpW9@hFJDR{${NmCclJNBx72?zJ-h z;aC15_(d7hEDiwsKtHsWShFe-)TCSxzi;pFcep94tpmAWs5_ccpW>IsHJ418 z=N4HvL41x!_?vm2{n#;^UoLa%2Ui=r;C~|hp;(h5g&0|K3yE0Q4=8@F*FC*ckm#3d zz>cY@U}%g=1@)KDDLP^lwM~YWkrkfhw+)i6)U24xK6Fk{#CYdIZXJ9UO$FORPSeu3 znAkrgu|FhpmZnwFE09cBV}+@tNLo3(=w4D-ZMfwoyHyb0Gp(q?D# zi;>i3Pk+;g&`9oR^DYWi0#6U9AFwhd5KtS|!U6;|@e5Y*pm9j-)(w?@HPuxt{ZFQv z2u)2~)BbAP1zDIPQSIb1VzK1!5~U!0Im7R@fpb@8YZ2uz=(OpvrUcLFOt1X%I5!&k zkyAe_p~Y-!S1EzdC+G7h%#Bp8{Zx|nR2}whgM?+^toge8`fc-{b7kG8C^6JaGjvTJ zXvB1K;;%ogaxDeCWO9gCXA3+QemAS7KlMaAd|&qHcXp{qQmQ~~1V$jHw&;L41!%*% zP|x>i##mHY)b_qnlN{EOXIsw|Q8GGvFT)^+8HYlW#1^hUaVPsuu0A`XKRZ(3U0PE% zy5XmsemAGw0NR=h^J~TY-Tt&mWVKHm)S53zCe(%kzwuKV2`M-xTfca9vo6(X~gclP5~jVfC9W1bC2_4EsXqUfnEXf4_*wR{Fq8W2Y=QJy9?VCG`U^ zb`+iZ$Slz?gK8{_R`1wr$&7#{u6)nAU&?%%=8%pWL~OEcbYwFpY7|wyPw&=US7=zW zDpIcBzWt+Y?fFEy2Qx1+;&l@iJxB5)?)SxlW~0iiO@w|Y--;u+QnS`jdZErJVTRm|lXXe{sPlpOw4*wSfE30#FerES9KU$Q!`JE);m0 z(Ov-TsKjFZpszZ95y@E32wl!~HKJHrIjI()s?Ngn35YBSB0l4#vjv@U!SSA@~SYZZ?W z>b!igQS*7kgSo_%U>%@@>$hD*>9Hj5|QyZZ{VabHp?=f{(kM=sgkO@0qnG3+Zk ztsvUY5LcaVKawDxpC4lLY#xL@@Y}98Q&)n1RNeLm-IpBEHHg77{a@#a~dnKO?8r!w5jsynTb7Hr}HusNiGPi}k>k#x}%MXUG7 zM?UIkFkzc2ua3m$FCl`GYP7)qoyLam$Norv%z(VmAIr3jemo98Q#&RS+2J{XAxw2S zl0r-+z{3kdA}am+eOwqPBPC0DT2fS!VwEFvP+M})3!`R^AvH0=>BWDii@2vtF zSiRsuEek^ifJo%uiZ?k@-MBb~TV=OTTvH^`7;qwYe?l$a6GP{T%+OEW!YD1MHgm)= zRVyE7@fwN*AW5fcvS*=dI4>43^0WGL{IY8s2ER2=I>-8li}gD*T+WH&qaq%Y922EK z0?4K)BOwKu!V-#*5`nf?b%(=9xmb?T8QL1T@m%w}l3kT;d+^r+k_GjO7mg8IpT0W?`_VN%pR(^z<1Lp&aK#OO zueKDQxpMqQ8A#H;2KZ|UStKwkvCw7O)7iI=Z=T>8Dht-eiY1~T zxVfK>2GMhg)wJoUDpv>uF#KAC-5Ovz9eZ}ay7_61p=H9r~H=XX$Un^-v)p|dTtA`{u7Z8fkgB!U{@;-qmQibX0 zFbPp4v^}pu)kO~)gM&X7w5O?^y`dSsFV0}HLnIGY^;ZLCD*0qn$?73@GN`I^k8TM~?1fpZ z%)WJLzgIxq6J#b2rk!_c`@k#(j!#ZxbajD>m9BYOCNwdTO|ley zVA`qE*cu&xwH0^M8T8H#-tB5T>{=Q)vqAlael-_icV_tUsBl#7VQbA$xC3N{+RtBU z_NzNG7H^<33doU@7`#xMJ4SjM^+^iZxn^yxW^Ot0xRej?5v4Rs#Db$ep@oiR{i@4Z zIPRHo>mz)ZP(t#v$CIL%dNDBG=qRVGl6^|DoUqLy>_i@ln>8Vvw!qu*F*7}z?eySH z)d@cS;w}l~iu<8gxn#fX#GkTx6%OW_(MS8Sqvw^wl>c@D_-KrrEg6C{bixw^^f7!w z7QSKf`#7yHuUXg~jZ3PfHfQeJdq^;f#ENCWQTZDwh-|Fq1uS*G(^pya0_kK=1nnD+ z9$vxhLAyH&wxPsuM$fl#ag;Wy8G%68V!2H4=Ud3TwdtIk%@%GhTuoPt(p-M`p*LDA zV>3MuKXkj++~sQA#Fs(G8B zekUj-D?H^fZ3(z4d;&TIMAj7RQdGW_y$xjI&zfR&Ex^(f^{3%Q->%7acHzeKi6SEJ z()&jG94_(pLPPN^^qtsEqx-t6`&%UUHxKAwQ-VaU%O&HE7=xeK-6a@`%8(`w-NY0+ z`KY%;Mw3uDJ&OqdRRcz>$vOzM)*iPkPuHdg_CQc-rGY}cJn(y0sq6f?Qc-n%vhAKB zEj990V2PGjiHb$(@-}aO6lte_^}C9peKx8bwf}(oD7+yd%Xfz@3qV;c) zPem;H4O`B5S`3Ytom4If;>#n}gr8$NUk>3-iT=e5TtUZjd)Q3%W&c6JIC`7haL=^W zX>e(6hcA=Or;>%=lN_KMiKDzHH6&qGw3le9meR@omLxj?an$u1thZEF0;OTXTzOzNp5GC1V6`^mg~ z-mnP7AO=9SPI&F^`aMgyfZx*o&og~!bCEhwP3m~W_JwY>*6_?_-r*Cr^>N5tKLi$6 zzv)Lzxq3k8^9hIPNAAKW0E>frc{`Wk==U-$QZyl4sXz2AQUuE93%iVQbrM@x*HOmb zFS)Y*cjYwv5Rj)9$C;~4^@HpdCv>>Bkp&DD_zm3BH_OtHX9pM<3)J{clFpfbr3vvs zslI!BB>)b5kwxU)FA52YaWR4}jx#E^cjlcqP+wF6xn~!O^0kIT)P-Gm0JMbKei$uF zIvVZU>_-4br2KY!4485|17(_a zn~cs5;P^F@xR`_@bzogE=8NJ z%lmNCG>4E1RYiuI`5MuAQn(cjCkUDsk0Mg%8SV%@Dv&*lRPh-?%zl7IP>g+_773+x zFxKLx8=6v{$?o#b9mG9rk@R<1H$T*MNMB)TgG`3AvKf_WQKrZ^3UpflG*q_upX0%7 zT5@o*dtF3mWbQHaVf*>*tZjrk-isXt1RQ_EemWn3i6GO^d;cwQ1?HykINssl0oAx< zQMxJZe~h>nVlauXPOR%0@CMw=DF4JdzcIDhQ&_9D7N6gaYA}g?zj69hLnZUsGy2pg z0mI~n+rq%4(3@A>!Zn4`{Y8DP>l#DbC}omrJYO~h=T^((u#R+@N|7nbkxQ+Rx--aK z)$NUBd5c67UZgmnM3sH+Jkj_W@Zc`+=`pxxYf!h(nW@sn%Ys1|a-1{jdL@+XF#)Ms z`u9}d%c5ZJj-SGqBCZY(aoXub55e-aM<20YqL%z_U?4{Hq;F~U0mWo4s)#*H{YPmV zUcm=L7aH)>_5g}kPGUt8?@7#dmzm(QFzA)+p0XXia9x?z=*9)9K}T2Fy2#x5hk#NnCnY_vTxBCJ;)zE z(hIB}b~bGFe|L)0dlR)2TwD=Do0C4@hgil;fOwQOW_7&htQDx?u=qB3ldN^j6J2ZW zrqa8C)qsPBOwrLa4i?0H|8Dz**MvU;{zcF3DGAgw++DwZ=XzorGHSMJ4L2K+Hd%nHvPSwkMJ{C)YfW`Gn>+S8RM3?i;iF<&9tl8@M zE%jLn{v$I~wFF?*Z1*{5!GqRtQ#{SPrICs;8^uX7`R#!uZ1L2LT6iUhJCZw3cyIm? z<VfxJRAYXlQ#aY};s59}VxPNAWx&V={Q6)3l3p0X{g*B-qJWM_uPg zmsZxL_3}H4rEw)${}vx}9PPESeQ4yuN>C0xZ7msn@SNybUNb^*Rtt2@FQMu8HU-+q z>e#DJFzk%EgD|3q%Dy9icOuS8NJwm0IB&to#s1_I!*wz)1dk}=8nct_!+7*vi~i8I zR?TbutRyI3@=OAIyUS!w?kKG}G3Uq1t7E!MMt6Z_`jjjNWroA=u(idh`NL0G2XKAj zJ>mtOtu?nszXj00CeTU0+Skp_hnbR-R#X6fqs9-@&9MWLeBcYG1YHZzBM$>zN9Y?Jk}ga6wSkQaM$AP*zJetj>K_Kza|R4t^5uy)49=@1Pk*5i4*3(jEF;qTCZxJ%d%pph^7 zV|~=u#-E3I1Y7UFJQhb*cs~&;+{g&_dNtW&dfY*|k04|zRGrsHg36WlPOsHOCJJ-Q zfTnMS8N`9yjBla+me;@QVl+`nrWY~S;}kig&Ud^tofHJ{9s6g$Cei+QE&9i`hsuIP zq%6=XjH%4m$A^Ri9tzej%oCkdXN!;bh3XMS?DK0o{D~w0>Vjq;?+IW~9joE9u+JCz zRWv)@NJCe_s!O25p>jh(V~#;J=g$pE^QS1g1qG3J!uE+nLs{Jh7c{yo=#pBr>oiot zVv}LJYa-d?J=ESoXcrd0IBQ7yPE>0gU5Z2SRxE|*LE~w@57iRwokN7!4g7bcEjcGO; zB7EJn;zr)`>(v|xK?HyhxRCg>A`7#Y3)+9B845rV9j5n=b7LH+>2sO0*%knVNotp@ zCA}8pD9s-^MHi%Nl{h%WuvnFTl6?(aY-Y#~N~}U8#yNi@cg$a-LNcaYx`$vt)&(3q zP7N?%P}p0ncfYDom7S*mVw^mW;@qT^bRKqCX1lq+OEtcUjG7+BboSh(mz}OGJMIkZ zWmd6rRnyxn(0n9HYD#&VuQ>6CN28o`EJxiIu3RwC2$V=@yyK2_={rxK&+k7XUt!J3?HtelAmle{#3S! zKOJaBckfTBrx1Vr`|eU!!;qY5lT;zlE0eb9r7-up5}TJy1-&zeGfJG3N5XivOqQ*B>YG~wDTLuo z(KsDRx_p?hYhH{rh1@Qwl^@t=6n|o3V(X2ixA@|rsX_SUi|>rl=p>_(hdTE7sA4<~ zxt=H97qzVwX{|kb+2b`06b8S@sDjWyKL?T@uheU#702?>zTM+%Av(`D%{M_^`TS{3 ztn2BH-l4Phrv;&8RM~ zm=c+61&2)PuZpzbnH$oPIOz2_q?l?xfDd0UfzTxW$Y6M4Ke^g2L>h9YokXG!P0zkX zN(JM1JkbSHA6eB5zM%w1x|Xz8A=19XPEfH>Skw#7$6(=PlMrO~K0Yc>hl%X(L0r9I zx5hO{B@NfyiA=?D4oJH<_n?yxz!ZQxriJHxLL*!{fwb7ao9n?q4|Nk02*jqayTRSwtUEJ>P@Y(;!EC$uh) zp!`T{bG^Gl2nqFw&&PYD76`c*KKvhqioJw1>kjXV$EmIlOHZshX4S=`l);77JKGdu_#;tkyf|t0$*2Ynm7TB{K zfBDxtE{L09A1YwIkhGERbEVJp*DdK<8iLF;%js;<8w{bA>3Q1HNb3G;8r33m38N-!}42%kmoR?ZyraF)KBqZ?mTIpC{6GW*r>6~x^u zS=Gc<`QjdwrXzVls@tvZiV14Yu!%$?L=;@QcrtTc^bJ9k3c_)Cw z%ikm`x@3nTqnjaRM!S;baS%KO(DbEncWn-FXZx?DcL^|%H59v`neusW`*J!^QA#Gx z71GJ`_#VUi34-HFhAp0{DbCab!b6wmk)M5M^>&yGutd>Y^3qL+q^vMPanXA}0b%Hl z!fkx-7i#$4?(jabgmlp{Z-?O)#Mmw?e)X_g^z? zAZJc@0_{n>RNgNZ4%>^JGf}%s?!a z72T~mi*2_PICuHO8B0U@jcf(n$NcGQ1*^V!(s&j3TeXEfdPhoxkWRF)#>;MYc{Xf1$Nj5^tp zC&A+{5g?n0Nh{p)GSjM#B;A}~{D9GsmZ`9z|8vr|de}oA-GWAAHKWr4GQ)mXcZ)oB zE*@TxqcBahFCst4P1+YB+Pm|h_3yZ;#|$?K3BJtJwc&)sN?svGS+}p$+;7H*(~n=+ z#39#dcYqN=3!vu6q?6QrFt0;Crr*L8xYWdr;(rXNvRUGt#1Uc&d4A*ztACG|;L%O{ zdL@)eQvn|Q!LDtO25m>1O~Laqs?J(l-Xt|H7e5^{IrXU|cOVx^ts2>EK=1p#IYIyarx4}ELF#2^wQ2=vxT5^27cCWD>;r?+NVSTz1le39DsC!G zs*j0xvXD>ly-ESOz{g2jL5yT%$w;uQDo9`Q@(D9oQUdqNobw6a(XTD#VHtl44pqNH zUd$*5pm2pg5Sb_i;to4&7{mkCf@HZpb4ICNYyOx|A&Jfoj9mInTXn7A;tD z>p8vQ|L>Mp<3{*>ki-T@PhZ}fV8-;b{;W?}rUY7#P?mAK)wsZA63k#l{z|NQ^WW-vqz;_XhJEWMh^~6z2D=mscYrRiP)aTztZ|dB{kd$ zwKoqS1kVGAmlVZ=d<{`cW62)gfJLP8c`q^`9U$Pu?6h|5H`H&H49x0ne$Z&#w*iNC z#S=cuuth5KEBRzT)Vr4TY~TPHnWCiZ(f&!(PgS8sy$TUCYMS^qotw2_pQ)RuvqqQH z_hRlkt8+W9RqGB*oTbE^!TmeL+uH7buEnEQ zn{oyjs1VY>p*Xpp5Za1!4t>W~^~eoBUi;gePI~}$&4RC}Rb{~uVyj%x3fFjVVqxI7 zYdgbhdMiN*^P!)0qv|c5dJ|k=Zvn|+itw<9@Gt_iqP)wDn1 zs-IAd5ap&jNq$!X0szSkimpK;fqi`lW~%tNhipB?2g<<6fVuB`qxpi^#rkytmlmo( zuOPkfd6tF-Pl z>N2b@ra6s1S~HN^D3mNXjiAayJjlI_P-ajd zgUwEVEkl7SGIM#GXlySkig%OiQhl}bmnx+YbLs*?qF{-n?a)-mb= z>2}L@)NZZBcYPc&KkzA#{l0FV=!z!JKL#5D!zMCm9csOb)$Ct!)%OXRkrW9a>XW%2 zNboJd<#1*UiTu3C?}WL-_j!KeAlSjRZkxrZ{4 zh00*5Vg>yTFc1y0yOlia{K$lDQ5gp<<)yIA|$CiXISo3fB>~sDcZ5GoJeq7VRl{^$Sn#|3x?eeV_96kwf z#&!>EFxu&XN<18`^|DD^PfTxt2*5wMqM5hI>hH)&NSoIm0E`6%3pU?l5w(=#UTf&m)cU3;qbziLv3l&u40 zJ~@HJDGr>V*c;7HO2T=RnwI)QnD520VZ+x?HL4hk!SBZ@IyF$1`T4M#UlgJ26y+1C z@j$^Gsi}r}SBa@NC($u!x&N&*Kcs70WY+UjVv?6zsa3?wSvHS)Xoi;Igaf`Z#B*47a{a^Y0nUEX}!yN?lc8I z1i%+R1%M1gJ}TYMWG_4bfiHE5>}lcm#?)UGZaG|^$0oenoK7%#zx*XM)II?LT{6G-4nCgh zG~cH{+CrTDoOkc{H7zS2y3h=Y=)uCI0e)~SVOZg@{dKbppJ`vF)P6aFkeE>n`Hm@E z`6DCr;0ye|*d~2MjbWuiJ!cSHq^0%H6tu){_74h{fR4;}2C^U1>O$8@FYe=Gk2b+R z5NYuZUqS%go=IB{*Zh5JE}mCB%9e{@PT|}^-zD(s_Siq89R2i=J_K#-)1#DQwK*&J z8v@_&3pE{b?%aFLXZMi&)4HrYej(u-nJ=f{OYjPl+w`FM%*4IbJ1wJ9x!>(7%U?CH zXdB~;sO9`dj|TTS{H+td%9}9xtJtaGBTfRsFuva;_hl3s_McJ{6mOnh9veKl>g|cBdbF8VnOgEjMNN)cnKo__U3H~iZ54|1e$)R7M84HCY z358Zu{kpBY?OB7fclh5N>zR9}pGkaF4WN64HY~Uxyg&n_yw#9dJ$hNIBD@!a@tn(b zkL-!n*F>GX5YgAVs^VJv?l=Maa7aPshdX+yEXF}hUi+(L9aafVvNwr{a23y{ZaS`n z*Xr~=o;i-BksYk9JzHv@gl=;$$*nHlaM)AQO6eeRUd6@{iD){GHRn`pELUt8zI*pn zYY2aAY>fO9K!4muj&Ii5w2&fq`;8p&;?+eEz4^gQ5OT>4m)E8{2Kg%zk6U9dM^~$7 zJ??Qc5BM=XTq&Upqpvs!)*vuLd@@gnM%sSy6j6HEb5}WG*~RU^;%Gd!9tJ6x2>&5c zOmt}9v1}Eyl~=XGlWx8b+f#3NX7x4=cogtqQk?$3CCu+@&nGNgO-VeK(R4(u(u_k^ zM~H*qU$xA+>O@OP_O_=g4(%<`^7w(Z^L%!d{jRwF`gLGk9hLBVckYWnG*6=!_x2oB zNlw9QLF}>PC>F`=?Y;3W?S;_ketVGdoA&aHkp+5}5>6QU+Lb!^AO11@osQYxJ-6h^ zw$>n=&lj*JaG*Z!E1$5lw7Ro3ZfU;+1uZ9FcVxVcME!1MtJRG8w*P3rzv=zEb|Pvq z>6BrmBn?_BzHjD2&CWG^jR?Chk37~$sPf0v0-}2Pl!(Gg_p31RcRz2@$ry`hlFDM` z=DD`s8=$QTl#}jFu&NmUD{nQi2hwR6`jpz5o6*5(lLziW7sS*jIH&Ec{@8r*mwo$A zJttY6wY58MK}0XxXLylZRM++ zR)^8ZtSLW*@@3UuT`~C~)Ax`zE)F{DFw14rY>J|-k(-?@(^{hBxrl`pHV6#$FTEgZ zdK>%#;4|tSZh6V?Jy80>r7>{NTZUcbTGYbx62SIht5Ar!33$@;DkYff4{R85jtR;MyNc+=yrTmXqgAd!AJj+LbgvY_Tpd zNu(MieLqpk9;%gxL|I!vwUeAOWo^D>FhXC;Yg!fsycqM$`K$0ND1|!BbGHAFeE3D& z5`;IkOul7MKnPh)Sk4I8)xl=FDU`Yh&Wzo=J`Wl`+Emc`_ZUcQk`3bPQzt?Gh3Zg= zP`EkREDWWpUTuvTdpN$!pNN>N+Stnvn3HZtTpi5SPv0ZERF@Z_Y|#&-f}dcu0+g{< z{D@quoKn_yZ=O|LQ71=9NJAQF^kd`b{fcp26l3)dcMr=-USG+pa(b)@~&(%h31yP0K8in!7WE%zcYAfTN(T4N< z=~+Ewz+wv7mY=;)tH_kSGVr)OZAK~kF)Z@@YalSS=hKCG+U4I#43Y*CojY%brEs552HQV1>dTI!7LF3;NbXSBI|orG`S20z;`sZpYXIO=$>0?jNc- z{muL{d)D;NWoj-No}yM4UrwAVUzn?_h+9>WfUI7=+)h+N=nQ_3ysSnf;UvEb>yUJi zWToWJUkcaDbLKvQEJ|hvXC6}hr-<6~w~rX#yGmXV%I)~PGK{-X|1-|{ru_9sEp5l9 zfzQ0si(>igmO|-YX`Cyh1=3K1^4B2aK&G!9xHGJ&gOk@#_do%J(pHfF$) zC}L_h2rT!-WER;Eg7qNz4@b$H;GgZ@E+@ku>AS%LBP9l>Sh7#}X$=YnC)n$8-GT2( z+;b0O7mwa^G3#e2$vRCNuNQIzaU?le!oucB_;Ms(j`j?$Ho4MSq6Cml(m=9N6G&D6 zJiTOsjU0L~2}aq;Ayv10%-|y$H-6Hl2XsT$ze-A4H+eWBDazWEcAUzb*-8-?gqeRb^T|3ZGi_TkN$20X%i{q4w<#90;ZK0W|CZp~d) zJVoHm(|qkMf7)9e=z0qG5EZmA$FIi2S-ccL{emjCcdMTuWrXk>t$t!ctbuax$!x5) z@`Sey0({r>cfNS7JMyTwA3E;GO}j#Vw8UVB?INy{r|tc2uEp69-(Gk}!-axrPzeH% zb399UZM)sV2jKm*PwBpQX;`yq8ldNQ8@qbg>PCAGf1bhhhPIf}yP3qf z0~7y$TmZ?Bl0JqF2CMI#-?7K6KBSS0<;6U`+K)N*O(_kUpnHyO0Ja}%emwib1ym4k z+-)@&Xfju`rTv^l4|Wdi^E2@q@AfHqb;x1g^PrMU>gQ>5?Y^&7ZgwhcY$_Qba8!Wi zjglm}KQTe*^SECF0w=e<_MPva?!!eDI>Y`QtN0ra@{!$qh@xp5II!~c{PCm*WU=;$ z=ehous8)8~luG9vNZg;i#ZHD>oO{P5izVRuuTslDn$AU)ItojS(e&29w&iT~R4mU} zPsk<(iy;ak1@zS|%Kt~yS4PFv1lyj$CAe#V;1JxM;O-vWodkyNIEu+T~flQk~58|~D zOd3UY&o=Jhx+Kl5R`cUO?AEC5)9`wr&E z>C9}4v7+7d{NS{N_rwnA(LMrBEb1kwnINN0}Kc=zFm86y` zBj8=g>hBIif!o6;ZEx7*wbP*s)b0bKP*d0*^s!LMnE(kuSy|bP2BMb<R9a<0o4LQGlTE|0q;g5#Z z(qhlDx;$+&am}O8JL=Kh1@_-5DBbB{>>GAex06`s6ZgGo{cd;%qt8AKrC%qSIqZ2y z+2ofX4;ksPtrhN5gmJ}ZFeisJu>;&)HWuXVeucI$p)8}Gk-E#S3I>c4Zl8j?P6LpT zcz+FeZJo`|P^o`9er23sZQw?h9GQ$+X3wCx`ZBCC*i!!>?f_jX)py~P_*e!*F^1u&$=C)#45L`{*oMjK*bH^s?l#fWKTtB7!E2j- z9IHTHG5xov3drjP^LmmIp8+?M-ho50=@}pBF(Z_AHkclTmA^y7O>bK<{X~ zOfHGQ(7m4Sy~T$nBe;Vo(a?ZfV`%gJR~d3hxBjyqm^vV7fJlGw$WrN{+F?#~q#em5 z5PiM#lryYIGR=n`Rz%$~vLSI$YEE&5i6b$vU#W)&*{E%VB!OyLDZrUbayfpQhZDsV z#S393KmT1)5#(raO38{Kw!qfch7Rj#^1r>Pp`Sa1P=Ja59G4ob4|pUb<5wxQ4riLl z^(e4NUbBr+JrY!ks|2X7(cZ2?{~L&aswxROz~SLPP9-;VH$EQM$28t=9Wi6EAt*es z`rPnzFLds}BJWO}BUoVz(nRMldconnyM9^D+HT#~qH~?Vaj+lmEzlbiDw?lLIF2Q1 zu0G5w(3|3i2fXdz7{l4%h0x@ly3_hZ+%}LgEe3e!k#m>P>GSCDq9UQOSW6F7pI8Mm z#&dt#jUi)(j*kmMjI!4!eu7iUB3IHKsTRz_-v%QfoBuj^V!9LD7|40Ous)9wc~-e7 zmXUf^-0Q&H=+1;hZ-MXBlw&wi$R^0|ED1V>b2zJhNXDxauVX?22g6(kd;R0r{y6ao zQYbuE0}gFiXZm|d9=-;8D#|8VIjUMyGl2lq5eKH}a8`oh@I{2HFLXJ$yL~jt)Chg5 zpT1&2)ouH4F!&bqR04JKeP%`417jfydS7-2HWEfKl$oJ3q))PA!;*A=o$^#~ek6Qv`{d zN{l2hG3{`u+ymbM*s4*XOV(S5KSA3z>Y3Vh^d78Li5 z6hA8)@Zb+6aywu=jl14a>S0)4AP=EzqIDMf`9YC@gBB(>v{87vi;M3&Eq@k3tn4z9 z^QL~gd6o|`5DjVZB7p$*ixIb1HY+9^>EvqM^3e+~-i*n2Z7 zE^nO{y7G7?$HKZ*Cd-$35qI-BEK}ZmsPw81mCpoSM?P8?EvFbE(4!4)wF%5qbDsa( zyCQ`85AOs~lP{8&7NY}*Vhvnr zvSFt8;cRO1O43WzTRaiJzU$23IW?Ymd4EUt>Z7Mash91ZaWwo?U$EkCrngi}dXls> z&;AM#rLrz0=TYm4r`=>+b^otZpznid1SqoBDu_+_@O&fDegfT;|H_lsd))NbEWjg# zKjl6u02VWQCHey6o(N$$gMJ)^fO;)*GOL(Eu(S)j3Atkn(8DMp8W07t{Wc{{Q45*O zXxSeqpbh`g`|!!6kOE@#6)4{$p_;!O%Z4prw6x6qPB$(V@Qv>OgQm~lBc}dob3n8E zj1s}=`2vtGqXQ=Cv|wEhS8CYo8BzRlg$OE^4-1?}vEd1x!eL5<6i|2i|Dvk@WQAR& z|BHt6zt8do=-DlvHh>2ma~BOyum^VSpqY*~hqS&-h&m?vZ&!7~vSYtT$t-|JU}oQ7^N$(XMAW48D@m-w|5@YrY3}+77g5jKqRH8fxJpmA!&)6A>8Ef&6BreHK!F+c;M%wuKoQBH9!c&{c?XbqClYp+Ub{HUy zN!#hQfH{6kT4}*IOWdr0v0|@ed4B8cS#zTl#ioEqg)*gN@{Bv-o5w?;MxiaLp5pjs zhKmYl64P#>twGFgXy5dEguwx4{Y9ZypNfmci^sMW(>8ilQN-a?vcb1+x+)LMrQIpl zdlgi(=+1#H0j+FT8ykmUu89p!l|QMG6MGk1B1XV7QNF*&gox^3wBVufi`2BoodrD; z@b8%Ojxmhd|G7Yp%=u<|bmoSpyZ^H|-#k?3_apir_P+zsu+hoRq?5Kf_aBW2CVoc_ zSh`Y3Z^D888xoS{w`wm)0ZLAQn5$z#Bk_C3b`!(Wo)g|ZF|nP)J)#RA06;BnaY2sy z`mfenEUietRMn$`gKnvc=BC;3LI|~bJUd+`Y<5%wKd+ju_)qUZ*o2O*Vh6qvT3S?7 zPcOLTkBL9;Cnfej*2Og)gbP3h9LE|=4<&Y|Tm$eMW2#Wzb#umPhwvusK333})$idj zo}*%*y|dq;+!IcgGdt=3HkCiV@_!733U69szgcriRh*?u^qQv zEH{B6vD2mtgxmF6*j=d7FUG)W;X_a$QW1F@#1BD7|6Dd`SNav^C7B<-p0a^EyB9-% ztAq%t1eQXK58mbQE>tUSl8Egr501~Ci%+$;i~K42o6h<#?ST)7Jc?Wjo&2;7{R9t) z_$s=q(h~YAW&q#9^3y?tSm|e_Vkk=uYf*-D1Yen|)3;Q7+JdX57 zwf7Ve6o!GI7XOOXyRk2@%i^!NIwWJYn$tKnHHcor84(&$J5UVYRJnSa*oIr(sob9R zBz#-+r5`T8gr|oY<9;K%RB#TKmBG%uK`cJQnaYTR6qtPj??Qi%q$8U=PV9wSa9|lo zBf28swV15rzDN@jFRfI5CO-@ED@Nl}V2z)JsA>se1)N#pKxc7Q1SYW?itMnpMX6St zJiTULL*~_72+&_}tS*Cy=ppFNn^Pt{_Bg9pj_Ijl)ZMfyJ~?NmH~IBKNF|*Y$@&>7 zaq%NoKV|pfYU0L`Rln*7IB^vo$VX}>&$AyxMyQFYE4i_)@^C234X-gHh*5q*&sw>s z(f{5|UM<#hSf%_F$ZL{ApzAIhplva}}y>^MF^w~E}bw4dPSqAhwGIu2*W0?NX z?|hISfD`VykP_YgkO`GA>^md@9+M<}Wmi&w_cev*Sm(!mS9a``$af?He6DNaWO4I1 zRFTR(-)+BgBTV*~ zl;a3R-PSJ8@HaVWx-k+K)sxMRDngo($*) zdct`{9SS#+AeC%#i@?B-neuwfA3EDPtV;ccGpF}9fV%}EA}v@oBNbpt^)oaCNSKfjKKTuHsA?sJ6s{mg*^~LvPj7*yYbt$7R}OT z=w>1imPO%L{y;#W3sN@ML>exBO^)54>|j~S5o zws8UifWL!X6`bXeHAH6ak#VlsVP6iy8?g$#M@^?6;)Q>3wRz}(?%f{3bDN?nGSL6P zAysq0_{+InABMKCg`%m1RK`2CPsrFn@QH1QcI~@&jAL)Q-7T2J-`LIastXm;TB~aud6Ph?2x7gGq`s7q1l6$wFTJLI82 zlpMe{7y8cf!#n2#{3fvOZyHQ>*bUL8m0fWjf-zv?^{7fLbSHf-QeXX=A`bSYg5)B{ zKiX44!JOB`1UDEkFQ&;|^VTn3B^;BzWDXQQEkxh2yc8hlXx*pZRs#DzSNL13ziDHB zoTS6nbA71OLK@r@BtlfKCn5QiIbV%NfrXtcSQro{Uhme0KoL)2lQ|d?)b}qstKF98uPIZs}tz{?)pT0`s8eDtAb#ExbC-hsAy6zE}e1hIC zXN)7MGA3dziY6tre~Y!BJ2>ri_*g00{q4n^0SeZWA9=c!m-=N`c_Wb5qkdRHszT#N zMDVF5evwVfl{U*-{6^Z-HLN}@DVJdBQleEe{KlXw$?8{`ULJ=IdU$3_!w(z^Oc}v< zj)4M{W4g2$)&f_uQT&}SpSoM^P2u+W2BdBkQ|Z%9m z^u_6NCbTe^$y#?uklKE@1Tq)-V9|-iR$6=Va5tUgn|)(XY;OgQ8FbskKEq(bsS$F2 z1~=ID{w$f&osMb=;3>dv5bztPTS_Sk3NpCX`LP-hB}Ig7-1=4*B5m5)m6JEx0vK9(0~14353~2vLB)Y^+T8Eh9CecQNF_0)~;YWl9W?p zvAMS)c1U|T19Y!PlZ!3swtT68JxzLn&tQoYyrHDdZl9Y?!e@M0Yc{WnuGPYU@O z+$S*{M7>owX|>-}dE6}FOWfZyERg^E*xY-ZQZ`l`puqv59%Ji^YFB2v#pQyAy$5Fr zoVKegl?8%44~15PwHY>Iaj=8f2$iUF$uHG~f>(JBTt)6rQ0C*UNl<|Pv^f)^=?`W# zgs!C*-Hnrlz+Dj>LzwPeOyiVLcCUA-aIBg!&8|rA&cln~52icu=HMFL&`JpNQ<{xi zS%1pLO+8YOQYai)6-sm~nyqFCSa*$?{{^f!1vXfE7Y8Up$Mfh>K)ryjV^ijxi^0;7 z8hX3Gz$WMGQ;iGB=dHtM*fBr+{T%w#D>#cD_$hm_ZP6e$NHux4EZVy_ojjWp?8kM& z_&`(r-wX+~Ox`4l<#A<0fLOj1b+eG1SXaDr@KV#9NYUM>EvR)rvlS4hPRs-vDJ33I zyJ@`(l{T~S+Vp*W_>5)1J~g3uPTI>487MGfeqf!JB_|p7Lh<|bioK>m7ocN7*9AMv zIvwo|QzwjPH+#s+)Why2yoG3`i;}xSLZ-Qc;u?uktWljqzA`dLn(>9sO-cDUvubhs>^q1XdekIV$buqzpQH#UqZNuOks?az%l4t$&Fj#QTrJz zrUrn?psjwQ|Xyy5w(W7>cAk6fycR%!Sp=FbPVf1Lw zd2FIgfHTbU;Hc9L<$w721F#B-<^$0JTOs8giu!oAfN24? zBjbrelXx9c)skBqcZt*>{to8T5Yi)d%0S_W7r4XLjSLybw-Q1cdbUh&)4t~-QK9K2 zGp)i0!U|xxsDs_|o2VVj3TNqZq2a(>CC`j4dq;*uZ`W_an!5zUeT-l7527q~Uv4Cp zU?-&oQh7Vc#b({8kCi3&oR@Y!(Zbt-8W7HibQeY~L9G$)`nvWqOJsr0Gy-S+${ykw z-2ym;l6#nlT;XrgYQgvxP_j)|O|yHq z(J%_w=fD4wM7SNChC$b}zhBkS&jG zUd#ljvD_5R-!BPURAzjZ7!;i5E3QtUehCt9_v(sUn5sTCdv4P;0H->Jz6l(EM~zZD1MA<_NUg5THJhnLooqjs%AH>lRQzXZzQ&|~}| z9HW=t*jBN$62IpL_Jlnc%Q{%Zo(TUUHyg65**6H_BzK>GcLEXK5Oq#@co{tC^WC>K zrUEupx3mM2$2|3C>tK6OAAV^bSgUv%uHreQq5`z=;NM8T$S^KAo*~vG1S-a@T7FXo z1aGD^-v6hVX*cgdPV=V$RJHi}4AoTjO_j2RN>{gaB32z!Ox}PmP1lUjuX{+ zgXt-_A{$&cC7FEr`m~Yijo(!DTF>-QW5~lCg5CNzX}hyQ7jG9%isD<`0r5iiHs9)F z%8I^EV0+3Gq1_=UzmiN&q~>Dw{d z#`px!{xBZqbaiYH2G*^92++fd{yob>H)FitU7^A+HpTVVZuU!0X^hRNP8#?qE$e5?sH?veLKN|r1Uey zfNtsr)zPmF=K{`xHuO<+r+J!^1KjX*D;?I~>w3P@ip}$2sa1%$tVKJd`&wH(^L}F_ za%@7uhA`v(!3ALlU@-XHZ%Cp-@MN^P66qo{xKZ@_AX3Jh)Xuk8;I=DIonp9f?Uf>DW;Lc5`<`mkQ@E7;kG!Y5sig@y3e|h#(8rQHQ{zWB6Y>oba8W3x z7(&W{vixEc0w0rPdwz{OyttfgHY~Bwb?oLuLIpO5rUT>$3D2!eeepQoXN0nu>zR<+ z6V}vt!5hN-tV`B=X?fF;D;d4PmLF=fHC&1cN~ztGbk-Tbvou~^5kaXJ6dWR_ZQuZ~ zp|UYv=JR)ul;rhDw+&tTU7zaxeR@ z*4VC?kM_%&Ryw2j@~DS-y+Z+0E#JB%mG597l3U2`ko!zPq2kp%i+`ed=NTpb(#*r( z1Cc;%K(v;Ibny39j8<<9G#%Cw z`9#fnbI_^Oh{vlN*Q`N^!MU@lg?R!J;^rrqF>XQ;t|hs(_0Nm8=D<+%JB<-MJ>0J< zit&-qR(7Y9^iOZ^SSKJc$c7o^N4ux|wj6jATz+k}GQ?A^A< zU&=U99QDqmh_K^zetM;ZF%-GJjGVU$jlkY*)p9bATX13>&x`2>* z>#aZ4aazOo)kIaA^2lN)_oEY;Q1w0RpMN7Ju;8)7i!P2}Bp2%VpKO>2gIj#|#UQa@ zedxI{V~PJ8QC%o3jDiA85Q}KW5E7dHcJhZEzdWnd}yBmz$7SeI76kE9&FZLq82@n)QB4Yx~})>5!)lAe*+cdVPK-hs1#r-Ua`eTkI}2dp28vn@@V2zNAU3mEwItJ>amzyV9VHz&1$PfRr zB=bmPrTjQ*7`GNXdG0Az7K!)!C{PM-2B+Ep{b{1{{z19TNB69%@`2xVRiH#qI38PHh<#7h!qr{0sDzWp?rG$GZbaO5$oeWC^G93I!>E02#8chC{q$q1tIU&Ljuq+yvZU~ZK%i%utw>l3Ig0@5 z5&fCJ%PR*Vv!0B~qh8K#(CxRrAIpfFm91_9WYrGf{d~K2dE@6uCKhXhSJJSL4RpG2xCT&>mQ9(cITch8qTncb2oHi)+U95cE>%rTTy1-u730_gxKK5@z?pQm4J=EIjT*oNNU|Q1jS+F$A!uDz}sIk7#C&0|$BbBMKAmJOcMJ=tU7X#d? zBQriy@bB;QmrAES7F|!wx^h0-8cqfeogiKy`o8>r!X`p`p$T!CcSoWMKRC zyJ1Pk3(4f{W)GfYT9#&@S`5wH?8#y(vvhYS|5zn`CX_G<>=7w(@MmE>c*`pFAa)eccLbVCZAbU!@SW|UWlP^(S% z7W}`K%7I^~bQO5m8@hQBtAmBOe`K^}PCeVftmneGGMw%3Y&MR(!XX=d-iL8xF-{Uo*nIb6m4>4G^E~ksz-XMM1%`bS0r*^D@5s zj2sAK(#Ocx{~yQ+G`Zg+xWDR-l*E2-$87X=N7~UjIR6zbNaI(7Pl`f%hjaKMH-9;o|EEBY=Q(va( zEjP3CZP!d==#Q7(n$dnvCnlcb#>i!6aGfZ;S;~;!XS{iYp(<1<*UVBX_c<6oSg|Jz zDpZp4dSQrE4-()&?nOt>!n6sKs8%PjT{^jbx&u?egfLD2Sz7uX%-25w1X&d~uUt8y z*x;}0+dI#`#+LF~iycS{PwwCY0>+r$f97Cw$JuImj1ZZbwyCzP{=hLaE;2rmVOpvV zs{{H+9zmqamtxE(`Mp$y%e%NzpF*)O^ob@X^;oUB2E&Lcf`}Hc5InV5n!B%2kj%(F zhrWH!J0sioedz0=*^jvyR7c!UesF&r3=%cv5V=4Y1((I!Pw{tGa*sXbFm)UxM?*AU z!vv-g*v?rAOkjL137>xNG>IlJ&~9+mx^ABy_>)-N;52t< zzJXOO%rUvD7;4r? zOHWV@+YOgnNNQ8R_3bJOBa8xxiXc1my3qmMv>`4J6YVz%z=q;eM+u-|TEPpy6?Xu2 zNxESucD!of#Y*^uLzX2O?Boh+YMP`JmbF-AO|Hpqdh9xr)8PC16GnOLs^JY~- zv4Bm!xR)QZUFF9qQaYskDpdqP++x5Uq-S2oR^OJlO>Z2o^k*@@Lu?fyJ=xEsBRIfg#Eq4xqd)Bmi zaEKJlraDjY+qH=;ckK3ht(K4RpLDEIjzq^@`5`x^bl^J)eZS?-e;i%tM{cQ$)#t+; z^+;#PGSs~y)$WfL2@N%snTt?Yke{$odiU?cN(uabRg{4s`s7CS7FLLJ*RiLV18TJa zq(J28`g_ZQX z4X|%Z&bcMrN2?c|ND8d&dCjsoW!s18DOfg6TtYWO?I!H6l8`ckVJr0``8Nt|8}!4e z+J~!lWF$lqf3*DHT>n8f!vN+Q|C5YvkmRU3c`~rs_&c)U*ezsiU&m2wUF=D_t@m|) zoO(|T19KuG;FFm!ipz(l!NBdhE-k?aT^$$)?iie5NG_y@{s?c z&yZNXuXc^&DlVuK6{nIFpAb3fxa4O{luOiX7X;cV$x~N>W9`y zz}f3F#&)aFpD)luYqB?`JQes}?@u3a$I2`-zUIHS&08tMzjB{M@(}zR562!uSLYXi z-uspumB%Q2c*0j?@C7s+oSF);Hq2&Yx4O&RoWz|{w<3McC#mFU*PoU|f$-YcV%!al zefD3A#OM;(JpGTqBVJ@%2LPh(S7=_7^%&K{`PJ=Ea$pmR2Yugp8@=fA8b@R#@_@HF zCF_+qRkPtv2EI(14+jiTvW!aZj(){X&wxK5UGdEO*7W&a=WSmX=aY!g#SHheFRP)# zml3GUvw_gv>)9Wsv#t?eNDUWc6$` z?d?kK@`H}0mWPUB*W0e^Nhpi|;V#Mf*~BaQYY6liI^g^QJzfiNne)uvyVJQcheIe^ zl@aoQlRn9^m|kE>{_@?Eso4d4Ow+2aSpIS@cKe>4OS9^;nTO2hBK%%vk#ufB6XT-T zcEOpVLlk0jS*=uNb##{Oaxxoq9)q@GGl)A;<_M_NTbl@G>wLO}e z^?A57^Q*ZvdK{*c>oruTr|Pd%@N6-;WiC-rf1U6f{Gh(?wUDB1Xs^0hM(fDeJm+rC zV<0&3s;=V%O_?e8PFYqq4!2{>T@Ub;3_q6jTOrISsnSpazg9!vy(7;erUYZbzbtM% zfq0oC?bR%xx&`x7fMbN*;Wj%wklL2XlZFtG7j(A5W4G>%;~TR*(DgKzAm`DWvE^gF z&v`X$lYtDg9gq_(hw}M8^uwGu(0!qRGAhJybv3AHUU7Tvew?ll!Ch0Nr*!d9R=uYG zp!$R$I-lfzH%4IQKl|VKX`dp8%77EGt#?$t@op_wy)7NokS?RaogNf8j2P)^`1V^E z9Q9@V9Ni$2erA;=bo;Y^nZ=bOcB4UT8~o}<$9>z%mUh0Q#?m>b$}gqO=zdkGBxmWY zkxgkp$rCbcwJi|HKeF@4mXcg687#`lRl&}qA{>%ZcBHAXe)s4XoKp;YJB{9KFA`P; z&`-77fjZZj_(cL2Z8jv_Tk{+|P~ni|gQbDJ94~B^t`^ln9+B!b-)wecq`snkpM%h+ zYB{7-_i2J$r+af+A10g@;SP@?^i!Xz{0wN~rtVGv9kZ^}Yuk^aS`)jg4fi@Z@C$O} zAWgwqVO-lF9}bcPPCixK{>UF7&|_pTM$e>WeOb$Hi)xGLPdMzGqvEYs|w#*sBa zCQ4I%V1QElXwgrHZ?*CYUi1gXj410QQ2H8QkFm3i+SJ?7S()gEx_r+#%S6Ob$asCz zo~e#`O-2hKfOVS#iGyQIAebtBUHdH>RbXIa} zR+Y*bCuFMJ=KNi=B8+k>i4mImKWW?F={Itl2t<{V_{>4CDqA8<%w{8SoFSMR4F?VY=IBZktYWZ|$3@=FzSeNv2F-b^fz}Xs96{-* zxAayEkp}&icxk3$_W~Y#%-GdNW7U2OMib>r6QG-)HY0&&SO|-g*rBp@A@|PsOJ3=K ze)ZW)YjkH_PvJPi-vb=ZfU(`vlfTb^Xyeb(LtMcu$8%lp82v~Sdl0GR3=m=ed4ZKM z8Y2;$?3wTfrzdoIh)KT$1Q>LlIe6dZOpaQV9U8yfPPX>TOq*bh)!3g=(6Pz6`{U9o zJOqY=&iX0B2pD;vdX_OSRH^jS1As|m=7BmE%(yhq`E$Dy*EsGUgjZByl1#jxpN?Xh z5f9{CbMlny%>I-I0nYiX+Z6Fj-RoK9b|0a#IR`lSq`a2-_Bw|*9mcGBv0XQh`EF$< zF8{$nE+Z1R2@0ybse#RV%b8CftL1lM(jpck)f~ZR5cqY}5-&uQBb(vaWk>9@Tw)P& zfV!y^b+O{rTG6^-Lhf2hRib1yXYBOed^rOe#bo72tg2kONN{l7ijM=gPhL9=CyM~l zAL$YR0QvXszX;Xx4qgp=%V+~Y`>k~B5xq1h3g`1=8ltv6}*M5i1ZrO_)O$g?P1Q z(ZIo!R!-Wb7;bVJ@qOD~&E+HbOaE-~bAhi8bJUq-?!f(h@$OU=DFwxqzO*+E&@G`} z@_HH)krrR_+FLFE`$AJC=d<wX)$RF6^E9;E;S0?&&*oAa~Wxl7s^G4!XB*_Xbp^s1MbkLH;#yQ1~t|%~? z6x*Xq46Z2?7rN1Q-=Z*M0D*cg`qXE6MY^cx-Irz+z-Q@Rb&ppli~tva{Z_yNZ38DYqyaebB#HYE}Olp0QWr1fS`1fB9! zE_5APB!GMJd-yRY$NR39npl6}cON(E`8UugLV2O%0cJctbqh^1AmJBHILi>5?J@r3 zqodp*?=0Frs%m|ZId?*jFrL@P6PhtK4;lO~A9@7av*0_*Wc-*{KY1brADG_Bk zGN5We8c?SEg2=<0Qcz*rVSJ% zi4f6;pzS56qehAScgm>-OfZ$(}$}5 z_FQ|*vv_=>V}Cdo&{}-|e0}r7H&A5k4;9C}F3^1tYv6g(q;}P(s0%KA-0?Lb-nFrQ z#_hjBJ2_gUDd%)gm+&7AB;{v1zR0ej^@cndOS1Iy7hT%M5mx04BBE=4zo6XU15m=G z0f8f*Z%41OQ1RWGo74_^Js7@-{qJ^9OBcM!sRDz~herrzqKteLJivTi;_Fh`(x3}# zkZ%7toOZmFriJa2H`|olq(YmN?4vImU;NAkRJ7u zrC4i`*v(<&bEOFr9a`Nt5G!6XJNr^KpO%0_+NvDADe8wdJ-oMy5%$ye<}sef+;jM3@)sC11C0 zIMfe*pbiiX^yi46oHqix{bWcnWV6&9Upz{m%Nc4d0xyNT-pNTY7X=KE7&2RA zrVav_anp}`Qrt1DQwNPq!cRs{BiGs7A(0PH5Ni2I_QijOCP*0{HW13?6?s_{xY&HM zG*&AEx49}98iqpWPT2e)$FsJRm>o>z;5u^Qg653^L!>NbLoAj^Ilz#g3nCh(r+mBd z?qn<1yy*?=rxiTf2yiRwPk7+1>}%mMvZaEYIQn=*y%1=+KLorZoammbLlNMqV)S;Av<1x^Hkg@k@yl@7wb3c-1XCHjt6f-IDcI z`1QTxqnR!*d1JCI|4za@DH|p)tFnh{Q-U94AH1yo6?BVfz|_0%js^!jc4nW zj;(_EOfmkGw@z^!EXd?)Ane=F!Xt!BRZrkqBb$B**TD!Trz zd1d@>`o`gt$yzaCf$-SFTj#;vt(X5Yz0UpotPk6z$^DyS+oHl~169WnfI>+IvBD|e zn{|@8&0taHm(L^2{FJ%iS=Ewydc=Dm@A2cvUW3O#+2AjiZ@}=(;)yaZQ$gWB%!+c9 zoxvNw>-e$`#@>Z%Ne zs6^jo3?mx9RCV6<*R1=W)1|9x_^&31aRUmG;h4D--T z4-23B4w4Lt)ttLQWiJhxFX}ecxXFRoa5R`mq30@(b>TlP z6k;G+`G=CZQ}8obuhEvGk>A)%Si$i5*Z*EDRUCg*{IL79{(9A-RR;vl7A-G+m1;Mb zbez6+_N8|BnR2fKvm5f^;^KI)`?4)E4GEl)9r(=53mrBRCfa&AESlZ`ony|kc;cwT zn85E8Ti!w&HeLt|h{YBUbdrPLG4*ZaH{n340rQNj@7t+jcM*rVhkq@aFqKmjl{AL_ z4v5Dw zUEXJ%F1I#utp~HYiL0pBc%@gLGc^2!Q`R&;4c?3Z#l5(Hwvx86b4MNN&vwza*;~VT z+$`UCKUp_Y`2Q0QjltV;D~~c?AICcO&DzVVnw3nR;Rn^38WaUn6)X9<2i>-hq+KXb z&QZDtuPa&A{=ZOgHt19GHEQSIdbIN#Y+NDmPSjLyw0QV>Fbd*Bd8d+C&y1~cZGz25>*?x;BkgYHrKs3^&EuKI&jJ1}8N=?|!%;HL@a3 zLpKoqZv_X92m-ifTNayL5=-sAJc8-9@Y|X$FalnM)(p{V)W=FIZ9cNkPtdc_^f`CA zqe+&$gAHZ}5}%cJZFi#vGBm=flT9oj_gP)oCy3uUzI_6fOvl_I8-a&+vH$7jyxMpk zJSn*TRM0<9yry1P28dP!+)Jw#uqIq$=yZa|Cs!s9Ug}D_-8!qA+b|FJL-9z{&(GdR zQ+qznI%ZpAFKIrnx5asb8fay86MZwDzH;X3K!YKVVPS+_aEF0XiCdDR6520VncYivN&!u@L9 zf7V;bP6*%aiV5z_;?E5(Kp7FznjuKkM+)JAB*GlfoUl2eudA9tEuxauCpyxji zJ^{AL8PK$-pWS7)oHmQc8B#IBaBzS-RZnyE_{g+Z3eKX9#h)SP3C|c7OIn!QPw2nibGI}BKOBoAEW}nrdoW6j9 z$@0HUOFbe3$KUHRnZ==<>HD1mVh;!d61@MLJ3qn!avL(ycSt4;N;06o5d%u|5Cb$% zEE5eBX=`RDeSJ^p#ev*XEM*AZ#_u&Hu8XUanSq@Xita-2V90)veA{u~{UxtU$7j58 zw@Eq}h&HATE|@&romGEb%rU&|`)~0IqpJ+W9z3G&ix;3vB_v&BX$KkPsKB+Hh{o7y zvU19w>v)#Ni7xi7yYM$Knh&3>;;`KEX6MQjz#>d|t1L|gcfza8<3wYOQf}RgM22D! zF%u;ONQ_Y^Hp+5(b>5kxP;xAT=GX7{NiFXO|)YDHcH^9cEE zNKuVk;?Ujw?_E{r6q zMcxz!AbKNm;3no2aEoci>yuv<`FG1TV0I)6^!p)g$gP|Z-_n9QpfHT|ja#(vO{7aHFH z*4_>naO0PSoMV2iRdTZXR|l!nP`9{CYGecmyryjYOGMo3hAoc1_40Vu5`%odbB>gY zKAA^#oG^qYuEp_P<9HGMJH5sfRWwN2utgI=J$(WxSbEB_8DKAlX*=>={s&v4WGery zx>e=D-RDG}dtf&W)$xu(jK21vDt@jkVCison5(9*v*LVA#1y7#1@)DVT`k-U*zZCsjf}6&%QrSa2yaf3v-t1eW|j6x9e4A8Ng|O*Blb*v zf_7LkbLVt=fBE{a_KJ;~apiI5H_*;=gSI4O^?%ws3$LiUuS}tAcnsa8K zz3+YBzw5g9k*32cLZM9yBAE?NcfDKd0d(^=${lMV=KBk+ze`(-Z{%R(`?@^0nwCSA zz4bm|k5h`Gx4Sxxab-N;Od|co|+?LGW)2&Cnwb{0xDpqTqYsmRE%K+x`q?dyk-EGSP z^s>d2c}_eX^3m6*$M@9$nYA^~;2mxP2NM`aUZ+hVdGm4WpH*mOgNB*^zVqA*>U#Fm zv}(wojJW}@Pul_GJaVB6ANlmf^{W2L@{_@nw!Dqa)9}2FLF1o==zg!=%25f8};a_h-2_}R8B>D<-B zeSB#qw}k@qS-q_g;i@M(n?T3A{!lmh@cV4;%G~?5;qb2@ktjXB0$Wzs*o*(*WGoG0 zeMLL)bte7!gt6i86Bx*@2hRkQ%OB;|75%3H|EJ?;)jlThYn2D3Y|_%>P_t$y!4knC z@h_4{D8soyg2@xugA{dB3bMT-_C>_H7Z~sa8PvYpxj~ zZ#T*;$432UDcWkID_8Q*6yxkjsXv-`wQX++EYgTsu-JA`=Z0d1FjV&JH|ygQ+SrTU z8oNs`)E)M#@~lfwv@fC6&k9g4YY)GpfL2vDm$Cb*j?(?R813R1GNE7Wh8M_zc}#|b z0DY$u0~RGU9iFkdR*ubd$BMq`u6JBWxCFTq(zKqVZJ4_?S@$ozUR`4xO(c2L8tGmJ zcVECn`8K9m-1%H-d33!V3ekKcC#G19PhAXQ;$5MrA}J@o=C$!E65q2*-1}U&l7#{! zO6)`9g!2;TR2!Y`88NBbo=$!#H?H&Hj3-<1se^*B(X>Cfp+&JxMGnkv9NS|`$otDm zTq^HAC!!~vty^rlqP~d~FbtLpz~^d`;jZYk)f$_dj~ZEYe|%z_N6$#wO>yYC3(T|R z>9Hk840Dn3b%&pH-JL~5dZvEX6&$MR{qWxx>;0n9)V*QRH);h9rE~Q-^J$sZ{ywfb zPP8-{ofYMie$Twre;1zxSM_|$HK*!eq}%=u{Uc_$s2MMt=b{8h+Hh6i+@7tC#elrs zs6jY5+E^URFsemzcD`Hxs2MMpC;9gBj5DZ!wPwns@blr$bV<*|tQ;p5iJgX=iD`_& z9|}_G-rSmUcP$}Twda^Rdmn`o3LwQ)=>f_lVU zNVhaNK$lL3^EXk=`)aui3U6$8p%2Abt#qpQgi)Og#fMAx#XJ6%fKpR@&MZ#-(nsOe zOiqU`(p`JeC;*~Nv-&Jee1%Scx)n$lxvwkks18p-KZs4AaO*tWXROCAu<;)L zDKLG3`{-PwA>#O{TMD-~r7u7By5{T2TRoROXna@8K_$QVSn^nI0Bq9Kk|#C7EmE21 zDO4r)W`g70toG3pQrz|N@$LUSQDYpRE(avBk2v;pwE9TZ%OXzDr)h>uwSo=uOV!vw zJk1*Lt}a=PM(Q?@H7>jlSM^cH<9vn==S>OjLkr%y(mM$~kOJ|X141*RK(fQaDSPjQ zMt!#pTb{*?aj-md>Nza({A=7y%j@3Bbc>0^tD0+lZ6M(QVI5g1)4~b2{=VRDASd z&(55IGL!AA-oHONB(5^Z&P4?ZrtQiPV&@3Qy9`bJsvL&k%+MAVf zZ!M3V9WEkOZWS!~)PRkOSK*OsTd?}nJkSs0!q+4Fhf9B|m`_X9nb-`N&vFO7ZEzIG z6>>7)$_q{P3x$OzSvJn`hUID0C3%BSu)7BmZ8by=x}Pw!BoP?`isWet(rxRKCKA|b zY7VOuXNm}gu6ORb>dBkCYAY!~Temu^f=)+=<3soCk$$eRusl$=ne&KtxHO}ycuXW| z6&!3%LDINc&&N<`$Bo&c=YA$lPfXEkZ7o!^undVt>g36Xy%@w#oBhpMoaXnYwoS)_ zNGW0ZU(5Pab^u~t1X$O;>5F=y881Trb9TP!Z#0(yK5Ne1*KkJOacB+mHfr;QT1k1d zIt;Q+3``gkNtUL{)$E_DJ8x^V14;#dOXT!^Hg99Q>(5+D>(5FV1mV2GgP=Xmq48#w z>4)y#$yPR|MAs;0-5N#B-6X%7zY`I7%VK;9 z_};D5vbyusJ!^W$1|?&Aap>5OiqJ2v7|W}$P$0wQlg3_@3&iNOFA2hC$N0PDAca#3 zGvjHpw%C?s!@L=juNDwo-I-`)?o_oH&d@y` z&V<>FM#f}9?YDbd^(Bm~#dKgK1UWvipT%-NjFJR% z=$v_x$Px6((mN0iKMR;y%8Ou#ZF?b6wST**oTo6*##Mr05{Q$cEQ#z>Tx$A6m6`+k zf{%d%u}*EQpSzI^_V+H>4;HJ@3d|ae^dj{7f7?ztSREc~@0uj0?{+&AJtJQiALEN3 zDScL$=9Vc*Bu|aS2NC!iJIdD;9)_#1WGtG{+KKd^aMLJu2#rMo;Oui)9}|vV99=*Se%6=Qslg_cR&rzkQCEvoTtz9#ZjMK~$p$4MK=8L^NLCsx zsk9N%-sz^h>0Z~p@v%WZ{fHS%TNTEf(*=wa`?L+VJZfT8R8SQgbf?pX`RddjOo5sU zXjb=xndbLBD2EG&=|t~tj^>EQjR(^8xZ{NBvIdK`0L|=&V8NS-&~NV(MGc2 zR)|hS3!oc+rpG**RuTH|N&6-X!Kum-Q=TiqpPR&Au~kI4v9g!hcD(b^iHy~XGBY9TXiNGj4Y z2{E7C@B>}FX)#g*<=b4eLitD%Qqz11sZs`;*ls~oaqf%Ty{k=oIirL_`GGV^l7czO z9H}j|GAIK-QP65DaTLPRC}BQp_qf&MbknoP{NUcREPSD3NO|9{Z?m;Oh41oaf_nah z4+0*UnovS*^IiVc{0Y<-CG=ZorFYBzAhc*ess5?r zxB1CBBG_mwmeAic3)G*L1-qWv=hFLOv0m$zC#~m+LXwXA!zAT?X01;_wsJIKy>s5K z*70r&7$F(vYPA!16hWq8P3j@h-%LL!q)C?#oQbY;;iW&Ci9<2FazgyWrU33%+!sMe zhlB4YZ-oIy^E`eyJ^Li3?)qXs#WFVGX-M$yA4*!cnEpRw*@n}`!Io~U+EiW-r}ANA z7V*C+(5^Q5L^tMterA8tc4j`C0@?n3;1JlpvGf~ghLDa#Ug71#uBJc(i!)v9pKF6F zK4wvbHYMCzba(6H?yY>Gf!?u&wNsXy-*#g?O5%31x&_(U&;7Drl7AY4QlrZY*L?4g zF46elwWuB`(9v&UZfmLG6n=X2SLT#B{X)~nqc)!#W`)cM0`19G7U{1v>G<3<_7UuX z4eZV(2!cLSz(S?UKYn<$VnPK4c{JL>Zk*AuzMXbfb~NywO}gKNX_(xYijdr$tld2g zBXd^ioPWO%{)UBNLJ5gAXs`L`H&T9piFBk-d$LR#`APD6;6{+FnDp33j##8|t`PWr zy%(`0Cv*S#xs|UZKf_}p9z6iCOvQdRr>zZ)s?((!vJ##g)(zoT;gXi&J| z@iYPLO;VXWT%<8SST$V{iaA}d`NZ7hq&DqYfYisG9I;%8vcp1=bs=0kLH;&+ycSKk|o)nSJL*0?~cK`*&DWM`R35alLOu z_x-K|G}a1k(7;%??$K2Rw#{Vfix+8ML)nJWizk9w(0e!MyXrB}=NqHf`VZE8-FA&% zGDo^8xWc!TTd{AVeZwgNHL;j*uQ8HNyR#Q=O`Gbir@McP4b`>E@@6AC#ZZ8nWw4n) zlT^@1(%Za^rrMn+wpSOqJD-zUE#0aDq!hp`4@mwHC=@#Rt`vd_yAc~m-CGA=9y7xF zbcacX7s>Mhh=030J{;2OH`DRW3^E1pq@=jceU{PQomTV3(qbhMv4?MP`9%A(d}FBl z9o7%x-|kP3MvvfchuHW}2eg<0MmVYxi|9V-_!!D<7-B$t&^yS4zp(bIDx}^KjqrOe zI|HYHei>{sq~;YO*OV)$I(4P3Z;x2O3e`?QJMzL#oaXcf2DxWmxGC$2VYQBq3Q{aV zp*PZABDiyGwSioDkN9R@m}4EHi}C%uS#(@^%kpP&mAv=B9eTfVU_>$~Kq!0S{ zMCNi4{hu^GIKIr&%pftl*qeQdUKc-?#S7zmsloSIwcbSOYhd$JdjFpFmcZPGPb39_ zW}2eY>&?CmE+*j;5R>U#0jSPTtDHmfPM6oD(troRr`}P(mCl(C0_LgcU=jw{-3D zk_ZEhA_Zej&dZz**>LbwKxRO@(P)0em2CwdKJoqAznTz!fKOT$9n5+tVnu36% zmN6wYznKqbA)O8*wS5?b@jB23C@$Ef#t?TJVz)JWn6-BMashai;h!x&)Z|MEwHco7*ag0lw%b8I!(P9Zbk5*eWE< z+fqYh_n3thZya~jM536TM;dThh&F#;x+r?<~ zNU+b=U%QZ)u{k6owfRbk9B(uaBh(ZNF9O8kKtu z&gVVwaS>8Bc7+pP$T@t{0-@vmRYNXNjIEq<`37tewYn2FepkNZ({>(2b-n__B+T*w zztCPDlDBez$Q7F>I@+97_;_6$dvCnbG#1I=JqK!8r=fyvuU5pTZv=niefBtv@tO_p z0%Wnkgw(odX;*q7kQRGr6;N}qojqlqYin}G^A@1i1$xgpbrUw8n4p%UdSb3W%5JU` z5=2SQw!d`+`y3DxPmAR%U2_+#CjCD1uWc3tGF&0cLc@Dk zVQ$DKt&);ry--|LP!6cf3sqG1@#<@NZ-$RmIBSuW`Bab&^+}geNYF=710OSNY8H9* zfnZ4;JlquCQ{AnsR(MW(|5gu@2nRk5@oTrO2glEqz=5;J2?%!ume;#hr^bk1%wDV1 zq0**OzjMwFC7C7xyT;xOU>r7KX`Kwqz%20afuZ=A))A}2P=N=|FZ|G@xyF}4ey8f9 zcG$GUba7pl*I$$a^vC zDnfW0)HAEZ$?IiPn@og99H!j8Jo~YE`8FJC+9$AV!G;#Zu{F21?8UL88jan)g{sjg^MPOGfuw?Ff3U({= zz$yQmma8ttJIuvBrJR`UZspfFUr1)?ws$NUV3J*LTvsKEY+a_0V#f1{cpkl7{`Lu> z`b)2_SDD1`+V$70$}QF(t$ag=fU2mz^f(sN5>f}$!QTg7GbEHD8l7&(1U=gi&dm}J z5yiTY!6ZP0D}p4rj5TmAu8wEw%E5`Yi_H91W{O)mpo=DuKbNNi92Qs&b zq#!vYQ+9jdX=qv~p9>cn;iJC6eeOAMuL9q|OSaI{nn$cFGGlTQ=Jhz0#mlHv_1H!C zfJH-}xJ&eMKvQ_hp2XV|o+%S>?9RT2{vYjvof9B@q`!%%dkm%`YQb3bY{7*%mujS| ztm8;w^Jw@#zz`ByP9;PIJ?<#i!v!)D&6*jBPdl&~h{baoOa!r+Mfny>>5Fyd7Mk2C zkG`;RLfO^n7i=m1igus*HKsqh9fL3QvYjFs{1`?}-qF{2B4Dh_H|LcXk1a5%prJ-d zZs6XHwElt7-A)^|Dof0((_v8xbVWsOr_3ocKVPfr)6|{|otA)aD>!cKSuh!Dv6h3= zCJtF$Y9~t(1x8@?p7{Ha))hJZA4~GL^w;{ASfN$ZqMeb@ux}-J*Lu8*kVDHsY-{}? zvL{W*#|{y7+8#&el*hkwLsY5j&3CoOdfh22Y;&oCQ_Ip5WY6$Oz&#lQ8}9UJ!_m`D z=;6NSSt;1q@*+lWS1ouxBfSS z?@P|wsGbgCyv*vS^@5IZS@2-l4d{@-%Huf1@GZ^VaGbc)=XH|yfIEpn1j^4&CRM}h zGkq%#jYUar-p&|2SE@iBc`EX8yeS}b+Nj5#nkGAH8MKi*(dm7D*uK5C4e`H-V|iV` zr@U*Cx-NMl6A6h22IHEr(5tEFi^m@xb*GfjIk1X*a~)FA)%PB@dH@~6!62sN$|BiY zGaS&W=p-mq+3fkYe3&#Ku~N`-ymnUHy}R=%9q_p_=KbiDf7m4OiAH zmSFs3k{oA41tSNg<&M8Kj5}n-xl;D%-jpR{pIk{L5(@3-kqV*SjN;q>w08Vupr}qQ zLw7GTUA2fXl@!fMTSiFWfFN;90jt7Pu|M{F`-p6t0x*I45g(rb_$aiHoinR!lXkq5 zX-O@WCTP4*QOx6##|>SIC|=uq(Q zw3ymNiya3KS1olPl9#+{qUnE>0+J$Cjtgj~<8HfR^XL92>+jSD_E=~j)gvUyvzfT7 z(7s_We#+HxRXg&Kb4jv@$YDr-(^`Z9W^i7b0xIp?<~JZFDLuSsMP8uOd*wxvG~(UDrqxydz;I^QM43ioErPN$?Bxf3 zQ$7-}@1do%)7q4Ge90^1Ht_ z=RDT0P0^;zt_^jWiEWWxMs&$n&V#bFsd_UL6d`=arK=+#ryD|%o`v-;$)}AwkL3~= zF2%1n{JgFu&Ts@?xaB6kd&u;L5aa%_pP`<}OD~#++q0TmQ6Z0RI-vYR(7rN>(- ztLM>2qoLM#9hY;Sh;9aCx^^mKw4?WaWrG1}*^Mj=0>w`4AGa9$Sa%tgu0R~)M#Bsb z&Mr>IwZVz!P3k#-`0hCI&M7+>FXGwJAf}gv-&Uj!AB^+eb9x>s20bK+|~Fs`NE8(|JSn=vjyZG`SpIK$4m%LZ5Qr873oLb0R6RrP`N+ug5w|IrukTO4!;|r zIkk;Gqmkj=_xv~04{aS!q+k%#@F9pa%bNU^n+3br1_2x0RYt0855Wk#)UZ_92ar z#)g)m7e<$ExS7^G{yX<`fNN^FSZ%5qc-b{>#KWjD`V@CEgajShgYMoIahUjWLo%js zt9D?=nKAvUnqupYn^IGYpiSz_qt}uQ8@l+hzC<4fgAZ<7Ltee;nI-v!_hK1w&Wz1( z*aw$27$*Zw0r4nD3dtLU*ZPlw4Q0gx@%uy~dg?w4sP4CzsGa z8k$dR5A=Mt$)cUDlgtH)uM?WipP)!`x%#FrzfZU7CXiX?UpSEmNHgG0ckL>%@5Fvh z{+zR}ZAhNyt5?bYah~j3?YAIAdkS^cM64fJmT8d$jH6EX+~!U=w7Nua7lJJx{WTXC zcJ$i&fw)x>+qYX$e0=w3%OWJ4s!w_`Q4ZeDu;v-+z!3t3h>`X{mz)UR)2e639w68g z&7(i%3J%uy@2!rIZa-dMLX5On4)-o0{!YLLQKX;3s9r?7DGI^2ox5al)?JqKfsEL| zP7-*?kM|Ay2f#il;Duw|+h4L&FPGPAXFfMhFg+7f(kPhr=%}*G=EVb%wv_dwsXp+S zbr_Quq3zHW>njt2YM^1OgxMZZg2}C(DJ}9Q(q>ppn)i5xepm=fIrEcJ%3loFAXNLP zPu4FSMQR<+9o5bstqi*MyAj>W+p4sX9YeI!lk#3``$7eSp7$`7xFFD6MgX6>f_ePG z6CjuzQ0=6^-!=n}f$)e|C+Yqb;Jh*512%#yH~1%FOXV!538_ax;ju+@c_FGwR8V3Z zh*J*<9h6H=g>#7=KthAd^oQhvA_N)yrr=Z1>}_WAYAvAWyX5$~Ag>fiLOa`_jb=q} zHMhmRw+$}#!4C>8-&TSc|t2pP&KBW@n$x=>{ZA;=0`sA zs`ok?7%0309O}u)+yQCuhZWnpSd&Ps#-PIeZ~$}dUw5~uYW3YsPeMZ1{Ww3_h%OASbvkNX+%1Z*ZE48+$r zl+fzP2(JrMR8j1E=A9eOj*K$}gJZ$rbfg#30hxd-+Xs2*yV?yf{BmqwId{jg>(AV^ zqn?DZS2LC}d3kUbeV{Mg$4&~03dXfTs@tlN!pW`NK;Jy>+UDQ=tGT1{{;P9=j_koN zr>@sJ?DLGwEm?-2aUb8a+YSY8DDoICIm?HFKEI*)n=*NY%Ixw&`0!%?iZQ0rR^Wb; z?W-ocJMWCLW6Um`-)uA=O-lOKeU7NDf($~ZEQP{SHA5>0tIk?1ynsTVD?e~1jtL#` zgVj*sLW@lfQKL`xUKL99-w=wP96r|Y1`K0|_6Ilh`qLszV%+X%j%AXsn)oxn=VnTQ zbZ%Zb)^)KconSe;TTgp7PDOiMXxXKJbZ|kPw&%~{B2NRsRTF2erWEKF2n?rSN}qT+ z)Q<`sl->r<2=3J*@^XIWtFVSLf_1z7eE3rDD*byh$MZMqZrt35u~q3lzsCY@@tszPJ`D-52hc>PJ%WGBTCL#jFg6(9gnF-mMAV$2E)K z9)hbu7q&OzTpX6mz7@Wx%Lkp60iO3mIa}M7I~k2zG@{c47F;o&5F=&Z6Y(36`=kw{ zQ3F|S1EP*8sE~4doJym>gRNcJ(HiMHV>Ayd@$!C zz9|&%M@bF*M%U(G6D(&p-pLAcZxQ${6J2Zj)R=^}a@Uc*hrdhuy{u|Q<0SCkK?%?Kq z6y;maq5@5g`_W~Kkb*0-?uxN0T|GjjEcryM)=2*{xgZN{vBY0b$X#gj=uVs_^p6~E zxK8X+F0&;6E4Q?IFXMKqO21|_b0Q3wWwN-xR?4s~~&q-{O5AAKE~ z(^`LTg1;05rYyk?!B0X84VvAGYLBo)vI@lYi3n1Qm%pWi{L`9kqr98{O=C;OOVw8Z{W;pN zMf?nGzU&e6mFa}*fvq;NQ=>@%z5^cZnYit1ccc)jdZyHzUk6(eX(gZMtCq8bAy z6f7O1I;X-Ai;W%3AZ{(ojLDCJ3V?f~c~y_@o)?Gb}ne}PBakz-10QulWeFr+rnnBlLM0xlko$O8FY{0QHR`+e{%pX!s?DD# z8nWgXSei2h!jtNl!dM*GXu(u@1YEH_3C|n4#VGh&2C_K!xb%pvda7o&ZDR|gG!he6 z+{?N4D6ntXLjAvx3V`R4`&zPm0_S`2m!;cu&Y*QHAZWY2Hs^RxN7m~6>g9WRa)7P^ ztZSkl40|itnKezQkDYWTTC+oU>_G!58%E3rb+~%?w8$ZwC!tVZLkmXs*h!c(N?K1m z4Z*SN9r(%f1+U8M92tzt%sptNhIPC$nTI*uJG1p=QizPv3&UR9td2}ms?Sixl$HlS zVyy_#*)V{Bq75AUGPm5b;j1lHmGibo6ojpXic(9S^KLO~(K-FqL&Ob`j5l(ZXQ-aK z)dkvY=Nfjrw`DK(Ii5A%xRL?JgLbpABIEC6)Tf06&(F0i_S{cWc~)<*Y)hK9m31*F z$M>xG+lzr{4Lqz))jXfKmiz*o^KI1Cre%m>mtS0bH1X({$A}Okr+$3?Gy7U33{prs z5bWBezUJM!@?HCRbjrAs*|=YQDHrTjpey;F1}#-%F4a#F@E%%s>-~Aj4+{NUUQOvz z!V&w>Nb6%%{r`gBUD^EwKlHX$j=bX|yOudvu2+GTF#8>jGi1dHq<~J27DsJg;6p+O z!st|%-yu7!V9B_Y_*^CXdml=`4ZUfB=#u4Tw$sXq>KFi(=2h&cHYh1mxsIG^vnYuu z(g4u++WDy;pvHW2rvzDkOtu*0gyDSDn1#<9a_xYcXA<@_L*w78jWjpAWEKsbC)7CYM!B0Q;T78Un`t*KT1u zwv6_ZmxRagn3IkY8gfAO6x7xWh&Nt+tRwQ}olbsSFDYiH{Jh1VFHk79)KiN(u7@u$ zYsF!EAo9X3iDq2K>haNRfk$gS|NAE_vqG(R414_0#hMlJ^Cw*$zGkkA(7YlYm1P|NOug>B1EqZ$*`27CxdkteNhH0dHg9IC{hriAp^y}8nGQ=LjnYB%-s zL_y`(hf4km^zTWp!@`vgxk)?5H&=XD;bEkRZDyl3g?Jka9ZSaE00DAdN54W$Tfeyt z?;vG)>F`NO@6?8%7>+NZNQ~l-GhXe{-SZu^R^{TmT-pViql?Y2hAFGff4Qzgo!rF9 zX7V^a?T9nA@K2SAS4^x8Irn+qGoK=4TdY*9X?cBrj@7!#N|M z-L5B?9P?Ng7Wcf3jz)Z!Vvc{i=rcJXF0h9OwAN@CKqzwGJ7~9lJUBw8dK@So@oK5e z5Hq!dsn#j$>TSa=_kdLK-EnPoU|@r82wJq<)c05KeuJ$V@R<{Dh%;vV*NW5w4-Z zYT&gUK(}9o5}d3lJO=)aFX%(^9`|gIa>n@N7e)(hBSCy0w_(lCUE`4FraU60-RHJ( zq0GNCt7I)vey^b8K(^MxEsnD_=&;1(WC>i9oP(2pflM2ZVH)>6>uSGq1_WMDf{0?M zb{VQZD%Gj3{r5bu9D&X$v*EoQ8xj1h9H9)nxi@5r2){h``p3657=+dn$4Pl9gR>^o z2Eln3_TH<>>*@DC{q@Oxkvx}vmLYRfNbLmlb~PQ3Q58K{dN6xpP|M+Xr0HeP8dC{u zok$@e!#s_+6)^FEV|Y}hjMXNqi#xhDW!w3;`^^N7hqk#b&f|_RaXFs%lF9b zjt042jm!yy#8Rx&{b8A+Z|QZ5hj$0pc(?mUv#8S7w9qD7ouB2Me9}6v=7+=xdfjzA zzC*%h9L~?Thl@JK%p=pSM-fODR%z+FnE__Rk%#WOJZoKQr$gtPr!4xNm%rQ@{^zf1 zAG)eivN91pjA`qmU^MsJgU zTM4M*I}Rp{@86$A_q%JIk!0zIR6Y5qV!FE89((ua$xmJ@!?eikV${DiX`L`pGF~h$}&NC%;bj z`B|aVPL1q;)D(o#D=$Q*%~dn3xCcov=*OQ=Y7swtG%Mxp)G01s&+DB(=jA^3TuSuF z6=eM&)3CMQp&zv@7aHJYPT@Dp^(4xeyl)snqea}PHc#gKZ^}^kc4D6$e|)NKpV98X zHgFg2F{#PutBaURI=IWBUl*FTa8Ln1`&dpQmGu}eBRynW9VzF`Psk_T4?Dd6-Im+q z2zdMWJF^;2)gUZqLIn6ty$YQdW~$`p#b#5HCv9yA^ai$pqdHPpQp&s%9#?lkAO5*R z2A7UU{C#s>-z^}dMIdk<;T)K=Qj-e*5#vb0WE;m=9_lrg;XFEJM|F?SwkQ-w$I7r9 z(?Fr;>=BCCDi>BeYP^xTi~A{}NzL=!3x;={h~NIKM~oOJ0)5eN^Gcg=6*3x%eax7mmi zaZgNd2F9L@5a}StP}@nDj)bc1z7`%1H`e+qQ&G`ckIkP4oD0bj>g~*E$8u*cNcFv8 z93P$vi8G;q6ci(PuV;+1-6@;MGVc(+-k~57sRv0dsY&P$R~$s6ttA|a-9S^zMw#A= zQ0v^$xo@)Xskej~E`vkYAHLA1AoyxVBSaR_Yf&44`_vw6R6Xt0t}@rD4nDX@&=POx zB1BJ1h0tyBnL0pBq$b_x!JLI?pY6Mpkkx2G+!NO;!fK4GJiGI3nfpFXFZ^b|RF%s3MA?pEZ*AhTXy^E{W|<0f}H% zZr3q>?I&yLL&@V_mb{AD#pAIuA`@rKltJ}wNS#czKxFH_#v3(c`Zn@e(=laALAk;} zr|tAE&nr!_14<}6*Di_Hy_4!v=pfD@5VrXDM#7a_UoJ$bp4DjEzDy8+QaZLZ9FbR4 z38wMV=MG@j;jtv>VHlE64{P zj|KKQe1D8ns+azHoPI9X@GAIQ1+}}(;rBW;xdLz8r6~COiPP}_M@`Z9VH;o?NQXsR zd$&MAH7RIPxDAeu6`c z?*K{Wzn}j`;J*?0Zv_4uf&WI}|L6#e9<$j%5S0`8T!8i0GW+WI{*Lx literal 548437 zcmV*XKv=(tP)?jNkl*@lLig$)1z004kB3X0>yPTFwZD7ev|E-q{p zH7n{kn174Jt2qaoZAl9D=tZ7 z5pD53&xOo?_=|!%Q2AtI`j{2$UvGh5UNn2~{+x4CLp|P84)2;>a)>tlo7qlsm?4Mg zgWHa?M&^*Bpbp%7VmIZ&{etme-%a@q3TOXlKTc}6r19)7dD27`vbrj>jxYY8KK~^ki75{#|Jn`3O`kraQh{ z?V5yZTQUa<>P9B_t@}4Ds{Ixxn=SfB&dCg0Tx~DuUztU_*CM?#3*tfFfpF1AIuW{_> zkQ~!E_L5}s`C?8>Gnu~fd!AUvEtqRd=Tyt)srFi$B@5OQY17Ugb4LYP_QHAcn@xS+ zhiUA`*#9_gKPBJs=LT~2e0Cg93m<=^nNCDKfQTy>6r9ANIL2dyJpjyMi7JH z$4d|4tCR#3MdHx^|C@S@(nA6yC4?TzxL)kZs9{m7Hlmk#h2@>s=Ek$@Sq4;#*Tx8V zj&)LGZ223l4%ea{S?lOyW^s>e-u>q9v`1I2ZwIUX`PkZVF2eyg;oVD=g&B|p@_KYbBgrm+JWeSAGu8JDB;(pRyN0eI{1DH+!eK`(pWn zu&~HVJz?MSb`5D6+{N!(Ti&js?@@vW&ZiZJXWXlnAeV)|HaAyFFDcyF=h}ONyZUc+ zRozgZ{rJmiulwQN2-6tGwK*QdRRrA%sqytFymqZSVLO0X{_fZ{NYOs;{DRk2AZLH=096ZfG3M)uO1)0_puD{aYM6I2Keql z{n)EVzpLK+c=z#O9_-B{>qHtGl{dt)U0W24U2VBZDCzfg}>9AVY{u9B4=kahw3oa!A&4jGUDO1Mv{s zapJXX$nZz9VjDSY5s68%j6n<d|y}f zfYM#{PHFev=bZbBD(c(s?%&zJz0YPmPyO{W!uj)af3pDooY~964#57n2JXtz+z#D3 z8*_k9Y`S|N+SAn+B0 zJMMrqngct$3hn!maLot!5Me&{;JF=FJCk-~#RpB(t|VaX_5?0J2@CH$)2N@1BtinD?$N0O;cdzqS1?csS0V znPgT8p&{l`_SYc*n{Mab7{gPIwP&#}txtCIjL>n=0cOmahPHMbRt~)kTwAcQEpSzV zbu9pQWMEy(^2z<9**{+)n{4%FJR4tqy6mrYAbrU)W{RUF2lMQ@_n{o32JLxn`pY&B z0dPyqz83B6B^F5suy;@K)!U-J82?vCeL*&$dNaP<@5=S8bfQORAblC(_R{7}VLJE} z({{kwq3PqOcTMY1`^z*e{@ju^n}X@~o#z?>UkiNcj>W^|O}2V7Hh}uM8FJn1^Vwkf zqMewZKO?iHvK{5xT1Kl2#)s5pp!?MB8&K|%{T@>QC=o#x_Gh|A__QhC6-%;viznw% zS0d1FzkqDd_Ve0Q=RKQGLI%*n;g9V13pXS+wbbz+-0z5SuLZW;_?PHIqE< z%Ct4kYjR-ro}UBhT|P#MI&CK)Jx=p2I0g|H?J0`*1d>JlbZ8)3_aG19<-p$dp8h}# zOTjr3%hDdP;6(j$oYxvb3W6DQpHN6F6FhG6=SPCnBstIpss*m@7_d(Ba~W7y0`SsJ zwt6$ZoaGqT2htpEiL!6L+6D1$8A!{C9ay)6b^a^|jbwS@$P_NDBgBCnmFxT7=6$yr8$kW6zHmByJutmQ6Aj0-_>wmu zy$i5qS+3=*R+Ql+>KP81Q2GnO09OX2rvQ=wbF~D*MG!%1Oo*6GxAU{d3;+vBnpC%I zEQqB5b|5;fsh$EPfbAUv1%dGpP&Mg(FV4pR7Q9E>g7@Pbyn_bsyEy_d8JlF#foe%>eUR(;>8j6S^4V$B)X1TM>omu!wOpY^U|k7Z)a+T*X}qZQ&kZGRGoD*|_d0{5 z1JXKfZ-KOB#rAd`3LoRL-{~4HGfrCbIm}igvMeuz<$3l~1KEekC%bj^*DX9c)`~OlICbS_x-VT3g(0Q&fCq0$*vJRw0GXY>S6Mwb5WmrD&K<* zQ)DwXfcnfK*P)x8F+cw>by?=COW7@GCbpL|TU*?MH1BXDVRDexR0qU;rEzTM1-S)V@y5s#x$ft+dFAzUR9 z^X-Am3`A$Z-0!RRI5dz9knG-KHhP+MAD9hDcYt~ZI?V3I^11}sDHE80bHs$kC>bYU-4~3y1=HiP=iO)@(NKu$BnPmcfHl#MJc+d=Q0;Cz z%Rga5N8OC)p5EQnNw+|HKLcrrT6TN_(%Ujd8BLHoP@RK%XYa!kE5DH86x%Y2XE!nf zWV}#rF&aT@BMu}7^5&~KxF<3jGfU)fg(U(2ozJZuW?hgR*l*ZdoAKqLc<+CjG%J03 zbBL?}dN)dV40l3_%tc~b%GM+wIQtGX%XHy@%P;wy$n3ezRxh!%I(F6~L(6PCNGA0? zs>Nc`9Xm`u>JF0+uC|9-`?ASaZ^i~tKZn`rr=EY9;Jn9GFujGXjzO?yX@m1w6+~luq#`|!RY-eNQe6s6G;rVIah#7%?8}X!eS(cFeu*9J4+U4h zz}$c{sLo$tRg`bgeU(j?dNZDRfB>1cc2}+e;}VrI8p4D`3f$iZU_MR(0_&ldOpr%K z2Fz0&B<)j8bU$k53OVY&I6H>w>)ymbbXse$-v>xGn{T$jSofr)4p8f;IxyWni|9M% zNNH9JsIg)p^vQ0YCE^sgPp1HcP3yA;n5Tt!a;$;I6iXp$grc5cFWC;GPr}v`uvS2Q zM3oSYgsyJMRoW56S}wt*+zX+K!1}h8Y<0?}ZMqR}#&bmPHXvA6&{xpPNlc_&B{Mo2sUC zzr9iFSTW_LZDt5?HPcS4hx>pRD*9OEK@MvWB{#t&}F4fIxw99 z_WGzYwcATOM`Td}^a}txWYFxB?t%d?bzO6>2S9OeHm8*qLepU2ItT5ONfYhf(ifQb zo{x`P`#fJ;q?oz^cT}4*g9qLO4!7!fM)lGLrY{^(3#1i9GausKo`L9X9w!|Zfb=#1 z)ZrQp#G@vknm&`g@Q1)rH^MaNL$qsTaq64qzr7lL5Sqa(f#gCQa`xF-WgxpK^jWj3 zs`b$l^f_1;LRDNxpO__tKKW`j3j%pwsgEZAY-HBj*+-}2 zQnZ73;fNJr8|ZNCQikm?1^uNjSlOrstZPBskxNva0jgiI2{LZ!@!Zq9&*dO}4y5G- zx3vxjozdz`8;uub;d0dT3wap|kqd~Vg=yze$+1E|ji(CaV#^9M9`}?rR z4!OCQ*0;AjhUN-wW%^494Ye=#Uhg>C17KDvH&ZmBWQT!63dD<|Adx23O&6s@)@O8G zqFo3<9PC>V9isHro(BwF#=3yjfhcp(Y%45?DqT>34GZNt)yQoipleN>L%*lb<*aoP zbtAPS?oS4wcI7M^Mw2qy#6~miiF2M$`||R>$9f`Y1bBq`Kc4L&Hv`USb2fc_Nfj+ z*`I5SHu&V5b=5>&B=|o>Z}!ag4P-08E>fT|9XGPGRmvn~tn28Xwha|uRY z+DvsW!2q2PlCSBSECuvEczR<7OTj!AUC^HWbDl8+dp~yjla3uSZUjcTr$O?!z8nF7 zt`pXAZkg*;esOI}&IZ*T{d7b9-i&A9gI!;dm*nfP>LXI@czaV|sJ}>-m41@8kheK0%{w$rp^a*$&!w4%?7j1mj{vg+hSRh z+5Ndcnl3E?WZCepcgVD~thMe>8)>uL&N&{V`qCD7KjGtJ^}nHItE2xR=4^HLzfA}J z&Da3yXPupXjLdYollRAQ-pEKi%I*Mm;%nc<*);ScPz&gh|sSoRc1 z8%XX+v z6Py6_haQ_~4`2cf3za!z=1V3{0sOInX9-x82BN(*SOI|gXybvP(&yDF97++o+G+^q zvtn!Jvy7*o$dmeI2GmY%3)bssmjDOiAYEZ!)OIFNBloOCO6TbU zj2y6c0eugq#v-{P5Z#B~eBJ?RPP)p#*%%^WzNhQ`9RCwEqI-m0P+v`nVPqv56Y7bJ z`efV}Ld#a~KP9MMK5X7lzc=Fs8C>gN`mT%fQYg5irFa*(yYtvmR=Q~dZEHqa3hV_Y z7yDl*6UtPfJU<%ExpsreNzmnhn^D+8;rbhzAc#nmVM-0$Yk z^`=1NMPt+!jB89vXmd^YOy}iKQB!XzHeF&-YPQ-9ctZi-j18cE_SxwykGFKRr3NXo z>v5}@*-M|V5D$%_ra}7fc!oMJ!!gBO==U{1IH7sQs~7jA&Zl_|7Eu&TLsf$Fvjn6) zSXRq2U4%Z`QUnVg*i-i<)l0#;JVhP#QZ{-mJ8d>0rP}ERo%D2G2dSe?VBounbL{yP zxceIIi^m~X=!Iq-#dL;^_!;GWVx^Z(widp)#*K{0K=p|)cqwprvepdsD#d0oaNteQ za4U>w0jBE-orm+FV0tIaQrG<*KEb*P6fNlU0r9ZFE&X&jBn=cou95CZ9mQ*|HnB-O zkCU$!*+*HT4N;d4gM>M__EESb^s_iuAFWKcHJtj4fJVv=vt||E}34xE=o~fgDl>u#Cud$JWfVI{-(12Z>6Id48C7-ROo^COWPM~yX zH1K19ncHQjfqu$V55!%IfEwFu^-PF%<)VS=GwZ51p!#MUPctKCWBq-aMx=M2JDuL$ zgofroTGxjM*ypInKKC(j*aIuSXiAy0!C0vCJ?QM!4*SdY>`Y+Yf$5Mm0ZRw8y%6&9 zKDI!*5SZ#y7QpNJ;(HNB8Du-hUD-vKsaAdU>ed+yu9xtNKk!sJ%9;MUz ziom%7&xOM|#d}l-YO~U#bohK32T`*WDKXRp^D}0TMbF-o2B>S~(qn&Sj4T${`5-sh zE`g<)H|1041L-&fW2!;pA4)E z=U97+_{oHi@sw=!Dh1qoS!suu_9+@A0TOR} zmhmd1%{gOD2;f2Y%Q8`}4+GM*Wj)_Upl zYIIgO z28YBz&;wAdAbJYsqg+H?nRZbFR6rh*kJsu~QAC) zsn^I7gKI36e{orcjpVzmtg_Ky#S^bsh$=30KRU7#5k8g_>s^Fjqj}lLjc0@3kPiV~Chd zRh;(?Osie#y2>of%b{pmm=8v~N{7i~n7M84l0FOB>T8XG>a)6l+u_!RowXSoKz+76 zh86%EkltB)?woZ8-W89mvi&%2iBG5K!;v*a8Klf~mA{BQ_A(XCD5DLQ`HQAVA+Au7 zLACQ$%1#Fn@`Yu*8Uca=z(t**EQ;p@m;)CHTtnjxXgjq5MDVErwU2gSaR>~)0c;F7 zTLz4UsbHuLWH%Z(G(iG5%TVXcbX9_Wl-sp{eNOe%RS?201K31dP3_CgzO;<$W}vze zcXFFdoSg*j9}VS%dJJ(Kx&e1t>hn=vw3?;n4WPc6$Fm31yWtDOdnIaCI`9NrFx?wm z%eB%>K{Oj(U>$^pFb2m1VyKf}Dwyu~4K%Za6rii!gC1Zp%WFQZC2$J?Nq{mDlbkou zjLC1+F2DgL-(?}J)ltENc$Y ze#%ytM~;=6du@>derZ<#ws`}pZ^j`@0sFJ1ck6tA|MRp)@0OZ)G{Ip8*8{ndXx&Yp zX%3_(HTs^tPZ=x|R+MV%?;`}g5=5+|stee4EoaH*qe#B17J-#jtPbn~^&HT%bbAJz zRksjb=NiBh=$ai`wOMJJ+551{?2v|x<)waBOewKLD!0w2fojW=t%K?f_4`&G&jd^> zHhq}pS4ZyJ-O~GT0L`c-J}6K-cq_$wxR8}Dd&i`@$2BT==6=-Nn6Jgr6hMV|gsIw+ z-jBTupjD*odWRTjw!IcS>)MUpP=na{srr)5GZlPRrF~sDaZ*QV!T*JWZLN!p8GFyO48QdCRQZW~Mabyf)?AEApke_?m+Id|_EYeP43vUvU8@+KI7D9))EPv31JNjrejE!A zz`!ZEa8WnlfwPZxfZFF-GY8d#Q8&6{YlI>BruwBvV0*3x!Gfs?$u|R7KoKAa$Mpmo zlD|?q{3j_0E3*a4Y+a7tGC#15uMSC;7AeJvj99}`T5Q1k*R zkS_am3gj8oSM$MiDdeLqV2uE$^KvN{=Y+G$0(u{9sR#}Ft_SdlEXx_{8nCp?SW~kg zxZHie2CAK4>S16&yM#6~ZDmpe^inSXYxOTrz_V!|?7$g$px%zivlO)NO1%K89rk3L zL3K<2R#2@BuCAVXL;b!r$Blz&lgDzsbb-KE(%!kW2;x&_T0t}?y-5G=1_E{U(w>C^ zO9t0gA6-NVK~h$F4x%kE=V%uRY}=Y|^cfN(uSOf)yk@hgffZP{!9zXUl7>1^O<1I^ z;7(5g$Bk6vn5dsR3cI6$oKQ#ozH(*20IyU^%~EE1JzzkF&A3U%(*o0$?YgiErazw= zkJZfq?Z6K7I8ex7TI1VPBh4N;YR8ZRb06&~72uN(0!)FVPhPXtQjsqldSJx#d_WdP z2M$qv)H?&pbwKvI&Ip3kfKPy$;yyr=f&~K0P=g1M92AjooO_s$#{R=d=C2JVo&2r! zFK$;i`O4~DV9TJ%4%HEj_QG2qiSY3l^ z@nQKr**Gz)j@w1jmWFepwgv75P|0adbuf@!Lb99OZ-f^57{CmmAbT(Nav4VITabH> zIP^kLq>_sn?&b!8wOFRQ78>6^2h}J3jugyypt=&c_*J~2e&0$%@J9OOmQ#;uK-$HT%RQ%T}&Ee1=6zyrSRs1Far-B z8?{Soy6JL1gQ~2-o1K|j-N9DNbH}Y zQCXuCr)!|T=`*NqlHF88Ca{C9*}S&8kyQ%#SzW*vuYBD!E8C1)9Z;_dK^hmM{y5$a z1qPVV?w&`@OdrVOINWMT!So=`YraMun6A4=22A&;bRsn*>UWxhleoxK1>qb#5H=F3XrqB@f<~O)hdbOcP@Mp^ z1`SqET^xHRY_rtc5l}app;o%+Dv*{|Hh}tO8qXX|pOYSjB`_Umq_xsg;9#ggx}|v6 zSfrY-0z<4UBCT+GRh5rU7vJnY;!_IrU5= zj7>CA0x=M_*qKETz-3^)J`hj<0wnKm3};jNlw;q30qzWf1tevtLqP%oSOK~qBucnP z&&h`~ux{!QwbUk9Fu8k(HJSBM9jkrh*Ar+GlkF zvl%e;qG@2eN%fqKg6_l&u?B&bA*&s72daD80Xzls`x#VUz1juxM*Xf9*&v%6F>c!N zbilOTPNSLWv%z#tTVaA6Z3WX-rf3xJUeqm^4!tHFIJ0TA_fStkzWeO|G9>MD7MfLyX%7xD+vICcuEa*EvgAK#oGm-&_tUAeI+h93$k@Tu&54@ zL3FOs3}An9pXZ#Oal+Jr>ZVe76521Tq|*r?4S58Ogc~EoG@Ub<{WW=z{m_foYQuo(iU`CRp<^^~=DtwFOW`-8-%lW2BdSw?HQo zDpH0TH83}32zV?cV937dqQ=4kgbqksMp}Ioq#>>;`KB)b8qtq2Qr`34Ly$lOgbZ~G zBFJ|%Z+*^a-)D>fKtRG6q|ID2P%gbdQ6FXX$7ln3Zt36x!d#GqXj8!gLD;g?QDYDX zeUV1Efsg>UL)DUK;6){Tk}0bWymZ-WU^ny~1sn}jFV$5aRdMZhJ^+|EE4y^bsNXr@ zZ|lo8p!#_|o<&yL=-tar$H3$M{%X^)F)~b2R=UqM4V2v#g~2*^xAg7=qsBXJ|r>iD?!ENX7E{I>Nr{+zT z`eqt}*K7Q@+{t?#Ok49YfbHf>w7p$m2v#q>ZMR)?V7jGv_m83mi({jdn{y>V$I4~!E}kKlXsZW{{8{1g6YA?>ZMyS z&0~+Q2ULQcwugNE)t~?hDJxx(Pg!Y*ni0LOE5W&;kbD)b*;v$Eo39d7s6NR+2oi{d zP(Toz?g>(+nyM{Mj4B?~Kcfa%%1*PGO^C9Xr4FhCNpJwkUlD}>6PV^e!U<3V7rK_{ z;Eq+N!!Rh*Ucit*x2{Rl4xLCX95DNJrh$*a3CDGp{h7c=9hatsR0A)^GvJm2K5Or- z#-5aJm&aJIfa<&W3f3D?{el|LCM*5;debpDCfJ9ZmDXVX(6Z7-@6K828Jyh#E{>i1tX~zN^|jyt|nw31sFv**8ejxvkEtiu zmcaD3IHWL3V44b~Vy2+k5s>@u)q_HUlvk`+7nZd>68R`t8^C7b(hRiRy)^#g&(lsG4AFO~|Hpx)})n`+{ zohE=zy;^I%u6hHiH{(_U)O1SyG%ZrrQg#|VHoFsIrFu(4Bk@=cGnh7dS_h_uspxfJ zdSG<#E(={$DGN;*Oye?`wmGOqqCB@emCj8w5Hfkz>1g(NoH1VWyH|qZ1ZEZ$LU_y7IgU8CV;Ql=OpXZUH$(E!blwV48WE z5Ey-wkR9fLd{{_5wR-A`T+UMaI3MOL^|l-wY;o@PeHxJF4WNFZk7o|1?T%>$({?S^ zGMHYemmb#%Oz%R2l)*H~jC|?PPS?lD-$KqtD}A&~el|sBaSj}UYf|5W!Zik{!Tb>f z%|8LDjJk1bS?Qdurl{FT)MVZS0J`_7>ht$bn%P#{2*7oTX}G(*@aa9bbwY?@RBuXJ z=iIO)owL`}v?uh$j3fe%Dd=3dN^@aKRB!{-fL3o^M{V7|ZQU~1F6pLnQlvhvK>>5} zS)TQ|8W;uK4GXELkt^duO0v4@Y7VLgajkeppnB6t=_$waw1f9*R{Bbmt2ry}a7T{2 zreku2U`v~h)w$`|mAGbCUG@5vb?aBa`*Cym+Zw6=#L|zY2q555kB0Bs zD{lL(uibskZ_U|VE1mZPSV2iYA5t}tn*-J>%>k*;^{kOaP_4a0>ZbtJOHIm(ZH6yy zsNXl=xKS`|H1B5uru$;oV6_zQvUil&TcvoUU~#O*t)p4M+5^q|iHN;Fp{M}`vL7~? zA;KuS52`5x?FxBbo=E6Hy;J6WMJ|mWz4MW4AN}FL^#w=8#q)!^-u@MPU-O~G+b<}v z6o75^7bE}^Qog;$4vf=!?kl1aYEIgcLm5nilT~2NsRz(VH@TX1@#@hM1-y|W`C_A` z7~R#czTiz=^=51UwGCR&QeTSpm2}F!3r9HGvF!9f8XAnISaL{pnT4=XWcpSg?RY|E zZjwTxLBRr;R_It5m`16o1<`7|+97%a*8phR0SO3#08yfR2jUE_KQ;O6%V#{>z7np! zDsb3}_I>t8cd$0rS<;exRRWA?_+dyHEQt2jBR%RJ?G)#pc(H%!;|_(JT*QK*lp2IR z0vou_*{uw!!wRS_sK*U7(e5$9>7cq9jaWgo1_~8LrYsOn29)I!;*TTuGW>Vi9BwScVD$7F_>>iaL z?Njg5x4E5>s>uK|2-AF>q81LSQ8KXhX%VclCoP?D}9+b+IqEQ;D&|(P>T9bg{$4W3vkLHNxBxHk&F#I=hBRx+A_6+ z=fZrIA!--rHDd!nB9@&l1gL=q#J4ro>bEV3_Mr3C`ss_aPhI%b@rQnB8phu!5VkTu zJnsug2dcAW;QFrKi~r`I*?sMA5m=_$Bd`H$JE+oi!3?tVb#}7Qe?;eJfoh)Z2e+l5 zdWXl#mrOtY3NJ|&p8tn?T$PI;yWS~Ud&(v}GF zM(tKX1Jg;{PZ$zAhg@?4(d43TEIUoW^V(_gg73TZu7CGn_T+;CkPn%2G>i1ag~5ye z@mKG^`u7M)5Ky35sHX!sQI63)~4`T*^%MIgtJ&T@OqbsX`Hm%8GoZ zafhr2g+q~9^5aq(1JOBXsG~L@T_HqGju62BH2_l~2Dt6;D-Z(VwQ#ick=bXz;bMK| zyK8Cg!!}6Bay>x3u5Apd|K8hZ=RMyr`s&|sKnX-AZwF{~p ze`JOTm=Cxh`DcJ&4FSCe79cV(ord}Ca>>OLv(I1n%=qE&Iclzb?`b`RBq}tk1J)vD z<)>~dZuD`l*m`Y>2Ok%q8NY!N}q2V9?-e(JtY9ewgYt+~4Y zY~&$OQt!hrAHCuq-?#PhPZO|&fYLHcsIgKg_B`(e1PF7=w`5ipG`dD}mSv^Sl$2=T zPC2D07PIPMa?}JP0oR0e3V2snJ)uV2$!#)mH(po0Y0`OXj+-4&(<+c&o?pUqaE%y_ zX=~>qZME5H@K_G6&9l=!N-xz*TirC2jVmk&urHtDh^PhAQc>xVFw@h})l^8E`BH$b z6LxJ@`k~1~-*~CM{B0G_9#8;{2nLq1`(vJ>O;*P`knZLNq*nq2(P=kNdp39IKl#$) zW&hw$k6!&y3#ti8stl@qQ?ekWn#{Ht%M3?>5_J?f4EMRlAkEZH{AwiD=46(o9>^FA zKGOSb=`MzY9R|4lEI=(AK>b1+*Qc=E7?`e!d9ntk&nbA0x@|s|vR%?-YPZ8hFpW}^ z>VD32)$_ohp+2}o_hw-9f~j5_TtNn;1w9~P0@wwSGa$`C_@T)o_dix$dc%=S-mq45 zx_sQVtj`A3CL(}{^EnEhjA-!Qujswxt$(t2*QWy#lLZ;f3&0v0(Rl*a5Nc*96OcAB zx_2Gzq8ThvzbjqCf~6MoV=Pm{GR7X4YoL0>({a7jtZYX65meX9p!&%Os$m1FZ)`jt zYo#B<)vK^*hDn^}!=yRab%x47wNMlE zJ$Y3#V>wf8)NjpF-^N5+a(K8-{cf|=8|wE9b;w!1NbA1(5WlX{=OVZz?qx4A$UXvQaIVScc&$MJW|`BvzvGQM3Rq* zSD%I;NaSpd#7d&xfA#(U*2U`Le*tHYH9R?Tqj$b?`z!yi7x(YD2*Ck^H74T_qy)-Y z=t2M+4uC>|%>VKY8Pw=J1M5aiW5LNE!3h$DCLJc54{|PDtP*o%kSX9Ax9*5{q;o6B zII-JmtQ-GOj!vzsP6u3@y6RhW+=_sj*6H33M>|Spyi6mRr0f+BXSmH%m#E$%6#DU* z@q`Gb#HGicG_GwrMny#d0`~GLyYS4-X{D~Q>@)xc3FIBnVRNwcf$>Mb<0>C~UtGJB zfIuI}U^>~N6QDDIwAriU>=I;N2h!^xIz7tJ%~9a!wcD@%zB`KB4!Iy{7C^Ps1>5b} zz$sH*1D_ZrJW;`qGWEN_0UymMWvL6?<}2iReA0-=bNsm0QPY6o;NG^mgGAvCpnf5b zKOQh$4(wX27ED)c&BsOy_0pr#;gs2V^+m3Tfm5Ay3IZVHT4@8*;4u4TLnIO>aX^g_ zO@KfsY(QG#nlp;`2PU6+;M23m|NW`duQFdXfeeIk2~e*ind<{;eR#zdn~!4F`kwO6 zx4x>l`=bOdFt!=#LZGP`&@p+E5QKwAaREa}pxZz-qk(E)54c{arG_X?MbR#K7NtPx z>Z)grF!uRcuB)bDkq^j9sfbv6s!wU3DS_&t9OBjuf$B{&r7xooKKokfv$N81^oMO$ z+QqfwoRwxO z;b&jB^Yyc|nU_kbuS^y|HPk*>sTA;OP09-AIZ?l9OWd^q zU!qFDMfu`wx%bE`WJCRaA&%>0r`PU$zd~@{Bgg@s<3kjUsJ3Uc&Excq-3%7Nw8ti# zBqrB(uLaXW+Y+!YrbL1?;EHMwGz7+a3e+o*EQc%3WqLQ|Cb>PR5Tzh?f*|U5=A$Hn z0*nNN4Ixn@D2_0)K(^j}?GOIyBuu`cbvQf~c}SFXn*@(<>+S#F-?0Dcw^FbdmEC^9 z!f{UCw6rBmA(um;V{F&}c5c`ysJHz`A-jm|0`G*~!B;sS?!71P;gAUr3R$5v-H#@qNY z1=Lqx#>;@(^afDB(8e~h@XW}u0N!c z?8UMMs2ObZvHa-0{=z?db^qlb1`w`W&>R#{qcp)lGNx>`FaxC^qefc~I&XZkD=ZR# zol>hhO^s0GuIZ@nm@W?(yz_HDM>ns7=KPfS%qX^v9SBh}~cd-&v$p9;d( zM+9MMtgp$ME%`qKDn9b{`+xdpZ^!*(MivGX1K2F&Ng5W$Xaf?r)Ne*g??DINm|G3x z*j3m^J)IwPm7FNxjr9VW5U|%6wgNuFuCCf{tXZzBrg2|Ro~o|;l+ve7UG>dBZWTa% zioS#jsP~la4HMehR=RgZrCeRePJ8q+rk3j6D;vkN2KyyYEkHvVqZHmb3D`Cu!vd*@ zw!+7rI1~{_!1xEV5B(dTo;~{4Si+qM`4_g|mS`GPBiPd7AJ?t@@vk46^O}~mEVUW} zoaY?{yaUzxnF~dvxNUvQuPlOUp8|uB=rbW-#iM|_Nm*+jsA^=~-{U~Y6$atiUYKE{ zM-)7pc%I@ukFl2l_1yxn-~K_vDxfw&hRt{$kEaW!bv#UPK7;8*Ups(N0@DTd`QW-> zx)PuP&nWaf4mi=X$w^2)muPE+0c4h0I@Idr4y7K@0s<$lYy^Xg<{VH5Dxwi|+XZ^t z(FcC?Fr2(W07eMV`K+`y>SQGf${B0v)&$P5v7>wE-zD2>Vm|a*=b!B0@HbvNc;)}P z=LW|BE&*gofd+)OK^dT9(G6V8R+|skjc|Zo+BUx~cviQW>yoWmnUkvW!6jN8bf6jw z1UPinQ2^jM-tK#|Mt$G{gHEi|A>(!G#ISg{&G`5^RabMZ8g<)jgQJn)mKK> zQj@YPj(FmC*&Wv!YVaYA*~%an6^9L zw|GXd12E((G-54NY>1EZ6|YjE=WznmuAC$=UGt0v0;#jUghcbU!{-GsUCyt`svISX zcR?hUl}6q39Brlqq;(#b!G+B7BK*xO@BI%hg=>ES0Xxq_o2`Loo1dMrmhN47p}6gT z`^KI7-)heib0BLz295CMVIKiyEkZ_aTG1L`NE9MT>fq5|sS zw$iCuw_2L)L8s*zPgBt3fy3KiI@Z9-pP`w1A)s`-B&rgHk(HpkE z<=@-)dq;uFKwuea-xTT8Zx-zWOCDEFdgQ`Ms>ej0Xpk`5;|3|oEWw%Ef>PP0vj; zkk%$tsGTGvy9P{IX_Urs4$wX5KBwmjC;0y9r|$ps>`Q-PnzPc>QoN;Ql1LOA1bI#5 z)Tl`Ev+Il!Tt}A69t$Fi&&b^7Tw{H^+kV@(jb8On5gaq12t!Z}UM=AU9T(uDwrn*a zgjo*qp%E4saJ@iDZE6fI>KO`8aGPB|xi4pZHc-7SVK!L-)z+EVK($?o2XP!8#J~b> z98_TZ2Nz2Etsy>EH5HAFIhBQXD(=4`bD^D%DSC{Ilty$TouKMO5w;G^!3xGQ6&(bbT z=tbKzYNVneOtB}|NCWvDwq|5b#`EkniI9hY!ojJ=TmuI4U_RQu(dP*P)B3L*{n}qY z4wG-EB}%tx!n44&E-q8N1!#%(Evi=rS_O1R^IpQG9iSGq=TCL(I(X$op2gO8-QNHH zZ|{8T|HcqRL3P_`1+f>V7{qH0W^MJXGMU>dvij{Yr6YX!Q`JkY!6AAUu7=cffAa3Db>rkt&AGPp)%kmM|NjgFydo0gFT z#L(7!R<%*VmqB$u>1pLdWuQ8BLamX`0@Zd}pFs7#Wznpx12X-aH%-c(TmO4@jmM5? zDJyM_$JVma299%9TA0fIVpdwHm^C+?l`f(LpAWnMs1#1@5`bX7*!rpq7Q919!MhW- zvJ3)hLV$NqKl)u?sxQBZK}NV1u;Y3@OjbFJtu-J~MUOv#Wb+c9O z^!xwl4Le`^FAxgh5P~%fH2OE>OqrlpP;JaE2vRrZZ=7h~!jnuj4bp4&`V*HvFZ^oIKV!W?pXM%o4~uNk8f_OIbyKI{^0qC2Xho+d!uAI`80$J85p z^nE7J7Q14Ro9HrV<3OSUsmB#HQd5}^v&zaqGkW#QV1CQB6YmoF8HCeXoZ7ontdF4D zA2|8=*MD~Q_+McF^S{j862L`3tt%_YL(E*lkDZgs`Tex=m`Otx+*x@^Va` zg`5Zt)2Vw%*=a0|>RpI;8b-PlB(SsQWQ>k0XZO}R{H3F}{oEwXzKLLg9=aH$tGxoS zK@e2gf9T9CwZQtoGpOF#ZmDh^kZzw4=|FUTj?K!o)C>f8^t$cW{rPkL++m$-QR>_w zSfaL?YG6j4Z}TL9YUEHF&53Wzq@0P5%a z5d8lWOnYX>3t$?O539C=El?YBcG{)ls$_d->n>-d9Ry-0_^U@B{Lw4n_`A)^I=@7b zd1jhUjeK;*Nz;5!uGf@o-E&vw9k}lHI}zZy{{r0S&;QS_9e%|-0UXx>MKFXEYW zLq6ICSmuk;Jv<@K8Ce<^=jZ__kvaiMTzhSu;KTK2zxtEY$9|}W=AP~^+8Nl*mc3D0 zJL=tN{Wv6%y@d?*e;kefD{5I-%UTC7-%)-1^`lq)rTg3+Pl)g3PWvQ`MW7-`9fScp zP~9Fz*Vqe^gZGLkaNXxx{mX3yfkeE51osx1L@NU(Q^yW(&=9eT}ZIGSMKnr@dF`rgFx*siMEks2GG&@fTHfr#@J zbsD>R??}uay<>+}W9&+12R=lbP#suOM!J26hNQ_^RvIPHK^SlS!STa?;c7Vg?$+0m zM$_{(Q#Shn0sPz1QeXQ=0PwR>U+aEE?K85@An8DLvPaZ^-#6|2ssCjgh9?LpR^G&d z=t7MwJ~(bNpibH9pqsj8nQ15-*Sc1mLIH0mG`K(kpN;G~ShQ^QY`v~Jfoh`Fy6W7l z?CiSg4XD1!#;pRV-3qWq1Js|Rmn6FPjQVmwJ?T*?Pf%~*l~(GUFuC4UN&&nG(F_Pv z1F|Xw3hiB)WeV6Q$p*m`$iMyQH~->6xcVQpCv+s3GfHPR8wxT%b?--eF-zU!5Osh7 zhavLuY{)fkafObrOgvBUrF?<|)X~cMVRq-hTX% zzgbIjuYuwfAg%MR`IrG~wUW;3BDQxw0`5lRZWRGktpa!o!4&7Vd{#4KQQoB*fdM+! z2;u^;7PGUkbn_wg-utbCSN_8-H#(L8p$#Yy!~zU-(ROpY2FswSUINvsYghr*J%w8< zpt`#jucU3hgngNuO!ycFvcCYTuS8G{u&=@ZK{lZJ%L%5>rg-Zu7w{CW*RH8MBRegNwgA9h)IX*`TB40Bgl-%1A4mKDTwd);F_u5k z!}3GlxAo0G>Ckb@2w^Bi{me(HF*gFtTI#~6rqP}eFyl6JWdXeQ772vhOpy;qLoOU~ zH6fn4T~1l*qeZ_Ou$ELr;f2P3n=JJUVn|2pJ`+frSiFh|d)H98K-)qXa0D(eX`vn#-wkP%Bx3RS46J7uPGRvL1K z`jgYo-S_dyqkl!;m)##8R{%A1^H%}D&qujmmV6bi3cz2E^2-aLT8t95)N5Z>*;@hy z`bWQJc=tcL$KUxVATa|9p%0v!l!YJ+XqoCJxMYjH2lG2`fdY=gNWBoinh4GsV2-*4 z)ifK)gsiR_+)kjVLju)y)!mNXS3Qn`XV+D)gX)*2ci^U3+08QuZvKI%uOaS&i+UGW zEPwzw0UmhlB^w|}gMJ$ASr7ayV32?w0y0D$ZC5z#10!U*HwmMH>5otU=ucj0!8EjB z`ZQ>a;F66dBHbKeE~xr`1p4u4|5VgJWg1nR*t)Ih{)(ODH3;|`)%o|9#SD3;sngad zO>FOwuYD(h(emtKe+!bDD5*ZK073!F97>#vq@auY4te6RR9h-!@F>G5iN2=2X6zXQPkLey`L@?ezLViW)$rL*%qi9JVu2ki5Y1NiuR(#xWa`OhR# z5TcDqx<6xQk9qoMe`WmPzyGP~3okDOT;af_zb~j(XZ?ANxR3x50|oHtM5vtTzmZT+>O}voIM6_*I2a9RD}ASWY|>8JG@ctN*(6 zGw2?geByQgYV!WSb+u&u zd9>4g_7|dl5Lf&STUq)wllp;GEX-MF5h)Nr#Yb@)e|h1LGY-g}%<}_iVOpl@7lfm}CT6SyM9Zz2wP4yGANoC|{Fqp*N$`;h$3(TCpnk?|vcv(dxn z6`!CLUqQA1ohZMK7Q+H9_@?=v`)5)9srqL3S=Hv#7Jr(LFTa0-gnRzr6fH;zn-+fIKaHVUK?L=IP0h}be$CU$t6h{cpTq#|mte@6`>oZVY&Qg|t zTYW7Yx>|&=S2=$&rtRK=tC&-%=s+&xAPh)jngcFywEd-2^B%$^B@*EL6$H>Ys6PNdM15!D)J2GL6 zn89NJwyUwyoRM@6NCXZ)K6~UR2yx}ID>S`gWBUapZB6F~BUQ#_ zu1*3s!U2nlOQqg9nUG1E-RJF#T zKo)TbQOC7+O+WsvAD%t-(*Q7<2k5F#2ht`lgXCN84*@8O`$Y}XGbjcXQEh;GDL8;7 zouA3JEbr|B&`(7Di44?Vvm8`(K}YxJB`{&(JAQxq=uf|^`uMkE(>Mf4e{Tm&E(P+I ztyfXoCE(oUy&0{7>L3-C3!pm47`NNtfBy*2<)49k zEP!X%`F3M-nD%VI^kWod zs2K~nsZgSLi~8i0N*+5BQLvbTT9TSdUy%qqAEhrd=c0I5Ip-@^D!6VzbfW;e*3Y=o z*;+x3?)xGIzm4-QxW}q5-1jTT5B-;)uP^>(k#OGpQ_OEI|xz(2z1@bq=7R z`t4E9N4b>mDhAvfNZoAX_9$rnE5|8j;wS!18N4o&B(hDK{LjA;@Z@c>2KXb9Z{38H3!llEj&JS=t zx0sdwx%u1TJ8SESmq2;E)4k84kNMxTq>n>rpI!E2RNI8I9o6Xb_2vKc*N#5;V<^G- zD44|Fc|hXRyN<;bBne!*v=_+xK+%lz+BwIr?<`T|h3!DlS1qVc2ZnF}s>y;y1ks-OSkCI-~qI6e5^ zhZI|HM}a90z$2^V>~tXwDrIIi>jAgf>C&gYIe-L*4AuNffl?T+HkWp4slNtA+86IC zfL>a+HOaJa3(D!AAh<8+7g4l-FzUN;;dxTMCTH(Mr#o5Re{Iwc640BwbzIV2ru{SZ zXI}&2smZme3Z5PGu@OiC6p2M{jR;XuQkXT!Q5q=7OKEj^vV}b<=olslu!A7(slYUD zf`jMfK$ElgESN7Xi*mjN(*<%Ay&mf{FkKv<&}m?Lkij%^lom`2yVXwK#T-D3^G%=> zv^#r|vOv-Z;2bgi(&0n@`J?sapIGt_lqlE%X=z{VITQW!8RSM^@pmtRhH+F`c+X-WeHfD-2rYLqeq*|Kk@6ckNgFsU|Bv9#{vmRv$KOz>7K(#apRF7B#3Io*!=q^X04D{eEfmUyVh#LpfS;$0( zTd0@*qr?ptA`);|y1(TC^n zzqbIm`xjYUolWyOCHte*XZ|aYKuyERkH}GSDi-Hh7@ZKd8R{SoEtV*WB_zO1BFVRU z08lD8>Te;B4NzNbvISeo?#>0RsoVvnkIsJ{Zk@8en|h$BD_K+4CrOLAxmKA@`oI&) zNeh=)L?TVHqp<{}EdkQUDw-%r4FF+VevuPH5a$Y}_1TY1AG!a%Cm;O>71v+gUI&S} zjB)-87l8FHCZBUZz8rJ*uiTdW>t%2MbMW&2=RvsReczPWAr5k!`)dI1Z=uf3$0hsm zN*wE8`5k!7lW+ci4d6pAb^AT!YL}Q7=$QNr@gv8fseK?t)U7^m4I~0 zN=t~EkU@|~Nuvm`~b$niD!Hh@uqIB_9ApeJN5v4}vRnm-Q$(?oOYcUrla7L_6-c9Hq90t$GFyOf+rzJd7yrh$!OP$BAHXaA#Sg+uf8#sgjt_n< z+#c7rpLj70ubf|}#U&Ay7C7s3F}VLqc=7MN4*ul-{Uh+=fA#G!di<^yv>R3YePE1~ zoeZqILo>5cbvOS~IQ;&%oqX`GC^#XbfF~ebG%%;x2C0(<31pz!vi%MiJ5XIEP+cTY z-DLXrEP?8gST=1>YFq@>um!*{Ma`%+8C37XgbY-Z%9%`uO{VRcb<*$Tu^e(9P}_WL ze}6)={JlL^11PoN; zGH6~0(^f9=&jI{<;{1W`0QvS0d~F2M55isq(w*;^v>CS-{m$#7@4dKtKfVJ1?*}^LMzejs#I-Efd8tGBP#sFb) zRwgAX)AY=89HVpE_{q&N@Ts?VqHKeatq6x1RCAn{DLWlyN_mZtVSqmAfG&#K1q^{9 z$FqRMz(|hN0SKVGV$uT;NrCS=`QRHrG5yTX2*@a38#xElBweIPx(7z>b{~({19_h1 z_V`Y`_if(~gM-_FkkY&Lwm*CT?s;20!1~-h`ixP$e++;=7UiY5kc~E3^LflVN)653 z?>PGCKm2TU>0VF4Wg2*Q@+2w>s=<}gQNUaJx2tQ{V@?3uvp8Ya=SciCuCWEQ`7l{Q zb&rESi(4$Dnd)sG)Bd=&tILinEC+!`Y)u`5Ogc~2S+wh#Up{W42| z#JP{%ueD-JRCHQCZC_i*h20rXzeYryNNv=a46H@SzTv@Z);i4-#R!Cg2vvfvVUD&+ zLmXu+gaE^?rTM8Dmc0Jl3v7V(bKiu_z_d@cfoZQ`I=w)4Gnm$$QCu5H?&vK(f$36e zWT2d=|Jcl zh?)%xw6k5!3@-!eqAKC`=u`K;_1}Y+$J6#Z-}f5W{oK9KKi&lovYfTn`5DqZ11jy> zT=wGcd3W^Tdt&B#=d*WrL4-0%-UqoRO%`iBP2(~%E5fV1fh_4}EFX$#U0tjr=&ygyI7Vqlu*_0kO~kS@8lgRR_XtfP1{xv|i2 zPVp8RL4$2px=4KpfOaWk1Gp<5jFm^*_Us-3{h~D+#Ffu>w(VUC2S4!H=7|@9cv4V}fTT8w0cMnf8mZ^N z+Nih%O~qmhmziACX&(}WS4G@X&8#G`aXb9)IkIDbv5H38{>v5OLI&d{MNGv1MS|)oCtjFVt0gW~;0A zH5Hy+KWF!?t{SMv-VFr^LhTrgsimNLug^3%uJGI-(2%DodC-CC0{3!bRs+>OB_7Ow z-@O6VFW_-20O~X9iUct8ORBEQIrCybG@3dDJE?`dcb~(so5!Z;(V^|15 zJXKOXK(g|ZMO>$Q@1nk-t?|houF$e2eX*Q-`2Lvr`gZse|MW-UuHStF?0xE$uyyez zSzfC8I`U%G`bDNeL;?X9V(|a62)@4}QcVBk{~l?kZ}|au@jJgGfo%j-`u7rvjbNG9 z6M!!OcoK0bOAQ%BV+PTU*SRD>R0}#?WEfxplxnMkc$&x%Q%{G1C+5oO<10WK&j8b~ z0oG@a=SLGVpY1DTndyTBruPA0d#6Zy=^7rME`aG1+8ftci|C1N2GdatOeX->f$2Jf z>1GW~4{|4OuXATtV)^;$bmcw~o_P81PagegmTxxqYQ3+Q4nLO%OW)ljSwZpcu}S;g#EC*84jnef*7D-)ZZ2Bl!0!&_|%I z7Q4&1VP~tJO8uwaKKtlTUx}c)t*drRpc+>|bu$Om)?q22_?g2Ds;On7%ucXZ`gBt7 z#$)msRM!cd&2SM^vz#PAr=Yt1Ik6^Lk9YN-Ca|G?KU*;E6TM!+v{LOAOtVT`FFm?K z!;#0-c#IFp^JP~s({?YkS7O;6wq>0gkJX9dEgYP6@XlH3q9#$TL1xq}vmBr%Rzn8T z>_{e#Kyp^P$-uhy1mFsqsn049caPQ=@BNq45B}_d9DjTMx$ZJl*ap^F;|iEo`(>yH zU{)uc_eM|L1@}asy%6c8Mb%$siI{Ew#bscv&%QL4Z1`Ev)*rBgZ#<=5ba7Qcw%#}W z#7_bsfwN|%0)mkHj<68Y05U-Rb z*CoqW~i8FBp1jva6_JR3M#KoG-m5j5_b~A8T8OPe-~62=z;?78DRk`fj9x{O#756ospr&MS0fQ>g9o(W)IJG6SBu>8BE(L ztimU4%)vainxX`z1HlP^g6W=u>AsNTX{swUFg+vxlwi75##6OYLG2M*vDS zr9TQ6Bbff|e-9udqn1I=N_VI2i%q}0HUNA_S9(!aCEOFU#hT^n=VmIMNYWm$n`eLY z5_OV=%(SS0?w$F2tcxW2_N4j zys*-wY(xEiwqW`pTmsYQJZ3PR>evlTUzuOE(~F{wI2$>pUTUzzqT^*+om)rp`x}Gt{<= z7U=7GdAu7z_4jnltv5#f=4jZHc@@_9Tr-*7|E|eH{}v?ICa8K>@T5apK6?cNf%&%|*t@ten+VvlBmYU0rq8tjy}Fg^Jv) zEP?89l9C3ecL1NA(ELG|VqoTocBfZE2>ua9j7*1_0ew8u08huRoR!CnI; zl`=w3^hKsxgh)!_iZD@53osxpU=15`69*D^+mS{gf zbAVmUO3e_*Z1E39TK5~`7twv)^GS>8?#4~E*CY>}E$^LGPc2c9vPS5|>=(XPcWl42 z5KuZ2xFbg*>}p`Ax=ER8bOAhJ%1o03F12Bw3v z24oIT2h&JJu9FV+G&kM?XV*c+JqQk|a*sqX{r<^k|2qZK9oTGx=oPx?%MkqA(K>8{ z$=)Mh0r$n)=%Hn#&lXWFt2NTLw^lz5t9xe4Qn&9;y5BEm$G;Bl{iQd7pOv=vAQ<@H z?HDf0f6wmkr&ojhY6R5>JlRGH&bkmg2absvNK|=&8Btmb1anX=8B|YEvyur^>pbdy zIU^S}LEHV*;dYM~K($BBhBm25*%PSsyP}|ae%;UIGwZ2u&92{17fe59U^-u+bbAKV zd(wgFAma?CJ(k>LiuVx}a!h+l1@CjFcu#0JolrdyA`u#thg7ngQ@klryesmaT?v-C zVPRK9+h~)VuciT_g~nsW+-_W(l}2Y->EE4v^t&`GeJm%hb=dhtN9|szofZqAJ!ao| z4O++jpXmJS+{3SmnX&JWr5N|wGwUT+W-ki1Su?e}{XqodcfRZO-5c@E2>2i_0qDgU z=LUZv#(*$B5#0;!O*kXAgbkdvGQUjF0&>#bulnufZjP?x~2c)qDER^kb z4WquaX-0O_kCQeTl=KAJ(TCZz2T~GB>5!$#KTm`vZvHtH1R!1a0KhprO+fg2C-45= zN2|}jSy>jVKiOR=BXvHq1AzY=)E_#)oc-^`kyYh0BLr9DPf-EYCO~=L=6A$ok{*Vw zHY}t6dbxLq>tyX}EfR!Un!A7X_#=P+v(t)`W4XS(zB9cDY&E^*ex%=N-VqVh8Z^s~x}}rKf7#dF#9vpa0_p0H~MfxOjtd zos8NJL_rx54rLqrK>50-Kn)b6w!i>YQ&FZQS9`?;LSf%Xf(cBAOp$>G38^JV>k0wL zddF;hkgThA2GiT0y$9}&S9RR}!9NTAqur$-m=-CVtD-SxBoQ9b-+1nt|fTJO~~NP>#@!Qgn38rV`Ltq-b>tqY0hBUpBP0rb<|IkM<4~$ z#1)AGYhd(+LlJTHsbD(jnhUix8gXFFR5VDZ1g3-g#7r~Oi(uMnl~p^*v}-Zn@b}vt z(3B|N0=?rMrFW+$VP(}bpt~Y2OJ}3m9R>T$&)J@e*xH%W1ra8qja{^{()@}a_gcFa z&+V=>C{)4a?|@30dw*^A;h#RPr&~zDu{6#=bw$u18K@2`pt_lZ>e}w=v<8h5uohz! zq*9sbGzAnq@#r(C?#nDui!-QB&9JukBFUaZfMe>KDqW=0fb^|J{eF62y7Rjt%9RAB z!@m07QMv=X1=9m*S}<*_0kMA@-(#vJ%9s^g;}9&vq7-jR6mJ)GW$Yu(N*6#rXQN%z zDnmh%45meD=OqwDT_%e6)D=eYPPA^{L`_Y!!Ch(&F8uQNeLwkyaPXjJrI$({%w8_b z5H!1;?*P!>w!Tv6wC-3}EE;Ud7C0O`r zHoKeUMr29DjwOd$rX}Qv@q8?cx+D7EN`Han5(zXRlcjP zFJBA$kCX3r%#|e;=K4D`s?qOPpZS^hk3aRzp1}DAoKWKta<*Ecc9QI3p{^R7l|mr| za$Gr%(l#qYX{@eV*!9?&759tfW@T=nSy^#>@{}FGcNaQ<1Dx3b{Cam)ZyN4C^|+M* zwV=tfrud!#)({1@Fi1rK8f%mVE(P|DOo$30C>nJ#d->(;YZFDlva;Axxj>yy=jaTK zW}vzZUz5-e!F=V8_k5F{;wjA~2MeoT4%q268u=N5kTuRfPo_`3N(&cG;)@6%@By{g zzXTC&g)IMNbZ-zBL?0v909k`Fa1^}DfIGOxGS>#Cg_CA+QP`=59wNx>%&hXtoSv?n z1)et)nrB}(ZSv^p*JG`9^d8VaJf`lK3z_Nm#X|x#C}%`mC3~3byu8&~Qn^$!jRYA? zw|7jt_Ufm6-?9S5M`kfIJ^kE&y9lOL5Epz!O#APS_S;*Ew`f*cn~vqIG@c1`{o0x= zfoTtTDp>Y;k5&Q1=|FusO9v(j^0huq%S1@m9)JX@y@8A612#0>uGiAs^N!ia{@O`B z*>;Ze^(bNhxoMI=a%)k)p9z>QJ1~8FpRqLN*|+=_#6ZD|I;Gs-_p z%~JC+k=*S&e~xtS2(Q4^?e~p;@4r0c!|z3aB_K^e3$w1fH@?i?HJE$u=2H2#%vgUTlvVC!kSXBws#D%`D!6{NmR1R#wkJbw3?6SE*SU_nO4C8w#XM zHA9WtJ-NXS;0CHY3i$P})!HyEpU$}D0JWgX4F*y86hc|xbZ|x_G9!kXSO^)07$i`Y z9I2paB)WG~nSWyLWbJ?*B+4>UqA*4c4vB@_?R4%*dntG4;;`Da+bGqMLiUFCi>Eso z7qI7+v&TlS$u>c2+q@H4?o=w!e%{uW$Y?Zw^}DWtnqIVT`*)*hT)o}eemOuAV23Gg zLe~g6aO7$r7sRJbH7l@&KB1sPk8#fWPy*8hgrr64D2)Rcc1_7T?M?&7&p_z(Q@!=I z4Ta`u)=gVS@3rf(P6yMMu^b$czEJkZ)(tZ(faye+Vn}u`chdB}1JjVebTtRl5)Kua8;jHzdYJ2Wlm0%Hpmg2BdQr z?lVO9+UFd=jfn`*Lant2h=11C$6)^(J5ZhI-^&b_R$MpNVE<3Ov--my_YFAbxUD@; zpxUR}&#qCKf$C`j)gYMuO+w)?KtK_%;3)yHxIqI3Qc&$P-Mbe>K{d-2tU2F#EUHhC zc|uxGZJ_$nyq@|NrhY$dFnvCQ>7B3)rnkf!m=*=ofl5B2ZJxRvKB18|&Jm$Ox?lQg z`ZuFApQUVzmw+P)DIP83y!45NmB4h7$|)dcrK>m()EE7H-BG-|yIwt}`h0NSg`Aas z_kRGx%U3{ZjTm$G*Fl1!R|Q{0hBK0H8IXcj?*Z^XhAU-JxJLgr+vFgeeB0Z`ANi}}`eYkKJW_Df)m2+|+66L7xbOtX(!LW_Ich3Ai6D>Oje z?%KXti}zF8o%_(%j|+*gH9&`uGSzAa5JGS?i=y1!;K4}-)dC?3*%e5=nFi~t02)_p zd={B$v#+1AhFgbP`fR~8oOwMKFIf=ZVnsm=t`ZUIaW zoazotJ3w* zmRDT?z>_Zt; z;}WQbCfHrx3!vI5wGa}hHtMg}wF&kleU?TLuofX=PzrGZ)m|A1;!|dHAXl(IG*GR8 zZ#(McdTL5?>ruZ2ZwyR7x(22tgK1a*)3r3T0H*Dp_mr77W=If+O3mMfW26aCEt3B2 zghR?sTjr)p*I|igr$8E|&RrBoLn zn+4_OVyphMJV#urnWoof7RiJ5xpLNvceQ^9yhK@EM>}1>-W?mSHt<~9L+Rep2$|+R zf7fOY>HeF3`Kqt~H-Rso^Z_4}dehkg>k=l&vnyIK+mr{IaBP9;%N z#QmOAEi%CAjL@=;!?e%RkjNIEzzC9?%7i+fIgIxCr)*lcp@iPtL*@<1dYQdY0!J;G z4N*e_y5Fu{4F_Alck<4^7o>Ul>W|BMcK|T`-BF?s;$9c!_AZ}K*R%Gu@n83;b$({I z-esXpFF$KOud>wBV0iU>JUDxk-hR{hvzC1P6FWeD%J((Gd_LystN+#H4}a>3`rv}k zb=7X6t{MfL#uk$6s=c7y0OTa@BSAeSbk>O2r{~Ay6;yjm2G~sqvjnPZzDC>NQ>?St z0i1d>x7-0dgX+dQfUkq<0ym)g`9BDr594flH=Lbmym2`lXibTsax5;Rz0L|$9~w#1}mxDljUtfO{k0qJM;Z@!+H-ds!Y^qP>tdPnc;UyrpFb$2}$ z({={a5NcO|M+MVm;a#2UaZ!NK+jUt^7+Wyy+xlpSWHr+rn8rj;4$fsT{p%+m|L+uA zbma~Uw9(A&@GY4BJN5(DJKBc3-~LAJ2E0Vwrqig}H%|XP^Z9OFR@OUxc4IOCYPIBb zL^u}@>R$BQugjTg1UCoOCd=g_9XLPa@wfc)>?42iq(0uBgKEnt5;u)o1l8o618E4Y ztM?pKH((Uu83zSf$TOGgagVV~AdZRWpn8VG(G(l0XiGDxJn8DGm#N=yYf!(R4w!!Y zR4}dd`4&v~w;H-In&Metx)6t>@c|8|Q>rIG17#IRMHx(6v>kP6o%NFdG}Oy9Z|?(n zv4E1Ilud0EZ}mfn(lic$eG8^PU4P-ew~pWUKYSrvc@TkV3`+Hu~5y}5Y z0=$1Ygg3j>GimPs-SO}KyA71Cks?VgLkAM)QR*ZkwdWF&?zv{7S{%z3F|%Widt5k? zf&fYf;G@2+dv~tr(?y<2@F`>i%Ab3mU$WQbAWAM;7DACJ0Spsp?&W?oYD;Ot5~#f< zOQH@U7Sl?fbgpvHT-|=}$=m;aBjFXW^hUtWi&onA!Gp@=BEY?NouIsYTPm|CkN4U_ ziuv>F$4t=q9(LkX(vE7IBPM_Bvdfk@N>|z4`Tp0Wrez+mqkumwcFm>ERk{Pa75cYH zEzQf`Gye2n|8#Zn-jx1nqEN7=Wx~Gg0FEL#Qw>g{wq|9Lnw2?b2lHlSV|y1C2CBOb z;C-Uv+Cm5L2HR$3OC7*R2CBOb;0CIfI)GoeKB(UG1iH?+xdHWR!?CyAV7=@0yFNd4 z*XW6Z0g(t|3693SKrAYrYIURp2!-N=Y9HKGyd`!OR6C#=C}pK7Y9?|uNOCNR^X@g> zQKqSD#E?$&`p0_^%}nK90l+4@w?_AFDKVIdk+>=Vwm;8MFWN0#8FhZ3;J;H=F|I}y!x5iEddOki4;z_b&#!y5_ix5khB#YVzC)MbYk*dAS9 z0({Lnn6`VRyL!%LfGcM;Aya*Zbd)o{B(_HD0Q~IV10;!GU0)Oe*pEQtt_Z3fWbp9| z)~L+E**zHa*(-efow57(e}9;2s@p>fuuQe67^sFQrY2>98&cLPC;IB)yq@~jqki8An0{m(OrKu{(?JSs!Ss*~NULbA^sX@N zDVP=^Hy%ehAOgtE$C})9Y^Kkqe?!emd%xIttV)>~QNQzbYCPtma1;$Tbq8~Y+=9Rr zp!49yc(nbmCm(s!L-8uCTEg8qSYD)Ko&l=6T1b3Vz6<`%m{}wxyd-9bUmV#OS~pE+ zH|WeZnY|L|(`lbtq=6f#UIH46z~kJ<{xod=(JQ-_p>H98-39!L%g1pT<#M?EAAF&H z{6$mHm_Y%x^9rmhRy}kL7|=F>q*)w=q(`a~knTZ|&oZ_NU?+-q07TE#4H!56ypYNU zY(K3VX~<+PMtzDkm;ZgqLH>7VuAD%$*{8U*5q8bAbU_6?1p(Kn%nxabq$}?E2&Q)) zI{CGK&@jJZ=~ideChJ8)4?4hKAhWaVeDbSe508HzTs6@3rO48BXVV-qcg#r?$}$Js z-2vC4=o&6F&2Eob>bqmZP@{n7JF9;kfPNsCTP=ZVTxnEh!VqqMX!5zg{@(FtzS$=r zEq=MK8k~1bEZr>yy>v*3bs?_8NXfS(1bLkFs@1Gs@| zeI@R+pqe{SZSR6dH}UJ!95*qbKCN^2n_yv$ZlETXZj9=^p7}HYToIQw6*5f0dsBdO z1rrHV4W$d-M_UL0GmSY)0*;jGD1^ibM7yD+)$uwiwOM9k6tjz}HwV*hDf_(EfxBzk zfRt@oq;juI2FR|XdUtkr-e|U3t;X*6C?dF^tDv^6FV3t15J=bSJs0$>d6w zC-apewD4v0*alQT?IvW8tTZ7zqNVGx_)B!K-QG2wvt!2wrn~F0B-IrW=hIsaJ|Iraozj^NLxYT=~Yw~x0w0{xW09|QhcDM9W12I|A z_Sw8|cDHXf!b)Dsgk)Wutb%id<;>mszB9ePmjxwiR8alO*zoWhZU2p+b)IYY*E>6a zTMC=BQQ5D}KKOS#P;E`#7#i1t>OwGqYUf136hV{{kkA8(OkFKT-N)Sdo0ZlL4Yr`V zmzq8@4FRBkWX+Fl|}sV=bp3*Bd8Fx07)S z=2B!{0+r>7^AfO^z%&v9B#Ji*q<>Q<*3A~wcH&C0=3|tlgvN>54h&dB`p0!5jenHC zaNj#7AO2gH!qx9v>edZ6D%R20y)Vk$Hs6iS_wIYkgRt}2`)nVV!+z7W2CD5>y9e#s zI9=9KbvCa~N$|KWbyZt&h*%|5qFFE-1hO@1{`) z7&rq!8AiK^-XDQ9Ws2hzVw&gG5Pp|t_kT7d9kiq=alBN z-1t;draDesnGY5nS5b@(?s;aQ+G7i<=grDGP;J+QYCN!5nXPh!0Qs$sta)#nqa z)^}sM0IDC^#IH9vZbCraeaYU~7xp7(d~rX1ofFk3GpGW$Mi(DUsSg#Er2;;V5-5Np z*LI->A@V|yf&@?KJVnbjz|JKwjZTCznC3W_45rB?Al=a_mu!{xPG^VRX`Q3>tFJN; zSgWIU(w(>yLMz>87qZi2cHZwohYnyY+%b)qq&(gQ{D{q+s5ZL;`~*PO;Ty#1#7Ue( z%IX`q25Ie}p_bi8Elt#pQicOsV6B;u;1Z}#fqLakpnZX4ffiUlg*=u|agQ<(zlN$! z4k^wvo%AwxVEZ8jhbkNT_YKue`=usiYu96K7x{WDpMrYUpuT^+2&OHdXR9wFndR;% zb!u?sfUyJ9n7}kioovi>D*z@Ia0&pN>%jEyOg{bkgE0Qi4or6dbqOf%M)~#1R>o*Hga>i6~hO~G`DozGp)V7kO}b1?l_2Ghj? zm_A&jcw4`MNsXfnrhBD#gA%msI@JQyi@Ff+5Gq1nC)%Qd>GW@!0rbEjmC-K14!3$y z3TWb9oM(zRf@O4^Yy7{Qeds@Y|LoKM1521+g+;4b>9fTe4!u{i()rL!Yo*`$?U8x$ z1}N)Ze&;QR@wieiop+W%HtOE#)ztP2yQ~=i*&MQcsyKM*ul~E>W&?ZX0SEARX&p?P zr1eUwSN+lCz5iyLjTR|=0@!gLR4d3nNdnb{K$P0qA-}x`on*$AAZ1XkVB0{opQaArlt6VwgZZ^u4i!|_ zBDBpyyT_O2pjs*57x+o+x1hTD67lY1={sK%s4iDPwcmj18yhzppq3l?N2g_~n@@np zfY0M9nY!zvTxtb70W>h}DASiUP$hZXM(N6mFURP5&QzZyv14b=`-Zd+zQ2wztg? z>yX3%Bt@E*2*?&~xlDwC>B4hK9Bo6Iz zrR1ezk+elw<|c88xrh`%QXotM1USSt*aow|?OVG0p4@ZJ?Y_OdHxH0Wcm~Ep9o(h6 zzj^QbzT16%_x#T9n79j`Mx4J8L@$8clsTg zf2Ug8m3~ql@824M4G}Tsv6c#=!`OmRFfA=uBMw5zk!l6gL|QZ7kpdtoNi zet9fsGSYGqUcgmpjE^E@Qi6#e9!m>k>S(l5jcYJX3Z_j2)5b2XCy?{Mu{!&*)5V3i zq3M9>Ui2#3`-0t}{hNb2_JoC0dbI0gCMk9wmJdD5f$jkC1kML)qbHREm4Ip@XDH@V1Hb{)?|boJ>Ua9N_M+5u)Mh{r zOy3JrTilZv1);rq4w%opr!;E?}AvM}Q2b9qbtq%u!WZWrolm8mA(2nTQ0= zh z^YOpo!2CdKMJ6zpsj?MlB>UN>aoM$K6IU)}$w?^x0P>w2s2P^AvTQR%mGKSic*44YcV@B1TQ^!uE6 zAttV+wDQs#p!%Fv8f03vofZ$Q9S>>ECuXM}i+1druZCNK%6ML@fZwj5T2;W=U}%QY zDvf#7zrAzsKj6IT+F7(zx-3=^$ploF!JIWQpnLdFM#T+{s*<*8JUwV*KSnN}3T6aIs{z7DRf5&utI(0|GWpCSIx7x*31CH*fQ&|3McLF? zDphm~3B|D>L`xO7!NPcA#;0SI$#z6IDHZ}W0N4U__tMk(sWlke-i@T$v5O#`4xxFc z*BUA<)?<@$sr~wH`ZqOl-OWQaas?ugQoB)er3t*Xk^arjm=o{8OD>%Qu$5)2OR0Et zF44XzD>2VXo96|xjYcaRkJ$`PCd*(K?QCXoZEZi;{19`}uCMP0I};4e#>Q^2ecasK z!>z6D;HX~?wu^9l2jRMlN$BCk!Jzv2nX~yHD?)ZJMlhWey@%zo+KS%X7e!$tKo6xT zdXt|kFpgl_c`e72lYnVilW47|Z0h<|Fzv{ok6_x836be{cDZ_DlRNAMbYCsRigZW{!dI-L0&>x;R?7Lw;b~ne{L`$#T0q{46@?Vo69D`tV zGvQ<~=n0bnx{ki3Re+4Ro9?9C6$Bv-6)w(OM0#%^&`(Pl(k!lk~%8<{2%4EyZ z)cMpK45~-UU>LLNcg&}r()l6vTYiSr@8?03`fw1EXx=?Az0F`+^6DBe?Jq_!?OR~_ zas#FzFD#BU#X`Y!U7F4WTM0V^GKgThl+sw9`_AAvijT3g=%B(;S)oTzFii@kO{w39 z&lLaR&)vB^_0E#2lb!FOxnfj0ZF6o0d!GUOegND8NyWG^q%GX?k>Dg3;|QeLdK*Fs zK({EPz2|A_$KyC~+EdibCRSDh1`e|1iqD>UDIEX(?~QY)`P3(EIwuAg6R5`7{j1;k z8w!>c04eAhNgo9~+t4THW1m}!{fzs70;*zuZS-yCM~RWyqp8S;1H&V9Y!0oWarKKN z9qON&BmN#dEb`p%A0C}Pnn{p8*QEr5^m|Zi*jR00VwbD>yW)ab2GdSj0(-W&^E>wa zg&%)r2^R{c;caP^@rKbYAN-3U?czJ*MpI;BP)p;kz2VeA=A_4?$JIAY;Ci@SrL!ja zn;m~T=?ZBeDBTaHLIM8^u&EVvG_U$s0r0)SHfbO>8X0We#bIcA*Zw2_>u2^Kc%wm3 z|CLm%tQIOmV$*aesV)+AMI85wQUU_L1*#oUR{`9w5c60jv27S0P1HKmDbjYrJedrXu1hV=MgM#2g8_K`>6EQ9*cd8@j(;X zWinPUrG0)dNj|Rwj{>GCItyT|5iqUdT41wa-j=0;Y9v*vh8j$BOB4)weYUfwlb9H{ zcR)k&wvf&m?158D0woDG$jGKhaWcb(!Q^^wb*=-Zp%k zXMWz)njUAGQ{=!I57rnm4VdOWPy*AI76PV`Na>{-nU=nl$n;YZneKw=`2FpIQB?ws z<#r|)UIaJY`F-4PEP>JkOZgm9gL*hl^VFL&Z9C%JE}h$@wo@+44S+TcB7XU51TX#M z8yTRa8orxD5^Dn0$+l_#2R}al%3rdTm-l;Q4XQ6v1zRc5BEUvCPS_^AcD00vg(@_q z8Ebt!^i-M*tmaeCHJ>_9`P4^HzmHb^zBbk+9YvRg1f~JHV0tNFdgTjTYryof0n-}| zn4UCXIs>OE76feK&T;@v?|pz zkah`s-}`uV*X=8j{WH!3Syd&mb_D{0oOcY6NI{bTC6xXuAE8F4gN^EE=7cRR{Uf5( zM@LR|{%9)r(UkA2w|v);Kw5u}*6)F5o;N-GERJa7=W5jSb5{@@TOYq0=$wm81}Agk zr;e--cD}gt=gbuok6aoHm~K{=fa#Zf_e+a|=4p{JhBF#h?3Aa6@>$H+ms&;b^r1cYC^Sa32B_P45{`tS-If zw|4ISc?UJ9=F=+mLn5e_4Q2xAJ6IxGdmyOJTcCOh-jElNZrY%FTedbt$Z)qtc%b_M`%w8-wW4^}#qI79xtrLu8R7j2vm) z+OlSI^9hMQZfu;f8yk6O_oG>}wzjad*&L_SB}X|q+8GRSG}^HvLL@4K&8-8Hyps`; z&^U}M1wKOr)?h24cH1%&Fs*f$1ypMvwRHdtES)@>J2_cNSRt0MNjC>Dy*6E!fN*^- zHrvZ~STgGXwGr$UJ-|T}N?$7;p_G@BZg@4Q2C&+ft9HumTTmYKY~FhCjA3X9}p zG#{h|09%Q`gRuw^OxKZWF)urS8KD}O&@#;wB@bmJj{8b-{w5tWWT|4`V*{#-9lR2#e*Op{4W0XEEJ7C6BD6)w)|YtE zClRvA)R`JgJHOv6k5w6rV0s*B!m1>^k7KYVg6XC-lPi~~QBld$MU1<{RArD>cHaD%<=5Zfp|oCVReRmoAhHaqg{=~E z-ZN5At-0`kAnRU%GCL49C$#fLE1%l8^Qjx^H_^U1LiHQ2P3pJ)UPmc z*!0O0`eEJ??A;1=V@?G3bsXELt1rL9VP%b7S)Z>$yRbf3#>(rXg|(x(^=sbR$)3gW zp5x7DRbZdnY<4Nwz8&Se7B+S)Y@Q8v#=_*uU>7*}U;*|}Z8z9Xv~8=bzDu>n47avZ zA>(KOZH@$%LxZcQPHqCy&kjT%4WQHf;exnFu?2>}dJ$P#V>U}P3atWaX-REWFt`pz zHrhzqv&HAXqoT#_)PIuD;gRVGEkz&Tr3$7~T$gMF)*aO!F&t(@N(sHNdXRYxT-OT9UDB#@!a8)x3Ew&)GXbK(+mT;_+ekrp_ka+^@dpU+;bS zm%mw@xlPt-1l7oG6k4u0OIkQRDtou2x1zV@% zM%!a7hJ?Y`$*^LyzzHFa$>JDLfLTt#05Rj}bcWV}x7GzC%?U%NIf7Na8)YkrutLeM zgx4MW8cd^+ylTVrIKVh2Yamgx)fq_Q3-%yD+l;X-ET;3+mU=TAOL=l4EZgzUyl=8i`ZvU2@t z0n=RKVW#D=qN2B#@>ruzc`Ownb5b6Qg{uHZu0TWkLh&vln6^aXyfc^%JI70gwi0ljzU`s zXhsvG(_~5VZUsa~kuubrT#KYaSOTiOMyqq$j``Hqu#NplsNcL9c981#wN3p_&%`T( z>9eT)^M=7R!1cgjdXsjIg6UjJWKF{yZ$dDbc0}l@h+ulh%xHm?M5ZBv>3spyF3i;% zSsgWf!Ho+9ZAosxUFF`tX z5>$BXucy*=w|(%AE008L2sW&E9&a-kLM5{*WQkt4mLb z)zTP)>K{@z2*khbM^glB_`Vc3JiPe8UmVfOPI*(=uI!kFk6_PEsI=2yGn(7n&fS>8 zF~{@l+w53J3!BkgY@IIJ4JvRGRyfZ2H7?saRcbnY%+6-#>)h)CMFz$oaTvqTLb15teurv@8n@spgImb&^Bo2Dp2w(gUnH-l-v>!PCfc2Ch8aFP_gg$`V}0zp1AYa{~gRZX~2%(P1B23iSV z(=-8nm^~Q4^j#8}h5?vH(^af?o1xz*ddCRTh3i^in!u%KS-%E#a@GempmmHx5Z<2e zMWct7j;Hb-YQz5UwbQ(7Xtp#2)hT)%0QDc&d}TemU z1W@@Hwbak4($6SZ4&G!AP(DjqY8~UO5^8_Sr!Gylv`s$scn*+_b}^@2)O_j!{j5j* zK2}q|&)3xNYqd7DIe0pi$4X#&jtr*x8MsNOO~o4w5loM&%c51_`2Cw^M!_^hFb%j0 z{fU6-rGRPgD*@BFfa#@0SQtY_KBuYNZx`sSG7TK0&lCZ)wlq}MFgpP%-1ocd|9bv= z|I1n0{s~Mf_9;qqU|s1hz{R(O_WodZ=&=`l?KL5q^yc6IU#G``R0y!X2Gp{;PX~it z9S_9=hdK$=1-K+_`gZ};^qS;+r`J!<#qMiM`Mr}N@7vb%|2Wt!=1@k=yn5ozd-Tnl z9Ifmqn6s4~Vdcb65zxGJIfH5{fO8KXZlci;jevc=WB1v zk@U7iv9y*2t5rw5+&?4DTNqo8RA1yEP(8|Y<9Xy)XauhqM6aNF<_#*S1_9L@3aT6W z_sUlhRL?u0+WX4~M5=RMtIyM*(6jxyrU3P`&y^Na(Xl~PdZSv3;L%2~Np;b3oy{uP zlnPOi^)xpG^DuWIj2Zl{kj>MjVA>zSj(oXu$Os$8DmEFY2gX-KTwe7YDLcY5`j8L^6+=lzwwjb7= zF&=0TuZ46@Gp^Oa>wX*DlNzOeU(TWUZ<%;4wN-(=LGb9XvaTX)uoCW(wuC~1u?naS zIoVm2bHzbp)5u3oT2t7OXE0^8^}72mrCBO;;!H%4?JJ>y*EXW1$r&`$%8Y0?9N&|3 z$6=mL&)df9cpSmC_s*16i4~nO-tQj{sv%b=Ar{Yn{)m*(6>9q)Ekd?=fTFkOo4tVP zp`v#|OH@T~&|0@nKRXlpo^%J-fWew(3KEHCTZJ(xwJPQ??N#&jFE3C3O$O6;2&T2) z2E^|Zr=92Ifx7wVZ85S$4VcCzaz<@OTCKO{Y^(2@wdHj#T|0E(4>moXUZdl{V?9o- zS~{;Y@0#mUq#E^DI@b`3JV^u%d6VH?hUXG^ZdTwMMFCZI9dvEuisG3a~D6!Yt-fJMv6X)(AB?iMkT?sNW#e?~YpkwN;z?C^ksm z5+OTpZoDx!3Z@_D^(JcG#ae|kT0}6tY{0aw_E5oe*#grGL;=%P3rw$&1WZ>EOvgIn z5Uc^yy7pWPOy{7RTTJCYE^)sOMb6UoZ zZMbnJk+GY!4!myWy^p|d_CyIy+7x?g@w-2nTL#o(;-@&fv||O;5~-fL0H7IE2g}{I zTMy^0)2^L>u4C<$Lx9DCOC=1)Mf@8MU0<<2a!UC=qO0Y9L~5iQ~2N z_NMix1IV^!9d^wc%#m$9*sTJtcLiJ@3+-`uFaqm~O$o}hCIwit9ToY7BiHJ452oP= zAZ=2m8SbCyRhT(v;-*8e2Q}J%?4p6KhfR3!AZ*-gVPiM6I|kMtKv>%g_DzJ@!xpBG zAWR;!FnK(*mk`EJA#84kbI)1GcM$U3VEo*?WV3ABW^OxNv#@Tmu#?HIwc|Z&M@vZ& zu+ze#od*kT9t@W@AKi4$2#<(BTE)@YHx%12-VXL>0PH`_MKODP=|yrbACwk-Q@|9X zLDMHNCbhO-hXsR42b$v+Nv}1e=k!xD_;~BJupN}5*0BVJ#T-$y#*o`c0e=az({|To zY~K+|AW|6i-!fCP*jmCN&*k3kBd8v=K=nvKbf9^BiQDinXMOCu=Bn?H#e@8IGL3=o)%)G3EA-4d5+Pbw1yh=vg6UE~pOf`i#Yk%*U>dOy5N&}3eCs0eh)|(LFOCTY zGsG*zw44Ip09Vc7TpI`xDZus3gWZ@eFg6`$J{{|tKOAiHG19(~^I&*R1R3}UCE!ia zI2;P9Ylqz!ONA;gV~HrB+M}&Jx|sT6DYQ1USjgst1+WGgJSjL*RTYm?7~e&KF<6So zn1xDeRI_E=hkbN@&Qv(eD4C~H%<{3&=3IZ(^9`$xcwIJQ&CwK)J&C}29RSK|!YKlW zgX$aWl3Fgu#s;q?t@ejw>|Nt}V>Qp#9E;cW0J9(7BMh{D4--sx>~H?e8>Ek% zPyO};s=Lv7p6@bUF8IA4`EvQtAD6Xn4U()=1=UEUvJ7P1S2zky1`4X><(;=$pW2GH zL85*;0o7T|r!J{Nrhaoi^}*C{G{LUL+SG>aND;CCroGp^=}pQdGF_})j9}Uem|h8( zE(Ai-&#* zw02MX`!W>0JVkt(z$oe$vplAW$EaczCy_zi2yjWf8mq2PK`KOF_u zp}h`l2UshxvvqHM z;|4Rj2!n<9(x0_!w7?mi!|N%q27g;b1#a`D10ti z#hWL>PFN2%=I@G~yAijM#gLVAo8i(;tfU0Ev0d7&{G}H&Rjcy12GeY*J`QP} z_$&tKY%qwCYV>;FHNim69fE3XKy^6))vg7qCoNFDD$j-I^5jgMs`uRwbgjN*9gu^d%c`ieJL*z~(IDRIgI zNRt4n*Ny;9K+zk}ftQG*mdEm{=xxhb9!s5i z(YlrO=z@V&CC&64{nY+_f3tw_Z2{YF}*#qSdeil9Qzfm-f@K1bW%hydMB;?6z%iot%9=KbdJq!L`42`Zn15#;c@{ z?+(Ub$I!ruNXq}|{XSKk`MD?P!cC@B)n_X-eWL<$utdG5dP}yDm$VYQEO88#K@t^d zTh`R?U?$(Obv`vyzsIqZ)`YA%nEL%dbQJ87Ao^-plSixQClN9c;S?}E5*i=CMW{CB zW&<{0N|{*$0HJ&fm?i)7=M!~y+-5IP^4(ryByh$R|j`~h= zo%7s{2s?lQZ5!Fr_dbDQu}I$>tnD-(fpr4agLS3Hu({q3ewX3vr}U8%pZP(UoIeKc z5`n#EAVk;!2HVBMKfrm@7FGg`oK;rW3|8W=@G*1P{gFcvNa(z%}AK^kjoh-P=qANhsfT|V@K z4pLsVvHZSkF119ixo;&ZEkOYV)zpA$8~SZfJ?emJxFV=tvG3IZ)fIzk(c7RJR14Dy zAcE@WTTti^@^du<>cc5CM@Oa4bfVJ7W3Ke(CWGlhmF&WNUhdi{3m*B)nEML70O=ix zR&wN#oiFE=9xUdy{D+MongN!BQo&fX>DwcA+;KGCy?EVU>Rwn zksgQom`T7rT?-2G4K(1~4mSi0ikh!%K1ie)#VW+;ggFc*k?M+%TM$8qRL?I*LPpa} zX~Qy#;lN59bj_vRiyIod7Da?*j+VAVe;Ew8mAPzL7)Sf)=KE;#Ft=c#t1#y)bo&)< z&Q1wUtV0@utsV%HP*kKJ_yZA$#}`5whKb zMaZZYAuB|L461F*B4oZ%^adQq2xXobZi8`KA_$l^nujY97>b{3y zT0Z!5*7CitLTG6EfUY!%P#6Q1yhP@-rZI!MQu3)6#)3CUgy7lXSm0XBr*@ti>UT~a z8|wFLg=-z^w=-9$O$}E=l=|p3H_V%6ir)1;iI5$Gi?CW3XNjFAiAb!XqW3ZHjDqPo zZqSY>>rY023Z{4X91;3!gK3ad7!oj@MKFzIEk!Wx$_g1w*Lc)&zXZ!=(;oL1f2ys3 zizzSvFfgs{EdcJflknK|{EL`&8R(a<>5BgtNDeFY9BDeb z*kd-S1Ynn;b>q1NCfG()iscbp&&V34i8HXS=qX{0%={8d&%oL#us$|NuD}Ar(~;c4&0BSm5qbz!r#b1nvU%l70KOcL~=b>5s|dS^RgK+ z3GIX)MUMVg(~FoGm6w7QxJ5f+8jZeS*Qm0`{XDe%elsI)9@=2y4|xI6YwnUprZqZk zKjcCaD6;aJLjs4lJm zs%ITgy)U48GFzI;2cw0lLG|X=X|vS<)jOC#^{MAUQ0VIZ!EXb_8~bxzfujotMy0)i z=@gZoR2aT6>@?U3Ia7?euI<8R-eWeZ&~l%=I0iNcYjXk65}8Z@nk<_ouLhL@Ji8|V z4qd^{o)s`iB$RETq4KqsaD;?S$q>{U1)u;@Xx>;=)*@M8aEX<1;I$$~k5cVYzaJ$| zeX8OZni~%GZeT`?| z2n7oDoyVcgG-54LDvJdgq49!%76Ia!1G%DM$V;7aLlP@%Nak;hR4)njr(p;S;^38-FQ&jeJH z&y0X-{_%MfDLV}*pIU#eoqX#5ND;ElY$!t3QuHpy`$FH%qoVhuQS`3Ns40)7s=^SB z9ecE7ZB)qAWwS!7PJOfSa^LdwcRgKg|5s>C2TUiCpxE;9lUy1j9b<)07CK5`nwpIz zYs693Yh_GB&^(L=4=igyt{V2n7AkPT?9lZ3-gOBeR|zn5B4*lm1K=Rzfg_`17=Y?* zH42gYAJk(){ch({4{N-bR#}mG*xdN^;=Vs?BTL7Y9sz<$&KLw!kunH2a^7fpCKaSZ zx57!RPmKgkKD7tiP`?2tkPG#@R58I0_4}HuO?}9k`@_(wY*F>{rZ;nOlBTpUZ7}V| z9GNZzOlMS>)xJRn)2k@RX~-y;&HznTqJn8v(C3!HG<3jpDPS5JFkLoa`Xh_GfBI?K ze)E8}z^&$%!#lL$P>}AR4 z?f?%JJ4}@L9PPe^f_)mBW1&D9N*r;ED`D1+NWiwuECXu=P`Rts!1wJqTcV*tBG#j9 zC6!J@9bDdqRj{}r?U#1V@1dhTocW7(ofKSW6R+TUvV$I$=6D3w6L1k&ml0U+w}ACi zu?*!7m!VWpeLdGdbEz=daE%^1er`9C)6Wo0^D{qVKpg}E0T@X8a(4{>%`^WL z@_V2_`l+bza{>9il1M+NCr(Cq-PD=mkwM8Ks#`t)Xkk(^po)I02+Qq@ZzQztY{zc6 zr9`F2jw#*|L{lLkI=6+2UzH_O$gRVb8*ARZvM}w!@%cFve9Uf{n=Wp;8-Aw?Y!8qA zs(Gj$I|q;d%KM-^eYQSN*N`wfVxWgS_tOSdhmkehU{33&71d71+N=|{wjbR-ufLhB zbL8u9-EiXyy0r0^1m@b!;Tf2%GClWKc{4ux6rHrGXg!S)O9mKJe`x=!KPRb-&1PhQ z-AHw*pgQUT)u1{bfa>BPBLJN|ANR}o_*@nacO`!1-K=Lv&q$)}c|vsi=b zYa~tTn)|_THN`vGFeYa_z7#lDowvb3}ushox5HbyXQFb4~?z{giH3X1ILVNQgGBc$;`WieQ( z%G8z$OIji%ifyqK0{R@5RwL40fPwZ=XMK8Ys10 zN@>TsAl|3f=W}(gO%+c<4lUqbyy$ELuq{EIC)3QS;vzu_t78hH*-|bvfY;3kAfp=* z-m0+F3JnOQ7ag})$xWZZcxIQfxslsNutI8Ck1Purg}Iv2obXv&1w;{r0BgC6}=~iD0*9}Odj)wG6KQT z{6ABwV22GR(G;wuN4?O9_p812uPz_|`6hLOT41^-h=eTq^Xs*ux90~XgK6oj02#G` zb#jm;hk6J`-5@IL4~Q67VA?zFIwxke<+;I{O>+rcJ2BshSes7XH6?&Pq@5?neh|^7 z9;i-0VD{9DVf~SlfD)w+_8J1yi&78!YEP9Hf8qiE)XOBtU2~`#1%DtADnGYI87h)b z&0a+w^Qkek%w))7KK0Zuuuc8;Lj7JIK>gk^aO^ZH_4^{Wsoz&uZE7+{=W#x%8+Ea= zg($Uh-ZU$>mKViITFEnTX-3nPL?*mw6@Y;0sW*rt75$q?gk+^_Ei2Fn7y|5qY10DJ zOUwmK*Xb5z1k*;q^zW|j|Dg-C`)B(q@cKO(My6d&i`)q9yR`1RixlsdeEf%l^ZJGq zMe0YmDQzTooL(MNY@2lkJ%F8Bo7%=OJ^xZPjr;B6CPmp~ez4YuX%%h&O4N2gf3EKy`Y(xGrC0j(;Ubj{>Tt`bDsswN+|f^@zOCzeljNPUxkjMyy?F z^BA=rF{^GR#^6h+;8seA&Kam_#8c)7C!T@2my&Di!~na(Ef)CXwKhI)ivXdR&73$vqSfg!Z-$H=D&LV={v=;1F z^JqXdz~yTGdIr@19^0VWP#HlrG@#nHKsAuTu`pVfCL^VN4?*>+0o5dRsufh*ig3&u zsx44Gi=es+#-N%vXBkvOF~=HIr*c~9=h_GgT^m36Ev0xLeS;DzZA~Mso%M@8GesSh zrlqmvIa}>!5&_%XJu8m88Lb2$yM2%4KA{~2TX?kdc`U}qQAZFu43e?adJGUwr7-VN zA4+UnNaL>o-YXhoI)u_*wD!lFdKNR7N01Mf6PXn0Hu6cZ4K zmghZ4`7FC8JA3LxWK`;g43StkZWL6nI-q*3nwxS~;3m^9gE6S?meX=<*AR7v%(D_9 z(>0nz$b4olht`L=$?Uwzt0Y1u(Xy!M4c=Kl+A{|$dMlW=-diJUX^EyxWtW@)0fPu+ zjVgLe`|6q`O{UkuvJdC@MXxF7w z>wE_gR|kPyv8?aNr$}}Cyk?wr&Q;60(d+aYI@kGKaiE8gK*dnRsnXVT1(t4RO8m~6 zMxx(uz-|!OLqN4Lu`g%C?4H#lKc_0}s{9R6B|0jdMvV%Tn)78;HuX|AL759D5G> zCjmNZs_4yNT1EfJnuRd1D#PZoFcInAg@`t;dSIFuOl!J@faz6o0wb7yygGN&L)F>0 zci9T54s09`<{jtaw5$1am294^n{0J!e)~Vp0QVD}S_CVHsR+Z= zrjS$pNw^d?igc~0-|E_%Of=ZY8nUUh?dpv5ujyW!=F+%5p8#`fjMQ3VJ<7N1QO+k9 zU&QyRCa>E5D1qa0o43$Vpfgz#WNd+I_FGcgjK3nN#u%wqFg-_Z^B$;nRGBuY4r`Ow zv!ui_s2&YLwQk1x-1x0rKy`>yLsI^BY}aZ~=&Jw0ZmxvRvIMfLG}i*|rUn_w`T}Og_zDxK2Kn0^Tg;P2;<++L z^)&)w1yp;@4U085Gpy>}cBQaEFmBbEP=k4B=lsAx%^6!tJC=4|+c;($`F(3cTL{or zC1K-B1>fwjOSG#7)pP|=y{n-5cwJ8Gyn&aT7H9t2$fqVF&9f9CJ06{gQbov`^;uM1 z5i(WuCPV@jgEM0fxRl&jgJnqew%D? zy*u=^sxL+w-(j6pz`GJ?BDZ~ z6zhg(2%<#+q0e1mqregY6wrC{O?_&gc?pJlK&5`ukov9p)H_&-2;Le@sStW4g?Xla zCxu~k)~}x0)Wd&gsOs(1!Ks45^}rN87L{Se)=u6umr2eU|KZ{07A|4*TTyK#hdFgM=+gom$g5PASHUH_77IPKa5hE6uj$aTkpDz^c=O0 z)6Uk7X!j#*Vl-G|us?^hLA>dy_xvWTzVUea+cetUrFko;PAMi4?G$3<8cKOC0`1GO&Cq9-7v_W| zssA(u4oWN}PjihtRxw3t<}XEHy%Jzu(2nTXsHTlp%V0psz_Mah@O3Bo#KfCkv~wt^ ze(uBs>8QwbQu2OD1k**#IZa?XMWxpY^x^MZTb~C2JrOOD2`!{_r@kjU@*eSf#qS$O z`ZMT#W-oeG*PflgZycoYbfW5-I76!ddGXuFy9+GwDYXU z;bkGO`bGDCmjY!0)uB}daGk4l9Ky@J^t_f5x z+2;~aZD}q-lp8Hjy|xCt2`ihi45~N$o`7niZDBxZTG46Hb@&Q+f%^TQ3{aDKc3}Fk zR=)K8*rIsL4t!ZY-B7$aDt+U0Ve)Dli*1h;-@Gg0ToYrwlbyR+q?Gc_2fdbL0xGoh zQm~OPLw|`pM!A{ovC}4&Kv^lR5pbqT(?U5enLf2@fHYf%MJ$h{(P(5aT~!JY*-=4t z`UOY_(`Ys6u2bk6pk5wy>=Fc<0}Lc=gVAKC*hx|FlDQpD>O$JQfxmq0Q9Ltx)EpVFsw}3e^C|8KKMAk*qA{ zOB`i;HXD^@ngQmaqk`(3O+mF%zpvta z>cl8{wjyMjH@$1tTVOh`Dulf$NZvFR#zSGOSBJpol|io}WK(d)W=ip!vxv6{~Fbz+X&D*$b5TLQ~R7=cUY^&I>Z6+r4!V5$E)O^eN35^I@;G9owr z-k+2?`=(%TH7OsqAEj=y0>bEm-+tpm#S^!I^#~Oxu(qW}t4o7UONpqesq-d_dmJ2r zLsuY%)=LD3*JXYH_1hV#EAI=eso!h<41#=F-7~LE{oMat;hE{wv8j~mP0?wWs6w!c z7AiKwQHNcjdJCAgV?YMem240$5gANF0@KO{DH6pSc&(M_<=JL1g6UutcEPk4F#SOJ z^lf()5B;J6nsvalQns|;2h+EN_G2++V9N-_`?lYFGu&|ZYg3M7{RyRf>GaGoy*khe zL^~`B?CTkHgan5=1Bu4%!L{eft3d*`axAT-_SzXl>YT3ihLU>ulXt^ofA^mU@uvH9 zp8BaF)KF3#LE6k}f$AH~#=n1Me)4N0T&b96XfrliiWq8+rA6^we9W8Gw5Xgx5?cb* zbziO(c2L3Ky0Sz9xNw&7YY|db*~yZDwfan!Kw3UF9VxK30<5hm$V+6k2G%*LkEX!7 z4E=@ZYWUEK8u2}F<(FRK zUi#~ny1B`!-0fqjxxSix053An zQSzrdYoF42a=lN0J~1+N4wLCI>MEA&m}E2l#ykHcpp=!2X=JygO@`ima0sfY2Gwu{ zPz@1Ovw=MfR8KNzJb2?HsIErLg4nYX$PiEs0;;o$WYd+?gC9IIxf_eFSk>4wBRiKC;0H}SBPHy1Z&mB66WYWel(dIHVwAM z4gzR-m`of72z_EFlTCKy9h4F^MG6+$l9tG#S$T}CRzd?$pxV=lzl*Z-Je`*EJuOA~ z`yw2#RHRIHuzk*s!L>l0c@`pMt`Q+idDBsZtP&BjlsC;922q5J!8C7ZnMTo@9d*xR zc_@^`V0wXB1k)o`^NyClG)6G}&GPJRr&eeFJET+=3n5vW6X7G>MUIi_TR!@ukQaFZ z(uA>tVKQUNz8ff_jbsyNMjos9+LZB#y_yBeOf+ayy+Ob<3mrY7 zRPQj3^`?cwx2m+>wBP5o=M3jfORZ^IHnpaO?U8#k0WbY5m<@e42Gf>6!8BFq)CAi) zvf==vKwQ7bDVPQU({~mR{*r=e(*e`A>p-UYw;K^2v#*!qoR817rMb>)a>5hEJ3cqs z&Tcx#>UXj)3f31U>pA*~&YhSfYL=k0nVce6u^%m|3-@W@I-e{>^omE%z~e#v_|gYH z3ou_KP?ChuI-mmi`Yy#?#>dUt7yrcM)&JH}C4fl4bXA~~fy7D#rcj@GT4_YVQWRJX zMup~8TQ5L*Ol%CC2wiA1r$Bp+pOY&>Sk0~Ba#$-;Evd{}Tq>(;lB8SrD2%r@cMNPPs7@PS_*|!D9L=&k!K6B6 zp*3K7OP_<@XTcOqd&=Z_I3cY(vC>tkbC3*E0gHh3Jwq)QfV!>cq7!Ix$ zvcm$ckwAy|wy&_a{r*d{7r#GkaG6GBJFTH)NZqsxI(<%39Oid_vu1v!_2j$y2Cl!R zTC6eGV~sdU^BB#F_2}LT+=r#?lCR9x{d-b75N69vNXl(b@OyMDWwi+G?WvN8 z?Uk2|HUQO^tL54dR96X9Q;bxT!6B$F#gEFv*y+8UH4l(MHPTYB5kC(sDTa&6->SJW zWf98?eXLRKw{}IO?0P=YUp`0=2wsR%KPP}XMY*0GnC6>PA53e+i}R(YDPLN0G9_Pn z>`^G*eu5r$l-3YTBG3M^wBuloDnp(hHY6Z=OuM0-+nJULz!68CYkDxKX-(=~JK^&o z7>U@JM5av?D$B7Hh0T#ttYW0PLaX#{RSXBEF}pAqBhnV-0Z0PSgjNh-YM^YX7ul_y z;Eu&PPkO$mv_OfXfgWq-+h)3b(6Lo(K)V6~P$L5L?c=F$FBvetc78xC{SLKLEJ9)b4Nnl?$t{{0$HLuTIXnT8e}jSokO2cK`fe zzUOlBA5J*Z-B||D$iNK>(?0gls}8LRRNZ7cCJo zB)~}ZS8;hKQ8EG32po}Iv=qHbzJ@kZoyZ#W3Z~_uze9`luPh$@8ACAZ1L>68uYLS; zq5V~5ZRES_a8uY-p6qSJa}KN%+o^Ax90h1O0nn{|+kj`et^uMhsotltyap)H79(zt zwscsYoJ(hq#GxoI@O`n0n(S3<9x-A0tz7}PkIvX2_3LNJO z@+Utv|LU6^D5Xs|{7Hp%z=+lP)XtIx`F`k2d-AfUQW9Z9{m$Fe@4ZH#tV{j2sw{kL zCsMzixjF>O$Q&J=jzWhu8|E0mN-A8;O;y*M4)Y_@dec_&rd8=RV<1gdMaY5`S%DB* zj$&|YK%6mIZxW#nM*7?gW|DYz6o<5x!Os+@e&`FuH{aC;(+1*+T~RVIx5bg0(0_Mb zTRIEEV}B-mf8GfBY6PwWrt9ZR->LPwwx|Q92Znr|7t=M;0lF<#R>$#HOAdPnIQK*Z zd7K<^ZBz8xrsG2IzVQA}2QdA9CNZ z-v{ItndV(dWLo{+l8*}wonI@LXRWd9zp(})80NN1-&U*r&hAF9*<`bq&JdA`N<#Qg-O<62AB-7xOn2W;BNu6^P3jO+mG^t?~~CP7auDx-xw+23aZurQ6W~VpxRl3 z(17YfK(!@r*o@O?wV@)ILG+=Y10tUj`U0vwpeLtHCR*v{a{$#d%7pQx)Nd8n1Ied8 zf1n=FwNtg`>ixlIdP6!&fGmOO^ICGJ79ZP6VA}hvmoL4O@}(n~&IL?^P;$cn*F>#( zj4rg80gf`>(PN5R5&D3cvzA+Q1%j(AF#Xqo^o=dmc+L_wW2xb%O4B(6!?K}#BPNz3Qr91x5%?+sQSu_Ux!K(zpATXA1YjAd12 zGAKXvtTW9R!qf_Kfw*E~uVdZa{Sv%=?AWa$0l4B4rfpx=8&_ z`P5IEt0#B!=)CDrsTP$d@>aB4inPr5O^a zfH##QLPlgILS}09?pUfPj8aNPFhYZ$+xx~_3tyd7Kn%k&PC75U#rA!{wg^VM8*rjl z^iDuGQA-JubwFl&POj?!ROh=n$R>hiC+i@A*v_~GdQG1Ja-acV=eY08JGL}V{m!`c zH|w!s4mClipQvxpd7tuC9^T70=ojP;kVv(H>C{>fOHM@G;5b+9{O}Xy`5Vxx_?5Lr z3`oa0U}UtYlaNJvvLjCEkWCo@)uQ@MZPo9>aGAuCJWc^Xso!%cQ?n73h2i*BEl}3` z_fKoCW_(6&1rvwI&&2_n`i%3YCE75G^`>*syy>i!H*KlX)QSkKZB&bux0v5wi0?aj z<488HVnEmCdk2f5SuN({GRW+xQ>!1ppJ6zJmZi7W!|}@4?!WC*bApe+z7! zep#>PGbC%#I~CEZbDP!l=fUO|beJLOSc>*WOCUN$n7d4lfuL9eu2b}wtzCaw+HT~m zIQ=v{5u(yNpZZFdfilSLlyQ6We6Z$EnqwdSzWf!x;lS(0eN|!>#XVJ-S%H)@D_b+Y z5H%Q(5nIt{jMzG2ZKYLJaM2_IBw^Zl^>b*hLaVgkv9kEtf65qO%_VIB2`~cd2=Xd3 z%1gTrEXGwbrCVs=8m-n6lzyVXaxx9=L^iwxR1@tR^44tD(P;`TT`*Uw0sY*Hai+e2 z=^H}JEHtlRdc$Ypv#!-(db&{IvB?hZ!4!BiLDHW@b$=g6b7%OyfqZ2pJ#ldH{Tn2Xq0V%Q;(1PP|JF9NvAFev0$2He)sWv^hG61`ise@M${v7weEMTjg+ zvy#_fUl-%%jq@59`VRNfdtPO4`L&F2(aoubPP$@xrgk>RxG#YE>3_s|)$_F8I-6N( z6S_q+?<#etbfCKW25V4lN%doDP+f)oMA%%0heqk(WD5~cQN2~3ZNU|RV9qb6Va0zy?I41BD_%n~|{Ov}y45s9O}Q$BwE1N)!<)4#v?_}lN={r5lr z<>hC8<{Qfg{zR^VTLK_u$Jl#xp^s37F$2m27=;TCr?}y4ez12k3HV$W?ZdEfMpvM8fh>#rY@- zs;fx^)w|d&r^yGz$4pf`f!B5NsiBomeeV@+N@U<_$(vRYvR>Y_ijetU-t@R7 zLN)@&dDD#u89NTO2$|0+i8M;CEUj##=pD>x-lkY1LZ-X4;@F3g{nXCAKf$}YDH7T* z$rFs*+X?JPO{bRf`k5DZ!8G@&pZk@Zh2c&*bXX+XPk`8P3qD0>ljGl3#~(z~^%^?R zOmgNs037Rip6h{M1JL>1Ow(sG>GkXDdXX~)H0?QR*A$j>HXprJY6c@jwdU7Ds>gX) zq*}jwvo9^b@v}gM0%=YYD9eV801_ot`nM%-Dpz6-2EBY|_GF!oX>~=_@0@nTQ6O?s z-i`&zl=^+NK-qH;r5?QI!TFjmZAGWI4IH~DRBzy%H(IcgzR*aEF-eK6BG#L(^QNo# zEHc@uakAJz`eX%6Q-z*LfOHk>ybC3tyl!-mmq)@q<)h#AV0rHC?WlChoyWl@r+ce{ zX;sq)xZw-0gOeZmG02Kht4?cg(}jk@W6lpWL!?d5!;TZ2s!OOHTsAUAwmPNhbS(^X zI;~jO5sz(0tkCQ)LR9**@I)vZB#an}6+(x)J+@WfNGA!)}XqqI8uGlOo&1CC4{v#m`qAs zr>6u|Lpetg=I8!(7h-w_z;lp4eFT_((!h1ZRh_?}i)7+tWBh6n+oNUPJ&$UupJ z%$)Rf*;n02!I(>rv35C#NG#6@!+~1{*!uZ#LJ_yyhORcoS)@E*7kT*W>hI${+x+k>rxg$esxM8N} zq_vjTWglqwDBn7t&TX@3T*|%XY9S$&>`mZSBfajeCiou!xY-ftJQP%i;p~fxhyUJZ z=MTO?Hr7^!lsm?6;o%^0zSXiS4cko-;ypkf{d z2pxhr`73{6{l57p{+oLjpMBT)>WRO!@cZ9g!2Fd9zjynS#bbZ@bIZHley%wG5~n4b zjEIm$)o}sQV35bohYtB*@mo2dRi?3tPA>F-tx1vLj+xfY0?6wek+jhC(`t}@Gq2!V zP3D_9+Zq?g&vAc9Cx>7P+|!N2djZgv$Y6XQG+OU%bHfgE4#|Ff{-qx~TR!q%H@UCI zw4C!6Snub_5;XG${Mti{FTUrI#TQ?xIcHw0wNQ*s3uTT?zbnMYbu7`FlJ?N}6;4CH z2<^o02yF(d1?D3adGJ(3P@Nf7{@xK#Em7Oc8{pS-jpA0@x}#k@hzhD}>P&8~f>K(Y zb$jK!X^oP#Q!>_idDEqckZng1vi&A+TI87rB4oSqv7dyQnt$iT z;eDN+mpoWi{oV)$2b*DwB4u-0z54Tuum6ZRb?77AxD=-!!AeUaCaGd|5E&&(`7Y3A zM^V3>@pWx#uL5PN`n_Y0$0&8bHuZDtw8N3YXeVqGYRZIK>b=_7Uqq(qDb<@z>rId4 zUTY9z-tdBYgvwG}rS-`Y; z#jU9UbfSBU^Y~9#0Y3D%04CwPaq9=)4A+Oedu#g9pl*3A?B+tN6D<8C3e*L{a7gW1 zKcrO;YeC2IR0o@Boa)vZZ3~Z4ocEslBD!?uy&s0{5S6x2gMgM+Nw+MI9_Kl2I{f=4N ze&1SCe)xh(uZ z{YY`{XBku*iYy`PF_V6Uo=W))`54+liCl$2zL#q$Esb1{vx=V!shk$E2=5Y;NZA~7 z%7objdjL5Hh5XXY)-q;5$#Z7Q?+SCcm3GvxS_4;S#hPp52mj#F=~qCz&a?oFL%?)# z1u$K7z_b%beImI6J91;UWW{M15r~95G@#kY&1f20RgNuXJeHcAN_lE_dIfZA{bQ{= z9Skd>S3SJ=^bdb^|D*5TteSCXQJr}?N2YmqIa0gj_qLuF z10g~Us$0Oh2Fl54R-meLdS1F|H8%=~b3n;?2R7-eVKN!(xfGA5J_x-!IoEovN#HxS zG%8YU-`+7aEuhYQneql9f@&ZPeR)re^wkNtZ+Z8h+ocQN-~4T0T7Wr@O>3SYwmfg7 zO%W7YJGJ=zfB5k7%ike+W5Fg=swfVg#rt&AduS`RYpNI z2&i@fs&~xD*UI0S;nFplPkj;n#Z1a+$xUfFN4O#8qxid%NZA!Y?bT3kI;roAQ$NU? zp2WQAMud!5giIramH;OiAVxfgWUz26q?QO7kScns2w92F>ZX-Gf2B-aBSHq?@eEzO z;j61B{)b*!o;H|H{a+7uhmLOuIn$eu-qv^G8*?2c&*X?Fx>+BH9t@_j2THMCk3#@l zueo%NSZ`jfy*@kh5Nx=%+rT@4YGYDVJw>ad^&{^3J9bo;(|cfKoE#?ItZ>U5>`4Yw z1M2q>SjV|1s!KoqRJna4zZ@c20dWwS31CnG9`{Q$uEZ>EisqE^@jX?hrhdyt*Qhk( zIY2g2s`7*`bOg$n`c1*$_>PRP27$7J|Gk%hB{j zhtPB)Eiz{}V{PfT>iotdx56zS`7dF5;W|K5pW6n`5UeQ|mF55-Ydg~bhenSusR5_w zCsBu9jXiNe1 zF;;ahg&ig$t6YniD3}Bf05i8lXG;tNiF_KVNnU8$MKmiLR}0;wjsVcmj`U|x2|)Cq z!Hyhu4F^8lNTajmXcu8V6$gII`J1vH7iQ|Mq3LDMV{s^793g>S8q zXtGDz_qdn-%QcfdmewUCP#O(846kIczl5hkqW<=T|Za5q9ql#eOlP$?e zHHRYJ`&}Ka&J|Q=f~V#Z7|O;Z`P3CHner`|YgV2|?{y;=DC%6D=x%Vm5T*V$1L~ul zg;a7!qg^VpQVWo&QgEs<-KKfhO5O=fF9b|iv~R|tRn^j^P`z`ZKI}`YU|GdjG)lb^ zAe{locp~5`Qo19M7Hj4TyItIS+r4`q_}iDt(|_4OHEk~n14)RdcESPt*Bs5Zf#RP9q(BB zw@d`>!*jJy+9y&6IgU~O-vDX7F<~jE$dppf5GaCbu?iorPXFP{)y3CgCnt|mG+JrA zX}<5YQynpBMXHI`?qA&V4<26L`yGxzXfWcS>t`->xiL}PoQ$PpV$`}1s+at55m3Dp zP@RpeaUL*=l*t2BMar1Ym1#b;?DXwvK6P2=qbT(|F*o$*D5~jmpEs>K2dcjR^nrQP zRiK=5-ZbaMjf6dt@}@BZEJR^n#Q{f5rLWl{9TBoJijXBmZxPwCVA~>O`?Og9{Qjw* z2cnrtQDkXt|H1Tk68(7N(UU2+x?f$9XT(-=CSUC&KpS@JIZTgkzRbCzN&$NCg?xi-CC4`d?&OafrK zF4Pi60Lhodx3(OVx`noxTKRkS#pS8DS)mk?fl3_%C(c6^4N%ogOJwTz7`*Y|8|rs1 zQEjEOt+5jtqtrPR^4(@oJ*oxD)>;B(bc8_JbN@4>n8xVzG1eCGyN2t$d&=avY&K6b zp^{c(cG!1<$tJU^dguGbc%gcWRbVA=I&-Be#DcCtq9x`^`4%v3$XblJ_Hnv&>6v1J0ky!iMqu#%V0Y*}`uNvg126f+kBIP?t!uIl?&qHS!*X@hj~1n9u}N$R zvGmfSi~XBjDLWWu?z^MAmXHwN%DXv9e6A z=Qe_BWKmRZ$vSJ$kqEF_WBE16=A>X-Q`ZgZ^D>M91YDa;O4->w<73`x%8t^&xj)iW zotV}G;#YaF@_n>&pI1034~_)iP35i6kYptf94i12y#Y{Hlm zc7Tej#!`1n%Y7g(Rb=WYv?-TpBb6V*I75v}>&D8`W_4aYRJN|FVnW|?belL&x=5)7 z9Oag3G*aI18!?3#1Ej?;XnLXBPnT3)h4$M!v;KWO^HP2RNjlmD6g1*M%I1gc}3HUcB4RqwemN5UZct+vED>R69~Sl#CIiJgI$=-*vH$DQn0{3O8t%-yl0v<_(GKW z+XATRC?T>`zwgFWZoo$ey^N)?)+FLp;ba!UG^@3Gr;d69rde!7!8EqPbf(GpCfKLN_k3<~?;Dl+y^`+%l%Nqf2(496?IN%)ZP8G_MfE$Az>S$i>bLC) zl=-nUzOGH}uOv|R*fS6)BlB%i_wJ9O$=BR+($>$&+0;p8fxW#MWEEjP&WwkhM%8-+ z02p(oeHcqinr0D(jhIcHH!YaQstB1S6BYG6?!aR0vx`&zGj;1sr;QXHM=)(9GL2hC z(*Mdd|QNVR9X{NwPbEPQ?m7!9=4OS{N#bXF#@*1J8s?aPXYOQMeBqi$z zxQ`a4^_GMdj=YJCF*h@|1#0A4jn^N!g)Kn^J{cHt{;#UbF9lS4a>5|-@~rd%s!P9% zQ<%cougnYpe57|%xk9Kx^=2@-WB|^6yKBaqBSdvII_+%))1ejc?~H z^K#sJ;7{0>{>x*SKisLb(bN6GE;YLW#oM2{2cG_CpJ=W#dR})Or#4x`Bmq4}>3E0I z-6|bx5)e;}tfb*kw{1W^qt)ZkLBJ=!Qe2rAZaH|YZ#L58hy(VrRvURnAG(eQ* zxBdJF{_XBPtX+X}w+3bHB|5lhV<14coR-!*S0HU1W2LC=B)+aS6)2waO+NJ=!rn~k zQ+t0d2847Y_n5Dv)GqpjiP7}}i2fD>>LUO^YtA<1v7lWDzm7~3NA&k#x!G7)T`CaeYTU}l!B1@LyXHPb_ z-T;(Xk^W9LrV8XMgQYNJ7*s2f07XTSTM*~KR;v6B0Koawo+O`IsNd@VFrAhS^_!T+ zCe&{!rFBF;%5z;J>+pKha8Ta#ba6=D^jzrho>JcQI5Q~qOeHrxZf;qqqb;gb*%l!~ zE#IRLj$jD(&b@E`z;?Cx{+^<@nrS_ZHc6@8Kq5l+(og;wQKQ!5!(C-Fj7-;}BR!@= zkFG{K4?qJjopO=YupdDdEZkkckV<^D&QnV?@U&jzwL|bt&}FMoUXxxWH%n)7i^=eZ(x$OY5GF_-l>-B20$Wc1}bq3<@->I z5KBY-&NOW&>R~KIp`QU{q<%L7Wo0c;w!boCh~+^J5-7W_7AUjNxj@+!op^tq%hO3I zA@WX2@_5NJ-37VNOxc0o2W4*YnjL{`H0SbuiHdMd(G>?P(~@IIO6^7>Tkskz4cgLU znMBA${O03}``%Gdd8=(JdK>9?74_e$VA^aM{_F$A`%NlTXAWW-^=OsJ2J8qo6zobR z8JoHOCQq`?dhKqe4cQ&)h$n|z`^msZ18JA{pN7-F{I4Vr6e$7mHi*!9>at->do$X@ zc+2ekkz2QZ^R?f2(eG*+RB3Ev4p^_LVi}v186Bua|MpM+&fdrW>TmCT@~?hj{<$A`X!XbmW_FdJsZ+U@ zS+neWu@I8av{t;!D^p|wss%hMn68YryQcIWM*^y=Fb-{1@#`3061tP^)9YT#)+wl7%CoQr(>XZV)GPa7I$Po_x2DJ#OsfxDK_$xRwFsQ4 ztr5GQE10%S`>uqNFH6fVQ5XazS+FTT9e&GA=eg5n4)Ia(V z(B7f}$~Y7Q?5_Vr>rQEq?UX7#J}6sd+SLGt_mN@AEVW)03~ke~mVly3&(O`&w`!S5 z^+lAyC1PdWv>DR~lto`YYE)eIiy!>p&R5<+V9=tnIwACtz`6*k(V}W!fKW9XkunP^ z0IN7@B|%6@lg*$-{U)i3QH*zSLYZL`fnAbZ>TZ*fX8_qU$%ZBjSpgWbq< zfg3<5Y(n+!(nmROdR0}py}L4nDkH`^(}nD$h{F)UGzz#e8tw80+61PX-PBB42H`4h zq~bP}(wGROHL><-9_vQ4m418e?&7!J{>19{{~nm)`qm=s(L_NJ1IhgV&)&6$+Hqay zwPw$pd+wF>vSO>UB}+}y$B*I`;*^#`aFb91ZgER6p{dei1NRm4dwJ0!6r$Fij)dR*yVUETAVGqYFrT5Hd&c^q*GBsYJ| zWw9T#kC>x5d-nR)<6EXUw#o?*5cuKq#rGbZ!F-vmdJQlwmL>UY&l8M*<}s5#baFUN zK{cW=ZJT-4wmy2Cjgi#I$t=8^u>KsxL*MSHnj@P#*A2bxc)bj4#}}`b3e(t5^+tZP zIQv@&erO7|c@GyB#0O9yeLVEP6l8BpX}9qCCa6XP0Dthg@pGTzgJ4)_s1+2Ygn=VJ z2j`s&-3;PyD99i$1XR16!JvX_KPyr5sfURtW&TbhNm(=WdtPoPRVgj6Wwg}NSA~B2 zOR*FIY|EOs1EJnGtv9_t=1mt?Z#uN;!o2B$?9EvMzL0Yz$@nu`u7|vL++xg|PPs4M zM-DgR7S-As6-7r%M#dy$=ZdS3Bnt`1v^7R=4z1Ghp#bhU6xr6d4sQ_~+urROs-PRi zLH6&7@I=e71ohYyc3lgy)aDFKW8A;yZI;D7&}^W3@q=5u)^&_x*t}HmPENpk=cV`#No0d zNr_TpGYJt{x|B-JGS3Y)PcJk4uCQtwU|BRpdr~jXv z_=hva=|6vEe&&+_NdLvz;^n_QGk^K7gM8}r{LJ5+p1=IJm&+?3zFJ;;-#TqPxK8U2 z1^I(@y8ixabo~RN{ow2K@BZCarq6%&-!}jAv&Xmo`@={@9d#7JpY#jL>%3|P)ky@{ z?C#D&n+ed=2ol!qhU9|eNaV!ewTr@;$w2y+AZ&!*+smW=5qql%x7T06LeCjYdxyKl zJ3T?7l!d>8i0AJm-_bFcR^nXtKF2nNRKwzh#aoTdnOEII^V2<6bf)n6whc zkcxx~uMw8y#RH$dTcS$z{Yb{ZxRU=BDutP|R_QvQ7*6A|Q2aR`R@!9xB8Lb~**{ps( zn0luLOz-s)F2f!#X-i^O(p)U>OBBY#3@b35k&}n-BbZKMf&zZhndb8Jz_b=S_vD;< zz6$k-5eR?=nhAJjmdiBsAzI?THCuhh^OGk&Gc7mnZF!r-p+Ynlk@%R1O&yH#QbG5QWz6qK-C5FgA(Q(jnEG%CNvZn>0RmegV zQThM{%RL&>wTaTo{v^xnVxVGQJ%(<~i0RWIWcqY02}_vLF=e-}>a$^3t)F z^6wf6S&z(vRQ6URWU@xUbR;2bdZs)3vp>eZQOm-$S-K(DCidB8+XuUgA1eKDrx3!; z0XI;3e_zVyU zuK649ezmx8jFmqI!vg$@80sp^+o9j!K$ZC*yl0mOtnd}Mt0pL;c5Uk6mJyVd#R7t| zZ(*09Y^S``{k?e*Bwur18a>n_+!a}nmnqirRWGiFxI>9-L`b{>nG`&x>^02HIG65$rZ%`XAl)Pqifh`QFjL;CZ`{J}*+PrNv((CU&dkLB_&LA@x!Bk_r>t6r zaVDs=y!NdYh?d5bA7+`*{Ky36N2Y#$WK6TWra>l@hc-Vt@w1~-pC6mj{Md|UKg}{# zdGic{(ClY&KYa_JU+(cm1VM8W*!{FyohQ3qk)ROzL)ZPr!~eedx&L@!a`LTGD?S3i z+K3~0)zXS*S~w0!`3;JU1Y8yaN|u)9Qc;5#RQnu906;D8^xn|kP=YdO)usM%)x*V3 z--I@dbv)i5Q5y5V*VT|N?;1)5OAd>{M8LFD&vevV%eqB^L`73D*wc?03i%jFnj$fA zKZ>!RVp&N6)1-Ot45W!%t;Yb$I_G#DC}^(0G`HZTL>4Amw>sh6=m@3<#Nb$TWSNst zaW77f8elu&{ZSBIgJ~};?pmcI2!cln;+PB)T>i_+fiJ%~*|VAgO;OT!OQ`n@N23+s`O526Qh^ni&S(_FW+rNZXYUs%t2cDO zw3l*JPAqm1L%fx8o?Kcem~vs9#hjs0zP|gJ$$$Ov_lws)K~UVDn1X0t89R8@^7QdA zJ_&%>S1e7i-lQ8e`Neav@sD>;nLt5lb0pocS z8Q=c!ufy>00Ru?CgyN~jy=Wo%L9l8o_Gd)tZ_(Dfo}Hci9r1oS2*L`cSb2GcypVjF zNLYh}SXGe_DGJkYNlw@jF$F&0)I(H)gqU()SihG>p|8K?Am*jslOfbz>NFnEhj*Yr zKH>KJHtq2o5NQt0?ge?%Ma-M7LcLc8qBv;Yw1mYs^QJu(b5`o7NtHM4LdO$GSfh6Z z_l<-sQ4+FK)7L+W1Pv0h?ta9Y(c2x>{+nL72ll=43xG9Ah?Z0ZLmL~jX_J7g5$>zkTBI&I zN7Ae3h@ZjRU~pr%jQgSA$n$+cg0JW2{=`9=DC>983jNkRdu~fz4u$4%5=+kSQ^y{l zqFI}IX_5>k4w;}#n1#tFWs9I})F3F!f@~kowzGMg>ZRUOhm}r6+0oF_6ej>6@1uc3 z^@rr(s3MEfygALqb>f}RViX9*5?K(0G=EaO9_NdVgJBHZNm@rt;qT44I;j(pN!LA!xlTt#9*- z1#LaS!c;Ji{?IG)SO58oqc8p`q=f)Muin)Ns-Xp{8I;Z0V+#tx22{vz5{3YN=ukj) zxtWN8izZs4>XyVxXaVkIsUGZ4?XQ8frle0$!T(6}rk8^Zc{~I*;>pseAIukk>6Ahn zxqdL!R>^Y6ig=-kt)xNAv&?#cTJU&>pAaZ@m6x{5*~YzBvCM(CKz+4=UQb3 zfY*ydNm$>bV`)UAeHZ=Ov5S7==oNqMuFK`dU6*P7$Yr>G*CoGkc+GDfzEobn^9tQK ze3>@yT%)Z!FVf~6Yc#pz8jTOFK@dOssZBq<^%$+ZdJi3VVg=kflI*Fjj%$&ORMyw# z7uJ}gpb4I}Z~N2ug=(>V(bB2=hBT83kS}uNP-8!KokRw@n^9Mm?upQJ5Y=rqAHW@} z?|_4WtjtBSGUPMzQS9zPOEV=SUA!_;5>;}I*TE;1IPhAhY<0@S7u2NtEiR%VNozm z4qzsE9mIW7tDOLB$NehoEl*C4zxuAH^Jg9#l{bDvH)!|JLEEU@?nCv4eI|Ou9yB5X z?B;Euwk`tObAIFA{7^AWD#DRg?sPj}+I7IRy%3_ZkJ>_$?5N{W0&TlsS?7(BI0|%# z#_R|)g~6=b#hcausT-=U>zdzd1>9BsuKJxdlrsZLzUeRgCP}Eb?*Jw2)G9T@!fp56 z0|(xEcgWMbU%Vm?umaT@0=~Dau%n21TU4$TYma<&^3t!V!G-V5p&n8m2?&J>SPmOP zxve-p+FD3C(Q<HkLG{^%kSGQ`er_R~S$uD`!w2&cO3)Y~e4gPM&PV_CJd!-j1}sJ=(p_Ptro-NOG! zw120PHh8x2V&j$F1@UrREb$s`AG5yzL|f>#vupNlAT&doilv>X)bnUY#wL4e>)nv% zOPn*NbNhlk*720fx_;k-zwLjgFG=Wk(h2=`b)LN{noi#HY6N3(P@*dGq~WH*ESzGO zpln4H;0+}x+db|PlG&Q zgaBsoyepY-u?T}AL2evL{w;SfD8IW_r)NG1NwTH% zUx#(rkzTVu^JH(8H{SdB#^ayny_lxn6At50UlF$RG1ueCte*gb}U+3;M`>eIkS!eHke!8X# zy5*_9&0;^!zE}6Z_wKXTw;tbGC|HJW$~tV}*3CMJ(V!Q|*qA8L0oUio!neHurW>9E z@FHb92kglQQ#PLI3IAN4nmlpgx5f`#eb4&cx7;`StH1Y^@s~dS7svnncfK+) zH$LfJ{hLp?m*4TYd-YeJaEGpc!X3Q+JAUqK^A|tx5WRBq9Og@@K?%E}4<%Bv0o4bD zs7#|M8=eF3?Z%|K`QC&aOy{}Xohf0KG_otvP1BN-F_9u7kBdgf*XL}l$jZKS6Q7m* z{7-rLOss#4E}Vnv=Vu2$e2)j!Jpzjo-e8Lss2*5{wO(6|L3pJ&SAQPzsSBDjhH@cI z&-TfT0AN5fc9sAvvXheyxyxQ$I48Fpk@E=-WGYC~;^{o6aXFRtD7yZhb#j}o{giwHuamxU&(cV(}5rOi!pt(f#+_f6M9vDjdcY!d#aLWxq3u(Ibo*!hkteIK|K%Q=6>pj!XCmq{o%ZcZ3zLyIg* z^!EJphadal?B&-Rl8~u6ppkybIfddC17l%|64q84tWyc5!MYc`)K&CEIS1ng1rA{W zT(DR#vX{EPDUI}|G_Ts79NHOqs84R_3~Kj>2)p|THQ?7!?`EGaQXJ}Ckg$6926d<@ z=gP5>VdlgLfq~r3%?uitBG|IFx}zah+K(A|c^q9MY4cKYq~jAM`02`cmIyYE8Ba$cj1I5dzy8f@zHt1@zw^h(KL7dePQLpG z`(`hE@=%rMK0o~a@qGQN360-0rOD6v_Kh=`ym3n7pY?LdjK&vFD}nJvzJ0?4Mi=__ zLci{3rZl?15VY8+6(DLvB}AM!9C_*dIQ0bQz%u3_Am!m9pnfw)SsBQfShIC~?Hf

g>rf)((Jy?iT5l3Yawj}w0_RCrhhV#b$-FslmtCzs`cU&O=IKB}jKvBl8 zy3w2WZ9jItlq3L*4^#!;pkP`zyOsxt^OUnvSePgTBG?E>8z1;QhKTq`tzwwuMniY_ zxaNSwH#&oCJRmcJ`S3Y+=<0~LERw_`4+z7vw!&Gr-ViBjJqFb`MWEWUry3>v8&DO3 zL}8G=TmIJQdmlUI)|MTWwnqSHK$pLSj&p%TVed2OBb0m;FtuXJge!%Vq8YPy$ct}< zX?F~zTQ|MN3O_~Sc>oIF6jqL7b5nBWB(Qu_C+5ogyP;k8mfR{6Qb@S^*h_&@JJdB^ zc-tQt$q`%Q9L`xF3lxQ6jA%>aLcM7$IEr5LrfsM=7rC2VQ#%)`@tR~&H1{x$-} zUTIAD1@-{oXR!vsTpp`88|Yrp=j-0U#88$2M6K^mdX2}hLHRk80oM~dOb~Th#B`8V zjL+wQbe!f?qh3jXz6xj_n+ih05Uwrg9**;{H7~aLjO4Y{$gty)%h`*Gp_CS$i|J>V z3lcmqdFD5eQ+7a@YppY~FXsjWxJEB7)Z82v79CiQiWo4nybzR$mpUORTbD9g3pB>e zOYNdETA8B#Q%t|WShfp*aI1m*$cikA(Ya(}mStm>69ZQ8PCIlxIU6m5>ySImMrIVg z2$-{hqGWbhAp?A9^8BR--Re6K^z8F(?6Ex83zxXA1fJO~*sO0p}|E_r~X_NMhi| zh{()RMrIm=XVQ6TT~tym2IlQF7i=l=n${8vCJqD<^+IC`p0$sL+j?f=CVT(<=%4>1 z!$46%wF@l6#?9Cxz(y|L-_EfWNm4oqG3!UixsB#UJWOuJC(h=}aNqi_BE7mwfZ@xM6w zmw&Qv_QT&9yYX8AVA)Fj_eM|D?=O7cx_9F}C?HT;3~hT4#A!~cS5}_uydXudtNn;O zB;Fg*S(5@=m!u3Tm`&Nb5B|};Fx&S^oUXwV>9u;VP{)!Q(>4PA?I;o!P2mdfBNmEu z+w6W7>gmTshp5grB`TABIasaos^7_Z)x7pH0K9`V+EP8#Sp}QNCj0;E7iLG!0GP3E zC3=*ci?zYj5!mVsn9Zu|d@eN3Ax>N5$`}&y>({X{sC2|^^@{*a+TtcIWw(~F?*pC= z`##Am-x|VpMCQah%~p4SWv)LsTvYG01Iev%gOWi?8Sq`LtON7`gQdl?BIU3K(*=zU zgkt9crX^n*`G)Mw;rWr3FRg$5Lq9BE{3sDLp=}BTQ8!<`c{fWQp#79?%B_!GDq+WK zE4)dzTy-(@w=RRhmX`)o53bgrd}?y^x*5#}BPh3Nm~>bdz_jI-^fic*Fzg)sVr!l@ z^mmbp9{yb+GpeLxnCr6iwa3%~#Uyiu7YWT2CHP14!xzu6+-{=sSQrFS0u}yT&-vKR zVV)vVs@`-MJk{H^_H+fRe-Bg{;8tH7TmPmsx%3$lH{hbCNP-0ZfNH*jkbI5<6&g!$3y~w1m{lep=Ems(;&kKGLRr7swUT^_Z+yfWX9yq(mhd=mbmv zs|eA5VEq-@*16X?*_A{pS?q~O@?J3X^GA0mI;xl23!?VZ&jF~VOluChjIk>cME~-$ z?!18k7;LFSg)#9~=AqzYnEvd;)2A*+DzRVyip*FGmYHbLP$dQn*^`p1U(~g!$7n%3 zV!cqRrx(tX;Yf^J!-XkEUg}M2qSQBD>VsJ>^~nusJ0yT&lWl+nkwm&U2LD4~(j$^w z@c}FI5>9G^(GNLyPR>U$GIRP9A~`l3_N+lUI0+x0?f@M#FCdaSPR0qz9= z$_f0mT80vc8a_TK61~8>-6i8E)+Qxzj@J38P zcIXj>ev6-EzWUyKSMPqCCCi@b#sKZ50E-2QSO=yT&P>;ry;%`?4QYlW&TTNbL?bmi zuY^12i49!%Q{XlbV;co;`H~kmZoJb&XOV^ly1|UWban3cLh1<-r-gAIc~9=CMmY`? zOjqr5ljnDT;n){{_vz`g|NHuU?Rq`?41|6Flo3}snCqKWR0RB#Csy)cK+Sngz(k#_t+fvp9J5kM9MO187~Z2Cl-8XvX zzv1c_b{^$Z6A=!q!+xlS(X+w%SV$=?$91U-F5hN?(Z^Bv9rHUBu8u{Th||;ca7Dnh zl#knfsKRxpYf+y>4>iUf>aBs;VKWe|qjMo&h9-^oYe3TgriC?l0sw_?Q9`{rhZTeO z%d!F_B?T^IePH-kGNwus`V9P=IWI3au2mayhV21 z?Fj|$zXtlVK|>VQUmU>e-*dIBAziBssk$jG6GqbD(F+d0-H{vErd}*W`Bs?ZePF_r zs>*I2!fh2S2XR^cNN(LvfQwvHaDi##&Rz@no{rns;$ zMaKv5GH@+M-kSgs~3N_@7YyD}Ah z`x{wIDD#-p3BA@NEs=VplRWXfc0Gu+`^v1(ttA74wG|Hiwtx&s@HQ_U6$CK3?>t?; z^bgl?Z5d!DrC>Pcp6kC`0IiJbyla$QUtp>mC&^P0prY z0Ht0Xop)ib2GFERF~=V$SPsBFWA^Q?b*>6}7S4%U3bM5ZG%TF-H@WK(Z$$WicEQrV z-LSYXv|g5cfB1s$zp%@Tj2C#Gh1Y5;*B4vuvRvbKIm|CV?^~8#EQ?;2pW7|-&-w8W z{P+jE!HfXxh`>AnT!P1XDZDUq@Eypl`7(k1obTUWm9Yaa2$owfzs=*OZ>#Z*zI_{l zITv+LV{9x_fE`+*CNkx~?8T2An!U8rlz}4G{6?#`B;uCAG*~3x4#?u%ts7Vv!hpF) zEW#21xKX%0p>L1liI}*5GJ7z;&a!eWgX)Vy3L^zib!2c> zJtssg%&0uy*Qox8B`5dwKuCr})^X^!I5XVLHfIC+F^iL0@$>#1ISSKFObx2bD&>}@ z!EhweT%y0OHu@{$I(?ibDLZ+jWUoru0Xi1GkWC<8lx-;nQwAq;Q(E;RgbqbD*JH(@ zQ5Z`0e#wu-%+y0oC9&tiS{XavKjKz5ePQkHPdq#O;m1pGJ53S_s^cWT@`GL;^l~n* zW7gX9KJP=kpT0!B&qNKd+jQA^uzcZewHPOWSVN~BUqANr^t|bo`Bumn1Tlc*#Bzp_ z@|qBlMtuS=VScWa&-BI0c{QJy1|1-|(Q}P^SMNrw$K_wwz`QhxqN1vMP`xziK z;`s_Up@t!s5JUMjSD28O$hn&Ar7jCFBi~BOLW%XkS~GnU_fefRjO-<(l-E^26#{s!B>uMY%bBtYn|Zh|xKxhp_eW%V6Qf-SXf0Jpeej_5EUtIlNK)__6fW(UZ4YBekjJ_9Jm^J@Qg& z)QBkUvR7@-a-Zj*WJ8xFGG!>EHH6@$c2gl0;@Y=jeW%S5$_XT1>Qhh}1cOMqpygFD z#5oO%)ibgXBSF>g39pFkyV_H4(7_aq7b+=~PH|Y+sR43qbUy6HORvt4y`!m$pdd-3 z5B{d?Hwy$y{yW^^8Qc+LHhAnN=Gxek+~uKeuO+9%cSv#MQ{-J{NtEV1^jj5pNNTWq zNfq++jFf90(4G%xfAOY9&idlbEN6Q;*N@Nf?Kv{feZNLpmU!-*Kk={eC)%FtMd!HB zEz6(Y1n2&#e{R)Q^MB^odpX;e-?{i--U^re%in}c?z$B&e&#nDx#XGOf(!TkeK=>; zuV3@hyAjU*1^@bQ@uIC4|2O=?jj+8U`}ApRgWuW?=8qBZFA&UA6(@;dLyF!Tl=VIL zSj+EaPV-%ltbgl$5PpY9z=p06$;52|MvTx@vdrhsOxXE9Ltucq4phzzkP%&x)(}=! z;1ujbl;Kg|t^hbA;oggj0K*9i>F5lr+Rj55LNOl)P`!?>ieTfsaUtp)PdS1__ULTJ zk(AG`J-z#Dt6%$Phv!HC0U>Ncz>s!`K_X`M3_xq>v4UpX?3*NypFrj#;$7?p(_KvT zQ51w;%hRXSTOIFD*tp7!wy}bu;F#Ov7d@fIUwN(0aPn|HBL~#?5T|TdNR4bdha$?! zpnXkYK}ZPANCmwFPLiS-w~Q13x(*zJ>Mb5rvtjZwrY)b zhoDn2*`y8pG=#uJuw^x6Ammfq;JM}!izL5Q000U5wm2B7ms<4KW!7IcYHDk=4^QV) zp9DZ1KZM8gB95r z6wVmngaQ1k$wTkFWAu&xYaJ$k1Jyej->jssgk)QQ4;AyzH6M8S#obb8^YC^B(@;NO z!ywOi*IU(_O9?RxuX7QAoFAcqg6TN)JD#U3PYo!(!REQvdeaSKRe(~jbUy9^@0!1@ z;J&k_C&t7mh(P8^cks$N&~ig6gR&kqCoKBAw_bZGtX$TrCCt+HfW_iN5ZO~Lpc+{4 zBM5j)cutlV7K5lK#?Ssb1omko5zHYX5?E~TSlQaj9O|FDp2hwYphuy`rW5v3Sb(4i z7gAr7#7hlFbw7yZ{gsnh#}D)IizuLer$mvg2&1EL9Ec19Vc>wlbns61fWx&59&-ph zgKANrvIyXDo__Z%|Bq0_Y=>>5(8`UvLVn$mH72K%Wz?` zATQyyG3}X6Q$MJ_Z-VZjdLDQ_1!J;~WMQQyzH8@=V>$UrUkKsING;nqOHUIoOL0e-xM=rr&1r?FtD@&rh8-tFk$YTzMC6>1t2M-rQT^5?L$0?`%oiB z2-O(wCP>cUP#r=HtS10qdy-;OOe%3$Of5Pu67KDUh>TOp9X`7L=qKhhe}h4FiU4A4 zK#s{S6K)v8ZRTttZJEhk!F24EMhbH&|z_PMXUS&mp)RWQTUV zdp{tB^Q#e3k!yLG*su;rPf-=UW;P%zvuTca`&ta7o3ZMvP42p;X`ozJo&!{)G7yJ< z`^Y=)o4vp~j|GVHsR;p54b#uhUirwAll>Q1mNQxRF_N=^M_^SPr0{AM8FD)O`=kKsK(azj*bX#6+D(1CAeQ%m z<&aq^H!wDX0YD*Nw&Vc-fGsSRREj5&X5u=j0@aWKY3b{DLbEsBwffNe zktD1X2m`PttOnJ19tiMi4;VlX*i+p%Y>}3{uvQLr2$@-=K*ZOS-B^7M-Gp|D<((w# zTS85b0l9IMy9tY;IP^nG2EYX7RHEyZZ0K@RF?zYe2Jhfhu$L`OL8azQTQpS%iP&@Y ztngKCw$>?e!#F#+Og#NspbywAV8 zArmxPP`uWAG14=n4SN@{aZDiaW7DJS551S29>T&OYEw_y$OY3W%!$mrsQP_yykCXo zo7@yBkbJ?y7&Yws_{m6(!tS{h@sgAEVie%h4BdRr-t~C^(lDJsSpXBSjmcmcLfr$H zWCYo}Mb0IpfaxA>?!UxsXN44MNBm$jhYiR}${=b^d{hQ1O8cw5vJt6Z z_FIj-#pzzb+@K|GZlKEgbkQ^e+BwT=%)}4Td(gel<4Cj`fK@|Aa!-?M3aWK3in^pM zGDjmW=hY5##yJ5*umSWHi2Cik+VHMY%fY;!3>8zg$pgx4$uy@)Z zxk@aqtpN}TQ{s3y0w>`Hymn5O84|}ZVyn9mR>bCqAR(nSbgCC zUU!pUG&!+Q%J!`P_WJSn0q||IwpUr?@4gmx`w$Eh6I-d|1T4(>-CO9(7#o5D-OvdL zwM5<4JOS(*f$1pBTUytt7v6wxCjz)2R7>aD{6TbrxPGb|9b*c^yZ1&$HD)riLY!KmEks`G%}@WV z&jUSA_TeWGa8JZ!s@?+78f9~GJMJGp^>?_8mMxh~ONc1J%&GBGvsfZ43Vhg?J@HZt z=qzzCV7f>4QrG(w{2?R^+Ez(3HG1S^5UybN_!t|ynsDz$0OGPdR)jb>=Qmqv`h-5zR;7>6UUopEgB zwP2CjNPFcwg4gOR{E;c)1|6e{n06V+A-Vc@q{ANmCYCcgJJ|0tR<$P%5AW)Fx?^9kQ- zZoC%+!($SI*oVFB_5EwAR{GYre(VLMAH?oyv3$o-mTKJUBJoQ0f#yp~KTi$8#M$F? zFA%7)OGNtrB|x!lIXCcj@4e=ExvmQ=u`w<8xCc-im)?}KDGUEbSMMbkmA#7%5GY0p zZnJv$EVdHabL_x7SL;+Wp{L!GRIJf^8?UL#9^SkD)cYJzAfgN;l%YaRzv_dRSE}J^#K$tw7a!bPw>2DP3Ak99YgCIr*= zL=(lKo;j$N^)V@#N)-B%=4$KvfQ*$l&y7(boTb{YZd&91-R_J^DoR>YM;lCIIF9_D&r>8G`^e7zN1lAe$ zZWRWNCEpTSD`^H)hkF+e9m#JK0D`x=^wRcJPf@|?G61Zohnhj`Nq^u5W$mOZCG7$O z{}^dOyzFeX>^oDnT>rLb(N)qf&`w7Py=skkr)vT?AP9Nq4#o1tJAl2@$I7+k?~M2T zCIKy_`wJ1`(9nK~?UBn9udv%NFA|8{Z>H&tgln9P(w7PoXjuroOJ_n3es&Z%iC^HZPU5b(9Y6P zySkD5wJfASTD{ZC(5)qxwAzNWOWrW;qw{nZUq)a)DE&Ob3o;TzNAq0|9l!4y3~4~F z5F>Qab4cXd=^SY?=l*00K?j`Sz{}7X1UJ<^uQfMefI32;VWO2^hq6!Cok^kNSB{+$4DCjt7_RPDb8!2hli0ux&NWF^2Y z_!e#^z_(Qb0NfJ5Uf-@{ryT$8;9mg1{|2!A!OI(v44H>p1v0kq>~%%rI@p=msE&08 zs*`ldoX|}Kbu4Xekj(dZ4XQcKM#iGUDoI&rsW!AoduYCT<2Toz`9&nKb$QYP&{*FW zFSYE)K_S1%9vkq5@w=cBXCyV#$1nyb23$TT*EsAuoR3F0hxA><(}ZNF2v92tliVSR zY#5J#VAgo@LS7h?R>)YwX?dO`nV$0kSYby7H!n>0zy9AGx$E~1&X3)asMIXcoU(dz zh_|h7QvZwQ*)I9~qM!NPEwFfqOED$&`j90KZxPW03SirHd)U)zQZj_p3!ocA+k|i| zw_-Dx&O@__f~0JT6y=+MNSJpCDNAmBL>Z@^>TY)M^rjGp8>wXuNj)2=IX}BT_{*Mz zY=D~}-|B^8{PDHA3F(FGr(#QD@jm6SD@mT{vTkGPhfdZ@R;sehcI`_tKoJdGA5 zhnl>=!cdfXC*@A2Q-ET!E=;C9Ed_!FaKwnC5Grq-K@u;bc*rDA{i|z_e|Sdo^HTCL zz(gs%6ajCikT*SGFl}c;-PhOxW8AAb3}l{UtN; zVT?dANY2>`5E}uk$2GWylr2Go5;Y$oWG=F z4kNuo``P)5IT@&p&d)r|TjnUV=@}07n2plKWT4z5p9p7X%tMnLz%;9b3v~|la%Z^DNiaI2?8Rl!aPOKQ#R#Zo z@AR0@L4ZCKzO~HzGsa2CS2dwbR?YP=a%&ex(NuDu<8cJCZ>s<`M^JhJSQ_nSru}UX zU*VlTo&@jDDsnncLihjv15Qmm_qm0ZdF-JZYVY|k&_>m74@PSy8vktekC zBII^nd>iI&<*@&={>yU`QvdHI4Tw)?_OEW7Wx-h*2Y)}Ou{wl4d2*@JiAZu9N7 zv;6oSzVBtLm+jnM4vQb!4ND)|1q;4i{Aash@n7u%yo9b ze@v}R(d(sPPx?FF{nnu5s}%~R&A?}On;qOy&UD1Anpo6LrmiPBZ5!o{MJ;uCr1gCr z;rZM`m$Mvpl89-oKNZNws`C#W7W{4rr{wteXBk9;q29dl5K*vF!?*K?<@H$4n_(+Y0oIw5q1avL=2y^VvEGXPIW ziO#mMpIU(|rqe07)wZqjld9m| zMWN3jrBc$y%fO%*awSrVTqWui=KYY9uHZ@9o)~gA)pO466e*PC1DJ%hJw6{@;Y4Ou zNB~JnNeX}ogo@U}@%h@)svBL&6Pk}1yfmSIi*j3Rd*m%LpI3;;L!YzU>F$tFJuC7v z#I(nmmp1Y?b@F}K_VYVE&I+7Q)SDun{L-mYQ$3ketpy8JHEREkR$A4Wh!vtV0 z%6r?J+lNV`0}h<*OQ4C=d?qg6c!ICzCmQ0N_i0VW&LGQ}S;=L8^#hRh14|SB+a}~1 zUIX5vU>U#=h5HtkuSaZ=X?Fb+M?kcnw)zs0+ZiZdUJ+L@$($h#?T-XW_1C5n1~q#= z*J+g{eBsbG*yLZ|6WDq2q;_6BIWNoR=gxy24_yJKIGtJoCl8l`EPcgc80t#=u|BOue@e!qNji z^jn-4Xow0678@QLgq|r2FqZW-AE6VclX-4l;0jTwH ztnpC8T0OVG;z({zy@>UD&UtVloQ*@i%c5i@9jG*qu7BsvkBy%AUme0S@XbkCeO1~d zI!5MhLJ5~q2+sM^JMX_H0gxg#Wm`-_m#u~H z2cY(9>3Y->1vUv$)dK~iT7AWAzy^}x!R`89F9Y^e14N3u^czHiuz&i>uRk+>;R0t3 zmV{DAnGD*%2R|ptn-&9)ZSolbgk%K(8U3Y>Y(OJ(^?jGr)6J0vlYu<@Q~IsM z^ypM8I^5qkJ#fn^jF;rYaqMxOTNI;BAYTbqSU(TO76xq%s-X@EIE%A;~Ag$$GHcOc-1cKi2Ojq4*9L3EIK>SsC&Oj2GvYSNziVmZ8ubX^z`g$I$zyMD)-*YrmL|L>Edy&Z z1YK*cCFi5+tp#`qQEY~0#su&( z^#T@HmzcWQo3Vq5!a!2PjZrwnZJ9-H!G3KUf=%D+yf-!c`XanfTpF#*Ps0u1|V&q5{HgKvcp*q8V}L5 z2GStu3Dhrzc#meNzx4@{8;O$entJSzh5^Lpus>IUq>i>4y!xTOc2IySDP%0+LNJ#) zz=eEHVz?D%bg_yOzBoO&^V#W3x9M(e;j{$q;>W#+GQn(@TOYY1-phol);DH;6Xh(Y zR9U$|-KKOf@%8+O&ceB6X;+3NCh!2e!neDR(tJJ#)e%5uNx-`T<1TB8u0t7j!-#ku zRgkBQ&Z)@z!TP<#6yd$q74QALlE-+Nmrrm{$;l8@)eLRu^NLW^# zM7vC2!e^ux37MVDeQV@=oEc&G2EziJqB1weD&x2F@=|&D9SALBg>>~7bfbEAUdKda zs$_NpV4cq;_4bI^U>@oqs_Y(zO_qaj6-b4jpL&ry9!g-OEla$s@_si#7-a5 zJsiUCa~5}X0Hu*3dL4t_iJ>1_gAlP)Lu%^fe$t}qjS!!7QH&MjC9|@;=p006q2Aii zMtRh_Uf*9r43_D(8TUdrsMhsyz34DDnp(4Qif6RPyXRIs5$obhyF=6hlhLKM$yJvM z2EE6p`+f}o4GW1uRn7jftf*&Jkla^s{fhfj_5&;H@31q+v=; zsV803C?Zm_nQ%McWkVf_tCsOfEb2P;#gI5Er!EjqMAZf@qH6f-T ziPK0{JZ9e#jDE4$g}JSxSjLZOLBeQw9*&R5O9}e;8mTEP%`?{BN(!cPr9Ed8 z$faF(_Qb3?lvlh=8;JWfHil6^WQV{D!qT5#&ECcS33MeXP5XJT}Y zt71qSc`ua=5Oq#ppV|2@iS?t8Xmn3XAZZc?@YVV1Wfn;M4?#qSW6;TL-_$eV>@2bG z43250hG#d%Q%HJ*BC7zj9>UK#+*@;~=gtt7IAI_S#`O%(_d+!gVL2C_){sP29xadT zf_7;~)E3%?{cB=Uzr`2NY=}5D)K?u8osOFhebRzDhY;iF697_AD=7fAJnuFl5!5-% z$!bLuFoVu(G{%X`yQbuUSs$h8PKY9iJ>n>2;9bcAz<_NeUUjgJ` zI|1R6@@88^%6M)^iBZzMH+IuEJvx2%QbQzqYPH4&qchYxS_v9ip(S7)l-MUF*CjV) za!iOKxe!kik)2XNy#j4-z=&gEr|hNf(@YcwFGRusDfw>(XTcq4_=rGr&$0V%n8EzQ zH0%g!Nfq>Sky#P(CWT8(>hS09)aUAJB?nXr;AGzB%0&_aF72`p{a*PS7t8A>wfSr` zP6*7j711Ltfi4GjF{f z`r9_C^3jBv>y25a1H3Hjxr!eX2))ReC_c) zWP@eTw>IR1736}B;51LO@!}3RnfkBY!&%N*Q?I&3t`$EShTL!^b8cb9Fa$Lo%-<=+668`(0pYbNRt^|GPOS-;1+`U(^ssk2L$!P+-6=#P~%p$7)Pe zN!jvD8?4Tu+Q6&U_f!2?)h>hSVIWc~n|qCf#>_wrTwxzp0)(z0F&|ZX5s0H|e3`nd zuu_ zT3Txy_f;IvQy7!131bxksX3C)I|b|Ec_{1UJ#b4kat>=rfR!O2C&D-TJQY6l?mQ<}WFv|vo@th6L8Rc%c^ z+czPy%b7kIWXo3{nGi`pb;k02^3yR01?cxDD0-?vmI{RQ8AS8koWMv**gOE~(gr}qAEqZ7Dq$)?5^;&__>ncF2AH%IC}JM%mqtZm%y(lIM9bRfn%$nsMw2hxxO>%3KOb+>t(NanGFT9i6dJ``-HJP)#6V`D{5NSHr2 zuV^6sRP_GHdF?AtU!vBCIxpZW? zKM6b?ZeX$I1UmhA4FT%>v7nx5@p|c(7+4@FgpsO61>oTP)xVD$D_t>^+UwhI4va=3dY0z2mOpC%^hk+YWbfbrm z?FB{sHEhA#8c5PMCnRbMnwrrUBY}+PvNst#&p51Bln6AXEew;7S?32*a_rH`Gnc+H zJ1li?5f#W~^-H~c*2}rFVCCtHC2tyeMbffFxyp)y^*W|%xX!1Z>NtHDb*?+WQv@gh z&}k4VCD$l;t+Pt;JReK$n@jrbzuhFE;F(&ItD`!fd8a9RRJDBCEBr%hCxaRh2k?UjlamjeeP>+"gBv5Lh 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≫>5eeg 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μ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

M${Q^+kUgEHM{JL2 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

7jwv59^{en`PI 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%0DrRRAkU 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 z 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/x3.png b/assets/images/x3.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8987348ea97a2de21512a24706105f4567bc8d GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^5>+G zpYl8;)~T#7nDj<)i`~WTEt~2lEju3KZItk9@x~>Ip*;(xrEXuw_w95`*Qd!B8iAHF Nc)I$ztaD0e0swEmJw*Tj literal 0 HcmV?d00001 diff --git a/source/Main.hx b/source/Main.hx index e923d2e..b651678 100644 --- a/source/Main.hx +++ b/source/Main.hx @@ -18,7 +18,6 @@ class Main extends openfl.display.Sprite { public static var windowTitle(default, null):String; public static var showWatermark(default, set):Bool; public static var debugDisplay:DebugDisplay; - public static var watermark:FlxText; public function new() { super(); @@ -62,17 +61,8 @@ class Main extends openfl.display.Sprite { FlxG.updateFramerate = 144; FlxG.fixedTimestep = false; - watermark = new FlxText(10, FlxG.height + 5, FlxG.width, 'FUNKINX3 $engineVersion\nengine by emi3'); - watermark.setFormat(Paths.font('vcr.ttf'), 16, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); - watermark.alpha = .7; - watermark.updateHitbox(); - watermark.borderSize = 1.25; - watermark.scrollFactor.set(); - FlxG.signals.postUpdate.add(() -> DiscordRPC.update()); - FlxG.plugins.drawOnTop = true; - FlxG.plugins.addPlugin(watermark); showWatermark = true; DiscordRPC.presence.largeImageText = 'FUNKINX3 $engineVersion'; @@ -87,7 +77,8 @@ class Main extends openfl.display.Sprite { } public static function set_showWatermark(show:Bool) { if (showWatermark == show) return showWatermark; - FlxTween.tween(watermark, {y: FlxG.height + (show ? -40 : 5)}, 1, {ease: FlxEase.quartOut}); + + debugDisplay.showWatermark = show; return showWatermark = show; } diff --git a/source/funkin/backend/DiscordRpc.hx b/source/funkin/backend/DiscordRpc.hx index cb5d603..e13a0ca 100644 --- a/source/funkin/backend/DiscordRpc.hx +++ b/source/funkin/backend/DiscordRpc.hx @@ -107,7 +107,7 @@ class DiscordRPC { refresh(); } private static function onDisconnected(errorCode:Int, message:cpp.ConstCharStar):Void { - Log.error('Discord: disconnected ($errorCode:$message)'); + Log.info('Discord: disconnected ($errorCode:$message)'); } private static function onError(errorCode:Int, message:cpp.ConstCharStar):Void { Log.error('Discord: $errorCode:$message'); diff --git a/source/funkin/backend/FunkinState.hx b/source/funkin/backend/FunkinState.hx index 2112d1a..0c2c16b 100644 --- a/source/funkin/backend/FunkinState.hx +++ b/source/funkin/backend/FunkinState.hx @@ -6,26 +6,46 @@ import funkin.backend.rhythm.Conductor; import flixel.util.FlxSignal.FlxTypedSignal; -class FunkinState extends FlxSubState { +class FunkinState extends FlxSubState implements funkin.backend.FunkinSprite.ISpriteVars { public var curBar:Int = -1; public var curBeat:Int = -1; public var curStep:Int = -1; - public var paused:Bool = false; - public var conductorInUse:Conductor = Conductor.global; + + public var events:Array> = []; + public var conductorInUse(default, set):Conductor; public var barHit:FlxTypedSignal Void> = new FlxTypedSignal(); public var beatHit:FlxTypedSignal Void> = new FlxTypedSignal(); public var stepHit:FlxTypedSignal Void> = new FlxTypedSignal(); - public var events:Array> = []; - public var hscripts:HScripts; static var clearAssetsNow:Bool = false; + var firstRun:Bool = true; - public function new() { // no one gaf about your bg color + public var extraData:Map = new Map(); + public function setVar(k:String, v:Dynamic):Dynamic { + if (extraData == null) extraData = new Map(); + extraData.set(k, v); + return v; + } + public function getVar(k:String):Dynamic { + if (extraData == null) return null; + return extraData.get(k); + } + public function hasVar(k:String):Bool { + if (extraData == null) return false; + return extraData.exists(k); + } + public function removeVar(k:String):Bool { + if (extraData == null) return false; + return extraData.remove(k); + } + + public function new() { super(); + conductorInUse = Conductor.global; hscripts = new HScripts([this], ['this' => this]); } @@ -40,22 +60,41 @@ class FunkinState extends FlxSubState { } super.create(); - - conductorInUse.barHit.add(rhythmBarHit); - conductorInUse.beatHit.add(rhythmBeatHit); - conductorInUse.stepHit.add(rhythmStepHit); } function rhythmBarHit(t:Int) barHit.dispatch(t); function rhythmBeatHit(t:Int) beatHit.dispatch(t); function rhythmStepHit(t:Int) stepHit.dispatch(t); override public function destroy() { - conductorInUse.stepHit.remove(rhythmStepHit); - conductorInUse.beatHit.remove(rhythmBeatHit); - conductorInUse.barHit.remove(rhythmBarHit); + conductorInUse = null; hscripts.destroyAll(); super.destroy(); } + + function set_conductorInUse(?newConductor:Conductor):Conductor { + if (conductorInUse == newConductor) return newConductor; + + unhookConductor(conductorInUse); + hookConductor(newConductor); + + return conductorInUse = newConductor; + } + function unhookConductor(conductor:Conductor) { + if (conductor == null) return; + + conductor.advance.remove(updateEvents); + conductor.stepHit.remove(rhythmStepHit); + conductor.beatHit.remove(rhythmBeatHit); + conductor.barHit.remove(rhythmBarHit); + } + function hookConductor(conductor:Conductor) { + if (conductor == null) return; + + if (!conductor.barHit.has(rhythmBarHit)) conductor.barHit.add(rhythmBarHit); + if (!conductor.beatHit.has(rhythmBeatHit)) conductor.beatHit.add(rhythmBeatHit); + if (!conductor.stepHit.has(rhythmStepHit)) conductor.stepHit.add(rhythmStepHit); + if (!conductor.advance.has(updateEvents)) conductor.advance.add(updateEvents); + } public function sortZIndex() { sort(Util.sortZIndex, FlxSort.ASCENDING); @@ -98,6 +137,24 @@ class FunkinState extends FlxSubState { updateConductor(elapsed); super.update(elapsed); } + @:allow(flixel.FlxGame) + override function tryUpdate(elapsed:Float):Void { + if (persistentUpdate || subState == null) { + if (firstRun) { + firstRun = false; + update(0); + } else { + update(elapsed); + } + } + + if (subState != null) + subState.tryUpdate(elapsed); + if (_requestSubStateReset) { + _requestSubStateReset = false; + resetSubState(); + } + } public function updateConductor(elapsed:Float = 0) { conductorInUse.update(elapsed * 1000); @@ -105,9 +162,14 @@ class FunkinState extends FlxSubState { curBar = Math.floor(conductorInUse.bar); curBeat = Math.floor(conductorInUse.beat); curStep = Math.floor(conductorInUse.step); - + } + + public function queueEvent(ms:Float = 0, ?func:Event -> Void) { + events.push(new Event(ms, func)); + } + public function updateEvents(time:Float) { var limit:Int = 50; //avoid lags - while (events.length > 0 && conductorInUse.songPosition >= events[0].msTime && limit > 0) { + while (events.length > 0 && time >= events[0].msTime && limit > 0) { var event:ITimedEvent = events.shift(); if (event.func != null) event.func(event); @@ -115,10 +177,6 @@ class FunkinState extends FlxSubState { } } - public function queueEvent(ms:Float = 0, ?func:Event -> Void) { - events.push(new Event(ms, func)); - } - public function playMusic(mus:String, forced:Bool = false) { MusicHandler.playMusic(mus, forced); MusicHandler.applyMeta(conductorInUse); diff --git a/source/funkin/backend/Paths.hx b/source/funkin/backend/Paths.hx index a022273..a16a001 100644 --- a/source/funkin/backend/Paths.hx +++ b/source/funkin/backend/Paths.hx @@ -185,7 +185,9 @@ class Paths { return (FileSystem.exists(modPath(key, mod, library))); inline public static function exists(key:String, allowMods:Bool = true, ?library:String):Bool return (getPath(key, allowMods, library) != null); - + + inline public static function video(key:String, ?library:String, ?format:String = 'mp4') + return getPath('videos/$key.$format', library); inline public static function sound(key:String, ?library:String) return ogg('sounds/$key', false, library); inline public static function music(key:String, ?library:String) diff --git a/source/funkin/backend/play/Chart.hx b/source/funkin/backend/play/Chart.hx index dc2cbab..549a286 100644 --- a/source/funkin/backend/play/Chart.hx +++ b/source/funkin/backend/play/Chart.hx @@ -95,7 +95,7 @@ class Chart { } } - function loadGeneric(format:Dynamic, difficulty:String, ?playerNoteFilter:BasicNote -> Bool) { + function loadGeneric(format:Dynamic, difficulty:String, ?strumlineNoteFilter:BasicNote -> Int) { this.difficulty = difficulty; this.chart = format; @@ -143,15 +143,15 @@ class Chart { tempMetronome.tempoChanges = this.tempoChanges; var notes:Array = format.getNotes(difficulty); for (note in notes) { - var isPlayer:Bool; - if (playerNoteFilter != null) { - isPlayer = playerNoteFilter(note); + var strumlineIndex:Int = 0; + if (strumlineNoteFilter != null) { + strumlineIndex = strumlineNoteFilter(note); } else { - isPlayer = note.lane >= 4; + strumlineIndex = note.lane % keyCount; } tempMetronome.setMS(note.time + 1); var stepCrochet:Float = tempMetronome.getCrochet(tempMetronome.bpm, tempMetronome.timeSignature.denominator) * .25; - this.notes.push({player: isPlayer, msTime: note.time, laneIndex: Std.int(note.lane % 4), msLength: note.length - stepCrochet, kind: note.type}); + this.notes.push({strumlineIndex: strumlineIndex, msTime: note.time, laneIndex: Std.int(note.lane % 4), msLength: note.length - stepCrochet, kind: note.type}); } this.sort(); @@ -307,14 +307,14 @@ class Chart { var noteLength:Float = dataNote[2]; var noteKind:Dynamic = dataNote[3]; if (!Std.isOfType(noteKind, String)) noteKind = ''; - var playerNote:Bool; + var strumlineIndex:Int = 0; if (fromSong) { - playerNote = ((noteData < keyCount) == section.mustHitSection); + strumlineIndex = ((noteData < keyCount) == section.mustHitSection ? 1 : 0); } else { // assume psych 1.0 - playerNote = (noteData < keyCount); + strumlineIndex = (noteData < keyCount ? 1 : 0); } - song.notes.push({player: playerNote, msTime: noteTime, laneIndex: noteData % keyCount, msLength: noteLength, kind: noteKind}); + song.notes.push({strumlineIndex: strumlineIndex, msTime: noteTime, laneIndex: noteData % keyCount, msLength: noteLength, kind: noteKind}); } } song.sort(); @@ -364,7 +364,7 @@ class Chart { } var notes:Array = shark.getNotes(difficulty); var dance:StepManiaDance = shark.resolveDance(notes); - song.loadGeneric(shark, difficulty, (note:BasicNote) -> (dance == SINGLE ? note.lane < 4 : note.lane >= 4)); + song.loadGeneric(shark, difficulty, (note:BasicNote) -> ((dance == SINGLE ? note.lane < 4 : note.lane >= 4) ? 1 : 0)); song.format = (useShark ? SHARK : STEPMANIA); Log.info('chart loaded successfully! (${Math.round((Sys.time() - time) * 1000) / 1000}s)'); @@ -398,7 +398,7 @@ class Chart { var chartContent:String = Paths.text(chartPath); var metaContent:String = Paths.text(metaPath); vslice = new FNFVSlice().fromJson(chartContent, metaContent); - song.loadGeneric(vslice, difficulty, (note:BasicNote) -> note.lane >= 4); + song.loadGeneric(vslice, difficulty, (note:BasicNote) -> Std.int(note.lane / song.keyCount)); var meta:BasicMetaData = vslice.getChartMeta(); song.player1 = meta.extraData['FNF_P1'] ?? 'bf'; @@ -439,7 +439,7 @@ class Chart { var metaContent:String = Paths.text(metaPath); var chartContent:String = Paths.text(chartPath); cne = new FNFCodename().fromJson(chartContent, metaContent); - song.loadGeneric(cne, difficulty, (note:BasicNote) -> note.lane >= 4); + song.loadGeneric(cne, difficulty, (note:BasicNote) -> Std.int(note.lane / song.keyCount)); var meta:BasicMetaData = cne.getChartMeta(); song.player1 = meta.extraData['FNF_P1'] ?? 'bf'; @@ -540,66 +540,6 @@ class Chart { } } - /* - public function generateNotes(singleSegmentHolds:Bool = false):Array { - var time:Float = Sys.time(); - Log.minor('generating notes from song'); - var notes:Array = generateNotesFromArray(notes, singleSegmentHolds, this); - Log.info('generated ${notes.length} note objects! (${Math.round((Sys.time() - time) * 1000) / 1000}s)'); - return notes; - } - public static function generateNotesFromArray(songNotes:Array, singleSegmentHolds:Bool = false, ?chart:Chart) { - var noteArray:Array = []; - var tempMetronome:Metronome = null; - var type:Dynamic = (CharterState.inEditor ? CharterNote : Note); - if (chart != null) { - tempMetronome = new Metronome(); - tempMetronome.tempoChanges = chart.tempoChanges; - } - - for (songNote in songNotes) { - tempMetronome?.setMS(songNote.msTime); - var hitNote:Note = Type.createInstance(type, [songNote.player, songNote.msTime, songNote.laneIndex, songNote.msLength, songNote.kind]); - noteArray.push(hitNote); - - if (hitNote.msLength > 0) { //hold bits - var endMs:Float = songNote.msTime + songNote.msLength; - if (!singleSegmentHolds && tempMetronome != null) { - var bitTime:Float = songNote.msTime; - while (bitTime < endMs) { - tempMetronome.setStep(Std.int(tempMetronome.step + .05) + 1); - var newTime:Float = tempMetronome.ms; - if (bitTime < songNote.msTime) { - Log.warning('??? $bitTime < ${songNote.msTime} (sustain bit off by ${songNote.msTime - bitTime}ms)'); - bitTime = newTime; - break; - } - var bitLength:Float = Math.min(newTime - bitTime, endMs - bitTime); - var holdBit:Note = Type.createInstance(type, [songNote.player, bitTime, songNote.laneIndex, bitLength, songNote.kind, true]); - hitNote.children.push(holdBit); - holdBit.parent = hitNote; - noteArray.push(holdBit); - bitTime = newTime; - } - } else { - var holdBit:Note = Type.createInstance(type, [songNote.player, songNote.msTime, songNote.laneIndex, songNote.msLength, songNote.kind, true]); - hitNote.children.push(holdBit); - holdBit.parent = hitNote; - noteArray.push(holdBit); - } - var endBit:Note = Type.createInstance(type, [songNote.player, endMs, songNote.laneIndex, 0, songNote.kind, true]); - hitNote.children.push(endBit); - noteArray.push(endBit); - - endBit.parent = hitNote; - hitNote.tail = endBit; - } - } - - return noteArray; - } - */ - public function loadMusic(path:String, overwrite:Bool = true) { // this could be better if (instLoaded && !overwrite) return true; var instPath:String = path + Util.pathSuffix('Inst', audioSuffix); diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index 7b021e4..0808583 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -7,7 +7,7 @@ import funkin.objects.play.Lane; import funkin.backend.play.Scoring; import funkin.objects.play.Strumline; -@:structInit class NoteEvent implements IPlayEvent { +@:structInit class NoteEvent implements IPlayEvent { // TODO: EVENT RECYCLER public var type(default, null):NoteEventType; public var cancelled:Bool = false; @@ -32,17 +32,17 @@ import funkin.objects.play.Strumline; public var playAnimation:Bool = true; public var animateReceptor:Bool = true; + var game:PlayState = null; + var inGame:Bool = false; + public function cancel() cancelled = true; public function dispatch() { // hahaaa if (cancelled) return; - var game:PlayState; - if (Std.isOfType(FlxG.state, PlayState)) { + inGame = Std.isOfType(FlxG.state, PlayState); + if (inGame) { game = cast FlxG.state; scoreHandler ??= game.scoring; - } else { - throw(new haxe.Exception('note event can\'t be dispatched outside of PlayState!!')); - return; } switch (type) { @@ -58,39 +58,28 @@ import funkin.objects.play.Strumline; game.hitsound.play(true); if (applyRating) { + applyExtraWindow(6); scoring ??= scoreHandler?.judgeNoteHit(note, (lane.cpu ? 0 : note.msTime - lane.conductorInUse.songPosition)); + if (popRating) { var rating:FunkinSprite = game.popRating(scoring.rating); rating.velocity.y = -FlxG.random.int(140, 175); rating.velocity.x = FlxG.random.int(0, 10); rating.acceleration.y = 550; } - applyExtraWindow(6); - game.totalHits ++; - game.totalNotes ++; - game.health += note.healthGain * scoring.healthMod; - if (scoreHandler != null) { - scoreHandler.countRating(scoring.rating); - note.score = scoring; - - scoreHandler.score += scoring.score; - scoreHandler.addMod(scoring.accuracyMod); - if (scoring.hitWindow != null && scoring.hitWindow.breaksCombo) { - scoreHandler.combo = 0; // maybe add the ghost note here? - } else { - scoreHandler.combo ++; - } - } + if (inGame) + game.health += note.healthGain * scoring.healthMod; - game.updateScoreText(); + applyScore(scoreHandler, scoring); + note.score = scoring; } if (doSplash && (scoring.hitWindow == null || scoring.hitWindow.splash)) splash = lane.splash(); if (playAnimation && targetCharacter != null) { - var anim:String = 'sing${game.singAnimations[note.noteData]}'; + var anim:String = 'sing${game.singAnimations[note.laneIndex]}'; var suffixAnim:String = anim + animSuffix; if (targetCharacter.animationExists(suffixAnim + targetCharacter.animSuffix)) targetCharacter.playAnimationSteps(suffixAnim, true); @@ -146,13 +135,13 @@ import funkin.objects.play.Strumline; final secondDiff:Float = Math.max(0, (nextHitTime - prevHitTime) * .001); scoring ??= {score: 0, healthMod: secondDiff}; - if (scoreHandler != null) { + if (scoreHandler != null) scoring.score = scoreHandler.holdScorePerSecond * secondDiff; - scoreHandler.score += scoring.score; - } - game.health += scoring.healthMod * note.healthGainPerSecond; - game.updateScoreText(); + if (inGame) + game.health += scoring.healthMod * note.healthGainPerSecond; + + applyScore(scoreHandler, scoring); if (!released) note.held = true; @@ -160,7 +149,7 @@ import funkin.objects.play.Strumline; } if (playAnimation && targetCharacter != null) { - var anim:String = 'sing${game.singAnimations[note.noteData]}'; + var anim:String = 'sing${game.singAnimations[note.laneIndex]}'; var suffixAnim:String = anim + animSuffix + targetCharacter.animSuffix; if ((!targetCharacter.specialAnim || targetCharacter.currentAnimation == suffixAnim) && targetCharacter.animationExists(suffixAnim)) targetCharacter.timeAnimSteps(); @@ -207,19 +196,18 @@ import funkin.objects.play.Strumline; } applyExtraWindow(15); - if (applyRating) { - game.score -= 10; - game.health -= .01; - game.updateScoreText(); - } + scoring ??= scoreHandler?.judgeNoteGhost(); + + applyScore(scoreHandler, scoring); case LOST: - if (game.genericVocals != null) + if (inGame && game.genericVocals != null) game.genericVocals.volume = 0; + if (targetCharacter != null) { targetCharacter.volume = 0; if (playAnimation) { targetCharacter.specialAnim = false; - targetCharacter.playAnimationSteps('sing${game.singAnimations[note.noteData]}miss', true); + targetCharacter.playAnimationSteps('sing${game.singAnimations[note.laneIndex]}miss', true); } } @@ -228,28 +216,35 @@ import funkin.objects.play.Strumline; if (applyRating) { scoring ??= scoreHandler?.judgeNoteMiss(note); - if (popRating) { + + if (popRating && inGame) { var rating:FunkinSprite = game.popRating('sadmiss'); rating.velocity.y = -FlxG.random.int(80, 95); rating.velocity.x = FlxG.random.int(-6, 6); rating.acceleration.y = 240; } - if (scoreHandler != null) { - game.totalNotes ++; - scoreHandler.combo = 0; - scoreHandler.misses ++; - scoreHandler.score += scoring.score; - scoreHandler.addMod(scoring.accuracyMod); - } - - game.health -= note.healthLoss * scoring.healthMod; + if (inGame) + game.health -= note.healthLoss * scoring.healthMod; - game.updateScoreText(); + applyScore(scoreHandler, scoring); } default: } } + function applyScore(handler:ScoreHandler, score:Score) { + if (handler == null || score == null || !applyRating) return; + + if (inGame) { + game.totalNotes += score.hits + score.misses; + game.totalHits += score.hits; + } + + handler.applyScore(score); + + if (inGame) + game.updateScoreText(); + } function applyExtraWindow(window:Float) { @:privateAccess { var extraWin:Float = Math.min(lane.extraWindow + window, 200); diff --git a/source/funkin/backend/play/ScoreHandler.hx b/source/funkin/backend/play/ScoreHandler.hx index c433881..a0be57a 100644 --- a/source/funkin/backend/play/ScoreHandler.hx +++ b/source/funkin/backend/play/ScoreHandler.hx @@ -9,6 +9,7 @@ class ScoreHandler { public var score:Float = 0; public var accuracyMod:Float = 0; public var accuracyDiv:Float = 0; + public var hits(default, set):Int = 0; public var combo(default, set):Int = 0; public var misses(default, set):Int = 0; @:isVar public var accuracy(get, never):Float = 0; @@ -16,6 +17,7 @@ class ScoreHandler { public var onMissesChange:FlxTypedSignal Void> = new FlxTypedSignal(); public var onComboChange:FlxTypedSignal Void> = new FlxTypedSignal(); + public var onHit:FlxTypedSignal Void> = new FlxTypedSignal(); public var hitWindows:Array = []; public var holdScorePerSecond:Float; @@ -40,6 +42,22 @@ class ScoreHandler { ratingCount.clear(); } + public function applyScore(score:Score) { + this.hits += score.hits; + this.score += score.score; + this.misses += score.misses; + + if (score.rating != null) + countRating(score.rating); + if (score.accuracyMod >= 0) + addMod(score.accuracyMod); + if (score.breaksCombo) { + combo = 0; + } else { + combo += score.hits; + } + } + public function judgeNoteHit(note:funkin.objects.play.Note, time:Float):Score { return switch (system) { case EMI | WEEK7 | LEGACY: @@ -51,12 +69,15 @@ class ScoreHandler { score; } } + public function judgeNoteGhost():Score { + return {score: -10}; + } public function judgeNoteMiss(note:funkin.objects.play.Note):Score { return switch (system) { case EMI: - {score: -50}; + {score: -50, misses: 1, accuracyMod: 0, breaksCombo: true}; default: - {score: -10}; + {score: -10, misses: 1, accuracyMod: 0, breaksCombo: true}; } } public function getHitWindow(rating:String) @@ -70,6 +91,12 @@ class ScoreHandler { accuracyDiv += div; } + function set_hits(newHits:Int):Int { + if (newHits == hits) + return newHits; + onHit.dispatch(newHits); + return hits = newHits; + } function set_combo(newCombo:Int):Int { if (newCombo == combo) return newCombo; diff --git a/source/funkin/backend/play/Scoring.hx b/source/funkin/backend/play/Scoring.hx index dd3cb7e..9453fa0 100644 --- a/source/funkin/backend/play/Scoring.hx +++ b/source/funkin/backend/play/Scoring.hx @@ -65,7 +65,7 @@ class Scoring { } } - return {hitWindow: win, rating: win.rating, healthMod: win.healthMod, accuracyMod: win.accuracyMod, score: win.score}; + return {hits: 1, hitWindow: win, rating: win.rating, healthMod: win.healthMod, accuracyMod: win.accuracyMod, score: win.score, breaksCombo: win.breaksCombo}; } public static function judgePBOT1(hitWindows:Array, hitWindow:Float, time:Float):Score { var win:HitWindow = hitWindows[hitWindows.length - 1]; @@ -93,16 +93,19 @@ class Scoring { accuracyMod = score / maxScore; } - return {hitWindow: win, rating: win.rating, healthMod: win.healthMod, accuracyMod: accuracyMod, score: score}; + return {hits: 1, hitWindow: win, rating: win.rating, healthMod: win.healthMod, accuracyMod: accuracyMod, score: score, breaksCombo: win.breaksCombo}; } } @:structInit class Score { // TODO: move to typedef? + public var rating:Null = null; public var hitWindow:HitWindow = null; - public var accuracyMod:Float = 0; + public var breaksCombo:Bool = false; + public var accuracyMod:Float = -1; public var healthMod:Float = 1; - public var rating:String = ''; public var score:Float = 0; + public var misses:Int = 0; + public var hits:Int = 0; } enum abstract ScoringSystem(String) to String { diff --git a/source/funkin/backend/rhythm/Conductor.hx b/source/funkin/backend/rhythm/Conductor.hx index 0a0da26..76935d5 100644 --- a/source/funkin/backend/rhythm/Conductor.hx +++ b/source/funkin/backend/rhythm/Conductor.hx @@ -13,6 +13,7 @@ class Conductor { public var stepCrochet(get, never):Float; public var timeSignature(get, never):TimeSignature; @:isVar public var songPosition(get, set):Float = 0; + @:isVar public var tempoChanges(get, set):Array; @:isVar public var step(get, set):Float; @:isVar public var beat(get, set):Float; @@ -23,6 +24,7 @@ class Conductor { public var barHit:FlxTypedSignal Void> = new FlxTypedSignal(); public var beatHit:FlxTypedSignal Void> = new FlxTypedSignal(); public var stepHit:FlxTypedSignal Void> = new FlxTypedSignal(); + public var advance:FlxTypedSignal Void> = new FlxTypedSignal(); public var metronome:Metronome; public var syncTracker:FlxSound; @@ -42,11 +44,13 @@ class Conductor { songPosition += Math.min(elapsedMS, 250) * timeScale; if (syncTracker != null) { timeScale = syncTracker.pitch; - if (syncTracker.playing && Math.abs(songPosition - syncTracker.time) > maxDisparity * timeScale) + if (syncTracker.playing && Math.abs(metronome.ms - syncTracker.time) > maxDisparity * timeScale) songPosition = syncTracker.time; } if (dispatchEvents) { + advance.dispatch(metronome.ms); + var curBar:Int = Math.floor(metronome.bar); var curBeat:Int = Math.floor(metronome.beat); var curStep:Int = Math.floor(metronome.step); @@ -63,6 +67,8 @@ class Conductor { public function get_crochet():Float { return metronome.getCrochet(metronome.bpm, metronome.timeSignature.denominator); } public function get_stepCrochet():Float { return (crochet * .25); } + public function get_tempoChanges():Array { return metronome.tempoChanges; } + public function set_tempoChanges(newArray:Array):Array { return metronome.tempoChanges = newArray; } public function get_songPosition():Float { return metronome.ms; } public function set_songPosition(newMS:Float):Float { return metronome.setMS(newMS); } public function get_timeSignature():TimeSignature { return metronome.timeSignature; } diff --git a/source/funkin/backend/scripting/HScript.hx b/source/funkin/backend/scripting/HScript.hx index 17004b7..77ab7f1 100644 --- a/source/funkin/backend/scripting/HScript.hx +++ b/source/funkin/backend/scripting/HScript.hx @@ -42,6 +42,7 @@ class HScript extends Iris { 'FunkinSound' => funkin.backend.FunkinSound, 'FunkinSprite' => funkin.backend.FunkinSprite, + 'FunkinCamera' => funkin.backend.FunkinCamera, 'FunkinAnimate' => funkin.backend.FunkinAnimate, 'FunkinSpriteGroup' => funkin.backend.FunkinSpriteGroup, @@ -79,6 +80,7 @@ class HScript extends Iris { public var scriptPath:Null = null; public var scriptName:String = ''; public var compiled:Bool = false; + public var failed:Bool = false; public var active:Bool = true; var executed:Bool = false; var modInterp:ModInterp; @@ -135,7 +137,7 @@ class HScript extends Iris { } public function run(?func:String, ?args:Array, safe:Bool = true):Any { - if (!compiled || !active) return null; + if (!compiled || failed || !active) return null; try { if (func != null) { if (!executed) execute(); @@ -147,8 +149,18 @@ class HScript extends Iris { } else { return execute(); } - } catch (e:IrisError) { - errorCaught(e); + } catch (e:Dynamic) { + if (!executed) + failed = true; + + var irisE:IrisError; + if (Std.isOfType(e, IrisError)) { + irisE = cast e; + } else { + @:privateAccess irisE = new IrisError(ECustom(Std.string(e)), parser.readPos, parser.readPos, parser.origin, parser.line); + } + + errorCaught(irisE); return null; } } @@ -185,6 +197,7 @@ class HScript extends Iris { if (newCode == scriptString) return scriptString; scriptCode = newCode; + failed = false; try { parse(true); compiled = true; diff --git a/source/funkin/backend/scripting/HScriptClasses.hx b/source/funkin/backend/scripting/HScriptClasses.hx index 7809b13..c81742a 100644 --- a/source/funkin/backend/scripting/HScriptClasses.hx +++ b/source/funkin/backend/scripting/HScriptClasses.hx @@ -44,14 +44,14 @@ class HScriptFlxColor { // i hate it in here public static var TRANSPARENT(default, never):Int = cast FlxColor.TRANSPARENT; public var color:FlxColor; - public var alpha(default, set):Int; - public var alphaFloat(default, set):Float; @:isVar public var red(get, set):Int; @:isVar public var green(get, set):Int; @:isVar public var blue(get, set):Int; + @:isVar public var alpha(get, set):Int; @:isVar public var redFloat(get, set):Float; @:isVar public var greenFloat(get, set):Float; @:isVar public var blueFloat(get, set):Float; + @:isVar public var alphaFloat(get, set):Float; @:isVar public var hue(get, set):Float; @:isVar public var cyan(get, set):Float; @:isVar public var magenta(get, set):Float; @@ -65,7 +65,9 @@ class HScriptFlxColor { // i hate it in here this.color = cast (color, FlxColor); } // this is so horrible i could kill myself function set_alpha(newAlpha:Int) return alpha = color.alpha = newAlpha; + function get_alpha() return color.alpha; function set_alphaFloat(newAlpha:Float) return alphaFloat = color.alphaFloat = newAlpha; + function get_alphaFloat() return color.alphaFloat; function get_red() return color.red; function set_red(newRed:Int) return red = color.red = newRed; function get_green() return color.green; diff --git a/source/funkin/debug/DebugDisplay.hx b/source/funkin/debug/DebugDisplay.hx index bbb86ad..5406b56 100644 --- a/source/funkin/debug/DebugDisplay.hx +++ b/source/funkin/debug/DebugDisplay.hx @@ -1,22 +1,83 @@ package funkin.debug; -import flixel.FlxG; +import openfl.geom.Point; +import openfl.display.Sprite; +import openfl.display.Bitmap; import openfl.text.TextField; import openfl.text.TextFormat; -import openfl.system.System; -class DebugDisplay extends TextField { - public var currentFPS(default, null):Int; - public var mem:Float; - public var maxMem:Float; +class DebugDisplay extends Sprite { + public var perfCounter:PerfCounter; + public var watermark:X3Watermark; + public var offset:Point; + + public var showWatermark:Bool = false; + + public function new(x:Float = 10, y:Float = 3) { + super(); + + offset = new Point(x, y); + watermark = new X3Watermark(x); + perfCounter = new PerfCounter(x, y); + + addChild(watermark); + addChild(perfCounter); + } + + override function __enterFrame(deltaTime:Float):Void { + perfCounter.update(deltaTime); + + final deltaSec:Float = deltaTime * .001; + if (showWatermark) { + watermark.p = Math.min(watermark.p + deltaSec / watermark.time, 1); + } else { + watermark.p = Math.max(watermark.p - deltaSec / watermark.time, 0); + } + + final winHeight:Int = FlxG.stage.window.height; + watermark.y = winHeight - Std.int((watermark.height + offset.y) * watermark.p); + watermark.visible = (watermark.y < winHeight); + } +} + +class X3Watermark extends Sprite { + public var time:Float = 1.25; + public var p:Float = 0; + + public function new(x:Float = 0, y:Float = 0) { + super(); + + this.x = x; + this.y = y; + + var icon:Bitmap = new Bitmap(Paths.bmd('x3')); + + var text:TextField = new TextField(); + text.x = icon.width + 8; + text.autoSize = LEFT; + text.selectable = false; + text.mouseEnabled = false; + text.text = '${Main.engineVersion} by emi3'; + text.defaultTextFormat = new TextFormat('_sans', 12, FlxColor.WHITE); + + addChild(icon); + addChild(text); + } +} + +class PerfCounter extends TextField { public var showFPS:Bool = true; public var showMem:Bool = true; - public static var byteUnits:Array = ['bytes', 'kb', 'mb', 'gb']; - @:noCompletion private var currentTime:Float; - @:noCompletion private var times:Array; + var mem:Float; + var maxMem:Float; + var currentFPS:Int; + + var currentTime:Float; + var times:Array; + static var byteUnits:Array = ['bytes', 'kb', 'mb', 'gb']; - public function new(x:Float = 10, y:Float = 10, color:Int = 0xffffff) { + public function new(x:Float = 0, y:Float = 0) { super(); this.x = x; @@ -29,7 +90,7 @@ class DebugDisplay extends TextField { mouseEnabled = false; // filters = [new openfl.filters.GlowFilter(0, 4, 2, 2)]; - var tf:TextFormat = new TextFormat('_sans', 12, color); + var tf:TextFormat = new TextFormat('_sans', 12, FlxColor.WHITE); tf.leading = -4; defaultTextFormat = tf; @@ -37,7 +98,7 @@ class DebugDisplay extends TextField { times = []; } - override function __enterFrame(deltaTime:Float):Void { + public function update(deltaTime:Float):Void { var oldFPS:Int = currentFPS; var oldMem:Float = mem; @@ -46,12 +107,11 @@ class DebugDisplay extends TextField { while (times[0] < currentTime - 1000) times.shift(); currentFPS = Math.round((oldFPS + times.length) / 2); - mem = cast(System.totalMemory, UInt); + mem = cast(openfl.system.System.totalMemory, UInt); if (oldFPS != currentFPS || oldMem != mem) { maxMem = Math.max(mem, maxMem); - text = (showFPS ? 'FPS: ${Math.min(currentFPS, FlxG.drawFramerate)}' : '') + - (showMem ? '\nGC MEM: ${DebugDisplay.formatBytes(mem)} / ${DebugDisplay.formatBytes(maxMem)}' : ''); + text = (showFPS ? 'FPS: ${Math.min(currentFPS, FlxG.drawFramerate)}' : '') + (showMem ? '\nGC MEM: ${formatBytes(mem)} / ${formatBytes(maxMem)}' : ''); } } diff --git a/source/funkin/objects/Character.hx b/source/funkin/objects/Character.hx index c5d4537..c28da7b 100644 --- a/source/funkin/objects/Character.hx +++ b/source/funkin/objects/Character.hx @@ -16,6 +16,8 @@ class Character extends FunkinSprite implements ICharacter { public var scaleMultiplier:Float = 1; public var sway:Bool = false; + public var hasDropAnimations(get, never):Bool; + public var hasComboAnimations(get, never):Bool; public var comboNoteCounts(default, null):Array; public var dropNoteCounts(default, null):Array; @@ -289,9 +291,9 @@ class Character extends FunkinSprite implements ICharacter { return false; if (sway) { - playAnimation((beat % 2 == 0 ? 'danceLeft' : 'danceRight') + idleSuffix); - } else if (beat % 2 == 0) { - playAnimation('idle$idleSuffix'); + playAnimation((beat % 2 == 0 ? 'danceLeft' : 'danceRight') + idleSuffix, forced); + } else if (forced || beat % bopFrequency == 0) { + playAnimation('idle$idleSuffix', forced); } return true; @@ -527,6 +529,8 @@ class Character extends FunkinSprite implements ICharacter { } } + function get_hasComboAnimations():Bool { return comboNoteCounts.length > 0; } + function get_hasDropAnimations():Bool { return dropNoteCounts.length > 0; } function findCountAnimations(prefix:String):Array { var counts:Array = []; diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 27010b1..20ce0e9 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -15,6 +15,9 @@ using StringTools; class Lane extends FunkinSpriteGroup { public var rgbShader:RGBSwap; public var splashRGB:RGBSwap; + + public var startX:Float; + public var startY:Float; public var held(default, set):Bool = false; public var heldNote:Note = null; @@ -65,6 +68,9 @@ class Lane extends FunkinSpriteGroup { public function new(x:Float, y:Float, data:Int) { super(x, y); + startX = x; + startY = y; + inputFilter = (note:Note) -> { var time:Float = note.msTime - conductorInUse.songPosition; return (time <= note.hitWindow + extraWindow) && (time >= -note.hitWindow); diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index ed2eb3f..51e6223 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -14,9 +14,21 @@ import flixel.graphics.frames.FlxFrame; public var kind:String = ''; public var msTime:Float = 0; public var msLength:Float = 0; - public var player:Bool = true; + public var strumlineIndex:Int = 0; public var extraData:Map = null; + public function copy(?toNote:ChartNote):ChartNote { + if (toNote == null) + return {strumlineIndex: strumlineIndex, laneIndex: laneIndex, msLength: msLength, msTime: msTime, kind: kind}; + + toNote.strumlineIndex = strumlineIndex; + toNote.laneIndex = laneIndex; + toNote.msLength = msLength; + toNote.msTime = msTime; + toNote.kind = kind; + return toNote; + } + public function setVar(k:String, v:Dynamic):Dynamic { if (extraData == null) extraData = new Map(); extraData.set(k, v); @@ -49,10 +61,6 @@ class Note extends FunkinSprite { public var tail:NoteTail; public var lane:Lane; - public var score:Score; - public var held:Bool = false; - public var hitTime:Float = -1; - public var holdTime:Float = -1; public var chartNote(default, set):ChartNote; public var preventDespawn:Bool = false; @@ -61,9 +69,16 @@ class Note extends FunkinSprite { public var lost:Bool = false; public var canHit:Bool = true; + public var followVisible:Bool = true; + public var followAlpha:Bool = true; + public var followAngle:Bool = true; + + public var score:Score; + public var held:Bool = false; + public var hitTime:Float = -1; + public var holdTime:Float = -1; public var clipDistance:Float = 0; public var scrollDistance:Float = 0; - public var followAngle:Bool = true; public var healthLoss:Float = 6.0 / 100; public var healthGain:Float = 1.5 / 100; @@ -75,9 +90,12 @@ class Note extends FunkinSprite { public var directionOffset:Float = 0; public var hitPriority:Float = 1; public var multAlpha:Float = 1; - public var player:Bool = false; public var ignore:Bool = false; - public var noteData:Int = 0; + + public var laneIndex:Int = 0; + public var strumlineIndex:Int = 0; + @:deprecated('noteData is deprecated, use laneIndex instead!') public var noteData(get, set):Int; + @:deprecated('player is deprecated, use strumlineIndex instead!') public var player(get, never):Bool; public var endMs(get, never):Float; public var endBeat(get, never):Float; @@ -87,6 +105,10 @@ class Note extends FunkinSprite { public var beatLength(default, set):Float = 0; public var isHoldNote(default, null):Bool = false; + function get_noteData():Int { return laneIndex; } + function set_noteData(value:Int):Int { return laneIndex = value; } + function get_player():Bool { return (strumlineIndex == 0); } + public override function destroy() { if (tail != null) tail.destroy(); @@ -111,11 +133,11 @@ class Note extends FunkinSprite { } public function set_chartNote(songNote:ChartNote):ChartNote { if (songNote != null) { - this.player = songNote.player; this.msTime = songNote.msTime; this.noteKind = songNote.kind; this.msLength = songNote.msLength; - this.noteData = songNote.laneIndex; + this.laneIndex = songNote.laneIndex; + this.strumlineIndex = songNote.strumlineIndex; this.extraData.clear(); if (songNote.extraData != null) { @@ -151,13 +173,13 @@ class Note extends FunkinSprite { tail = new NoteTail(this); } public function reloadAnimations() { - var dirName:String = directionNames[noteData]; - addAnimation('hit-$noteData', '$dirName note', 24, false); - playAnimation('hit-$noteData', true); + var dirName:String = directionNames[laneIndex]; + addAnimation('hit-$laneIndex', '$dirName note', 24, false); + playAnimation('hit-$laneIndex', true); updateHitbox(); } public function toChartNote():ChartNote { - return chartNote ?? {laneIndex: noteData, msTime: msTime, kind: noteKind, msLength: msLength, player: player}; + return chartNote ?? {laneIndex: laneIndex, msTime: msTime, kind: noteKind, msLength: msLength, strumlineIndex: strumlineIndex}; } public function set_noteKind(newKind:String) { @@ -208,21 +230,24 @@ class Note extends FunkinSprite { var rad:Float = dir / 180 * Math.PI; x = receptor.x + Math.sin(rad) * xP + Math.cos(rad) * yP; y = receptor.y + Math.sin(rad) * yP + Math.cos(rad) * xP; - alpha = lane.alpha * receptor.alpha * multAlpha; + if (followAlpha) + alpha = receptor.alpha * multAlpha; + if (followVisible) + visible = receptor.visible; if (followAngle) angle = lane.receptor.angle; if (isHoldNote && tail != null) { - var absDistance:Float = msToDistance(msTime - conductorInUse.songPosition, Math.abs(speed)); - var tailY:Float = height * .5; - tail.offset.y = 0; - tail.angle = dir - 90; tail.scale.x = scale.x; tail.scale.y = FlxMath.signOf(speed) * Math.abs(scale.x); - tail.setPosition(x + (width - tail.width) * .5, y + tailY); - tail.sustainHeight = msToDistance(msLength, Math.abs(speed)); tail.updateHitbox(); + tail.offset.y = 0; + + var absDistance:Float = msToDistance(msTime - conductorInUse.songPosition, Math.abs(speed)); + tail.sustainHeight = msToDistance(msLength, Math.abs(speed)); + tail.setPosition(x + (width - tail.width) * .5, y + height * .5); + tail.angle = dir - 90; if (goodHit && absDistance < 0) tail.sustainClip = -absDistance; @@ -232,28 +257,38 @@ class Note extends FunkinSprite { class NoteTail extends FunkinSprite { public var parent(default, set):Note; - public var noteData:Int; + public var laneIndex:Int; public var multAlpha:Float = .6; public var sustainClip:Float = 0; public var sustainHeight:Float = 0; + public var holdScale(default, null):FlxPoint; + public var tailScale(default, null):FlxPoint; + var _tileMatrix:FlxMatrix = new FlxMatrix(); public function new(parent:Note) { super(); + holdScale = FlxPoint.get(1, 1); + tailScale = FlxPoint.get(1, 1); + this.parent = parent; this.reload(); } public override function destroy() { + holdScale.put(); + tailScale.put(); + _tileMatrix = null; super.destroy(); } function set_parent(note:Note):Note { if (parent == note) return note; - noteData = note.noteData; + + laneIndex = note.laneIndex; return parent = note; } @@ -262,10 +297,10 @@ class NoteTail extends FunkinSprite { sustainClip = 0; } public function reloadAnimations() { - var dirName:String = Note.directionNames[noteData]; - addAnimation('tail-$noteData', '$dirName hold tail', 24, false); - addAnimation('hold-$noteData', '$dirName hold piece', 24, false); - playAnimation('hold-$noteData', true); + var dirName:String = Note.directionNames[laneIndex]; + addAnimation('tail-$laneIndex', '$dirName hold tail', 24, false); + addAnimation('hold-$laneIndex', '$dirName hold piece', 24, false); + playAnimation('hold-$laneIndex', true); } public override function draw() { alpha = multAlpha; @@ -290,15 +325,16 @@ class NoteTail extends FunkinSprite { var top:Float = 1; var bottom:Float = 0; var doTail:Bool = true; - playAnimation('tail-$noteData', true); - origin.set(frameWidth * .5, 0); + var sc:FlxPoint = tailScale; + playAnimation('tail-$laneIndex', true); + origin.set(frameWidth * .5); cropFrame(top, bottom); - getDrawMatrix(); + getDrawMatrix(sc); var totalHeight:Float = sustainHeight; - var absScale:Float = Math.abs(scale.y); + var absScale:Float = Math.abs(scale.y * tailScale.y); - if (absScale < Math.max(Math.abs(scale.x), .05)) return; // TODO: add negative scale rendering (and flipY, i guess) + if (absScale < Math.max(Math.abs(scale.x), .05)) return; var scaleSign:Int = FlxMath.signOf(scale.y); var rad:Float = angle / 180 * Math.PI; @@ -312,9 +348,9 @@ class NoteTail extends FunkinSprite { totalHeight -= pieceHeight; if (totalHeight <= sustainClip) { - var dist:Float = (sustainClip - totalHeight) / absScale; - _frame = frame.clipTo(_rect.set(0, dist, frameWidth, frameHeight - dist - bottom), _frame); - getDrawMatrix(); + var dist:Float = (sustainClip - totalHeight) / absScale; // pieceHeight * frameHeight; + cropFrame(dist + top, bottom); + getDrawMatrix(sc); cut = true; } @@ -326,23 +362,30 @@ class NoteTail extends FunkinSprite { if (cut) break; if (doTail) { + sc = holdScale; + bottom = 1; doTail = false; - playAnimation('hold-$noteData', true); - origin.set(frameWidth * .5, 0); + playAnimation('hold-$laneIndex', true); + absScale = Math.abs(scale.y * holdScale.y); + origin.set(frameWidth * .5); cropFrame(top, bottom); - getDrawMatrix(); + getDrawMatrix(sc); + + if (absScale < Math.max(Math.abs(scale.x), .05)) return; } } } function cropFrame(cropTop:Float = 0, cropBottom:Float = 0) { _frame = frame.clipTo(_rect.set(0, cropTop, frameWidth, frameHeight - cropTop - cropBottom), _frame); } - function getDrawMatrix() { + function getDrawMatrix(?scaleFactor:FlxPoint) { _frame.prepareMatrix(_matrix, FlxFrameAngle.ANGLE_0, checkFlipX(), checkFlipY()); _matrix.translate(-origin.x, -origin.y); _matrix.scale(scale.x, scale.y); + if (scaleFactor != null) + _matrix.scale(scaleFactor.x, scaleFactor.y); if (bakedRotationAngle <= 0) { updateTrig(); diff --git a/source/funkin/objects/play/Strumline.hx b/source/funkin/objects/play/Strumline.hx index a2ffba6..0ea2ae5 100644 --- a/source/funkin/objects/play/Strumline.hx +++ b/source/funkin/objects/play/Strumline.hx @@ -41,6 +41,7 @@ class Strumline extends FunkinSpriteGroup { var i:Int = 0; var diff:Float = newSpacing - laneSpacing; for (lane in lanes) { + lane.startX += i * diff; lane.x += i * diff; i ++; } @@ -124,16 +125,14 @@ class Strumline extends FunkinSpriteGroup { } public function fadeIn() { var i:Int = 0; - var targetY:Float = y; for (lane in lanes) { lane.alpha = 0; - var targetX:Float = x + i * laneSpacing; var rad:Float = lane.direction / 180 * Math.PI; FlxTween.cancelTweensOf(lane); - lane.x = targetX - Math.cos(rad) * 10; - lane.y = targetY - Math.sin(rad) * 10; - FlxTween.tween(lane, {x: targetX, y: targetY, alpha: alpha}, 1, {ease: FlxEase.circOut, startDelay: .5 + i * .2}); + lane.x = lane.startX - Math.cos(rad) * 10; + lane.y = lane.startY - Math.sin(rad) * 10; + FlxTween.tween(lane, {x: lane.startX, y: lane.startY, alpha: alpha}, 1, {ease: FlxEase.circOut, startDelay: .5 + i * .2}); i ++; } @@ -221,6 +220,10 @@ class Strumline extends FunkinSpriteGroup { } return null; } + public function dequeueNote(note:ChartNote) { + for (lane in lanes) + lane.dequeueNote(note); + } public function clearAllNotes() { for (lane in lanes) lane.clearNotes(); @@ -240,4 +243,23 @@ class Strumline extends FunkinSpriteGroup { } return fired; } + + override function set_x(value:Float):Float { + if (exists && x != value) { + var diff:Float = (value - x); + transformChildren(xTransform, diff); + for (lane in lanes) + lane.startX += diff; + } + return x = value; + } + override function set_y(value:Float):Float { + if (exists && y != value) { + var diff:Float = (value - y); + transformChildren(yTransform, diff); + for (lane in lanes) + lane.startY += diff; + } + return y = value; + } } \ No newline at end of file diff --git a/source/funkin/states/CrashState.hx b/source/funkin/states/CrashState.hx index 7e4c97c..7d283f6 100644 --- a/source/funkin/states/CrashState.hx +++ b/source/funkin/states/CrashState.hx @@ -31,7 +31,6 @@ class CrashState extends FlxState { super.create(); FlxG.sound.music.stop(); - Main.watermark.visible = false; Main.instance.removeChild(Main.debugDisplay); function loadCrashAsset(sprite:FunkinSprite, ?stack:Array) { @@ -247,7 +246,6 @@ $message'; override public function destroy() { Main.instance.addChild(Main.debugDisplay); - Main.watermark.visible = true; super.destroy(); error = null; diff --git a/source/funkin/states/FreeplaySubState.hx b/source/funkin/states/FreeplaySubState.hx index 515e4d0..707efaf 100644 --- a/source/funkin/states/FreeplaySubState.hx +++ b/source/funkin/states/FreeplaySubState.hx @@ -33,7 +33,7 @@ class FreeplaySubState extends FunkinState { backingCard.slideIn(); add(backingCard); - conductorInUse.beatHit.add(beatHitEvent); + beatHit.add(beatHitEvent); angleMask = new AngleMask(); bg = new FunkinSprite(FlxG.width, 0).loadTexture('freeplay/freeplayBGdad'); @@ -64,7 +64,7 @@ class FreeplaySubState extends FunkinState { add(fnfFreeplay); add(ostName); - var testCaspule:FreeplayCapsule = new FreeplayCapsule(400, 400, 'TESTING!'); + var testCaspule:FreeplayCapsule = new FreeplayCapsule(400, 400, 'TESTING!', MEDIUM); add(testCaspule); playMusic('freeplayRandom'); @@ -221,12 +221,12 @@ class FreeplaySongText extends FlxSpriteGroup { public var font(default, set):Null; public var glowColor(default, set):FlxColor; - public function new(x:Float = 0, y:Float = 0, ?text:String, glowColor:FlxColor = 0xff00ccff, intensity:Float = 1) { + public function new(x:Float = 0, y:Float = 0, ?text:String, glowColor:FlxColor = 0xff00ccff, intensity:Float = 1, quality:BitmapFilterQuality = LOW) { super(x, y); blurText = new FlxText(0, 0, 'Random', 40); whiteText = new FlxText(0, 0, 'Random', 40); - textGlowFilter = new GlowFilter(glowColor, 1, intensity * 5, intensity * 5, 210, BitmapFilterQuality.LOW); - blurText.textField.filters = [new openfl.filters.BlurFilter(intensity * 3, intensity * 3, BitmapFilterQuality.LOW)]; + textGlowFilter = new GlowFilter(glowColor, 1, intensity * 5, intensity * 5, 210, quality); + blurText.textField.filters = [new openfl.filters.BlurFilter(intensity * 3, intensity * 3, quality)]; whiteText.textField.filters = [textGlowFilter]; blurText.blend = BlendMode.ADD; @@ -275,7 +275,8 @@ class FreeplayCapsule extends FlxSpriteGroup { capsule.playAnimation('unselected'); add(capsule); - songText = new FreeplaySongText(capsule.width * 0.26, 45, text); + songText = new FreeplaySongText(capsule.width * .26, 45, text); + songText.size = Std.int(songText.size * .8); add(songText); bpmText = new FunkinSprite(144, 87).loadTexture('freeplay/capsule/bpmtext'); diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 1e18314..3caa413 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -110,23 +110,55 @@ class PlayState extends FunkinState { override public function create() { super.create(); - Main.watermark.visible = false; + godmode = false; // practice mode? downscroll = Options.data.downscroll; middlescroll = Options.data.middlescroll; ghostTapping = Options.data.ghostTapping; conductorInUse = new Conductor(); - conductorInUse.metronome.tempoChanges = chart.tempoChanges; + conductorInUse.tempoChanges = chart.tempoChanges; + barHit.add((t:Int) -> dispatchSongEvent({type: BAR_HIT, time: t})); + beatHit.add((t:Int) -> dispatchSongEvent({type: BEAT_HIT, time: t})); + stepHit.add((t:Int) -> dispatchSongEvent({type: STEP_HIT, time: t})); hitsound = FunkinSound.load(Paths.sound('gameplay/hitsounds/hitsound'), .7); music = new FunkinSoundGroup(); songName = chart.name; + @:privateAccess FlxG.cameras.defaults.resize(0); + camOther = new FunkinCamera(); + camGame = new FunkinCamera(); + camHUD = new FunkinCamera(); + camHUD.bgColor.alpha = 0; + camGame.bgColor.alpha = 0; + camOther.bgColor.alpha = 0; + FlxG.cameras.add(camGame, true); + FlxG.cameras.add(camHUD, false); + FlxG.cameras.add(camOther, false); + + camFocusTarget = new FlxObject(0, FlxG.height * .5); + camGame.follow(camFocusTarget, LOCKON, 3); + add(camFocusTarget); + + camGame.zoomFollowLerp = camHUD.zoomFollowLerp = 3; + + uiGroup = new FunkinSpriteGroup(); + uiGroup.cameras = [camHUD]; + uiGroup.zIndex = 75; + add(uiGroup); + strumlineGroup = new FunkinTypedSpriteGroup(); + strumlineGroup.cameras = [camHUD]; + strumlineGroup.zIndex = 100; + add(strumlineGroup); + ratingGroup = new FunkinTypedSpriteGroup(); + + // the good stuff if (!simple) { var loadedEvents:Array = []; var noteKinds:Array = []; for (note in chart.notes) { + notes.push(note.copy()); var noteKind:String = note.kind; if (noteKind.trim() != '' && !noteKinds.contains(noteKind)) { hscripts.loadFromPaths('scripts/notekinds/$noteKind.hx'); @@ -145,27 +177,6 @@ class PlayState extends FunkinState { hscripts.loadFromFolder('scripts/songs/${chart.path}'); } - conductorInUse.stepHit.add((t:Int) -> dispatchSongEvent({type: STEP_HIT, time: t})); - conductorInUse.beatHit.add((t:Int) -> dispatchSongEvent({type: BEAT_HIT, time: t})); - conductorInUse.barHit.add((t:Int) -> dispatchSongEvent({type: BAR_HIT, time: t})); - - @:privateAccess FlxG.cameras.defaults.resize(0); - camOther = new FunkinCamera(); - camGame = new FunkinCamera(); - camHUD = new FunkinCamera(); - camHUD.bgColor.alpha = 0; - camGame.bgColor.alpha = 0; - camOther.bgColor.alpha = 0; - FlxG.cameras.add(camGame, true); - FlxG.cameras.add(camHUD, false); - FlxG.cameras.add(camOther, false); - - camFocusTarget = new FlxObject(0, FlxG.height * .5); - camGame.follow(camFocusTarget, LOCKON, 3); - add(camFocusTarget); - - camGame.zoomFollowLerp = camHUD.zoomFollowLerp = 3; - if (!simple) { stage = new Stage(chart); stage.setup(chart.stage); @@ -209,15 +220,6 @@ class PlayState extends FunkinState { } loadVocals(chart.path, chart.audioSuffix); - uiGroup = new FunkinSpriteGroup(); - uiGroup.cameras = [camHUD]; - uiGroup.zIndex = 75; - add(uiGroup); - strumlineGroup = new FunkinTypedSpriteGroup(); - strumlineGroup.cameras = [camHUD]; - strumlineGroup.zIndex = 100; - add(strumlineGroup); - var scrollDir:Float = (Options.data.downscroll ? 270 : 90); var strumlineBound:Float = (FlxG.width - 300) * .5; var strumlineY:Float = 50; @@ -239,17 +241,18 @@ class PlayState extends FunkinState { playerStrumline.assignKeybinds(keybinds); playerStrumline.zIndex = 50; + strumlineGroup.insert(0, playerStrumline); + strumlineGroup.insert(0, opponentStrumline); + if (middlescroll) { playerStrumline.screenCenter(X); opponentStrumline.fitToSize(playerStrumline.leftBound - 50 - opponentStrumline.leftBound, 0, Y); } - for (note in chart.notes) { - var strumline:Strumline = (note.player ? playerStrumline : opponentStrumline); - strumline.queueNote(note); - notes.push(note); + for (note in notes) { + var strumline:Strumline = strumlineGroup.members[note.strumlineIndex]; + strumline?.queueNote(note); } - ratingGroup = new FunkinTypedSpriteGroup(); ratingGroup.setPosition(player3?.getMidpoint()?.x ?? FlxG.width * .5, player3?.getMidpoint()?.y ?? FlxG.height * .5); if (stage != null) { ratingGroup.zIndex = Util.getHighestZIndex(stage.characters, 50) + 5; @@ -297,9 +300,6 @@ class PlayState extends FunkinState { scoreTxt.zIndex = 30; uiGroup.add(scoreTxt); - strumlineGroup.add(opponentStrumline); - strumlineGroup.add(playerStrumline); - for (i in 0...4) Paths.sound('gameplay/hitsounds/miss$i'); Paths.sound('gameplay/hitsounds/hitsoundTail'); @@ -313,15 +313,16 @@ class PlayState extends FunkinState { for (event in chart.events) dispatchSongEvent({type: PUSH_EVENT, chartEvent: event}); + if (downscroll) + flipUI(); + hscripts.run('createPost'); + uiGroup.sortZIndex(); stage?.sortZIndex(); updateScoreText(); sortZIndex(); - if (downscroll) - flipUI(); - if (playCountdown) { for (strumline in strumlineGroup) strumline.visible = false; @@ -412,10 +413,11 @@ class PlayState extends FunkinState { events.resize(0); for (note in notes) { - var strumline:Strumline = (note.player ? playerStrumline : opponentStrumline); - strumline.queueNote(note); + var strumline:Strumline = strumlineGroup.members[note.strumlineIndex]; + strumline?.queueNote(note); } - for (event in chart.events) events.push(event); + for (event in chart.events) + events.push(event); music.pause(); music.time = 0; resetConductor(); @@ -907,7 +909,6 @@ class PlayState extends FunkinState { DiscordRPC.presence.startTimestamp = DiscordRPC.presence.endTimestamp = 0; FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPressEvent); FlxG.stage.removeEventListener(KeyboardEvent.KEY_UP, keyReleaseEvent); - Main.watermark.visible = true; conductorInUse.paused = false; super.destroy(); } diff --git a/source/funkin/states/TitleState.hx b/source/funkin/states/TitleState.hx index e78cbe6..631e48f 100644 --- a/source/funkin/states/TitleState.hx +++ b/source/funkin/states/TitleState.hx @@ -42,10 +42,12 @@ class TitleState extends FunkinState { } } public override function create() { + super.create(); + preload(); currentIntroText = FlxG.random.getObject(introTexts) ?? ['funkin', 'FOREVER']; - conductorInUse.beatHit.add(beatHitEvent); + beatHit.add(beatHitEvent); logo = new FunkinSprite().loadAtlas('titlescreen/logo'); logo.addAnimation('bump', 'logo bumpin'); @@ -147,10 +149,6 @@ class TitleState extends FunkinState { } } } - public override function destroy() { - conductorInUse.beatHit.remove(beatHitEvent); - super.destroy(); - } public function beatHitEvent(beat:Int) { logo.playAnimation('bump', true); From 8c58644d98c3df9ffef4d2352a701979d59b1b96 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 8 Mar 2025 16:29:05 -0600 Subject: [PATCH 05/73] update more assets --- assets/data/stages/phillyBlazin.json | 4 ++-- assets/scripts/characters/nene.hx | 2 +- assets/scripts/stages/limoRide.hx | 5 ++++- assets/scripts/stages/phillyBlazin.hx | 6 +++--- assets/shaders/limoOverlay.frag | 19 +++++++++++++++++++ source/funkin/states/PlayState.hx | 11 ++++++----- 6 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 assets/shaders/limoOverlay.frag diff --git a/assets/data/stages/phillyBlazin.json b/assets/data/stages/phillyBlazin.json index 314684d..66024a0 100644 --- a/assets/data/stages/phillyBlazin.json +++ b/assets/data/stages/phillyBlazin.json @@ -61,7 +61,7 @@ "bf": { "zIndex": 2000, "scale": 1.75, - "position": [-237, 100], + "position": [1400, 1660], "cameraOffsets": [-350, -100] }, "gf": { @@ -72,7 +72,7 @@ "dad": { "zIndex": 3000, "scale": 1.75, - "position": [-237, 150], + "position": [1480, 1660], "cameraOffsets": [500, 200] } } diff --git a/assets/scripts/characters/nene.hx b/assets/scripts/characters/nene.hx index 8229b92..098fe01 100644 --- a/assets/scripts/characters/nene.hx +++ b/assets/scripts/characters/nene.hx @@ -71,8 +71,8 @@ function update(elapsed:Float) { } function draw() { aBotSpeaker.setPosition(x, y); + // aBotSpeaker.color = color; aBotSpeaker.alpha = alpha; - aBotSpeaker.color = color; aBotSpeaker.draw(); super.draw(); } diff --git a/assets/scripts/stages/limoRide.hx b/assets/scripts/stages/limoRide.hx index ebc0238..274484f 100644 --- a/assets/scripts/stages/limoRide.hx +++ b/assets/scripts/stages/limoRide.hx @@ -6,7 +6,10 @@ function setupStage(id:String, stage:Stage) { stage.characters.get('gf').current.idleSuffix = '-hairblowCar'; - // todo: whatever shader shit is in the base stage + var skyOverlay:RuntimeShader = new RuntimeShader('limoOverlay'); + skyOverlay.setSampler2D('image', Paths.bmd('limo/limoOverlay', 'week4')); + stage.getProp('limoSunset').shader = skyOverlay; + resetFastCar(); } diff --git a/assets/scripts/stages/phillyBlazin.hx b/assets/scripts/stages/phillyBlazin.hx index 374e48f..66a0375 100644 --- a/assets/scripts/stages/phillyBlazin.hx +++ b/assets/scripts/stages/phillyBlazin.hx @@ -38,9 +38,9 @@ function createPost() { rainShader.setFloat('uScale', FlxG.height / 200); rainShader.setFloatArray('uRainColor', [0x66 / 0xff, 0x80 / 0xff, 0xcc / 0xff]); camGame.addFilter(rainShader); - - player1.setPosition(1360, 1720); - player2.setPosition(1440, 1720); // uh? + + player1.dance(0, true); + player2.dance(0, true); player1.color = player2.color = 0xffdedede; player3.color = 0xff888888; ratingGroup.x += 560; diff --git a/assets/shaders/limoOverlay.frag b/assets/shaders/limoOverlay.frag new file mode 100644 index 0000000..d37798c --- /dev/null +++ b/assets/shaders/limoOverlay.frag @@ -0,0 +1,19 @@ +#pragma header + +uniform sampler2D image; + +vec4 blendOverlay(vec4 base, vec4 blend) { + vec4 mixed = mix(1.0 - 2.0 * (1.0 - base) * (1.0 - blend), 2.0 * base * blend, step(base, vec4(0.5))); + + return mixed; +} + +void main() { + vec2 funnyUv = openfl_TextureCoordv; + vec4 color = flixel_texture2D(bitmap, funnyUv); + + vec2 reallyFunnyUv = vec2(vec2(0.0, 0.0) - gl_FragCoord.xy / openfl_TextureSize.xy); + vec4 gf = flixel_texture2D(image, openfl_TextureCoordv.xy + vec2(0.1, 0.2)); + + gl_FragColor = blendOverlay(color, gf); +} \ No newline at end of file diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 3caa413..9c7f17c 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -693,11 +693,12 @@ class PlayState extends FunkinState { if (conductorInUse.syncTracker != null && conductorInUse.syncTracker.playing) conductorInUse.songPosition = newTimeMaybe; // too rigged? (Math.abs(newTimeMaybe) < Math.abs(oldTime) ? newTimeMaybe : oldTime); - if (keybind >= 0) { - if (!HScript.stopped(hscripts.run('keybindPressed', [keybind, key]))) { - for (strumline in strumlineGroup) - strumline.fireInput(key, true); - } + var canFireInput:Bool = true; + if (keybind >= 0) + canFireInput = !HScript.stopped(hscripts.run('keybindPressed', [keybind, key])); + if (canFireInput) { + for (strumline in strumlineGroup) + strumline.fireInput(key, true); } conductorInUse.songPosition = oldTime; From 281718dcc5b810709f70bbcede84f06fee5b2718 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Mon, 10 Mar 2025 02:23:53 -0600 Subject: [PATCH 06/73] note generation improvements, etc - strumlineIndex isnt bound to only strumlines 0 and 1 in legacy charts anymore!! - TempoChange.toString() - Metronome.sortTempoChanges() - also accessible in Conductor - copy function for rgb and mono swap shaders - notekind scripts are loaded after global/song scripts. hopefully gives more control if you need to add or change mid.creation - Note.tailOffset - rgb shader is now created per note (not as big of a concern as it was when there was No note pooling) - copies lane rgb on spawn --- source/funkin/backend/play/Chart.hx | 8 ++++-- source/funkin/backend/rhythm/Conductor.hx | 4 +++ source/funkin/backend/rhythm/Metronome.hx | 4 +++ source/funkin/backend/rhythm/TempoChange.hx | 8 ++++++ source/funkin/objects/play/Lane.hx | 10 +++---- source/funkin/objects/play/Note.hx | 29 +++++++++++++++------ source/funkin/shaders/MonoSwap.hx | 15 ++++++++++- source/funkin/shaders/RGBSwap.hx | 18 +++++++++++-- source/funkin/states/PlayState.hx | 20 ++++++++------ 9 files changed, 90 insertions(+), 26 deletions(-) diff --git a/source/funkin/backend/play/Chart.hx b/source/funkin/backend/play/Chart.hx index 549a286..924a290 100644 --- a/source/funkin/backend/play/Chart.hx +++ b/source/funkin/backend/play/Chart.hx @@ -309,9 +309,13 @@ class Chart { if (!Std.isOfType(noteKind, String)) noteKind = ''; var strumlineIndex:Int = 0; if (fromSong) { - strumlineIndex = ((noteData < keyCount) == section.mustHitSection ? 1 : 0); + strumlineIndex = Std.int(noteData / keyCount); + if (section.mustHitSection) + strumlineIndex += (strumlineIndex % 2 == 0 ? 1 : -1); } else { // assume psych 1.0 - strumlineIndex = (noteData < keyCount ? 1 : 0); + strumlineIndex = Std.int(noteData / keyCount); + if (strumlineIndex < 2) // how silly + strumlineIndex = 1 - strumlineIndex; } song.notes.push({strumlineIndex: strumlineIndex, msTime: noteTime, laneIndex: noteData % keyCount, msLength: noteLength, kind: noteKind}); diff --git a/source/funkin/backend/rhythm/Conductor.hx b/source/funkin/backend/rhythm/Conductor.hx index 76935d5..c7bd92e 100644 --- a/source/funkin/backend/rhythm/Conductor.hx +++ b/source/funkin/backend/rhythm/Conductor.hx @@ -86,4 +86,8 @@ class Conductor { public function resetToDefault() { metronome = new Metronome(); } + + public function sortTempoChanges() { + metronome.sortTempoChanges(); + } } \ No newline at end of file diff --git a/source/funkin/backend/rhythm/Metronome.hx b/source/funkin/backend/rhythm/Metronome.hx index f0293ee..bcdcded 100644 --- a/source/funkin/backend/rhythm/Metronome.hx +++ b/source/funkin/backend/rhythm/Metronome.hx @@ -165,6 +165,10 @@ class Metronome { bpm = prevBPM; return target; } + + public function sortTempoChanges() { + tempoChanges.sort((a:TempoChange, b:TempoChange) -> Std.int(a.beatTime) - Std.int(b.beatTime)); + } } enum abstract Measure(String) to String { diff --git a/source/funkin/backend/rhythm/TempoChange.hx b/source/funkin/backend/rhythm/TempoChange.hx index d2d7a34..4876ccc 100644 --- a/source/funkin/backend/rhythm/TempoChange.hx +++ b/source/funkin/backend/rhythm/TempoChange.hx @@ -24,6 +24,14 @@ class TempoChange { return (bpm != null); public function get_changeSign() return (timeSignature != null); + + public function toString():String { + var str:String = '(beatTime: $beatTime'; + if (changeBPM) str += ' | bpm: $bpm'; + if (changeSign) str += ' | timeSignature: $timeSignature'; + + return '$str)'; + } } class TimeSignature { //should this be a class? diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 20ce0e9..90f5373 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -18,10 +18,10 @@ class Lane extends FunkinSpriteGroup { public var startX:Float; public var startY:Float; - + public var held(default, set):Bool = false; public var heldNote:Note = null; - + public var noteData:Int; public var oneWay:Bool = true; public var scrollSpeed(default, set):Float = 1; @@ -93,9 +93,9 @@ class Lane extends FunkinSpriteGroup { topMembers.push(mem); // render conditionally this.add(mem); } - + noteCover.shader = splashRGB.shader; - + spark().alpha = .0001; splash().alpha = .0001; } @@ -312,8 +312,8 @@ class Lane extends FunkinSpriteGroup { note.hitWindow = hitWindow; note.reload(); - note.shader = rgbShader.shader; note.scale.copyFrom(receptor.scale); + note.rgbShader = rgbShader.copy(note.rgbShader); note.updateHitbox(); updateNote(note); diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 51e6223..c4d1218 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -1,5 +1,6 @@ package funkin.objects.play; +import funkin.shaders.RGBSwap; import funkin.objects.play.Lane; import funkin.backend.play.Scoring; import funkin.backend.rhythm.Event; @@ -59,6 +60,8 @@ class Note extends FunkinSprite { public var conductorInUse:Conductor; // mostly charting stuff public var tail:NoteTail; + public var rgbShader(default, set):RGBSwap; + public var tailOffset(default, null):FlxPoint; public var lane:Lane; public var chartNote(default, set):ChartNote; @@ -110,6 +113,7 @@ class Note extends FunkinSprite { function get_player():Bool { return (strumlineIndex == 0); } public override function destroy() { + tailOffset.put(); if (tail != null) tail.destroy(); super.destroy(); @@ -127,6 +131,7 @@ class Note extends FunkinSprite { super(); this.conductorInUse = conductor ?? FunkinState.getCurrentConductor(); + this.tailOffset = FlxPoint.get(); this.chartNote = songNote; reload(); @@ -157,6 +162,7 @@ class Note extends FunkinSprite { lost = goodHit = held = consumed = preventDespawn = ignore = false; followAngle = canHit = visible = true; holdTime = hitTime = -1; + tailOffset.set(); multAlpha = 1; clipDistance = 0; if (tail != null) { @@ -182,37 +188,44 @@ class Note extends FunkinSprite { return chartNote ?? {laneIndex: laneIndex, msTime: msTime, kind: noteKind, msLength: msLength, strumlineIndex: strumlineIndex}; } - public function set_noteKind(newKind:String) { + function set_noteKind(newKind:String) { return noteKind = newKind; } - public function set_msTime(newTime:Float) { + function set_msTime(newTime:Float) { if (msTime == newTime) return newTime; @:bypassAccessor beatTime = conductorInUse.convertMeasure(newTime, MS, BEAT); return msTime = newTime; } - public function set_beatTime(newTime:Float) { + function set_beatTime(newTime:Float) { if (beatTime == newTime) return newTime; @:bypassAccessor msTime = conductorInUse.convertMeasure(newTime, BEAT, MS); return beatTime = newTime; } - public function set_msLength(newLength:Float) { + function set_msLength(newLength:Float) { if (msLength == newLength) return newLength; msLength = newLength; @:bypassAccessor beatLength = conductorInUse.convertMeasure(msTime + newLength, MS, BEAT) - beatTime; updateTail(); return newLength; } - public function set_beatLength(newLength:Float) { + function set_beatLength(newLength:Float) { if (beatLength == newLength) return newLength; beatLength = newLength; @:bypassAccessor msLength = conductorInUse.convertMeasure(beatTime + newLength, BEAT, MS) - msTime; updateTail(); return newLength; } - public function get_endMs() + function get_endMs() return msTime + msLength; - public function get_endBeat() + function get_endBeat() return beatTime + beatLength; + function set_rgbShader(newShd:RGBSwap):RGBSwap { + if (newShd != null) + shader = newShd.shader; + if (newShd == null && rgbShader != null && shader == rgbShader.shader) + shader = null; + return rgbShader = newShd; + } public static function distanceToMS(distance:Float, scrollSpeed:Float) return distance / (.45 * scrollSpeed); @@ -246,7 +259,7 @@ class Note extends FunkinSprite { var absDistance:Float = msToDistance(msTime - conductorInUse.songPosition, Math.abs(speed)); tail.sustainHeight = msToDistance(msLength, Math.abs(speed)); - tail.setPosition(x + (width - tail.width) * .5, y + height * .5); + tail.setPosition(x - tailOffset.x + (width - tail.width) * .5, y - tailOffset.y + receptor.height * .5); tail.angle = dir - 90; if (goodHit && absDistance < 0) diff --git a/source/funkin/shaders/MonoSwap.hx b/source/funkin/shaders/MonoSwap.hx index 068d010..172760d 100644 --- a/source/funkin/shaders/MonoSwap.hx +++ b/source/funkin/shaders/MonoSwap.hx @@ -5,6 +5,15 @@ class MonoSwap { public var black(default, set):FlxColor; public var shader(default, null):MonoSwapShader = new MonoSwapShader(); + public function copy(?targetShd:MonoSwap):MonoSwap { + if (targetShd != null) { + targetShd.white = white; + targetShd.black = black; + } else { + targetShd = new MonoSwap(white, black); + } + return targetShd; + } public function set_white(newC:FlxColor) { shader.white.value = [newC.redFloat, newC.greenFloat, newC.blueFloat, newC.alphaFloat]; return white = newC; @@ -13,10 +22,14 @@ class MonoSwap { shader.black.value = [newC.redFloat, newC.greenFloat, newC.blueFloat, newC.alphaFloat]; return black = newC; } - public function new(white:FlxColor = FlxColor.WHITE, black:FlxColor = FlxColor.BLACK) { + public function set(white:FlxColor = FlxColor.WHITE, black:FlxColor = FlxColor.BLACK) { this.white = white; this.black = black; } + + public function new(white:FlxColor = FlxColor.WHITE, black:FlxColor = FlxColor.BLACK) { + this.set(white, black); + } } class MonoSwapShader extends flixel.system.FlxAssets.FlxShader { diff --git a/source/funkin/shaders/RGBSwap.hx b/source/funkin/shaders/RGBSwap.hx index 7c48a99..83af0b2 100644 --- a/source/funkin/shaders/RGBSwap.hx +++ b/source/funkin/shaders/RGBSwap.hx @@ -5,7 +5,17 @@ class RGBSwap { // im coming public var blue(default, set):FlxColor; public var green(default, set):FlxColor; public var shader(default, null):RGBSwapShader = new RGBSwapShader(); - + + public function copy(?targetShd:RGBSwap):RGBSwap { + if (targetShd != null) { + targetShd.green = green; + targetShd.blue = blue; + targetShd.red = red; + } else { + targetShd = new RGBSwap(red, green, blue); + } + return targetShd; + } public function set_red(newC:FlxColor) { shader.red.value = [newC.redFloat, newC.greenFloat, newC.blueFloat]; return red = newC; @@ -18,11 +28,15 @@ class RGBSwap { // im coming shader.blue.value = [newC.redFloat, newC.greenFloat, newC.blueFloat]; return blue = newC; } - public function new(red:FlxColor = FlxColor.RED, green:FlxColor = FlxColor.LIME, blue:FlxColor = FlxColor.BLUE) { + public function set(red:FlxColor = FlxColor.RED, green:FlxColor = FlxColor.LIME, blue:FlxColor = FlxColor.BLUE) { this.red = red; this.blue = blue; this.green = green; } + + public function new(red:FlxColor = FlxColor.RED, green:FlxColor = FlxColor.LIME, blue:FlxColor = FlxColor.BLUE) { + this.set(red, green, blue); + } } class RGBSwapShader extends flixel.system.FlxAssets.FlxShader { diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 9c7f17c..bb40b83 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -121,6 +121,7 @@ class PlayState extends FunkinState { barHit.add((t:Int) -> dispatchSongEvent({type: BAR_HIT, time: t})); beatHit.add((t:Int) -> dispatchSongEvent({type: BEAT_HIT, time: t})); stepHit.add((t:Int) -> dispatchSongEvent({type: STEP_HIT, time: t})); + conductorInUse.sortTempoChanges(); hitsound = FunkinSound.load(Paths.sound('gameplay/hitsounds/hitsound'), .7); music = new FunkinSoundGroup(); @@ -157,14 +158,9 @@ class PlayState extends FunkinState { if (!simple) { var loadedEvents:Array = []; var noteKinds:Array = []; - for (note in chart.notes) { + + for (note in chart.notes) notes.push(note.copy()); - var noteKind:String = note.kind; - if (noteKind.trim() != '' && !noteKinds.contains(noteKind)) { - hscripts.loadFromPaths('scripts/notekinds/$noteKind.hx'); - noteKinds.push(noteKind); - } - } for (event in chart.events) { var eventName:String = event.name; if (!loadedEvents.contains(eventName)) { @@ -175,6 +171,14 @@ class PlayState extends FunkinState { hscripts.loadFromFolder('scripts/global'); hscripts.loadFromFolder('scripts/songs/${chart.path}'); + + for (note in notes) { + var noteKind:String = note.kind; + if (noteKind.trim() != '' && !noteKinds.contains(noteKind)) { + hscripts.loadFromPaths('scripts/notekinds/$noteKind.hx'); + noteKinds.push(noteKind); + } + } } if (!simple) { @@ -668,7 +672,7 @@ class PlayState extends FunkinState { var canContinue = true; canContinue = (canContinue && !HScript.stopped(hscripts.run(func, args))); - for (chara in stage.characters) { + for (chara in stage?.characters) { if (chara == null || !chara.exists || !chara.alive) continue; var current:Character = chara.current; From e589f05a8a362621a78df866f2829f048aee7630 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Mon, 10 Mar 2025 20:35:15 -0600 Subject: [PATCH 07/73] Update Chart.hx remove stacked notes --- source/funkin/backend/play/Chart.hx | 41 ++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/source/funkin/backend/play/Chart.hx b/source/funkin/backend/play/Chart.hx index 924a290..aaaa32a 100644 --- a/source/funkin/backend/play/Chart.hx +++ b/source/funkin/backend/play/Chart.hx @@ -156,6 +156,7 @@ class Chart { this.sort(); this.findSongLength(); + this.clearStackedNotes(); return this; } public function findSongLength() { @@ -167,6 +168,25 @@ class Chart { } return this.songLength; } + public function clearStackedNotes(minDifference:Float = FlxMath.EPSILON) { + var previousNote:ChartNote = null; + var caught:Int = 0; + var i:Int = notes.length; + + while (i > 0) { + var note:ChartNote = notes[i --]; + + if (previousNote != null && Math.abs(note.msTime - previousNote.msTime) < minDifference && + previousNote.kind == note.kind && previousNote.laneIndex == note.laneIndex && previousNote.strumlineIndex == note.strumlineIndex) { + notes.remove(note); + caught ++; + } + previousNote = note; + } + + if (caught > 0) + Log.warning('caught and deleted $caught stacked ${caught == 1 ? 'note' : 'notes'} in chart!'); + } // TODO: these could just not be static // suffix is for playable characters @@ -336,12 +356,13 @@ class Chart { } song.audioSuffix = suffix; + song.clearStackedNotes(); return song; } static function loadStepMania(path:String, difficulty:String = 'Beginner', suffix:String = '') { difficulty = difficulty.toLowerCase(); Log.minor('loading StepMania simfile "$path" with difficulty "$difficulty"${suffix == '' ? '' : ' ($suffix)'}'); - + var songPath:String = 'data/songs/$path/$path'; var sscPath:String = '${Util.pathSuffix(songPath, suffix)}.ssc'; var smPath:String = '$songPath.sm'; @@ -354,7 +375,7 @@ class Chart { Log.minor('- chart: $smPath OR $sscPath'); return song; } - + var time = Sys.time(); var shark:StepManiaShark; @:privateAccess try { @@ -382,12 +403,12 @@ class Chart { static function loadModernChart(path:String, difficulty:String = 'normal', suffix:String = '') { difficulty = difficulty.toLowerCase(); Log.minor('loading modern FNF song "$path" with difficulty "$difficulty"${suffix == '' ? '' : ' ($suffix)'}'); - + var songPath:String = 'data/songs/$path/$path'; var chartPath:String = '${Util.pathSuffix('$songPath-chart', suffix)}.json'; var metaPath:String = '${Util.pathSuffix('$songPath-metadata', suffix)}.json'; var song:Chart = new Chart(path, 4); - + if (!Paths.exists(chartPath) || !Paths.exists(metaPath)) { Log.warning('chart or metadata JSON not found... (chart not generated)'); Log.minor('verify paths:'); @@ -395,7 +416,7 @@ class Chart { Log.minor('- metadata: $metaPath'); return song; } - + var time = Sys.time(); var vslice:FNFVSlice; try { @@ -415,19 +436,19 @@ class Chart { } catch (e:Exception) { Log.error('chart error... -> <<< ${e.details()} >>>'); } - + song.audioSuffix = suffix; return song; } static function loadCNEChart(path:String, difficulty:String = 'Normal', suffix:String = '') { Log.minor('loading CNE song "$path" with difficulty "$difficulty"${suffix == '' ? '' : ' ($suffix)'}'); - + var songPath:String = 'data/songs/$path'; var chartPath:String = '$songPath/charts/${Util.pathSuffix(difficulty, suffix)}.json'; var metaPath:String = '$songPath/${Util.pathSuffix('meta', suffix)}.json'; var chartPathA:String = chartPath; var song:Chart = new Chart(path, 4); - + if (!Paths.exists(chartPath)) chartPath = '$songPath/$difficulty.json'; if (!Paths.exists(chartPath) || !Paths.exists(metaPath)) { Log.warning('chart or metadata JSON not found... (chart not generated)'); @@ -436,7 +457,7 @@ class Chart { Log.minor('- metadata: $metaPath'); return song; } - + var time = Sys.time(); var cne:FNFCodename; try { @@ -456,7 +477,7 @@ class Chart { } catch (e:Exception) { Log.error('chart error... -> <<< ${e.details()} >>>'); } - + song.audioSuffix = suffix; return song; } From 42c8594fe029c16ab70380796315081dc2a15e88 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Tue, 11 Mar 2025 00:02:31 -0600 Subject: [PATCH 08/73] additional fixes, strumlines on creation --- source/funkin/objects/HealthIcon.hx | 6 +-- source/funkin/objects/play/Lane.hx | 4 +- source/funkin/states/PlayState.hx | 69 ++++++++++++++++------------- 3 files changed, 41 insertions(+), 38 deletions(-) diff --git a/source/funkin/objects/HealthIcon.hx b/source/funkin/objects/HealthIcon.hx index 9598827..d76ac0f 100644 --- a/source/funkin/objects/HealthIcon.hx +++ b/source/funkin/objects/HealthIcon.hx @@ -63,11 +63,11 @@ class HealthIcon extends FunkinSprite { updateIconState(newState); return state = newState; } - function set_iconData(newIcon:ModernCharacterHealthIconData) { - if (iconData == newIcon) return newIcon; - + function set_iconData(?newIcon:ModernCharacterHealthIconData):ModernCharacterHealthIconData { newIcon ??= {id: 'face', flipX: false}; + if (iconData == newIcon) return newIcon; + name = newIcon.id; loadGraphic(Paths.image('icons/$name') ?? Paths.image('icons/icon-$name') ?? Paths.image('icons/face')); var wFrameRatio:Int = Math.round(width / height); diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 90f5373..94f56d1 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -389,10 +389,8 @@ class Receptor extends FunkinSprite { reloadAnimations(); onAnimationComplete.add((anim:String) -> { - if (anim != 'confirm') return; - if (lane == null || (autoReset && !lane.held)) { + if (anim != 'static' && autoReset && (lane == null || !lane.held)) playAnimation('static', true); - } }); } diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index bb40b83..cdbcd78 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -154,13 +154,38 @@ class PlayState extends FunkinState { add(strumlineGroup); ratingGroup = new FunkinTypedSpriteGroup(); + var scrollDir:Float = (Options.data.downscroll ? 270 : 90); + var strumlineBound:Float = (FlxG.width - 300) * .5; + var strumlineY:Float = 50; + + keybinds = Options.data.keybinds['4k']; + + opponentStrumline = new Strumline(4, scrollDir, chart.scrollSpeed); + opponentStrumline.fitToSize(strumlineBound, opponentStrumline.height * .7); + opponentStrumline.noteEvent.add(opponentNoteEvent); + opponentStrumline.setPosition(50, strumlineY); + opponentStrumline.zIndex = 40; + opponentStrumline.cpu = true; + opponentStrumline.allowInput = false; + + playerStrumline = new Strumline(4, scrollDir, chart.scrollSpeed); + playerStrumline.fitToSize(strumlineBound, playerStrumline.height * .7); + playerStrumline.setPosition(FlxG.width - playerStrumline.width - 50 - 75, strumlineY); + playerStrumline.noteEvent.add(playerNoteEvent); + playerStrumline.assignKeybinds(keybinds); + playerStrumline.zIndex = 50; + + strumlineGroup.add(opponentStrumline); + strumlineGroup.add(playerStrumline); + // the good stuff + for (note in chart.notes) + notes.push(note.copy()); + if (!simple) { var loadedEvents:Array = []; var noteKinds:Array = []; - for (note in chart.notes) - notes.push(note.copy()); for (event in chart.events) { var eventName:String = event.name; if (!loadedEvents.contains(eventName)) { @@ -224,30 +249,6 @@ class PlayState extends FunkinState { } loadVocals(chart.path, chart.audioSuffix); - var scrollDir:Float = (Options.data.downscroll ? 270 : 90); - var strumlineBound:Float = (FlxG.width - 300) * .5; - var strumlineY:Float = 50; - - keybinds = Options.data.keybinds['4k']; - - opponentStrumline = new Strumline(4, scrollDir, chart.scrollSpeed); - opponentStrumline.fitToSize(strumlineBound, opponentStrumline.height * .7); - opponentStrumline.noteEvent.add(opponentNoteEvent); - opponentStrumline.setPosition(50, strumlineY); - opponentStrumline.zIndex = 40; - opponentStrumline.cpu = true; - opponentStrumline.allowInput = false; - - playerStrumline = new Strumline(4, scrollDir, chart.scrollSpeed * 1.08); - playerStrumline.fitToSize(strumlineBound, playerStrumline.height * .7); - playerStrumline.setPosition(FlxG.width - playerStrumline.width - 50 - 75, strumlineY); - playerStrumline.noteEvent.add(playerNoteEvent); - playerStrumline.assignKeybinds(keybinds); - playerStrumline.zIndex = 50; - - strumlineGroup.insert(0, playerStrumline); - strumlineGroup.insert(0, opponentStrumline); - if (middlescroll) { playerStrumline.screenCenter(X); opponentStrumline.fitToSize(playerStrumline.leftBound - 50 - opponentStrumline.leftBound, 0, Y); @@ -290,6 +291,8 @@ class PlayState extends FunkinState { if (spotlight == player1.current) focusOnCharacter(char); }); + } + if (player2 != null) { player2.onCharacterChanged.add((name:String, char:Character) -> { matchIconData(iconP2, char); if (spotlight == player2.current) @@ -672,12 +675,14 @@ class PlayState extends FunkinState { var canContinue = true; canContinue = (canContinue && !HScript.stopped(hscripts.run(func, args))); - for (chara in stage?.characters) { - if (chara == null || !chara.exists || !chara.alive) continue; - - var current:Character = chara.current; - if (current != null) - canContinue = (canContinue && !HScript.stopped(current.hscripts.run(func, args))); + if (stage != null) { + for (chara in stage.characters) { + if (chara == null || !chara.exists || !chara.alive) continue; + + var current:Character = chara.current; + if (current != null) + canContinue = (canContinue && !HScript.stopped(current.hscripts.run(func, args))); + } } return canContinue; From 96db8a55db8686f27d48576092ad2c3d4aca8641 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 16 Mar 2025 15:26:06 -0600 Subject: [PATCH 09/73] optimizations and Other things - Character.playAnim function with "context" (thanks to cne for idea and implementation) - Character.playAnimationSpecial, flipSingAnimations and idleAfterAnim - Score is now a typedef (which makes it easier to play with) - kv iterator in FunkinTypedSpriteGroup - Log.minor uses a different color - note "gray beat" is now faster - remove useless Paths mod priority stuff - new notesplash graphic - updated notesplash coloring "algorithm" --- CREDITS.md | 2 +- assets/images/noteSplashes.png | Bin 247639 -> 284762 bytes source/funkin/backend/FunkinSpriteGroup.hx | 4 + source/funkin/backend/Paths.hx | 35 +------- source/funkin/backend/play/NoteEvent.hx | 8 +- source/funkin/backend/play/ScoreHandler.hx | 10 +-- source/funkin/backend/play/Scoring.hx | 18 ++--- source/funkin/backend/play/SongEvent.hx | 7 +- source/funkin/debug/Log.hx | 2 +- source/funkin/objects/Character.hx | 62 +++++++++++--- source/funkin/objects/CharacterGroup.hx | 89 ++++++++------------- source/funkin/objects/Stage.hx | 23 +----- source/funkin/objects/play/Lane.hx | 79 +++++++++++------- source/funkin/objects/play/Note.hx | 47 +++++++---- source/funkin/objects/play/Strumline.hx | 22 +++-- source/funkin/states/PlayState.hx | 43 +++++++--- 16 files changed, 242 insertions(+), 209 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index 018305f..311d34a 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -25,7 +25,7 @@ NOTE: THIS WILL BE MOVED TO THE CREDITS STATE WHEN IT'S FINISHED, including link ## SPECIAL THANKS **funkin' crew** - made FRIDAY NIGHT FUNKIN'!! damn!! proprietary of most assets, borrowed parts of backend class implementations
**psych engine** - formats support, discord rpc base, paths implementations, a lot of ideas generally
-**codename engine** - chart format support
+**codename engine** - chart format support, "play animation context"
**sword** - some useful pointers
**crowplexus** - some useful pointers (crash handler)
**unholywanderer04** - obligatory unholywanderer04 mention
diff --git a/assets/images/noteSplashes.png b/assets/images/noteSplashes.png index a5449d3ac1083ae598bbc228279c2faeb9d8759a..1200266a58c191cb1bbb045ce334d13f6c11da5f 100644 GIT binary patch literal 284762 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�eK$NtAXGA&wEeDc?F&QbL;#b7640` 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

_AOP3tjv<3p>jM( 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 DP;@0` literal 247639 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 z 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

(k&%c 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

6#F$fxe_z`)%#q?QM-@fiO8!wAB79pmT0hgqF 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 diff --git a/source/funkin/backend/FunkinSpriteGroup.hx b/source/funkin/backend/FunkinSpriteGroup.hx index fd1929b..0e6539b 100644 --- a/source/funkin/backend/FunkinSpriteGroup.hx +++ b/source/funkin/backend/FunkinSpriteGroup.hx @@ -2,6 +2,8 @@ package funkin.backend; import funkin.backend.FunkinSprite; +import haxe.iterators.ArrayKeyValueIterator; + typedef FunkinSpriteGroup = FunkinTypedSpriteGroup; class FunkinTypedSpriteGroup implements ISpriteVars implements IZoomFactor extends FlxTypedSpriteGroup { public var zoomFactor(default, set):Float = 1; @@ -85,4 +87,6 @@ class FunkinTypedSpriteGroup implements ISpriteVars implements IZoo } return initialZoom = value; } + + public inline function keyValueIterator():ArrayKeyValueIterator { return new ArrayKeyValueIterator(members); } } \ No newline at end of file diff --git a/source/funkin/backend/Paths.hx b/source/funkin/backend/Paths.hx index a16a001..2732f0a 100644 --- a/source/funkin/backend/Paths.hx +++ b/source/funkin/backend/Paths.hx @@ -83,26 +83,9 @@ class Paths { var path:String; var allMods:Bool = (Mods.currentMod == null); - var priorize:Bool = (!allMods); - - if (!allMods && Mods.currentMod != '') { // current mod is high priority - var curMod:Mod = Mods.modByDirectory(Mods.currentMod); - - priorize = true; - if (curMod.doLoad) { - path = modPath(key, Mods.currentMod, library); - if (FileSystem.exists(path)) { - return path; - } else { - path = modPath(key, Mods.currentMod); - if (FileSystem.exists(path)) - return path; - } - } - } for (mod in Mods.get()) { - if (!mod.doLoad || !mod.enabled || (!allMods && !mod.global) || (priorize && mod.directory == Mods.currentMod)) + if (!mod.doLoad || !mod.enabled || (!allMods && !mod.global && mod.directory != Mods.currentMod)) continue; path = modPath(key, mod.directory, library); @@ -139,22 +122,10 @@ class Paths { files.push({path: globalModPath(key), type: GLOBAL}); var path:String; - var priorize:Bool = (!allMods); - - if (Mods.currentMod == null) { - allMods = true; - priorize = false; - } else if (Mods.currentMod != '') { // current mod is high priority - var curMod:Mod = Mods.modByDirectory(Mods.currentMod); - - priorize = true; - path = modPath(key, Mods.currentMod, library); - if (curMod.doLoad && FileSystem.exists(path)) - files.push({mod: Mods.currentMod, path: path, type: MOD}); - } + var allMods:Bool = (Mods.currentMod == null); for (mod in Mods.get()) { - if (!mod.doLoad || !mod.enabled || (!allMods && !mod.global) || (priorize && mod.directory == Mods.currentMod)) + if (!mod.doLoad || !mod.enabled || (!allMods && !mod.global && mod.directory != Mods.currentMod)) continue; path = modPath(key, mod.directory, library); diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index 0808583..79f99c3 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -75,7 +75,7 @@ import funkin.objects.play.Strumline; note.score = scoring; } - if (doSplash && (scoring.hitWindow == null || scoring.hitWindow.splash)) + if (doSplash && (scoring?.hitWindow == null || scoring.hitWindow.splash)) splash = lane.splash(); if (playAnimation && targetCharacter != null) { @@ -92,7 +92,7 @@ import funkin.objects.play.Strumline; lane.held = true; lane.heldNote = note; } else if (animateReceptor && !lane.cpu) { - lane.receptor.grayBeat = note.beatTime + 1; + lane.receptor.grayBeat = note.beatTime + .5; } case PRESSED: if (note != null) { @@ -139,7 +139,7 @@ import funkin.objects.play.Strumline; scoring.score = scoreHandler.holdScorePerSecond * secondDiff; if (inGame) - game.health += scoring.healthMod * note.healthGainPerSecond; + game.health += (scoring.healthMod ?? 1) * note.healthGainPerSecond; applyScore(scoreHandler, scoring); @@ -225,7 +225,7 @@ import funkin.objects.play.Strumline; } if (inGame) - game.health -= note.healthLoss * scoring.healthMod; + game.health -= note.healthLoss * (scoring.healthMod ?? 1); applyScore(scoreHandler, scoring); } diff --git a/source/funkin/backend/play/ScoreHandler.hx b/source/funkin/backend/play/ScoreHandler.hx index a0be57a..1b3a514 100644 --- a/source/funkin/backend/play/ScoreHandler.hx +++ b/source/funkin/backend/play/ScoreHandler.hx @@ -43,15 +43,15 @@ class ScoreHandler { } public function applyScore(score:Score) { - this.hits += score.hits; - this.score += score.score; - this.misses += score.misses; + this.hits += score.hits ?? 0; + this.score += score.score ?? 0; + this.misses += score.misses ?? 0; if (score.rating != null) countRating(score.rating); - if (score.accuracyMod >= 0) + if (score.accuracyMod != null) addMod(score.accuracyMod); - if (score.breaksCombo) { + if (score.breaksCombo != null && score.breaksCombo) { combo = 0; } else { combo += score.hits; diff --git a/source/funkin/backend/play/Scoring.hx b/source/funkin/backend/play/Scoring.hx index 9453fa0..867f4f5 100644 --- a/source/funkin/backend/play/Scoring.hx +++ b/source/funkin/backend/play/Scoring.hx @@ -97,15 +97,15 @@ class Scoring { } } -@:structInit class Score { // TODO: move to typedef? - public var rating:Null = null; - public var hitWindow:HitWindow = null; - public var breaksCombo:Bool = false; - public var accuracyMod:Float = -1; - public var healthMod:Float = 1; - public var score:Float = 0; - public var misses:Int = 0; - public var hits:Int = 0; +typedef Score = { + var ?rating:String; + var ?hitWindow:HitWindow; + var ?accuracyMod:Float; + var ?breaksCombo:Bool; + var ?healthMod:Float; + var ?score:Float; + var ?misses:Int; + var ?hits:Int; } enum abstract ScoringSystem(String) to String { diff --git a/source/funkin/backend/play/SongEvent.hx b/source/funkin/backend/play/SongEvent.hx index f34db7e..2af3290 100644 --- a/source/funkin/backend/play/SongEvent.hx +++ b/source/funkin/backend/play/SongEvent.hx @@ -253,15 +253,12 @@ class PlayStateEventHandler { if (Std.isOfType(focus, CharacterGroup)) { var chara:CharacterGroup = cast focus; if (chara.animationExists(anim)) { - chara.playAnimation(anim, forced); - chara.specialAnim = forced; + chara.playAnimationSpecial(anim, forced); chara.timeAnimSteps(); } } else if (Std.isOfType(focus, FunkinSprite)) { var funk:FunkinSprite = cast focus; - if (funk.animationExists(anim)) { - funk.playAnimation(anim, forced); - } + funk.playAnimation(anim, forced); } } } diff --git a/source/funkin/debug/Log.hx b/source/funkin/debug/Log.hx index 2e9e1ef..10e6311 100644 --- a/source/funkin/debug/Log.hx +++ b/source/funkin/debug/Log.hx @@ -28,7 +28,7 @@ class Log { public static function error(text:String) return Sys.println(colorTag(' ERROR ', black, red) + ' $text'); public static function fatal(text:String) return Sys.println(colorTag(' FATAL ', black, brightRed) + ' $text'); public static function info(text:String) return Sys.println(colorTag(' INFO ', black, cyan) + ' $text'); - public static function minor(text:String) return Sys.println(colorTag(text, white, none)); + public static function minor(text:String) return Sys.println(colorTag(text, brightBlack, none)); #end } diff --git a/source/funkin/objects/Character.hx b/source/funkin/objects/Character.hx index c28da7b..78c009c 100644 --- a/source/funkin/objects/Character.hx +++ b/source/funkin/objects/Character.hx @@ -9,11 +9,13 @@ using StringTools; class Character extends FunkinSprite implements ICharacter { public var bopFrequency:Int = 2; public var bop(default, set):Bool = true; + public var flipSingAnimations:Bool = false; public var animReset(default, set):Float = 0; public var singForSteps(default, set):Float = 4; public var specialAnim(default, set):Bool = false; public var conductorInUse(default, set):Conductor = FunkinState.getCurrentConductor(); public var scaleMultiplier:Float = 1; + public var idleAfterAnim:Bool = true; public var sway:Bool = false; public var hasDropAnimations(get, never):Bool; @@ -127,15 +129,11 @@ class Character extends FunkinSprite implements ICharacter { } function set_classicFlip(isIt:Bool) { - if (classicFlip == isIt) - return isIt; classicFlip = isIt; refreshSide(); return isIt; } function set_side(newSide:CharacterSide) { - if (side == newSide) - return newSide; side = newSide; refreshSide(); return newSide; @@ -164,9 +162,10 @@ class Character extends FunkinSprite implements ICharacter { var offset:FlxPoint = offsets[currentAnimation]; setAnimOffset(offset.x, offset.y); } + flipSingAnimations = (!classicFlip && !sideMatches()); } function flipAnim(anim:String):String { - if (classicFlip || sideMatches()) return anim; + if (!flipSingAnimations) return anim; if (anim.startsWith('singLEFT')) { return anim.replace('singLEFT', 'singRIGHT'); @@ -216,13 +215,13 @@ class Character extends FunkinSprite implements ICharacter { super.update(elapsed); if (animReset > 0) { animReset -= elapsed; - if (animReset <= 0 && !specialAnim) { + if (animReset <= 0 && !specialAnim && idleAfterAnim) { animReset = 0; dance(); } } if (specialAnim) { - if (isAnimationFinished() && animReset <= 0) { + if (isAnimationFinished() && animReset <= 0 && idleAfterAnim) { specialAnim = false; animReset = 0; if (singForSteps <= 0) { @@ -250,6 +249,35 @@ class Character extends FunkinSprite implements ICharacter { public function animationIsLooping(anim:String):Bool { return (currentAnimation == '$anim-loop' || currentAnimation == '$anim-hold'); } + public function playAnim(anim:String, context:PlayAnimContext = SOFT, forced:Bool = false, reversed:Bool = false, frame:Int = 0, ?time:Float) { + if (safeH != 'playAnim' && functionOverridden('playAnim')) { + safeCall('playAnim', [anim, context, forced, reversed, frame, time]); + return; + } + + switch (context) { + case SOFT: + playAnimationSoft(anim, forced, reversed, frame); + case SING: + playAnimationSteps(anim, forced, time, reversed, frame); + case SPECIAL: + playAnimationSpecial(anim, forced, time, reversed, frame); + default: + playAnimation(anim, forced, reversed, frame); + } + } + public function playAnimationSpecial(anim:String, forced:Bool = false, ?steps:Float, reversed:Bool = false, frame:Int = 0) { + if (safeH != 'playAnimationSpecial' && functionOverridden('playAnimationSpecial')) { + safeCall('playAnimationSpecial', [anim, forced, steps, reversed, frame]); + return; + } + + if (animationExists(anim)) { + specialAnim = false; + playAnimationSteps(anim, forced, steps, reversed, frame); + specialAnim = true; + } + } public function playAnimationSoft(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { if (safeH != 'playAnimationSoft' && functionOverridden('playAnimationSoft')) { safeCall('playAnimationSoft', [anim, forced, reversed, frame]); @@ -265,9 +293,11 @@ class Character extends FunkinSprite implements ICharacter { return; } - animReset = 0; - specialAnim = false; - super.playAnimation(flipAnim(anim) + animSuffix, forced, reversed, frame); + if (animationExists(anim)) { + animReset = 0; + specialAnim = false; + super.playAnimation(flipAnim(anim) + animSuffix, forced, reversed, frame); + } } public function playAnimationSteps(anim:String, forced:Bool = false, ?steps:Float, reversed:Bool = false, frame:Int = 0) { if (safeH != 'playAnimationSteps' && functionOverridden('playAnimationSteps')) { @@ -276,10 +306,11 @@ class Character extends FunkinSprite implements ICharacter { } if (!specialAnim && animationExists(anim)) { + var animWasDone:Bool = isAnimationFinished(); playAnimation(anim, forced, reversed, frame); var sameAnim:Bool = (currentAnimation == anim); - if (forced || !sameAnim || isAnimationFinished()) + if (forced || !sameAnim || animWasDone) timeAnimSteps(steps ?? singForSteps); } } @@ -617,6 +648,8 @@ interface ICharacter extends IBopper extends IFunkinSpriteAnim { public function animationIsLooping(anim:String):Bool; public function playAnimationSoft(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0):Void; public function playAnimationSteps(anim:String, forced:Bool = false, ?steps:Float, reversed:Bool = false, frame:Int = 0):Void; + public function playAnimationSpecial(anim:String, forced:Bool = false, ?steps:Float, reversed:Bool = false, frame:Int = 0):Void; + public function playAnim(anim:String, context:PlayAnimContext = SOFT, forced:Bool = false, reversed:Bool = false, frame:Int = 0, ?time:Float):Void; public function playComboDropAnimation(combo:Int):Void; public function playComboAnimation(combo:Int):Void; } @@ -627,6 +660,13 @@ interface IBopper { public function dance(beat:Int = 0, forced:Bool = false):Bool; } +enum abstract PlayAnimContext(String) to String { + var SOFT = 'soft'; + var SING = 'sing'; + var SPECIAL = 'special'; + var DEFAULT = 'default'; +} + enum abstract CharacterDataType(String) to String { var PSYCH = 'psych'; var MODERN = 'modern'; diff --git a/source/funkin/objects/CharacterGroup.hx b/source/funkin/objects/CharacterGroup.hx index 7e1f795..cbb21b0 100644 --- a/source/funkin/objects/CharacterGroup.hx +++ b/source/funkin/objects/CharacterGroup.hx @@ -262,77 +262,58 @@ class CharacterGroup extends FunkinTypedSpriteGroup implements IChara return group.remove(chara, splice); } + public function finishAnimation():Void { current?.finishAnimation(); } + public function isAnimationFinished():Bool { return current?.isAnimationFinished() ?? false; } + public function animationExists(anim:String, preload:Bool = true):Bool { return current?.animationExists(anim, preload) ?? false; } + public function animationIsLooping(anim:String):Bool { return current?.animationIsLooping(anim) ?? false; } + public function setOffset(x:Float = 0, y:Float = 0):Void { current?.setOffset(x, y); } + public function timeAnimSteps(?steps:Float):Void { - for (chara in members) { - if (chara == null) continue; - chara.timeAnimSteps(steps); - } - } - public function setOffset(x:Float = 0, y:Float = 0):Void { - if (current != null) - current.setOffset(x, y); - } - public function finishAnimation():Void { - if (current != null) - current.finishAnimation(); - } - public function isAnimationFinished():Bool { - if (current != null) - return current.isAnimationFinished(); - return false; - } - public function animationExists(anim:String, includeUnloaded:Bool = true):Bool { - if (current != null) - return current.animationExists(anim, includeUnloaded); - return false; - } - public function animationIsLooping(anim:String):Bool { - if (current != null) - return current.animationIsLooping(anim); - return false; + for (chara in members) + chara?.timeAnimSteps(steps); } public function playAnimationSoft(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0):Void { - for (chara in members) { - if (chara == null) continue; - chara.playAnimationSoft(anim, forced, reversed, frame); - } + for (chara in members) + chara?.playAnimationSoft(anim, forced, reversed, frame); + } + public function playAnim(anim:String, context:PlayAnimContext = SOFT, forced:Bool = false, reversed:Bool = false, frame:Int = 0, ?time:Float):Void { + for (chara in members) + chara?.playAnim(anim, context, forced, reversed, frame, time); } public function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0):Void { - for (chara in members) { - if (chara == null) continue; - chara.playAnimation(anim, forced, reversed, frame); - } + for (chara in members) + chara?.playAnimation(anim, forced, reversed, frame); } public function playAnimationSteps(anim:String, forced:Bool = false, ?steps:Float, reversed:Bool = false, frame:Int = 0):Void { - for (chara in members) { - if (chara == null) continue; - chara.playAnimationSteps(anim, forced, steps, reversed, frame); - } + for (chara in members) + chara?.playAnimationSteps(anim, forced, steps, reversed, frame); + } + public function playAnimationSpecial(anim:String, forced:Bool = false, ?time:Float, reversed:Bool = false, frame:Int = 0):Void { + for (chara in members) + chara?.playAnimationSpecial(anim, forced, time, reversed, frame); } public function playComboAnimation(combo:Int) { - for (chara in members) { - if (chara == null) continue; - chara.playComboAnimation(combo); - } + for (chara in members) + chara?.playComboAnimation(combo); } public function playComboDropAnimation(combo:Int) { - for (chara in members) { - if (chara == null) continue; - chara.playComboDropAnimation(combo); - } + for (chara in members) + chara?.playComboDropAnimation(combo); } public function preloadAnimAsset(anim:String) { // preloads animation with a different spritesheet path - for (chara in members) { - if (chara == null) continue; - chara.preloadAnimAsset(anim); - } + for (chara in members) + chara?.preloadAnimAsset(anim); } public function dance(beat:Int = 0, forced:Bool = false):Bool { + var danced:Bool = false; for (chara in members) { - if (chara == null) continue; - chara.dance(beat, forced); + if (chara == current) { + danced = chara?.dance(beat, forced) ?? false; + } else { + chara?.dance(beat, forced); + } } - return true; + return danced; } public function flip():CharacterGroup { diff --git a/source/funkin/objects/Stage.hx b/source/funkin/objects/Stage.hx index db34ca3..03afb46 100644 --- a/source/funkin/objects/Stage.hx +++ b/source/funkin/objects/Stage.hx @@ -7,7 +7,7 @@ import funkin.objects.Character; using StringTools; //THIS IS ALL KINDOF A MESS BUT IT WORKS??? I THINK -class Stage extends FlxSpriteGroup { +class Stage extends FunkinSpriteGroup { var chart:Chart; public var name:String; public var json:Dynamic; @@ -74,27 +74,6 @@ class Stage extends FlxSpriteGroup { } } - public function sortZIndex() { - sort(Util.sortZIndex, FlxSort.ASCENDING); - } - public function insertZIndex(obj:FlxSprite) { - if (members.contains(obj)) remove(obj); - var low:Float = Math.POSITIVE_INFINITY; - for (pos => mem in members) { - low = Math.min(mem.zIndex, low); - if (obj.zIndex < mem.zIndex) { - insert(pos, obj); - return obj; - } - } - if (obj.zIndex < low) { - insert(0, obj); - } else { - add(obj); - } - return obj; - } - public function beatHit(beat:Int) { for (prop in props) { if (prop != null && prop.alive && prop.exists && Std.isOfType(prop, IBopper)) { diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 94f56d1..0295711 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -1,5 +1,6 @@ package funkin.objects.play; +import haxe.Constraints; import funkin.shaders.RGBSwap; import funkin.objects.play.Note; import funkin.backend.play.Scoring; @@ -11,6 +12,7 @@ import flixel.util.FlxSignal.FlxTypedSignal; import flixel.graphics.frames.FlxFramesCollection; using StringTools; +using Lambda; class Lane extends FunkinSpriteGroup { public var rgbShader:RGBSwap; @@ -24,6 +26,7 @@ class Lane extends FunkinSpriteGroup { public var noteData:Int; public var oneWay:Bool = true; + public var noteClass:Class = Note; public var scrollSpeed(default, set):Float = 1; public var direction:Float = 90; public var spawnRadius:Float; @@ -49,8 +52,6 @@ class Lane extends FunkinSpriteGroup { public var topMembers:Array = []; public function set_scrollSpeed(newSpeed:Float) { - var cam = camera ?? FlxG.camera; - spawnRadius = Note.distanceToMS(camera.height / camera.zoom, Math.abs(newSpeed)) + 50; return scrollSpeed = newSpeed; } public function set_held(newHeld:Bool) { @@ -101,6 +102,13 @@ class Lane extends FunkinSpriteGroup { } public override function update(elapsed:Float) { + updateQueue(); + updateNotes(); + + super.update(elapsed); + extraWindow = Math.max(extraWindow - elapsed * 200, 0); + } + public function updateQueue() { var i:Int = 0; var early:Bool; var limit:Int = 50; @@ -121,11 +129,6 @@ class Lane extends FunkinSpriteGroup { i ++; if (early && oneWay) break; } - - updateNotes(); - - super.update(elapsed); - extraWindow = Math.max(extraWindow - elapsed * 200, 0); } public function updateNotes() { var i:Int = notes.length; @@ -185,14 +188,19 @@ class Lane extends FunkinSpriteGroup { strumline?.noteEvent.dispatch(event); noteEvent.dispatch(event); } - public function getHighestNote(?filter:Note -> Bool) { + public function getHighestNote(?filter:Note -> Bool, hittableOnly:Bool = true) { var highNote:Null = null; for (note in notes) { if (!note.alive) continue; var valid:Bool = (filter == null ? true : filter(note)); - var canHit:Bool = (note.canHit && !note.goodHit && valid); - if (!canHit) continue; + + if (!valid) + continue; + if (hittableOnly) { + if (hittableOnly && (!note.canHit || note.goodHit)) + continue; + } if (highNote == null || (note.hitPriority > highNote.hitPriority || (note.hitPriority == highNote.hitPriority && note.msTime < highNote.msTime))) highNote = note; } @@ -239,18 +247,22 @@ class Lane extends FunkinSpriteGroup { return spark; } - public function queueNote(note:ChartNote, sorted:Bool = false):ChartNote { - if (!queue.contains(note)) { - if (sorted) { - for (i => otherNote in queue) { - if (otherNote.msTime >= note.msTime) { + public inline function queueNote(note:ChartNote, sorted:Bool = false, checkExists:Bool = true):ChartNote { + var pushed:Bool = false; + + if (sorted) { + for (i => otherNote in queue) { + if (otherNote.msTime >= note.msTime) { + if (!checkExists || !queue.contains(note)) queue.insert(i, note); - return note; - } + pushed = true; + break; } } - queue.push(note); } + if (!pushed && (!checkExists || !queue.contains(note))) + queue.push(note); + return note; } public function dequeueNote(note:ChartNote) { @@ -300,11 +312,18 @@ class Lane extends FunkinSpriteGroup { if (!oneWay && (note.msTime - conductorInUse.songPosition) > spawnRadius) killNote(note, true); } - public function generateNote(songNote:ChartNote):Note { - return new Note(songNote, conductorInUse); + public function findNoteByChartNote(songNote:ChartNote):Note { + return notes.members.find((note:Note) -> note.chartNote == songNote); } - public function insertNote(songNote:ChartNote, pos:Int = 0) { - var note:Note = notes.recycle(Note, () -> generateNote(songNote)); + public function generateNote(?cls:Class, songNote:ChartNote, pool:Bool = true):Note { + if (pool) { + return notes.recycle(noteClass, () -> generateNote(noteClass, songNote, false)); + } else { + return Type.createInstance(cls ?? noteClass, [songNote, conductorInUse]); + } + } + public function insertNote(songNote:ChartNote, pos:Int = 0):Note { + var note:Note = generateNote(noteClass, songNote); preAdd(note); note.lane = this; @@ -319,6 +338,8 @@ class Lane extends FunkinSpriteGroup { notes.insert(pos, note); _noteEvent(basicEvent(SPAWNED, note)); + + return note; } public dynamic function hitNote(note:Note, kill:Bool = true) { note.goodHit = true; @@ -329,9 +350,9 @@ class Lane extends FunkinSpriteGroup { if (kill && !note.isHoldNote && !note.ignore && !event.cancelled) killNote(note); } - public function killNote(note:Note, requeue:Bool = false) { + public function killNote(note:Note, requeue:Bool = false, sort:Bool = true) { if (requeue) - queue.push(note.chartNote); + queueNote(note.chartNote, sort, false); note.kill(); _noteEvent(basicEvent(DESPAWNED, note)); @@ -480,11 +501,11 @@ class NoteSplash extends FunkinSprite { fill.brightness = fill.brightness * .5 + .5; var ring:FlxColor = baseFill; - ring.red = Std.int(ring.red * .65); - ring.green = Std.int(ring.green * Math.max(.75 - ring.blue * .2, 0)); - ring.blue = Std.int(Math.min((ring.blue + 80) * ring.brightness, 255)); - ring.saturation = Math.min(1 - Math.pow(1 - ring.saturation * 1.4, 2), 1) * Math.min(ring.brightness / .125, 1); - ring.brightness = ring.brightness * .75 + .25; + ring.red = Std.int(ring.red * .9); + ring.green = Std.int(ring.green * Math.max(.95 - ring.blue / 255 * .3 - ring.red / 255 * .3, 0)); + ring.blue = Std.int(Math.min((ring.blue * 2 + 80 - ring.red * .3) * ring.brightness, 255)); + ring.saturation = Math.min(ring.saturation * 1.2 * Math.min(ring.brightness / .125, 1), 1); + ring.brightness = ring.brightness * .875 + .125; return [fill, ring]; } diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index c4d1218..cfb3537 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -18,16 +18,17 @@ import flixel.graphics.frames.FlxFrame; public var strumlineIndex:Int = 0; public var extraData:Map = null; - public function copy(?toNote:ChartNote):ChartNote { - if (toNote == null) + public inline function copy(?toNote:ChartNote):ChartNote { + if (toNote == null) { return {strumlineIndex: strumlineIndex, laneIndex: laneIndex, msLength: msLength, msTime: msTime, kind: kind}; - - toNote.strumlineIndex = strumlineIndex; - toNote.laneIndex = laneIndex; - toNote.msLength = msLength; - toNote.msTime = msTime; - toNote.kind = kind; - return toNote; + } else { + toNote.strumlineIndex = strumlineIndex; + toNote.laneIndex = laneIndex; + toNote.msLength = msLength; + toNote.msTime = msTime; + toNote.kind = kind; + return toNote; + } } public function setVar(k:String, v:Dynamic):Dynamic { @@ -47,6 +48,10 @@ import flixel.graphics.frames.FlxFrame; if (extraData == null) return false; return extraData.remove(k); } + + function set_kind(v:String):String { return kind = v; } + function set_msTime(v:Float):Float { return msTime = v; } + function set_msLength(v:Float):Float { return msLength = v; } } class Note extends FunkinSprite { @@ -88,7 +93,6 @@ class Note extends FunkinSprite { public var healthGainPerSecond:Float = 7.5 / 100; // hold bonus public var hitWindow:Float = Scoring.safeFrames * 1000 / 60; - public var noteKind(default, set):String = ''; public var scrollMultiplier:Float = 1; public var directionOffset:Float = 0; public var hitPriority:Float = 1; @@ -97,6 +101,8 @@ class Note extends FunkinSprite { public var laneIndex:Int = 0; public var strumlineIndex:Int = 0; + public var kind(default, set):String = ''; + @:deprecated('noteKind is deprecated, use kind instead!') public var noteKind(get, set):String; @:deprecated('noteData is deprecated, use laneIndex instead!') public var noteData(get, set):Int; @:deprecated('player is deprecated, use strumlineIndex instead!') public var player(get, never):Bool; @@ -111,6 +117,8 @@ class Note extends FunkinSprite { function get_noteData():Int { return laneIndex; } function set_noteData(value:Int):Int { return laneIndex = value; } function get_player():Bool { return (strumlineIndex == 0); } + function set_noteKind(newKind:String):String { return kind = newKind; } + function get_noteKind():String { return kind; } public override function destroy() { tailOffset.put(); @@ -138,8 +146,8 @@ class Note extends FunkinSprite { } public function set_chartNote(songNote:ChartNote):ChartNote { if (songNote != null) { + this.kind = songNote.kind; this.msTime = songNote.msTime; - this.noteKind = songNote.kind; this.msLength = songNote.msLength; this.laneIndex = songNote.laneIndex; this.strumlineIndex = songNote.strumlineIndex; @@ -154,8 +162,15 @@ class Note extends FunkinSprite { return this.chartNote = songNote; } + public function updateChartNote():Void { + chartNote.kind = kind; + chartNote.msTime = msTime; + chartNote.msLength = msLength; + chartNote.laneIndex = laneIndex; + chartNote.strumlineIndex = strumlineIndex; + } - public function reload() { + public function reload():Void { healthLoss = 6.0 / 100; healthGain = 1.5 / 100; healthGainPerSecond = 7.5 / 100; @@ -173,7 +188,7 @@ class Note extends FunkinSprite { loadAtlas('notes'); reloadAnimations(); } - public function updateTail() { + public function updateTail():Void { isHoldNote = (msLength > 0); if (tail == null && isHoldNote) tail = new NoteTail(this); @@ -185,11 +200,11 @@ class Note extends FunkinSprite { updateHitbox(); } public function toChartNote():ChartNote { - return chartNote ?? {laneIndex: laneIndex, msTime: msTime, kind: noteKind, msLength: msLength, strumlineIndex: strumlineIndex}; + return chartNote ?? {laneIndex: laneIndex, msTime: msTime, kind: kind, msLength: msLength, strumlineIndex: strumlineIndex}; } - function set_noteKind(newKind:String) { - return noteKind = newKind; + function set_kind(newKind:String) { + return kind = newKind; } function set_msTime(newTime:Float) { if (msTime == newTime) return newTime; diff --git a/source/funkin/objects/play/Strumline.hx b/source/funkin/objects/play/Strumline.hx index 0ea2ae5..ec7cce7 100644 --- a/source/funkin/objects/play/Strumline.hx +++ b/source/funkin/objects/play/Strumline.hx @@ -28,6 +28,7 @@ class Strumline extends FunkinSpriteGroup { public var scrollSpeed(default, set):Float; public var oneWay(default, set):Bool = true; public var allowInput(default, set):Bool = true; + public var noteClass(default, set):Class = Note; public var hitWindow(default, set):Float = Scoring.safeFrames / 60 * 1000; //oh dear @@ -36,6 +37,7 @@ class Strumline extends FunkinSpriteGroup { public function set_direction(newDir:Float) { for (lane in lanes) lane.direction = newDir; return direction = newDir; } public function set_hitWindow(newWindow:Float) { for (lane in lanes) lane.hitWindow = newWindow; return hitWindow = newWindow; } public function set_allowInput(isAllowed:Bool) { for (lane in lanes) lane.allowInput = isAllowed; return allowInput = isAllowed; } + public function set_noteClass(newClass:Class) { for (lane in lanes) lane.noteClass = newClass; return noteClass = newClass; } public function set_scrollSpeed(newSpeed:Float) { for (lane in lanes) lane.scrollSpeed = newSpeed; return scrollSpeed = newSpeed; } public function set_laneSpacing(newSpacing:Float) { var i:Int = 0; @@ -114,7 +116,7 @@ class Strumline extends FunkinSpriteGroup { public override function get_width() return strumlineWidth; public override function get_height() return strumlineHeight; - public function new(laneCount:Int = 4, direction:Float = 90, scrollSpeed:Float = 1) { + public function new(laneCount:Int = 4, direction:Float = 90, scrollSpeed:Float = 1, ?noteClass:Class) { super(); this.lanes = new FunkinTypedSpriteGroup(); this.add(lanes); @@ -122,6 +124,7 @@ class Strumline extends FunkinSpriteGroup { this.laneCount = laneCount; this.direction = direction; this.scrollSpeed = scrollSpeed; + this.noteClass = noteClass ?? Note; } public function fadeIn() { var i:Int = 0; @@ -138,8 +141,9 @@ class Strumline extends FunkinSpriteGroup { } visible = true; } + public function drawSelf() { super.draw(); } public override function draw() { - super.draw(); + drawSelf(); for (lane in lanes) { // draw on top if (!lane.selfDraw) @:privateAccess lane.drawThing(true); @@ -210,14 +214,16 @@ class Strumline extends FunkinSpriteGroup { } } - public function queueNote(note:ChartNote, ?laneIndex:Int):ChartNote { - laneIndex ??= note.laneIndex; - laneIndex = FlxMath.wrap(laneIndex, 0, lanes.length - 1); - var lane:Lane = getLane(laneIndex); + public function getNoteLane(note:ChartNote):Lane { + return getLane(note.laneIndex % laneCount); + } + public inline function queueNote(note:ChartNote, ?laneIndex:Int, sort:Bool = false, checkExists:Bool = true):ChartNote { + var lane:Lane = (laneIndex == null ? getNoteLane(note) : getLane(laneIndex)); if (lane != null) { - lane.queueNote(note); + lane.queueNote(note, sort, checkExists); return note; } + return null; } public function dequeueNote(note:ChartNote) { @@ -233,7 +239,7 @@ class Strumline extends FunkinSpriteGroup { lane.resetLane(); } - public function getLane(noteData:Int) return lanes.members[noteData]; + public inline function getLane(index:Int):Lane { return lanes.members[index]; } public function fireInput(key:flixel.input.keyboard.FlxKey, pressed:Bool) { var fired:Bool = false; diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index cdbcd78..7dc3b25 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -32,11 +32,11 @@ class PlayState extends FunkinState { public var scoreTxt:FlxText; public var iconP1:HealthIcon; public var iconP2:HealthIcon; + public var uiGroup:FunkinSpriteGroup; + public var ratingGroup:FunkinTypedSpriteGroup; public var playerStrumline:Strumline; public var opponentStrumline:Strumline; - public var uiGroup:FunkinSpriteGroup; - public var ratingGroup:FunkinTypedSpriteGroup; public var strumlineGroup:FunkinTypedSpriteGroup; public var singAnimations:Array = ['LEFT', 'DOWN', 'UP', 'RIGHT']; @@ -53,10 +53,10 @@ class PlayState extends FunkinState { public var camFocusTarget:FlxObject; public var spotlight(default, set):Null; - public var camZoomRate:Int = -1; // 0: no bop - <0: every measure (always) public var camZooming:Bool = true; public var camZoomIntensity:Float = 1; public var hudZoomIntensity:Float = 2; + public var camZoomRate:Null = null; // 0: no bop - null: every measure (always) public static var chart:Chart = null; public var notes:Array = []; @@ -179,6 +179,9 @@ class PlayState extends FunkinState { strumlineGroup.add(playerStrumline); // the good stuff + var time:Float = Sys.time(); + + Log.minor('cloning notes'); for (note in chart.notes) notes.push(note.copy()); @@ -197,9 +200,10 @@ class PlayState extends FunkinState { hscripts.loadFromFolder('scripts/global'); hscripts.loadFromFolder('scripts/songs/${chart.path}'); + Log.minor('loading notekinds'); for (note in notes) { var noteKind:String = note.kind; - if (noteKind.trim() != '' && !noteKinds.contains(noteKind)) { + if (noteKind != '' && noteKind.trim() != '' && !noteKinds.contains(noteKind)) { hscripts.loadFromPaths('scripts/notekinds/$noteKind.hx'); noteKinds.push(noteKind); } @@ -253,9 +257,10 @@ class PlayState extends FunkinState { playerStrumline.screenCenter(X); opponentStrumline.fitToSize(playerStrumline.leftBound - 50 - opponentStrumline.leftBound, 0, Y); } + Log.minor('queueing notes'); for (note in notes) { var strumline:Strumline = strumlineGroup.members[note.strumlineIndex]; - strumline?.queueNote(note); + strumline?.queueNote(note, null, false, false); } ratingGroup.setPosition(player3?.getMidpoint()?.x ?? FlxG.width * .5, player3?.getMidpoint()?.y ?? FlxG.height * .5); @@ -341,6 +346,8 @@ class PlayState extends FunkinState { } beginCountdown(); update(0); + + Log.info('GAME ON! (${Math.round((Sys.time() - time) * 1000) / 1000}s)'); } function flipUI() { for (mem in uiGroup) @@ -421,7 +428,7 @@ class PlayState extends FunkinState { events.resize(0); for (note in notes) { var strumline:Strumline = strumlineGroup.members[note.strumlineIndex]; - strumline?.queueNote(note); + strumline?.queueNote(note, null, false, false); } for (event in chart.events) events.push(event); @@ -531,7 +538,7 @@ class PlayState extends FunkinState { if (DiscordRPC.supported && music.playing && DiscordRPC.presence.endTimestamp.toInt() == 0) refreshRPCTime(); - if (camZoomRate > 0 && beat % camZoomRate == 0) + if (camZoomRate != null && camZoomRate > 0 && beat % camZoomRate == 0) bopCamera(); iconP1.bop(); @@ -542,7 +549,7 @@ class PlayState extends FunkinState { hscripts.run('beatHit', [beat]); } public function barHitEvent(beat:Int) { - if (camZoomRate < 0) + if (camZoomRate == null) bopCamera(); hscripts.run('barHit', [beat]); @@ -718,13 +725,22 @@ class PlayState extends FunkinState { heldKeys.remove(key); if (HScript.stopped(hscripts.run('keyReleased', [key])) || inputDisabled || paused) return; + var keybind:Int = Controls.keybindFromArray(keybinds, key); - - if (keybind >= 0) { - var result:Dynamic = hscripts.run('keybindReleased', [keybind, key]); + var oldTime:Float = conductorInUse.songPosition; + var newTimeMaybe:Float = conductorInUse.syncTracker?.time ?? oldTime; + if (conductorInUse.syncTracker != null && conductorInUse.syncTracker.playing) + conductorInUse.songPosition = newTimeMaybe; + + var canFireInput:Bool = true; + if (keybind >= 0) + canFireInput = !HScript.stopped(hscripts.run('keybindReleased', [keybind, key])); + if (canFireInput) { for (strumline in strumlineGroup) strumline.fireInput(key, false); } + + conductorInUse.songPosition = oldTime; } public function playerNoteEvent(e:NoteEvent) { @@ -751,6 +767,8 @@ class PlayState extends FunkinState { dispatchPlayEvent('opponentNoteEvent', e); } public function popCombo(combo:Int) { + if (!ratingGroup.alive) return; + var tempCombo:Int = combo; var nums:Array = []; while (tempCombo >= 1) { @@ -771,7 +789,8 @@ class PlayState extends FunkinState { public function popRating(ratingString:String, scale:Float = .7, beats:Float = 1) { var rating:FunkinSprite = ratingGroup.recycle(FunkinSprite, () -> new FunkinSprite()); - @:privateAccess ratingGroup.preAdd(rating); + if (!ratingGroup.alive) return rating; + rating.loadTexture(ratingString); rating.scale.set(scale, scale); rating.offset.set(rating.frameWidth * .5, rating.frameHeight * .5); From 13fe26b8bcd29a91bddb55b200dc7ccbd449077d Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Mon, 17 Mar 2025 01:16:56 -0600 Subject: [PATCH 10/73] fix rating position, play anim special --- source/funkin/objects/Character.hx | 11 ++++++++--- source/funkin/states/PlayState.hx | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/source/funkin/objects/Character.hx b/source/funkin/objects/Character.hx index 78c009c..6868337 100644 --- a/source/funkin/objects/Character.hx +++ b/source/funkin/objects/Character.hx @@ -273,9 +273,14 @@ class Character extends FunkinSprite implements ICharacter { } if (animationExists(anim)) { - specialAnim = false; - playAnimationSteps(anim, forced, steps, reversed, frame); - specialAnim = true; + var animWasDone:Bool = isAnimationFinished(); + playAnimation(anim, forced, reversed, frame); + + var sameAnim:Bool = (currentAnimation == anim); + if (forced || !sameAnim || animWasDone) { + timeAnimSteps(steps ?? singForSteps); + specialAnim = true; + } } } public function playAnimationSoft(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 7dc3b25..d470230 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -793,6 +793,7 @@ class PlayState extends FunkinState { rating.loadTexture(ratingString); rating.scale.set(scale, scale); + rating.setPosition(ratingGroup.x, ratingGroup.y); rating.offset.set(rating.frameWidth * .5, rating.frameHeight * .5); rating.revive(); From 98c2e0f00d4f24d9c4c6025f00fc3142ef24675d Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Tue, 18 Mar 2025 01:06:11 -0600 Subject: [PATCH 11/73] better stack detection, - stack note detection / removal is now per strumline & per lane (previously some stacked notes couldnt be caught due to not being filtered by this) - ghost tapping removes health (again) - Bar.barCenter is better, hopefully - NoteSplash.rgbShader to allow manipulation of an individual notesplash's rgb - all note update events which werent dispatched after spawn now are (this should fix some unintended behaviors) --- source/funkin/backend/play/Chart.hx | 31 ++++++++----- source/funkin/backend/play/NoteEvent.hx | 9 +++- source/funkin/backend/play/ScoreHandler.hx | 2 +- source/funkin/objects/Bar.hx | 33 ++++++++------ source/funkin/objects/play/Lane.hx | 51 +++++++++++++--------- source/funkin/objects/play/Note.hx | 1 + source/funkin/states/PlayState.hx | 12 ++--- 7 files changed, 84 insertions(+), 55 deletions(-) diff --git a/source/funkin/backend/play/Chart.hx b/source/funkin/backend/play/Chart.hx index aaaa32a..03f7a08 100644 --- a/source/funkin/backend/play/Chart.hx +++ b/source/funkin/backend/play/Chart.hx @@ -168,20 +168,27 @@ class Chart { } return this.songLength; } - public function clearStackedNotes(minDifference:Float = FlxMath.EPSILON) { - var previousNote:ChartNote = null; + public function clearStackedNotes(minDifference:Float = 6) { + var previousNotes:Array> = []; var caught:Int = 0; var i:Int = notes.length; while (i > 0) { - var note:ChartNote = notes[i --]; + var note:ChartNote = notes[-- i]; - if (previousNote != null && Math.abs(note.msTime - previousNote.msTime) < minDifference && - previousNote.kind == note.kind && previousNote.laneIndex == note.laneIndex && previousNote.strumlineIndex == note.strumlineIndex) { + var lane:Int = note.laneIndex; + var strumline:Int = note.strumlineIndex; + + while (previousNotes.length <= strumline) previousNotes.push([]); + while (previousNotes[strumline].length <= lane) previousNotes[strumline].push(null); + var prevNote:ChartNote = previousNotes[strumline][lane]; + + if (prevNote != null && Math.abs(note.msTime - prevNote.msTime) < minDifference && + prevNote.kind == note.kind && prevNote.laneIndex == lane && prevNote.strumlineIndex == strumline) { notes.remove(note); caught ++; } - previousNote = note; + previousNotes[strumline][lane] = note; } if (caught > 0) @@ -190,11 +197,11 @@ class Chart { // TODO: these could just not be static // suffix is for playable characters - static function loadLegacyChart(path:String, difficulty:String = 'normal', suffix:String = '', keyCount:Int = 4) { // move to moonchart format??? + static function loadLegacyChart(path:String, difficulty:String = 'normal', suffix:String = '', ?keyCount:Int) { // move to moonchart format??? difficulty = difficulty.toLowerCase(); Log.minor('loading legacy FNF song "$path" with difficulty "$difficulty"${suffix == '' ? '' : ' ($suffix)'}'); - var song = new Chart(path, keyCount); + var song = new Chart(path); song.json = loadLegacyJson(path, difficulty); song.difficulty = difficulty; @@ -257,6 +264,8 @@ class Chart { song.tempoChanges = [new TempoChange(-4, song.initialBpm, new TimeSignature())]; song.scrollSpeed = songSpeed; + song.keyCount = (song.json.mania == null ? (song.json.keys ?? keyCount ?? song.keyCount) : (song.json.mania + 4)); + var ms:Float = 0; var beat:Float = 0; var sectionNumerator:Float = 0; @@ -329,16 +338,16 @@ class Chart { if (!Std.isOfType(noteKind, String)) noteKind = ''; var strumlineIndex:Int = 0; if (fromSong) { - strumlineIndex = Std.int(noteData / keyCount); + strumlineIndex = Std.int(noteData / song.keyCount); if (section.mustHitSection) strumlineIndex += (strumlineIndex % 2 == 0 ? 1 : -1); } else { // assume psych 1.0 - strumlineIndex = Std.int(noteData / keyCount); + strumlineIndex = Std.int(noteData / song.keyCount); if (strumlineIndex < 2) // how silly strumlineIndex = 1 - strumlineIndex; } - song.notes.push({strumlineIndex: strumlineIndex, msTime: noteTime, laneIndex: noteData % keyCount, msLength: noteLength, kind: noteKind}); + song.notes.push({strumlineIndex: strumlineIndex, msTime: noteTime, laneIndex: noteData % song.keyCount, msLength: noteLength, kind: noteKind}); } } song.sort(); diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index 79f99c3..b40abe2 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -195,8 +195,13 @@ import funkin.objects.play.Strumline; targetCharacter.playAnimationSteps('sing${game.singAnimations[lane.noteData]}miss', true); } - applyExtraWindow(15); - scoring ??= scoreHandler?.judgeNoteGhost(); + if (applyRating) { + applyExtraWindow(15); + scoring ??= scoreHandler?.judgeNoteGhost(); + + if (inGame) + game.health += (scoring.healthMod ?? -.01); + } applyScore(scoreHandler, scoring); case LOST: diff --git a/source/funkin/backend/play/ScoreHandler.hx b/source/funkin/backend/play/ScoreHandler.hx index 1b3a514..b551d1b 100644 --- a/source/funkin/backend/play/ScoreHandler.hx +++ b/source/funkin/backend/play/ScoreHandler.hx @@ -70,7 +70,7 @@ class ScoreHandler { } } public function judgeNoteGhost():Score { - return {score: -10}; + return {score: -10, healthMod: -.01}; } public function judgeNoteMiss(note:funkin.objects.play.Note):Score { return switch (system) { diff --git a/source/funkin/objects/Bar.hx b/source/funkin/objects/Bar.hx index ac359c1..79a18ab 100644 --- a/source/funkin/objects/Bar.hx +++ b/source/funkin/objects/Bar.hx @@ -11,16 +11,18 @@ class Bar extends FunkinSpriteGroup { public var targetPercent:Float = 100; public var percent(default, set):Float; - public var percentLerp:Float = .15 * 60; + public var percentLerp:Null = .15 * 60; public var valueFunc:Bar -> Float = null; public var bounds:BarBounds = {min: 0, max: 1}; public var barRect:FlxRect = new FlxRect(4, 4); - public var barCenter:FlxPoint = new FlxPoint(); + public var barCenter(get, null):FlxPoint; public var leftToRight(default, set):Bool = true; - public function new(x:Float = 0, y:Float = 0, valueFunction:Bar -> Float = null, overlayImage:String = 'healthBar') { + var _barPoint:FlxPoint = FlxPoint.get(); + + public function new(x:Float = 0, y:Float = 0, valueFunction:Bar -> Float = null, overlayImage:String = 'healthBar', ?newBounds:BarBounds) { super(x, y); overlay = new FunkinSprite().loadTexture(overlayImage); leftBar = new FunkinSprite().makeGraphic(Std.int(overlay.width), Std.int(overlay.height), -1); @@ -31,11 +33,12 @@ class Bar extends FunkinSpriteGroup { add(leftBar); add(rightBar); valueFunc = valueFunction; + if (newBounds != null) + bounds = newBounds; - barRect.width = leftBar.width - barRect.x * 2; barRect.height = leftBar.height - barRect.y * 2; - percent = updateTargetPercent(); - updateBars(); + barRect.width = leftBar.width - barRect.x * 2; + snapToPercent(); setColors(); } public function loadTexture(overlayImage:String = 'healthBar'):Bar { @@ -59,19 +62,26 @@ class Bar extends FunkinSpriteGroup { rightBar.color = rightColor; return this; } + public function snapToPercent():Bar { + percent = updateTargetPercent(); + updateBars(); + return this; + } public override function update(elapsed:Float) { super.update(elapsed); updateTargetPercent(); - if (percentLerp >= 0) { + if (percentLerp != null && percentLerp >= 0) { percent = Util.smoothLerp(percent, targetPercent, percentLerp * elapsed); } else { percent = targetPercent; } - updateBarCenter(); } - function set_percent(newPercent:Float) { + function get_barCenter():FlxPoint { + return _barPoint.set(leftBar.x + leftBar.clipRect.x + leftBar.clipRect.width, leftBar.y + leftBar.height * .5); + } + function set_percent(newPercent:Float):Float { if (percent != newPercent) { percent = newPercent; updateBars(); @@ -120,10 +130,5 @@ class Bar extends FunkinSpriteGroup { rightBar.clipRect.height = leftBar.clipRect.height = barRect.height; rightBar.clipRect = rightBar.clipRect; leftBar.clipRect = leftBar.clipRect; - - updateBarCenter(); - } - inline function updateBarCenter() { - barCenter.set(leftBar.x + leftBar.clipRect.x + leftBar.clipRect.width, leftBar.y + leftBar.height * .5); } } \ No newline at end of file diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 0295711..1a7ece5 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -230,7 +230,7 @@ class Lane extends FunkinSpriteGroup { var splash:NoteSplash = noteSplashes.recycle(NoteSplash, () -> new NoteSplash(noteData), true); preAdd(splash); splash.alpha = alpha * .7; - splash.shader = splashRGB.shader; + splashRGB.copy(splash.rgbShader); splash.splashOnReceptor(receptor); return splash; } @@ -334,10 +334,10 @@ class Lane extends FunkinSpriteGroup { note.scale.copyFrom(receptor.scale); note.rgbShader = rgbShader.copy(note.rgbShader); note.updateHitbox(); - updateNote(note); notes.insert(pos, note); _noteEvent(basicEvent(SPAWNED, note)); + updateNote(note); return note; } @@ -387,33 +387,37 @@ class Receptor extends FunkinSprite { public var lane:Lane; public var noteData:Int; public var rgbShader:RGBSwap; - public var missColor:Array; - public var glowColor:Array; public var rgbEnabled(default, set):Bool; - public var autoReset:Bool = false; + public var grayBeat:Null; + public var autoReset:Bool = false; + + public var canUpdateShader:Bool = true; + public var missColor:Array = []; + public var glowColor:Array = []; public function new(x:Float, y:Float, data:Int) { super(x, y); loadAtlas('notes'); this.noteData = data; - - rgbShader = new RGBSwap(); - rgbShader.green = 0xffffff; - rgbShader.red = Note.directionColors[data][0]; - rgbShader.blue = Note.directionColors[data][1]; - glowColor = [rgbShader.red, rgbShader.blue]; - missColor = [makeGrayColor(rgbShader.red), FlxColor.fromRGB(32, 30, 49)]; - + + rgbShader = new RGBSwap(Note.directionColors[data][0], FlxColor.WHITE, Note.directionColors[data][1]); + computeRGBColors(); + loadAtlas('notes'); reloadAnimations(); - + onAnimationComplete.add((anim:String) -> { if (anim != 'static' && autoReset && (lane == null || !lane.held)) playAnimation('static', true); }); } + + public function computeRGBColors() { + glowColor = [rgbShader.red, rgbShader.green, rgbShader.blue]; + missColor = [makeGrayColor(rgbShader.red), FlxColor.WHITE, FlxColor.fromRGB(32, 30, 49)]; + } public function reloadAnimations() { animation.destroyAnimations(); @@ -432,13 +436,14 @@ class Receptor extends FunkinSprite { } public override function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { - if (anim == 'static') { - rgbEnabled = false; - } else { - var baseColor:Array = (anim == 'press' ? missColor : glowColor); - rgbShader.blue = baseColor[1]; - rgbShader.red = baseColor[0]; - rgbEnabled = true; + if (canUpdateShader) { + if (anim == 'static') { + rgbEnabled = false; + } else { + var baseColor:Array = (anim == 'press' ? missColor : glowColor); + rgbShader.set(baseColor[0], baseColor[1], baseColor[2]); + rgbEnabled = true; + } } if (anim != 'confirm') grayBeat = null; @@ -467,11 +472,15 @@ class Receptor extends FunkinSprite { class NoteSplash extends FunkinSprite { public var noteData:Int; + public var rgbShader:RGBSwap; public function new(data:Int) { super(); loadAtlas('noteSplashes'); + rgbShader = new RGBSwap(); + shader = rgbShader.shader; + this.noteData = data; var dirName:String = Note.directionNames[data]; addAnimation('splash1', 'notesplash $dirName 1', 24, false); diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index cfb3537..ece895d 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -177,6 +177,7 @@ class Note extends FunkinSprite { lost = goodHit = held = consumed = preventDespawn = ignore = false; followAngle = canHit = visible = true; holdTime = hitTime = -1; + spriteOffset.set(); tailOffset.set(); multAlpha = 1; clipDistance = 0; diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index d470230..f6ce0dd 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -154,13 +154,12 @@ class PlayState extends FunkinState { add(strumlineGroup); ratingGroup = new FunkinTypedSpriteGroup(); - var scrollDir:Float = (Options.data.downscroll ? 270 : 90); var strumlineBound:Float = (FlxG.width - 300) * .5; var strumlineY:Float = 50; keybinds = Options.data.keybinds['4k']; - opponentStrumline = new Strumline(4, scrollDir, chart.scrollSpeed); + opponentStrumline = new Strumline(4, 90, chart.scrollSpeed); opponentStrumline.fitToSize(strumlineBound, opponentStrumline.height * .7); opponentStrumline.noteEvent.add(opponentNoteEvent); opponentStrumline.setPosition(50, strumlineY); @@ -168,7 +167,7 @@ class PlayState extends FunkinState { opponentStrumline.cpu = true; opponentStrumline.allowInput = false; - playerStrumline = new Strumline(4, scrollDir, chart.scrollSpeed); + playerStrumline = new Strumline(4, 90, chart.scrollSpeed); playerStrumline.fitToSize(strumlineBound, playerStrumline.height * .7); playerStrumline.setPosition(FlxG.width - playerStrumline.width - 50 - 75, strumlineY); playerStrumline.noteEvent.add(playerNoteEvent); @@ -275,8 +274,7 @@ class PlayState extends FunkinState { } // TODO: figure out how to display the correct icons in simple mode maybe? they just display the placeholder face - healthBar = new Bar(0, FlxG.height - 50, (_) -> health, 'healthBar'); - healthBar.bounds.max = maxHealth; + healthBar = new Bar(0, FlxG.height - 50, (_) -> health, 'healthBar', {min: 0, max: maxHealth}); healthBar.y -= healthBar.height; healthBar.screenCenter(X); healthBar.zIndex = 10; @@ -325,8 +323,10 @@ class PlayState extends FunkinState { for (event in chart.events) dispatchSongEvent({type: PUSH_EVENT, chartEvent: event}); - if (downscroll) + if (downscroll) { + playerStrumline.direction = opponentStrumline.direction = 270; flipUI(); + } hscripts.run('createPost'); From 767355523c2c59facdc71c22d468876068c1f4ee Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Tue, 18 Mar 2025 01:07:02 -0600 Subject: [PATCH 12/73] i forgot to finish titling the last commit heres an useless commit that does nothing other than inform you of this --- source/funkin/states/TitleState.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/funkin/states/TitleState.hx b/source/funkin/states/TitleState.hx index 631e48f..b33ad9d 100644 --- a/source/funkin/states/TitleState.hx +++ b/source/funkin/states/TitleState.hx @@ -45,7 +45,7 @@ class TitleState extends FunkinState { super.create(); preload(); - currentIntroText = FlxG.random.getObject(introTexts) ?? ['funkin', 'FOREVER']; + currentIntroText = FlxG.random.getObject(introTexts) ?? ['FUNKIN', 'FOREVER']; beatHit.add(beatHitEvent); From 616e1d74ecf7371456c07658a92fe546e46e90bc Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Tue, 18 Mar 2025 22:18:49 -0600 Subject: [PATCH 13/73] Note.texture it loads an atlas, pretty cool; mainly added so there's no additional overhead for spritesheet / animation reloading when unnecessary (which should speed up note spawning) --- source/funkin/objects/play/Note.hx | 47 ++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index ece895d..ea79dde 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -101,11 +101,12 @@ class Note extends FunkinSprite { public var laneIndex:Int = 0; public var strumlineIndex:Int = 0; + public var texture(get, set):String; public var kind(default, set):String = ''; @:deprecated('noteKind is deprecated, use kind instead!') public var noteKind(get, set):String; @:deprecated('noteData is deprecated, use laneIndex instead!') public var noteData(get, set):Int; @:deprecated('player is deprecated, use strumlineIndex instead!') public var player(get, never):Bool; - + public var endMs(get, never):Float; public var endBeat(get, never):Float; public var msTime(default, set):Float = 0; @@ -114,6 +115,8 @@ class Note extends FunkinSprite { public var beatLength(default, set):Float = 0; public var isHoldNote(default, null):Bool = false; + var _texture:String = ''; + function get_noteData():Int { return laneIndex; } function set_noteData(value:Int):Int { return laneIndex = value; } function get_player():Bool { return (strumlineIndex == 0); } @@ -181,13 +184,12 @@ class Note extends FunkinSprite { tailOffset.set(); multAlpha = 1; clipDistance = 0; + + texture = 'notes'; if (tail != null) { - tail.loadAtlas('notes'); + tail.texture = texture; tail.reload(); } - - loadAtlas('notes'); - reloadAnimations(); } public function updateTail():Void { isHoldNote = (msLength > 0); @@ -204,6 +206,22 @@ class Note extends FunkinSprite { return chartNote ?? {laneIndex: laneIndex, msTime: msTime, kind: kind, msLength: msLength, strumlineIndex: strumlineIndex}; } + public override function loadAtlas(path:String, ?library:String, renderType:SpriteRenderType = SPARROW):Note { + super.loadAtlas(path, library, renderType); + _texture = path; + return this; + } + function reloadTexture(texture:String) { + loadAtlas(texture); + reloadAnimations(); + } + function get_texture():String { return _texture; } + function set_texture(newTexture:String):String { + if (texture == newTexture) return newTexture; + + reloadTexture(newTexture); + return newTexture; + } function set_kind(newKind:String) { return kind = newKind; } @@ -286,6 +304,7 @@ class Note extends FunkinSprite { class NoteTail extends FunkinSprite { public var parent(default, set):Note; + public var texture(get, set):String; public var laneIndex:Int; public var multAlpha:Float = .6; @@ -295,6 +314,7 @@ class NoteTail extends FunkinSprite { public var holdScale(default, null):FlxPoint; public var tailScale(default, null):FlxPoint; + var _texture:String = ''; var _tileMatrix:FlxMatrix = new FlxMatrix(); public function new(parent:Note) { @@ -314,6 +334,22 @@ class NoteTail extends FunkinSprite { super.destroy(); } + public override function loadAtlas(path:String, ?library:String, renderType:SpriteRenderType = SPARROW):NoteTail { + super.loadAtlas(path, library, renderType); + _texture = path; + return this; + } + function reloadTexture(texture:String) { + loadAtlas(texture); + reloadAnimations(); + } + function get_texture():String { return _texture; } + function set_texture(newTexture:String):String { + if (texture == newTexture) return newTexture; + + reloadTexture(newTexture); + return newTexture; + } function set_parent(note:Note):Note { if (parent == note) return note; @@ -322,7 +358,6 @@ class NoteTail extends FunkinSprite { } public function reload() { - reloadAnimations(); sustainClip = 0; } public function reloadAnimations() { From a2a3259b8a397b707b7530fa8b6e2cfaa0784b14 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:56:07 -0600 Subject: [PATCH 14/73] FunkinSprite.anim overhaul, character hold + + FunkinSprite.anim now uses a custom class to get the animation!! this should properly unify animate texture atlases and basic spritesheet sprites with FunkinSprite * flxanimate is showing a plethora of deprecation warnings. see README to get the recommended commit for now + Lane.pressed, for when a lane is being pressed (this may be shocking) + CharacterGroup.idleAfterAnim, .anim getters + characters can now hold! set Character.held to true to prevent them from going to idle (this is used in the note event) * re added extra window applying in ghost note event (without applyRating) --- README.md | 2 +- source/funkin/backend/FunkinAnimate.hx | 3 + source/funkin/backend/FunkinSprite.hx | 479 +++++++++++++++++------- source/funkin/backend/play/NoteEvent.hx | 25 +- source/funkin/objects/Character.hx | 38 +- source/funkin/objects/CharacterGroup.hx | 36 +- source/funkin/objects/play/Lane.hx | 3 + source/funkin/objects/play/Note.hx | 12 +- 8 files changed, 432 insertions(+), 166 deletions(-) diff --git a/README.md b/README.md index 7142748..a3c700a 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ haxelib install moonchart haxelib install hxdiscord_rpc haxelib git funkin.vis https://github.com/FunkinCrew/funkVis haxelib git grig.audio https://gitlab.com/haxe-grig/grig.audio.git -haxelib git flxanimate https://github.com/Dot-Stuff/flxanimate.git dev +haxelib git flxanimate https://github.com/Dot-Stuff/flxanimate.git 884606823b39b41ae460cd5f0ec1a07310654aa2 haxelib git hscript-iris https://github.com/pisayesiwsi/hscript-iris.git dev ``` (hscript-iris and flxanimate use indev versions) diff --git a/source/funkin/backend/FunkinAnimate.hx b/source/funkin/backend/FunkinAnimate.hx index 37d3c1b..e1f3b19 100644 --- a/source/funkin/backend/FunkinAnimate.hx +++ b/source/funkin/backend/FunkinAnimate.hx @@ -284,6 +284,9 @@ class FunkinAnimateAnim extends FlxAnim { public function exists(name:String):Bool { return (animsMap.exists(name) || (symbolDictionary != null && symbolDictionary.exists(name))); } + public function remove(name:String):Void { + animsMap.remove(name); + } public function rename(oldName:String, newName:String):Void { var anim:SymbolStuff = animsMap.get(oldName); if (anim == null) { diff --git a/source/funkin/backend/FunkinSprite.hx b/source/funkin/backend/FunkinSprite.hx index c052efe..dac5e05 100644 --- a/source/funkin/backend/FunkinSprite.hx +++ b/source/funkin/backend/FunkinSprite.hx @@ -5,14 +5,19 @@ import flixel.util.FlxAxes; import flixel.util.FlxSignal; import flixel.util.FlxDestroyUtil; import flixel.system.FlxAssets; +import flxanimate.animate.FlxSymbol; import flixel.graphics.frames.FlxFrame; import flixel.graphics.frames.FlxAtlasFrames; import flixel.graphics.frames.FlxFramesCollection; +import flixel.animation.FlxAnimationController; +import flixel.animation.FlxAnimation; + import funkin.backend.FunkinAnimate; class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFactor implements IFunkinSpriteAnim { + public var onAnimationFrame:FlxTypedSignal String -> Void> = new FlxTypedSignal(); public var onAnimationComplete:FlxTypedSignal Void> = new FlxTypedSignal(); - public var onAnimationFrame:FlxTypedSignal Void> = new FlxTypedSignal(); + public var onAnimationLoop:FlxTypedSignal Void> = new FlxTypedSignal(); public var currentAnimation(get, never):Null; public var animationList:Map = new Map(); @@ -29,7 +34,7 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact var renderType:SpriteRenderType = SPARROW; public var isAnimate(get, never):Bool; - public var anim(get, never):Dynamic; // for scripting purposes + public var anim(default, null):FunkinSpriteAnimHandler; public var animate:FunkinAnimate; var _loadedAtlases:Array = []; @@ -56,15 +61,21 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact public function new(x:Float = 0, y:Float = 0, isSmooth:Bool = true) { super(x, y); _transPoint = new FlxPoint(); + anim = new FunkinSpriteAnimHandler(); spriteOffset = FlxPoint.get(); animOffset = FlxPoint.get(); smooth = isSmooth; + + anim.onFrame.add((number:Int, anim:String) -> onAnimationFrame.dispatch(number, anim)); + anim.onComplete.add((anim:String) -> onAnimationComplete.dispatch(anim)); + anim.onLoop.add((anim:String) -> onAnimationLoop.dispatch(anim)); } public override function destroy() { - _transPoint = FlxDestroyUtil.put(_transPoint); + anim = FlxDestroyUtil.destroy(anim); animOffset = FlxDestroyUtil.put(animOffset); spriteOffset = FlxDestroyUtil.put(spriteOffset); - if (animate != null) animate.destroy(); + _transPoint = FlxDestroyUtil.put(_transPoint); + animate = FlxDestroyUtil.destroy(animate); super.destroy(); } public override function update(elapsed:Float) { @@ -184,6 +195,13 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact offsets.clear(); animationList.clear(); _loadedAtlases.resize(0); + anim.isAnimate = false; + anim.attachedFunk = null; + anim.attachedAnimate = null; + } + public function unloadAnimate() { + if (isAnimate && animate != null) + animate = FlxDestroyUtil.destroy(animate); } public function loadAuto(path:String, ?library:String) { final pngExists:Bool = Paths.exists('images/$path.png', library); @@ -214,39 +232,15 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact case PACKER: Paths.packerAtlas(path, library); default: Paths.sparrowAtlas(path, library); } + anim.attachedFunk = this; this.renderType = renderType; - #if (flixel >= "5.9.0") - animation.onFinish.add((anim:String) -> { - if (this.renderType != ANIMATEATLAS) - _onAnimationComplete(anim); - }); - animation.onFrameChange.add((anim:String, frameNumber:Int, frameIndex:Int) -> { - if (this.renderType != ANIMATEATLAS) - _onAnimationFrame(frameNumber); - }); - #else - animation.finishCallback = (anim:String) -> { - if (this.renderType != ANIMATEATLAS) - _onAnimationComplete(anim); - }; - animation.callback = (anim:String, frameNumber:Int, frameIndex:Int) -> { - if (this.renderType != ANIMATEATLAS) - _onAnimationFrame(frameNumber); - } - #end return this; } public function loadAnimate(path:String, ?library:String) { resetData(); animate = new FunkinAnimate().loadAnimate(path, library); - animate.funkAnim.onComplete.add(() -> { - if (renderType == ANIMATEATLAS) - _onAnimationComplete(); - }); - animate.funkAnim.onFrame.add((frameNumber:Int) -> { - if (renderType == ANIMATEATLAS) - _onAnimationFrame(frameNumber); - }); + anim.attachedAnimate = animate; + anim.isAnimate = true; renderType = ANIMATEATLAS; return this; } @@ -351,65 +345,14 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact if (!overwrite && animationExists(name, false)) return; - if (isAnimate) { - if (animate == null || animate.funkAnim == null) return; - var anim:FunkinAnimateAnim = animate.funkAnim; - var symbolExists:Bool = (anim.symbolDictionary != null && anim.symbolDictionary.exists(prefix)); - if (frameIndices == null || frameIndices.length == 0) { - if (symbolExists) { - anim.addBySymbol(name, '$prefix\\', fps, loop); - } else { - try { anim.addByFrameLabel(name, prefix, fps, loop); } - catch (e:Dynamic) { Log.warning('no frame label or symbol with the name of "$prefix" was found...'); } - } - } else { - if (symbolExists) { - anim.addBySymbolIndices(name, prefix, frameIndices, fps, loop); - } else { // frame label by indices - var keyFrame = anim.getFrameLabel(prefix); // todo: move to FunkinAnimateAnim - try { - var keyFrameIndices:Array = keyFrame.getFrameIndices(); - var finalIndices:Array = []; - for (index in frameIndices) finalIndices.push(keyFrameIndices[index] ?? (keyFrameIndices.length - 1)); - try { anim.addBySymbolIndices(name, anim.stageInstance.symbol.name, finalIndices, fps, loop); } - catch (e:Dynamic) {} - } catch (e:Dynamic) { - Log.warning('no frame label or symbol with the name of "$prefix" was found...'); - } - } - } - } else { - if (assetPath == null) { // wait for the asset to be loaded - if (overwrite) - animation.remove(name); - - if (frameIndices == null || frameIndices.length == 0) { - animation.addByPrefix(name, prefix, fps, loop, flipX, flipY); - } else { - if (prefix == null) - animation.add(name, frameIndices, fps, loop, flipX, flipY); - else - animation.addByIndices(name, prefix, frameIndices, '', fps, loop, flipX, flipY); - } - } - } + if (isAnimate || assetPath == null) // if asset path provided wait for the asset to be loaded + this.anim.add(name, prefix, fps, loop, frameIndices, flipX, flipY, overwrite); animationList[name] = {prefix: prefix, fps: fps, loop: loop, assetPath: assetPath, frameIndices: frameIndices, flipX: flipX, flipY: flipY}; } public function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { - var animExists:Bool = false; - if (isAnimate) { - if (animate == null) return; - if (animationExists(anim)) { - animate.funkAnim.play(anim, forced, reversed, frame); - animExists = true; - } - } else { - if (animationExists(anim)) { - animation.play(anim, forced, reversed, frame); - animExists = true; - } - } - if (animExists) { + var played:Bool = this.anim.play(anim, forced, reversed, frame); + + if (played) { if (offsets.exists(anim)) { var offset:FlxPoint = offsets[anim]; setAnimOffset(offset.x, offset.y); @@ -418,6 +361,12 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact } } } + public function animationExists(anim:String, preload:Bool = true):Bool { + if (preload) + preloadAnimAsset(anim); + + return this.anim.exists(anim); + } public function setAnimOffset(x:Float = 0, y:Float = 0):Void { animOffset.set(x, y); } @@ -430,87 +379,344 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact addAnimation(anim, animData.prefix, animData.fps, animData.loop, animData.frameIndices, null, animData.flipX, animData.flipY); } } - public function animationExists(anim:String, preload:Bool = true):Bool { - if (preload) - preloadAnimAsset(anim); + function get_currentAnimation():String { return anim.name; } + public function renameAnimation(oldAnim:String, newAnim:String):Void { return anim.rename(oldAnim, newAnim); } + public function getAnimationNameList():Array { return anim.getNameList(); } + public function isAnimationFinished():Bool { return anim.finished; } + public function finishAnimation():Void { anim.finish(); } + + function set_smooth(newSmooth:Bool):Bool { + antialiasing = (newSmooth && Options.data.antialiasing); + return (smooth = newSmooth); + } + function set_zoomFactor(value:Float):Float { + return zoomFactor = value; + } + function set_initialZoom(value:Float):Float { + return initialZoom = value; + } + + override function get_width() { + if (isAnimate) return animate.width; + else return width; + } + override function get_height() { + if (isAnimate) return animate.height; + else return height; + } + function get_isAnimate() { + return (renderType == ANIMATEATLAS && animate != null); + } +} + +// @:access(flixel.animation.FlxAnimation) +class FunkinSpriteAnimHandler implements IFlxDestroyable { + public var curInstance(get, never):Dynamic; // for hscript usage, mostly... + public var curSymbol(get, never):FlxSymbol; + public var curAnim(get, never):FlxAnimation; + + public var frameName(get, never):String; + public var curFrameFloat(get, set):Float; + public var curFrame(get, set):Int; + public var name(get, never):String; + public var paused(get, set):Bool; + public var looped(get, set):Bool; + public var length(get, never):Int; + public var finished(get, set):Bool; + public var reversed(get, set):Bool; + public var timeScale(get, set):Float; + + public var isAnimate:Bool = false; + public var attachedFunk(default, set):FunkinSprite; + public var attachedAnimate(default, set):FunkinAnimate; + + public var onLoop:FlxTypedSignal Void> = new FlxTypedSignal(); + public var onComplete:FlxTypedSignal Void> = new FlxTypedSignal(); + public var onFrame:FlxTypedSignal String -> Void> = new FlxTypedSignal(); + + var spriteC(get, never):FlxAnimationController; + var animateC(get, never):FunkinAnimateAnim; + + inline function set_attachedFunk(newFunk:FunkinSprite):FunkinSprite { + var oldAnimation:FlxAnimationController = attachedFunk?.animation; + if (oldAnimation != null) { + #if (flixel >= "5.9.0") + oldAnimation.onLoop.remove(_onLoop); + oldAnimation.onFinish.remove(_funkComplete); + oldAnimation.onFrameChange.remove(_funkFrame); + #else + if (oldAnimation.callback == _funkFrame) oldAnimation.callback = null; + if (oldAnimation.finishCallback == _funkComplete) oldAnimation.finishCallback = null; + #end + } + + if (newFunk == null) return attachedFunk = newFunk; + + #if (flixel >= "5.9.0") + newFunk.animation.onLoop.add(_onLoop); + newFunk.animation.onFinish.add(_funkComplete); + newFunk.animation.onFrameChange.add(_funkFrame); + #else + newFunk.animation.callback = _funkFrame; + newFunk.animation.finishCallback = _funkComplete; + #end + + return attachedFunk = newFunk; + } + inline function set_attachedAnimate(newAnimate:FunkinAnimate):FunkinAnimate { + var oldAnim:FunkinAnimateAnim = attachedAnimate?.funkAnim; + if (oldAnim != null) { + oldAnim.onComplete.remove(_animateComplete); + oldAnim.onFrame.remove(_animateFrame); + } + + if (newAnimate == null) return attachedAnimate = newAnimate; + + newAnimate.anim.onComplete.add(_animateComplete); + newAnimate.anim.onFrame.add(_animateFrame); + + return attachedAnimate = newAnimate; + } + + function _funkComplete(anim:String):Void { + if (isAnimate) return; + if (looped) { _onLoop(anim); } + else { onComplete.dispatch(anim); } + } + function _funkFrame(anim:String, frameNumber:Int, frameIndex:Int):Void { if (!isAnimate) onFrame.dispatch(frameNumber, anim); } + function _animateComplete():Void { + if (!isAnimate) return; + if (looped) { _onLoop(name); } + else { onComplete.dispatch(name); } + } + function _animateFrame(frameNumber:Int):Void { if (isAnimate) onFrame.dispatch(frameNumber, name); } + function _onLoop(anim:String):Void { onLoop.dispatch(anim); } + + inline function get_spriteC():FlxAnimationController { return attachedFunk?.animation; } + inline function get_animateC():FunkinAnimateAnim { return attachedAnimate?.funkAnim; } + + inline function get_curAnim():FlxAnimation { return spriteC?.curAnim; } + inline function get_curSymbol():FlxSymbol { return animateC?.curSymbol; } + inline function get_curInstance():Dynamic { return (isAnimate ? curAnim : curSymbol); } + + inline function get_curFrame():Int { return (isAnimate ? animateC.curFrame : curAnim?.curFrame) ?? 0; } + inline function get_frameName():String { return (isAnimate ? animateC.curSymbol?.name : attachedFunk?.frame?.name) ?? ''; } + inline function get_name():String { return (isAnimate ? animateC.name : spriteC?.name) ?? ''; } + inline function get_paused():Bool { return (isAnimate ? !(animateC.isPlaying ?? true) : curAnim?.paused) ?? false; } + inline function get_looped():Bool { return (isAnimate ? (animateC.loopType == Loop) : curAnim?.looped) ?? false; } + inline function get_length():Int { return (isAnimate ? animateC.length : curAnim?.frames.length) ?? 0; } + inline function get_finished():Bool { return (isAnimate ? animateC.finished : curAnim?.finished) ?? false; } + inline function get_reversed():Bool { return (isAnimate ? animateC.reversed : curAnim?.reversed) ?? false; } + inline function get_timeScale():Float { return (isAnimate ? animateC.timeScale : spriteC?.timeScale) ?? 1; } + inline function get_curFrameFloat():Float { + @:privateAccess { + if (isAnimate) { + if (animateC == null) return 0; + return (animateC._tick / animateC.frameDelay + animateC.curFrame); + } else { + if (curAnim == null) return 0; + var curFrameDuration = curAnim.getCurrentFrameDuration(); + return (curAnim._frameTimer / curFrameDuration + curAnim.curFrame); + } + } + } + inline function set_curFrameFloat(newFrame:Float):Float { + function fract(n:Float):Float { return n - Math.floor(n); } + @:privateAccess { + if (isAnimate) { + if (animateC == null) return newFrame; + animateC.curFrame = Math.floor(newFrame); + animateC._tick = animateC.frameDelay * fract(newFrame); + } else { + if (curAnim == null) return newFrame; + curAnim.curFrame = Math.floor(newFrame); + curAnim._frameTimer = curAnim.getCurrentFrameDuration() * fract(newFrame); + } + } + return newFrame; + } + + inline function set_curFrame(newFrame:Int):Int { if (isAnimate) { - return animate.funkAnim.exists(anim); + if (animateC == null) return newFrame; + return animateC.curFrame = newFrame; } else { - return animation.exists(anim); + if (curAnim == null) return newFrame; + return curAnim.curFrame = newFrame; } } - public function renameAnimation(oldAnim:String, newAnim:String) { + inline function set_paused(isIt:Bool):Bool { if (isAnimate) { - animate.funkAnim.rename(oldAnim, newAnim); + if (animateC == null) return isIt; + (isIt ? animateC.pause : animateC.resume)(); + return isIt; } else { - animation.rename(oldAnim, newAnim); + if (curAnim == null) return isIt; + return curAnim.paused = isIt; } } - public function getAnimationNameList():Array { + inline function set_looped(isIt:Bool):Bool { if (isAnimate) { - return animate.funkAnim.getNameList(); + if (animateC == null) return isIt; + animateC.loopType = (isIt ? Loop : PlayOnce); + return isIt; } else { - return animation.getNameList(); + if (curAnim == null) return isIt; + return curAnim.looped = isIt; } } - public function isAnimationFinished():Bool { + inline function set_finished(isIt:Bool):Bool { if (isAnimate) { - return animate.funkAnim.finished ?? false; + if (animateC == null) return isIt; + if (isIt) animateC.finish(); + return animateC.finished; } else { - return animation.finished ?? false; + if (curAnim == null) return isIt; + if (isIt) curAnim.finish(); + return isIt; } } - public function finishAnimation() { + inline function set_reversed(isIt:Bool):Bool { if (isAnimate) { - animate.funkAnim.finish(); + if (animateC == null) return isIt; + return animateC.reversed = isIt; } else { - animation.finish(); + if (curAnim == null) return isIt; + if (reversed != curAnim.reversed) curAnim.reverse(); + return isIt; } } - public function unloadAnimate() { - if (isAnimate && animate != null) { - animate.destroy(); - animate = null; + inline function set_timeScale(newScale:Float):Float { + if (isAnimate) { + if (animateC == null) return newScale; + return animateC.timeScale = newScale; + } else { + if (spriteC == null) return newScale; + return spriteC.timeScale = newScale; } } - function _onAnimationComplete(?anim:String) { - onAnimationComplete.dispatch(anim ?? currentAnimation ?? ''); - } - function _onAnimationFrame(frameNumber:Int) { - onAnimationFrame.dispatch(frameNumber); - } - function set_smooth(newSmooth:Bool):Bool { - antialiasing = (newSmooth && Options.data.antialiasing); - return (smooth = newSmooth); + public function new() {} + public function add(name:String, ?prefix:String, fps:Float = 24, loop:Bool = false, ?frameIndices:Array, flipX:Bool = false, flipY:Bool = false, overwrite:Bool = false):Bool { + if (isAnimate) { + if (animateC == null) return false; + + if (overwrite) { + animateC.remove(name); + } else if (exists(name)) { + return false; + } + + var symbolExists:Bool = (animateC.symbolDictionary != null && animateC.symbolDictionary.exists(prefix)); + if (frameIndices == null || frameIndices.length == 0) { + if (symbolExists) { + animateC.addBySymbol(name, '$prefix\\', fps, loop); + } else { + try { animateC.addByFrameLabel(name, prefix, fps, loop); } + catch (e:Dynamic) { Log.warning('no frame label or symbol with the name of "$prefix" was found...'); } + } + } else { + if (symbolExists) { + animateC.addBySymbolIndices(name, prefix, frameIndices, fps, loop); + } else { // frame label by indices + var keyFrame = animateC.getFrameLabel(prefix); // todo: move to FunkinAnimateAnim + try { + var keyFrameIndices:Array = keyFrame.getFrameIndices(); + var finalIndices:Array = []; + for (index in frameIndices) finalIndices.push(keyFrameIndices[index] ?? (keyFrameIndices.length - 1)); + try { animateC.addBySymbolIndices(name, animateC.stageInstance.symbol.name, finalIndices, fps, loop); } + } catch (e:Dynamic) { + Log.warning('no frame label or symbol with the name of "$prefix" was found...'); + } + } + } + + return animateC.exists(name); + } else { + if (spriteC == null) return false; + + if (overwrite) { + spriteC.remove(name); + } else if (exists(name)) { + return false; + } + + if (frameIndices == null || frameIndices.length == 0) { + spriteC.addByPrefix(name, prefix, fps, loop, flipX, flipY); + } else { + if (prefix == null) + spriteC.add(name, frameIndices, fps, loop, flipX, flipY); + else + spriteC.addByIndices(name, prefix, frameIndices, '', fps, loop, flipX, flipY); + } + + return spriteC.exists(name); + } } - function set_zoomFactor(value:Float):Float { - return zoomFactor = value; + public function play(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0):Bool { + if (exists(anim)) { + if (isAnimate) { + animateC?.play(anim, forced, reversed, frame); + } else { + spriteC?.play(anim, forced, reversed, frame); + } + return true; + } + return false; } - function set_initialZoom(value:Float):Float { - return initialZoom = value; + public function reverse():Void { + if (isAnimate) { + if (animateC == null) return; + animateC.reversed = !animateC.reversed; + } else { + spriteC?.reverse(); + } } - - override function get_width() { - if (isAnimate) return animate.width; - else return width; + public function exists(anim:String):Bool { + if (isAnimate) { + return animateC?.exists(anim) ?? false; + } else { + return spriteC?.exists(anim) ?? false; + } } - override function get_height() { - if (isAnimate) return animate.height; - else return height; + public function rename(oldAnim:String, newAnim:String):Void { + if (isAnimate) { + animateC?.rename(oldAnim, newAnim); + } else { + spriteC?.rename(oldAnim, newAnim); + } + } + public function remove(anim:String):Void { + if (isAnimate) { + animateC?.remove(anim); + } else { + spriteC?.remove(anim); + } } - function get_anim() { - return (isAnimate ? animate.funkAnim : animation); + public function getNameList():Array { + if (isAnimate) { + return animateC?.getNameList() ?? []; + } else { + return spriteC?.getNameList() ?? []; + } } - function get_isAnimate() { - return (renderType == ANIMATEATLAS && animate != null); + public function finish():Void { + if (isAnimate) { + animateC?.finish(); + } else { + spriteC?.finish(); + } } - function get_currentAnimation() { - if (isAnimate) return animate.funkAnim.name; - else return animation.name; + + public function destroy():Void { + FlxDestroyUtil.destroy(onLoop); + FlxDestroyUtil.destroy(onFrame); + FlxDestroyUtil.destroy(onComplete); + // idk } } + interface ISpriteVars { public var extraData:Map; @@ -533,8 +739,9 @@ interface IFunkinSpriteAnim { // the essentials, anyway public function isAnimationFinished():Bool; public function finishAnimation():Void; + public var onAnimationFrame:FlxTypedSignal String -> Void>; public var onAnimationComplete:FlxTypedSignal Void>; - public var onAnimationFrame:FlxTypedSignal Void>; + public var onAnimationLoop:FlxTypedSignal Void>; } enum abstract SpriteRenderType(String) to String { diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index b40abe2..dea411b 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -7,6 +7,8 @@ import funkin.objects.play.Lane; import funkin.backend.play.Scoring; import funkin.objects.play.Strumline; +using StringTools; + @:structInit class NoteEvent implements IPlayEvent { // TODO: EVENT RECYCLER public var type(default, null):NoteEventType; public var cancelled:Bool = false; @@ -49,8 +51,10 @@ import funkin.objects.play.Strumline; case HIT: if (game.genericVocals != null) game.genericVocals.volume = 1; - if (targetCharacter != null) + if (targetCharacter != null) { targetCharacter.volume = 1; + targetCharacter.held = true; + } note.hitTime = note.holdTime = lane.conductorInUse.songPosition; @@ -95,6 +99,8 @@ import funkin.objects.play.Strumline; lane.receptor.grayBeat = note.beatTime + .5; } case PRESSED: + lane.pressed = true; + if (note != null) { lane.hitNote(note); } else { @@ -105,8 +111,23 @@ import funkin.objects.play.Strumline; if (released && note == null) { lane.held = false; + lane.pressed = false; + if (animateReceptor) receptor.playAnimation('static'); + + if (targetCharacter != null) { + var canUnhold:Bool = true; + + if (strumline != null) { + for (lane in strumline.lanes) + canUnhold = canUnhold && !lane.pressed; + } + + if (canUnhold) + targetCharacter.held = false; + } + return; } @@ -195,8 +216,8 @@ import funkin.objects.play.Strumline; targetCharacter.playAnimationSteps('sing${game.singAnimations[lane.noteData]}miss', true); } + applyExtraWindow(15); if (applyRating) { - applyExtraWindow(15); scoring ??= scoreHandler?.judgeNoteGhost(); if (inGame) diff --git a/source/funkin/objects/Character.hx b/source/funkin/objects/Character.hx index 6868337..9c9a645 100644 --- a/source/funkin/objects/Character.hx +++ b/source/funkin/objects/Character.hx @@ -9,13 +9,13 @@ using StringTools; class Character extends FunkinSprite implements ICharacter { public var bopFrequency:Int = 2; public var bop(default, set):Bool = true; - public var flipSingAnimations:Bool = false; + public var held(default, set):Bool = false; public var animReset(default, set):Float = 0; public var singForSteps(default, set):Float = 4; public var specialAnim(default, set):Bool = false; + public var idleAfterAnim(default, set):Bool = true; // like held but for special anim public var conductorInUse(default, set):Conductor = FunkinState.getCurrentConductor(); public var scaleMultiplier:Float = 1; - public var idleAfterAnim:Bool = true; public var sway:Bool = false; public var hasDropAnimations(get, never):Bool; @@ -27,6 +27,7 @@ class Character extends FunkinSprite implements ICharacter { var binSide:CharacterSide; var dataSide:CharacterSide; var characterGroup:CharacterGroup; + public var flipSingAnimations:Bool = false; public var side(default, set):CharacterSide; public var classicFlip(default, set):Bool = false; @@ -58,6 +59,10 @@ class Character extends FunkinSprite implements ICharacter { public function new(x:Float, y:Float, ?character:String, side:CharacterSide = IDGAF, ?fallback:String, runScripts:Bool = true) { super(x, y); + anim.onFrame.add((number:Int, anim:String) -> characterGroup?.onAnimationFrame.dispatch(number, anim)); + anim.onComplete.add((anim:String) -> characterGroup?.onAnimationComplete.dispatch(anim)); + anim.onLoop.add((anim:String) -> characterGroup?.onAnimationLoop.dispatch(anim)); + hscripts = new HScripts([this], ['this' => this, 'super' => this]); rotateOffsets = true; @@ -215,18 +220,17 @@ class Character extends FunkinSprite implements ICharacter { super.update(elapsed); if (animReset > 0) { animReset -= elapsed; - if (animReset <= 0 && !specialAnim && idleAfterAnim) { + if (animReset <= 0 && !specialAnim && idleAfterAnim && !held) { animReset = 0; - dance(); + dance(true); } } if (specialAnim) { if (isAnimationFinished() && animReset <= 0 && idleAfterAnim) { specialAnim = false; animReset = 0; - if (singForSteps <= 0) { - dance(); - } + if (singForSteps <= 0) + dance(true); } } } @@ -323,7 +327,7 @@ class Character extends FunkinSprite implements ICharacter { if (safeH != 'dance' && functionOverridden('dance')) return cast safeCall('dance', [beat, forced], Bool, false); - if (!forced && (animReset > 0 || bopFrequency <= 0 || !bop || specialAnim)) + if (!forced && (animReset > 0 || bopFrequency <= 0 || !bop || specialAnim || held)) return false; if (sway) { @@ -348,22 +352,18 @@ class Character extends FunkinSprite implements ICharacter { if (isAnimate) return flipAnim(animate.funkAnim.name); else return flipAnim(animation.name); } - override function _onAnimationComplete(?anim:String) { - onAnimationComplete.dispatch(currentAnimation ?? ''); - if (characterGroup != null && this == characterGroup.current) - characterGroup.onAnimationComplete.dispatch(currentAnimation ?? ''); - } - override function _onAnimationFrame(frame:Int) { - onAnimationFrame.dispatch(frame); - if (characterGroup != null && this == characterGroup.current) - characterGroup.onAnimationFrame.dispatch(frame); + function set_held(value:Bool):Bool { + if (!value && animReset <= 0 && !specialAnim) + dance(true); + return held = value; } function set_bop(value:Bool):Bool { return bop = value; } function set_animReset(value:Float):Float { return animReset = value; } function set_specialAnim(value:Bool):Bool { return specialAnim = value; } function set_idleSuffix(value:String):String { return idleSuffix = value; } function set_animSuffix(value:String):String { return animSuffix = value; } - function set_singForSteps(value:Float):Float { return singForSteps = value; }; + function set_idleAfterAnim(value:Bool):Bool { return idleAfterAnim = value; } + function set_singForSteps(value:Float):Float { return singForSteps = value; } function set_conductorInUse(conductor:Conductor):Conductor { return conductorInUse = conductor; } function safeCall(func:String, ?args:Array, ?expectedReturn:Dynamic, ?defaultVal:Dynamic):Dynamic { @@ -641,10 +641,12 @@ class Character extends FunkinSprite implements ICharacter { } } interface ICharacter extends IBopper extends IFunkinSpriteAnim { + public var held(default, set):Bool; public var volume(default, set):Float; public var animReset(default, set):Float; public var specialAnim(default, set):Bool; public var animSuffix(default, set):String; + public var idleAfterAnim(default, set):Bool; public var side(default, set):CharacterSide; public var character(default, set):Null; public var conductorInUse(default, set):Conductor; diff --git a/source/funkin/objects/CharacterGroup.hx b/source/funkin/objects/CharacterGroup.hx index cbb21b0..c710089 100644 --- a/source/funkin/objects/CharacterGroup.hx +++ b/source/funkin/objects/CharacterGroup.hx @@ -9,28 +9,32 @@ using Lambda; typedef CharacterOrString = flixel.util.typeLimit.OneOfTwo; typedef CharacterOrGroup = flixel.util.typeLimit.OneOfTwo; -class CharacterGroup extends FunkinTypedSpriteGroup implements ICharacter { // TODO: implement interface so currently CharacterGroup type fields can be both group and character instead? +class CharacterGroup extends FunkinTypedSpriteGroup implements ICharacter { + public var onAnimationFrame:FlxTypedSignal String -> Void> = new FlxTypedSignal(); public var onAnimationComplete:FlxTypedSignal Void> = new FlxTypedSignal(); - public var onAnimationFrame:FlxTypedSignal Void> = new FlxTypedSignal(); + public var onAnimationLoop:FlxTypedSignal Void> = new FlxTypedSignal(); + public var anim(get, never):FunkinSpriteAnimHandler; public var bop(default, set):Bool = true; + public var held(default, set):Bool = false; public var side(default, set):CharacterSide; public var animReset(default, set):Float = 0; + public var cameraOffset(get, never):FlxPoint; public var idleSuffix(default, set):String = ''; public var animSuffix(default, set):String = ''; public var specialAnim(default, set):Bool = false; public var conductorInUse(default, set):Conductor; + public var idleAfterAnim(default, set):Bool = true; public var stageCameraOffset(default, null):FlxCallbackPoint; public var onCharacterChanged:FlxTypedSignal Character -> Void> = new FlxTypedSignal(); - @:isVar public var cameraOffset(get, never):FlxPoint; public var volume(default, set):Float = 1; public var character(default, set):String; public var current(default, set):Character = null; - @:isVar public var healthIcon(get, never):String; - @:isVar public var healthIconData(get, never):ModernCharacterHealthIconData; - @:isVar public var currentAnimation(get, never):String; + public var healthIcon(get, never):String; + public var healthIconData(get, never):ModernCharacterHealthIconData; + public var currentAnimation(get, never):String; public var fallbackCharacter:Null; var fallbackChara:Null; @@ -80,6 +84,9 @@ class CharacterGroup extends FunkinTypedSpriteGroup implements IChara } return side = newSide; } + function get_anim():FunkinSpriteAnimHandler { + return current?.anim; + } function get_healthIcon():String { return current?.healthIcon; } @@ -115,7 +122,21 @@ class CharacterGroup extends FunkinTypedSpriteGroup implements IChara if (chara == null) continue; chara.bop = value; } - return specialAnim = value; + return bop = value; + } + function set_held(value:Bool):Bool { + for (chara in members) { + if (chara == null) continue; + chara.held = value; + } + return held = value; + } + function set_idleAfterAnim(value:Bool):Bool { + for (chara in members) { + if (chara == null) continue; + chara.idleAfterAnim = value; + } + return idleAfterAnim = value; } function set_animReset(value:Float):Float { if (current != null) @@ -162,6 +183,7 @@ class CharacterGroup extends FunkinTypedSpriteGroup implements IChara function get_currentAnimation():String { return (current?.currentAnimation); } + override function set_zIndex(newZ:Int):Int { for (chara in members) { if (chara == null) continue; diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 1a7ece5..1978d22 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -23,6 +23,7 @@ class Lane extends FunkinSpriteGroup { public var held(default, set):Bool = false; public var heldNote:Note = null; + public var pressed:Bool = false; public var noteData:Int; public var oneWay:Bool = true; @@ -56,8 +57,10 @@ class Lane extends FunkinSpriteGroup { } public function set_held(newHeld:Bool) { if (held == newHeld) return newHeld; + if (newHeld) popCover(); else noteCover.kill(); + return held = newHeld; } public function set_cpu(isCpu:Bool) { diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index ea79dde..e72aef8 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -123,20 +123,28 @@ class Note extends FunkinSprite { function set_noteKind(newKind:String):String { return kind = newKind; } function get_noteKind():String { return kind; } - public override function destroy() { + public override function destroy():Void { tailOffset.put(); if (tail != null) tail.destroy(); super.destroy(); tail = null; } - public override function draw() { + public override function draw():Void { if (isHoldNote && tail != null) tail.draw(); if (!goodHit) super.draw(); } + public override function kill():Void { + super.kill(); + tail?.kill(); + } + public override function revive():Void { + super.revive(); + tail?.revive(); + } public function new(songNote:ChartNote, ?conductor:Conductor) { super(); From 3f367898da7867973686f6c97670d456a8003661 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:58:15 -0600 Subject: [PATCH 15/73] fix nene character script --- assets/scripts/characters/nene-dark.hx | 2 +- assets/scripts/characters/nene.hx | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/assets/scripts/characters/nene-dark.hx b/assets/scripts/characters/nene-dark.hx index 8c1d6cc..f4f99a4 100644 --- a/assets/scripts/characters/nene-dark.hx +++ b/assets/scripts/characters/nene-dark.hx @@ -143,7 +143,7 @@ function setState(state) { var MIN_BLINK_DELAY:Int = 3; var MAX_BLINK_DELAY:Int = 7; var blinkCountdown:Int = MIN_BLINK_DELAY; -function dance(beat:Int = 0, forced:Bool = false) { +function dance(?beat:Int = 0, ?forced:Bool = false) { var stopDance:Bool = true; switch (getVar('state')) { diff --git a/assets/scripts/characters/nene.hx b/assets/scripts/characters/nene.hx index 098fe01..af724bd 100644 --- a/assets/scripts/characters/nene.hx +++ b/assets/scripts/characters/nene.hx @@ -78,7 +78,7 @@ function draw() { } function shouldTransitionState() { - return (game.inputEnabled && game.player1 != null && game.player1.current.loadedCharacter != 'pico-blazin'); + return (!game.inputDisabled && game.player1 != null && game.player1.current.loadedCharacter != 'pico-blazin'); } function transitionState() { switch (getVar('state')) { @@ -136,8 +136,10 @@ function dance(?beat:Int = 0, ?forced:Bool = false) { } } - if (!stopDance) - super.dance(beat, forced); + if (stopDance) + return false; + + return super.dance(beat, forced); } function animationFinishedC(anim:String) { switch (getVar('state')) { From 72a973da5a057ce7243dc10d4e1f3f47fe3798ef Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Wed, 19 Mar 2025 20:07:36 -0600 Subject: [PATCH 16/73] Strumline/Lane.character, PREPARE MULTIKEY also fixed a stupid little issue with note presses. --- source/funkin/backend/play/NoteEvent.hx | 12 ++++--- source/funkin/objects/Character.hx | 3 ++ source/funkin/objects/play/Lane.hx | 20 ++++++----- source/funkin/objects/play/Note.hx | 15 +++++---- source/funkin/objects/play/Strumline.hx | 45 ++++++++++++++++++------- source/funkin/states/PlayState.hx | 9 ++--- 6 files changed, 69 insertions(+), 35 deletions(-) diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index dea411b..b179e2f 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -47,6 +47,8 @@ using StringTools; scoreHandler ??= game.scoring; } + targetCharacter ??= lane.character; + switch (type) { case HIT: if (game.genericVocals != null) @@ -83,7 +85,8 @@ using StringTools; splash = lane.splash(); if (playAnimation && targetCharacter != null) { - var anim:String = 'sing${game.singAnimations[note.laneIndex]}'; + var wrapIndex:Int = FlxMath.wrap(note.laneIndex, 0, game.singAnimations.length - 1); + var anim:String = 'sing${game.singAnimations[wrapIndex]}'; var suffixAnim:String = anim + animSuffix; if (targetCharacter.animationExists(suffixAnim + targetCharacter.animSuffix)) targetCharacter.playAnimationSteps(suffixAnim, true); @@ -170,7 +173,8 @@ using StringTools; } if (playAnimation && targetCharacter != null) { - var anim:String = 'sing${game.singAnimations[note.laneIndex]}'; + var wrapIndex:Int = FlxMath.wrap(note.laneIndex, 0, game.singAnimations.length - 1); + var anim:String = 'sing${game.singAnimations[wrapIndex]}'; var suffixAnim:String = anim + animSuffix + targetCharacter.animSuffix; if ((!targetCharacter.specialAnim || targetCharacter.currentAnimation == suffixAnim) && targetCharacter.animationExists(suffixAnim)) targetCharacter.timeAnimSteps(); @@ -232,8 +236,8 @@ using StringTools; if (targetCharacter != null) { targetCharacter.volume = 0; if (playAnimation) { - targetCharacter.specialAnim = false; - targetCharacter.playAnimationSteps('sing${game.singAnimations[note.laneIndex]}miss', true); + var wrapIndex:Int = FlxMath.wrap(note.laneIndex, 0, game.singAnimations.length - 1); + targetCharacter.playAnimationSteps('sing${game.singAnimations[wrapIndex]}miss', true); } } diff --git a/source/funkin/objects/Character.hx b/source/funkin/objects/Character.hx index 9c9a645..e6f7f7e 100644 --- a/source/funkin/objects/Character.hx +++ b/source/funkin/objects/Character.hx @@ -353,8 +353,11 @@ class Character extends FunkinSprite implements ICharacter { else return flipAnim(animation.name); } function set_held(value:Bool):Bool { + if (held == value) return value; + if (!value && animReset <= 0 && !specialAnim) dance(true); + return held = value; } function set_bop(value:Bool):Bool { return bop = value; } diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 1978d22..6d39717 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -2,6 +2,7 @@ package funkin.objects.play; import haxe.Constraints; import funkin.shaders.RGBSwap; +import funkin.objects.Character; import funkin.objects.play.Note; import funkin.backend.play.Scoring; import funkin.backend.play.NoteEvent; @@ -34,6 +35,7 @@ class Lane extends FunkinSpriteGroup { public var hitWindow:Float = Scoring.safeFrames / 60 * 1000; public var conductorInUse:Conductor = FunkinState.getCurrentConductor(); public var inputKeys:Array = []; + public var character:ICharacter = null; public var strumline:Strumline; public var cpu(default, set):Bool = false; @@ -69,19 +71,21 @@ class Lane extends FunkinSpriteGroup { receptor.autoReset = isCpu; return cpu = isCpu; } - public function new(x:Float, y:Float, data:Int) { + public function new(x:Float, y:Float, data:Int, dir:Float = 90, speed:Float = 1) { super(x, y); startX = x; startY = y; + direction = dir; + scrollSpeed = speed; inputFilter = (note:Note) -> { var time:Float = note.msTime - conductorInUse.songPosition; return (time <= note.hitWindow + extraWindow) && (time >= -note.hitWindow); }; - var splashColors:Array = NoteSplash.makeSplashColors(Note.directionColors[data][0]); - rgbShader = new RGBSwap(Note.directionColors[data][0], FlxColor.WHITE, Note.directionColors[data][1]); + var splashColors:Array = NoteSplash.makeSplashColors(Note.getColors(data)[0]); + rgbShader = new RGBSwap(Note.getColors(data)[0], Note.getColors(data)[1], Note.getColors(data)[2]); splashRGB = new RGBSwap(splashColors[0], FlxColor.WHITE, splashColors[1]); noteCover = new NoteCover(data); @@ -405,7 +409,7 @@ class Receptor extends FunkinSprite { this.noteData = data; - rgbShader = new RGBSwap(Note.directionColors[data][0], FlxColor.WHITE, Note.directionColors[data][1]); + rgbShader = new RGBSwap(Note.getColors(data)[0], Note.getColors(data)[1], Note.getColors(data)[2]); computeRGBColors(); loadAtlas('notes'); @@ -424,7 +428,7 @@ class Receptor extends FunkinSprite { public function reloadAnimations() { animation.destroyAnimations(); - var dirName:String = Note.directionNames[noteData]; + var dirName:String = Note.getDirection(noteData); addAnimation('static', '$dirName receptor', 24, true); addAnimation('confirm', '$dirName confirm', 24, false); addAnimation('press', '$dirName press', 24, false); @@ -485,7 +489,7 @@ class NoteSplash extends FunkinSprite { shader = rgbShader.shader; this.noteData = data; - var dirName:String = Note.directionNames[data]; + var dirName:String = Note.getDirection(data); addAnimation('splash1', 'notesplash $dirName 1', 24, false); addAnimation('splash2', 'notesplash $dirName 2', 24, false); onAnimationComplete.add((anim:String) -> { kill(); }); @@ -528,7 +532,7 @@ class NoteCover extends FunkinSprite { super(); loadAtlas('noteCovers'); - var dir:String = Note.directionNames[data]; + var dir:String = Note.getDirection(data); if (!hasAnimationPrefix('hold cover start $dir')) dir = ''; addAnimation('start', 'hold cover start $dir'.trim(), 24, false); addAnimation('loop', 'hold cover loop $dir'.trim(), 24, true); @@ -554,7 +558,7 @@ class NoteSpark extends FunkinSprite { super(data); loadAtlas('noteCovers'); - var dir:String = Note.directionNames[data]; + var dir:String = Note.getDirection(data); if (!hasAnimationPrefix('hold cover $dir')) dir = ''; addAnimation('spark', 'hold cover spark ${dir}'.trim(), 24, false); onAnimationComplete.add((anim:String) -> { kill(); }); diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index e72aef8..6e6aa65 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -57,11 +57,14 @@ import flixel.graphics.frames.FlxFrame; class Note extends FunkinSprite { public static var directionNames:Array = ['left', 'down', 'up', 'right']; public static var directionColors:Array> = [ - [FlxColor.fromRGB(194, 75, 153), FlxColor.fromRGB(60, 31, 86)], - [FlxColor.fromRGB(0, 255, 255), FlxColor.fromRGB(21, 66, 183)], - [FlxColor.fromRGB(18, 250, 5), FlxColor.fromRGB(10, 68, 71)], - [FlxColor.fromRGB(249, 57, 63), FlxColor.fromRGB(101, 16, 56)], + [FlxColor.fromRGB(194, 75, 153), FlxColor.WHITE, FlxColor.fromRGB(60, 31, 86)], + [FlxColor.fromRGB(0, 255, 255), FlxColor.WHITE, FlxColor.fromRGB(21, 66, 183)], + [FlxColor.fromRGB(18, 250, 5), FlxColor.WHITE, FlxColor.fromRGB(10, 68, 71)], + [FlxColor.fromRGB(249, 57, 63), FlxColor.WHITE, FlxColor.fromRGB(101, 16, 56)], ]; + public static inline function getColors(data:Int):Array { return directionColors[FlxMath.wrap(data, 0, directionColors.length - 1)]; } + public static inline function getDirection(data:Int):String { return directionNames[FlxMath.wrap(data, 0, directionNames.length - 1)]; } + public var conductorInUse:Conductor; // mostly charting stuff public var tail:NoteTail; @@ -205,7 +208,7 @@ class Note extends FunkinSprite { tail = new NoteTail(this); } public function reloadAnimations() { - var dirName:String = directionNames[laneIndex]; + var dirName:String = getDirection(laneIndex); addAnimation('hit-$laneIndex', '$dirName note', 24, false); playAnimation('hit-$laneIndex', true); updateHitbox(); @@ -369,7 +372,7 @@ class NoteTail extends FunkinSprite { sustainClip = 0; } public function reloadAnimations() { - var dirName:String = Note.directionNames[laneIndex]; + var dirName:String = Note.getDirection(laneIndex); addAnimation('tail-$laneIndex', '$dirName hold tail', 24, false); addAnimation('hold-$laneIndex', '$dirName hold piece', 24, false); playAnimation('hold-$laneIndex', true); diff --git a/source/funkin/objects/play/Strumline.hx b/source/funkin/objects/play/Strumline.hx index ec7cce7..d4f650f 100644 --- a/source/funkin/objects/play/Strumline.hx +++ b/source/funkin/objects/play/Strumline.hx @@ -1,5 +1,6 @@ package funkin.objects.play; +import funkin.objects.Character; import funkin.objects.play.Note; import funkin.backend.play.Scoring; import funkin.backend.play.NoteEvent; @@ -28,18 +29,20 @@ class Strumline extends FunkinSpriteGroup { public var scrollSpeed(default, set):Float; public var oneWay(default, set):Bool = true; public var allowInput(default, set):Bool = true; + public var character(default, set):ICharacter = null; public var noteClass(default, set):Class = Note; public var hitWindow(default, set):Float = Scoring.safeFrames / 60 * 1000; //oh dear - public function set_cpu(isCpu:Bool) { for (lane in lanes) lane.cpu = isCpu; return cpu = isCpu; } - public function set_oneWay(isOneWay:Bool) { for (lane in lanes) lane.oneWay = isOneWay; return oneWay = isOneWay; } - public function set_direction(newDir:Float) { for (lane in lanes) lane.direction = newDir; return direction = newDir; } - public function set_hitWindow(newWindow:Float) { for (lane in lanes) lane.hitWindow = newWindow; return hitWindow = newWindow; } - public function set_allowInput(isAllowed:Bool) { for (lane in lanes) lane.allowInput = isAllowed; return allowInput = isAllowed; } - public function set_noteClass(newClass:Class) { for (lane in lanes) lane.noteClass = newClass; return noteClass = newClass; } - public function set_scrollSpeed(newSpeed:Float) { for (lane in lanes) lane.scrollSpeed = newSpeed; return scrollSpeed = newSpeed; } - public function set_laneSpacing(newSpacing:Float) { + function set_cpu(isCpu:Bool) { for (lane in lanes) lane.cpu = isCpu; return cpu = isCpu; } + function set_oneWay(isOneWay:Bool) { for (lane in lanes) lane.oneWay = isOneWay; return oneWay = isOneWay; } + function set_direction(newDir:Float) { for (lane in lanes) lane.direction = newDir; return direction = newDir; } + function set_hitWindow(newWindow:Float) { for (lane in lanes) lane.hitWindow = newWindow; return hitWindow = newWindow; } + function set_allowInput(isAllowed:Bool) { for (lane in lanes) lane.allowInput = isAllowed; return allowInput = isAllowed; } + function set_character(newChara:ICharacter) { for (lane in lanes) lane.character = newChara; return character = newChara; } + function set_noteClass(newClass:Class) { for (lane in lanes) lane.noteClass = newClass; return noteClass = newClass; } + function set_scrollSpeed(newSpeed:Float) { for (lane in lanes) lane.scrollSpeed = newSpeed; return scrollSpeed = newSpeed; } + function set_laneSpacing(newSpacing:Float) { var i:Int = 0; var diff:Float = newSpacing - laneSpacing; for (lane in lanes) { @@ -49,16 +52,23 @@ class Strumline extends FunkinSpriteGroup { } return laneSpacing = newSpacing; } - public function set_laneCount(newCount:Int) { + function set_laneCount(newCount:Int) { while (lanes.length > 0 && lanes.length > newCount) { - var lane = lanes.members[lanes.length - 1]; - lanes.remove(lane, true); + var lane:Lane = lanes.members.shift(); lane.destroy(); } for (i in laneCount...newCount) { - var lane:Lane = new Lane(i * laneSpacing * scale.x, 0, i); + var lane:Lane = new Lane(i * laneSpacing * scale.x, 0, i, direction, scrollSpeed); + + lane.allowInput = allowInput; + lane.noteClass = noteClass; + lane.hitWindow = hitWindow; + lane.character = character; lane.strumline = this; lane.selfDraw = false; + lane.oneWay = oneWay; + lane.cpu = cpu; + lanes.add(lane); } return laneCount = newCount; @@ -120,11 +130,20 @@ class Strumline extends FunkinSpriteGroup { super(); this.lanes = new FunkinTypedSpriteGroup(); this.add(lanes); + this.allowInput = true; - this.laneCount = laneCount; this.direction = direction; this.scrollSpeed = scrollSpeed; this.noteClass = noteClass ?? Note; + + this.laneCount = laneCount; + } + public function resetLanePositions():Void { + for (i => lane in lanes) { + lane.setPosition(x + i * laneSpacing * scale.x, y); + lane.startX = lane.x; + lane.startY = lane.y; + } } public function fadeIn() { var i:Int = 0; diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index f6ce0dd..c077c5e 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -159,7 +159,7 @@ class PlayState extends FunkinState { keybinds = Options.data.keybinds['4k']; - opponentStrumline = new Strumline(4, 90, chart.scrollSpeed); + opponentStrumline = new Strumline(chart.keyCount, 90, chart.scrollSpeed); opponentStrumline.fitToSize(strumlineBound, opponentStrumline.height * .7); opponentStrumline.noteEvent.add(opponentNoteEvent); opponentStrumline.setPosition(50, strumlineY); @@ -167,7 +167,7 @@ class PlayState extends FunkinState { opponentStrumline.cpu = true; opponentStrumline.allowInput = false; - playerStrumline = new Strumline(4, 90, chart.scrollSpeed); + playerStrumline = new Strumline(chart.keyCount, 90, chart.scrollSpeed); playerStrumline.fitToSize(strumlineBound, playerStrumline.height * .7); playerStrumline.setPosition(FlxG.width - playerStrumline.width - 50 - 75, strumlineY); playerStrumline.noteEvent.add(playerNoteEvent); @@ -220,6 +220,9 @@ class PlayState extends FunkinState { player3 = stage.getCharacter('gf'); focusOnCharacter((player3 ?? player1).current); + + playerStrumline.character = player1; + opponentStrumline.character = player2; } else { camFocusTarget.setPosition(FlxG.width * .5, FlxG.height * .5); simpleBG = new FunkinSprite().loadTexture('mainmenu/bgGreen'); @@ -744,7 +747,6 @@ class PlayState extends FunkinState { } public function playerNoteEvent(e:NoteEvent) { - e.targetCharacter = player1; e.doSplash = true; e.doSpark = true; @@ -758,7 +760,6 @@ class PlayState extends FunkinState { dispatchPlayEvent('playerNoteEvent', e); } public function opponentNoteEvent(e:NoteEvent) { - e.targetCharacter = player2; e.applyRating = false; e.playSound = false; e.doSplash = false; From 459c4bed1a48e9dae79cd8117d93292c95894d7c Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 23 Mar 2025 00:32:46 -0600 Subject: [PATCH 17/73] SUPER WIP note styles also fixed some note event stuff for botplay (fixes character not idling) --- assets/data/styles/notes/funkin-6k.json | 136 +++++++++++ assets/data/styles/notes/funkin-9k.json | 157 +++++++++++++ assets/data/styles/notes/funkin.json | 122 ++++++++++ .../images/{go.png => gameplay/funkin/GO.png} | Bin assets/images/{ => gameplay/funkin}/ONE.png | Bin assets/images/{ => gameplay/funkin}/TWO.png | Bin assets/images/{ => gameplay/funkin}/bad.png | Bin assets/images/{ => gameplay/funkin}/combo.png | Bin assets/images/{ => gameplay/funkin}/good.png | Bin .../images/{ => gameplay/funkin}/killer.png | Bin assets/images/{ => gameplay/funkin}/miss.png | Bin .../{ => gameplay/funkin}/noteCovers.png | Bin .../{ => gameplay/funkin}/noteCovers.xml | 0 .../{ => gameplay/funkin}/noteSparks.png | Bin .../{ => gameplay/funkin}/noteSparks.xml | Bin .../{ => gameplay/funkin}/noteSplashes.png | Bin .../{ => gameplay/funkin}/noteSplashes.xml | 0 assets/images/{ => gameplay/funkin}/notes.png | Bin assets/images/{ => gameplay/funkin}/notes.xml | 0 assets/images/{ => gameplay/funkin}/num0.png | Bin assets/images/{ => gameplay/funkin}/num1.png | Bin assets/images/{ => gameplay/funkin}/num2.png | Bin assets/images/{ => gameplay/funkin}/num3.png | Bin assets/images/{ => gameplay/funkin}/num4.png | Bin assets/images/{ => gameplay/funkin}/num5.png | Bin assets/images/{ => gameplay/funkin}/num6.png | Bin assets/images/{ => gameplay/funkin}/num7.png | Bin assets/images/{ => gameplay/funkin}/num8.png | Bin assets/images/{ => gameplay/funkin}/num9.png | Bin .../images/{ => gameplay/funkin}/sadmiss.png | Bin assets/images/{ => gameplay/funkin}/shit.png | Bin assets/images/{ => gameplay/funkin}/sick.png | Bin assets/images/{ => gameplay}/healthBar.png | Bin assets/images/{ => gameplay}/lose.png | Bin assets/images/{ => gameplay}/lose.xml | 0 assets/images/{ => gameplay}/restart.png | Bin source/funkin/backend/FunkinState.hx | 8 + source/funkin/backend/play/NoteEvent.hx | 23 +- source/funkin/backend/play/NoteStyle.hx | 206 ++++++++++++++++ source/funkin/backend/play/SongEvent.hx | 2 +- source/funkin/objects/play/Lane.hx | 221 +++++++++++++----- source/funkin/objects/play/Note.hx | 100 ++++---- source/funkin/objects/play/Strumline.hx | 42 ++-- source/funkin/states/PlayState.hx | 24 +- 44 files changed, 894 insertions(+), 147 deletions(-) create mode 100644 assets/data/styles/notes/funkin-6k.json create mode 100644 assets/data/styles/notes/funkin-9k.json create mode 100644 assets/data/styles/notes/funkin.json rename assets/images/{go.png => gameplay/funkin/GO.png} (100%) rename assets/images/{ => gameplay/funkin}/ONE.png (100%) rename assets/images/{ => gameplay/funkin}/TWO.png (100%) rename assets/images/{ => gameplay/funkin}/bad.png (100%) rename assets/images/{ => gameplay/funkin}/combo.png (100%) rename assets/images/{ => gameplay/funkin}/good.png (100%) rename assets/images/{ => gameplay/funkin}/killer.png (100%) rename assets/images/{ => gameplay/funkin}/miss.png (100%) rename assets/images/{ => gameplay/funkin}/noteCovers.png (100%) rename assets/images/{ => gameplay/funkin}/noteCovers.xml (100%) rename assets/images/{ => gameplay/funkin}/noteSparks.png (100%) rename assets/images/{ => gameplay/funkin}/noteSparks.xml (100%) rename assets/images/{ => gameplay/funkin}/noteSplashes.png (100%) rename assets/images/{ => gameplay/funkin}/noteSplashes.xml (100%) rename assets/images/{ => gameplay/funkin}/notes.png (100%) rename assets/images/{ => gameplay/funkin}/notes.xml (100%) rename assets/images/{ => gameplay/funkin}/num0.png (100%) rename assets/images/{ => gameplay/funkin}/num1.png (100%) rename assets/images/{ => gameplay/funkin}/num2.png (100%) rename assets/images/{ => gameplay/funkin}/num3.png (100%) rename assets/images/{ => gameplay/funkin}/num4.png (100%) rename assets/images/{ => gameplay/funkin}/num5.png (100%) rename assets/images/{ => gameplay/funkin}/num6.png (100%) rename assets/images/{ => gameplay/funkin}/num7.png (100%) rename assets/images/{ => gameplay/funkin}/num8.png (100%) rename assets/images/{ => gameplay/funkin}/num9.png (100%) rename assets/images/{ => gameplay/funkin}/sadmiss.png (100%) rename assets/images/{ => gameplay/funkin}/shit.png (100%) rename assets/images/{ => gameplay/funkin}/sick.png (100%) rename assets/images/{ => gameplay}/healthBar.png (100%) rename assets/images/{ => gameplay}/lose.png (100%) rename assets/images/{ => gameplay}/lose.xml (100%) rename assets/images/{ => gameplay}/restart.png (100%) create mode 100644 source/funkin/backend/play/NoteStyle.hx diff --git a/assets/data/styles/notes/funkin-6k.json b/assets/data/styles/notes/funkin-6k.json new file mode 100644 index 0000000..7680e7e --- /dev/null +++ b/assets/data/styles/notes/funkin-6k.json @@ -0,0 +1,136 @@ +{ + "version": "1.0.0", + "name": "Funkin' (4 Key)", + "author": "PhantomArcade", + "data": { + "general": { + "laneSpacing": 140, + "directions": [ // + { + "name": "left", + "sing": "singLEFT", + "colorSave": "funkin-left", + "keybindSave": "funkin-0-6k", + "defaultColors": ["#C24B99", "#FFFFFF", "#3C1F56"] + }, + { + "name": "up", + "sing": "singUP", + "colorSave": "funkin-up", + "keybindSave": "funkin-1-6k", + "defaultColors": ["#12FA05", "#FFFFFF", "#0A4447"] + }, + { + "name": "right", + "sing": "singRIGHT", + "colorSave": "funkin-right", + "keybindSave": "funkin-2-6k", + "defaultColors": ["#F9393F", "#FFFFFF", "#651038"] + }, + { + "name": "left", + "sing": "singLEFT", + "colorSave": "funkin-left-alt", + "keybindSave": "funkin-3-6k", + "defaultColors": ["#FFFF00", "#FFFFFF", "#993300"] + }, + { + "name": "down", + "sing": "singDOWN", + "colorSave": "funkin-down", + "keybindSave": "funkin-4-6k", + "defaultColors": ["#00FFFF", "#FFFFFF", "#1542B7"] + }, + { + "name": "right", + "sing": "singRIGHT", + "colorSave": "funkin-right-alt", + "keybindSave": "funkin-5-6k", + "defaultColors": ["#0033FF", "#FFFFFF", "#000066"] + } + ] + }, + "notes": { + "assetPath": "gameplay/funkin/notes", + "animations": [ // these animations will be added to all notes! + { + "name": "hit", + "suffix": "note", + "looped": true + } + ] + }, + "receptors": { + "assetPath": "gameplay/funkin/notes", + "animations": [ + { + "name": "static", + "suffix": "receptor", + "disableRGB": true, + "looped": true + }, + { + "name": "confirm", + "suffix": "confirm" + }, + { + "name": "press", + "suffix": "press" + } + ] + }, + "holds": { + "assetPath": "gameplay/funkin/notes", + "animations": [ + { + "name": "hold", + "suffix": "hold piece", + "looped": true + }, + { + "name": "tail", + "suffix": "hold tail", + "looped": true + } + ] + }, + "noteCovers": { + "assetPath": "gameplay/funkin/noteCovers", + "animations": [ + { + "name": "start", + "prefix": "hold cover start", + "offsets": [10, -46] + }, + { + "name": "loop", + "prefix": "hold cover loop", + "offsets": [10, -46] + } + { + "name": "spark", + "prefix": "hold cover spark", + "offsets": [10, -46] + } + ] + }, + "noteSplashes": { + "assetPath": "gameplay/funkin/noteSplashes", + "variants": 2, + "animations": [ + { + "name": "splash-1", + "prefix": "notesplash", + "suffix": "1", + "frameRateRange": [22, 26] + }, + { + "name": "splash-2", + "prefix": "notesplash", + "suffix": "2", + "frameRateRange": [22, 26] + } + ] + } + } +} \ No newline at end of file diff --git a/assets/data/styles/notes/funkin-9k.json b/assets/data/styles/notes/funkin-9k.json new file mode 100644 index 0000000..ad5cac7 --- /dev/null +++ b/assets/data/styles/notes/funkin-9k.json @@ -0,0 +1,157 @@ +{ + "version": "1.0.0", + "name": "Funkin' (4 Key)", + "author": "PhantomArcade", + "data": { + "general": { + "laneSpacing": 120, + "directions": [ // + { + "name": "left", + "sing": "singLEFT", + "colorSave": "funkin-left", + "keybindSave": "funkin-0-9k", + "defaultColors": ["#C24B99", "#FFFFFF", "#3C1F56"] + }, + { + "name": "down", + "sing": "singDOWN", + "colorSave": "funkin-down", + "keybindSave": "funkin-1-9k", + "defaultColors": ["#00FFFF", "#FFFFFF", "#1542B7"] + }, + { + "name": "up", + "sing": "singUP", + "colorSave": "funkin-up", + "keybindSave": "funkin-2-9k", + "defaultColors": ["#12FA05", "#FFFFFF", "#0A4447"] + }, + { + "name": "right", + "sing": "singRIGHT", + "colorSave": "funkin-right", + "keybindSave": "funkin-3-9k", + "defaultColors": ["#F9393F", "#FFFFFF", "#651038"] + }, + { + "name": "up", + "sing": "singUP", + "colorSave": "funkin-diamond", + "keybindSave": "funkin-4-9k", + "defaultColors": ["#999999", "#FFFFFF", "#201E31"] + }, + { + "name": "left", + "sing": "singLEFT", + "colorSave": "funkin-left-alt", + "keybindSave": "funkin-5-9k", + "defaultColors": ["#FFFF00", "#FFFFFF", "#993300"] + }, + { + "name": "down", + "sing": "singDOWN", + "colorSave": "funkin-down-alt", + "keybindSave": "funkin-6-9k", + "defaultColors": ["#8B4AFF", "#FFFFFF", "#3B177D"] + }, + { + "name": "up", + "sing": "singUP", + "colorSave": "funkin-up-alt", + "keybindSave": "funkin-7-9k", + "defaultColors": ["#FF0000", "#FFFFFF", "#660000"] + }, + { + "name": "right", + "sing": "singRIGHT", + "colorSave": "funkin-right-alt", + "keybindSave": "funkin-8-9k", + "defaultColors": ["#0033FF", "#FFFFFF", "#000066"] + } + ] + }, + "notes": { + "assetPath": "gameplay/funkin/notes", + "animations": [ // these animations will be added to all notes! + { + "name": "hit", + "suffix": "note", + "looped": true + } + ] + }, + "receptors": { + "assetPath": "gameplay/funkin/notes", + "animations": [ + { + "name": "static", + "suffix": "receptor", + "disableRGB": true, + "looped": true + }, + { + "name": "confirm", + "suffix": "confirm" + }, + { + "name": "press", + "suffix": "press" + } + ] + }, + "holds": { + "assetPath": "gameplay/funkin/notes", + "animations": [ + { + "name": "hold", + "suffix": "hold piece", + "looped": true + }, + { + "name": "tail", + "suffix": "hold tail", + "looped": true + } + ] + }, + "noteCovers": { + "assetPath": "gameplay/funkin/noteCovers", + "animations": [ + { + "name": "start", + "prefix": "hold cover start", + "offsets": [10, -46] + }, + { + "name": "loop", + "prefix": "hold cover loop", + "offsets": [10, -46] + } + { + "name": "spark", + "prefix": "hold cover spark", + "offsets": [10, -46] + } + ] + }, + "noteSplashes": { + "assetPath": "gameplay/funkin/noteSplashes", + "variants": 2, + "animations": [ + { + "name": "splash-1", + "prefix": "notesplash", + "suffix": "1", + "frameRateRange": [22, 26] + }, + { + "name": "splash-2", + "prefix": "notesplash", + "suffix": "2", + "frameRateRange": [22, 26] + } + ] + } + } +} \ No newline at end of file diff --git a/assets/data/styles/notes/funkin.json b/assets/data/styles/notes/funkin.json new file mode 100644 index 0000000..7d0c5bc --- /dev/null +++ b/assets/data/styles/notes/funkin.json @@ -0,0 +1,122 @@ +{ + "version": "1.0.0", + "name": "Funkin' (4 Key)", + "author": "PhantomArcade", + "data": { + "general": { + "laneSpacing": 160, + "directions": [ // + { + "name": "left", + "sing": "singLEFT", + "colorSave": "funkin-left", + "keybindSave": "funkin-left-4k", + "defaultColors": ["#C24B99", "#FFFFFF", "#3C1F56"] + }, + { + "name": "down", + "sing": "singDOWN", + "colorSave": "funkin-down", + "keybindSave": "funkin-down-4k", + "defaultColors": ["#00FFFF", "#FFFFFF", "#1542B7"] + }, + { + "name": "up", + "sing": "singUP", + "colorSave": "funkin-up", + "keybindSave": "funkin-up-4k", + "defaultColors": ["#12FA05", "#FFFFFF", "#0A4447"] + }, + { + "name": "right", + "sing": "singRIGHT", + "colorSave": "funkin-right", + "keybindSave": "funkin-right-4k", + "defaultColors": ["#F9393F", "#FFFFFF", "#651038"] + } + ] + }, + "notes": { + "assetPath": "gameplay/funkin/notes", + "animations": [ // these animations will be added to all notes! + { + "name": "hit", + "suffix": "note", + "looped": true + } + ] + }, + "receptors": { + "assetPath": "gameplay/funkin/notes", + "animations": [ + { + "name": "static", + "suffix": "receptor", + "disableRGB": true, + "looped": true + }, + { + "name": "confirm", + "suffix": "confirm" + }, + { + "name": "press", + "suffix": "press" + } + ] + }, + "holds": { + "assetPath": "gameplay/funkin/notes", + "animations": [ + { + "name": "hold", + "suffix": "hold piece", + "looped": true + }, + { + "name": "tail", + "suffix": "hold tail", + "looped": true + } + ] + }, + "noteCovers": { + "assetPath": "gameplay/funkin/noteCovers", + "animations": [ + { + "name": "start", + "prefix": "hold cover start", + "offsets": [10, -46] + }, + { + "name": "loop", + "prefix": "hold cover loop", + "offsets": [10, -46] + } + { + "name": "spark", + "prefix": "hold cover spark", + "offsets": [10, -46] + } + ] + }, + "noteSplashes": { + "assetPath": "gameplay/funkin/noteSplashes", + "variants": 2, + "animations": [ + { + "name": "splash-1", + "prefix": "notesplash", + "suffix": "1", + "frameRateRange": [22, 26] + }, + { + "name": "splash-2", + "prefix": "notesplash", + "suffix": "2", + "frameRateRange": [22, 26] + } + ] + } + } +} \ No newline at end of file diff --git a/assets/images/go.png b/assets/images/gameplay/funkin/GO.png similarity index 100% rename from assets/images/go.png rename to assets/images/gameplay/funkin/GO.png diff --git a/assets/images/ONE.png b/assets/images/gameplay/funkin/ONE.png similarity index 100% rename from assets/images/ONE.png rename to assets/images/gameplay/funkin/ONE.png diff --git a/assets/images/TWO.png b/assets/images/gameplay/funkin/TWO.png similarity index 100% rename from assets/images/TWO.png rename to assets/images/gameplay/funkin/TWO.png diff --git a/assets/images/bad.png b/assets/images/gameplay/funkin/bad.png similarity index 100% rename from assets/images/bad.png rename to assets/images/gameplay/funkin/bad.png diff --git a/assets/images/combo.png b/assets/images/gameplay/funkin/combo.png similarity index 100% rename from assets/images/combo.png rename to assets/images/gameplay/funkin/combo.png diff --git a/assets/images/good.png b/assets/images/gameplay/funkin/good.png similarity index 100% rename from assets/images/good.png rename to assets/images/gameplay/funkin/good.png diff --git a/assets/images/killer.png b/assets/images/gameplay/funkin/killer.png similarity index 100% rename from assets/images/killer.png rename to assets/images/gameplay/funkin/killer.png diff --git a/assets/images/miss.png b/assets/images/gameplay/funkin/miss.png similarity index 100% rename from assets/images/miss.png rename to assets/images/gameplay/funkin/miss.png diff --git a/assets/images/noteCovers.png b/assets/images/gameplay/funkin/noteCovers.png similarity index 100% rename from assets/images/noteCovers.png rename to assets/images/gameplay/funkin/noteCovers.png diff --git a/assets/images/noteCovers.xml b/assets/images/gameplay/funkin/noteCovers.xml similarity index 100% rename from assets/images/noteCovers.xml rename to assets/images/gameplay/funkin/noteCovers.xml diff --git a/assets/images/noteSparks.png b/assets/images/gameplay/funkin/noteSparks.png similarity index 100% rename from assets/images/noteSparks.png rename to assets/images/gameplay/funkin/noteSparks.png diff --git a/assets/images/noteSparks.xml b/assets/images/gameplay/funkin/noteSparks.xml similarity index 100% rename from assets/images/noteSparks.xml rename to assets/images/gameplay/funkin/noteSparks.xml diff --git a/assets/images/noteSplashes.png b/assets/images/gameplay/funkin/noteSplashes.png similarity index 100% rename from assets/images/noteSplashes.png rename to assets/images/gameplay/funkin/noteSplashes.png diff --git a/assets/images/noteSplashes.xml b/assets/images/gameplay/funkin/noteSplashes.xml similarity index 100% rename from assets/images/noteSplashes.xml rename to assets/images/gameplay/funkin/noteSplashes.xml diff --git a/assets/images/notes.png b/assets/images/gameplay/funkin/notes.png similarity index 100% rename from assets/images/notes.png rename to assets/images/gameplay/funkin/notes.png diff --git a/assets/images/notes.xml b/assets/images/gameplay/funkin/notes.xml similarity index 100% rename from assets/images/notes.xml rename to assets/images/gameplay/funkin/notes.xml diff --git a/assets/images/num0.png b/assets/images/gameplay/funkin/num0.png similarity index 100% rename from assets/images/num0.png rename to assets/images/gameplay/funkin/num0.png diff --git a/assets/images/num1.png b/assets/images/gameplay/funkin/num1.png similarity index 100% rename from assets/images/num1.png rename to assets/images/gameplay/funkin/num1.png diff --git a/assets/images/num2.png b/assets/images/gameplay/funkin/num2.png similarity index 100% rename from assets/images/num2.png rename to assets/images/gameplay/funkin/num2.png diff --git a/assets/images/num3.png b/assets/images/gameplay/funkin/num3.png similarity index 100% rename from assets/images/num3.png rename to assets/images/gameplay/funkin/num3.png diff --git a/assets/images/num4.png b/assets/images/gameplay/funkin/num4.png similarity index 100% rename from assets/images/num4.png rename to assets/images/gameplay/funkin/num4.png diff --git a/assets/images/num5.png b/assets/images/gameplay/funkin/num5.png similarity index 100% rename from assets/images/num5.png rename to assets/images/gameplay/funkin/num5.png diff --git a/assets/images/num6.png b/assets/images/gameplay/funkin/num6.png similarity index 100% rename from assets/images/num6.png rename to assets/images/gameplay/funkin/num6.png diff --git a/assets/images/num7.png b/assets/images/gameplay/funkin/num7.png similarity index 100% rename from assets/images/num7.png rename to assets/images/gameplay/funkin/num7.png diff --git a/assets/images/num8.png b/assets/images/gameplay/funkin/num8.png similarity index 100% rename from assets/images/num8.png rename to assets/images/gameplay/funkin/num8.png diff --git a/assets/images/num9.png b/assets/images/gameplay/funkin/num9.png similarity index 100% rename from assets/images/num9.png rename to assets/images/gameplay/funkin/num9.png diff --git a/assets/images/sadmiss.png b/assets/images/gameplay/funkin/sadmiss.png similarity index 100% rename from assets/images/sadmiss.png rename to assets/images/gameplay/funkin/sadmiss.png diff --git a/assets/images/shit.png b/assets/images/gameplay/funkin/shit.png similarity index 100% rename from assets/images/shit.png rename to assets/images/gameplay/funkin/shit.png diff --git a/assets/images/sick.png b/assets/images/gameplay/funkin/sick.png similarity index 100% rename from assets/images/sick.png rename to assets/images/gameplay/funkin/sick.png diff --git a/assets/images/healthBar.png b/assets/images/gameplay/healthBar.png similarity index 100% rename from assets/images/healthBar.png rename to assets/images/gameplay/healthBar.png diff --git a/assets/images/lose.png b/assets/images/gameplay/lose.png similarity index 100% rename from assets/images/lose.png rename to assets/images/gameplay/lose.png diff --git a/assets/images/lose.xml b/assets/images/gameplay/lose.xml similarity index 100% rename from assets/images/lose.xml rename to assets/images/gameplay/lose.xml diff --git a/assets/images/restart.png b/assets/images/gameplay/restart.png similarity index 100% rename from assets/images/restart.png rename to assets/images/gameplay/restart.png diff --git a/source/funkin/backend/FunkinState.hx b/source/funkin/backend/FunkinState.hx index 0c2c16b..63aa5f1 100644 --- a/source/funkin/backend/FunkinState.hx +++ b/source/funkin/backend/FunkinState.hx @@ -47,6 +47,8 @@ class FunkinState extends FlxSubState implements funkin.backend.FunkinSprite.ISp super(); conductorInUse = Conductor.global; hscripts = new HScripts([this], ['this' => this]); + + persistentUpdate = true; } override public function create() { @@ -187,4 +189,10 @@ class FunkinState extends FlxSubState implements funkin.backend.FunkinSprite.ISp return cast(FlxG.state, FunkinState).conductorInUse; return Conductor.global; } + public static function getCurrentSubState():FlxState { + var state:FlxState = FlxG.state; + while (state.subState != null) + state = state.subState; + return state; + } } \ No newline at end of file diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index b179e2f..910bcdf 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -68,7 +68,7 @@ using StringTools; scoring ??= scoreHandler?.judgeNoteHit(note, (lane.cpu ? 0 : note.msTime - lane.conductorInUse.songPosition)); if (popRating) { - var rating:FunkinSprite = game.popRating(scoring.rating); + var rating:FunkinSprite = game.popRating('gameplay/funkin/${scoring.rating}'); rating.velocity.y = -FlxG.random.int(140, 175); rating.velocity.x = FlxG.random.int(0, 10); rating.acceleration.y = 550; @@ -85,8 +85,7 @@ using StringTools; splash = lane.splash(); if (playAnimation && targetCharacter != null) { - var wrapIndex:Int = FlxMath.wrap(note.laneIndex, 0, game.singAnimations.length - 1); - var anim:String = 'sing${game.singAnimations[wrapIndex]}'; + var anim:String = lane.getSingAnimation(note.laneIndex); var suffixAnim:String = anim + animSuffix; if (targetCharacter.animationExists(suffixAnim + targetCharacter.animSuffix)) targetCharacter.playAnimationSteps(suffixAnim, true); @@ -116,7 +115,7 @@ using StringTools; lane.held = false; lane.pressed = false; - if (animateReceptor) + if (animateReceptor && !lane.cpu) receptor.playAnimation('static'); if (targetCharacter != null) { @@ -173,8 +172,7 @@ using StringTools; } if (playAnimation && targetCharacter != null) { - var wrapIndex:Int = FlxMath.wrap(note.laneIndex, 0, game.singAnimations.length - 1); - var anim:String = 'sing${game.singAnimations[wrapIndex]}'; + var anim:String = lane.getSingAnimation(note.laneIndex); var suffixAnim:String = anim + animSuffix + targetCharacter.animSuffix; if ((!targetCharacter.specialAnim || targetCharacter.currentAnimation == suffixAnim) && targetCharacter.animationExists(suffixAnim)) targetCharacter.timeAnimSteps(); @@ -205,6 +203,9 @@ using StringTools; FunkinSound.playOnce(Paths.sound('gameplay/hitsounds/hitsoundFail'), .7); } + if (lane.cpu && targetCharacter != null) + targetCharacter.held = false; + note.held = false; lane.killNote(note); } @@ -217,7 +218,7 @@ using StringTools; } if (playAnimation && targetCharacter != null) { targetCharacter.specialAnim = false; - targetCharacter.playAnimationSteps('sing${game.singAnimations[lane.noteData]}miss', true); + targetCharacter.playAnimationSteps('${lane.getSingAnimation(lane.noteData)}miss', true); } applyExtraWindow(15); @@ -235,10 +236,8 @@ using StringTools; if (targetCharacter != null) { targetCharacter.volume = 0; - if (playAnimation) { - var wrapIndex:Int = FlxMath.wrap(note.laneIndex, 0, game.singAnimations.length - 1); - targetCharacter.playAnimationSteps('sing${game.singAnimations[wrapIndex]}miss', true); - } + if (playAnimation) + targetCharacter.playAnimationSteps('${lane.getSingAnimation(note.laneIndex)}miss', true); } if (playSound) @@ -248,7 +247,7 @@ using StringTools; scoring ??= scoreHandler?.judgeNoteMiss(note); if (popRating && inGame) { - var rating:FunkinSprite = game.popRating('sadmiss'); + var rating:FunkinSprite = game.popRating('gameplay/funkin/sadmiss'); rating.velocity.y = -FlxG.random.int(80, 95); rating.velocity.x = FlxG.random.int(-6, 6); rating.acceleration.y = 240; diff --git a/source/funkin/backend/play/NoteStyle.hx b/source/funkin/backend/play/NoteStyle.hx new file mode 100644 index 0000000..bfc383a --- /dev/null +++ b/source/funkin/backend/play/NoteStyle.hx @@ -0,0 +1,206 @@ +package funkin.backend.play; + +using Lambda; + +typedef NoteStyleAsset = flixel.util.typeLimit.OneOfTwo; + +class NoteStyle { + public static var defaultColors:Array = [FlxColor.RED, FlxColor.LIME, FlxColor.BLUE]; + public static var defaultDirection:String = 'left'; + + public static var cache:Map = []; + + public var path:String; + public var name:String = ''; + public var author:String = ''; + public var info:NoteStyleInfo; + public var data:NoteStyleData; + public var assets:Map = []; + public var colors:Array> = []; + + public var _success(default, null):Bool = false; + + public static function wipe():Void { + cache.clear(); + } + public static function exists(path:String):Bool { + return (Paths.exists('data/styles/notes/$path.json') || cache.exists(path)); + } + public static function fetch(?asset:NoteStyleAsset):NoteStyle { + if (asset == null) + return null; + if (Std.isOfType(asset, NoteStyle)) + return asset; + + var path:String = cast asset; + if (cache.exists(path)) + return cache[path]; + + var style:NoteStyle = new NoteStyle(path); + if (style._success) { + cache[path] = style; + return style; + } + + return null; + } + + public function new(path:String) { + this.path = path; + loadStyle(path); + } + function loadStyle(path:String):Bool { + Log.minor('loading notestyle $path'); + + var styleContent:Null = Paths.text('data/styles/notes/$path.json'); + if (styleContent == null) { + Log.warning('notestyle $path not found...'); + Log.minor('verify path:'); + Log.minor('- data/styles/notes/$path.json'); + return false; + } + + try { + var styleInfo:NoteStyleInfo = TJSON.parse(styleContent); + info = styleInfo; + data = info.data; + + name = info.name ?? 'Unknown'; + author = info.author ?? 'Unknown'; + + updateInfo(); + _success = true; + Log.info('notestyle $path loaded successfully!'); + return true; + } catch (e:haxe.Exception) { + Log.error('error loading notestyle @ "$path" -> ${e.details()}'); + } + + _success = false; + return false; + } + function updateInfo():Void { + this.colors.resize(0); + for (direction in data.general.directions) { + // parse colors + if (direction.defaultColors != null) { + var colors:Array = []; + for (color in direction.defaultColors) + colors.push(FlxColor.fromString(color)); + this.colors.push(colors); + } else { + this.colors.push(null); + } + } + } + + public function getAssetAnimation(asset:NoteStyleAssetData, find:String):NoteStyleAnimData { + if (asset == null) return null; + + return asset.animations.find((anim:NoteStyleAnimData) -> anim.name == find); + } + public function getDirection(dir:Int):NoteStyleDirData { + var dirs:Array = data.general.directions; + return dirs[FlxMath.wrap(dir, 0, dirs.length - 1)]; + } + + public static function getDirectionName(style:NoteStyleAsset, dir:Int):String { + var style:NoteStyle = fetch(style); + + return style?.getDirection(dir).name ?? defaultDirection; + } + public static function getDirectionSing(style:NoteStyleAsset, dir:Int):String { + var style:NoteStyle = fetch(style); + + var dir:NoteStyleDirData = style?.getDirection(dir); + var anim:Null = dir?.sing; + if (anim == null) + anim = 'sing${dir?.name?.toUpperCase() ?? defaultDirection.toUpperCase()}'; + return anim; + } + public static function getDirectionColors(style:NoteStyleAsset, dir:Int):Array { + var style:NoteStyle = fetch(style); + if (style == null || style.colors.length == 0) return defaultColors; + + return style.colors[FlxMath.wrap(dir, 0, style.colors.length - 1)] ?? defaultColors; + } +} + +class NoteStyleUtil { + public static function getDirectionName(style:NoteStyle, dir:Int):String { return NoteStyle.getDirectionName(style, dir); } + public static function getDirectionSing(style:NoteStyle, dir:Int):String { return NoteStyle.getDirectionSing(style, dir); } + public static function getDirectionColors(style:NoteStyle, dir:Int):Array { return NoteStyle.getDirectionColors(style, dir); } + + public static function loadNoteStyleAnimations(sprite:FunkinSprite, asset:NoteStyleAssetData, direction:String = 'down'):Void { + if (asset == null) return; + + sprite.loadAtlas(asset.assetPath); + for (data in asset.animations) { + var animName:String = direction; + if (data.suffix != null) animName += ' ${data.suffix}'; + if (data.prefix != null) animName = '${data.prefix} $animName'; + + if (sprite.hasAnimationPrefix(animName)) { + sprite.addAnimation(data.name, animName, data.frameRate, data.looped, data.frameIndices, data.assetPath); + sprite.preloadAnimAsset(data.name); + } else { + animName = data.prefix; + if (data.suffix != null) animName += ' ${data.suffix}'; + + sprite.addAnimation(data.name, animName, data.frameRate, data.looped, data.frameIndices, data.assetPath); + sprite.preloadAnimAsset(data.name); + } + + if (data.offsets != null && sprite.animationExists(data.name)) + sprite.setAnimationOffset(data.name, data.offsets[0], data.offsets[1]); + } + } +} + +typedef NoteStyleInfo = { + var name:String; + var ?author:String; + var ?version:String; + var data:NoteStyleData; +} + +typedef NoteStyleData = { + var general:NoteStyleGeneral; + var notes:NoteStyleAssetData; + var holds:NoteStyleAssetData; + var receptors:NoteStyleAssetData; + var ?noteCovers:NoteStyleAssetData; + var ?noteSplashes:NoteStyleAssetData; +} + +typedef NoteStyleGeneral = { + var ?disableRGB:Bool; + var ?laneSpacing:Float; + var directions:Array; +} + +typedef NoteStyleDirData = { + var name:String; + var ?sing:String; + var ?colorSave:String; + var ?keybindSave:String; + var ?defaultColors:Array; +} + +typedef NoteStyleAssetData = { + var assetPath:String; + var animations:Array; + var ?variants:Int; // notesplash only (for now) +} + +typedef NoteStyleAnimData = { + var name:String; + var ?prefix:String; + var ?suffix:String; + var ?frameRateRange:Array; + var ?frameIndices:Array; + var ?offsets:Array; + var ?assetPath:String; + var ?frameRate:Int; + var ?looped:Bool; +} \ No newline at end of file diff --git a/source/funkin/backend/play/SongEvent.hx b/source/funkin/backend/play/SongEvent.hx index 2af3290..7fdd8ef 100644 --- a/source/funkin/backend/play/SongEvent.hx +++ b/source/funkin/backend/play/SongEvent.hx @@ -50,7 +50,7 @@ import funkin.backend.scripting.HScript; var folder:String = 'funkin'; FunkinSound.playOnce(Paths.sound('gameplay/countdown/$folder/intro$countdown')); - countdownSprite = game.popCountdown(countdown); + countdownSprite = game.popCountdown('gameplay/funkin/$countdown'); case SONG_START: game.music.play(true); diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 6d39717..977e6ab 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -6,14 +6,16 @@ import funkin.objects.Character; import funkin.objects.play.Note; import funkin.backend.play.Scoring; import funkin.backend.play.NoteEvent; +import funkin.backend.play.NoteStyle; import funkin.backend.rhythm.Conductor; import flixel.input.keyboard.FlxKey; import flixel.util.FlxSignal.FlxTypedSignal; import flixel.graphics.frames.FlxFramesCollection; -using StringTools; using Lambda; +using StringTools; +using funkin.backend.play.NoteStyle.NoteStyleUtil; class Lane extends FunkinSpriteGroup { public var rgbShader:RGBSwap; @@ -29,6 +31,7 @@ class Lane extends FunkinSpriteGroup { public var noteData:Int; public var oneWay:Bool = true; public var noteClass:Class = Note; + public var style(default, set):NoteStyle; public var scrollSpeed(default, set):Float = 1; public var direction:Float = 90; public var spawnRadius:Float; @@ -71,31 +74,31 @@ class Lane extends FunkinSpriteGroup { receptor.autoReset = isCpu; return cpu = isCpu; } - public function new(x:Float, y:Float, data:Int, dir:Float = 90, speed:Float = 1) { + public function new(x:Float, y:Float, data:Int, dir:Float = 90, speed:Float = 1, ?style:NoteStyleAsset = 'funkin') { super(x, y); + rgbShader = new RGBSwap(); + splashRGB = new RGBSwap(); + startX = x; startY = y; + noteData = data; direction = dir; scrollSpeed = speed; + this.style = NoteStyle.fetch(style); inputFilter = (note:Note) -> { var time:Float = note.msTime - conductorInUse.songPosition; return (time <= note.hitWindow + extraWindow) && (time >= -note.hitWindow); }; - var splashColors:Array = NoteSplash.makeSplashColors(Note.getColors(data)[0]); - rgbShader = new RGBSwap(Note.getColors(data)[0], Note.getColors(data)[1], Note.getColors(data)[2]); - splashRGB = new RGBSwap(splashColors[0], FlxColor.WHITE, splashColors[1]); - - noteCover = new NoteCover(data); - receptor = new Receptor(0, 0, data); + noteCover = new NoteCover(data, style); + receptor = new Receptor(0, 0, data, style); notes = new FunkinTypedSpriteGroup(); noteSparks = new FunkinTypedSpriteGroup(0, 0, 5); noteSplashes = new FunkinTypedSpriteGroup(0, 0, 5); spawnRadius = Note.distanceToMS(FlxG.height, scrollSpeed); receptor.lane = this; //lol - this.noteData = data; this.add(receptor); for (mem in [notes, noteCover, noteSparks, noteSplashes]) { topMembers.push(mem); // render conditionally @@ -227,16 +230,17 @@ class Lane extends FunkinSpriteGroup { } public function resetLane() { clearNotes(); - receptor?.playAnimation('static'); + receptor.playAnimation('static'); noteCover.kill(); heldNote = null; held = false; } public function splash():NoteSplash { - var splash:NoteSplash = noteSplashes.recycle(NoteSplash, () -> new NoteSplash(noteData), true); + var splash:NoteSplash = noteSplashes.recycle(NoteSplash, () -> new NoteSplash(noteData, style), true); preAdd(splash); splash.alpha = alpha * .7; + splash.scale.copyFrom(scale); splashRGB.copy(splash.rgbShader); splash.splashOnReceptor(receptor); return splash; @@ -246,10 +250,11 @@ class Lane extends FunkinSpriteGroup { return noteCover; } public function spark():NoteSpark { - var spark:NoteSpark = noteSparks.recycle(NoteSpark, () -> new NoteSpark(noteData), true); + var spark:NoteSpark = noteSparks.recycle(NoteSpark, () -> new NoteSpark(noteData, style), true); preAdd(spark); spark.alpha = alpha; - spark.shader = splashRGB.shader; + spark.scale.copyFrom(scale); + splashRGB.copy(spark.rgbShader); spark.sparkOnReceptor(receptor); return spark; } @@ -291,7 +296,7 @@ class Lane extends FunkinSpriteGroup { var songPos:Float = conductorInUse.songPosition; if ((cpu || (held && note.goodHit)) && songPos >= note.msTime && !note.lost && note.canHit) { if (!note.goodHit) - hitNote(note, false); + _noteEvent(basicEvent(PRESSED, note)); if (songPos >= note.endMs) note.consumed = killingNote = true; @@ -300,6 +305,7 @@ class Lane extends FunkinSpriteGroup { if (killingNote) { _noteEvent(basicEvent(RELEASED, note)); + if (cpu) _noteEvent(basicEvent(RELEASED)); killNote(note); return; } @@ -337,7 +343,7 @@ class Lane extends FunkinSpriteGroup { note.chartNote = songNote; note.hitWindow = hitWindow; - note.reload(); + note.reload(style); note.scale.copyFrom(receptor.scale); note.rgbShader = rgbShader.copy(note.rgbShader); note.updateHitbox(); @@ -365,9 +371,39 @@ class Lane extends FunkinSpriteGroup { _noteEvent(basicEvent(DESPAWNED, note)); } - public override function get_width() + function set_style(newStyle:NoteStyle):NoteStyle { + if (style == newStyle) return newStyle; + loadStyle(newStyle); + return style = newStyle; + } + public function loadStyle(newStyle:NoteStyleAsset) { + var style:NoteStyle = NoteStyle.fetch(newStyle); + + if (receptor != null) + receptor.style = style; + if (noteCover != null) + noteCover.style = style; + + var colors:Array = NoteStyle.getDirectionColors(style, noteData); + rgbShader.set(colors[0], colors[1], colors[2]); + + var splashColors:Array = NoteSplash.makeSplashColors(colors[0]); + splashRGB.set(splashColors[0], FlxColor.WHITE, splashColors[1]); + } + + public function getDirection(dir:Int):String { + return NoteStyle.getDirectionName(style, dir); + } + public function getSingAnimation(dir:Int):String { + return NoteStyle.getDirectionSing(style, dir); + } + public function getColors(dir:Int):Array { + return NoteStyle.getDirectionColors(style, dir); + } + + override function get_width() return receptor?.width ?? 0; - public override function get_height() + override function get_height() return receptor?.height ?? 0; override function set_zoomFactor(value:Float):Float { @@ -395,6 +431,7 @@ class Receptor extends FunkinSprite { public var noteData:Int; public var rgbShader:RGBSwap; public var rgbEnabled(default, set):Bool; + public var style(default, set):NoteStyle; public var grayBeat:Null; public var autoReset:Bool = false; @@ -403,18 +440,16 @@ class Receptor extends FunkinSprite { public var missColor:Array = []; public var glowColor:Array = []; - public function new(x:Float, y:Float, data:Int) { + public function new(x:Float, y:Float, data:Int, ?style:NoteStyleAsset = 'funkin') { super(x, y); loadAtlas('notes'); + rgbShader = new RGBSwap(); this.noteData = data; + this.style = NoteStyle.fetch(style); - rgbShader = new RGBSwap(Note.getColors(data)[0], Note.getColors(data)[1], Note.getColors(data)[2]); computeRGBColors(); - loadAtlas('notes'); - reloadAnimations(); - onAnimationComplete.add((anim:String) -> { if (anim != 'static' && autoReset && (lane == null || !lane.held)) playAnimation('static', true); @@ -426,16 +461,6 @@ class Receptor extends FunkinSprite { missColor = [makeGrayColor(rgbShader.red), FlxColor.WHITE, FlxColor.fromRGB(32, 30, 49)]; } - public function reloadAnimations() { - animation.destroyAnimations(); - var dirName:String = Note.getDirection(noteData); - addAnimation('static', '$dirName receptor', 24, true); - addAnimation('confirm', '$dirName confirm', 24, false); - addAnimation('press', '$dirName press', 24, false); - playAnimation('static', true); - updateHitbox(); - } - public override function update(elapsed:Float) { super.update(elapsed); if (grayBeat != null && lane.conductorInUse.metronome.beat >= grayBeat) @@ -458,6 +483,23 @@ class Receptor extends FunkinSprite { centerOffsets(); centerOrigin(); } + + function set_style(newStyle:NoteStyle) { + if (style == newStyle) return newStyle; + loadStyle(newStyle); + return style = newStyle; + } + public function loadStyle(newStyle:NoteStyleAsset) { + var style:NoteStyle = NoteStyle.fetch(newStyle); + + var colors:Array = NoteStyle.getDirectionColors(style, noteData); + rgbShader.set(colors[0], colors[1], colors[2]); + computeRGBColors(); + + NoteStyleUtil.loadNoteStyleAnimations(this, style?.data?.receptors, style?.getDirectionName(noteData)); + playAnimation('static', true); + updateHitbox(); + } public function set_rgbEnabled(newE:Bool) { shader = (newE ? rgbShader.shader : null); @@ -480,19 +522,38 @@ class Receptor extends FunkinSprite { class NoteSplash extends FunkinSprite { public var noteData:Int; public var rgbShader:RGBSwap; + public var style(default, set):NoteStyle; + + public var animationVariants:Int = 1; + public var frameRateRange:Array; - public function new(data:Int) { + public function new(data:Int, ?style:NoteStyleAsset = 'funkin') { super(); - loadAtlas('noteSplashes'); rgbShader = new RGBSwap(); shader = rgbShader.shader; this.noteData = data; + this.style = NoteStyle.fetch(style); + var dirName:String = Note.getDirection(data); addAnimation('splash1', 'notesplash $dirName 1', 24, false); addAnimation('splash2', 'notesplash $dirName 2', 24, false); - onAnimationComplete.add((anim:String) -> { kill(); }); + onAnimationComplete.add((anim:String) -> kill()); + } + + function set_style(newStyle:NoteStyle) { + if (style == newStyle) return newStyle; + loadStyle(newStyle); + return style = newStyle; + } + public function loadStyle(newStyle:NoteStyleAsset) { + var style:NoteStyle = NoteStyle.fetch(newStyle); + + NoteStyleUtil.loadNoteStyleAnimations(this, style?.data?.noteSplashes, style?.getDirectionName(noteData)); + animationVariants = style?.data?.noteSplashes.variants ?? 1; + playAnimation('splash-1', true); + updateHitbox(); } public function splashOnReceptor(receptor:Receptor) { //lol @@ -500,10 +561,23 @@ class NoteSplash extends FunkinSprite { splash(); } public function splash() { - playAnimation('splash${FlxG.random.int(1, 2)}', true); - animation.curAnim.frameRate = FlxG.random.int(22, 26); + var splashAnim:String = 'splash-${FlxG.random.int(1, animationVariants)}'; + + var range:Array = frameRateRange; + if (range == null) { + var animation:NoteStyleAnimData = style?.getAssetAnimation(style.data.noteSplashes, splashAnim); + if (animation != null) { + if (animation.frameRateRange != null) + range = animation.frameRateRange; + } + } + + if (range != null) + animation.curAnim.frameRate = FlxG.random.int(range[0], range[1]); + + playAnimation(splashAnim, true); updateHitbox(); - spriteOffset.set(width * .5, height * .5); + offset.set(frameWidth * .5, frameHeight * .5); } public static function makeSplashColors(baseFill:FlxColor):Array { @@ -527,20 +601,39 @@ class NoteSplash extends FunkinSprite { } } -class NoteCover extends FunkinSprite { - public function new(data:Int) { +class NoteCover extends FunkinSprite { // TODO: change to only use NoteSpark? (and recycle like notesplashes) + public var noteData:Int; + + public var rgbShader:RGBSwap; + public var style(default, set):NoteStyle; + + public function new(data:Int, ?style:NoteStyleAsset) { super(); - loadAtlas('noteCovers'); - var dir:String = Note.getDirection(data); - if (!hasAnimationPrefix('hold cover start $dir')) dir = ''; - addAnimation('start', 'hold cover start $dir'.trim(), 24, false); - addAnimation('loop', 'hold cover loop $dir'.trim(), 24, true); - onAnimationComplete.add((anim:String) -> { playAnimation('loop'); }); + rgbShader = new RGBSwap(); + shader = rgbShader.shader; + + this.noteData = data; + this.style = NoteStyle.fetch(style); + + onAnimationComplete.add((anim:String) -> playAnimation('loop')); kill(); } + function set_style(newStyle:NoteStyle) { + if (style == newStyle) return newStyle; + loadStyle(newStyle); + return style = newStyle; + } + public function loadStyle(newStyle:NoteStyleAsset) { + var style:NoteStyle = NoteStyle.fetch(newStyle); + + NoteStyleUtil.loadNoteStyleAnimations(this, style?.data?.noteCovers, style?.getDirectionName(noteData)); + playAnimation('start', true); + updateHitbox(); + } + public function popOnReceptor(receptor:Receptor) { setPosition(receptor.x + receptor.width * .5, receptor.y + receptor.height * .5); pop(); @@ -549,19 +642,39 @@ class NoteCover extends FunkinSprite { playAnimation('start', true); revive(); updateHitbox(); - spriteOffset.set(width * .5 + 10, height * .5 - 46); + offset.set(frameWidth * .5, frameHeight * .5); } } class NoteSpark extends FunkinSprite { - public function new(data:Int) { + public var noteData:Int; + + public var rgbShader:RGBSwap; + public var style(default, set):NoteStyle; + + public function new(data:Int, ?style:NoteStyleAsset) { super(data); - loadAtlas('noteCovers'); - var dir:String = Note.getDirection(data); - if (!hasAnimationPrefix('hold cover $dir')) dir = ''; - addAnimation('spark', 'hold cover spark ${dir}'.trim(), 24, false); - onAnimationComplete.add((anim:String) -> { kill(); }); + rgbShader = new RGBSwap(); + shader = rgbShader.shader; + + this.noteData = data; + this.style = NoteStyle.fetch(style); + + onAnimationComplete.add((anim:String) -> kill()); + } + + function set_style(newStyle:NoteStyle) { + if (style == newStyle) return newStyle; + loadStyle(newStyle); + return style = newStyle; + } + public function loadStyle(newStyle:NoteStyleAsset) { + var style:NoteStyle = NoteStyle.fetch(newStyle); + + NoteStyleUtil.loadNoteStyleAnimations(this, style?.data?.noteCovers, style?.getDirectionName(noteData)); + playAnimation('spark', true); + updateHitbox(); } public function sparkOnReceptor(receptor:Receptor) { @@ -571,6 +684,6 @@ class NoteSpark extends FunkinSprite { public function spark() { playAnimation('spark', true); updateHitbox(); - spriteOffset.set(width * .5 + 10, height * .5 - 46); + offset.set(frameWidth * .5, frameHeight * .5); } } \ No newline at end of file diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 6e6aa65..9d040a0 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -5,11 +5,14 @@ import funkin.objects.play.Lane; import funkin.backend.play.Scoring; import funkin.backend.rhythm.Event; import funkin.backend.FunkinSprite; +import funkin.backend.play.NoteStyle; import funkin.objects.CharacterGroup; import flixel.math.FlxMatrix; import flixel.graphics.frames.FlxFrame; +using funkin.backend.play.NoteStyle.NoteStyleUtil; + @:structInit class ChartNote implements ISpriteVars implements ITimeSortable { public var laneIndex:Int; public var kind:String = ''; @@ -104,7 +107,7 @@ class Note extends FunkinSprite { public var laneIndex:Int = 0; public var strumlineIndex:Int = 0; - public var texture(get, set):String; + public var style(default, set):NoteStyle; public var kind(default, set):String = ''; @:deprecated('noteKind is deprecated, use kind instead!') public var noteKind(get, set):String; @:deprecated('noteData is deprecated, use laneIndex instead!') public var noteData(get, set):Int; @@ -118,8 +121,6 @@ class Note extends FunkinSprite { public var beatLength(default, set):Float = 0; public var isHoldNote(default, null):Bool = false; - var _texture:String = ''; - function get_noteData():Int { return laneIndex; } function set_noteData(value:Int):Int { return laneIndex = value; } function get_player():Bool { return (strumlineIndex == 0); } @@ -156,7 +157,6 @@ class Note extends FunkinSprite { this.tailOffset = FlxPoint.get(); this.chartNote = songNote; - reload(); } public function set_chartNote(songNote:ChartNote):ChartNote { if (songNote != null) { @@ -184,7 +184,7 @@ class Note extends FunkinSprite { chartNote.strumlineIndex = strumlineIndex; } - public function reload():Void { + public function reload(?style:NoteStyle):Void { healthLoss = 6.0 / 100; healthGain = 1.5 / 100; healthGainPerSecond = 7.5 / 100; @@ -196,43 +196,19 @@ class Note extends FunkinSprite { multAlpha = 1; clipDistance = 0; - texture = 'notes'; - if (tail != null) { - tail.texture = texture; - tail.reload(); - } + this.style = style; + if (tail != null) + tail.reload(style); } public function updateTail():Void { isHoldNote = (msLength > 0); if (tail == null && isHoldNote) tail = new NoteTail(this); } - public function reloadAnimations() { - var dirName:String = getDirection(laneIndex); - addAnimation('hit-$laneIndex', '$dirName note', 24, false); - playAnimation('hit-$laneIndex', true); - updateHitbox(); - } public function toChartNote():ChartNote { return chartNote ?? {laneIndex: laneIndex, msTime: msTime, kind: kind, msLength: msLength, strumlineIndex: strumlineIndex}; } - public override function loadAtlas(path:String, ?library:String, renderType:SpriteRenderType = SPARROW):Note { - super.loadAtlas(path, library, renderType); - _texture = path; - return this; - } - function reloadTexture(texture:String) { - loadAtlas(texture); - reloadAnimations(); - } - function get_texture():String { return _texture; } - function set_texture(newTexture:String):String { - if (texture == newTexture) return newTexture; - - reloadTexture(newTexture); - return newTexture; - } function set_kind(newKind:String) { return kind = newKind; } @@ -272,6 +248,19 @@ class Note extends FunkinSprite { return rgbShader = newShd; } + function set_style(newStyle:NoteStyle) { + if (style == newStyle) return newStyle; + loadStyle(newStyle); + return style = newStyle; + } + public function loadStyle(newStyle:NoteStyleAsset) { + var style:NoteStyle = NoteStyle.fetch(newStyle); + + NoteStyleUtil.loadNoteStyleAnimations(this, style?.data?.notes, style?.getDirectionName(laneIndex)); + playAnimation('hit', true); + updateHitbox(); + } + public static function distanceToMS(distance:Float, scrollSpeed:Float) return distance / (.45 * scrollSpeed); public static function msToDistance(ms:Float, scrollSpeed:Float) @@ -315,7 +304,7 @@ class Note extends FunkinSprite { class NoteTail extends FunkinSprite { public var parent(default, set):Note; - public var texture(get, set):String; + public var style(default, set):NoteStyle; public var laneIndex:Int; public var multAlpha:Float = .6; @@ -325,7 +314,6 @@ class NoteTail extends FunkinSprite { public var holdScale(default, null):FlxPoint; public var tailScale(default, null):FlxPoint; - var _texture:String = ''; var _tileMatrix:FlxMatrix = new FlxMatrix(); public function new(parent:Note) { @@ -335,7 +323,6 @@ class NoteTail extends FunkinSprite { tailScale = FlxPoint.get(1, 1); this.parent = parent; - this.reload(); } public override function destroy() { holdScale.put(); @@ -345,22 +332,6 @@ class NoteTail extends FunkinSprite { super.destroy(); } - public override function loadAtlas(path:String, ?library:String, renderType:SpriteRenderType = SPARROW):NoteTail { - super.loadAtlas(path, library, renderType); - _texture = path; - return this; - } - function reloadTexture(texture:String) { - loadAtlas(texture); - reloadAnimations(); - } - function get_texture():String { return _texture; } - function set_texture(newTexture:String):String { - if (texture == newTexture) return newTexture; - - reloadTexture(newTexture); - return newTexture; - } function set_parent(note:Note):Note { if (parent == note) return note; @@ -368,15 +339,10 @@ class NoteTail extends FunkinSprite { return parent = note; } - public function reload() { + public function reload(?style:NoteStyle) { + this.style = style; sustainClip = 0; } - public function reloadAnimations() { - var dirName:String = Note.getDirection(laneIndex); - addAnimation('tail-$laneIndex', '$dirName hold tail', 24, false); - addAnimation('hold-$laneIndex', '$dirName hold piece', 24, false); - playAnimation('hold-$laneIndex', true); - } public override function draw() { alpha = multAlpha; if (parent != null) { @@ -390,6 +356,20 @@ class NoteTail extends FunkinSprite { super.draw(); } + + function set_style(newStyle:NoteStyle) { + if (style == newStyle) return newStyle; + loadStyle(newStyle); + return style = newStyle; + } + public function loadStyle(newStyle:NoteStyleAsset) { + var style:NoteStyle = NoteStyle.fetch(newStyle); + + NoteStyleUtil.loadNoteStyleAnimations(this, style?.data?.holds, style?.getDirectionName(laneIndex)); + playAnimation('hold', true); + updateHitbox(); + } + // this is kinda mediocre tbh public override function drawComplex(camera:FlxCamera) { if (sustainHeight <= sustainClip) @@ -401,7 +381,7 @@ class NoteTail extends FunkinSprite { var bottom:Float = 0; var doTail:Bool = true; var sc:FlxPoint = tailScale; - playAnimation('tail-$laneIndex', true); + playAnimation('tail', true); origin.set(frameWidth * .5); cropFrame(top, bottom); getDrawMatrix(sc); @@ -441,7 +421,7 @@ class NoteTail extends FunkinSprite { bottom = 1; doTail = false; - playAnimation('hold-$laneIndex', true); + playAnimation('hold', true); absScale = Math.abs(scale.y * holdScale.y); origin.set(frameWidth * .5); cropFrame(top, bottom); diff --git a/source/funkin/objects/play/Strumline.hx b/source/funkin/objects/play/Strumline.hx index d4f650f..702ef28 100644 --- a/source/funkin/objects/play/Strumline.hx +++ b/source/funkin/objects/play/Strumline.hx @@ -4,6 +4,7 @@ import funkin.objects.Character; import funkin.objects.play.Note; import funkin.backend.play.Scoring; import funkin.backend.play.NoteEvent; +import funkin.backend.play.NoteStyle; import flixel.util.FlxAxes; import flixel.input.keyboard.FlxKey; @@ -26,6 +27,7 @@ class Strumline extends FunkinSpriteGroup { public var cpu(default, set):Bool; // todo: macro..? public var laneCount(default, set):Int; public var direction(default, set):Float; + public var style(default, set):NoteStyle; public var scrollSpeed(default, set):Float; public var oneWay(default, set):Bool = true; public var allowInput(default, set):Bool = true; @@ -36,6 +38,7 @@ class Strumline extends FunkinSpriteGroup { //oh dear function set_cpu(isCpu:Bool) { for (lane in lanes) lane.cpu = isCpu; return cpu = isCpu; } function set_oneWay(isOneWay:Bool) { for (lane in lanes) lane.oneWay = isOneWay; return oneWay = isOneWay; } + function set_style(newStyle:NoteStyle) { if (style == newStyle) return newStyle; loadStyle(newStyle); return style = newStyle; } function set_direction(newDir:Float) { for (lane in lanes) lane.direction = newDir; return direction = newDir; } function set_hitWindow(newWindow:Float) { for (lane in lanes) lane.hitWindow = newWindow; return hitWindow = newWindow; } function set_allowInput(isAllowed:Bool) { for (lane in lanes) lane.allowInput = isAllowed; return allowInput = isAllowed; } @@ -43,13 +46,7 @@ class Strumline extends FunkinSpriteGroup { function set_noteClass(newClass:Class) { for (lane in lanes) lane.noteClass = newClass; return noteClass = newClass; } function set_scrollSpeed(newSpeed:Float) { for (lane in lanes) lane.scrollSpeed = newSpeed; return scrollSpeed = newSpeed; } function set_laneSpacing(newSpacing:Float) { - var i:Int = 0; - var diff:Float = newSpacing - laneSpacing; - for (lane in lanes) { - lane.startX += i * diff; - lane.x += i * diff; - i ++; - } + recalculateLaneSpacing(newSpacing, laneSpacing); return laneSpacing = newSpacing; } function set_laneCount(newCount:Int) { @@ -58,7 +55,7 @@ class Strumline extends FunkinSpriteGroup { lane.destroy(); } for (i in laneCount...newCount) { - var lane:Lane = new Lane(i * laneSpacing * scale.x, 0, i, direction, scrollSpeed); + var lane:Lane = new Lane(i * laneSpacing * scale.x, 0, i, direction, scrollSpeed, style); lane.allowInput = allowInput; lane.noteClass = noteClass; @@ -126,11 +123,13 @@ class Strumline extends FunkinSpriteGroup { public override function get_width() return strumlineWidth; public override function get_height() return strumlineHeight; - public function new(laneCount:Int = 4, direction:Float = 90, scrollSpeed:Float = 1, ?noteClass:Class) { + public function new(laneCount:Int = 4, direction:Float = 90, scrollSpeed:Float = 1, ?style:NoteStyleAsset = 'funkin', ?noteClass:Class) { super(); this.lanes = new FunkinTypedSpriteGroup(); this.add(lanes); + style = NoteStyle.fetch(style); + this.allowInput = true; this.direction = direction; this.scrollSpeed = scrollSpeed; @@ -138,6 +137,23 @@ class Strumline extends FunkinSpriteGroup { this.laneCount = laneCount; } + public function loadStyle(newStyle:NoteStyleAsset) { + var style:NoteStyle = NoteStyle.fetch(newStyle); + + laneSpacing = (style?.data.general.laneSpacing ?? laneSpacing); + + for (lane in lanes) + lane.style = style; + } + public function recalculateLaneSpacing(newSpacing:Float, oldSpacing:Float) { + var i:Int = 0; + var diff:Float = newSpacing - oldSpacing; + for (lane in lanes) { + lane.startX += i * diff * scale.x; + lane.x += i * diff * scale.x; + i ++; + } + } public function resetLanePositions():Void { for (i => lane in lanes) { lane.setPosition(x + i * laneSpacing * scale.x, y); @@ -201,13 +217,13 @@ class Strumline extends FunkinSpriteGroup { default: //shrug } + // TODO: better way... ?? + recalculateLaneSpacing(laneSpacing * ratio, laneSpacing); + scale.set(ratio, ratio); for (lane in lanes) { - lane.receptor.scale.x *= ratio; - lane.receptor.scale.y *= ratio; lane.receptor.updateHitbox(); - lane.receptor.spriteOffset.set(0, 0); + lane.receptor.spriteOffset.set(); } - laneSpacing *= ratio; } } public function center(axes:FlxAxes = XY) { //do Not inline that. diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index c077c5e..7fcae5b 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -8,6 +8,7 @@ import funkin.backend.scripting.HScript; import funkin.backend.play.ScoreHandler; import funkin.backend.play.IPlayEvent; import funkin.backend.play.SongEvent; +import funkin.backend.play.NoteStyle; import funkin.backend.play.NoteEvent; import funkin.backend.play.Scoring; import funkin.backend.play.Chart; @@ -88,6 +89,8 @@ class PlayState extends FunkinState { public var songStarted:Bool = false; public var songFinished:Bool = false; + public var noteStyle:NoteStyleAsset = 'funkin'; + public function new(chart:Chart, simple:Bool = false) { PlayState.chart = chart ?? PlayState.chart ?? new Chart(''); PlayState.chart.instLoaded = false; @@ -157,19 +160,18 @@ class PlayState extends FunkinState { var strumlineBound:Float = (FlxG.width - 300) * .5; var strumlineY:Float = 50; - keybinds = Options.data.keybinds['4k']; + var mania:String = '${chart.keyCount}k'; + keybinds = Options.data.keybinds[mania] ?? Options.data.keybinds['4k']; + if (NoteStyle.exists('$noteStyle-$mania')) + noteStyle = '$noteStyle-$mania'; opponentStrumline = new Strumline(chart.keyCount, 90, chart.scrollSpeed); - opponentStrumline.fitToSize(strumlineBound, opponentStrumline.height * .7); opponentStrumline.noteEvent.add(opponentNoteEvent); - opponentStrumline.setPosition(50, strumlineY); opponentStrumline.zIndex = 40; opponentStrumline.cpu = true; opponentStrumline.allowInput = false; playerStrumline = new Strumline(chart.keyCount, 90, chart.scrollSpeed); - playerStrumline.fitToSize(strumlineBound, playerStrumline.height * .7); - playerStrumline.setPosition(FlxG.width - playerStrumline.width - 50 - 75, strumlineY); playerStrumline.noteEvent.add(playerNoteEvent); playerStrumline.assignKeybinds(keybinds); playerStrumline.zIndex = 50; @@ -209,6 +211,13 @@ class PlayState extends FunkinState { } } + opponentStrumline.loadStyle(noteStyle); + playerStrumline.loadStyle(noteStyle); + opponentStrumline.fitToSize(strumlineBound, opponentStrumline.height * .7); + playerStrumline.fitToSize(strumlineBound, playerStrumline.height * .7); + opponentStrumline.setPosition(50, strumlineY); + playerStrumline.setPosition(FlxG.width - playerStrumline.width - 50 - 75, strumlineY); + if (!simple) { stage = new Stage(chart); stage.setup(chart.stage); @@ -277,7 +286,7 @@ class PlayState extends FunkinState { } // TODO: figure out how to display the correct icons in simple mode maybe? they just display the placeholder face - healthBar = new Bar(0, FlxG.height - 50, (_) -> health, 'healthBar', {min: 0, max: maxHealth}); + healthBar = new Bar(0, FlxG.height - 50, (_) -> health, 'gameplay/healthBar', {min: 0, max: maxHealth}); healthBar.y -= healthBar.height; healthBar.screenCenter(X); healthBar.zIndex = 10; @@ -780,7 +789,7 @@ class PlayState extends FunkinState { var xOffset:Float = -nums.length * .5 + .5; for (i => num in nums) { - var popNum:FunkinSprite = popRating('num$num', .5, 2); + var popNum:FunkinSprite = popRating('gameplay/funkin/num$num', .5, 2); popNum.setPosition(popNum.x + (i + xOffset) * 43, popNum.y + 80); popNum.acceleration.y = FlxG.random.int(200, 300); popNum.velocity.y = -FlxG.random.int(140, 160); @@ -936,6 +945,7 @@ class PlayState extends FunkinState { override public function destroy() { Paths.library = ''; + funkin.backend.play.NoteStyle.wipe(); DiscordRPC.details = DiscordRPC.state = ''; DiscordRPC.presence.startTimestamp = DiscordRPC.presence.endTimestamp = 0; FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPressEvent); From 9f702f02cdebc38d89dc95b667e61ba0182d57a6 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 23 Mar 2025 00:33:50 -0600 Subject: [PATCH 18/73] lmao --- assets/data/styles/notes/funkin-6k.json | 2 +- assets/data/styles/notes/funkin-9k.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/data/styles/notes/funkin-6k.json b/assets/data/styles/notes/funkin-6k.json index 7680e7e..bb32603 100644 --- a/assets/data/styles/notes/funkin-6k.json +++ b/assets/data/styles/notes/funkin-6k.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "name": "Funkin' (4 Key)", + "name": "Funkin' (6 Key)", "author": "PhantomArcade", "data": { "general": { diff --git a/assets/data/styles/notes/funkin-9k.json b/assets/data/styles/notes/funkin-9k.json index ad5cac7..8537118 100644 --- a/assets/data/styles/notes/funkin-9k.json +++ b/assets/data/styles/notes/funkin-9k.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "name": "Funkin' (4 Key)", + "name": "Funkin' (9 Key)", "author": "PhantomArcade", "data": { "general": { From 2e1d06ce1e5d304b28468a3f3b74dc09fa55d24f Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Tue, 25 Mar 2025 23:06:15 -0600 Subject: [PATCH 19/73] abolish note cover, almost fully implement styles yay! --- source/funkin/backend/FunkinSprite.hx | 2 +- source/funkin/backend/play/Chart.hx | 5 +- source/funkin/backend/play/NoteEvent.hx | 19 +- source/funkin/backend/play/NoteStyle.hx | 71 ++++- source/funkin/backend/scripting/HScript.hx | 1 + source/funkin/objects/play/Lane.hx | 306 +++++++++++---------- source/funkin/objects/play/Note.hx | 116 ++++++-- source/funkin/objects/play/Strumline.hx | 5 +- source/funkin/states/PlayState.hx | 6 +- 9 files changed, 345 insertions(+), 186 deletions(-) diff --git a/source/funkin/backend/FunkinSprite.hx b/source/funkin/backend/FunkinSprite.hx index dac5e05..22b38a0 100644 --- a/source/funkin/backend/FunkinSprite.hx +++ b/source/funkin/backend/FunkinSprite.hx @@ -190,7 +190,7 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact return (zoomFactor == 1 && super.isSimpleRenderBlit(camera)); } - function resetData() { + public function resetData() { unloadAnimate(); offsets.clear(); animationList.clear(); diff --git a/source/funkin/backend/play/Chart.hx b/source/funkin/backend/play/Chart.hx index 03f7a08..893da11 100644 --- a/source/funkin/backend/play/Chart.hx +++ b/source/funkin/backend/play/Chart.hx @@ -35,6 +35,7 @@ class Chart { public var name:String = 'Unnamed'; public var artist:String = 'Unknown'; public var difficulty:String = ''; + public var noteStyle:String = 'funkin'; public var format:ChartFormat = UNKNOWN; public var chart:Any; //BasicFormat? @@ -264,7 +265,8 @@ class Chart { song.tempoChanges = [new TempoChange(-4, song.initialBpm, new TimeSignature())]; song.scrollSpeed = songSpeed; - song.keyCount = (song.json.mania == null ? (song.json.keys ?? keyCount ?? song.keyCount) : (song.json.mania + 4)); + song.keyCount = (song.json.keys ?? keyCount ?? song.keyCount); + song.noteStyle = song.json.noteStyle ?? 'funkin'; var ms:Float = 0; var beat:Float = 0; @@ -439,6 +441,7 @@ class Chart { song.player2 = meta.extraData['FNF_P2'] ?? 'dad'; song.player3 = meta.extraData['FNF_P3'] ?? 'gf'; song.stage = meta.extraData['FNF_STAGE'] ?? 'placeholder'; + song.noteStyle = vslice.meta.playData?.noteStyle ?? 'funkin'; song.format = MODERN; Log.info('chart loaded successfully! (${Math.round((Sys.time() - time) * 1000) / 1000}s)'); diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index 910bcdf..25fa10a 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -33,6 +33,7 @@ using StringTools; public var applyRating:Bool = false; public var playAnimation:Bool = true; public var animateReceptor:Bool = true; + public var singAnimation:Null = null; var game:PlayState = null; var inGame:Bool = false; @@ -48,6 +49,7 @@ using StringTools; } targetCharacter ??= lane.character; + singAnimation ??= lane.getSingAnimation(); switch (type) { case HIT: @@ -82,11 +84,10 @@ using StringTools; } if (doSplash && (scoring?.hitWindow == null || scoring.hitWindow.splash)) - splash = lane.splash(); + splash = lane.splash(note); if (playAnimation && targetCharacter != null) { - var anim:String = lane.getSingAnimation(note.laneIndex); - var suffixAnim:String = anim + animSuffix; + var suffixAnim:String = '$singAnimation$animSuffix'; if (targetCharacter.animationExists(suffixAnim + targetCharacter.animSuffix)) targetCharacter.playAnimationSteps(suffixAnim, true); } @@ -97,6 +98,7 @@ using StringTools; if (note.isHoldNote) { lane.held = true; lane.heldNote = note; + spark = lane.popCover(note); } else if (animateReceptor && !lane.cpu) { lane.receptor.grayBeat = note.beatTime + .5; } @@ -172,8 +174,7 @@ using StringTools; } if (playAnimation && targetCharacter != null) { - var anim:String = lane.getSingAnimation(note.laneIndex); - var suffixAnim:String = anim + animSuffix + targetCharacter.animSuffix; + var suffixAnim:String = '$singAnimation$animSuffix${targetCharacter.animSuffix}'; if ((!targetCharacter.specialAnim || targetCharacter.currentAnimation == suffixAnim) && targetCharacter.animationExists(suffixAnim)) targetCharacter.timeAnimSteps(); } @@ -194,11 +195,11 @@ using StringTools; } if (perfectRelease) { - if (doSpark) - spark = lane.spark(); + spark = lane.spark(note, doSpark); if (playSound) FunkinSound.playOnce(Paths.sound('gameplay/hitsounds/hitsoundTail'), .7); } else { + spark = lane.spark(note, false); if (playSound) FunkinSound.playOnce(Paths.sound('gameplay/hitsounds/hitsoundFail'), .7); } @@ -218,7 +219,7 @@ using StringTools; } if (playAnimation && targetCharacter != null) { targetCharacter.specialAnim = false; - targetCharacter.playAnimationSteps('${lane.getSingAnimation(lane.noteData)}miss', true); + targetCharacter.playAnimationSteps('${singAnimation}miss', true); } applyExtraWindow(15); @@ -237,7 +238,7 @@ using StringTools; if (targetCharacter != null) { targetCharacter.volume = 0; if (playAnimation) - targetCharacter.playAnimationSteps('${lane.getSingAnimation(note.laneIndex)}miss', true); + targetCharacter.playAnimationSteps('${singAnimation}miss', true); } if (playSound) diff --git a/source/funkin/backend/play/NoteStyle.hx b/source/funkin/backend/play/NoteStyle.hx index bfc383a..1073836 100644 --- a/source/funkin/backend/play/NoteStyle.hx +++ b/source/funkin/backend/play/NoteStyle.hx @@ -1,5 +1,7 @@ package funkin.backend.play; +import funkin.objects.play.Lane; + using Lambda; typedef NoteStyleAsset = flixel.util.typeLimit.OneOfTwo; @@ -11,11 +13,12 @@ class NoteStyle { public static var cache:Map = []; public var path:String; - public var name:String = ''; - public var author:String = ''; + public var name:String; + public var author:String; public var info:NoteStyleInfo; public var data:NoteStyleData; public var assets:Map = []; + public var modColors:Map>> = []; public var colors:Array> = []; public var _success(default, null):Bool = false; @@ -81,17 +84,44 @@ class NoteStyle { } function updateInfo():Void { this.colors.resize(0); + for (direction in data.general.directions) { // parse colors if (direction.defaultColors != null) { var colors:Array = []; - for (color in direction.defaultColors) + for (color in direction.defaultColors) { colors.push(FlxColor.fromString(color)); + } this.colors.push(colors); } else { this.colors.push(null); } } + this.modColors[NORMAL] = generateModColors(colors, NORMAL); + this.modColors[LOWCONTRAST] = generateModColors(colors, LOWCONTRAST); + this.modColors[HIGHCONTRAST] = generateModColors(colors, HIGHCONTRAST); + } + + static function generateModColors(colors:Array>, mod:NoteStyleColorMod):Array> { + var newColors:Array> = []; + for (colorSet in colors) { + newColors.push(switch (mod) { + case NORMAL: + colorSet.copy(); + case LOWCONTRAST: + var grayRim:FlxColor = colorSet[1]; + grayRim.saturation *= .5; + [Receptor.makeGrayColor(colorSet[0]), grayRim, 0xff201e31]; + case HIGHCONTRAST: + var highRim:FlxColor = colorSet[1]; + highRim.saturation *= 1.5; + highRim.brightness *= 1.5; + var highColors:Array = NoteSplash.makeSplashColors(colorSet[0]); + [highColors[0], highRim, highColors[1]]; + }); + } + + return newColors; } public function getAssetAnimation(asset:NoteStyleAssetData, find:String):NoteStyleAnimData { @@ -124,17 +154,36 @@ class NoteStyle { return style.colors[FlxMath.wrap(dir, 0, style.colors.length - 1)] ?? defaultColors; } + public static function getDirectionColorMod(style:NoteStyleAsset, dir:Int, mod:NoteStyleColorMod = NORMAL):Array { + var style:NoteStyle = fetch(style); + if (style == null || style.colors.length == 0) return defaultColors; + + var colorMod:Array> = style.modColors[mod]; + + if (colorMod == null) return defaultColors; + return colorMod[FlxMath.wrap(dir, 0, colorMod.length - 1)]; + } + + public function toString():String { + return 'NoteStyle($name by $author)'; + } } class NoteStyleUtil { public static function getDirectionName(style:NoteStyle, dir:Int):String { return NoteStyle.getDirectionName(style, dir); } public static function getDirectionSing(style:NoteStyle, dir:Int):String { return NoteStyle.getDirectionSing(style, dir); } public static function getDirectionColors(style:NoteStyle, dir:Int):Array { return NoteStyle.getDirectionColors(style, dir); } + public static function getDirectionColorMod(style:NoteStyle, dir:Int, mod:NoteStyleColorMod = NORMAL):Array { return NoteStyle.getDirectionColorMod(style, dir, mod); } public static function loadNoteStyleAnimations(sprite:FunkinSprite, asset:NoteStyleAssetData, direction:String = 'down'):Void { if (asset == null) return; + sprite.resetData(); sprite.loadAtlas(asset.assetPath); + sprite.animation?.destroyAnimations(); + sprite.smooth = asset.antialiasing ?? true; + + if (sprite.frames == null) return; for (data in asset.animations) { var animName:String = direction; if (data.suffix != null) animName += ' ${data.suffix}'; @@ -151,8 +200,11 @@ class NoteStyleUtil { sprite.preloadAnimAsset(data.name); } - if (data.offsets != null && sprite.animationExists(data.name)) + if (data.offsets != null && sprite.animationExists(data.name)) { sprite.setAnimationOffset(data.name, data.offsets[0], data.offsets[1]); + } else { + sprite.setAnimationOffset(data.name); + } } } } @@ -190,17 +242,28 @@ typedef NoteStyleDirData = { typedef NoteStyleAssetData = { var assetPath:String; var animations:Array; + var ?antialiasing:Bool; var ?variants:Int; // notesplash only (for now) + var ?scale:Float; + var ?alpha:Float; } typedef NoteStyleAnimData = { var name:String; var ?prefix:String; var ?suffix:String; + var ?disableRGB:Bool; + var ?colorMod:NoteStyleColorMod; var ?frameRateRange:Array; var ?frameIndices:Array; var ?offsets:Array; var ?assetPath:String; var ?frameRate:Int; var ?looped:Bool; +} + +enum abstract NoteStyleColorMod(String) to String { + var NORMAL = 'normal'; + var LOWCONTRAST = 'lowContrast'; + var HIGHCONTRAST = 'highContrast'; } \ No newline at end of file diff --git a/source/funkin/backend/scripting/HScript.hx b/source/funkin/backend/scripting/HScript.hx index 77ab7f1..7da803e 100644 --- a/source/funkin/backend/scripting/HScript.hx +++ b/source/funkin/backend/scripting/HScript.hx @@ -56,6 +56,7 @@ class HScript extends Iris { 'Character' => funkin.objects.Character, 'HealthIcon' => funkin.objects.HealthIcon, 'NoteEvent' => funkin.backend.play.NoteEvent, + 'NoteStyle' => funkin.backend.play.NoteStyle, 'Strumline' => funkin.objects.play.Strumline, 'StageProp' => funkin.objects.Stage.StageProp, 'Conductor' => funkin.backend.rhythm.Conductor, diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 977e6ab..0ec5aa3 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -24,7 +24,7 @@ class Lane extends FunkinSpriteGroup { public var startX:Float; public var startY:Float; - public var held(default, set):Bool = false; + public var held:Bool = false; public var heldNote:Note = null; public var pressed:Bool = false; @@ -48,11 +48,13 @@ class Lane extends FunkinSpriteGroup { var extraWindow:Float = 0; // antimash mechanic public var receptor:Receptor; - public var noteCover:NoteCover; public var notes:FunkinTypedSpriteGroup; public var noteSparks:FunkinTypedSpriteGroup; public var noteSplashes:FunkinTypedSpriteGroup; public var queue:Array = []; + + public var canSplash:Bool = true; + public var canSpark:Bool = true; public var selfDraw:Bool = false; public var topMembers:Array = []; @@ -60,14 +62,6 @@ class Lane extends FunkinSpriteGroup { public function set_scrollSpeed(newSpeed:Float) { return scrollSpeed = newSpeed; } - public function set_held(newHeld:Bool) { - if (held == newHeld) return newHeld; - - if (newHeld) popCover(); - else noteCover.kill(); - - return held = newHeld; - } public function set_cpu(isCpu:Bool) { if (cpu == isCpu) return isCpu; if (receptor != null) @@ -92,23 +86,35 @@ class Lane extends FunkinSpriteGroup { return (time <= note.hitWindow + extraWindow) && (time >= -note.hitWindow); }; - noteCover = new NoteCover(data, style); receptor = new Receptor(0, 0, data, style); notes = new FunkinTypedSpriteGroup(); noteSparks = new FunkinTypedSpriteGroup(0, 0, 5); noteSplashes = new FunkinTypedSpriteGroup(0, 0, 5); - spawnRadius = Note.distanceToMS(FlxG.height, scrollSpeed); + spawnRadius = Note.distanceToMS(FlxG.height + 75, scrollSpeed); receptor.lane = this; //lol this.add(receptor); - for (mem in [notes, noteCover, noteSparks, noteSplashes]) { + for (mem in [notes, noteSparks, noteSplashes]) { topMembers.push(mem); // render conditionally this.add(mem); } - noteCover.shader = splashRGB.shader; - spark().alpha = .0001; splash().alpha = .0001; + + updateLaneScale(scale); + } + override function initVars():Void { + super.initVars(); + scale.destroy(); + scale = new flixel.math.FlxPoint.FlxCallbackPoint(updateLaneScale); + scale.set(1, 1); + } + function updateLaneScale(point:FlxPoint) { + if (receptor != null) { + var mult:Float = receptor.defaultScale; + receptor.scale.set(point.x * mult, point.y * mult); + receptor.updateHitbox(); + } } public override function update(elapsed:Float) { @@ -231,33 +237,48 @@ class Lane extends FunkinSpriteGroup { public function resetLane() { clearNotes(); receptor.playAnimation('static'); - noteCover.kill(); + removeCovers(); heldNote = null; held = false; } - public function splash():NoteSplash { + public function splash(?note:Note):NoteSplash { var splash:NoteSplash = noteSplashes.recycle(NoteSplash, () -> new NoteSplash(noteData, style), true); preAdd(splash); - splash.alpha = alpha * .7; - splash.scale.copyFrom(scale); - splashRGB.copy(splash.rgbShader); - splash.splashOnReceptor(receptor); + splash.style = note?.style ?? style; + splash.popOnReceptor(receptor); + splash.alpha = alpha * splash.defaultAlpha; + splash.scale.set(scale.x * splash.defaultScale, scale.y * splash.defaultScale); return splash; } - public function popCover():NoteCover { - noteCover.popOnReceptor(receptor); - return noteCover; - } - public function spark():NoteSpark { + public function popCover(?note:Note):NoteSpark { var spark:NoteSpark = noteSparks.recycle(NoteSpark, () -> new NoteSpark(noteData, style), true); preAdd(spark); - spark.alpha = alpha; - spark.scale.copyFrom(scale); - splashRGB.copy(spark.rgbShader); - spark.sparkOnReceptor(receptor); + spark.style = note?.style ?? style; + spark.heldNote = note; + spark.popOnReceptor(receptor); + spark.alpha = alpha * spark.defaultAlpha; + spark.scale.set(scale.x * spark.defaultScale, scale.y * spark.defaultScale); + return spark; + } + public function spark(?note:Note, animate:Bool = true):NoteSpark { + var spark:NoteSpark = noteSparks.members.find((spark:NoteSpark) -> spark.heldNote == note); + spark ??= popCover(); + if (animate) { + spark.spark(); + } else { + spark.kill(); + } return spark; } + public function removeCovers():Void { + for (spark in noteSparks) { + if (spark.alive && !spark.sparking) { + spark.heldNote = null; + spark.kill(); + } + } + } public inline function queueNote(note:ChartNote, sorted:Bool = false, checkExists:Bool = true):ChartNote { var pushed:Bool = false; @@ -344,8 +365,7 @@ class Lane extends FunkinSpriteGroup { note.hitWindow = hitWindow; note.reload(style); - note.scale.copyFrom(receptor.scale); - note.rgbShader = rgbShader.copy(note.rgbShader); + note.scale.set(scale.x * note.defaultScale, scale.y * note.defaultScale); note.updateHitbox(); notes.insert(pos, note); @@ -381,24 +401,24 @@ class Lane extends FunkinSpriteGroup { if (receptor != null) receptor.style = style; - if (noteCover != null) - noteCover.style = style; var colors:Array = NoteStyle.getDirectionColors(style, noteData); rgbShader.set(colors[0], colors[1], colors[2]); var splashColors:Array = NoteSplash.makeSplashColors(colors[0]); splashRGB.set(splashColors[0], FlxColor.WHITE, splashColors[1]); + + updateLaneScale(scale); } - public function getDirection(dir:Int):String { - return NoteStyle.getDirectionName(style, dir); + public function getDirection(?dir:Int):String { + return NoteStyle.getDirectionName(style, dir ?? noteData); } - public function getSingAnimation(dir:Int):String { - return NoteStyle.getDirectionSing(style, dir); + public function getSingAnimation(?dir:Int):String { + return NoteStyle.getDirectionSing(style, dir ?? noteData); } - public function getColors(dir:Int):Array { - return NoteStyle.getDirectionColors(style, dir); + public function getColors(?dir:Int):Array { + return NoteStyle.getDirectionColors(style, dir ?? noteData); } override function get_width() @@ -429,16 +449,16 @@ class Lane extends FunkinSpriteGroup { class Receptor extends FunkinSprite { public var lane:Lane; public var noteData:Int; + public var rgbShader:RGBSwap; public var rgbEnabled(default, set):Bool; public var style(default, set):NoteStyle; public var grayBeat:Null; public var autoReset:Bool = false; + public var defaultScale:Float = 1; - public var canUpdateShader:Bool = true; - public var missColor:Array = []; - public var glowColor:Array = []; + public var updateRGBShader:Bool = true; public function new(x:Float, y:Float, data:Int, ?style:NoteStyleAsset = 'funkin') { super(x, y); @@ -448,18 +468,11 @@ class Receptor extends FunkinSprite { this.noteData = data; this.style = NoteStyle.fetch(style); - computeRGBColors(); - onAnimationComplete.add((anim:String) -> { if (anim != 'static' && autoReset && (lane == null || !lane.held)) playAnimation('static', true); }); } - - public function computeRGBColors() { - glowColor = [rgbShader.red, rgbShader.green, rgbShader.blue]; - missColor = [makeGrayColor(rgbShader.red), FlxColor.WHITE, FlxColor.fromRGB(32, 30, 49)]; - } public override function update(elapsed:Float) { super.update(elapsed); @@ -468,17 +481,21 @@ class Receptor extends FunkinSprite { } public override function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { - if (canUpdateShader) { - if (anim == 'static') { - rgbEnabled = false; - } else { - var baseColor:Array = (anim == 'press' ? missColor : glowColor); - rgbShader.set(baseColor[0], baseColor[1], baseColor[2]); - rgbEnabled = true; + if (updateRGBShader) { + var animData:NoteStyleAnimData = style?.getAssetAnimation(style.data.receptors, anim); + if (animData != null) { + if (animData.disableRGB) { + rgbEnabled = false; + } else { + var colors:Array = style.getDirectionColorMod(noteData, animData.colorMod); + rgbShader.set(colors[0], colors[1], colors[2]); + rgbEnabled = true; + } } } if (anim != 'confirm') grayBeat = null; + super.playAnimation(anim, forced, reversed, frame); centerOffsets(); centerOrigin(); @@ -492,20 +509,20 @@ class Receptor extends FunkinSprite { public function loadStyle(newStyle:NoteStyleAsset) { var style:NoteStyle = NoteStyle.fetch(newStyle); - var colors:Array = NoteStyle.getDirectionColors(style, noteData); - rgbShader.set(colors[0], colors[1], colors[2]); - computeRGBColors(); + updateRGBShader = !(style?.data.general.disableRGB ?? false); NoteStyleUtil.loadNoteStyleAnimations(this, style?.data?.receptors, style?.getDirectionName(noteData)); playAnimation('static', true); updateHitbox(); + + defaultScale = style?.data?.receptors?.scale ?? 1; } - + public function set_rgbEnabled(newE:Bool) { shader = (newE ? rgbShader.shader : null); return rgbEnabled = newE; } - + public static function makeGrayColor(col:FlxColor) { var pCol:FlxColor = col; col.red = Std.int(FlxMath.bound(col.red - 40 - (col.blue - col.red) * .1 + Math.abs(col.red - col.blue) * .1 + Math.min(col.red - Math.pow(col.blue / 255, 2) * 255 * 3 + col.green * .4, 0) * .1, 0, 255)); @@ -520,12 +537,20 @@ class Receptor extends FunkinSprite { } class NoteSplash extends FunkinSprite { + public var lane:Lane; public var noteData:Int; + public var rgbShader:RGBSwap; + public var updateRGBShader:Bool = true; + public var rgbEnabled(default, set):Bool; public var style(default, set):NoteStyle; + public var defaultScale:Float = 1; + public var defaultAlpha:Float = 1; public var animationVariants:Int = 1; public var frameRateRange:Array; + + var asset:NoteStyleAssetData = null; public function new(data:Int, ?style:NoteStyleAsset = 'funkin') { super(); @@ -536,9 +561,9 @@ class NoteSplash extends FunkinSprite { this.noteData = data; this.style = NoteStyle.fetch(style); - var dirName:String = Note.getDirection(data); - addAnimation('splash1', 'notesplash $dirName 1', 24, false); - addAnimation('splash2', 'notesplash $dirName 2', 24, false); + initAnimation(); + } + function initAnimation():Void { onAnimationComplete.add((anim:String) -> kill()); } @@ -550,34 +575,66 @@ class NoteSplash extends FunkinSprite { public function loadStyle(newStyle:NoteStyleAsset) { var style:NoteStyle = NoteStyle.fetch(newStyle); - NoteStyleUtil.loadNoteStyleAnimations(this, style?.data?.noteSplashes, style?.getDirectionName(noteData)); - animationVariants = style?.data?.noteSplashes.variants ?? 1; + updateRGBShader = !(style?.data.general.disableRGB ?? false); + asset = style?.data.noteSplashes; + + NoteStyleUtil.loadNoteStyleAnimations(this, asset, style?.getDirectionName(noteData)); + animationVariants = asset?.variants ?? 1; playAnimation('splash-1', true); updateHitbox(); + + defaultScale = asset?.scale ?? 1; + defaultAlpha = asset?.alpha ?? 1; } - public function splashOnReceptor(receptor:Receptor) { //lol + public function popOnReceptor(receptor:Receptor) { //lol setPosition(receptor.x + receptor.width * .5, receptor.y + receptor.height * .5); - splash(); + pop(); } - public function splash() { + public function pop():NoteSplash { var splashAnim:String = 'splash-${FlxG.random.int(1, animationVariants)}'; var range:Array = frameRateRange; if (range == null) { - var animation:NoteStyleAnimData = style?.getAssetAnimation(style.data.noteSplashes, splashAnim); + var animation:NoteStyleAnimData = style?.getAssetAnimation(asset, splashAnim); if (animation != null) { if (animation.frameRateRange != null) range = animation.frameRateRange; } } - if (range != null) - animation.curAnim.frameRate = FlxG.random.int(range[0], range[1]); - playAnimation(splashAnim, true); updateHitbox(); offset.set(frameWidth * .5, frameHeight * .5); + + if (anim.curAnim == null) { + kill(); + } else if (range != null) { + anim.curAnim.frameRate = FlxG.random.int(range[0], range[1]); + } + + return this; + } + public override function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { + if (updateRGBShader) { + var animData:NoteStyleAnimData = style?.getAssetAnimation(asset, anim); + if (animData != null) { + if (animData.disableRGB) { + rgbEnabled = false; + } else { + var colors:Array = style.getDirectionColorMod(noteData, animData.colorMod); + rgbShader.set(colors[0], colors[1], colors[2]); + rgbEnabled = true; + } + } + } + + super.playAnimation(anim, forced, reversed, frame); + } + + public function set_rgbEnabled(newE:Bool) { + shader = (newE ? rgbShader.shader : null); + return rgbEnabled = newE; } public static function makeSplashColors(baseFill:FlxColor):Array { @@ -601,89 +658,52 @@ class NoteSplash extends FunkinSprite { } } -class NoteCover extends FunkinSprite { // TODO: change to only use NoteSpark? (and recycle like notesplashes) - public var noteData:Int; - - public var rgbShader:RGBSwap; - public var style(default, set):NoteStyle; +class NoteSpark extends NoteSplash { + public var heldNote:Note = null; + public var sparking:Bool = false; public function new(data:Int, ?style:NoteStyleAsset) { - super(); - - rgbShader = new RGBSwap(); - shader = rgbShader.shader; - - this.noteData = data; - this.style = NoteStyle.fetch(style); - - onAnimationComplete.add((anim:String) -> playAnimation('loop')); - - kill(); + super(data, style); } - - function set_style(newStyle:NoteStyle) { - if (style == newStyle) return newStyle; - loadStyle(newStyle); - return style = newStyle; + override function initAnimation():Void { + onAnimationComplete.add((anim:String) -> { + if (anim.startsWith('start')) + playAnimation('loop', true); + if (anim.startsWith('spark')) + kill(); + }); } - public function loadStyle(newStyle:NoteStyleAsset) { + + public override function loadStyle(newStyle:NoteStyleAsset) { var style:NoteStyle = NoteStyle.fetch(newStyle); - NoteStyleUtil.loadNoteStyleAnimations(this, style?.data?.noteCovers, style?.getDirectionName(noteData)); - playAnimation('start', true); - updateHitbox(); - } - - public function popOnReceptor(receptor:Receptor) { - setPosition(receptor.x + receptor.width * .5, receptor.y + receptor.height * .5); - pop(); - } - public function pop() { + updateRGBShader = !(style?.data.general.disableRGB ?? false); + asset = style?.data.noteCovers; + + NoteStyleUtil.loadNoteStyleAnimations(this, asset, style?.getDirectionName(noteData)); playAnimation('start', true); - revive(); updateHitbox(); offset.set(frameWidth * .5, frameHeight * .5); - } -} - -class NoteSpark extends FunkinSprite { - public var noteData:Int; - - public var rgbShader:RGBSwap; - public var style(default, set):NoteStyle; - - public function new(data:Int, ?style:NoteStyleAsset) { - super(data); - rgbShader = new RGBSwap(); - shader = rgbShader.shader; - - this.noteData = data; - this.style = NoteStyle.fetch(style); - - onAnimationComplete.add((anim:String) -> kill()); + defaultScale = asset?.scale ?? 1; + defaultAlpha = asset?.alpha ?? 1; } - function set_style(newStyle:NoteStyle) { - if (style == newStyle) return newStyle; - loadStyle(newStyle); - return style = newStyle; + public override function pop():NoteSpark { + playAnimation('start', true); + sparking = false; + revive(); + return this; } - public function loadStyle(newStyle:NoteStyleAsset) { - var style:NoteStyle = NoteStyle.fetch(newStyle); - - NoteStyleUtil.loadNoteStyleAnimations(this, style?.data?.noteCovers, style?.getDirectionName(noteData)); + public function spark():NoteSpark { playAnimation('spark', true); - updateHitbox(); - } - - public function sparkOnReceptor(receptor:Receptor) { - setPosition(receptor.x + receptor.width * .5, receptor.y + receptor.height * .5); - spark(); + sparking = true; + heldNote = null; + return this; } - public function spark() { - playAnimation('spark', true); - updateHitbox(); - offset.set(frameWidth * .5, frameHeight * .5); + public override function kill():Void { + super.kill(); + heldNote = null; + sparking = false; } } \ No newline at end of file diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 9d040a0..bf9fa9c 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -71,7 +71,9 @@ class Note extends FunkinSprite { public var conductorInUse:Conductor; // mostly charting stuff public var tail:NoteTail; - public var rgbShader(default, set):RGBSwap; + public var rgbShader:RGBSwap; + public var updateRGBShader:Bool = true; + public var rgbEnabled(default, set):Bool; public var tailOffset(default, null):FlxPoint; public var lane:Lane; @@ -91,6 +93,8 @@ class Note extends FunkinSprite { public var held:Bool = false; public var hitTime:Float = -1; public var holdTime:Float = -1; + public var defaultAlpha:Float = 1; + public var defaultScale:Float = 1; public var clipDistance:Float = 0; public var scrollDistance:Float = 0; @@ -153,6 +157,9 @@ class Note extends FunkinSprite { public function new(songNote:ChartNote, ?conductor:Conductor) { super(); + rgbShader = new RGBSwap(); + shader = rgbShader.shader; + this.conductorInUse = conductor ?? FunkinState.getCurrentConductor(); this.tailOffset = FlxPoint.get(); @@ -162,9 +169,9 @@ class Note extends FunkinSprite { if (songNote != null) { this.kind = songNote.kind; this.msTime = songNote.msTime; - this.msLength = songNote.msLength; this.laneIndex = songNote.laneIndex; this.strumlineIndex = songNote.strumlineIndex; + this.msLength = songNote.msLength; this.extraData.clear(); if (songNote.extraData != null) { @@ -240,25 +247,31 @@ class Note extends FunkinSprite { return msTime + msLength; function get_endBeat() return beatTime + beatLength; - function set_rgbShader(newShd:RGBSwap):RGBSwap { - if (newShd != null) - shader = newShd.shader; - if (newShd == null && rgbShader != null && shader == rgbShader.shader) - shader = null; - return rgbShader = newShd; - } function set_style(newStyle:NoteStyle) { if (style == newStyle) return newStyle; + loadStyle(newStyle); + if (tail != null) + tail.style = newStyle; + return style = newStyle; } + public function set_rgbEnabled(newE:Bool) { + shader = (newE ? rgbShader.shader : null); + return rgbEnabled = newE; + } public function loadStyle(newStyle:NoteStyleAsset) { var style:NoteStyle = NoteStyle.fetch(newStyle); + var asset:NoteStyleAssetData = style?.data.notes; - NoteStyleUtil.loadNoteStyleAnimations(this, style?.data?.notes, style?.getDirectionName(laneIndex)); + NoteStyleUtil.loadNoteStyleAnimations(this, asset, style?.getDirectionName(laneIndex)); playAnimation('hit', true); updateHitbox(); + + defaultScale = asset?.scale ?? 1; + defaultAlpha = asset?.alpha ?? 1; + reloadAnimShader('hit', newStyle); } public static function distanceToMS(distance:Float, scrollSpeed:Float) @@ -275,42 +288,70 @@ class Note extends FunkinSprite { var xP:Float = 0; var yP:Float = scrollDistance; var rad:Float = dir / 180 * Math.PI; - x = receptor.x + Math.sin(rad) * xP + Math.cos(rad) * yP; - y = receptor.y + Math.sin(rad) * yP + Math.cos(rad) * xP; + x = receptor.x + (receptor.width - width) * .5 + Math.sin(rad) * xP + Math.cos(rad) * yP; + y = receptor.y + (receptor.height - height) * .5 + Math.sin(rad) * yP + Math.cos(rad) * xP; if (followAlpha) - alpha = receptor.alpha * multAlpha; + alpha = receptor.alpha * multAlpha * defaultAlpha; if (followVisible) visible = receptor.visible; if (followAngle) angle = lane.receptor.angle; if (isHoldNote && tail != null) { - tail.scale.x = scale.x; - tail.scale.y = FlxMath.signOf(speed) * Math.abs(scale.x); + tail.scale.x = scale.x * tail.defaultScale; + tail.scale.y = FlxMath.signOf(speed) * Math.abs(scale.x) * tail.defaultScale; tail.updateHitbox(); tail.offset.y = 0; var absDistance:Float = msToDistance(msTime - conductorInUse.songPosition, Math.abs(speed)); tail.sustainHeight = msToDistance(msLength, Math.abs(speed)); - tail.setPosition(x - tailOffset.x + (width - tail.width) * .5, y - tailOffset.y + receptor.height * .5); + tail.setPosition(x - tailOffset.x + (width - tail.width) * .5, y - tailOffset.y + height * .5); tail.angle = dir - 90; if (goodHit && absDistance < 0) tail.sustainClip = -absDistance; } } + + public override function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { + if (forced || this.anim.name != anim) + reloadAnimShader(anim, style); + + super.playAnimation(anim, forced, reversed, frame); + } + public function reloadAnimShader(anim:String, style:NoteStyle) { + if (updateRGBShader) { + var animData:NoteStyleAnimData = style?.getAssetAnimation(style?.data.notes, anim); + if (animData != null) { + if (animData.disableRGB) { + rgbEnabled = false; + } else { + var colors:Array = style.getDirectionColorMod(laneIndex, animData.colorMod); + rgbShader.set(colors[0], colors[1], colors[2]); + rgbEnabled = true; + } + } + } + } } class NoteTail extends FunkinSprite { + public var rgbShader:RGBSwap; + public var updateRGBShader:Bool = true; + public var rgbEnabled(default, set):Bool; + public var parent(default, set):Note; public var style(default, set):NoteStyle; public var laneIndex:Int; - public var multAlpha:Float = .6; + public var multAlpha:Float = 1; public var sustainClip:Float = 0; public var sustainHeight:Float = 0; + public var defaultScale:Float = 1; + public var defaultAlpha:Float = 1; + public var holdScale(default, null):FlxPoint; public var tailScale(default, null):FlxPoint; @@ -319,9 +360,13 @@ class NoteTail extends FunkinSprite { public function new(parent:Note) { super(); + rgbShader = new RGBSwap(); + shader = rgbShader.shader; + holdScale = FlxPoint.get(1, 1); tailScale = FlxPoint.get(1, 1); + this.style = style; this.parent = parent; } public override function destroy() { @@ -333,8 +378,6 @@ class NoteTail extends FunkinSprite { } function set_parent(note:Note):Note { - if (parent == note) return note; - laneIndex = note.laneIndex; return parent = note; } @@ -344,7 +387,7 @@ class NoteTail extends FunkinSprite { sustainClip = 0; } public override function draw() { - alpha = multAlpha; + alpha = multAlpha * defaultAlpha; if (parent != null) { scrollFactor.copyFrom(parent.scrollFactor); initialZoom = parent.initialZoom; @@ -362,12 +405,20 @@ class NoteTail extends FunkinSprite { loadStyle(newStyle); return style = newStyle; } + public function set_rgbEnabled(newE:Bool) { + shader = (newE ? rgbShader.shader : null); + return rgbEnabled = newE; + } public function loadStyle(newStyle:NoteStyleAsset) { var style:NoteStyle = NoteStyle.fetch(newStyle); + var asset:NoteStyleAssetData = style?.data.holds; - NoteStyleUtil.loadNoteStyleAnimations(this, style?.data?.holds, style?.getDirectionName(laneIndex)); + NoteStyleUtil.loadNoteStyleAnimations(this, asset, style?.getDirectionName(laneIndex)); playAnimation('hold', true); updateHitbox(); + + defaultScale = asset?.scale ?? 1; + defaultAlpha = asset?.alpha ?? 1; } // this is kinda mediocre tbh @@ -410,7 +461,7 @@ class NoteTail extends FunkinSprite { } _tileMatrix.copyFrom(_matrix); - _tileMatrix.translate(-totalHeight * sin, totalHeight * cos * scaleSign); + _tileMatrix.translate(-totalHeight * sin, totalHeight * cos * scaleSign - top * scale.y * holdScale.y); FunkinSprite.transformMatrixZoom(_tileMatrix, camera, zoomFactor, initialZoom); camera.drawPixels(_frame, framePixels, _tileMatrix, colorTransform, blend, antialiasing, shader); @@ -482,4 +533,25 @@ class NoteTail extends FunkinSprite { public override function isSimpleRender(?camera:FlxCamera):Bool { return false; // lazy zzz } + + public override function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { + if (forced || this.anim.name != anim) + reloadAnimShader(anim, style); + + super.playAnimation(anim, forced, reversed, frame); + } + public function reloadAnimShader(anim:String, style:NoteStyle) { + if (updateRGBShader) { + var animData:NoteStyleAnimData = style?.getAssetAnimation(style?.data.holds, anim); + if (animData != null) { + if (animData.disableRGB) { + rgbEnabled = false; + } else { + var colors:Array = style.getDirectionColorMod(laneIndex, animData.colorMod); + rgbShader.set(colors[0], colors[1], colors[2]); + rgbEnabled = true; + } + } + } + } } \ No newline at end of file diff --git a/source/funkin/objects/play/Strumline.hx b/source/funkin/objects/play/Strumline.hx index 702ef28..9e294b4 100644 --- a/source/funkin/objects/play/Strumline.hx +++ b/source/funkin/objects/play/Strumline.hx @@ -66,6 +66,7 @@ class Strumline extends FunkinSpriteGroup { lane.oneWay = oneWay; lane.cpu = cpu; + lane.scale.copyFrom(scale); lanes.add(lane); } return laneCount = newCount; @@ -220,10 +221,6 @@ class Strumline extends FunkinSpriteGroup { // TODO: better way... ?? recalculateLaneSpacing(laneSpacing * ratio, laneSpacing); scale.set(ratio, ratio); - for (lane in lanes) { - lane.receptor.updateHitbox(); - lane.receptor.spriteOffset.set(); - } } } public function center(axes:FlxAxes = XY) { //do Not inline that. diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 7fcae5b..642c6c5 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -89,7 +89,7 @@ class PlayState extends FunkinState { public var songStarted:Bool = false; public var songFinished:Bool = false; - public var noteStyle:NoteStyleAsset = 'funkin'; + public var noteStyle:NoteStyleAsset; public function new(chart:Chart, simple:Bool = false) { PlayState.chart = chart ?? PlayState.chart ?? new Chart(''); @@ -160,6 +160,8 @@ class PlayState extends FunkinState { var strumlineBound:Float = (FlxG.width - 300) * .5; var strumlineY:Float = 50; + noteStyle = chart.noteStyle; + var mania:String = '${chart.keyCount}k'; keybinds = Options.data.keybinds[mania] ?? Options.data.keybinds['4k']; if (NoteStyle.exists('$noteStyle-$mania')) @@ -656,7 +658,7 @@ class PlayState extends FunkinState { runAllHScript('${funcName}Pre', [e]); try e.dispatch() - catch (e:haxe.Exception) Log.error('error dispatching event -> ${e.message}'); + catch (e:haxe.Exception) Log.error('error dispatching event -> ${e.details()}'); runAllHScript(funcName, [e]); } From 42bd698db2a62f20390523ca0c8945b0dd2f571e Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 29 Mar 2025 22:49:16 -0600 Subject: [PATCH 20/73] "recycled" alphabet --- source/funkin/backend/FunkinSpriteGroup.hx | 2 + source/funkin/objects/Alphabet.hx | 51 ++++++++++------------ source/funkin/objects/play/Lane.hx | 2 +- source/funkin/states/PlayState.hx | 2 +- 4 files changed, 28 insertions(+), 29 deletions(-) diff --git a/source/funkin/backend/FunkinSpriteGroup.hx b/source/funkin/backend/FunkinSpriteGroup.hx index 0e6539b..76b0438 100644 --- a/source/funkin/backend/FunkinSpriteGroup.hx +++ b/source/funkin/backend/FunkinSpriteGroup.hx @@ -40,6 +40,8 @@ class FunkinTypedSpriteGroup implements ISpriteVars implements IZoo sprite.updateHitbox(); } } + public inline function killMembers():Void { group.killMembers(); } + public inline function reviveMembers():Void { group.reviveMembers(); } public function sortZIndex() { sort(Util.sortZIndex, FlxSort.ASCENDING); diff --git a/source/funkin/objects/Alphabet.hx b/source/funkin/objects/Alphabet.hx index 3b2b5a0..9384c48 100644 --- a/source/funkin/objects/Alphabet.hx +++ b/source/funkin/objects/Alphabet.hx @@ -7,7 +7,7 @@ class Alphabet extends FlxSpriteGroup { public var text(default, set):String; public var padding(default, set):Float = -3; public var letterCase(default, set):LetterCase = NONE; - public var characters:Array = []; + public var characters:FunkinTypedSpriteGroup = new FunkinTypedSpriteGroup(); public var white(default, set):FlxColor = FlxColor.WHITE; public var black(default, set):FlxColor = FlxColor.BLACK; @@ -16,6 +16,7 @@ class Alphabet extends FlxSpriteGroup { super(x, y); this.type = type; this.text = text; + this.add(characters); } public function scaleTo(x:Float = 1, y:Float = 1):Alphabet { @@ -91,29 +92,23 @@ class Alphabet extends FlxSpriteGroup { function set_text(newText:String = ''):String { if (newText == text) return newText; - while (characters.length > newText.length) { - var character:AlphabetCharacter = characters.shift(); - remove(character, true); - character.destroy(); //todo: pool letters? - } + var letters:Array = newText.split(''); - var stringLetters:Array = newText.split(''); - var i:Int = 0; - for (letter in stringLetters) { - var character:AlphabetCharacter; - if (i >= characters.length) { - character = new AlphabetCharacter(0, 0, letter, type); - character.setColors(white, black); - character.scale.copyFrom(scale); - character.updateHitbox(); - characters.push(character); - add(character); - } else { - character = characters[i]; - character.character = letter; + while (characters.length < newText.length) // how economic + characters.add(new AlphabetCharacter(0, 0, ' ', type)); + for (i => character in characters) { + if (i >= newText.length) { + character.kill(); + continue; } + character.letterCase = letterCase; - i ++; + character.character = letters[i]; + character.type = type; + character.setColors(white, black); + character.scale.copyFrom(scale); + character.updateHitbox(); + character.revive(); } recalculateLetters(); @@ -306,17 +301,19 @@ class AlphabetCharacter extends FunkinSprite { } function set_letterCase(newCase:LetterCase):LetterCase { + if (letterCase == newCase) return newCase; + letterCase = newCase; set_character(character); return letterCase = newCase; } function set_type(newType:String):String { - if (type != newType) { - offsets.clear(); - loadAtlas('fonts/$newType'); - setupFont(); - set_character(character); - } + if (type == newType) return newType; + + offsets.clear(); + loadAtlas('fonts/$newType'); + setupFont(); + set_character(character); return type = newType; } function set_baseX(newX:Float):Float { diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 0ec5aa3..dd91bc5 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -271,7 +271,7 @@ class Lane extends FunkinSpriteGroup { } return spark; } - public function removeCovers():Void { + public function removeCovers():Void { // rename to removeSpakrs maybe :sob: for (spark in noteSparks) { if (spark.alive && !spark.sparking) { spark.heldNote = null; diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 642c6c5..a47b0dd 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -721,7 +721,7 @@ class PlayState extends FunkinState { var oldTime:Float = conductorInUse.songPosition; var newTimeMaybe:Float = conductorInUse.syncTracker?.time ?? oldTime; if (conductorInUse.syncTracker != null && conductorInUse.syncTracker.playing) - conductorInUse.songPosition = newTimeMaybe; // too rigged? (Math.abs(newTimeMaybe) < Math.abs(oldTime) ? newTimeMaybe : oldTime); + conductorInUse.songPosition = newTimeMaybe; var canFireInput:Bool = true; if (keybind >= 0) From 28cc01e6608530baeee2dea98341b51f5a6ab31c Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Wed, 2 Apr 2025 02:25:18 -0600 Subject: [PATCH 21/73] fixes and improvements, notestyle scripts - health icons work again (issue with animation hook) - character, and note styles scripts now have a naming convention isntead of only path - experimental change in hscript (you can get scripted vars with object.var (instead of object.getVar('var')) with experimentalVars. automatically enabled for testing purposes) - HScript.loadFromFile now has a name argument - NoteEvent.songPosition for modifiable playback time behavior. bot play now makes use of this - fixed a small issue with the PlayAnimation event - note styles holds are now appropriately scaled - fixed ratings not actually being recycled... - notes, notesplashes and notesparks are now drawn in their correct order. this should look cleaner, hopefully yay! --- source/funkin/backend/FunkinSprite.hx | 8 +- source/funkin/backend/FunkinSpriteGroup.hx | 12 +++ source/funkin/backend/play/NoteEvent.hx | 99 ++++++++++---------- source/funkin/backend/play/NoteStyle.hx | 9 ++ source/funkin/backend/play/SongEvent.hx | 6 +- source/funkin/backend/scripting/HScript.hx | 4 +- source/funkin/backend/scripting/HScripts.hx | 25 ++--- source/funkin/backend/scripting/ModInterp.hx | 11 +++ source/funkin/objects/Character.hx | 2 +- source/funkin/objects/HealthIcon.hx | 4 + source/funkin/objects/play/Lane.hx | 62 ++++++------ source/funkin/objects/play/Note.hx | 4 +- source/funkin/states/PlayState.hx | 50 +++++++--- 13 files changed, 182 insertions(+), 114 deletions(-) diff --git a/source/funkin/backend/FunkinSprite.hx b/source/funkin/backend/FunkinSprite.hx index 22b38a0..6984d54 100644 --- a/source/funkin/backend/FunkinSprite.hx +++ b/source/funkin/backend/FunkinSprite.hx @@ -69,6 +69,7 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact anim.onFrame.add((number:Int, anim:String) -> onAnimationFrame.dispatch(number, anim)); anim.onComplete.add((anim:String) -> onAnimationComplete.dispatch(anim)); anim.onLoop.add((anim:String) -> onAnimationLoop.dispatch(anim)); + anim.attachedFunk = this; } public override function destroy() { anim = FlxDestroyUtil.destroy(anim); @@ -196,7 +197,6 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact animationList.clear(); _loadedAtlases.resize(0); anim.isAnimate = false; - anim.attachedFunk = null; anim.attachedAnimate = null; } public function unloadAnimate() { @@ -232,7 +232,6 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact case PACKER: Paths.packerAtlas(path, library); default: Paths.sparrowAtlas(path, library); } - anim.attachedFunk = this; this.renderType = renderType; return this; } @@ -645,10 +644,11 @@ class FunkinSpriteAnimHandler implements IFlxDestroyable { if (frameIndices == null || frameIndices.length == 0) { spriteC.addByPrefix(name, prefix, fps, loop, flipX, flipY); } else { - if (prefix == null) + if (prefix == null) { spriteC.add(name, frameIndices, fps, loop, flipX, flipY); - else + } else { spriteC.addByIndices(name, prefix, frameIndices, '', fps, loop, flipX, flipY); + } } return spriteC.exists(name); diff --git a/source/funkin/backend/FunkinSpriteGroup.hx b/source/funkin/backend/FunkinSpriteGroup.hx index 76b0438..8436782 100644 --- a/source/funkin/backend/FunkinSpriteGroup.hx +++ b/source/funkin/backend/FunkinSpriteGroup.hx @@ -63,6 +63,18 @@ class FunkinTypedSpriteGroup implements ISpriteVars implements IZoo } return obj; } + public inline function moveToTop(sprite:T):T { + if (!members.contains(sprite)) return add(sprite); + members.remove(sprite); + members.push(sprite); + return sprite; + } + public inline function moveToBottom(sprite:T):T { + if (!members.contains(sprite)) return insert(0, sprite); + members.remove(sprite); + members.unshift(sprite); + return sprite; + } override function preAdd(sprite:T):Void { super.preAdd(sprite); diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index 25fa10a..70d74be 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -18,6 +18,7 @@ using StringTools; public var receptor:Receptor; public var strumline:Strumline; public var animSuffix:String = ''; + public var songPosition:Float = 0; public var spark:NoteSpark = null; public var splash:NoteSplash = null; @@ -39,9 +40,7 @@ using StringTools; var inGame:Bool = false; public function cancel() cancelled = true; - public function dispatch() { // hahaaa - if (cancelled) return; - + public inline function setup() { inGame = Std.isOfType(FlxG.state, PlayState); if (inGame) { game = cast FlxG.state; @@ -50,6 +49,9 @@ using StringTools; targetCharacter ??= lane.character; singAnimation ??= lane.getSingAnimation(); + } + public function dispatch() { // hahaaa + if (cancelled) return; switch (type) { case HIT: @@ -60,26 +62,27 @@ using StringTools; targetCharacter.held = true; } - note.hitTime = note.holdTime = lane.conductorInUse.songPosition; + note.hitTime = note.holdTime = songPosition; if (playSound) game.hitsound.play(true); if (applyRating) { applyExtraWindow(6); - scoring ??= scoreHandler?.judgeNoteHit(note, (lane.cpu ? 0 : note.msTime - lane.conductorInUse.songPosition)); + scoring ??= scoreHandler?.judgeNoteHit(note, note.msTime - songPosition); - if (popRating) { - var rating:FunkinSprite = game.popRating('gameplay/funkin/${scoring.rating}'); - rating.velocity.y = -FlxG.random.int(140, 175); - rating.velocity.x = FlxG.random.int(0, 10); - rating.acceleration.y = 550; - } - - if (inGame) + if (inGame) { + if (popRating) { + var rating:FunkinSprite = game.popRating('gameplay/funkin/${scoring.rating}'); + rating.velocity.y = -FlxG.random.int(140, 175); + rating.velocity.x = FlxG.random.int(0, 10); + rating.acceleration.y = 550; + } + game.health += note.healthGain * scoring.healthMod; + } - applyScore(scoreHandler, scoring); + applyScore(scoreHandler, scoring, game); note.score = scoring; } @@ -106,9 +109,9 @@ using StringTools; lane.pressed = true; if (note != null) { - lane.hitNote(note); + lane.hitNote(note, true, songPosition); } else { - lane.ghostTapped(); + lane.ghostTapped(songPosition); } case HELD | RELEASED: final released:Bool = (type == RELEASED); @@ -136,15 +139,15 @@ using StringTools; } var perfectRelease:Bool = true; - final songPos:Float = lane.conductorInUse.songPosition; + final songPos:Float = songPosition; - perfect = (released && (lane.cpu || songPos >= note.endMs - Scoring.holdLeniencyMS)); + perfect = (released && songPos >= note.endMs - Scoring.holdLeniencyMS); if (applyRating) { perfectRelease = perfect; var prevHitTime:Float; - if (!note.held && (lane.cpu || note.holdTime <= note.msTime + Scoring.holdLeniencyMS)) { + if (!note.held && note.holdTime <= note.msTime + Scoring.holdLeniencyMS) { prevHitTime = note.msTime; } else { prevHitTime = Math.max(note.holdTime, note.msTime); @@ -166,7 +169,7 @@ using StringTools; if (inGame) game.health += (scoring.healthMod ?? 1) * note.healthGainPerSecond; - applyScore(scoreHandler, scoring); + applyScore(scoreHandler, scoring, game); if (!released) note.held = true; @@ -185,13 +188,8 @@ using StringTools; if (lane.heldNote == note) { lane.held = false; lane.heldNote = null; - if (animateReceptor) { - if (lane.cpu || !note.held) { - lane.receptor.playAnimation('static'); - } else { - lane.receptor.playAnimation('press'); - } - } + if (animateReceptor) + lane.receptor.playAnimation(lane.cpu ? 'static' : 'press'); } if (perfectRelease) { @@ -230,7 +228,7 @@ using StringTools; game.health += (scoring.healthMod ?? -.01); } - applyScore(scoreHandler, scoring); + applyScore(scoreHandler, scoring, game); case LOST: if (inGame && game.genericVocals != null) game.genericVocals.volume = 0; @@ -247,43 +245,40 @@ using StringTools; if (applyRating) { scoring ??= scoreHandler?.judgeNoteMiss(note); - if (popRating && inGame) { - var rating:FunkinSprite = game.popRating('gameplay/funkin/sadmiss'); - rating.velocity.y = -FlxG.random.int(80, 95); - rating.velocity.x = FlxG.random.int(-6, 6); - rating.acceleration.y = 240; - } - - if (inGame) + if (inGame) { + if (popRating) { + var rating:FunkinSprite = game.popRating('gameplay/funkin/sadmiss'); + rating.velocity.y = -FlxG.random.int(80, 95); + rating.velocity.x = FlxG.random.int(-6, 6); + rating.acceleration.y = 240; + } + game.health -= note.healthLoss * (scoring.healthMod ?? 1); + } - applyScore(scoreHandler, scoring); + applyScore(scoreHandler, scoring, game); } default: } } - function applyScore(handler:ScoreHandler, score:Score) { + inline function applyScore(handler:ScoreHandler, score:Score, playState:PlayState) { if (handler == null || score == null || !applyRating) return; - if (inGame) { - game.totalNotes += score.hits + score.misses; - game.totalHits += score.hits; + if (playState != null) { + playState.totalNotes += score.hits + score.misses; + playState.totalHits += score.hits; } handler.applyScore(score); - - if (inGame) - game.updateScoreText(); + playState?.updateScoreText(); } - function applyExtraWindow(window:Float) { - @:privateAccess { - var extraWin:Float = Math.min(lane.extraWindow + window, 200); - if (strumline != null) { - for (lane in strumline.lanes) - lane.extraWindow = extraWin; - } else { + inline function applyExtraWindow(window:Float) { + var extraWin:Float = Math.min(lane.extraWindow + window, 200); + if (strumline != null) { + for (lane in strumline.lanes) lane.extraWindow = extraWin; - } + } else { + lane.extraWindow = extraWin; } } } diff --git a/source/funkin/backend/play/NoteStyle.hx b/source/funkin/backend/play/NoteStyle.hx index 1073836..d3c151a 100644 --- a/source/funkin/backend/play/NoteStyle.hx +++ b/source/funkin/backend/play/NoteStyle.hx @@ -47,6 +47,15 @@ class NoteStyle { return null; } + public static function getPath(?style:NoteStyleAsset):String { + if (Std.isOfType(style, NoteStyle)) { + return cast(style, NoteStyle).path; + } else if (Std.isOfType(style, String)) { + return cast(style, String); + } else { + return ''; + } + } public function new(path:String) { this.path = path; diff --git a/source/funkin/backend/play/SongEvent.hx b/source/funkin/backend/play/SongEvent.hx index 7fdd8ef..ed62f85 100644 --- a/source/funkin/backend/play/SongEvent.hx +++ b/source/funkin/backend/play/SongEvent.hx @@ -253,7 +253,11 @@ class PlayStateEventHandler { if (Std.isOfType(focus, CharacterGroup)) { var chara:CharacterGroup = cast focus; if (chara.animationExists(anim)) { - chara.playAnimationSpecial(anim, forced); + if (forced) { + chara.playAnimationSpecial(anim, true); + } else { + chara.playAnimation(anim, true); + } chara.timeAnimSteps(); } } else if (Std.isOfType(focus, FunkinSprite)) { diff --git a/source/funkin/backend/scripting/HScript.hx b/source/funkin/backend/scripting/HScript.hx index 7da803e..cc3b131 100644 --- a/source/funkin/backend/scripting/HScript.hx +++ b/source/funkin/backend/scripting/HScript.hx @@ -71,7 +71,9 @@ class HScript extends Iris { 'FlxAxes' => HScriptFlxAxes, 'FlxColor' => HScriptFlxColor, 'BlendMode' => HScriptBlendMode, - 'RuntimeShader' => HScriptRuntimeShader + 'RuntimeShader' => HScriptRuntimeShader, + + 'experimentalVars' => true ]; public var interceptArray:Array = null; diff --git a/source/funkin/backend/scripting/HScripts.hx b/source/funkin/backend/scripting/HScripts.hx index d0d6fb7..8d05c4c 100644 --- a/source/funkin/backend/scripting/HScripts.hx +++ b/source/funkin/backend/scripting/HScripts.hx @@ -1,6 +1,7 @@ package funkin.backend.scripting; using StringTools; +using Lambda; typedef HScriptAsset = flixel.util.typeLimit.OneOfTwo; class HScripts { // todo: make this a flxtypedgroup? @@ -17,24 +18,18 @@ class HScripts { // todo: make this a flxtypedgroup? if (Std.isOfType(test, HScript)) { return activeScripts.contains(test) ? test : null; } else { - for (hscript in activeScripts) { - if (hscript.scriptName == test) - return hscript; - } - return null; + return activeScripts.find((hscript:HScript) -> hscript.scriptName == test); } } public function exists(test:HScriptAsset) return (find(test) != null); public function findFromSuffix(test:String) { - for (hscript in activeScripts) { - if (hscript.scriptName.endsWith(test)) return hscript; - } - return null; + return activeScripts.find((hscript:HScript) -> hscript.scriptName.endsWith(test)); } public function add(hscript:HScript):Void { if (!activeScripts.contains(hscript)) activeScripts.push(hscript); } - public function destroy(hscript:HScript):Void { + public function destroy(?hscript:HScript):Void { + if (hscript == null) return; if (activeScripts.contains(hscript)) activeScripts.remove(hscript); hscript.destroy(); @@ -97,13 +92,13 @@ class HScripts { // todo: make this a flxtypedgroup? return null; } } - public function loadFromFile(file:String, unique:Bool = false):Null { - if (exists(file) && !unique) { + public function loadFromFile(file:String, unique:Bool = false, ?newName:String):Null { + if (exists(newName ?? file) && !unique) { Log.warning('hscript @ "$file" is already active!'); return find(file); } - - var name:String = getScriptName(file, unique, true); + + var name:String = getScriptName(newName ?? file, unique, true); var code:String; if (FileSystem.exists(file)) { code = File.getContent(file); @@ -111,7 +106,7 @@ class HScripts { // todo: make this a flxtypedgroup? Log.error('hscript @ "$file" wasn\'t found...'); code = ''; } - + var hs:HScript = new HScript(name, code, interceptArray, defaultVars); if (hs.compiled) { Log.info('hscript @ "$file" loaded successfully!'); diff --git a/source/funkin/backend/scripting/ModInterp.hx b/source/funkin/backend/scripting/ModInterp.hx index 3e70fa7..a7f7e21 100644 --- a/source/funkin/backend/scripting/ModInterp.hx +++ b/source/funkin/backend/scripting/ModInterp.hx @@ -4,6 +4,8 @@ import crowplexus.iris.Iris; import crowplexus.hscript.Expr; import crowplexus.hscript.Tools; +import funkin.backend.FunkinSprite; + class ModInterp extends crowplexus.hscript.Interp { public var hscript:HScript; @@ -62,6 +64,14 @@ class ModInterp extends crowplexus.hscript.Interp { if (o == null) error(EInvalidAccess(f)); + if (variables.get('experimentalVars') == true) { + if (Std.isOfType(o, ISpriteVars)) { + var spr:ISpriteVars = cast o; + if (o.hasVar(f)) + return o.getVar(f); + } + } + #if hl if (Type.typeof(o) == Type.ValueType.TObject && Reflect.hasField(o, '__evalues__')) { // hashlink enums try { @@ -75,6 +85,7 @@ class ModInterp extends crowplexus.hscript.Interp { error(EInvalidAccess(f)); } #end + return Reflect.getProperty(o, f); } override function makeIterator(v:Dynamic):Iterator { diff --git a/source/funkin/objects/Character.hx b/source/funkin/objects/Character.hx index e6f7f7e..8b3e754 100644 --- a/source/funkin/objects/Character.hx +++ b/source/funkin/objects/Character.hx @@ -89,7 +89,7 @@ class Character extends FunkinSprite implements ICharacter { public function startScripts() { var scriptPath:String = Paths.getPath('scripts/characters/$loadedCharacter.hx'); if (scriptPath != null) - hscripts.loadFromFile(scriptPath); + hscripts.loadFromFile(scriptPath, '($loadedCharacter) Character Script'); } public static function getPathSuffix(basePath:String = '', baseSuffix:String = '', chara:String = ''):String { diff --git a/source/funkin/objects/HealthIcon.hx b/source/funkin/objects/HealthIcon.hx index d76ac0f..9b10873 100644 --- a/source/funkin/objects/HealthIcon.hx +++ b/source/funkin/objects/HealthIcon.hx @@ -60,7 +60,9 @@ class HealthIcon extends FunkinSprite { } function set_state(newState:IconState):IconState { if (state == newState) return newState; + updateIconState(newState); + return state = newState; } function set_iconData(?newIcon:ModernCharacterHealthIconData):ModernCharacterHealthIconData { @@ -68,6 +70,7 @@ class HealthIcon extends FunkinSprite { if (iconData == newIcon) return newIcon; + resetData(); name = newIcon.id; loadGraphic(Paths.image('icons/$name') ?? Paths.image('icons/icon-$name') ?? Paths.image('icons/face')); var wFrameRatio:Int = Math.round(width / height); @@ -95,6 +98,7 @@ class HealthIcon extends FunkinSprite { spriteOffset.set(); } + state = NEUTRAL; updateIconState(state); return iconData = newIcon; diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index dd91bc5..a4759ec 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -45,7 +45,7 @@ class Lane extends FunkinSpriteGroup { public var allowInput:Bool = true; public var inputFilter:Note -> Bool; public var noteEvent:FlxTypedSignal Void> = new FlxTypedSignal(); - var extraWindow:Float = 0; // antimash mechanic + public var extraWindow:Float = 0; // antimash mechanic public var receptor:Receptor; public var notes:FunkinTypedSpriteGroup; @@ -59,15 +59,20 @@ class Lane extends FunkinSpriteGroup { public var selfDraw:Bool = false; public var topMembers:Array = []; - public function set_scrollSpeed(newSpeed:Float) { + public var songPosition(get, never):Float; + + function set_scrollSpeed(newSpeed:Float) { return scrollSpeed = newSpeed; } - public function set_cpu(isCpu:Bool) { + function set_cpu(isCpu:Bool) { if (cpu == isCpu) return isCpu; if (receptor != null) receptor.autoReset = isCpu; return cpu = isCpu; } + inline function get_songPosition():Float { + return conductorInUse.songPosition; + } public function new(x:Float, y:Float, data:Int, dir:Float = 90, speed:Float = 1, ?style:NoteStyleAsset = 'funkin') { super(x, y); @@ -196,10 +201,10 @@ class Lane extends FunkinSpriteGroup { } return true; } - public function ghostTapped() - _noteEvent(basicEvent(GHOST)); - public function basicEvent(type:NoteEventType, ?note:Note):NoteEvent - return {lane: this, strumline: strumline, receptor: receptor, note: note, type: type}; + public function ghostTapped(?position:Float) + _noteEvent(basicEvent(GHOST, null, position)); + public function basicEvent(type:NoteEventType, ?note:Note, ?position:Float):NoteEvent + return {lane: this, strumline: strumline, receptor: receptor, note: note, type: type, songPosition: position ?? songPosition}; function _noteEvent(event:NoteEvent) { strumline?.noteEvent.dispatch(event); noteEvent.dispatch(event); @@ -213,10 +218,8 @@ class Lane extends FunkinSpriteGroup { if (!valid) continue; - if (hittableOnly) { - if (hittableOnly && (!note.canHit || note.goodHit)) - continue; - } + if (hittableOnly && (!note.canHit || note.goodHit)) + continue; if (highNote == null || (note.hitPriority > highNote.hitPriority || (note.hitPriority == highNote.hitPriority && note.msTime < highNote.msTime))) highNote = note; } @@ -244,21 +247,25 @@ class Lane extends FunkinSpriteGroup { public function splash(?note:Note):NoteSplash { var splash:NoteSplash = noteSplashes.recycle(NoteSplash, () -> new NoteSplash(noteData, style), true); - preAdd(splash); + + noteSplashes.moveToTop(splash); splash.style = note?.style ?? style; splash.popOnReceptor(receptor); splash.alpha = alpha * splash.defaultAlpha; splash.scale.set(scale.x * splash.defaultScale, scale.y * splash.defaultScale); + return splash; } public function popCover(?note:Note):NoteSpark { var spark:NoteSpark = noteSparks.recycle(NoteSpark, () -> new NoteSpark(noteData, style), true); - preAdd(spark); + + noteSparks.moveToTop(spark); spark.style = note?.style ?? style; spark.heldNote = note; spark.popOnReceptor(receptor); spark.alpha = alpha * spark.defaultAlpha; spark.scale.set(scale.x * spark.defaultScale, scale.y * spark.defaultScale); + return spark; } public function spark(?note:Note, animate:Bool = true):NoteSpark { @@ -314,19 +321,21 @@ class Lane extends FunkinSpriteGroup { return; var killingNote:Bool = false; - var songPos:Float = conductorInUse.songPosition; - if ((cpu || (held && note.goodHit)) && songPos >= note.msTime && !note.lost && note.canHit) { + if ((cpu || (held && note.goodHit)) && songPosition >= note.msTime && !note.lost && note.canHit) { if (!note.goodHit) - _noteEvent(basicEvent(PRESSED, note)); + _noteEvent(basicEvent(PRESSED, note, cpu ? note.msTime : songPosition)); - if (songPos >= note.endMs) + if (songPosition >= note.endMs) note.consumed = killingNote = true; _noteEvent(basicEvent(HELD, note)); if (killingNote) { - _noteEvent(basicEvent(RELEASED, note)); - if (cpu) _noteEvent(basicEvent(RELEASED)); + var releaseTime:Null = (cpu ? note.endMs : songPosition); + + _noteEvent(basicEvent(RELEASED, note, releaseTime)); + if (cpu) _noteEvent(basicEvent(RELEASED, null, releaseTime)); + killNote(note); return; } @@ -334,16 +343,16 @@ class Lane extends FunkinSpriteGroup { var canDespawn:Bool = !note.preventDespawn; if (note.lost || note.goodHit) { - if (canDespawn && (note.endMs - conductorInUse.songPosition) < -spawnRadius) + if (canDespawn && (note.endMs - songPosition) < -spawnRadius) killNote(note, !oneWay); } else { - if (conductorInUse.songPosition - hitWindow > note.msTime) { + if (songPosition - hitWindow > note.msTime) { note.lost = true; _noteEvent(basicEvent(LOST, note)); } } - if (!oneWay && (note.msTime - conductorInUse.songPosition) > spawnRadius) + if (!oneWay && (note.msTime - songPosition) > spawnRadius) killNote(note, true); } public function findNoteByChartNote(songNote:ChartNote):Note { @@ -356,10 +365,10 @@ class Lane extends FunkinSpriteGroup { return Type.createInstance(cls ?? noteClass, [songNote, conductorInUse]); } } - public function insertNote(songNote:ChartNote, pos:Int = 0):Note { + public function insertNote(songNote:ChartNote):Note { var note:Note = generateNote(noteClass, songNote); + notes.moveToBottom(note); - preAdd(note); note.lane = this; note.chartNote = songNote; note.hitWindow = hitWindow; @@ -368,16 +377,15 @@ class Lane extends FunkinSpriteGroup { note.scale.set(scale.x * note.defaultScale, scale.y * note.defaultScale); note.updateHitbox(); - notes.insert(pos, note); _noteEvent(basicEvent(SPAWNED, note)); updateNote(note); return note; } - public dynamic function hitNote(note:Note, kill:Bool = true) { + public dynamic function hitNote(note:Note, kill:Bool = true, ?position:Float) { note.goodHit = true; - var event:NoteEvent = basicEvent(HIT, note); + var event:NoteEvent = basicEvent(HIT, note, position); _noteEvent(event); if (kill && !note.isHoldNote && !note.ignore && !event.cancelled) diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index bf9fa9c..5becd00 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -299,8 +299,8 @@ class Note extends FunkinSprite { angle = lane.receptor.angle; if (isHoldNote && tail != null) { - tail.scale.x = scale.x * tail.defaultScale; - tail.scale.y = FlxMath.signOf(speed) * Math.abs(scale.x) * tail.defaultScale; + tail.scale.x = scale.x / defaultScale * tail.defaultScale; + tail.scale.y = FlxMath.signOf(speed) * Math.abs(scale.x) / defaultScale * tail.defaultScale; tail.updateHitbox(); tail.offset.y = 0; diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index a47b0dd..f03000d 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -89,7 +89,28 @@ class PlayState extends FunkinState { public var songStarted:Bool = false; public var songFinished:Bool = false; - public var noteStyle:NoteStyleAsset; + public var noteStyle(default, set):NoteStyleAsset; + + function set_noteStyle(newStyle:NoteStyleAsset):NoteStyleAsset { + if (noteStyle == newStyle) return newStyle; + + var stylePath:String = NoteStyle.getPath(noteStyle); + hscripts.destroy(hscripts.find('Note Style Script ($stylePath)')); + + bootStyleScript(newStyle, 'notes'); + + for (strumline in strumlineGroup) + strumline.loadStyle(newStyle); + + return noteStyle = newStyle; + } + function bootStyleScript(style:NoteStyleAsset, folder:String = 'notes') { + var stylePath:String = NoteStyle.getPath(style); + var styleScriptPath:Null = Paths.getPath('scripts/styles/$folder/$stylePath.hx'); + + if (styleScriptPath != null) + hscripts.loadFromFile(styleScriptPath, '($stylePath) Note Style Script'); + } public function new(chart:Chart, simple:Bool = false) { PlayState.chart = chart ?? PlayState.chart ?? new Chart(''); @@ -160,12 +181,14 @@ class PlayState extends FunkinState { var strumlineBound:Float = (FlxG.width - 300) * .5; var strumlineY:Float = 50; - noteStyle = chart.noteStyle; - + var chartStyle:String = chart.noteStyle; var mania:String = '${chart.keyCount}k'; keybinds = Options.data.keybinds[mania] ?? Options.data.keybinds['4k']; - if (NoteStyle.exists('$noteStyle-$mania')) - noteStyle = '$noteStyle-$mania'; + if (NoteStyle.exists('$chartStyle-$mania')) { + noteStyle = '$chartStyle-$mania'; + } else { + noteStyle = chartStyle; + } opponentStrumline = new Strumline(chart.keyCount, 90, chart.scrollSpeed); opponentStrumline.noteEvent.add(opponentNoteEvent); @@ -213,8 +236,9 @@ class PlayState extends FunkinState { } } - opponentStrumline.loadStyle(noteStyle); - playerStrumline.loadStyle(noteStyle); + for (strumline in strumlineGroup) + strumline.loadStyle(noteStyle); + opponentStrumline.fitToSize(strumlineBound, opponentStrumline.height * .7); playerStrumline.fitToSize(strumlineBound, playerStrumline.height * .7); opponentStrumline.setPosition(50, strumlineY); @@ -758,6 +782,8 @@ class PlayState extends FunkinState { } public function playerNoteEvent(e:NoteEvent) { + e.setup(); + e.doSplash = true; e.doSpark = true; @@ -771,6 +797,8 @@ class PlayState extends FunkinState { dispatchPlayEvent('playerNoteEvent', e); } public function opponentNoteEvent(e:NoteEvent) { + e.setup(); + e.applyRating = false; e.playSound = false; e.doSplash = false; @@ -803,16 +831,16 @@ class PlayState extends FunkinState { if (!ratingGroup.alive) return rating; + rating.alpha = 1; rating.loadTexture(ratingString); rating.scale.set(scale, scale); rating.setPosition(ratingGroup.x, ratingGroup.y); rating.offset.set(rating.frameWidth * .5, rating.frameHeight * .5); rating.revive(); - FlxTween.tween(rating, {alpha: 0}, .2, {onComplete: (tween:FlxTween) -> { - ratingGroup.remove(rating, true); - rating.kill(); - }, startDelay: conductorInUse.crochet * .001 * beats}); + ratingGroup.moveToTop(rating); + FlxTween.cancelTweensOf(rating); + FlxTween.tween(rating, {alpha: 0}, .2, {onComplete: (_) -> rating.kill(), startDelay: conductorInUse.crochet * .001 * beats}); return rating; } From bcf0d6e767e3a68a790ddba34d4369919b6d3125 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 6 Apr 2025 10:46:48 -0600 Subject: [PATCH 22/73] spritegroup improvement(kinda), etc - Chart.getStrumlineCount (to get inferred count of strumlines in a chart) --- source/funkin/backend/FunkinSpriteGroup.hx | 82 +++++++++++++++++++++- source/funkin/backend/play/Chart.hx | 8 +++ source/funkin/objects/play/Lane.hx | 8 +-- source/funkin/objects/play/Strumline.hx | 74 ++++++++++--------- source/funkin/states/CrashState.hx | 2 +- 5 files changed, 133 insertions(+), 41 deletions(-) diff --git a/source/funkin/backend/FunkinSpriteGroup.hx b/source/funkin/backend/FunkinSpriteGroup.hx index 8436782..babca11 100644 --- a/source/funkin/backend/FunkinSpriteGroup.hx +++ b/source/funkin/backend/FunkinSpriteGroup.hx @@ -5,7 +5,7 @@ import funkin.backend.FunkinSprite; import haxe.iterators.ArrayKeyValueIterator; typedef FunkinSpriteGroup = FunkinTypedSpriteGroup; -class FunkinTypedSpriteGroup implements ISpriteVars implements IZoomFactor extends FlxTypedSpriteGroup { +class FunkinTypedSpriteGroup implements ISpriteGroup implements ISpriteVars implements IZoomFactor extends FlxTypedSpriteGroup { public var zoomFactor(default, set):Float = 1; public var initialZoom(default, set):Float = 1; public var extraData:Map = new Map(); @@ -103,4 +103,84 @@ class FunkinTypedSpriteGroup implements ISpriteVars implements IZoo } public inline function keyValueIterator():ArrayKeyValueIterator { return new ArrayKeyValueIterator(members); } + + override function findMinXHelper():Float { + var value = Math.POSITIVE_INFINITY; + for (member in group.members) { + if (member == null) continue; + + var minX:Float; + if (Std.isOfType(member, ISpriteGroup)) { + minX = cast(member, ISpriteGroup).findMinX(); + } else if (member.flixelType == SPRITEGROUP) { + minX = (cast member:FlxSpriteGroup).findMinX(); + } else { + minX = member.x; + } + + if (minX < value) value = minX; + } + return value; + } + override function findMaxXHelper():Float { + var value = Math.NEGATIVE_INFINITY; + for (member in group.members) { + if (member == null) continue; + + var maxX:Float; + if (Std.isOfType(member, ISpriteGroup)) { + maxX = cast(member, ISpriteGroup).findMaxX(); + } else if (member.flixelType == SPRITEGROUP) { + maxX = (cast member:FlxSpriteGroup).findMaxX(); + } else { + maxX = member.x + member.width; + } + + if (maxX > value) value = maxX; + } + return value; + } + override function findMinYHelper():Float { + var value = Math.POSITIVE_INFINITY; + for (member in group.members) { + if (member == null) continue; + + var minY:Float; + if (Std.isOfType(member, ISpriteGroup) || Std.isOfType(member, FlxSpriteGroup)) { + minY = cast(member, ISpriteGroup).findMinY(); + } else if (member.flixelType == SPRITEGROUP) { + minY = (cast member:FlxSpriteGroup).findMinY(); + } else { + minY = member.y; + } + + if (minY < value) value = minY; + } + return value; + } + override function findMaxYHelper():Float { + var value = Math.NEGATIVE_INFINITY; + for (member in group.members) { + if (member == null) continue; + + var maxY:Float; + if (Std.isOfType(member, ISpriteGroup) || Std.isOfType(member, FlxSpriteGroup)) { + maxY = cast(member, ISpriteGroup).findMaxY(); + } else if (member.flixelType == SPRITEGROUP) { + maxY = (cast member:FlxSpriteGroup).findMaxY(); + } else { + maxY = member.y + member.height; + } + + if (maxY > value) value = maxY; + } + return value; + } +} + +interface ISpriteGroup { + function findMinX():Float; + function findMaxX():Float; + function findMinY():Float; + function findMaxY():Float; } \ No newline at end of file diff --git a/source/funkin/backend/play/Chart.hx b/source/funkin/backend/play/Chart.hx index 893da11..51e8c2c 100644 --- a/source/funkin/backend/play/Chart.hx +++ b/source/funkin/backend/play/Chart.hx @@ -160,6 +160,14 @@ class Chart { this.clearStackedNotes(); return this; } + public function getStrumlineCount():Int { + var strumlines:Int = 2; + for (note in notes) { + if (strumlines < note.strumlineIndex) + strumlines = note.strumlineIndex; + } + return strumlines; + } public function findSongLength() { if (instLoaded) { this.songLength = inst.length; diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index a4759ec..fdac785 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -429,10 +429,10 @@ class Lane extends FunkinSpriteGroup { return NoteStyle.getDirectionColors(style, dir ?? noteData); } - override function get_width() - return receptor?.width ?? 0; - override function get_height() - return receptor?.height ?? 0; + override function findMinXHelper():Float { return receptor.x; } + override function findMaxXHelper():Float { return receptor.x + receptor.width; } + override function findMinYHelper():Float { return receptor.y; } + override function findMaxYHelper():Float { return receptor.y + receptor.height; } override function set_zoomFactor(value:Float):Float { super.set_zoomFactor(value); diff --git a/source/funkin/objects/play/Strumline.hx b/source/funkin/objects/play/Strumline.hx index 9e294b4..48fbfb3 100644 --- a/source/funkin/objects/play/Strumline.hx +++ b/source/funkin/objects/play/Strumline.hx @@ -72,45 +72,51 @@ class Strumline extends FunkinSpriteGroup { return laneCount = newCount; } - //getters - function get_leftBound() { - var minX:Float = Math.POSITIVE_INFINITY; - for (lane in lanes) minX = Math.min(minX, lane.receptor.x); - return minX; - } - function get_rightBound() { - var maxX:Float = Math.NEGATIVE_INFINITY; - for (lane in lanes) maxX = Math.max(maxX, lane.receptor.x + lane.receptor.width); - return maxX; - } - function get_topBound() { - var minY:Float = Math.POSITIVE_INFINITY; - for (lane in lanes) minY = Math.min(minY, lane.receptor.y); - return minY; + //more getters + function get_leftBound() { return findMinXHelper(); } + function get_rightBound() { return findMaxXHelper(); } + function get_topBound() { return findMinYHelper(); } + function get_bottomBound() { return findMaxYHelper(); } + function get_strumlineWidth() { return width; } + function get_strumlineHeight() { return height; } + + override function findMinX():Float { return (lanes.length > 0 ? findMinXHelper() : x); } + override function findMaxX():Float { return (lanes.length > 0 ? findMaxXHelper() : x); } + override function findMinY():Float { return (lanes.length > 0 ? findMinYHelper() : y); } + override function findMaxY():Float { return (lanes.length > 0 ? findMaxYHelper() : y); } + override function findMinXHelper():Float { + var value:Float = Math.POSITIVE_INFINITY; + for (lane in lanes) { + var minX:Float = lane.receptor.x; + if (minX < value) value = minX; + } + return value; } - function get_bottomBound() { - var maxY:Float = Math.NEGATIVE_INFINITY; - for (lane in lanes) maxY = Math.max(maxY, lane.receptor.y + lane.receptor.height); - return maxY; + override function findMaxXHelper():Float { + var value:Float = Math.NEGATIVE_INFINITY; + for (lane in lanes) { + var maxX:Float = lane.receptor.x + lane.receptor.width; + if (maxX > value) value = maxX; + } + return value; } - function get_strumlineWidth() { - var minX:Float = Math.POSITIVE_INFINITY; - var maxX:Float = Math.NEGATIVE_INFINITY; + override function findMinYHelper():Float { + var value:Float = Math.POSITIVE_INFINITY; for (lane in lanes) { - minX = Math.min(minX, lane.receptor.x); - maxX = Math.max(maxX, lane.receptor.x + lane.receptor.width); + var minY:Float = lane.receptor.y; + if (minY < value) value = minY; } - return (maxX - minX); + return value; } - function get_strumlineHeight() { - var minY:Float = Math.POSITIVE_INFINITY; - var maxY:Float = Math.NEGATIVE_INFINITY; + override function findMaxYHelper():Float { + var value:Float = Math.NEGATIVE_INFINITY; for (lane in lanes) { - minY = Math.min(minY, lane.receptor.y); - maxY = Math.max(maxY, lane.receptor.y + lane.receptor.height); + var maxY:Float = lane.receptor.y + lane.receptor.height; + if (maxY > value) value = maxY; } - return (maxY - minY); + return value; } + function get_receptorWidth() { var width:Float = 0; for (lane in lanes) width = Math.max(width, lane.receptor.width); @@ -121,22 +127,20 @@ class Strumline extends FunkinSpriteGroup { for (lane in lanes) height = Math.max(height, lane.receptor.height); return height; } - public override function get_width() return strumlineWidth; - public override function get_height() return strumlineHeight; public function new(laneCount:Int = 4, direction:Float = 90, scrollSpeed:Float = 1, ?style:NoteStyleAsset = 'funkin', ?noteClass:Class) { super(); this.lanes = new FunkinTypedSpriteGroup(); this.add(lanes); - style = NoteStyle.fetch(style); - this.allowInput = true; this.direction = direction; this.scrollSpeed = scrollSpeed; this.noteClass = noteClass ?? Note; this.laneCount = laneCount; + + this.style = NoteStyle.fetch(style); } public function loadStyle(newStyle:NoteStyleAsset) { var style:NoteStyle = NoteStyle.fetch(newStyle); diff --git a/source/funkin/states/CrashState.hx b/source/funkin/states/CrashState.hx index 7d283f6..415b547 100644 --- a/source/funkin/states/CrashState.hx +++ b/source/funkin/states/CrashState.hx @@ -30,7 +30,7 @@ class CrashState extends FlxState { super.create(); - FlxG.sound.music.stop(); + FlxG.sound.music?.stop(); Main.instance.removeChild(Main.debugDisplay); function loadCrashAsset(sprite:FunkinSprite, ?stack:Array) { From 298b0aac8f66086884f82f900d2a0415db98cf9b Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 20 Apr 2025 21:49:52 -0600 Subject: [PATCH 23/73] MORE big things + (HEAVY WIP) charter state rewrite progress + swaying characters speed can now also be changed with bopFrequency + optional arguments in hscript no longer require a ? question mark if they have a default value assigned - func(param = defValue) instead of func(?param = defValue) + improved Lane notestyle reloading, added customizable spawn limit (how many notes can be spawned at once per lane) and compute limit (how many notes can be processed per update) to reduce lags * improved notestyle script behavior * memory counter in cpp is hopefully more accurate * fixed an error in sprite groups (dumb cast issue) * stacked notes wont be cleared if chart goes past a threshold (10k notes) to prevent freezing * fix formatting in Stage, load fallback if json doesnt exist regardless of script existing * Strumline and Lane.forEachActiveNote (loops through currently spawned notes) * character scripts are ran after added to character group for more consistent behavior * set_curFrameFloat in funkin sprite anim controller is actually limited to the last frame * other fixes and tweaks --- source/funkin/backend/FunkinSprite.hx | 22 +- source/funkin/backend/FunkinSpriteGroup.hx | 4 +- source/funkin/backend/play/Chart.hx | 7 +- source/funkin/backend/scripting/HScript.hx | 28 +- source/funkin/backend/scripting/HScripts.hx | 39 +- source/funkin/backend/scripting/ModInterp.hx | 79 +- source/funkin/backend/scripting/ModParser.hx | 58 + source/funkin/debug/DebugDisplay.hx | 10 +- source/funkin/objects/Character.hx | 19 +- source/funkin/objects/CharacterGroup.hx | 5 +- source/funkin/objects/Stage.hx | 76 +- source/funkin/objects/play/Lane.hx | 61 +- source/funkin/objects/play/Note.hx | 27 +- source/funkin/objects/play/Strumline.hx | 4 + source/funkin/states/CharterState.hx | 1463 ++--------------- source/funkin/states/CharterStateOld.hx | 1541 ++++++++++++++++++ source/funkin/states/FreeplaySubState.hx | 2 +- source/funkin/states/PlayState.hx | 19 +- 18 files changed, 1993 insertions(+), 1471 deletions(-) create mode 100644 source/funkin/backend/scripting/ModParser.hx create mode 100644 source/funkin/states/CharterStateOld.hx diff --git a/source/funkin/backend/FunkinSprite.hx b/source/funkin/backend/FunkinSprite.hx index 6984d54..b4318c4 100644 --- a/source/funkin/backend/FunkinSprite.hx +++ b/source/funkin/backend/FunkinSprite.hx @@ -507,7 +507,7 @@ class FunkinSpriteAnimHandler implements IFlxDestroyable { inline function get_finished():Bool { return (isAnimate ? animateC.finished : curAnim?.finished) ?? false; } inline function get_reversed():Bool { return (isAnimate ? animateC.reversed : curAnim?.reversed) ?? false; } inline function get_timeScale():Float { return (isAnimate ? animateC.timeScale : spriteC?.timeScale) ?? 1; } - inline function get_curFrameFloat():Float { + function get_curFrameFloat():Float { @:privateAccess { if (isAnimate) { if (animateC == null) return 0; @@ -519,18 +519,28 @@ class FunkinSpriteAnimHandler implements IFlxDestroyable { } } } - inline function set_curFrameFloat(newFrame:Float):Float { + function set_curFrameFloat(newFrame:Float):Float { function fract(n:Float):Float { return n - Math.floor(n); } @:privateAccess { if (isAnimate) { if (animateC == null) return newFrame; - animateC.curFrame = Math.floor(newFrame); - animateC._tick = animateC.frameDelay * fract(newFrame); + if (newFrame < animateC.length) { + animateC.curFrame = Math.floor(newFrame); + animateC._tick = animateC.frameDelay * fract(newFrame); + } else { + animateC.curFrame = animateC.length; + animateC._tick = animateC.frameDelay; + } } else { if (curAnim == null) return newFrame; - curAnim.curFrame = Math.floor(newFrame); - curAnim._frameTimer = curAnim.getCurrentFrameDuration() * fract(newFrame); + if (newFrame < curAnim.numFrames) { + curAnim.curFrame = Math.floor(newFrame); + curAnim._frameTimer = curAnim.getCurrentFrameDuration() * fract(newFrame); + } else { + curAnim.curFrame = curAnim.numFrames; + curAnim._frameTimer = curAnim.getCurrentFrameDuration(); + } } } return newFrame; diff --git a/source/funkin/backend/FunkinSpriteGroup.hx b/source/funkin/backend/FunkinSpriteGroup.hx index babca11..a89d990 100644 --- a/source/funkin/backend/FunkinSpriteGroup.hx +++ b/source/funkin/backend/FunkinSpriteGroup.hx @@ -146,7 +146,7 @@ class FunkinTypedSpriteGroup implements ISpriteGroup implements ISp if (member == null) continue; var minY:Float; - if (Std.isOfType(member, ISpriteGroup) || Std.isOfType(member, FlxSpriteGroup)) { + if (Std.isOfType(member, ISpriteGroup)) { minY = cast(member, ISpriteGroup).findMinY(); } else if (member.flixelType == SPRITEGROUP) { minY = (cast member:FlxSpriteGroup).findMinY(); @@ -164,7 +164,7 @@ class FunkinTypedSpriteGroup implements ISpriteGroup implements ISp if (member == null) continue; var maxY:Float; - if (Std.isOfType(member, ISpriteGroup) || Std.isOfType(member, FlxSpriteGroup)) { + if (Std.isOfType(member, ISpriteGroup)) { maxY = cast(member, ISpriteGroup).findMaxY(); } else if (member.flixelType == SPRITEGROUP) { maxY = (cast member:FlxSpriteGroup).findMaxY(); diff --git a/source/funkin/backend/play/Chart.hx b/source/funkin/backend/play/Chart.hx index 51e8c2c..ed149d6 100644 --- a/source/funkin/backend/play/Chart.hx +++ b/source/funkin/backend/play/Chart.hx @@ -177,7 +177,12 @@ class Chart { } return this.songLength; } - public function clearStackedNotes(minDifference:Float = 6) { + public function clearStackedNotes(minDifference:Float = 6, suicide:Bool = false) { + if (notes.length >= 10000 && !suicide) { + Log.warning('chart contains TOO MANY notes (${notes.length} / 10000), won\'t check for note stacking'); + return; + } + var previousNotes:Array> = []; var caught:Int = 0; var i:Int = notes.length; diff --git a/source/funkin/backend/scripting/HScript.hx b/source/funkin/backend/scripting/HScript.hx index cc3b131..4f3cbec 100644 --- a/source/funkin/backend/scripting/HScript.hx +++ b/source/funkin/backend/scripting/HScript.hx @@ -82,10 +82,12 @@ class HScript extends Iris { public var scriptString(default, set):String = ''; public var scriptPath:Null = null; public var scriptName:String = ''; + public var objExists:Bool = true; public var compiled:Bool = false; public var failed:Bool = false; public var active:Bool = true; var executed:Bool = false; + var modParser:ModParser; var modInterp:ModInterp; public static function init() { @@ -97,10 +99,13 @@ class HScript extends Iris { public function new(name:String, code:String, ?interceptArray:Array, ?defaultVars:Map) { super('', new IrisConfig(name, false, false, [])); + parser = modParser = new ModParser(); interp = modInterp = new ModInterp(); modInterp.hscript = this; preset(); + parser.allowTypes = parser.allowJSON = parser.allowMetadata = true; + this.interceptArray = interceptArray; this.defaultVars = defaultVars; @@ -139,8 +144,8 @@ class HScript extends Iris { Sys.println('$posPrefix $out'); } - public function run(?func:String, ?args:Array, safe:Bool = true):Any { - if (!compiled || failed || !active) return null; + public function run(?func:String, ?args:Array, safe:Bool = true, forceRun:Bool = false):Any { + if (!compiled || failed || (!active && !forceRun)) return null; try { if (func != null) { if (!executed) execute(); @@ -167,9 +172,24 @@ class HScript extends Iris { return null; } } + public function kill() { + if (active) { + run('kill', true, true); + active = false; + } + } + public function revive() { + if (!active) { + run('revive', true, true); + active = true; + } + } public override function destroy() { - run('destroy'); - super.destroy(); + if (objExists) { + run('destroy', true, true); + objExists = false; + super.destroy(); + } } public override function preset() { super.preset(); diff --git a/source/funkin/backend/scripting/HScripts.hx b/source/funkin/backend/scripting/HScripts.hx index 8d05c4c..32e5727 100644 --- a/source/funkin/backend/scripting/HScripts.hx +++ b/source/funkin/backend/scripting/HScripts.hx @@ -14,15 +14,17 @@ class HScripts { // todo: make this a flxtypedgroup? this.interceptArray = interceptArray; this.defaultVars = defaultVars; } - public function find(test:HScriptAsset) { + public function find(test:HScriptAsset):HScript { if (Std.isOfType(test, HScript)) { return activeScripts.contains(test) ? test : null; } else { return activeScripts.find((hscript:HScript) -> hscript.scriptName == test); } } - public function exists(test:HScriptAsset) return (find(test) != null); - public function findFromSuffix(test:String) { + public function exists(test:HScriptAsset):Bool { + return (find(test) != null); + } + public function findFromSuffix(test:String):HScript { return activeScripts.find((hscript:HScript) -> hscript.scriptName.endsWith(test)); } public function add(hscript:HScript):Void { @@ -34,14 +36,21 @@ class HScripts { // todo: make this a flxtypedgroup? activeScripts.remove(hscript); hscript.destroy(); } + public function kill():Void { + for (hscript in activeScripts) + hscript.kill(); + } + public function revive():Void { + for (hscript in activeScripts) + hscript.revive(); + } public function destroyAll():Void { while (activeScripts.length > 0) destroy(activeScripts[0]); } public function set(field:String, value:Any):Void { - for (hscript in activeScripts) { + for (hscript in activeScripts) hscript.set(field, value); - } } public function run(?name:String, ?args:Array):Any { var returnLocked:Bool = false; @@ -63,7 +72,7 @@ class HScripts { // todo: make this a flxtypedgroup? return returnValue; } - function getScriptName(name:String, unique:Bool = false, warn:Bool = false) { + function getScriptName(name:String, unique:Bool = false, warn:Bool = false):String { var found:HScript = find(name); if (found != null && unique) { var n:Int = 1; @@ -92,7 +101,7 @@ class HScripts { // todo: make this a flxtypedgroup? return null; } } - public function loadFromFile(file:String, unique:Bool = false, ?newName:String):Null { + public function loadFromFile(file:String, unique:Bool = false, ?newName:String, ?defaultVars:Map):Null { if (exists(newName ?? file) && !unique) { Log.warning('hscript @ "$file" is already active!'); return find(file); @@ -107,7 +116,13 @@ class HScripts { // todo: make this a flxtypedgroup? code = ''; } - var hs:HScript = new HScript(name, code, interceptArray, defaultVars); + var defaultestVars:Map = this.defaultVars; + if (defaultVars != null) { + defaultestVars = defaultVars.copy(); + for (k => v in this.defaultVars) + defaultestVars.set(k, v); + } + var hs:HScript = new HScript(name, code, interceptArray, defaultestVars); if (hs.compiled) { Log.info('hscript @ "$file" loaded successfully!'); hs.run('create'); @@ -118,7 +133,7 @@ class HScripts { // todo: make this a flxtypedgroup? return null; } } - public function loadFromFolder(path:String, allMods:Bool = false):Void { + public function loadFromFolder(path:String, allMods:Bool = false, ?defaultVars:Map):Void { var dirList:Array = [Paths.sharedPath(path), Paths.globalModPath(path)]; for (mod in Mods.getLocal(allMods)) { @@ -129,17 +144,17 @@ class HScripts { // todo: make this a flxtypedgroup? Log.minor('loading hscripts @ "$dir"'); for (file in FileSystem.readDirectory(dir)) { if (!file.endsWith('.hx')) continue; - loadFromFile('$dir/$file'); + loadFromFile('$dir/$file', defaultVars); } } } } - public function loadFromPaths(basePath:String, allMods:Bool = false, unique:Bool = false):Bool { + public function loadFromPaths(basePath:String, allMods:Bool = false, unique:Bool = false, ?defaultVars:Map):Bool { var found:Bool = false; for (path in Paths.getPaths(basePath, true, allMods)) { var scriptFile:String = path.path; if (exists(scriptFile) && !unique) continue; - loadFromFile(scriptFile, unique); + loadFromFile(scriptFile, unique, defaultVars); found = true; } return found; diff --git a/source/funkin/backend/scripting/ModInterp.hx b/source/funkin/backend/scripting/ModInterp.hx index a7f7e21..aa8257b 100644 --- a/source/funkin/backend/scripting/ModInterp.hx +++ b/source/funkin/backend/scripting/ModInterp.hx @@ -3,10 +3,11 @@ package funkin.backend.scripting; import crowplexus.iris.Iris; import crowplexus.hscript.Expr; import crowplexus.hscript.Tools; +import crowplexus.hscript.Interp; import funkin.backend.FunkinSprite; -class ModInterp extends crowplexus.hscript.Interp { +class ModInterp extends Interp { public var hscript:HScript; override function setVar(name:String, v:Dynamic) { @@ -168,6 +169,82 @@ class ModInterp extends crowplexus.hscript.Interp { switch (eDef) { case EImport(v, as): return doImport(v, as); + case EFunction(params, fexpr, name, _): + var capturedLocals = duplicate(locals); + var minParams:Int = 0; + var me = this; + for (p in params) { + if (!p.opt) + minParams ++; + } + + var f = function(args: Array) { + if (((args == null) ? 0 : args.length) != params.length) { + if (args.length < minParams) { + var str = "Invalid number of parameters. Got " + args.length + ", required " + minParams; + if (name != null) + str += " for function '" + name + "'"; + error(ECustom(str)); + } + // make sure mandatory args are forced + var args2 = []; + var extraParams = args.length - minParams; + var pos = 0; + for (p in params) { + if (p.opt) { + if (extraParams > 0) { + args2.push(args[pos++]); + extraParams--; + } else { + args2.push(expr(p.value)); + } + } else { + args2.push(args[pos++]); + } + } + args = args2; + } + var old = me.locals, depth = me.depth; + me.depth ++; + me.locals = me.duplicate(capturedLocals); + for (i in 0...params.length) + me.locals.set(params[i].name, {r: args[i], const: false}); + var r = null; + var oldDecl = declared.length; + if (inTry) + try { + r = me.exprReturn(fexpr); + } catch (e:Dynamic) { + me.locals = old; + me.depth = depth; + #if neko + neko.Lib.rethrow(e); + #else + throw e; + #end + } + else { + r = me.exprReturn(fexpr); + } + restore(oldDecl); + me.locals = old; + me.depth = depth; + return r; + }; + var f = Reflect.makeVarArgs(f); + if (name != null) { + if (depth == 0) { + // global function + variables.set(name, f); + } else { + // function-in-function is a local function + declared.push({n: name, old: locals.get(name)}); + var ref:LocalVar = {r: f, const: false}; + locals.set(name, ref); + capturedLocals.set(name, ref); // allow self-recursion + } + } + return f; default: } return super.expr(e); diff --git a/source/funkin/backend/scripting/ModParser.hx b/source/funkin/backend/scripting/ModParser.hx new file mode 100644 index 0000000..4636d13 --- /dev/null +++ b/source/funkin/backend/scripting/ModParser.hx @@ -0,0 +1,58 @@ +package funkin.backend.scripting; + +import crowplexus.hscript.Expr; +import crowplexus.hscript.Parser; + +class ModParser extends Parser { + override function parseFunctionArgs() { + var args:Array = []; + var tk = token(); + + if (tk != TPClose) { + var done = false; + while (!done) { + var name:String = null, opt:Bool = false; + + switch (tk) { + case TQuestion: + opt = true; + tk = token(); + default: + } + switch (tk) { + case TId(id): + name = id; + default: + unexpected(tk); + break; + } + + var arg:Argument = {name: name, opt: opt}; + + if (allowTypes) { + if (maybe(TDoubleDot)) + arg.t = parseType(); + if (maybe(TOp("="))) { + arg.value = parseExpr(); + arg.opt = true; + } + } + + tk = token(); + switch (tk) { + case TComma: + tk = token(); + case TPClose: + done = true; + default: + unexpected(tk); + break; + } + + args.push(arg); + } + } + + return args; + } +} \ No newline at end of file diff --git a/source/funkin/debug/DebugDisplay.hx b/source/funkin/debug/DebugDisplay.hx index 5406b56..4724eb5 100644 --- a/source/funkin/debug/DebugDisplay.hx +++ b/source/funkin/debug/DebugDisplay.hx @@ -107,7 +107,7 @@ class PerfCounter extends TextField { while (times[0] < currentTime - 1000) times.shift(); currentFPS = Math.round((oldFPS + times.length) / 2); - mem = cast(openfl.system.System.totalMemory, UInt); + mem = getMemoryUsed(); if (oldFPS != currentFPS || oldMem != mem) { maxMem = Math.max(mem, maxMem); @@ -123,4 +123,12 @@ class PerfCounter extends TextField { } return FlxMath.roundDecimal(bytes, precision) + byteUnits[curUnit]; } + + public static function getMemoryUsed():#if cpp Float #else Int #end { + #if cpp + return cpp.vm.Gc.memInfo64(cpp.vm.Gc.MEM_INFO_CURRENT); + #else + return openfl.system.System.totalMemory; + #end + } } \ No newline at end of file diff --git a/source/funkin/objects/Character.hx b/source/funkin/objects/Character.hx index 8b3e754..cd1d91f 100644 --- a/source/funkin/objects/Character.hx +++ b/source/funkin/objects/Character.hx @@ -242,6 +242,14 @@ class Character extends FunkinSprite implements ICharacter { super.draw(); } + public override function kill() { + hscripts.kill(); + super.kill(); + } + public override function revive() { + hscripts.revive(); + super.revive(); + } public override function destroy() { hscripts.destroyAll(); super.destroy(); @@ -330,10 +338,13 @@ class Character extends FunkinSprite implements ICharacter { if (!forced && (animReset > 0 || bopFrequency <= 0 || !bop || specialAnim || held)) return false; - if (sway) { - playAnimation((beat % 2 == 0 ? 'danceLeft' : 'danceRight') + idleSuffix, forced); - } else if (forced || beat % bopFrequency == 0) { - playAnimation('idle$idleSuffix', forced); + if (forced || beat % bopFrequency == 0) { + if (sway) { + var swayLeft:Bool = (beat % (bopFrequency * 2) == 0); + playAnimation((swayLeft ? 'danceLeft' : 'danceRight') + idleSuffix, forced); + } else { + playAnimation('idle$idleSuffix', forced); + } } return true; diff --git a/source/funkin/objects/CharacterGroup.hx b/source/funkin/objects/CharacterGroup.hx index c710089..18269e6 100644 --- a/source/funkin/objects/CharacterGroup.hx +++ b/source/funkin/objects/CharacterGroup.hx @@ -245,12 +245,13 @@ class CharacterGroup extends FunkinTypedSpriteGroup implements IChara newChara.y += newChara.height * -1 + newChara.originOffset.y; newChara.stageCameraOffset.copyFrom(off); newChara.conductorInUse = conductorInUse; + newChara.alpha = invisible; newChara.bop = bop; off.put(); + add(newChara); newChara.startScripts(); - newChara.alpha = invisible; - return add(newChara); + return newChara; } public function unloadCharacter(?chara:CharacterOrString) { var toDestroy:Character; diff --git a/source/funkin/objects/Stage.hx b/source/funkin/objects/Stage.hx index 03afb46..497011d 100644 --- a/source/funkin/objects/Stage.hx +++ b/source/funkin/objects/Stage.hx @@ -30,45 +30,45 @@ class Stage extends FunkinSpriteGroup { public function setup(?stageId:String, ?chartData:Chart) { // right now only works with vslice stage jsons chartData ??= chart; - if (stageId != null) { - Log.minor('loading stage "$stageId"'); + if (stageId != null) { + Log.minor('loading stage "$stageId"'); - var jsonPath:String = 'data/stages/$stageId.json'; - if (Paths.exists(jsonPath)) { - var time:Float = Sys.time(); - try { - var content:String = Paths.text(jsonPath); - var jsonData:Dynamic = TJSON.parse(content); - loadModernStageData(jsonData); - json = jsonData; - format = MODERN; - stageValid = true; - hasContent = true; - Log.info('stage loaded successfully! (${FlxMath.roundDecimal(Sys.time() - time, 3)}s)'); - } catch (e:haxe.Exception) { - format = NONE; - Log.error('error while loading stage "$stageId"... -> ${e.details()}'); - } - } else { - Log.warning('stage "$stageId" not found...'); + var jsonPath:String = 'data/stages/$stageId.json'; + if (Paths.exists(jsonPath)) { + var time:Float = Sys.time(); + try { + var content:String = Paths.text(jsonPath); + var jsonData:Dynamic = TJSON.parse(content); + loadModernStageData(jsonData); + json = jsonData; + format = MODERN; + stageValid = true; + hasContent = true; + Log.info('stage loaded successfully! (${FlxMath.roundDecimal(Sys.time() - time, 3)}s)'); + } catch (e:haxe.Exception) { + format = NONE; + Log.error('error while loading stage "$stageId"... -> ${e.details()}'); + } + } else { + Log.warning('stage "$stageId" not found...'); Log.minor('verify path:'); Log.minor('- $jsonPath'); - } - } - - // loads hscript file - var state:FunkinState = cast(FlxG.state, FunkinState); - var scriptPath:String = 'scripts/stages/$stageId.hx'; - if (Paths.exists(scriptPath)) { - if (state != null) - state.hscripts.loadFromPaths(scriptPath); - hasContent = true; - } - - if (state != null) - state.hscripts.run('setupStage', [stageId, this]); - - if (!hasContent) { + } + } + + // loads hscript file + var state:FunkinState = cast(FlxG.state, FunkinState); + var scriptPath:String = 'scripts/stages/$stageId.hx'; + if (Paths.exists(scriptPath)) { + if (state != null) + state.hscripts.loadFromPaths(scriptPath); + hasContent = true; + } + + if (state != null) + state.hscripts.run('setupStage', [stageId, this]); + + if (!stageValid) { Log.warning('no stage content (json or script): loading fallback stage'); loadFallback(); } @@ -165,8 +165,8 @@ class Stage extends FunkinSpriteGroup { add(charaGroup); charaGroup.zIndex = chara.zIndex; charaGroup.stageCameraOffset.set(chara.cameraOffsets[0], chara.cameraOffsets[1]); - if (chara.scale != null) charaGroup.scale.set(chara.scale, chara.scale); - + if (chara.scale != null) charaGroup.scale.set(chara.scale, chara.scale); + this.characters[name] = charaGroup; } } diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index fdac785..9133da0 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -46,6 +46,8 @@ class Lane extends FunkinSpriteGroup { public var inputFilter:Note -> Bool; public var noteEvent:FlxTypedSignal Void> = new FlxTypedSignal(); public var extraWindow:Float = 0; // antimash mechanic + var queueComputeLimit:Int = 500; + var spawnLimit:Int = 75; public var receptor:Receptor; public var notes:FunkinTypedSpriteGroup; @@ -132,7 +134,8 @@ class Lane extends FunkinSpriteGroup { public function updateQueue() { var i:Int = 0; var early:Bool; - var limit:Int = 50; + var limit:Int = queueComputeLimit; + while (i < queue.length) { var note:ChartNote = queue[i]; if (note == null) { @@ -140,22 +143,24 @@ class Lane extends FunkinSpriteGroup { queue.remove(note); continue; } + early = (note.msTime - conductorInUse.songPosition > Math.max(spawnRadius, hitWindow)); if (!early && (oneWay || (note.msTime + note.msLength - conductorInUse.songPosition) >= -spawnRadius)) { queue.remove(note); insertNote(note); - limit --; - if (limit < 0) break; - } else + if (notes.countLiving() >= spawnLimit || --limit < 0) break; + } else { i ++; - if (early && oneWay) break; + } + + if (early && oneWay) + break; } } public function updateNotes() { var i:Int = notes.length; while (i > 0) { - i --; - var note:Note = notes.members[i]; + var note:Note = notes.members[-- i]; if (note == null || !note.alive) continue; updateNote(note); } @@ -188,6 +193,12 @@ class Lane extends FunkinSpriteGroup { func(note.chartNote); } } + public function forEachActiveNote(func:Note -> Void) { + for (note in notes) { + if (note.alive) + func(note); + } + } public function fireInput(key:FlxKey, pressed:Bool):Bool { if (!inputKeys.contains(key) || !allowInput) return false; @@ -249,7 +260,7 @@ class Lane extends FunkinSpriteGroup { var splash:NoteSplash = noteSplashes.recycle(NoteSplash, () -> new NoteSplash(noteData, style), true); noteSplashes.moveToTop(splash); - splash.style = note?.style ?? style; + splash.reload(note?.style ?? style); splash.popOnReceptor(receptor); splash.alpha = alpha * splash.defaultAlpha; splash.scale.set(scale.x * splash.defaultScale, scale.y * splash.defaultScale); @@ -260,7 +271,7 @@ class Lane extends FunkinSpriteGroup { var spark:NoteSpark = noteSparks.recycle(NoteSpark, () -> new NoteSpark(noteData, style), true); noteSparks.moveToTop(spark); - spark.style = note?.style ?? style; + spark.reload(note?.style ?? style); spark.heldNote = note; spark.popOnReceptor(receptor); spark.alpha = alpha * spark.defaultAlpha; @@ -401,8 +412,9 @@ class Lane extends FunkinSpriteGroup { function set_style(newStyle:NoteStyle):NoteStyle { if (style == newStyle) return newStyle; + style = newStyle; loadStyle(newStyle); - return style = newStyle; + return newStyle; } public function loadStyle(newStyle:NoteStyleAsset) { var style:NoteStyle = NoteStyle.fetch(newStyle); @@ -511,19 +523,18 @@ class Receptor extends FunkinSprite { function set_style(newStyle:NoteStyle) { if (style == newStyle) return newStyle; + style = newStyle; loadStyle(newStyle); - return style = newStyle; + return newStyle; } public function loadStyle(newStyle:NoteStyleAsset) { var style:NoteStyle = NoteStyle.fetch(newStyle); - updateRGBShader = !(style?.data.general.disableRGB ?? false); - NoteStyleUtil.loadNoteStyleAnimations(this, style?.data?.receptors, style?.getDirectionName(noteData)); + updateRGBShader = !(style?.data.general.disableRGB ?? false); + defaultScale = style?.data?.receptors?.scale ?? 1; playAnimation('static', true); updateHitbox(); - - defaultScale = style?.data?.receptors?.scale ?? 1; } public function set_rgbEnabled(newE:Bool) { @@ -577,8 +588,9 @@ class NoteSplash extends FunkinSprite { function set_style(newStyle:NoteStyle) { if (style == newStyle) return newStyle; + style = newStyle; loadStyle(newStyle); - return style = newStyle; + return newStyle; } public function loadStyle(newStyle:NoteStyleAsset) { var style:NoteStyle = NoteStyle.fetch(newStyle); @@ -594,6 +606,11 @@ class NoteSplash extends FunkinSprite { defaultScale = asset?.scale ?? 1; defaultAlpha = asset?.alpha ?? 1; } + public function reload(style:NoteStyle) { + blend = NORMAL; + + this.style = style; + } public function popOnReceptor(receptor:Receptor) { //lol setPosition(receptor.x + receptor.width * .5, receptor.y + receptor.height * .5); @@ -683,18 +700,24 @@ class NoteSpark extends NoteSplash { } public override function loadStyle(newStyle:NoteStyleAsset) { + var oldAnim:String = currentAnimation; + var oldFrame:Float = anim.curFrameFloat; var style:NoteStyle = NoteStyle.fetch(newStyle); updateRGBShader = !(style?.data.general.disableRGB ?? false); asset = style?.data.noteCovers; NoteStyleUtil.loadNoteStyleAnimations(this, asset, style?.getDirectionName(noteData)); + defaultScale = asset?.scale ?? 1; + defaultAlpha = asset?.alpha ?? 1; playAnimation('start', true); updateHitbox(); - offset.set(frameWidth * .5, frameHeight * .5); - defaultScale = asset?.scale ?? 1; - defaultAlpha = asset?.alpha ?? 1; + offset.set(frameWidth * .5, frameHeight * .5); + if (animationExists(oldAnim)) { + playAnimation(oldAnim, true); + anim.curFrameFloat = oldFrame; + } } public override function pop():NoteSpark { diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 5becd00..5670673 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -192,6 +192,7 @@ class Note extends FunkinSprite { } public function reload(?style:NoteStyle):Void { + clipDistance = 0; healthLoss = 6.0 / 100; healthGain = 1.5 / 100; healthGainPerSecond = 7.5 / 100; @@ -201,7 +202,7 @@ class Note extends FunkinSprite { spriteOffset.set(); tailOffset.set(); multAlpha = 1; - clipDistance = 0; + blend = NORMAL; this.style = style; if (tail != null) @@ -251,27 +252,31 @@ class Note extends FunkinSprite { function set_style(newStyle:NoteStyle) { if (style == newStyle) return newStyle; + style = newStyle; loadStyle(newStyle); if (tail != null) tail.style = newStyle; - return style = newStyle; + return newStyle; } public function set_rgbEnabled(newE:Bool) { shader = (newE ? rgbShader.shader : null); return rgbEnabled = newE; } public function loadStyle(newStyle:NoteStyleAsset) { + var oldScale:Float = defaultScale; var style:NoteStyle = NoteStyle.fetch(newStyle); var asset:NoteStyleAssetData = style?.data.notes; NoteStyleUtil.loadNoteStyleAnimations(this, asset, style?.getDirectionName(laneIndex)); - playAnimation('hit', true); - updateHitbox(); - defaultScale = asset?.scale ?? 1; defaultAlpha = asset?.alpha ?? 1; + scale.x *= (defaultScale / oldScale); + scale.y *= (defaultScale / oldScale); + reloadAnimShader('hit', newStyle); + playAnimation('hit', true); + updateHitbox(); } public static function distanceToMS(distance:Float, scrollSpeed:Float) @@ -402,23 +407,27 @@ class NoteTail extends FunkinSprite { function set_style(newStyle:NoteStyle) { if (style == newStyle) return newStyle; + style = newStyle; loadStyle(newStyle); - return style = newStyle; + return newStyle; } public function set_rgbEnabled(newE:Bool) { shader = (newE ? rgbShader.shader : null); return rgbEnabled = newE; } public function loadStyle(newStyle:NoteStyleAsset) { + var oldScale:Float = defaultScale; var style:NoteStyle = NoteStyle.fetch(newStyle); var asset:NoteStyleAssetData = style?.data.holds; NoteStyleUtil.loadNoteStyleAnimations(this, asset, style?.getDirectionName(laneIndex)); - playAnimation('hold', true); - updateHitbox(); - defaultScale = asset?.scale ?? 1; defaultAlpha = asset?.alpha ?? 1; + scale.x *= (defaultScale / oldScale); + scale.y *= (defaultScale / oldScale); + + playAnimation('hold', true); + updateHitbox(); } // this is kinda mediocre tbh diff --git a/source/funkin/objects/play/Strumline.hx b/source/funkin/objects/play/Strumline.hx index 48fbfb3..2bd70c2 100644 --- a/source/funkin/objects/play/Strumline.hx +++ b/source/funkin/objects/play/Strumline.hx @@ -197,6 +197,10 @@ class Strumline extends FunkinSpriteGroup { for (lane in lanes) lane.forEachNote(func, includeQueued); } + public function forEachActiveNote(func:Note -> Void) { + for (lane in lanes) + lane.forEachActiveNote(func); + } public function getAllNotes() { var notes:Array = []; for (lane in lanes) { diff --git a/source/funkin/states/CharterState.hx b/source/funkin/states/CharterState.hx index f9883d5..ac9acac 100644 --- a/source/funkin/states/CharterState.hx +++ b/source/funkin/states/CharterState.hx @@ -1,181 +1,75 @@ package funkin.states; -import funkin.objects.Character; -import funkin.objects.play.*; -import funkin.shaders.RGBSwap; -import funkin.backend.play.Chart; -import funkin.states.FreeplaySubState.FreeplaySongText; - -import sys.thread.Thread; import openfl.display.Sprite; import openfl.display.Bitmap; -import openfl.text.TextFormat; import openfl.text.TextField; -import openfl.events.MouseEvent; -import openfl.events.KeyboardEvent; +import openfl.text.TextFormat; import flixel.util.FlxStringUtil; -import flixel.input.keyboard.FlxKey; import flixel.addons.display.FlxBackdrop; +import funkin.backend.play.Chart; +import funkin.backend.play.NoteStyle; +import funkin.objects.play.Strumline; +import funkin.objects.Character; + class CharterState extends FunkinState { - // TODO: REWRITE THIS STATE TO ACCOMODATE TO THE NEW SYSTEM -} - /* - public static var genericRGB:RGBSwap; - public static var instance:CharterState; - public static var inEditor:Bool = false; public static var chart:Chart; - public var quant:Int = 4; - public var quantText:FlxText; - public var quantGraphic:FunkinSprite; - public var measureLines:FlxTypedSpriteGroup; - public var strumlines:FlxTypedSpriteGroup; - public var strumlineHighlight:FunkinSprite; - public var charterDisplay:CharterDisplay; - public var camHUD:FunkinCamera; - public var camScroll:FunkinCamera; - - public var noteKindBubble:FunkinSprite; - public var noteKindBubbleText:FreeplaySongText; - public var noteKindBubbleFocusGraphic:FlxGraphic; - - public var selectionBox:FlxSprite; - public var selectionLeniency:Float = 55; - public var pickedNote:CharterNote = null; - public var draggingNotes:Bool = false; - var pickedLaneIndex:Int = 0; - var pickedBeat:Float = 0; - - public var keybinds:Array> = []; + public var strumlineGroup:FunkinTypedSpriteGroup; - var vocalsSounds:Array = []; - public var music:FunkinSoundGroup; - public var tickSound:FlxSound; - public var hitsound:FlxSound; + public var charterDisplay:CharterDisplay; - public var scrollSpeed(default, set):Float = 1; public var songPaused(default, set):Bool; - var visualScrollSpeed(get, never):Float; + public var noteCount:Int = 0; - public var fullNoteCount:Int = 0; - public var hitNoteCount:Int = 0; - - var lastMouseY:Float = 0; - var scrolling:Bool = false; - var strumGrabY:Null = null; - var heldKeys:Array = []; - var heldKeybinds:Array = []; - var copiedNotes:Array = []; - var heldNotes:Array = []; - var quants:Array = [4, 8, 12, 16, 24, 32, 48, 64, 96, 192]; - - var undoMemory:Int = 15; - var undoActions:Array = []; - var redoActions:Array = []; + public var music:FunkinSoundGroup; + var vocalsSounds:Array = []; - public function new(?chart:Chart) { + public function new(?targetChart:Chart) { super(); - CharterState.chart = chart ?? CharterState.chart ?? Chart.loadChart('test'); + Mods.currentMod ??= ''; + + chart = targetChart ?? chart ?? Chart.loadChart('test'); } - override public function create() { super.create(); - Main.watermark.visible = false; - Main.instance.addChild(charterDisplay = new CharterDisplay(conductorInUse = new Conductor())); // wow! - - beatHit.add(beatHitEvent); - barHit.add(barHitEvent); - - music = new FunkinSoundGroup(); - tickSound = FunkinSound.load(Paths.sound('beatTick')); - hitsound = FunkinSound.load(Paths.sound('hitsound')); - hitsound.volume = .7; - genericRGB ??= new RGBSwap(0xb3a9b8, FlxColor.WHITE, 0x333333); - inEditor = true; instance = this; + conductorInUse = new Conductor(); + conductorInUse.tempoChanges = chart.tempoChanges; - FlxG.camera.zoom = .5; - - camHUD = new FunkinCamera(); - camScroll = new FunkinCamera(); - camScroll.bgColor.alpha = 0; - camHUD.bgColor.alpha = 0; - FlxG.cameras.add(camScroll, false); - FlxG.cameras.add(camHUD, false); - - noteKindBubble = new FunkinSprite().loadTexture('charter/bubble'); - noteKindBubble.scale.set(.75, .75); - noteKindBubble.updateHitbox(); - noteKindBubble.camera = camHUD; - noteKindBubble.color = 0xff323034; - noteKindBubble.alpha = .6; - noteKindBubbleText = new FreeplaySongText(0, 0, '', 0x808080, .8); //ffe0b0d0; - noteKindBubbleText.size = 16; - noteKindBubbleText.angle = -3; - noteKindBubbleText.origin.set(0, 6); - noteKindBubbleText.camera = camHUD; + charterDisplay = new CharterDisplay(conductorInUse); + Main.instance.addChild(charterDisplay); - selectionBox = new FlxSprite().makeGraphic(1, 1, FlxColor.LIME); - selectionBox.camera = camScroll; - selectionBox.visible = false; - selectionBox.blend = ADD; - selectionBox.alpha = .25; - selectionBox.origin.set(); - add(selectionBox); var background:FlxBackdrop = new FlxBackdrop(Paths.image('charter/bg')); - background.antialiasing = true; + background.antialiasing = Options.data.antialiasing; background.scale.set(.85, .85); background.velocity.set(5, 5); add(background); - var underlay:FunkinSprite = new FunkinSprite(0, 0, false).makeGraphic(1, FlxG.height, 0xff101010); - underlay.screenCenter(); - underlay.alpha = .7; - add(underlay); - - measureLines = new FlxTypedSpriteGroup(); - strumlines = new FlxTypedSpriteGroup(); - add(measureLines); - add(strumlines); - - for (key in [FlxKey.ONE, FlxKey.TWO, FlxKey.THREE, FlxKey.FOUR, FlxKey.FIVE, FlxKey.SIX, FlxKey.SEVEN, FlxKey.EIGHT]) { - keybinds.push([key]); - heldNotes.push(null); - heldKeybinds.push(false); - } + + var chartStyle:String = chart.noteStyle; + var mania:String = '${chart.keyCount}k'; + var noteStyle:String = chartStyle; + if (NoteStyle.exists('$chartStyle-$mania')) + noteStyle = '$chartStyle-$mania'; - var strumlineSpacing:Float = 150; - var xx:Float = 0; - var h:Float = 0; - for (i in 0...2) { - var strumline = new CharterStrumline(4); - strumline.x = xx; - strumline.cpu = false; - strumline.oneWay = false; - strumlines.add(strumline); - xx += strumline.strumlineWidth + strumlineSpacing; - h = Math.max(h, strumline.strumlineHeight); - for (lane in strumline.lanes) { - lane.receptor.autoReset = true; - lane.oneWay = false; - } + music = new FunkinSoundGroup(); + strumlineGroup = new FunkinTypedSpriteGroup(); + + var strumlineX:Float = 0; + for (i in 0 ... chart.getStrumlineCount()) { + var strumline:Strumline = new Strumline(chart.keyCount, 90, chart.scrollSpeed, noteStyle); + strumline.x = strumlineX; + strumline.allowInput = strumline.cpu = false; + strumline.fitToSize(0, strumline.height * .7); + + strumlineX += strumline.width + 150 * strumline.scale.x; + + strumlineGroup.add(strumline); } - strumlines.y = FlxG.height * .5 - h * .5 - 320; - strumlines.x = (FlxG.width - (xx - strumlineSpacing)) * .5; - - strumlineHighlight = new FunkinSprite().makeGraphic(1, 1, 0xffb094b0); - strumlineHighlight.setGraphicSize(strumlines.width, strumlines.height); - strumlineHighlight.updateHitbox(); - strumlineHighlight.blend = ADD; - strumlineHighlight.alpha = .25; - - FlxG.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressEvent); - FlxG.stage.addEventListener(KeyboardEvent.KEY_UP, keyReleaseEvent); - FlxG.stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEvent); - - setWindowTitle(); + strumlineGroup.screenCenter(); + add(strumlineGroup); chart.instLoaded = false; chart.loadMusic('data/songs/${chart.path}/', false); @@ -189,54 +83,13 @@ class CharterState extends FunkinState { conductorInUse.syncTracker = chart.inst; } loadVocals(chart.path, chart.audioSuffix); - - scrollSpeed = chart.scrollSpeed; - conductorInUse.metronome.tempoChanges = chart.tempoChanges; - - for (note in chart.generateNotes(true)) - queueNote(note); - songPaused = true; - recalculateNoteCount(); - charterDisplay.songLength = findSongLength(); - - var bgPadding:Float = 50; - underlay.setGraphicSize(strumlines.width + bgPadding * 2, FlxG.height * 5); - - quantGraphic = new FunkinSprite().loadAtlas('charter/quant'); - quantGraphic.addAnimation('quant', 'new quant', 0); - quantGraphic.playAnimation('quant', true); - quantGraphic.updateHitbox(); - //quantGraphic.x = strumlines.x + xx - strumlineSpacing; - quantGraphic.y = strumlines.y + (h - quantGraphic.height) * .5; - quantGraphic.screenCenter(X); - add(quantGraphic); - - quantText = new FlxText(0, 0, 300); - quantText.setFormat(Paths.ttf('vcr'), 40, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); - quantText.borderSize = 4; - quantText.updateHitbox(); - quantText.y = strumlines.y + (h - quantText.height) * .5; - quantText.screenCenter(X); - add(quantText); - changeQuant(0); - - add(strumlineHighlight); - - var measureBeats:Array = conductorInUse.getMeasureBeats(findSongLength()); - var beatLength:Float = Math.ceil(conductorInUse.convertMeasure(findSongLength(), MS, BEAT)); - for (measure => beat in measureBeats) { - conductorInUse.beat = beat; // todo: fix mid-bar bpm changes...hehe - var beatLength:Int = Std.int((measureBeats[measure + 1] ?? beatLength) - beat); - var spacing:Float = Note.msToDistance(conductorInUse.crochet, visualScrollSpeed); - var line:MeasureLine = new MeasureLine(strumlines.x - bgPadding, strumlines.y, measure, beat, beatLength, strumlines.width + bgPadding * 2, spacing); - measureLines.add(line); - } - - conductorInUse.songPosition = 0; } - - public function loadVocals(path:String, audioSuffix:String = '') { + public function finishSong():Void { + conductorInUse.songPosition = music.length; + songPaused = true; + } + public function loadVocals(path:String, audioSuffix:String = ''):Void { vocalsSounds.resize(0); for (chara in [chart.player1, chart.player2, chart.player3]) { @@ -259,426 +112,7 @@ class CharterState extends FunkinState { music.add(sound); } } - - override public function update(elapsed:Float) { - if (FlxG.keys.justPressed.ENTER) { - var shifted:Bool = FlxG.keys.pressed.SHIFT; - chart.tempoChanges = conductorInUse.metronome.tempoChanges; - saveToChart(chart); - FlxG.switchState(() -> new PlayState(chart, shifted)); - return; - } - - // selection and dragging - var highlightedNote:CharterNote = null; - var highlightedSelNote:CharterNote = null; - var anyNoteHovered:Bool = (pickedNote != null); - forEachNote((note:Note) -> { - var charterNote:CharterNote = cast note; - if (charterNote == null) return; - - if (!note.isHoldPiece && FlxG.mouse.overlaps(note)) { - anyNoteHovered = true; - if (charterNote.selected) { - if (highlightedSelNote == null) { - highlightedSelNote = charterNote; - } else { - var mousePoint:FlxPoint = FlxG.mouse.getWorldPosition(); - if (mousePoint.distanceTo(note.getMidpoint()) < mousePoint.distanceTo(highlightedSelNote.getMidpoint())) - highlightedSelNote = charterNote; - } - if (FlxG.mouse.justPressed) { - pickedNote = highlightedSelNote; - pickedBeat = pickedNote.beatTime; - pickedLaneIndex = laneToIndex(pickedNote.lane); - } - } else { - if (highlightedNote == null) { - highlightedNote = charterNote; - } else { - var mousePoint:FlxPoint = FlxG.mouse.getWorldPosition(); - if (mousePoint.distanceTo(note.getMidpoint()) < mousePoint.distanceTo(highlightedNote.getMidpoint())) - highlightedNote = charterNote; - } - } - } - }); - - var selectedAny:Bool = false; - var isSelecting:Bool = (selectionBox.visible && Math.abs(selectionBox.scale.x) >= 12 && Math.abs(selectionBox.scale.y) >= 12); - if (FlxG.mouse.pressed && strumGrabY == null) { - if (pickedNote != null) { - var pickedLane:Lane = null; // drag and twist notes - for (strumline in strumlines) { - for (lane in strumline.lanes) { - if (FlxG.mouse.x >= lane.receptor.x && FlxG.mouse.x <= lane.receptor.x + lane.receptor.width) { - pickedLane = lane; - break; - } - } - } - var selectedNotes:Array = getSelectedNotes(); - - readjustScrollCam(); - var quantMult:Float = (quant / 4); - var cursorBeatTime:Float = Note.distanceToMS(FlxG.mouse.getWorldPosition(camScroll).y, visualScrollSpeed) / conductorInUse.crochet; - var snappedBeatTime:Float = Math.round(cursorBeatTime * quantMult) / quantMult; - var beatDiff:Float = (snappedBeatTime - pickedNote.beatTime); - - if (shiftNotes(selectedNotes, beatDiff) != 0) - draggingNotes = true; - - if (pickedLane != null && pickedLane != pickedNote.lane) { - var laneDiff:Int = laneToIndex(pickedLane) - laneToIndex(pickedNote.lane); - if (twistNotes(selectedNotes, laneDiff) != 0) - draggingNotes = true; - } - } else { - var mousePos:FlxPoint = FlxG.mouse.getWorldPosition(camScroll); - if (FlxG.mouse.justPressed || !selectionBox.visible) { - selectionBox.setPosition(mousePos.x, mousePos.y); - selectionBox.visible = true; - } - selectionBox.scale.set(mousePos.x - selectionBox.x, mousePos.y - selectionBox.y); - } - } else if (selectionBox.visible) { - //do the selection! - var selectionBounds:FlxRect = selectionBox.getScreenBounds(null, camScroll); - if (selectionBox.scale.x < 0) selectionBounds.x += selectionBox.scale.x; - if (selectionBox.scale.y < 0) selectionBounds.y += selectionBox.scale.y; - - if (isSelecting) { - forEachNote((note:Note) -> { - if (note.isHoldPiece) return; - var charterNote:CharterNote = cast note; - if (charterNote == null) return; - - charterNote.followLane(note.lane, note.lane.scrollSpeed); - - var noteBounds:FlxRect = charterNote.getScreenBounds(); - noteBounds.x += selectionLeniency; - noteBounds.y += selectionLeniency; - noteBounds.width -= selectionLeniency * 2; - noteBounds.height -= selectionLeniency * 2; - if (noteBounds.overlaps(selectionBounds)) { - charterNote.selected = true; - selectedAny = true; - } else if (!FlxG.keys.pressed.SHIFT) { - charterNote.selected = false; - } - }, true); - } - - selectionBox.visible = false; - } - if (highlightedNote == null) - highlightedNote = highlightedSelNote; - forEachNote((note:Note) -> { - var charterNote:CharterNote = cast note; - if (charterNote == null) return; - - charterNote.highlighted = (highlightedNote == note); - }); - if (FlxG.mouse.justReleased) { - if (pickedNote != null) { - final beatDiff:Float = pickedNote.beatTime - pickedBeat; - final laneDiff:Int = laneToIndex(pickedNote.lane) - pickedLaneIndex; - if (beatDiff != 0 || laneDiff != 0) - addUndo({type: SHIFTED_NOTES, notes: getSelectedNotes(), laneMod: laneDiff, beatMod: beatDiff}); - } - if (!FlxG.keys.pressed.SHIFT && !draggingNotes && !selectedAny && strumGrabY == null) { - for (note in getSelectedNotes()) - note.selected = false; - } - if (highlightedNote != null) - highlightedNote.selected = true; - draggingNotes = false; - pickedNote = null; - } - - // time shift - if (!FlxG.keys.pressed.CONTROL && FlxG.keys.pressed.W != FlxG.keys.pressed.S) { - var msPerSec:Float = (FlxG.keys.pressed.SHIFT ? 2000 : 1000); - if (FlxG.keys.pressed.W) - msPerSec *= -1; - - if (songPaused) - songPaused = false; - conductorInUse.paused = true; - conductorInUse.songPosition += elapsed * msPerSec; - restrictConductor(); - - if (conductorInUse.songPosition <= 0 && msPerSec < 0) { - music.stop(); - } else if (msPerSec != 1000 || !scrolling || !music.playing) { - if (!music.playing) { - music.play(true, conductorInUse.songPosition); - } else { - music.time = conductorInUse.songPosition; - } - } - - scrolling = true; - } else if (scrolling) { - songPaused = true; - scrolling = false; - } - - // receptor dragging - var strumlinesHighlighted:Bool = (FlxG.mouse.overlaps(strumlineHighlight) && !isSelecting && !anyNoteHovered && !FlxG.mouse.pressedRight); - strumlineHighlight.setPosition(strumlines.x, strumlines.y); - if (FlxG.mouse.justPressed && strumlinesHighlighted) - strumGrabY = (FlxG.mouse.y - strumlines.y); - if (FlxG.mouse.justReleased) - strumGrabY = null; - strumlineHighlight.visible = (strumlinesHighlighted || strumGrabY != null); - if (FlxG.mouse.pressed && strumGrabY != null) { - var h:Float = strumlines.height; - var middle:Float = (FlxG.height - h) * .5; - var maxDist:Float = (FlxG.height - h - 25) * .5 / FlxG.camera.zoom; - strumlines.y = Util.clamp(FlxG.mouse.y - strumGrabY, -maxDist + middle, maxDist + middle); - strumlineHighlight.setPosition(strumlines.x, strumlines.y); - - quantGraphic.y = strumlines.y + (h - quantGraphic.height) * .5; - quantText.y = strumlines.y + (h - quantText.height) * .5; - } - - if (FlxG.keys.justPressed.SPACE) songPaused = !songPaused; - super.update(elapsed); - forEachNote((note:Note) -> { - var lane:Lane = note.lane; - if (!conductorInUse.paused) { - if (conductorInUse.songPosition >= note.msTime && (conductorInUse.songPosition <= note.endMs || !note.goodHit)) { - lane.receptor?.playAnimation('confirm', true); - if (!note.goodHit && !note.isHoldPiece) - hitsound.play(true); - note.goodHit = true; - } - } else { - note.goodHit = (conductorInUse.songPosition > note.msTime + 1); - } - }); - - if (songPaused) { - FlxG.camera.zoom = Util.smoothLerp(FlxG.camera.zoom, .5, elapsed * 9); - } else { - var metronome:Metronome = conductorInUse.metronome; - var beatZoom:Float = 1 - FlxEase.quintOut(metronome.beat % 1); - var barZoom:Float = 1 - FlxEase.quintOut(Math.min((metronome.bar % 1) * metronome.timeSignature.numerator, 1)); - FlxG.camera.zoom = .5 + beatZoom * .003 + barZoom * .005; - } - - readjustScrollCam(); - for (line in measureLines) { - // line.ySpacing = Note.msToDistance(conductorInUse.crochet, visualScrollSpeed); - if (Math.abs(line.startTime - conductorInUse.beat) > 16) { - if (line.alive) line.kill(); - continue; - } - - if (!line.alive) line.revive(); - line.y = strumlines.y + strumlines.height * .5 + Note.msToDistance(conductorInUse.convertMeasure(line.startTime, BEAT, MS) - conductorInUse.songPosition, visualScrollSpeed); - } - - if (!paused) - updateHolds(); - } - public function readjustScrollCam() { - camScroll.scroll.y = Note.msToDistance(conductorInUse.songPosition, visualScrollSpeed) - strumlines.y - strumlines.height * .5; - camScroll.zoom = FlxG.camera.zoom; - } - override public function updateConductor(elapsed:Float = 0) { - var prevStep:Int = curStep; - var prevBeat:Int = curBeat; - var prevBar:Int = curBar; - - conductorInUse.update(elapsed * 1000); - - curStep = Math.floor(conductorInUse.step); - curBeat = Math.floor(conductorInUse.beat); - curBar = Math.floor(conductorInUse.bar); - - if (!songPaused) { - if (prevBar != curBar) barHit.dispatch(curBar); - if (prevBeat != curBeat) beatHit.dispatch(curBeat); - if (prevStep != curStep) stepHit.dispatch(curStep); - } - } - - public function beatHitEvent(beat:Int) { - tickSound.play(true); - } - public function barHitEvent(bar:Int) {} - public function mouseMoveEvent(event:MouseEvent) { - if (FlxG.mouse.pressedRight) { - if (!songPaused) - songPaused = true; - conductorInUse.songPosition -= Note.distanceToMS((event.stageY - lastMouseY) / Util.gameScaleY / FlxG.camera.zoom, visualScrollSpeed); - restrictConductor(); - - if (event.stageY <= 5) { - lastMouseY = (FlxG.stage.window.height - 5) + event.stageY - 10; - FlxG.stage.window.warpMouse(Std.int(event.stageX), Std.int(lastMouseY)); - return; - } else if (event.stageY >= FlxG.stage.window.height - 5) { - lastMouseY = 10 + event.stageY - (FlxG.stage.window.height - 5); - FlxG.stage.window.warpMouse(Std.int(event.stageX), Std.int(lastMouseY)); - return; - } - } - lastMouseY = event.stageY; - } - public function finishSong() { - songPaused = true; - conductorInUse.songPosition = (music.syncBase?.length ?? 0); - } - public function forEachNote(func:Note -> Void, includeQueued:Bool = false) { - for (strumline in strumlines) - strumline.forEachNote(func, includeQueued); - } - public function getSelectedNotes() { - var list:Array = []; - forEachNote((note:Note) -> { - var charterNote:CharterNote = cast note; - if (charterNote == null) return; - - if (charterNote.selected) - list.push(charterNote); - }, true); - return list; - } - public function queueNote(note:Note) { - var strumline:Strumline = (note.player ? strumlines.members[0] : strumlines.members[1]); - strumline?.queueNote(note); - return note; - } - public function shiftNotes(notesArray:Array, beatMod:Float = 0):Float { - if (beatMod == 0) return 0; - var beatDiff:Float = beatMod; - var minBeat:Float = Math.POSITIVE_INFINITY; - var maxBeat:Float = Math.NEGATIVE_INFINITY; - for (note in notesArray) { - if (note.isHoldPiece) continue; - if (note.beatTime < minBeat) minBeat = note.beatTime; - if (note.beatTime > maxBeat) maxBeat = note.beatTime; - } - if (minBeat + beatDiff < 0) - beatDiff = -minBeat; - // todo max beat - if (beatDiff != 0) { - for (note in notesArray) { - if (note.isHoldPiece) continue; - shiftNote(note, note.beatTime + beatDiff); - } - } - return beatDiff; - } - public function twistNotes(notesArray:Array, laneMod:Int = 0):Int { - if (laneMod == 0) return 0; - var laneDiff:Int = laneMod; - var minLane:Int = 9999; // prevent notes from going out of bounds - var maxLane:Int = -1; - for (note in notesArray) { - var laneIdx:Int = laneToIndex(note.lane); - if (laneIdx < minLane) minLane = laneIdx; - if (laneIdx > maxLane) maxLane = laneIdx; - } - if (minLane + laneDiff < 0) - laneDiff = -minLane; - if (maxLane + laneDiff >= getNumLanes()) - laneDiff = getNumLanes() - maxLane - 1; - - if (laneDiff != 0) { - for (note in notesArray) { - if (note.isHoldPiece) continue; - var laneIdx:Int = laneToIndex(note.lane); - var nextLane:Lane = indexToLane(laneIdx + laneDiff); - if (nextLane == null) continue; - twistNote(note, nextLane); - } - } - return laneDiff; - } - public function shiftNote(note:Note, beatTime:Float) { - if (note == null) { - Log.warning('shiftNote: ???'); - return; - } - var diff:Float = beatTime - note.beatTime; - note.beatTime = beatTime; - note.goodHit = (conductorInUse.songPosition > note.msTime + 1); - for (child in note.children) { - child.beatTime += diff; - child.goodHit = (conductorInUse.songPosition > child.msTime + 1); - } - } - public function twistNote(note:Note, lane:Lane) { - if (note == null || lane == null) { - Log.warning('twistNote: ???'); - return; - } - if (Std.isOfType(note, CharterNote)) { - var charterNote:CharterNote = cast note; - if (charterNote == null) return; - - if (charterNote.useLaneRGB) - note.shader = lane.rgbShader.shader; - } - note.player = (lane.strumline == strumlines.members[0]); - note.noteData = lane.noteData; - note.reloadAnimations(); - if (note.lane.notes.members.contains(note)) { - note.lane.notes.remove(note, true); - lane.insertNote(note); - } else { - note.lane.dequeueNote(note); - lane.queueNote(note, true); - } - note.lane = lane; - - for (child in note.children) - twistNote(child, lane); - } - public function indexToLane(index:Int) { - var n:Int = -1; - for (strumline in strumlines) { - for (lane in strumline.lanes) { - n ++; - if (n == index) - return lane; - } - } - return null; - } - public function laneToIndex(laneToFind:Lane) { - var n:Int = -1; - for (strumline in strumlines) { - for (lane in strumline.lanes) { - n ++; - if (lane == laneToFind) - return n; - } - } - return -1; - } - public function getNumLanes() { - var count:Int = 0; - for (strumline in strumlines) - count += strumline.lanes.length; - return count; - } - - public function set_scrollSpeed(newSpeed:Float) { - scrollSpeed = newSpeed; - for (strumline in strumlines) { - strumline.scrollSpeed = visualScrollSpeed; - } - return newSpeed; - } - public function get_visualScrollSpeed() { - return scrollSpeed / .7; - } - public function set_songPaused(isPaused:Bool) { + function set_songPaused(isPaused:Bool):Bool { if (isPaused) { music.stop(); } else { @@ -687,9 +121,9 @@ class CharterState extends FunkinState { music.play(true, conductorInUse.songPosition); } - for (strumline in strumlines) { - FlxTween.cancelTweensOf(strumline, ['receptorAlpha']); - FlxTween.tween(strumline, {receptorAlpha: (isPaused ? .75 : 1)}, .25, {ease: FlxEase.circOut}); + for (strumline in strumlineGroup) { + FlxTween.cancelTweensOf(strumline, ['alpha']); + FlxTween.tween(strumline, {alpha: (isPaused ? .75 : 1)}, .25, {ease: FlxEase.circOut}); for (lane in strumline.lanes) { if (isPaused) lane.receptor?.playAnimation('static'); @@ -699,586 +133,28 @@ class CharterState extends FunkinState { return songPaused = isPaused; } - public function keyPressEvent(event:KeyboardEvent) { - var key:FlxKey = event.keyCode; - if (!heldKeys.contains(key)) heldKeys.push(key); - - var keybind:Int = Controls.keybindFromArray(keybinds, key); - if (keybind >= 0 && FlxG.keys.checkStatus(key, JUST_PRESSED)) - inputOn(keybind); - - var noteControlMode:Bool = FlxG.keys.pressed.CONTROL; - var scrollMod:Int = 1; - var leniency:Float = 1 / 256; - var prevBeat:Float = conductorInUse.beat; - var quantMultiplier:Float = (quant * .25); - var pauseChart:Bool = false; - if (noteControlMode) { - keyPressNoteControl(key); - } - switch (key) { - case FlxKey.DELETE: - var deletedNotes:Array = []; - for (note in getSelectedNotes()) { - note.lane.dequeueNote(note); - note.lane.killNote(note); - deletedNotes.push(note); - } - if (deletedNotes.length > 0) - addUndo({type: REMOVED_NOTES, notes: deletedNotes}); - case FlxKey.LEFT | FlxKey.RIGHT: - if (key == FlxKey.LEFT) scrollMod *= -1; - if (noteControlMode) { - twistNotes(getSelectedNotes(), scrollMod); - } else { - changeQuant(scrollMod); - } - case FlxKey.UP | FlxKey.DOWN: - if (key == FlxKey.UP) scrollMod *= -1; - if (noteControlMode) { - shiftNotes(getSelectedNotes(), scrollMod / quantMultiplier); - } else { - placeNotes(); - pauseChart = true; - var targetBeat:Float = prevBeat + scrollMod / quantMultiplier; - if (Math.abs(prevBeat - Math.round(prevBeat * quantMultiplier) / quantMultiplier) < leniency * 2) - conductorInUse.beat = Math.round(targetBeat * quantMultiplier) / quantMultiplier; - else - conductorInUse.beat = (scrollMod > 0 ? Math.floor : Math.ceil)(targetBeat * quantMultiplier) / quantMultiplier; - } - case FlxKey.PAGEUP | FlxKey.PAGEDOWN: - placeNotes(); - pauseChart = true; - if (key == FlxKey.PAGEUP) scrollMod *= -1; - if (Math.abs(conductorInUse.bar - Std.int(conductorInUse.bar)) < (1 / quant - .0006)) - conductorInUse.bar = Math.max(0, conductorInUse.bar + scrollMod); - conductorInUse.bar = (scrollMod < 0 ? Math.floor : Math.ceil)(conductorInUse.bar); - case FlxKey.HOME: - pauseChart = true; - conductorInUse.songPosition = 0; - case FlxKey.END: - pauseChart = true; - conductorInUse.songPosition = findSongLength(); - default: - } - - if (pauseChart && !songPaused) - songPaused = true; - - restrictConductor(); - updateHolds(); - } - public function undo() { - var undoAction:UndoAction = undoActions.pop(); - if (undoAction != null) { - // Sys.println('undoing ${undoAction.type}'); - redoActions.unshift(undoAction); - switch (undoAction.type) { - case PLACED_NOTES: - for (note in undoAction.notes) { - note.lane.dequeueNote(note); - note.lane.killNote(note); - } - case REMOVED_NOTES: - for (note in undoAction.notes) { - note.lane.queueNote(note); - note.selected = true; - } - case SHIFTED_NOTES: - twistNotes(undoAction.notes, -undoAction.laneMod); - shiftNotes(undoAction.notes, -undoAction.beatMod); - default: - } - charterDisplay.addMessage(undoAction.message(), true, false); - recalculateNoteCount(); - } - } - public function redo() { - var undoAction:UndoAction = redoActions.shift(); - if (undoAction != null) { - // Sys.println('redoing ${undoAction.type}'); - undoActions.push(undoAction); - switch (undoAction.type) { - case PLACED_NOTES: - for (note in undoAction.notes) { - note.lane.queueNote(note); - note.selected = true; - } - case REMOVED_NOTES: - for (note in undoAction.notes) { - note.lane.dequeueNote(note); - note.lane.killNote(note); - } - case SHIFTED_NOTES: - twistNotes(undoAction.notes, undoAction.laneMod); - shiftNotes(undoAction.notes, undoAction.beatMod); - default: - } - charterDisplay.addMessage(undoAction.message(), true, true); - recalculateNoteCount(); - } - } - public function addUndo(action:UndoAction) { - // Sys.println('added undo action ${action.type}'); - setWindowTitle(true); - undoActions.push(action); - - while (undoActions.length > undoMemory) { - var undoAction:UndoAction = undoActions.shift(); - destroyUndoAction(undoAction, false); - } - for (undoAction in redoActions) - destroyUndoAction(undoAction, true); - redoActions.resize(0); - - charterDisplay.addMessage(action.message(), false, true); - recalculateNoteCount(); - } - public function destroyUndoAction(action:UndoAction, parallel:Bool = false) { - switch (action.type) { // parallel: for redo - case PLACED_NOTES | REMOVED_NOTES: - if (parallel == (action.type == REMOVED_NOTES)) - return; - for (note in action.notes) - note.destroy(); - default: - } - } - public function recalculateNoteCount() { - fullNoteCount = 0; - hitNoteCount = 0; - for (strumline in strumlines) { - strumline.forEachNote((note:Note) -> { - if (!note.isHoldPiece) - hitNoteCount ++; - fullNoteCount ++; - }, true); - } - } - public function copySelectedNotes() { - var selectedNotes:Array = getSelectedNotes(); - if (selectedNotes.length > 0) { - copiedNotes.resize(0); - for (note in selectedNotes) { - if (note.isHoldPiece) continue; - copiedNotes.push(note.toChartNote()); - } - copiedNotes.sort(Chart.sortByTime); - } - } - public function keyPressNoteControl(key:FlxKey) { - switch (key) { - case FlxKey.Z: - undo(); - case FlxKey.Y: - redo(); - case FlxKey.C: // COPY - copySelectedNotes(); - case FlxKey.V: // PASTE - for (note in getSelectedNotes()) - note.selected = false; - if (copiedNotes.length > 0) { - var generatedNotes:Array = []; - for (note in Chart.generateNotesFromArray(copiedNotes, true)) { - var charterNote:CharterNote = cast note; - if (charterNote == null) continue; - - generatedNotes.push(charterNote); - charterNote.justCopied = true; - charterNote.selected = true; - } - var quantMult:Float = quant / 4; - var beatDiff:Float = (Math.round(conductorInUse.beat * quantMult) / quantMult - generatedNotes[0].beatTime); - for (note in generatedNotes) { - note.beatTime += beatDiff; - queueNote(note); - } - addUndo({type: PLACED_NOTES, notes: generatedNotes, pasted: true}); - } - case FlxKey.X: // CUT - copySelectedNotes(); - var deletedNotes:Array = []; - for (note in getSelectedNotes()) { - note.lane.dequeueNote(note); - note.lane.killNote(note); - deletedNotes.push(note); - } - if (deletedNotes.length > 0) - addUndo({type: REMOVED_NOTES, notes: deletedNotes}); - case FlxKey.A: // SELECT ALL - var selectedAny:Bool = false; - forEachNote((note:Note) -> { - var charterNote:CharterNote = cast note; - if (charterNote == null) return; - - if (!charterNote.selected) { - charterNote.selected = true; - selectedAny = true; - } - }, true); - - if (!selectedAny) { - forEachNote((note:Note) -> { - var charterNote:CharterNote = cast note; - if (charterNote == null) return; - - charterNote.selected = false; - }, true); - } - default: - } - } - public function restrictConductor() { - var limitTime:Float = Math.max(conductorInUse.songPosition, 0); - limitTime = Math.min(limitTime, music.syncBase?.length ?? 0); - - conductorInUse.songPosition = limitTime; - } - public function placeNotes() { - for (key => held in heldKeybinds) { - if (held && heldNotes[key] == null) - placeNote(key); + override public function update(elapsed:Float) { + if (FlxG.keys.justPressed.ESCAPE) { + FlxG.switchState(() -> new PlayState(chart)); + return; } - } - public function findSongLength() { - var length:Null = chart?.songLength; - if (length == null) // todo - length = 0; - return length; - } - public function keyReleaseEvent(event:KeyboardEvent) { - var key:FlxKey = event.keyCode; - heldKeys.remove(key); - var keybind:Int = Controls.keybindFromArray(keybinds, key); - if (keybind >= 0) inputOff(keybind); - } - - public function changeQuant(mod:Int) { - var quantIndex:Int = FlxMath.wrap(quants.indexOf(quant) + mod, 0, quants.length - 1); - quantGraphic.animation.curAnim.curFrame = Std.int(Math.min(quantIndex, quantGraphic.animation.curAnim.numFrames - 1)); - quant = quants[quantIndex]; - quantText.text = Std.string(quant); - } - public function inputOn(keybind:Int) { - heldKeybinds[keybind] = true; - placeNote(keybind); - } - public function placeNote(keybind:Int) { - var strumlineId:Int = 0; - var data:Int = keybind; - for (strumline in strumlines) { - if (data >= strumline.laneCount) { - data -= strumline.laneCount; - strumlineId ++; - } - } - var quantMultiplier:Float = (quant / 4); - var strumline:Strumline = strumlines.members[strumlineId]; - var lane = strumline.getLane(data); - var matchingNote:Null = null; - for (note in lane.notes) { - if (note.isHoldPiece) continue; - if (Math.abs(note.beatTime - conductorInUse.beat) < 1 / quantMultiplier - .0012) { - matchingNote = cast note; - break; - } - } - if (matchingNote == null) { - hitsound.play(true); - var isPlayer:Bool = (strumlineId == 0); - var snappedBeat:Float = Math.round(conductorInUse.beat * quantMultiplier) / quantMultiplier; - var note:CharterNote = new CharterNote(isPlayer, 0, data); - heldNotes[keybind] = note; - note.beatTime = snappedBeat; - note.preventDespawn = true; - note.justPlacing = true; - lane.insertNote(note); - } else { - var deletedNotes:Array = [matchingNote]; - for (child in matchingNote.children) - deletedNotes.push(cast child); - - for (note in deletedNotes) { - note.lane.dequeueNote(note); - note.lane.killNote(note); - } - addUndo({type: REMOVED_NOTES, notes: deletedNotes}); + if (FlxG.keys.justPressed.SPACE) { + songPaused = !songPaused; } - } - public function inputOff(keybind:Int) { - heldKeybinds[keybind] = false; - var note:CharterNote = heldNotes[keybind]; - if (note != null) { - for (note in getSelectedNotes()) - note.selected = false; - - var addedNotes:Array = [note]; - for (child in note.children) - addedNotes.push(cast child); - - addUndo({type: PLACED_NOTES, notes: addedNotes}); - - FunkinSound.playOnce(Paths.sound('hitsoundTail'), .7); - note.justPlacing = false; - note.preventDespawn = false; - for (child in note.children) { - var charterNote:CharterNote = cast child; - if (charterNote == null) continue; - - charterNote.preventDespawn = false; - charterNote.justPlacing = false; - } - heldNotes[keybind] = null; - } - } - public function updateHolds() { - var quantMultiplier:Float = (quant * .25); - var snappedBeat:Float = Math.round(conductorInUse.beat * quantMultiplier) / quantMultiplier; - for (note in heldNotes) { - if (note == null) continue; - - var lane:Lane = note.lane; - note.beatLength = snappedBeat - note.beatTime; - if (note.beatLength > 0) { - if (note.children.length == 0) { - var piece:CharterNote = new CharterNote(note.player, note.msTime, note.noteData, note.msLength, note.noteKind, true); - piece.justPlacing = note.justPlacing; - piece.preventDespawn = true; - note.children.push(piece); - piece.parent = note; - var tail:CharterNote = new CharterNote(note.player, note.msTime, note.noteData, 0, note.noteKind, true); - tail.justPlacing = note.justPlacing; - tail.preventDespawn = true; - note.children.push(tail); - tail.parent = note; - note.tail = tail; - - lane.insertNote(tail); - lane.insertNote(piece); - - piece.beatLength = note.beatLength; //What - tail.beatTime = snappedBeat; - } else { - var piece:Note = note.children[0]; - piece.beatLength = note.beatLength; - note.tail.beatTime = snappedBeat; - - lane.updateNote(note.tail); - lane.updateNote(piece); - } - } else { - while (note.children.length > 0) { - var child:Note = note.children.shift(); - lane.killNote(child); - child.destroy(); - } - } - } - } - public function saveToChart(chart:Chart) { - if (chart == null) return; - chart.notes.resize(0); - for (strumline in strumlines) { - for (lane in strumline.lanes) { - for (note in lane.getAllNotes()) { - if (note.isHoldPiece) continue; - chart.notes.push(note.toChartNote()); - } - } - } - chart.sort(); - chart.findSongLength(); - } - public function setWindowTitle(mod:Bool = false) { - var win:lime.ui.Window = FlxG.stage.window; - win.title = chart.name; - if (mod) - win.title += '*'; - if (chart.difficulty != '') - win.title += ' (' + chart.difficulty.toLowerCase() + ')'; - win.title += ' | ' + Main.windowTitle; + super.update(elapsed); } override public function destroy() { - instance = null; - inEditor = false; - FlxG.stage.window.title = Main.windowTitle; - FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPressEvent); - FlxG.stage.removeEventListener(KeyboardEvent.KEY_UP, keyReleaseEvent); - FlxG.stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEvent); Main.instance.removeChild(charterDisplay); - Main.watermark.visible = true; super.destroy(); + instance = null; } } -@:structInit class UndoAction { - public var notes:Array; - public var type:UndoActionType; - - public var pasted:Bool = false; - public var beatMod:Float = 0; - public var laneMod:Int = 0; - - public function message() { - var notesCount:Int = 0; - var longMatch:Bool = true; - var kindMatch:Bool = true; - var length:Null = null; - var kind:Null = null; - - for (note in notes) { - if (note.isHoldPiece) - continue; - - notesCount ++; - length ??= note.beatLength; - if ((length > 0) != (note.beatLength > 0)) - longMatch = false; - kind ??= note.noteKind; - if (kind != note.noteKind) - kindMatch = false; - } - - var notesStr:String = (longMatch && length > 0 ? 'long note' : 'note'); - if (notesCount != 1) notesStr += 's'; - if (kindMatch && kind != '') notesStr += ' ($kind)'; - if (notesCount != 1) notesStr = '$notesCount $notesStr'; - - return switch (type) { - case PLACED_NOTES: - '${pasted ? 'copied' : 'added'} $notesStr'; - case REMOVED_NOTES: - 'removed $notesStr'; - case SHIFTED_NOTES: - 'shifted $notesStr'; - } - } -} -enum UndoActionType { - PLACED_NOTES; - REMOVED_NOTES; - SHIFTED_NOTES; -} - -class MeasureLine extends FlxSpriteGroup { - public var barText:FlxText; - public var startTime:Float; - public var ySpacing(default, set):Float; - public var lineWidth(default, set):Float; - public var measureBeats(default, set):Int; - public var lines:FlxTypedSpriteGroup; //this is getting outta hand - - public function new(x:Float = 0, y:Float = 0, bar:Int = 0, time:Float = 0, beats:Int = 4, width:Float = 160, spacing:Float = 160) { - super(x, y); - lines = new FlxTypedSpriteGroup(); - measureBeats = beats; - ySpacing = spacing; - lineWidth = width; - startTime = time; - - add(lines); - - barText = new FlxText(0, 0, 400, Std.string(bar)); - barText.setFormat(Paths.font('vcr.ttf'), 40, FlxColor.WHITE, RIGHT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); - barText.y += -barText.height * .5 + 3; - barText.x = -barText.width - 24; - barText.active = false; - add(barText); - } - - public function set_measureBeats(newBeats:Int) { - if (measureBeats == newBeats) return newBeats; - - while (lines.length > 0 && lines.length >= newBeats) { - var line = lines.members[0]; - lines.remove(line, true); - line.destroy(); - } - var isBar:Bool = true; - for (i in 0...newBeats) { - var line:FunkinSprite; - if (i >= lines.length) { - line = new FunkinSprite(); - line.makeGraphic(1, 1, -1); - line.spriteOffset.y = .5; - line.active = false; - lines.add(line); - } else { - line = lines.members[i]; - } - line.y = i * ySpacing; - line.setGraphicSize(width, isBar ? 12 : 6); - line.alpha = (isBar ? .8 : .5); - line.updateHitbox(); - line.active = false; - isBar = false; - } - return measureBeats = newBeats; - } - public function set_ySpacing(newSpacing:Float) { - if (ySpacing == newSpacing) return newSpacing; - - var i:Int = 0; - for (line in lines) - line.y = (i ++) * newSpacing; - return ySpacing = newSpacing; - } - public function set_lineWidth(newWidth:Float) { - if (lineWidth == newWidth) return newWidth; - - for (line in lines) { - line.setGraphicSize(newWidth, line.height); - line.updateHitbox(); - } - return lineWidth = newWidth; - } -} +// OTHER CLASSES (move to funkin/debug/?) -class CharterPopUp extends Sprite { - public var message(default, set):String; - public var isUndo(default, set):Bool; - public var isRedo(default, set):Bool; - public var text:TextField; - public var icon:Bitmap; - - public function new() { - super(); - - icon = new Bitmap(); - icon.smoothing = true; - icon.scaleX = icon.scaleY = .65; - icon.y = 3; - - var smallTf:TextFormat = new TextFormat('_sans', 12, -1); - smallTf.letterSpacing = -1; - text = new TextField(); - text.autoSize = LEFT; - text.selectable = false; - text.mouseEnabled = false; - text.defaultTextFormat = smallTf; - addChild(text); - } - public function set_isRedo(isIt:Bool) { - icon.bitmapData = Paths.bmd('charter/' + (isIt ? 'redo' : 'undo')); - return isRedo = isIt; - } - public function set_isUndo(isIt:Bool) { - if (isIt && !contains(icon)) { - addChild(icon); - } else if (!isIt && contains(icon)) { - removeChild(icon); - } - text.x = (isIt ? 13 : 0); - return isUndo = isIt; - } - public function set_message(mes:String) { - text.text = mes; - return message = mes; - } -} class CharterDisplay extends Sprite { public var funnyQuarterNote:Bitmap; public var conductorText:TextField; @@ -1365,8 +241,7 @@ class CharterDisplay extends Sprite { repositionTexts(); }}); } - function getTextPos(i:Int) - return 35 + i * 15; + inline function getTextPos(i:Int) { return 35 + i * 15; } function repositionTexts() { for (i => pop in popUps) { if (!contains(pop)) continue; @@ -1379,7 +254,7 @@ class CharterDisplay extends Sprite { var metronomeTextT:String = ' = ${conductor.bpm}\n${conductor.timeSignature.toString()}'; var songPosTextT:String = FlxStringUtil.formatTime(conductor.songPosition * .001, true) + ' / ' + FlxStringUtil.formatTime(songLength * .001, true); var conductorTextT:String = 'Measure: ${Math.floor(conductor.bar)}\nBeat: ${Math.floor(conductor.beat)}\nStep: ${Math.floor(conductor.step)}'; - var noteInfoTextT:String = '${charter.hitNoteCount} notes (${charter.fullNoteCount} obj)'; + var noteInfoTextT:String = '${charter.noteCount} notes'; if (metronomeText.text != metronomeTextT) metronomeText.text = metronomeTextT; if (conductorText.text != conductorTextT) conductorText.text = conductorTextT; @@ -1405,189 +280,45 @@ class CharterDisplay extends Sprite { } } -class CharterStrumline extends Strumline { - public var receptorAlpha:Float = 1; - public var noteHighlight:FlxSprite; - - public function new(laneCount:Int = 4, direction:Float = 90, scrollSpeed:Float = 1) { - super(laneCount, direction, scrollSpeed); - noteHighlight = new FlxSprite().makeGraphic(1, 1, FlxColor.WHITE); - noteHighlight.blend = ADD; - } - - public override function draw() { - for (lane in lanes) { // draw hit notes on bottom - if (!lane.selfDraw) { - if (lane.receptor != null) - lane.receptor.alpha = receptorAlpha; - for (note in lane.notes) { - var charterNote:CharterNote = cast note; - if (charterNote == null) continue; - - charterNote.drawCustom(true); - if (charterNote.wasGoodHit()) - drawHighlight(charterNote); - } - } - } - super.draw(); - for (lane in lanes) { // draw on top - if (!lane.selfDraw) { - if (lane.receptor != null) - lane.receptor.alpha = 1; - for (note in lane.notes) { - var charterNote:CharterNote = cast note; - if (charterNote == null) { - note.draw(); - continue; - } - - charterNote.drawCustom(false); - if (!charterNote.wasGoodHit()) - drawHighlight(charterNote); - } - lane.drawTop(); - } - } - } - public function drawHighlight(note:CharterNote) { - if (note.selected && !note.isHoldPiece) { - Util.copyColorTransform(noteHighlight.colorTransform, note.colorTransform); - noteHighlight.setGraphicSize(note.width, note.height); - noteHighlight.colorTransform.alphaMultiplier = .25; - noteHighlight.setPosition(note.x, note.y); - noteHighlight.updateHitbox(); - noteHighlight.draw(); - } - } -} -class CharterNote extends Note { - public var highlighted(default, set):Bool = false; - public var hitAlphaMult:Float = .7; - public var selected(default, set):Bool = false; - public var justPlacing:Bool = false; - public var justCopied:Bool = false; - public var useLaneRGB:Bool = true; - - var pointer:FlxObject; - var noteKindDecal:FunkinSprite = null; +class CharterPopUp extends Sprite { + public var message(default, set):String; + public var isUndo(default, set):Bool; + public var isRedo(default, set):Bool; + public var text:TextField; + public var icon:Bitmap; - public function new(player:Bool, msTime:Float, noteData:Int, msLength:Float = 0, type:String = '', isHoldPiece:Bool = false, ?conductor:Conductor) { - super(player, msTime, noteData, msLength, type, isHoldPiece, conductor); - pointer = new FlxObject(); - } - public function set_highlighted(isHighlighted:Bool) { - if (highlighted == isHighlighted) return isHighlighted; - for (child in children) - cast(child, CharterNote).highlighted = isHighlighted; - highlighted = isHighlighted; - updateHighlight(); - return isHighlighted; - } - public function set_selected(isSelected:Bool) { - if (selected == isSelected) return isSelected; - if (!isSelected) justCopied = false; - for (child in children) { - var charterNote:CharterNote = cast child; - charterNote.justCopied = justCopied; - charterNote.selected = isSelected; - } - selected = isSelected; - updateHighlight(); - return isSelected; - } - public function updateHighlight() { - if (selected) { - if (justCopied) { - setColorTransform(0, 1, 1); - } else { - setColorTransform(0, 1, 0); - } - } else if (highlighted) { - setColorTransform(1.6, 1.6, 1.6, 1, 32, 32, 32); - } else { - setColorTransform(); - } - } - public override function set_noteKind(newKind:String) { - if (noteKind == newKind) return newKind; - if (newKind == '') { - if (lane != null) shader = lane.rgbShader.shader; - noteKindDecal.destroy(); - noteKindDecal = null; - useLaneRGB = true; - } else { - shader = CharterState.genericRGB.shader; - useLaneRGB = false; - noteKindDecal ??= new FunkinSprite(); - noteKindDecal.loadTexture('charter/noteKinds/$newKind'); - if (noteKindDecal.graphic == null) noteKindDecal.loadTexture('charter/noteKinds/generic'); - } - return noteKind = newKind; - } - public function wasGoodHit() - return (goodHit || (parent != null && parent.goodHit)); - public function drawCustom(good:Bool = false) { - var wasGood:Bool = wasGoodHit(); - if (wasGood != good) return; + public function new() { + super(); - var prevAlpha:Float = alpha; - if (wasGood) alpha *= hitAlphaMult; - if (justPlacing) alpha *= .75; - actuallyDraw(); - alpha = prevAlpha; + icon = new Bitmap(); + icon.smoothing = true; + icon.scaleX = icon.scaleY = .65; + icon.y = 3; + + var smallTf:TextFormat = new TextFormat('_sans', 12, -1); + smallTf.letterSpacing = -1; + text = new TextField(); + text.autoSize = LEFT; + text.selectable = false; + text.mouseEnabled = false; + text.defaultTextFormat = smallTf; + addChild(text); } - public function actuallyDraw() { - super.draw(); - if (!isHoldPiece && noteKindDecal != null) { - Util.copyColorTransform(noteKindDecal.colorTransform, this.colorTransform); - noteKindDecal.scale.set(scale.x, scale.y); - noteKindDecal.updateHitbox(); - noteKindDecal.setPosition(x + (width - noteKindDecal.width) * .5, y + (height - noteKindDecal.height) * .5); - noteKindDecal.camera = camera; - noteKindDecal.draw(); - } - pointer.x = x; - pointer.y = y; - if (!isHoldPiece && noteKind != '' && highlighted && CharterState.inEditor && !FlxG.mouse.pressed) { - pointer.x += width * .7; - pointer.y += height * .3; - var charter:CharterState = CharterState.instance; - var bubblePos:FlxPoint = getPointerScreenPosition(pointer); - charter.noteKindBubble.setPosition( - bubblePos.x, - bubblePos.y - charter.noteKindBubble.height - ); - charter.noteKindBubble.draw(); - - charter.noteKindBubbleText.text = noteKind; - charter.noteKindBubbleText.setPosition( - charter.noteKindBubble.x + 46, - charter.noteKindBubble.y + 20 - ); - charter.noteKindBubbleText.draw(); - - if (noteKindDecal != null) { - noteKindDecal.camera = charter.camHUD; - noteKindDecal.setColorTransform(); - noteKindDecal.scale.set(.35, .35); - noteKindDecal.updateHitbox(); - noteKindDecal.alpha = .75; - noteKindDecal.setPosition( - charter.noteKindBubble.x - noteKindDecal.width * .5 + 25, - charter.noteKindBubble.y - noteKindDecal.height * .5 + 32, - ); - noteKindDecal.draw(); - } + public function set_isRedo(isIt:Bool) { + icon.bitmapData = Paths.bmd('charter/' + (isIt ? 'redo' : 'undo')); + return isRedo = isIt; + } + public function set_isUndo(isIt:Bool) { + if (isIt && !contains(icon)) { + addChild(icon); + } else if (!isIt && contains(icon)) { + removeChild(icon); } + text.x = (isIt ? 13 : 0); + return isUndo = isIt; } - public override function draw() {} - public function getPointerScreenPosition(pointer:FlxObject, ?camera:FlxCamera):FlxPoint { - camera ??= pointer.camera ?? FlxG.camera; - - var point:FlxPoint = pointer.getScreenPosition(camera); - point.subtract(camera.viewMarginLeft, camera.viewMarginTop); - point.scale(camera.zoom); - return point; + public function set_message(mes:String) { + text.text = mes; + return message = mes; } -}*/ \ No newline at end of file +} \ No newline at end of file diff --git a/source/funkin/states/CharterStateOld.hx b/source/funkin/states/CharterStateOld.hx new file mode 100644 index 0000000..b8b3314 --- /dev/null +++ b/source/funkin/states/CharterStateOld.hx @@ -0,0 +1,1541 @@ +package funkin.states; + +/*import funkin.objects.Character; +import funkin.objects.play.Note; +import funkin.objects.play.*; +import funkin.shaders.RGBSwap; +import funkin.backend.play.Chart; +import funkin.states.FreeplaySubState.FreeplaySongText; + +import sys.thread.Thread; +import openfl.display.Sprite; +import openfl.display.Bitmap; +import openfl.text.TextFormat; +import openfl.text.TextField; +import openfl.events.MouseEvent; +import openfl.events.KeyboardEvent; +import flixel.util.FlxStringUtil; +import flixel.input.keyboard.FlxKey; +import flixel.addons.display.FlxBackdrop; + +class CharterState extends FunkinState { + public static var genericRGB:RGBSwap; + + public static var instance:CharterState; + public static var inEditor:Bool = false; + public static var chart:Chart; + + public var quant:Int = 4; + public var quantText:FlxText; + public var quantGraphic:FunkinSprite; + public var measureLines:FlxTypedSpriteGroup; + public var strumlines:FlxTypedSpriteGroup; + public var strumlineHighlight:FunkinSprite; + public var charterDisplay:CharterDisplay; + public var camHUD:FunkinCamera; + public var camScroll:FunkinCamera; + + public var noteKindBubble:FunkinSprite; + public var noteKindBubbleText:FreeplaySongText; + public var noteKindBubbleFocusGraphic:FlxGraphic; + + public var selectionBox:FlxSprite; + public var selectionLeniency:Float = 55; + public var pickedNote:CharterNote = null; + public var draggingNotes:Bool = false; + var pickedLaneIndex:Int = 0; + var pickedBeat:Float = 0; + + public var keybinds:Array> = []; + + var vocalsSounds:Array = []; + public var music:FunkinSoundGroup; + public var tickSound:FlxSound; + public var hitsound:FlxSound; + + public var scrollSpeed(default, set):Float = 1; + public var songPaused(default, set):Bool; + var visualScrollSpeed(get, never):Float; + + public var fullNoteCount:Int = 0; + public var hitNoteCount:Int = 0; + + var lastMouseY:Float = 0; + var scrolling:Bool = false; + var strumGrabY:Null = null; + var heldKeys:Array = []; + var heldKeybinds:Array = []; + var copiedNotes:Array = []; + var heldNotes:Array = []; + var quants:Array = [4, 8, 12, 16, 24, 32, 48, 64, 96, 192]; + + var undoMemory:Int = 15; + var undoActions:Array = []; + var redoActions:Array = []; + + public function new(?chart:Chart) { + super(); + CharterState.chart = chart ?? CharterState.chart ?? Chart.loadChart('test'); + } + + override public function create() { + super.create(); + Main.instance.addChild(charterDisplay = new CharterDisplay(conductorInUse = new Conductor())); // wow! + + beatHit.add(beatHitEvent); + barHit.add(barHitEvent); + + music = new FunkinSoundGroup(); + tickSound = FunkinSound.load(Paths.sound('beatTick')); + hitsound = FunkinSound.load(Paths.sound('hitsound')); + hitsound.volume = .7; + + genericRGB ??= new RGBSwap(0xb3a9b8, FlxColor.WHITE, 0x333333); + inEditor = true; + instance = this; + + FlxG.camera.zoom = .5; + + camHUD = new FunkinCamera(); + camScroll = new FunkinCamera(); + camScroll.bgColor.alpha = 0; + camHUD.bgColor.alpha = 0; + FlxG.cameras.add(camScroll, false); + FlxG.cameras.add(camHUD, false); + + noteKindBubble = new FunkinSprite().loadTexture('charter/bubble'); + noteKindBubble.scale.set(.75, .75); + noteKindBubble.updateHitbox(); + noteKindBubble.camera = camHUD; + noteKindBubble.color = 0xff323034; + noteKindBubble.alpha = .6; + noteKindBubbleText = new FreeplaySongText(0, 0, '', 0x808080, .8); //ffe0b0d0; + noteKindBubbleText.size = 16; + noteKindBubbleText.angle = -3; + noteKindBubbleText.origin.set(0, 6); + noteKindBubbleText.camera = camHUD; + + selectionBox = new FlxSprite().makeGraphic(1, 1, FlxColor.LIME); + selectionBox.camera = camScroll; + selectionBox.visible = false; + selectionBox.blend = ADD; + selectionBox.alpha = .25; + selectionBox.origin.set(); + add(selectionBox); + var background:FlxBackdrop = new FlxBackdrop(Paths.image('charter/bg')); + background.antialiasing = true; + background.scale.set(.85, .85); + background.velocity.set(5, 5); + add(background); + var underlay:FunkinSprite = new FunkinSprite(0, 0, false).makeGraphic(1, FlxG.height, 0xff101010); + underlay.screenCenter(); + underlay.alpha = .7; + add(underlay); + + measureLines = new FlxTypedSpriteGroup(); + strumlines = new FlxTypedSpriteGroup(); + add(measureLines); + add(strumlines); + + for (key in [FlxKey.ONE, FlxKey.TWO, FlxKey.THREE, FlxKey.FOUR, FlxKey.FIVE, FlxKey.SIX, FlxKey.SEVEN, FlxKey.EIGHT]) { + keybinds.push([key]); + heldNotes.push(null); + heldKeybinds.push(false); + } + + var strumlineSpacing:Float = 150; + var xx:Float = 0; + var h:Float = 0; + for (i in 0...2) { + var strumline = new CharterStrumline(4); + strumline.x = xx; + strumline.cpu = false; + strumline.oneWay = false; + strumlines.add(strumline); + xx += strumline.strumlineWidth + strumlineSpacing; + h = Math.max(h, strumline.strumlineHeight); + for (lane in strumline.lanes) { + lane.receptor.autoReset = true; + lane.oneWay = false; + } + } + strumlines.y = FlxG.height * .5 - h * .5 - 320; + strumlines.x = (FlxG.width - (xx - strumlineSpacing)) * .5; + + strumlineHighlight = new FunkinSprite().makeGraphic(1, 1, 0xffb094b0); + strumlineHighlight.setGraphicSize(strumlines.width, strumlines.height); + strumlineHighlight.updateHitbox(); + strumlineHighlight.blend = ADD; + strumlineHighlight.alpha = .25; + + FlxG.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressEvent); + FlxG.stage.addEventListener(KeyboardEvent.KEY_UP, keyReleaseEvent); + FlxG.stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEvent); + + setWindowTitle(); + + chart.instLoaded = false; + chart.loadMusic('data/songs/${chart.path}/', false); + if (chart.instLoaded) { + music.add(chart.inst); + music.syncBase = chart.inst; + music.onSoundFinished.add((snd:FunkinSound) -> { + if (snd == music.syncBase) + finishSong(); + }); + conductorInUse.syncTracker = chart.inst; + } + loadVocals(chart.path, chart.audioSuffix); + + scrollSpeed = chart.scrollSpeed; + conductorInUse.metronome.tempoChanges = chart.tempoChanges; + + for (note in chart.notes) { + var targetNote:ChartNote = note.copy(); + var strumline:CharterStrumline = strumlines.members[targetNote.laneIndex]; + strumline?.queueNote(targetNote, null, false, false); + } + + songPaused = true; + recalculateNoteCount(); + charterDisplay.songLength = findSongLength(); + + var bgPadding:Float = 50; + underlay.setGraphicSize(strumlines.width + bgPadding * 2, FlxG.height * 5); + + quantGraphic = new FunkinSprite().loadAtlas('charter/quant'); + quantGraphic.addAnimation('quant', 'new quant', 0); + quantGraphic.playAnimation('quant', true); + quantGraphic.updateHitbox(); + //quantGraphic.x = strumlines.x + xx - strumlineSpacing; + quantGraphic.y = strumlines.y + (h - quantGraphic.height) * .5; + quantGraphic.screenCenter(X); + add(quantGraphic); + + quantText = new FlxText(0, 0, 300); + quantText.setFormat(Paths.ttf('vcr'), 40, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); + quantText.borderSize = 4; + quantText.updateHitbox(); + quantText.y = strumlines.y + (h - quantText.height) * .5; + quantText.screenCenter(X); + add(quantText); + changeQuant(0); + + add(strumlineHighlight); + + var measureBeats:Array = conductorInUse.getMeasureBeats(findSongLength()); + var beatLength:Float = Math.ceil(conductorInUse.convertMeasure(findSongLength(), MS, BEAT)); + for (measure => beat in measureBeats) { + conductorInUse.beat = beat; // todo: fix mid-bar bpm changes...hehe + var beatLength:Int = Std.int((measureBeats[measure + 1] ?? beatLength) - beat); + var spacing:Float = Note.msToDistance(conductorInUse.crochet, visualScrollSpeed); + var line:MeasureLine = new MeasureLine(strumlines.x - bgPadding, strumlines.y, measure, beat, beatLength, strumlines.width + bgPadding * 2, spacing); + measureLines.add(line); + } + + conductorInUse.songPosition = 0; + } + + public function loadVocals(path:String, audioSuffix:String = '') { + vocalsSounds.resize(0); + + for (chara in [chart.player1, chart.player2, chart.player3]) { + var sound:openfl.media.Sound = Character.getVocals(chart.path, chart.audioSuffix, chara); + if (sound != null) + vocalsSounds.push(FunkinSound.load(sound)); + } + if (vocalsSounds.length == 0) { + var sound:openfl.media.Sound = Character.getVocals(chart.path, chart.audioSuffix, ''); + if (sound != null) { + vocalsSounds.push(FunkinSound.load(sound)); + } else { + Log.warning('song vocals not found...'); + } + } + for (sound in vocalsSounds) { + sound.volume = 0; + sound.play().stop(); + sound.volume = 1; + music.add(sound); + } + } + + override public function update(elapsed:Float) { + if (FlxG.keys.justPressed.ENTER) { + var shifted:Bool = FlxG.keys.pressed.SHIFT; + chart.tempoChanges = conductorInUse.metronome.tempoChanges; + saveToChart(chart); + FlxG.switchState(() -> new PlayState(chart, shifted)); + return; + } + + // selection and dragging + var highlightedNote:CharterNote = null; + var highlightedSelNote:CharterNote = null; + var anyNoteHovered:Bool = (pickedNote != null); + forEachNote((note:Note) -> { + var charterNote:CharterNote = cast note; + if (charterNote == null) return; + + if (FlxG.mouse.overlaps(note)) { + anyNoteHovered = true; + if (charterNote.selected) { + if (highlightedSelNote == null) { + highlightedSelNote = charterNote; + } else { + var mousePoint:FlxPoint = FlxG.mouse.getWorldPosition(); + if (mousePoint.distanceTo(note.getMidpoint()) < mousePoint.distanceTo(highlightedSelNote.getMidpoint())) + highlightedSelNote = charterNote; + } + if (FlxG.mouse.justPressed) { + pickedNote = highlightedSelNote; + pickedBeat = pickedNote.beatTime; + pickedLaneIndex = laneToIndex(pickedNote.lane); + } + } else { + if (highlightedNote == null) { + highlightedNote = charterNote; + } else { + var mousePoint:FlxPoint = FlxG.mouse.getWorldPosition(); + if (mousePoint.distanceTo(note.getMidpoint()) < mousePoint.distanceTo(highlightedNote.getMidpoint())) + highlightedNote = charterNote; + } + } + } + }); + + var selectedAny:Bool = false; + var isSelecting:Bool = (selectionBox.visible && Math.abs(selectionBox.scale.x) >= 12 && Math.abs(selectionBox.scale.y) >= 12); + if (FlxG.mouse.pressed && strumGrabY == null) { + if (pickedNote != null) { + var pickedLane:Lane = null; // drag and twist notes + for (strumline in strumlines) { + for (lane in strumline.lanes) { + if (FlxG.mouse.x >= lane.receptor.x && FlxG.mouse.x <= lane.receptor.x + lane.receptor.width) { + pickedLane = lane; + break; + } + } + } + var selectedNotes:Array = getSelectedNotes(); + + readjustScrollCam(); + var quantMult:Float = (quant / 4); + var cursorBeatTime:Float = Note.distanceToMS(FlxG.mouse.getWorldPosition(camScroll).y, visualScrollSpeed) / conductorInUse.crochet; + var snappedBeatTime:Float = Math.round(cursorBeatTime * quantMult) / quantMult; + var beatDiff:Float = (snappedBeatTime - pickedNote.beatTime); + + if (shiftNotes(selectedNotes, beatDiff) != 0) + draggingNotes = true; + + if (pickedLane != null && pickedLane != pickedNote.lane) { + var laneDiff:Int = laneToIndex(pickedLane) - laneToIndex(pickedNote.lane); + if (twistNotes(selectedNotes, laneDiff) != 0) + draggingNotes = true; + } + } else { + var mousePos:FlxPoint = FlxG.mouse.getWorldPosition(camScroll); + if (FlxG.mouse.justPressed || !selectionBox.visible) { + selectionBox.setPosition(mousePos.x, mousePos.y); + selectionBox.visible = true; + } + selectionBox.scale.set(mousePos.x - selectionBox.x, mousePos.y - selectionBox.y); + } + } else if (selectionBox.visible) { + //do the selection! + var selectionBounds:FlxRect = selectionBox.getScreenBounds(null, camScroll); + if (selectionBox.scale.x < 0) selectionBounds.x += selectionBox.scale.x; + if (selectionBox.scale.y < 0) selectionBounds.y += selectionBox.scale.y; + + if (isSelecting) { + forEachNote((note:Note) -> { + var charterNote:CharterNote = cast note; + if (charterNote == null) return; + + charterNote.followLane(note.lane, note.lane.scrollSpeed); + + var noteBounds:FlxRect = charterNote.getScreenBounds(); + noteBounds.x += selectionLeniency; + noteBounds.y += selectionLeniency; + noteBounds.width -= selectionLeniency * 2; + noteBounds.height -= selectionLeniency * 2; + if (noteBounds.overlaps(selectionBounds)) { + charterNote.selected = true; + selectedAny = true; + } else if (!FlxG.keys.pressed.SHIFT) { + charterNote.selected = false; + } + }, true); + } + + selectionBox.visible = false; + } + if (highlightedNote == null) + highlightedNote = highlightedSelNote; + forEachNote((note:Note) -> { + var charterNote:CharterNote = cast note; + if (charterNote == null) return; + + charterNote.highlighted = (highlightedNote == note); + }); + if (FlxG.mouse.justReleased) { + if (pickedNote != null) { + final beatDiff:Float = pickedNote.beatTime - pickedBeat; + final laneDiff:Int = laneToIndex(pickedNote.laneIndex, pickedNote.strumlineIndex) - pickedLaneIndex; + if (beatDiff != 0 || laneDiff != 0) + addUndo({type: SHIFTED_NOTES, notes: getSelectedNotes(), laneMod: laneDiff, beatMod: beatDiff}); + } + if (!FlxG.keys.pressed.SHIFT && !draggingNotes && !selectedAny && strumGrabY == null) { + for (note in getSelectedNotes()) + note.selected = false; + } + if (highlightedNote != null) + highlightedNote.selected = true; + draggingNotes = false; + pickedNote = null; + } + + // time shift + if (!FlxG.keys.pressed.CONTROL && FlxG.keys.pressed.W != FlxG.keys.pressed.S) { + var msPerSec:Float = (FlxG.keys.pressed.SHIFT ? 2000 : 1000); + if (FlxG.keys.pressed.W) + msPerSec *= -1; + + if (songPaused) + songPaused = false; + conductorInUse.paused = true; + conductorInUse.songPosition += elapsed * msPerSec; + restrictConductor(); + + if (conductorInUse.songPosition <= 0 && msPerSec < 0) { + music.stop(); + } else if (msPerSec != 1000 || !scrolling || !music.playing) { + if (!music.playing) { + music.play(true, conductorInUse.songPosition); + } else { + music.time = conductorInUse.songPosition; + } + } + + scrolling = true; + } else if (scrolling) { + songPaused = true; + scrolling = false; + } + + // receptor dragging + var strumlinesHighlighted:Bool = (FlxG.mouse.overlaps(strumlineHighlight) && !isSelecting && !anyNoteHovered && !FlxG.mouse.pressedRight); + strumlineHighlight.setPosition(strumlines.x, strumlines.y); + if (FlxG.mouse.justPressed && strumlinesHighlighted) + strumGrabY = (FlxG.mouse.y - strumlines.y); + if (FlxG.mouse.justReleased) + strumGrabY = null; + strumlineHighlight.visible = (strumlinesHighlighted || strumGrabY != null); + if (FlxG.mouse.pressed && strumGrabY != null) { + var h:Float = strumlines.height; + var middle:Float = (FlxG.height - h) * .5; + var maxDist:Float = (FlxG.height - h - 25) * .5 / FlxG.camera.zoom; + strumlines.y = Util.clamp(FlxG.mouse.y - strumGrabY, -maxDist + middle, maxDist + middle); + strumlineHighlight.setPosition(strumlines.x, strumlines.y); + + quantGraphic.y = strumlines.y + (h - quantGraphic.height) * .5; + quantText.y = strumlines.y + (h - quantText.height) * .5; + } + + if (FlxG.keys.justPressed.SPACE) songPaused = !songPaused; + super.update(elapsed); + forEachNote((note:Note) -> { + var lane:Lane = note.lane; + if (!conductorInUse.paused) { + if (conductorInUse.songPosition >= note.msTime && (conductorInUse.songPosition <= note.endMs || !note.goodHit)) { + lane.receptor?.playAnimation('confirm', true); + if (!note.goodHit) + hitsound.play(true); + note.goodHit = true; + } + } else { + note.goodHit = (conductorInUse.songPosition > note.msTime + 1); + } + }); + + if (songPaused) { + FlxG.camera.zoom = Util.smoothLerp(FlxG.camera.zoom, .5, elapsed * 9); + } else { + var metronome:Metronome = conductorInUse.metronome; + var beatZoom:Float = 1 - FlxEase.quintOut(metronome.beat % 1); + var barZoom:Float = 1 - FlxEase.quintOut(Math.min((metronome.bar % 1) * metronome.timeSignature.numerator, 1)); + FlxG.camera.zoom = .5 + beatZoom * .003 + barZoom * .005; + } + + readjustScrollCam(); + for (line in measureLines) { + // line.ySpacing = Note.msToDistance(conductorInUse.crochet, visualScrollSpeed); + if (Math.abs(line.startTime - conductorInUse.beat) > 16) { + if (line.alive) line.kill(); + continue; + } + + if (!line.alive) line.revive(); + line.y = strumlines.y + strumlines.height * .5 + Note.msToDistance(conductorInUse.convertMeasure(line.startTime, BEAT, MS) - conductorInUse.songPosition, visualScrollSpeed); + } + + if (!paused) + updateHolds(); + } + public function readjustScrollCam() { + camScroll.scroll.y = Note.msToDistance(conductorInUse.songPosition, visualScrollSpeed) - strumlines.y - strumlines.height * .5; + camScroll.zoom = FlxG.camera.zoom; + } + override public function updateConductor(elapsed:Float = 0) { + var prevStep:Int = curStep; + var prevBeat:Int = curBeat; + var prevBar:Int = curBar; + + conductorInUse.update(elapsed * 1000); + + curStep = Math.floor(conductorInUse.step); + curBeat = Math.floor(conductorInUse.beat); + curBar = Math.floor(conductorInUse.bar); + + if (!songPaused) { + if (prevBar != curBar) barHit.dispatch(curBar); + if (prevBeat != curBeat) beatHit.dispatch(curBeat); + if (prevStep != curStep) stepHit.dispatch(curStep); + } + } + + public function beatHitEvent(beat:Int) { + tickSound.play(true); + } + public function barHitEvent(bar:Int) {} + public function mouseMoveEvent(event:MouseEvent) { + if (FlxG.mouse.pressedRight) { + if (!songPaused) + songPaused = true; + conductorInUse.songPosition -= Note.distanceToMS((event.stageY - lastMouseY) / Util.gameScaleY / FlxG.camera.zoom, visualScrollSpeed); + restrictConductor(); + + if (event.stageY <= 5) { + lastMouseY = (FlxG.stage.window.height - 5) + event.stageY - 10; + FlxG.stage.window.warpMouse(Std.int(event.stageX), Std.int(lastMouseY)); + return; + } else if (event.stageY >= FlxG.stage.window.height - 5) { + lastMouseY = 10 + event.stageY - (FlxG.stage.window.height - 5); + FlxG.stage.window.warpMouse(Std.int(event.stageX), Std.int(lastMouseY)); + return; + } + } + lastMouseY = event.stageY; + } + public function finishSong() { + songPaused = true; + conductorInUse.songPosition = (music.syncBase?.length ?? 0); + } + public function forEachNote(func:Note -> Void, includeQueued:Bool = false) { + for (strumline in strumlines) + strumline.forEachNote(func, includeQueued); + } + public function getSelectedNotes() { + var list:Array = []; + forEachNote((note:Note) -> { + var charterNote:CharterNote = cast note; + if (charterNote == null) return; + + if (charterNote.selected) + list.push(charterNote); + }, true); + return list; + } + public function queueNote(note:ChartNote):ChartNote { + var strumline:Strumline = strumlines.members[note.strumlineIndex]; + strumline?.queueNote(note); + strumline?.updateQueue(); + return note; + } + public function spawnNote(note:ChartNote):CharterNote { + var strumline:Strumline = strumlines.members[note.strumlineIndex]; + var lane:Lane = strumline?.getNoteLane(note); + var note:CharterNote = null; + if (lane != null) { + note = lane.insertNote(note); + strumline?.updateQueue(); + } + return note; + } + public function shiftNotes(notesArray:Array, beatMod:Float = 0):Float { + if (beatMod == 0) return 0; + var beatDiff:Float = beatMod; + var minBeat:Float = Math.POSITIVE_INFINITY; + var maxBeat:Float = Math.NEGATIVE_INFINITY; + for (note in notesArray) { + if (note.beatTime < minBeat) minBeat = note.beatTime; + if (note.beatTime > maxBeat) maxBeat = note.beatTime; + } + if (minBeat + beatDiff < 0) + beatDiff = -minBeat; + // todo max beat + if (beatDiff != 0) { + for (note in notesArray) + shiftNote(note, note.beatTime + beatDiff); + } + return beatDiff; + } + public function twistNotes(notesArray:Array, laneMod:Int = 0):Int { + if (laneMod == 0) return 0; + + var laneDiff:Int = laneMod; + var minLane:Int = 9999; // prevent notes from going out of bounds + var maxLane:Int = -1; + for (note in notesArray) { + var laneIdx:Int = laneToIndex(note.laneIndex, note.strumlineIndex); + if (laneIdx < minLane) minLane = laneIdx; + if (laneIdx > maxLane) maxLane = laneIdx; + } + if (minLane + laneDiff < 0) + laneDiff = -minLane; + if (maxLane + laneDiff >= getNumLanes()) + laneDiff = getNumLanes() - maxLane - 1; + + if (laneDiff != 0) { + for (note in notesArray) { + var laneIdx:Int = laneToIndex(note.laneIndex, note.strumlineIndex); + var nextLane:Lane = indexToLane(laneIdx + laneDiff); + if (nextLane == null) continue; + twistNote(note, nextLane); + } + } + return laneDiff; + } + public function shiftNote(note:CharterNote, beatTime:Float) { + if (note == null) { + Log.warning('shiftNote: ???'); + return; + } + + note.msTime = conductorInUse.convertMeasure(beatTime, BEAT, MS); + note.updateChartNote(); + } + public function twistNote(note:CharterNote, lane:Lane) { + if (note == null || lane == null) { + Log.warning('twistNote: ???'); + return; + } + if (Std.isOfType(note, CharterNote)) { + var charterNote:CharterNote = cast note; + if (charterNote == null) return; + + if (charterNote.useLaneRGB) + note.shader = lane.rgbShader.shader; + } + + note.strumlineIndex = getStrumlineIndex(findLaneStrumline(lane)); + note.laneIndex = lane.laneIndex; + + note.lane.killNote(note); + queueNote(note.chartNote); + + note.lane = lane; + } + public function getStrumlineIndex(strumline:CharterStrumline):Int + return strumlines.members.indexOf(strumline); + public function findLaneStrumline(lane:Lane):Int { + for (strumline in strumlines) { + var laneIdx:Int = strumline.lanes.indexOf(lane); + if (laneIdx != -1) return laneIdx; + } + return -1; + } + public function indexToLane(index:Int) { + var n:Int = -1; + for (strumline in strumlines) { + for (lane in strumline.lanes) { + n ++; + if (n == index) + return lane; + } + } + return null; + } + public function laneToIndex(laneIndex:Int, strumlineIndex:Int) { + var n:Int = 0; + for (i => strumline in strumlines) { + if (i == strumlineIndex) return n + laneIndex; + n += strumline.laneCount; + } + return -1; + } + public function getNumLanes() { + var count:Int = 0; + for (strumline in strumlines) + count += strumline.lanes.length; + return count; + } + + public function set_scrollSpeed(newSpeed:Float) { + scrollSpeed = newSpeed; + for (strumline in strumlines) { + strumline.scrollSpeed = visualScrollSpeed; + } + return newSpeed; + } + public function get_visualScrollSpeed() { + return scrollSpeed / .7; + } + public function set_songPaused(isPaused:Bool) { + if (isPaused) { + music.stop(); + } else { + if (conductorInUse.songPosition >= (music.syncBase?.length ?? 0)) + return songPaused = true; + music.play(true, conductorInUse.songPosition); + } + + for (strumline in strumlines) { + FlxTween.cancelTweensOf(strumline, ['receptorAlpha']); + FlxTween.tween(strumline, {receptorAlpha: (isPaused ? .75 : 1)}, .25, {ease: FlxEase.circOut}); + for (lane in strumline.lanes) { + if (isPaused) + lane.receptor?.playAnimation('static'); + } + } + conductorInUse.paused = isPaused; + return songPaused = isPaused; + } + + public function keyPressEvent(event:KeyboardEvent) { + var key:FlxKey = event.keyCode; + if (!heldKeys.contains(key)) heldKeys.push(key); + + var keybind:Int = Controls.keybindFromArray(keybinds, key); + if (keybind >= 0 && FlxG.keys.checkStatus(key, JUST_PRESSED)) + inputOn(keybind); + + var noteControlMode:Bool = FlxG.keys.pressed.CONTROL; + var scrollMod:Int = 1; + var leniency:Float = 1 / 256; + var prevBeat:Float = conductorInUse.beat; + var quantMultiplier:Float = (quant * .25); + var pauseChart:Bool = false; + if (noteControlMode) { + keyPressNoteControl(key); + } + switch (key) { + case FlxKey.DELETE: + var deletedNotes:Array = []; + for (note in getSelectedNotes()) { + deletedNotes.push(note.chartNote); + note.lane.dequeueNote(note); + note.lane.killNote(note); + } + if (deletedNotes.length > 0) + addUndo({type: REMOVED_NOTES, notes: deletedNotes}); + case FlxKey.LEFT | FlxKey.RIGHT: + if (key == FlxKey.LEFT) scrollMod *= -1; + if (noteControlMode) { + twistNotes(getSelectedNotes(), scrollMod); + } else { + changeQuant(scrollMod); + } + case FlxKey.UP | FlxKey.DOWN: + if (key == FlxKey.UP) scrollMod *= -1; + if (noteControlMode) { + shiftNotes(getSelectedNotes(), scrollMod / quantMultiplier); + } else { + placeNotes(); + pauseChart = true; + var targetBeat:Float = prevBeat + scrollMod / quantMultiplier; + if (Math.abs(prevBeat - Math.round(prevBeat * quantMultiplier) / quantMultiplier) < leniency * 2) + conductorInUse.beat = Math.round(targetBeat * quantMultiplier) / quantMultiplier; + else + conductorInUse.beat = (scrollMod > 0 ? Math.floor : Math.ceil)(targetBeat * quantMultiplier) / quantMultiplier; + } + case FlxKey.PAGEUP | FlxKey.PAGEDOWN: + placeNotes(); + pauseChart = true; + if (key == FlxKey.PAGEUP) scrollMod *= -1; + if (Math.abs(conductorInUse.bar - Std.int(conductorInUse.bar)) < (1 / quant - .0006)) + conductorInUse.bar = Math.max(0, conductorInUse.bar + scrollMod); + conductorInUse.bar = (scrollMod < 0 ? Math.floor : Math.ceil)(conductorInUse.bar); + case FlxKey.HOME: + pauseChart = true; + conductorInUse.songPosition = 0; + case FlxKey.END: + pauseChart = true; + conductorInUse.songPosition = findSongLength(); + default: + } + + if (pauseChart && !songPaused) + songPaused = true; + + restrictConductor(); + updateHolds(); + } + public function undo() { + var undoAction:UndoAction = undoActions.pop(); + if (undoAction != null) { + // Sys.println('undoing ${undoAction.type}'); + redoActions.unshift(undoAction); + switch (undoAction.type) { + case PLACED_NOTES: + for (note in undoAction.notes) { + note.lane.killNote(note); + } + case REMOVED_NOTES: + for (note in undoAction.notes) { + var note:CharterNote = spawnNote(note); + note.selected = true; + } + case SHIFTED_NOTES: + twistNotes(undoAction.notes, -undoAction.laneMod); + shiftNotes(undoAction.notes, -undoAction.beatMod); + default: + } + charterDisplay.addMessage(undoAction.message(), true, false); + recalculateNoteCount(); + } + } + public function redo() { + var undoAction:UndoAction = redoActions.shift(); + if (undoAction != null) { + // Sys.println('redoing ${undoAction.type}'); + undoActions.push(undoAction); + switch (undoAction.type) { + case PLACED_NOTES: + for (note in undoAction.notes) { + note.lane.queueNote(note); + note.selected = true; + } + case REMOVED_NOTES: + for (note in undoAction.notes) { + note.lane.dequeueNote(note); + note.lane.killNote(note); + } + case SHIFTED_NOTES: + twistNotes(undoAction.notes, undoAction.laneMod); + shiftNotes(undoAction.notes, undoAction.beatMod); + default: + } + charterDisplay.addMessage(undoAction.message(), true, true); + recalculateNoteCount(); + } + } + public function addUndo(action:UndoAction) { + // Sys.println('added undo action ${action.type}'); + setWindowTitle(true); + undoActions.push(action); + + while (undoActions.length > undoMemory) { + var undoAction:UndoAction = undoActions.shift(); + destroyUndoAction(undoAction, false); + } + for (undoAction in redoActions) + destroyUndoAction(undoAction, true); + redoActions.resize(0); + + charterDisplay.addMessage(action.message(), false, true); + recalculateNoteCount(); + } + public function destroyUndoAction(action:UndoAction, parallel:Bool = false) { + switch (action.type) { // parallel: for redo + case PLACED_NOTES | REMOVED_NOTES: + if (parallel == (action.type == REMOVED_NOTES)) + return; + for (note in action.notes) + note.destroy(); + default: + } + } + public function recalculateNoteCount() { + fullNoteCount = 0; + hitNoteCount = 0; + for (strumline in strumlines) { + strumline.forEachNote((note:Note) -> { + hitNoteCount ++; + fullNoteCount ++; + }, true); + } + } + public function copySelectedNotes() { + var selectedNotes:Array = getSelectedNotes(); + if (selectedNotes.length > 0) { + copiedNotes.resize(0); + for (note in selectedNotes) + copiedNotes.push(note.chartNote); + + copiedNotes.sort(Chart.sortByTime); + } + } + public function keyPressNoteControl(key:FlxKey) { + switch (key) { + case FlxKey.Z: + undo(); + case FlxKey.Y: + redo(); + case FlxKey.C: // COPY + copySelectedNotes(); + case FlxKey.V: // PASTE + for (note in getSelectedNotes()) + note.selected = false; + if (copiedNotes.length > 0) { + var generatedNotes:Array = []; + + var quantMult:Float = quant / 4; + var beatDiff:Float = (Math.round(conductorInUse.beat * quantMult) / quantMult - generatedNotes[0].beatTime); + + for (note in generatedNotes) { + var note:Note = generateNote(note.chartNote); + + note.beatTime += beatDiff; + note.updateChartNote(); + note.justCopied = true; + note.selected = true; + } + addUndo({type: PLACED_NOTES, notes: generatedNotes, pasted: true}); + } + case FlxKey.X: // CUT + copySelectedNotes(); + var deletedNotes:Array = []; + for (note in getSelectedNotes()) { + note.lane.dequeueNote(note); + note.lane.killNote(note); + deletedNotes.push(note); + } + if (deletedNotes.length > 0) + addUndo({type: REMOVED_NOTES, notes: deletedNotes}); + case FlxKey.A: // SELECT ALL + var selectedAny:Bool = false; + forEachNote((note:Note) -> { + var charterNote:CharterNote = cast note; + if (charterNote == null) return; + + if (!charterNote.selected) { + charterNote.selected = true; + selectedAny = true; + } + }, true); + + if (!selectedAny) { + forEachNote((note:Note) -> { + var charterNote:CharterNote = cast note; + if (charterNote == null) return; + + charterNote.selected = false; + }, true); + } + default: + } + } + public function restrictConductor() { + var limitTime:Float = Math.max(conductorInUse.songPosition, 0); + limitTime = Math.min(limitTime, music.syncBase?.length ?? 0); + + conductorInUse.songPosition = limitTime; + } + public function placeNotes() { + for (key => held in heldKeybinds) { + if (held && heldNotes[key] == null) + placeNote(key); + } + } + public function findSongLength() { + var length:Null = chart?.songLength; + if (length == null) // todo + length = 0; + return length; + } + public function keyReleaseEvent(event:KeyboardEvent) { + var key:FlxKey = event.keyCode; + heldKeys.remove(key); + + var keybind:Int = Controls.keybindFromArray(keybinds, key); + if (keybind >= 0) inputOff(keybind); + } + + public function changeQuant(mod:Int) { + var quantIndex:Int = FlxMath.wrap(quants.indexOf(quant) + mod, 0, quants.length - 1); + quantGraphic.animation.curAnim.curFrame = Std.int(Math.min(quantIndex, quantGraphic.animation.curAnim.numFrames - 1)); + quant = quants[quantIndex]; + quantText.text = Std.string(quant); + } + public function inputOn(keybind:Int) { + heldKeybinds[keybind] = true; + placeNote(keybind); + } + public function placeNote(keybind:Int) { + var strumlineId:Int = 0; + var data:Int = keybind; + for (strumline in strumlines) { + if (data >= strumline.laneCount) { + data -= strumline.laneCount; + strumlineId ++; + } + } + var quantMultiplier:Float = (quant / 4); + var strumline:Strumline = strumlines.members[strumlineId]; + var lane = strumline.getLane(data); + var matchingNote:Null = null; + for (note in lane.notes) { + if (note.isHoldPiece) continue; + if (Math.abs(note.beatTime - conductorInUse.beat) < 1 / quantMultiplier - .0012) { + matchingNote = cast note; + break; + } + } + if (matchingNote == null) { + hitsound.play(true); + var isPlayer:Bool = (strumlineId == 0); + var snappedBeat:Float = Math.round(conductorInUse.beat * quantMultiplier) / quantMultiplier; + var note:CharterNote = new CharterNote(isPlayer, 0, data); + heldNotes[keybind] = note; + note.beatTime = snappedBeat; + note.preventDespawn = true; + note.justPlacing = true; + lane.insertNote(note); + } else { + var deletedNotes:Array = [matchingNote]; + + for (note in deletedNotes) { + note.lane.dequeueNote(note); + note.lane.killNote(note); + } + addUndo({type: REMOVED_NOTES, notes: deletedNotes}); + } + } + public function inputOff(keybind:Int) { + heldKeybinds[keybind] = false; + var note:CharterNote = heldNotes[keybind]; + if (note != null) { + for (note in getSelectedNotes()) + note.selected = false; + + var addedNotes:Array = [note]; + + addUndo({type: PLACED_NOTES, notes: addedNotes}); + + FunkinSound.playOnce(Paths.sound('hitsoundTail'), .7); + note.justPlacing = false; + note.preventDespawn = false; + + heldNotes[keybind] = null; + } + } + public function updateHolds() { + var quantMultiplier:Float = (quant * .25); + var snappedBeat:Float = Math.round(conductorInUse.beat * quantMultiplier) / quantMultiplier; + for (note in heldNotes) { + if (note == null) continue; + + note.beatLength = snappedBeat - note.beatTime; + note.updateChartNote(); + } + } + public function saveToChart(chart:Chart) { + if (chart == null) return; + chart.notes.resize(0); + for (strumline in strumlines) { + for (lane in strumline.lanes) { + for (note in lane.getAllNotes()) { + if (note.isHoldPiece) continue; + chart.notes.push(note.toChartNote()); + } + } + } + chart.sort(); + chart.findSongLength(); + } + public function setWindowTitle(mod:Bool = false) { + var win:lime.ui.Window = FlxG.stage.window; + win.title = chart.name; + if (mod) + win.title += '*'; + if (chart.difficulty != '') + win.title += ' (' + chart.difficulty.toLowerCase() + ')'; + + win.title += ' | ' + Main.windowTitle; + } + + override public function destroy() { + instance = null; + inEditor = false; + FlxG.stage.window.title = Main.windowTitle; + FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPressEvent); + FlxG.stage.removeEventListener(KeyboardEvent.KEY_UP, keyReleaseEvent); + FlxG.stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEvent); + Main.instance.removeChild(charterDisplay); + super.destroy(); + } +} + +@:structInit class UndoAction { + public var notes:Array; + public var type:UndoActionType; + + public var pasted:Bool = false; + public var beatMod:Float = 0; + public var laneMod:Int = 0; + + public function message() { + var notesCount:Int = 0; + var longMatch:Bool = true; + var kindMatch:Bool = true; + var length:Null = null; + var kind:Null = null; + + for (note in notes) { + notesCount ++; + length ??= note.beatLength; + if ((length > 0) != (note.beatLength > 0)) + longMatch = false; + kind ??= note.noteKind; + if (kind != note.noteKind) + kindMatch = false; + } + + var notesStr:String = (longMatch && length > 0 ? 'long note' : 'note'); + if (notesCount != 1) notesStr += 's'; + if (kindMatch && kind != '') notesStr += ' ($kind)'; + if (notesCount != 1) notesStr = '$notesCount $notesStr'; + + return switch (type) { + case PLACED_NOTES: + '${pasted ? 'copied' : 'added'} $notesStr'; + case REMOVED_NOTES: + 'removed $notesStr'; + case SHIFTED_NOTES: + 'shifted $notesStr'; + } + } +} +enum UndoActionType { + PLACED_NOTES; + REMOVED_NOTES; + SHIFTED_NOTES; +} + +class MeasureLine extends FlxSpriteGroup { + public var barText:FlxText; + public var startTime:Float; + public var ySpacing(default, set):Float; + public var lineWidth(default, set):Float; + public var measureBeats(default, set):Int; + public var lines:FlxTypedSpriteGroup; //this is getting outta hand + + public function new(x:Float = 0, y:Float = 0, bar:Int = 0, time:Float = 0, beats:Int = 4, width:Float = 160, spacing:Float = 160) { + super(x, y); + lines = new FlxTypedSpriteGroup(); + measureBeats = beats; + ySpacing = spacing; + lineWidth = width; + startTime = time; + + add(lines); + + barText = new FlxText(0, 0, 400, Std.string(bar)); + barText.setFormat(Paths.font('vcr.ttf'), 40, FlxColor.WHITE, RIGHT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); + barText.y += -barText.height * .5 + 3; + barText.x = -barText.width - 24; + barText.active = false; + add(barText); + } + + public function set_measureBeats(newBeats:Int) { + if (measureBeats == newBeats) return newBeats; + + while (lines.length > 0 && lines.length >= newBeats) { + var line = lines.members[0]; + lines.remove(line, true); + line.destroy(); + } + var isBar:Bool = true; + for (i in 0...newBeats) { + var line:FunkinSprite; + if (i >= lines.length) { + line = new FunkinSprite(); + line.makeGraphic(1, 1, -1); + line.spriteOffset.y = .5; + line.active = false; + lines.add(line); + } else { + line = lines.members[i]; + } + line.y = i * ySpacing; + line.setGraphicSize(width, isBar ? 12 : 6); + line.alpha = (isBar ? .8 : .5); + line.updateHitbox(); + line.active = false; + isBar = false; + } + return measureBeats = newBeats; + } + public function set_ySpacing(newSpacing:Float) { + if (ySpacing == newSpacing) return newSpacing; + + var i:Int = 0; + for (line in lines) + line.y = (i ++) * newSpacing; + return ySpacing = newSpacing; + } + public function set_lineWidth(newWidth:Float) { + if (lineWidth == newWidth) return newWidth; + + for (line in lines) { + line.setGraphicSize(newWidth, line.height); + line.updateHitbox(); + } + return lineWidth = newWidth; + } +} + +class CharterPopUp extends Sprite { + public var message(default, set):String; + public var isUndo(default, set):Bool; + public var isRedo(default, set):Bool; + public var text:TextField; + public var icon:Bitmap; + + public function new() { + super(); + + icon = new Bitmap(); + icon.smoothing = true; + icon.scaleX = icon.scaleY = .65; + icon.y = 3; + + var smallTf:TextFormat = new TextFormat('_sans', 12, -1); + smallTf.letterSpacing = -1; + text = new TextField(); + text.autoSize = LEFT; + text.selectable = false; + text.mouseEnabled = false; + text.defaultTextFormat = smallTf; + addChild(text); + } + public function set_isRedo(isIt:Bool) { + icon.bitmapData = Paths.bmd('charter/' + (isIt ? 'redo' : 'undo')); + return isRedo = isIt; + } + public function set_isUndo(isIt:Bool) { + if (isIt && !contains(icon)) { + addChild(icon); + } else if (!isIt && contains(icon)) { + removeChild(icon); + } + text.x = (isIt ? 13 : 0); + return isUndo = isIt; + } + public function set_message(mes:String) { + text.text = mes; + return message = mes; + } +} +class CharterDisplay extends Sprite { + public var funnyQuarterNote:Bitmap; + public var conductorText:TextField; + public var noteInfoText:TextField; + public var songPosText:TextField; + public var metronomeText:TextField; + public var background:Bitmap; + + public var conductor:Conductor; + public var songLength:Float = 0; + + public var popUps:Array = []; + // maybe put the pop ups in a container + + public function new(conductor:Conductor) { + super(); + + this.conductor = conductor; + + var metronomeTf:TextFormat = new TextFormat(Paths.ttf('vcr'), 15, -1); + metronomeTf.leading = -2; + + background = new Bitmap(new openfl.display.BitmapData(1, 1, true, FlxColor.BLACK)); + background.alpha = .6; + addChild(background); + + funnyQuarterNote = new Bitmap(Paths.bmd('charter/quarterNote'), null, true); + funnyQuarterNote.x = 13; + addChild(funnyQuarterNote); + conductorText = new TextField(); + conductorText.defaultTextFormat = metronomeTf; + noteInfoText = new TextField(); + noteInfoText.defaultTextFormat = new TextFormat(Paths.ttf('vcr'), 11, -1); + noteInfoText.defaultTextFormat.letterSpacing = -1; + noteInfoText.alpha = .75; + songPosText = new TextField(); + songPosText.defaultTextFormat = new TextFormat(Paths.ttf('vcr'), 12, -1); + metronomeText = new TextField(); + metronomeText.defaultTextFormat = new TextFormat(Paths.ttf('vcr'), 18, -1); + + for (text in [conductorText, songPosText, noteInfoText, metronomeText]) { + text.x = 10; + text.autoSize = LEFT; + text.multiline = true; + text.selectable = false; + text.mouseEnabled = false; + addChild(text); + } + } + public function addMessage(message:String, isUndo:Bool = false, isRedo:Bool = false) { + var i:Int = 0; + var toUse:CharterPopUp = null; + for (pop in popUps) { + if (!contains(pop)) { + toUse = pop; + break; + } + i ++; + } + var maxHeight:Float = FlxG.stage.window.height - 96; + if (getTextPos(0) >= maxHeight) + toUse = popUps[0]; + else if (getTextPos(i) >= maxHeight) + toUse = popUps[i - 1]; + + if (toUse == null) { + toUse = new CharterPopUp(); + popUps.push(toUse); + } + toUse.message = message; + toUse.isUndo = isUndo; + toUse.isRedo = isRedo; + toUse.alpha = .75; + toUse.x = 10; + + if (!contains(toUse)) + addChild(toUse); + repositionTexts(); + FlxTween.cancelTweensOf(toUse); + FlxTween.tween(toUse, {alpha: 0}, .5, {startDelay: .75, onComplete: (_) -> { + if (contains(toUse)) + removeChild(toUse); + popUps.push(popUps.shift()); + repositionTexts(); + }}); + } + function getTextPos(i:Int) + return 35 + i * 15; + function repositionTexts() { + for (i => pop in popUps) { + if (!contains(pop)) continue; + pop.y = getTextPos(i); + } + } + public function updateMetronomeInfo() { + var charter:CharterState = CharterState.instance; + + var metronomeTextT:String = ' = ${conductor.bpm}\n${conductor.timeSignature.toString()}'; + var songPosTextT:String = FlxStringUtil.formatTime(conductor.songPosition * .001, true) + ' / ' + FlxStringUtil.formatTime(songLength * .001, true); + var conductorTextT:String = 'Measure: ${Math.floor(conductor.bar)}\nBeat: ${Math.floor(conductor.beat)}\nStep: ${Math.floor(conductor.step)}'; + var noteInfoTextT:String = '${charter.hitNoteCount} notes (${charter.fullNoteCount} obj)'; + + if (metronomeText.text != metronomeTextT) metronomeText.text = metronomeTextT; + if (conductorText.text != conductorTextT) conductorText.text = conductorTextT; + if (noteInfoText.text != noteInfoTextT) noteInfoText.text = noteInfoTextT; + if (songPosText.text != songPosTextT) songPosText.text = songPosTextT; + } + + override function __enterFrame(deltaTime:Float) { + updateMetronomeInfo(); + + noteInfoText.x = FlxG.stage.window.width - 12 - noteInfoText.textWidth; + + var h:Float = FlxG.stage.window.height; + songPosText.y = h - songPosText.textHeight - 12; + noteInfoText.y = h - noteInfoText.textHeight - 12; + conductorText.y = h - conductorText.textHeight - 32; + var infoHeight:Float = songPosText.textHeight + conductorText.textHeight + 32; + + funnyQuarterNote.y = metronomeText.y = h - infoHeight - metronomeText.textHeight; + background.scaleX = Math.max(Math.max(songPosText.textWidth, conductorText.textWidth) + 24, 120); + background.scaleY = infoHeight + metronomeText.textHeight + 10; + background.y = h - background.scaleY; + } +} + +class CharterStrumline extends Strumline { + public var receptorAlpha:Float = 1; + public var noteHighlight:FlxSprite; + + public function new(laneCount:Int = 4, direction:Float = 90, scrollSpeed:Float = 1) { + super(laneCount, direction, scrollSpeed, CharterNote); + noteHighlight = new FlxSprite().makeGraphic(1, 1, FlxColor.WHITE); + noteHighlight.blend = ADD; + } + + public override function draw() { + for (lane in lanes) { // draw hit notes on bottom + if (!lane.selfDraw) { + if (lane.receptor != null) + lane.receptor.alpha = receptorAlpha; + + for (note in lane.notes) { + if (!Std.isOfType(note, CharterNote)) continue; + var charterNote:CharterNote = cast note; + + charterNote.drawCustom(true); + if (charterNote.goodHit) + drawHighlight(charterNote); + } + } + } + drawSelf(); + for (lane in lanes) { // draw on top + if (!lane.selfDraw) { + if (lane.receptor != null) + lane.receptor.alpha = 1; + + for (note in lane.notes) { + var charterNote:CharterNote = cast note; + + charterNote.drawCustom(false); + if (!charterNote.goodHit) + drawHighlight(charterNote); + } + @:privateAccess lane.drawThing(true); + } + } + } + public function drawHighlight(note:CharterNote) { + if (note.selected) { + Util.copyColorTransform(noteHighlight.colorTransform, note.colorTransform); + noteHighlight.setGraphicSize(note.width, note.height); + noteHighlight.colorTransform.alphaMultiplier = .25; + noteHighlight.setPosition(note.x, note.y); + noteHighlight.updateHitbox(); + noteHighlight.draw(); + } + } +} +class CharterNote extends Note { + public var highlighted(default, set):Bool = false; + public var hitAlphaMult:Float = .7; + public var selected(default, set):Bool = false; + public var justPlacing:Bool = false; + public var justCopied:Bool = false; + public var useLaneRGB:Bool = true; + + var pointer:FlxObject; + var noteKindDecal:FunkinSprite = null; + + public function new(songNote:ChartNote, ?conductor:Conductor) { + super(songNote, conductor); + pointer = new FlxObject(); + } + public function set_highlighted(isHighlighted:Bool) { + if (highlighted == isHighlighted) return isHighlighted; + for (child in children) + cast(child, CharterNote).highlighted = isHighlighted; + highlighted = isHighlighted; + updateHighlight(); + return isHighlighted; + } + public function set_selected(isSelected:Bool) { + if (selected == isSelected) return isSelected; + if (!isSelected) justCopied = false; + for (child in children) { + var charterNote:CharterNote = cast child; + charterNote.justCopied = justCopied; + charterNote.selected = isSelected; + } + preventDespawn = isSelected; + selected = isSelected; + updateHighlight(); + return isSelected; + } + public function updateHighlight() { + if (selected) { + if (justCopied) { + setColorTransform(0, 1, 1); + } else { + setColorTransform(0, 1, 0); + } + } else if (highlighted) { + setColorTransform(1.6, 1.6, 1.6, 1, 32, 32, 32); + } else { + setColorTransform(); + } + } + public override function set_kind(newKind:String) { + if (kind == newKind) return newKind; + + if (newKind == '') { + if (lane != null) shader = lane.rgbShader.shader; + noteKindDecal.destroy(); + noteKindDecal = null; + useLaneRGB = true; + } else { + shader = CharterState.genericRGB.shader; + useLaneRGB = false; + noteKindDecal ??= new FunkinSprite(); + noteKindDecal.loadTexture('charter/noteKinds/$newKind'); + if (noteKindDecal.graphic == null) noteKindDecal.loadTexture('charter/noteKinds/generic'); + } + + return kind = newKind; + } + public function drawCustom(good:Bool = false) { + if (goodHit != good) return; + + var prevAlpha:Float = alpha; + if (wasGood) alpha *= hitAlphaMult; + if (justPlacing) alpha *= .75; + actuallyDraw(); + alpha = prevAlpha; + } + public function actuallyDraw() { + super.draw(); + if (noteKindDecal != null) { + Util.copyColorTransform(noteKindDecal.colorTransform, this.colorTransform); + noteKindDecal.scale.set(scale.x, scale.y); + noteKindDecal.updateHitbox(); + noteKindDecal.setPosition(x + (width - noteKindDecal.width) * .5, y + (height - noteKindDecal.height) * .5); + noteKindDecal.camera = camera; + noteKindDecal.draw(); + } + pointer.x = x; + pointer.y = y; + if (noteKind != '' && highlighted && CharterState.inEditor && !FlxG.mouse.pressed) { + pointer.x += width * .7; + pointer.y += height * .3; + var charter:CharterState = CharterState.instance; + var bubblePos:FlxPoint = getPointerScreenPosition(pointer); + charter.noteKindBubble.setPosition( + bubblePos.x, + bubblePos.y - charter.noteKindBubble.height + ); + charter.noteKindBubble.draw(); + + charter.noteKindBubbleText.text = noteKind; + charter.noteKindBubbleText.setPosition( + charter.noteKindBubble.x + 46, + charter.noteKindBubble.y + 20 + ); + charter.noteKindBubbleText.draw(); + + if (noteKindDecal != null) { + noteKindDecal.camera = charter.camHUD; + noteKindDecal.setColorTransform(); + noteKindDecal.scale.set(.35, .35); + noteKindDecal.updateHitbox(); + noteKindDecal.alpha = .75; + noteKindDecal.setPosition( + charter.noteKindBubble.x - noteKindDecal.width * .5 + 25, + charter.noteKindBubble.y - noteKindDecal.height * .5 + 32, + ); + noteKindDecal.draw(); + } + } + } + public override function draw() {} + public function getPointerScreenPosition(pointer:FlxObject, ?camera:FlxCamera):FlxPoint { + camera ??= pointer.camera ?? FlxG.camera; + + var point:FlxPoint = pointer.getScreenPosition(camera); + point.subtract(camera.viewMarginLeft, camera.viewMarginTop); + point.scale(camera.zoom); + return point; + } +}*/ \ No newline at end of file diff --git a/source/funkin/states/FreeplaySubState.hx b/source/funkin/states/FreeplaySubState.hx index 707efaf..ebf8af4 100644 --- a/source/funkin/states/FreeplaySubState.hx +++ b/source/funkin/states/FreeplaySubState.hx @@ -260,7 +260,7 @@ class FreeplaySongText extends FlxSpriteGroup { } } -class FreeplayCapsule extends FlxSpriteGroup { +class FreeplayCapsule extends FunkinSpriteGroup { public var capsule:FunkinSprite; public var bpmText:FunkinSprite; public var weekType:FunkinSprite; diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index f03000d..8d201c4 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -95,7 +95,7 @@ class PlayState extends FunkinState { if (noteStyle == newStyle) return newStyle; var stylePath:String = NoteStyle.getPath(noteStyle); - hscripts.destroy(hscripts.find('Note Style Script ($stylePath)')); + hscripts.find('(notes/$stylePath) Style Script')?.kill(); bootStyleScript(newStyle, 'notes'); @@ -108,8 +108,15 @@ class PlayState extends FunkinState { var stylePath:String = NoteStyle.getPath(style); var styleScriptPath:Null = Paths.getPath('scripts/styles/$folder/$stylePath.hx'); - if (styleScriptPath != null) - hscripts.loadFromFile(styleScriptPath, '($stylePath) Note Style Script'); + if (styleScriptPath != null) { + var scriptName:String = '($folder/$stylePath) Style Script'; + var foundScript:HScript = hscripts.find(scriptName); + if (foundScript == null) { + hscripts.loadFromFile(styleScriptPath, scriptName, ['style' => NoteStyle.fetch(style)]); + } else { + foundScript.revive(); + } + } } public function new(chart:Chart, simple:Bool = false) { @@ -254,7 +261,7 @@ class PlayState extends FunkinState { player2 = stage.getCharacter('dad'); player3 = stage.getCharacter('gf'); - focusOnCharacter((player3 ?? player1).current); + focusOnCharacter((player3 ?? player1)?.current); playerStrumline.character = player1; opponentStrumline.character = player2; @@ -452,7 +459,7 @@ class PlayState extends FunkinState { FlxG.switchState(FreeplayState.new); return; } else if (FlxG.keys.justPressed.SEVEN) { - // FlxG.switchState(() -> new CharterState(chart)); + FlxG.switchState(() -> new CharterState(chart)); return; } @@ -832,6 +839,8 @@ class PlayState extends FunkinState { if (!ratingGroup.alive) return rating; rating.alpha = 1; + rating.cameras = null; + rating.visible = true; rating.loadTexture(ratingString); rating.scale.set(scale, scale); rating.setPosition(ratingGroup.x, ratingGroup.y); From 804a29ba2e03fc61b4f0a41fab72c3c9f5e3ccb1 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Thu, 8 May 2025 19:24:13 -0600 Subject: [PATCH 24/73] experimental modchart sustains --- source/funkin/backend/FunkinRuntimeShader.hx | 4 + source/funkin/backend/FunkinSoundTray.hx | 2 +- source/funkin/backend/FunkinStrip.hx | 40 ++ source/funkin/objects/play/Lane.hx | 2 +- source/funkin/objects/play/Note.hx | 468 ++++++++++++------- 5 files changed, 350 insertions(+), 166 deletions(-) create mode 100644 source/funkin/backend/FunkinStrip.hx diff --git a/source/funkin/backend/FunkinRuntimeShader.hx b/source/funkin/backend/FunkinRuntimeShader.hx index 6a154e6..deb3d3c 100644 --- a/source/funkin/backend/FunkinRuntimeShader.hx +++ b/source/funkin/backend/FunkinRuntimeShader.hx @@ -147,7 +147,11 @@ class FunkinRuntimeShader extends FlxRuntimeShader { } public function postUpdateFrame(frame:flixel.graphics.frames.FlxFrame) { if (hasParameter('uFrameBounds')) + #if (flixel >= "6.1.0") + setFloatArray('uFrameBounds', [frame.uv.left, frame.uv.top, frame.uv.right, frame.uv.bottom]); + #else setFloatArray('uFrameBounds', [frame.uv.x, frame.uv.y, frame.uv.width, frame.uv.height]); + #end } function set_postProcessing(isPost:Bool) { diff --git a/source/funkin/backend/FunkinSoundTray.hx b/source/funkin/backend/FunkinSoundTray.hx index 06bc3fd..04a91c5 100644 --- a/source/funkin/backend/FunkinSoundTray.hx +++ b/source/funkin/backend/FunkinSoundTray.hx @@ -50,7 +50,7 @@ class FunkinSoundTray extends flixel.system.ui.FlxSoundTray { public function reloadSoundtrayGraphics() { bg.bitmapData = Paths.bmd('soundtray/volumebox'); bgBar.bitmapData = Paths.bmd('soundtray/bars_bg'); - _width = bg.bitmapData.width; + // _width = bg.bitmapData.width; for (i => bar in _bars) { var bmd:Null = Paths.bmd('soundtray/bars_${i + 1}'); bar.x = ((bg.bitmapData?.width ?? 0) - (bmd?.width ?? 0)) * .5; diff --git a/source/funkin/backend/FunkinStrip.hx b/source/funkin/backend/FunkinStrip.hx new file mode 100644 index 0000000..8c1eb4e --- /dev/null +++ b/source/funkin/backend/FunkinStrip.hx @@ -0,0 +1,40 @@ +package funkin.backend; + +import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; + +class FunkinStrip extends FunkinSprite { + public var vertices:DrawData = new DrawData(); + public var uvtData:DrawData = new DrawData(); + public var indices:DrawData = new DrawData(); + public var colors:DrawData = new DrawData(); + + public var repeat:Bool = false; + + override public function destroy():Void { + vertices = null; + indices = null; + uvtData = null; + colors = null; + + super.destroy(); + } + + // TODO: check this for cases when zoom is less than initial zoom... + override public function draw():Void { + if (alpha == 0 || graphic == null || vertices == null) + return; + + final cameras = getCamerasLegacy(); + for (camera in cameras) { + if (!camera.visible || !camera.exists) + continue; + + getScreenPosition(_point, camera).subtractPoint(offset); + #if !flash + camera.drawTriangles(graphic, vertices, indices, uvtData, colors, _point, blend, repeat, antialiasing, colorTransform, shader); + #else + camera.drawTriangles(graphic, vertices, indices, uvtData, colors, _point, blend, repeat, antialiasing); + #end + } + } +} \ No newline at end of file diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 9133da0..747a4e6 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -326,7 +326,7 @@ class Lane extends FunkinSpriteGroup { queue.resize(0); } public function updateNote(note:Note) { - note.followLane(this, scrollSpeed); + note.followLane(this); if (note.ignore) return; diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 5670673..5af818d 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -7,9 +7,11 @@ import funkin.backend.rhythm.Event; import funkin.backend.FunkinSprite; import funkin.backend.play.NoteStyle; import funkin.objects.CharacterGroup; +import funkin.backend.FunkinStrip; import flixel.math.FlxMatrix; import flixel.graphics.frames.FlxFrame; +import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; using funkin.backend.play.NoteStyle.NoteStyleUtil; @@ -109,6 +111,8 @@ class Note extends FunkinSprite { public var multAlpha:Float = 1; public var ignore:Bool = false; + public var isHoldTail(default, null):Bool = false; + public var laneIndex:Int = 0; public var strumlineIndex:Int = 0; public var style(default, set):NoteStyle; @@ -125,18 +129,24 @@ class Note extends FunkinSprite { public var beatLength(default, set):Float = 0; public var isHoldNote(default, null):Bool = false; + public var getScrollDistance:(note:Note, lane:Lane, distance:Float) -> Float = null; + public var getScrollPosition:(note:Note, lane:Lane, distance:Float, ?point:FlxPoint) -> FlxPoint = null; + function get_noteData():Int { return laneIndex; } function set_noteData(value:Int):Int { return laneIndex = value; } function get_player():Bool { return (strumlineIndex == 0); } function set_noteKind(newKind:String):String { return kind = newKind; } function get_noteKind():String { return kind; } + var _scrollPoint:FlxPoint = FlxPoint.get(); + public override function destroy():Void { + _scrollPoint.put(); tailOffset.put(); - if (tail != null) - tail.destroy(); - super.destroy(); + tail?.destroy(); tail = null; + + super.destroy(); } public override function draw():Void { if (isHoldNote && tail != null) @@ -166,22 +176,26 @@ class Note extends FunkinSprite { this.chartNote = songNote; } public function set_chartNote(songNote:ChartNote):ChartNote { + chartNote = songNote; + if (songNote != null) { this.kind = songNote.kind; this.msTime = songNote.msTime; this.laneIndex = songNote.laneIndex; this.strumlineIndex = songNote.strumlineIndex; - this.msLength = songNote.msLength; + this.msLength = Math.max(songNote.msLength, 0); this.extraData.clear(); if (songNote.extraData != null) { for (k => v in songNote.extraData) setVar(k, v); } + + if (tail != null) + tail.chartNote = songNote; } - this.msLength = Math.max(this.msLength, 0); - return this.chartNote = songNote; + return songNote; } public function updateChartNote():Void { chartNote.kind = kind; @@ -205,13 +219,17 @@ class Note extends FunkinSprite { blend = NORMAL; this.style = style; - if (tail != null) - tail.reload(style); + tail?.reload(style); } public function updateTail():Void { isHoldNote = (msLength > 0); - if (tail == null && isHoldNote) - tail = new NoteTail(this); + if (isHoldNote) { + if (tail == null) { + tail = new NoteTail(this); + } else { + tail.reloadNote(this); + } + } } public function toChartNote():ChartNote { return chartNote ?? {laneIndex: laneIndex, msTime: msTime, kind: kind, msLength: msLength, strumlineIndex: strumlineIndex}; @@ -283,18 +301,23 @@ class Note extends FunkinSprite { return distance / (.45 * scrollSpeed); public static function msToDistance(ms:Float, scrollSpeed:Float) return ms * (.45 * scrollSpeed); - public dynamic function followLane(lane:Lane, scrollSpeed:Float) { + public function followLane(lane:Lane) { + var timeDiff:Float = msTime - conductorInUse.songPosition; var receptor:Receptor = lane.receptor; - var speed:Float = scrollSpeed * scrollMultiplier; - var dir:Float = lane.direction + directionOffset; - scrollDistance = msToDistance(msTime - conductorInUse.songPosition, speed); + var scrollDistance:Float; + var scrollPosition:FlxPoint; + try { + scrollDistance = (getScrollDistance ?? getScrollDistanceGeneric)(this, lane, timeDiff); + scrollPosition = (getScrollPosition ?? getScrollPositionGeneric)(this, lane, scrollDistance); + } catch (e:haxe.Exception) { + Log.error('error while setting scroll distance or position -> ${e.details()}'); + scrollDistance = getScrollDistanceGeneric(this, lane, timeDiff); + scrollPosition = getScrollPositionGeneric(this, lane, scrollDistance); + } - var xP:Float = 0; - var yP:Float = scrollDistance; - var rad:Float = dir / 180 * Math.PI; - x = receptor.x + (receptor.width - width) * .5 + Math.sin(rad) * xP + Math.cos(rad) * yP; - y = receptor.y + (receptor.height - height) * .5 + Math.sin(rad) * yP + Math.cos(rad) * xP; + x = receptor.x + (receptor.width - width) * .5 + scrollPosition.x; + y = receptor.y + (receptor.height - height) * .5 + scrollPosition.y; if (followAlpha) alpha = receptor.alpha * multAlpha * defaultAlpha; @@ -304,21 +327,29 @@ class Note extends FunkinSprite { angle = lane.receptor.angle; if (isHoldNote && tail != null) { - tail.scale.x = scale.x / defaultScale * tail.defaultScale; - tail.scale.y = FlxMath.signOf(speed) * Math.abs(scale.x) / defaultScale * tail.defaultScale; - tail.updateHitbox(); - tail.offset.y = 0; + if (goodHit) tail.clipToDistance = 0; - var absDistance:Float = msToDistance(msTime - conductorInUse.songPosition, Math.abs(speed)); - tail.sustainHeight = msToDistance(msLength, Math.abs(speed)); - tail.setPosition(x - tailOffset.x + (width - tail.width) * .5, y - tailOffset.y + height * .5); - tail.angle = dir - 90; + var tailScale:Float = (scale.x / defaultScale * tail.defaultScale); - if (goodHit && absDistance < 0) - tail.sustainClip = -absDistance; + tail.setPosition(receptor.x + receptor.width * .5, receptor.y + receptor.height * .5); + tail.scale.set(tailScale, tailScale); + tail.followLane(lane); + tail.updateHitbox(); } } + public static function getScrollDistanceGeneric(note:Note, lane:Lane, timeDiff:Float):Float { + return msToDistance(timeDiff, lane.scrollSpeed * note.scrollMultiplier); + } + public static function getScrollPositionGeneric(note:Note, lane:Lane, distance:Float, ?point:FlxPoint):FlxPoint { + point ??= note._scrollPoint; + + var dir:Float = lane.direction + note.directionOffset; + var rad:Float = (dir / 180 * Math.PI); + + return point.set(FlxMath.fastCos(rad) * distance, FlxMath.fastSin(rad) * distance); + } + public override function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { if (forced || this.anim.name != anim) reloadAnimShader(anim, style); @@ -341,29 +372,25 @@ class Note extends FunkinSprite { } } -class NoteTail extends FunkinSprite { - public var rgbShader:RGBSwap; - public var updateRGBShader:Bool = true; - public var rgbEnabled(default, set):Bool; - +class NoteTail extends Note { public var parent(default, set):Note; - public var style(default, set):NoteStyle; - public var laneIndex:Int; - - public var multAlpha:Float = 1; - public var sustainClip:Float = 0; - public var sustainHeight:Float = 0; - public var defaultScale:Float = 1; - public var defaultAlpha:Float = 1; + public var renderTriangles:Bool = true; // TODO + public var clipToDistance:Null = null; + public var adaptiveDirection:Bool = true; public var holdScale(default, null):FlxPoint; public var tailScale(default, null):FlxPoint; - var _tileMatrix:FlxMatrix = new FlxMatrix(); + var holdStrip:NoteTailStrip; + var tailStrip:NoteTailStrip; + + var _tailScrollPoint:FlxPoint = FlxPoint.get(); + var drawData:Array = []; + var drawItems:Int = 0; public function new(parent:Note) { - super(); + super(parent?.chartNote); rgbShader = new RGBSwap(); shader = rgbShader.shader; @@ -371,27 +398,52 @@ class NoteTail extends FunkinSprite { holdScale = FlxPoint.get(1, 1); tailScale = FlxPoint.get(1, 1); - this.style = style; + holdStrip = new NoteTailStrip(this, 'hold'); + tailStrip = new NoteTailStrip(this, 'tail'); + + this.isHoldTail = true; this.parent = parent; } public override function destroy() { + holdStrip?.destroy(); + tailStrip?.destroy(); + holdScale.put(); tailScale.put(); + _tailScrollPoint.put(); + + drawData = null; + drawItems = 0; - _tileMatrix = null; super.destroy(); } function set_parent(note:Note):Note { - laneIndex = note.laneIndex; + if (note != null) + reloadNote(note); return parent = note; } - public function reload(?style:NoteStyle) { - this.style = style; - sustainClip = 0; + public function reloadNote(note:Note):Void { + conductorInUse = note.conductorInUse ?? FunkinState.getCurrentConductor(); + chartNote = note.chartNote; + style = note.style; + + holdStrip?.reloadTail(this); + tailStrip?.reloadTail(this); + } + public override function reload(?style:NoteStyle):Void { + super.reload(style); + + clipToDistance = null; } - public override function draw() { + public override function updateTail():Void {} + public override function update(elapsed:Float):Void { + super.update(elapsed); + holdStrip?.update(elapsed); + tailStrip?.update(elapsed); + } + public override function draw():Void { alpha = multAlpha * defaultAlpha; if (parent != null) { scrollFactor.copyFrom(parent.scrollFactor); @@ -405,122 +457,99 @@ class NoteTail extends FunkinSprite { super.draw(); } - function set_style(newStyle:NoteStyle) { - if (style == newStyle) return newStyle; - style = newStyle; - loadStyle(newStyle); - return newStyle; - } - public function set_rgbEnabled(newE:Bool) { - shader = (newE ? rgbShader.shader : null); - return rgbEnabled = newE; - } - public function loadStyle(newStyle:NoteStyleAsset) { + public override function loadStyle(newStyle:NoteStyleAsset) { var oldScale:Float = defaultScale; var style:NoteStyle = NoteStyle.fetch(newStyle); var asset:NoteStyleAssetData = style?.data.holds; - NoteStyleUtil.loadNoteStyleAnimations(this, asset, style?.getDirectionName(laneIndex)); defaultScale = asset?.scale ?? 1; defaultAlpha = asset?.alpha ?? 1; scale.x *= (defaultScale / oldScale); scale.y *= (defaultScale / oldScale); - playAnimation('hold', true); - updateHitbox(); - } - - // this is kinda mediocre tbh - public override function drawComplex(camera:FlxCamera) { - if (sustainHeight <= sustainClip) - return; + holdStrip?.loadStyle(style); + tailStrip?.loadStyle(style); + } + + public override function followLane(lane:Lane):Void { + if (!renderTriangles) return; // TODO: basic renderer + + var distFunc = getScrollDistance ?? parent.getScrollDistance ?? Note.getScrollDistanceGeneric; + var posFunc = getScrollPosition ?? parent.getScrollPosition ?? Note.getScrollPositionGeneric; + var timeDiff:Float = endMs - conductorInUse.songPosition; + + var scrollDistance:Float; + var scrollPosition:FlxPoint; + var scrollNextPosition:FlxPoint; + try { + scrollDistance = distFunc(this, lane, timeDiff); + scrollPosition = posFunc(this, lane, scrollDistance); + } catch (e:haxe.Exception) { + Log.error('error while setting scroll distance or position -> ${e.details()}'); + posFunc = Note.getScrollPositionGeneric; + distFunc = Note.getScrollDistanceGeneric; + scrollDistance = distFunc(this, lane, timeDiff); + scrollPosition = posFunc(this, lane, scrollDistance); + } + + var clipDistance:Float = distFunc(this, lane, msTime - conductorInUse.songPosition); + if (clipToDistance != null) clipDistance = Math.max(clipDistance, clipToDistance); - updateShader(camera); - var top:Float = 1; - var bottom:Float = 0; - var doTail:Bool = true; - var sc:FlxPoint = tailScale; - playAnimation('tail', true); - origin.set(frameWidth * .5); - cropFrame(top, bottom); - getDrawMatrix(sc); - - var totalHeight:Float = sustainHeight; - var absScale:Float = Math.abs(scale.y * tailScale.y); - - if (absScale < Math.max(Math.abs(scale.x), .05)) return; - - var scaleSign:Int = FlxMath.signOf(scale.y); - var rad:Float = angle / 180 * Math.PI; - var sin:Float = Math.sin(rad); - var cos:Float = Math.cos(rad); - var cut:Bool = false; - - while (true) { - var pieceHeight:Float = (frameHeight - top - bottom) * absScale; - if (pieceHeight <= 0) return; + function prepareRender(strip:NoteTailStrip):NoteTailStrip { + strip.scale.copyFrom(scale); + strip.shader = shader; + return strip; + } + + drawItems = 0; + prepareRender(tailStrip); + prepareRender(holdStrip); + var render:NoteTailStrip = tailStrip; + var nextAngle:Float = (lane.direction + parent.directionOffset); + var scrollAngle:Null = (adaptiveDirection ? null : nextAngle); + while (scrollDistance > clipDistance) { + var height:Float = render.frameHeight * render.scale.y; + if (height < 5) break; - totalHeight -= pieceHeight; - if (totalHeight <= sustainClip) { - var dist:Float = (sustainClip - totalHeight) / absScale; // pieceHeight * frameHeight; - cropFrame(dist + top, bottom); - getDrawMatrix(sc); - cut = true; - } + scrollDistance -= height; + scrollNextPosition = posFunc(this, lane, scrollDistance, _tailScrollPoint); + if (adaptiveDirection) nextAngle = (scrollPosition.degreesTo(scrollNextPosition) * Math.PI / 180); - _tileMatrix.copyFrom(_matrix); - _tileMatrix.translate(-totalHeight * sin, totalHeight * cos * scaleSign - top * scale.y * holdScale.y); - FunkinSprite.transformMatrixZoom(_tileMatrix, camera, zoomFactor, initialZoom); - camera.drawPixels(_frame, framePixels, _tileMatrix, colorTransform, blend, antialiasing, shader); - if (cut) break; + var data:NoteTailDrawData = (drawData[drawItems] ?? new NoteTailDrawData()); - if (doTail) { - sc = holdScale; - - bottom = 1; - doTail = false; - playAnimation('hold', true); - absScale = Math.abs(scale.y * holdScale.y); - origin.set(frameWidth * .5); - cropFrame(top, bottom); - getDrawMatrix(sc); - - if (absScale < Math.max(Math.abs(scale.x), .05)) return; - } + data.clip = (scrollDistance <= clipDistance ? Math.abs(scrollDistance - clipDistance) / height : 0); + data.copyPosition(scrollPosition, scrollNextPosition); + data.setAngle(scrollAngle ?? nextAngle, nextAngle); + + drawData[drawItems ++] = data; + + + if (adaptiveDirection) scrollAngle = nextAngle; + scrollPosition.copyFrom(scrollNextPosition); + render = holdStrip; } } - function cropFrame(cropTop:Float = 0, cropBottom:Float = 0) { - _frame = frame.clipTo(_rect.set(0, cropTop, frameWidth, frameHeight - cropTop - cropBottom), _frame); - } - function getDrawMatrix(?scaleFactor:FlxPoint) { - _frame.prepareMatrix(_matrix, FlxFrameAngle.ANGLE_0, checkFlipX(), checkFlipY()); - - _matrix.translate(-origin.x, -origin.y); - _matrix.scale(scale.x, scale.y); - if (scaleFactor != null) - _matrix.scale(scaleFactor.x, scaleFactor.y); - - if (bakedRotationAngle <= 0) { - updateTrig(); - - if (angle != 0) - _matrix.rotateWithTrig(_cosAngle, _sinAngle); - } - - transformSpriteOffset(_transPoint); - getScreenPosition(_point, camera); - _point.add(-offset.x, -offset.y); - _point.add(-_transPoint.x, -_transPoint.y); - _matrix.translate(_point.x + origin.x, _point.y + origin.y); + + public override function drawComplex(camera:FlxCamera) { + updateShader(camera); - if (isPixelPerfectRender(camera)) { - _matrix.tx = Math.floor(_matrix.tx); - _matrix.ty = Math.floor(_matrix.ty); + if (renderTriangles) { + var render:NoteTailStrip = tailStrip; + for (i in 0 ... drawItems) { + var data:NoteTailDrawData = drawData[i]; + if (data == null || render == null) break; + + render.updateRender(x, y, data); + render.draw(); + + render = holdStrip; + } } } - public override function getScreenBounds(?newRect:FlxRect, ?camera:FlxCamera):FlxRect { + + /* public override function getScreenBounds(?newRect:FlxRect, ?camera:FlxCamera):FlxRect { if (newRect == null) newRect = FlxRect.get(); @@ -538,29 +567,140 @@ class NoteTail extends FunkinSprite { newRect.setSize(frameWidth * Math.abs(scale.x), sustainHeight); if (scale.y < 0) newRect.y -= sustainHeight; return newRect.getRotatedBounds(angle, _scaledOrigin, newRect); - } + } */ + public override function isSimpleRender(?camera:FlxCamera):Bool { return false; // lazy zzz } +} + +class NoteTailStrip extends FunkinStrip { + public var defaultAnim:String; + public var style(default, set):NoteStyle; + public var parentTail(default, set):NoteTail; - public override function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { - if (forced || this.anim.name != anim) - reloadAnimShader(anim, style); + public var laneIndex:Int; + + public function new(parent:NoteTail, defaultAnim:String = 'hold') { + super(); - super.playAnimation(anim, forced, reversed, frame); + this.defaultAnim = defaultAnim; + this.parentTail = parent; + + indices = new DrawData(6, true, [0, 1, 2, 1, 2, 3]); + uvtData = new DrawData(8, true, [0, 0, 0, 0, 0, 0, 0, 0]); + vertices = new DrawData(8, true, [0, 0, 0, 0, 0, 0, 0, 0]); } - public function reloadAnimShader(anim:String, style:NoteStyle) { - if (updateRGBShader) { - var animData:NoteStyleAnimData = style?.getAssetAnimation(style?.data.holds, anim); - if (animData != null) { - if (animData.disableRGB) { - rgbEnabled = false; - } else { - var colors:Array = style.getDirectionColorMod(laneIndex, animData.colorMod); - rgbShader.set(colors[0], colors[1], colors[2]); - rgbEnabled = true; - } - } + + public function updateRender(x:Float, y:Float, drawData:NoteTailDrawData):Void { + if (graphic == null) + return; + + final clip:Float = drawData.clip; + final angleTo:Float = drawData.angleTo; + final angleFrom:Float = drawData.angleFrom; + + setPosition(x + drawData.xFrom, y + drawData.yFrom); + var nextXOffset:Float = drawData.xTo - drawData.xFrom; + var nextYOffset:Float = drawData.yTo - drawData.yFrom; + + final w:Float = graphic.width; + final h:Float = graphic.height; + final crop:Float = (antialiasing ? .5 : 0); // get rid of transparent blurry edges + + var left:Float = frame.frame.x / w; + var top:Float = (frame.frame.y + crop) / h; + var right:Float = left + frame.frame.width / w; + var bottom:Float = (frame.frame.y + frame.frame.height - crop) / h; + + if (clip > 0) { + nextXOffset *= (1 - clip); + nextYOffset *= (1 - clip); + top = FlxMath.lerp(top, bottom, clip); + } + + var pieceWidth:Float = frameWidth * scale.x * .5; + + // update vertices + vertices[0] = Math.sin(angleTo) * pieceWidth + nextXOffset; // top left + vertices[1] = Math.cos(angleTo) * -pieceWidth + nextYOffset; + uvtData[0] = left; + uvtData[1] = top; + + vertices[2] = Math.sin(angleTo) * -pieceWidth + nextXOffset; // top right + vertices[3] = Math.cos(angleTo) * pieceWidth + nextYOffset; + uvtData[2] = right; + uvtData[3] = top; + + vertices[4] = Math.sin(angleFrom) * pieceWidth; // bottom left + vertices[5] = Math.cos(angleFrom) * -pieceWidth; + uvtData[4] = left; + uvtData[5] = bottom; + + vertices[6] = Math.sin(angleFrom) * -pieceWidth; // bottom right + vertices[7] = Math.cos(angleFrom) * pieceWidth; + uvtData[6] = right; + uvtData[7] = bottom; + } + + function set_style(newStyle:NoteStyle) { + if (style == newStyle) return newStyle; + style = newStyle; + loadStyle(newStyle); + return newStyle; + } + function set_parentTail(note:NoteTail):NoteTail { + reloadTail(note); + return parentTail = note; + } + public function reloadTail(note:NoteTail):Void { + scale.copyFrom(note.scale); + laneIndex = note.laneIndex; + style = note.style; + } + public function loadStyle(newStyle:NoteStyleAsset) { + var style:NoteStyle = NoteStyle.fetch(newStyle); + var asset:NoteStyleAssetData = style?.data.holds; + + NoteStyleUtil.loadNoteStyleAnimations(this, asset, style?.getDirectionName(laneIndex)); + + playAnimation(defaultAnim, true); + offset.set(); + } +} + +class NoteTailDrawData { + public var angleFrom:Float; + public var xFrom:Float; + public var yFrom:Float; + + public var angleTo:Float; + public var xTo:Float; + public var yTo:Float; + + public var clip:Float = 0; + + public function new() {} + + public function setAngle(from:Float, ?to:Float):NoteTailDrawData { + angleFrom = from; + angleTo = to ?? angleFrom; + return this; + } + public function setPosition(x:Float, y:Float, ?xT:Float, ?yT:Float):NoteTailDrawData { + xFrom = x; + yFrom = y; + if (xT != null) xTo = xT; + if (yT != null) yTo = yT; + return this; + } + public function copyPosition(point:FlxPoint, ?pointTo:FlxPoint):NoteTailDrawData { + xFrom = point.x; + yFrom = point.y; + if (pointTo != null) { + xTo = pointTo.x; + yTo = pointTo.y; } + return this; } } \ No newline at end of file From 5c95670237c9c09047d1659540ba6a909052e942 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Thu, 8 May 2025 21:17:38 -0600 Subject: [PATCH 25/73] Change more renderer stuff --- source/funkin/objects/play/Note.hx | 38 ++++++++++++------------------ 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 5af818d..9b01b06 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -139,6 +139,7 @@ class Note extends FunkinSprite { function get_noteKind():String { return kind; } var _scrollPoint:FlxPoint = FlxPoint.get(); + var forceDraw:Bool = false; public override function destroy():Void { _scrollPoint.put(); @@ -152,7 +153,7 @@ class Note extends FunkinSprite { if (isHoldNote && tail != null) tail.draw(); - if (!goodHit) + if (!goodHit || forceDraw) super.draw(); } public override function kill():Void { @@ -327,12 +328,11 @@ class Note extends FunkinSprite { angle = lane.receptor.angle; if (isHoldNote && tail != null) { - if (goodHit) tail.clipToDistance = 0; - var tailScale:Float = (scale.x / defaultScale * tail.defaultScale); tail.setPosition(receptor.x + receptor.width * .5, receptor.y + receptor.height * .5); tail.scale.set(tailScale, tailScale); + tail.goodHit = goodHit; tail.followLane(lane); tail.updateHitbox(); } @@ -375,6 +375,8 @@ class Note extends FunkinSprite { class NoteTail extends Note { public var parent(default, set):Note; + public var followParent:Bool = true; + public var renderTriangles:Bool = true; // TODO public var clipToDistance:Null = null; public var adaptiveDirection:Bool = true; @@ -402,6 +404,7 @@ class NoteTail extends Note { tailStrip = new NoteTailStrip(this, 'tail'); this.isHoldTail = true; + this.forceDraw = true; this.parent = parent; } public override function destroy() { @@ -492,6 +495,15 @@ class NoteTail extends Note { scrollPosition = posFunc(this, lane, scrollDistance); } + if (followParent) { + if (goodHit) clipToDistance = distFunc(this, lane, 0); + + if (parent != null) { + directionOffset = parent.directionOffset; + scrollMultiplier = parent.scrollMultiplier; + } + } + var clipDistance:Float = distFunc(this, lane, msTime - conductorInUse.songPosition); if (clipToDistance != null) clipDistance = Math.max(clipDistance, clipToDistance); @@ -549,26 +561,6 @@ class NoteTail extends Note { } } - /* public override function getScreenBounds(?newRect:FlxRect, ?camera:FlxCamera):FlxRect { - if (newRect == null) - newRect = FlxRect.get(); - - if (camera == null) - camera = getDefaultCamera(); - - newRect.setPosition(x, y); - if (pixelPerfectPosition) - newRect.floor(); - _scaledOrigin.set(origin.x * Math.abs(scale.x), origin.y * Math.abs(scale.y)); - newRect.x += -Std.int(camera.scroll.x * scrollFactor.x) - offset.x + origin.x - _scaledOrigin.x; - newRect.y += -Std.int(camera.scroll.y * scrollFactor.y) - offset.y + origin.y - _scaledOrigin.y; - if (isPixelPerfectRender(camera)) - newRect.floor(); - newRect.setSize(frameWidth * Math.abs(scale.x), sustainHeight); - if (scale.y < 0) newRect.y -= sustainHeight; - return newRect.getRotatedBounds(angle, _scaledOrigin, newRect); - } */ - public override function isSimpleRender(?camera:FlxCamera):Bool { return false; // lazy zzz } From aef6e73a1f73f4d012262f21a09706e78f3d0288 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Thu, 8 May 2025 22:12:26 -0600 Subject: [PATCH 26/73] render rotated n zoomed triangles --- source/flixel/FlxCamera.hx | 28 +- .../graphics/tile/FlxDrawTrianglesItem.hx | 397 ++++++++++++++++++ source/funkin/backend/FunkinCamera.hx | 7 +- 3 files changed, 419 insertions(+), 13 deletions(-) create mode 100644 source/flixel/graphics/tile/FlxDrawTrianglesItem.hx diff --git a/source/flixel/FlxCamera.hx b/source/flixel/FlxCamera.hx index 9cb624d..f2c6462 100644 --- a/source/flixel/FlxCamera.hx +++ b/source/flixel/FlxCamera.hx @@ -859,12 +859,14 @@ class FlxCamera extends FlxBasic } public function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader):Void { + _bounds.set(0, 0, width / zoom, height / zoom); + _bounds.y = (height - _bounds.height) * .5; + _bounds.x = (width - _bounds.width) * .5; + if (FlxG.renderBlit) { if (position == null) position = FlxCamera.renderPoint.set(); - _bounds.set(0, 0, width, height); - var verticesLength:Int = vertices.length; var currentVertexPosition:Int = 0; @@ -873,9 +875,20 @@ class FlxCamera extends FlxBasic var bounds = FlxCamera.renderRect.set(); FlxCamera.drawVertices.splice(0, FlxCamera.drawVertices.length); + var vertPoint:FlxPoint = FlxPoint.get(); while (i < verticesLength) { - tempX = position.x + vertices[i]; - tempY = position.y + vertices[i + 1]; + vertPoint.set(position.x + vertices[i], position.y + vertices[i + 1]); + + if (rotation == 0) { + tempX = vertPoint.x; + tempY = vertPoint.y; + } else { + var pivot:FlxPoint = _bounds.getMidpoint(FlxPoint.weak()); + var rotatedPoint:FlxPoint = vertPoint.pivotDegrees(pivot, rotation); + + tempX = rotatedPoint.x; + tempY = rotatedPoint.y; + } FlxCamera.drawVertices[currentVertexPosition++] = tempX; FlxCamera.drawVertices[currentVertexPosition++] = tempY; @@ -888,7 +901,7 @@ class FlxCamera extends FlxBasic i += 2; } - + vertPoint.put(); position.putWeak(); if (!_bounds.overlaps(bounds)) { @@ -924,17 +937,16 @@ class FlxCamera extends FlxBasic bounds.put(); } else { - _bounds.set(0, 0, width, height); var isColored:Bool = (colors != null && colors.length != 0); #if !flash var hasColorOffsets:Bool = (transform != null && transform.hasRGBAOffsets()); isColored = isColored || (transform != null && transform.hasRGBMultipliers()); var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(graphic, smoothing, isColored, blend, hasColorOffsets, shader); - drawItem.addTriangles(vertices, indices, uvtData, colors, position, _bounds, transform); + drawItem.addTriangles(vertices, indices, uvtData, colors, position, _bounds, transform, rotation); #else var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(graphic, smoothing, isColored, blend); - drawItem.addTriangles(vertices, indices, uvtData, colors, position, _bounds); + drawItem.addTriangles(vertices, indices, uvtData, colors, position, _bounds, rotation); #end } } diff --git a/source/flixel/graphics/tile/FlxDrawTrianglesItem.hx b/source/flixel/graphics/tile/FlxDrawTrianglesItem.hx new file mode 100644 index 0000000..10fb476 --- /dev/null +++ b/source/flixel/graphics/tile/FlxDrawTrianglesItem.hx @@ -0,0 +1,397 @@ +package flixel.graphics.tile; + +import flixel.FlxCamera; +import flixel.graphics.frames.FlxFrame; +import flixel.graphics.tile.FlxDrawBaseItem.FlxDrawItemType; +import flixel.math.FlxMatrix; +import flixel.math.FlxPoint; +import flixel.math.FlxRect; +import flixel.system.FlxAssets.FlxShader; +import flixel.util.FlxColor; +import openfl.display.Graphics; +import openfl.display.ShaderParameter; +import openfl.display.TriangleCulling; +import openfl.geom.ColorTransform; + +typedef DrawData = openfl.Vector; + +/** + * @author Zaphod + */ +class FlxDrawTrianglesItem extends FlxDrawBaseItem +{ + static var point:FlxPoint = FlxPoint.get(); + static var rect:FlxRect = FlxRect.get(); + + #if !flash + public var shader:FlxShader; + var alphas:Array; + var colorMultipliers:Array; + var colorOffsets:Array; + #end + + public var vertices:DrawData = new DrawData(); + public var indices:DrawData = new DrawData(); + public var uvtData:DrawData = new DrawData(); + public var colors:DrawData = new DrawData(); + + public var verticesPosition:Int = 0; + public var indicesPosition:Int = 0; + public var colorsPosition:Int = 0; + + var bounds:FlxRect = FlxRect.get(); + + public function new() + { + super(); + type = FlxDrawItemType.TRIANGLES; + #if !flash + alphas = []; + #end + } + + override public function render(camera:FlxCamera):Void + { + if (!FlxG.renderTile) + return; + + if (numTriangles <= 0) + return; + + #if !flash + var shader = shader != null ? shader : graphics.shader; + shader.bitmap.input = graphics.bitmap; + shader.bitmap.filter = (camera.antialiasing || antialiasing) ? LINEAR : NEAREST; + shader.bitmap.wrap = REPEAT; // in order to prevent breaking tiling behaviour in classes that use drawTriangles + shader.alpha.value = alphas; + + if (colored || hasColorOffsets) + { + shader.colorMultiplier.value = colorMultipliers; + shader.colorOffset.value = colorOffsets; + } + else + { + shader.colorMultiplier.value = null; + shader.colorOffset.value = null; + } + + setParameterValue(shader.hasTransform, true); + setParameterValue(shader.hasColorTransform, colored || hasColorOffsets); + + camera.canvas.graphics.overrideBlendMode(blend); + + camera.canvas.graphics.beginShaderFill(shader); + #else + camera.canvas.graphics.beginBitmapFill(graphics.bitmap, null, true, (camera.antialiasing || antialiasing)); + #end + + camera.canvas.graphics.drawTriangles(vertices, indices, uvtData, TriangleCulling.NONE); + camera.canvas.graphics.endFill(); + + #if FLX_DEBUG + if (FlxG.debugger.drawDebug) + { + var gfx:Graphics = camera.debugLayer.graphics; + gfx.lineStyle(1, FlxColor.BLUE, 0.5); + gfx.drawTriangles(vertices, indices, uvtData); + } + #end + + super.render(camera); + } + + override public function reset():Void + { + super.reset(); + vertices.length = 0; + indices.length = 0; + uvtData.length = 0; + colors.length = 0; + + verticesPosition = 0; + indicesPosition = 0; + colorsPosition = 0; + #if !flash + alphas.splice(0, alphas.length); + if (colorMultipliers != null) + colorMultipliers.splice(0, colorMultipliers.length); + if (colorOffsets != null) + colorOffsets.splice(0, colorOffsets.length); + #end + } + + override public function dispose():Void + { + super.dispose(); + + vertices = null; + indices = null; + uvtData = null; + colors = null; + bounds = null; + #if !flash + alphas = null; + colorMultipliers = null; + colorOffsets = null; + #end + } + + public function addTriangles(vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, + ?cameraBounds:FlxRect #if !flash , ?transform:ColorTransform #end, rotation:Float = 0):Void + { + if (position == null) + position = point.set(); + + if (cameraBounds == null) + cameraBounds = rect.set(0, 0, FlxG.width, FlxG.height); + + var verticesLength:Int = vertices.length; + var prevVerticesLength:Int = this.vertices.length; + var numberOfVertices:Int = Std.int(verticesLength / 2); + var prevIndicesLength:Int = this.indices.length; + var prevUVTDataLength:Int = this.uvtData.length; + var prevColorsLength:Int = this.colors.length; + var prevNumberOfVertices:Int = this.numVertices; + + var tempX:Float, tempY:Float; + var i:Int = 0; + var currentVertexPosition:Int = prevVerticesLength; + + var vertPoint:FlxPoint = FlxPoint.get(); + while (i < verticesLength) + { + vertPoint.set(position.x + vertices[i], position.y + vertices[i + 1]); + + if (rotation == 0) { + tempX = vertPoint.x; + tempY = vertPoint.y; + } else { + var pivot:FlxPoint = cameraBounds.getMidpoint(FlxPoint.weak()); + var rotatedPoint:FlxPoint = vertPoint.pivotDegrees(pivot, rotation); + + tempX = rotatedPoint.x; + tempY = rotatedPoint.y; + } + + this.vertices[currentVertexPosition++] = tempX; + this.vertices[currentVertexPosition++] = tempY; + + if (i == 0) { + bounds.set(tempX, tempY, 0, 0); + } else { + inflateBounds(bounds, tempX, tempY); + } + + i += 2; + } + vertPoint.put(); + + var indicesLength:Int = indices.length; + if (!cameraBounds.overlaps(bounds)) + { + this.vertices.splice(this.vertices.length - verticesLength, verticesLength); + } + else + { + var uvtDataLength:Int = uvtData.length; + for (i in 0...uvtDataLength) + { + this.uvtData[prevUVTDataLength + i] = uvtData[i]; + } + + for (i in 0...indicesLength) + { + this.indices[prevIndicesLength + i] = indices[i] + prevNumberOfVertices; + } + + if (colored) + { + for (i in 0...numberOfVertices) + { + this.colors[prevColorsLength + i] = colors[i]; + } + + colorsPosition += numberOfVertices; + } + + verticesPosition += verticesLength; + indicesPosition += indicesLength; + } + + position.putWeak(); + cameraBounds.putWeak(); + + #if !flash + for (_ in 0...indicesLength) + { + alphas.push(transform != null ? transform.alphaMultiplier : 1.0); + } + + if (colored || hasColorOffsets) + { + if (colorMultipliers == null) + colorMultipliers = []; + + if (colorOffsets == null) + colorOffsets = []; + + for (_ in 0...indicesLength) + { + if(transform != null) + { + colorMultipliers.push(transform.redMultiplier); + colorMultipliers.push(transform.greenMultiplier); + colorMultipliers.push(transform.blueMultiplier); + + colorOffsets.push(transform.redOffset); + colorOffsets.push(transform.greenOffset); + colorOffsets.push(transform.blueOffset); + colorOffsets.push(transform.alphaOffset); + } + else + { + colorMultipliers.push(1); + colorMultipliers.push(1); + colorMultipliers.push(1); + + colorOffsets.push(0); + colorOffsets.push(0); + colorOffsets.push(0); + colorOffsets.push(0); + } + + colorMultipliers.push(1); + } + } + #end + } + + inline function setParameterValue(parameter:ShaderParameter, value:Bool):Void + { + if (parameter.value == null) + parameter.value = []; + parameter.value[0] = value; + } + + public static inline function inflateBounds(bounds:FlxRect, x:Float, y:Float):FlxRect + { + if (x < bounds.x) + { + bounds.width += bounds.x - x; + bounds.x = x; + } + + if (y < bounds.y) + { + bounds.height += bounds.y - y; + bounds.y = y; + } + + if (x > bounds.x + bounds.width) + { + bounds.width = x - bounds.x; + } + + if (y > bounds.y + bounds.height) + { + bounds.height = y - bounds.y; + } + + return bounds; + } + + override public function addQuad(frame:FlxFrame, matrix:FlxMatrix, ?transform:ColorTransform):Void + { + var prevVerticesPos:Int = verticesPosition; + var prevIndicesPos:Int = indicesPosition; + var prevColorsPos:Int = colorsPosition; + var prevNumberOfVertices:Int = numVertices; + + var point = FlxPoint.get(); + point.transform(matrix); + + vertices[prevVerticesPos] = point.x; + vertices[prevVerticesPos + 1] = point.y; + + uvtData[prevVerticesPos] = frame.uv.left; + uvtData[prevVerticesPos + 1] = frame.uv.top; + + point.set(frame.frame.width, 0); + point.transform(matrix); + + vertices[prevVerticesPos + 2] = point.x; + vertices[prevVerticesPos + 3] = point.y; + + uvtData[prevVerticesPos + 2] = frame.uv.right; + uvtData[prevVerticesPos + 3] = frame.uv.top; + + point.set(frame.frame.width, frame.frame.height); + point.transform(matrix); + + vertices[prevVerticesPos + 4] = point.x; + vertices[prevVerticesPos + 5] = point.y; + + uvtData[prevVerticesPos + 4] = frame.uv.right; + uvtData[prevVerticesPos + 5] = frame.uv.bottom; + + point.set(0, frame.frame.height); + point.transform(matrix); + + vertices[prevVerticesPos + 6] = point.x; + vertices[prevVerticesPos + 7] = point.y; + + point.put(); + + uvtData[prevVerticesPos + 6] = frame.uv.left; + uvtData[prevVerticesPos + 7] = frame.uv.bottom; + + indices[prevIndicesPos] = prevNumberOfVertices; + indices[prevIndicesPos + 1] = prevNumberOfVertices + 1; + indices[prevIndicesPos + 2] = prevNumberOfVertices + 2; + indices[prevIndicesPos + 3] = prevNumberOfVertices + 2; + indices[prevIndicesPos + 4] = prevNumberOfVertices + 3; + indices[prevIndicesPos + 5] = prevNumberOfVertices; + + if (colored) + { + var red = 1.0; + var green = 1.0; + var blue = 1.0; + var alpha = 1.0; + + if (transform != null) + { + red = transform.redMultiplier; + green = transform.greenMultiplier; + blue = transform.blueMultiplier; + + #if !neko + alpha = transform.alphaMultiplier; + #end + } + + var color = FlxColor.fromRGBFloat(red, green, blue, alpha); + + colors[prevColorsPos] = color; + colors[prevColorsPos + 1] = color; + colors[prevColorsPos + 2] = color; + colors[prevColorsPos + 3] = color; + + colorsPosition += 4; + } + + verticesPosition += 8; + indicesPosition += 6; + } + + override function get_numVertices():Int + { + return Std.int(vertices.length / 2); + } + + override function get_numTriangles():Int + { + return Std.int(indices.length / 3); + } +} \ No newline at end of file diff --git a/source/funkin/backend/FunkinCamera.hx b/source/funkin/backend/FunkinCamera.hx index 310d5c5..bf84739 100644 --- a/source/funkin/backend/FunkinCamera.hx +++ b/source/funkin/backend/FunkinCamera.hx @@ -107,8 +107,7 @@ class FunkinCamera extends FlxCamera { target.getMidpoint(_point); _point.addPoint(targetOffset); _scrollTarget.set(_point.x - width * 0.5, _point.y - height * 0.5); - } - else { + } else { var edge:Float; var targetX:Float = target.x + targetOffset.x; var targetY:Float = target.y + targetOffset.y; @@ -126,9 +125,7 @@ class FunkinCamera extends FlxCamera { // without this we see weird behavior when switching to SCREEN_BY_SCREEN at arbitrary scroll positions bindScrollPos(_scrollTarget); - } - else - { + } else { edge = targetX - deadzone.x; if (_scrollTarget.x > edge) _scrollTarget.x = edge; From c881f9519150ebc367ec3bed8ba61df9dadb284a Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Thu, 8 May 2025 22:50:49 -0600 Subject: [PATCH 27/73] chart audio offset --- source/funkin/backend/play/Chart.hx | 2 ++ source/funkin/backend/play/SongEvent.hx | 2 +- source/funkin/backend/rhythm/Conductor.hx | 6 ++++-- source/funkin/states/PlayState.hx | 12 ++++++++---- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/source/funkin/backend/play/Chart.hx b/source/funkin/backend/play/Chart.hx index ed149d6..78bbf16 100644 --- a/source/funkin/backend/play/Chart.hx +++ b/source/funkin/backend/play/Chart.hx @@ -51,6 +51,7 @@ class Chart { public var instLoaded:Bool; public var inst:FunkinSound; public var songLength:Float = 0; + public var audioOffset:Float = 0; public var audioSuffix:String = ''; public var player1:String = 'bf'; @@ -275,6 +276,7 @@ class Chart { } song.name = song.json.song; song.initialBpm = song.json.bpm; + song.audioOffset = song.json.offset ?? 0; song.tempoChanges = [new TempoChange(-4, song.initialBpm, new TimeSignature())]; song.scrollSpeed = songSpeed; diff --git a/source/funkin/backend/play/SongEvent.hx b/source/funkin/backend/play/SongEvent.hx index ed62f85..c8f595d 100644 --- a/source/funkin/backend/play/SongEvent.hx +++ b/source/funkin/backend/play/SongEvent.hx @@ -53,7 +53,7 @@ import funkin.backend.scripting.HScript; countdownSprite = game.popCountdown('gameplay/funkin/$countdown'); case SONG_START: - game.music.play(true); + game.music.play(true, -game.audioOffset); game.syncMusic(true, true); game.songStarted = true; case SONG_FINISH: diff --git a/source/funkin/backend/rhythm/Conductor.hx b/source/funkin/backend/rhythm/Conductor.hx index c7bd92e..00d3591 100644 --- a/source/funkin/backend/rhythm/Conductor.hx +++ b/source/funkin/backend/rhythm/Conductor.hx @@ -28,6 +28,7 @@ class Conductor { public var metronome:Metronome; public var syncTracker:FlxSound; + public var audioOffset:Float = 0; public var maxDisparity:Float = 33.34; public static var global(default, never):Conductor = new Conductor(); @@ -44,8 +45,9 @@ class Conductor { songPosition += Math.min(elapsedMS, 250) * timeScale; if (syncTracker != null) { timeScale = syncTracker.pitch; - if (syncTracker.playing && Math.abs(metronome.ms - syncTracker.time) > maxDisparity * timeScale) - songPosition = syncTracker.time; + var offsetTime:Float = syncTracker.time + audioOffset; + if (syncTracker.playing && Math.abs(metronome.ms - offsetTime) > maxDisparity * timeScale) + songPosition = offsetTime; } if (dispatchEvents) { diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 8d201c4..3df69d2 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -85,6 +85,7 @@ class PlayState extends FunkinState { public var godmode:Bool; public var downscroll:Bool; public var middlescroll:Bool; + public var audioOffset:Float; public var songStarted:Bool = false; public var songFinished:Bool = false; @@ -156,6 +157,7 @@ class PlayState extends FunkinState { hitsound = FunkinSound.load(Paths.sound('gameplay/hitsounds/hitsound'), .7); music = new FunkinSoundGroup(); + audioOffset = chart.audioOffset; songName = chart.name; @:privateAccess FlxG.cameras.defaults.resize(0); @@ -359,6 +361,7 @@ class PlayState extends FunkinState { Paths.sound('gameplay/hitsounds/miss$i'); Paths.sound('gameplay/hitsounds/hitsoundTail'); Paths.sound('gameplay/hitsounds/hitsoundFail'); + conductorInUse.audioOffset = audioOffset; FlxG.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressEvent); FlxG.stage.addEventListener(KeyboardEvent.KEY_UP, keyReleaseEvent); @@ -478,7 +481,7 @@ class PlayState extends FunkinState { for (event in chart.events) events.push(event); music.pause(); - music.time = 0; + music.time = -audioOffset; resetConductor(); beginCountdown(); resetScore(); @@ -603,8 +606,9 @@ class PlayState extends FunkinState { public function syncMusic(forceSongpos:Bool = false, forceTrackTime:Bool = false) { var syncBase:FlxSound = conductorInUse.syncTracker; if (syncBase != null && syncBase.playing && !conductorInUse.paused) { - if ((forceSongpos && conductorInUse.songPosition < syncBase.time) || Math.abs(syncBase.time - conductorInUse.songPosition) > 75) - conductorInUse.songPosition = syncBase.time; + var offsetTime:Float = syncBase.time + conductorInUse.audioOffset; + if ((forceSongpos && conductorInUse.songPosition < offsetTime) || Math.abs(syncBase.time - offsetTime) > 75) + conductorInUse.songPosition = offsetTime; if (forceTrackTime) { if (Math.abs(music.getDisparity(syncBase.time)) > 75) music.syncToBase(); @@ -633,7 +637,7 @@ class PlayState extends FunkinState { return; if (music.playing) { - var beginTime:Float = Date.now().getTime() - music.time; + var beginTime:Float = Date.now().getTime() - music.time + audioOffset; var endTime:Float = beginTime + chart.songLength; DiscordRPC.presence.endTimestamp = Std.int(endTime * .001); DiscordRPC.presence.startTimestamp = Std.int(beginTime * .001); From d23c44e0546405e53ddc7ef84d6fe161a51fa2cd Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Fri, 9 May 2025 00:51:16 -0600 Subject: [PATCH 28/73] update soundtray for flixel 6.1.0 --- source/Main.hx | 4 +- source/funkin/backend/FunkinSoundTray.hx | 59 ++++++++++++++++++++---- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/source/Main.hx b/source/Main.hx index b651678..3d13df8 100644 --- a/source/Main.hx +++ b/source/Main.hx @@ -72,8 +72,8 @@ class Main extends openfl.display.Sprite { #end } - public static function get_soundTray() { - return cast(FlxG.game.soundTray, funkin.backend.FunkinSoundTray); + public static function get_soundTray():funkin.backend.FunkinSoundTray { + return cast FlxG.game.soundTray; } public static function set_showWatermark(show:Bool) { if (showWatermark == show) return showWatermark; diff --git a/source/funkin/backend/FunkinSoundTray.hx b/source/funkin/backend/FunkinSoundTray.hx index 04a91c5..867de23 100644 --- a/source/funkin/backend/FunkinSoundTray.hx +++ b/source/funkin/backend/FunkinSoundTray.hx @@ -1,7 +1,9 @@ package funkin.backend; +#if (flixel >= "6.1.0") import flixel.system.FlxAssets; #end import openfl.display.BitmapData; import openfl.display.Bitmap; +import openfl.Lib; // Hello funkin crew class FunkinSoundTray extends flixel.system.ui.FlxSoundTray { @@ -14,7 +16,6 @@ class FunkinSoundTray extends flixel.system.ui.FlxSoundTray { public var scale(default, set):Float; public var barsY(default, set):Float; - public var volumeMaxSound:String; public function new() { super(); @@ -26,6 +27,7 @@ class FunkinSoundTray extends flixel.system.ui.FlxSoundTray { addChild(bg); addChild(bgBar); + _bg = bg; _bars.resize(0); for (i in 0...10) { var bar:Bitmap = new Bitmap(); @@ -36,10 +38,10 @@ class FunkinSoundTray extends flixel.system.ui.FlxSoundTray { scale = .6; barsY = 18; - + reloadSoundtrayGraphics(); y = -height; - + volumeUpSound = 'soundtray/volUP'; volumeDownSound = 'soundtray/volDOWN'; volumeMaxSound = 'soundtray/volMAX'; @@ -50,13 +52,12 @@ class FunkinSoundTray extends flixel.system.ui.FlxSoundTray { public function reloadSoundtrayGraphics() { bg.bitmapData = Paths.bmd('soundtray/volumebox'); bgBar.bitmapData = Paths.bmd('soundtray/bars_bg'); - // _width = bg.bitmapData.width; + for (i => bar in _bars) { - var bmd:Null = Paths.bmd('soundtray/bars_${i + 1}'); - bar.x = ((bg.bitmapData?.width ?? 0) - (bmd?.width ?? 0)) * .5; - bar.bitmapData = bmd; + bar.bitmapData = Paths.bmd('soundtray/bars_${i + 1}'); + bar.x = (bg.width - bar.width) * .5; } - bgBar.x = ((bg.bitmapData?.width ?? 0) - (bgBar.bitmapData?.width ?? 0)) * .5; + bgBar.x = (bg.width - bgBar.width) * .5; screenCenter(); } @@ -102,7 +103,46 @@ class FunkinSoundTray extends flixel.system.ui.FlxSoundTray { #end } } - + + #if (flixel >= "6.1.0") + public var volumeMaxSound:FlxSoundAsset; + + override public function showAnim(volume:Float, ?sound:FlxSoundAsset, duration:Float = 1, label:String = 'VOLUME'):Void { + if (sound != null) { + if (sound is String) { + FlxG.sound.play(Paths.sound(sound)); + } else { + FlxG.sound.play(sound); + } + } + + var nVolume:Int = Math.round(volume * 10); + + _timer = duration; + lerpYPos = 10; + visible = true; + active = true; + + for (i => bar in _bars) + bar.visible = (i + 1 == nVolume); + + max = (nVolume >= 10); + } + + override function showIncrement():Void { + final volume = FlxG.sound.muted ? 0 : FlxG.sound.volume; + showAnim(volume, silent ? null : (max ? volumeMaxSound : volumeUpSound)); + } + + override function showDecrement():Void { + final volume = FlxG.sound.muted ? 0 : FlxG.sound.volume; + showAnim(volume, silent ? null : volumeDownSound); + } + + override function updateSize():Void {} // just useless here + #else + public var volumeMaxSound:String; + override public function show(up:Bool = false):Void { _timer = 1; lerpYPos = 10; @@ -126,4 +166,5 @@ class FunkinSoundTray extends flixel.system.ui.FlxSoundTray { bar.visible = (i + 1 == globalVolume); max = (baseVolume == 10); } + #end } \ No newline at end of file From 33411ac4fab8a1368c143e2f6816d6201034e64d Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 10 May 2025 08:18:50 -0600 Subject: [PATCH 29/73] fix audio offset math FCUKKKKKKKK --- source/funkin/states/PlayState.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 3df69d2..4b723aa 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -607,7 +607,7 @@ class PlayState extends FunkinState { var syncBase:FlxSound = conductorInUse.syncTracker; if (syncBase != null && syncBase.playing && !conductorInUse.paused) { var offsetTime:Float = syncBase.time + conductorInUse.audioOffset; - if ((forceSongpos && conductorInUse.songPosition < offsetTime) || Math.abs(syncBase.time - offsetTime) > 75) + if ((forceSongpos && conductorInUse.songPosition < offsetTime) || Math.abs(offsetTime - conductorInUse.songPosition) > 75) conductorInUse.songPosition = offsetTime; if (forceTrackTime) { if (Math.abs(music.getDisparity(syncBase.time)) > 75) From 41a696a58a70b5d78dac3e6bbeea64e1ee42bdce Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 10 May 2025 16:19:30 -0600 Subject: [PATCH 30/73] fix some stupid garbage --- source/Main.hx | 48 ++++++++-------- source/funkin/backend/FunkinGame.hx | 70 +---------------------- source/funkin/backend/FunkinState.hx | 4 +- source/funkin/backend/rhythm/Conductor.hx | 36 ++++++++---- source/funkin/states/PlayState.hx | 4 +- 5 files changed, 57 insertions(+), 105 deletions(-) diff --git a/source/Main.hx b/source/Main.hx index 3d13df8..194521e 100644 --- a/source/Main.hx +++ b/source/Main.hx @@ -9,7 +9,7 @@ class Main extends openfl.display.Sprite { public static var instance:Main; public static var engineVersion(default, never):String = '0.0.8'; - public static var apiVersion(default, never):String = '0.0.2'; + public static var apiVersion(default, never):String = '0.0.3'; public static var compiledTo(get, never):String; public static var compiledWith(get, never):String; @@ -24,6 +24,30 @@ class Main extends openfl.display.Sprite { instance = this; windowTitle = FlxG.stage.window.title; + printStartup(); + + Mods.refresh(); + HScript.init(); + DiscordRPC.prepare(); + + var game:FunkinGame = new FunkinGame(0, 0, funkin.states.TitleState); + addChild(game); + addChild(debugDisplay = new DebugDisplay(10, 3)); + + FlxG.maxElapsed = 1; + FlxG.drawFramerate = 144; + FlxG.updateFramerate = 144; + FlxG.signals.postUpdate.add(() -> DiscordRPC.update()); + + showWatermark = true; + + DiscordRPC.presence.largeImageText = 'FUNKINX3 $engineVersion'; + openfl.Lib.current.loaderInfo.uncaughtErrorEvents.addEventListener(openfl.events.UncaughtErrorEvent.UNCAUGHT_ERROR, CrashState.handleUncaughtError); + #if cpp + untyped __global__.__hxcpp_set_critical_error_handler((error) -> throw error); + #end + } + inline function printStartup():Void { final timeText:String = 'GAME STARTED ON ${Date.now().toString()}'; Sys.println(''); #if I_AM_BORING_ZZZ @@ -48,28 +72,6 @@ class Main extends openfl.display.Sprite { } #end Sys.println(''); - - Mods.refresh(); - HScript.init(); - DiscordRPC.prepare(); - var game:FunkinGame = new FunkinGame(0, 0, funkin.states.TitleState); - addChild(game); - addChild(debugDisplay = new DebugDisplay(10, 3)); - - FlxG.maxElapsed = 1; - FlxG.drawFramerate = 144; - FlxG.updateFramerate = 144; - FlxG.fixedTimestep = false; - - FlxG.signals.postUpdate.add(() -> DiscordRPC.update()); - - showWatermark = true; - - DiscordRPC.presence.largeImageText = 'FUNKINX3 $engineVersion'; - openfl.Lib.current.loaderInfo.uncaughtErrorEvents.addEventListener(openfl.events.UncaughtErrorEvent.UNCAUGHT_ERROR, CrashState.handleUncaughtError); - #if cpp - untyped __global__.__hxcpp_set_critical_error_handler((error) -> throw error); - #end } public static function get_soundTray():funkin.backend.FunkinSoundTray { diff --git a/source/funkin/backend/FunkinGame.hx b/source/funkin/backend/FunkinGame.hx index d8d1abb..fc2935e 100644 --- a/source/funkin/backend/FunkinGame.hx +++ b/source/funkin/backend/FunkinGame.hx @@ -1,79 +1,15 @@ package funkin.backend; class FunkinGame extends flixel.FlxGame { - var _time:Float = -1; - public function new(width:Int = 0, height:Int = 0, ?initialState:flixel.util.typeLimit.NextState.InitialState, updateFramerate:Int = 60, drawFramerate:Int = 60, skipSplash:Bool = false, startFullscreen:Bool = false) { super(width, height, initialState, updateFramerate, drawFramerate, skipSplash, startFullscreen); + + #if FLX_SOUND_TRAY _customSoundTray = funkin.backend.FunkinSoundTray; - } - - override function switchState() { - _time = -1; - super.switchState(); + #end } function crashGame(mes:String = 'Triggered a manual crash') { throw mes; } - - override function update():Void { - if (!_state.active || !_state.exists) - return; - - if (FlxG.keys.pressed.SHIFT && FlxG.keys.justPressed.F2) - crashGame(); - - if (_nextState != null) - switchState(); - - #if FLX_DEBUG - if (FlxG.debugger.visible) - ticks = getTicks(); - #end - - var curTime:Float = haxe.Timer.stamp(); - var realTime:Float = 0; - if (_time >= 0) - realTime = Math.min(curTime - _time, FlxG.maxElapsed); - _elapsedMS = realTime * 1000; - _time = curTime; - _total = ticks; - - updateElapsed(); - - FlxG.signals.preUpdate.dispatch(); - - updateInput(); - - #if FLX_POST_PROCESS - if (postProcesses[0] != null) - postProcesses[0].update(realTime); - #end - - #if FLX_SOUND_SYSTEM - FlxG.sound.update(realTime); - #end - FlxG.plugins.update(realTime); - - _state.tryUpdate(realTime); - - FlxG.cameras.update(realTime); - FlxG.signals.postUpdate.dispatch(); - - #if FLX_DEBUG - debugger.stats.flixelUpdate(getTicks() - ticks); - #end - - #if FLX_POINTER_INPUT - var len = FlxG.swipes.length; - while (len-- > 0) { - final swipe = FlxG.swipes.pop(); - if (swipe != null) - swipe.destroy(); - } - #end - - filters = filtersEnabled ? _filters : null; - } } \ No newline at end of file diff --git a/source/funkin/backend/FunkinState.hx b/source/funkin/backend/FunkinState.hx index 63aa5f1..065d1fa 100644 --- a/source/funkin/backend/FunkinState.hx +++ b/source/funkin/backend/FunkinState.hx @@ -52,6 +52,8 @@ class FunkinState extends FlxSubState implements funkin.backend.FunkinSprite.ISp } override public function create() { + FlxG.fixedTimestep = false; + Main.soundTray.reloadSoundtrayGraphics(); Paths.trackedAssets.resize(0); if (clearAssetsNow) { @@ -159,7 +161,7 @@ class FunkinState extends FlxSubState implements funkin.backend.FunkinSprite.ISp } public function updateConductor(elapsed:Float = 0) { - conductorInUse.update(elapsed * 1000); + conductorInUse.update(elapsed * 1000 / FlxG.timeScale); curBar = Math.floor(conductorInUse.bar); curBeat = Math.floor(conductorInUse.beat); diff --git a/source/funkin/backend/rhythm/Conductor.hx b/source/funkin/backend/rhythm/Conductor.hx index 00d3591..5662b69 100644 --- a/source/funkin/backend/rhythm/Conductor.hx +++ b/source/funkin/backend/rhythm/Conductor.hx @@ -32,27 +32,30 @@ class Conductor { public var maxDisparity:Float = 33.34; public static var global(default, never):Conductor = new Conductor(); + var prevBar:Int; + var prevBeat:Int; + var prevStep:Int; + var prevPosition:Float; + public function new(?metronome:Metronome) { this.metronome = metronome ?? new Metronome(); } public function update(elapsedMS:Float) { if (paused) return; - var prevStep:Int = Math.floor(metronome.step); - var prevBeat:Int = Math.floor(metronome.beat); - var prevBar:Int = Math.floor(metronome.bar); + setPosition(songPosition + Math.min(elapsedMS, 250) * timeScale); + } + + public inline function setPosition(position:Float):Void { + prevPosition = metronome.ms; + prevStep = Math.floor(metronome.step); + prevBeat = Math.floor(metronome.beat); + prevBar = Math.floor(metronome.bar); - songPosition += Math.min(elapsedMS, 250) * timeScale; - if (syncTracker != null) { - timeScale = syncTracker.pitch; - var offsetTime:Float = syncTracker.time + audioOffset; - if (syncTracker.playing && Math.abs(metronome.ms - offsetTime) > maxDisparity * timeScale) - songPosition = offsetTime; - } + songPosition = position; + sync(); if (dispatchEvents) { - advance.dispatch(metronome.ms); - var curBar:Int = Math.floor(metronome.bar); var curBeat:Int = Math.floor(metronome.beat); var curStep:Int = Math.floor(metronome.step); @@ -60,6 +63,15 @@ class Conductor { if (prevBar != curBar) barHit.dispatch(curBar); if (prevBeat != curBeat) beatHit.dispatch(curBeat); if (prevStep != curStep) stepHit.dispatch(curStep); + if (prevPosition != metronome.ms) advance.dispatch(metronome.ms); + } + } + public inline function sync():Void { + if (syncTracker != null) { + timeScale = syncTracker.pitch; + var offsetTime:Float = syncTracker.time + audioOffset; + if (syncTracker.playing && Math.abs(metronome.ms - offsetTime) > maxDisparity * timeScale) + songPosition = offsetTime; } } diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 4b723aa..5d1706b 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -753,10 +753,10 @@ class PlayState extends FunkinState { if (HScript.stopped(hscripts.run('keyPressed', [key, justPressed])) || inputDisabled || paused) return; if (justPressed) { var keybind:Int = Controls.keybindFromArray(keybinds, key); + var oldTime:Float = conductorInUse.songPosition; - var newTimeMaybe:Float = conductorInUse.syncTracker?.time ?? oldTime; if (conductorInUse.syncTracker != null && conductorInUse.syncTracker.playing) - conductorInUse.songPosition = newTimeMaybe; + @:privateAccess conductorInUse.songPosition = conductorInUse.syncTracker._channel.position + audioOffset; var canFireInput:Bool = true; if (keybind >= 0) From 63a3c3a2431aa2ee20ce408f50a637be8b8863a7 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 11 May 2025 09:24:03 -0600 Subject: [PATCH 31/73] update character internal fix special anims being unable to be reset while hitting notes (again) --- source/funkin/backend/play/NoteEvent.hx | 2 +- source/funkin/objects/Character.hx | 43 +++++++++++++++++-------- source/funkin/objects/CharacterGroup.hx | 4 +-- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index 70d74be..140082c 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -178,7 +178,7 @@ using StringTools; if (playAnimation && targetCharacter != null) { var suffixAnim:String = '$singAnimation$animSuffix${targetCharacter.animSuffix}'; - if ((!targetCharacter.specialAnim || targetCharacter.currentAnimation == suffixAnim) && targetCharacter.animationExists(suffixAnim)) + if (targetCharacter.currentAnimation == suffixAnim) targetCharacter.timeAnimSteps(); } diff --git a/source/funkin/objects/Character.hx b/source/funkin/objects/Character.hx index cd1d91f..82ac4ef 100644 --- a/source/funkin/objects/Character.hx +++ b/source/funkin/objects/Character.hx @@ -220,17 +220,19 @@ class Character extends FunkinSprite implements ICharacter { super.update(elapsed); if (animReset > 0) { animReset -= elapsed; - if (animReset <= 0 && !specialAnim && idleAfterAnim && !held) { + if (animReset <= 0) { animReset = 0; - dance(true); + if (!specialAnim && idleAfterAnim && !held) + idle(); } } if (specialAnim) { - if (isAnimationFinished() && animReset <= 0 && idleAfterAnim) { - specialAnim = false; + if (isAnimationFinished() && animReset <= 0) { animReset = 0; - if (singForSteps <= 0) - dance(true); + specialAnim = false; + + if (idleAfterAnim && singForSteps <= 0) + idle(); } } } @@ -255,8 +257,14 @@ class Character extends FunkinSprite implements ICharacter { super.destroy(); } - public function timeAnimSteps(?steps:Float) { - animReset = (steps ?? singForSteps) * conductorInUse.stepCrochet * .001; + public function timeAnimSteps(?steps:Float, max:Bool = true) { + // Sys.println('timed animation $currentAnimation steps $steps'); + var time:Float = (steps ?? singForSteps) * conductorInUse.stepCrochet * .001; + if (max) { + animReset = Math.max(animReset, time); + } else { + animReset = time; + } } public function animationIsLooping(anim:String):Bool { return (currentAnimation == '$anim-loop' || currentAnimation == '$anim-hold'); @@ -285,10 +293,10 @@ class Character extends FunkinSprite implements ICharacter { } if (animationExists(anim)) { + var sameAnim:Bool = (currentAnimation == anim); var animWasDone:Bool = isAnimationFinished(); playAnimation(anim, forced, reversed, frame); - var sameAnim:Bool = (currentAnimation == anim); if (forced || !sameAnim || animWasDone) { timeAnimSteps(steps ?? singForSteps); specialAnim = true; @@ -323,10 +331,10 @@ class Character extends FunkinSprite implements ICharacter { } if (!specialAnim && animationExists(anim)) { + var sameAnim:Bool = (currentAnimation == anim); var animWasDone:Bool = isAnimationFinished(); playAnimation(anim, forced, reversed, frame); - var sameAnim:Bool = (currentAnimation == anim); if (forced || !sameAnim || animWasDone) timeAnimSteps(steps ?? singForSteps); } @@ -349,6 +357,14 @@ class Character extends FunkinSprite implements ICharacter { return true; } + public function idle():Void { + if (!idleAfterAnim) return; + + specialAnim = false; + animReset = 0; + + dance(); + } public override function setAnimOffset(x:Float = 0, y:Float = 0):Void { if (!classicFlip && !sideMatches()) { animOffset.set(-x + frameWidth - idleFrameSize.x, y); @@ -366,10 +382,11 @@ class Character extends FunkinSprite implements ICharacter { function set_held(value:Bool):Bool { if (held == value) return value; + held = value; if (!value && animReset <= 0 && !specialAnim) - dance(true); + idle(); - return held = value; + return value; } function set_bop(value:Bool):Bool { return bop = value; } function set_animReset(value:Float):Float { return animReset = value; } @@ -665,8 +682,8 @@ interface ICharacter extends IBopper extends IFunkinSpriteAnim { public var character(default, set):Null; public var conductorInUse(default, set):Conductor; - public function timeAnimSteps(?steps:Float):Void; public function animationIsLooping(anim:String):Bool; + public function timeAnimSteps(?steps:Float, max:Bool = true):Void; public function playAnimationSoft(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0):Void; public function playAnimationSteps(anim:String, forced:Bool = false, ?steps:Float, reversed:Bool = false, frame:Int = 0):Void; public function playAnimationSpecial(anim:String, forced:Bool = false, ?steps:Float, reversed:Bool = false, frame:Int = 0):Void; diff --git a/source/funkin/objects/CharacterGroup.hx b/source/funkin/objects/CharacterGroup.hx index 18269e6..cadd6c6 100644 --- a/source/funkin/objects/CharacterGroup.hx +++ b/source/funkin/objects/CharacterGroup.hx @@ -291,9 +291,9 @@ class CharacterGroup extends FunkinTypedSpriteGroup implements IChara public function animationIsLooping(anim:String):Bool { return current?.animationIsLooping(anim) ?? false; } public function setOffset(x:Float = 0, y:Float = 0):Void { current?.setOffset(x, y); } - public function timeAnimSteps(?steps:Float):Void { + public function timeAnimSteps(?steps:Float, max:Bool = true):Void { for (chara in members) - chara?.timeAnimSteps(steps); + chara?.timeAnimSteps(steps, max); } public function playAnimationSoft(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0):Void { for (chara in members) From 644d0ee93cf4b2d50cc3ef672c7f8f174fdb9d9e Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 11 May 2025 10:04:48 -0600 Subject: [PATCH 32/73] you can now play the game without assets. i dont know what i did this for its just really funny --- source/funkin/backend/FunkinSprite.hx | 3 +-- source/funkin/states/FreeplayState.hx | 29 ++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/source/funkin/backend/FunkinSprite.hx b/source/funkin/backend/FunkinSprite.hx index b4318c4..4627785 100644 --- a/source/funkin/backend/FunkinSprite.hx +++ b/source/funkin/backend/FunkinSprite.hx @@ -279,8 +279,7 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact public function hasAnimationPrefix(prefix:String) { var frames:Array = []; - @:privateAccess //why is it private :sob: - animation.findByPrefix(frames, prefix); + try { @:privateAccess animation.findByPrefix(frames, prefix); } catch (e:Dynamic) {} //why is it private :sob: return (frames.length > 0); } inline public function transformSpriteOffset(point:FlxPoint):FlxPoint { diff --git a/source/funkin/states/FreeplayState.hx b/source/funkin/states/FreeplayState.hx index e374ce4..6ce04bc 100644 --- a/source/funkin/states/FreeplayState.hx +++ b/source/funkin/states/FreeplayState.hx @@ -16,6 +16,9 @@ class FreeplayState extends FunkinState { public static var selectedDifficulty:Int = 0; public static var currentVariation:String = 'default'; + var fallbackVariation:Variation = new Variation('unknown', {difficulties: ['easy', 'normal', 'hard'], suffix: '', name: 'Unknown'}); + var _hasUnknown:Bool = false; + override public function create() { Mods.currentMod = null; super.create(); @@ -31,7 +34,7 @@ class FreeplayState extends FunkinState { diffText.setFormat(Paths.ttf('vcr'), 18, FlxColor.WHITE, RIGHT, OUTLINE, FlxColor.BLACK); diffText.scrollFactor.set(); add(diffText); - + displayItems = new FlxTypedGroup(); add(displayItems); @@ -44,10 +47,12 @@ class FreeplayState extends FunkinState { loadLevel('$folder/$level', path.mod); } } + if (_hasUnknown) + variationList.push(fallbackVariation); FlxG.camera.target = target = new FlxObject(); FlxG.camera.followLerp = 9 / 60; - + if (currentVariation == null) currentVariation = variationList[0].internalName; displayVariation(findVariation(currentVariation)); selectDifficulty(); @@ -76,11 +81,15 @@ class FreeplayState extends FunkinState { inputEnabled = false; new FlxTimer().start(2, (timer:FlxTimer) -> { + var difficulty:Null = null; var shifted:Bool = FlxG.keys.pressed.SHIFT; var variation:Variation = findVariation(currentVariation); + + if (variation != null) difficulty = variation.difficulties[selectedDifficulty]; + var selectedItem:SongItem = displayItems.members[selection]; Mods.currentMod = selectedItem.mod ?? ''; - var chart:Chart = Chart.loadChart(selectedItem.songPath, variation.difficulties[selectedDifficulty], variation.suffix); + var chart:Chart = Chart.loadChart(selectedItem.songPath, difficulty, variation.suffix); FlxG.switchState(() -> new PlayState(chart, shifted)); }); } @@ -91,6 +100,8 @@ class FreeplayState extends FunkinState { // TODO: this doesn't work like how i wanted it to... public function selectDifficulty(mod:Int = 0) { + if (variationList.length == 0) return; + var variation:Variation = findVariation(currentVariation); var difficulties:Array = variation.difficulties; var nextVariation:Variation = variation; @@ -118,7 +129,7 @@ class FreeplayState extends FunkinState { diffText.text = 'VARIATION: ${nextVariation.name}\n${difficulties[selectedDifficulty].toUpperCase()}'; } public function select(mod:Int = 0) { - if (items.length == 0) return; + if (displayItems.length == 0) return; if (mod != 0) FunkinSound.playOnce(Paths.sound('scrollMenu'), .8); displayItems.members[selection]?.highlight(false); @@ -156,11 +167,19 @@ class FreeplayState extends FunkinState { item.songPath = song.songPath; item.mod = mod ?? ''; items.push(item); + for (variationName in (song.variations ?? levels.variations)) { loadVariation(variationName, mod); var variation:Variation = findVariation(variationName); - if (variation != null) + if (variation != null) { item.variations.push(variation); + } else { + variation = variationList[0]; + variation ??= fallbackVariation; + item.variations.push(fallbackVariation); + + if (variation == fallbackVariation) _hasUnknown = true; + } } var songPath:String = 'data/songs/${song.songPath}'; From 8a4421f5d0c4d7c4cf1947e29e1a821b60fa0f39 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 11 May 2025 18:48:41 -0600 Subject: [PATCH 33/73] hl semi support again, more util funnies hl is kind of a bitch but its ok --- Project.xml | 3 +- source/flixel/FlxCamera.hx | 19 ++-- source/funkin/backend/FunkinCamera.hx | 86 ++++------------ source/funkin/backend/FunkinState.hx | 9 +- source/funkin/backend/Paths.hx | 18 ++-- source/funkin/backend/play/Chart.hx | 2 +- source/funkin/backend/rhythm/Event.hx | 6 +- source/funkin/backend/scripting/ModInterp.hx | 100 +++++++++++++++++++ source/funkin/debug/DebugDisplay.hx | 14 +-- source/funkin/util/MemoryUtil.hx | 40 ++++++++ source/funkin/util/Util.hx | 10 +- 11 files changed, 202 insertions(+), 105 deletions(-) create mode 100644 source/funkin/util/MemoryUtil.hx diff --git a/Project.xml b/Project.xml index 4a61901..5b81ad9 100644 --- a/Project.xml +++ b/Project.xml @@ -60,11 +60,10 @@ + - - diff --git a/source/flixel/FlxCamera.hx b/source/flixel/FlxCamera.hx index f2c6462..c73515b 100644 --- a/source/flixel/FlxCamera.hx +++ b/source/flixel/FlxCamera.hx @@ -1155,6 +1155,7 @@ class FlxCamera extends FlxBasic if (target != null) { updateFollow(); + updateLerp(elapsed); } updateScroll(); @@ -1209,7 +1210,7 @@ class FlxCamera extends FlxBasic if (deadzone == null) { target.getMidpoint(_point); - _point.addPoint(targetOffset); + _point.add(targetOffset); _scrollTarget.set(_point.x - width * 0.5, _point.y - height * 0.5); } else @@ -1279,15 +1280,21 @@ class FlxCamera extends FlxBasic _lastTargetPosition.y = target.y; } } - - if (followLerp >= 60 / FlxG.updateFramerate) + } + + function updateLerp(elapsed:Float) + { + if (followLerp >= 1.0) { scroll.copyFrom(_scrollTarget); // no easing } - else + else if (followLerp > 0.0) { - scroll.x += (_scrollTarget.x - scroll.x) * followLerp * (60 / FlxG.updateFramerate); - scroll.y += (_scrollTarget.y - scroll.y) * followLerp * (60 / FlxG.updateFramerate); + // Adjust lerp based on the current frame rate so lerp is less framerate dependant + final adjustedLerp = 1.0 - Math.pow(1.0 - followLerp, elapsed * 60); + + scroll.x += (_scrollTarget.x - scroll.x) * adjustedLerp; + scroll.y += (_scrollTarget.y - scroll.y) * adjustedLerp; } } diff --git a/source/funkin/backend/FunkinCamera.hx b/source/funkin/backend/FunkinCamera.hx index bf84739..ba0165a 100644 --- a/source/funkin/backend/FunkinCamera.hx +++ b/source/funkin/backend/FunkinCamera.hx @@ -11,11 +11,10 @@ class FunkinCamera extends FlxCamera { public var zoomTarget:Null = null; public var zoomFollowLerp:Float = -1; public var zoomOffset:Float = 0; - var time:Float = -1; override public function update(elapsed:Float):Void { - if (target != null) updateFollowMod(elapsed); - if (zoomTarget != null) updateZoomFollow(elapsed); + if (target != null) updateFollow(); + updateLerp(elapsed); updateScroll(); updateFlash(elapsed); @@ -99,74 +98,23 @@ class FunkinCamera extends FlxCamera { filters.remove(cast filter); } } - - public function updateFollowMod(elapsed:Float):Void { - // Either follow the object closely, - // or double check our deadzone and update accordingly. - if (deadzone == null) { - target.getMidpoint(_point); - _point.addPoint(targetOffset); - _scrollTarget.set(_point.x - width * 0.5, _point.y - height * 0.5); - } else { - var edge:Float; - var targetX:Float = target.x + targetOffset.x; - var targetY:Float = target.y + targetOffset.y; - - if (style == SCREEN_BY_SCREEN) { - if (targetX >= viewRight) - _scrollTarget.x += viewWidth; - else if (targetX + target.width < viewLeft) - _scrollTarget.x -= viewWidth; - - if (targetY >= viewBottom) - _scrollTarget.y += viewHeight; - else if (targetY + target.height < viewTop) - _scrollTarget.y -= viewHeight; - - // without this we see weird behavior when switching to SCREEN_BY_SCREEN at arbitrary scroll positions - bindScrollPos(_scrollTarget); - } else { - edge = targetX - deadzone.x; - if (_scrollTarget.x > edge) - _scrollTarget.x = edge; - edge = targetX + target.width - deadzone.x - deadzone.width; - if (_scrollTarget.x < edge) - _scrollTarget.x = edge; - - edge = targetY - deadzone.y; - if (_scrollTarget.y > edge) - _scrollTarget.y = edge; - edge = targetY + target.height - deadzone.y - deadzone.height; - if (_scrollTarget.y < edge) - _scrollTarget.y = edge; - } - - if (target is FlxSprite) { - if (_lastTargetPosition == null) - _lastTargetPosition = FlxPoint.get(target.x, target.y); // Creates this point. - - _scrollTarget.x += (target.x - _lastTargetPosition.x) * followLead.x; - _scrollTarget.y += (target.y - _lastTargetPosition.y) * followLead.y; - - _lastTargetPosition.x = target.x; - _lastTargetPosition.y = target.y; + + public override function updateLerp(elapsed:Float):Void { + if (target != null && !pauseFollowLerp) { + if (followLerp < 0) { + scroll.copyFrom(_scrollTarget); // no easing + } else if (followLerp > 0) { + scroll.x = Util.smoothLerp(scroll.x, _scrollTarget.x, followLerp * elapsed); + scroll.y = Util.smoothLerp(scroll.y, _scrollTarget.y, followLerp * elapsed); } } - - if (pauseFollowLerp) return; - if (followLerp < 0) { - scroll.copyFrom(_scrollTarget); // no easing - } else if (followLerp > 0) { - scroll.x = Util.smoothLerp(scroll.x, _scrollTarget.x, followLerp * elapsed); - scroll.y = Util.smoothLerp(scroll.y, _scrollTarget.y, followLerp * elapsed); - } - } - public function updateZoomFollow(elapsed:Float) { - if (pauseZoomLerp) return; - if (zoomFollowLerp < 0) { - zoom = zoomTarget + zoomOffset; - } else if (zoomFollowLerp > 0) { - zoom = Util.smoothLerp(zoom, zoomTarget + zoomOffset, zoomFollowLerp * elapsed); + + if (zoomTarget != null && !pauseZoomLerp) { + if (zoomFollowLerp < 0) { + zoom = zoomTarget + zoomOffset; + } else if (zoomFollowLerp > 0) { + zoom = Util.smoothLerp(zoom, zoomTarget + zoomOffset, zoomFollowLerp * elapsed); + } } } diff --git a/source/funkin/backend/FunkinState.hx b/source/funkin/backend/FunkinState.hx index 065d1fa..af86392 100644 --- a/source/funkin/backend/FunkinState.hx +++ b/source/funkin/backend/FunkinState.hx @@ -175,8 +175,13 @@ class FunkinState extends FlxSubState implements funkin.backend.FunkinSprite.ISp var limit:Int = 50; //avoid lags while (events.length > 0 && time >= events[0].msTime && limit > 0) { var event:ITimedEvent = events.shift(); - if (event.func != null) - event.func(event); + if (event.func != null) { + try { + event.func(event); + } catch (e:haxe.Exception) { + Log.error('error when triggering event -> ${e.details()}'); + } + } limit --; } } diff --git a/source/funkin/backend/Paths.hx b/source/funkin/backend/Paths.hx index 2732f0a..cce3104 100644 --- a/source/funkin/backend/Paths.hx +++ b/source/funkin/backend/Paths.hx @@ -1,13 +1,14 @@ package funkin.backend; -import flixel.util.FlxDestroyUtil.IFlxDestroyable; import openfl.utils.Assets as OFLAssets; import lime.utils.Assets as LimeAssets; import flxanimate.data.AnimationData; +import flixel.util.FlxDestroyUtil; import flixel.graphics.FlxGraphic; import openfl.display.BitmapData; import flixel.graphics.frames.*; import flixel.system.FlxAssets; +import funkin.util.MemoryUtil; import openfl.utils.AssetType; import openfl.media.Sound; import openfl.Assets; @@ -52,16 +53,12 @@ class Paths { } for (key => dyn in dynamicCache) { if (!trackedAssets.contains(key) && !excludeKeys.contains(key)) { - if (dyn != null) { - if (Std.isOfType(dyn, IFlxDestroyable)) - try dyn.destroy(); - dyn = null; - } + if (dyn is IFlxDestroyable) FlxDestroyUtil.destroy(dyn); dynamicCache.remove(key); } } FlxG.bitmap.clearUnused(); - runGC(); + MemoryUtil.collect(); } inline public static function excludedGraphicKeys():Array { var exclusions:Array = excludeKeys.copy(); @@ -69,11 +66,10 @@ class Paths { for (spr in excludeSprites) exclusions.push(spr.graphic.key); return exclusions; } + + @:deprecated('Paths.runGC is deprecated, use MemoryUtil.collect instead!') public static function runGC() { - openfl.system.System.gc(); - #if hl - hl.Gc.major(); - #end + MemoryUtil.collect(); } public static function getPath(key:String, allowMods:Bool = true, ?library:String) { diff --git a/source/funkin/backend/play/Chart.hx b/source/funkin/backend/play/Chart.hx index 78bbf16..36c6586 100644 --- a/source/funkin/backend/play/Chart.hx +++ b/source/funkin/backend/play/Chart.hx @@ -642,7 +642,7 @@ enum abstract ChartFormat(String) to String { public var name:String; public var msTime:Float = 0; public var params:Map; - public var func:ChartEvent -> Void = genericFunction; + public var func:#if hl Dynamic #else ChartEvent #end -> Void = genericFunction; public static function genericFunction(e:ChartEvent) { var chartEvent:ChartEvent = cast e; diff --git a/source/funkin/backend/rhythm/Event.hx b/source/funkin/backend/rhythm/Event.hx index 757d079..c357b15 100644 --- a/source/funkin/backend/rhythm/Event.hx +++ b/source/funkin/backend/rhythm/Event.hx @@ -4,14 +4,14 @@ interface ITimeSortable { public var msTime:Float; } interface ITimedEvent extends ITimeSortable { - public var func:T -> Void; + public var func:#if hl Dynamic #else T #end -> Void; } class Event implements ITimedEvent { public var msTime:Float; - public var func:Event -> Void; + public var func:#if hl Dynamic #else Event #end -> Void; - public function new(msTime:Float, ?func:Event -> Void) { + public function new(msTime:Float, ?func:#if hl Dynamic #else Event #end -> Void) { this.msTime = msTime; this.func = func; } diff --git a/source/funkin/backend/scripting/ModInterp.hx b/source/funkin/backend/scripting/ModInterp.hx index aa8257b..aa29fb7 100644 --- a/source/funkin/backend/scripting/ModInterp.hx +++ b/source/funkin/backend/scripting/ModInterp.hx @@ -7,6 +7,12 @@ import crowplexus.hscript.Interp; import funkin.backend.FunkinSprite; +enum Exit { // all of this because Stop IS PRIVATW AHHHHHHHHH + Continue; + Return; + Break; +} + class ModInterp extends Interp { public var hscript:HScript; @@ -169,6 +175,13 @@ class ModInterp extends Interp { switch (eDef) { case EImport(v, as): return doImport(v, as); + case EBreak: + throw Break; + case EContinue: + throw Continue; + case EReturn(e): + returnValue = (e == null ? null : expr(e)); + throw Return; case EFunction(params, fexpr, name, _): var capturedLocals = duplicate(locals); var minParams:Int = 0; @@ -249,4 +262,91 @@ class ModInterp extends Interp { } return super.expr(e); } + override function exprReturn(e): Dynamic { + try { + return expr(e); + } catch (e:Exit) { + switch (e) { + case Break: + throw "Invalid break"; + case Continue: + throw "Invalid continue"; + case Return: + var v = returnValue; + returnValue = null; + return v; + } + } + return null; + } + + override function doWhileLoop(eCond, e) { + var old: Int = declared.length; + do { + try { + expr(e); + } catch (err:Exit) { + switch (err) { + case Continue: + case Break: break; + case Return: throw err; + } + } + } while (expr(eCond) == true); + restore(old); + } + override function whileLoop(eCond, e) { + var old: Int = declared.length; + while (expr(eCond) == true) { + try { + expr(e); + } catch (err:Exit) { + switch (err) { + case Continue: + case Break: break; + case Return: throw err; + } + } + } + restore(old); + } + override function forLoop(n, v, itExpr, e): Void { + var old: Int = declared.length; + declared.push({n: n, old: locals.get(n)}); + var keyValue: Bool = false; + if (v != null) { + keyValue = true; + declared.push({n: v, old: locals.get(v)}); + } + var it: Dynamic = (keyValue ? makeKVIterator : makeIterator)(expr(itExpr)); + var _itHasNext: Dynamic = it.hasNext; + var _itNext: Dynamic = it.next; + + while (_itHasNext()) { + if (keyValue) { + var next = _itNext(); + if (next.key == null || next.value == null) { + var nulled: String = (next.key == null ? 'key' : 'value'); + error(ECustom('${Std.isOfType(next, Int) ? 'Int' : Type.getClassName(Type.getClass(next))} has no field $nulled')); + } + locals.set(n, {r: next.key, const: false}); + locals.set(v, {r: next.value, const: false}); + } else { + locals.set(n, {r: _itNext(), const: false}); + } + + try { + expr(e); + } catch (err:Exit) { + switch (err) { + case Continue: + case Break: + break; + case Return: + throw err; + } + } + } + restore(old); + } } \ No newline at end of file diff --git a/source/funkin/debug/DebugDisplay.hx b/source/funkin/debug/DebugDisplay.hx index 4724eb5..52f62a6 100644 --- a/source/funkin/debug/DebugDisplay.hx +++ b/source/funkin/debug/DebugDisplay.hx @@ -6,6 +6,8 @@ import openfl.display.Bitmap; import openfl.text.TextField; import openfl.text.TextFormat; +import funkin.util.MemoryUtil; + class DebugDisplay extends Sprite { public var perfCounter:PerfCounter; public var watermark:X3Watermark; @@ -107,11 +109,11 @@ class PerfCounter extends TextField { while (times[0] < currentTime - 1000) times.shift(); currentFPS = Math.round((oldFPS + times.length) / 2); - mem = getMemoryUsed(); + mem = MemoryUtil.getMemoryUsed(); if (oldFPS != currentFPS || oldMem != mem) { maxMem = Math.max(mem, maxMem); - text = (showFPS ? 'FPS: ${Math.min(currentFPS, FlxG.drawFramerate)}' : '') + (showMem ? '\nGC MEM: ${formatBytes(mem)} / ${formatBytes(maxMem)}' : ''); + text = (showFPS ? 'FPS: ${Math.min(currentFPS, FlxG.drawFramerate)}' : '') + (showMem ? '\nMEM: ${formatBytes(mem)} / ${formatBytes(maxMem)}' : ''); } } @@ -123,12 +125,4 @@ class PerfCounter extends TextField { } return FlxMath.roundDecimal(bytes, precision) + byteUnits[curUnit]; } - - public static function getMemoryUsed():#if cpp Float #else Int #end { - #if cpp - return cpp.vm.Gc.memInfo64(cpp.vm.Gc.MEM_INFO_CURRENT); - #else - return openfl.system.System.totalMemory; - #end - } } \ No newline at end of file diff --git a/source/funkin/util/MemoryUtil.hx b/source/funkin/util/MemoryUtil.hx new file mode 100644 index 0000000..22e024b --- /dev/null +++ b/source/funkin/util/MemoryUtil.hx @@ -0,0 +1,40 @@ +package funkin.util; + +#if hl import hl.Gc; +#elseif cpp import cpp.vm.Gc; +#elseif neko import neko.vm.Gc; #end + +class MemoryUtil { + public static function getMemoryUsed():#if cpp Float #else Int #end { + #if cpp + return Gc.memInfo64(Gc.MEM_INFO_CURRENT); + #else + return openfl.system.System.totalMemory; + #else + Log.warning('GC not implemented on this platform'); + #end + } + + public static function enable(yea:Bool = true):Void { + #if (cpp || hl) + Gc.enable(yea); + #else + Log.warning('GC not implemented on this platform'); + #end + } + + public static function collect(major:Bool = true):Void { + openfl.system.System.gc(); + #if (cpp || neko) + Gc.run(major); + #elseif hl + if (major) Gc.major(); + #end + } + + public static function compact():Void { + #if cpp + Gc.compact(); + #end + } +} \ No newline at end of file diff --git a/source/funkin/util/Util.hx b/source/funkin/util/Util.hx index a647ba3..6cd1ceb 100644 --- a/source/funkin/util/Util.hx +++ b/source/funkin/util/Util.hx @@ -53,9 +53,17 @@ class Util { // maybe these utils can be on their own specific purpose classes if (min != null && n < min) return min; return (max != null && n > max ? max : n); } - public static function smoothLerp(a:Float, b:Float, t:Float):Float { + public static inline function smoothLerp(a:Float, b:Float, t:Float):Float { return FlxMath.lerp(a, b, 1 - Math.exp(-t)); } + public static inline function euclideanMod(n:Float, div:Float):Float { + var mod:Float = n % div; + return (mod < 0 ? mod + Math.abs(div) : mod); + } + public static function eucMod(n:Float, div:Float):Float { return euclideanMod(n, div); } + public static inline function wrap(n:Float, min:Float, max:Float):Float { + return euclideanMod(n - min, max - min) + min; + } // idfk public static function sortZIndex(order:Int, a:FlxBasic, b:FlxBasic):Int { From 4cc687066d8252e8ea835cf666bc8b844575d012 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 11 May 2025 21:16:04 -0600 Subject: [PATCH 34/73] Strumline.scaleTo and fix --- source/funkin/objects/Alphabet.hx | 6 +++++ source/funkin/objects/play/Strumline.hx | 32 +++++++++++++------------ 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/source/funkin/objects/Alphabet.hx b/source/funkin/objects/Alphabet.hx index 9384c48..1135dcc 100644 --- a/source/funkin/objects/Alphabet.hx +++ b/source/funkin/objects/Alphabet.hx @@ -35,6 +35,12 @@ class Alphabet extends FlxSpriteGroup { } } + public override function revive():Void { + super.revive(); + for (i => character in characters) + if (i >= text.length) character.kill(); + } + public function setColors(white:FlxColor = FlxColor.WHITE, black:FlxColor = FlxColor.BLACK):Alphabet { for (character in characters) character.setColors(white, black); diff --git a/source/funkin/objects/play/Strumline.hx b/source/funkin/objects/play/Strumline.hx index 2bd70c2..dc6be5a 100644 --- a/source/funkin/objects/play/Strumline.hx +++ b/source/funkin/objects/play/Strumline.hx @@ -214,22 +214,24 @@ class Strumline extends FunkinSpriteGroup { var wRatio:Float = (targetWidth > 0 ? targetWidth / width : 1); var hRatio:Float = (targetHeight > 0 ? targetHeight / height : 1); var ratio:Float = Math.min(wRatio, hRatio); - if (ratio != 1) { - switch (center) { - case X: - x += (width - width * ratio) * .5; - case Y: - y += (height - height * ratio) * .5; - case XY: - x += (width - width * ratio) * .5; - y += (height - height * ratio) * .5; - default: - //shrug - } - // TODO: better way... ?? - recalculateLaneSpacing(laneSpacing * ratio, laneSpacing); - scale.set(ratio, ratio); + if (ratio != 1) + scaleTo(scale.x * ratio); + } + public function scaleTo(x:Float, ?y:Float, center:FlxAxes = NONE) { + y ??= x; + switch (center) { + case X: + x += (width - width * x) * .5; + case Y: + y += (height - height * x) * .5; + case XY: + x += (width - width * y) * .5; + y += (height - height * y) * .5; + default: } + + recalculateLaneSpacing(laneSpacing / scale.x * x, laneSpacing); + scale.set(x, y); } public function center(axes:FlxAxes = XY) { //do Not inline that. switch (axes) { From 2e0e1d9e928100c1e55f49e6603389c6a35640e5 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Mon, 12 May 2025 00:21:02 -0600 Subject: [PATCH 35/73] copy tempo changes in playstate conductor --- source/funkin/backend/rhythm/Conductor.hx | 7 +++++-- source/funkin/backend/rhythm/Metronome.hx | 10 +++++++++- source/funkin/states/PlayState.hx | 4 ++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/source/funkin/backend/rhythm/Conductor.hx b/source/funkin/backend/rhythm/Conductor.hx index 5662b69..2f5fa68 100644 --- a/source/funkin/backend/rhythm/Conductor.hx +++ b/source/funkin/backend/rhythm/Conductor.hx @@ -97,11 +97,14 @@ class Conductor { public function set_bar(newBar:Float):Float { return metronome.setBar(newBar); } // public function set_ms(newMS:Float):Float { return metronome.setMS(newMS); } - public function resetToDefault() { + public function resetToDefault():Void { metronome = new Metronome(); } - public function sortTempoChanges() { + public function copyTempoChanges(tempoChanges:Array):Array { + return metronome.copyTempoChanges(tempoChanges); + } + public function sortTempoChanges():Void { metronome.sortTempoChanges(); } } \ No newline at end of file diff --git a/source/funkin/backend/rhythm/Metronome.hx b/source/funkin/backend/rhythm/Metronome.hx index bcdcded..33e1f84 100644 --- a/source/funkin/backend/rhythm/Metronome.hx +++ b/source/funkin/backend/rhythm/Metronome.hx @@ -166,7 +166,15 @@ class Metronome { return target; } - public function sortTempoChanges() { + public function copyTempoChanges(copyChanges:Array):Array { + tempoChanges.resize(0); + for (change in copyChanges) { + var newChange:TempoChange = new TempoChange(change.beatTime, change.bpm, new TimeSignature().copyFrom(change.timeSignature)); + tempoChanges.push(newChange); + } + return tempoChanges; + } + public function sortTempoChanges():Void { tempoChanges.sort((a:TempoChange, b:TempoChange) -> Std.int(a.beatTime) - Std.int(b.beatTime)); } } diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 5d1706b..08f128d 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -149,7 +149,7 @@ class PlayState extends FunkinState { ghostTapping = Options.data.ghostTapping; conductorInUse = new Conductor(); - conductorInUse.tempoChanges = chart.tempoChanges; + conductorInUse.copyTempoChanges(chart.tempoChanges); barHit.add((t:Int) -> dispatchSongEvent({type: BAR_HIT, time: t})); beatHit.add((t:Int) -> dispatchSongEvent({type: BEAT_HIT, time: t})); stepHit.add((t:Int) -> dispatchSongEvent({type: STEP_HIT, time: t})); @@ -843,8 +843,8 @@ class PlayState extends FunkinState { if (!ratingGroup.alive) return rating; rating.alpha = 1; - rating.cameras = null; rating.visible = true; + rating.cameras = ratingGroup.cameras; rating.loadTexture(ratingString); rating.scale.set(scale, scale); rating.setPosition(ratingGroup.x, ratingGroup.y); From c61b71c2f1df577ffa66cdfe046f46f1f098da41 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 24 May 2025 11:51:45 -0600 Subject: [PATCH 36/73] Update FunkinSprite.hx preload anim asset on playAnimation --- source/funkin/backend/FunkinSprite.hx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/funkin/backend/FunkinSprite.hx b/source/funkin/backend/FunkinSprite.hx index 4627785..d6369c6 100644 --- a/source/funkin/backend/FunkinSprite.hx +++ b/source/funkin/backend/FunkinSprite.hx @@ -348,6 +348,8 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact animationList[name] = {prefix: prefix, fps: fps, loop: loop, assetPath: assetPath, frameIndices: frameIndices, flipX: flipX, flipY: flipY}; } public function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { + preloadAnimAsset(anim); + var played:Bool = this.anim.play(anim, forced, reversed, frame); if (played) { From aabfc65b42718c0598df29a0a1ca3c4f6df9911f Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 25 May 2025 12:54:31 -0600 Subject: [PATCH 37/73] nb flag also theyre variable now --- source/Main.hx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/Main.hx b/source/Main.hx index 194521e..0d9e103 100644 --- a/source/Main.hx +++ b/source/Main.hx @@ -114,9 +114,10 @@ class Pride { public static var flagsMap:Map> = [ 'transgender' => [brightCyan, brightMagenta, brightWhite, brightMagenta, brightCyan], 'lesbian' => [brightRed, brightYellow, brightWhite, brightMagenta, magenta], - 'pride' => [brightRed, brightYellow, green, brightBlue, magenta], - 'bisexual' => [brightRed, brightRed, magenta, blue, blue], - 'pansexual' => [brightRed, brightRed, brightYellow, brightCyan, brightCyan] + 'pride' => [brightRed, yellow, brightYellow, green, brightBlue, magenta], + 'bisexual' => [brightRed, brightRed, magenta, magenta, blue, blue], + 'pansexual' => [brightRed, brightRed, brightYellow, brightYellow, brightCyan, brightCyan], + 'nonbinary' => [brightYellow, brightWhite, magenta, brightBlack] ]; public static var flags(get, never):Array>; @@ -126,7 +127,8 @@ class Pride { array.push(item); return array; } - public static function getFlagSlices(array:Array, width:Int = 15):Array { + public static function getFlagSlices(array:Array, ?width:Int):Array { + width ??= array.length * 3; var rectangle:String = StringTools.rpad('', ' ', width); var slices:Array = []; for (color in array) From 68e94e80bb90997131dd866fd02a78a368d3b8ac Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 25 May 2025 12:59:35 -0600 Subject: [PATCH 38/73] fix interp no value optional functions haha --- source/funkin/backend/scripting/HScript.hx | 21 ++++++++++---------- source/funkin/backend/scripting/ModInterp.hx | 5 +++-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/source/funkin/backend/scripting/HScript.hx b/source/funkin/backend/scripting/HScript.hx index 4f3cbec..305dad0 100644 --- a/source/funkin/backend/scripting/HScript.hx +++ b/source/funkin/backend/scripting/HScript.hx @@ -4,6 +4,7 @@ package funkin.backend.scripting; import funkin.backend.FunkinRuntimeShader; import funkin.backend.scripting.HScriptClasses; +import haxe.PosInfos; import crowplexus.iris.Iris; import crowplexus.iris.IrisConfig; import crowplexus.iris.ErrorSeverity; @@ -113,8 +114,14 @@ class HScript extends Iris { this.scriptString = code; } - public function errorCaught(e:IrisError, ?extra:String) { - Log.fatal(Printer.errorToString(e)); + function errorCaught(e:Dynamic):Void { + if (Std.isOfType(e, IrisError)) { + var pos:PosInfos = cast {fileName: e.origin, lineNumber: e.line}; + Iris.fatal(Printer.errorToString(e, false), pos); + } else { + var pos:PosInfos = @:privateAccess { cast interp.posInfos(); } + Iris.fatal(Std.string(e), pos); + } } public static function customLog(level:ErrorSeverity, x, ?pos:haxe.PosInfos) { if (pos == null) pos = Iris.getDefaultPos(); @@ -161,14 +168,8 @@ class HScript extends Iris { if (!executed) failed = true; - var irisE:IrisError; - if (Std.isOfType(e, IrisError)) { - irisE = cast e; - } else { - @:privateAccess irisE = new IrisError(ECustom(Std.string(e)), parser.readPos, parser.readPos, parser.origin, parser.line); - } + errorCaught(e); - errorCaught(irisE); return null; } } @@ -205,7 +206,7 @@ class HScript extends Iris { } #if hscriptPos - set("trace", Reflect.makeVarArgs(function(x:Array) { // fix static trace + set('trace', Reflect.makeVarArgs(function(x:Array) { // fix static trace var pos = this.interp != null ? this.interp.posInfos() : Iris.getDefaultPos(this.name); var v = x.shift(); if (x.length > 0) diff --git a/source/funkin/backend/scripting/ModInterp.hx b/source/funkin/backend/scripting/ModInterp.hx index aa29fb7..71463c6 100644 --- a/source/funkin/backend/scripting/ModInterp.hx +++ b/source/funkin/backend/scripting/ModInterp.hx @@ -192,7 +192,7 @@ class ModInterp extends Interp { } var f = function(args: Array) { - if (((args == null) ? 0 : args.length) != params.length) { + if (args?.length ?? 0 != params.length) { if (args.length < minParams) { var str = "Invalid number of parameters. Got " + args.length + ", required " + minParams; if (name != null) @@ -209,7 +209,7 @@ class ModInterp extends Interp { args2.push(args[pos++]); extraParams--; } else { - args2.push(expr(p.value)); + args2.push(p.value == null ? null : expr(p.value)); // GENIUS } } else { args2.push(args[pos++]); @@ -217,6 +217,7 @@ class ModInterp extends Interp { } args = args2; } + var old = me.locals, depth = me.depth; me.depth ++; me.locals = me.duplicate(capturedLocals); From 1d9a15160683bc5db9e6c5e53f5c64c730194739 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 25 May 2025 14:08:05 -0600 Subject: [PATCH 39/73] update strip --- .../graphics/tile/FlxDrawTrianglesItem.hx | 31 ++++++------------- source/funkin/backend/FunkinStrip.hx | 3 +- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/source/flixel/graphics/tile/FlxDrawTrianglesItem.hx b/source/flixel/graphics/tile/FlxDrawTrianglesItem.hx index 10fb476..5ce6653 100644 --- a/source/flixel/graphics/tile/FlxDrawTrianglesItem.hx +++ b/source/flixel/graphics/tile/FlxDrawTrianglesItem.hx @@ -140,11 +140,8 @@ class FlxDrawTrianglesItem extends FlxDrawBaseItem public function addTriangles(vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, ?cameraBounds:FlxRect #if !flash , ?transform:ColorTransform #end, rotation:Float = 0):Void { - if (position == null) - position = point.set(); - - if (cameraBounds == null) - cameraBounds = rect.set(0, 0, FlxG.width, FlxG.height); + position ??= point.set(); + cameraBounds ??= rect.set(0, 0, FlxG.width, FlxG.height); var verticesLength:Int = vertices.length; var prevVerticesLength:Int = this.vertices.length; @@ -153,34 +150,26 @@ class FlxDrawTrianglesItem extends FlxDrawBaseItem var prevUVTDataLength:Int = this.uvtData.length; var prevColorsLength:Int = this.colors.length; var prevNumberOfVertices:Int = this.numVertices; - - var tempX:Float, tempY:Float; + var i:Int = 0; var currentVertexPosition:Int = prevVerticesLength; var vertPoint:FlxPoint = FlxPoint.get(); - while (i < verticesLength) - { + while (i < verticesLength) { vertPoint.set(position.x + vertices[i], position.y + vertices[i + 1]); - if (rotation == 0) { - tempX = vertPoint.x; - tempY = vertPoint.y; - } else { + if (rotation != 0) { var pivot:FlxPoint = cameraBounds.getMidpoint(FlxPoint.weak()); - var rotatedPoint:FlxPoint = vertPoint.pivotDegrees(pivot, rotation); - - tempX = rotatedPoint.x; - tempY = rotatedPoint.y; + vertPoint.pivotDegrees(pivot, rotation); } - this.vertices[currentVertexPosition++] = tempX; - this.vertices[currentVertexPosition++] = tempY; + this.vertices[currentVertexPosition ++] = vertPoint.x; + this.vertices[currentVertexPosition ++] = vertPoint.y; if (i == 0) { - bounds.set(tempX, tempY, 0, 0); + bounds.set(vertPoint.x, vertPoint.y, 0, 0); } else { - inflateBounds(bounds, tempX, tempY); + inflateBounds(bounds, vertPoint.x, vertPoint.y); } i += 2; diff --git a/source/funkin/backend/FunkinStrip.hx b/source/funkin/backend/FunkinStrip.hx index 8c1eb4e..b4bfca9 100644 --- a/source/funkin/backend/FunkinStrip.hx +++ b/source/funkin/backend/FunkinStrip.hx @@ -18,8 +18,7 @@ class FunkinStrip extends FunkinSprite { super.destroy(); } - - // TODO: check this for cases when zoom is less than initial zoom... + override public function draw():Void { if (alpha == 0 || graphic == null || vertices == null) return; From 10f70437c638b3115ff25f2793bf7e8a7c47731d Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 25 May 2025 16:59:08 -0600 Subject: [PATCH 40/73] over overhaul notemodcjhart system and more some fixes and nice stufff --- source/funkin/backend/play/NoteEvent.hx | 2 + source/funkin/macros/FunkinMacro.hx | 43 ++ source/funkin/objects/play/Lane.hx | 18 +- source/funkin/objects/play/Note.hx | 497 +++++++++++++++--------- 4 files changed, 362 insertions(+), 198 deletions(-) diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index 140082c..744cb19 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -230,6 +230,8 @@ using StringTools; applyScore(scoreHandler, scoring, game); case LOST: + note.multAlpha *= .3; + if (inGame && game.genericVocals != null) game.genericVocals.volume = 0; diff --git a/source/funkin/macros/FunkinMacro.hx b/source/funkin/macros/FunkinMacro.hx index 22ebadd..0c70165 100644 --- a/source/funkin/macros/FunkinMacro.hx +++ b/source/funkin/macros/FunkinMacro.hx @@ -32,5 +32,48 @@ class FunkinMacro { return fields; } + + public static macro function buildReset(isOverride:Bool = false):Array { + var pos:Position = Context.currentPos(); + var cls:ClassType = Context.getLocalClass().get(); + var fields:Array = Context.getBuildFields(); + + var resetExpr:Array = []; + var access = [APublic]; + + if (isOverride) { // just genius bro + access.push(AOverride); // theres prob a better way to do this, but cant really figure it out + resetExpr.push(macro { super.resetVars(); }); + } + + for (field in fields) { + if (field.meta == null) continue; + + for (meta in field.meta) { + if (meta.name != 'resetVar') continue; + + Context.info(field.name, pos); + + switch (field.kind) { + case FVar(type, expr): + resetExpr.push(macro { $i{field.name} = $expr; }); + + default: // nothing ... + } + } + } + + fields.push({ + name: 'resetVars', + access: access, + pos: pos, + kind: FFun({ + args: [], + expr: macro $b{resetExpr} + }), + }); + + return fields; + } } #end diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 747a4e6..d4d833a 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -326,13 +326,9 @@ class Lane extends FunkinSpriteGroup { queue.resize(0); } public function updateNote(note:Note) { - note.followLane(this); - - if (note.ignore) - return; - - var killingNote:Bool = false; - if ((cpu || (held && note.goodHit)) && songPosition >= note.msTime && !note.lost && note.canHit) { + if (!note.ignore && (cpu || (held && note.goodHit)) && songPosition >= note.msTime && !note.lost && note.canHit) { + var killingNote:Bool = false; + if (!note.goodHit) _noteEvent(basicEvent(PRESSED, note, cpu ? note.msTime : songPosition)); @@ -352,6 +348,8 @@ class Lane extends FunkinSpriteGroup { } } + note.followLane(this); + var canDespawn:Bool = !note.preventDespawn; if (note.lost || note.goodHit) { if (canDespawn && (note.endMs - songPosition) < -spawnRadius) @@ -359,7 +357,7 @@ class Lane extends FunkinSpriteGroup { } else { if (songPosition - hitWindow > note.msTime) { note.lost = true; - _noteEvent(basicEvent(LOST, note)); + if (!note.ignore) _noteEvent(basicEvent(LOST, note)); } } @@ -384,7 +382,7 @@ class Lane extends FunkinSpriteGroup { note.chartNote = songNote; note.hitWindow = hitWindow; - note.reload(style); + note.reload(style, this); note.scale.set(scale.x * note.defaultScale, scale.y * note.defaultScale); note.updateHitbox(); @@ -399,7 +397,7 @@ class Lane extends FunkinSpriteGroup { var event:NoteEvent = basicEvent(HIT, note, position); _noteEvent(event); - if (kill && !note.isHoldNote && !note.ignore && !event.cancelled) + if (kill && !note.isHoldNote && !event.cancelled) killNote(note); } public function killNote(note:Note, requeue:Bool = false, sort:Bool = true) { diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 9b01b06..a507580 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -59,7 +59,50 @@ using funkin.backend.play.NoteStyle.NoteStyleUtil; function set_msLength(v:Float):Float { return msLength = v; } } -class Note extends FunkinSprite { +@:build(funkin.macros.FunkinMacro.buildReset()) +class NoteObject extends FunkinSprite { + public var lane:Lane; + + @resetVar public var updateModchart:Bool = true; + @resetVar public var followReceptor:Bool = true; + + @resetVar public var defaultAlpha:Float = 1; + @resetVar public var defaultScale:Float = 1; + + @resetVar public var direction:Float = 0; + @resetVar public var distanceOffset:Float = 0; + @resetVar public var scrollDistance:Float = 0; + @resetVar public var scrollMultiplier:Float = 1; + @:deprecated('directionOffset is deprecated, use direction instead!') public var directionOffset(get, set):Float; + + function get_directionOffset():Float { return direction; } + function set_directionOffset(alpha:Float):Float { return direction = alpha; } + + public function followLane(lane:Lane) {} + + // modcharting stuff!! + public var scrollPosition:FlxPoint = FlxPoint.get(); + + @resetVar public var customModchart:(note:NoteObject, lane:Lane, distance:Float) -> Void = null; + @resetVar public var customScrollDistance:(note:NoteObject, lane:Lane, timeDiff:Float) -> Float = null; + + public function genericScrollDistance(note:NoteObject, lane:Lane, timeDiff:Float):Float { + var speed:Float = note.scrollMultiplier; + if (lane != null) speed *= lane.scrollSpeed; + + return Note.msToDistance(timeDiff, speed) + note.distanceOffset; + } + public function genericModchart(note:NoteObject, lane:Lane, distance:Float):Void { + var dir:Float = note.direction; + if (lane != null) dir += lane.direction; + var rad:Float = (dir / 180 * Math.PI); + + note.setPosition(note.scrollPosition.x + FlxMath.fastCos(rad) * distance, note.scrollPosition.y + FlxMath.fastSin(rad) * distance); + } +} + +@:build(funkin.macros.FunkinMacro.buildReset(true)) +class Note extends NoteObject { public static var directionNames:Array = ['left', 'down', 'up', 'right']; public static var directionColors:Array> = [ [FlxColor.fromRGB(194, 75, 153), FlxColor.WHITE, FlxColor.fromRGB(60, 31, 86)], @@ -78,43 +121,37 @@ class Note extends FunkinSprite { public var rgbEnabled(default, set):Bool; public var tailOffset(default, null):FlxPoint; - public var lane:Lane; public var chartNote(default, set):ChartNote; + public var strumlineIndex:Int = 0; + public var laneIndex:Int = 0; + + @resetVar public var preventDespawn:Bool = false; + @resetVar public var consumed:Bool = false; + @resetVar public var goodHit:Bool = false; + @resetVar public var lost:Bool = false; + @resetVar public var canHit:Bool = true; + + @resetVar public var followVisible:Bool = true; + @resetVar public var followAlpha:Bool = true; + @resetVar public var followAngle:Bool = true; + @resetVar public var followScale:Bool = true; + + @resetVar public var score:Score = null; + @resetVar public var held:Bool = false; + @resetVar public var hitTime:Float = -1; + @resetVar public var holdTime:Float = -1; - public var preventDespawn:Bool = false; - public var consumed:Bool = false; - public var goodHit:Bool = false; - public var lost:Bool = false; - public var canHit:Bool = true; - - public var followVisible:Bool = true; - public var followAlpha:Bool = true; - public var followAngle:Bool = true; - - public var score:Score; - public var held:Bool = false; - public var hitTime:Float = -1; - public var holdTime:Float = -1; - public var defaultAlpha:Float = 1; - public var defaultScale:Float = 1; - public var clipDistance:Float = 0; - public var scrollDistance:Float = 0; - - public var healthLoss:Float = 6.0 / 100; - public var healthGain:Float = 1.5 / 100; - public var healthGainPerSecond:Float = 7.5 / 100; // hold bonus - public var hitWindow:Float = Scoring.safeFrames * 1000 / 60; - - public var scrollMultiplier:Float = 1; - public var directionOffset:Float = 0; - public var hitPriority:Float = 1; - public var multAlpha:Float = 1; - public var ignore:Bool = false; + @resetVar public var healthLoss:Float = 6.0 / 100; + @resetVar public var healthGain:Float = 1.5 / 100; + @resetVar public var healthGainPerSecond:Float = 7.5 / 100; // hold bonus + @resetVar public var hitWindow:Float = Scoring.safeFrames * 1000 / 60; + + @resetVar public var hitPriority:Float = 1; + @resetVar public var multAlpha:Float = 1; + @resetVar public var ignore:Bool = false; public var isHoldTail(default, null):Bool = false; - public var laneIndex:Int = 0; - public var strumlineIndex:Int = 0; public var style(default, set):NoteStyle; public var kind(default, set):String = ''; @:deprecated('noteKind is deprecated, use kind instead!') public var noteKind(get, set):String; @@ -129,20 +166,16 @@ class Note extends FunkinSprite { public var beatLength(default, set):Float = 0; public var isHoldNote(default, null):Bool = false; - public var getScrollDistance:(note:Note, lane:Lane, distance:Float) -> Float = null; - public var getScrollPosition:(note:Note, lane:Lane, distance:Float, ?point:FlxPoint) -> FlxPoint = null; - function get_noteData():Int { return laneIndex; } function set_noteData(value:Int):Int { return laneIndex = value; } function get_player():Bool { return (strumlineIndex == 0); } function set_noteKind(newKind:String):String { return kind = newKind; } function get_noteKind():String { return kind; } - var _scrollPoint:FlxPoint = FlxPoint.get(); + var renderingTail:Bool = false; var forceDraw:Bool = false; public override function destroy():Void { - _scrollPoint.put(); tailOffset.put(); tail?.destroy(); tail = null; @@ -206,21 +239,24 @@ class Note extends FunkinSprite { chartNote.strumlineIndex = strumlineIndex; } - public function reload(?style:NoteStyle):Void { - clipDistance = 0; - healthLoss = 6.0 / 100; - healthGain = 1.5 / 100; - healthGainPerSecond = 7.5 / 100; - lost = goodHit = held = consumed = preventDespawn = ignore = false; - followAngle = canHit = visible = true; - holdTime = hitTime = -1; + public function reload(?style:NoteStyle, ?lane:Lane):Void { + resetVars(); + spriteOffset.set(); tailOffset.set(); - multAlpha = 1; blend = NORMAL; this.style = style; - tail?.reload(style); + + if (tail != null) { + tail.reload(style); + + var tailScaleMult:Float = tail.defaultScale / tail.defaultScale; + tail.scale.set(scale.x * tailScaleMult, scale.y * tailScaleMult); + + if (lane != null) + tail.renderDistance = Note.msToDistance(lane.spawnRadius, lane.scrollSpeed); + } } public function updateTail():Void { isHoldNote = (msLength > 0); @@ -302,52 +338,54 @@ class Note extends FunkinSprite { return distance / (.45 * scrollSpeed); public static function msToDistance(ms:Float, scrollSpeed:Float) return ms * (.45 * scrollSpeed); - public function followLane(lane:Lane) { + public override function followLane(lane:Lane) { var timeDiff:Float = msTime - conductorInUse.songPosition; - var receptor:Receptor = lane.receptor; + var receptor:Receptor = lane?.receptor; + + copyReceptor(receptor); - var scrollDistance:Float; - var scrollPosition:FlxPoint; try { - scrollDistance = (getScrollDistance ?? getScrollDistanceGeneric)(this, lane, timeDiff); - scrollPosition = (getScrollPosition ?? getScrollPositionGeneric)(this, lane, scrollDistance); + scrollDistance = (customScrollDistance ?? genericScrollDistance)(this, lane, timeDiff); + if (updateModchart) + (customModchart ?? genericModchart)(this, lane, scrollDistance); } catch (e:haxe.Exception) { - Log.error('error while setting scroll distance or position -> ${e.details()}'); - scrollDistance = getScrollDistanceGeneric(this, lane, timeDiff); - scrollPosition = getScrollPositionGeneric(this, lane, scrollDistance); + Log.error('error on note modchart function -> ${e.details()}'); + + customModchart = null; + customScrollDistance = null; + + scrollDistance = genericScrollDistance(this, lane, timeDiff); + if (updateModchart) + genericModchart(this, lane, scrollDistance); } - x = receptor.x + (receptor.width - width) * .5 + scrollPosition.x; - y = receptor.y + (receptor.height - height) * .5 + scrollPosition.y; - - if (followAlpha) - alpha = receptor.alpha * multAlpha * defaultAlpha; - if (followVisible) - visible = receptor.visible; - if (followAngle) - angle = lane.receptor.angle; - if (isHoldNote && tail != null) { - var tailScale:Float = (scale.x / defaultScale * tail.defaultScale); - - tail.setPosition(receptor.x + receptor.width * .5, receptor.y + receptor.height * .5); - tail.scale.set(tailScale, tailScale); tail.goodHit = goodHit; tail.followLane(lane); tail.updateHitbox(); } } - - public static function getScrollDistanceGeneric(note:Note, lane:Lane, timeDiff:Float):Float { - return msToDistance(timeDiff, lane.scrollSpeed * note.scrollMultiplier); - } - public static function getScrollPositionGeneric(note:Note, lane:Lane, distance:Float, ?point:FlxPoint):FlxPoint { - point ??= note._scrollPoint; + public function copyReceptor(receptor:Receptor) { + if (receptor == null) return; - var dir:Float = lane.direction + note.directionOffset; - var rad:Float = (dir / 180 * Math.PI); + if (followScale) { // maybe this is too many variables ... + copyReceptorScale(receptor); + updateHitbox(); + } + if (followReceptor) + scrollPosition.set(receptor.x + (receptor.width - width) * .5, receptor.y + (receptor.height - height) * .5); + if (followAlpha) + alpha = receptor.alpha * multAlpha * defaultAlpha; + if (followVisible) + visible = receptor.visible; + if (followAngle) + angle = receptor.angle; + } + public function copyReceptorScale(receptor:Receptor) { + if (receptor == null) return; - return point.set(FlxMath.fastCos(rad) * distance, FlxMath.fastSin(rad) * distance); + var scaleMult:Float = defaultScale / receptor.defaultScale; + scale.set(receptor.scale.x * scaleMult, receptor.scale.y * scaleMult); } public override function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { @@ -376,6 +414,7 @@ class NoteTail extends Note { public var parent(default, set):Note; public var followParent:Bool = true; + public var renderDistance:Null = null; public var renderTriangles:Bool = true; // TODO public var clipToDistance:Null = null; @@ -387,9 +426,10 @@ class NoteTail extends Note { var holdStrip:NoteTailStrip; var tailStrip:NoteTailStrip; - var _tailScrollPoint:FlxPoint = FlxPoint.get(); var drawData:Array = []; + var minBodyHeight:Float = 35; var drawItems:Int = 0; + var zebra:Bool = false; // debug public function new(parent:Note) { super(parent?.chartNote); @@ -413,7 +453,6 @@ class NoteTail extends Note { holdScale.put(); tailScale.put(); - _tailScrollPoint.put(); drawData = null; drawItems = 0; @@ -435,8 +474,8 @@ class NoteTail extends Note { holdStrip?.reloadTail(this); tailStrip?.reloadTail(this); } - public override function reload(?style:NoteStyle):Void { - super.reload(style); + public override function reload(?style:NoteStyle, ?lane:Lane):Void { + super.reload(style, lane); clipToDistance = null; } @@ -448,16 +487,26 @@ class NoteTail extends Note { } public override function draw():Void { alpha = multAlpha * defaultAlpha; + if (parent != null) { scrollFactor.copyFrom(parent.scrollFactor); - initialZoom = parent.initialZoom; - zoomFactor = parent.zoomFactor; shader = parent.shader; alpha *= parent.alpha; color = parent.color; } + holdStrip?.copyNote(this); + tailStrip?.copyNote(this); - super.draw(); + for (camera in getCamerasLegacy()) { + if (!camera.visible || !camera.exists) + continue; + + drawComplex(camera); + + #if FLX_DEBUG + FlxBasic.visibleCount++; + #end + } } public override function loadStyle(newStyle:NoteStyleAsset) { @@ -475,95 +524,134 @@ class NoteTail extends Note { } public override function followLane(lane:Lane):Void { - if (!renderTriangles) return; // TODO: basic renderer + var receptor:Receptor = lane.receptor; - var distFunc = getScrollDistance ?? parent.getScrollDistance ?? Note.getScrollDistanceGeneric; - var posFunc = getScrollPosition ?? parent.getScrollPosition ?? Note.getScrollPositionGeneric; + copyNote(parent); + copyReceptor(receptor); + + if (renderTriangles) { + updateTriangles(lane); + } else { + // TODO: basic tile renderer (again)? + } + } + public function copyNote(note:Note) { + if (followParent && parent != null) { + direction = parent.direction; + followAlpha = parent.followAlpha; + followVisible = parent.followVisible; + scrollMultiplier = parent.scrollMultiplier; + + scale.copyFrom(parent.scale); + } + } + public override function copyReceptor(receptor:Receptor) { + if (receptor == null) return; + + if (followScale) { + copyReceptorScale(receptor); + updateHitbox(); + } + if (followReceptor) + scrollPosition.set(receptor.x + receptor.width * .5, receptor.y + receptor.height * .5); + if (followAlpha) + alpha = receptor.alpha * parent.multAlpha * multAlpha * defaultAlpha; + if (followVisible) + visible = (parent.visible && receptor.visible); + if (followAngle) + angle = direction + parent.direction + receptor.lane?.direction ?? 0 + 90; + } + public function updateTriangles(lane:Lane):Void { + var render:NoteTailStrip = tailStrip; + renderingTail = true; + + var distFunc = (customScrollDistance ?? parent.customScrollDistance ?? genericScrollDistance); + var modchartFunc = (customModchart ?? parent.customModchart ?? genericModchart); var timeDiff:Float = endMs - conductorInUse.songPosition; + var receptor:Receptor = lane.receptor; - var scrollDistance:Float; - var scrollPosition:FlxPoint; - var scrollNextPosition:FlxPoint; + var scrollDistance:Float = 0; try { scrollDistance = distFunc(this, lane, timeDiff); - scrollPosition = posFunc(this, lane, scrollDistance); + if (updateModchart) + modchartFunc(this, lane, scrollDistance); } catch (e:haxe.Exception) { - Log.error('error while setting scroll distance or position -> ${e.details()}'); - posFunc = Note.getScrollPositionGeneric; - distFunc = Note.getScrollDistanceGeneric; - scrollDistance = distFunc(this, lane, timeDiff); - scrollPosition = posFunc(this, lane, scrollDistance); - } - - if (followParent) { - if (goodHit) clipToDistance = distFunc(this, lane, 0); + Log.error('error on note modchart function -> ${e.details()}'); - if (parent != null) { - directionOffset = parent.directionOffset; - scrollMultiplier = parent.scrollMultiplier; - } + customModchart = null; + customScrollDistance = null; + modchartFunc = genericModchart; + distFunc = genericScrollDistance; + + scrollDistance = genericScrollDistance(this, lane, timeDiff); + if (updateModchart) + genericModchart(this, lane, timeDiff); } + if (goodHit) clipToDistance = distFunc(this, lane, 0); + var clipDistance:Float = distFunc(this, lane, msTime - conductorInUse.songPosition); if (clipToDistance != null) clipDistance = Math.max(clipDistance, clipToDistance); - function prepareRender(strip:NoteTailStrip):NoteTailStrip { - strip.scale.copyFrom(scale); - strip.shader = shader; - return strip; - } - drawItems = 0; - prepareRender(tailStrip); - prepareRender(holdStrip); - var render:NoteTailStrip = tailStrip; - var nextAngle:Float = (lane.direction + parent.directionOffset); - var scrollAngle:Null = (adaptiveDirection ? null : nextAngle); + var rad:Float = (Math.PI / 180); + var prevAngle:Float = angle * rad; + var scaleY:Float = (lane?.scale.y ?? scale.y); + while (scrollDistance > clipDistance) { - var height:Float = render.frameHeight * render.scale.y; - if (height < 5) break; - - scrollDistance -= height; - scrollNextPosition = posFunc(this, lane, scrollDistance, _tailScrollPoint); - if (adaptiveDirection) nextAngle = (scrollPosition.degreesTo(scrollNextPosition) * Math.PI / 180); + var absSY:Float = Math.abs(scale.y); + var height:Float = render.frameHeight * Math.max(absSY, renderingTail ? absSY : scaleY); // thats crazy bro + if (!renderingTail && height < minBodyHeight) height = minBodyHeight; + var prevScale:FlxPoint = FlxPoint.weak(scale.x, scale.y); + var prevPosition:FlxPoint = FlxPoint.weak(x, y); - var data:NoteTailDrawData = (drawData[drawItems] ?? new NoteTailDrawData()); - - data.clip = (scrollDistance <= clipDistance ? Math.abs(scrollDistance - clipDistance) / height : 0); - data.copyPosition(scrollPosition, scrollNextPosition); - data.setAngle(scrollAngle ?? nextAngle, nextAngle); + scrollDistance -= height; + modchartFunc(this, lane, scrollDistance); - drawData[drawItems ++] = data; + var curPosition:FlxPoint = FlxPoint.weak(x, y); + if (renderDistance == null || scrollDistance < renderDistance) { + if (adaptiveDirection) angle = (prevPosition.degreesTo(curPosition) + 180); + var radAngle:Float = angle * rad; + + + var data:NoteTailDrawData = (drawData[drawItems] ?? new NoteTailDrawData()); + + data.clip = (scrollDistance <= clipDistance ? Math.abs(scrollDistance - clipDistance) / height : 0); + data.copyPosition(prevPosition, curPosition); + data.setScale(prevScale.x, scale.x); + data.setAngle(prevAngle, radAngle); + data.strip = render; + + drawData[drawItems ++] = data; + + + prevAngle = radAngle; + } - if (adaptiveDirection) scrollAngle = nextAngle; - scrollPosition.copyFrom(scrollNextPosition); + renderingTail = false; render = holdStrip; } } - public override function drawComplex(camera:FlxCamera) { + public override function drawComplex(camera:FlxCamera):Void { updateShader(camera); if (renderTriangles) { - var render:NoteTailStrip = tailStrip; for (i in 0 ... drawItems) { var data:NoteTailDrawData = drawData[i]; - if (data == null || render == null) break; + var strip:NoteTailStrip = data?.strip; + if (strip == null) break; - render.updateRender(x, y, data); - render.draw(); - - render = holdStrip; + if (zebra) + strip.color = (i % 2 == 0 ? FlxColor.GRAY : FlxColor.WHITE); + strip.updateRender(data); + strip.draw(); } } } - - public override function isSimpleRender(?camera:FlxCamera):Bool { - return false; // lazy zzz - } } class NoteTailStrip extends FunkinStrip { @@ -571,6 +659,11 @@ class NoteTailStrip extends FunkinStrip { public var style(default, set):NoteStyle; public var parentTail(default, set):NoteTail; + public var fast(default, set):Bool; + var sinFunc:Float -> Float; + var cosFunc:Float -> Float; + var topUV:Float; + public var laneIndex:Int; public function new(parent:NoteTail, defaultAnim:String = 'hold') { @@ -578,63 +671,82 @@ class NoteTailStrip extends FunkinStrip { this.defaultAnim = defaultAnim; this.parentTail = parent; + this.fast = true; indices = new DrawData(6, true, [0, 1, 2, 1, 2, 3]); uvtData = new DrawData(8, true, [0, 0, 0, 0, 0, 0, 0, 0]); vertices = new DrawData(8, true, [0, 0, 0, 0, 0, 0, 0, 0]); } - public function updateRender(x:Float, y:Float, drawData:NoteTailDrawData):Void { - if (graphic == null) - return; + override function set_frame(newFrame:FlxFrame):FlxFrame { + super.set_frame(newFrame); - final clip:Float = drawData.clip; - final angleTo:Float = drawData.angleTo; - final angleFrom:Float = drawData.angleFrom; + if (dirty) + prepareRender(); - setPosition(x + drawData.xFrom, y + drawData.yFrom); - var nextXOffset:Float = drawData.xTo - drawData.xFrom; - var nextYOffset:Float = drawData.yTo - drawData.yFrom; + return newFrame; + } + public function prepareRender():Void { // we don't need to update those every call... + if (graphic == null || frame == null) + return; - final w:Float = graphic.width; - final h:Float = graphic.height; - final crop:Float = (antialiasing ? .5 : 0); // get rid of transparent blurry edges + var w:Float = graphic.width; - var left:Float = frame.frame.x / w; - var top:Float = (frame.frame.y + crop) / h; - var right:Float = left + frame.frame.width / w; - var bottom:Float = (frame.frame.y + frame.frame.height - crop) / h; + var crop:Float = (antialiasing ? .5 : 0); // gets rid of blurry edges + var leftUV:Float = (frame.frame.x / w); + var rightUV:Float = (leftUV + frame.frame.width / w); + var bottomUV:Float = ((frame.frame.y + frame.frame.height - crop) / graphic.height); - if (clip > 0) { - nextXOffset *= (1 - clip); - nextYOffset *= (1 - clip); - top = FlxMath.lerp(top, bottom, clip); - } + uvtData[0] = uvtData[4] = leftUV; // left corners uv + uvtData[2] = uvtData[6] = rightUV; // right corners uv + uvtData[5] = uvtData[7] = bottomUV; // bottom corners uv + topUV = ((frame.frame.y + crop) / graphic.height); + } + public function updateRender(drawData:NoteTailDrawData):Void { + if (graphic == null) + return; - var pieceWidth:Float = frameWidth * scale.x * .5; + var clip:Float = drawData.clip; + var angleTo:Float = drawData.angleTo; + var angleFrom:Float = drawData.angleFrom; + + setPosition(drawData.xFrom, drawData.yFrom); + var nextXOffset:Float = (drawData.xTo - drawData.xFrom) * (1 - clip); + var nextYOffset:Float = (drawData.yTo - drawData.yFrom) * (1 - clip); // update vertices - vertices[0] = Math.sin(angleTo) * pieceWidth + nextXOffset; // top left - vertices[1] = Math.cos(angleTo) * -pieceWidth + nextYOffset; - uvtData[0] = left; - uvtData[1] = top; + var width:Float = frameWidth * .5 * drawData.scaleFrom; + var widthTo:Float = frameWidth * .5 * drawData.scaleTo; + + var sin:Float = sinFunc(angleTo) * widthTo; + var cos:Float = cosFunc(angleTo) * widthTo; - vertices[2] = Math.sin(angleTo) * -pieceWidth + nextXOffset; // top right - vertices[3] = Math.cos(angleTo) * pieceWidth + nextYOffset; - uvtData[2] = right; - uvtData[3] = top; + vertices[0] = -sin + nextXOffset; // top left + vertices[1] = cos + nextYOffset; + vertices[2] = sin + nextXOffset; // top right + vertices[3] = -cos + nextYOffset; + uvtData[1] = uvtData[3] = FlxMath.lerp(topUV, uvtData[5], clip); // top corners uv (for clipping) - vertices[4] = Math.sin(angleFrom) * pieceWidth; // bottom left - vertices[5] = Math.cos(angleFrom) * -pieceWidth; - uvtData[4] = left; - uvtData[5] = bottom; + sin = sinFunc(angleFrom) * width; + cos = cosFunc(angleFrom) * width; - vertices[6] = Math.sin(angleFrom) * -pieceWidth; // bottom right - vertices[7] = Math.cos(angleFrom) * pieceWidth; - uvtData[6] = right; - uvtData[7] = bottom; + vertices[4] = -sin; // bottom left + vertices[5] = cos; + vertices[6] = sin; // bottom right + vertices[7] = -cos; + } + public inline function copyNote(note:Note):Void { + scrollFactor.copyFrom(note.scrollFactor); + shader = note.shader; + alpha = note.alpha; + color = note.color; } + function set_fast(yea:Bool):Bool { + sinFunc = (yea ? FlxMath.fastSin : Math.sin); + cosFunc = (yea ? FlxMath.fastCos : Math.cos); + return fast = yea; + } function set_style(newStyle:NoteStyle) { if (style == newStyle) return newStyle; style = newStyle; @@ -662,21 +774,30 @@ class NoteTailStrip extends FunkinStrip { } class NoteTailDrawData { - public var angleFrom:Float; - public var xFrom:Float; - public var yFrom:Float; + public var scaleFrom:Float = 1; + public var angleFrom:Float = 0; + public var xFrom:Float = 0; + public var yFrom:Float = 0; - public var angleTo:Float; - public var xTo:Float; - public var yTo:Float; + public var scaleTo:Float = 1; + public var angleTo:Float = 0; + public var xTo:Float = 0; + public var yTo:Float = 0; public var clip:Float = 0; + public var strip:NoteTailStrip; + public function new() {} public function setAngle(from:Float, ?to:Float):NoteTailDrawData { angleFrom = from; - angleTo = to ?? angleFrom; + angleTo = to ?? from; + return this; + } + public function setScale(from:Float, ?to:Float):NoteTailDrawData { + scaleFrom = from; + scaleTo = to ?? from; return this; } public function setPosition(x:Float, y:Float, ?xT:Float, ?yT:Float):NoteTailDrawData { From 658cdb21c6bd6c39d8dc516f099f5fac4a2e9b0d Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 25 May 2025 16:59:50 -0600 Subject: [PATCH 41/73] h --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b013f65..4a82dc7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ assets/images/gay porn/ mods/ +dump/ export/ .vscode/ .DS_Store From 1de28eea4416e39af4195f976a851870b3cbd9c4 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 25 May 2025 22:52:19 -0600 Subject: [PATCH 42/73] fix note release on looping animations --- source/funkin/backend/play/NoteEvent.hx | 2 +- source/funkin/objects/Character.hx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index 744cb19..62d2fc7 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -178,7 +178,7 @@ using StringTools; if (playAnimation && targetCharacter != null) { var suffixAnim:String = '$singAnimation$animSuffix${targetCharacter.animSuffix}'; - if (targetCharacter.currentAnimation == suffixAnim) + if (targetCharacter.currentAnimation == suffixAnim || targetCharacter.animationIsLooping(suffixAnim)) targetCharacter.timeAnimSteps(); } diff --git a/source/funkin/objects/Character.hx b/source/funkin/objects/Character.hx index 82ac4ef..311a86e 100644 --- a/source/funkin/objects/Character.hx +++ b/source/funkin/objects/Character.hx @@ -298,7 +298,7 @@ class Character extends FunkinSprite implements ICharacter { playAnimation(anim, forced, reversed, frame); if (forced || !sameAnim || animWasDone) { - timeAnimSteps(steps ?? singForSteps); + timeAnimSteps(steps); specialAnim = true; } } @@ -536,7 +536,7 @@ class Character extends FunkinSprite implements ICharacter { scaleMultiplier = charData.scale; smooth = !charData.no_antialiasing; - singForSteps = charData.sing_duration; + singForSteps = Math.max(charData.sing_duration, 1); defaultFlipX = charData.flip_x ?? false; scale.set(scaleMultiplier, scaleMultiplier); cameraOffset.set(charData.camera_position[0], charData.camera_position[1]); From 4e054b8eb8d3ff78504066dabd4a7f4988a01347 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 25 May 2025 22:52:38 -0600 Subject: [PATCH 43/73] updated rating assets <3 --- assets/images/gameplay/funkin/good.png | Bin 5952 -> 11398 bytes assets/images/gameplay/funkin/killer.png | Bin 7439 -> 13548 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/images/gameplay/funkin/good.png b/assets/images/gameplay/funkin/good.png index 8e738ab8420c107d6c1273dd94c4ad59c4c3f3f8..e001917ce0807af1a243cfb7decb1b8ddd4926f7 100644 GIT binary patch literal 11398 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 bzKZ@v@PC)(e6#}WVgkuYDNELg8wdX%S^Xg4 literal 7439 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 HS%3Nu5<5p= From 0f4eeda9abf457fbdac327cff14fb2754b4026d6 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Tue, 27 May 2025 05:29:07 -0600 Subject: [PATCH 44/73] note vars that shouldnt be resett lol --- source/funkin/macros/FunkinMacro.hx | 2 -- source/funkin/objects/play/Note.hx | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/source/funkin/macros/FunkinMacro.hx b/source/funkin/macros/FunkinMacro.hx index 0c70165..6f1cdb9 100644 --- a/source/funkin/macros/FunkinMacro.hx +++ b/source/funkin/macros/FunkinMacro.hx @@ -52,8 +52,6 @@ class FunkinMacro { for (meta in field.meta) { if (meta.name != 'resetVar') continue; - Context.info(field.name, pos); - switch (field.kind) { case FVar(type, expr): resetExpr.push(macro { $i{field.name} = $expr; }); diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index a507580..9821352 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -63,12 +63,12 @@ using funkin.backend.play.NoteStyle.NoteStyleUtil; class NoteObject extends FunkinSprite { public var lane:Lane; + public var defaultAlpha:Float = 1; + public var defaultScale:Float = 1; + @resetVar public var updateModchart:Bool = true; @resetVar public var followReceptor:Bool = true; - @resetVar public var defaultAlpha:Float = 1; - @resetVar public var defaultScale:Float = 1; - @resetVar public var direction:Float = 0; @resetVar public var distanceOffset:Float = 0; @resetVar public var scrollDistance:Float = 0; From 9ab995b45101ec8fccd77f2bb8760e68750bc192 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Tue, 27 May 2025 05:29:23 -0600 Subject: [PATCH 45/73] Update TitleState.hx fix formatting and better color fade --- source/funkin/states/TitleState.hx | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/source/funkin/states/TitleState.hx b/source/funkin/states/TitleState.hx index b33ad9d..6f7aa7c 100644 --- a/source/funkin/states/TitleState.hx +++ b/source/funkin/states/TitleState.hx @@ -13,6 +13,9 @@ class TitleState extends FunkinState { public var enter:FunkinSprite; public var logo:FunkinSprite; + public var enterColors:Array = [0xff33ffff, 0xff3333cc]; + var enterColorIndex:Int = 0; + public var introTexts:Array> = []; public var currentIntroText:Array; public var titleStarted:Bool = false; @@ -67,9 +70,9 @@ class TitleState extends FunkinState { titleGroup.add(enter); ngSpr = new FunkinSprite(); - if (FlxG.random.bool(1)) { + if (FlxG.random.bool(1)) { ngSpr.loadGraphic(Paths.image('titlescreen/ngClassic')); - } else if (FlxG.random.bool(30)) { + } else if (FlxG.random.bool(30)) { ngSpr.loadGraphic(Paths.image('titlescreen/ngAnimated'), true, 600); ngSpr.setGraphicSize(Std.int(ngSpr.width * 0.55)); ngSpr.addAnimation('idle', null, 4, true, [0, 1]); @@ -81,15 +84,16 @@ class TitleState extends FunkinState { } ngSpr.alpha = .0001; ngSpr.updateHitbox(); - ngSpr.screenCenter(X); - ngSpr.y = FlxG.height - ngSpr.height - 160; + ngSpr.screenCenter(X); + ngSpr.y = FlxG.height - ngSpr.height - 160; playMusic(MainMenuState.menuMusic, !skipIntro); conductorInUse.syncTracker = FlxG.sound.music; + conductorInUse.sync(); add(introGroup); if (!skipIntro) { - add(ngSpr); + add(ngSpr); final ySpacing:Float = 60; queueEvent(beatToMS(1), (_) -> { @@ -126,6 +130,8 @@ class TitleState extends FunkinState { DiscordRPC.presence.details = 'In the title screen'; DiscordRPC.dirty = true; + + enter.color = enterColors[enterColorIndex ++]; } public override function update(elapsed:Float) { super.update(elapsed); @@ -154,10 +160,12 @@ class TitleState extends FunkinState { logo.playAnimation('bump', true); if (beat % 2 == 0) { if (!confirmed) { - var to:FlxColor = 0xff3333cc; - var from:FlxColor = 0xff33ffff; + if (enterColorIndex >= enterColors.length) enterColorIndex = 0; + + var to:FlxColor = enterColors[enterColorIndex ++]; + FlxTween.cancelTweensOf(enter); - FlxTween.color(enter, conductorInUse.crochet * .001 * 2, from, to, {type: (beat % 4 < 2 ? ONESHOT : BACKWARD)}); + FlxTween.color(enter, conductorInUse.crochet * .001 * 2, enter.color, to); } } } From 7940f3da4713607b3f5921581a2183deffa1c019 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Thu, 29 May 2025 21:32:20 -0600 Subject: [PATCH 46/73] add defines stuffs hello bro --- source/funkin/backend/scripting/ModParser.hx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/funkin/backend/scripting/ModParser.hx b/source/funkin/backend/scripting/ModParser.hx index 4636d13..0398938 100644 --- a/source/funkin/backend/scripting/ModParser.hx +++ b/source/funkin/backend/scripting/ModParser.hx @@ -4,6 +4,13 @@ import crowplexus.hscript.Expr; import crowplexus.hscript.Parser; class ModParser extends Parser { + public function new() { + super(); + + for (proc => value in crowplexus.iris.macro.DefineMacro.defines) + preprocesorValues.set(proc, value); + } + override function parseFunctionArgs() { var args:Array = []; var tk = token(); From df2712d4ef522f3181acc71e9f795a8f0eb15f0b Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 31 May 2025 09:50:16 -0600 Subject: [PATCH 47/73] account for scale , angle for bar center also changed the library line lol --- source/funkin/objects/Bar.hx | 10 +++++++++- source/funkin/objects/Stage.hx | 1 + source/funkin/states/PlayState.hx | 1 - 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/source/funkin/objects/Bar.hx b/source/funkin/objects/Bar.hx index 79a18ab..77b9281 100644 --- a/source/funkin/objects/Bar.hx +++ b/source/funkin/objects/Bar.hx @@ -79,7 +79,15 @@ class Bar extends FunkinSpriteGroup { } function get_barCenter():FlxPoint { - return _barPoint.set(leftBar.x + leftBar.clipRect.x + leftBar.clipRect.width, leftBar.y + leftBar.height * .5); + var result:FlxPoint = _barPoint.set(leftBar.clipRect.x + leftBar.clipRect.width, leftBar.clipRect.y + leftBar.clipRect.height * .5); + result.subtract(leftBar.origin); + result.scale(leftBar.scale.x, leftBar.scale.y); + result.degrees += leftBar.angle; + result.add(leftBar.origin); + result.subtract(leftBar.offset); + result.add(leftBar.x, leftBar.y); + + return result; } function set_percent(newPercent:Float):Float { if (percent != newPercent) { diff --git a/source/funkin/objects/Stage.hx b/source/funkin/objects/Stage.hx index 497011d..f411460 100644 --- a/source/funkin/objects/Stage.hx +++ b/source/funkin/objects/Stage.hx @@ -98,6 +98,7 @@ class Stage extends FunkinSpriteGroup { } public function loadModernStageData(data:ModernStageData) { library = data.directory ?? data.library ?? ''; + Paths.library = library; zoom = data.cameraZoom; for (prop in data.props) { diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 08f128d..61475a6 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -258,7 +258,6 @@ class PlayState extends FunkinState { stage.setup(chart.stage); add(stage); - Paths.library = stage.library; player1 = stage.getCharacter('bf'); player2 = stage.getCharacter('dad'); player3 = stage.getCharacter('gf'); From 4e5dd52eb4bc986f84b58a44aa2d9ab975b16857 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 31 May 2025 12:02:52 -0600 Subject: [PATCH 48/73] do NOT roudn clipRect --- source/funkin/backend/FunkinSprite.hx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/funkin/backend/FunkinSprite.hx b/source/funkin/backend/FunkinSprite.hx index d6369c6..727b3f4 100644 --- a/source/funkin/backend/FunkinSprite.hx +++ b/source/funkin/backend/FunkinSprite.hx @@ -404,6 +404,9 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact if (isAnimate) return animate.height; else return height; } + override function set_clipRect(rect:FlxRect):FlxRect { // dont gaf + return clipRect = rect; + } function get_isAnimate() { return (renderType == ANIMATEATLAS && animate != null); } From 94a874c5166810287ce601174b442775d5005128 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 31 May 2025 15:18:29 -0600 Subject: [PATCH 49/73] fix conductor event rollout --- source/funkin/backend/rhythm/Conductor.hx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/funkin/backend/rhythm/Conductor.hx b/source/funkin/backend/rhythm/Conductor.hx index 2f5fa68..235585b 100644 --- a/source/funkin/backend/rhythm/Conductor.hx +++ b/source/funkin/backend/rhythm/Conductor.hx @@ -60,10 +60,10 @@ class Conductor { var curBeat:Int = Math.floor(metronome.beat); var curStep:Int = Math.floor(metronome.step); - if (prevBar != curBar) barHit.dispatch(curBar); - if (prevBeat != curBeat) beatHit.dispatch(curBeat); - if (prevStep != curStep) stepHit.dispatch(curStep); if (prevPosition != metronome.ms) advance.dispatch(metronome.ms); + if (prevStep != curStep) stepHit.dispatch(curStep); + if (prevBeat != curBeat) beatHit.dispatch(curBeat); + if (prevBar != curBar) barHit.dispatch(curBar); } } public inline function sync():Void { From 21fc028a4eb1659d31472e7b98da40287bcab01f Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 31 May 2025 19:31:41 -0600 Subject: [PATCH 50/73] stoppable gameover start --- source/funkin/objects/Character.hx | 3 +++ source/funkin/states/GameOverSubState.hx | 7 ++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/source/funkin/objects/Character.hx b/source/funkin/objects/Character.hx index 311a86e..7a59b66 100644 --- a/source/funkin/objects/Character.hx +++ b/source/funkin/objects/Character.hx @@ -554,7 +554,10 @@ class Character extends FunkinSprite implements ICharacter { setBaseSize(); dance(); } + finishAnimation(); + if (anim.looped) + playAnimation(currentAnimation, true); dropNoteCounts = findCountAnimations('drop'); comboNoteCounts = findCountAnimations('combo'); diff --git a/source/funkin/states/GameOverSubState.hx b/source/funkin/states/GameOverSubState.hx index 0135577..05ec475 100644 --- a/source/funkin/states/GameOverSubState.hx +++ b/source/funkin/states/GameOverSubState.hx @@ -25,6 +25,7 @@ class GameOverSubState extends FunkinState { var playState:PlayState; var waitTimer:FlxTimer = null; public var started:Bool = false; + public var canStart:Bool = true; public var confirmed:Bool = false; public var wasInstant:Bool = false; @@ -108,13 +109,13 @@ class GameOverSubState extends FunkinState { var aniName:String = 'firstDeath$deathAnimationPostfix'; if (character.animationExists(aniName, true)) { character.playAnimation(aniName); - character.onAnimationComplete.addOnce((anim:String) -> { - if (!started && anim == aniName) + character.onAnimationComplete.add((ani:String) -> { + if (canStart && !started && ani == aniName) startGameOver(); }); } new FlxTimer().start(2.5, (_) -> { - if (!started && character.isAnimationFinished()) + if (!started && canStart && character.isAnimationFinished()) startGameOver(); }); } else { From bd1dcf685ba93d067c97ceaa0be5c1c5f50dd131 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 1 Jun 2025 00:50:05 -0600 Subject: [PATCH 51/73] make stage a...ahem... FunkinGroup pulled it out my ass btw --- source/funkin/backend/FunkinSpriteGroup.hx | 50 +++++++++++++++++++++- source/funkin/objects/Stage.hx | 2 +- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/source/funkin/backend/FunkinSpriteGroup.hx b/source/funkin/backend/FunkinSpriteGroup.hx index a89d990..47aad0a 100644 --- a/source/funkin/backend/FunkinSpriteGroup.hx +++ b/source/funkin/backend/FunkinSpriteGroup.hx @@ -4,6 +4,52 @@ import funkin.backend.FunkinSprite; import haxe.iterators.ArrayKeyValueIterator; +typedef FunkinGroup = FunkinTypedGroup; +class FunkinTypedGroup implements ISpriteVars extends FlxTypedGroup { + public var extraData:Map = new Map(); + + public function setVar(k:String, v:Dynamic):Dynamic { + if (extraData == null) extraData = new Map(); + extraData.set(k, v); + return v; + } + public function getVar(k:String):Dynamic { + if (extraData == null) return null; + return extraData.get(k); + } + public function hasVar(k:String):Bool { + if (extraData == null) return false; + return extraData.exists(k); + } + public function removeVar(k:String):Bool { + if (extraData == null) return false; + return extraData.remove(k); + } + + public function sortZIndex() { + sort(Util.sortZIndex, FlxSort.ASCENDING); + } + public function insertZIndex(obj:T) { + if (members.contains(obj)) remove(obj, true); + + var low:Float = Math.POSITIVE_INFINITY; + for (pos => mem in members) { + low = Math.min(mem.zIndex, low); + if (obj.zIndex < mem.zIndex) { + insert(pos, obj); + return obj; + } + } + if (obj.zIndex < low) { + insert(0, obj); + } else { + add(obj); + } + + return obj; + } +} + typedef FunkinSpriteGroup = FunkinTypedSpriteGroup; class FunkinTypedSpriteGroup implements ISpriteGroup implements ISpriteVars implements IZoomFactor extends FlxTypedSpriteGroup { public var zoomFactor(default, set):Float = 1; @@ -47,7 +93,8 @@ class FunkinTypedSpriteGroup implements ISpriteGroup implements ISp sort(Util.sortZIndex, FlxSort.ASCENDING); } public function insertZIndex(obj:T) { - if (members.contains(obj)) remove(obj); + if (members.contains(obj)) remove(obj, true); + var low:Float = Math.POSITIVE_INFINITY; for (pos => mem in members) { low = Math.min(mem.zIndex, low); @@ -61,6 +108,7 @@ class FunkinTypedSpriteGroup implements ISpriteGroup implements ISp } else { add(obj); } + return obj; } public inline function moveToTop(sprite:T):T { diff --git a/source/funkin/objects/Stage.hx b/source/funkin/objects/Stage.hx index f411460..1a7abe0 100644 --- a/source/funkin/objects/Stage.hx +++ b/source/funkin/objects/Stage.hx @@ -7,7 +7,7 @@ import funkin.objects.Character; using StringTools; //THIS IS ALL KINDOF A MESS BUT IT WORKS??? I THINK -class Stage extends FunkinSpriteGroup { +class Stage extends FunkinGroup { var chart:Chart; public var name:String; public var json:Dynamic; From dc624d2979088e47abede44a169abb213a525d59 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 1 Jun 2025 00:51:17 -0600 Subject: [PATCH 52/73] camLocked prevents camera from changing in FocusCamera events. psyc engine reference. genius! --- source/funkin/backend/play/SongEvent.hx | 9 +++++++-- source/funkin/objects/Character.hx | 1 + source/funkin/states/PlayState.hx | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/source/funkin/backend/play/SongEvent.hx b/source/funkin/backend/play/SongEvent.hx index c8f595d..7bb480e 100644 --- a/source/funkin/backend/play/SongEvent.hx +++ b/source/funkin/backend/play/SongEvent.hx @@ -159,9 +159,14 @@ class PlayStateEventHandler { case 2: // gf focus focusChara = game.player3; } - + + if (game.camLocked) { // change "spotlight", NOT camera + game.spotlight = focusChara?.current; + return; + } + if (focusChara != null) { - game.focusOnCharacter(focusChara.current); + game.focusOnCharacter(focusChara?.current); } else { game.camFocusTarget.x = 0; game.camFocusTarget.y = 0; diff --git a/source/funkin/objects/Character.hx b/source/funkin/objects/Character.hx index 7a59b66..ec31e45 100644 --- a/source/funkin/objects/Character.hx +++ b/source/funkin/objects/Character.hx @@ -536,6 +536,7 @@ class Character extends FunkinSprite implements ICharacter { scaleMultiplier = charData.scale; smooth = !charData.no_antialiasing; + bopFrequency = (animationExists('danceLeft') && animationExists('danceRight') ? 1 : 2); singForSteps = Math.max(charData.sing_duration, 1); defaultFlipX = charData.flip_x ?? false; scale.set(scaleMultiplier, scaleMultiplier); diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 61475a6..e2b577d 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -54,6 +54,7 @@ class PlayState extends FunkinState { public var camFocusTarget:FlxObject; public var spotlight(default, set):Null; + public var camLocked:Bool = false; public var camZooming:Bool = true; public var camZoomIntensity:Float = 1; public var hudZoomIntensity:Float = 2; From 64c8c87273a51023e32961eef64370cf5f08f505 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 1 Jun 2025 02:44:26 -0600 Subject: [PATCH 53/73] fix hit note rgb and rotated hold strip --- source/funkin/objects/play/Note.hx | 40 +++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 9821352..db42eca 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -324,6 +324,7 @@ class Note extends NoteObject { var asset:NoteStyleAssetData = style?.data.notes; NoteStyleUtil.loadNoteStyleAnimations(this, asset, style?.getDirectionName(laneIndex)); + updateRGBShader = !(style?.data.general.disableRGB ?? false); defaultScale = asset?.scale ?? 1; defaultAlpha = asset?.alpha ?? 1; scale.x *= (defaultScale / oldScale); @@ -660,6 +661,7 @@ class NoteTailStrip extends FunkinStrip { public var parentTail(default, set):NoteTail; public var fast(default, set):Bool; + var topCoordOffset:Int = 0; var sinFunc:Float -> Float; var cosFunc:Float -> Float; var topUV:Float; @@ -691,16 +693,36 @@ class NoteTailStrip extends FunkinStrip { return; var w:Float = graphic.width; + var h:Float = graphic.height; var crop:Float = (antialiasing ? .5 : 0); // gets rid of blurry edges - var leftUV:Float = (frame.frame.x / w); - var rightUV:Float = (leftUV + frame.frame.width / w); - var bottomUV:Float = ((frame.frame.y + frame.frame.height - crop) / graphic.height); - - uvtData[0] = uvtData[4] = leftUV; // left corners uv - uvtData[2] = uvtData[6] = rightUV; // right corners uv - uvtData[5] = uvtData[7] = bottomUV; // bottom corners uv - topUV = ((frame.frame.y + crop) / graphic.height); + var leftUV:Float, highUV:Float, rightUV:Float, bottomUV:Float; + + leftUV = (frame.frame.x / w); + highUV = (frame.frame.y / h); + rightUV = (leftUV + frame.frame.width / w); + bottomUV = (highUV + frame.frame.height / h); + + switch (frame.angle) { + case ANGLE_NEG_90 | ANGLE_270: + topCoordOffset = 0; + uvtData[1] = uvtData[5] = highUV; // left corners uv + uvtData[3] = uvtData[7] = bottomUV; // right corners uv + uvtData[4] = uvtData[6] = (leftUV + crop / w); // bottom corners uv + topUV = (rightUV - crop / w); // top corners uv + case ANGLE_90: + topCoordOffset = 0; + uvtData[1] = uvtData[5] = bottomUV; // left corners uv + uvtData[3] = uvtData[7] = highUV; // right corners uv + uvtData[4] = uvtData[6] = (rightUV - crop / w); // bottom corners uv + topUV = (leftUV + crop / w); // top corners uv + default: + topCoordOffset = 1; + uvtData[0] = uvtData[4] = leftUV; // left corners uv + uvtData[2] = uvtData[6] = rightUV; // right corners uv + uvtData[5] = uvtData[7] = (bottomUV - crop / h); // bottom corners uv + topUV = (highUV + crop / h); // top corners uv + } // +90 untested but SHOULD work ?? } public function updateRender(drawData:NoteTailDrawData):Void { if (graphic == null) @@ -725,7 +747,7 @@ class NoteTailStrip extends FunkinStrip { vertices[1] = cos + nextYOffset; vertices[2] = sin + nextXOffset; // top right vertices[3] = -cos + nextYOffset; - uvtData[1] = uvtData[3] = FlxMath.lerp(topUV, uvtData[5], clip); // top corners uv (for clipping) + uvtData[0 + topCoordOffset] = uvtData[2 + topCoordOffset] = FlxMath.lerp(topUV, uvtData[4 + topCoordOffset], clip); // top corners uv (for clipping) sin = sinFunc(angleFrom) * width; cos = cosFunc(angleFrom) * width; From ff95c828417d6110f792cd05b4e2953e46191b07 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 1 Jun 2025 03:07:30 -0600 Subject: [PATCH 54/73] lane specific notestyle animations --- source/funkin/objects/play/Lane.hx | 12 ++++++++++-- source/funkin/objects/play/Note.hx | 22 ++++++++++++++++------ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index d4d833a..8b68bf6 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -231,7 +231,7 @@ class Lane extends FunkinSpriteGroup { continue; if (hittableOnly && (!note.canHit || note.goodHit)) continue; - if (highNote == null || (note.hitPriority > highNote.hitPriority || (note.hitPriority == highNote.hitPriority && note.msTime < highNote.msTime))) + if (highNote == null || note.hitPriority > highNote.hitPriority || (note.hitPriority == highNote.hitPriority && note.msTime < highNote.msTime)) highNote = note; } return highNote; @@ -487,7 +487,7 @@ class Receptor extends FunkinSprite { this.style = NoteStyle.fetch(style); onAnimationComplete.add((anim:String) -> { - if (anim != 'static' && autoReset && (lane == null || !lane.held)) + if (!anim.startsWith('static') && autoReset && (lane == null || !lane.held)) playAnimation('static', true); }); } @@ -499,6 +499,10 @@ class Receptor extends FunkinSprite { } public override function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { + var overrideAnim:String = '$anim-$noteData'; + if (animationExists(overrideAnim)) + anim = overrideAnim; + if (updateRGBShader) { var animData:NoteStyleAnimData = style?.getAssetAnimation(style.data.receptors, anim); if (animData != null) { @@ -639,6 +643,10 @@ class NoteSplash extends FunkinSprite { return this; } public override function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { + var overrideAnim:String = '$anim-$noteData'; + if (animationExists(overrideAnim)) + anim = overrideAnim; + if (updateRGBShader) { var animData:NoteStyleAnimData = style?.getAssetAnimation(asset, anim); if (animData != null) { diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index db42eca..7f174d8 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -62,6 +62,7 @@ using funkin.backend.play.NoteStyle.NoteStyleUtil; @:build(funkin.macros.FunkinMacro.buildReset()) class NoteObject extends FunkinSprite { public var lane:Lane; + public var laneIndex:Int = 0; public var defaultAlpha:Float = 1; public var defaultScale:Float = 1; @@ -73,8 +74,11 @@ class NoteObject extends FunkinSprite { @resetVar public var distanceOffset:Float = 0; @resetVar public var scrollDistance:Float = 0; @resetVar public var scrollMultiplier:Float = 1; + @:deprecated('noteData is deprecated, use laneIndex instead!') public var noteData(get, set):Int; @:deprecated('directionOffset is deprecated, use direction instead!') public var directionOffset(get, set):Float; + function get_noteData():Int { return laneIndex; } + function set_noteData(value:Int):Int { return laneIndex = value; } function get_directionOffset():Float { return direction; } function set_directionOffset(alpha:Float):Float { return direction = alpha; } @@ -123,7 +127,6 @@ class Note extends NoteObject { public var chartNote(default, set):ChartNote; public var strumlineIndex:Int = 0; - public var laneIndex:Int = 0; @resetVar public var preventDespawn:Bool = false; @resetVar public var consumed:Bool = false; @@ -155,7 +158,6 @@ class Note extends NoteObject { public var style(default, set):NoteStyle; public var kind(default, set):String = ''; @:deprecated('noteKind is deprecated, use kind instead!') public var noteKind(get, set):String; - @:deprecated('noteData is deprecated, use laneIndex instead!') public var noteData(get, set):Int; @:deprecated('player is deprecated, use strumlineIndex instead!') public var player(get, never):Bool; public var endMs(get, never):Float; @@ -166,8 +168,6 @@ class Note extends NoteObject { public var beatLength(default, set):Float = 0; public var isHoldNote(default, null):Bool = false; - function get_noteData():Int { return laneIndex; } - function set_noteData(value:Int):Int { return laneIndex = value; } function get_player():Bool { return (strumlineIndex == 0); } function set_noteKind(newKind:String):String { return kind = newKind; } function get_noteKind():String { return kind; } @@ -390,6 +390,10 @@ class Note extends NoteObject { } public override function playAnimation(anim:String, forced:Bool = false, reversed:Bool = false, frame:Int = 0) { + var overrideAnim:String = '$anim-$laneIndex'; + if (animationExists(overrideAnim)) + anim = overrideAnim; + if (forced || this.anim.name != anim) reloadAnimShader(anim, style); @@ -470,6 +474,7 @@ class NoteTail extends Note { public function reloadNote(note:Note):Void { conductorInUse = note.conductorInUse ?? FunkinState.getCurrentConductor(); chartNote = note.chartNote; + laneIndex = note.laneIndex; style = note.style; holdStrip?.reloadTail(this); @@ -704,7 +709,7 @@ class NoteTailStrip extends FunkinStrip { bottomUV = (highUV + frame.frame.height / h); switch (frame.angle) { - case ANGLE_NEG_90 | ANGLE_270: + case ANGLE_NEG_90: topCoordOffset = 0; uvtData[1] = uvtData[5] = highUV; // left corners uv uvtData[3] = uvtData[7] = bottomUV; // right corners uv @@ -790,7 +795,12 @@ class NoteTailStrip extends FunkinStrip { NoteStyleUtil.loadNoteStyleAnimations(this, asset, style?.getDirectionName(laneIndex)); - playAnimation(defaultAnim, true); + var overrideAnim:String = '$defaultAnim-$laneIndex'; + if (animationExists(overrideAnim)) { + playAnimation(overrideAnim, true); + } else { + playAnimation(defaultAnim, true); + } offset.set(); } } From 95c78b879b3f57bc4793335dddfd10a1b08f6da8 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 1 Jun 2025 11:52:57 -0600 Subject: [PATCH 55/73] hold sprite offset --- source/funkin/objects/play/Note.hx | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 7f174d8..1fda1d0 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -738,29 +738,35 @@ class NoteTailStrip extends FunkinStrip { var angleFrom:Float = drawData.angleFrom; setPosition(drawData.xFrom, drawData.yFrom); + var sprXOffset:Float = -(spriteOffset.x + animOffset.x); + var sprYOffset:Float = -(spriteOffset.y + animOffset.y); var nextXOffset:Float = (drawData.xTo - drawData.xFrom) * (1 - clip); var nextYOffset:Float = (drawData.yTo - drawData.yFrom) * (1 - clip); // update vertices var width:Float = frameWidth * .5 * drawData.scaleFrom; var widthTo:Float = frameWidth * .5 * drawData.scaleTo; + var xOffset:Float = sprXOffset * drawData.scaleFrom; + var xOffsetTo:Float = sprXOffset * drawData.scaleTo; + var yOffset:Float = sprYOffset * drawData.scaleFrom; + var yOffsetTo:Float = sprYOffset * drawData.scaleTo; var sin:Float = sinFunc(angleTo) * widthTo; var cos:Float = cosFunc(angleTo) * widthTo; - vertices[0] = -sin + nextXOffset; // top left - vertices[1] = cos + nextYOffset; - vertices[2] = sin + nextXOffset; // top right - vertices[3] = -cos + nextYOffset; + vertices[0] = -sin + nextXOffset + xOffsetTo; // top left + vertices[1] = cos + nextYOffset + yOffsetTo; + vertices[2] = sin + nextXOffset + xOffsetTo; // top right + vertices[3] = -cos + nextYOffset + yOffsetTo; uvtData[0 + topCoordOffset] = uvtData[2 + topCoordOffset] = FlxMath.lerp(topUV, uvtData[4 + topCoordOffset], clip); // top corners uv (for clipping) sin = sinFunc(angleFrom) * width; cos = cosFunc(angleFrom) * width; - vertices[4] = -sin; // bottom left - vertices[5] = cos; - vertices[6] = sin; // bottom right - vertices[7] = -cos; + vertices[4] = -sin + xOffset; // bottom left + vertices[5] = cos + yOffset; + vertices[6] = sin + xOffset; // bottom right + vertices[7] = -cos + yOffset; } public inline function copyNote(note:Note):Void { scrollFactor.copyFrom(note.scrollFactor); From 09bca4151f12b5b2a73f6cdd702d476d0767dcdb Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 1 Jun 2025 11:53:10 -0600 Subject: [PATCH 56/73] remove spotlight bs --- source/funkin/states/PlayState.hx | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index e2b577d..e258c7d 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -335,20 +335,10 @@ class PlayState extends FunkinState { iconP2.zIndex = 15; uiGroup.add(iconP2); - if (player1 != null) { - player1.onCharacterChanged.add((name:String, char:Character) -> { - matchIconData(iconP1, char); - if (spotlight == player1.current) - focusOnCharacter(char); - }); - } - if (player2 != null) { - player2.onCharacterChanged.add((name:String, char:Character) -> { - matchIconData(iconP2, char); - if (spotlight == player2.current) - focusOnCharacter(char); - }); - } + if (player1 != null) + player1.onCharacterChanged.add((name:String, char:Character) -> matchIconData(iconP1, char)); + if (player2 != null) + player2.onCharacterChanged.add((name:String, char:Character) -> matchIconData(iconP2, char)); scoreTxt = new FlxText(0, FlxG.height - 25, FlxG.width, 'Score: idk'); scoreTxt.setFormat(Paths.ttf('vcr'), 16, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); From ba6dbb2738a8bb94c79b1c61d8f6db96cf230a6c Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 1 Jun 2025 13:45:05 -0600 Subject: [PATCH 57/73] more note event vars applyHealth and holdDelta --- source/funkin/backend/play/NoteEvent.hx | 16 +++++++++++----- source/funkin/states/PlayState.hx | 11 ++--------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index 62d2fc7..a6dca2a 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -19,6 +19,7 @@ using StringTools; public var strumline:Strumline; public var animSuffix:String = ''; public var songPosition:Float = 0; + public var holdDelta:Float = 0; public var spark:NoteSpark = null; public var splash:NoteSplash = null; @@ -31,6 +32,7 @@ using StringTools; public var doSplash:Bool = false; public var playSound:Bool = false; public var popRating:Bool = true; + public var applyHealth:Bool = false; public var applyRating:Bool = false; public var playAnimation:Bool = true; public var animateReceptor:Bool = true; @@ -79,7 +81,8 @@ using StringTools; rating.acceleration.y = 550; } - game.health += note.healthGain * scoring.healthMod; + if (applyHealth) + game.health += note.healthGain * scoring.healthMod; } applyScore(scoreHandler, scoring, game); @@ -160,13 +163,15 @@ using StringTools; nextHitTime = Math.max(Math.min(songPos, note.endMs), prevHitTime); } - final secondDiff:Float = Math.max(0, (nextHitTime - prevHitTime) * .001); + holdDelta = Math.max(0, nextHitTime - prevHitTime); + + final secondDiff:Float = holdDelta * .001; scoring ??= {score: 0, healthMod: secondDiff}; if (scoreHandler != null) scoring.score = scoreHandler.holdScorePerSecond * secondDiff; - if (inGame) + if (inGame && applyRating && applyHealth) game.health += (scoring.healthMod ?? 1) * note.healthGainPerSecond; applyScore(scoreHandler, scoring, game); @@ -224,7 +229,7 @@ using StringTools; if (applyRating) { scoring ??= scoreHandler?.judgeNoteGhost(); - if (inGame) + if (inGame && applyHealth) game.health += (scoring.healthMod ?? -.01); } @@ -255,7 +260,8 @@ using StringTools; rating.acceleration.y = 240; } - game.health -= note.healthLoss * (scoring.healthMod ?? 1); + if (applyHealth) + game.health -= note.healthLoss * (scoring.healthMod ?? 1); } applyScore(scoreHandler, scoring, game); diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index e258c7d..77bd3ab 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -785,14 +785,12 @@ class PlayState extends FunkinState { public function playerNoteEvent(e:NoteEvent) { e.setup(); - e.doSplash = true; - e.doSpark = true; + e.doSplash = e.doSpark = true; if (e.type == NoteEventType.GHOST && ghostTapping) { e.playAnimation = false; } else { - e.playSound = true; - e.applyRating = true; + e.playSound = e.applyHealth = e.applyRating = true; } dispatchPlayEvent('playerNoteEvent', e); @@ -800,11 +798,6 @@ class PlayState extends FunkinState { public function opponentNoteEvent(e:NoteEvent) { e.setup(); - e.applyRating = false; - e.playSound = false; - e.doSplash = false; - e.doSpark = false; - dispatchPlayEvent('opponentNoteEvent', e); } public function popCombo(combo:Int) { From 1fcb9c81924dd3a68bb01e2412b2ffaec8238c48 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 1 Jun 2025 13:45:37 -0600 Subject: [PATCH 58/73] optional zindex on insert --- source/funkin/backend/FunkinSpriteGroup.hx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/funkin/backend/FunkinSpriteGroup.hx b/source/funkin/backend/FunkinSpriteGroup.hx index 47aad0a..8d39564 100644 --- a/source/funkin/backend/FunkinSpriteGroup.hx +++ b/source/funkin/backend/FunkinSpriteGroup.hx @@ -29,8 +29,9 @@ class FunkinTypedGroup implements ISpriteVars extends FlxTypedGroup< public function sortZIndex() { sort(Util.sortZIndex, FlxSort.ASCENDING); } - public function insertZIndex(obj:T) { + public function insertZIndex(obj:T, ?zIndex:Int) { if (members.contains(obj)) remove(obj, true); + if (zIndex != null) obj.zIndex = zIndex; var low:Float = Math.POSITIVE_INFINITY; for (pos => mem in members) { @@ -92,8 +93,9 @@ class FunkinTypedSpriteGroup implements ISpriteGroup implements ISp public function sortZIndex() { sort(Util.sortZIndex, FlxSort.ASCENDING); } - public function insertZIndex(obj:T) { + public function insertZIndex(obj:T, ?zIndex:Int) { if (members.contains(obj)) remove(obj, true); + if (zIndex != null) obj.zIndex = zIndex; var low:Float = Math.POSITIVE_INFINITY; for (pos => mem in members) { From 07afbbe0b64660e75b98923d5fc09f1f3d8fbabc Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 1 Jun 2025 13:45:52 -0600 Subject: [PATCH 59/73] Bar.overlayOnTop yay --- source/funkin/objects/Bar.hx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/source/funkin/objects/Bar.hx b/source/funkin/objects/Bar.hx index 77b9281..c6936b3 100644 --- a/source/funkin/objects/Bar.hx +++ b/source/funkin/objects/Bar.hx @@ -19,6 +19,7 @@ class Bar extends FunkinSpriteGroup { public var barCenter(get, null):FlxPoint; public var leftToRight(default, set):Bool = true; + public var overlayOnTop(default, set):Bool = false; var _barPoint:FlxPoint = FlxPoint.get(); @@ -29,15 +30,16 @@ class Bar extends FunkinSpriteGroup { rightBar = new FunkinSprite().makeGraphic(Std.int(overlay.width), Std.int(overlay.height), -1); rightBar.clipRect = new FlxRect(); leftBar.clipRect = new FlxRect(); - add(overlay); - add(leftBar); - add(rightBar); valueFunc = valueFunction; if (newBounds != null) bounds = newBounds; + insertZIndex(leftBar, 5); + insertZIndex(rightBar, 10); + barRect.height = leftBar.height - barRect.y * 2; barRect.width = leftBar.width - barRect.x * 2; + overlayOnTop = false; snapToPercent(); setColors(); } @@ -117,12 +119,16 @@ class Bar extends FunkinSpriteGroup { return Util.clamp(targetPercent, 0, 100); } } - function set_leftToRight(isIt:Bool) { + function set_leftToRight(isIt:Bool):Bool { if (leftToRight == isIt) return isIt; leftToRight = isIt; updateBars(); return isIt; } + function set_overlayOnTop(yea:Bool):Bool { + insertZIndex(overlay, (yea ? 15 : 0)); + return overlayOnTop = yea; + } public function updateBars() { var fPercent:Float = (leftToRight ? 100 - percent : percent) * .01; var leftWidth:Float = FlxMath.lerp(0, barRect.width, fPercent); From dfa2022087378a3e4b3b410c8d9338f12a93e868 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 1 Jun 2025 14:12:37 -0600 Subject: [PATCH 60/73] fix bar bounds --- source/funkin/objects/Bar.hx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/funkin/objects/Bar.hx b/source/funkin/objects/Bar.hx index c6936b3..cb0e084 100644 --- a/source/funkin/objects/Bar.hx +++ b/source/funkin/objects/Bar.hx @@ -9,7 +9,8 @@ class Bar extends FunkinSpriteGroup { public var leftBar:FunkinSprite; public var rightBar:FunkinSprite; - public var targetPercent:Float = 100; + public var value:Float = .5; + public var targetPercent:Float = 50; public var percent(default, set):Float; public var percentLerp:Null = .15 * 60; public var valueFunc:Bar -> Float = null; @@ -113,8 +114,8 @@ class Bar extends FunkinSpriteGroup { if (bounds.max <= bounds.min) return 0; - var val:Float = valueFunc(this); - return targetPercent = Util.clamp((val - bounds.min) / bounds.max * 100, 0, 100); + value = valueFunc(this); + return targetPercent = Util.clamp((value - bounds.min) / (bounds.max - bounds.min) * 100, 0, 100); } else { return Util.clamp(targetPercent, 0, 100); } From ae4bb90606b3bb4d56f5292d61962d9c7a130f25 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 1 Jun 2025 15:54:03 -0600 Subject: [PATCH 61/73] new healthbar clipping --- source/funkin/objects/Bar.hx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/source/funkin/objects/Bar.hx b/source/funkin/objects/Bar.hx index cb0e084..301872e 100644 --- a/source/funkin/objects/Bar.hx +++ b/source/funkin/objects/Bar.hx @@ -133,16 +133,18 @@ class Bar extends FunkinSpriteGroup { public function updateBars() { var fPercent:Float = (leftToRight ? 100 - percent : percent) * .01; var leftWidth:Float = FlxMath.lerp(0, barRect.width, fPercent); + var yM:Float = (leftBar.frameHeight / overlay.frameHeight); + var xM:Float = (leftBar.frameWidth / overlay.frameWidth); - leftBar.clipRect.x = barRect.x; - leftBar.clipRect.y = barRect.y; - leftBar.clipRect.width = leftWidth; + leftBar.clipRect.x = barRect.x * xM; + leftBar.clipRect.y = barRect.y * yM; + leftBar.clipRect.width = leftWidth * xM; - rightBar.clipRect.y = barRect.y; - rightBar.clipRect.x = barRect.x + leftWidth; - rightBar.clipRect.width = barRect.width - leftWidth; + rightBar.clipRect.y = barRect.y * yM; + rightBar.clipRect.x = (barRect.x + leftWidth) * xM; + rightBar.clipRect.width = (barRect.width - leftWidth) * xM; - rightBar.clipRect.height = leftBar.clipRect.height = barRect.height; + rightBar.clipRect.height = leftBar.clipRect.height = barRect.height * yM; rightBar.clipRect = rightBar.clipRect; leftBar.clipRect = leftBar.clipRect; } From 8aa5121f64b029cc18f04edce0b11fc8408dfc54 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sun, 1 Jun 2025 17:37:20 -0600 Subject: [PATCH 62/73] freeplay state correct mod --- source/funkin/states/FreeplayState.hx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/funkin/states/FreeplayState.hx b/source/funkin/states/FreeplayState.hx index 6ce04bc..14b2492 100644 --- a/source/funkin/states/FreeplayState.hx +++ b/source/funkin/states/FreeplayState.hx @@ -20,7 +20,6 @@ class FreeplayState extends FunkinState { var _hasUnknown:Bool = false; override public function create() { - Mods.currentMod = null; super.create(); playMusic(MainMenuState.menuMusic); @@ -161,6 +160,8 @@ class FreeplayState extends FunkinState { var content:String = File.getContent(path); var levels:LevelsData = TJSON.parse(content); for (song in levels.songList) { + Mods.currentMod = mod; + if (song.showOnFreeplay != null && !song.showOnFreeplay) continue; var i:Int = items.length - 1; var item:SongItem = new SongItem(0, 0, song.displayName, song.icon); @@ -191,6 +192,8 @@ class FreeplayState extends FunkinState { } catch (e:haxe.Exception) { Log.error('error loading level @ "$path" -> ${e.details()}'); } + + Mods.currentMod = null; } public function loadVariation(name:String, ?mod:String) { try { From 2935ab43e86e00906bc6bff9773e5a5ebc88870f Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Wed, 4 Jun 2025 15:20:54 -0600 Subject: [PATCH 63/73] relocate discord rpc --- source/Main.hx | 6 ++--- source/funkin/backend/{ => api}/DiscordRpc.hx | 21 ++++++++++------ source/funkin/states/FreeplayState.hx | 4 ++-- source/funkin/states/MainMenuState.hx | 4 ++-- source/funkin/states/ModMenuState.hx | 4 ++-- source/funkin/states/OptionsState.hx | 4 ++-- source/funkin/states/PlayState.hx | 24 +++++++++---------- source/funkin/states/TitleState.hx | 4 ++-- source/import.hx | 2 +- 9 files changed, 40 insertions(+), 33 deletions(-) rename source/funkin/backend/{ => api}/DiscordRpc.hx (86%) diff --git a/source/Main.hx b/source/Main.hx index 0d9e103..47143fd 100644 --- a/source/Main.hx +++ b/source/Main.hx @@ -28,7 +28,7 @@ class Main extends openfl.display.Sprite { Mods.refresh(); HScript.init(); - DiscordRPC.prepare(); + DiscordRpc.prepare(); var game:FunkinGame = new FunkinGame(0, 0, funkin.states.TitleState); addChild(game); @@ -37,11 +37,11 @@ class Main extends openfl.display.Sprite { FlxG.maxElapsed = 1; FlxG.drawFramerate = 144; FlxG.updateFramerate = 144; - FlxG.signals.postUpdate.add(() -> DiscordRPC.update()); + FlxG.signals.postUpdate.add(() -> DiscordRpc.update()); showWatermark = true; - DiscordRPC.presence.largeImageText = 'FUNKINX3 $engineVersion'; + DiscordRpc.presence.largeImageText = 'FUNKINX3 $engineVersion'; openfl.Lib.current.loaderInfo.uncaughtErrorEvents.addEventListener(openfl.events.UncaughtErrorEvent.UNCAUGHT_ERROR, CrashState.handleUncaughtError); #if cpp untyped __global__.__hxcpp_set_critical_error_handler((error) -> throw error); diff --git a/source/funkin/backend/DiscordRpc.hx b/source/funkin/backend/api/DiscordRpc.hx similarity index 86% rename from source/funkin/backend/DiscordRpc.hx rename to source/funkin/backend/api/DiscordRpc.hx index e13a0ca..32b3883 100644 --- a/source/funkin/backend/DiscordRpc.hx +++ b/source/funkin/backend/api/DiscordRpc.hx @@ -1,4 +1,4 @@ -package funkin.backend; +package funkin.backend.api; #if hxdiscord_rpc import hxdiscord_rpc.Discord; @@ -6,7 +6,7 @@ import hxdiscord_rpc.Types; import sys.thread.Thread; #end -class DiscordRPC { +class DiscordRpc { public static var supported(default, never):Bool = #if hxdiscord_rpc true #else false #end; public static var dirty:Bool = false; @@ -15,6 +15,8 @@ class DiscordRPC { public static var details(default, set):String = ''; public static var state(default, set):String = ''; + + static var success:Null = false; static function set_details(newDetails:String):String { if (details == newDetails) return newDetails; @@ -89,15 +91,16 @@ class DiscordRPC { private static function onReady(request:cpp.RawConstPointer):Void { final username:String = request[0].username; - final globalName:String = request[0].username; final discriminator:Int = Std.parseInt(request[0].discriminator); if (discriminator != 0) { - Log.info('Discord: connected to user $username#$discriminator ($globalName)!'); + Log.info('discord: connected to user @$username#$discriminator ($username)!'); } else { - Log.info('Discord: connected to user @$username ($globalName)!'); + Log.info('discord: connected to user @$username ($username)!'); } + success = true; + var gitButton:DiscordButton = new DiscordButton(); gitButton.url = 'https://github.com/inky03/FUNKINX3'; gitButton.label = 'On GitHub'; @@ -107,10 +110,14 @@ class DiscordRPC { refresh(); } private static function onDisconnected(errorCode:Int, message:cpp.ConstCharStar):Void { - Log.info('Discord: disconnected ($errorCode:$message)'); + if (success != null) + Log.info('discord: disconnected (code $errorCode -> $message)'); + success = null; } private static function onError(errorCode:Int, message:cpp.ConstCharStar):Void { - Log.error('Discord: $errorCode:$message'); + if (success != false) + Log.error('discord: error (code $errorCode)... -> $message'); + success = false; } #else public static var presence:Dynamic = {}; diff --git a/source/funkin/states/FreeplayState.hx b/source/funkin/states/FreeplayState.hx index 14b2492..53e9fd8 100644 --- a/source/funkin/states/FreeplayState.hx +++ b/source/funkin/states/FreeplayState.hx @@ -60,8 +60,8 @@ class FreeplayState extends FunkinState { Main.showWatermark = true; - DiscordRPC.presence.details = 'Navigating freeplay'; - DiscordRPC.dirty = true; + DiscordRpc.presence.details = 'Navigating freeplay'; + DiscordRpc.dirty = true; } override public function update(elapsed:Float) { diff --git a/source/funkin/states/MainMenuState.hx b/source/funkin/states/MainMenuState.hx index efb0018..0303d33 100644 --- a/source/funkin/states/MainMenuState.hx +++ b/source/funkin/states/MainMenuState.hx @@ -43,8 +43,8 @@ class MainMenuState extends FunkinState { select(); FlxG.camera.snapToTarget(); - DiscordRPC.presence.details = 'In the main menu'; - DiscordRPC.dirty = true; + DiscordRpc.presence.details = 'In the main menu'; + DiscordRpc.dirty = true; Paths.clean(); } diff --git a/source/funkin/states/ModMenuState.hx b/source/funkin/states/ModMenuState.hx index 821bc3e..ea675d9 100644 --- a/source/funkin/states/ModMenuState.hx +++ b/source/funkin/states/ModMenuState.hx @@ -77,8 +77,8 @@ class ModMenuState extends FunkinState { } shiftCapsules(); - DiscordRPC.presence.details = 'In the mod menu'; - DiscordRPC.dirty = true; + DiscordRpc.presence.details = 'In the mod menu'; + DiscordRpc.dirty = true; } public function stepHitEvent(step:Int) { diff --git a/source/funkin/states/OptionsState.hx b/source/funkin/states/OptionsState.hx index 3527760..08f23a9 100644 --- a/source/funkin/states/OptionsState.hx +++ b/source/funkin/states/OptionsState.hx @@ -38,8 +38,8 @@ class OptionsState extends FunkinState { Main.showWatermark = true; - DiscordRPC.presence.details = 'Navigating options'; - DiscordRPC.dirty = true; + DiscordRpc.presence.details = 'Navigating options'; + DiscordRpc.dirty = true; } override public function update(elapsed:Float) { diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 77bd3ab..95e1469 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -574,7 +574,7 @@ class PlayState extends FunkinState { if (beat >= 0 && !songStarted) dispatchSongEvent({type: SONG_START}); - if (DiscordRPC.supported && music.playing && DiscordRPC.presence.endTimestamp.toInt() == 0) + if (DiscordRpc.supported && music.playing && DiscordRpc.presence.endTimestamp.toInt() == 0) refreshRPCTime(); if (camZoomRate != null && camZoomRate > 0 && beat % camZoomRate == 0) bopCamera(); @@ -623,32 +623,32 @@ class PlayState extends FunkinState { // TODO: ok, maybe these could be in a single function public function refreshRPCTime() { - if (!DiscordRPC.supported || !autoUpdateRPC) + if (!DiscordRpc.supported || !autoUpdateRPC) return; if (music.playing) { var beginTime:Float = Date.now().getTime() - music.time + audioOffset; var endTime:Float = beginTime + chart.songLength; - DiscordRPC.presence.endTimestamp = Std.int(endTime * .001); - DiscordRPC.presence.startTimestamp = Std.int(beginTime * .001); + DiscordRpc.presence.endTimestamp = Std.int(endTime * .001); + DiscordRpc.presence.startTimestamp = Std.int(beginTime * .001); // trace('PLAYING SONG FROM ' + Std.int(beginTime * .001) + ' to ' + Std.int(endTime * .001)); } else { - DiscordRPC.presence.startTimestamp = DiscordRPC.presence.endTimestamp = 0; + DiscordRpc.presence.startTimestamp = DiscordRpc.presence.endTimestamp = 0; } - DiscordRPC.dirty = true; + DiscordRpc.dirty = true; } public function refreshRPCTitle() { - if (!DiscordRPC.supported || !autoUpdateRPC) + if (!DiscordRpc.supported || !autoUpdateRPC) return; var detailsText:String = '${chart.name} on ${chart.difficulty.toUpperCase()}'; if (paused) detailsText += ' (Paused)'; - DiscordRPC.details = detailsText; + DiscordRpc.details = detailsText; refreshRPCDetails(); } public function refreshRPCDetails() { - if (!DiscordRPC.supported || !autoUpdateRPC) + if (!DiscordRpc.supported || !autoUpdateRPC) return; var detailsString:String; @@ -675,7 +675,7 @@ class PlayState extends FunkinState { detailsString = ''; } - DiscordRPC.state = detailsString; + DiscordRpc.state = detailsString; } inline public function dispatchSongEvent(e:SongEvent) dispatchPlayEvent('songEvent', e); @@ -972,8 +972,8 @@ class PlayState extends FunkinState { Paths.library = ''; funkin.backend.play.NoteStyle.wipe(); - DiscordRPC.details = DiscordRPC.state = ''; - DiscordRPC.presence.startTimestamp = DiscordRPC.presence.endTimestamp = 0; + DiscordRpc.details = DiscordRpc.state = ''; + DiscordRpc.presence.startTimestamp = DiscordRpc.presence.endTimestamp = 0; FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPressEvent); FlxG.stage.removeEventListener(KeyboardEvent.KEY_UP, keyReleaseEvent); conductorInUse.paused = false; diff --git a/source/funkin/states/TitleState.hx b/source/funkin/states/TitleState.hx index 6f7aa7c..cd44d0e 100644 --- a/source/funkin/states/TitleState.hx +++ b/source/funkin/states/TitleState.hx @@ -128,8 +128,8 @@ class TitleState extends FunkinState { showTitleScreen(true); } - DiscordRPC.presence.details = 'In the title screen'; - DiscordRPC.dirty = true; + DiscordRpc.presence.details = 'In the title screen'; + DiscordRpc.dirty = true; enter.color = enterColors[enterColorIndex ++]; } diff --git a/source/import.hx b/source/import.hx index 296d484..9db2dca 100644 --- a/source/import.hx +++ b/source/import.hx @@ -47,5 +47,5 @@ import funkin.backend.rhythm.*; import funkin.backend.Mods; import funkin.backend.Paths; -import funkin.backend.DiscordRpc; +import funkin.backend.api.DiscordRpc; #end \ No newline at end of file From 32576e9301a5179b9d5f4b0bdb3a25fa3c4751ce Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Mon, 16 Jun 2025 22:02:42 -0600 Subject: [PATCH 64/73] Update Chart.hx update legacy tempo change parsing --- source/funkin/backend/play/Chart.hx | 35 +++++++++++++++++++---------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/source/funkin/backend/play/Chart.hx b/source/funkin/backend/play/Chart.hx index 36c6586..25d6a6a 100644 --- a/source/funkin/backend/play/Chart.hx +++ b/source/funkin/backend/play/Chart.hx @@ -285,8 +285,9 @@ class Chart { var ms:Float = 0; var beat:Float = 0; - var sectionNumerator:Float = 0; - var osectionNumerator:Float = 0; + + var numerator:Int = 0; + var onumerator:Int = 0; var bpm:Float = song.initialBpm; var crochet:Float = 60000 / song.initialBpm; @@ -323,22 +324,32 @@ class Chart { } var sectionDenominator:Int = 4; - var sectionNumerator:Null = section.sectionBeats; - if (sectionNumerator == null) sectionNumerator = section.lengthInSteps * .25; - if (sectionNumerator == null) sectionNumerator = 4; + var sectionNumerator:Null = section.sectionBeats ?? ((section?.lengthInSteps ?? 16) * .25); while (sectionNumerator % 1 > 0 && sectionDenominator < 32) { sectionNumerator *= 2; sectionDenominator *= 2; } - var changeSign:Bool = (sectionNumerator != osectionNumerator); - if (section.changeBPM || changeSign) { - osectionNumerator = sectionNumerator; - if (section.changeBPM) bpm = section.bpm; - crochet = 60000 / bpm / sectionDenominator * 4; + numerator = Std.int(sectionNumerator); + + var changeTempo:Bool = false; + var newSign:TimeSignature = null; + + if (numerator != onumerator) { + newSign = new TimeSignature(Math.ceil(numerator), sectionDenominator); + onumerator = numerator; + changeTempo = true; + } + if (section.changeBPM) { + bpm = section.bpm; + changeTempo = true; + } + + if (changeTempo) { + crochet = (60000 / bpm / sectionDenominator * 4); stepCrochet = crochet * .25; - - song.tempoChanges.push(new TempoChange(beat, section.changeBPM ? section.bpm : null, changeSign ? new TimeSignature(Std.int(sectionNumerator), sectionDenominator) : null)); + song.tempoChanges.push(new TempoChange(beat, section.changeBPM ? bpm : null, newSign)); } + beat += sectionNumerator; ms += sectionNumerator * crochet; From e18b6982ef183189267afa0a9b5235157218763f Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Mon, 16 Jun 2025 22:03:19 -0600 Subject: [PATCH 65/73] fix broken tempo change copying --- source/funkin/backend/rhythm/Metronome.hx | 2 +- source/funkin/backend/rhythm/TempoChange.hx | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/source/funkin/backend/rhythm/Metronome.hx b/source/funkin/backend/rhythm/Metronome.hx index 33e1f84..bc6d89c 100644 --- a/source/funkin/backend/rhythm/Metronome.hx +++ b/source/funkin/backend/rhythm/Metronome.hx @@ -169,7 +169,7 @@ class Metronome { public function copyTempoChanges(copyChanges:Array):Array { tempoChanges.resize(0); for (change in copyChanges) { - var newChange:TempoChange = new TempoChange(change.beatTime, change.bpm, new TimeSignature().copyFrom(change.timeSignature)); + var newChange:TempoChange = new TempoChange(change.beatTime, change.bpm, change.timeSignature?.clone()); tempoChanges.push(newChange); } return tempoChanges; diff --git a/source/funkin/backend/rhythm/TempoChange.hx b/source/funkin/backend/rhythm/TempoChange.hx index 4876ccc..7df1d2c 100644 --- a/source/funkin/backend/rhythm/TempoChange.hx +++ b/source/funkin/backend/rhythm/TempoChange.hx @@ -59,6 +59,9 @@ class TimeSignature { //should this be a class? denominator = sign.denominator; return this; } + public function clone():TimeSignature { + return new TimeSignature(numerator, denominator); + } public function toString():String { return '$numerator/$denominator'; } From 20aca1dd7d589029d72b05b6daa12b9771fcc22c Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 19 Jul 2025 01:21:55 -0600 Subject: [PATCH 66/73] um.. a lot ? and FunkinText most importantly + FunkinSprite now supports shear/skew (or custom matrix), based on flixel-addons. works with offsets + fixed freeplaystate bug lmao + Stage class improvement (should probs make it easier to make stage changing !) + the fabled FunkinText + HScript and HScripts (now HScriptGroup) are now flxbasic and flxtypedgroup (awesome) + extraData is now available in all flxbasic + popCover bool in note event + other mini changes --- source/funkin/backend/FunkinAnimate.hx | 44 +++- source/funkin/backend/FunkinSprite.hx | 87 +++---- source/funkin/backend/FunkinSpriteGroup.hx | 68 ++---- source/funkin/backend/FunkinState.hx | 26 +-- source/funkin/backend/FunkinText.hx | 142 ++++++++++++ source/funkin/backend/play/NoteEvent.hx | 7 +- source/funkin/backend/scripting/HScript.hx | 217 +++++++++++------- .../{HScripts.hx => HScriptGroup.hx} | 113 +++++---- source/funkin/backend/scripting/ModInterp.hx | 8 +- source/funkin/macros/FunkinMacro.hx | 46 +++- source/funkin/objects/Character.hx | 29 ++- source/funkin/objects/CharacterGroup.hx | 4 + source/funkin/objects/Stage.hx | 133 ++++++----- source/funkin/objects/play/Lane.hx | 9 +- source/funkin/objects/play/Note.hx | 35 +-- source/funkin/states/FreeplayState.hx | 2 + source/funkin/states/PlayState.hx | 9 +- source/import.hx | 1 + 18 files changed, 624 insertions(+), 356 deletions(-) create mode 100644 source/funkin/backend/FunkinText.hx rename source/funkin/backend/scripting/{HScripts.hx => HScriptGroup.hx} (58%) diff --git a/source/funkin/backend/FunkinAnimate.hx b/source/funkin/backend/FunkinAnimate.hx index e1f3b19..364eb89 100644 --- a/source/funkin/backend/FunkinAnimate.hx +++ b/source/funkin/backend/FunkinAnimate.hx @@ -1,9 +1,11 @@ package funkin.backend; import openfl.Assets; +import openfl.geom.Matrix; import openfl.display.BlendMode; import openfl.geom.ColorTransform; import flixel.math.FlxMatrix; +import flixel.util.FlxDestroyUtil; import flixel.graphics.frames.FlxFrame; import flxanimate.zip.Zip; import flxanimate.animate.*; @@ -16,12 +18,18 @@ import flixel.graphics.frames.FlxFramesCollection; using StringTools; -class FunkinAnimate extends FlxAnimate implements funkin.backend.FunkinSprite.IZoomFactor { // this is kind of useless, but pop off +class FunkinAnimate extends FlxAnimate implements funkin.backend.FunkinSprite.IFunkinSpriteVars { // this is kind of useless, but pop off public var funkAnim:FunkinAnimateAnim; public var zoomFactor(default, set):Float = 1; public var initialZoom(default, set):Float = 1; + public var transformMatrix(default, null):Matrix = new Matrix(); + public var skew(default, null):FlxPoint = FlxPoint.get(); + public var matrixExposed:Bool = false; + + var _skewMatrix:Matrix = new Matrix(); + public function new(x:Float = 0, y:Float = 0, ?path:String, ?settings:flxanimate.Settings) { super(x, y); @@ -154,6 +162,10 @@ class FunkinAnimate extends FlxAnimate implements funkin.backend.FunkinSprite.IZ } catch (e:Dynamic) { destroyAnim(); } + + skew = FlxDestroyUtil.put(skew); + transformMatrix = null; + _skewMatrix = null; } override function drawLimb(limb:FlxFrame, _matrix:FlxMatrix, ?colorTransform:ColorTransform = null, filterin:Bool = false, ?blendMode:BlendMode, ?scrollFactor:FlxPoint = null, cameras:Array = null) { @@ -178,14 +190,21 @@ class FunkinAnimate extends FlxAnimate implements funkin.backend.FunkinSprite.IZ matrix.translate(-origin.x, -origin.y); matrix.scale(scale.x, scale.y); - - if (bakedRotationAngle <= 0) { - updateTrig(); - - if (angle != 0) - matrix.rotateWithTrig(_cosAngle, _sinAngle); + + if (matrixExposed) { + matrix.concat(transformMatrix); + } else { + if (bakedRotationAngle <= 0) { + updateTrig(); + + if (angle != 0) + matrix.rotateWithTrig(_cosAngle, _sinAngle); + } + + updateSkewMatrix(); + matrix.concat(_skewMatrix); } - + _point.addPoint(origin); } else { matrix.scale(.9, .9); @@ -232,6 +251,15 @@ class FunkinAnimate extends FlxAnimate implements funkin.backend.FunkinSprite.IZ #end } + function updateSkewMatrix():Void { + _skewMatrix.identity(); + + if (skew.x != 0 || skew.y != 0) { + _skewMatrix.b = Math.tan(skew.y / 180 * Math.PI); + _skewMatrix.c = Math.tan(skew.x / 180 * Math.PI); + } + } + function set_zoomFactor(value:Float):Float { return zoomFactor = value; } diff --git a/source/funkin/backend/FunkinSprite.hx b/source/funkin/backend/FunkinSprite.hx index 727b3f4..435dc7e 100644 --- a/source/funkin/backend/FunkinSprite.hx +++ b/source/funkin/backend/FunkinSprite.hx @@ -14,20 +14,20 @@ import flixel.animation.FlxAnimation; import funkin.backend.FunkinAnimate; -class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFactor implements IFunkinSpriteAnim { +class FunkinSprite extends flixel.addons.effects.FlxSkewedSprite implements IFunkinSpriteVars implements IFunkinSpriteAnim { public var onAnimationFrame:FlxTypedSignal String -> Void> = new FlxTypedSignal(); public var onAnimationComplete:FlxTypedSignal Void> = new FlxTypedSignal(); public var onAnimationLoop:FlxTypedSignal Void> = new FlxTypedSignal(); public var currentAnimation(get, never):Null; public var animationList:Map = new Map(); - public var extraData:Map = new Map(); public var offsets:Map = new Map(); public var smooth(default, set):Bool = true; public var spriteOffset:FlxPoint; public var animOffset:FlxPoint; - public var rotateOffsets:Bool = false; + public var rotateOffsets:Bool = true; public var scaleOffsets:Bool = true; + public var skewOffsets:Bool = true; public var zoomFactor(default, set):Float = 1; public var initialZoom(default, set):Float = 1; @@ -40,24 +40,6 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact var _loadedAtlases:Array = []; var _transPoint:FlxPoint; - public function setVar(k:String, v:Dynamic):Dynamic { - if (extraData == null) extraData = new Map(); - extraData.set(k, v); - return v; - } - public function getVar(k:String):Dynamic { - if (extraData == null) return null; - return extraData.get(k); - } - public function hasVar(k:String):Bool { - if (extraData == null) return false; - return extraData.exists(k); - } - public function removeVar(k:String):Bool { - if (extraData == null) return false; - return extraData.remove(k); - } - public function new(x:Float = 0, y:Float = 0, isSmooth:Bool = true) { super(x, y); _transPoint = new FlxPoint(); @@ -89,19 +71,26 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact } } public override function draw() { - transformSpriteOffset(_transPoint); if (renderType == ANIMATEATLAS && animate != null) { + transformSpriteOffset(_transPoint); + + animate.matrixExposed = matrixExposed; + animate.skew.copyFrom(skew); + if (matrixExposed) + animate.transformMatrix.copyFrom(transformMatrix); + + animate.offset.set(_transPoint.x + offset.x, _transPoint.y + offset.y); + animate.scrollFactor.copyFrom(scrollFactor); + animate.origin.copyFrom(origin); + animate.scale.copyFrom(scale); + animate.colorTransform = colorTransform; // lmao animate.antialiasing = antialiasing; - animate.scrollFactor = scrollFactor; animate.initialZoom = initialZoom; animate.zoomFactor = zoomFactor; animate.setPosition(x, y); animate.cameras = cameras; animate.shader = shader; - animate.offset.set(_transPoint.x + offset.x, _transPoint.y + offset.y); - animate.origin = origin; - animate.scale = scale; animate.alpha = alpha; animate.angle = angle; animate.flipX = flipX; @@ -149,7 +138,6 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact camera.copyPixels(_frame, framePixels, _flashRect, _flashPoint, colorTransform, blend, antialiasing); } public override function drawComplex(camera:FlxCamera) { - // todo: implement this in flxsprite instead of funkinsprite? (zoomFactor wont work for flxtexts and such) updateShader(camera); _frame.prepareMatrix(_matrix, FlxFrameAngle.ANGLE_0, checkFlipX(), checkFlipY()); @@ -157,11 +145,18 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact _matrix.translate(-origin.x, -origin.y); _matrix.scale(scale.x, scale.y); - if (bakedRotationAngle <= 0) { - updateTrig(); + if (matrixExposed) { + _matrix.concat(transformMatrix); + } else { + if (bakedRotationAngle <= 0) { + updateTrig(); - if (angle != 0) - _matrix.rotateWithTrig(_cosAngle, _sinAngle); + if (angle != 0) + _matrix.rotateWithTrig(_cosAngle, _sinAngle); + } + + updateSkewMatrix(); + _matrix.concat(_skewMatrix); } transformSpriteOffset(_transPoint); @@ -285,6 +280,7 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact inline public function transformSpriteOffset(point:FlxPoint):FlxPoint { var xP:Float = (spriteOffset.x + animOffset.x) * (scaleOffsets ? scale.x : 1); var yP:Float = (spriteOffset.y + animOffset.y) * (scaleOffsets ? scale.y : 1); + if (rotateOffsets && angle % 360 != 0) { var rad:Float = angle / 180 * Math.PI; var cos:Float = FlxMath.fastCos(rad); @@ -293,6 +289,14 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact } else { point.set(xP, yP); } + + if (skewOffsets && (skew.x != 0 || skew.y != 0)) { + point.set( + point.x + point.y * Math.tan(skew.x / 180 * Math.PI), + point.y + point.x * Math.tan(skew.y / 180 * Math.PI) + ); + } + return point; } @@ -319,16 +323,20 @@ class FunkinSprite extends FlxSprite implements ISpriteVars implements IZoomFact } public override function updateHitbox() { if (isAnimate) { - animate.alpha = .001; + animate.alpha = .0001; animate.draw(); animate.alpha = 1; + width = animate.width * scale.x; height = animate.height * scale.y; + frameWidth = animate.frameWidth; + frameHeight = animate.frameHeight; + + offset.set(-0.5 * (width - frameWidth), -0.5 * (height - frameHeight)); + centerOrigin(); } else { super.updateHitbox(); } - // Sys.println('HITBOX UPDATED $width x $height -> $offset'); - // spriteOffset.set(offset.x / (scaleOffsets ? scale.x : 1), offset.y / (scaleOffsets ? scale.y : 1)); } public function setAnimationOffset(name:String, x:Float = 0, y:Float = 0):FlxPoint { @@ -731,15 +739,8 @@ class FunkinSpriteAnimHandler implements IFlxDestroyable { } } -interface ISpriteVars { - public var extraData:Map; - - public function setVar(k:String, v:Dynamic):Dynamic; - public function getVar(k:String):Dynamic; - public function hasVar(k:String):Bool; - public function removeVar(k:String):Bool; -} -interface IZoomFactor { +interface IFunkinSpriteVars { + public var skew(default, null):FlxPoint; public var zoomFactor(default, set):Float; public var initialZoom(default, set):Float; } diff --git a/source/funkin/backend/FunkinSpriteGroup.hx b/source/funkin/backend/FunkinSpriteGroup.hx index 8d39564..5c275dc 100644 --- a/source/funkin/backend/FunkinSpriteGroup.hx +++ b/source/funkin/backend/FunkinSpriteGroup.hx @@ -1,31 +1,11 @@ package funkin.backend; +import flixel.util.FlxDestroyUtil; import funkin.backend.FunkinSprite; - import haxe.iterators.ArrayKeyValueIterator; typedef FunkinGroup = FunkinTypedGroup; -class FunkinTypedGroup implements ISpriteVars extends FlxTypedGroup { - public var extraData:Map = new Map(); - - public function setVar(k:String, v:Dynamic):Dynamic { - if (extraData == null) extraData = new Map(); - extraData.set(k, v); - return v; - } - public function getVar(k:String):Dynamic { - if (extraData == null) return null; - return extraData.get(k); - } - public function hasVar(k:String):Bool { - if (extraData == null) return false; - return extraData.exists(k); - } - public function removeVar(k:String):Bool { - if (extraData == null) return false; - return extraData.remove(k); - } - +class FunkinTypedGroup extends FlxTypedGroup { public function sortZIndex() { sort(Util.sortZIndex, FlxSort.ASCENDING); } @@ -52,32 +32,23 @@ class FunkinTypedGroup implements ISpriteVars extends FlxTypedGroup< } typedef FunkinSpriteGroup = FunkinTypedSpriteGroup; -class FunkinTypedSpriteGroup implements ISpriteGroup implements ISpriteVars implements IZoomFactor extends FlxTypedSpriteGroup { +class FunkinTypedSpriteGroup implements ISpriteGroup implements IFunkinSpriteVars extends FlxTypedSpriteGroup { + public var skew(default, null):FlxPoint; public var zoomFactor(default, set):Float = 1; public var initialZoom(default, set):Float = 1; - public var extraData:Map = new Map(); - public function setVar(k:String, v:Dynamic):Dynamic { - if (extraData == null) extraData = new Map(); - extraData.set(k, v); - return v; + override function initVars():Void { + skew = new FlxCallbackPoint(skewCallback); + super.initVars(); } - public function getVar(k:String):Dynamic { - if (extraData == null) return null; - return extraData.get(k); - } - public function hasVar(k:String):Bool { - if (extraData == null) return false; - return extraData.exists(k); - } - public function removeVar(k:String):Bool { - if (extraData == null) return false; - return extraData.remove(k); + override public function destroy():Void { + skew = FlxDestroyUtil.destroy(skew); + super.destroy(); } - inline function getFunk(sprite:T):IZoomFactor { - if (Std.isOfType(sprite, IZoomFactor)) - return cast(sprite, IZoomFactor); + inline function getFunk(sprite:T):IFunkinSpriteVars { + if (Std.isOfType(sprite, IFunkinSpriteVars)) + return cast(sprite, IFunkinSpriteVars); return null; } public override function updateHitbox():Void {} @@ -128,7 +99,7 @@ class FunkinTypedSpriteGroup implements ISpriteGroup implements ISp override function preAdd(sprite:T):Void { super.preAdd(sprite); - var funk:IZoomFactor = getFunk(sprite); + var funk:IFunkinSpriteVars = getFunk(sprite); if (funk != null) { funk.zoomFactor = zoomFactor; funk.initialZoom = initialZoom; @@ -138,7 +109,7 @@ class FunkinTypedSpriteGroup implements ISpriteGroup implements ISp function set_zoomFactor(value:Float):Float { for (sprite in members) { if (sprite == null) continue; - var funk:IZoomFactor = getFunk(sprite); + var funk:IFunkinSpriteVars = getFunk(sprite); if (funk != null) funk.zoomFactor = value; } return zoomFactor = value; @@ -146,11 +117,18 @@ class FunkinTypedSpriteGroup implements ISpriteGroup implements ISp function set_initialZoom(value:Float):Float { for (sprite in members) { if (sprite == null) continue; - var funk:IZoomFactor = getFunk(sprite); + var funk:IFunkinSpriteVars = getFunk(sprite); if (funk != null) funk.initialZoom = value; } return initialZoom = value; } + inline function skewCallback(Scale:FlxPoint):Void { + for (sprite in members) { + if (sprite == null) continue; + var funk:IFunkinSpriteVars = getFunk(sprite); + if (funk != null) funk.skew.copyFrom(skew); + } + } public inline function keyValueIterator():ArrayKeyValueIterator { return new ArrayKeyValueIterator(members); } diff --git a/source/funkin/backend/FunkinState.hx b/source/funkin/backend/FunkinState.hx index af86392..79160eb 100644 --- a/source/funkin/backend/FunkinState.hx +++ b/source/funkin/backend/FunkinState.hx @@ -6,7 +6,7 @@ import funkin.backend.rhythm.Conductor; import flixel.util.FlxSignal.FlxTypedSignal; -class FunkinState extends FlxSubState implements funkin.backend.FunkinSprite.ISpriteVars { +class FunkinState extends FlxSubState { public var curBar:Int = -1; public var curBeat:Int = -1; public var curStep:Int = -1; @@ -19,34 +19,15 @@ class FunkinState extends FlxSubState implements funkin.backend.FunkinSprite.ISp public var beatHit:FlxTypedSignal Void> = new FlxTypedSignal(); public var stepHit:FlxTypedSignal Void> = new FlxTypedSignal(); - public var hscripts:HScripts; + public var hscripts:HScriptGroup; static var clearAssetsNow:Bool = false; var firstRun:Bool = true; - public var extraData:Map = new Map(); - public function setVar(k:String, v:Dynamic):Dynamic { - if (extraData == null) extraData = new Map(); - extraData.set(k, v); - return v; - } - public function getVar(k:String):Dynamic { - if (extraData == null) return null; - return extraData.get(k); - } - public function hasVar(k:String):Bool { - if (extraData == null) return false; - return extraData.exists(k); - } - public function removeVar(k:String):Bool { - if (extraData == null) return false; - return extraData.remove(k); - } - public function new() { super(); conductorInUse = Conductor.global; - hscripts = new HScripts([this], ['this' => this]); + add(hscripts = new HScriptGroup([this], ['this' => this])); persistentUpdate = true; } @@ -71,7 +52,6 @@ class FunkinState extends FlxSubState implements funkin.backend.FunkinSprite.ISp override public function destroy() { conductorInUse = null; - hscripts.destroyAll(); super.destroy(); } diff --git a/source/funkin/backend/FunkinText.hx b/source/funkin/backend/FunkinText.hx new file mode 100644 index 0000000..c1937bc --- /dev/null +++ b/source/funkin/backend/FunkinText.hx @@ -0,0 +1,142 @@ +package funkin.backend; + +import openfl.geom.Matrix; +import flixel.util.FlxDestroyUtil; +import flixel.graphics.frames.FlxFrame; + +class FunkinText extends FlxText implements funkin.backend.FunkinSprite.IFunkinSpriteVars { + public var zoomFactor(default, set):Float = 1; + public var initialZoom(default, set):Float = 1; + public var smooth(default, set):Bool = true; + + public var transformMatrix(default, null):Matrix = new Matrix(); + public var skew(default, null):FlxPoint = FlxPoint.get(); + public var matrixExposed:Bool = false; + + public var animOffset:FlxPoint; + public var spriteOffset:FlxPoint; + public var rotateOffsets:Bool = true; + public var scaleOffsets:Bool = true; + public var skewOffsets:Bool = true; + + var _skewMatrix:Matrix = new Matrix(); + var _transPoint:FlxPoint; + + public function new(x:Float = 0, y:Float = 0, fieldWidth:Float = 0, ?text:String, size:Int = 8, isSmooth:Bool = false) { + super(x, y, fieldWidth, text, size); + + _transPoint = new FlxPoint(); + spriteOffset = FlxPoint.get(); + animOffset = FlxPoint.get(); + smooth = isSmooth; + } + public override function destroy() { + _transPoint = FlxDestroyUtil.put(_transPoint); + spriteOffset = FlxDestroyUtil.put(spriteOffset); + animOffset = FlxDestroyUtil.put(animOffset); + super.destroy(); + } + public function setAnimOffset(x:Float = 0, y:Float = 0):Void { + animOffset.set(x, y); + } + + public override function drawSimple(camera:FlxCamera) { + updateShader(camera); + + getScreenPosition(_point, camera).subtractPoint(offset); + if (isPixelPerfectRender(camera)) + _point.floor(); + + _point.copyToFlash(_flashPoint); + camera.copyPixels(_frame, framePixels, _flashRect, _flashPoint, colorTransform, blend, antialiasing); + } + public override function drawComplex(camera:FlxCamera) { + updateShader(camera); + + _frame.prepareMatrix(_matrix, FlxFrameAngle.ANGLE_0, checkFlipX(), checkFlipY()); + + _matrix.translate(-origin.x, -origin.y); + _matrix.scale(scale.x, scale.y); + + if (matrixExposed) { + _matrix.concat(transformMatrix); + } else { + if (bakedRotationAngle <= 0) { + updateTrig(); + + if (angle != 0) + _matrix.rotateWithTrig(_cosAngle, _sinAngle); + } + + updateSkewMatrix(); + _matrix.concat(_skewMatrix); + } + + transformSpriteOffset(_transPoint); + getScreenPosition(_point, camera); + _point.add(-offset.x, -offset.y); + _point.add(-_transPoint.x, -_transPoint.y); + _matrix.translate(_point.x + origin.x, _point.y + origin.y); + + if (isPixelPerfectRender(camera)) { + _matrix.tx = Math.floor(_matrix.tx); + _matrix.ty = Math.floor(_matrix.ty); + } + + FunkinSprite.transformMatrixZoom(_matrix, camera, zoomFactor, initialZoom); + camera.drawPixels(_frame, framePixels, _matrix, colorTransform, blend, antialiasing, shader); + } + + inline function transformSpriteOffset(point:FlxPoint):FlxPoint { + var xP:Float = (spriteOffset.x + animOffset.x) * (scaleOffsets ? scale.x : 1); + var yP:Float = (spriteOffset.y + animOffset.y) * (scaleOffsets ? scale.y : 1); + + if (rotateOffsets && angle % 360 != 0) { + var rad:Float = angle / 180 * Math.PI; + var cos:Float = FlxMath.fastCos(rad); + var sin:Float = FlxMath.fastSin(rad); + point.set(cos * xP - sin * yP, cos * yP + sin * xP); + } else { + point.set(xP, yP); + } + + if (skewOffsets && (skew.x != 0 || skew.y != 0)) { + point.set( + point.x + point.y * Math.tan(skew.x / 180 * Math.PI), + point.y + point.x * Math.tan(skew.y / 180 * Math.PI) + ); + } + + return point; + } + function updateSkewMatrix():Void { + _skewMatrix.identity(); + + if (skew.x != 0 || skew.y != 0) { + _skewMatrix.b = Math.tan(skew.y / 180 * Math.PI); + _skewMatrix.c = Math.tan(skew.x / 180 * Math.PI); + } + } + function updateShader(camera:FlxCamera) { + if (shader == null || !Std.isOfType(shader, FunkinRuntimeShader)) + return; + + var funk:FunkinRuntimeShader = cast shader; + funk.postUpdateView(camera); + funk.postUpdateFrame(frame); + } + public override function isSimpleRenderBlit(?camera:FlxCamera):Bool { + return (zoomFactor == 1 && skew.x == 0 && skew.y == 0 && super.isSimpleRenderBlit(camera)); + } + + function set_smooth(newSmooth:Bool):Bool { + antialiasing = (newSmooth && Options.data.antialiasing); + return (smooth = newSmooth); + } + function set_zoomFactor(value:Float):Float { + return zoomFactor = value; + } + function set_initialZoom(value:Float):Float { + return initialZoom = value; + } +} \ No newline at end of file diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index a6dca2a..8dd3a2f 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -31,6 +31,7 @@ using StringTools; public var doSpark:Bool = false; // many vars... public var doSplash:Bool = false; public var playSound:Bool = false; + public var popCover:Bool = true; public var popRating:Bool = true; public var applyHealth:Bool = false; public var applyRating:Bool = false; @@ -104,7 +105,7 @@ using StringTools; if (note.isHoldNote) { lane.held = true; lane.heldNote = note; - spark = lane.popCover(note); + if (popCover) spark = lane.popCover(note); } else if (animateReceptor && !lane.cpu) { lane.receptor.grayBeat = note.beatTime + .5; } @@ -198,11 +199,11 @@ using StringTools; } if (perfectRelease) { - spark = lane.spark(note, doSpark); + if (popCover) spark = lane.spark(note, doSpark); if (playSound) FunkinSound.playOnce(Paths.sound('gameplay/hitsounds/hitsoundTail'), .7); } else { - spark = lane.spark(note, false); + if (popCover) spark = lane.spark(note, false); if (playSound) FunkinSound.playOnce(Paths.sound('gameplay/hitsounds/hitsoundFail'), .7); } diff --git a/source/funkin/backend/scripting/HScript.hx b/source/funkin/backend/scripting/HScript.hx index 305dad0..afc83c3 100644 --- a/source/funkin/backend/scripting/HScript.hx +++ b/source/funkin/backend/scripting/HScript.hx @@ -1,6 +1,6 @@ package funkin.backend.scripting; -#if ALLOW_SCRIPTS // TODO: make the game actually compile without the define +#if ALLOW_SCRIPTS // TODO: make the game actually compile without this define import funkin.backend.FunkinRuntimeShader; import funkin.backend.scripting.HScriptClasses; @@ -8,6 +8,7 @@ import haxe.PosInfos; import crowplexus.iris.Iris; import crowplexus.iris.IrisConfig; import crowplexus.iris.ErrorSeverity; +import crowplexus.hscript.*; import crowplexus.hscript.Printer; import crowplexus.hscript.Expr.Error as IrisError; @@ -17,14 +18,15 @@ enum HScriptFunctionEnum { STOP; STOPALL; } -class HScript extends Iris { +class HScript extends FlxBasic { public static var staticVariables:Map = []; public static var STOP(default, never):HScriptFunctionEnum = HScriptFunctionEnum.STOP; public static var STOPALL(default, never):HScriptFunctionEnum = HScriptFunctionEnum.STOPALL; @:noReflection public static var defaultVariables:Map = [ - #if hl - 'Math' => HScriptMath, - #end + 'Std' => Std, + 'Math' => #if hl HScriptMath #else Math #end, + 'StringTools' => StringTools, + 'Main' => Main, 'Type' => Type, 'Reflect' => Reflect, @@ -41,6 +43,7 @@ class HScript extends Iris { 'FlxSpriteGroup' => FlxSpriteGroup, 'ShaderFilter' => openfl.filters.ShaderFilter, + 'FunkinText' => funkin.backend.FunkinText, 'FunkinSound' => funkin.backend.FunkinSound, 'FunkinSprite' => funkin.backend.FunkinSprite, 'FunkinCamera' => funkin.backend.FunkinCamera, @@ -77,19 +80,20 @@ class HScript extends Iris { 'experimentalVars' => true ]; + var expr:Expr; + var parser:ModParser; + var interp:ModInterp; + var executed:Bool = false; + public var failed:Bool = false; + public var compiled:Bool = false; + public var interceptArray:Array = null; public var defaultVars:Map = null; public var scriptString(default, set):String = ''; public var scriptPath:Null = null; + public var packageName:String = ''; public var scriptName:String = ''; - public var objExists:Bool = true; - public var compiled:Bool = false; - public var failed:Bool = false; - public var active:Bool = true; - var executed:Bool = false; - var modParser:ModParser; - var modInterp:ModInterp; public static function init() { Iris.logLevel = customLog; @@ -98,14 +102,14 @@ class HScript extends Iris { return (result == STOP || result == STOPALL); } public function new(name:String, code:String, ?interceptArray:Array, ?defaultVars:Map) { - super('', new IrisConfig(name, false, false, [])); + super(); - parser = modParser = new ModParser(); - interp = modInterp = new ModInterp(); - modInterp.hscript = this; - preset(); + parser = new ModParser(); + interp = new ModInterp(); + interp.hscript = this; parser.allowTypes = parser.allowJSON = parser.allowMetadata = true; + preset(); this.interceptArray = interceptArray; this.defaultVars = defaultVars; @@ -114,43 +118,6 @@ class HScript extends Iris { this.scriptString = code; } - function errorCaught(e:Dynamic):Void { - if (Std.isOfType(e, IrisError)) { - var pos:PosInfos = cast {fileName: e.origin, lineNumber: e.line}; - Iris.fatal(Printer.errorToString(e, false), pos); - } else { - var pos:PosInfos = @:privateAccess { cast interp.posInfos(); } - Iris.fatal(Std.string(e), pos); - } - } - public static function customLog(level:ErrorSeverity, x, ?pos:haxe.PosInfos) { - if (pos == null) pos = Iris.getDefaultPos(); - - var out:String = Std.string(x); - if (pos != null && pos.customParams != null) - for (i in pos.customParams) - out += "," + Std.string(i); - - var posPrefix:String = pos.fileName; - if (pos.lineNumber != -1) - posPrefix += ':${pos.lineNumber}'; - - switch (level) { - #if I_AM_BORING_ZZZ - case FATAL: posPrefix = '[ FATAL:$posPrefix ]'; - case ERROR: posPrefix = '[ ERROR:$posPrefix ]'; - case WARN: posPrefix = '[ WARNING:$posPrefix ]'; - default: - #else - case FATAL: posPrefix = Log.colorTag(' FATAL:$posPrefix ', black, brightRed); - case ERROR: posPrefix = Log.colorTag(' ERROR:$posPrefix ', black, red); - case WARN: posPrefix = Log.colorTag(' WARNING:$posPrefix ', black, yellow); - default: posPrefix = Log.colorTag(' $posPrefix ', black, blue); - #end - } - Sys.println('$posPrefix $out'); - } - public function run(?func:String, ?args:Array, safe:Bool = true, forceRun:Bool = false):Any { if (!compiled || failed || (!active && !forceRun)) return null; try { @@ -158,7 +125,7 @@ class HScript extends Iris { if (!executed) execute(); executed = true; - if (safe && !exists(func)) return null; + if (safe && !hasVar(func)) return null; var result:IrisCall = call(func, args); return result?.returnValue ?? null; } else { @@ -173,28 +140,27 @@ class HScript extends Iris { return null; } } - public function kill() { - if (active) { + public override function kill():Void { + if (alive) run('kill', true, true); - active = false; - } + + super.kill(); } - public function revive() { - if (!active) { + public override function revive():Void { + if (!alive) run('revive', true, true); - active = true; - } + + super.revive(); } - public override function destroy() { - if (objExists) { + public override function destroy():Void { + if (exists) run('destroy', true, true); - objExists = false; - super.destroy(); - } + + interp = null; + parser = null; + super.destroy(); } - public override function preset() { - super.preset(); - + public function preset():Void { for (field => val in defaultVariables) set(field, val); @@ -207,31 +173,124 @@ class HScript extends Iris { #if hscriptPos set('trace', Reflect.makeVarArgs(function(x:Array) { // fix static trace - var pos = this.interp != null ? this.interp.posInfos() : Iris.getDefaultPos(this.name); + @:privateAccess var pos = (interp != null ? this.interp.posInfos() : Iris.getDefaultPos(scriptName)); + var v = x.shift(); - if (x.length > 0) - pos.customParams = x; - var str:String = Std.string(v); - Iris.print(str, pos); + if (x.length > 0) pos.customParams = x; + + Iris.print(Std.string(v), pos); })); #end } + public function parse(string:String, force:Bool = false) { + if (force || expr == null) + expr = parser.parseString(string, scriptName); + return expr; + } + public function execute():Dynamic { + packageName = parser.packageName; + return interp.execute(expr); + } + public function set(name:String, value:Dynamic, allowOverride:Bool = true):Void { + if (allowOverride || !hasVar(name)) + setVar(name, value); + } + public function call(fun:String, ?args:Array):IrisCall { + var ny:Dynamic = getVar(fun); // function signature + var isFunction:Bool = false; + + try { + isFunction = (ny != null && Reflect.isFunction(ny)); + if (!isFunction) throw 'Tried to call a non-function, for "$fun"'; + + final ret = Reflect.callMethod(null, ny, args ?? []); + return {funName: fun, signature: ny, returnValue: ret}; + } + + #if hscriptPos + catch (e:Expr.Error) { + Iris.error(Printer.errorToString(e, false), this.interp.posInfos()); + } + #end + catch (e:haxe.Exception) { + @:privateAccess var pos = (isFunction ? this.interp.posInfos() : Iris.getDefaultPos(scriptName)); + Iris.error( + Std.string(e) + #if IRIS_DEBUG + "\n" + CallStack.toString(CallStack.exceptionStack(true)) #end, + pos + ); + } + + return null; + } + + public override function setVar(name:String, value:Dynamic):Dynamic { + interp.variables.set(name, value); + return value; + } + public override function getVar(name:String):Dynamic { + return interp.variables.get(name); + } + public override function removeVar(name:String):Void { + interp.variables.remove(name); + } + public override function hasVar(name:String):Bool { + return interp.variables.exists(name); + } + function set_scriptString(newCode:String):String { if (newCode == scriptString) return scriptString; - scriptCode = newCode; failed = false; try { - parse(true); - compiled = true; + parse(newCode, true); executed = false; + compiled = true; } catch (e:IrisError) { compiled = false; errorCaught(e); } + return scriptString = newCode; } + + function errorCaught(e:Dynamic):Void { + if (Std.isOfType(e, IrisError)) { + var pos:PosInfos = cast {fileName: e.origin, lineNumber: e.line}; + Iris.fatal(Printer.errorToString(e, false), pos); + } else { + var pos:PosInfos = @:privateAccess { cast interp.posInfos(); } + Iris.fatal(Std.string(e), pos); + } + } + public static function customLog(level:ErrorSeverity, x, ?pos:haxe.PosInfos) { + @:privateAccess if (pos == null) pos = Iris.getDefaultPos(); + + var out:String = Std.string(x); + if (pos != null && pos.customParams != null) + for (i in pos.customParams) + out += ',$i'; + + var posPrefix:String = pos.fileName; + if (pos.lineNumber != -1) + posPrefix += ':${pos.lineNumber}'; + + switch (level) { + #if I_AM_BORING_ZZZ + case FATAL: posPrefix = '[ FATAL:$posPrefix ]'; + case ERROR: posPrefix = '[ ERROR:$posPrefix ]'; + case WARN: posPrefix = '[ WARNING:$posPrefix ]'; + default: + #else + case FATAL: posPrefix = Log.colorTag(' FATAL:$posPrefix ', black, brightRed); + case ERROR: posPrefix = Log.colorTag(' ERROR:$posPrefix ', black, red); + case WARN: posPrefix = Log.colorTag(' WARNING:$posPrefix ', black, yellow); + default: posPrefix = Log.colorTag(' $posPrefix ', black, blue); + #end + } + Sys.println('$posPrefix $out'); + } } #else class HScript {} diff --git a/source/funkin/backend/scripting/HScripts.hx b/source/funkin/backend/scripting/HScriptGroup.hx similarity index 58% rename from source/funkin/backend/scripting/HScripts.hx rename to source/funkin/backend/scripting/HScriptGroup.hx index 32e5727..880d48c 100644 --- a/source/funkin/backend/scripting/HScripts.hx +++ b/source/funkin/backend/scripting/HScriptGroup.hx @@ -4,58 +4,52 @@ using StringTools; using Lambda; typedef HScriptAsset = flixel.util.typeLimit.OneOfTwo; -class HScripts { // todo: make this a flxtypedgroup? + +class HScriptGroup extends FlxTypedGroup { public var interceptArray:Array; public var defaultVars:Map; - public var activeScripts:Array = []; - public function new(?interceptArray:Array, ?defaultVars:Map) { + super(); this.interceptArray = interceptArray; this.defaultVars = defaultVars; } public function find(test:HScriptAsset):HScript { if (Std.isOfType(test, HScript)) { - return activeScripts.contains(test) ? test : null; + return (members.contains(test) ? test : null); } else { - return activeScripts.find((hscript:HScript) -> hscript.scriptName == test); + return members.find((hscript:HScript) -> hscript.scriptName == test); } } - public function exists(test:HScriptAsset):Bool { + public function scriptExists(test:HScriptAsset):Bool { return (find(test) != null); } public function findFromSuffix(test:String):HScript { - return activeScripts.find((hscript:HScript) -> hscript.scriptName.endsWith(test)); - } - public function add(hscript:HScript):Void { - if (!activeScripts.contains(hscript)) activeScripts.push(hscript); + return members.find((hscript:HScript) -> (hscript.exists && hscript.scriptName.endsWith(test))); } - public function destroy(?hscript:HScript):Void { + public function destroyScript(?hscript:HScript):Void { if (hscript == null) return; - if (activeScripts.contains(hscript)) - activeScripts.remove(hscript); hscript.destroy(); + remove(hscript); + cleanup(); } - public function kill():Void { - for (hscript in activeScripts) - hscript.kill(); - } - public function revive():Void { - for (hscript in activeScripts) - hscript.revive(); - } - public function destroyAll():Void { - while (activeScripts.length > 0) - destroy(activeScripts[0]); + public function destroyScripts():Void { + while (members.length > 0) + destroyScript(members.shift()); } public function set(field:String, value:Any):Void { - for (hscript in activeScripts) + for (hscript in members) { + if (!hscript.exists) continue; + hscript.set(field, value); + } } public function run(?name:String, ?args:Array):Any { var returnLocked:Bool = false; var returnValue:Dynamic = null; - for (hscript in activeScripts) { + for (hscript in members) { + if (!hscript.exists) continue; + var result:Dynamic = hscript.run(name, args, true); switch (result) { case null: // dont change return value to null @@ -71,25 +65,49 @@ class HScripts { // todo: make this a flxtypedgroup? } return returnValue; } + public function concat(group:Dynamic) { + if (Std.isOfType(group, HScriptGroup)) { + for (script in cast(group, HScriptGroup).members) + add(script); + } else if (Std.isOfType(group, Array)) { + var array:Array = cast group; + for (script in array) + add(script); + } else { + throw 'Invalid type'; + } + } + public override function destroy():Void { + destroyScripts(); + super.destroy(); + } function getScriptName(name:String, unique:Bool = false, warn:Bool = false):String { var found:HScript = find(name); if (found != null && unique) { var n:Int = 1; - while (exists('${name}_$n')) n ++; + while (scriptExists('${name}_$n')) n ++; name = '${name}_$n'; } return name; } + function cleanup():Void { + while (true) { + var deadScript:HScript = members.find((hscript:HScript) -> !hscript.exists); + if (deadScript == null) return; + else remove(deadScript, true); + } + } - public function loadFromString(code:String, ?name:String):Null { + public function loadFromString(code:String, ?name:String):HScript { name ??= 'hscript'; - if (exists(name)) { + if (scriptExists(name)) { Log.warning('hscript @ "$name" is already active!'); name = getScriptName(name, true); Log.minor('using name "$name"...'); } - + + cleanup(); var hs:HScript = new HScript(name, code, interceptArray, defaultVars); if (hs.compiled) { Log.info('hscript "$name" loaded successfully!'); @@ -101,8 +119,8 @@ class HScripts { // todo: make this a flxtypedgroup? return null; } } - public function loadFromFile(file:String, unique:Bool = false, ?newName:String, ?defaultVars:Map):Null { - if (exists(newName ?? file) && !unique) { + public function loadFromFile(file:String, unique:Bool = false, ?newName:String, ?defaultVars:Map):HScript { + if (scriptExists(newName ?? file) && !unique) { Log.warning('hscript @ "$file" is already active!'); return find(file); } @@ -122,6 +140,8 @@ class HScripts { // todo: make this a flxtypedgroup? for (k => v in this.defaultVars) defaultestVars.set(k, v); } + + cleanup(); var hs:HScript = new HScript(name, code, interceptArray, defaultestVars); if (hs.compiled) { Log.info('hscript @ "$file" loaded successfully!'); @@ -133,30 +153,43 @@ class HScripts { // todo: make this a flxtypedgroup? return null; } } - public function loadFromFolder(path:String, allMods:Bool = false, ?defaultVars:Map):Void { + public function loadFromFolder(path:String, allMods:Bool = false, ?defaultVars:Map):Array { var dirList:Array = [Paths.sharedPath(path), Paths.globalModPath(path)]; + var loaded:Array = []; for (mod in Mods.getLocal(allMods)) { dirList.push(Paths.modPath(path, mod.directory)); } + for (dir in dirList) { if (FileSystem.exists(dir)) { Log.minor('loading hscripts @ "$dir"'); for (file in FileSystem.readDirectory(dir)) { if (!file.endsWith('.hx')) continue; - loadFromFile('$dir/$file', defaultVars); + + var script:HScript = loadFromFile('$dir/$file', defaultVars); + if (script != null) loaded.push(script); } } } + + return loaded; } - public function loadFromPaths(basePath:String, allMods:Bool = false, unique:Bool = false, ?defaultVars:Map):Bool { - var found:Bool = false; + public function loadFromPaths(basePath:String, allMods:Bool = false, unique:Bool = false, ?defaultVars:Map):Array { + var loaded:Array = []; + for (path in Paths.getPaths(basePath, true, allMods)) { var scriptFile:String = path.path; - if (exists(scriptFile) && !unique) continue; - loadFromFile(scriptFile, unique, defaultVars); - found = true; + if (!scriptFile.endsWith('.hx')) continue; + if (!unique && scriptExists(scriptFile)) continue; + + var script:HScript = loadFromFile(scriptFile, unique, defaultVars); + if (script != null) loaded.push(script); } - return found; + + return loaded; } + + @:deprecated('activeScripts is deprecated, use members instead!') public var activeScripts(get, null):Array; + function get_activeScripts():Array { return members; } } \ No newline at end of file diff --git a/source/funkin/backend/scripting/ModInterp.hx b/source/funkin/backend/scripting/ModInterp.hx index 71463c6..7e1e4a8 100644 --- a/source/funkin/backend/scripting/ModInterp.hx +++ b/source/funkin/backend/scripting/ModInterp.hx @@ -72,10 +72,10 @@ class ModInterp extends Interp { error(EInvalidAccess(f)); if (variables.get('experimentalVars') == true) { - if (Std.isOfType(o, ISpriteVars)) { - var spr:ISpriteVars = cast o; - if (o.hasVar(f)) - return o.getVar(f); + if (Std.isOfType(o, FlxBasic)) { + var basic:FlxBasic = cast o; + if (basic.hasVar(f)) + return basic.getVar(f); } } diff --git a/source/funkin/macros/FunkinMacro.hx b/source/funkin/macros/FunkinMacro.hx index 6f1cdb9..4c1dd01 100644 --- a/source/funkin/macros/FunkinMacro.hx +++ b/source/funkin/macros/FunkinMacro.hx @@ -12,11 +12,12 @@ class FunkinMacro { var fields:Array = Context.getBuildFields(); fields = fields.concat([{ + pos: pos, name: "zIndex", access: [Access.APublic], - kind: FieldType.FProp('default', 'set', macro:Int, macro $v{0}), - pos: pos + kind: FieldType.FProp('default', 'set', macro:Int, macro $v{0}) }, { + pos: pos, name: "set_zIndex", access: [Access.APublic], kind: FieldType.FFun({ @@ -27,7 +28,46 @@ class FunkinMacro { ret: macro:Int, expr: macro { return zIndex = value; } }), - pos: pos + }, { + pos: pos, // extradata stuffs + name: 'extraData', + access: [APublic], + kind: FieldType.FProp('default', 'null', macro:Map, macro $v{[]}) + }, { + pos: pos, + name: 'getVar', + access: [APublic], + kind: FieldType.FFun({ + ret: macro:Dynamic, + args: [{type: macro:String, name: 'id'}], + expr: macro { return extraData.get(id); } + }) + }, { + pos: pos, + name: 'setVar', + access: [APublic], + kind: FieldType.FFun({ + ret: macro:Dynamic, + args: [{type: macro:String, name: 'id'}, {type: macro:Dynamic, name: 'value'}], + expr: macro { extraData.set(id, value); return value; } + }) + }, { + pos: pos, + name: 'removeVar', + access: [APublic], + kind: FieldType.FFun({ + args: [{type: macro:String, name: 'id'}], + expr: macro { extraData.remove(id); } + }) + }, { + pos: pos, + name: 'hasVar', + access: [APublic], + kind: FieldType.FFun({ + ret: macro:Bool, + args: [{type: macro:String, name: 'id'}], + expr: macro { return extraData.exists(id); } + }) }]); return fields; diff --git a/source/funkin/objects/Character.hx b/source/funkin/objects/Character.hx index ec31e45..b3c1dfc 100644 --- a/source/funkin/objects/Character.hx +++ b/source/funkin/objects/Character.hx @@ -2,7 +2,7 @@ package funkin.objects; import funkin.objects.HealthIcon; import funkin.backend.scripting.HScript; -import funkin.backend.scripting.HScripts; +import funkin.backend.scripting.HScriptGroup; using StringTools; @@ -53,7 +53,7 @@ class Character extends FunkinSprite implements ICharacter { public var volume(default, set):Float = 1; public var vocals:FunkinSound; - public var hscripts:HScripts; + public var hscripts:HScriptGroup; var safeH:Null = null; public function new(x:Float, y:Float, ?character:String, side:CharacterSide = IDGAF, ?fallback:String, runScripts:Bool = true) { @@ -63,7 +63,7 @@ class Character extends FunkinSprite implements ICharacter { anim.onComplete.add((anim:String) -> characterGroup?.onAnimationComplete.dispatch(anim)); anim.onLoop.add((anim:String) -> characterGroup?.onAnimationLoop.dispatch(anim)); - hscripts = new HScripts([this], ['this' => this, 'super' => this]); + hscripts = new HScriptGroup([this], ['this' => this, 'super' => this]); rotateOffsets = true; vocals = new FunkinSound(); @@ -253,7 +253,7 @@ class Character extends FunkinSprite implements ICharacter { super.revive(); } public override function destroy() { - hscripts.destroyAll(); + hscripts.destroy(); super.destroy(); } @@ -409,8 +409,8 @@ class Character extends FunkinSprite implements ICharacter { return res; } function functionOverridden(id:String):Bool { - for (script in hscripts.activeScripts) { - if (Reflect.isFunction(script.get(id))) + for (script in hscripts) { + if (Reflect.isFunction(script.getVar(id))) return true; } return false; @@ -574,10 +574,8 @@ class Character extends FunkinSprite implements ICharacter { return; var comboAnim:String = 'combo$combo'; - if (animationExists(comboAnim, true)) { - playAnimationSteps(comboAnim, true); - specialAnim = true; - } + if (animationExists(comboAnim, true)) + playAnimationSpecial(comboAnim, true); } public function playComboDropAnimation(combo:Int) { if (safeH != 'playComboDropAnimation' && functionOverridden('playComboDropAnimation')) { @@ -594,14 +592,12 @@ class Character extends FunkinSprite implements ICharacter { dropAnim = 'drop$count'; } - if (dropAnim != null) { - playAnimationSteps(dropAnim, true); - specialAnim = true; - } + if (dropAnim != null) + playAnimationSpecial(dropAnim, true); } - function get_hasComboAnimations():Bool { return comboNoteCounts.length > 0; } - function get_hasDropAnimations():Bool { return dropNoteCounts.length > 0; } + function get_hasComboAnimations():Bool { return (comboNoteCounts.length > 0); } + function get_hasDropAnimations():Bool { return (dropNoteCounts.length > 0); } function findCountAnimations(prefix:String):Array { var counts:Array = []; @@ -694,6 +690,7 @@ interface ICharacter extends IBopper extends IFunkinSpriteAnim { public function playAnim(anim:String, context:PlayAnimContext = SOFT, forced:Bool = false, reversed:Bool = false, frame:Int = 0, ?time:Float):Void; public function playComboDropAnimation(combo:Int):Void; public function playComboAnimation(combo:Int):Void; + public function idle():Void; } interface IBopper { public var bop(default, set):Bool; diff --git a/source/funkin/objects/CharacterGroup.hx b/source/funkin/objects/CharacterGroup.hx index cadd6c6..9151ee9 100644 --- a/source/funkin/objects/CharacterGroup.hx +++ b/source/funkin/objects/CharacterGroup.hx @@ -338,6 +338,10 @@ class CharacterGroup extends FunkinTypedSpriteGroup implements IChara } return danced; } + public function idle():Void { + for (chara in members) + chara?.idle(); + } public function flip():CharacterGroup { if (side != IDGAF) diff --git a/source/funkin/objects/Stage.hx b/source/funkin/objects/Stage.hx index 1a7abe0..51ffbf4 100644 --- a/source/funkin/objects/Stage.hx +++ b/source/funkin/objects/Stage.hx @@ -1,35 +1,42 @@ package funkin.objects; import funkin.backend.play.Chart; +import funkin.backend.scripting.*; import funkin.objects.CharacterGroup; import funkin.objects.Character; using StringTools; //THIS IS ALL KINDOF A MESS BUT IT WORKS??? I THINK -class Stage extends FunkinGroup { - var chart:Chart; - public var name:String; +class Stage extends FunkinSpriteGroup { + public var stage:String; public var json:Dynamic; public var library:String = ''; public var hasContent:Bool = false; public var stageValid:Bool = false; public var format:StageFormat = NONE; + public var loadCharacters:Bool = true; public var props:Map = new Map(); public var characters:Map = new Map(); - + + public var hscripts:HScriptGroup = new HScriptGroup(); public var zoom:Float = 1; - var state = FlxG.state; + var state:FunkinState; - public function new(?chart:Chart) { + public function new(?stageId:String) { super(); - this.chart = chart; + + this.stage = stageId; + + setup(stageId); + } + public override function destroy():Void { + hscripts.destroy(); + super.destroy(); } - public function setup(?stageId:String, ?chartData:Chart) { - // right now only works with vslice stage jsons - chartData ??= chart; + public function setup(?stageId:String) { if (stageId != null) { Log.minor('loading stage "$stageId"'); @@ -56,25 +63,31 @@ class Stage extends FunkinGroup { } } - // loads hscript file - var state:FunkinState = cast(FlxG.state, FunkinState); - var scriptPath:String = 'scripts/stages/$stageId.hx'; + if (!stageValid) { + Log.warning('no stage content (json or script): loading fallback stage'); + loadFallbackStage(); + } + } + public function addCharacters(?baseChart:Chart):Void { + switch (format) { + case MODERN: + loadModernCharData(json, baseChart); + default: + loadFallbackCharacters(baseChart); + } + } + public function start(state:FunkinState):Void { // runs stage hscript + var scriptPath:String = 'scripts/stages/$stage.hx'; if (Paths.exists(scriptPath)) { - if (state != null) - state.hscripts.loadFromPaths(scriptPath); - hasContent = true; + hscripts.concat(state.hscripts.loadFromPaths(scriptPath)); + hasContent = true; } if (state != null) - state.hscripts.run('setupStage', [stageId, this]); - - if (!stageValid) { - Log.warning('no stage content (json or script): loading fallback stage'); - loadFallback(); - } + state.hscripts.run('setupStage', [stage, this]); } - public function beatHit(beat:Int) { + public function beatHit(beat:Int):Void { for (prop in props) { if (prop != null && prop.alive && prop.exists && Std.isOfType(prop, IBopper)) { var bopper:IBopper = cast prop; @@ -86,24 +99,20 @@ class Stage extends FunkinGroup { chara.dance(beat); } } - public function destroyProps() { - for (prop in props) prop.destroy(); - } - public function getProp(name:String):FunkinSprite { - return props[name]; + return props.get(name); } public function getCharacter(name:String):CharacterGroup { - return characters[name]; + return characters.get(name); } - public function loadModernStageData(data:ModernStageData) { + + function loadModernStageData(data:ModernStageData):Void { library = data.directory ?? data.library ?? ''; Paths.library = library; zoom = data.cameraZoom; for (prop in data.props) { var propSprite:StageProp = new StageProp(); - add(propSprite); propSprite.zIndex = prop.zIndex; propSprite.x = prop.position[0]; propSprite.y = prop.position[1]; @@ -139,62 +148,61 @@ class Stage extends FunkinGroup { if (prop.scale != null) propSprite.scale.set(prop.scale[0], prop.scale[1]); var assetName:String = prop.name ?? prop.assetPath; propSprite.updateHitbox(); + insertZIndex(propSprite); - this.props[assetName] = propSprite; + this.props.set(assetName, propSprite); } - + } + function loadFallbackStage():Void { + var basicBG:StageProp = new StageProp(); + props['basicBG'] = basicBG; + basicBG.loadTexture('bg'); + basicBG.setPosition(-basicBG.width * .5, (FlxG.height - basicBG.height) * .5 + 75); + basicBG.scrollFactor.set(.95, .95); + basicBG.scale.set(2.25, 2.25); + basicBG.zIndex = 0; + add(basicBG); + } + function loadModernCharData(data:ModernStageData, ?chart:Chart):Void { var charas:Dynamic = data.characters; + for (name in Reflect.fields(charas)) { var chara:ModernStageChar = Reflect.field(charas, name); - var char:Null = null; var side:CharacterSide = (switch (name) { case 'bf': RIGHT; case 'gf': IDGAF; default: LEFT; }); - if (chart != null) { - char = Reflect.field(chart, switch (name) { - case 'bf': 'player1'; - case 'dad': 'player2'; - case 'gf': 'player3'; - default: name; - }); - } + var char:Null = (switch (name) { + case 'bf': chart?.player1; + case 'dad': chart?.player2; + case 'gf': chart?.player3; + default: name; + }); var charaGroup:CharacterGroup = new CharacterGroup(chara.position[0], chara.position[1], char, side, name); - add(charaGroup); charaGroup.zIndex = chara.zIndex; charaGroup.stageCameraOffset.set(chara.cameraOffsets[0], chara.cameraOffsets[1]); if (chara.scale != null) charaGroup.scale.set(chara.scale, chara.scale); + insertZIndex(charaGroup); - this.characters[name] = charaGroup; + this.characters.set(name, charaGroup); } } - public function loadFallback() { - var basicBG:StageProp = new StageProp(); - props['basicBG'] = basicBG; - basicBG.loadTexture('bg'); - basicBG.setPosition(-basicBG.width * .5, (FlxG.height - basicBG.height) * .5 + 75); - basicBG.scrollFactor.set(.95, .95); - basicBG.scale.set(2.25, 2.25); - basicBG.zIndex = 0; - add(basicBG); - loadCharactersGeneric(); - } - function loadCharactersGeneric() { + function loadFallbackCharacters(?chart:Chart):Void { var player1:CharacterGroup = new CharacterGroup(400, 750, chart?.player1 ?? 'bf', RIGHT, 'bf'); var player2:CharacterGroup = new CharacterGroup(-400, 750, chart?.player2 ?? 'dad', LEFT, 'dad'); var player3:CharacterGroup = new CharacterGroup(0, 680, chart?.player3 ?? 'gf', IDGAF, 'gf'); player1.zIndex = 300; player2.zIndex = 200; player3.zIndex = 100; - characters['bf'] = player1; - characters['dad'] = player2; - characters['gf'] = player3; - for (chara in [player1, player2, player3]) { - add(chara); - } + characters.set('bf', player1); + characters.set('dad', player2); + characters.set('gf', player3); + + for (chara in characters) + insertZIndex(chara); } } @@ -228,7 +236,6 @@ class StageProp extends FunkinSprite implements IBopper { // maybe unify charact enum StageFormat { MODERN; - PSYCH; NONE; } diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 8b68bf6..f8c3245 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -259,6 +259,7 @@ class Lane extends FunkinSpriteGroup { public function splash(?note:Note):NoteSplash { var splash:NoteSplash = noteSplashes.recycle(NoteSplash, () -> new NoteSplash(noteData, style), true); + preAdd(splash); noteSplashes.moveToTop(splash); splash.reload(note?.style ?? style); splash.popOnReceptor(receptor); @@ -270,6 +271,7 @@ class Lane extends FunkinSpriteGroup { public function popCover(?note:Note):NoteSpark { var spark:NoteSpark = noteSparks.recycle(NoteSpark, () -> new NoteSpark(noteData, style), true); + preAdd(spark); noteSparks.moveToTop(spark); spark.reload(note?.style ?? style); spark.heldNote = note; @@ -376,6 +378,9 @@ class Lane extends FunkinSpriteGroup { } public function insertNote(songNote:ChartNote):Note { var note:Note = generateNote(noteClass, songNote); + preAdd(note); + if (note.tail?.alive) + preAdd(note.tail); notes.moveToBottom(note); note.lane = this; @@ -448,7 +453,7 @@ class Lane extends FunkinSpriteGroup { super.set_zoomFactor(value); for (sprite in topMembers) { if (sprite == null) continue; - var funk:IZoomFactor = getFunk(sprite); + var funk:IFunkinSpriteVars = getFunk(sprite); if (funk != null) funk.zoomFactor = value; } return zoomFactor = value; @@ -457,7 +462,7 @@ class Lane extends FunkinSpriteGroup { super.set_initialZoom(value); for (sprite in topMembers) { if (sprite == null) continue; - var funk:IZoomFactor = getFunk(sprite); + var funk:IFunkinSpriteVars = getFunk(sprite); if (funk != null) funk.initialZoom = value; } return initialZoom = value; diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 1fda1d0..8a06a36 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -15,13 +15,12 @@ import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; using funkin.backend.play.NoteStyle.NoteStyleUtil; -@:structInit class ChartNote implements ISpriteVars implements ITimeSortable { +@:structInit class ChartNote extends FlxBasic implements ITimeSortable { public var laneIndex:Int; public var kind:String = ''; public var msTime:Float = 0; public var msLength:Float = 0; public var strumlineIndex:Int = 0; - public var extraData:Map = null; public inline function copy(?toNote:ChartNote):ChartNote { if (toNote == null) { @@ -36,24 +35,6 @@ using funkin.backend.play.NoteStyle.NoteStyleUtil; } } - public function setVar(k:String, v:Dynamic):Dynamic { - if (extraData == null) extraData = new Map(); - extraData.set(k, v); - return v; - } - public function getVar(k:String):Dynamic { - if (extraData == null) return null; - return extraData.get(k); - } - public function hasVar(k:String):Bool { - if (extraData == null) return false; - return extraData.exists(k); - } - public function removeVar(k:String):Bool { - if (extraData == null) return false; - return extraData.remove(k); - } - function set_kind(v:String):String { return kind = v; } function set_msTime(v:Float):Float { return msTime = v; } function set_msLength(v:Float):Float { return msLength = v; } @@ -602,7 +583,8 @@ class NoteTail extends Note { drawItems = 0; var rad:Float = (Math.PI / 180); - var prevAngle:Float = angle * rad; + var prevAngle:Null = null; + var defaultAngle:Float = angle * rad; var scaleY:Float = (lane?.scale.y ?? scale.y); while (scrollDistance > clipDistance) { @@ -619,8 +601,15 @@ class NoteTail extends Note { var curPosition:FlxPoint = FlxPoint.weak(x, y); if (renderDistance == null || scrollDistance < renderDistance) { - if (adaptiveDirection) angle = (prevPosition.degreesTo(curPosition) + 180); - var radAngle:Float = angle * rad; + var radAngle:Float; + if (adaptiveDirection) { + angle = (prevPosition.degreesTo(curPosition) + 180); + radAngle = angle * rad; + prevAngle ??= radAngle; + } else { + prevAngle ??= defaultAngle; + radAngle = angle * rad; + } var data:NoteTailDrawData = (drawData[drawItems] ?? new NoteTailDrawData()); diff --git a/source/funkin/states/FreeplayState.hx b/source/funkin/states/FreeplayState.hx index 53e9fd8..6af9da8 100644 --- a/source/funkin/states/FreeplayState.hx +++ b/source/funkin/states/FreeplayState.hx @@ -20,6 +20,8 @@ class FreeplayState extends FunkinState { var _hasUnknown:Bool = false; override public function create() { + Mods.currentMod = null; + super.create(); playMusic(MainMenuState.menuMusic); diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 95e1469..760b140 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -30,9 +30,9 @@ class PlayState extends FunkinState { public var simpleBG:FunkinSprite; public var healthBar:Bar; - public var scoreTxt:FlxText; public var iconP1:HealthIcon; public var iconP2:HealthIcon; + public var scoreTxt:FunkinText; public var uiGroup:FunkinSpriteGroup; public var ratingGroup:FunkinTypedSpriteGroup; @@ -255,8 +255,9 @@ class PlayState extends FunkinState { playerStrumline.setPosition(FlxG.width - playerStrumline.width - 50 - 75, strumlineY); if (!simple) { - stage = new Stage(chart); - stage.setup(chart.stage); + stage = new Stage(chart.stage); + stage.addCharacters(chart); + stage.start(this); add(stage); player1 = stage.getCharacter('bf'); @@ -340,7 +341,7 @@ class PlayState extends FunkinState { if (player2 != null) player2.onCharacterChanged.add((name:String, char:Character) -> matchIconData(iconP2, char)); - scoreTxt = new FlxText(0, FlxG.height - 25, FlxG.width, 'Score: idk'); + scoreTxt = new FunkinText(0, FlxG.height - 25, FlxG.width, 'Score: idk'); scoreTxt.setFormat(Paths.ttf('vcr'), 16, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); scoreTxt.y -= scoreTxt.height * .5; scoreTxt.borderSize = 1.25; diff --git a/source/import.hx b/source/import.hx index 9db2dca..b69a0f5 100644 --- a/source/import.hx +++ b/source/import.hx @@ -36,6 +36,7 @@ import funkin.util.*; import funkin.debug.Log; import funkin.backend.Options; import funkin.backend.Controls; +import funkin.backend.FunkinText; import funkin.backend.FunkinSound; import funkin.backend.FunkinState; import funkin.backend.FunkinSprite; From 9fbf61cd9b2672fe1418422695b23410fadbdb2c Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 19 Jul 2025 02:54:31 -0600 Subject: [PATCH 67/73] arrowpath It can be rendered too isnt that cool --- source/funkin/objects/play/ArrowPath.hx | 200 ++++++++++++++++++++++++ source/funkin/objects/play/Lane.hx | 6 + source/funkin/objects/play/Note.hx | 12 +- 3 files changed, 212 insertions(+), 6 deletions(-) create mode 100644 source/funkin/objects/play/ArrowPath.hx diff --git a/source/funkin/objects/play/ArrowPath.hx b/source/funkin/objects/play/ArrowPath.hx new file mode 100644 index 0000000..d625985 --- /dev/null +++ b/source/funkin/objects/play/ArrowPath.hx @@ -0,0 +1,200 @@ +package funkin.objects.play; + +import funkin.objects.play.Lane; +import funkin.objects.play.Note; +import funkin.backend.FunkinStrip; +import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; + +class ArrowPath extends NoteObject { + public var strip:ArrowPathStrip; + public var render:Bool = true; + + public var thickness(get, set):Float; + public var multAlpha:Float = 1; + + public var adaptiveDirection:Bool = false; + public var minDistance:Float = -180; + public var maxDistance:Float = 720; + public var steps:Float = 44; + + var drawData:Array = []; + var drawItems:Int = 0; + + public function new(lane:Lane) { + super(); + + this.strip = new ArrowPathStrip(); + this.laneIndex = lane.noteData; + this.lane = lane; + } + public function copyReceptor(receptor:Receptor) { + if (receptor == null) return; + + scrollPosition.set(receptor.x + receptor.width * .5, receptor.y + receptor.height * .5); + angle = direction + (receptor.lane.direction ?? 0); + alpha = receptor.alpha * multAlpha; + visible = receptor.visible; + } + public override function update(elapsed:Float):Void { + super.update(elapsed); + strip.update(elapsed); + } + public override function draw():Void { + copyReceptor(lane?.receptor); + + if (!visible || !render || alpha <= 0) return; + + updateTriangles(lane); + for (camera in getCamerasLegacy()) { + if (!camera.visible || !camera.exists) continue; + + drawComplex(camera); + + #if FLX_DEBUG FlxBasic.visibleCount++; #end + } + } + + public override function drawComplex(camera:FlxCamera):Void { + updateShader(camera); + + for (i in 0 ... drawItems) { + var data:NoteTailDrawData = drawData[i]; + var strip:ArrowPathStrip = data.strip; + strip.updateRender(data); + strip.draw(); + } + } + public function updateTriangles(lane:Lane):Void { + if (steps < 5) { + Log.warning('$steps px/step for arrow path is too low !!'); + steps = 5; + } + + var modchartFunc = (customModchart ?? genericModchart); + + var scrollDistance:Float = minDistance; + try { + (customScrollDistance ?? genericScrollDistance)(this, lane, 0); // error check + if (updateModchart) + modchartFunc(this, lane, minDistance); + } catch (e:haxe.Exception) { + Log.error('error on path modchart function -> ${e.details()}'); + + customModchart = null; + customScrollDistance = null; + modchartFunc = genericModchart; + + if (updateModchart) + genericModchart(this, lane, minDistance); + } + + drawItems = 0; + var rad:Float = (Math.PI / 180); + var prevAngle:Null = null; + var defaultAngle:Float = angle * rad; + + while (scrollDistance < maxDistance) { + var prevScale:FlxPoint = FlxPoint.weak(scale.x, scale.y); + var prevPosition:FlxPoint = FlxPoint.weak(x, y); + + scrollDistance += steps; + modchartFunc(this, lane, scrollDistance); + + var curPosition:FlxPoint = FlxPoint.weak(x, y); + + var radAngle:Float; + if (adaptiveDirection) { + angle = (prevPosition.degreesTo(curPosition) + 180); + radAngle = angle * rad; + prevAngle ??= radAngle; + } else { + prevAngle ??= defaultAngle; + radAngle = angle * rad; + } + + var data:NoteTailDrawData = (drawData[drawItems] ?? new NoteTailDrawData()); + data.copyPosition(prevPosition, curPosition); + data.setScale(prevScale.x, scale.x); + data.setAngle(prevAngle, radAngle); + data.strip = strip; + drawData[drawItems ++] = data; + + prevAngle = radAngle; + } + + strip.alpha = alpha; + strip.color = color; + } + + function get_thickness():Float { + return strip.thickness; + } + function set_thickness(now:Float):Float { + return strip.thickness = now; + } +} + +class ArrowPathStrip extends FunkinStrip { + public var thickness:Float = 6; + + public var fast(default, set):Bool; + var sinFunc:Float -> Float; + var cosFunc:Float -> Float; + + public function new() { + super(); + + this.fast = true; + this.makeGraphic(1, 1, FlxColor.WHITE); + + indices = new DrawData(6, true, [0, 1, 2, 1, 2, 3]); + uvtData = new DrawData(8, true, [0, 0, 0, 1, 1, 0, 1, 1]); + vertices = new DrawData(8, true, [0, 0, 0, 0, 0, 0, 0, 0]); + // topleft topright bottomleft bottomright + } + + public function updateRender(drawData:NoteTailDrawData):Void { + if (graphic == null) + return; + + var thickB:Float = (thickness * .5); + var angleTo:Float = drawData.angleTo; + var angleFrom:Float = drawData.angleFrom; + + setPosition(drawData.xFrom, drawData.yFrom); + var sprXOffset:Float = -(spriteOffset.x + animOffset.x); + var sprYOffset:Float = -(spriteOffset.y + animOffset.y); + var nextXOffset:Float = (drawData.xTo - drawData.xFrom); + var nextYOffset:Float = (drawData.yTo - drawData.yFrom); + + // update vertices + var width:Float = thickB * drawData.scaleFrom; + var widthTo:Float = thickB * drawData.scaleTo; + var xOffset:Float = sprXOffset * drawData.scaleFrom; + var xOffsetTo:Float = sprXOffset * drawData.scaleTo; + var yOffset:Float = sprYOffset * drawData.scaleFrom; + var yOffsetTo:Float = sprYOffset * drawData.scaleTo; + + var sin:Float = sinFunc(angleTo) * widthTo; + var cos:Float = cosFunc(angleTo) * widthTo; + + vertices[0] = -sin + nextXOffset + xOffsetTo; // top left + vertices[1] = cos + nextYOffset + yOffsetTo; + vertices[2] = sin + nextXOffset + xOffsetTo; // top right + vertices[3] = -cos + nextYOffset + yOffsetTo; + + sin = sinFunc(angleFrom) * width; + cos = cosFunc(angleFrom) * width; + + vertices[4] = -sin + xOffset; // bottom left + vertices[5] = cos + yOffset; + vertices[6] = sin + xOffset; // bottom right + vertices[7] = -cos + yOffset; + } + + function set_fast(yea:Bool):Bool { + sinFunc = (yea ? FlxMath.fastSin : Math.sin); + cosFunc = (yea ? FlxMath.fastCos : Math.cos); + return fast = yea; + } +} \ No newline at end of file diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index f8c3245..9fca8c5 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -50,6 +50,7 @@ class Lane extends FunkinSpriteGroup { var spawnLimit:Int = 75; public var receptor:Receptor; + public var arrowPath:ArrowPath; public var notes:FunkinTypedSpriteGroup; public var noteSparks:FunkinTypedSpriteGroup; public var noteSplashes:FunkinTypedSpriteGroup; @@ -94,11 +95,15 @@ class Lane extends FunkinSpriteGroup { }; receptor = new Receptor(0, 0, data, style); + arrowPath = new ArrowPath(this); + arrowPath.render = false; notes = new FunkinTypedSpriteGroup(); noteSparks = new FunkinTypedSpriteGroup(0, 0, 5); noteSplashes = new FunkinTypedSpriteGroup(0, 0, 5); spawnRadius = Note.distanceToMS(FlxG.height + 75, scrollSpeed); receptor.lane = this; //lol + + this.add(arrowPath); this.add(receptor); for (mem in [notes, noteSparks, noteSplashes]) { topMembers.push(mem); // render conditionally @@ -386,6 +391,7 @@ class Lane extends FunkinSpriteGroup { note.lane = this; note.chartNote = songNote; note.hitWindow = hitWindow; + note.arrowPath = arrowPath; note.reload(style, this); note.scale.set(scale.x * note.defaultScale, scale.y * note.defaultScale); diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 8a06a36..9d22646 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -9,7 +9,6 @@ import funkin.backend.play.NoteStyle; import funkin.objects.CharacterGroup; import funkin.backend.FunkinStrip; -import flixel.math.FlxMatrix; import flixel.graphics.frames.FlxFrame; import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; @@ -102,6 +101,7 @@ class Note extends NoteObject { public var tail:NoteTail; public var rgbShader:RGBSwap; + public var arrowPath:ArrowPath; public var updateRGBShader:Bool = true; public var rgbEnabled(default, set):Bool; public var tailOffset(default, null):FlxPoint; @@ -327,9 +327,9 @@ class Note extends NoteObject { copyReceptor(receptor); try { - scrollDistance = (customScrollDistance ?? genericScrollDistance)(this, lane, timeDiff); + scrollDistance = (customScrollDistance ?? arrowPath?.customScrollDistance ?? genericScrollDistance)(this, lane, timeDiff); if (updateModchart) - (customModchart ?? genericModchart)(this, lane, scrollDistance); + (customModchart ?? arrowPath?.customModchart ?? genericModchart)(this, lane, scrollDistance); } catch (e:haxe.Exception) { Log.error('error on note modchart function -> ${e.details()}'); @@ -552,8 +552,8 @@ class NoteTail extends Note { var render:NoteTailStrip = tailStrip; renderingTail = true; - var distFunc = (customScrollDistance ?? parent.customScrollDistance ?? genericScrollDistance); - var modchartFunc = (customModchart ?? parent.customModchart ?? genericModchart); + var distFunc = (customScrollDistance ?? parent?.customScrollDistance ?? parent?.arrowPath?.customScrollDistance ?? genericScrollDistance); + var modchartFunc = (customModchart ?? parent?.customModchart ?? parent?.arrowPath?.customModchart ?? genericModchart); var timeDiff:Float = endMs - conductorInUse.songPosition; var receptor:Receptor = lane.receptor; @@ -813,7 +813,7 @@ class NoteTailDrawData { public var clip:Float = 0; - public var strip:NoteTailStrip; + public var strip:Dynamic; public function new() {} From 3d66186f97174d67f1809d834867ea65f33acf1f Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 19 Jul 2025 09:58:25 -0600 Subject: [PATCH 68/73] Update Stage.hx fix scroll factor set --- source/funkin/objects/Stage.hx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/funkin/objects/Stage.hx b/source/funkin/objects/Stage.hx index 51ffbf4..0360e92 100644 --- a/source/funkin/objects/Stage.hx +++ b/source/funkin/objects/Stage.hx @@ -143,12 +143,12 @@ class Stage extends FunkinSpriteGroup { else propSprite.loadTexture(prop.assetPath, library); } + insertZIndex(propSprite); propSprite.sway = (propSprite.animationExists('danceLeft') && propSprite.animationExists('danceRight')); if (prop.scroll != null) propSprite.scrollFactor.set(prop.scroll[0], prop.scroll[1]); if (prop.scale != null) propSprite.scale.set(prop.scale[0], prop.scale[1]); var assetName:String = prop.name ?? prop.assetPath; propSprite.updateHitbox(); - insertZIndex(propSprite); this.props.set(assetName, propSprite); } @@ -182,10 +182,10 @@ class Stage extends FunkinSpriteGroup { }); var charaGroup:CharacterGroup = new CharacterGroup(chara.position[0], chara.position[1], char, side, name); + insertZIndex(charaGroup); charaGroup.zIndex = chara.zIndex; charaGroup.stageCameraOffset.set(chara.cameraOffsets[0], chara.cameraOffsets[1]); if (chara.scale != null) charaGroup.scale.set(chara.scale, chara.scale); - insertZIndex(charaGroup); this.characters.set(name, charaGroup); } From 5c29d0073d71ffab0f8d2de0bb9f5b6bb6823fbe Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 19 Jul 2025 10:23:48 -0600 Subject: [PATCH 69/73] Update Stage.hx fix jammed zIndex (AGAIN) --- source/funkin/objects/Stage.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/funkin/objects/Stage.hx b/source/funkin/objects/Stage.hx index 0360e92..6102e89 100644 --- a/source/funkin/objects/Stage.hx +++ b/source/funkin/objects/Stage.hx @@ -182,10 +182,10 @@ class Stage extends FunkinSpriteGroup { }); var charaGroup:CharacterGroup = new CharacterGroup(chara.position[0], chara.position[1], char, side, name); - insertZIndex(charaGroup); charaGroup.zIndex = chara.zIndex; charaGroup.stageCameraOffset.set(chara.cameraOffsets[0], chara.cameraOffsets[1]); if (chara.scale != null) charaGroup.scale.set(chara.scale, chara.scale); + insertZIndex(charaGroup); this.characters.set(name, charaGroup); } From deec36c93cbcfb13359bbc8b1d82c812087faf4f Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Sat, 19 Jul 2025 23:28:53 -0600 Subject: [PATCH 70/73] PAUSE MENU, (attempt) optimize hold rendering ouhg... --- source/funkin/backend/FunkinCamera.hx | 22 +++- source/funkin/backend/FunkinState.hx | 13 +- source/funkin/backend/FunkinStrip.hx | 28 ++-- source/funkin/backend/play/SongEvent.hx | 6 +- source/funkin/objects/play/ArrowPath.hx | 118 ++++++----------- source/funkin/objects/play/Lane.hx | 25 +++- source/funkin/objects/play/Note.hx | 152 +++++++++------------- source/funkin/objects/ui/TextItem.hx | 34 +++++ source/funkin/objects/ui/TextItemGroup.hx | 53 ++++++++ source/funkin/states/PauseSubState.hx | 40 ++++++ source/funkin/states/PlayState.hx | 94 ++++++++++--- 11 files changed, 384 insertions(+), 201 deletions(-) create mode 100644 source/funkin/objects/ui/TextItem.hx create mode 100644 source/funkin/objects/ui/TextItemGroup.hx create mode 100644 source/funkin/states/PauseSubState.hx diff --git a/source/funkin/backend/FunkinCamera.hx b/source/funkin/backend/FunkinCamera.hx index ba0165a..7fe7f70 100644 --- a/source/funkin/backend/FunkinCamera.hx +++ b/source/funkin/backend/FunkinCamera.hx @@ -8,21 +8,21 @@ typedef ShaderOrFilter = flixel.util.typeLimit.OneOfTwo; class FunkinCamera extends FlxCamera { public var pauseZoomLerp:Bool = false; // OK, this is hacky but i cant be arsed public var pauseFollowLerp:Bool = false; + public var zoomTarget:Null = null; public var zoomFollowLerp:Float = -1; public var zoomOffset:Float = 0; - - override public function update(elapsed:Float):Void { + + public static var topCamera(get, never):FlxCamera; + + public override function update(elapsed:Float):Void { if (target != null) updateFollow(); updateLerp(elapsed); updateScroll(); updateFlash(elapsed); updateFade(elapsed); - - flashSprite.filters = filtersEnabled ? filters : null; - - updateFlashSpritePosition(); + updateShake(elapsed); } public override function follow(target:FlxObject, ?style:FlxCameraFollowStyle, ?lerp:Float):Void { @@ -35,6 +35,9 @@ class FunkinCamera extends FlxCamera { zoom = zoomTarget; } override function render() { + flashSprite.filters = filtersEnabled ? filters : null; + updateFlashSpritePosition(); + if (filters != null) { for (filter in filters) { if (!Std.isOfType(filter, openfl.filters.ShaderFilter)) @@ -48,6 +51,7 @@ class FunkinCamera extends FlxCamera { } } } + super.render(); } @@ -118,6 +122,10 @@ class FunkinCamera extends FlxCamera { } } - override function set_followLerp(value:Float) + override function set_followLerp(value:Float) { return followLerp = value; + } + static function get_topCamera():FlxCamera { + return FlxG.cameras.list[FlxG.cameras.list.length - 1]; + } } \ No newline at end of file diff --git a/source/funkin/backend/FunkinState.hx b/source/funkin/backend/FunkinState.hx index 79160eb..1bbda0e 100644 --- a/source/funkin/backend/FunkinState.hx +++ b/source/funkin/backend/FunkinState.hx @@ -44,11 +44,15 @@ class FunkinState extends FlxSubState { Paths.clean(); } + subStateOpened.add(onSubStateOpened); + subStateClosed.add(onSubStateClosed); + super.create(); } - function rhythmBarHit(t:Int) barHit.dispatch(t); - function rhythmBeatHit(t:Int) beatHit.dispatch(t); - function rhythmStepHit(t:Int) stepHit.dispatch(t); + + public function onSubStateOpened(substate):Void {} + public function onSubStateClosed(substate):Void {} + override public function destroy() { conductorInUse = null; @@ -79,6 +83,9 @@ class FunkinState extends FlxSubState { if (!conductor.stepHit.has(rhythmStepHit)) conductor.stepHit.add(rhythmStepHit); if (!conductor.advance.has(updateEvents)) conductor.advance.add(updateEvents); } + function rhythmBarHit(t:Int) barHit.dispatch(t); + function rhythmBeatHit(t:Int) beatHit.dispatch(t); + function rhythmStepHit(t:Int) stepHit.dispatch(t); public function sortZIndex() { sort(Util.sortZIndex, FlxSort.ASCENDING); diff --git a/source/funkin/backend/FunkinStrip.hx b/source/funkin/backend/FunkinStrip.hx index b4bfca9..848bc59 100644 --- a/source/funkin/backend/FunkinStrip.hx +++ b/source/funkin/backend/FunkinStrip.hx @@ -25,15 +25,25 @@ class FunkinStrip extends FunkinSprite { final cameras = getCamerasLegacy(); for (camera in cameras) { - if (!camera.visible || !camera.exists) - continue; - - getScreenPosition(_point, camera).subtractPoint(offset); - #if !flash - camera.drawTriangles(graphic, vertices, indices, uvtData, colors, _point, blend, repeat, antialiasing, colorTransform, shader); - #else - camera.drawTriangles(graphic, vertices, indices, uvtData, colors, _point, blend, repeat, antialiasing); - #end + if (!camera.visible || !camera.exists) return; + + drawToCamera(camera); + + #if FLX_DEBUG FlxBasic.visibleCount ++; #end } } + + public function drawToCamera(camera:FlxCamera):Void { + var prev:Float = alpha; + alpha *= camera.alpha; // maybe figure out what is actually going on that causes strips not to consider alpha ...? + + getScreenPosition(_point, camera).subtractPoint(offset); + #if !flash + camera.drawTriangles(graphic, vertices, indices, uvtData, colors, _point, blend, repeat, antialiasing, colorTransform, shader); + #else + camera.drawTriangles(graphic, vertices, indices, uvtData, colors, _point, blend, repeat, antialiasing); + #end + + alpha = prev; + } } \ No newline at end of file diff --git a/source/funkin/backend/play/SongEvent.hx b/source/funkin/backend/play/SongEvent.hx index 7bb480e..beaef11 100644 --- a/source/funkin/backend/play/SongEvent.hx +++ b/source/funkin/backend/play/SongEvent.hx @@ -44,8 +44,10 @@ import funkin.backend.scripting.HScript; switch (type) { case START_COUNTDOWN: - for (strumline in game.strumlineGroup) - strumline.fadeIn(); + if (game.fadeNotes) { + for (strumline in game.strumlineGroup) + strumline.fadeIn(); + } case TICK_COUNTDOWN: var folder:String = 'funkin'; FunkinSound.playOnce(Paths.sound('gameplay/countdown/$folder/intro$countdown')); diff --git a/source/funkin/objects/play/ArrowPath.hx b/source/funkin/objects/play/ArrowPath.hx index d625985..f7d9272 100644 --- a/source/funkin/objects/play/ArrowPath.hx +++ b/source/funkin/objects/play/ArrowPath.hx @@ -38,19 +38,21 @@ class ArrowPath extends NoteObject { public override function update(elapsed:Float):Void { super.update(elapsed); strip.update(elapsed); - } - public override function draw():Void { + copyReceptor(lane?.receptor); + if (render && visible && alpha > 0) + updateTriangles(lane); + } + public override function draw():Void { if (!visible || !render || alpha <= 0) return; - updateTriangles(lane); + strip.alpha = alpha; + strip.color = color; + for (camera in getCamerasLegacy()) { - if (!camera.visible || !camera.exists) continue; - - drawComplex(camera); - - #if FLX_DEBUG FlxBasic.visibleCount++; #end + if (camera.visible && camera.exists) + drawComplex(camera); } } @@ -58,13 +60,13 @@ class ArrowPath extends NoteObject { updateShader(camera); for (i in 0 ... drawItems) { - var data:NoteTailDrawData = drawData[i]; - var strip:ArrowPathStrip = data.strip; - strip.updateRender(data); - strip.draw(); + strip.updateRender(drawData[i]); + strip.drawToCamera(camera); } } public function updateTriangles(lane:Lane):Void { + if (!updateModchart) return; + if (steps < 5) { Log.warning('$steps px/step for arrow path is too low !!'); steps = 5; @@ -75,23 +77,19 @@ class ArrowPath extends NoteObject { var scrollDistance:Float = minDistance; try { (customScrollDistance ?? genericScrollDistance)(this, lane, 0); // error check - if (updateModchart) - modchartFunc(this, lane, minDistance); + modchartFunc(this, lane, minDistance); } catch (e:haxe.Exception) { Log.error('error on path modchart function -> ${e.details()}'); customModchart = null; customScrollDistance = null; modchartFunc = genericModchart; - - if (updateModchart) - genericModchart(this, lane, minDistance); + genericModchart(this, lane, minDistance); } drawItems = 0; - var rad:Float = (Math.PI / 180); + var defaultAngle:Float = angle; var prevAngle:Null = null; - var defaultAngle:Float = angle * rad; while (scrollDistance < maxDistance) { var prevScale:FlxPoint = FlxPoint.weak(scale.x, scale.y); @@ -102,50 +100,39 @@ class ArrowPath extends NoteObject { var curPosition:FlxPoint = FlxPoint.weak(x, y); - var radAngle:Float; if (adaptiveDirection) { angle = (prevPosition.degreesTo(curPosition) + 180); - radAngle = angle * rad; - prevAngle ??= radAngle; + prevAngle ??= angle; } else { prevAngle ??= defaultAngle; - radAngle = angle * rad; } var data:NoteTailDrawData = (drawData[drawItems] ?? new NoteTailDrawData()); data.copyPosition(prevPosition, curPosition); data.setScale(prevScale.x, scale.x); - data.setAngle(prevAngle, radAngle); - data.strip = strip; + data.setAngle(prevAngle, angle); drawData[drawItems ++] = data; - prevAngle = radAngle; + prevAngle = angle; } - - strip.alpha = alpha; - strip.color = color; } - function get_thickness():Float { + inline function get_thickness():Float { return strip.thickness; } - function set_thickness(now:Float):Float { + inline function set_thickness(now:Float):Float { return strip.thickness = now; } } class ArrowPathStrip extends FunkinStrip { - public var thickness:Float = 6; - - public var fast(default, set):Bool; - var sinFunc:Float -> Float; - var cosFunc:Float -> Float; + public var thickness:Float = 2; public function new() { super(); - this.fast = true; - this.makeGraphic(1, 1, FlxColor.WHITE); + this.smooth = false; + this.makeGraphic(25, 25, FlxColor.WHITE); indices = new DrawData(6, true, [0, 1, 2, 1, 2, 3]); uvtData = new DrawData(8, true, [0, 0, 0, 1, 1, 0, 1, 1]); @@ -157,44 +144,23 @@ class ArrowPathStrip extends FunkinStrip { if (graphic == null) return; - var thickB:Float = (thickness * .5); - var angleTo:Float = drawData.angleTo; - var angleFrom:Float = drawData.angleFrom; - - setPosition(drawData.xFrom, drawData.yFrom); - var sprXOffset:Float = -(spriteOffset.x + animOffset.x); - var sprYOffset:Float = -(spriteOffset.y + animOffset.y); - var nextXOffset:Float = (drawData.xTo - drawData.xFrom); - var nextYOffset:Float = (drawData.yTo - drawData.yFrom); - // update vertices - var width:Float = thickB * drawData.scaleFrom; - var widthTo:Float = thickB * drawData.scaleTo; - var xOffset:Float = sprXOffset * drawData.scaleFrom; - var xOffsetTo:Float = sprXOffset * drawData.scaleTo; - var yOffset:Float = sprYOffset * drawData.scaleFrom; - var yOffsetTo:Float = sprYOffset * drawData.scaleTo; - - var sin:Float = sinFunc(angleTo) * widthTo; - var cos:Float = cosFunc(angleTo) * widthTo; - - vertices[0] = -sin + nextXOffset + xOffsetTo; // top left - vertices[1] = cos + nextYOffset + yOffsetTo; - vertices[2] = sin + nextXOffset + xOffsetTo; // top right - vertices[3] = -cos + nextYOffset + yOffsetTo; - - sin = sinFunc(angleFrom) * width; - cos = cosFunc(angleFrom) * width; - - vertices[4] = -sin + xOffset; // bottom left - vertices[5] = cos + yOffset; - vertices[6] = sin + xOffset; // bottom right - vertices[7] = -cos + yOffset; - } - - function set_fast(yea:Bool):Bool { - sinFunc = (yea ? FlxMath.fastSin : Math.sin); - cosFunc = (yea ? FlxMath.fastCos : Math.cos); - return fast = yea; + var width:Float = (thickness * .5 * drawData.scaleTo); + var sin:Float = (FlxMath.fastSin(drawData.angleTo) * width); + var cos:Float = (FlxMath.fastCos(drawData.angleTo) * width); + + vertices[0] = (-sin + drawData.xTo); // top left + vertices[1] = (cos + drawData.yTo); + vertices[2] = (sin + drawData.xTo); // top right + vertices[3] = (-cos + drawData.yTo); + + width = (thickness * .5 * drawData.scaleFrom); + sin = (FlxMath.fastSin(drawData.angleFrom) * width); + cos = (FlxMath.fastCos(drawData.angleFrom) * width); + + vertices[4] = (-sin + drawData.xFrom); // bottom left + vertices[5] = (cos + drawData.yFrom); + vertices[6] = (sin + drawData.xFrom); // bottom right + vertices[7] = (-cos + drawData.yFrom); } } \ No newline at end of file diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 9fca8c5..7547668 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -52,6 +52,7 @@ class Lane extends FunkinSpriteGroup { public var receptor:Receptor; public var arrowPath:ArrowPath; public var notes:FunkinTypedSpriteGroup; + public var wooshNotes:FunkinTypedSpriteGroup; public var noteSparks:FunkinTypedSpriteGroup; public var noteSplashes:FunkinTypedSpriteGroup; public var queue:Array = []; @@ -98,6 +99,7 @@ class Lane extends FunkinSpriteGroup { arrowPath = new ArrowPath(this); arrowPath.render = false; notes = new FunkinTypedSpriteGroup(); + wooshNotes = new FunkinTypedSpriteGroup(); noteSparks = new FunkinTypedSpriteGroup(0, 0, 5); noteSplashes = new FunkinTypedSpriteGroup(0, 0, 5); spawnRadius = Note.distanceToMS(FlxG.height + 75, scrollSpeed); @@ -105,7 +107,7 @@ class Lane extends FunkinSpriteGroup { this.add(arrowPath); this.add(receptor); - for (mem in [notes, noteSparks, noteSplashes]) { + for (mem in [wooshNotes, notes, noteSparks, noteSplashes]) { topMembers.push(mem); // render conditionally this.add(mem); } @@ -129,6 +131,27 @@ class Lane extends FunkinSpriteGroup { } } + public function woosh():Void { + for (note in wooshNotes) { + var startX:Float = note.x; + var startY:Float = note.y; + + FlxTween.tween(note, {x: note.x + FlxG.height * Math.cos(direction / 180 * Math.PI), y: note.y + FlxG.height * Math.sin(direction / 180 * Math.PI)}, .5, { + ease: FlxEase.expoIn, + onComplete: (_) -> { + note.kill(); + wooshNotes.remove(note, true); + note.destroy(); + }, + onUpdate: (_) -> { + if (note.tail != null) { + @:privateAccess note.tail.holdStrip?.setPosition(note.x - startX, note.y - startY); + @:privateAccess note.tail.tailStrip?.setPosition(note.x - startX, note.y - startY); + } + } + }); + } + } public override function update(elapsed:Float) { updateQueue(); updateNotes(); diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 9d22646..5526cb7 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -163,6 +163,10 @@ class Note extends NoteObject { super.destroy(); } + public override function update(elapsed:Float):Void { + super.update(elapsed); + tail?.update(elapsed); + } public override function draw():Void { if (isHoldNote && tail != null) tail.draw(); @@ -477,6 +481,7 @@ class NoteTail extends Note { if (parent != null) { scrollFactor.copyFrom(parent.scrollFactor); + cameras = parent.cameras; shader = parent.shader; alpha *= parent.alpha; color = parent.color; @@ -485,14 +490,24 @@ class NoteTail extends Note { tailStrip?.copyNote(this); for (camera in getCamerasLegacy()) { - if (!camera.visible || !camera.exists) - continue; - - drawComplex(camera); - - #if FLX_DEBUG - FlxBasic.visibleCount++; - #end + if (camera.visible && camera.exists) + drawComplex(camera); + } + } + public override function drawComplex(camera:FlxCamera):Void { + updateShader(camera); + + if (renderTriangles) { + for (i in 0 ... drawItems) { + var data:NoteTailDrawData = drawData[i]; + var strip:NoteTailStrip = data?.strip; + if (strip == null) break; + + if (zebra) + strip.color = (i % 2 == 0 ? FlxColor.GRAY : FlxColor.WHITE); + strip.updateRender(data); + strip.drawToCamera(camera); + } } } @@ -549,6 +564,8 @@ class NoteTail extends Note { angle = direction + parent.direction + receptor.lane?.direction ?? 0 + 90; } public function updateTriangles(lane:Lane):Void { + if (!updateModchart) return; + var render:NoteTailStrip = tailStrip; renderingTail = true; @@ -560,8 +577,7 @@ class NoteTail extends Note { var scrollDistance:Float = 0; try { scrollDistance = distFunc(this, lane, timeDiff); - if (updateModchart) - modchartFunc(this, lane, scrollDistance); + modchartFunc(this, lane, scrollDistance); } catch (e:haxe.Exception) { Log.error('error on note modchart function -> ${e.details()}'); @@ -571,8 +587,7 @@ class NoteTail extends Note { distFunc = genericScrollDistance; scrollDistance = genericScrollDistance(this, lane, timeDiff); - if (updateModchart) - genericModchart(this, lane, timeDiff); + genericModchart(this, lane, timeDiff); } if (goodHit) clipToDistance = distFunc(this, lane, 0); @@ -582,9 +597,8 @@ class NoteTail extends Note { drawItems = 0; - var rad:Float = (Math.PI / 180); + var defaultAngle:Float = angle; var prevAngle:Null = null; - var defaultAngle:Float = angle * rad; var scaleY:Float = (lane?.scale.y ?? scale.y); while (scrollDistance > clipDistance) { @@ -601,14 +615,11 @@ class NoteTail extends Note { var curPosition:FlxPoint = FlxPoint.weak(x, y); if (renderDistance == null || scrollDistance < renderDistance) { - var radAngle:Float; if (adaptiveDirection) { angle = (prevPosition.degreesTo(curPosition) + 180); - radAngle = angle * rad; - prevAngle ??= radAngle; + prevAngle ??= angle; } else { prevAngle ??= defaultAngle; - radAngle = angle * rad; } @@ -617,36 +628,19 @@ class NoteTail extends Note { data.clip = (scrollDistance <= clipDistance ? Math.abs(scrollDistance - clipDistance) / height : 0); data.copyPosition(prevPosition, curPosition); data.setScale(prevScale.x, scale.x); - data.setAngle(prevAngle, radAngle); + data.setAngle(prevAngle, angle); data.strip = render; drawData[drawItems ++] = data; - prevAngle = radAngle; + prevAngle = angle; } renderingTail = false; render = holdStrip; } } - - public override function drawComplex(camera:FlxCamera):Void { - updateShader(camera); - - if (renderTriangles) { - for (i in 0 ... drawItems) { - var data:NoteTailDrawData = drawData[i]; - var strip:NoteTailStrip = data?.strip; - if (strip == null) break; - - if (zebra) - strip.color = (i % 2 == 0 ? FlxColor.GRAY : FlxColor.WHITE); - strip.updateRender(data); - strip.draw(); - } - } - } } class NoteTailStrip extends FunkinStrip { @@ -654,10 +648,7 @@ class NoteTailStrip extends FunkinStrip { public var style(default, set):NoteStyle; public var parentTail(default, set):NoteTail; - public var fast(default, set):Bool; var topCoordOffset:Int = 0; - var sinFunc:Float -> Float; - var cosFunc:Float -> Float; var topUV:Float; public var laneIndex:Int; @@ -665,9 +656,8 @@ class NoteTailStrip extends FunkinStrip { public function new(parent:NoteTail, defaultAnim:String = 'hold') { super(); - this.defaultAnim = defaultAnim; this.parentTail = parent; - this.fast = true; + this.defaultAnim = defaultAnim; indices = new DrawData(6, true, [0, 1, 2, 1, 2, 3]); uvtData = new DrawData(8, true, [0, 0, 0, 0, 0, 0, 0, 0]); @@ -722,40 +712,35 @@ class NoteTailStrip extends FunkinStrip { if (graphic == null) return; - var clip:Float = drawData.clip; - var angleTo:Float = drawData.angleTo; - var angleFrom:Float = drawData.angleFrom; - - setPosition(drawData.xFrom, drawData.yFrom); var sprXOffset:Float = -(spriteOffset.x + animOffset.x); var sprYOffset:Float = -(spriteOffset.y + animOffset.y); - var nextXOffset:Float = (drawData.xTo - drawData.xFrom) * (1 - clip); - var nextYOffset:Float = (drawData.yTo - drawData.yFrom) * (1 - clip); + var nextXOffset:Float = FlxMath.lerp(drawData.xFrom, drawData.xTo, (1 - drawData.clip)); + var nextYOffset:Float = FlxMath.lerp(drawData.yFrom, drawData.yTo, (1 - drawData.clip)); // update vertices - var width:Float = frameWidth * .5 * drawData.scaleFrom; - var widthTo:Float = frameWidth * .5 * drawData.scaleTo; - var xOffset:Float = sprXOffset * drawData.scaleFrom; - var xOffsetTo:Float = sprXOffset * drawData.scaleTo; - var yOffset:Float = sprYOffset * drawData.scaleFrom; - var yOffsetTo:Float = sprYOffset * drawData.scaleTo; - - var sin:Float = sinFunc(angleTo) * widthTo; - var cos:Float = cosFunc(angleTo) * widthTo; - - vertices[0] = -sin + nextXOffset + xOffsetTo; // top left - vertices[1] = cos + nextYOffset + yOffsetTo; - vertices[2] = sin + nextXOffset + xOffsetTo; // top right - vertices[3] = -cos + nextYOffset + yOffsetTo; - uvtData[0 + topCoordOffset] = uvtData[2 + topCoordOffset] = FlxMath.lerp(topUV, uvtData[4 + topCoordOffset], clip); // top corners uv (for clipping) - - sin = sinFunc(angleFrom) * width; - cos = cosFunc(angleFrom) * width; - - vertices[4] = -sin + xOffset; // bottom left - vertices[5] = cos + yOffset; - vertices[6] = sin + xOffset; // bottom right - vertices[7] = -cos + yOffset; + var xOffset:Float = (sprXOffset * drawData.scaleFrom); + var xOffsetTo:Float = (sprXOffset * drawData.scaleTo); + var yOffset:Float = (sprYOffset * drawData.scaleFrom); + var yOffsetTo:Float = (sprYOffset * drawData.scaleTo); + + var width:Float = (frameWidth * .5 * drawData.scaleTo); + var sin:Float = (FlxMath.fastSin(drawData.angleTo) * width); + var cos:Float = (FlxMath.fastCos(drawData.angleTo) * width); + + vertices[0] = (-sin + nextXOffset + xOffsetTo); // top left + vertices[1] = (cos + nextYOffset + yOffsetTo); + vertices[2] = (sin + nextXOffset + xOffsetTo); // top right + vertices[3] = (-cos + nextYOffset + yOffsetTo); + uvtData[0 + topCoordOffset] = uvtData[2 + topCoordOffset] = FlxMath.lerp(topUV, uvtData[4 + topCoordOffset], drawData.clip); // top corners uv (for clipping) + + width = (frameWidth * .5 * drawData.scaleFrom); + sin = (FlxMath.fastSin(drawData.angleFrom) * width); + cos = (FlxMath.fastCos(drawData.angleFrom) * width); + + vertices[4] = (-sin + xOffset + drawData.xFrom); // bottom left + vertices[5] = (cos + yOffset + drawData.yFrom); + vertices[6] = (sin + xOffset + drawData.xFrom); // bottom right + vertices[7] = (-cos + yOffset + drawData.yFrom); } public inline function copyNote(note:Note):Void { scrollFactor.copyFrom(note.scrollFactor); @@ -764,11 +749,6 @@ class NoteTailStrip extends FunkinStrip { color = note.color; } - function set_fast(yea:Bool):Bool { - sinFunc = (yea ? FlxMath.fastSin : Math.sin); - cosFunc = (yea ? FlxMath.fastCos : Math.cos); - return fast = yea; - } function set_style(newStyle:NoteStyle) { if (style == newStyle) return newStyle; style = newStyle; @@ -815,32 +795,30 @@ class NoteTailDrawData { public var strip:Dynamic; + var TO_RAD:Float = (1 / 180 * Math.PI); + public function new() {} - public function setAngle(from:Float, ?to:Float):NoteTailDrawData { - angleFrom = from; - angleTo = to ?? from; - return this; + public inline function setAngle(from:Float, ?to:Float):Void { + angleFrom = from * TO_RAD; + angleTo = (to ?? from) * TO_RAD; } - public function setScale(from:Float, ?to:Float):NoteTailDrawData { + public inline function setScale(from:Float, ?to:Float):Void { scaleFrom = from; scaleTo = to ?? from; - return this; } - public function setPosition(x:Float, y:Float, ?xT:Float, ?yT:Float):NoteTailDrawData { + public inline function setPosition(x:Float, y:Float, ?xT:Float, ?yT:Float):Void { xFrom = x; yFrom = y; if (xT != null) xTo = xT; if (yT != null) yTo = yT; - return this; } - public function copyPosition(point:FlxPoint, ?pointTo:FlxPoint):NoteTailDrawData { + public inline function copyPosition(point:FlxPoint, ?pointTo:FlxPoint):Void { xFrom = point.x; yFrom = point.y; if (pointTo != null) { xTo = pointTo.x; yTo = pointTo.y; } - return this; } } \ No newline at end of file diff --git a/source/funkin/objects/ui/TextItem.hx b/source/funkin/objects/ui/TextItem.hx new file mode 100644 index 0000000..e65e1fe --- /dev/null +++ b/source/funkin/objects/ui/TextItem.hx @@ -0,0 +1,34 @@ +package funkin.objects.ui; + +class TextItem extends FunkinSpriteGroup { + public var onSelected:Void -> Void; + + public var text:Alphabet; + + public function new(name:String, ?func:Void -> Void) { + super(); + + text = new Alphabet(name); + text.scaleTo(.75, .75); + add(text); + + onSelected = func; + + highlight(false); + } + + public function confirm():Void { + if (onSelected != null) + onSelected(); + } + + public function highlight(on:Bool):Void { + if (on) { + text.color = 0xffffcc66; + text.alpha = 1; + } else { + text.color = FlxColor.WHITE; + text.alpha = .65; + } + } +} \ No newline at end of file diff --git a/source/funkin/objects/ui/TextItemGroup.hx b/source/funkin/objects/ui/TextItemGroup.hx new file mode 100644 index 0000000..c483ec7 --- /dev/null +++ b/source/funkin/objects/ui/TextItemGroup.hx @@ -0,0 +1,53 @@ +package funkin.objects.ui; + +class TextItemGroup extends FunkinTypedSpriteGroup { + public var itemPadding:Float = 25; + public var selection:Int = 0; + + public function new() { + super(); + } + + public function addItem(item:TextItem):TextItem { + add(item); + repositionItems(); + + return item; + } + + public function repositionItems():Void { + var yy:Float = y; + + for (item in members) { + if (item == null || !item.exists) continue; + + item.y = yy; + yy += item.height + itemPadding; + } + } + + public function confirm():Void { + var curOption:TextItem = members[selection]; + if (curOption != null) { + curOption.confirm(); + } + } + + public function select(mod:Int = 0):Void { + if (length == 0) return; + + if (mod != 0) FunkinSound.playOnce(Paths.sound('scrollMenu'), .8); + + var prevOption:TextItem = members[selection]; + if (prevOption != null) { + prevOption.highlight(false); + } + + selection = FlxMath.wrap(selection + mod, 0, length - 1); + + var curOption:TextItem = members[selection]; + if (curOption != null) { + curOption.highlight(true); + } + } +} \ No newline at end of file diff --git a/source/funkin/states/PauseSubState.hx b/source/funkin/states/PauseSubState.hx new file mode 100644 index 0000000..8d541cd --- /dev/null +++ b/source/funkin/states/PauseSubState.hx @@ -0,0 +1,40 @@ +package funkin.states; + +import funkin.objects.ui.*; + +class PauseSubState extends FunkinState { + public var items:TextItemGroup; + + public var playState:PlayState = null; + + public override function new(?playState:PlayState) { + super(); + this.bgColor = 0x80000000; + this.playState = playState; + } + + public override function create() { + super.create(); + + items = new TextItemGroup(); + items.addItem(new TextItem('Resume', function() close())); + items.addItem(new TextItem('Restart', function() playState?.restartSong())); + items.addItem(new TextItem('Exit to Menu', function() FlxG.switchState(FreeplayState.new))); + items.screenCenter(Y); + items.select(); + add(items); + + items.x = -items.width; + FlxTween.tween(items, {x: 75}, .35, {ease: FlxEase.expoOut}); + + camera = FunkinCamera.topCamera; + } + + public override function update(elapsed:Float):Void { + super.update(elapsed); + + if (FlxG.keys.justPressed.UP) items.select(-1); + if (FlxG.keys.justPressed.DOWN) items.select(1); + if (FlxG.keys.justPressed.ENTER) items.confirm(); + } +} \ No newline at end of file diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 760b140..5958d76 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -93,6 +93,10 @@ class PlayState extends FunkinState { public var noteStyle(default, set):NoteStyleAsset; + public var fadeNotes:Bool = true; + static var wooshNotes:Array = []; + static var restartingSong:Bool = false; + function set_noteStyle(newStyle:NoteStyleAsset):NoteStyleAsset { if (noteStyle == newStyle) return newStyle; @@ -374,9 +378,31 @@ class PlayState extends FunkinState { updateScoreText(); sortZIndex(); + if (restartingSong) + fadeNotes = false; + for (note in wooshNotes) { + if (!note.exists) { + Log.warning('well the note isnt real'); + continue; + } + var strumline:Strumline = strumlineGroup.members[note.strumlineIndex]; + if (strumline != null) { + var lane:Lane = strumline.getLane(note.laneIndex); + if (lane != null) lane.wooshNotes.add(note); + } + } + for (strumline in strumlineGroup) { + for (lane in strumline.lanes) + lane.woosh(); + } + wooshNotes.resize(0); + restartingSong = false; + if (playCountdown) { - for (strumline in strumlineGroup) - strumline.visible = false; + if (fadeNotes) { + for (strumline in strumlineGroup) + strumline.visible = false; + } for (tick in ['THREE', 'TWO', 'ONE', 'GO']) { Paths.sound('gameplay/countdown/funkin/intro$tick'); @@ -503,20 +529,10 @@ class PlayState extends FunkinState { flipUI(); } } else if (!dead) { - if (FlxG.keys.justPressed.ENTER && !pauseDisabled) { - paused = !paused; - var pauseVocals:Bool = (paused || conductorInUse.songPosition < 0); - if (pauseVocals) { - music.pause(); - } else { - music.play(true, conductorInUse.songPosition); - syncMusic(false, true); - } - FlxTimer.globalManager.forEach((timer:FlxTimer) -> { if (!timer.finished) timer.active = !paused; }); - FlxTween.globalManager.forEach((tween:FlxTween) -> { if (!tween.finished) tween.active = !paused; }); - - refreshRPCTitle(); - refreshRPCTime(); + if (FlxG.keys.justPressed.ENTER && !paused && !pauseDisabled) { + FlxTimer.globalManager.forEach((timer:FlxTimer) -> { if (!timer.finished) timer.active = false; }); + FlxTween.globalManager.forEach((tween:FlxTween) -> { if (!tween.finished) tween.active = false; }); + openSubState(new PauseSubState(this)); } if (FlxG.keys.justPressed.R && !paused) @@ -553,6 +569,32 @@ class PlayState extends FunkinState { hscripts.run('drawPost'); } + override public function onSubStateOpened(subState):Void { + if (subState is PauseSubState) { + paused = true; + music.pause(); + + camHUD.active = camGame.active = false; + + refreshRPCTitle(); + refreshRPCTime(); + } + } + override public function onSubStateClosed(subState):Void { + if (subState is PauseSubState) { + paused = false; + music.play(true, conductorInUse.songPosition); + syncMusic(false, true); + + camHUD.active = camGame.active = true; + FlxTimer.globalManager.forEach((timer:FlxTimer) -> { if (!timer.finished) timer.active = true; }); + FlxTween.globalManager.forEach((tween:FlxTween) -> { if (!tween.finished) tween.active = true; }); + + refreshRPCTitle(); + refreshRPCTime(); + } + } + public function stepHitEvent(step:Int) { syncMusic(true); hscripts.run('stepHit', [step]); @@ -696,6 +738,10 @@ class PlayState extends FunkinState { songFinished = true; dispatchSongEvent({type: SONG_FINISH}); } + public function restartSong() { + restartingSong = true; + FlxG.resetState(); + } public function popCountdown(image:String):FunkinSprite { if (Paths.image(image) == null) return null; @@ -970,6 +1016,22 @@ class PlayState extends FunkinState { } override public function destroy() { + if (restartingSong) { + for (strumline in strumlineGroup) { + for (lane in strumline.lanes) { + for (note in lane.notes) { + if (!note.alive) { + note.destroy(); + continue; + } + wooshNotes.push(note); + } + while (lane.notes.length > 0) // this is fucking stupid + lane.notes.remove(lane.notes.members[0], true); + } + } + } + Paths.library = ''; funkin.backend.play.NoteStyle.wipe(); From f456b9de9570c373c2506bee0f560f9357c83380 Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Mon, 21 Jul 2025 07:13:55 -0600 Subject: [PATCH 71/73] more hold garbage --- source/funkin/objects/play/ArrowPath.hx | 3 +- source/funkin/objects/play/Note.hx | 61 +++++++++++++++++-------- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/source/funkin/objects/play/ArrowPath.hx b/source/funkin/objects/play/ArrowPath.hx index f7d9272..b2704a8 100644 --- a/source/funkin/objects/play/ArrowPath.hx +++ b/source/funkin/objects/play/ArrowPath.hx @@ -141,8 +141,7 @@ class ArrowPathStrip extends FunkinStrip { } public function updateRender(drawData:NoteTailDrawData):Void { - if (graphic == null) - return; + if (graphic == null) return; // update vertices var width:Float = (thickness * .5 * drawData.scaleTo); diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 5526cb7..5eac6f7 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -9,9 +9,11 @@ import funkin.backend.play.NoteStyle; import funkin.objects.CharacterGroup; import funkin.backend.FunkinStrip; +import openfl.geom.ColorTransform; import flixel.graphics.frames.FlxFrame; import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; +using flixel.util.FlxColorTransformUtil; using funkin.backend.play.NoteStyle.NoteStyleUtil; @:structInit class ChartNote extends FlxBasic implements ITimeSortable { @@ -477,15 +479,6 @@ class NoteTail extends Note { tailStrip?.update(elapsed); } public override function draw():Void { - alpha = multAlpha * defaultAlpha; - - if (parent != null) { - scrollFactor.copyFrom(parent.scrollFactor); - cameras = parent.cameras; - shader = parent.shader; - alpha *= parent.alpha; - color = parent.color; - } holdStrip?.copyNote(this); tailStrip?.copyNote(this); @@ -531,6 +524,7 @@ class NoteTail extends Note { copyNote(parent); copyReceptor(receptor); + copyValues(); if (renderTriangles) { updateTriangles(lane); } else { @@ -563,6 +557,17 @@ class NoteTail extends Note { if (followAngle) angle = direction + parent.direction + receptor.lane?.direction ?? 0 + 90; } + public function copyValues():Void { + alpha = multAlpha * defaultAlpha; + + if (parent != null) { + scrollFactor.copyFrom(parent.scrollFactor); + cameras = parent.cameras; + shader = parent.shader; + alpha *= parent.alpha; + color = parent.color; + } + } public function updateTriangles(lane:Lane):Void { if (!updateModchart) return; @@ -608,27 +613,32 @@ class NoteTail extends Note { var prevScale:FlxPoint = FlxPoint.weak(scale.x, scale.y); var prevPosition:FlxPoint = FlxPoint.weak(x, y); + var prevColor:FlxColor = color; scrollDistance -= height; modchartFunc(this, lane, scrollDistance); - var curPosition:FlxPoint = FlxPoint.weak(x, y); - if (renderDistance == null || scrollDistance < renderDistance) { + var curPosition:FlxPoint = FlxPoint.weak(x, y); + var size:Float; + if (adaptiveDirection) { angle = (prevPosition.degreesTo(curPosition) + 180); + size = curPosition.distanceTo(prevPosition); prevAngle ??= angle; } else { + size = height; prevAngle ??= defaultAngle; } var data:NoteTailDrawData = (drawData[drawItems] ?? new NoteTailDrawData()); - data.clip = (scrollDistance <= clipDistance ? Math.abs(scrollDistance - clipDistance) / height : 0); + data.clip = (scrollDistance <= clipDistance ? Math.abs(scrollDistance - clipDistance) / size : 0); data.copyPosition(prevPosition, curPosition); data.setScale(prevScale.x, scale.x); data.setAngle(prevAngle, angle); + data.setCT(colorTransform); data.strip = render; drawData[drawItems ++] = data; @@ -660,8 +670,8 @@ class NoteTailStrip extends FunkinStrip { this.defaultAnim = defaultAnim; indices = new DrawData(6, true, [0, 1, 2, 1, 2, 3]); - uvtData = new DrawData(8, true, [0, 0, 0, 0, 0, 0, 0, 0]); - vertices = new DrawData(8, true, [0, 0, 0, 0, 0, 0, 0, 0]); + uvtData = new DrawData(8, true, [for (i in 0 ... 8) 0]); + vertices = new DrawData(8, true, [for (i in 0 ... 8) 0]); } override function set_frame(newFrame:FlxFrame):FlxFrame { @@ -709,8 +719,7 @@ class NoteTailStrip extends FunkinStrip { } // +90 untested but SHOULD work ?? } public function updateRender(drawData:NoteTailDrawData):Void { - if (graphic == null) - return; + if (graphic == null) return; var sprXOffset:Float = -(spriteOffset.x + animOffset.x); var sprYOffset:Float = -(spriteOffset.y + animOffset.y); @@ -741,12 +750,21 @@ class NoteTailStrip extends FunkinStrip { vertices[5] = (cos + yOffset + drawData.yFrom); vertices[6] = (sin + xOffset + drawData.xFrom); // bottom right vertices[7] = (-cos + yOffset + drawData.yFrom); + + // colors[0] = colors[1] = (gradient ? drawData.colorFrom : drawData.colorTo); + // colors[2] = colors[3] = drawData.colorTo; + + if (drawData.ct != null) { + var ct:ColorTransform = drawData.ct; + colorTransform.setOffsets(ct.redOffset, ct.greenOffset, ct.blueOffset, ct.alphaOffset); + colorTransform.setMultipliers(ct.redMultiplier, ct.greenMultiplier, ct.blueMultiplier, ct.alphaMultiplier); + } } public inline function copyNote(note:Note):Void { scrollFactor.copyFrom(note.scrollFactor); + initialZoom = note.initialZoom; + zoomFactor = note.zoomFactor; shader = note.shader; - alpha = note.alpha; - color = note.color; } function set_style(newStyle:NoteStyle) { @@ -791,6 +809,8 @@ class NoteTailDrawData { public var xTo:Float = 0; public var yTo:Float = 0; + public var ct:ColorTransform = null; + public var clip:Float = 0; public var strip:Dynamic; @@ -807,6 +827,11 @@ class NoteTailDrawData { scaleFrom = from; scaleTo = to ?? from; } + public inline function setCT(copy:ColorTransform):Void { + ct ??= new ColorTransform(); + ct.setOffsets(copy.redOffset, copy.greenOffset, copy.blueOffset, copy.alphaOffset); + ct.setMultipliers(copy.redMultiplier, copy.greenMultiplier, copy.blueMultiplier, copy.alphaMultiplier); + } public inline function setPosition(x:Float, y:Float, ?xT:Float, ?yT:Float):Void { xFrom = x; yFrom = y; From bb3a0275ebaa8389e0ff3306c0d958a3eeffc9cb Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Mon, 21 Jul 2025 09:53:41 -0600 Subject: [PATCH 72/73] unify new ui stuff with options menu --- source/funkin/objects/ui/SettingItem.hx | 75 +++++++++++++ source/funkin/objects/ui/TextItem.hx | 24 +++-- source/funkin/objects/ui/TextItemGroup.hx | 27 +++-- source/funkin/states/OptionsState.hx | 123 ++++------------------ 4 files changed, 130 insertions(+), 119 deletions(-) create mode 100644 source/funkin/objects/ui/SettingItem.hx diff --git a/source/funkin/objects/ui/SettingItem.hx b/source/funkin/objects/ui/SettingItem.hx new file mode 100644 index 0000000..7925b4e --- /dev/null +++ b/source/funkin/objects/ui/SettingItem.hx @@ -0,0 +1,75 @@ +package funkin.objects.ui; + +class CheckboxItem extends SettingItem { + public var checkbox:Checkbox; + + public function new(name:String, ?save:String) { + super(name, save); + + add(checkbox = new Checkbox(0, -30)); + checkbox.scale.set(.5, .5); + checkbox.updateHitbox(); + + text.x += 100; + value ??= false; + check(value, true); + } + + public override function confirm():Void { + setValue(value == false); + check(value); + + super.confirm(); + } + + public function check(on:Bool, instant:Bool = false) { + checkbox.check(on, instant); + } +} + +class Checkbox extends FunkinSprite { + public function new(x:Float = 0, y:Float = 0) { + super(x, y); + + loadAtlas('options/checkbox'); + addAnimation('select', 'checkbox select'); + addAnimation('unselect', 'checkbox unselect'); + setAnimationOffset('select', 12, 40); + + check(false, true); + updateHitbox(); + } + + public function check(on:Bool, instant:Bool = false) { + playAnimation(on ? 'select' : 'unselect', true); + if (instant) finishAnimation(); + } +} + +class SettingItem extends TextItem { + public var value:Dynamic = null; + + public var save(default, set):String; + + public function new(name:String, ?save:String) { + super(name); + + this.save = save; + } + + public function getValue():Dynamic { + return (save == null ? value : Reflect.getProperty(Options.data, save)); + } + + public function setValue(value:Dynamic):Void { + if (save != null) Reflect.setProperty(Options.data, save, value); + this.value = value; + } + + function set_save(now:String):String { + save = now; + value = getValue(); + + return now; + } +} \ No newline at end of file diff --git a/source/funkin/objects/ui/TextItem.hx b/source/funkin/objects/ui/TextItem.hx index e65e1fe..1c7f756 100644 --- a/source/funkin/objects/ui/TextItem.hx +++ b/source/funkin/objects/ui/TextItem.hx @@ -1,18 +1,22 @@ package funkin.objects.ui; class TextItem extends FunkinSpriteGroup { + public var highlighted:Bool = false; public var onSelected:Void -> Void; + public var selected:Bool = false; + + public var startX:Float = 0; + public var startY:Float = 0; public var text:Alphabet; - public function new(name:String, ?func:Void -> Void) { + public function new(name:String, ?func:Void -> Void, scale:Float = .75) { super(); - text = new Alphabet(name); - text.scaleTo(.75, .75); - add(text); + add(text = new Alphabet(name)); + scaleTo(scale, scale); - onSelected = func; + this.onSelected = func; highlight(false); } @@ -23,12 +27,18 @@ class TextItem extends FunkinSpriteGroup { } public function highlight(on:Bool):Void { + highlighted = on; + if (on) { text.color = 0xffffcc66; - text.alpha = 1; + alpha = 1; } else { text.color = FlxColor.WHITE; - text.alpha = .65; + alpha = .65; } } + + function scaleTo(x:Float = 1, y:Float = 1):Void { + text.scaleTo(x, y); + } } \ No newline at end of file diff --git a/source/funkin/objects/ui/TextItemGroup.hx b/source/funkin/objects/ui/TextItemGroup.hx index c483ec7..a8e213a 100644 --- a/source/funkin/objects/ui/TextItemGroup.hx +++ b/source/funkin/objects/ui/TextItemGroup.hx @@ -2,8 +2,11 @@ package funkin.objects.ui; class TextItemGroup extends FunkinTypedSpriteGroup { public var itemPadding:Float = 25; + public var itemDrift:Float = 0; public var selection:Int = 0; + public var selectedItem(get, never):TextItem; + public function new() { super(); } @@ -16,27 +19,29 @@ class TextItemGroup extends FunkinTypedSpriteGroup { } public function repositionItems():Void { - var yy:Float = y; + var xx:Float = 0; + var yy:Float = 0; for (item in members) { if (item == null || !item.exists) continue; - item.y = yy; - yy += item.height + itemPadding; + item.startY = yy; + item.startX = xx; + item.setPosition(x + xx, y + yy); + + xx += itemDrift; + yy += item.text.height + itemPadding; } } public function confirm():Void { - var curOption:TextItem = members[selection]; - if (curOption != null) { - curOption.confirm(); - } + selectedItem?.confirm(); } - public function select(mod:Int = 0):Void { + public function select(mod:Int = 0, sound:Bool = true):Void { if (length == 0) return; - if (mod != 0) FunkinSound.playOnce(Paths.sound('scrollMenu'), .8); + if (mod != 0 && sound) FunkinSound.playOnce(Paths.sound('scrollMenu'), .8); var prevOption:TextItem = members[selection]; if (prevOption != null) { @@ -50,4 +55,8 @@ class TextItemGroup extends FunkinTypedSpriteGroup { curOption.highlight(true); } } + + function get_selectedItem():TextItem { + return members[selection]; + } } \ No newline at end of file diff --git a/source/funkin/states/OptionsState.hx b/source/funkin/states/OptionsState.hx index 08f23a9..6ccb293 100644 --- a/source/funkin/states/OptionsState.hx +++ b/source/funkin/states/OptionsState.hx @@ -1,35 +1,37 @@ package funkin.states; -import funkin.objects.Alphabet; +import funkin.objects.ui.*; +import funkin.objects.ui.SettingItem; class OptionsState extends FunkinState { + public var bg:FunkinSprite; public var target:FlxObject; - public var items:FlxTypedGroup; + public var items:TextItemGroup; public var inputEnabled:Bool = true; - public var settingList:Array = [ - {save: 'downscroll', display: 'Downscroll'}, - {save: 'middlescroll', display: 'Middlescroll'}, - {save: 'ghostTapping', display: 'Ghost Tapping'}, - {save: 'xtendScore', display: 'Extended Score Display'} - ]; + public static var selection:Int = 0; override public function create() { super.create(); playMusic(MainMenuState.menuMusic); - var bg:FunkinSprite = new FunkinSprite().loadTexture('mainmenu/bgMagenta'); + + bg = new FunkinSprite().loadTexture('mainmenu/bgMagenta'); bg.setGraphicSize(bg.width * 1.1); bg.scrollFactor.set(); bg.updateHitbox(); bg.screenCenter(); add(bg); - items = new FlxTypedGroup(); + items = new TextItemGroup(); + items.itemDrift = 12.5; add(items); - for (i => setting in settingList) - items.add(new SettingItem(12.5 * i, 75 * i, setting.save, setting.display, setting.type)); + items.addItem(new CheckboxItem('Downscroll', 'downscroll')); + items.addItem(new CheckboxItem('Middlescroll', 'middlescroll')); + items.addItem(new CheckboxItem('Ghost Tapping', 'ghostTapping')); + items.addItem(new CheckboxItem('Extended Score Display', 'xtendScore')); + items.select(selection, false); FlxG.camera.target = target = new FlxObject(); FlxG.camera.followLerp = 9 / 60; @@ -48,101 +50,16 @@ class OptionsState extends FunkinState { if (FlxG.keys.justPressed.UP) select(-1); if (FlxG.keys.justPressed.DOWN) select(1); - if (FlxG.keys.justPressed.ENTER) { - var curSetting:SettingItem = items.members[selection]; - if (curSetting != null && curSetting.type == BOOLEAN) { - curSetting.enabled = !curSetting.enabled; - } - } - if (FlxG.keys.justPressed.ESCAPE) { - FlxG.switchState(MainMenuState.new); - } + if (FlxG.keys.justPressed.ENTER) items.confirm(); + if (FlxG.keys.justPressed.ESCAPE) FlxG.switchState(MainMenuState.new); } public function select(mod:Int = 0) { - if (items.length == 0) return; - if (mod != 0) FunkinSound.playOnce(Paths.sound('scrollMenu'), .8); + items.select(mod); - items.members[selection].highlight(false); + if (items.selectedItem != null) + target.setPosition(items.selectedItem.x + 400, items.selectedItem.getMidpoint().y); - selection = FlxMath.wrap(selection + mod, 0, items.length - 1); - var selectedItem:SettingItem = items.members[selection]; - selectedItem.highlight(); - - target.setPosition(selectedItem.x + 400, selectedItem.getMidpoint().y); + selection = items.selection; } -} - -class SettingItem extends FlxSpriteGroup { - public var text:Alphabet; - public var type:SettingType; - public var checkbox:FunkinSprite = null; - public var settingSave:Null = null; - public var settingValue(get, default):Dynamic; - public var enabled(default, set):Bool = false; - - public function new(x:Float = 0, y:Float = 0, ?save:String, name:String = 'Unknown', type:SettingType = BOOLEAN) { - super(x, y); - - settingSave = save; - text = new Alphabet(100, 0, name); - text.scaleTo(.75, .75); - add(text); - - this.type = type; - switch (type) { - case NUMBER: - case STRING: - case BOOLEAN: - checkbox = new FunkinSprite(0, -30); - checkbox.scale.set(.5, .5); - checkbox.loadAtlas('options/checkbox'); - checkbox.addAnimation('select', 'checkbox select'); - checkbox.addAnimation('unselect', 'checkbox unselect'); - checkbox.setAnimationOffset('select', 12, 40); - checkbox.playAnimation('unselect'); - checkbox.finishAnimation(); - checkbox.updateHitbox(); - - enabled = settingValue; - checkbox.finishAnimation(); - add(checkbox); - default: - } - highlight(false); - } - inline function hasSave() return (settingSave != null && Reflect.getProperty(Options.data, settingSave) != null); - public function get_settingValue() { - return Reflect.getProperty(Options.data, settingSave); - } - public function set_enabled(on:Bool) { - if (type != BOOLEAN) return on; - // trace('$settingSave -> ${hasSave()}'); - if (hasSave() && on != settingValue) Reflect.setProperty(Options.data, settingSave, on); - checkbox.playAnimation(on ? 'select' : 'unselect'); - return enabled = on; - } - public function highlight(on:Bool = true) { - if (on) { - checkbox.alpha = 1; - text.alpha = 1; - text.color = 0xffcc66; - } else { - checkbox.alpha = .65; - text.alpha = .65; - text.color = 0xffffff; - } - } -} - -typedef SettingData = { - var save:String; - var display:String; - var ?type:SettingType; -} - -enum abstract SettingType(String) to String { - var BOOLEAN = 'bool'; - var NUMBER = 'number'; - var STRING = 'string'; } \ No newline at end of file From 2506fdb41d3b0becca69c034ceb961810fb796bf Mon Sep 17 00:00:00 2001 From: ashley <84390581+inky03@users.noreply.github.com> Date: Mon, 21 Jul 2025 11:42:48 -0600 Subject: [PATCH 73/73] rework score system --- source/funkin/backend/play/HitWindow.hx | 21 -- source/funkin/backend/play/NoteEvent.hx | 53 ++-- source/funkin/backend/play/ScoreHandler.hx | 61 ++--- source/funkin/backend/play/ScoreSystem.hx | 269 +++++++++++++++++++++ source/funkin/backend/play/Scoring.hx | 117 --------- source/funkin/objects/play/Lane.hx | 4 +- source/funkin/objects/play/Note.hx | 4 +- source/funkin/objects/play/Strumline.hx | 4 +- source/funkin/states/PlayState.hx | 4 +- 9 files changed, 326 insertions(+), 211 deletions(-) delete mode 100644 source/funkin/backend/play/HitWindow.hx create mode 100644 source/funkin/backend/play/ScoreSystem.hx delete mode 100644 source/funkin/backend/play/Scoring.hx diff --git a/source/funkin/backend/play/HitWindow.hx b/source/funkin/backend/play/HitWindow.hx deleted file mode 100644 index fd9340f..0000000 --- a/source/funkin/backend/play/HitWindow.hx +++ /dev/null @@ -1,21 +0,0 @@ -package funkin.backend.play; - -class HitWindow { - public var count:Int; - public var score:Float; - public var rating:String; - public var threshold:Float; - public var healthMod:Float; - public var accuracyMod:Float; - public var splash:Bool = false; - public var breaksCombo:Bool = false; - - public function new(rating:String, score:Float, threshold:Float, ratingMod:Float, healthMod:Float = 1) { - this.count = 0; - this.score = score; - this.rating = rating; - this.threshold = threshold; - this.healthMod = healthMod; - this.accuracyMod = ratingMod; - } -} \ No newline at end of file diff --git a/source/funkin/backend/play/NoteEvent.hx b/source/funkin/backend/play/NoteEvent.hx index 8dd3a2f..796c172 100644 --- a/source/funkin/backend/play/NoteEvent.hx +++ b/source/funkin/backend/play/NoteEvent.hx @@ -4,8 +4,9 @@ import funkin.states.PlayState; import funkin.objects.Character; import funkin.objects.play.Note; import funkin.objects.play.Lane; -import funkin.backend.play.Scoring; import funkin.objects.play.Strumline; +import funkin.backend.play.ScoreSystem; +import funkin.backend.play.ScoreHandler; using StringTools; @@ -23,9 +24,9 @@ using StringTools; public var spark:NoteSpark = null; public var splash:NoteSplash = null; - public var scoring:Scoring.Score = null; + public var score:Score = null; + public var scoring(get, set):Score; public var scoreHandler:ScoreHandler = null; - public var targetCharacter:ICharacter = null; public var perfect:Bool = false; // release event public var doSpark:Bool = false; // many vars... @@ -38,6 +39,7 @@ using StringTools; public var playAnimation:Bool = true; public var animateReceptor:Bool = true; public var singAnimation:Null = null; + public var targetCharacter:ICharacter = null; var game:PlayState = null; var inGame:Bool = false; @@ -72,25 +74,25 @@ using StringTools; if (applyRating) { applyExtraWindow(6); - scoring ??= scoreHandler?.judgeNoteHit(note, note.msTime - songPosition); + score ??= scoreHandler?.judgeNoteHit(note, note.msTime - songPosition); if (inGame) { if (popRating) { - var rating:FunkinSprite = game.popRating('gameplay/funkin/${scoring.rating}'); + var rating:FunkinSprite = game.popRating('gameplay/funkin/${score.rating}'); rating.velocity.y = -FlxG.random.int(140, 175); rating.velocity.x = FlxG.random.int(0, 10); rating.acceleration.y = 550; } if (applyHealth) - game.health += note.healthGain * scoring.healthMod; + game.health += note.healthGain * score.healthMod; } - applyScore(scoreHandler, scoring, game); - note.score = scoring; + applyScore(scoreHandler, score, game); + note.score = score; } - if (doSplash && (scoring?.hitWindow == null || scoring.hitWindow.splash)) + if (doSplash && (score?.hitWindow == null || score.hitWindow.splash)) splash = lane.splash(note); if (playAnimation && targetCharacter != null) { @@ -145,13 +147,13 @@ using StringTools; var perfectRelease:Bool = true; final songPos:Float = songPosition; - perfect = (released && songPos >= note.endMs - Scoring.holdLeniencyMS); + perfect = (released && songPos >= note.endMs - scoreHandler.system.holdLeniencyMS); - if (applyRating) { + if (applyRating && scoreHandler.system.holdScoring) { perfectRelease = perfect; var prevHitTime:Float; - if (!note.held && note.holdTime <= note.msTime + Scoring.holdLeniencyMS) { + if (!note.held && note.holdTime <= note.msTime + scoreHandler.system.holdLeniencyMS) { prevHitTime = note.msTime; } else { prevHitTime = Math.max(note.holdTime, note.msTime); @@ -167,15 +169,15 @@ using StringTools; holdDelta = Math.max(0, nextHitTime - prevHitTime); final secondDiff:Float = holdDelta * .001; - scoring ??= {score: 0, healthMod: secondDiff}; + score ??= {score: 0, healthMod: secondDiff}; if (scoreHandler != null) - scoring.score = scoreHandler.holdScorePerSecond * secondDiff; + score.score = scoreHandler.system.holdScorePerSecond * secondDiff; if (inGame && applyRating && applyHealth) - game.health += (scoring.healthMod ?? 1) * note.healthGainPerSecond; + game.health += (score.healthMod ?? 1) * note.healthGainPerSecond; - applyScore(scoreHandler, scoring, game); + applyScore(scoreHandler, score, game); if (!released) note.held = true; @@ -228,13 +230,13 @@ using StringTools; applyExtraWindow(15); if (applyRating) { - scoring ??= scoreHandler?.judgeNoteGhost(); + score ??= scoreHandler?.judgeNoteGhost(); if (inGame && applyHealth) - game.health += (scoring.healthMod ?? -.01); + game.health += (score.healthMod ?? -.01); } - applyScore(scoreHandler, scoring, game); + applyScore(scoreHandler, score, game); case LOST: note.multAlpha *= .3; @@ -251,7 +253,7 @@ using StringTools; FunkinSound.playOnce(Paths.sound('gameplay/hitsounds/miss${FlxG.random.int(1, 3)}'), FlxG.random.float(0.5, 0.6)); if (applyRating) { - scoring ??= scoreHandler?.judgeNoteMiss(note); + score ??= scoreHandler?.judgeNoteMiss(note); if (inGame) { if (popRating) { @@ -262,10 +264,10 @@ using StringTools; } if (applyHealth) - game.health -= note.healthLoss * (scoring.healthMod ?? 1); + game.health -= note.healthLoss * (score.healthMod ?? 1); } - applyScore(scoreHandler, scoring, game); + applyScore(scoreHandler, score, game); } default: } @@ -290,6 +292,13 @@ using StringTools; lane.extraWindow = extraWin; } } + + function get_scoring():Score { + return score; + } + function set_scoring(now:Score):Score { + return score = now; + } } enum abstract NoteEventType(String) to String { diff --git a/source/funkin/backend/play/ScoreHandler.hx b/source/funkin/backend/play/ScoreHandler.hx index b551d1b..663b09e 100644 --- a/source/funkin/backend/play/ScoreHandler.hx +++ b/source/funkin/backend/play/ScoreHandler.hx @@ -1,10 +1,8 @@ package funkin.backend.play; -import funkin.backend.play.Scoring; +import funkin.backend.play.ScoreSystem; import flixel.util.FlxSignal.FlxTypedSignal; -using Lambda; - class ScoreHandler { public var score:Float = 0; public var accuracyMod:Float = 0; @@ -19,23 +17,10 @@ class ScoreHandler { public var onComboChange:FlxTypedSignal Void> = new FlxTypedSignal(); public var onHit:FlxTypedSignal Void> = new FlxTypedSignal(); - public var hitWindows:Array = []; - public var holdScorePerSecond:Float; - public var system:ScoringSystem; + public var system:ScoreSystem; - public function new(system:ScoringSystem = LEGACY) { - this.system = system; - this.hitWindows = switch (system) { - case EMI: - holdScorePerSecond = 250; - Scoring.emiDefault(); - case PBOT1: - holdScorePerSecond = 250; - Scoring.pbotDefault(); - default: - holdScorePerSecond = 0; - Scoring.legacyDefault(); - } + public function new(?system:ScoreSystem) { + this.system = (system ?? new ScoreSystem()); } public function reset() { score = accuracyMod = accuracyDiv = combo = misses = 0; @@ -43,9 +28,9 @@ class ScoreHandler { } public function applyScore(score:Score) { - this.hits += score.hits ?? 0; - this.score += score.score ?? 0; - this.misses += score.misses ?? 0; + this.hits += (score.hits ?? 0); + this.score += (score.score ?? 0); + this.misses += (score.misses ?? 0); if (score.rating != null) countRating(score.rating); @@ -59,33 +44,23 @@ class ScoreHandler { } public function judgeNoteHit(note:funkin.objects.play.Note, time:Float):Score { - return switch (system) { - case EMI | WEEK7 | LEGACY: - var score:Score = Scoring.judgeLegacy(hitWindows, note.hitWindow, time); - // todo : fun stuff! - score; - case PBOT1: - var score:Score = Scoring.judgePBOT1(hitWindows, note.hitWindow, time); - score; - } + return system.judgeHit(time, note.hitWindow); + } + public function judgeNoteMiss(note:funkin.objects.play.Note):Score { + return system.judgeMiss(note); } public function judgeNoteGhost():Score { - return {score: -10, healthMod: -.01}; + return system.judgeGhost(); } - public function judgeNoteMiss(note:funkin.objects.play.Note):Score { - return switch (system) { - case EMI: - {score: -50, misses: 1, accuracyMod: 0, breaksCombo: true}; - default: - {score: -10, misses: 1, accuracyMod: 0, breaksCombo: true}; - } + public function getHitWindow(rating:String) { + return system.hitFromName(rating); } - public function getHitWindow(rating:String) - return hitWindows.find((win:HitWindow) -> win.rating == rating); - public function getRatingCount(rating:String) + public function getRatingCount(rating:String) { return ratingCount.get(rating) ?? 0; - public function countRating(rating:String, mod:Int = 1) + } + public function countRating(rating:String, mod:Int = 1) { ratingCount.set(rating, getRatingCount(rating) + mod); + } public function addMod(mod:Float = 0, div:Float = 1) { accuracyMod += mod; accuracyDiv += div; diff --git a/source/funkin/backend/play/ScoreSystem.hx b/source/funkin/backend/play/ScoreSystem.hx new file mode 100644 index 0000000..5620953 --- /dev/null +++ b/source/funkin/backend/play/ScoreSystem.hx @@ -0,0 +1,269 @@ +package funkin.backend.play; + +import funkin.objects.play.Note; + +// modern scoring system (PBOT1) +class ModernScoreSystem extends ScoreSystem { + public var scoringOffset:Float = 54.99; + public var scoringSlope:Float = .080; + + public var maxScore:Float = 500; + public var minScore:Float = 9; + + public var perfectThreshold:Float = 5; + public var missThreshold:Float = 160; + + public function new() { + super(); + name = 'PBOT1'; + useMilliseconds = true; + } + + public override function makeHitWindows():Array { + var hitWindows:Array = [ + new HitWindow('killer', 0, 12.5, 1, 2 / 1.5), + new HitWindow('sick', 0, 45, 1, 1), + new HitWindow('good', 0, 90, .8, .75 / 1.5), + new HitWindow('bad', 0, 135, .5, 0), + new HitWindow('shit', 0, 160, .2, -1 / 1.5), + new HitWindow('shit', 0, 160, 0, -2) // HORRIBLE (key mashing) + ]; // score is 0 because its calculated in judging ! + hitWindows[0].splash = hitWindows[1].splash = true; + hitWindows[3].breaksCombo = hitWindows[4].breaksCombo = hitWindows[5].breaksCombo = true; + + return hitWindows; + } + + public override function judgeHit(time:Float, hitWindow:Float):Score { + var hit:HitWindow = hitFromTime(time, hitWindow); + + var score:Float; + var accuracyMod:Float; + var absTime:Float = Math.abs(time); + + if (absTime <= perfectThreshold) { + score = maxScore; + accuracyMod = 1; + } else if (absTime >= missThreshold) { + score = minScore; + accuracyMod = 0; + } else { + var factor:Float = (1 - (1 / (1 + Math.exp(-scoringSlope * (absTime - scoringOffset))))); + score = Math.max(Math.floor(maxScore * factor + minScore), 0); + accuracyMod = (score / maxScore); + } + + return { + hits: 1, + hitWindow: hit, + rating: hit.rating, + healthMod: hit.healthMod, + breaksCombo: hit.breaksCombo, + + accuracyMod: accuracyMod, + score: score + }; + } + + public override function judgeMiss(note:Note):Score { + var miss:Score = super.judgeMiss(note); + miss.score = -100; + return miss; + } +} + +// emi scoring system (fx3) +class EmiScoreSystem extends ScoreSystem { + public function new() { + super(); + name = 'Emi'; + } + + public override function makeHitWindows():Array { + var hitWindows:Array = [ + new HitWindow('killer', 500, .06, 1, 1), + new HitWindow('sick', 350, .3, 1, .75), + new HitWindow('good', 200, .6, .8, .25), + new HitWindow('bad', 100, .9, .5, -.25), + new HitWindow('shit', 50, 1, .2, -.5), + new HitWindow('shit', -50, 1, 0, -2) // HORRIBLE (key mashing) + ]; + hitWindows[0].splash = hitWindows[1].splash = true; + hitWindows[3].breaksCombo = hitWindows[4].breaksCombo = hitWindows[5].breaksCombo = true; + + return hitWindows; + } + + public override function judgeMiss(note:Note):Score { + var miss:Score = super.judgeMiss(note); + miss.score = -50; + return miss; + } +} + +// legacy scoring system +class LegacyScoreSystem extends ScoreSystem { + public function new() { + super(); + name = 'Legacy'; + holdScoring = false; + } + + public override function makeHitWindows():Array { + var hitWindows:Array = [ + new HitWindow('sick', 350, .2, 1), + new HitWindow('good', 200, .75, 1), + new HitWindow('bad', 100, .9, 1), + new HitWindow('shit', 50, 1, 1) + ]; + hitWindows[0].splash = true; + + return hitWindows; + } +} + +// custom scoring system (scripting purposes) +class CustomScoreSystem extends ScoreSystem { + public var customJudgeHit:Float -> Float -> Score = null; + public var customJudgeMiss:Note -> Score = null; + public var customJudgeGhost:Void -> Score = null; + + public function new(name:String = 'Custom', ?customHitWindows:Array) { + super(); + this.name = name; + this.hitWindows = (customHitWindows ?? hitWindows); + } + + public override function judgeHit(time:Float, range:Float):Score { + if (customJudgeHit != null) + return customJudgeHit(time, range); + return super.judgeHit(time, range); + } + + public override function judgeMiss(note:Note):Score { + if (customJudgeMiss != null) + return customJudgeMiss(note); + return super.judgeMiss(note); + } + + public override function judgeGhost():Score { + if (customJudgeGhost != null) + return customJudgeGhost(); + return super.judgeGhost(); + } +} + +// default scoring system +class ScoreSystem { + public static var safeFrames:Float = 10; + + public var name:String = 'Default'; + + public var holdScoring:Bool = true; + public var holdLeniencyMS:Float = 75; + public var holdScorePerSecond:Float = 250; + public var useMilliseconds:Bool = false; + + public var hitWindows:Array; + + public function new() { + hitWindows = makeHitWindows(); + } + + public function makeHitWindows():Array { + var hitWindows:Array = [ + new HitWindow('sick', 350, .2, 1), + new HitWindow('good', 200, .75, .8), + new HitWindow('bad', 100, .9, .5), + new HitWindow('shit', 50, 1, .2), + new HitWindow('shit', 0, 1, 0) // HORRIBLE (key mashing) + ]; + hitWindows[0].splash = true; + + return hitWindows; + } + + public function hitFromName(name:String):HitWindow { + return Lambda.find(hitWindows, (window:HitWindow) -> window.rating == name); + } + + public function hitFromTime(time:Float, range:Float):HitWindow { + if (useMilliseconds) range = 1; + + for (window in hitWindows) { + if (Math.abs(time) <= window.threshold * range) + return window; + } + + return hitWindows[hitWindows.length - 1]; + } + + public function judgeHit(time:Float, range:Float):Score { + var hit:HitWindow = hitFromTime(time, range); + + return { + hits: 1, + hitWindow: hit, + rating: hit.rating, + healthMod: hit.healthMod, + accuracyMod: hit.accuracyMod, + breaksCombo: hit.breaksCombo, + score: hit.score + }; + } + + public function judgeMiss(note:Note):Score { + return { + score: -10, + misses: 1, + accuracyMod: 0, + breaksCombo: true + } + } + + public function judgeGhost():Score { + return { + score: -10, + healthMod: -.01 + } + } + + public function toString():String { + return 'ScoreSystem($name)'; + } +} + +class HitWindow { + public var count:Int; + public var score:Float; + public var rating:String; + public var threshold:Float; + public var healthMod:Float; + public var accuracyMod:Float; + public var splash:Bool = false; + public var breaksCombo:Bool = false; + + public function new(rating:String, score:Float, threshold:Float, ratingMod:Float, healthMod:Float = 1) { + this.count = 0; + this.score = score; + this.rating = rating; + this.threshold = threshold; + this.healthMod = healthMod; + this.accuracyMod = ratingMod; + } + + public function toString():String { + return 'HitWindow($rating | ${Math.round(accuracyMod * 10000) / 100}%)'; + } +} + +typedef Score = { + var ?rating:String; + var ?hitWindow:HitWindow; + var ?accuracyMod:Float; + var ?breaksCombo:Bool; + var ?healthMod:Float; + var ?score:Float; + var ?misses:Int; + var ?hits:Int; +} \ No newline at end of file diff --git a/source/funkin/backend/play/Scoring.hx b/source/funkin/backend/play/Scoring.hx deleted file mode 100644 index 867f4f5..0000000 --- a/source/funkin/backend/play/Scoring.hx +++ /dev/null @@ -1,117 +0,0 @@ -package funkin.backend.play; - -class Scoring { - public static var safeFrames:Float = 10; - public static var holdLeniencyMS:Float = 75; - - public static function legacyDefault() { - var windows:Array = [ - new HitWindow('sick', 350, .2, 1), - new HitWindow('good', 200, .75, .8), - new HitWindow('bad', 100, .9, .5), - new HitWindow('shit', 50, 1, .2), - new HitWindow('shit', 50, 1.1, 0) // HORRIBLE (key mashing) - ]; - windows[0].splash = true; - - return windows; - } - public static function emiDefault() { - var windows:Array = legacyDefault(); - windows[2].breaksCombo = true; - windows[3].breaksCombo = true; - windows[4].breaksCombo = true; - - windows[0].threshold = .3; - windows[1].threshold = .6; - - windows[1].healthMod = .75; - windows[2].healthMod = .25; - windows[3].healthMod = -.5; - windows[4].healthMod = -2; - - var killer:HitWindow = new HitWindow('killer', 500, .06, 1); - windows.unshift(killer); - killer.splash = true; - - return windows; - } - public static function pbotDefault() { - final thresholdMS:Float = 160; - var windows:Array = [ - new HitWindow('killer', 0, 12.5 / thresholdMS, 1, 2 / 1.5), - new HitWindow('sick', 0, 45 / thresholdMS, 1, 1), - new HitWindow('good', 0, 90 / thresholdMS, .8, .75 / 1.5), - new HitWindow('bad', 0, 135 / thresholdMS, .5, 0), - new HitWindow('shit', 0, 1, .2, -1 / 1.5), - new HitWindow('shit', 0, 1.1, 0, -2) - ]; - windows[0].splash = true; - windows[1].splash = true; - - windows[3].breaksCombo = true; - windows[4].breaksCombo = true; - windows[5].breaksCombo = true; - - return windows; - } - - public static function judgeLegacy(hitWindows:Array, hitWindow:Float, time:Float):Score { - var win:HitWindow = hitWindows[hitWindows.length - 1]; - for (window in hitWindows) { - if (Math.abs(time) <= window.threshold * hitWindow) { - win = window; - break; - } - } - - return {hits: 1, hitWindow: win, rating: win.rating, healthMod: win.healthMod, accuracyMod: win.accuracyMod, score: win.score, breaksCombo: win.breaksCombo}; - } - public static function judgePBOT1(hitWindows:Array, hitWindow:Float, time:Float):Score { - var win:HitWindow = hitWindows[hitWindows.length - 1]; - for (window in hitWindows) { - if (Math.abs(time) <= window.threshold * hitWindow) { - win = window; - break; - } - } - - final scoringOffset:Float = 54.99; // probably move these to Scoring - final scoringSlope:Float = .080; - final maxScore:Float = 500; - final minScore:Float = 9; - - var score:Float; - var accuracyMod:Float; - var absTime:Float = Math.abs(time); - if (absTime / hitWindow <= 5 / 160) { - score = maxScore; - accuracyMod = 1; - } else { - var factor:Float = 1 - (1 / (1 + Math.exp(-scoringSlope * (absTime - scoringOffset)))); - score = Math.floor(maxScore * factor + minScore); - accuracyMod = score / maxScore; - } - - return {hits: 1, hitWindow: win, rating: win.rating, healthMod: win.healthMod, accuracyMod: accuracyMod, score: score, breaksCombo: win.breaksCombo}; - } -} - -typedef Score = { - var ?rating:String; - var ?hitWindow:HitWindow; - var ?accuracyMod:Float; - var ?breaksCombo:Bool; - var ?healthMod:Float; - var ?score:Float; - var ?misses:Int; - var ?hits:Int; -} - -enum abstract ScoringSystem(String) to String { - var LEGACY = 'legacy'; // rating - var WEEK7 = 'week7'; - var EMI = 'emis'; - - var PBOT1 = 'pbot1'; // timing -} \ No newline at end of file diff --git a/source/funkin/objects/play/Lane.hx b/source/funkin/objects/play/Lane.hx index 7547668..7dbac5b 100644 --- a/source/funkin/objects/play/Lane.hx +++ b/source/funkin/objects/play/Lane.hx @@ -4,9 +4,9 @@ import haxe.Constraints; import funkin.shaders.RGBSwap; import funkin.objects.Character; import funkin.objects.play.Note; -import funkin.backend.play.Scoring; import funkin.backend.play.NoteEvent; import funkin.backend.play.NoteStyle; +import funkin.backend.play.ScoreSystem; import funkin.backend.rhythm.Conductor; import flixel.input.keyboard.FlxKey; @@ -35,7 +35,7 @@ class Lane extends FunkinSpriteGroup { public var scrollSpeed(default, set):Float = 1; public var direction:Float = 90; public var spawnRadius:Float; - public var hitWindow:Float = Scoring.safeFrames / 60 * 1000; + public var hitWindow:Float = (ScoreSystem.safeFrames * 1000 / 60); public var conductorInUse:Conductor = FunkinState.getCurrentConductor(); public var inputKeys:Array = []; public var character:ICharacter = null; diff --git a/source/funkin/objects/play/Note.hx b/source/funkin/objects/play/Note.hx index 5eac6f7..3035700 100644 --- a/source/funkin/objects/play/Note.hx +++ b/source/funkin/objects/play/Note.hx @@ -2,10 +2,10 @@ package funkin.objects.play; import funkin.shaders.RGBSwap; import funkin.objects.play.Lane; -import funkin.backend.play.Scoring; import funkin.backend.rhythm.Event; import funkin.backend.FunkinSprite; import funkin.backend.play.NoteStyle; +import funkin.backend.play.ScoreSystem; import funkin.objects.CharacterGroup; import funkin.backend.FunkinStrip; @@ -130,7 +130,7 @@ class Note extends NoteObject { @resetVar public var healthLoss:Float = 6.0 / 100; @resetVar public var healthGain:Float = 1.5 / 100; @resetVar public var healthGainPerSecond:Float = 7.5 / 100; // hold bonus - @resetVar public var hitWindow:Float = Scoring.safeFrames * 1000 / 60; + @resetVar public var hitWindow:Float = (ScoreSystem.safeFrames * 1000 / 60); @resetVar public var hitPriority:Float = 1; @resetVar public var multAlpha:Float = 1; diff --git a/source/funkin/objects/play/Strumline.hx b/source/funkin/objects/play/Strumline.hx index dc6be5a..2e4e704 100644 --- a/source/funkin/objects/play/Strumline.hx +++ b/source/funkin/objects/play/Strumline.hx @@ -2,9 +2,9 @@ package funkin.objects.play; import funkin.objects.Character; import funkin.objects.play.Note; -import funkin.backend.play.Scoring; import funkin.backend.play.NoteEvent; import funkin.backend.play.NoteStyle; +import funkin.backend.play.ScoreSystem; import flixel.util.FlxAxes; import flixel.input.keyboard.FlxKey; @@ -33,7 +33,7 @@ class Strumline extends FunkinSpriteGroup { public var allowInput(default, set):Bool = true; public var character(default, set):ICharacter = null; public var noteClass(default, set):Class = Note; - public var hitWindow(default, set):Float = Scoring.safeFrames / 60 * 1000; + public var hitWindow(default, set):Float = (ScoreSystem.safeFrames * 1000 / 60); //oh dear function set_cpu(isCpu:Bool) { for (lane in lanes) lane.cpu = isCpu; return cpu = isCpu; } diff --git a/source/funkin/states/PlayState.hx b/source/funkin/states/PlayState.hx index 5958d76..f2bcfab 100644 --- a/source/funkin/states/PlayState.hx +++ b/source/funkin/states/PlayState.hx @@ -6,11 +6,11 @@ import flixel.util.FlxSignal.FlxTypedSignal; import funkin.backend.scripting.HScript; import funkin.backend.play.ScoreHandler; +import funkin.backend.play.ScoreSystem; import funkin.backend.play.IPlayEvent; import funkin.backend.play.SongEvent; import funkin.backend.play.NoteStyle; import funkin.backend.play.NoteEvent; -import funkin.backend.play.Scoring; import funkin.backend.play.Chart; import funkin.objects.CharacterGroup; import funkin.objects.Character; @@ -65,7 +65,7 @@ class PlayState extends FunkinState { public var songName:String; public var simple:Bool; - public var scoring:ScoreHandler = new ScoreHandler(EMI); + public var scoring:ScoreHandler = new ScoreHandler(new EmiScoreSystem()); @:isVar public var score(get, set):Float = 0; @:isVar public var misses(get, set):Int = 0; @:isVar public var combo(get, set):Int = 0;