From e53493f831f7894ed5bca23a86cbc4d240e8b407 Mon Sep 17 00:00:00 2001 From: Yoshman29 <81191621+YoshiCrafter29@users.noreply.github.com> Date: Thu, 3 Nov 2022 19:14:17 +0100 Subject: [PATCH] fuck --- assets/data/weeks.xml | 4 +- assets/images/menus/storymenu/weeks/week6.png | Bin 6998 -> 6965 bytes buildnumber.txt | 2 +- source/funkin/game/Highscore.hx | 4 +- source/funkin/menus/StoryMenuState.hx | 114 ++++++++++++++++-- source/funkin/menus/StoryMenuState_old.hx | 2 +- source/funkin/system/CoolUtil.hx | 26 +++- 7 files changed, 135 insertions(+), 17 deletions(-) diff --git a/assets/data/weeks.xml b/assets/data/weeks.xml index b7009bc7..bbae5b33 100644 --- a/assets/data/weeks.xml +++ b/assets/data/weeks.xml @@ -23,7 +23,7 @@ - + @@ -35,7 +35,7 @@ - + diff --git a/assets/images/menus/storymenu/weeks/week6.png b/assets/images/menus/storymenu/weeks/week6.png index 8a45fb52e0fc17b780ba8438b43817c552f05970..5376975c08412aa4caba91524d0e2df7dfd992d0 100644 GIT binary patch literal 6965 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 literal 6998 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 - weekScores = FlxG.save.data.weekScores.getDefault(new Map()); + songScores = CoolUtil.getDefault(FlxG.save.data.songScores, new Map()); + weekScores = CoolUtil.getDefault(FlxG.save.data.weekScores, new Map()); for(k=>e in songScores) if (e is Int) diff --git a/source/funkin/menus/StoryMenuState.hx b/source/funkin/menus/StoryMenuState.hx index 3d63a0a9..5b80d362 100644 --- a/source/funkin/menus/StoryMenuState.hx +++ b/source/funkin/menus/StoryMenuState.hx @@ -1,5 +1,8 @@ package funkin.menus; +import funkin.system.XMLUtil; +import flixel.graphics.frames.FlxFramesCollection; +import flixel.group.FlxGroup.FlxTypedGroup; import funkin.game.Highscore; import flixel.tweens.FlxTween; import openfl.utils.Assets; @@ -26,12 +29,18 @@ class StoryMenuState extends MusicBeatState { public var weekBG:FlxSprite; public var leftArrow:FlxSprite; public var rightArrow:FlxSprite; + public var blackBar:FlxSprite; public var lerpScore:Float = 0; public var intendedScore:Int = 0; public var canSelect:Bool = true; + public var weekSprites:FlxTypedGroup; + public var characterSprites:FlxTypedGroup; + + public var charFrames:Map = []; + public override function create() { super.create(); loadXMLs(); @@ -39,6 +48,11 @@ class StoryMenuState extends MusicBeatState { persistentUpdate = persistentDraw = true; // WEEK INFO + blackBar = new FlxSprite(0, 0).makeGraphic(1, 1, 0xFFFFFFFF); + blackBar.color = 0xFF000000; + blackBar.setGraphicSize(FlxG.width, 56); + blackBar.updateHitbox(); + scoreText = new FunkinText(10, 10, 0, "SCORE: -", 36); scoreText.setFormat(Paths.font("vcr.ttf"), 32); @@ -51,6 +65,7 @@ class StoryMenuState extends MusicBeatState { weekBG.setGraphicSize(FlxG.width, 400); weekBG.updateHitbox(); + weekSprites = new FlxTypedGroup(); // DUMBASS ARROWS var assets = Paths.getSparrowAtlas('menus/storymenu/assets'); @@ -69,14 +84,21 @@ class StoryMenuState extends MusicBeatState { } rightArrow.x -= rightArrow.width; - tracklist = new FunkinText(64, weekBG.y + weekBG.height + 44, Std.int(((FlxG.width - 400) / 2) - 128), "TRACKS", 32); + tracklist = new FunkinText(16, weekBG.y + weekBG.height + 44, Std.int(((FlxG.width - 400) / 2) - 80), "TRACKS", 32); tracklist.alignment = CENTER; tracklist.color = 0xFFE55777; - for(e in [scoreText, weekTitle, weekBG, tracklist]) + add(weekSprites); + for(e in [blackBar, scoreText, weekTitle, weekBG, tracklist]) { + e.scrollFactor.set(); add(e); + } + add(characterSprites); + + for(i=>week in weeks) { + var spr:MenuItem = new MenuItem(0, (i * 120) + 480, 'menus/storymenu/weeks/${week.sprite}'); + weekSprites.add(spr); - for(week in weeks) { for(e in week.difficulties) { var le = e.toLowerCase(); if (difficultySprites[le] == null) { @@ -84,12 +106,14 @@ class StoryMenuState extends MusicBeatState { diffSprite.loadAnimatedGraphic(Paths.image('menus/storymenu/difficulties/${le}')); diffSprite.setUnstretchedGraphicSize(Std.int(rightArrow.x - leftArrow.x - leftArrow.width), Std.int(leftArrow.height), false, 1); diffSprite.antialiasing = true; + diffSprite.scrollFactor.set(); add(diffSprite); difficultySprites[le] = diffSprite; } } } + changeWeek(0, true); } @@ -123,6 +147,7 @@ class StoryMenuState extends MusicBeatState { public function changeDifficulty(change:Int, force:Bool = false) { if (change == 0 && !force) return; + CoolUtil.playMenuSFX(0, 0.7); curDifficulty = FlxMath.wrap(curDifficulty + change, 0, weeks[curWeek].difficulties.length-1); if (__oldDiffName != (__oldDiffName = weeks[curWeek].difficulties[curDifficulty].toLowerCase())) { @@ -137,7 +162,7 @@ class StoryMenuState extends MusicBeatState { diffSprite.alpha = 0; diffSprite.y = leftArrow.y - 15; - FlxTween.tween(diffSprite, {y: leftArrow.y + 15, alpha: 1}, 0.07); + FlxTween.tween(diffSprite, {y: leftArrow.y, alpha: 1}, 0.07); } intendedScore = Highscore.getWeekScore(weeks[curWeek].name, weeks[curWeek].difficulties[curDifficulty]).score; @@ -147,6 +172,13 @@ class StoryMenuState extends MusicBeatState { public function changeWeek(change:Int, force:Bool = false) { if (change == 0 && !force) return; + curWeek = FlxMath.wrap(curWeek + change, 0, weeks.length-1); + + CoolUtil.playMenuSFX(); + for(k=>e in weekSprites.members) { + e.targetY = k - curWeek; + } + tracklist.text = 'TRACKS\n\n${[for(e in weeks[curWeek].songs) if (!e.hide) e.name.toUpperCase()].join('\n')}'; changeDifficulty(0, true); } @@ -168,7 +200,7 @@ class StoryMenuState extends MusicBeatState { } if (characters[char.att.name] != null) continue; var charObj:MenuCharacter = { - spritePath: Paths.image(char.getAtt('scale').getDefault('menus/storymenu/characters/${char.att.name}')), + spritePath: Paths.image(char.getAtt('sprite').getDefault('menus/storymenu/characters/${char.att.name}')), scale: Std.parseFloat(char.getAtt('scale')).getDefault(1), xml: char }; @@ -187,6 +219,17 @@ class StoryMenuState extends MusicBeatState { songs: [], difficulties: ['easy', 'normal', 'hard'] }; + + var diffNodes = week.nodes.difficulty; + if (diffNodes.length > 0) { + var diffs:Array = []; + for(e in diffNodes) { + if (e.has.name) diffs.push(e.att.name); + } + if (diffs.length > 0) + weekObj.difficulties = diffs; + } + if (week.has.chars) { for(k=>e in week.att.chars.split(",")) { if (e.trim() == "" || e == "none" || e == "null") @@ -202,7 +245,7 @@ class StoryMenuState extends MusicBeatState { } weekObj.songs.push({ name: song.att.name, - hide: week.getAtt('hide').getDefault('false') == "true" + hide: song.getAtt('hide').getDefault('false') == "true" }); } if (weekObj.songs.length <= 0) { @@ -236,4 +279,61 @@ typedef MenuCharacter = { var spritePath:String; var xml:Access; var scale:Float; -} \ No newline at end of file + // var frames:FlxFramesCollection; +} + +class MenuCharacterSprite extends FlxSprite +{ + public var character:String; + + public function new(pos:Int, path:String) { + super(FlxG.width * (0.25 * pos), 80); + } + + public function changeCharacter(data:MenuCharacter) { + CoolUtil.loadAnimatedGraphic(this, Paths.image(data.spritePath)); + for(e in data.xml.nodes.anim) + XMLUtil.addXMLAnimation(this, e); + } +} +class MenuItem extends FlxSprite +{ + public var targetY:Float = 0; + + public function new(x:Float, y:Float, path:String) + { + super(x, y); + CoolUtil.loadAnimatedGraphic(this, Paths.image(path)); + screenCenter(X); + antialiasing = true; + } + + private var isFlashing:Bool = false; + + public function startFlashing():Void + { + isFlashing = true; + } + + // if it runs at 60fps, fake framerate will be 6 + // if it runs at 144 fps, fake framerate will be like 14, and will update the graphic every 0.016666 * 3 seconds still??? + // so it runs basically every so many seconds, not dependant on framerate?? + // I'm still learning how math works thanks whoever is reading this lol + // var fakeFramerate:Int = Math.round((1 / FlxG.elapsed) / 10); + + // hi ninja muffin + // i have found a more efficient way + // dw, judging by how week 7 looked you prob know how to do maths + // goodbye + var time:Float = 0; + + override function update(elapsed:Float) + { + super.update(elapsed); + time += elapsed; + y = CoolUtil.fpsLerp(y, (targetY * 120) + 480, 0.17); + + if (isFlashing) + color = (time % 0.1 > 0.05) ? FlxColor.WHITE : 0xFF33ffff; + } +} diff --git a/source/funkin/menus/StoryMenuState_old.hx b/source/funkin/menus/StoryMenuState_old.hx index 6fc962c6..11cf635a 100644 --- a/source/funkin/menus/StoryMenuState_old.hx +++ b/source/funkin/menus/StoryMenuState_old.hx @@ -462,7 +462,7 @@ class MenuItem extends FlxSpriteGroup override function update(elapsed:Float) { super.update(elapsed); - y = FlxMath.lerp(y, (targetY * 120) + 480, 0.17); + y = CoolUtil.fpsLerp(y, (targetY * 120) + 480, 0.17); if (isFlashing) flashingInt += 1; diff --git a/source/funkin/system/CoolUtil.hx b/source/funkin/system/CoolUtil.hx index 5c704c40..c639ba84 100644 --- a/source/funkin/system/CoolUtil.hx +++ b/source/funkin/system/CoolUtil.hx @@ -1,5 +1,8 @@ package funkin.system; +import flixel.graphics.frames.FlxAtlasFrames; +import flixel.system.FlxAssets.FlxGraphicAsset; +import flixel.graphics.FlxGraphic; import haxe.io.Path; import haxe.xml.Access; import flixel.input.keyboard.FlxKey; @@ -12,6 +15,8 @@ import flixel.FlxSprite; import flixel.FlxObject; import flixel.FlxCamera; import flixel.util.FlxAxes; +import flixel.graphics.frames.FlxFrame; +import flixel.graphics.frames.FlxFramesCollection; using StringTools; @@ -231,12 +236,25 @@ class CoolUtil return array[array.length-1]; } - public static function loadAnimatedGraphic(spr:FlxSprite, path:String) { + public static function loadFrames(path:String, Unique:Bool = false, Key:String = null):FlxFramesCollection { var noExt = Path.withoutExtension(path); + if (Assets.exists('$noExt.xml')) { - spr.frames = Paths.getSparrowAtlasAlt(noExt); - } else { - spr.loadGraphic(path); + return Paths.getSparrowAtlasAlt(noExt); + } else if (Assets.exists('$noExt.txt')) { + return Paths.getPackerAtlasAlt(noExt); } + + var graph:FlxGraphic = FlxG.bitmap.add(path, Unique, Key); + if (graph == null) + return null; + return graph.imageFrame; + } + + public static function loadAnimatedGraphic(spr:FlxSprite, path:String) { + spr.frames = loadFrames(path); + + spr.animation.add("idle", [for(i in 0...spr.frames.frames.length) i], 24, true); + spr.animation.play("idle"); } } \ No newline at end of file