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 = []; private var list_fadeout_params:Array = []; 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):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 = ["$N"]; var values:Array = ["\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); } }