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