From 91d7adad320c34ff0cb25aa21b16d59b67387c43 Mon Sep 17 00:00:00 2001 From: fusion32 Date: Tue, 20 May 2025 19:29:18 -0300 Subject: implement `config.cc` --- TODO.md | 3 +- reference/enums.hh | 10 - reference/game.c | 649 ----------------------------------------------------- src/config.cc | 281 ++++++++++++++++++++++- src/enums.hh | 10 + src/main.cc | 2 +- src/main.hh | 36 +++ 7 files changed, 327 insertions(+), 664 deletions(-) diff --git a/TODO.md b/TODO.md index 562a2d6..9e80c27 100644 --- a/TODO.md +++ b/TODO.md @@ -1,5 +1,6 @@ ## TODO NEXT -- CONFIG +- TReadScript / TWriteScript +- THREADS - TCreature - TPlayer - TNonPlayer diff --git a/reference/enums.hh b/reference/enums.hh index 254781e..abbed3d 100644 --- a/reference/enums.hh +++ b/reference/enums.hh @@ -200,16 +200,6 @@ enum TReaderThreadReplyType: int { REPLY_CHARACTERDATA=1 }; -enum TOKEN: int { - ENDOFFILE=0, - IDENTIFIER=1, - NUMBER=2, - STRING=3, - BYTES=4, - COORDINATE=5, - SPECIAL=6 -}; - enum SITUATION: int { DEFAULT=0, ADDRESS=1, diff --git a/reference/game.c b/reference/game.c index 07e6991..dc91196 100644 --- a/reference/game.c +++ b/reference/game.c @@ -7127,655 +7127,6 @@ listnode<> * __thiscall list<>::append(list<> *this) return this->lastNode; } - - -void DisguisePassword(char *Password,char *Key) - -{ - int a; - size_t sVar1; - size_t sVar2; - undefined4 *puVar3; - int b; - int iVar4; - int i; - int iVar5; - - if (Password == (char *)0x0) { - puVar3 = (undefined4 *)__cxa_allocate_exception(4); - *puVar3 = "password is null"; - } - else if (Key == (char *)0x0) { - puVar3 = (undefined4 *)__cxa_allocate_exception(4); - *puVar3 = "key for disguising password is null"; - } - else { - sVar1 = strlen(Key); - sVar2 = strlen(Password); - if (sVar2 <= sVar1) { - iVar5 = 0; - while( true ) { - sVar1 = strlen(Password); - if ((int)sVar1 <= iVar5) break; - iVar4 = ((int)Key[iVar5] - (int)Password[iVar5]) + 0x5e; - Password[iVar5] = (char)iVar4 + (char)(iVar4 / 0x5e) * -0x5e + '!'; - iVar5 = iVar5 + 1; - } - return; - } - puVar3 = (undefined4 *)__cxa_allocate_exception(4); - *puVar3 = "key for disguising password is too short"; - } - // WARNING: Subroutine does not return - // try { // try from 08052cbf to 08052cc3 has its CatchHandler @ 08052cec - __cxa_throw(puVar3,char_const*::typeinfo,0); -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void ReadConfig(void) - -{ - TReadScriptFile *pTVar1; - bool bVar2; - char cVar3; - char *pcVar4; - char *pcVar5; - int iVar6; - undefined4 *puVar7; - int iVar8; - char *pcVar9; - undefined1 uVar10; - char *in_stack_ffffafdc; - char local_501c [4]; - char Ident [30]; - char FileName [4096]; - TReadScriptFile Script; - - PrivateWorld = false; - builtin_strncpy(GameAddress,"0.0.0.0",8); - SHMKey = 0; - QueryManagerPort = 0; - builtin_strncpy(QueryManagerAddress,"0.0.0.0",8); - AdminPort = 0; - GamePort = 0; - builtin_strncpy(AdminAddress,"0.0.0.0",8); - MaxPlayers = 0; - DebugLevel = 1; - WorldType = NORMAL; - BINPATH[0] = '\0'; - DATAPATH[0] = '\0'; - LOGPATH[0] = '\0'; - MAPPATH[0] = '\0'; - MONSTERPATH[0] = '\0'; - NPCPATH[0] = '\0'; - ORIGMAPPATH[0] = '\0'; - SAVEPATH[0] = '\0'; - USERPATH[0] = '\0'; - QueryManagerAdminPW[0] = '\0'; - QueryManagerGamePW[0] = '\0'; - QueryManagerWebPW[0] = '\0'; - MaxNewbies = 0; - PremiumPlayerBuffer = 0; - PremiumNewbieBuffer = 0; - NumberOfQueryManagers = 0; - Beat = 200; - RebootTime = 0x21c; - ADMIN_DATABASE.Database[0] = '\0'; - VOLATILE_DATABASE.Database[0] = '\0'; - WEB_DATABASE.Database[0] = '\0'; - FORUM_DATABASE.Database[0] = '\0'; - MANAGER_DATABASE.Database[0] = '\0'; - // try { // try from 08052e40 to 08052e44 has its CatchHandler @ 08053bf0 - TReadScriptFile::TReadScriptFile((TReadScriptFile *)(FileName + 0xffc)); - pcVar5 = Ident + 0x1c; - sprintf(pcVar5,".tibia"); - pcVar4 = getenv("HOME"); - if (pcVar4 != (char *)0x0) { - in_stack_ffffafdc = getenv("HOME"); - sprintf(pcVar5,"%s/.tibia"); - } - pcVar4 = getenv("home"); - if (pcVar4 != (char *)0x0) { - in_stack_ffffafdc = getenv("home"); - sprintf(pcVar5,"%s/.tibia"); - } - // try { // try from 08052e86 to 08053b32 has its CatchHandler @ 08053bd0 - bVar2 = FileExists(pcVar5); - if (!bVar2) { - puVar7 = (undefined4 *)__cxa_allocate_exception(4); - *puVar7 = "cannot find config-file"; - // WARNING: Subroutine does not return - // try { // try from 08053b75 to 08053b79 has its CatchHandler @ 08053bd0 - __cxa_throw(puVar7,char_const*::typeinfo,0); - } - TReadScriptFile::open((TReadScriptFile *)(FileName + 0xffc),pcVar5,(int)in_stack_ffffafdc); - do { - TReadScriptFile::nextToken((TReadScriptFile *)(FileName + 0xffc)); - if (FileName._4092_4_ == 0) { - TReadScriptFile::close((TReadScriptFile *)(FileName + 0xffc),(int)pcVar5); - // try { // try from 08053b3c to 08053b40 has its CatchHandler @ 08053bf0 - TReadScriptFile::~TReadScriptFile((TReadScriptFile *)(FileName + 0xffc),(int)pcVar5); - return; - } - uVar10 = FileName._4092_4_ == 1; - if (!(bool)uVar10) { - TReadScriptFile::error((TReadScriptFile *)(FileName + 0xffc),"Identifier expected"); - } - pcVar5 = TReadScriptFile::getIdentifier((TReadScriptFile *)(FileName + 0xffc)); - strcpy(local_501c,pcVar5); - pcVar5 = (char *)0x3d; - TReadScriptFile::readSymbol((TReadScriptFile *)(FileName + 0xffc),'='); - iVar8 = 8; - pcVar4 = local_501c; - pcVar9 = "binpath"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(BINPATH,pcVar5); - } - iVar8 = 8; - pcVar4 = local_501c; - pcVar9 = "mappath"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(MAPPATH,pcVar5); - } - iVar8 = 0xc; - pcVar4 = local_501c; - pcVar9 = "origmappath"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(ORIGMAPPATH,pcVar5); - } - iVar8 = 9; - pcVar4 = local_501c; - pcVar9 = "datapath"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(DATAPATH,pcVar5); - } - iVar8 = 0xc; - pcVar4 = local_501c; - pcVar9 = "monsterpath"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(MONSTERPATH,pcVar5); - } - iVar8 = 8; - pcVar4 = local_501c; - pcVar9 = "npcpath"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(NPCPATH,pcVar5); - } - iVar8 = 9; - pcVar4 = local_501c; - pcVar9 = "userpath"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(USERPATH,pcVar5); - } - iVar8 = 8; - pcVar4 = local_501c; - pcVar9 = "logpath"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(LOGPATH,pcVar5); - } - iVar8 = 9; - pcVar4 = local_501c; - pcVar9 = "savepath"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(SAVEPATH,pcVar5); - } - iVar8 = 4; - pcVar4 = local_501c; - pcVar9 = "shm"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - SHMKey = TReadScriptFile::readNumber((TReadScriptFile *)(FileName + 0xffc)); - } - iVar8 = 10; - pcVar4 = local_501c; - pcVar9 = "adminport"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - AdminPort = TReadScriptFile::readNumber((TReadScriptFile *)(FileName + 0xffc)); - } - iVar8 = 0xd; - pcVar4 = local_501c; - pcVar9 = "adminaddress"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(AdminAddress,pcVar5); - } - iVar8 = 0x11; - pcVar4 = local_501c; - pcVar9 = "querymanagerport"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - QueryManagerPort = TReadScriptFile::readNumber((TReadScriptFile *)(FileName + 0xffc)); - } - iVar8 = 0x14; - pcVar4 = local_501c; - pcVar9 = "querymanageraddress"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(QueryManagerAddress,pcVar5); - } - iVar8 = 0x14; - pcVar4 = local_501c; - pcVar9 = "querymanageradminpw"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(QueryManagerAdminPW,pcVar5); - } - iVar8 = 0x13; - pcVar4 = local_501c; - pcVar9 = "querymanagergamepw"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(QueryManagerGamePW,pcVar5); - } - iVar8 = 0x12; - pcVar4 = local_501c; - pcVar9 = "querymanagerwebpw"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(QueryManagerWebPW,pcVar5); - } - iVar8 = 0xb; - pcVar4 = local_501c; - pcVar9 = "debuglevel"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - DebugLevel = TReadScriptFile::readNumber((TReadScriptFile *)(FileName + 0xffc)); - } - iVar8 = 6; - pcVar4 = local_501c; - pcVar9 = "state"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar4 = TReadScriptFile::readIdentifier((TReadScriptFile *)(FileName + 0xffc)); - iVar8 = 8; - pcVar9 = "private"; - do { - PrivateWorld = (bool)uVar10; - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - PrivateWorld = (bool)uVar10; - } while ((bool)uVar10); - } - iVar8 = 6; - pcVar4 = local_501c; - pcVar9 = "world"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - pcVar5 = TReadScriptFile::readString((TReadScriptFile *)(FileName + 0xffc)); - strcpy(WorldName,pcVar5); - } - iVar8 = 5; - pcVar4 = local_501c; - pcVar9 = "beat"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - Beat = TReadScriptFile::readNumber((TReadScriptFile *)(FileName + 0xffc)); - } - iVar8 = 0xe; - pcVar4 = local_501c; - pcVar9 = "admindatabase"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - TReadScriptFile::readSymbol((TReadScriptFile *)(FileName + 0xffc),'('); - pTVar1 = (TReadScriptFile *)(FileName + 0xffc); - pcVar5 = TReadScriptFile::readIdentifier(pTVar1); - strcpy(ADMIN_DATABASE.Product,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(ADMIN_DATABASE.Database,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(ADMIN_DATABASE.Login,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(ADMIN_DATABASE.Password,pcVar5); - DisguisePassword(ADMIN_DATABASE.Password,"Pm-,o%yD"); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(ADMIN_DATABASE.Host,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(ADMIN_DATABASE.Port,pcVar5); - pcVar5 = (char *)0x29; - TReadScriptFile::readSymbol(pTVar1,')'); - } - iVar8 = 0x11; - pcVar4 = local_501c; - pcVar9 = "volatiledatabase"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - TReadScriptFile::readSymbol((TReadScriptFile *)(FileName + 0xffc),'('); - pTVar1 = (TReadScriptFile *)(FileName + 0xffc); - pcVar5 = TReadScriptFile::readIdentifier(pTVar1); - strcpy(VOLATILE_DATABASE.Product,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(VOLATILE_DATABASE.Database,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(VOLATILE_DATABASE.Login,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(VOLATILE_DATABASE.Password,pcVar5); - DisguisePassword(VOLATILE_DATABASE.Password,"Pm-,o%yD"); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(VOLATILE_DATABASE.Host,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(VOLATILE_DATABASE.Port,pcVar5); - pcVar5 = (char *)0x29; - TReadScriptFile::readSymbol(pTVar1,')'); - } - iVar8 = 0xc; - pcVar4 = local_501c; - pcVar9 = "webdatabase"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - TReadScriptFile::readSymbol((TReadScriptFile *)(FileName + 0xffc),'('); - pTVar1 = (TReadScriptFile *)(FileName + 0xffc); - pcVar5 = TReadScriptFile::readIdentifier(pTVar1); - strcpy(WEB_DATABASE.Product,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(WEB_DATABASE.Database,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(WEB_DATABASE.Login,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(WEB_DATABASE.Password,pcVar5); - DisguisePassword(WEB_DATABASE.Password,"Pm-,o%yD"); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(WEB_DATABASE.Host,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(WEB_DATABASE.Port,pcVar5); - pcVar5 = (char *)0x29; - TReadScriptFile::readSymbol(pTVar1,')'); - } - iVar8 = 0xe; - pcVar4 = local_501c; - pcVar9 = "forumdatabase"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - TReadScriptFile::readSymbol((TReadScriptFile *)(FileName + 0xffc),'('); - pTVar1 = (TReadScriptFile *)(FileName + 0xffc); - pcVar5 = TReadScriptFile::readIdentifier(pTVar1); - strcpy(FORUM_DATABASE.Product,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(FORUM_DATABASE.Database,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(FORUM_DATABASE.Login,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(FORUM_DATABASE.Password,pcVar5); - DisguisePassword(FORUM_DATABASE.Password,"Pm-,o%yD"); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(FORUM_DATABASE.Host,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(FORUM_DATABASE.Port,pcVar5); - pcVar5 = (char *)0x29; - TReadScriptFile::readSymbol(pTVar1,')'); - } - iVar8 = 0x10; - pcVar4 = local_501c; - pcVar9 = "managerdatabase"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - TReadScriptFile::readSymbol((TReadScriptFile *)(FileName + 0xffc),'('); - pTVar1 = (TReadScriptFile *)(FileName + 0xffc); - pcVar5 = TReadScriptFile::readIdentifier(pTVar1); - strcpy(MANAGER_DATABASE.Product,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(MANAGER_DATABASE.Database,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(MANAGER_DATABASE.Login,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(MANAGER_DATABASE.Password,pcVar5); - DisguisePassword(MANAGER_DATABASE.Password,"Pm-,o%yD"); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(MANAGER_DATABASE.Host,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(MANAGER_DATABASE.Port,pcVar5); - pcVar5 = (char *)0x29; - TReadScriptFile::readSymbol(pTVar1,')'); - } - iVar8 = 0xd; - pcVar4 = local_501c; - pcVar9 = "querymanager"; - do { - if (iVar8 == 0) break; - iVar8 = iVar8 + -1; - uVar10 = *pcVar4 == *pcVar9; - pcVar4 = pcVar4 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar10); - if ((bool)uVar10) { - TReadScriptFile::readSymbol((TReadScriptFile *)(FileName + 0xffc),'{'); - do { - if (9 < NumberOfQueryManagers) { - TReadScriptFile::error - ((TReadScriptFile *)(FileName + 0xffc), - "Cannot handle more query managers"); - } - TReadScriptFile::readSymbol((TReadScriptFile *)(FileName + 0xffc),'('); - pTVar1 = (TReadScriptFile *)(FileName + 0xffc); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(QUERY_MANAGER[NumberOfQueryManagers].Host,pcVar5); - TReadScriptFile::readSymbol(pTVar1,','); - iVar8 = NumberOfQueryManagers; - iVar6 = TReadScriptFile::readNumber(pTVar1); - QUERY_MANAGER[iVar8].Port = iVar6; - TReadScriptFile::readSymbol(pTVar1,','); - pcVar5 = TReadScriptFile::readString(pTVar1); - strcpy(QUERY_MANAGER[NumberOfQueryManagers].Password,pcVar5); - DisguisePassword(QUERY_MANAGER[NumberOfQueryManagers].Password,"Pm-,o%yD"); - pcVar5 = (char *)0x29; - TReadScriptFile::readSymbol(pTVar1,')'); - NumberOfQueryManagers = NumberOfQueryManagers + 1; - cVar3 = TReadScriptFile::readSpecial(pTVar1); - } while (cVar3 != '}'); - } - } while( true ); -} - void __static_initialization_and_destruction_0(int __initialize_p,int __priority) { diff --git a/src/config.cc b/src/config.cc index 36917cb..f30b2b6 100644 --- a/src/config.cc +++ b/src/config.cc @@ -1,6 +1,281 @@ #include "main.hh" -int Beat = 0; -int DebugLevel = 0; +char BINPATH[4096]; +char DATAPATH[4096]; +char LOGPATH[4096]; +char MAPPATH[4096]; +char MONSTERPATH[4096]; +char NPCPATH[4096]; +char ORIGMAPPATH[4096]; +char SAVEPATH[4096]; +char USERPATH[4096]; -// +int SHMKey; +int AdminPort; +int GamePort; +int QueryManagerPort; + +char AdminAddress[16]; +char GameAddress[16]; +char QueryManagerAddress[16]; +char QueryManagerAdminPW[9]; +char QueryManagerGamePW[9]; +char QueryManagerWebPW[9]; + +int DebugLevel; +bool PrivateWorld; +TWorldType WorldType; +char WorldName[30]; +int MaxPlayers; +int MaxNewbies; +int PremiumPlayerBuffer; +int PremiumNewbieBuffer; +int Beat; +int RebootTime; + +TDatabaseSettings ADMIN_DATABASE; +TDatabaseSettings VOLATILE_DATABASE; +TDatabaseSettings WEB_DATABASE; +TDatabaseSettings FORUM_DATABASE; +TDatabaseSettings MANAGER_DATABASE; + +int NumberOfQueryManagers; +TQueryManagerSettings QUERY_MANAGER[10]; + +static char PasswordKey[9] = "Pm-,o%yD"; + +static void DisguisePassword(char *Password, char *Key){ + if(Password == NULL){ + throw "password is null"; + } + + if(Key == NULL){ + throw "key for disguising password is null"; + } + + usize KeyLen = strlen(Key); + usize PasswordLen = strlen(Password); + if(KeyLen < PasswordLen){ + throw "key for disguising password is too short"; + } + + for(usize Index = 0; Index < PasswordLen; Index += 1){ + Password[Index] = (Key[Index] - Password[Index] + 0x5E) % 0x5E + 0x21; + } +} + +void ReadConfig(void){ + // TODO(fusion): We're not properly initializing these values, specially the + // `TDatabaseSettings` ones. It is probably not that big of a deal anyway since + // we only call this function once at startup and all this memory should be zero + // initialized. + PrivateWorld = false; + strncpy(GameAddress, "0.0.0.0", 8); + SHMKey = 0; + QueryManagerPort = 0; + strncpy(QueryManagerAddress, "0.0.0.0", 8); + AdminPort = 0; + GamePort = 0; + strncpy(AdminAddress, "0.0.0.0", 8); + MaxPlayers = 0; + DebugLevel = 1; + WorldType = NORMAL; + BINPATH[0] = 0; + DATAPATH[0] = 0; + LOGPATH[0] = 0; + MAPPATH[0] = 0; + MONSTERPATH[0] = 0; + NPCPATH[0] = 0; + ORIGMAPPATH[0] = 0; + SAVEPATH[0] = 0; + USERPATH[0] = 0; + QueryManagerAdminPW[0] = 0; + QueryManagerGamePW[0] = 0; + QueryManagerWebPW[0] = 0; + MaxNewbies = 0; + PremiumPlayerBuffer = 0; + PremiumNewbieBuffer = 0; + NumberOfQueryManagers = 0; + Beat = 200; + RebootTime = 540; + ADMIN_DATABASE.Database[0] = 0; + VOLATILE_DATABASE.Database[0] = 0; + WEB_DATABASE.Database[0] = 0; + FORUM_DATABASE.Database[0] = 0; + MANAGER_DATABASE.Database[0] = 0; + + char FileName[4096]; + if(const char *Home = getenv("home")){ + snprintf(FileName, sizeof(FileName), "%s/.tibia", Home); + }else if(const char *Home = getenv("HOME")){ + snprintf(FileName, sizeof(FileName), "%s/.tibia", Home); + }else{ + snprintf(FileName, sizeof(FileName), ".tibia"); + } + + if(!FileExists(FileName)){ + throw "cannot find config-file"; + } + + TReadScriptFile Script; + Script.open(FileName); + while(true){ + Script.nextToken(); + if(Script.Token == ENDOFFILE){ + // NOTE(fusion): This is the only graceful exit point of the function. + // Errors are transmitted back through exceptions. + Script.close(); + return; + } + + // TODO(fusion): Probably some `expectIdentifier` function inlined? + // It seems `getIdentifier` also does the same check so this one is + // redundant? + if(Script.Token != IDENTIFIER){ + Script.error("Identifier expected"); + } + + char *Identifier = Script.getIdentifier(); + Script.readSymbol('='); + + // TODO(fusion): Ughh... Get rid of all `strcpy`s. A malicious configuration + // file could do a lot of damage. + if(strcmp(Identifier, "binpath") == 0){ + strcpy(BINPATH, Script.readString()); + }else if(strcmp(Identifier, "mappath") == 0){ + strcpy(MAPPATH, Script.readString()); + }else if(strcmp(Identifier, "origmappath") == 0){ + strcpy(ORIGMAPPATH, Script.readString()); + }else if(strcmp(Identifier, "datapath") == 0){ + strcpy(DATAPATH, Script.readString()); + }else if(strcmp(Identifier, "monsterpath") == 0){ + strcpy(MONSTERPATH, Script.readString()); + }else if(strcmp(Identifier, "npcpath") == 0){ + strcpy(NPCPATH, Script.readString()); + }else if(strcmp(Identifier, "userpath") == 0){ + strcpy(USERPATH, Script.readString()); + }else if(strcmp(Identifier, "logpath") == 0){ + strcpy(LOGPATH, Script.readString()); + }else if(strcmp(Identifier, "savepath") == 0){ + strcpy(SAVEPATH, Script.readString()); + }else if(strcmp(Identifier, "shm") == 0){ + SHMKey = Script.readNumber(); + }else if(strcmp(Identifier, "adminport") == 0){ + AdminPort = Script.readNumber(); + }else if(strcmp(Identifier, "adminaddress") == 0){ + strcpy(AdminAddress, Script.readString()); + }else if(strcmp(Identifier, "querymanagerport") == 0){ + QueryManagerPort = Script.readNumber(); + }else if(strcmp(Identifier, "querymanageraddress") == 0){ + strcpy(QueryManagerAddress, Script.readString()); + }else if(strcmp(Identifier, "querymanageradminpw") == 0){ + strcpy(QueryManagerAdminPW, Script.readString()); + }else if(strcmp(Identifier, "querymanagergamepw") == 0){ + strcpy(QueryManagerGamePW, Script.readString()); + }else if(strcmp(Identifier, "querymanagerwebpw") == 0){ + strcpy(QueryManagerWebPW, Script.readString()); + }else if(strcmp(Identifier, "debuglevel") == 0){ + DebugLevel = Script.readNumber(); + }else if(strcmp(Identifier, "state") == 0){ + PrivateWorld = (strcmp(Script.readIdentifier(), "private") == 0); + }else if(strcmp(Identifier, "world") == 0){ + strcpy(WorldName, Script.readString()); + }else if(strcmp(Identifier, "beat") == 0){ + Beat = Script.readNumber(); + }else if(strcmp(Identifier, "admindatabase") == 0){ + Script.readSymbol('('); + strcpy(ADMIN_DATABASE.Product, Script.readIdentifier()); + Script.readSymbol(','); + strcpy(ADMIN_DATABASE.Database, Script.readString()); + Script.readSymbol(','); + strcpy(ADMIN_DATABASE.Login, Script.readString()); + Script.readSymbol(','); + strcpy(ADMIN_DATABASE.Password, Script.readString()); + DisguisePassword(ADMIN_DATABASE.Password, PasswordKey); + Script.readSymbol(','); + strcpy(ADMIN_DATABASE.Host, Script.readString()); + Script.readSymbol(','); + strcpy(ADMIN_DATABASE.Port, Script.readString()); + Script.readSymbol(')'); + }else if(strcmp(Identifier, "volatiledatabase") == 0){ + Script.readSymbol('('); + strcpy(VOLATILE_DATABASE.Product, Script.readIdentifier()); + Script.readSymbol(','); + strcpy(VOLATILE_DATABASE.Database, Script.readString()); + Script.readSymbol(','); + strcpy(VOLATILE_DATABASE.Login, Script.readString()); + Script.readSymbol(','); + strcpy(VOLATILE_DATABASE.Password, Script.readString()); + DisguisePassword(VOLATILE_DATABASE.Password, PasswordKey); + Script.readSymbol(','); + strcpy(VOLATILE_DATABASE.Host, Script.readString()); + Script.readSymbol(','); + strcpy(VOLATILE_DATABASE.Port, Script.readString()); + Script.readSymbol(')'); + }else if(strcmp(Identifier, "webdatabase") == 0){ + Script.readSymbol('('); + strcpy(WEB_DATABASE.Product, Script.readIdentifier()); + Script.readSymbol(','); + strcpy(WEB_DATABASE.Database, Script.readString()); + Script.readSymbol(','); + strcpy(WEB_DATABASE.Login, Script.readString()); + Script.readSymbol(','); + strcpy(WEB_DATABASE.Password, Script.readString()); + DisguisePassword(WEB_DATABASE.Password, PasswordKey); + Script.readSymbol(','); + strcpy(WEB_DATABASE.Host, Script.readString()); + Script.readSymbol(','); + strcpy(WEB_DATABASE.Port, Script.readString()); + Script.readSymbol(')'); + }else if(strcmp(Identifier, "forumdatabase") == 0){ + Script.readSymbol('('); + strcpy(FORUM_DATABASE.Product, Script.readIdentifier()); + Script.readSymbol(','); + strcpy(FORUM_DATABASE.Database, Script.readString()); + Script.readSymbol(','); + strcpy(FORUM_DATABASE.Login, Script.readString()); + Script.readSymbol(','); + strcpy(FORUM_DATABASE.Password, Script.readString()); + DisguisePassword(FORUM_DATABASE.Password, PasswordKey); + Script.readSymbol(','); + strcpy(FORUM_DATABASE.Host, Script.readString()); + Script.readSymbol(','); + strcpy(FORUM_DATABASE.Port, Script.readString()); + Script.readSymbol(')'); + }else if(strcmp(Identifier, "managerdatabase") == 0){ + Script.readSymbol('('); + strcpy(MANAGER_DATABASE.Product, Script.readIdentifier()); + Script.readSymbol(','); + strcpy(MANAGER_DATABASE.Database, Script.readString()); + Script.readSymbol(','); + strcpy(MANAGER_DATABASE.Login, Script.readString()); + Script.readSymbol(','); + strcpy(MANAGER_DATABASE.Password, Script.readString()); + DisguisePassword(MANAGER_DATABASE.Password, PasswordKey); + Script.readSymbol(','); + strcpy(MANAGER_DATABASE.Host, Script.readString()); + Script.readSymbol(','); + strcpy(MANAGER_DATABASE.Port, Script.readString()); + Script.readSymbol(')'); + }else if(strcmp(Identifier, "querymanager") == 0){ + Script.readSymbol('{'); + do{ + if(NumberOfQueryManager >= NARRAY(QUERY_MANAGER)){ + Script.error("Cannot handle more query managers"); + } + Script.readSymbol('('); + strcpy(QUERY_MANAGER[NumberOfQueryManager].Host, Script.readString()); + Script.readSymbol(','); + QUERY_MANAGER[NumberOfQueryManager].Port = Script.readNumber(); + Script.readSymbol(','); + strcpy(QUERY_MANAGER[NumberOfQueryManager].Password, Script.readString()); + DisguisePassword(QUERY_MANAGER[NumberOfQueryManager].Password, PasswordKey); + Script.readSymbol(')'); + NumberOfQueryManagers += 1; + }while(Script.readSpecial() != '}'); + }else{ + // TODO(fusion): + //error("Unknown configuration key \"%s\"", Identifier); + } + } +} diff --git a/src/enums.hh b/src/enums.hh index feb9775..bc3dab0 100644 --- a/src/enums.hh +++ b/src/enums.hh @@ -353,6 +353,16 @@ enum ToDoType: int { TDChangeState = 9, }; +enum TOKEN: int { + ENDOFFILE = 0, + IDENTIFIER = 1, + NUMBER = 2, + STRING = 3, + BYTES = 4, + COORDINATE = 5, + SPECIAL = 6, +}; + enum TYPEATTRIBUTE: int { WAYPOINTS = 0, CAPACITY = 1, diff --git a/src/main.cc b/src/main.cc index e7a5721..0b6e8c0 100644 --- a/src/main.cc +++ b/src/main.cc @@ -207,7 +207,7 @@ void LoadWorldConfig(void){ static void InitAll(void){ try{ - //ReadConfig(); + ReadConfig(); //SetQueryManagerLoginData(1, WorldName); LoadWorldConfig(); InitSHM(!BeADaemon); diff --git a/src/main.hh b/src/main.hh index 287b59c..f888521 100644 --- a/src/main.hh +++ b/src/main.hh @@ -85,7 +85,43 @@ STATIC_ASSERT(OS_LINUX); // // config.cc +extern char BINPATH[4096]; +extern char DATAPATH[4096]; +extern char LOGPATH[4096]; +extern char MAPPATH[4096]; +extern char MONSTERPATH[4096]; +extern char NPCPATH[4096]; +extern char ORIGMAPPATH[4096]; +extern char SAVEPATH[4096]; +extern char USERPATH[4096]; +extern int SHMKey; +extern int AdminPort; +extern int GamePort; +extern int QueryManagerPort; +extern char AdminAddress[16]; +extern char GameAddress[16]; +extern char QueryManagerAddress[16]; +extern char QueryManagerAdminPW[9]; +extern char QueryManagerGamePW[9]; +extern char QueryManagerWebPW[9]; +extern int DebugLevel; +extern bool PrivateWorld; +extern TWorldType WorldType; +extern char WorldName[30]; +extern int MaxPlayers; +extern int MaxNewbies; +extern int PremiumPlayerBuffer; +extern int PremiumNewbieBuffer; extern int Beat; +extern int RebootTime; +extern TDatabaseSettings ADMIN_DATABASE; +extern TDatabaseSettings VOLATILE_DATABASE; +extern TDatabaseSettings WEB_DATABASE; +extern TDatabaseSettings FORUM_DATABASE; +extern TDatabaseSettings MANAGER_DATABASE; +extern int NumberOfQueryManagers; +extern TQueryManagerSettings QUERY_MANAGER[10]; +void ReadConfig(void); // shm.cc void StartGame(void); -- cgit v1.2.3