package; import flixel.addons.effects.FlxSkewedSprite; import flixel.FlxG; import flixel.FlxSprite; import flixel.graphics.frames.FlxAtlasFrames; import flixel.math.FlxMath; import flixel.util.FlxColor; #if polymod import polymod.format.ParseRules.TargetSignatureElement; #end import PlayState; using StringTools; class Note extends FlxSprite { public var strumTime:Float = 0; public var mustPress:Bool = false; public var noteData:Int = 0; public var rawNoteData:Int = 0; public var canBeHit:Bool = false; public var tooLate:Bool = false; public var wasGoodHit:Bool = false; public var prevNote:Note; public var modifiedByLua:Bool = false; public var sustainLength:Float = 0; public var isSustainNote:Bool = false; public var noteScore:Float = 1; public static var swagWidth:Float = 160 * 0.7; public static var PURP_NOTE:Int = 0; public static var GREEN_NOTE:Int = 2; public static var BLUE_NOTE:Int = 1; public static var RED_NOTE:Int = 3; public var rating:String = "shit"; public var dataColor:Array = ['purple', 'blue', 'green', 'red']; public function new(strumTime:Float, noteData:Int, ?prevNote:Note, ?sustainNote:Bool = false, ?inCharter:Bool = false) { super(); if (prevNote == null) prevNote = this; this.prevNote = prevNote; isSustainNote = sustainNote; x += 50; // MAKE SURE ITS DEFINITELY OFF SCREEN? y -= 2000; if (inCharter) this.strumTime = strumTime; else this.strumTime = Math.round(strumTime); if (this.strumTime < 0 ) this.strumTime = 0; this.noteData = noteData; var daStage:String = PlayState.curStage; //defaults if no noteStyle was found in chart var noteTypeCheck:String = 'normal'; if (PlayState.SONG.noteStyle == null) { switch(PlayState.storyWeek) {case 6: noteTypeCheck = 'pixel';} } else {noteTypeCheck = PlayState.SONG.noteStyle;} switch (noteTypeCheck) { case 'pixel': loadGraphic(Paths.image('weeb/pixelUI/arrows-pixels', 'week6'), true, 17, 17); if (isSustainNote) loadGraphic(Paths.image('weeb/pixelUI/arrowEnds', 'week6'), true, 7, 6); for (i in 0...4) { animation.add(dataColor[i] + 'Scroll', [i + 4]); // Normal notes animation.add(dataColor[i] + 'hold', [i]); // Holds animation.add(dataColor[i] + 'holdend', [i + 4]); // Tails } setGraphicSize(Std.int(width * PlayState.daPixelZoom)); updateHitbox(); default: frames = Paths.getSparrowAtlas('NOTE_assets'); for (i in 0...4) { animation.addByPrefix(dataColor[i] + 'Scroll', dataColor[i] + ' alone'); // Normal notes animation.addByPrefix(dataColor[i] + 'hold', dataColor[i] + ' hold'); // Hold animation.addByPrefix(dataColor[i] + 'holdend', dataColor[i] + ' tail'); // Tails } setGraphicSize(Std.int(width * 0.7)); updateHitbox(); antialiasing = true; } x += swagWidth * noteData; animation.play(dataColor[noteData] + 'Scroll'); // trace(prevNote); // we make sure its downscroll and its a SUSTAIN NOTE (aka a trail, not a note) // and flip it so it doesn't look weird. // THIS DOESN'T FUCKING FLIP THE NOTE, CONTRIBUTERS DON'T JUST COMMENT THIS OUT JESUS // then what is this lol if (FlxG.save.data.downscroll && sustainNote) flipY = true; if (isSustainNote && prevNote != null) { noteScore * 0.2; alpha = 0.6; x += width / 2; animation.play(dataColor[noteData] + 'holdend'); updateHitbox(); x -= width / 2; if (noteTypeCheck == 'pixel') x += 30; if (prevNote.isSustainNote) { prevNote.animation.play(dataColor[prevNote.noteData] + 'hold'); if(FlxG.save.data.scrollSpeed != 1) prevNote.scale.y *= Conductor.stepCrochet / 100 * 1.5 * FlxG.save.data.scrollSpeed; else prevNote.scale.y *= Conductor.stepCrochet / 100 * 1.5 * PlayState.SONG.speed; prevNote.updateHitbox(); // prevNote.setGraphicSize(); } } } override function update(elapsed:Float) { super.update(elapsed); if (mustPress) { // ass if (isSustainNote) { if (strumTime > Conductor.songPosition - (Conductor.safeZoneOffset * 1.5) && strumTime < Conductor.songPosition + (Conductor.safeZoneOffset * 0.5)) canBeHit = true; else canBeHit = false; } else { if (strumTime > Conductor.songPosition - Conductor.safeZoneOffset && strumTime < Conductor.songPosition + Conductor.safeZoneOffset) canBeHit = true; else canBeHit = false; } if (strumTime < Conductor.songPosition - Conductor.safeZoneOffset * Conductor.timeScale && !wasGoodHit) tooLate = true; } else { canBeHit = false; if (strumTime <= Conductor.songPosition) wasGoodHit = true; } if (tooLate) { if (alpha > 0.3) alpha = 0.3; } } }