aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO.md3
-rw-r--r--reference/enums.hh10
-rw-r--r--reference/game.c649
-rw-r--r--src/config.cc281
-rw-r--r--src/enums.hh10
-rw-r--r--src/main.cc2
-rw-r--r--src/main.hh36
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);