lineageボス時間計算のJavaScript?のコードが落ちてたのでCにしてみた。

幻牛鬼の時間がほしいのだけど...w
やはりエンド時点で手動でボタン押して15分タイマーかけるしか無いのかな。

/*****************************************************************
*  Lineage Boss Time Checker
*  http://hoge.secret.jp/lineage/js/lineage_bosstime.js
*  改変OKです
*****************************************************************/
/*****************************************************************
 *  Lineage Boss Time Checker ver.2
 *                                          by AZuSk
 *  http://hoge.secret.jp/lineage/js/lineage_bosstime.js
 *  改変OKです

  extern "C" int dkTimeCheck(__time64_t*p, __time64_t*n, __time64_t*s);
  extern "C" int orenTimeCheck(__time64_t*p, __time64_t*n, __time64_t*s);
  extern "C" int adenTimeCheck(__time64_t*p, __time64_t*n, __time64_t*s);
  extern "C" int bkcTimeCheck(__time64_t*p, __time64_t*n, __time64_t*s);
  extern "C" int dore2TimeCheck(__time64_t*p, __time64_t*n, __time64_t*s);
  extern "C" int dore1TimeCheck(__time64_t*p, __time64_t*n, __time64_t*s);
  extern "C" int casperTimeCheck(__time64_t*p, __time64_t*n, __time64_t*s);

  例)午前1時を基準に、出現しない時間が1時間・する時間が1時間の2時間周期の場合
  var data = new cycleTimeCheck(1,2);
  data.prev:最近のボスタイム開始からの秒数
  data.next:次のボスタイム開始までの秒数
  data.flag:ボスタイム中かどうかのtrue/false値
  data.prevDate:最近のボスタイム開始時刻のDateオブジェクト
  data.nextDate:次のボスタイム開始時刻のDateオブジェクト

 *****************************************************************/

#include <time.h>

#define FALSE   0
#define TRUE    1
#define IN
#define OUT

#if 1
typedef __time64_t TIMEVAR;
#define TIME _time64
#define LOCALTIME _localtime64
#else
typedef time_t TIMEVAR;
#define TIME time
#define LOCALTIME localtime
#endif

static void Oren
(IN TIMEVAR today, IN struct tm *t, IN TIMEVAR offset, IN TIMEVAR interval, OUT TIMEVAR *base, OUT TIMEVAR *scope)
{
	const TIMEVAR tOrenup = 1027350000; //オーレンアップ日2002年7月23日0:00=1027350000
	const TIMEVAR t5_00 = (5 * 60 * 60); // 5:00 5時間=1000*60*60*5=18000s

	*base = (today-tOrenup);
	*base %= (*scope * 2);
}

static void Dk
(IN TIMEVAR today, IN struct tm *t, IN TIMEVAR offset, IN TIMEVAR interval, OUT TIMEVAR *base, OUT TIMEVAR *scope)
{
	//曜日を求める。曜日があがる毎にテーブルが+4時間ずれる
	//午前0時からの経過時間を7時間で割った時の余り秒数に曜日補正
	*base += (4*60*60 * t->tm_wday);
	*base %= (*scope * 2);
}

int TimeCheck(
	IN TIMEVAR offset,
	IN TIMEVAR interval,
	IN TIMEVAR scope,

	OUT TIMEVAR *p,
	OUT TIMEVAR *n,

	void (*check)(IN TIMEVAR today, IN struct tm *t, IN TIMEVAR offset, IN TIMEVAR interval, OUT TIMEVAR *base, OUT TIMEVAR *scope)    
)
{
   TIMEVAR base;
   int flag;
   TIMEVAR today;
   TIMEVAR prev;
   TIMEVAR next;
   struct tm *t ;

   today = TIME( NULL );
   t = LOCALTIME(&today);

	base = ((t->tm_hour*60*60 + t->tm_min*60 + t->tm_sec) - offset) % (scope * 2);
   if(check) {
	 check(today, t, interval, offset, &base, &scope);
   }
 
   next = scope-base;
   if (next<=0){next = next +(scope*2);}
   prev = base-scope;
   if (prev<0){prev = prev +(scope*2);}
   flag = (base>=scope) ? TRUE : FALSE;

   *p= today - prev;
   *n= today + next;

   return flag;
}


int cycleTimeCheck(IN TIMEVAR o, IN TIMEVAR i, OUT TIMEVAR *p, OUT TIMEVAR *n, OUT TIMEVAR *s)
{
	o *= 60 * 60;
	i *= 60 * 60;
	*s = i/2;
	return TimeCheck(o, i, *s, p, n, NULL);
}

 // var bkcData = new cycleTimeCheck(2,4);
int bkcTimeCheck(OUT TIMEVAR *p, OUT TIMEVAR *n, OUT TIMEVAR *s)
{
	return cycleTimeCheck(2, 4, p, n, s);
}

int dore2TimeCheck(OUT TIMEVAR *p, OUT TIMEVAR *n, OUT TIMEVAR *s)
{
	return cycleTimeCheck(0, 3, p, n, s);
}

int dore1TimeCheck(OUT TIMEVAR *p, OUT TIMEVAR *n, OUT TIMEVAR *s)
{
	return cycleTimeCheck(1, 2, p, n, s);
}

int casperTimeCheck(OUT TIMEVAR *p, OUT TIMEVAR *n, OUT TIMEVAR *s)
{
	return cycleTimeCheck(0, 1, p, n, s);
}

int adenTimeCheck(OUT TIMEVAR *p, OUT TIMEVAR *n, OUT TIMEVAR *s)
{
	//リネージュ仕様考察サイトの記事を取り入れて4の倍数時の前後1時間ずつで計算しています。
	//午前1時からの経過時間を4時間で割った時の余り秒数
	return cycleTimeCheck(1, 4, p, n, s);
}

int orenTimeCheck(OUT TIMEVAR *p, OUT TIMEVAR *n, OUT TIMEVAR *s)
{
	const TIMEVAR t5_00 = (5 * 60 * 60); // 5:00 5時間=1000*60*60*5=18000s

	*s = t5_00/2;
	return TimeCheck(0, t5_00, t5_00/2, p, n, Oren);
}
int dkTimeCheck(OUT TIMEVAR *p, OUT TIMEVAR *n, OUT TIMEVAR *s)
{
	const TIMEVAR t7_00 = (7 * 60 * 60); // 7:00
	*s = t7_00/2;
	return TimeCheck(0, t7_00, *s, p, n, Dk );
}

こんな感じで使えるっぽい

void tformat(CClientDC &cdc, int x, int y, LPCTSTR title, int flag, __time64_t *prev, __time64_t *next, __time64_t *sel)
{
	CTime p(*prev);
	CTime n(*prev + *sel);
	if(!flag)
	{
		p  = CTime(*next);
		n  = CTime(*next + *sel);
	}
	CString str;

	str.Format(_T("%-6s %5s-%5s"), title, p.Format(_T("%H:%M")), n.Format( _T("%H:%M")));
	cdc.SetBkColor(GetSysColor(COLOR_BTNFACE));
	cdc.SetTextColor(flag? RGB(100, 100, 255) : RGB(255, 100, 100));
	cdc.TextOut(x,y, str);

}

OnTimer(HWND hWnd)
{
CClientDC cdc( hWnd);

	int y= 18;
	int f;
	__time64_t p, n, s;

	f=dkTimeCheck(&p, &n, &s);
	tformat(cdc, 5, y, CString(_T("DK")), f, &p,&n,&s); y += 12;

	f=orenTimeCheck(&p, &n, &s);
	tformat(cdc, 5, y, CString(_T("Oren")), f, &p,&n,&s); y += 12;

	f=adenTimeCheck(&p, &n, &s);
	tformat(cdc, 5, y, CString(_T("Aden")), f, &p,&n,&s); y += 12;

	f=bkcTimeCheck(&p, &n, &s);
	tformat(cdc, 5, y, CString(_T("BKC")), f, &p,&n,&s); y += 12;

	f=dore2TimeCheck(&p, &n, &s);
	tformat(cdc, 5, y, CString(_T("Dore2")), f, &p,&n,&s); y += 12;

	f=dore1TimeCheck(&p, &n, &s);
	tformat(cdc, 5, y, CString(_T("Dore1")), f, &p,&n,&s); y += 12;

	f=casperTimeCheck(&p, &n, &s);
	tformat(cdc, 5, y, CString(_T("Casper")), f, &p,&n,&s); y += 12;


}