wtf am i doing

This commit is contained in:
George FunBook 2021-02-15 11:43:51 -06:00
parent fb3ed180e1
commit 99f6ad9d50
4 changed files with 255 additions and 139 deletions

View file

@ -48,7 +48,7 @@ haxelib git polymod https://github.com/larsiusprime/polymod.git
### Ignored files
I gitignore the API keys for the game, so that no one can nab them and post fake highscores on the leaderboards. But because of that the game
doesn't compile without it.
doesn't compile without it. Below is a version of APIStuff that points at a debug NG project for the game.
Just make a file in `/source` and call it `APIStuff.hx`, and copy paste this into it
@ -57,8 +57,9 @@ package;
class APIStuff
{
public static var API:String = "";
public static var EncKey:String = "";
inline public static var API:String = "51348:TtzK0rZ8";
inline public static var EncKey:String = "5NqKsSVSNKHbF9fPgZPqPg==";
inline public static var SESSION:String = null;
}
```

View file

@ -1,5 +1,8 @@
package;
import flixel.util.FlxTimer;
import flixel.FlxState;
import cpp.abi.Abi;
import flixel.FlxG;
import flixel.FlxObject;
import flixel.FlxSprite;
@ -14,19 +17,13 @@ import flixel.util.FlxColor;
import io.newgrounds.NG;
import lime.app.Application;
import ui.MenuItemList;
using StringTools;
class MainMenuState extends MusicBeatState
{
var curSelected:Int = 0;
var menuItems:FlxTypedGroup<FlxSprite>;
#if !switch
var optionShit:Array<String> = ['story mode', 'freeplay', 'donate'];
#else
var optionShit:Array<String> = ['story mode', 'freeplay'];
#end
var menuItems:MenuItemList;
var magenta:FlxSprite;
var camFollow:FlxObject;
@ -67,23 +64,38 @@ class MainMenuState extends MusicBeatState
add(magenta);
// magenta.scrollFactor.set();
menuItems = new FlxTypedGroup<FlxSprite>();
menuItems = new MenuItemList('FNF_main_menu_assets');
add(menuItems);
var tex = Paths.getSparrowAtlas('FNF_main_menu_assets');
for (i in 0...optionShit.length)
menuItems.onChange.add(onMenuItemChange);
menuItems.onAcceptPress.add(function(_)
{
var menuItem:FlxSprite = new FlxSprite(0, 60 + (i * 160));
menuItem.frames = tex;
menuItem.animation.addByPrefix('idle', optionShit[i] + " basic", 24);
menuItem.animation.addByPrefix('selected', optionShit[i] + " white", 24);
menuItem.animation.play('idle');
menuItem.ID = i;
menuItem.screenCenter(X);
menuItems.add(menuItem);
menuItem.scrollFactor.set();
menuItem.antialiasing = true;
FlxFlicker.flicker(magenta, 1.1, 0.15, false, true);
});
var hasPopupBlocker = #if web true #else false #end;
menuItems.addItem('story mode', function () startExitState(new StoryMenuState()));
menuItems.addItem('freeplay', function () startExitState(new FreeplayState()));
// addMenuItem('options', function () startExitState(new OptionMenu()));
#if (!switch)
menuItems.addItem('donate', selectDonate, hasPopupBlocker);
#end
#if newgrounds
if (NG.core.loggedIn)
menuItems.addItem("logout", selectLogout);
else
menuItems.addItem("login", selectLogin, hasPopupBlocker);
#end
// center vertically
var spacing = 160;
var top = (FlxG.height - (spacing * (menuItems.length - 1))) / 2;
for (i in 0...menuItems.length)
{
var menuItem = menuItems.members[i];
menuItem.x = FlxG.width / 2;
menuItem.y = top + spacing * i;
}
FlxG.camera.follow(camFollow, null, 0.06);
@ -95,12 +107,48 @@ class MainMenuState extends MusicBeatState
// NG.core.calls.event.logEvent('swag').send();
changeItem();
super.create();
}
var selectedSomethin:Bool = false;
function onMenuItemChange(selected:MenuItem)
{
camFollow.setPosition(selected.getGraphicMidpoint().x, selected.getGraphicMidpoint().y);
}
function selectDonate()
{
#if linux
Sys.command('/usr/bin/xdg-open', ["https://ninja-muffin24.itch.io/funkin", "&"]);
#else
FlxG.openURL('https://ninja-muffin24.itch.io/funkin');
#end
}
function selectLogin()
{
}
function selectLogout()
{
}
function startExitState(state:FlxState)
{
var duration = 0.4;
menuItems.forEach(function(item)
{
if (menuItems.selectedIndex != item.ID)
{
FlxTween.tween(item, {alpha: 0}, duration, { ease: FlxEase.quadOut });
}
else
{
item.visible = false;
}
});
new FlxTimer().start(duration, function(_) FlxG.switchState(state));
}
override function update(elapsed:Float)
{
@ -109,108 +157,9 @@ class MainMenuState extends MusicBeatState
FlxG.sound.music.volume += 0.5 * FlxG.elapsed;
}
if (!selectedSomethin)
{
if (controls.UP_P)
{
FlxG.sound.play(Paths.sound('scrollMenu'));
changeItem(-1);
}
if (controls.DOWN_P)
{
FlxG.sound.play(Paths.sound('scrollMenu'));
changeItem(1);
}
if (controls.BACK)
{
FlxG.switchState(new TitleState());
}
if (controls.ACCEPT)
{
if (optionShit[curSelected] == 'donate')
{
#if linux
Sys.command('/usr/bin/xdg-open', ["https://ninja-muffin24.itch.io/funkin", "&"]);
#else
FlxG.openURL('https://ninja-muffin24.itch.io/funkin');
#end
}
else
{
selectedSomethin = true;
FlxG.sound.play(Paths.sound('confirmMenu'));
FlxFlicker.flicker(magenta, 1.1, 0.15, false);
menuItems.forEach(function(spr:FlxSprite)
{
if (curSelected != spr.ID)
{
FlxTween.tween(spr, {alpha: 0}, 0.4, {
ease: FlxEase.quadOut,
onComplete: function(twn:FlxTween)
{
spr.kill();
}
});
}
else
{
FlxFlicker.flicker(spr, 1, 0.06, false, false, function(flick:FlxFlicker)
{
var daChoice:String = optionShit[curSelected];
switch (daChoice)
{
case 'story mode':
FlxG.switchState(new StoryMenuState());
trace("Story Menu Selected");
case 'freeplay':
FlxG.switchState(new FreeplayState());
trace("Freeplay Menu Selected");
case 'options':
FlxG.switchState(new OptionsMenu());
}
});
}
});
}
}
}
if (menuItems.active && controls.BACK)
FlxG.switchState(new TitleState());
super.update(elapsed);
menuItems.forEach(function(spr:FlxSprite)
{
spr.screenCenter(X);
});
}
function changeItem(huh:Int = 0)
{
curSelected += huh;
if (curSelected >= menuItems.length)
curSelected = 0;
if (curSelected < 0)
curSelected = menuItems.length - 1;
menuItems.forEach(function(spr:FlxSprite)
{
spr.animation.play('idle');
if (spr.ID == curSelected)
{
spr.animation.play('selected');
camFollow.setPosition(spr.getGraphicMidpoint().x, spr.getGraphicMidpoint().y);
}
spr.updateHitbox();
});
}
}

View file

@ -4,6 +4,7 @@ import flixel.FlxG;
import flixel.util.FlxSignal;
import flixel.util.FlxTimer;
import io.newgrounds.NG;
import io.newgrounds.NGLite;
import io.newgrounds.components.ScoreBoardComponent.Period;
import io.newgrounds.objects.Medal;
import io.newgrounds.objects.Score;
@ -43,7 +44,7 @@ class NGio
{
var call = NG.core.calls.app.getCurrentVersion(GAME_VER).addDataHandler(function(response:Response<GetCurrentVersionResult>)
{
GAME_VER = response.result.data.current_version;
GAME_VER = response.result.data.currentVersion;
trace('CURRENT NG VERSION: ' + GAME_VER);
gotOnlineVer = true;
});
@ -53,18 +54,28 @@ class NGio
}
}
public function new(api:String, encKey:String, ?sessionId:String)
public function new(api:String, encKey:String)
{
trace("connecting to newgrounds");
NG.createAndCheckSession(api, sessionId);
var sessionId:String = NGLite.getSessionId();
if (sessionId != null)
trace("found web session id");
#if (debug)
if (sessionId == null && APIStuff.SESSION != null)
{
sessionId = APIStuff.SESSION;
trace("using debug session id");
}
#end
NG.create(api, sessionId);
NG.core.verbose = true;
// Set the encryption cipher/format to RC4/Base64. AES128 and Hex are not implemented yet
NG.core.initEncryption(encKey); // Found in you NG project view
trace(NG.core.attemptingLogin);
if (NG.core.attemptingLogin)
{
/* a session_id was found in the loadervars, this means the user is playing on newgrounds.com
@ -73,6 +84,7 @@ class NGio
trace("attempting login");
NG.core.onLogin.add(onNGLogin);
}
//GK: taking out auto login, adding a login button to the main menu
else
{
/* They are NOT playing on newgrounds.com, no session id was found. We must start one manually, if we want to.

154
source/ui/MenuItemList.hx Normal file
View file

@ -0,0 +1,154 @@
package ui;
import flixel.util.typeLimit.OneOfTwo;
import flixel.math.FlxPoint;
import flixel.FlxG;
import flixel.effects.FlxFlicker;
import flixel.graphics.frames.FlxAtlasFrames;
import flixel.group.FlxGroup;
import flixel.tweens.FlxEase;
import flixel.tweens.FlxTween;
import flixel.util.FlxSignal;
typedef ItemAsset = OneOfTwo<String, FlxAtlasFrames>
class MenuItemList extends MenuTypedItemList<MenuItem>
{
public function addItem(x = 0.0, y = 0.0, name, callback, fireInstantly = false)
{
var i = length;
var menuItem = new MenuItem(name, tex, callback, x, y);
menuItem.fireInstantly = fireInstantly;
menuItem.ID = i;
add(menuItem);
if (i == selectedIndex)
menuItem.select();
return menuItem;
}
}
class MenuTypedItemList<T:MenuItem> extends FlxTypedGroup<T>
{
public var tex:FlxAtlasFrames;
public var selectedIndex = 0;
public var onChange(default, null) = new FlxTypedSignal<T->Void>();
public var onAcceptPress(default, null) = new FlxTypedSignal<T->Void>();
public function new (asset:ItemAsset)
{
super();
if (Std.is(asset, String))
tex = Paths.getSparrowAtlas(cast asset);
else
tex = cast asset;
}
override function update(elapsed:Float)
{
super.update(elapsed);
var controls = PlayerSettings.player1.controls;
if (controls.UP_P)
prev();
if (controls.DOWN_P)
next();
if (controls.ACCEPT)
accept();
}
public function accept()
{
var selected = members[selectedIndex];
if (selected.fireInstantly)
selected.callback();
else
{
active = false;
FlxG.sound.play(Paths.sound('confirmMenu'));
FlxFlicker.flicker(selected, 1, 0.06, true, false, function(_)
{
selected.callback();
active = true;
});
}
}
inline function prev() changeItem(-1);
inline function next() changeItem(1);
function changeItem(amount:Int)
{
FlxG.sound.play(Paths.sound('scrollMenu'));
members[selectedIndex].idle();
selectedIndex += amount;
if (selectedIndex >= length)
selectedIndex = 0;
else if (selectedIndex < 0)
selectedIndex = length - 1;
var selected = members[selectedIndex];
selected.select();
onChange.dispatch(selected);
}
override function destroy()
{
super.destroy();
tex = null;
}
}
class MenuItem extends flixel.FlxSprite
{
public var callback:Void->Void;
/**
* Set to true for things like opening URLs otherwise, it may it get blocked.
*/
public var fireInstantly = false;
public function new (name, tex, callback, x = 0.0, y = 0.0)
{
super(x, y);
frames = tex;
setItem(name, callback);
}
public function setItem(name:String, callback:Void->Void)
{
this.callback = callback;
animation.addByPrefix('idle', '$name basic', 24);
animation.addByPrefix('selected', '$name white', 24);
idle();
scrollFactor.set();
antialiasing = true;
}
function updateSize()
{
updateHitbox();
centerOrigin();
offset.copyFrom(origin);
}
public function idle()
{
animation.play('idle');
updateSize();
}
public function select()
{
animation.play('selected');
updateSize();
}
}