diff options
| author | fusion32 <marcopuzziello@gmail.com> | 2025-05-20 19:29:18 -0300 |
|---|---|---|
| committer | fusion32 <marcopuzziello@gmail.com> | 2025-05-20 19:31:35 -0300 |
| commit | 91d7adad320c34ff0cb25aa21b16d59b67387c43 (patch) | |
| tree | d9f9d3247d43a5c07e08e585fd81380532d44f64 | |
| parent | 42be37f4ad99fc8580415fed89939e305d56193e (diff) | |
| download | game-91d7adad320c34ff0cb25aa21b16d59b67387c43.tar.gz game-91d7adad320c34ff0cb25aa21b16d59b67387c43.zip | |
implement `config.cc`
| -rw-r--r-- | TODO.md | 3 | ||||
| -rw-r--r-- | reference/enums.hh | 10 | ||||
| -rw-r--r-- | reference/game.c | 649 | ||||
| -rw-r--r-- | src/config.cc | 281 | ||||
| -rw-r--r-- | src/enums.hh | 10 | ||||
| -rw-r--r-- | src/main.cc | 2 | ||||
| -rw-r--r-- | src/main.hh | 36 |
7 files changed, 327 insertions, 664 deletions
@@ -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); |
