com.neolao.special.VanadielTime

Calculs sur le temps de Vana'diel

Propriétés

Visibilité Type Nom Status Description
public String vanaDay Lecture seule Le nom du jour sur Vana'diel
public Number vanaYear Lecture seule L'année sur Vana'diel
public String vanaMonth Lecture seule Le mois sur Vana'diel
public String vanaDate Lecture seule Le jour sur Vana'diel
public String vanaHour Lecture seule L'heure sur Vana'diel
public String vanaMinutes Lecture seule Les minutes sur Vana'diel
public String vanaSecondes Lecture seule Les secondes sur Vana'diel
public String vanaMoon Lecture seule La lune sur Vana'diel
public Date vanaNextNewMoonStart Lecture seule Date du début de la prochaine New Moon
public Date vanaNextNewMoonEnd Lecture seule Date de la fin de la prochaine New Moon
public Date vanaNextFullMoonStart Lecture seule Date du début de la prochaine Full Moon
public Date vanaNextFullMoonEnd Lecture seule Date de la fin de la prochaine Full Moon
public Array pageRSE Lecture seule Liste des RSE
public Object ballista Lecture seule Détails du match Ballista courant (indiqué dans l'update)
public Object nextDay Lecture seule Détails du prochain jour Vanadiel

Méthodes

Visibilité Return Nom Param 1 Param 2 Param 3 Param 4 Description
public Void update ARGnextDay:Number ARGnextMoon:Number ARGnextRSE:Number ARGnextBallista:Number Faire tous les calculs
public Void updateNextMoon ARGnext:Number Calcule les dates des prochaines New Moon et Full Moon
public Void updateRSE ARGpage:Number Met à jour la liste des dates RSE

Change log

[24/03/2004] Version 1.1

  • Onglet Vana'diel Time. Affichage du jour, de la date, de la lune et de l'heure mis à jour en continu
  • Onglet Vana'diel Moon. Affichage des dates IRL de débuts et fins des New Moon et Full Moon
  • Onglet Créneaux RSE. Affichage des dates IRL, de la race et du lieu où se déroule la RSE (Elle dure 8h IRL)

[02/09/2004] Version 1.2

Onglet Créneaux Ballista. Affichage des dates IRL, du restriction de level et des nations en conflit.

[02/09/2004] Version 1.3

Onglet Créneaux Ballista. Mauvaise source d'informations de Ballista. De nouveaux calculs ont été fait.

[03/09/2004] Version 1.4

Onglet Vana'diel Time. Ajout d'une visualisation des prochains jours vanadiel.

Source

/**
 * Calculs sur le temps de Vana'diel
 * @author 		neolao <neo@neolao.com>
 * @version 		1.4 (03/09/2004)
 * @link		http://resources.neolao.com/flash/classes/special/vanadieltime
 * @license		http://creativecommons.org/licenses/by-sa/2.0/
 */
class com.neolao.special.VanadielTime {
	public var className:String = "VanadielTime";
	public var version:String = "1.4";
 
	// ----------------------------- CONSTANTES --------------------------------
	/**
	 * Les Nations
	 */
	private static var NATION = new Array("San d'Oria", "Bastok", "Windurst");
	/**
	 * Date utilisé pour convertir le temps IRL en temps IGL
	 */
	private static var BASIS_DATE:Date = new Date(Date.UTC(2002, 5, 23, 15, 0, 0, 0));
	/**
	 * Date utilisé pour obtenir les phases de la lune
	 */
	private static var MOON_DATE:Date = new Date(Date.UTC(2004, 0, 25, 2, 31, 12, 0));
	/**
	 * Date utilisé pour les calculs RSE
	 */
	private static var RSE_DATE:Date = new Date(Date.UTC(2004, 0, 28, 9, 14, 24, 0));
	/**
	 * Date utilisé pour calculer le jour IGL
	 */
	private static var DAY_DATE:Date = new Date(Date.UTC(2004, 0, 28, 9, 14, 24, 0));
	/**
	 * Les jours de Vana'diel
	 */
	private static var VANADIEL_DAY:Array = new Array("Firesday", "Earthsday", "Watersday", "Windsday", "Iceday", "Lightningday", "Lightsday", "Darksday"); 
	/**
	 * Liste des races pour les RSE
	 */
	private static var RSE_RACE:Array = new Array("M. Hume","F. Hume","M. Elvaan","F. Elvaan","M. TaruTaru","F. TaruTaru","Mithra","Galka");
	/**
	 * Lieux pour les RSE
	 */
	private static var RSE_LOCATION:Array = new Array("Gusgen Mines","Shakrami Maze","Ordelle Caves");
	/**
	 * Millisecondes en une journée IGL
	 */
	private static var MS_GAMEDAY:Number = (24 * 60 * 60 * 1000 / 25);
	/**
	 * Millisecondes en une journée IRL
	 */
	private static var MS_REALDAY:Number = (24 * 60 * 60 * 1000);
	/**
	 * Nombre de RSE affiché
	 */
	private static var NB_RSE:Number = 1;
	/**
	 * Les levels de restriction pour Ballista (30 jours, que les nombres pair)
	 */
	private static var BALLISTA_LEVEL = new Array("30", "30", "30", "40", "40", "40", "50", "50", "50", "60", "60", "60", "Free", "Free", "Free");
	/**
	 * Les lieux possibles du Ballista
	 */
	private static var BALLISTA_AREA_STR = new Array("Jugner", "Pashhow", "Meriphataud");
	/**
	 * Les lieux du Ballista dans le mois (30 jours, que les nombres pair)
	 */
	private static var BALLISTA_AREA = new Array(0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2);
	/**
	 * Les Versus du Ballista sur l'année (12 mois, 3 tranches (1-4, 5-8, 9-12))
	 */
	private static var BALLISTA_VERSUS = new Array([{area:0, nation1:1, nation2:0}, {area:1, nation1:1, nation2:2}, {area:2, nation1:0, nation2:2}], 
												   [{area:0, nation1:1, nation2:2}, {area:1, nation1:0, nation2:2}, {area:2, nation1:1, nation2:0}], 
												   [{area:0, nation1:0, nation2:2}, {area:1, nation1:0, nation2:1}, {area:2, nation1:1, nation2:2}]);
 
	// ----------------------------- VARIABLES ---------------------------------
	private var _vanaDay:Number;
	private var _vanaYear:Number;
	private var _vanaMonth:String;
	private var _vanaDate:String;
	private var _vanaHour:String;
	private var _vanaMin:String;
	private var _vanaSec:String;
 
	private var _vanaMoon:String;
	private var _vanaNextNewMoon:Date;
	private var _vanaNextNewMoonEnd:Date;
	private var _vanaNextFullMoon:Date;
	private var _vanaNextFullMoonEnd:Date;
 
	private var _pageRSE:Array;
 
	private var _ballista:Object;
 
	private var _nextDay:Object;
 
	/*============================= CONSTRUCTEUR =============================*/
	/*========================================================================*/
	/**
	 * Active une update à l'instanciation de la class
	 */
	public function VanadielTime(){
		update();
	}
	/*======================= FIN = CONSTRUCTEUR = FIN =======================*/
	/*========================================================================*/
 
	/*=========================== METHODES PRIVEES ===========================*/
	/*========================================================================*/
	/**
	 * Convertion d'une date IRL en date IGL
	 * @param pTime Le temps IRL
	 * @return Un object avec les propriétés .day, .year, .month, .date, .hour, .min, .sec
	 */
	private function realTimeToVanaTime(pTime:Date):Object{
		var vNowDate:Date = pTime;
	  	var vVanaDate:Number =  ((898 * 360 + 30) * MS_REALDAY) + (vNowDate.getTime() - BASIS_DATE.getTime()) * 25;
 
	  	var vYear = Math.floor(vVanaDate / (360 * MS_REALDAY));
	  	var vMonth = Math.floor((vVanaDate % (360 * MS_REALDAY)) / (30 * MS_REALDAY)) + 1;
	  	var vDate = Math.floor((vVanaDate % (30 * MS_REALDAY)) / (MS_REALDAY)) + 1;
	  	var vHour = Math.floor((vVanaDate % (MS_REALDAY)) / (60 * 60 * 1000));
	  	var vMin  = Math.floor((vVanaDate % (60 * 60 * 1000)) / (60 * 1000));
	  	var vSec  = Math.floor((vVanaDate % (60 * 1000)) / 1000);
	  	var vDay  = Math.floor((vVanaDate % (8 * MS_REALDAY)) / (MS_REALDAY));
 
	  	var vResult:Object = new Object();
 
		//vYear = NumberUtils.nChar(vYear, 4);
		vMonth = NumberUtils.nChar(vMonth, 2);
		vDate = NumberUtils.nChar(vDate, 2);
		vHour = NumberUtils.nChar(vHour, 2);
		vMin = NumberUtils.nChar(vMin, 2);
		vSec = NumberUtils.nChar(vSec, 2);
 
		vResult.day = vDay;
		vResult.year = vYear;
		vResult.month = vMonth;
		vResult.date = vDate;
		vResult.hour = vHour;
		vResult.min = vMin;
		vResult.sec = vSec;
 
		return vResult;
	}
 
	private function getVanadielTime(){
	  	var vNowDate:Date = new Date();
	  	var vVanaTime:Object =  realTimeToVanaTime(vNowDate);
 
		_vanaDay = vVanaTime.day;
		_vanaYear = vVanaTime.year;
		_vanaMonth = vVanaTime.month;
		_vanaDate = vVanaTime.date;
		_vanaHour = vVanaTime.hour;
		_vanaMin = vVanaTime.min;
		_vanaSec = vVanaTime.sec;
	}
	/**
	 * Chaque cycle lunaire dure exactement 84 jours IGL (3 jours, 8 heures, 38 minutes, 24 secondes)
	 * New moon commence au jour 38 (-10%) et fini au jour 47 (12%)
 	 * Full moon commence au jour 80 (90%) et fini au jour 5 (-88%)
	 * @param pNext La prochaine phase demandée
	 */
	private function getMoonPhase(pNext:Number){
		var vNext:Number = (pNext != null)?pNext:1;
		var vFullMoonBasis:Number = MOON_DATE.getTime() + (3 * MS_GAMEDAY);
		var vNowDate:Date = new Date();
		var vLocalTime:Number = vNowDate.getTime();
		var vMoonDays:Number = (Math.floor((vLocalTime - MOON_DATE.getTime()) / MS_GAMEDAY)) % 84;
		var vMoonPercent:Number = - Math.round((42 - vMoonDays) / 42 * 100);
 
		// Lune courante
        if (vMoonPercent == -100){
        	_vanaMoon = "100% Full Moon";
        }  else if (vMoonPercent == 0){
        	_vanaMoon = "0% New Moon";
        } else if (vMoonPercent < 0){
        	_vanaMoon = -(vMoonPercent) + "% Waning";
        } else if (vMoonPercent > 0){
        	_vanaMoon = vMoonPercent + "% Waxing";
        }
 
        // Lune demandée
		var vElapsedCycles:Number = Math.floor( (vLocalTime - vFullMoonBasis) / (84 * MS_GAMEDAY) ) + vNext;
		var vFullMoonEnd:Number = vFullMoonBasis + (vElapsedCycles * 84 * MS_GAMEDAY);
		var vFullMoonStart:Number = vFullMoonEnd - 7 * MS_GAMEDAY;
		var vNewMoonStart:Number = vFullMoonEnd - 49 * MS_GAMEDAY;
		var vNewMoonEnd:Number = vFullMoonEnd - 42 * MS_GAMEDAY;
 
		_vanaNextNewMoon = new Date(vNewMoonStart);
		_vanaNextNewMoonEnd = new Date(vNewMoonEnd);
		_vanaNextFullMoon = new Date(vFullMoonStart);
		_vanaNextFullMoonEnd = new Date(vFullMoonEnd);
	}
	/**
	 * Met à jour la liste _pageRSE
	 * @param pStart Le départ de la liste
	 */
	private function getRSE(pStart:Number){
		var vShowNb:Number = NB_RSE;
		var vTimeNow:Date = new Date();
		var vLocalTime:Number = vTimeNow.getTime();
		var vTimeRSE = RSE_DATE.getTime();
		var vElapsedWeeks:Number;
		var vStartRSE:Number;
		var vDateStartRSE:Date;
		var vRaceRSE:String;
		var vLocationRSE:String;
		var vObjRSE:Object;
		var i:Number;
 
		_pageRSE = new Array();
		for(i=pStart; i<pStart + vShowNb; i++){
			vElapsedWeeks = Math.floor( (vLocalTime - vTimeRSE) / (8 * MS_GAMEDAY) ) + i;
			vStartRSE = vTimeRSE + (vElapsedWeeks * 8 * MS_GAMEDAY);
			vDateStartRSE = new Date(vStartRSE);
			vRaceRSE = RSE_RACE[vElapsedWeeks % 8];
			vLocationRSE = RSE_LOCATION[vElapsedWeeks % 3];
 
			vObjRSE = new Object();
			vObjRSE.date = vDateStartRSE;
			vObjRSE.race = vRaceRSE;
			vObjRSE.location = vLocationRSE;
 
			_pageRSE.push(vObjRSE);
		}	
	}
	/**
	 * Met à jour la liste _ballista
	 * Les match sont tous les 2 jours IGL
	 * @param pStart Le départ de la liste
	 */
	private function getBallista(pStart:Number){
		var vNext:Number = (pStart != null)?pStart:1;
 
		var vTimeNow:Date = new Date();
		var vLocalTime:Number = vTimeNow.getTime();
		var vTimeBasis:Number = BASIS_DATE.getTime();
 
		var vNextTime:Date;
		var vNextVanaTime:Object;
		var vNextMonth:Number;
		var vNextDate:Number;
		var vAreaTemp:Number;
 
		// Match demandé
		var vNextMatch = Math.floor( (vLocalTime - vTimeBasis) / (2 * MS_GAMEDAY) ) + vNext;
		vNextTime = new Date(vTimeBasis + (vNextMatch * 2 * MS_GAMEDAY) + MS_GAMEDAY);
		vNextVanaTime = realTimeToVanaTime(vNextTime);
		vNextDate = Number(vNextVanaTime.date);
		vNextMonth = Number(vNextVanaTime.month);
		vAreaTemp = BALLISTA_AREA[vNextDate / 2 - 1];
 
		_ballista = new Object();
		_ballista.date = vNextTime;
		_ballista.level = BALLISTA_LEVEL[vNextDate / 2 - 1];
		_ballista.area = BALLISTA_AREA_STR[vAreaTemp];
		if(vNextMonth >= 1 && vNextMonth <= 4){
			_ballista.versus = NATION[BALLISTA_VERSUS[0][vAreaTemp].nation1] + " VS " + NATION[BALLISTA_VERSUS[0][vAreaTemp].nation2];
		}else if(vNextMonth >= 5 && vNextMonth <= 8){
			_ballista.versus = NATION[BALLISTA_VERSUS[1][vAreaTemp].nation1] + " VS " + NATION[BALLISTA_VERSUS[1][vAreaTemp].nation2];
		}else{
			_ballista.versus = NATION[BALLISTA_VERSUS[2][vAreaTemp].nation1] + " VS " + NATION[BALLISTA_VERSUS[2][vAreaTemp].nation2];
		}		
	}
	/**
	 * La date d'un jour de Vanadiel (permet aux crafteurs de s'organiser à l'avance)
	 * @param pNext Le nombre de jour à partir d'aujourd'hui
	 */
	private function getVanaDay(pNext:Number):Object{
		var vNext:Number = (pNext != null)?pNext:1;
 
		var vTimeNow:Date = new Date();
		var vLocalTime:Number = vTimeNow.getTime();
		var vTimeBasis:Number = BASIS_DATE.getTime();
 
		// Jour demandé
		var vNextDay:Number = Math.floor( (vLocalTime - vTimeBasis) / MS_GAMEDAY ) + vNext;
		var vNextTime:Date = new Date(vTimeBasis + (vNextDay * MS_GAMEDAY));
		var vNextVanaTime:Object = realTimeToVanaTime(vNextTime);
 
		_nextDay = new Object();
		_nextDay.day = VANADIEL_DAY[vNextVanaTime.day];
		_nextDay.date = vNextTime;
 
		return _nextDay;
	}
	/*===================== FIN = METHODES PRIVEES = FIN =====================*/
	/*========================================================================*/
 
	/*============================ GETTER  SETTER ============================*/
	/*========================================================================*/
	/**
	 * Le nom du jour sur Vana'diel
	 */
	public function get vanaDay():String {
		return VANADIEL_DAY[_vanaDay];
	}
	/**
	 * L'année sur Vana'diel
	 */
	public function get vanaYear():Number {
		return _vanaYear;
	}
	/**
	 * Le mois sur Vana'diel
	 */
	public function get vanaMonth():String {
		return _vanaMonth;
	}
	/**
	 * Le jour sur Vana'diel
	 */
	public function get vanaDate():String {
		return _vanaDate;
	}
	/**
	 * L'heure sur Vana'diel
	 */
	public function get vanaHour():String {
		return _vanaHour;
	}
	/**
	 * Les minutes sur Vana'diel
	 */
	public function get vanaMinutes():String {
		return _vanaMin;
	}
	/**
	 * Les secondes sur Vana'diel
	 */
	public function get vanaSecondes():String {
		return _vanaSec;
	}
	/**
	 * La lune sur Vana'diel
	 */
	public function get vanaMoon():String {
		return _vanaMoon;
	}
	/**
	 * Date du début de la prochaine New Moon
	 */
	public function get vanaNextNewMoonStart():Date{
	 	return _vanaNextNewMoon;
	}
	/**
	* Date de la fin de la prochaine New Moon
	*/
	public function get vanaNextNewMoonEnd():Date{
	 	return _vanaNextNewMoonEnd;
	}
	/**
	 * Date du début de la prochaine Full Moon
	 */
	public function get vanaNextFullMoonStart():Date{
	 	return _vanaNextFullMoon;
	}
	/**
	 * Date de la fin de la prochaine Full Moon
	 */
	public function get vanaNextFullMoonEnd():Date{
	 	return _vanaNextFullMoonEnd;
	}
	/**
	 * Liste des RSE
	 * Chaque élément de la liste a 3 propriétés :
	 * - date au format Date qui donne le début du créneaux RSE
	 * - race au format String qui donne la race pour ce créneaux
	 * - location au format String qui donne le lieu
	 */
	public function get pageRSE():Array{
		return _pageRSE;
	}
	/**
	 * Détails du match Ballista courant (indiqué dans l'update)
	 * L'objet retourné a les propriétés suivantes :
	 * - date au format Date qui donne le début du match
	 * - level au format String : "30", "40", "50", "60", "Free"
	 * - area au format String : "Jugner", "Pashhow", "Meriphataud"
	 * - versus au format String : "San d'Oria VS Bastok", "Bastok VS Windurst", "San d'Oria VS Windurst"
	 */
	public function get ballista():Object{
		return _ballista;
	}
	/**
	 * Détails du prochain jour Vanadiel
	 * L'objet retourné a les propriétés suivantes :
	 * - day au format String qui indique l'élément du jour
	 * - date au format Date qui donne le début de ce jour
	 */
	public function get nextDay():Object{
		return _nextDay
	}
	/*====================== FIN = GETTER  SETTER = FIN ======================*/
	/*========================================================================*/
 
	/*========================== METHODES PUBLIQUES ==========================*/
	/*========================================================================*/
	/**
	 * Faire tous les calculs
	 * @param pNextMoon Numéro de prochaine Lune à partir de maintenant [option=1]
	 * @param pNextRSE Numéro de la prochaine RSE à partir de maintenant [option=1]
	 * @param pNextBallista Numéro du prochain Ballista à partir de maintenant [option=1]
	 */
	public function update(pNextDay:Number, pNextMoon:Number, pNextRSE:Number, pNextBallista:Number){
		var vNextDay:Number = (pNextDay != null)?pNextDay:1;
		var vNextMoon:Number = (pNextMoon != null)?pNextMoon:1;
		var vNextRSE:Number = (pNextRSE != null)?pNextRSE:1;
		var vNextBallista:Number = (pNextBallista != null)?pNextBallista:1;
 
		getVanadielTime();
		getVanaDay(vNextDay);
		getMoonPhase(vNextMoon);
		updateRSE(vNextRSE);
		getBallista(vNextBallista);
	}
	/**
	 * Calcule les dates des prochaines New Moon et Full Moon
	 */
	public function updateNextMoon(pNext:Number){
		getMoonPhase(pNext);
	}
	/**
	 * Met à jour la liste des dates RSE
	 */
	public function updateRSE(pPage:Number){
		getRSE(pPage * NB_RSE);
	}
	/*==================== FIN = METHODES PUBLIQUES = FIN ====================*/
	/*========================================================================*/
}