Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
192 lines
3.8 KiB
C++
192 lines
3.8 KiB
C++
#include "stdafx.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/*
|
|
BOOL IsLeapYear(int nYear)
|
|
{
|
|
// nYear is in Solar system, 1982...
|
|
if (nYear % 4 == 0) {
|
|
if (nYear % 100 == 0) {
|
|
if (nYear % 400 == 0) {
|
|
//...
|
|
return FALSE;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
int GetDayEnd(int nYear, int nMonth)
|
|
{
|
|
int nDayEnd;
|
|
|
|
if (nMonth == 2) {
|
|
nDayEnd = 28;
|
|
if (IsLeapYear(nYear)) {
|
|
nDayEnd++;
|
|
} else {
|
|
// 28
|
|
}
|
|
} else {
|
|
nDayEnd = 30;
|
|
if ((nMonth == 1) || (nMonth == 3) || (nMonth == 5) || (nMonth == 7) || (nMonth == 8) || (nMonth == 10) || (nMonth == 12))
|
|
nDayEnd++; // 31
|
|
}
|
|
|
|
return nDayEnd;
|
|
}
|
|
|
|
long GetTotalSeconds(int nYear, int nMonth, int nDay)
|
|
{
|
|
// nYear, nMonth, nDay날의 0시 0분 0초를 0으로 한 초단위 수...
|
|
ASSERT(nYear >= 1970);
|
|
ASSERT((1 <= nMonth) && (nMonth <= 12));
|
|
ASSERT(1 <= nDay);
|
|
ASSERT(nDay <= GetDayEnd(nYear, nMonth));
|
|
|
|
long lTotal = 0;
|
|
int nStart;
|
|
for(nStart = 1970; nStart < nYear; nStart++) {
|
|
int nDays = 365;
|
|
if (IsLeapYear(nStart)) {
|
|
nDays++;
|
|
}
|
|
lTotal += nDays * 24 * 60 * 60; // 24시간 60분 60초
|
|
}
|
|
for(nStart = 1; nStart < nMonth; nStart++) {
|
|
int nDayEnd = GetDayEnd(nYear, nStart);
|
|
lTotal += nDayEnd * 24 * 60 * 60; // 24시간 60분 60초
|
|
}
|
|
lTotal += (nDay - 1) * 24 * 60 * 60; // 24시간 60분 60초
|
|
|
|
return lTotal;
|
|
}
|
|
*/
|
|
BOOL CTimeDate::IsLeapYear(int nYear)
|
|
{
|
|
// nYear is in Solar system, 1982...
|
|
if (nYear % 4 == 0) {
|
|
if (nYear % 100 == 0) {
|
|
if (nYear % 400 == 0) {
|
|
//...
|
|
return FALSE;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
long CTimeDate::GetCurrent()
|
|
{
|
|
CTimeDate t;
|
|
|
|
t.CurrentDate();
|
|
|
|
return t.m_lDate;
|
|
}
|
|
|
|
void CTimeDate::CurrentDate()
|
|
{
|
|
ASSERT(this);
|
|
time_t t;
|
|
struct tm* p;
|
|
|
|
time(&t);
|
|
p = localtime(&t);
|
|
|
|
m_lDate = 0;
|
|
m_LN.m_xDay = p->tm_mday - 1;
|
|
m_LN.m_xMonth = p->tm_mon;
|
|
m_LN.m_xYear = (p->tm_year + 1900) - TIMEDATE_YEAR_BASE;
|
|
//m_LN.m_xReserved = 0;
|
|
//m_LN.m_xLunar = 0;
|
|
//m_LN.m_xLeap = 0;
|
|
}
|
|
|
|
BOOL CTimeDate::GetDate(long lDate, BOOL bLunar/* = FALSE*/, BOOL bLeap/* = FALSE*/)
|
|
{
|
|
ASSERT(!bLunar && !bLeap); // not yet implemented...
|
|
|
|
int nDay = lDate % 100;
|
|
lDate /= 100;
|
|
int nMonth = lDate % 100;
|
|
lDate /= 100;
|
|
int nYear = lDate;
|
|
BOOL bLeapYear = IsLeapYear(nYear);
|
|
nYear -= TIMEDATE_YEAR_BASE;
|
|
if ((nYear < 0) || (nYear >= (1 << TIMEDATE_YEAR_BITS)))
|
|
return FALSE;
|
|
if (!((1 <= nMonth) && (nMonth <= 12))) {
|
|
return FALSE;
|
|
}
|
|
int nDayMax = 30;
|
|
switch(nMonth) {
|
|
case 1:
|
|
case 3:
|
|
case 5:
|
|
case 7:
|
|
case 8:
|
|
case 10:
|
|
case 12:
|
|
nDayMax++; // 31
|
|
break;
|
|
case 2:
|
|
nDayMax--; // 29
|
|
if (!bLeapYear) {
|
|
nDayMax--; // 28
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (!((1 <= nDay) && (nDay <= nDayMax))) {
|
|
return FALSE;
|
|
}
|
|
nMonth--;
|
|
nDay--;
|
|
|
|
m_lDate = 0;
|
|
m_LN.m_xYear = nYear;
|
|
m_LN.m_xMonth = nMonth;
|
|
m_LN.m_xDay = nDay;
|
|
//m_LN.m_xReserved = 0;
|
|
//m_LN.m_xLunar = 0;
|
|
//m_LN.m_xLeap = 0;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
long CTimeLong::GetCurrent()
|
|
{
|
|
CTimeLong t;
|
|
|
|
t.CurrentTime();
|
|
|
|
return t.m_lTime;
|
|
}
|
|
|
|
void CTimeLong::CurrentTime()
|
|
{
|
|
ASSERT(this);
|
|
time_t t;
|
|
|
|
time(&t);
|
|
|
|
m_lTime = t;
|
|
}
|
|
|
|
void CTimeLong::GetTime(tm& t) const
|
|
{
|
|
ASSERT(this);
|
|
t = *localtime(&m_lTime);
|
|
}
|
|
|