2023-04-05 02:24:00 +00:00
|
|
|
package funkin.ui;
|
|
|
|
|
2023-04-05 02:38:45 +00:00
|
|
|
import flixel.FlxSprite;
|
2023-04-05 02:24:00 +00:00
|
|
|
import haxe.Json;
|
2023-04-05 04:56:02 +00:00
|
|
|
import lime.utils.Assets;
|
2023-04-05 21:35:19 +00:00
|
|
|
// import flxtyped group
|
2023-05-17 20:42:58 +00:00
|
|
|
import funkin.ui.story.StoryMenuState;
|
2023-04-05 21:35:19 +00:00
|
|
|
import flixel.group.FlxGroup.FlxTypedGroup;
|
|
|
|
import flixel.util.FlxTimer;
|
|
|
|
import flixel.FlxG;
|
2023-04-06 05:39:27 +00:00
|
|
|
import flixel.math.FlxMath;
|
2023-04-05 21:35:19 +00:00
|
|
|
import flixel.util.FlxSort;
|
2023-04-06 05:39:27 +00:00
|
|
|
import flixel.util.FlxSignal;
|
|
|
|
import flixel.addons.transition.FlxTransitionableState;
|
|
|
|
import openfl.display.BitmapData;
|
|
|
|
import openfl.geom.Matrix;
|
|
|
|
import openfl.display.Sprite;
|
|
|
|
import openfl.display.Bitmap;
|
2023-04-05 02:24:00 +00:00
|
|
|
|
2023-06-01 22:52:58 +00:00
|
|
|
class StickerSubState extends MusicBeatSubState
|
2023-04-05 02:24:00 +00:00
|
|
|
{
|
2023-04-06 05:39:27 +00:00
|
|
|
public var grpStickers:FlxTypedGroup<StickerSprite>;
|
2023-04-05 21:35:19 +00:00
|
|
|
|
2023-04-06 05:39:27 +00:00
|
|
|
// yes... a damn OpenFL sprite!!!
|
|
|
|
public var dipshit:Sprite;
|
|
|
|
|
2023-04-10 18:44:32 +00:00
|
|
|
var nextState:NEXTSTATE = FREEPLAY;
|
|
|
|
|
|
|
|
public function new(?oldStickers:Array<StickerSprite>, ?nextState:NEXTSTATE = FREEPLAY):Void
|
2023-04-05 02:24:00 +00:00
|
|
|
{
|
|
|
|
super();
|
|
|
|
|
2023-04-10 18:44:32 +00:00
|
|
|
this.nextState = nextState;
|
|
|
|
|
2023-04-05 21:35:19 +00:00
|
|
|
grpStickers = new FlxTypedGroup<StickerSprite>();
|
|
|
|
add(grpStickers);
|
|
|
|
|
2023-04-10 18:44:32 +00:00
|
|
|
// makes the stickers on the most recent camera, which is more often than not... a UI camera!!
|
2023-06-09 20:54:13 +00:00
|
|
|
// grpStickers.cameras = [FlxG.cameras.list[FlxG.cameras.list.length - 1]];
|
|
|
|
grpStickers.cameras = FlxG.cameras.list;
|
2023-04-10 18:44:32 +00:00
|
|
|
|
2023-04-06 05:39:27 +00:00
|
|
|
if (oldStickers != null)
|
|
|
|
{
|
|
|
|
for (sticker in oldStickers)
|
|
|
|
{
|
|
|
|
grpStickers.add(sticker);
|
|
|
|
}
|
|
|
|
|
|
|
|
degenStickers();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
regenStickers();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function degenStickers():Void
|
|
|
|
{
|
2023-04-10 18:44:32 +00:00
|
|
|
grpStickers.cameras = FlxG.cameras.list;
|
|
|
|
|
2023-04-06 05:39:27 +00:00
|
|
|
if (dipshit != null)
|
|
|
|
{
|
|
|
|
FlxG.removeChild(dipshit);
|
|
|
|
dipshit = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (ind => sticker in grpStickers.members)
|
|
|
|
{
|
|
|
|
new FlxTimer().start(sticker.timing, _ -> {
|
|
|
|
sticker.visible = false;
|
|
|
|
|
|
|
|
if (ind == grpStickers.members.length - 1)
|
|
|
|
{
|
|
|
|
switchingState = false;
|
|
|
|
close();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function regenStickers():Void
|
|
|
|
{
|
|
|
|
if (grpStickers.members.length > 0)
|
|
|
|
{
|
|
|
|
grpStickers.clear();
|
|
|
|
}
|
|
|
|
|
2023-04-05 04:56:02 +00:00
|
|
|
var stickerInfo:StickerInfo = new StickerInfo('stickers-set-1');
|
2023-04-10 20:05:37 +00:00
|
|
|
var stickers:Map<String, Array<String>> = new Map<String, Array<String>>();
|
2023-04-05 02:38:45 +00:00
|
|
|
for (stickerSets in stickerInfo.getPack("all"))
|
|
|
|
{
|
2023-04-10 20:05:37 +00:00
|
|
|
stickers.set(stickerSets, stickerInfo.getStickers(stickerSets));
|
|
|
|
}
|
|
|
|
|
|
|
|
var xPos:Float = -100;
|
|
|
|
var yPos:Float = -100;
|
|
|
|
while (xPos <= FlxG.width)
|
|
|
|
{
|
|
|
|
var stickerSet:String = FlxG.random.getObject(stickers.keyValues());
|
|
|
|
var sticker:String = FlxG.random.getObject(stickers.get(stickerSet));
|
|
|
|
var sticky:StickerSprite = new StickerSprite(0, 0, stickerInfo.name, sticker);
|
|
|
|
sticky.visible = false;
|
|
|
|
|
|
|
|
sticky.x = xPos;
|
|
|
|
sticky.y = yPos;
|
|
|
|
xPos += sticky.frameWidth * 0.5;
|
|
|
|
|
|
|
|
if (xPos >= FlxG.width)
|
2023-04-05 04:56:02 +00:00
|
|
|
{
|
2023-04-10 20:05:37 +00:00
|
|
|
if (yPos <= FlxG.height)
|
2023-04-05 21:35:19 +00:00
|
|
|
{
|
2023-04-10 20:05:37 +00:00
|
|
|
xPos = -100;
|
|
|
|
yPos += FlxG.random.float(70, 120);
|
2023-04-05 21:35:19 +00:00
|
|
|
}
|
2023-04-05 04:56:02 +00:00
|
|
|
}
|
2023-04-05 21:35:19 +00:00
|
|
|
|
2023-04-10 20:05:37 +00:00
|
|
|
sticky.angle = FlxG.random.int(-60, 70);
|
|
|
|
grpStickers.add(sticky);
|
2023-04-05 21:35:19 +00:00
|
|
|
}
|
|
|
|
|
2023-04-06 05:39:27 +00:00
|
|
|
FlxG.random.shuffle(grpStickers.members);
|
|
|
|
|
2023-04-10 20:05:37 +00:00
|
|
|
// var stickerCount:Int = 0;
|
|
|
|
|
|
|
|
// for (w in 0...6)
|
|
|
|
// {
|
|
|
|
// var xPos:Float = FlxG.width * (w / 6);
|
|
|
|
// for (h in 0...6)
|
|
|
|
// {
|
|
|
|
// var yPos:Float = FlxG.height * (h / 6);
|
|
|
|
// var sticker = grpStickers.members[stickerCount];
|
|
|
|
// xPos -= sticker.width / 2;
|
|
|
|
// yPos -= sticker.height * 0.9;
|
|
|
|
// sticker.x = xPos;
|
|
|
|
// sticker.y = yPos;
|
|
|
|
|
|
|
|
// stickerCount++;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// for (ind => sticker in grpStickers.members)
|
|
|
|
// {
|
|
|
|
// sticker.x = (ind % 8) * sticker.width;
|
|
|
|
// var yShit:Int = Math.floor(ind / 8);
|
|
|
|
// sticker.y += yShit * sticker.height;
|
|
|
|
// // scales it juuuust a smidge
|
|
|
|
// sticker.y += 20 * yShit;
|
|
|
|
// }
|
|
|
|
|
2023-04-06 05:39:27 +00:00
|
|
|
// another damn for loop... apologies!!!
|
|
|
|
for (ind => sticker in grpStickers.members)
|
|
|
|
{
|
|
|
|
sticker.timing = FlxMath.remapToRange(ind, 0, grpStickers.members.length, 0, 0.9);
|
|
|
|
|
|
|
|
new FlxTimer().start(sticker.timing, _ -> {
|
|
|
|
sticker.visible = true;
|
|
|
|
|
|
|
|
var frameTimer:Int = FlxG.random.int(0, 2);
|
|
|
|
|
|
|
|
// always make the last one POP
|
|
|
|
if (ind == grpStickers.members.length - 1) frameTimer = 2;
|
|
|
|
|
|
|
|
new FlxTimer().start((1 / 24) * frameTimer, _ -> {
|
2023-07-13 04:37:54 +00:00
|
|
|
if (sticker == null) return;
|
|
|
|
|
2023-04-06 05:39:27 +00:00
|
|
|
sticker.scale.x = sticker.scale.y = FlxG.random.float(0.97, 1.02);
|
|
|
|
|
|
|
|
if (ind == grpStickers.members.length - 1)
|
|
|
|
{
|
|
|
|
switchingState = true;
|
|
|
|
FlxTransitionableState.skipNextTransIn = true;
|
|
|
|
FlxTransitionableState.skipNextTransOut = true;
|
|
|
|
|
|
|
|
dipshit = new Sprite();
|
|
|
|
var scrn:BitmapData = new BitmapData(FlxG.width, FlxG.height, true, 0x00000000);
|
|
|
|
var mat:Matrix = new Matrix();
|
2023-04-10 18:44:32 +00:00
|
|
|
scrn.draw(grpStickers.cameras[0].canvas, mat);
|
2023-04-06 05:39:27 +00:00
|
|
|
|
|
|
|
var bitmap:Bitmap = new Bitmap(scrn);
|
|
|
|
|
|
|
|
dipshit.addChild(bitmap);
|
|
|
|
FlxG.addChildBelowMouse(dipshit);
|
|
|
|
|
2023-04-10 18:44:32 +00:00
|
|
|
switch (nextState)
|
|
|
|
{
|
|
|
|
case FREEPLAY:
|
|
|
|
FlxG.switchState(new FreeplayState(this));
|
|
|
|
case STORY:
|
|
|
|
FlxG.switchState(new StoryMenuState(this));
|
2023-06-09 20:54:13 +00:00
|
|
|
case MAIN_MENU:
|
|
|
|
FlxG.switchState(new MainMenuState());
|
2023-04-10 18:44:32 +00:00
|
|
|
default:
|
2023-06-09 20:54:13 +00:00
|
|
|
FlxG.switchState(new MainMenuState());
|
2023-04-10 18:44:32 +00:00
|
|
|
}
|
2023-04-06 05:39:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// sticky.angle *= FlxG.random.float(0, 0.05);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2023-04-05 21:35:19 +00:00
|
|
|
grpStickers.sort((ord, a, b) -> {
|
|
|
|
return FlxSort.byValues(ord, a.timing, b.timing);
|
|
|
|
});
|
2023-04-06 05:39:27 +00:00
|
|
|
|
|
|
|
// centers the very last sticker
|
|
|
|
var lastOne:StickerSprite = grpStickers.members[grpStickers.members.length - 1];
|
|
|
|
lastOne.updateHitbox();
|
|
|
|
lastOne.angle = 0;
|
|
|
|
lastOne.screenCenter();
|
|
|
|
}
|
|
|
|
|
|
|
|
override public function update(elapsed:Float):Void
|
|
|
|
{
|
|
|
|
super.update(elapsed);
|
|
|
|
|
|
|
|
if (FlxG.keys.justPressed.ANY)
|
|
|
|
{
|
|
|
|
regenStickers();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var switchingState:Bool = false;
|
|
|
|
|
|
|
|
override public function close():Void
|
|
|
|
{
|
|
|
|
if (switchingState) return;
|
|
|
|
super.close();
|
|
|
|
}
|
|
|
|
|
|
|
|
override public function destroy():Void
|
|
|
|
{
|
|
|
|
if (switchingState) return;
|
|
|
|
super.destroy();
|
2023-04-05 02:38:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class StickerSprite extends FlxSprite
|
|
|
|
{
|
2023-04-05 21:35:19 +00:00
|
|
|
public var timing:Float = 0;
|
|
|
|
|
2023-04-05 02:38:45 +00:00
|
|
|
public function new(x:Float, y:Float, stickerSet:String, stickerName:String):Void
|
|
|
|
{
|
2023-04-10 20:05:37 +00:00
|
|
|
super(x, y);
|
|
|
|
loadGraphic(Paths.image('transitionSwag/' + stickerSet + '/' + stickerName));
|
|
|
|
updateHitbox();
|
|
|
|
scrollFactor.set();
|
2023-04-05 02:24:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class StickerInfo
|
|
|
|
{
|
|
|
|
public var name:String;
|
|
|
|
public var artist:String;
|
2023-04-05 02:38:45 +00:00
|
|
|
public var stickers:Map<String, Array<String>>;
|
|
|
|
public var stickerPacks:Map<String, Array<String>>;
|
2023-04-05 02:24:00 +00:00
|
|
|
|
|
|
|
public function new(stickerSet:String):Void
|
|
|
|
{
|
2023-04-05 04:56:02 +00:00
|
|
|
var path = Paths.file('images/transitionSwag/' + stickerSet + '/stickers.json');
|
|
|
|
var json = Json.parse(Assets.getText(path));
|
|
|
|
|
|
|
|
// doin this dipshit nonsense cuz i dunno how to deal with casting a json object with
|
|
|
|
// a dash in its name (sticker-packs)
|
|
|
|
var jsonInfo:StickerShit = cast json;
|
2023-04-05 02:38:45 +00:00
|
|
|
|
|
|
|
this.name = jsonInfo.name;
|
|
|
|
this.artist = jsonInfo.artist;
|
2023-04-05 04:56:02 +00:00
|
|
|
|
|
|
|
stickerPacks = new Map<String, Array<String>>();
|
|
|
|
|
|
|
|
for (field in Reflect.fields(json.stickerPacks))
|
|
|
|
{
|
|
|
|
var stickerFunny = json.stickerPacks;
|
|
|
|
var stickerStuff = Reflect.field(stickerFunny, field);
|
|
|
|
|
|
|
|
stickerPacks.set(field, cast stickerStuff);
|
|
|
|
}
|
|
|
|
|
|
|
|
// creates a similar for loop as before but for the stickers
|
|
|
|
stickers = new Map<String, Array<String>>();
|
|
|
|
|
|
|
|
for (field in Reflect.fields(json.stickers))
|
|
|
|
{
|
|
|
|
var stickerFunny = json.stickers;
|
|
|
|
var stickerStuff = Reflect.field(stickerFunny, field);
|
|
|
|
|
|
|
|
stickers.set(field, cast stickerStuff);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getStickers(stickerName:String):Array<String>
|
|
|
|
{
|
|
|
|
return this.stickers[stickerName];
|
2023-04-05 02:24:00 +00:00
|
|
|
}
|
|
|
|
|
2023-04-05 02:38:45 +00:00
|
|
|
public function getPack(packName:String):Array<String>
|
|
|
|
{
|
|
|
|
return this.stickerPacks[packName];
|
|
|
|
}
|
2023-04-05 02:24:00 +00:00
|
|
|
}
|
|
|
|
|
2023-04-05 02:38:45 +00:00
|
|
|
// somethin damn cute just for the json to cast to!
|
|
|
|
typedef StickerShit =
|
2023-04-05 02:24:00 +00:00
|
|
|
{
|
2023-04-05 02:38:45 +00:00
|
|
|
name:String,
|
|
|
|
artist:String,
|
|
|
|
stickers:Map<String, Array<String>>,
|
|
|
|
stickerPacks:Map<String, Array<String>>
|
2023-04-05 02:24:00 +00:00
|
|
|
}
|
2023-04-10 18:44:32 +00:00
|
|
|
|
|
|
|
enum abstract NEXTSTATE(String)
|
|
|
|
{
|
2023-06-09 20:54:13 +00:00
|
|
|
var MAIN_MENU = 'mainmenu';
|
2023-04-10 18:44:32 +00:00
|
|
|
var FREEPLAY = 'freeplay';
|
|
|
|
var STORY = 'story';
|
|
|
|
}
|