Files
FNF-i486-Engine/source/options/NoteOffsetState.hx
JordanSantiagoYT 08699d150b PEAK!!!!!
Fixed the rating sprites in the Note Offset menu being HaxeFlixel logos (closes #690)
Added the Hold Note Splashes from Base 0.3.X and up (special thanks to Psych Online  (more specifically, NotMagniill and Snirozu) for the code)
2024-10-25 00:33:30 -04:00

475 lines
12 KiB
Haxe

package options;
import flixel.util.FlxStringUtil;
import flixel.tweens.FlxEase;
import flixel.tweens.FlxTween;
import flixel.tweens.FlxEase;
import flixel.text.FlxText;
import flixel.group.FlxSpriteGroup;
import flixel.group.FlxGroup.FlxTypedGroup;
import flixel.util.FlxColor;
import flixel.FlxSprite;
import flixel.FlxCamera;
import flixel.FlxG;
import flixel.ui.FlxBar;
import flixel.math.FlxPoint;
using StringTools;
class NoteOffsetState extends MusicBeatState
{
var boyfriend:Character;
var gf:Character;
public var camHUD:FlxCamera;
public var camGame:FlxCamera;
public var camOther:FlxCamera;
var coolText:FlxText;
var rating:FlxSprite;
var comboNums:FlxSpriteGroup;
var dumbTexts:FlxTypedGroup<FlxText>;
var barPercent:Float = 0;
var delayMin:Int = 0;
var delayMax:Int = 500;
var timeBarBG:FlxSprite;
var timeBar:FlxBar;
var timeTxt:FlxText;
var beatText:Alphabet;
var beatTween:FlxTween;
var changeModeText:FlxText;
override public function create()
{
// Cameras
camGame = initPsychCamera();
camHUD = new FlxCamera();
camOther = new FlxCamera();
camHUD.bgColor.alpha = 0;
camOther.bgColor.alpha = 0;
FlxG.cameras.add(camHUD, false);
FlxG.cameras.add(camOther, false);
FlxG.camera.scroll.set(120, 130);
persistentUpdate = true;
FlxG.sound.pause();
// Stage
var bg:BGSprite = new BGSprite('stageback', -600, -200, 0.9, 0.9);
add(bg);
var stageFront:BGSprite = new BGSprite('stagefront', -650, 600, 0.9, 0.9);
stageFront.setGraphicSize(Std.int(stageFront.width * 1.1));
stageFront.updateHitbox();
add(stageFront);
if(!ClientPrefs.lowQuality) {
var stageLight:BGSprite = new BGSprite('stage_light', -125, -100, 0.9, 0.9);
stageLight.setGraphicSize(Std.int(stageLight.width * 1.1));
stageLight.updateHitbox();
add(stageLight);
var stageLight:BGSprite = new BGSprite('stage_light', 1225, -100, 0.9, 0.9);
stageLight.setGraphicSize(Std.int(stageLight.width * 1.1));
stageLight.updateHitbox();
stageLight.flipX = true;
add(stageLight);
var stageCurtains:BGSprite = new BGSprite('stagecurtains', -500, -300, 1.3, 1.3);
stageCurtains.setGraphicSize(Std.int(stageCurtains.width * 0.9));
stageCurtains.updateHitbox();
add(stageCurtains);
}
// Characters
gf = new Character(400, 130, 'gf');
gf.x += gf.positionArray[0];
gf.y += gf.positionArray[1];
gf.scrollFactor.set(0.95, 0.95);
boyfriend = new Character(770, 100, 'bf', true);
boyfriend.x += boyfriend.positionArray[0];
boyfriend.y += boyfriend.positionArray[1];
add(gf);
add(boyfriend);
// Combo stuff
coolText = new FlxText(0, 0, 0, '', 32);
coolText.screenCenter();
coolText.x = FlxG.width * 0.35;
rating = new FlxSprite().loadGraphic(Paths.image('ratings/default/sick'));
rating.cameras = [camHUD];
rating.setGraphicSize(Std.int(rating.width * 0.7));
rating.updateHitbox();
rating.antialiasing = ClientPrefs.globalAntialiasing;
add(rating);
comboNums = new FlxSpriteGroup();
comboNums.cameras = [camHUD];
add(comboNums);
var seperatedScore:Array<Int> = [];
for (i in 0...3)
{
seperatedScore.push(FlxG.random.int(0, 9));
}
var daLoop:Int = 0;
for (i in seperatedScore)
{
var numScore:FlxSprite = new FlxSprite(43 * daLoop).loadGraphic(Paths.image('ratings/default/num' + i));
numScore.cameras = [camHUD];
numScore.setGraphicSize(Std.int(numScore.width * 0.5));
numScore.updateHitbox();
numScore.antialiasing = ClientPrefs.globalAntialiasing;
comboNums.add(numScore);
daLoop++;
}
dumbTexts = new FlxTypedGroup<FlxText>();
dumbTexts.cameras = [camHUD];
add(dumbTexts);
createTexts();
repositionCombo();
// Note delay stuff
beatText = new Alphabet(0, 0, 'Beat Hit!', true);
beatText.scaleX = 0.6;
beatText.scaleY = 0.6;
beatText.x += 260;
beatText.alpha = 0;
beatText.acceleration.y = 250;
beatText.visible = false;
add(beatText);
timeTxt = new FlxText(0, 600, FlxG.width, "", 32);
timeTxt.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, CENTER, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK);
timeTxt.scrollFactor.set();
timeTxt.borderSize = 2;
timeTxt.visible = false;
timeTxt.cameras = [camHUD];
barPercent = ClientPrefs.noteOffset;
updateNoteDelay();
timeBarBG = new FlxSprite(0, timeTxt.y + 8).loadGraphic(Paths.image('timeBar'));
timeBarBG.setGraphicSize(Std.int(timeBarBG.width * 1.2));
timeBarBG.updateHitbox();
timeBarBG.cameras = [camHUD];
timeBarBG.screenCenter(X);
timeBarBG.visible = false;
timeBar = new FlxBar(0, timeBarBG.y + 4, LEFT_TO_RIGHT, Std.int(timeBarBG.width - 8), Std.int(timeBarBG.height - 8), this, 'barPercent', delayMin, delayMax);
timeBar.scrollFactor.set();
timeBar.screenCenter(X);
timeBar.createFilledBar(0xFF000000, 0xFFFFFFFF);
timeBar.numDivisions = 800; //How much lag this causes?? Should i tone it down to idk, 400 or 200?
timeBar.visible = false;
timeBar.cameras = [camHUD];
add(timeBarBG);
add(timeBar);
add(timeTxt);
///////////////////////
var blackBox:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, 40, FlxColor.BLACK);
blackBox.scrollFactor.set();
blackBox.alpha = 0.6;
blackBox.cameras = [camHUD];
add(blackBox);
changeModeText = new FlxText(0, 4, FlxG.width, "", 32);
changeModeText.setFormat(Paths.font("vcr.ttf"), 32, FlxColor.WHITE, CENTER);
changeModeText.scrollFactor.set();
changeModeText.cameras = [camHUD];
add(changeModeText);
updateMode();
Conductor.changeBPM(128.0);
FlxG.sound.playMusic(Paths.music('offsetSong'), 1, true);
super.create();
}
var holdTime:Float = 0;
var onComboMenu:Bool = true;
var holdingObjectType:Null<Bool> = null;
var startMousePos:FlxPoint = new FlxPoint();
var startComboOffset:FlxPoint = new FlxPoint();
override public function update(elapsed:Float)
{
var addNum:Int = 1;
if(FlxG.keys.pressed.SHIFT) addNum = 10;
if(onComboMenu)
{
var controlArray:Array<Bool> = [
FlxG.keys.justPressed.LEFT,
FlxG.keys.justPressed.RIGHT,
FlxG.keys.justPressed.UP,
FlxG.keys.justPressed.DOWN,
FlxG.keys.justPressed.A,
FlxG.keys.justPressed.D,
FlxG.keys.justPressed.W,
FlxG.keys.justPressed.S
];
if(controlArray.contains(true))
{
for (i in 0...controlArray.length)
{
if(controlArray[i])
{
switch(i)
{
case 0:
ClientPrefs.comboOffset[0] -= addNum;
case 1:
ClientPrefs.comboOffset[0] += addNum;
case 2:
ClientPrefs.comboOffset[1] += addNum;
case 3:
ClientPrefs.comboOffset[1] -= addNum;
case 4:
ClientPrefs.comboOffset[2] -= addNum;
case 5:
ClientPrefs.comboOffset[2] += addNum;
case 6:
ClientPrefs.comboOffset[3] += addNum;
case 7:
ClientPrefs.comboOffset[3] -= addNum;
}
}
}
repositionCombo();
}
// probably there's a better way to do this but, oh well.
if (FlxG.mouse.justPressed)
{
holdingObjectType = null;
FlxG.mouse.getScreenPosition(camHUD, startMousePos);
if (startMousePos.x - comboNums.x >= 0 && startMousePos.x - comboNums.x <= comboNums.width &&
startMousePos.y - comboNums.y >= 0 && startMousePos.y - comboNums.y <= comboNums.height)
{
holdingObjectType = true;
startComboOffset.x = ClientPrefs.comboOffset[2];
startComboOffset.y = ClientPrefs.comboOffset[3];
//trace('yo bro');
}
else if (startMousePos.x - rating.x >= 0 && startMousePos.x - rating.x <= rating.width &&
startMousePos.y - rating.y >= 0 && startMousePos.y - rating.y <= rating.height)
{
holdingObjectType = false;
startComboOffset.x = ClientPrefs.comboOffset[0];
startComboOffset.y = ClientPrefs.comboOffset[1];
//trace('heya');
}
}
if(FlxG.mouse.justReleased) {
holdingObjectType = null;
//trace('dead');
}
if(holdingObjectType != null)
{
if(FlxG.mouse.justMoved)
{
var mousePos:FlxPoint = FlxG.mouse.getScreenPosition(camHUD);
var addNum:Int = holdingObjectType ? 2 : 0;
ClientPrefs.comboOffset[addNum + 0] = Math.round((mousePos.x - startMousePos.x) + startComboOffset.x);
ClientPrefs.comboOffset[addNum + 1] = -Math.round((mousePos.y - startMousePos.y) - startComboOffset.y);
repositionCombo();
}
}
if(controls.RESET)
{
for (i in 0...ClientPrefs.comboOffset.length)
{
ClientPrefs.comboOffset[i] = 0;
}
repositionCombo();
}
}
else
{
if(controls.UI_LEFT_P)
{
barPercent = Math.max(delayMin, Math.min(ClientPrefs.noteOffset - 1, delayMax));
updateNoteDelay();
}
else if(controls.UI_RIGHT_P)
{
barPercent = Math.max(delayMin, Math.min(ClientPrefs.noteOffset + 1, delayMax));
updateNoteDelay();
}
var mult:Int = 1;
if(controls.UI_LEFT || controls.UI_RIGHT)
{
holdTime += elapsed;
if(controls.UI_LEFT) mult = -1;
}
if(controls.UI_LEFT_R || controls.UI_RIGHT_R) holdTime = 0;
if(holdTime > 0.5)
{
barPercent += 100 * elapsed * mult;
barPercent = Math.max(delayMin, Math.min(barPercent, delayMax));
updateNoteDelay();
}
if(controls.RESET)
{
holdTime = 0;
barPercent = 0;
updateNoteDelay();
}
}
if(controls.ACCEPT)
{
onComboMenu = !onComboMenu;
updateMode();
}
if(controls.BACK)
{
if(zoomTween != null) zoomTween.cancel();
if(beatTween != null) beatTween.cancel();
persistentUpdate = false;
FlxG.switchState(options.OptionsState.new);
FlxG.sound.playMusic(Paths.music('freakyMenu-' + ClientPrefs.daMenuMusic), 1, true);
FlxG.mouse.visible = false;
}
Conductor.songPosition = FlxG.sound.music.time;
super.update(elapsed);
}
var zoomTween:FlxTween;
var lastBeatHit:Int = -1;
override public function beatHit()
{
super.beatHit();
if(lastBeatHit == curBeat)
{
return;
}
if(curBeat % 2 == 0)
{
boyfriend.dance();
gf.dance();
}
if(curBeat % 4 == 2)
{
FlxG.camera.zoom = 1.15;
if(zoomTween != null) zoomTween.cancel();
zoomTween = FlxTween.tween(FlxG.camera, {zoom: 1}, 1, {ease: FlxEase.circOut, onComplete: function(twn:FlxTween)
{
zoomTween = null;
}
});
beatText.alpha = 1;
beatText.y = 320;
beatText.velocity.y = -150;
if(beatTween != null) beatTween.cancel();
beatTween = FlxTween.tween(beatText, {alpha: 0}, 1, {ease: FlxEase.sineIn, onComplete: function(twn:FlxTween)
{
beatTween = null;
}
});
}
lastBeatHit = curBeat;
}
function repositionCombo()
{
rating.screenCenter();
rating.x = coolText.x - 40 + ClientPrefs.comboOffset[0];
rating.y -= 60 + ClientPrefs.comboOffset[1];
comboNums.screenCenter();
comboNums.x = coolText.x - 90 + ClientPrefs.comboOffset[2];
comboNums.y += 80 - ClientPrefs.comboOffset[3];
reloadTexts();
}
function createTexts()
{
for (i in 0...4)
{
var text:FlxText = new FlxText(10, 48 + (i * 30), 0, '', 24);
text.setFormat(Paths.font("vcr.ttf"), 24, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK);
text.scrollFactor.set();
text.borderSize = 2;
dumbTexts.add(text);
text.cameras = [camHUD];
if(i > 1)
{
text.y += 24;
}
}
}
function reloadTexts()
{
for (i in 0...dumbTexts.length)
{
switch(i)
{
case 0: dumbTexts.members[i].text = 'Rating Offset:';
case 1: dumbTexts.members[i].text = '[' + ClientPrefs.comboOffset[0] + ', ' + ClientPrefs.comboOffset[1] + ']';
case 2: dumbTexts.members[i].text = 'Numbers Offset:';
case 3: dumbTexts.members[i].text = '[' + ClientPrefs.comboOffset[2] + ', ' + ClientPrefs.comboOffset[3] + ']';
}
}
}
function updateNoteDelay()
{
ClientPrefs.noteOffset = Math.round(barPercent);
timeTxt.text = 'Current offset: ' + Math.floor(barPercent) + ' ms';
}
function updateMode()
{
rating.visible = onComboMenu;
comboNums.visible = onComboMenu;
dumbTexts.visible = onComboMenu;
timeBarBG.visible = !onComboMenu;
timeBar.visible = !onComboMenu;
timeTxt.visible = !onComboMenu;
beatText.visible = !onComboMenu;
if(onComboMenu)
changeModeText.text = '< Combo Offset (Press Accept to Switch) >';
else
changeModeText.text = '< Note/Beat Delay (Press Accept to Switch) >';
changeModeText.text = changeModeText.text.toUpperCase();
FlxG.mouse.visible = onComboMenu;
}
}