sir_pinski icon

Untitled

sir_pinski | PRO | 06/26/24 09:03:03 PM UTC | 0 ⭐ | 256 👁️ | Never ⏰ | []
text |

14.71 KB

|

None

|

0 👍

/

0 👎

package com.leveluplabs.tdrpg;
 import firetongue.Replace;
import flixel.addons.ui.FlxUIButton;
import flixel.addons.ui.FlxUISprite;
import flixel.addons.ui.FlxUITypedButton;
import flixel.addons.ui.FlxUIText;
import flixel.addons.ui.FlxUITypedButton;
import flixel.addons.ui.FontDef;
import flixel.addons.ui.U;
import flixel.FlxG;
import flixel.FlxObject;
import flixel.FlxSprite;
import flixel.addons.ui.interfaces.IFlxUIButton;
import flixel.addons.ui.interfaces.IFlxUIWidget;
import flixel.group.FlxGroup;
import flixel.group.FlxSpriteGroup;
import flixel.input.actions.FlxAction.FlxActionDigital;
import flixel.text.FlxText;
import flixel.ui.FlxButton;
import flixel.util.FlxArrayUtil;
import flixel.util.FlxColor;
import flixel.util.FlxDestroyUtil;
import haxe.xml.Fast;
import openfl.display.BitmapData;
import openfl.net.URLRequest;
import openfl.geom.Point;
import openfl.Lib;
 /**
 * ...
 * @author Lars A. Doucet
 */
 class State_Credits extends TDRPGState
{
	private static inline var SCREEN_TIME:Float = 15;
	private static inline var SPEED:Float = (600/SCREEN_TIME);
 	private var time:Float = 0;
	private var YY:Float = 0;
	private var max_time:Float = 0;
 	private var dorkscroll:FlxObject;
 	private var group:FlxSpriteGroup;
	private var group_fade:FlxSpriteGroup;
 	private var btn_exit:FlxUIButton;
 	private var web_color:FlxColor= 0x0088ff;
	private var web_color_2:FlxColor = 0x0ffff;
 	private var flip_mouse:Bool = false;
 	private var list_fade_params:Array<StructStringPoint> = [];
	private var list_fadeout_params:Array<StructStringPoint> = [];
 	private var fade_finished:Bool = false;
 	private var endingMusic:Bool = true;
	private var specificMusic:String = "m29_credits";
 	private var _specialCase:Bool = false;
	private var _specialCode:String = "";
 	public function new (ending_music:Bool=false,specific_music:String="")
	{
		endingMusic = ending_music;
		specificMusic = specific_music;
		super();
		actionSet = "MenuControls";
	}
 	public function setSpecialCase(specialCase:Bool, specialCode:String) {
		_specialCase = specialCase;
		_specialCode = specialCode;
	}
 	public override function create():Void
	{
		_xml_id = "ui/state_credits";
		super.create();
 		setup();
	}
 	override public function onActionDigital(action:FlxActionDigital):Void
	{
		super.onActionDigital(action);
		if (action.name == "menu_cancel")
		{
			onExit();
		}
	}
 	private function onClick():Void {
		//Main.OMNI.gameProgress.watchedCutscene(_scene);
		//FlxG.switchState(new State_Transition());
 		//TODO: do better ending wrap-up stuff
 		FlxG.switchState(new State_Title());
	}
 	override public function destroy():Void
	{
		dorkscroll = null;
		group = null;
		group_fade = null;
		btn_exit = null;
		FlxArrayUtil.clearArray(list_fade_params);
		FlxArrayUtil.clearArray(list_fadeout_params);
		list_fade_params = null;
		list_fadeout_params = null;
		super.destroy();
	}
 	private function setup():Void
	{
		_bakeCredits();
 		var music:String = specificMusic;
 		var black:FlxUISprite = cast _ui.getAsset("black");
		var skip:IFlxUIWidget = _ui.getAsset("skip");
		var ww:Int = Std.int((FlxG.width - skip.x) + UU.pt600(2));
		var hh:Int = Std.int((FlxG.height - skip.y) + UU.pt600(2));
		black.scale.set(ww, hh);
		black.updateHitbox();
		black.x = FlxG.width - black.width;
		black.y = FlxG.height - black.height;
 		if (endingMusic && specificMusic == "")
		{
			music = "m29_credits";
		}
 		trace("State_Credits music = " + music);
 		if (music != "")
		{
			Main.sound_mgr.prepareMusic(music, true, null);
		}
 		Main.refreshMouse();
	}
 	override public function getEvent(id:String, sender:Dynamic, data:Dynamic, ?params:Array<Dynamic>):Void
	{
		super.getEvent(id, sender, data, params);
		if (id == FlxUITypedButton.CLICK_EVENT)
		{
			if (params != null && params.indexOf("skip") != -1)
			{
				onExit();
			}
		}
	}
 	private function onExit():Void {
		/*
		if (Main.SHOW_EPILOGUE_NEXT)
		{
			//Main.SHOW_EPILOGUE_NEXT = false;
			//Main.showCutscene("epilogue");
		}
		else
		*/
		if (_specialCase == true) {
			Main.doSpecialCode(_specialCode);
		}
		else
		{
			FlxG.switchState(new State_Title());
		}
	}
 	public override function update(elapsed:Float):Void
	{
		super.update(elapsed);
		time += elapsed;
 		group.y = Std.int(dorkscroll.y);
 		if (time > 0.25 && !flip_mouse)
		{
			flip_mouse = true;
			Main.refreshMouse();
		}
 		if (!fade_finished)
		{
			if (time > max_time)
			{
				var fade_time:Float = time - max_time;
 				var diff_time:Float = 0;
				var alph:Float = 0;
 				var i = 0;
				var count_pass = 0;
				for (spt in list_fade_params)
				{
					if (fade_time >= spt.pt.x)
					{
						//"wait" time
						if (fade_time <= spt.pt.x + spt.pt.y + 1)
						{
							diff_time = (fade_time - spt.pt.x) / spt.pt.y;	//get progress
 							if (diff_time > 1) diff_time = 1;
							if (diff_time < 0) diff_time = 0;
 							alph = diff_time;
 							var fo:FlxObject = group_fade.members[i] ;
 							(group_fade.members[i]).visible = true;
							(group_fade.members[i]).alpha = alph;
						}
						else
						{
							count_pass++;
						}
					}
 					var fspt = list_fadeout_params[i];
					if (fspt != null)
					{
						var wait_before_fade:Float = spt.pt.x + spt.pt.y + fspt.pt.x;
						var time_after_fade:Float = wait_before_fade + fspt.pt.y;
						if (fade_time >= wait_before_fade) { //wait time
							if (fade_time <= time_after_fade + 1) {
								diff_time = (fade_time - wait_before_fade) / fspt.pt.y;	//get progress
								if (diff_time > 1) diff_time = 1;
								if (diff_time < 0) diff_time = 0;
 								alph = 1 - diff_time;
 								var fo = group_fade.members[i];
 								fo.alpha = alph;
								if (alph <= 0)
								{
									fo.visible = false;
								}
							}
 						}else {
							count_pass++;
						}
					}else {
						count_pass++;
					}
 					i++;
				}
 				if (count_pass >= list_fade_params.length+list_fadeout_params.length) {
					fade_finished = true;
				}
			}
		}
	}
  	private function onButt(str:String):Void {
		/*
		//CONFIG::swfstats
		{
			if (UI_InGameMenu.TRACKING)
			{
				Link.Open(f.id, "ClickedCreditsLink", "Misc", false, "_blank", false);
			}
		}
		*/
 		//if (CONFIG::swfstats == false || UI_InGameMenu.TRACKING == false)
		//{
		var url:URLRequest = new URLRequest(str);
		Lib.getURL(url, "_blank");
		//}
 	}
 	private var _pt:Float = FlxG.height / 600;
	private function pt(x:Float):Int
	{
		return Std.int(x * _pt);
	}
 	private function _bakeCredits():Void
	{
		var text_heading:FlxUIText = cast _ui.getAsset("text_heading");
		var text_regular:FlxUIText = cast _ui.getAsset("text_regular");
		//var text_small:FlxUIText = cast _ui.getAsset("text_small");
 		var headDef:FontDef = FontDef.copyFromFlxText(text_heading);
		var regDef:FontDef = FontDef.copyFromFlxText(text_regular);
		var btnDef:FontDef = regDef.clone();
		//var smallDef:FontDef = FontDef.copyFromFlxText(text_small);
 		_ui.removeAsset("text_heading");
		_ui.removeAsset("text_regular");
 		var flags:Array<String> = ["$N"];
		var values:Array<String> = ["\n"];
 		group = new FlxSpriteGroup();
		add(group);
 		group_fade = new FlxSpriteGroup();
		add(group_fade);
 		trace("State_Credits._bakeCredits()");
		var xml:Fast = U.xml("credits");
		trace("xml = " + xml);
 		var text:FlxText;
 		var Y_TITLE:Float = pt(35);
		var Y_TEXT:Float = pt(22);
		var Y_SPACE:Float = pt(45);
 		var YY_ALT:Float = 0;
		var Y_OFF:Float = 0;
 		YY = FlxG.height;
 		dorkscroll = new FlxObject();
		add(dorkscroll);
		dorkscroll.velocity.y = pt(SPEED) * -1;
 		for (xx in xml.nodes.credit)
		{
			var title:String = "";
			var txt:String = "";
 			if (xx.hasNode.title)
			{
				title = U.xml_str(xx.node.title.x, "value");// xx.title.@value;
			}
 			var size:String = U.xml_str(xx.x, "size");// xx.attribute("size");
 			var columns:Bool = U.xml_bool(xx.x, "columnview"); // xx.attribute("columnview") == "true";
			var twoColumns:Bool = U.xml_bool(xx.x, "twocolumnview"); // xx.attribute("twocolumnview") == "true";
 			var size_title:Int;
			var size_text:Int;
 			var titlestr:String="";
			var textstr:String="";
 			switch(size)
			{
				case "tiny": headDef.size = pt(18);
					regDef.size = pt(12);
					Y_TEXT = pt(16);
				case "small": headDef.size = pt(20);
					regDef.size = pt(14);
					Y_TEXT = pt(18);
				case "medium": headDef.size = pt(22);
					regDef.size = pt(16);
					Y_TEXT = pt(20);
				case "large": headDef.size = pt(32);
					regDef.size = pt(20);
					Y_TEXT = pt(30);
				case "huge":  headDef.size = pt(40);
					regDef.size = pt(24);
					Y_TEXT = pt(38);
				default: headDef.size = pt(24);
					regDef.size = pt(18);
			}
 			title = UU.replaceFlags(title, flags, values);
			text = new FlxUIText(0, YY, FlxG.width, title);
 			headDef.apply(text);
 			var is_fade:Bool = U.xml_bool(xx.x, "end_fade");// xx.attribute("end_fade") == "true";
 			Y_OFF = 0;
			if (xx.hasNode.title)
			{
				Y_OFF = pt(U.xml_i(xx.node.title.x, "y_off"));// xx.title.attribute("y_off");
			}
 			if (!is_fade)
			{
				group.add(text);
				YY += Y_TITLE;
			}
			else
			{
				text.y = YY_ALT + Y_OFF;
 				var spt = new StructStringPoint("",new Point());
				spt.pt.x = U.xml_f(xx.x, "wait");// xx.attribute("wait");
				spt.pt.y = U.xml_f(xx.x, "time");// xx.attribute("time");
				var fold:String="";
				var img:String = "";
				if (xx.hasNode.img)
				{
					fold = U.xml_str(xx.node.img.x, "folder");// xx.img.@folder;
					img = U.xml_str(xx.node.img.x, "value");// xx.img.@value;
				}
				list_fade_params.push(spt);
 				if (fold != "" && img != "")
				{
					var fs:FlxSprite=null;
					try
					{
						var gfx = U.loadMonoScaledImage(U.gfx(img, fold), (FlxG.height / 1200), true);
						fs = new FlxSprite(gfx);
					}
					catch (msg:String)
					{
						//whatevs
					}
 					if (fs != null)
					{
						fs.x = (FlxG.width - fs.width) / 2;
						Y_OFF = pt(U.xml_i(xx.node.img.x, "y_off"));// xx.img.attribute("y_off");
						fs.y = YY_ALT + Y_OFF;
						group_fade.add(fs);
						fs.visible = false;
					}
				}
				else
				{
					group_fade.add(text);
					text.visible = false;
				}
 				spt = new StructStringPoint("", new Point());
				var str:String = U.xml_str(xx.x, "wait_out");// xx.attribute("wait_out");
				if (str != "")
				{
					spt.pt.x = U.xml_i(xx.x, "wait_out");// xx.attribute("wait_out");
					spt.pt.y = U.xml_i(xx.x, "time_out");// xx.attribute("time_out");
					list_fadeout_params.push(spt);
				}
				else
				{
					list_fadeout_params.push(null);
				}
			}
 			if (columns) // Parse into 3 columns.  We currently do not support websites in column mode.
			{
				var lx = Std.int(FlxG.width - pt(800)) / 2;
 				var textleft:FlxUIText = new FlxUIText(lx, YY, pt(250), txt);
				if (is_fade)
				{
					textleft.y = YY_ALT + Y_OFF;
				}
				regDef.apply(textleft);
				group.add(textleft);
 				var textcenter:FlxUIText = new FlxUIText(lx+pt(250), YY, pt(300), txt);
				if (is_fade)
				{
					textcenter.y = YY_ALT + Y_OFF;
				}
				regDef.apply(textcenter);
				group.add(textcenter);
 				var textright:FlxUIText = new FlxUIText(lx+pt(550), YY, pt(250), txt);
				if (is_fade)
				{
					textright.y = YY_ALT + Y_OFF;
				}
				regDef.apply(textright);
				group.add(textright);
 				var columncounter:Int = Std.int(pt(2));
 				for (xxx in xx.nodes.text)
				{
					columncounter = (columncounter + 1) % 3;
 					if (columncounter == 0)
					{
						var txtleft:String = U.xml_str(xxx.x, "value");// xxx.@value;
						textleft.text += txtleft + "\n";
						YY += Y_TEXT;
					}
 					if (columncounter == 1)
					{
						var txtcenter:String = U.xml_str(xxx.x, "value");// xxx.@value;
						textcenter.text += txtcenter + "\n";
					}
 					if (columncounter == 2)
					{
						var txtright:String = U.xml_str(xxx.x, "value");// xxx.@value;
						textright.text += txtright + "\n";
					}
 				}
 				if (!is_fade)
				{
					YY += Y_SPACE;
				}
			}
			else if (twoColumns)
			{
				var lx = Std.int(FlxG.width - pt(800)) / 2;
 				var textleft:FlxUIText = new FlxUIText(lx, YY, pt(400), txt);
				if (is_fade)
				{
					textleft.y = YY_ALT + Y_OFF;
				}
				regDef.apply(textleft);
				group.add(textleft);
 				var textright:FlxUIText = new FlxUIText(lx+pt(400), YY, pt(400), txt);
				if (is_fade)
				{
					textright.y = YY_ALT + Y_OFF;
				}
				regDef.apply(textright);
				group.add(textright);
 				var columncounter:Int = Std.int(pt(1));
 				for (xxx in xx.nodes.text)
				{
					columncounter = (columncounter + 1) % 2;
 					if (columncounter == 0)
					{
						var txtleft:String = U.xml_str(xxx.x, "value");// xxx.@value;
						textleft.text += txtleft + "\n";
						YY += Y_TEXT;
					}
 					if (columncounter == 1)
					{
						var txtright:String = U.xml_str(xxx.x, "value");// xxx.@value;
						textright.text += txtright + "\n";
					}
 				}
 				if (!is_fade)
				{
					YY += Y_SPACE;
				}
			}
			else
			{
				text = new FlxUIText(0, YY, FlxG.width, txt);
				if (is_fade)
				{
					text.y = YY_ALT + Y_OFF;
				}
				regDef.apply(text);
				group.add(text);
 				for (xxx in xx.nodes.text)
				{
					txt = "";
					var website:String = U.xml_str(xxx.x, "website");// xxx.@website;
					if (website == "")
					{
						txt = U.xml_str(xxx.x, "value");// xxx.@value;
						text.text += txt + "\n";
					}
					else
					{
						var url:String = U.xml_str(xxx.x, "url");// xxx.@url;
 						if (FlxG.bitmap.checkCache("black_bkg") == false)
						{
							FlxG.bitmap.add(new BitmapData(pt(350), pt(18), false, 0x000000),true,"black_bkg");
						}
 						var butt:FlxUIButton = new FlxUIButton(0, YY-pt(2), website, onButt.bind(url), false);
						butt.loadGraphic("black_bkg");
						if (is_fade)
						{
							butt.y = YY_ALT + Y_OFF;
						}
						var ft:FlxText = cast butt.label;
						btnDef.size = pt(18);
						btnDef.format.color = web_color;
 						btnDef.apply(ft);
 						butt.setCenterLabelOffset(0, 0);
						butt.over_color = web_color_2;
						butt.up_color = web_color;
						butt.down_color = web_color;
 						butt.x = Std.int((FlxG.width - butt.width) / 2);
						group.add(butt);
						butt.name = url;
						text.text += "\n";
					}
 					if (!is_fade)
					{
						YY += Y_TEXT;
					}
				}
 				if (!is_fade)
				{
					YY += Y_SPACE;
				}
			}
		}
 		max_time = YY / SPEED;
 		remove(_ui, true);
		add(_ui);
	}
 	public function cx(width:Float):Int
	{
		return Std.int((FlxG.width - (width)) / 2);
	}
}

Comments