From c09d30cb144ce421ef0e1a786d2965f9abcde0aa Mon Sep 17 00:00:00 2001 From: fusion32 Date: Sun, 29 Jun 2025 18:25:23 -0300 Subject: `houses.cc` --- Makefile | 8 +- TODO.md | 7 +- reference/game.c | 5432 ---------------------------------------------------- reference/types.hh | 42 - src/crnonpl.cc | 20 +- src/enums.hh | 6 + src/houses.cc | 1909 ++++++++++++++++++ src/houses.hh | 104 + src/info.cc | 9 +- src/info.hh | 8 - src/magic.cc | 2 +- src/query.hh | 23 + 12 files changed, 2067 insertions(+), 5503 deletions(-) create mode 100644 src/houses.cc create mode 100644 src/houses.hh diff --git a/Makefile b/Makefile index 8c7a22b..dca6a3c 100644 --- a/Makefile +++ b/Makefile @@ -13,9 +13,9 @@ else CFLAGS += -O2 endif -HEADERS = $(SRCDIR)/common.hh $(SRCDIR)/communication.hh $(SRCDIR)/config.hh $(SRCDIR)/connections.hh $(SRCDIR)/containers.hh $(SRCDIR)/cr.hh $(SRCDIR)/crypto.hh $(SRCDIR)/enums.hh $(SRCDIR)/info.hh $(SRCDIR)/magic.hh $(SRCDIR)/map.hh $(SRCDIR)/moveuse.hh $(SRCDIR)/objects.hh $(SRCDIR)/operate.hh $(SRCDIR)/query.hh $(SRCDIR)/script.hh $(SRCDIR)/stubs.hh $(SRCDIR)/threads.hh +HEADERS = $(SRCDIR)/common.hh $(SRCDIR)/communication.hh $(SRCDIR)/config.hh $(SRCDIR)/connections.hh $(SRCDIR)/containers.hh $(SRCDIR)/cr.hh $(SRCDIR)/crypto.hh $(SRCDIR)/enums.hh $(SRCDIR)/houses.hh $(SRCDIR)/info.hh $(SRCDIR)/magic.hh $(SRCDIR)/map.hh $(SRCDIR)/moveuse.hh $(SRCDIR)/objects.hh $(SRCDIR)/operate.hh $(SRCDIR)/query.hh $(SRCDIR)/script.hh $(SRCDIR)/stubs.hh $(SRCDIR)/threads.hh -$(BUILDDIR)/$(OUTPUTEXE): $(BUILDDIR)/communication.obj $(BUILDDIR)/config.obj $(BUILDDIR)/connections.obj $(BUILDDIR)/cract.obj $(BUILDDIR)/crcombat.obj $(BUILDDIR)/crmain.obj $(BUILDDIR)/crnonpl.obj $(BUILDDIR)/crplayer.obj $(BUILDDIR)/crskill.obj $(BUILDDIR)/crypto.obj $(BUILDDIR)/info.obj $(BUILDDIR)/magic.obj $(BUILDDIR)/main.obj $(BUILDDIR)/map.obj $(BUILDDIR)/moveuse.obj $(BUILDDIR)/objects.obj $(BUILDDIR)/operate.obj $(BUILDDIR)/query.obj $(BUILDDIR)/receiving.obj $(BUILDDIR)/script.obj $(BUILDDIR)/sending.obj $(BUILDDIR)/shm.obj $(BUILDDIR)/strings.obj $(BUILDDIR)/threads.obj $(BUILDDIR)/time.obj $(BUILDDIR)/utils.obj +$(BUILDDIR)/$(OUTPUTEXE): $(BUILDDIR)/communication.obj $(BUILDDIR)/config.obj $(BUILDDIR)/connections.obj $(BUILDDIR)/cract.obj $(BUILDDIR)/crcombat.obj $(BUILDDIR)/crmain.obj $(BUILDDIR)/crnonpl.obj $(BUILDDIR)/crplayer.obj $(BUILDDIR)/crskill.obj $(BUILDDIR)/crypto.obj $(BUILDDIR)/houses.obj $(BUILDDIR)/info.obj $(BUILDDIR)/magic.obj $(BUILDDIR)/main.obj $(BUILDDIR)/map.obj $(BUILDDIR)/moveuse.obj $(BUILDDIR)/objects.obj $(BUILDDIR)/operate.obj $(BUILDDIR)/query.obj $(BUILDDIR)/receiving.obj $(BUILDDIR)/script.obj $(BUILDDIR)/sending.obj $(BUILDDIR)/shm.obj $(BUILDDIR)/strings.obj $(BUILDDIR)/threads.obj $(BUILDDIR)/time.obj $(BUILDDIR)/utils.obj @echo $(CC) $(CFLAGS) $(LFLAGS) -o $@ $^ $(BUILDDIR)/communication.obj: $(SRCDIR)/communication.cc $(HEADERS) @@ -58,6 +58,10 @@ $(BUILDDIR)/crypto.obj: $(SRCDIR)/crypto.cc $(HEADERS) @mkdir -p $(@D) $(CC) -c $(CFLAGS) -o $@ $< +$(BUILDDIR)/houses.obj: $(SRCDIR)/houses.cc $(HEADERS) + @mkdir -p $(@D) + $(CC) -c $(CFLAGS) -o $@ $< + $(BUILDDIR)/info.obj: $(SRCDIR)/info.cc $(HEADERS) @mkdir -p $(@D) $(CC) -c $(CFLAGS) -o $@ $< diff --git a/TODO.md b/TODO.md index dce0e29..bc73f14 100644 --- a/TODO.md +++ b/TODO.md @@ -1,5 +1,4 @@ ## TODO NEXT -- HOUSES.CC <- GAME - QUERY.CC - READER.CC - WRITER.CC @@ -9,7 +8,8 @@ - The map container uses type id zero but it seems to also be used as a "no type" id which makes me want to add some `isNone()`, `isNull()`, `isVoid()` check to `ObjectType` to be used as an alias when pertinent. -- Make some `TNonplayer` random step function? One version that does a random step and another that does a random step keeping some distance from a certain position. +- Make some `TNonplayer` random step function? One version that does a random step + and another that does a random step keeping some distance from a certain position. - I realized that `Change` with an `ObjectType` parameter was being called where the version with `INSTANCEATTRIBUTE` parameter was expected due to `ObjectType` @@ -17,7 +17,8 @@ all converting constructors explicit to avoid these types of errors, although there aren't that many function overloads. -- Define a few constants like `MAX_NAME_LENGTH`, `MAX_SKILLS`, and `MAX_OPEN_CONTAINERS` instead of relying on `NARRAY`. +- Define a few constants like `MAX_NAME_LENGTH`, `MAX_SKILLS`, and `MAX_OPEN_CONTAINERS` + instead of relying on `NARRAY`. ## Stack allocations Any functions that use `alloca` or some other form of dynamic stack allocations will cause decompiled functions to be an absolute mess. It usually shows up in the decompiled code as both a size computation like `-(VAR + CONST & 0xfffffff0)`, followed by some assignment. It doesn't make total sense without looking at the disassembly. I've encountered ~30 such computations and expect the functions containing them to be amongt the most challenging/annoying to be properly decompiled. diff --git a/reference/game.c b/reference/game.c index b6cd717..92c0837 100644 --- a/reference/game.c +++ b/reference/game.c @@ -3388,5438 +3388,6 @@ void __static_initialization_and_destruction_0(int __initialize_p,int __priority return; } - - -THouseArea * GetHouseArea(ushort ID) - -{ - THouseArea *pTVar1; - int i; - int i_00; - - i_00 = 0; - if (0 < HouseAreas) { - do { - pTVar1 = vector::operator()(&HouseArea,i_00); - if (pTVar1->ID == ID) { - pTVar1 = vector::operator()(&HouseArea,i_00); - return pTVar1; - } - i_00 = i_00 + 1; - } while (i_00 < HouseAreas); - } - error("GetHouseArea: Gebiet mit ID %d nicht gefunden.\n",(uint)ID); - return (THouseArea *)0x0; -} - - - -int CheckAccessRight(char *Rule,TPlayer *pl) - -{ - char cVar1; - bool bVar2; - char *pcVar3; - bool local_ec; - bool PositiveRule; - char local_dc [4]; - char Pattern [200]; - - if (Rule == (char *)0x0) { - pcVar3 = "CheckAccessRight: Regel ist NULL.\n"; - } - else { - if (pl != (TPlayer *)0x0) { - cVar1 = *Rule; - if (cVar1 == '!') { - Rule = Rule + 1; - } - local_ec = cVar1 != '!'; - pcVar3 = strchr(Rule,0x40); - if (pcVar3 == (char *)0x0) { - pcVar3 = (pl->super_TCreature).Name; - } - else { - if (pl->Guild[0] == '\0') { - return 0; - } - if (pl->Rank[0] == '\0') { - snprintf(local_dc,200,"@%s",pl->Guild); - } - else { - snprintf(local_dc,200,"%s@%s",pl->Rank,pl->Guild); - } - pcVar3 = local_dc; - } - bVar2 = MatchString(Rule,pcVar3); - if (!bVar2) { - return 0; - } - return (uint)local_ec * 2 + -1; - } - pcVar3 = "CheckAccessRight: pl ist NULL.\n"; - } - error(pcVar3); - return 0; -} - - - -// WARNING: Variable defined which should be unmapped: low - -THouse * GetHouse(ushort ID) - -{ - THouse *pTVar1; - int iVar2; - int test; - int i; - int high; - int iVar3; - int local_14; - int low; - - local_14 = 0; - iVar3 = Houses + -1; - if (-1 < iVar3) { - do { - i = (local_14 + iVar3) / 2; - pTVar1 = vector::operator()(&House,i); - if (pTVar1->ID == ID) { - pTVar1 = vector::operator()(&House,i); - return pTVar1; - } - pTVar1 = vector::operator()(&House,i); - iVar2 = i + 1; - if (ID <= pTVar1->ID) { - iVar2 = local_14; - } - pTVar1 = vector::operator()(&House,i); - if (ID < pTVar1->ID) { - iVar3 = i + -1; - } - local_14 = iVar2; - } while (iVar2 <= iVar3); - } - error("GetHouse: Haus mit ID %d nicht gefunden.\n",(uint)ID); - return (THouse *)0x0; -} - - - -bool IsOwner(ushort HouseID,TPlayer *pl) - -{ - THouse *pTVar1; - THouse *house; - - pTVar1 = GetHouse(HouseID); - if (pTVar1 == (THouse *)0x0) { - error("IsOwner: Haus mit ID %d existiert nicht.\n",(uint)HouseID); - } - else { - if (pl != (TPlayer *)0x0) { - return pTVar1->OwnerID == (pl->super_TCreature).ID; - } - error("IsOwner: pl ist NULL.\n"); - } - return false; -} - - - -bool IsSubowner(ushort HouseID,TPlayer *pl,int TimeStamp) - -{ - THouse *pTVar1; - THouseGuest *Rule; - int iVar2; - THouse *house; - int i; - - pTVar1 = GetHouse(HouseID); - if (pTVar1 == (THouse *)0x0) { - error("IsSubowner: Haus mit ID %d existiert nicht.\n",(uint)HouseID); - } - else if (pl == (TPlayer *)0x0) { - error("IsSubowner: pl ist NULL.\n"); - } - else if ((pTVar1->LastTransition <= TimeStamp) && (i = 0, 0 < pTVar1->Subowners)) { - do { - Rule = vector<>::operator()(&pTVar1->Subowner,i); - iVar2 = CheckAccessRight(Rule->Name,pl); - if (iVar2 == -1) { - return false; - } - if (iVar2 == 1) { - return true; - } - i = i + 1; - } while (i < pTVar1->Subowners); - } - return false; -} - - - -bool IsGuest(ushort HouseID,TPlayer *pl,int TimeStamp) - -{ - THouse *pTVar1; - THouseGuest *Rule; - int iVar2; - THouse *house; - int i; - - pTVar1 = GetHouse(HouseID); - if (pTVar1 == (THouse *)0x0) { - error("IsGuest: Haus mit ID %d existiert nicht.\n",(uint)HouseID); - } - else if (pl == (TPlayer *)0x0) { - error("IsGuest: pl ist NULL.\n"); - } - else if ((pTVar1->LastTransition <= TimeStamp) && (i = 0, 0 < pTVar1->Guests)) { - do { - Rule = vector<>::operator()(&pTVar1->Guest,i); - iVar2 = CheckAccessRight(Rule->Name,pl); - if (iVar2 == -1) { - return false; - } - if (iVar2 == 1) { - return true; - } - i = i + 1; - } while (i < pTVar1->Guests); - } - return false; -} - - - -bool IsInvited(ushort HouseID,TPlayer *pl,int TimeStamp) - -{ - bool bVar1; - THouse *pTVar2; - THouse *house; - bool bVar3; - - if (pl == (TPlayer *)0x0) { - error("IsInvited: pl ist NULL.\n"); - bVar1 = false; - } - else { - bVar1 = false; - pTVar2 = GetHouse(HouseID); - if (pTVar2 == (THouse *)0x0) { - error("IsOwner: Haus mit ID %d existiert nicht.\n",(uint)HouseID); - bVar3 = false; - } - else { - bVar3 = pTVar2->OwnerID == (pl->super_TCreature).ID; - } - if (((bVar3) || (bVar3 = IsSubowner(HouseID,pl,TimeStamp), bVar3)) || - (bVar3 = IsGuest(HouseID,pl,TimeStamp), bVar3)) { - bVar1 = true; - } - } - return bVar1; -} - - - -char * GetHouseName(ushort HouseID) - -{ - THouse *house; - THouse *pTVar1; - char *pcVar2; - - pTVar1 = GetHouse(HouseID); - if (pTVar1 == (THouse *)0x0) { - error("GetHouseName: Haus mit ID %d existiert nicht.\n",(uint)HouseID); - pcVar2 = (char *)0x0; - } - else { - pcVar2 = pTVar1->Name; - } - return pcVar2; -} - - - -char * GetHouseOwner(ushort HouseID) - -{ - THouse *house; - THouse *pTVar1; - char *pcVar2; - - pTVar1 = GetHouse(HouseID); - if (pTVar1 == (THouse *)0x0) { - error("GetHouseOwner: Haus mit ID %d existiert nicht.\n",(uint)HouseID); - pcVar2 = (char *)0x0; - } - else { - pcVar2 = pTVar1->OwnerName; - } - return pcVar2; -} - - - -void ShowSubownerList(ushort HouseID,TPlayer *pl,char *Buffer) - -{ - THouse *pTVar1; - THouse *pTVar2; - THouseGuest *__src; - undefined4 *puVar3; - THouse *house_1; - int i; - THouse *house; - bool bVar4; - char *Text; - - // try { // try from 08061299 to 080613e6 has its CatchHandler @ 080613f0 - pTVar1 = GetHouse(HouseID); - if (pTVar1 == (THouse *)0x0) { - error("ShowSubownerList: Haus mit ID %d existiert nicht.\n",(uint)HouseID); - } - else { - if (pl == (TPlayer *)0x0) { - Text = "ShowSubownerList: pl ist NULL.\n"; - } - else { - if (Buffer != (char *)0x0) { - pTVar2 = GetHouse(HouseID); - if (pTVar2 == (THouse *)0x0) { - error("IsOwner: Haus mit ID %d existiert nicht.\n",(uint)HouseID); - bVar4 = false; - } - else { - bVar4 = pTVar2->OwnerID == (pl->super_TCreature).ID; - } - if (bVar4) { - print(); - i = 0; - sprintf(Buffer,"# Subowners of %s\n",pTVar1->Name); - if (0 < pTVar1->Subowners) { - do { - __src = vector<>::operator()(&pTVar1->Subowner,i); - i = i + 1; - strcat(Buffer,__src->Name); - strcat(Buffer,"\n"); - } while (i < pTVar1->Subowners); - } - return; - } - puVar3 = (undefined4 *)__cxa_allocate_exception(4); - *puVar3 = 1; - goto LAB_0806137f; - } - Text = "ShowSubownerList: Buffer ist NULL.\n"; - } - error(Text); - } - puVar3 = (undefined4 *)__cxa_allocate_exception(4); - *puVar3 = 0xffffffff; -LAB_0806137f: - // WARNING: Subroutine does not return - __cxa_throw(puVar3,&RESULT::typeinfo,0); -} - - - -void ShowGuestList(ushort HouseID,TPlayer *pl,char *Buffer) - -{ - THouse *pTVar1; - THouse *pTVar2; - THouseGuest *__src; - undefined4 *puVar3; - THouse *house_1; - int i; - THouse *house; - bool bVar4; - char *Text; - - // try { // try from 08061429 to 080615b2 has its CatchHandler @ 080615b5 - pTVar1 = GetHouse(HouseID); - if (pTVar1 == (THouse *)0x0) { - error("ShowGuestList: Haus mit ID %d existiert nicht.\n",(uint)HouseID); - } - else { - if (pl == (TPlayer *)0x0) { - Text = "ShowGuestList: pl ist NULL.\n"; - } - else { - if (Buffer != (char *)0x0) { - pTVar2 = GetHouse(HouseID); - if (pTVar2 == (THouse *)0x0) { - error("IsOwner: Haus mit ID %d existiert nicht.\n",(uint)HouseID); - bVar4 = false; - } - else { - bVar4 = pTVar2->OwnerID == (pl->super_TCreature).ID; - } - if (((bVar4) || (bVar4 = IsSubowner(HouseID,pl,0x7fffffff), bVar4)) && - (bVar4 = CheckRight((pl->super_TCreature).ID,PREMIUM_ACCOUNT), bVar4)) { - print(); - i = 0; - sprintf(Buffer,"# Guests of %s\n",pTVar1->Name); - if (0 < pTVar1->Guests) { - do { - __src = vector<>::operator()(&pTVar1->Guest,i); - i = i + 1; - strcat(Buffer,__src->Name); - strcat(Buffer,"\n"); - } while (i < pTVar1->Guests); - } - return; - } - puVar3 = (undefined4 *)__cxa_allocate_exception(4); - *puVar3 = 1; - goto LAB_0806152d; - } - Text = "ShowGuestList: Buffer ist NULL.\n"; - } - error(Text); - } - puVar3 = (undefined4 *)__cxa_allocate_exception(4); - *puVar3 = 0xffffffff; -LAB_0806152d: - // WARNING: Subroutine does not return - __cxa_throw(puVar3,&RESULT::typeinfo,0); -} - - - -// WARNING: Variable defined which should be unmapped: house - -void ChangeSubowners(ushort HouseID,TPlayer *pl,char *Buffer) - -{ - char cVar1; - int l; - THouse *pTVar2; - THouse *pTVar3; - size_t sVar4; - char *pcVar5; - int iVar6; - THouseGuest *__dest; - undefined4 *puVar7; - THouse *house_1; - uint uVar8; - bool bVar9; - THouse *house; - - uVar8 = (uint)HouseID; - // try { // try from 080615ec to 08061790 has its CatchHandler @ 08061793 - pTVar2 = GetHouse(HouseID); - if (pTVar2 == (THouse *)0x0) { - error("ChangeSubowners: Haus mit ID %d existiert nicht.\n",uVar8); - } - else { - if (pl == (TPlayer *)0x0) { - pcVar5 = "ChangeSubowners: pl ist NULL.\n"; - } - else { - if (Buffer != (char *)0x0) { - pTVar3 = GetHouse(HouseID); - if (pTVar3 == (THouse *)0x0) { - error("IsOwner: Haus mit ID %d existiert nicht.\n",uVar8); - bVar9 = false; - } - else { - bVar9 = pTVar3->OwnerID == (pl->super_TCreature).ID; - } - if (bVar9) { - Log("houses",&DAT_080f3120,(pl->super_TCreature).Name,uVar8); - sVar4 = strlen(Buffer); - Buffer[sVar4] = '\n'; - Buffer[sVar4 + 1] = '\0'; - pTVar2->Subowners = 0; - cVar1 = *Buffer; - do { - if (cVar1 == '\0') { -LAB_080616f4: - KickGuests(HouseID); - return; - } - pcVar5 = strchr(Buffer,10); - if (pcVar5 == (char *)0x0) { - error("ChangeSubowners: Kein Newline am Textende.\n"); - goto LAB_080616f4; - } - if ((*Buffer != '#') && (Buffer != pcVar5)) { - iVar6 = (int)pcVar5 - (int)Buffer; - if (0x3b < iVar6) { - iVar6 = 0x3b; - } - Buffer[iVar6] = '\0'; - __dest = vector<>::operator()(&pTVar2->Subowner,pTVar2->Subowners); - strcpy(__dest->Name,Buffer); - iVar6 = pTVar2->Subowners + 1; - pTVar2->Subowners = iVar6; - if (9 < iVar6) goto LAB_080616f4; - } - cVar1 = pcVar5[1]; - Buffer = pcVar5 + 1; - } while( true ); - } - puVar7 = (undefined4 *)__cxa_allocate_exception(4); - *puVar7 = 1; - goto LAB_08061729; - } - pcVar5 = "ChangeSubowners: Buffer ist NULL.\n"; - } - error(pcVar5); - } - puVar7 = (undefined4 *)__cxa_allocate_exception(4); - *puVar7 = 0xffffffff; -LAB_08061729: - // WARNING: Subroutine does not return - __cxa_throw(puVar7,&RESULT::typeinfo,0); -} - - - -// WARNING: Variable defined which should be unmapped: house - -void ChangeGuests(ushort HouseID,TPlayer *pl,char *Buffer) - -{ - char cVar1; - int l; - THouse *pTVar2; - THouse *pTVar3; - size_t sVar4; - char *pcVar5; - int iVar6; - THouseGuest *__dest; - undefined4 *puVar7; - THouse *house_1; - uint uVar8; - bool bVar9; - THouse *house; - - uVar8 = (uint)HouseID; - // try { // try from 080617cc to 080619af has its CatchHandler @ 080619b2 - pTVar2 = GetHouse(HouseID); - if (pTVar2 == (THouse *)0x0) { - error("ChangeGuests: Haus mit ID %d existiert nicht.\n",uVar8); - } - else { - if (pl == (TPlayer *)0x0) { - pcVar5 = "ChangeGuests: pl ist NULL.\n"; - } - else { - if (Buffer != (char *)0x0) { - pTVar3 = GetHouse(HouseID); - if (pTVar3 == (THouse *)0x0) { - error("IsOwner: Haus mit ID %d existiert nicht.\n",uVar8); - bVar9 = false; - } - else { - bVar9 = pTVar3->OwnerID == (pl->super_TCreature).ID; - } - if (((bVar9) || (bVar9 = IsSubowner(HouseID,pl,0x7fffffff), bVar9)) && - (bVar9 = CheckRight((pl->super_TCreature).ID,PREMIUM_ACCOUNT), bVar9)) { - Log("houses",&DAT_080f3240,(pl->super_TCreature).Name,uVar8); - sVar4 = strlen(Buffer); - Buffer[sVar4] = '\n'; - Buffer[sVar4 + 1] = '\0'; - pTVar2->Guests = 0; - cVar1 = *Buffer; - do { - if (cVar1 == '\0') { -LAB_080618f2: - KickGuests(HouseID); - return; - } - pcVar5 = strchr(Buffer,10); - if (pcVar5 == (char *)0x0) { - error("ChangeGuests: Kein Newline am Textende.\n"); - goto LAB_080618f2; - } - if ((*Buffer != '#') && (Buffer != pcVar5)) { - iVar6 = (int)pcVar5 - (int)Buffer; - if (0x3b < iVar6) { - iVar6 = 0x3b; - } - Buffer[iVar6] = '\0'; - __dest = vector<>::operator()(&pTVar2->Guest,pTVar2->Guests); - strcpy(__dest->Name,Buffer); - iVar6 = pTVar2->Guests + 1; - pTVar2->Guests = iVar6; - if (99 < iVar6) goto LAB_080618f2; - } - cVar1 = pcVar5[1]; - Buffer = pcVar5 + 1; - } while( true ); - } - puVar7 = (undefined4 *)__cxa_allocate_exception(4); - *puVar7 = 1; - goto LAB_08061927; - } - pcVar5 = "ChangeGuests: Buffer ist NULL.\n"; - } - error(pcVar5); - } - puVar7 = (undefined4 *)__cxa_allocate_exception(4); - *puVar7 = 0xffffffff; -LAB_08061927: - // WARNING: Subroutine does not return - __cxa_throw(puVar7,&RESULT::typeinfo,0); -} - - - -// WARNING: Variable defined which should be unmapped: z_local - -void GetExitPosition(ushort HouseID,int *x,int *y,int *z) - -{ - THouse *pTVar1; - THouse *house; - int *z_local; - - pTVar1 = GetHouse(HouseID); - if (pTVar1 != (THouse *)0x0) { - *x = pTVar1->ExitX; - *y = pTVar1->ExitY; - *z = pTVar1->ExitZ; - return; - } - error("GetExitPosition: Haus mit ID %d existiert nicht.\n"); - return; -} - - - -void KickGuest(ushort HouseID,TPlayer *Guest) - -{ - ulong uVar1; - bool bVar2; - bool bVar3; - RESULT r; - THouse *pTVar4; - ulong uVar5; - undefined4 *puVar6; - THouse *house; - Object local_6c [4]; - Object local_5c [4]; - Object local_4c [4]; - Object local_3c; - Object Bed; - Object Obj; - - // try { // try from 08061a5c to 08061bbc has its CatchHandler @ 08061cc7 - pTVar4 = GetHouse(HouseID); - if (pTVar4 == (THouse *)0x0) { - error("KickGuest(houses 1): Haus mit ID %d existiert nicht.\n",(uint)HouseID); - } - else { - if (Guest != (TPlayer *)0x0) { - uVar1 = (Guest->super_TCreature).CrObject.ObjectID; - local_3c.ObjectID = uVar1; - GraphicalEffect(&local_3c,3); - GetFirstObject(); - while( true ) { - bVar2 = false; - local_4c[0].ObjectID = NONE.ObjectID; - local_5c[0].ObjectID = NONE.ObjectID; - if (local_3c.ObjectID != NONE.ObjectID) { - Object::getObjectType(local_5c); - bVar3 = ObjectType::getFlag((ObjectType *)local_5c,BED); - if (!bVar3) { - bVar2 = true; - } - } - if (!bVar2) break; - Object::getNextObject(local_4c); - local_3c.ObjectID = local_4c[0].ObjectID; - } - bVar2 = false; - local_5c[0].ObjectID = NONE.ObjectID; - local_4c[0].ObjectID = NONE.ObjectID; - if (local_3c.ObjectID != NONE.ObjectID) { - // try { // try from 08061bf0 to 08061c81 has its CatchHandler @ 08061cc7 - uVar5 = Object::getAttribute(&local_3c,TEXTSTRING); - if (uVar5 != 0) { - bVar2 = true; - } - } - if (bVar2) { - print(); - local_4c[0].ObjectID = local_3c.ObjectID; - local_6c[0].ObjectID = local_3c.ObjectID; - // try { // try from 08061bdb to 08061bdf has its CatchHandler @ 08061c84 - UseObjects(0,local_6c,local_4c); - } - local_6c[0].ObjectID = NONE.ObjectID; - GetMapContainer((int)local_5c,pTVar4->ExitX,pTVar4->ExitY); - local_4c[0].ObjectID = uVar1; - Move(0,local_4c,local_5c,-1,false,local_6c); - local_6c[0].ObjectID = uVar1; - GraphicalEffect(local_6c,0xb); - return; - } - error("KickGuest(houses 1): Guest ist NULL.\n"); - } - puVar6 = (undefined4 *)__cxa_allocate_exception(4); - *puVar6 = 0xffffffff; - // WARNING: Subroutine does not return - __cxa_throw(puVar6,&RESULT::typeinfo,0); -} - - - -// WARNING: Variable defined which should be unmapped: SelfKick - -void KickGuest(ushort HouseID,TPlayer *Host,TPlayer *Guest) - -{ - ushort uVar1; - THouse *house; - THouse *pTVar2; - undefined4 *puVar3; - THouse *house_1; - uint uVar4; - bool bVar5; - bool bVar6; - char *Text; - bool SelfKick; - - uVar4 = (uint)HouseID; - // try { // try from 08061cfc to 08061eaa has its CatchHandler @ 08061eb0 - pTVar2 = GetHouse(HouseID); - if (pTVar2 == (THouse *)0x0) { - error("KickGuest(houses 2): Haus mit ID %d existiert nicht.\n",uVar4); - } - else { - if (Host == (TPlayer *)0x0) { - Text = "KickGuest(houses 2): Host ist NULL.\n"; - } - else { - if (Guest != (TPlayer *)0x0) { - bVar5 = Host == Guest; - uVar1 = GetHouseID((Guest->super_TCreature).posx,(Guest->super_TCreature).posy, - (Guest->super_TCreature).posz); - if (uVar1 == HouseID) { - pTVar2 = GetHouse(HouseID); - if (pTVar2 == (THouse *)0x0) { - error("IsOwner: Haus mit ID %d existiert nicht.\n",uVar4); - bVar6 = false; - } - else { - bVar6 = pTVar2->OwnerID == (Host->super_TCreature).ID; - } - if ((((bVar6) || (bVar6 = IsSubowner(HouseID,Host,0x7fffffff), bVar6)) || - (bVar5)) && - ((bVar6 = CheckRight((Guest->super_TCreature).ID,ENTER_HOUSES), !bVar6 || - (bVar5)))) { - pTVar2 = GetHouse(HouseID); - if (pTVar2 == (THouse *)0x0) { - error("IsOwner: Haus mit ID %d existiert nicht.\n",uVar4); -LAB_08061e13: - bVar6 = false; - } - else { - if (Guest == (TPlayer *)0x0) { - error("IsOwner: pl ist NULL.\n"); - goto LAB_08061e13; - } - bVar6 = pTVar2->OwnerID == (Guest->super_TCreature).ID; - } - if ((!bVar6) || (bVar5)) { - KickGuest(HouseID,Guest); - return; - } - } - } - puVar3 = (undefined4 *)__cxa_allocate_exception(4); - *puVar3 = 1; - goto LAB_08061def; - } - Text = "KickGuest(houses 2): Guest ist NULL.\n"; - } - error(Text); - } - puVar3 = (undefined4 *)__cxa_allocate_exception(4); - *puVar3 = 0xffffffff; -LAB_08061def: - // WARNING: Subroutine does not return - __cxa_throw(puVar3,&RESULT::typeinfo,0); -} - - - -void KickGuests(ushort HouseID) - -{ - bool bVar1; - ushort uVar2; - THouse *pTVar3; - ulong CharacterID; - TPlayer *pl; - undefined4 *puVar4; - THouse *house; - ulong ID; - TPlayer *Guest; - undefined1 local_4c [4]; - TFindCreatures Search; - - // try { // try from 08061ee6 to 08061ff6 has its CatchHandler @ 08061ff7 - pTVar3 = GetHouse(HouseID); - if (pTVar3 != (THouse *)0x0) { - TFindCreatures::TFindCreatures - ((TFindCreatures *)local_4c,MaxHouseX,MaxHouseY,pTVar3->CenterX,pTVar3->CenterY,1) - ; - while( true ) { - CharacterID = TFindCreatures::getNext((TFindCreatures *)local_4c); - if (CharacterID == 0) break; - pl = GetPlayer(CharacterID); - uVar2 = GetHouseID((pl->super_TCreature).posx,(pl->super_TCreature).posy, - (pl->super_TCreature).posz); - if (uVar2 == HouseID) { - bVar1 = IsInvited(HouseID,pl,0x7fffffff); - if (!bVar1) { - bVar1 = CheckRight(CharacterID,ENTER_HOUSES); - if (!bVar1) { - KickGuest(HouseID,pl); - } - } - } - } - return; - } - error("KickGuests: Haus mit ID %d existiert nicht.\n",(uint)HouseID); - puVar4 = (undefined4 *)__cxa_allocate_exception(4); - *puVar4 = 0xffffffff; - // WARNING: Subroutine does not return - __cxa_throw(puVar4,&RESULT::typeinfo,0); -} - - - -bool MayOpenDoor(Object *Door,TPlayer *pl) - -{ - char cVar1; - int iVar2; - bool bVar3; - ulong Number; - size_t sVar4; - char *pcVar5; - int iVar6; - char *Text; - undefined4 local_50; - char *pcVar7; - char acStack_44 [20]; - undefined1 *local_30; - Object local_2c [7]; - - local_30 = &stack0xffffffb4; - local_50 = 0x806202d; - bVar3 = Object::exists(Door); - if (bVar3) { - if (pl == (TPlayer *)0x0) { - pcVar7 = "MayOpenDoor: pl ist NULL.\n"; - } - else { - local_50 = 0x806204f; - Object::getObjectType(local_2c); - local_50 = 0x8062062; - bVar3 = ObjectType::getFlag((ObjectType *)local_2c,NAMEDOOR); - if (bVar3) { - local_50 = 0x8062072; - Object::getObjectType(local_2c); - local_50 = 0x8062085; - bVar3 = ObjectType::getFlag((ObjectType *)local_2c,TEXT); - if (bVar3) { - local_50 = 0x80620b4; - Number = Object::getAttribute(Door,TEXTSTRING); - local_50 = 0x80620bc; - pcVar7 = GetDynamicString(Number); - if (pcVar7 == (char *)0x0) { - return false; - } - local_50 = 0x80620cc; - sVar4 = strlen(pcVar7); - iVar2 = -(sVar4 + 0x11 & 0xfffffff0); - *(char **)((int)local_2c + iVar2 + -0x1c) = pcVar7; - pcVar7 = acStack_44 + iVar2; - *(char **)((int)local_2c + iVar2 + -0x20) = pcVar7; - *(undefined4 *)((int)&local_50 + iVar2) = 0x80620e6; - strcpy(*(char **)((int)local_2c + iVar2 + -0x20), - *(char **)((int)local_2c + iVar2 + -0x1c)); - acStack_44[sVar4 + iVar2] = '\n'; - acStack_44[sVar4 + iVar2 + 1] = '\0'; - cVar1 = acStack_44[iVar2]; - do { - if (cVar1 == '\0') { - return false; - } - *(undefined4 *)((int)local_2c + iVar2 + -0x1c) = 10; - *(char **)((int)local_2c + iVar2 + -0x20) = pcVar7; - *(undefined4 *)((int)&local_50 + iVar2) = 0x8062110; - pcVar5 = strchr(*(char **)((int)local_2c + iVar2 + -0x20), - *(int *)((int)local_2c + iVar2 + -0x1c)); - if (pcVar5 == (char *)0x0) { - *(char **)((int)local_2c + iVar2 + -0x20) = - "MayOpenDoor: Kein Newline am Textende.\n"; - *(undefined4 *)((int)&local_50 + iVar2) = 0x806215d; - error(*(char **)((int)local_2c + iVar2 + -0x20)); - return false; - } - if ((*pcVar7 != '#') && (pcVar7 != pcVar5)) { - *pcVar5 = '\0'; - *(char **)((int)local_2c + iVar2 + -0x20) = pcVar7; - *(TPlayer **)((int)local_2c + iVar2 + -0x1c) = pl; - *(undefined4 *)((int)&local_50 + iVar2) = 0x8062131; - iVar6 = CheckAccessRight(*(char **)((int)local_2c + iVar2 + -0x20), - *(TPlayer **)((int)local_2c + iVar2 + -0x1c)); - if (iVar6 == -1) { - return false; - } - if (iVar6 == 1) { - return true; - } - } - cVar1 = pcVar5[1]; - pcVar7 = pcVar5 + 1; - } while( true ); - } - } - pcVar7 = &DAT_080f3580; - } - } - else { - pcVar7 = &DAT_080f3600; - } - local_50 = 0x8062095; - error(pcVar7); - return false; -} - - - -void ShowNameDoor(Object *Door,TPlayer *pl,char *Buffer) - -{ - bool bVar1; - ushort ID; - char *Text; - THouse *pTVar2; - ulong Number; - char *pcVar3; - undefined4 *puVar4; - THouse *house; - ushort HouseID; - uint uVar5; - char *pcVar6; - int local_38; - int x; - int y; - int z; - - // try { // try from 08062198 to 080623b3 has its CatchHandler @ 080623d0 - bVar1 = Object::exists(Door); - if (bVar1) { - if (pl == (TPlayer *)0x0) { - pcVar3 = "ShowNameDoor: pl ist NULL.\n"; - goto LAB_080623af; - } - if (Buffer == (char *)0x0) { - pcVar3 = "ShowNameDoor: Buffer ist NULL.\n"; - goto LAB_080623af; - } - z = Door->ObjectID; - GetObjectCoordinates((Object *)&z,&local_38,&x,&y); - ID = GetHouseID(local_38,x,y); - uVar5 = (uint)ID; - if (ID == 0) { - pcVar3 = &DAT_080f36e0; - } - else { - pTVar2 = GetHouse(ID); - if (pTVar2 == (THouse *)0x0) { - error("IsOwner: Haus mit ID %d existiert nicht.\n",uVar5); - bVar1 = false; - } - else { - bVar1 = pTVar2->OwnerID == (pl->super_TCreature).ID; - } - if (!bVar1) { - pcVar3 = (pl->super_TCreature).Name; - pcVar6 = "Spieler %s ist nicht Mieter des Hauses %d.\n"; - print(); - puVar4 = (undefined4 *)__cxa_allocate_exception(4,pcVar6,pcVar3,uVar5); - *puVar4 = 1; - goto LAB_0806231d; - } - print(); - Object::getObjectType((Object *)&z); - bVar1 = ObjectType::getFlag((ObjectType *)&z,TEXT); - if (bVar1) { - Number = Object::getAttribute(Door,TEXTSTRING); - pcVar3 = GetDynamicString(Number); - if (pcVar3 == (char *)0x0) { - Buffer[0] = '#'; - Buffer[1] = ' '; - Buffer[2] = 'P'; - Buffer[3] = 'l'; - Buffer[4] = 'a'; - Buffer[5] = 'y'; - Buffer[6] = 'e'; - Buffer[7] = 'r'; - Buffer[8] = 's'; - Buffer[9] = ' '; - Buffer[10] = 'a'; - Buffer[0xb] = 'l'; - Buffer[0xc] = 'l'; - Buffer[0xd] = 'o'; - Buffer[0xe] = 'w'; - Buffer[0xf] = 'e'; - Buffer[0x10] = 'd'; - Buffer[0x11] = ' '; - Buffer[0x12] = 't'; - Buffer[0x13] = 'o'; - Buffer[0x14] = ' '; - Buffer[0x15] = 'o'; - Buffer[0x16] = 'p'; - Buffer[0x17] = 'e'; - Buffer[0x18] = 'n'; - Buffer[0x19] = ' '; - Buffer[0x1a] = 't'; - Buffer[0x1b] = 'h'; - Buffer[0x1c] = 'i'; - Buffer[0x1d] = 's'; - Buffer[0x1e] = ' '; - Buffer[0x1f] = 'd'; - *(uchar **)(Buffer + 0x20) = CommunicationThreadStacks + 0xa750f; - Buffer[0x24] = '\0'; - } - else { - strcpy(Buffer,pcVar3); - } - return; - } - pcVar3 = &DAT_080f3640; - } - error(pcVar3,local_38,x,y); - } - else { - pcVar3 = &DAT_080f3760; -LAB_080623af: - error(pcVar3); - } - puVar4 = (undefined4 *)__cxa_allocate_exception(4); - *puVar4 = 0xffffffff; -LAB_0806231d: - // WARNING: Subroutine does not return - __cxa_throw(puVar4,&RESULT::typeinfo,0); -} - - - -void ChangeNameDoor(Object *Door,TPlayer *pl,char *Buffer) - -{ - bool bVar1; - ushort ID; - THouse *pTVar2; - ulong uVar3; - undefined4 *puVar4; - THouse *house; - ushort HouseID; - char *pcVar5; - int local_38; - int x; - int y; - int z; - - // try { // try from 08062408 to 080625ed has its CatchHandler @ 08062605 - bVar1 = Object::exists(Door); - if (bVar1) { - if (pl == (TPlayer *)0x0) { - pcVar5 = "ChangeNameDoor: pl ist NULL.\n"; - goto LAB_080625e9; - } - if (Buffer == (char *)0x0) { - pcVar5 = "ChangeNameDoor: Buffer ist NULL.\n"; - goto LAB_080625e9; - } - z = Door->ObjectID; - GetObjectCoordinates((Object *)&z,&local_38,&x,&y); - ID = GetHouseID(local_38,x,y); - if (ID == 0) { - pcVar5 = &DAT_080f3840; - } - else { - pTVar2 = GetHouse(ID); - if (pTVar2 == (THouse *)0x0) { - error("IsOwner: Haus mit ID %d existiert nicht.\n",(uint)ID); - bVar1 = false; - } - else { - bVar1 = pTVar2->OwnerID == (pl->super_TCreature).ID; - } - if (!bVar1) { - puVar4 = (undefined4 *)__cxa_allocate_exception(4); - *puVar4 = 1; - goto LAB_08062581; - } - Object::getObjectType((Object *)&z); - bVar1 = ObjectType::getFlag((ObjectType *)&z,TEXT); - if (bVar1) { - Log("houses",&DAT_080f37a0,(pl->super_TCreature).Name,(uint)ID,local_38,x,y); - uVar3 = Object::getAttribute(Door,TEXTSTRING); - DeleteDynamicString(uVar3); - z = Door->ObjectID; - uVar3 = AddDynamicString(Buffer); - Change((Object *)&z,TEXTSTRING,uVar3); - return; - } - pcVar5 = &DAT_080f37e0; - } - error(pcVar5,local_38,x,y); - } - else { - pcVar5 = &DAT_080f38e0; -LAB_080625e9: - error(pcVar5); - } - puVar4 = (undefined4 *)__cxa_allocate_exception(4); - *puVar4 = 0xffffffff; -LAB_08062581: - // WARNING: Subroutine does not return - __cxa_throw(puVar4,&RESULT::typeinfo,0); -} - - - -int DeleteCoins(Object *Con,ObjectType *Type,int Amount) - -{ - bool bVar1; - ulong uVar2; - Object local_5c [4]; - Object local_4c [4]; - ObjectType local_3c [4]; - Object local_2c; - Object Obj; - - do { - if (Amount == 0) { - return 0; - } - local_3c[0].TypeID = Con->ObjectID; - GetFirstContainerObject(&local_2c); - if (local_2c.ObjectID == NONE.ObjectID) { - return Amount; - } - while( true ) { - local_4c[0].ObjectID = NONE.ObjectID; - local_3c[0].TypeID = NONE.ObjectID; - Object::getObjectType(local_4c); - ObjectType::setTypeID(local_3c,Type->TypeID); - if (local_4c[0].ObjectID == local_3c[0].TypeID) break; - Object::getObjectType(local_5c); - bVar1 = ObjectType::getFlag((ObjectType *)local_5c,CONTAINER); - if (bVar1) { - ObjectType::setTypeID((ObjectType *)local_5c,Type->TypeID); - local_4c[0].ObjectID = local_2c.ObjectID; - Amount = DeleteCoins(local_4c,(ObjectType *)local_5c,Amount); - if (Amount == 0) { - return 0; - } - } - Object::getNextObject(local_4c); - local_5c[0].ObjectID = local_4c[0].ObjectID; - local_2c.ObjectID = local_5c[0].ObjectID; - if (local_4c[0].ObjectID == NONE.ObjectID) { - return Amount; - } - } - uVar2 = Object::getAttribute(&local_2c,AMOUNT); - if (Amount < (int)uVar2) { - local_5c[0].ObjectID = local_2c.ObjectID; - uVar2 = Object::getAttribute(&local_2c,AMOUNT); - Change(local_5c,AMOUNT,uVar2 - Amount); - return 0; - } - uVar2 = Object::getAttribute(&local_2c,AMOUNT); - Amount = Amount - uVar2; - local_5c[0].ObjectID = local_2c.ObjectID; - DeleteObject(local_5c); - } while( true ); -} - - - -void DeleteMoney(Object *Con,int Amount) - -{ - int local_58; - int Gold; - int Platinum; - int Crystal; - Object local_3c [4]; - ObjectType local_2c [7]; - - GetSpecialObject((SPECIALMEANING)local_2c); - Crystal = Con->ObjectID; - GetFirstContainerObject(local_3c); - Platinum = CountObjects(local_3c,local_2c,0); - GetSpecialObject((SPECIALMEANING)&Crystal); - local_2c[0].TypeID = Con->ObjectID; - GetFirstContainerObject(local_3c); - Gold = CountObjects(local_3c,(ObjectType *)&Crystal,0); - GetSpecialObject((SPECIALMEANING)&Crystal); - local_2c[0].TypeID = Con->ObjectID; - GetFirstContainerObject(local_3c); - local_58 = CountObjects(local_3c,(ObjectType *)&Crystal,0); - CalculateChange(Amount,&local_58,&Gold,&Platinum); - if (0 < local_58) { - GetSpecialObject((SPECIALMEANING)&Crystal); - local_3c[0] = (Object)Con->ObjectID; - DeleteCoins(local_3c,(ObjectType *)&Crystal,local_58); - } - if (local_58 < 0) { - GetSpecialObject((SPECIALMEANING)local_3c); - local_2c[0].TypeID = Con->ObjectID; - SetObject((Object *)&Crystal,local_2c,(ulong)local_3c); - ChangeObject((Object *)&Crystal,AMOUNT,-local_58); - } - if (0 < Gold) { - GetSpecialObject((SPECIALMEANING)&Crystal); - local_3c[0] = (Object)Con->ObjectID; - DeleteCoins(local_3c,(ObjectType *)&Crystal,Gold); - } - if (Gold < 0) { - GetSpecialObject((SPECIALMEANING)local_3c); - local_2c[0].TypeID = Con->ObjectID; - SetObject((Object *)&Crystal,local_2c,(ulong)local_3c); - ChangeObject((Object *)&Crystal,AMOUNT,-Gold); - } - if (0 < Platinum) { - GetSpecialObject((SPECIALMEANING)&Crystal); - local_3c[0] = (Object)Con->ObjectID; - DeleteCoins(local_3c,(ObjectType *)&Crystal,Platinum); - } - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void CleanField(void) - -{ - bool bVar1; - ulong uVar2; - ulong *in_stack_00000010; - Object local_6c; - Object Help; - Object local_5c; - Object Content; - Object local_4c; - Object Help_1; - Object local_3c [4]; - Object local_2c; - Object Obj; - - local_2c.ObjectID = NONE.ObjectID; - if (*in_stack_00000010 == NONE.ObjectID) { - error("CleanField: Depot-Box existiert nicht.\n"); - } - else { - GetFirstObject(); - if (local_2c.ObjectID != NONE.ObjectID) { - do { - local_4c.ObjectID = NONE.ObjectID; - local_3c[0].ObjectID = NONE.ObjectID; - Object::getObjectType(&local_4c); - bVar1 = ObjectType::getFlag((ObjectType *)&local_4c,NAMEDOOR); - if (bVar1) { - uVar2 = Object::getAttribute(&local_2c,TEXTSTRING); - DeleteDynamicString(uVar2); - local_4c.ObjectID = local_2c.ObjectID; - Change(&local_4c,TEXTSTRING,0); - uVar2 = Object::getAttribute(&local_2c,EDITOR); - DeleteDynamicString(uVar2); - local_4c.ObjectID = local_2c.ObjectID; - Change(&local_4c,EDITOR,0); - } - Object::getObjectType(&local_4c); - bVar1 = ObjectType::getFlag((ObjectType *)&local_4c,UNMOVE); - if (bVar1) { -LAB_08062ae1: - Object::getObjectType(&local_5c); - bVar1 = ObjectType::getFlag((ObjectType *)&local_5c,CONTAINER); - if (bVar1) { - local_4c.ObjectID = local_2c.ObjectID; - GetFirstContainerObject(&local_5c); - local_4c = (Object)NONE.ObjectID; - local_3c[0].ObjectID = local_4c.ObjectID; - if (local_5c.ObjectID != NONE.ObjectID) { - do { - local_4c.ObjectID = local_5c.ObjectID; - local_3c[0].ObjectID = NONE.ObjectID; - Object::getNextObject(&local_6c); - local_5c.ObjectID = local_6c.ObjectID; - local_6c.ObjectID = *in_stack_00000010; - local_3c[0].ObjectID = local_4c.ObjectID; - MoveObject(local_3c,&local_6c); - local_4c = (Object)NONE.ObjectID; - local_3c[0].ObjectID = local_4c.ObjectID; - } while (local_5c.ObjectID != NONE.ObjectID); - } - } - Object::getObjectType(&local_6c); - bVar1 = ObjectType::getFlag((ObjectType *)&local_6c,UNMOVE); - if (bVar1) { - Object::getNextObject(&local_5c); - local_6c.ObjectID = local_5c.ObjectID; - local_2c.ObjectID = local_6c.ObjectID; - } - else { - local_6c.ObjectID = local_2c.ObjectID; - Object::getNextObject(&local_4c); - local_2c.ObjectID = local_4c.ObjectID; - local_5c.ObjectID = local_6c.ObjectID; - DeleteObject(&local_5c); - } - } - else { - Object::getObjectType(&local_4c); - bVar1 = ObjectType::getFlag((ObjectType *)&local_4c,TAKE); - if (!bVar1) goto LAB_08062ae1; - local_4c.ObjectID = local_2c.ObjectID; - Object::getNextObject(&local_5c); - local_2c.ObjectID = local_5c.ObjectID; - local_5c.ObjectID = *in_stack_00000010; - local_3c[0].ObjectID = local_4c.ObjectID; - MoveObject(local_3c,&local_5c); - } - } while (local_2c.ObjectID != NONE.ObjectID); - } - } - return; -} - - - -void CleanHouse(THouse *house,TPlayerData *PlayerData) - -{ - int x_00; - bool bVar1; - ushort uVar2; - int iVar3; - int iVar4; - int y_1; - int y_00; - int x_1; - int x_01; - bool bVar5; - char *Text; - int local_70; - int local_68; - int local_60; - int z_1; - int iStack_58; - bool PlayerDataAssigned; - int x; - int y; - int z; - undefined1 local_3c [16]; - Object local_2c; - Object Box; - - if (house == (THouse *)0x0) { - Text = "CleanHouse: house ist NULL.\n"; - } - else { - if (house->OwnerID == 0) { - error("CleanHouse: Haus %d hat keinen Besitzer.\n",(uint)house->ID); - return; - } - bVar5 = PlayerData != (TPlayerData *)0x0; - if ((bVar5) || - (PlayerData = AssignPlayerPoolSlot(house->OwnerID,false), - PlayerData != (TPlayerData *)0x0)) { - GetStartPosition(&stack0xffffffa8,&x,&y,true); - GetSpecialObject((SPECIALMEANING)local_3c); - GetMapContainer((int)&z,iStack_58,x); - SetObject(&local_2c,(ObjectType *)&z,(ulong)local_3c); - z = local_2c.ObjectID; - LoadDepot(PlayerData,house->DepotNr,(Object *)&z); - local_60 = 0; - local_68 = house->CenterX; - local_70 = MaxHouseX; - do { - x_01 = (local_68 - local_70) + -1; - if (x_01 <= local_68 + local_70) { - iVar3 = house->CenterY; - iVar4 = MaxHouseY; - do { - y_00 = (iVar3 - iVar4) + -1; - x_00 = x_01 + 1; - if (y_00 <= iVar4 + iVar3) { - do { - uVar2 = GetHouseID(x_01,y_00,local_60); - if (uVar2 == house->ID) { -LAB_08062f90: - z = local_2c.ObjectID; - CleanField(); - } - else { - bVar1 = CoordinateFlag(); - if (bVar1) { - iVar3 = y_00 + 1; - uVar2 = GetHouseID(x_01 + -1,iVar3,local_60); - if (((uVar2 == house->ID) || - (uVar2 = GetHouseID(x_01,iVar3,local_60), - uVar2 == house->ID)) || - (uVar2 = GetHouseID(x_00,iVar3,local_60), - uVar2 == house->ID)) goto LAB_08062f90; - } - bVar1 = CoordinateFlag(); - if ((bVar1) && - (((uVar2 = GetHouseID(x_00,y_00 + -1,local_60), - uVar2 == house->ID || - (uVar2 = GetHouseID(x_00,y_00,local_60), uVar2 == house->ID - )) || (uVar2 = GetHouseID(x_00,y_00 + 1,local_60), - uVar2 == house->ID)))) goto LAB_08062f90; - } - y_00 = y_00 + 1; - iVar3 = house->CenterY; - } while (y_00 <= MaxHouseY + iVar3); - local_68 = house->CenterX; - local_70 = MaxHouseX; - iVar4 = MaxHouseY; - } - x_01 = x_00; - } while (x_00 <= local_68 + local_70); - } - local_60 = local_60 + 1; - if (0xf < local_60) { - z = local_2c.ObjectID; - SaveDepot(PlayerData,house->DepotNr,(Object *)&z); - z = local_2c.ObjectID; - DeleteObject((Object *)&z); - if (bVar5) { - return; - } - ReleasePlayerPoolSlot(PlayerData); - return; - } - } while( true ); - } - Text = &DAT_080f3960; - } - error(Text); - return; -} - - - -void ClearHouse(THouse *house) - -{ - house->OwnerID = 0; - house->OwnerName[0] = '\0'; - house->Subowners = 0; - house->Guests = 0; - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void FinishAuctions(void) - -{ - ushort uVar1; - int iVar2; - int_0_ *piVar3; - TPlayerData *pTVar4; - time_t tVar5; - ulong_0_ *puVar6; - int iVar7; - THouse *pTVar8; - int iVar9; - ulong uVar10; - uint uVar11; - int iVar12; - char_0__30_ *CharacterNames; - undefined4 local_310; - int aiStack_2fc [2]; - int_0_ aiStack_2f4 [8]; - int_0_ *local_2ec; - TPlayerData *local_2e8; - TPlayerData *PlayerData; - THouse *house; - int i; - time_t TimeStamp; - int_0_ *Bids; - ulong_0_ *CharacterIDs; - ushort_0_ *HouseIDs; - int NumberOfAuctions; - int x; - int y; - int z; - ulong local_2ac [4]; - undefined1 local_29c [4]; - char Welcome [500]; - ulong local_9c [4]; - undefined1 local_8c [4]; - char HelpWorld [60]; - ObjectType local_4c [4]; - ulong local_3c [4]; - Object local_2c; - Object Con; - - // try { // try from 080630d9 to 08063742 has its CatchHandler @ 08063748 - local_310 = 0x80630de; - GetStartPosition(&NumberOfAuctions,&x,&y,true); - local_310 = 0x80630f4; - GetSpecialObject((SPECIALMEANING)local_3c); - local_310 = 0x8063120; - GetMapContainer((int)local_4c,NumberOfAuctions,x); - local_310 = 0x806313e; - SetObject(&local_2c,local_4c,(ulong)local_3c); - local_310 = 0x8063155; - Log("houses","Bearbeite beendete Auktionen...\n"); - HouseIDs = (ushort_0_ *)Houses; - iVar12 = Houses + -1; - iVar2 = -(Houses + 0x10 + iVar12 & 0xfffffff0U); - uVar11 = iVar12 * 4 + 0x13U & 0xfffffff0; - CharacterIDs = aiStack_2f4 + iVar2; - Bids = aiStack_2f4 + -uVar11 + iVar2; - iVar12 = -(iVar12 * 0x1e + 0x2dU & 0xfffffff0); - TimeStamp = (time_t)(aiStack_2f4 + iVar12 + uVar11 * -2 + iVar2); - *(int_0_ **)((int)aiStack_2fc + iVar12 + uVar11 * -2 + iVar2 + 4) = - aiStack_2f4 + iVar12 + uVar11 * -2 + iVar2; - *(int_0_ **)((int)aiStack_2fc + iVar12 + uVar11 * -2 + iVar2) = - aiStack_2f4 + iVar12 + -uVar11 + iVar2; - *(int_0_ **)(&stack0xfffffd00 + iVar12 + uVar11 * -2 + iVar2) = Bids; - puVar6 = CharacterIDs; - *(ushort_0_ ***)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = &HouseIDs; - *(ulong_0_ **)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2) = puVar6; - *(TQueryManagerConnection **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - QueryManagerConnection; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80631de; - iVar7 = TQueryManagerConnection::finishAuctions - (*(TQueryManagerConnection **) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(int **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2), - *(ushort **)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2), - *(ulong **)(&stack0xfffffd00 + iVar12 + uVar11 * -2 + iVar2), - *(char (**) [30])((int)aiStack_2fc + iVar12 + uVar11 * -2 + iVar2), - *(int **)((int)aiStack_2fc + iVar12 + uVar11 * -2 + iVar2 + 4)); - if (iVar7 == 0) { - *(char **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = WorldName; - *(undefined1 **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = local_8c; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x8063224; - AddSlashes(*(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(char **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2)); - *(undefined4 *)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = 0; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x8063230; - i = time(*(time_t **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2)); - house = (THouse *)0x0; - if (0 < (int)HouseIDs) { - local_2ec = aiStack_2f4 + iVar12 + -uVar11 + iVar2; - do { - tVar5 = TimeStamp; - pTVar8 = house; - *(undefined4 *)((int)aiStack_2fc + iVar12 + uVar11 * -2 + iVar2) = - *(undefined4 *)(TimeStamp + (int)house * 4); - *(int_0_ **)(&stack0xfffffd00 + iVar12 + uVar11 * -2 + iVar2) = local_2ec; - uVar1 = *(ushort *)(CharacterIDs + (int)pTVar8 * 2); - *(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = "houses"; - *(undefined **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = &DAT_080f3a60; - *(uint *)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2) = (uint)uVar1; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x8063291; - Log(*(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(char **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2)); - pTVar8 = house; - *(undefined4 *)((int)aiStack_2fc + iVar12 + uVar11 * -2 + iVar2 + 4) = - *(undefined4 *)(tVar5 + (int)house * 4); - *(undefined4 *)((int)aiStack_2fc + iVar12 + uVar11 * -2 + iVar2) = - *(undefined4 *)(Bids + (int)pTVar8 * 4); - uVar1 = *(ushort *)(CharacterIDs + (int)pTVar8 * 2); - *(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = "houses"; - *(char **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = - "bei Reset: INSERT INTO HouseAssignments VALUES (\'%s\',%d,%d,%d);\n"; - *(uint *)(&stack0xfffffd00 + iVar12 + uVar11 * -2 + iVar2) = (uint)uVar1; - *(undefined1 **)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2) = local_8c; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80632d7; - Log(*(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(char **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2)); - pTVar8 = house; - *(uint *)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - (uint)*(ushort *)(CharacterIDs + (int)house * 2); - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80632ef; - PlayerData = (TPlayerData *) - GetHouse(*(ushort *)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2)); - if (PlayerData == (TPlayerData *)0x0) { - uVar1 = *(ushort *)(CharacterIDs + (int)pTVar8 * 2); - *(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - "FinishAuctions: Haus mit Nummer %d existiert nicht.\n"; - *(uint *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = (uint)uVar1; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x8063743; - error(*(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2)); - } - else if (PlayerData->Cycle[4] == 0) { - *(undefined4 *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = 0; - *(undefined4 *)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - *(undefined4 *)(Bids + (int)house * 4); - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x806344f; - local_2e8 = AssignPlayerPoolSlot - (*(ulong *)(&stack0xfffffcf4 + - iVar12 + uVar11 * -2 + iVar2), - (bool)(&stack0xfffffcf8)[iVar12 + uVar11 * -2 + iVar2]); - if (local_2e8 == (TPlayerData *)0x0) { - *(undefined **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - &DAT_080f3cc0; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x8063724; - error(*(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2)); - } - else { - local_4c[0].TypeID = local_2c.ObjectID; - *(ObjectType **)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2) = local_4c - ; - pTVar4 = PlayerData; - *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = - PlayerData->MagicDeltaAct[0x15]; - *(TPlayerData **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - local_2e8; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x8063488; - LoadDepot(*(TPlayerData **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) - ,*(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2), - *(Object **)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2)); - local_3c[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = local_3c; - *(ObjectType **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = local_4c - ; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x806349d; - GetFirstContainerObject - (*(Object **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2)); - *(ObjectType **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = local_4c - ; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80634ab; - iVar7 = CountMoney(*(Object **) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2)); - if (iVar7 < pTVar4->MagicDeltaAct[0x14] + - *(int *)(TimeStamp + (int)house * 4)) { - *(undefined **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = - &DAT_080f3c80; - *(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = "houses"; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x80636d0; - Log(*(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(char **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2)); - piVar3 = local_2ec; - PlayerData->Cycle[4] = *(int *)(Bids + (int)house * 4); - *(int **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - PlayerData->Cycle + 5; - *(int_0_ **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = piVar3; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x8063705; - strcpy(*(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(char **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2)); - PlayerData->Cycle[0xe] = 0; - } - else { - *(undefined **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = - &DAT_080f3b80; - *(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = "houses"; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x80634dc; - Log(*(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(char **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2)); - local_9c[0] = local_2c.ObjectID; - iVar7 = PlayerData->MagicDeltaAct[0x14]; - iVar9 = *(int *)(TimeStamp + (int)house * 4); - *(ulong **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = local_9c; - *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = - iVar7 + iVar9; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x8063514; - DeleteMoney(*(Object **) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2)); - pTVar4 = PlayerData; - *(char **)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2) = - "Welcome!\n\nCongratulations on your choice\nfor house \"%s\".\nThe rent for the first month\nhas already been debited to your\ndepot. The next rent will be\npayable in thirty days.\nHave a good time in your new home!" - ; - *(undefined1 **)(&stack0xfffffd00 + iVar12 + uVar11 * -2 + iVar2) = - (undefined1 *)((int)&pTVar4->CharacterID + 2); - *(undefined4 *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = 500; - *(undefined1 **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - local_29c; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x806353f; - snprintf(*(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(size_t *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2), - *(char **)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2)); - *(undefined1 **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - local_29c; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x8063547; - uVar10 = AddDynamicString(*(char **)(&stack0xfffffcf4 + - iVar12 + uVar11 * -2 + iVar2)); - *(undefined4 *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = 0x1a; - *(ulong **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = local_2ac - ; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x806355f; - GetSpecialObject(*(SPECIALMEANING *) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2)); - z = local_2c.ObjectID; - *(undefined4 *)(&stack0xfffffd00 + iVar12 + uVar11 * -2 + iVar2) = 0; - *(ulong **)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2) = local_2ac - ; - *(int **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = &z; - *(ulong **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = local_9c; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x8063595; - SetObject(*(Object **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(ObjectType **) - (&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2), - *(ulong *)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2)); - *(ulong *)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2) = uVar10; - *(undefined4 *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = 9; - *(ulong **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = local_9c; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x80635b2; - ChangeObject(*(Object **) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(INSTANCEATTRIBUTE *) - (&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2), - *(ulong *)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2) - ); - z = local_2c.ObjectID; - *(int **)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2) = &z; - pTVar4 = PlayerData; - *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = - PlayerData->MagicDeltaAct[0x15]; - *(TPlayerData **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - local_2e8; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x80635e3; - SaveDepot(*(TPlayerData **) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2), - *(Object **)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2)) - ; - pTVar4->Cycle[4] = *(int *)(Bids + (int)house * 4); - *(int_0_ **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = - local_2ec; - *(int **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - PlayerData->Cycle + 5; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x8063615; - strcpy(*(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(char **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2)); - PlayerData->Cycle[0xd] = i; - PlayerData->Cycle[0xe] = i + 0x278d00; - } - while( true ) { - local_2ac[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = local_2ac - ; - *(int **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = &z; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x806365c; - GetFirstContainerObject - (*(Object **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) - ); - local_9c[0] = NONE.ObjectID; - local_4c[0].TypeID = NONE.ObjectID; - if (z == NONE.ObjectID) break; - local_2ac[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = local_2ac - ; - *(int **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = &z; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x8063696; - GetFirstContainerObject - (*(Object **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) - ); - *(int **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = &z; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x80636a7; - DeleteObject(*(Object **) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2)); - } - *(TPlayerData **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - local_2e8; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80636b7; - ReleasePlayerPoolSlot - (*(TPlayerData **) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2)); - } - } - else { - *(int *)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2) = PlayerData->Cycle[4] - ; - uVar1 = *(ushort *)(CharacterIDs + (int)house * 2); - *(undefined **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = &DAT_080f3b00 - ; - *(uint *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = (uint)uVar1; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x8063335; - error(*(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2)); - } - house = (THouse *)((int)&house->ID + 1); - local_2ec = local_2ec + 0x1e; - } while ((int)house < (int)HouseIDs); - } - iVar7 = 0; - if (0 < Houses) { - do { - *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = iVar7; - *(vector **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = &House; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x8063385; - pTVar8 = vector::operator() - (*(vector **) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2)); - if (pTVar8->PaidUntil == 0) { - *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = iVar7; - *(vector **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = &House; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80633b0; - pTVar8 = vector::operator() - (*(vector **) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2)); - if (pTVar8->OwnerID != 0) { - *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = iVar7; - *(vector **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - &House; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80633ca; - pTVar8 = vector::operator() - (*(vector **) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2 - )); - *(undefined4 *)(&stack0xfffffcfc + iVar12 + uVar11 * -2 + iVar2) = 1; - *(ulong *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = - pTVar8->OwnerID; - *(TQueryManagerConnection **) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = QueryManagerConnection; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80633e9; - iVar9 = TQueryManagerConnection::excludeFromAuctions - (*(TQueryManagerConnection **) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(ulong *)(&stack0xfffffcf8 + - iVar12 + uVar11 * -2 + iVar2), - (bool)(&stack0xfffffcfc)[iVar12 + uVar11 * -2 + iVar2]); - if (iVar9 != 0) { - *(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - "FinishAuctions: Kann Ersteigerer nicht verbannen.\n"; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = - 0x806342d; - error(*(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2)); - } - *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = iVar7; - *(vector **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - &House; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80633fd; - pTVar8 = vector::operator() - (*(vector **) - (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2), - *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2 - )); - pTVar8->OwnerName[0] = '\0'; - pTVar8->OwnerID = 0; - pTVar8->Subowners = 0; - pTVar8->Guests = 0; - } - } - iVar7 = iVar7 + 1; - } while (iVar7 < Houses); - } - z = local_2c.ObjectID; - *(int **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = &z; - } - else { - *(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = - "FinishAuctions: Kann Versteigerungen nicht ermitteln.\n"; - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80631ee; - error(*(char **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2)); - local_4c[0].TypeID = local_2c.ObjectID; - *(ObjectType **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = local_4c; - } - *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80631ff; - DeleteObject(*(Object **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2)); - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void CollectRents(void) - -{ - TPlayerData *pTVar1; - ushort uVar2; - undefined4 uVar3; - int_0_ *piVar4; - ulong_0_ *puVar5; - int iVar6; - ulong uVar7; - int iVar8; - THouse *pTVar9; - THouse *pTVar10; - uint uVar11; - char *pcVar12; - int *piVar13; - ObjectType *pOVar14; - char_0__30_ *NewOwnerNames; - int iVar15; - int iVar16; - ushort_0_ **ppuVar17; - int *piVar18; - int NumberOfGuildhouses; - int iVar19; - undefined4 local_350; - uint auStack_33c [3]; - int_0_ aiStack_330 [8]; - int_0_ *local_328; - int *local_324; - ushort *local_320; - char *local_31c; - TPlayerData *local_318; - TPlayerData *PlayerData_1; - time_t Deadline; - ulong_0_ *OwnerIDs; - int Crystal; - TPlayerData *PlayerData; - THouse *house; - int i_1; - time_t TimeStamp; - int_0_ *Prices; - ulong_0_ *NewOwnerIDs; - ushort_0_ *HouseIDs; - int local_2e8; - int NumberOfEvictions; - int local_2e0; - int local_2dc; - int NumberOfTransfers; - int x; - int y; - int z; - ulong local_2bc [4]; - ulong local_2ac [4]; - ulong local_29c [4]; - undefined1 local_28c [4]; - char Warning [500]; - undefined1 local_8c [4]; - char HelpWorld [60]; - ObjectType local_4c [4]; - ulong local_3c [4]; - Object local_2c; - Object Con; - - // try { // try from 08063799 to 08064aff has its CatchHandler @ 08064b16 - local_350 = 0x806379e; - GetStartPosition(&NumberOfTransfers,&x,&y,true); - local_350 = 0x80637b4; - GetSpecialObject((SPECIALMEANING)local_3c); - local_350 = 0x80637e0; - GetMapContainer((int)local_4c,NumberOfTransfers,x); - local_350 = 0x80637fe; - SetObject(&local_2c,local_4c,(ulong)local_3c); - iVar15 = 0; - if (0 < Houses) { - do { - local_350 = 0x8064b00; - pTVar9 = vector::operator()(&House,iVar15); - iVar16 = Houses; - iVar15 = iVar15 + 1; - pTVar9->Help = 0; - } while (iVar15 < iVar16); - } - local_350 = 0x8063823; - Log("houses",&DAT_080f3d40); - local_2dc = Houses; - iVar16 = Houses + -1; - iVar15 = -(Houses + 0x10 + iVar16 & 0xfffffff0U); - uVar11 = iVar16 * 4 + 0x13U & 0xfffffff0; - NewOwnerIDs = aiStack_330 + iVar15; - iVar16 = -(iVar16 * 0x1e + 0x2dU & 0xfffffff0); - piVar18 = (int *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c); - Prices = aiStack_330 + -uVar11 + iVar15; - TimeStamp = (time_t)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15); - *(int_0_ **)((int)auStack_33c + iVar16 + uVar11 * -2 + iVar15 + 4) = - aiStack_330 + iVar16 + uVar11 * -2 + iVar15; - *(int_0_ **)((int)auStack_33c + iVar16 + uVar11 * -2 + iVar15) = - aiStack_330 + iVar16 + -uVar11 + iVar15; - *(int_0_ **)(&stack0xfffffcc0 + iVar16 + uVar11 * -2 + iVar15) = Prices; - puVar5 = NewOwnerIDs; - *(int **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = &local_2dc; - *(ulong_0_ **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = puVar5; - *(TQueryManagerConnection **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - QueryManagerConnection; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x80638ac; - iVar6 = TQueryManagerConnection::transferHouses - (*(TQueryManagerConnection **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(ushort **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15), - *(ulong **)(&stack0xfffffcc0 + iVar16 + uVar11 * -2 + iVar15), - *(char (**) [30])((int)auStack_33c + iVar16 + uVar11 * -2 + iVar15), - *(int **)((int)auStack_33c + iVar16 + uVar11 * -2 + iVar15 + 4)); - if (iVar6 != 0) { - *(undefined **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &DAT_080f3d80; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x80638bc; - error(*(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - pOVar14 = local_4c; - local_4c[0].TypeID = local_2c.ObjectID; - goto LAB_080638c5; - } - *(char **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = WorldName; - *(undefined1 **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = local_8c; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x80638f2; - AddSlashes(*(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15)); - *(undefined4 *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = 0; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x80638fe; - i_1 = time(*(time_t **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - house = (THouse *)0x0; - if (0 < local_2dc) { - local_328 = aiStack_330 + iVar16 + -uVar11 + iVar15; - local_320 = (ushort *)NewOwnerIDs; - local_324 = (int *)Prices; - do { - *(uint *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = (uint)*local_320; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063949; - PlayerData = (TPlayerData *) - GetHouse(*(ushort *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - if (PlayerData == (TPlayerData *)0x0) { - uVar2 = *local_320; - *(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "CollectRents: Haus mit Nummer %d existiert nicht.\n"; - *(uint *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = (uint)uVar2; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8064ae9; - error(*(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - } - else if ((*local_324 == 0) || (iVar6 = *(int *)(TimeStamp + (int)house * 4), iVar6 < 1)) - { -LAB_0806489a: - *(int *)(&stack0xfffffcc0 + iVar16 + uVar11 * -2 + iVar15) = PlayerData->Cycle[4]; - uVar2 = *local_320; - *(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = "houses"; - *(undefined **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = &DAT_080f4e1a; - *(uint *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = (uint)uVar2; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x80648cb; - Log(*(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15)); - if (*local_324 == 0) { - *(undefined4 *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = 0; - *(TPlayerData **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - PlayerData; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8064a2b; - CleanHouse(*(THouse **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(TPlayerData **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15)); - } - PlayerData->Cycle[4] = 0; - *(undefined1 *)(PlayerData->Cycle + 5) = 0; - PlayerData->MaxCycle[0xc] = 0; - PlayerData->Count[10] = 0; - PlayerData->Count[0xb] = 1; - if (*local_324 != 0) { - *(int *)(&stack0xfffffcc0 + iVar16 + uVar11 * -2 + iVar15) = *local_324; - uVar2 = *local_320; - *(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = "houses"; - *(undefined **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - &DAT_080f4e32; - *(uint *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = (uint)uVar2; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x806493c; - Log(*(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15)); - piVar4 = local_328; - PlayerData->Cycle[4] = *local_324; - PlayerData->Cycle[0xd] = i_1; - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - PlayerData->Cycle + 5; - *(int_0_ **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = piVar4; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8064976; - strcpy(*(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15)); - if (*local_324 != 0) { - uVar2 = *local_320; - *(undefined1 **)((int)auStack_33c + iVar16 + uVar11 * -2 + iVar15 + 4) = - local_8c; - *(uint *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -4) = (uint)uVar2; - *(undefined4 *)((int)auStack_33c + iVar16 + uVar11 * -2 + iVar15) = - *(undefined4 *)(TimeStamp + (int)house * 4); - *(int *)(&stack0xfffffcc0 + iVar16 + uVar11 * -2 + iVar15) = *local_324; - iVar6 = i_1; - *(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = "houses"; - *(char **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - "bei Reset: UPDATE HouseOwners SET Termination=%d,NewOwner=%ld,Accepted=1,Price=%d WHERE World=\'%s\' AND HouseID=%d;\n" - ; - *(int *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = iVar6; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8064a10 - ; - Log(*(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15)); - goto LAB_08063bd9; - } - } - uVar2 = *local_320; - *(undefined1 **)(&stack0xfffffcc0 + iVar16 + uVar11 * -2 + iVar15) = local_8c; - *(uint *)((int)auStack_33c + iVar16 + uVar11 * -2 + iVar15) = (uint)uVar2; - iVar6 = i_1; - *(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = "houses"; - *(char **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - "bei Reset: UPDATE HouseOwners SET Termination=%d,NewOwner=null,Accepted=0,Price=0 WHERE World=\'%s\' AND HouseID=%d;\n" - ; - *(int *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = iVar6; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x80649b7; - Log(*(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15)); - } - else { - *(int *)((int)auStack_33c + iVar16 + uVar11 * -2 + iVar15) = iVar6; - *(int *)(&stack0xfffffcc0 + iVar16 + uVar11 * -2 + iVar15) = *local_324; - uVar2 = *local_320; - *(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = "houses"; - *(undefined **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = &DAT_080f3dc0; - *(uint *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = (uint)uVar2; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x80639af; - Log(*(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15)); - *(undefined4 *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = 0; - *(int *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = *local_324; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x80639c7; - Crystal = (int)AssignPlayerPoolSlot - (*(ulong *)(aiStack_330 + - iVar16 + uVar11 * -2 + iVar15 + -0x1c), - (bool)(&stack0xfffffcb8)[iVar16 + uVar11 * -2 + iVar15]); - if ((TPlayerData *)Crystal == (TPlayerData *)0x0) { - *(undefined **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &DAT_080f4420; - } - else { - local_4c[0].TypeID = local_2c.ObjectID; - *(ObjectType **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = local_4c; - *(int *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - PlayerData->MagicDeltaAct[0x15]; - *(int *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = Crystal; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063a00; - LoadDepot(*(TPlayerData **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) - ,*(int *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(Object **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15)); - local_3c[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = local_3c; - *(ObjectType **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = local_4c - ; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063a15; - GetFirstContainerObject - (*(Object **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - *(ObjectType **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = local_4c - ; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063a23; - iVar6 = CountMoney(*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - if (iVar6 < *(int *)(TimeStamp + (int)house * 4)) { - *(undefined **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - &DAT_080f3e00; - *(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = "houses"; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063a4c - ; - Log(*(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15)); - pTVar1 = PlayerData; - *(char **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = - "Warning!\n\nYou have not enough gold to pay\nthe price for house \"%s\".\nTherefore the transfer is cancelled." - ; - *(undefined1 **)(&stack0xfffffcc0 + iVar16 + uVar11 * -2 + iVar15) = - (undefined1 *)((int)&pTVar1->CharacterID + 2); - *(undefined4 *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = 500; - *(undefined1 **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_28c; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063a77 - ; - snprintf(*(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(size_t *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(char **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15)); - *(undefined1 **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_28c; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063a7f - ; - uVar7 = AddDynamicString(*(char **)(aiStack_330 + - iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - *(undefined4 *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = 0x1a; - *(ulong **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = local_2ac - ; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063a97 - ; - GetSpecialObject(*(SPECIALMEANING *) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - local_2bc[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = local_2ac; - *(undefined4 *)(&stack0xfffffcc0 + iVar16 + uVar11 * -2 + iVar15) = 0; - *(ulong **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = local_2bc; - *(ulong **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = local_29c - ; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063acd - ; - SetObject(*(Object **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(ObjectType **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) - ,*(ulong *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15)); - *(ulong *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = uVar7; - *(undefined4 *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = 9; - *(ulong **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = local_29c - ; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063aea - ; - ChangeObject(*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(INSTANCEATTRIBUTE *) - (&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(ulong *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15)); - local_2bc[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = local_2bc; - *(int *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - PlayerData->MagicDeltaAct[0x15]; - *(int *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = Crystal; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063b1b - ; - SaveDepot(*(TPlayerData **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(Object **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15)); - while( true ) { - local_2ac[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - local_2ac; - *(ulong **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_2bc; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063b42; - GetFirstContainerObject - (*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - local_29c[0] = NONE.ObjectID; - z = NONE.ObjectID; - if (local_2bc[0] == NONE.ObjectID) break; - local_2bc[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - local_2bc; - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063b79; - GetFirstContainerObject - (*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063b84; - DeleteObject(*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - } - *(int *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = Crystal; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063b94 - ; - ReleasePlayerPoolSlot - (*(TPlayerData **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - uVar2 = *local_320; - *(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = "houses"; - *(undefined1 **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = - local_8c; - *(char **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - "bei Reset: UPDATE HouseOwners SET Termination=null,NewOwner=null,Accepted=0,Price=null WHERE World=\'%s\' AND HouseID=%d;\n" - ; - *(uint *)(&stack0xfffffcc0 + iVar16 + uVar11 * -2 + iVar15) = (uint)uVar2; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063bbf - ; - Log(*(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15)); - *(uint *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - (uint)*local_320; - *(TQueryManagerConnection **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - QueryManagerConnection; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8063bd9 - ; - TQueryManagerConnection::cancelHouseTransfer - (*(TQueryManagerConnection **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(ushort *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15)); - goto LAB_08063bd9; - } - z = local_2c.ObjectID; - uVar3 = *(undefined4 *)(TimeStamp + (int)house * 4); - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = uVar3; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x806456d; - DeleteMoney(*(Object **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15)); - z = local_2c.ObjectID; - *(int **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = &z; - *(int *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - PlayerData->MagicDeltaAct[0x15]; - *(int *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = Crystal; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8064598; - SaveDepot(*(TPlayerData **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) - ,*(int *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(Object **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15)); - while( true ) { - local_2bc[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = local_2bc; - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x80645b9 - ; - GetFirstContainerObject - (*(Object **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) - ); - local_2ac[0] = NONE.ObjectID; - local_29c[0] = NONE.ObjectID; - if (z == NONE.ObjectID) break; - local_2bc[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = local_2bc; - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x80645f6 - ; - GetFirstContainerObject - (*(Object **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) - ); - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8064607 - ; - DeleteObject(*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - } - *(int *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = Crystal; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8064617; - ReleasePlayerPoolSlot - (*(TPlayerData **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - *(undefined4 *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = 0; - *(int *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - PlayerData->Cycle[4]; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8064633; - Crystal = (int)AssignPlayerPoolSlot - (*(ulong *)(aiStack_330 + - iVar16 + uVar11 * -2 + iVar15 + -0x1c), - (bool)(&stack0xfffffcb8) - [iVar16 + uVar11 * -2 + iVar15]); - if ((TPlayerData *)Crystal != (TPlayerData *)0x0) { - z = local_2c.ObjectID; - *(int **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = &z; - *(int *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - PlayerData->MagicDeltaAct[0x15]; - *(int *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = Crystal; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8064672 - ; - LoadDepot(*(TPlayerData **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(Object **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15)); - for (iVar6 = *(int *)(TimeStamp + (int)house * 4); 9999 < iVar6; - iVar6 = iVar6 + (int)OwnerIDs * -10000) { - NumberOfEvictions = 100; - local_2e0 = iVar6 / 10000; - piVar13 = &NumberOfEvictions; - if (iVar6 / 10000 < 0x65) { - piVar13 = &local_2e0; - } - OwnerIDs = (ulong_0_ *)*piVar13; - *(undefined4 *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = 3; - *(ulong **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_2bc; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x80646e3; - GetSpecialObject(*(SPECIALMEANING *) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)) - ; - local_2ac[0] = local_2c.ObjectID; - *(undefined4 *)(&stack0xfffffcc0 + iVar16 + uVar11 * -2 + iVar15) = 0; - *(ulong **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = - local_2bc; - *(ulong **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - local_2ac; - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064719; - SetObject(*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(ObjectType **) - (&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(ulong *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15)); - puVar5 = OwnerIDs; - *(undefined4 *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = 2; - *(ulong_0_ **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = - puVar5; - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x806473c; - ChangeObject(*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(INSTANCEATTRIBUTE *) - (&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(ulong *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15 - )); - } - if (99 < iVar6) { - *(undefined4 *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = 2; - *(ulong **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_2bc; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064a46; - GetSpecialObject(*(SPECIALMEANING *) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)) - ; - local_2ac[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - local_2ac; - *(undefined4 *)(&stack0xfffffcc0 + iVar16 + uVar11 * -2 + iVar15) = 0; - *(ulong **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = - local_2bc; - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064a7c; - SetObject(*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(ObjectType **) - (&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(ulong *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15)); - *(undefined4 *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = 2; - *(int *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = iVar6 / 100 - ; - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064aac; - ChangeObject(*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(INSTANCEATTRIBUTE *) - (&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(ulong *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15 - )); - } - if (0 < iVar6 % 100) { - *(undefined4 *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = 1; - *(ulong **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_2bc; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064797; - GetSpecialObject(*(SPECIALMEANING *) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)) - ; - local_2ac[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - local_2ac; - *(undefined4 *)(&stack0xfffffcc0 + iVar16 + uVar11 * -2 + iVar15) = 0; - *(ulong **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = - local_2bc; - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x80647cd; - SetObject(*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(ObjectType **) - (&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(ulong *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15)); - *(int *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = iVar6 % 100 - ; - *(undefined4 *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = 2; - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x80647ea; - ChangeObject(*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(INSTANCEATTRIBUTE *) - (&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(ulong *)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15 - )); - } - z = local_2c.ObjectID; - *(int **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15) = &z; - *(int *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - PlayerData->MagicDeltaAct[0x15]; - *(int *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = Crystal; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x806481b - ; - SaveDepot(*(TPlayerData **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15), - *(Object **)(&stack0xfffffcbc + iVar16 + uVar11 * -2 + iVar15)); - while( true ) { - local_2bc[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - local_2bc; - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x806483c; - GetFirstContainerObject - (*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - local_2ac[0] = NONE.ObjectID; - local_29c[0] = NONE.ObjectID; - if (z == NONE.ObjectID) break; - local_2bc[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcb8 + iVar16 + uVar11 * -2 + iVar15) = - local_2bc; - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064879; - GetFirstContainerObject - (*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - *(int **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = - 0x806488a; - DeleteObject(*(Object **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - } - *(int *)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = Crystal; - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x806489a - ; - ReleasePlayerPoolSlot - (*(TPlayerData **) - (aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - goto LAB_0806489a; - } - *(undefined **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &DAT_080f43e0; - } - *(undefined4 *)((int)&local_350 + iVar16 + uVar11 * -2 + iVar15) = 0x8064abd; - error(*(char **)(aiStack_330 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - } -LAB_08063bd9: - house = (THouse *)((int)&house->ID + 1); - local_320 = local_320 + 1; - local_324 = local_324 + 1; - local_328 = local_328 + 0x1e; - } while ((int)house < local_2dc); - } - local_2e8 = Houses; - iVar6 = -(Houses * 4 + 0xfU & 0xfffffff0); - piVar18 = (int *)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c); - Deadline = (time_t)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15); - *(int_0_ **)(&stack0xfffffcc0 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15; - puVar5 = NewOwnerIDs; - *(int **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = &local_2e8; - *(ulong_0_ **)(&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15) = puVar5; - *(TQueryManagerConnection **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - QueryManagerConnection; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x8063c4c; - iVar8 = TQueryManagerConnection::evictFreeAccounts - (*(TQueryManagerConnection **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15), - *(ushort **)(&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15), - *(ulong **)(&stack0xfffffcc0 + iVar6 + iVar16 + uVar11 * -2 + iVar15)); - if (iVar8 == 0) { - iVar8 = 0; - if (0 < local_2e8) { - do { - *(uint *)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - (uint)*(ushort *)(NewOwnerIDs + iVar8 * 2); - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x8064480 - ; - pTVar9 = GetHouse(*(ushort *) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - if (pTVar9 == (THouse *)0x0) { - uVar2 = *(ushort *)(NewOwnerIDs + iVar8 * 2); - *(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "CollectRents: Haus mit Nummer %d existiert nicht.\n"; - *(uint *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - (uint)uVar2; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064535; - error(*(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - } - else { - uVar2 = *(ushort *)(NewOwnerIDs + iVar8 * 2); - *(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "houses"; - *(char **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - "Account von Haus %d ist nicht mehr bezahlt.\n"; - *(uint *)(&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - (uint)uVar2; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80644ac; - Log(*(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15)); - if (*(ulong *)(Deadline + iVar8 * 4) == pTVar9->OwnerID) { - *(undefined4 *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0; - *(THouse **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - pTVar9; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80644ef; - CleanHouse(*(THouse **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(TPlayerData **) - (&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15)); - pTVar9->OwnerName[0] = '\0'; - pTVar9->OwnerID = 0; - pTVar9->Subowners = 0; - pTVar9->Guests = 0; - pTVar9->Help = 1; - } - else { - *(undefined **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - &DAT_080f4260; - *(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "houses"; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80644d1; - Log(*(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15)); - } - } - iVar8 = iVar8 + 1; - } while (iVar8 < local_2e8); - } - local_2e8 = Houses; - *(ulong_0_ **)(&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15) = NewOwnerIDs; - *(int **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = &local_2e8; - *(TQueryManagerConnection **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - QueryManagerConnection; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x8063c8e; - iVar8 = TQueryManagerConnection::evictDeletedCharacters - (*(TQueryManagerConnection **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15), - *(ushort **)(&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15)); - if (iVar8 != 0) { - *(undefined **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &DAT_080f41e0; - goto LAB_08064464; - } - iVar8 = 0; - if (0 < local_2e8) { - do { - *(uint *)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - (uint)*(ushort *)(NewOwnerIDs + iVar8 * 2); - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x80643d1 - ; - pTVar9 = GetHouse(*(ushort *) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - if (pTVar9 == (THouse *)0x0) { - uVar2 = *(ushort *)(NewOwnerIDs + iVar8 * 2); - *(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "CollectRents: Haus mit Nummer %d existiert nicht.\n"; - *(uint *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - (uint)uVar2; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x806445b; - error(*(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - } - else { - uVar2 = *(ushort *)(NewOwnerIDs + iVar8 * 2); - *(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "houses"; - *(undefined **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - &DAT_080f41a0; - *(uint *)(&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - (uint)uVar2; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80643f9; - Log(*(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(undefined4 *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0; - *(THouse **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - pTVar9; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064409; - CleanHouse(*(THouse **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(TPlayerData **) - (&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15)); - pTVar9->OwnerName[0] = '\0'; - pTVar9->OwnerID = 0; - pTVar9->Subowners = 0; - pTVar9->Guests = 0; - pTVar9->Help = 1; - } - iVar8 = iVar8 + 1; - } while (iVar8 < local_2e8); - } - iVar19 = 0; - iVar8 = 0; - if (0 < Houses) { - do { - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x806434e - ; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - if (pTVar9->GuildHouse != false) { - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064376; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - if (pTVar9->OwnerID != 0) { - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064390; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(ushort *)(NewOwnerIDs + iVar19 * 2) = pTVar9->ID; - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80643ad; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(ulong *)(Deadline + iVar19 * 4) = pTVar9->OwnerID; - iVar19 = iVar19 + 1; - } - } - iVar8 = iVar8 + 1; - } while (iVar8 < Houses); - } - if (0 < iVar19) { - *(time_t *)((int)auStack_33c + iVar6 + iVar16 + uVar11 * -2 + iVar15) = Deadline; - puVar5 = NewOwnerIDs; - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar19; - *(int **)(&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15) = &local_2e8; - *(ulong_0_ **)(&stack0xfffffcc0 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = puVar5; - *(TQueryManagerConnection **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = QueryManagerConnection; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x8063ce8; - iVar8 = TQueryManagerConnection::evictExGuildleaders - (*(TQueryManagerConnection **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15), - *(int **)(&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15), - *(ushort **) - (&stack0xfffffcc0 + iVar6 + iVar16 + uVar11 * -2 + iVar15), - *(ulong **)((int)auStack_33c + iVar6 + iVar16 + uVar11 * -2 + iVar15) - ); - if (iVar8 != 0) { - *(undefined **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &DAT_080f4160; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x8064331 - ; - error(*(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - local_2e8 = 0; - } - iVar8 = 0; - if (0 < local_2e8) { - do { - *(uint *)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - (uint)*(ushort *)(NewOwnerIDs + iVar8 * 2); - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064299; - pTVar9 = GetHouse(*(ushort *) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) - ); - if (pTVar9 == (THouse *)0x0) { - uVar2 = *(ushort *)(NewOwnerIDs + iVar8 * 2); - *(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "CollectRents: Haus mit Nummer %d existiert nicht.\n"; - *(uint *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - (uint)uVar2; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064323; - error(*(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c - )); - } - else { - uVar2 = *(ushort *)(NewOwnerIDs + iVar8 * 2); - *(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "houses"; - *(undefined **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - &DAT_080f40e0; - *(uint *)(&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - (uint)uVar2; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80642c1; - Log(*(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(undefined4 *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0; - *(THouse **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - pTVar9; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80642d1; - CleanHouse(*(THouse **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(TPlayerData **) - (&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15)); - pTVar9->OwnerName[0] = '\0'; - pTVar9->OwnerID = 0; - pTVar9->Subowners = 0; - pTVar9->Guests = 0; - pTVar9->Help = 1; - } - iVar8 = iVar8 + 1; - } while (iVar8 < local_2e8); - } - } - iVar8 = 0; - if (0 < Houses) { - do { - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x8064223 - ; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - if (pTVar9->Help == 1) { - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x806424a; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(uint *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - (uint)pTVar9->ID; - *(TQueryManagerConnection **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - QueryManagerConnection; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x806425e; - iVar19 = TQueryManagerConnection::deleteHouseOwner - (*(TQueryManagerConnection **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(ushort *) - (&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15)) - ; - if (iVar19 != 0) { - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064272; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - uVar2 = pTVar9->ID; - *(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "CollectRents: Kann Haus %d nicht aus HouseOwners austragen.\n"; - *(uint *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - (uint)uVar2; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064285; - error(*(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c - )); - } - } - iVar8 = iVar8 + 1; - } while (iVar8 < Houses); - } - *(char **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - "Treibe Mieten ein...\n"; - *(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = "houses"; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x8063d21; - Log(*(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15)); - iVar8 = 0; - if (0 < Houses) { - do { - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x8063d3b - ; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - if (pTVar9->OwnerID != 0) { - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063d72; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - if (pTVar9->PaidUntil <= i_1) { - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063d90; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063da2; - pTVar10 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - uVar2 = pTVar10->ID; - uVar7 = pTVar9->OwnerID; - *(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "houses"; - *(undefined **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - &DAT_080f3f40; - *(ulong *)(&stack0xfffffcc0 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = uVar7 - ; - *(uint *)(&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - (uint)uVar2; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063dc7; - Log(*(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063dd7; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - HouseIDs = (ushort_0_ *)(pTVar9->PaidUntil + 0x93a80); - ppuVar17 = (ushort_0_ **)&PaymentExtension; - if (PaymentExtension <= (int)HouseIDs) { - ppuVar17 = &HouseIDs; - } - PlayerData_1 = (TPlayerData *)*ppuVar17; - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063e14; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(undefined4 *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0; - *(ulong *)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - pTVar9->OwnerID; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063e2a; - local_318 = AssignPlayerPoolSlot - (*(ulong *)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + - -0x1c), - (bool)(&stack0xfffffcb8) - [iVar6 + iVar16 + uVar11 * -2 + iVar15]); - if (local_318 == (TPlayerData *)0x0) { - *(undefined **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &DAT_080f4060; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) - = 0x806420e; - error(*(char **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - } - else { - z = local_2c.ObjectID; - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) - = 0x8063e51; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(int **)(&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15) = &z - ; - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - pTVar9->DepotNr; - *(TPlayerData **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_318; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) - = 0x8063e73; - LoadDepot(*(TPlayerData **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) - ,*(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15), - *(Object **) - (&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15)); - local_2bc[0] = local_2c.ObjectID; - *(ulong **)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - local_2bc; - *(int **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &z; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) - = 0x8063e94; - GetFirstContainerObject - (*(Object **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c - )); - *(int **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &z; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) - = 0x8063ea5; - iVar19 = CountMoney(*(Object **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) - = 0x8063eb7; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - if (iVar19 < (int)pTVar9->Rent) { - if (i_1 < (int)PlayerData_1) { - *(undefined **) - (&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - &DAT_080f4dca; - *(char **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "houses"; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063ee9; - Log(*(char **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - pTVar1 = (TPlayerData *)((int)PlayerData_1 - i_1); - PlayerData_1 = pTVar1; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &House; - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - iVar19 = (int)(pTVar1[-1].Title + 0x18) / 0x15180 + 1; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063f29; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + - -0x1c),*(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 - + iVar15)); - local_31c = pTVar9->Name; - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &House; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063f42; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + - -0x1c),*(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 - + iVar15)); - *(int *)((int)auStack_33c + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + 4) = iVar19; - pcVar12 = ""; - if (iVar19 != 1) { - pcVar12 = "s"; - } - *(char **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -4) = pcVar12; - *(char **)((int)auStack_33c + - iVar6 + iVar16 + uVar11 * -2 + iVar15) = local_31c; - uVar7 = pTVar9->Rent; - *(undefined1 **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_28c; - *(char **)(&stack0xfffffcbc + - iVar6 + iVar16 + uVar11 * -2 + iVar15) = - "Warning!\n\nThe monthly rent of %ld gold\nfor your house \"%s\"\nis payable. Have it available\nwithin %d day%s, or you will\nlose this house." - ; - *(undefined4 *) - (&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 500; - *(ulong *)(&stack0xfffffcc0 + - iVar6 + iVar16 + uVar11 * -2 + iVar15) = uVar7; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063f8c; - snprintf(*(char **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c - ), - *(size_t *) - (&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15), - *(char **)(&stack0xfffffcbc + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(undefined1 **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_28c; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063f94; - uVar7 = AddDynamicString(*(char **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 - + iVar15 + - -0x1c)); - *(undefined4 *) - (&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x1a; - *(ulong **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_29c; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063fac; - GetSpecialObject(*(SPECIALMEANING *) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) - ); - local_4c[0].TypeID = local_2c.ObjectID; - *(ulong **) - (&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - local_29c; - *(undefined4 *) - (&stack0xfffffcc0 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0; - *(ObjectType **) - (&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - local_4c; - *(ulong **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_2ac; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063fdc; - SetObject(*(Object **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(ObjectType **) - (&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15), - *(ulong *)(&stack0xfffffcbc + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(ulong *)(&stack0xfffffcbc + - iVar6 + iVar16 + uVar11 * -2 + iVar15) = uVar7; - *(undefined4 *) - (&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 9; - *(ulong **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_2ac; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8063ff9; - ChangeObject(*(Object **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(INSTANCEATTRIBUTE *) - (&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15), - *(ulong *)(&stack0xfffffcbc + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - local_2ac[0] = local_2c.ObjectID; - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &House; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064012; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + - -0x1c),*(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 - + iVar15)); - *(ulong **) - (&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - local_2ac; - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15) = pTVar9->DepotNr - ; - *(TPlayerData **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_318; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064034; - SaveDepot(*(TPlayerData **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15), - *(Object **) - (&stack0xfffffcbc + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - } - else { - *(char **)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15) = - "Mieter wird hinausgeworfen.\n"; - *(char **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "houses"; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80640cc; - Log(*(char **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &House; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80640dc; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + - -0x1c),*(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 - + iVar15)); - *(undefined4 *) - (&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0; - *(ulong *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15) = - pTVar9->OwnerID; - *(TQueryManagerConnection **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - QueryManagerConnection; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80640fb; - iVar19 = TQueryManagerConnection::excludeFromAuctions - (*(TQueryManagerConnection **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + - -0x1c),*(ulong *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * - -2 + iVar15), - (bool)(&stack0xfffffcbc) - [iVar6 + iVar16 + uVar11 * -2 + iVar15]); - if (iVar19 != 0) { - *(char **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "CollectRents: Kann Mieter nicht verbannen.\n"; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064161; - error(*(char **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + - -0x1c)); - } - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &House; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x806410f; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + - -0x1c),*(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 - + iVar15)); - pTVar1 = local_318; - *(THouse **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - pTVar9; - *(TPlayerData **) - (&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - pTVar1; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064121; - CleanHouse(*(THouse **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(TPlayerData **) - (&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &House; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064131; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + - -0x1c),*(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 - + iVar15)); - pTVar9->OwnerName[0] = '\0'; - pTVar9->OwnerID = 0; - pTVar9->Subowners = 0; - pTVar9->Guests = 0; - } - } - else { - *(undefined **) - (&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - &DAT_080f4dff; - *(char **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = "houses"; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064177; - Log(*(char **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(char **)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &House; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064187; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - local_2ac[0] = local_2c.ObjectID; - uVar7 = pTVar9->Rent; - *(ulong **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_2ac; - *(ulong *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) - = uVar7; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80641a8; - DeleteMoney(*(Object **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - local_2ac[0] = local_2c.ObjectID; - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &House; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80641c1; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - *(ulong **) - (&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - local_2ac; - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - pTVar9->DepotNr; - *(TPlayerData **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_318; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80641e3; - SaveDepot(*(TPlayerData **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15), - *(Object **) - (&stack0xfffffcbc + iVar6 + iVar16 + uVar11 * -2 + iVar15 - )); - *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - iVar8; - *(vector **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - &House; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80641f3; - pTVar9 = vector::operator() - (*(vector **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c), - *(int *)(&stack0xfffffcb8 + - iVar6 + iVar16 + uVar11 * -2 + iVar15)); - pTVar9->PaidUntil = pTVar9->PaidUntil + 0x278d00; - } - while( true ) { - local_2bc[0] = local_2c.ObjectID; - *(ulong **) - (&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - local_2bc; - *(int **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064055; - GetFirstContainerObject - (*(Object **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - local_2ac[0] = NONE.ObjectID; - local_29c[0] = NONE.ObjectID; - if (z == NONE.ObjectID) break; - local_2bc[0] = local_2c.ObjectID; - *(ulong **) - (&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - local_2bc; - *(int **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x8064092; - GetFirstContainerObject - (*(Object **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - *(int **)(aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &z; - *(undefined4 *) - ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = - 0x80640a3; - DeleteObject(*(Object **) - (aiStack_330 + - iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - } - *(TPlayerData **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - local_318; - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) - = 0x80640b3; - ReleasePlayerPoolSlot - (*(TPlayerData **) - (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c - )); - } - } - } - iVar8 = iVar8 + 1; - } while (iVar8 < Houses); - } - } - else { - *(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = - "CollectRents: Kann Zahlungsdaten nicht ermitteln.\n"; -LAB_08064464: - *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x8064469; - error(*(char **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c)); - } - pOVar14 = (ObjectType *)&z; - z = local_2c.ObjectID; -LAB_080638c5: - *piVar18 = (int)pOVar14; - piVar18[-1] = 0x80638cd; - DeleteObject((Object *)*piVar18); - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void StartAuctions(void) - -{ - ushort uVar1; - ulong uVar2; - int iVar3; - int iVar4; - char_0__30_ *OwnerNames; - int iVar5; - THouse *pTVar6; - THouse *pTVar7; - THouse *pTVar8; - int iVar9; - int iVar10; - THouse *house; - int i; - undefined4 *puVar11; - ushort_0_ *HouseIDs; - int_0_ *PaidUntils; - uint uVar12; - int iVar13; - uint uStack_90; - int iStack_78; - ushort auStack_74 [4]; - int local_6c; - ulong_0_ *OwnerIDs; - int local_64; - int NumberOfHouses; - int NumberOfAuctions; - char HelpWorld [60]; - - OwnerIDs = &stack0xffffff74; - uStack_90 = 0x8064b52; - Log("houses","Starte neue Versteigerungen...\n"); - iVar13 = 0; - if (0 < Houses) { - do { - iVar9 = iVar13 + 1; - uStack_90 = 0x8065101; - pTVar6 = vector::operator()(&House,iVar13); - pTVar6->Help = 0; - iVar13 = iVar9; - } while (iVar9 < Houses); - } - NumberOfHouses = Houses; - iVar9 = -(Houses * 2 + 0xfU & 0xfffffff0); - puVar11 = (undefined4 *)(&stack0xffffff74 + iVar9); - iVar13 = (int)auStack_74 + iVar9; - *(int *)(&stack0xffffff7c + iVar9) = iVar13; - *(int **)(&stack0xffffff78 + iVar9) = &NumberOfHouses; - *(TQueryManagerConnection **)(&stack0xffffff74 + iVar9) = QueryManagerConnection; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8064b87; - iVar5 = TQueryManagerConnection::getAuctions - (*(TQueryManagerConnection **)(&stack0xffffff74 + iVar9), - *(int **)(&stack0xffffff78 + iVar9),*(ushort **)(&stack0xffffff7c + iVar9)); - if (iVar5 == 0) { - iVar5 = 0; - if (0 < NumberOfHouses) { - do { - *(uint *)(&stack0xffffff74 + iVar9) = (uint)*(ushort *)(iVar13 + iVar5 * 2); - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x80650ad; - pTVar6 = GetHouse(*(ushort *)(&stack0xffffff74 + iVar9)); - if (pTVar6 == (THouse *)0x0) { - uVar1 = *(ushort *)(iVar13 + iVar5 * 2); - *(char **)(&stack0xffffff74 + iVar9) = - "StartAuctions: Haus mit Nummer %d existiert nicht (1).\n"; - *(uint *)(&stack0xffffff78 + iVar9) = (uint)uVar1; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x80650db; - error(*(char **)(&stack0xffffff74 + iVar9)); - } - else { - pTVar6->Help = 1; - } - iVar5 = iVar5 + 1; - } while (iVar5 < NumberOfHouses); - } - *(char **)(&stack0xffffff78 + iVar9) = WorldName; - iVar5 = 0; - *(int **)(&stack0xffffff74 + iVar9) = &NumberOfAuctions; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8064baf; - AddSlashes(*(char **)(&stack0xffffff74 + iVar9),*(char **)(&stack0xffffff78 + iVar9)); - if (0 < Houses) { - do { - *(int *)(&stack0xffffff78 + iVar9) = iVar5; - *(vector **)(&stack0xffffff74 + iVar9) = &House; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8064fa7; - pTVar6 = vector::operator() - (*(vector **)(&stack0xffffff74 + iVar9), - *(int *)(&stack0xffffff78 + iVar9)); - if (pTVar6->OwnerID == 0) { - *(int *)(&stack0xffffff78 + iVar9) = iVar5; - *(vector **)(&stack0xffffff74 + iVar9) = &House; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8064fd0; - pTVar6 = vector::operator() - (*(vector **)(&stack0xffffff74 + iVar9), - *(int *)(&stack0xffffff78 + iVar9)); - if (pTVar6->Help == 0) { - *(int *)(&stack0xffffff78 + iVar9) = iVar5; - *(vector **)(&stack0xffffff74 + iVar9) = &House; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8064fea; - pTVar6 = vector::operator() - (*(vector **)(&stack0xffffff74 + iVar9), - *(int *)(&stack0xffffff78 + iVar9)); - if (pTVar6->NoAuction == false) { - *(int *)(&stack0xffffff78 + iVar9) = iVar5; - *(vector **)(&stack0xffffff74 + iVar9) = &House; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8065003; - pTVar6 = vector::operator() - (*(vector **)(&stack0xffffff74 + iVar9), - *(int *)(&stack0xffffff78 + iVar9)); - uVar1 = pTVar6->ID; - *(char **)(&stack0xffffff74 + iVar9) = "houses"; - *(char **)(&stack0xffffff78 + iVar9) = - "Trage Haus %d zur Versteigerung ein.\n"; - *(uint *)(&stack0xffffff7c + iVar9) = (uint)uVar1; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x806501e; - Log(*(char **)(&stack0xffffff74 + iVar9), - *(char **)(&stack0xffffff78 + iVar9)); - *(vector **)(&stack0xffffff74 + iVar9) = &House; - *(int *)(&stack0xffffff78 + iVar9) = iVar5; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x806502e; - pTVar6 = vector::operator() - (*(vector **)(&stack0xffffff74 + iVar9), - *(int *)(&stack0xffffff78 + iVar9)); - uVar1 = pTVar6->ID; - *(char **)(&stack0xffffff74 + iVar9) = "houses"; - *(int **)(&stack0xffffff7c + iVar9) = &NumberOfAuctions; - *(char **)(&stack0xffffff78 + iVar9) = - "bei Reset: DELETE FROM Auctions WHERE World=\'%s\' AND HouseID=%d;\n" - ; - *(uint *)(&stack0xffffff80 + iVar9) = (uint)uVar1; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x806504d; - Log(*(char **)(&stack0xffffff74 + iVar9), - *(char **)(&stack0xffffff78 + iVar9)); - *(vector **)(&stack0xffffff74 + iVar9) = &House; - *(int *)(&stack0xffffff78 + iVar9) = iVar5; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x806505d; - pTVar6 = vector::operator() - (*(vector **)(&stack0xffffff74 + iVar9), - *(int *)(&stack0xffffff78 + iVar9)); - *(uint *)(&stack0xffffff78 + iVar9) = (uint)pTVar6->ID; - *(TQueryManagerConnection **)(&stack0xffffff74 + iVar9) = - QueryManagerConnection; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8065071; - iVar10 = TQueryManagerConnection::startAuction - (*(TQueryManagerConnection **) - (&stack0xffffff74 + iVar9), - *(ushort *)(&stack0xffffff78 + iVar9)); - if (iVar10 != 0) { - *(int *)(&stack0xffffff78 + iVar9) = iVar5; - *(vector **)(&stack0xffffff74 + iVar9) = &House; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8065089; - pTVar6 = vector::operator() - (*(vector **)(&stack0xffffff74 + iVar9), - *(int *)(&stack0xffffff78 + iVar9)); - uVar1 = pTVar6->ID; - *(char **)(&stack0xffffff74 + iVar9) = - "StartAuctions: Kann Haus %d nicht zur Versteigerung eintragen.\n" - ; - *(uint *)(&stack0xffffff78 + iVar9) = (uint)uVar1; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x806509c; - error(*(char **)(&stack0xffffff74 + iVar9)); - } - } - } - } - iVar5 = iVar5 + 1; - } while (iVar5 < Houses); - } - iVar5 = 0; - if (0 < Houses) { - do { - *(int *)(&stack0xffffff78 + iVar9) = iVar5; - iVar5 = iVar5 + 1; - *(vector **)(&stack0xffffff74 + iVar9) = &House; - *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8064f83; - pTVar6 = vector::operator() - (*(vector **)(&stack0xffffff74 + iVar9), - *(int *)(&stack0xffffff78 + iVar9)); - pTVar6->Help = 0; - } while (iVar5 < Houses); - } - local_64 = Houses; - uVar12 = (Houses + -1) * 4 + 0x13U & 0xfffffff0; - iVar5 = -uVar12; - iVar4 = iVar5 + iVar9 + -0x8c; - iVar10 = -((Houses + -1) * 0x1e + 0x2dU & 0xfffffff0); - local_6c = (int)auStack_74 + iVar5 + iVar9; - iVar3 = -uVar12; - puVar11 = (undefined4 *)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c); - *(int *)(&stack0xffffff84 + iVar3 + iVar10 + iVar4 + 0x8c) = - (int)auStack_74 + iVar10 + iVar5 + iVar9 + -0x8c + 0x8c; - iVar9 = (int)auStack_74 + iVar3 + iVar10 + iVar4 + 0x8c; - *(int *)(HelpWorld + iVar3 + iVar10 + iVar4 + 0x6c) = iVar9; - iVar5 = local_6c; - *(int **)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = &local_64; - *(int *)(&stack0xffffff7c + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(int *)(&stack0xffffff80 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar5; - *(TQueryManagerConnection **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - QueryManagerConnection; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064c20; - iVar5 = TQueryManagerConnection::getHouseOwners - (*(TQueryManagerConnection **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int **)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c), - *(ushort **)(&stack0xffffff7c + iVar3 + iVar10 + iVar4 + 0x8c), - *(ulong **)(&stack0xffffff80 + iVar3 + iVar10 + iVar4 + 0x8c), - *(char (**) [30])(&stack0xffffff84 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int **)(HelpWorld + iVar3 + iVar10 + iVar4 + 0x6c)); - if (iVar5 == 0) { - iVar5 = 0; - if (0 < local_64) { - do { - *(uint *)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - (uint)*(ushort *)(iVar13 + iVar5 * 2); - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064efc; - pTVar6 = GetHouse(*(ushort *)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c)) - ; - if (pTVar6 == (THouse *)0x0) { - uVar1 = *(ushort *)(iVar13 + iVar5 * 2); - *(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - "StartAuctions: Haus mit Nummer %d existiert nicht (2).\n"; - *(uint *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = (uint)uVar1; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064f5b - ; - error(*(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c)); - } - else { - pTVar6->Help = 1; - if (pTVar6->OwnerID != *(ulong *)(local_6c + iVar5 * 4)) { - pTVar6->Help = 2; - } - if (pTVar6->PaidUntil != *(int *)(iVar9 + iVar5 * 4)) { - pTVar6->Help = 2; - } - } - iVar5 = iVar5 + 1; - } while (iVar5 < local_64); - } - *(char **)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = - "Aktualisiere Liste der Mieter...\n"; - iVar13 = 0; - *(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = "houses"; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064c49; - Log(*(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(char **)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - if (Houses < 1) { - return; - } - do { - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064c70; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - if (pTVar6->OwnerID == 0) { - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064e60; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - if (pTVar6->Help != 0) { - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - &House; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064e7e - ; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + - iVar3 + iVar10 + iVar4 + 0x8c)); - uVar1 = pTVar6->ID; - *(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = "houses"; - *(char **)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = - "Trage nicht mehr vermietetes Haus %d aus.\n"; - *(uint *)(&stack0xffffff7c + iVar3 + iVar10 + iVar4 + 0x8c) = (uint)uVar1; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064e99 - ; - Log(*(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(char **)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - &House; - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064ea9 - ; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + - iVar3 + iVar10 + iVar4 + 0x8c)); - *(uint *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = - (uint)pTVar6->ID; - *(TQueryManagerConnection **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = QueryManagerConnection - ; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064ebd - ; - iVar9 = TQueryManagerConnection::deleteHouseOwner - (*(TQueryManagerConnection **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(ushort *) - (&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - if (iVar9 != 0) { - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - &House; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = - 0x8064ed5; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + - iVar3 + iVar10 + iVar4 + 0x8c)); - uVar1 = pTVar6->ID; - *(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - "StartAuctions: Kann nicht mehr vermietetes Haus %d nicht austragen.\n" - ; - *(uint *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = - (uint)uVar1; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = - 0x8064ee8; - error(*(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c)); - } - } - } - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064c8e; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - if (pTVar6->OwnerID != 0) { - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064d87; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - if (pTVar6->Help == 0) { - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - &House; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064da5 - ; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + - iVar3 + iVar10 + iVar4 + 0x8c)); - uVar1 = pTVar6->ID; - *(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = "houses"; - *(char **)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = - "Trage vermietetes Haus %d ein.\n"; - *(uint *)(&stack0xffffff7c + iVar3 + iVar10 + iVar4 + 0x8c) = (uint)uVar1; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064dc0 - ; - Log(*(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(char **)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - &House; - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064dd0 - ; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + - iVar3 + iVar10 + iVar4 + 0x8c)); - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - &House; - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064de2 - ; - pTVar7 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + - iVar3 + iVar10 + iVar4 + 0x8c)); - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - &House; - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064df4 - ; - pTVar8 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + - iVar3 + iVar10 + iVar4 + 0x8c)); - uVar1 = pTVar8->ID; - *(int *)(&stack0xffffff80 + iVar3 + iVar10 + iVar4 + 0x8c) = - pTVar6->PaidUntil; - uVar2 = pTVar7->OwnerID; - *(uint *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = (uint)uVar1; - *(ulong *)(&stack0xffffff7c + iVar3 + iVar10 + iVar4 + 0x8c) = uVar2; - *(TQueryManagerConnection **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = QueryManagerConnection - ; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064e1c - ; - iVar9 = TQueryManagerConnection::insertHouseOwner - (*(TQueryManagerConnection **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(ushort *) - (&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c), - *(ulong *)(&stack0xffffff7c + - iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff80 + iVar3 + iVar10 + iVar4 + 0x8c - )); - if (iVar9 != 0) { - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - &House; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = - 0x8064e34; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + - iVar3 + iVar10 + iVar4 + 0x8c)); - uVar1 = pTVar6->ID; - *(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - "StartAuctions: Kann vermietetes Haus %d nicht eintragen.\n"; - *(uint *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = - (uint)uVar1; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = - 0x8064e47; - error(*(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c)); - } - } - } - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064cac; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - if (pTVar6->Help == 2) { - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064cd0; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - uVar1 = pTVar6->ID; - *(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = "houses"; - *(char **)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = - "Aktualisiere vermietetes Haus %d.\n"; - *(uint *)(&stack0xffffff7c + iVar3 + iVar10 + iVar4 + 0x8c) = (uint)uVar1; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064ceb; - Log(*(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(char **)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House; - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064cfb; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House; - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064d0d; - pTVar7 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House; - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064d1f; - pTVar8 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c)); - uVar1 = pTVar8->ID; - *(int *)(&stack0xffffff80 + iVar3 + iVar10 + iVar4 + 0x8c) = pTVar6->PaidUntil; - uVar2 = pTVar7->OwnerID; - *(uint *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = (uint)uVar1; - *(ulong *)(&stack0xffffff7c + iVar3 + iVar10 + iVar4 + 0x8c) = uVar2; - *(TQueryManagerConnection **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) - = QueryManagerConnection; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064d47; - iVar9 = TQueryManagerConnection::updateHouseOwner - (*(TQueryManagerConnection **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(ushort *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) - ,*(ulong *)(&stack0xffffff7c + iVar3 + iVar10 + iVar4 + 0x8c) - ,*(int *)(&stack0xffffff80 + iVar3 + iVar10 + iVar4 + 0x8c)); - if (iVar9 != 0) { - *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13; - *(vector **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - &House; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064d5f - ; - pTVar6 = vector::operator() - (*(vector **) - (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c), - *(int *)(&stack0xffffff78 + - iVar3 + iVar10 + iVar4 + 0x8c)); - uVar1 = pTVar6->ID; - *(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = - "StartAuctions: Kann Daten des vermieteten Hauses %d nicht aktualisieren.\n" - ; - *(uint *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = (uint)uVar1; - *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064d72 - ; - error(*(char **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c)); - } - } - iVar13 = iVar13 + 1; - } while (iVar13 < Houses); - return; - } - *(undefined **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &DAT_080f46a0; - } - else { - *(char **)(&stack0xffffff74 + iVar9) = - "StartAuctions: Kann laufende Versteigerungen nicht ermitteln.\n"; - } - puVar11[-1] = 0x8064f69; - error((char *)*puVar11); - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void PrepareHouseCleanup(void) - -{ - HelpDepots = 0; - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void FinishHouseCleanup(void) - -{ - THelpDepot *pTVar1; - TPlayerData *PlayerData_00; - TPlayerData *PlayerData; - int i; - int i_00; - int iVar2; - Object local_2c [7]; - - if (0 < HelpDepots) { - i_00 = 1; - do { - pTVar1 = vector::operator()(&HelpDepot,i_00); - PlayerData_00 = AssignPlayerPoolSlot(pTVar1->CharacterID,false); - if (PlayerData_00 == (TPlayerData *)0x0) { - error(&DAT_080f4860); - return; - } - pTVar1 = vector::operator()(&HelpDepot,i_00); - local_2c[0].ObjectID = (pTVar1->Box).ObjectID; - pTVar1 = vector::operator()(&HelpDepot,i_00); - SaveDepot(PlayerData_00,pTVar1->DepotNr,local_2c); - iVar2 = i_00 + 1; - pTVar1 = vector::operator()(&HelpDepot,i_00); - local_2c[0].ObjectID = (pTVar1->Box).ObjectID; - DeleteObject(local_2c); - ReleasePlayerPoolSlot(PlayerData_00); - i_00 = iVar2; - } while (iVar2 <= HelpDepots); - } - HelpDepots = 0; - return; -} - - - -void CleanHouseField(int x,int y,int z) - -{ - bool bVar1; - ushort ID; - THouse *pTVar2; - THelpDepot *pTVar3; - TPlayerData *PlayerData_00; - ushort HouseID; - int i; - int DepotLoaded; - int iVar4; - THouse *house; - TPlayerData *PlayerData; - int sx; - int sy; - int sz; - undefined1 local_4c [16]; - Object local_3c [4]; - ulong local_2c; - - ID = GetHouseID(x,y,z); - if (ID == 0) { - bVar1 = CoordinateFlag(); - if (bVar1) { - iVar4 = y + 1; - ID = GetHouseID(x,iVar4,z); - if ((ID != 0) || (ID = GetHouseID(x + -1,iVar4,z), ID != 0)) goto LAB_0806526c; - ID = GetHouseID(x + 1,iVar4,z); - } - if (ID == 0) { - bVar1 = CoordinateFlag(); - if (bVar1) { - iVar4 = x + 1; - ID = GetHouseID(iVar4,y,z); - if ((ID != 0) || (ID = GetHouseID(iVar4,y + -1,z), ID != 0)) goto LAB_0806526c; - ID = GetHouseID(iVar4,y + 1,z); - } - if (ID == 0) { - error("CleanHouseField: Kein Haus zu Feld [%d,%d,%d] gefunden.\n",x,y,z); - return; - } - } - } -LAB_0806526c: - pTVar2 = GetHouse(ID); - if ((pTVar2 != (THouse *)0x0) && (pTVar2->OwnerID != 0)) { - i = 1; - iVar4 = -1; - if (0 < HelpDepots) { - do { - pTVar3 = vector::operator()(&HelpDepot,i); - if ((pTVar3->CharacterID == pTVar2->OwnerID) && - (pTVar3 = vector::operator()(&HelpDepot,i), - pTVar3->DepotNr == pTVar2->DepotNr)) { - iVar4 = i; - } - i = i + 1; - } while (i <= HelpDepots); - } - if (iVar4 == -1) { - PlayerData_00 = AssignPlayerPoolSlot(pTVar2->OwnerID,false); - if (PlayerData_00 == (TPlayerData *)0x0) { - error(&DAT_080f48c0); - return; - } - HelpDepots = HelpDepots + 1; - pTVar3 = vector::operator()(&HelpDepot,HelpDepots); - pTVar3->CharacterID = pTVar2->OwnerID; - pTVar3 = vector::operator()(&HelpDepot,HelpDepots); - pTVar3->DepotNr = pTVar2->DepotNr; - GetStartPosition((int *)&PlayerData,&sx,&sy,true); - pTVar3 = vector::operator()(&HelpDepot,HelpDepots); - GetSpecialObject((SPECIALMEANING)local_4c); - GetMapContainer((int)&sz,(int)PlayerData,sx); - SetObject(local_3c,(ObjectType *)&sz,(ulong)local_4c); - (pTVar3->Box).ObjectID = local_3c[0].ObjectID; - local_2c = local_3c[0].ObjectID; - pTVar3 = vector::operator()(&HelpDepot,HelpDepots); - sz = (pTVar3->Box).ObjectID; - LoadDepot(PlayerData_00,pTVar2->DepotNr,(Object *)&sz); - iVar4 = HelpDepots; - ReleasePlayerPoolSlot(PlayerData_00); - } - pTVar3 = vector::operator()(&HelpDepot,iVar4); - sz = (pTVar3->Box).ObjectID; - CleanField(); - } - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void LoadHouseAreas(void) - -{ - bool bVar1; - THouseArea *pTVar2; - int iVar3; - char *__s; - char *__oflag; - undefined1 local_4ffc [4]; - TReadScriptFile Script; - char local_101c [4]; - char FileName [4096]; - - // try { // try from 080655d1 to 0806562e has its CatchHandler @ 08065780 - Log("houses",&DAT_080f4940); - __oflag = DATAPATH; - __s = local_101c; - sprintf(__s,"%s/houseareas.dat"); - bVar1 = FileExists(__s); - if (bVar1) { - TReadScriptFile::TReadScriptFile((TReadScriptFile *)local_4ffc); - // try { // try from 08065636 to 08065747 has its CatchHandler @ 08065755 - TReadScriptFile::open((TReadScriptFile *)local_4ffc,__s,(int)__oflag); - while( true ) { - TReadScriptFile::nextToken((TReadScriptFile *)local_4ffc); - if (local_4ffc == (undefined1 [4])0x0) break; - if (local_4ffc != (undefined1 [4])0x1) { - TReadScriptFile::error((TReadScriptFile *)local_4ffc,"Identifier expected"); - } - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,'='); - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,'('); - pTVar2 = vector::operator()(&HouseArea,HouseAreas); - iVar3 = TReadScriptFile::readNumber((TReadScriptFile *)local_4ffc); - pTVar2->ID = (ushort)iVar3; - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,','); - TReadScriptFile::readString((TReadScriptFile *)local_4ffc); - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,','); - pTVar2 = vector::operator()(&HouseArea,HouseAreas); - iVar3 = TReadScriptFile::readNumber((TReadScriptFile *)local_4ffc); - pTVar2->SQMPrice = iVar3; - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,','); - pTVar2 = vector::operator()(&HouseArea,HouseAreas); - iVar3 = TReadScriptFile::readNumber((TReadScriptFile *)local_4ffc); - pTVar2->DepotNr = iVar3; - __s = (char *)0x29; - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,')'); - HouseAreas = HouseAreas + 1; - } - TReadScriptFile::close((TReadScriptFile *)local_4ffc,(int)__s); - // try { // try from 0806574b to 0806574f has its CatchHandler @ 08065780 - TReadScriptFile::~TReadScriptFile((TReadScriptFile *)local_4ffc,(int)__s); - } - else { - Log("houses",&DAT_080f4980); - } - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void LoadHouses(void) - -{ - int iVar1; - bool bVar2; - char cVar3; - THouse *pTVar4; - int iVar5; - THouse *pTVar6; - char *pcVar7; - THouseArea *pTVar8; - undefined4 *puVar9; - int *piVar10; - int i; - int iVar11; - uint uVar12; - int_0_ *piVar13; - int i_1; - int iVar14; - undefined1 uVar15; - undefined4 uStack_5080; - char *pcVar16; - int local_506c [8]; - int_0_ local_504c [4]; - int_0_ *local_5048; - bool_0_ *Guildhouses; - int_0_ *Sizes; - int_0_ *Rents; - char_0__30_ *Towns; - char___0_ *Descriptions; - char___0_ *Names; - int_0_ *PositionsZ; - int_0_ *PositionsY; - int_0_ *PositionsX; - ushort_0_ *HouseIDs; - TQueryManagerConnection *local_501c; - THouseArea *local_5018; - int local_5014; - int RentOffset; - int local_500c; - int local_5008; - int x; - int y; - int z; - TReadScriptFile Script; - char local_101c [4]; - char FileName [4096]; - - HouseIDs = &stack0xffffaf84; - // try { // try from 080657b7 to 0806582d has its CatchHandler @ 080663c1 - uStack_5080 = 0x80657bc; - Log("houses",&DAT_080f4e5f); - pcVar7 = local_101c; - MaxHouseX = 0; - Houses = 0; - MaxHouseY = 0; - pcVar16 = DATAPATH; - uStack_5080 = 0x80657f2; - sprintf(pcVar7,"%s/houses.dat"); - uStack_5080 = 0x80657fa; - bVar2 = FileExists(pcVar7); - if (bVar2) { - uStack_5080 = 0x806582e; - TReadScriptFile::TReadScriptFile((TReadScriptFile *)&z); - // try { // try from 0806583b to 08066090 has its CatchHandler @ 080663bb - uStack_5080 = 0x8065840; - TReadScriptFile::open((TReadScriptFile *)&z,pcVar7,(int)pcVar16); - while( true ) { - uStack_5080 = 0x806584e; - TReadScriptFile::nextToken((TReadScriptFile *)&z); - if (z == 0) break; - if (z != 1) { - uStack_5080 = 0x8065875; - TReadScriptFile::error((TReadScriptFile *)&z,"Identifier expected"); - } - uStack_5080 = 0x806588b; - TReadScriptFile::readSymbol((TReadScriptFile *)&z,'='); - uStack_5080 = 0x80658a0; - pTVar4 = vector::operator()(&House,Houses); - uStack_5080 = 0x80658b0; - iVar5 = TReadScriptFile::readNumber((TReadScriptFile *)&z); - pTVar4->ID = (ushort)iVar5; - uStack_5080 = 0x80658c8; - pTVar4 = vector::operator()(&House,Houses); - if (pTVar4->ID == 0) { - uStack_5080 = 0x8066056; - pTVar4 = vector::operator()(&House,Houses); - uVar12 = (uint)pTVar4->ID; - uStack_5080 = 0x8066069; - error(&DAT_080f4eb7); -LAB_08065fc4: - uStack_5080 = 0x8065fc9; - TReadScriptFile::close((TReadScriptFile *)&z,uVar12); - uStack_5080 = 0x8065fd5; - puVar9 = (undefined4 *)__cxa_allocate_exception(); - *puVar9 = "Cannot load houses"; - // WARNING: Subroutine does not return - uStack_5080 = 0x8065ff3; - __cxa_throw(); - } - if (0 < Houses) { - uStack_5080 = 0x80658eb; - pTVar4 = vector::operator()(&House,Houses); - uStack_5080 = 0x8065903; - pTVar6 = vector::operator()(&House,Houses + -1); - if (pTVar4->ID <= pTVar6->ID) { - uStack_5080 = 0x8066023; - pTVar4 = vector::operator()(&House,Houses); - uVar12 = (uint)pTVar4->ID; - uStack_5080 = 0x8066036; - error("LoadHouses: IDs nicht aufsteigend sortiert (ID=%d).\n"); - goto LAB_08065fc4; - } - } - uStack_5080 = 0x806591d; - TReadScriptFile::readIdentifier((TReadScriptFile *)&z); - uStack_5080 = 0x8065933; - TReadScriptFile::readSymbol((TReadScriptFile *)&z,'='); - uStack_5080 = 0x8065941; - pcVar7 = TReadScriptFile::readString((TReadScriptFile *)&z); - uStack_5080 = 0x8065958; - pTVar4 = vector::operator()(&House,Houses); - uStack_5080 = 0x806596d; - strcpy(pTVar4->Name,pcVar7); - uStack_5080 = 0x8065975; - TReadScriptFile::readIdentifier((TReadScriptFile *)&z); - uStack_5080 = 0x8065985; - TReadScriptFile::readSymbol((TReadScriptFile *)&z,'='); - uStack_5080 = 0x806598d; - pcVar7 = TReadScriptFile::readString((TReadScriptFile *)&z); - uStack_5080 = 0x80659a4; - pTVar4 = vector::operator()(&House,Houses); - uStack_5080 = 0x80659b3; - strcpy(pTVar4->Description,pcVar7); - uStack_5080 = 0x80659bb; - TReadScriptFile::readIdentifier((TReadScriptFile *)&z); - uStack_5080 = 0x80659cb; - TReadScriptFile::readSymbol((TReadScriptFile *)&z,'='); - uStack_5080 = 0x80659d3; - local_5014 = TReadScriptFile::readNumber((TReadScriptFile *)&z); - uStack_5080 = 0x80659e1; - TReadScriptFile::readIdentifier((TReadScriptFile *)&z); - uStack_5080 = 0x80659f1; - TReadScriptFile::readSymbol((TReadScriptFile *)&z,'='); - uStack_5080 = 0x80659f9; - iVar5 = TReadScriptFile::readNumber((TReadScriptFile *)&z); - iVar11 = 0; - if (0 < HouseAreas) { - do { - uStack_5080 = 0x8065a16; - pTVar8 = vector::operator()(&HouseArea,iVar11); - if (pTVar8->ID == (ushort)iVar5) { - uStack_5080 = 0x8066003; - local_5018 = vector::operator()(&HouseArea,iVar11); - goto LAB_08065a40; - } - iVar11 = iVar11 + 1; - } while (iVar11 < HouseAreas); - } - uStack_5080 = 0x8065a38; - error("GetHouseArea: Gebiet mit ID %d nicht gefunden.\n"); - local_5018 = (THouseArea *)0x0; -LAB_08065a40: - uVar15 = local_5018 == (THouseArea *)0x0; - if ((bool)uVar15) { - uStack_5080 = 0x8065fa8; - pTVar4 = vector::operator()(&House,Houses); - uVar12 = (uint)pTVar4->ID; - uStack_5080 = 0x8065fbb; - error(&DAT_080f4a00); - goto LAB_08065fc4; - } - uStack_5080 = 0x8065a63; - pTVar4 = vector::operator()(&House,Houses); - pTVar4->DepotNr = local_5018->DepotNr; - uStack_5080 = 0x8065a80; - TReadScriptFile::readIdentifier((TReadScriptFile *)&z); - uStack_5080 = 0x8065a90; - TReadScriptFile::readSymbol((TReadScriptFile *)&z,'='); - uStack_5080 = 0x8065aa5; - pTVar4 = vector::operator()(&House,Houses); - uStack_5080 = 0x8065aaf; - pcVar7 = TReadScriptFile::readIdentifier((TReadScriptFile *)&z); - iVar5 = 5; - pcVar16 = "true"; - do { - if (iVar5 == 0) break; - iVar5 = iVar5 + -1; - uVar15 = *pcVar7 == *pcVar16; - pcVar7 = pcVar7 + 1; - pcVar16 = pcVar16 + 1; - } while ((bool)uVar15); - pTVar4->GuildHouse = (bool)uVar15; - uStack_5080 = 0x8065adc; - pTVar4 = vector::operator()(&House,Houses); - pTVar4->NoAuction = false; - uStack_5080 = 0x8065af1; - TReadScriptFile::readIdentifier((TReadScriptFile *)&z); - uStack_5080 = 0x8065b07; - TReadScriptFile::readSymbol((TReadScriptFile *)&z,'='); - uStack_5080 = 0x8065b1c; - vector::operator()(&House,Houses); - uStack_5080 = 0x8065b37; - vector::operator()(&House,Houses); - uStack_5080 = 0x8065b52; - vector::operator()(&House,Houses); - uStack_5080 = 0x8065b71; - TReadScriptFile::readCoordinate((TReadScriptFile *)&z); - uStack_5080 = 0x8065b86; - pTVar4 = vector::operator()(&House,Houses); - if (pTVar4->ExitX == 0) { - uStack_5080 = 0x8065f7b; - vector::operator()(&House,Houses); - uStack_5080 = 0x8065f8e; - error(&DAT_080f49c0); - } - uStack_5080 = 0x8065ba2; - TReadScriptFile::readIdentifier((TReadScriptFile *)&z); - uStack_5080 = 0x8065bb2; - TReadScriptFile::readSymbol((TReadScriptFile *)&z,'='); - uStack_5080 = 0x8065bc7; - vector::operator()(&House,Houses); - uStack_5080 = 0x8065be2; - vector::operator()(&House,Houses); - uStack_5080 = 0x8065bfd; - vector::operator()(&House,Houses); - uStack_5080 = 0x8065c16; - TReadScriptFile::readCoordinate((TReadScriptFile *)&z); - uStack_5080 = 0x8065c2b; - pTVar4 = vector::operator()(&House,Houses); - if (pTVar4->CenterX == 0) { - uStack_5080 = 0x8065f4e; - vector::operator()(&House,Houses); - uStack_5080 = 0x8065f61; - error(&DAT_080f49c0); - } - uStack_5080 = 0x8065c47; - TReadScriptFile::readIdentifier((TReadScriptFile *)&z); - uStack_5080 = 0x8065c5d; - TReadScriptFile::readSymbol((TReadScriptFile *)&z,'='); - uStack_5080 = 0x8065c6d; - TReadScriptFile::readSymbol((TReadScriptFile *)&z,'{'); - uStack_5080 = 0x8065c82; - pTVar4 = vector::operator()(&House,Houses); - pTVar4->Size = 0; - while( true ) { - uStack_5080 = 0x8065c98; - TReadScriptFile::nextToken((TReadScriptFile *)&z); - if (z != 6) goto LAB_08065cd2; - uStack_5080 = 0x8065caf; - cVar3 = TReadScriptFile::getSpecial((TReadScriptFile *)&z); - if (cVar3 == '}') break; - if (z != 6) goto LAB_08065cd2; - uStack_5080 = 0x8065cce; - cVar3 = TReadScriptFile::getSpecial((TReadScriptFile *)&z); - if (cVar3 != ',') { -LAB_08065cd2: - uStack_5080 = 0x8065cfe; - TReadScriptFile::getCoordinate((TReadScriptFile *)&z); - uStack_5080 = 0x8065d13; - pTVar4 = vector::operator()(&House,Houses); - uStack_5080 = 0x8065d3c; - SetHouseID(local_5008,x,y,pTVar4->ID); - uStack_5080 = 0x8065d51; - pTVar4 = vector::operator()(&House,Houses); - pTVar4->Size = pTVar4->Size + 1; - uStack_5080 = 0x8065d6c; - pTVar4 = vector::operator()(&House,Houses); - uVar12 = local_5008 - pTVar4->CenterX; - if (0x7fffffff < uVar12) { - uVar12 = -uVar12; - } - if (MaxHouseX < (int)uVar12) { - uStack_5080 = 0x8065e12; - pTVar4 = vector::operator()(&House,Houses); - MaxHouseX = local_5008 - pTVar4->CenterX; - if (0x7fffffff < (uint)MaxHouseX) { - MaxHouseX = -MaxHouseX; - } - } - uStack_5080 = 0x8065da1; - pTVar4 = vector::operator()(&House,Houses); - uVar12 = x - pTVar4->CenterY; - if (0x7fffffff < uVar12) { - uVar12 = -uVar12; - } - if (MaxHouseY < (int)uVar12) { - uStack_5080 = 0x8065dda; - pTVar4 = vector::operator()(&House,Houses); - MaxHouseY = x - pTVar4->CenterY; - if (0x7fffffff < (uint)MaxHouseY) { - MaxHouseY = -MaxHouseY; - } - } - } - } - uStack_5080 = 0x8065e4a; - pTVar4 = vector::operator()(&House,Houses); - uStack_5080 = 0x8065e61; - pTVar6 = vector::operator()(&House,Houses); - iVar5 = Houses; - pTVar4->Rent = local_5018->SQMPrice * pTVar6->Size + local_5014; - uStack_5080 = 0x8065e96; - pTVar4 = vector::operator()(&House,iVar5); - pTVar4->OwnerID = 0; - uStack_5080 = 0x8065eb3; - pTVar4 = vector::operator()(&House,Houses); - pTVar4->OwnerName[0] = '\0'; - uStack_5080 = 0x8065ecf; - pTVar4 = vector::operator()(&House,Houses); - pTVar4->LastTransition = 0; - uStack_5080 = 0x8065eec; - pTVar4 = vector::operator()(&House,Houses); - pTVar4->PaidUntil = 0; - uStack_5080 = 0x8065f09; - pTVar4 = vector::operator()(&House,Houses); - pTVar4->Subowners = 0; - uStack_5080 = 0x8065f26; - pcVar7 = (char *)Houses; - pTVar4 = vector::operator()(&House,Houses); - pTVar4->Guests = 0; - Houses = Houses + 1; - } - uStack_5080 = 0x8066085; - TReadScriptFile::close((TReadScriptFile *)&z,(int)pcVar7); - uStack_5080 = 0x8066091; - local_501c = (TQueryManagerConnection *)operator_new(0x30); - local_500c = 0x4000; - RentOffset = Houses * 600; - piVar10 = &RentOffset; - if (Houses * 600 < 0x4001) { - piVar10 = &local_500c; - } - // try { // try from 080660d6 to 080660da has its CatchHandler @ 08066388 - uStack_5080 = 0x80660db; - TQueryManagerConnection::TQueryManagerConnection(local_501c,*piVar10); - QueryManagerConnection = local_501c; - iVar5 = Houses + -1; - iVar11 = -(Houses + 0x10 + iVar5 & 0xfffffff0U); - PositionsX = local_504c + iVar11; - uVar12 = iVar5 * 4 + 0x13U & 0xfffffff0; - PositionsY = local_504c + (iVar11 - uVar12); - PositionsZ = local_504c + uVar12 * -2 + iVar11; - Names = local_504c + uVar12 * -3 + iVar11; - Descriptions = local_504c + uVar12 * -4 + iVar11; - iVar5 = -(iVar5 * 0x1e + 0x2dU & 0xfffffff0); - Towns = local_504c + uVar12 * -5 + iVar11; - piVar13 = local_504c + iVar5 + uVar12 * -5 + iVar11; - Rents = piVar13; - Sizes = local_504c + iVar5 + uVar12 * -6 + iVar11; - iVar1 = -(Houses + 0xfU & 0xfffffff0); - local_5048 = local_504c + iVar1 + iVar5 + uVar12 * -7 + iVar11; - iVar14 = 0; - Guildhouses = local_504c + iVar5 + uVar12 * -7 + iVar11; - if (0 < Houses) { - do { - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc) = iVar14; - *(vector **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) - = &House; - // try { // try from 080661a4 to 0806635c has its CatchHandler @ 080663bb - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = - 0x80661a9; - pTVar4 = vector::operator() - (*(vector **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10 - ),*(int *)((int)local_506c + - iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc)); - *(ushort *)(PositionsX + iVar14 * 2) = pTVar4->ID; - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc) = iVar14; - *(vector **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) - = &House; - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = - 0x80661c6; - pTVar4 = vector::operator() - (*(vector **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10 - ),*(int *)((int)local_506c + - iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc)); - *(char **)(Descriptions + iVar14 * 4) = pTVar4->Name; - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc) = iVar14; - *(vector **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) - = &House; - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = - 0x80661e2; - pTVar4 = vector::operator() - (*(vector **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10 - ),*(int *)((int)local_506c + - iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc)); - *(ulong *)(Sizes + iVar14 * 4) = pTVar4->Rent; - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc) = iVar14; - *(vector **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) - = &House; - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = - 0x8066201; - pTVar4 = vector::operator() - (*(vector **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10 - ),*(int *)((int)local_506c + - iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc)); - *(char **)(Towns + iVar14 * 4) = pTVar4->Description; - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc) = iVar14; - *(vector **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) - = &House; - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = - 0x806621d; - pTVar4 = vector::operator() - (*(vector **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10 - ),*(int *)((int)local_506c + - iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc)); - *(int *)(Guildhouses + iVar14 * 4) = pTVar4->Size; - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc) = iVar14; - *(vector **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) - = &House; - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = - 0x806623c; - pTVar4 = vector::operator() - (*(vector **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10 - ),*(int *)((int)local_506c + - iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc)); - *(int *)(PositionsY + iVar14 * 4) = pTVar4->CenterX; - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc) = iVar14; - *(vector **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) - = &House; - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = - 0x806625b; - pTVar4 = vector::operator() - (*(vector **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10 - ),*(int *)((int)local_506c + - iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc)); - *(int *)(PositionsZ + iVar14 * 4) = pTVar4->CenterY; - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc) = iVar14; - *(vector **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) - = &House; - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = - 0x806627a; - pTVar4 = vector::operator() - (*(vector **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10 - ),*(int *)((int)local_506c + - iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc)); - *(int *)(Names + iVar14 * 4) = pTVar4->CenterZ; - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc) = iVar14; - *(vector **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) - = &House; - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = - 0x8066299; - pTVar4 = vector::operator() - (*(vector **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10 - ),*(int *)((int)local_506c + - iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc)); - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) = - pTVar4->DepotNr; - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = - 0x80662a7; - pcVar7 = GetDepotName(*(int *)((int)local_506c + - iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10)); - *(char **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc) = pcVar7; - *(int_0_ **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) = - piVar13; - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = - 0x80662b3; - strcpy(*(char **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10), - *(char **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc)); - *(vector **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) - = &House; - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc) = iVar14; - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = - 0x80662c3; - pTVar4 = vector::operator() - (*(vector **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10 - ),*(int *)((int)local_506c + - iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc)); - piVar13 = piVar13 + 0x1e; - local_5048[iVar14] = pTVar4->GuildHouse; - iVar14 = iVar14 + 1; - } while (iVar14 < Houses); - } - *(int_0_ **)(local_504c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -4) = local_5048; - *(int_0_ **)(local_504c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -8) = Rents; - *(char___0_ **)(local_504c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc) = Names; - *(int_0_ **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + 0x10) = PositionsZ; - *(int_0_ **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + 0xc) = PositionsY; - *(bool_0_ **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + 8) = Guildhouses; - *(char_0__30_ **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + 4) = Towns; - *(int_0_ **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11) = Sizes; - *(char___0_ **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -4) = Descriptions; - *(int_0_ **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -8) = PositionsX; - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc) = Houses; - *(TQueryManagerConnection **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) = QueryManagerConnection; - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = 0x806635d; - iVar14 = TQueryManagerConnection::insertHouses - (*(TQueryManagerConnection **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10), - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc), - *(ushort **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -8), - *(char ***)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -4) - ,*(int **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11), - *(char ***)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + 4), - *(int **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + 8), - *(int **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + 0xc), - *(int **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + 0x10) - ,*(int **)(local_504c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc), - *(char (**) [30]) - (local_504c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -8), - *(bool **)(local_504c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -4)); - if (iVar14 != 0) { - *(undefined **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) = - &DAT_080f4a80; - // try { // try from 08066381 to 08066385 has its CatchHandler @ 080663bb - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = 0x8066386; - error(*(char **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10)); - } - *(int **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10) = &z; - // try { // try from 0806636a to 0806636e has its CatchHandler @ 080663c1 - *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) = 0x806636f; - TReadScriptFile::~TReadScriptFile - (*(TReadScriptFile **) - ((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10), - *(int *)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0xc)); - } - else { - uStack_5080 = 0x8065812; - Log("houses",&DAT_080f4e82); - } - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void LoadOwners(void) - -{ - ushort uVar1; - char_0__30_ *pcVar2; - bool bVar3; - char cVar4; - bool bVar5; - int_0_ *PaidUntils; - THouse *pTVar6; - ulong uVar7; - THouseGuest *pTVar8; - undefined4 *puVar9; - int iVar10; - int iVar11; - int iVar12; - int iVar13; - int iVar14; - ulong_0_ *OwnerIDs; - uint uVar15; - int iVar16; - undefined4 *puVar17; - THouse *house; - int iVar18; - char *pcVar19; - undefined1 uVar20; - undefined4 uStack_5080; - char *pcVar21; - char *pcVar22; - int aiStack_5070 [3]; - undefined1 auStack_5064 [16]; - int local_5054; - int z; - int y; - int x; - THouse *house_2; - int i_1; - char_0__30_ *OwnerNames; - ushort_0_ *HouseIDs; - char local_5032; - char local_5031; - bool ClearBeds; - int iStack_5030; - bool ClearGuests; - int NumberOfHouses; - ulong local_501c [4]; - ulong local_500c; - Object Bed; - undefined1 local_4ffc [4]; - TReadScriptFile Script; - char local_101c [4]; - char FileName [4096]; - - HouseIDs = &stack0xffffaf84; - puVar17 = (undefined4 *)&stack0xffffaf84; - // try { // try from 080663f7 to 0806646d has its CatchHandler @ 08066c00 - uStack_5080 = 0x80663fc; - Log("houses","Lade Mieterdaten...\n"); - local_5031 = '\0'; - pcVar21 = local_101c; - PaymentExtension = 0; - local_5032 = '\0'; - pcVar22 = DATAPATH; - uStack_5080 = 0x806642f; - sprintf(pcVar21,"%s/owners.dat"); - uStack_5080 = 0x8066437; - bVar3 = FileExists(pcVar21); - if (bVar3) { - uStack_5080 = 0x806646e; - TReadScriptFile::TReadScriptFile((TReadScriptFile *)local_4ffc); - // try { // try from 0806647b to 080668c5 has its CatchHandler @ 08066bf6 - uStack_5080 = 0x8066480; - TReadScriptFile::open((TReadScriptFile *)local_4ffc,pcVar21,(int)pcVar22); - while( true ) { - uStack_5080 = 0x806648e; - TReadScriptFile::nextToken((TReadScriptFile *)local_4ffc); - if (local_4ffc == (undefined1 [4])0x0) break; - uVar20 = local_4ffc == (undefined1 [4])0x1; - if (!(bool)uVar20) { - pcVar21 = "Identifier expected"; - uStack_5080 = 0x80664af; - TReadScriptFile::error((TReadScriptFile *)local_4ffc,"Identifier expected"); - } - uStack_5080 = 0x80664bd; - pcVar22 = TReadScriptFile::getIdentifier((TReadScriptFile *)local_4ffc); - iVar11 = 10; - pcVar19 = "extension"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar20 = *pcVar22 == *pcVar19; - pcVar22 = pcVar22 + 1; - pcVar19 = pcVar19 + 1; - } while ((bool)uVar20); - if ((bool)uVar20) { - pcVar21 = (char *)0x3d; - uStack_5080 = 0x80667f9; - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,'='); - uStack_5080 = 0x8066807; - PaymentExtension = TReadScriptFile::readNumber((TReadScriptFile *)local_4ffc); - } - else { - uStack_5080 = 0x80664e2; - pcVar22 = TReadScriptFile::getIdentifier((TReadScriptFile *)local_4ffc); - iVar11 = 0xc; - pcVar19 = "clearguests"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar20 = *pcVar22 == *pcVar19; - pcVar22 = pcVar22 + 1; - pcVar19 = pcVar19 + 1; - } while ((bool)uVar20); - if ((bool)uVar20) { - local_5031 = '\x01'; - } - else { - uStack_5080 = 0x8066507; - pcVar22 = TReadScriptFile::getIdentifier((TReadScriptFile *)local_4ffc); - iVar11 = 10; - pcVar19 = "clearbeds"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar20 = *pcVar22 == *pcVar19; - pcVar22 = pcVar22 + 1; - pcVar19 = pcVar19 + 1; - } while ((bool)uVar20); - if ((bool)uVar20) { - local_5032 = '\x01'; - } - else { - uStack_5080 = 0x806652c; - pcVar21 = TReadScriptFile::getIdentifier((TReadScriptFile *)local_4ffc); - iVar11 = 3; - pcVar22 = "id"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar20 = *pcVar21 == *pcVar22; - pcVar21 = pcVar21 + 1; - pcVar22 = pcVar22 + 1; - } while ((bool)uVar20); - if (!(bool)uVar20) { - uStack_5080 = 0x80667c6; - TReadScriptFile::error - ((TReadScriptFile *)local_4ffc,"Unknown identifier"); - } - uStack_5080 = 0x8066559; - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,'='); - uStack_5080 = 0x8066567; - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)local_4ffc); - uStack_5080 = 0x8066572; - pTVar6 = GetHouse((ushort)iVar11); - if (pTVar6 == (THouse *)0x0) { - uStack_5080 = 0x8066780; - error("LoadOwners: Haus zu ID %d existiert nicht."); - goto LAB_08066780; - } - uStack_5080 = 0x806658a; - TReadScriptFile::readIdentifier((TReadScriptFile *)local_4ffc); - uStack_5080 = 0x80665a0; - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,'='); - uStack_5080 = 0x80665ae; - uVar7 = TReadScriptFile::readNumber((TReadScriptFile *)local_4ffc); - pTVar6->OwnerID = uVar7; - uStack_5080 = 0x80665bc; - TReadScriptFile::readIdentifier((TReadScriptFile *)local_4ffc); - uStack_5080 = 0x80665cc; - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,'='); - uStack_5080 = 0x80665d4; - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)local_4ffc); - pTVar6->LastTransition = iVar11; - uStack_5080 = 0x80665e2; - TReadScriptFile::readIdentifier((TReadScriptFile *)local_4ffc); - uStack_5080 = 0x80665f2; - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,'='); - uStack_5080 = 0x80665fa; - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)local_4ffc); - pTVar6->PaidUntil = iVar11; - uStack_5080 = 0x8066608; - TReadScriptFile::readIdentifier((TReadScriptFile *)local_4ffc); - uStack_5080 = 0x8066618; - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,'='); - uStack_5080 = 0x8066628; - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,'{'); - while( true ) { - uStack_5080 = 0x8066636; - TReadScriptFile::nextToken((TReadScriptFile *)local_4ffc); - if (local_4ffc != (undefined1 [4])0x6) goto LAB_0806666c; - uStack_5080 = 0x806664d; - cVar4 = TReadScriptFile::getSpecial((TReadScriptFile *)local_4ffc); - if (cVar4 == '}') break; - if (local_4ffc != (undefined1 [4])0x6) goto LAB_0806666c; - uStack_5080 = 0x8066668; - cVar4 = TReadScriptFile::getSpecial((TReadScriptFile *)local_4ffc); - if (cVar4 != ',') { -LAB_0806666c: - uStack_5080 = 0x806667a; - pcVar21 = TReadScriptFile::getString((TReadScriptFile *)local_4ffc); - uStack_5080 = 0x8066694; - pTVar8 = vector<>::operator()(&pTVar6->Guest,pTVar6->Guests); - uStack_5080 = 0x80666a0; - strcpy(pTVar8->Name,pcVar21); - pTVar6->Guests = pTVar6->Guests + 1; - } - } - uStack_5080 = 0x80666b6; - TReadScriptFile::readIdentifier((TReadScriptFile *)local_4ffc); - uStack_5080 = 0x80666cc; - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,'='); - pcVar21 = (char *)0x7b; - uStack_5080 = 0x80666dc; - TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,'{'); - while( true ) { - uStack_5080 = 0x80666ea; - TReadScriptFile::nextToken((TReadScriptFile *)local_4ffc); - if (local_4ffc != (undefined1 [4])0x6) goto LAB_0806671a; - uStack_5080 = 0x8066701; - cVar4 = TReadScriptFile::getSpecial((TReadScriptFile *)local_4ffc); - if (cVar4 == '}') break; - if (local_4ffc != (undefined1 [4])0x6) goto LAB_0806671a; - uStack_5080 = 0x8066716; - cVar4 = TReadScriptFile::getSpecial((TReadScriptFile *)local_4ffc); - if (cVar4 != ',') { -LAB_0806671a: - uStack_5080 = 0x8066728; - pcVar21 = TReadScriptFile::getString((TReadScriptFile *)local_4ffc); - uStack_5080 = 0x8066742; - pTVar8 = vector<>::operator()(&pTVar6->Subowner,pTVar6->Subowners); - uStack_5080 = 0x806674e; - strcpy(pTVar8->Name,pcVar21); - pTVar6->Subowners = pTVar6->Subowners + 1; - } - } - if (local_5031 != '\0') { - pTVar6->Guests = 0; - } - } - } - } - } - uStack_5080 = 0x806681f; - TReadScriptFile::close((TReadScriptFile *)local_4ffc,(int)pcVar21); - iStack_5030 = Houses; - iVar12 = Houses + -1; - iVar11 = -(Houses + 0x10 + iVar12 & 0xfffffff0U); - uVar15 = iVar12 * 4 + 0x13U & 0xfffffff0; - OwnerNames = auStack_5064 + iVar11; - iVar12 = -(iVar12 * 0x1e + 0x2dU & 0xfffffff0); - puVar17 = (undefined4 *)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18); - i_1 = (int)(auStack_5064 + iVar12 + -uVar15 + iVar11); - *(undefined1 **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -4) = - auStack_5064 + iVar12 + uVar15 * -2 + iVar11; - *(undefined1 **)((int)aiStack_5070 + iVar12 + uVar15 * -2 + iVar11 + 4) = - auStack_5064 + iVar12 + -uVar15 + iVar11; - *(undefined1 **)((int)aiStack_5070 + iVar12 + uVar15 * -2 + iVar11) = - auStack_5064 + -uVar15 + iVar11; - pcVar2 = OwnerNames; - *(int **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x14) = &stack0xffffafd0; - *(char_0__30_ **)(&stack0xffffaf8c + iVar12 + uVar15 * -2 + iVar11) = pcVar2; - *(TQueryManagerConnection **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18) = - QueryManagerConnection; - *(undefined4 *)((int)&uStack_5080 + iVar12 + uVar15 * -2 + iVar11) = 0x806689c; - iVar10 = TQueryManagerConnection::getHouseOwners - (*(TQueryManagerConnection **) - (auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18), - *(int **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x14), - *(ushort **)(&stack0xffffaf8c + iVar12 + uVar15 * -2 + iVar11), - *(ulong **)((int)aiStack_5070 + iVar12 + uVar15 * -2 + iVar11), - *(char (**) [30])((int)aiStack_5070 + iVar12 + uVar15 * -2 + iVar11 + 4) - ,*(int **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -4)); - if (iVar10 != 0) { - *(char **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18) = - "LoadOwners: Kann Namen der Mieter nicht ermitteln.\n"; - *(undefined4 *)((int)&uStack_5080 + iVar12 + uVar15 * -2 + iVar11) = 0x8066ba3; - error(*(char **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18)); -LAB_08066780: - *puVar17 = 4; - puVar17[-1] = 0x806678c; - puVar9 = (undefined4 *)__cxa_allocate_exception(); - *puVar9 = "Cannot load owners"; - puVar17[2] = 0; - puVar17[1] = char_const*::typeinfo; - *puVar17 = puVar9; - // WARNING: Subroutine does not return - puVar17[-1] = &UNK_080667aa; - __cxa_throw(); - } - iVar18 = 0; - iVar10 = i_1; - if (0 < iStack_5030) { - do { - *(uint *)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18) = - (uint)*(ushort *)(OwnerNames + iVar18 * 2); - *(undefined4 *)((int)&uStack_5080 + iVar12 + uVar15 * -2 + iVar11) = 0x80668c6; - pTVar6 = GetHouse(*(ushort *)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18)) - ; - if (pTVar6 == (THouse *)0x0) { - uVar1 = *(ushort *)(OwnerNames + iVar18 * 2); - *(char **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18) = - "LoadOwners: Haus %d existiert nicht.\n"; - *(uint *)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x14) = (uint)uVar1; - *(undefined4 *)((int)&uStack_5080 + iVar12 + uVar15 * -2 + iVar11) = 0x8066b92; - error(*(char **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18)); - } - else if (pTVar6->OwnerID != 0) { - *(int *)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x14) = iVar10; - *(char **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18) = - pTVar6->OwnerName; - *(undefined4 *)((int)&uStack_5080 + iVar12 + uVar15 * -2 + iVar11) = 0x8066b73; - strcpy(*(char **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18), - *(char **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x14)); - } - iVar18 = iVar18 + 1; - iVar10 = iVar10 + 0x1e; - } while (iVar18 < iStack_5030); - } - if (local_5032 != '\0') { - *(undefined **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x14) = &DAT_080f4f5b; - *(undefined4 *)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18) = 1; - // try { // try from 08066919 to 08066a1c has its CatchHandler @ 08066bf6 - *(undefined4 *)((int)&uStack_5080 + iVar12 + uVar15 * -2 + iVar11) = 0x806691e; - print(); - house_2 = (THouse *)0x0; - if (0 < Houses) { - do { - pTVar6 = house_2; - *(vector **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18) = - &House; - *(THouse **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x14) = pTVar6; - *(undefined4 *)((int)&uStack_5080 + iVar12 + uVar15 * -2 + iVar11) = 0x8066946; - x = (int)vector::operator() - (*(vector **) - (auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18), - *(int *)(auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x14)); - iVar10 = ((THouse *)x)->CenterX; - y = iVar10 - MaxHouseX; - if (iVar10 - MaxHouseX <= MaxHouseX + iVar10) { - iVar18 = ((THouse *)x)->CenterY; - iVar14 = MaxHouseX; - iVar16 = MaxHouseY; - do { - z = iVar18 - iVar16; - iVar13 = SectorZMax; - if (iVar18 - iVar16 <= iVar16 + iVar18) { - do { - local_5054 = SectorZMin; - if (SectorZMin <= iVar13) { - do { - *(int *)((int)aiStack_5070 + - iVar12 + uVar15 * -2 + iVar11) = local_5054; - *(int *)(&stack0xffffaf8c + - iVar12 + uVar15 * -2 + iVar11) = z; - iVar10 = y; - *(ulong **) - (auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18) - = &local_500c; - *(int *)(auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x14) = iVar10; - *(undefined4 *) - ((int)&uStack_5080 + iVar12 + uVar15 * -2 + iVar11) = - 0x80669d9; - GetFirstObject(); - while( true ) { - bVar3 = false; - local_501c[0] = NONE.ObjectID; - NumberOfHouses = NONE.ObjectID; - if (local_500c != NONE.ObjectID) { - *(int **)(auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x18) - = &NumberOfHouses; - *(ulong **) - (auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x14) = - &local_500c; - *(undefined4 *) - ((int)&uStack_5080 + - iVar12 + uVar15 * -2 + iVar11) = 0x8066b40; - Object::getObjectType - (*(Object **) - (auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + - -0x18)); - *(undefined4 *) - (auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x14) = 0x14; - *(int **)(auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x18) - = &NumberOfHouses; - *(undefined4 *) - ((int)&uStack_5080 + - iVar12 + uVar15 * -2 + iVar11) = 0x8066b53; - bVar5 = ObjectType::getFlag(*(ObjectType **) - (auStack_5064 + - iVar12 + uVar15 * - -2 + iVar11 + -0x18), - *(FLAG *)(auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x14)); - if (!bVar5) { - bVar3 = true; - } - } - if (!bVar3) break; - *(ulong **) - (auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x14) = - &local_500c; - *(ulong **) - (auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x18) = local_501c - ; - *(undefined4 *) - ((int)&uStack_5080 + iVar12 + uVar15 * -2 + iVar11) - = 0x8066a1d; - Object::getNextObject - (*(Object **) - (auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x18)); - local_500c = local_501c[0]; - } - bVar3 = false; - NumberOfHouses = NONE.ObjectID; - if (local_500c == NONE.ObjectID) { -LAB_08066a4d: - bVar3 = true; - } - else { - *(undefined4 *) - (auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x14) = 9; - *(ulong **) - (auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x18) = - &local_500c; - // try { // try from 08066b1c to 08066ba2 has its CatchHandler @ 08066bf6 - *(undefined4 *) - ((int)&uStack_5080 + iVar12 + uVar15 * -2 + iVar11) - = 0x8066b21; - uVar7 = Object::getAttribute - (*(Object **) - (auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + - -0x18),*(INSTANCEATTRIBUTE *) - (auStack_5064 + - iVar12 + uVar15 * -2 + - iVar11 + -0x14) - ); - if (uVar7 == 0) goto LAB_08066a4d; - } - if (!bVar3) { - NumberOfHouses = local_500c; - local_501c[0] = local_500c; - *(int **)(&stack0xffffaf8c + - iVar12 + uVar15 * -2 + iVar11) = - &NumberOfHouses; - *(ulong **) - (auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x14) = local_501c - ; - *(undefined4 *) - (auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x18) = 0; - // try { // try from 08066b01 to 08066b05 has its CatchHandler @ 08066ba8 - *(undefined4 *) - ((int)&uStack_5080 + iVar12 + uVar15 * -2 + iVar11) - = 0x8066b06; - UseObjects(*(ulong *)(auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + - -0x18), - *(Object **) - (auStack_5064 + - iVar12 + uVar15 * -2 + iVar11 + -0x14), - *(Object **) - (&stack0xffffaf8c + - iVar12 + uVar15 * -2 + iVar11)); - } - local_5054 = local_5054 + 1; - } while (local_5054 <= SectorZMax); - iVar18 = *(int *)(x + 0x248); - iVar13 = SectorZMax; - iVar16 = MaxHouseY; - } - z = z + 1; - } while (z <= iVar16 + iVar18); - iVar10 = *(int *)(x + 0x244); - iVar14 = MaxHouseX; - } - y = y + 1; - } while (y <= iVar14 + iVar10); - } - house_2 = (THouse *)((int)&house_2->ID + 1); - } while ((int)house_2 < Houses); - } - } - *(undefined1 **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18) = local_4ffc; - // try { // try from 080668fa to 080668fe has its CatchHandler @ 08066c00 - *(undefined4 *)((int)&uStack_5080 + iVar12 + uVar15 * -2 + iVar11) = 0x80668ff; - TReadScriptFile::~TReadScriptFile - (*(TReadScriptFile **)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x18), - *(int *)(auStack_5064 + iVar12 + uVar15 * -2 + iVar11 + -0x14)); - } - else { - uStack_5080 = 0x806644f; - Log("houses","Keine Mieterdaten gefunden.\n"); - } - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void SaveOwners(void) - -{ - time_t tVar1; - THouse *pTVar2; - THouseGuest *pTVar3; - int i; - int j; - int iVar4; - char *__s; - char *pcVar5; - undefined1 local_202c [4]; - TWriteScriptFile Script; - char local_101c [4]; - char FileName [4096]; - - // try { // try from 08066c31 to 08066c61 has its CatchHandler @ 08066f20 - Log("houses","Speichere Mieterdaten...\n"); - pcVar5 = DATAPATH; - __s = local_101c; - sprintf(__s,"%s/owners.dat"); - TWriteScriptFile::TWriteScriptFile((TWriteScriptFile *)local_202c); - // try { // try from 08066c69 to 08066c97 has its CatchHandler @ 08066f06 - TWriteScriptFile::open((TWriteScriptFile *)local_202c,__s,(int)pcVar5); - tVar1 = time((time_t *)0x0); - if (tVar1 < PaymentExtension) { - TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,"Extension = "); - __s = (char *)PaymentExtension; - TWriteScriptFile::writeNumber((TWriteScriptFile *)local_202c,PaymentExtension); - TWriteScriptFile::writeLn((TWriteScriptFile *)local_202c); - TWriteScriptFile::writeLn((TWriteScriptFile *)local_202c); - } - pcVar5 = (char *)0x0; - if (0 < Houses) { - do { - __s = pcVar5; - // try { // try from 08066cb8 to 08066f00 has its CatchHandler @ 08066f06 - pTVar2 = vector::operator()(&House,(int)pcVar5); - if (pTVar2->OwnerID != 0) { - TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,"ID = "); - pTVar2 = vector::operator()(&House,(int)pcVar5); - TWriteScriptFile::writeNumber((TWriteScriptFile *)local_202c,(uint)pTVar2->ID); - TWriteScriptFile::writeLn((TWriteScriptFile *)local_202c); - TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,"Owner = "); - pTVar2 = vector::operator()(&House,(int)pcVar5); - TWriteScriptFile::writeNumber((TWriteScriptFile *)local_202c,pTVar2->OwnerID); - TWriteScriptFile::writeLn((TWriteScriptFile *)local_202c); - TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,"LastTransition = "); - pTVar2 = vector::operator()(&House,(int)pcVar5); - TWriteScriptFile::writeNumber((TWriteScriptFile *)local_202c,pTVar2->LastTransition) - ; - TWriteScriptFile::writeLn((TWriteScriptFile *)local_202c); - TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,"PaidUntil = "); - pTVar2 = vector::operator()(&House,(int)pcVar5); - TWriteScriptFile::writeNumber((TWriteScriptFile *)local_202c,pTVar2->PaidUntil); - TWriteScriptFile::writeLn((TWriteScriptFile *)local_202c); - TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,"Guests = {"); - for (iVar4 = 0; pTVar2 = vector::operator()(&House,(int)pcVar5), - iVar4 < pTVar2->Guests; iVar4 = iVar4 + 1) { - if (0 < iVar4) { - TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,","); - } - pTVar2 = vector::operator()(&House,(int)pcVar5); - pTVar3 = vector<>::operator()(&pTVar2->Guest,iVar4); - TWriteScriptFile::writeString((TWriteScriptFile *)local_202c,pTVar3->Name); - } - TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,"}"); - TWriteScriptFile::writeLn((TWriteScriptFile *)local_202c); - TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,"Subowners = {"); - for (iVar4 = 0; pTVar2 = vector::operator()(&House,(int)pcVar5), - iVar4 < pTVar2->Subowners; iVar4 = iVar4 + 1) { - if (0 < iVar4) { - TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,","); - } - pTVar2 = vector::operator()(&House,(int)pcVar5); - pTVar3 = vector<>::operator()(&pTVar2->Subowner,iVar4); - TWriteScriptFile::writeString((TWriteScriptFile *)local_202c,pTVar3->Name); - } - __s = "}"; - TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,"}"); - TWriteScriptFile::writeLn((TWriteScriptFile *)local_202c); - TWriteScriptFile::writeLn((TWriteScriptFile *)local_202c); - } - pcVar5 = pcVar5 + 1; - } while ((int)pcVar5 < Houses); - } - TWriteScriptFile::close((TWriteScriptFile *)local_202c,(int)__s); - // try { // try from 08066c9b to 08066c9f has its CatchHandler @ 08066f20 - TWriteScriptFile::~TWriteScriptFile((TWriteScriptFile *)local_202c,(int)__s); - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void InitHouses(void) - -{ - TQueryManagerConnection *pTVar1; - RESULT r; - int in_stack_ffffffe8; - - // try { // try from 08066f43 to 08066f81 has its CatchHandler @ 08066f90 - InitLog("houses"); - LoadHouseAreas(); - LoadHouses(); - LoadOwners(); - FinishAuctions(); - CollectRents(); - StartAuctions(); - pTVar1 = QueryManagerConnection; - if (QueryManagerConnection != (TQueryManagerConnection *)0x0) { - TQueryManagerConnection::~TQueryManagerConnection(QueryManagerConnection,in_stack_ffffffe8); - operator_delete(pTVar1); - } - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void ExitHouses(void) - -{ - // try { // try from 08067009 to 0806700d has its CatchHandler @ 08067015 - SaveOwners(); - return; -} - - - void __tcf_0(void *param_1) { diff --git a/reference/types.hh b/reference/types.hh index 513fb78..fc365b4 100644 --- a/reference/types.hh +++ b/reference/types.hh @@ -25,48 +25,6 @@ struct TPreparedQuery { char *Name; }; -struct THouseGuest { - char Name[60]; -}; - -struct THouse { - ushort ID; - char Name[50]; - char Description[500]; - int Size; - ulong Rent; - int DepotNr; - bool NoAuction; - bool GuildHouse; - int ExitX; - int ExitY; - int ExitZ; - int CenterX; - int CenterY; - int CenterZ; - ulong OwnerID; - char OwnerName[30]; - int LastTransition; - int PaidUntil; - struct vector Subowner; - int Subowners; - struct vector Guest; - int Guests; - int Help; -}; - -struct THelpDepot { - ulong CharacterID; - struct Object Box; - int DepotNr; -}; - -struct THouseArea { - ushort ID; - int SQMPrice; - int DepotNr; -}; - struct TDirectReplyData { ulong CharacterID; char Message[100]; diff --git a/src/crnonpl.cc b/src/crnonpl.cc index b05a5e5..29a5d11 100644 --- a/src/crnonpl.cc +++ b/src/crnonpl.cc @@ -1856,9 +1856,9 @@ void TNPC::GiveTo(ObjectType Type, int Amount){ if(Type.getFlag(CUMULATIVE)){ while(Amount > 0){ - int StackSize = std::min(Amount, 100); - CreateAtCreature(this->Interlocutor, Type, StackSize); - Amount -= StackSize; + int StackAmount = std::min(Amount, 100); + CreateAtCreature(this->Interlocutor, Type, StackAmount); + Amount -= StackAmount; } }else{ while(Amount > 0){ @@ -1890,9 +1890,10 @@ void TNPC::GetMoney(int Amount){ int Gold = CountInventoryObjects(this->Interlocutor, GetSpecialObject(MONEY_ONE), 0); CalculateChange(Amount, &Gold, &Platinum, &Crystal); - ASSERT(Crystal >= 0); - if(Crystal > 0){ - this->GetFrom(GetSpecialObject(MONEY_TENTHOUSAND), Crystal); + if(Gold > 0){ + this->GetFrom(GetSpecialObject(MONEY_ONE), Gold); + }else if(Gold < 0){ + this->GiveTo(GetSpecialObject(MONEY_ONE), -Gold); } if(Platinum > 0){ @@ -1901,10 +1902,9 @@ void TNPC::GetMoney(int Amount){ this->GiveTo(GetSpecialObject(MONEY_HUNDRED), -Platinum); } - if(Gold > 0){ - this->GetFrom(GetSpecialObject(MONEY_ONE), Gold); - }else if(Gold < 0){ - this->GiveTo(GetSpecialObject(MONEY_ONE), -Gold); + ASSERT(Crystal >= 0); + if(Crystal > 0){ + this->GetFrom(GetSpecialObject(MONEY_TENTHOUSAND), Crystal); } } diff --git a/src/enums.hh b/src/enums.hh index 9dad622..afec34a 100644 --- a/src/enums.hh +++ b/src/enums.hh @@ -268,6 +268,12 @@ enum GAMESTATE: int { GAME_ENDING = 3, }; +enum HouseList: uint8 { + GUESTLIST = 1, + SUBOWNERLIST = 2, + DOORLIST = 3, +}; + enum INSTANCEATTRIBUTE: int { CONTENT = 0, CHESTQUESTNUMBER = 1, diff --git a/src/houses.cc b/src/houses.cc new file mode 100644 index 0000000..87f4556 --- /dev/null +++ b/src/houses.cc @@ -0,0 +1,1909 @@ +#include "houses.hh" +#include "config.hh" +#include "cr.hh" +#include "info.hh" +#include "moveuse.hh" +#include "query.hh" + +#include "stubs.hh" + +static vector HelpDepot(0, 9, 10); +static int HelpDepots; + +static vector HouseArea(0, 99, 50); +static int HouseAreas; + +static vector House(0, 99, 100); +static int Houses; +static int MaxHouseX; +static int MaxHouseY; + +static TQueryManagerConnection *QueryManagerConnection; +static int PaymentExtension; + +THouseArea *GetHouseArea(uint16 ID){ + THouseArea *Result = NULL; + for(int i = 0; i < HouseAreas; i += 1){ + if(HouseArea.at(i)->ID == ID){ + Result = HouseArea.at(i); + break; + } + } + + if(Result == NULL){ + error("GetHouseArea: Gebiet mit ID %d nicht gefunden.\n", ID); + } + + return Result; +} + +int CheckAccessRight(const char *Rule, TPlayer *Player){ + if(Rule == NULL){ + error("CheckAccessRight: Regel ist NULL.\n"); + return 0; // NOT_APPLICABLE ? + } + + if(Player == NULL){ + error("CheckAccessRight: pl ist NULL.\n"); + return 0; // NOT_APPLICABLE ? + } + + bool Negate = Rule[0] == '!'; + if(Negate){ + Rule += 1; + } + + bool Match; + if(strchr(Rule, '@') == NULL){ + Match = MatchString(Rule, Player->Name); + }else{ + if(Player->Guild[0] == 0){ + return 0; // NOT_APPLICABLE ? + } + + char Help[200]; + if(Player->Rank[0] == 0){ + snprintf(Help, sizeof(Help), "@%s", Player->Guild); + }else{ + snprintf(Help, sizeof(Help), "%s@%s", Player->Rank, Player->Guild); + } + + Match = MatchString(Rule, Help); + } + + if(!Match){ + return 0; // NOT_APPLICABLE ? + }else if(Negate){ + return -1; // DENY_ACCESS ? + }else{ + return 1; // ALLOW_ACCESS ? + } +} + +THouse *GetHouse(uint16 ID){ + // NOTE(fusion): A little binary search action. + int Left = 0; + int Right = Houses - 1; + THouse *Result = NULL; + while(Left <= Right){ + int Current = (Left + Right) / 2; + uint16 CurrentID = House.at(Current)->ID; + if(CurrentID < ID){ + Left = Current + 1; + }else if(CurrentID > ID){ + Right = Current - 1; + }else{ + Result = House.at(Current); + break; + } + } + + if(Result == NULL){ + error("GetHouse: Haus mit ID %d nicht gefunden.\n", ID); + } + + return Result; +} + +bool IsOwner(uint16 HouseID, TPlayer *Player){ + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("IsOwner: Haus mit ID %d existiert nicht.\n", HouseID); + return false; + } + + if(Player == NULL){ + error("IsOwner: pl ist NULL.\n"); + return false; + } + + return House->OwnerID == Player->ID; +} + +bool IsSubowner(uint16 HouseID, TPlayer *Player, int TimeStamp){ + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("IsSubowner: Haus mit ID %d existiert nicht.\n", HouseID); + return false; + } + + if(Player == NULL){ + error("IsSubowner: pl ist NULL.\n"); + return false; + } + + if(House->LastTransition > TimeStamp){ + return false; + } + + // TODO(fusion): Should allow on a positive rule but keep looking for a + // negative rule to make it order independent? + for(int i = 0; i < House->Subowners; i += 1){ + int Access = CheckAccessRight(House->Subowner.at(i)->Name, Player); + if(Access == -1){ + return false; + }else if(Access == 1){ + return true; + } + } + + return false; +} + +bool IsGuest(uint16 HouseID, TPlayer *Player, int TimeStamp){ + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("IsGuest: Haus mit ID %d existiert nicht.\n", HouseID); + return false; + } + + if(Player == NULL){ + error("IsGuest: pl ist NULL.\n"); + return false; + } + + if(House->LastTransition > TimeStamp){ + return false; + } + + // TODO(fusion): Should allow on a positive rule but keep looking for a + // negative rule to make it order independent? + for(int i = 0; i < House->Guests; i += 1){ + int Access = CheckAccessRight(House->Guest.at(i)->Name, Player); + if(Access == -1){ + return false; + }else if(Access == 1){ + return true; + } + } + + return false; +} + +bool IsInvited(uint16 HouseID, TPlayer *Player, int TimeStamp){ + if(Player == NULL){ + error("IsInvited: pl ist NULL.\n"); + return false; + } + + return IsOwner(HouseID, Player) + || IsSubowner(HouseID, Player, TimeStamp) + || IsGuest(HouseID, Player, TimeStamp); +} + +const char *GetHouseName(uint16 HouseID){ + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("GetHouseName: Haus mit ID %d existiert nicht.\n", HouseID); + return NULL; + } + + return House->Name; +} + +const char *GetHouseOwner(uint16 HouseID){ + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("GetHouseOwner: Haus mit ID %d existiert nicht.\n", HouseID); + return NULL; + } + + return House->OwnerName; +} + +// TODO(fusion): This function is unsafe like `strcpy`. +void ShowSubownerList(uint16 HouseID, TPlayer *Player, char *Buffer){ + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("ShowSubownerList: Haus mit ID %d existiert nicht.\n", HouseID); + throw ERROR; + } + + if(Player == NULL){ + error("ShowSubownerList: pl ist NULL.\n"); + throw ERROR; + } + + if(Buffer == NULL){ + error("ShowSubownerList: Buffer ist NULL.\n"); + throw ERROR; + } + + if(!IsOwner(HouseID, Player)){ + throw NOTACCESSIBLE; + } + + print(3, "Editiere Untermieterliste von Haus %d.\n", HouseID); + sprintf(Buffer, "# Subowners of %s\n", House->Name); + for(int i = 0; i < House->Subowners; i += 1){ + strcat(Buffer, House->Subowner.at(i)->Name); + strcat(Buffer, "\n"); + } +} + +// TODO(fusion): This function is unsafe like `strcpy`. +void ShowGuestList(uint16 HouseID, TPlayer *Player, char *Buffer){ + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("ShowGuestList: Haus mit ID %d existiert nicht.\n", HouseID); + throw ERROR; + } + + if(Player == NULL){ + error("ShowGuestList: pl ist NULL.\n"); + throw ERROR; + } + + if(Buffer == NULL){ + error("ShowGuestList: Buffer ist NULL.\n"); + throw ERROR; + } + + if(!IsOwner(HouseID, Player) && (!IsSubowner(HouseID, Player, INT_MAX) + || !CheckRight(Player->ID, PREMIUM_ACCOUNT))){ + throw NOTACCESSIBLE; + } + + print(3, "Editiere Gästeliste von Haus %d.\n", HouseID); + sprintf(Buffer, "# Guests of %s\n", House->Name); + for(int i = 0; i < House->Guests; i += 1){ + strcat(Buffer, House->Guest.at(i)->Name); + strcat(Buffer, "\n"); + } +} + +void ChangeSubowners(uint16 HouseID, TPlayer *Player, const char *Buffer){ + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("ChangeSubowners: Haus mit ID %d existiert nicht.\n", HouseID); + throw ERROR; + } + + if(Player == NULL){ + error("ChangeSubowners: pl ist NULL.\n"); + throw ERROR; + } + + if(Buffer == NULL){ + error("ChangeSubowners: Buffer ist NULL.\n"); + throw ERROR; + } + + if(!IsOwner(HouseID, Player)){ + throw NOTACCESSIBLE; + } + + Log("houses", "%s ändert Liste der Untermieter von Haus %d.\n", Player->Name, HouseID); + + House->Subowners = 0; + for(int ReadPos = 0; Buffer[ReadPos] != 0;){ + const char *LineStart = &Buffer[ReadPos]; + const char *LineEnd = strchr(LineStart, '\n'); + + int LineLength; + if(LineEnd != NULL){ + LineLength = (int)(LineEnd - LineStart); + ReadPos += LineLength + 1; + }else{ + LineLength = (int)strlen(LineStart); + ReadPos += LineLength; + } + + // TODO(fusion): Ignore lines with whitespace only? + if(LineStart[0] != '#' && LineLength > 0){ + if(LineLength >= MAX_HOUSE_GUEST_NAME){ + LineLength = MAX_HOUSE_GUEST_NAME - 1; + } + + THouseGuest *Subowner = House->Subowner.at(House->Subowners); + memcpy(Subowner->Name, LineStart, LineLength); + Subowner->Name[LineLength] = 0; + House->Subowners += 1; + + if(House->Subowners >= 10){ // MAX_SUBOWNERS ? + break; + } + } + } + + KickGuests(HouseID); +} + +void ChangeGuests(uint16 HouseID, TPlayer *Player, const char *Buffer){ + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("ChangeGuests: Haus mit ID %d existiert nicht.\n", HouseID); + throw ERROR; + } + + if(Player == NULL){ + error("ChangeGuests: pl ist NULL.\n"); + throw ERROR; + } + + if(Buffer == NULL){ + error("ChangeGuests: Buffer ist NULL.\n"); + throw ERROR; + } + + if(!IsOwner(HouseID, Player) && (!IsSubowner(HouseID, Player, INT_MAX) + || !CheckRight(Player->ID, PREMIUM_ACCOUNT))){ + throw NOTACCESSIBLE; + } + + Log("houses", "%s ändert Liste der Gäste von Haus %d.\n", Player->Name, HouseID); + + House->Guests = 0; + for(int ReadPos = 0; Buffer[ReadPos] != 0;){ + const char *LineStart = &Buffer[ReadPos]; + const char *LineEnd = strchr(LineStart, '\n'); + + int LineLength; + if(LineEnd != NULL){ + LineLength = (int)(LineEnd - LineStart); + ReadPos += LineLength + 1; + }else{ + LineLength = (int)strlen(LineStart); + ReadPos += LineLength; + } + + // TODO(fusion): Ignore lines with whitespace only? + if(LineStart[0] != '#' && LineLength > 0){ + if(LineLength >= MAX_HOUSE_GUEST_NAME){ + LineLength = MAX_HOUSE_GUEST_NAME - 1; + } + + THouseGuest *Guest = House->Guest.at(House->Guests); + memcpy(Guest->Name, LineStart, LineLength); + Guest->Name[LineLength] = 0; + House->Guests += 1; + + if(House->Guests >= 100){ // MAX_GUESTS ? + break; + } + } + } + + KickGuests(HouseID); +} + +void GetExitPosition(uint16 HouseID, int *x, int *y, int *z){ + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("GetExitPosition: Haus mit ID %d existiert nicht.\n", HouseID); + return; + } + + *x = House->ExitX; + *y = House->ExitY; + *z = House->ExitZ; +} + +void KickGuest(uint16 HouseID, TPlayer *Guest){ + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("KickGuest(houses 1): Haus mit ID %d existiert nicht.\n", HouseID); + throw ERROR; + } + + if(Guest == NULL){ + error("KickGuest(houses 1): Guest ist NULL.\n"); + throw ERROR; + } + + GraphicalEffect(Guest->CrObject, EFFECT_POFF); + + // TODO(fusion): Not sure what's going on here. Maybe the player is still + // online but was getting into a bed? + Object Bed = GetFirstObject(Guest->posx, Guest->posy, Guest->posz); + while(Bed != NONE){ + if(Bed.getObjectType().getFlag(BED)){ + break; + } + Bed = Bed.getNextObject(); + } + + if(Bed != NONE && Bed.getAttribute(TEXTSTRING) != 0){ + print(3, "Spieler steht auf einem Bett, während er aus dem Haus gekickt wird.\n"); + try{ + UseObjects(0, Bed, Bed); + }catch(RESULT r){ + error("KickGuest: Exception %d beim Aufräumen des Bettes.\n", r); + } + } + + Object Exit = GetMapContainer(House->ExitX, House->ExitY, House->ExitZ); + Move(0, Guest->CrObject, Exit, -1, false, NONE); + GraphicalEffect(Guest->CrObject, EFFECT_ENERGY); +} + +void KickGuest(uint16 HouseID, TPlayer *Host, TPlayer *Guest){ + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("KickGuest(houses 2): Haus mit ID %d existiert nicht.\n", HouseID); + throw ERROR; + } + + if(Host == NULL){ + error("KickGuest(houses 2): Host ist NULL.\n"); + throw ERROR; + } + + if(Guest == NULL){ + error("KickGuest(houses 2): Guest ist NULL.\n"); + throw ERROR; + } + + if(GetHouseID(Guest->posx, Guest->posy, Guest->posz) != HouseID){ + throw NOTACCESSIBLE; + } + + if(Guest != Host){ + if(CheckRight(Guest->ID, ENTER_HOUSES)){ + throw NOTACCESSIBLE; + } + + if(!IsOwner(HouseID, Host) && !IsSubowner(HouseID, Host, INT_MAX)){ + throw NOTACCESSIBLE; + } + + if(IsOwner(HouseID, Guest)){ + throw NOTACCESSIBLE; + } + } + + KickGuest(HouseID, Guest); +} + +void KickGuests(uint16 HouseID){ + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("KickGuests: Haus mit ID %d existiert nicht.\n", HouseID); + return; + } + + // TODO(fusion): I think `MaxHouseX` and `MaxHouseY` are the maximum house + // radii but it is a mistery as to why they're not stored INSIDE `THouse`. + TFindCreatures Search(MaxHouseX, MaxHouseY, House->CenterX, House->CenterY, FIND_PLAYERS); + while(true){ + uint32 CharacterID = Search.getNext(); + if(CharacterID == 0){ + break; + } + + TPlayer *Player = GetPlayer(CharacterID); + if(GetHouseID(Player->posx, Player->posy, Player->posz) == HouseID + && !IsInvited(HouseID, Player, INT_MAX) + && !CheckRight(CharacterID, ENTER_HOUSES)){ + KickGuest(HouseID, Player); + } + } +} + +bool MayOpenDoor(Object Door, TPlayer *Player){ + if(!Door.exists()){ + error("MayOpenDoor: Tür existiert nicht.\n"); + return false; + } + + if(Player == NULL){ + error("MayOpenDoor: pl ist NULL.\n"); + return false; + } + + ObjectType DoorType = Door.getObjectType(); + if(!DoorType.getFlag(NAMEDOOR) || !DoorType.getFlag(TEXT)){ + error("MayOpenDoor: Tür ist keine NameDoor.\n"); + return false; + } + + const char *Text = GetDynamicString(Door.getAttribute(TEXTSTRING)); + if(Text == NULL){ + return false; + } + + // TODO(fusion): Should allow on a positive rule but keep looking for a + // negative rule to make it order independent? + for(int ReadPos = 0; Text[ReadPos] != 0;){ + const char *LineStart = &Text[ReadPos]; + const char *LineEnd = strchr(LineStart, '\n'); + + int LineLength; + if(LineEnd != NULL){ + LineLength = (int)(LineEnd - LineStart); + ReadPos += LineLength + 1; + }else{ + LineLength = (int)strlen(LineStart); + ReadPos += LineLength; + } + + // TODO(fusion): Ignore lines with whitespace only? + if(LineStart[0] != '#' && LineLength > 0){ + if(LineLength >= MAX_HOUSE_GUEST_NAME){ + LineLength = MAX_HOUSE_GUEST_NAME - 1; + } + + char Rule[MAX_HOUSE_GUEST_NAME]; + memcpy(Rule, LineStart, LineLength); + Rule[LineLength] = 0; + + int Access = CheckAccessRight(Rule, Player); + if(Access == -1){ + return false; + }else if(Access == 1){ + return true; + } + } + } + + return false; +} + +// TODO(fusion): This function is unsafe like `strcpy`. +void ShowNameDoor(Object Door, TPlayer *Player, char *Buffer){ + if(!Door.exists()){ + error("ShowNameDoor: Tür existiert nicht.\n"); + throw ERROR; + } + + if(Player == NULL){ + error("ShowNameDoor: pl ist NULL.\n"); + throw ERROR; + } + + if(Buffer == NULL){ + error("ShowNameDoor: Buffer ist NULL.\n"); + throw ERROR; + } + + int DoorX, DoorY, DoorZ; + GetObjectCoordinates(Door, &DoorX, &DoorY, &DoorZ); + uint16 HouseID = GetHouseID(DoorX, DoorY, DoorZ); + if(HouseID == 0){ + error("ShowNameDoor: Tür auf Koordinate [%d,%d,%d] gehört zu keinem Haus.\n", + DoorX, DoorY, DoorZ); + throw ERROR; + } + + if(!IsOwner(HouseID, Player)){ + print(3, "Spieler %s ist nicht Mieter des Hauses %d.\n", + Player->Name, HouseID); + throw NOTACCESSIBLE; + } + + print(3, "Editiere NameDoor.\n"); + + // TODO(fusion): Check for `NAMEDOOR` flag as well? + if(Door.getObjectType().getFlag(TEXT)){ + error("ShowNameDoor: Tür auf Koordinate [%d,%d,%d] enthält keinen Text.\n", + DoorX, DoorY, DoorZ); + throw ERROR; + } + + const char *Text = GetDynamicString(Door.getAttribute(TEXTSTRING)); + if(Text != NULL){ + strcpy(Buffer, Text); + }else{ + strcpy(Buffer, "# Players allowed to open this door\n"); + } +} + +void ChangeNameDoor(Object Door, TPlayer *Player, const char *Buffer){ + if(!Door.exists()){ + error("ChangeNameDoor: Tür existiert nicht.\n"); + throw ERROR; + } + + if(Player == NULL){ + error("ChangeNameDoor: pl ist NULL.\n"); + throw ERROR; + } + + if(Buffer == NULL){ + error("ChangeNameDoor: Buffer ist NULL.\n"); + throw ERROR; + } + + int DoorX, DoorY, DoorZ; + GetObjectCoordinates(Door, &DoorX, &DoorY, &DoorZ); + uint16 HouseID = GetHouseID(DoorX, DoorY, DoorZ); + if(HouseID == 0){ + error("ChangeNameDoor: Tür auf Koordinate [%d,%d,%d] gehört zu keinem Haus.\n", + DoorX, DoorY, DoorZ); + throw ERROR; + } + + if(!IsOwner(HouseID, Player)){ + throw NOTACCESSIBLE; + } + + // TODO(fusion): Check for `NAMEDOOR` flag as well? + if(!Door.getObjectType().getFlag(TEXT)){ + error("ChangeNameDoor: Tür auf Koordinate [%d,%d,%d] enthält keinen Text.\n", + DoorX, DoorY, DoorZ); + throw ERROR; + } + + Log("houses", "%s ändert NameDoor von Haus %d auf Koordinate [%d,%d,%d].\n", + Player->Name, HouseID, DoorX, DoorY, DoorZ); + + DeleteDynamicString(Door.getAttribute(TEXTSTRING)); + Change(Door, TEXTSTRING, AddDynamicString(Buffer)); +} + +static void CreateCoins(Object Con, ObjectType Type, int Amount){ + // TODO(fusion): Can we guarantee `Amount` is in the [0, 100] range? + Object Obj = SetObject(Con, Type, 0); + ChangeObject(Obj, AMOUNT, Amount); +} + +static int DeleteCoins(Object Con, ObjectType Type, int Amount){ + Object Obj = GetFirstContainerObject(Con); + while(Amount > 0 && Obj != NONE){ + Object Next = Obj.getNextObject(); + ObjectType ObjType = Obj.getObjectType(); + if(ObjType == Type){ + // TODO(fusion): `Change` will notify spectators while `DeleteObject` + // will not, so there is an asymmetry here. We also don't check if + // `Type` is `CUMULATE` but I suppose coins are implicitly `CUMULATE`. + int ObjAmount = Obj.getAttribute(AMOUNT); + if(ObjAmount > Amount){ + Change(Obj, AMOUNT, (ObjAmount - Amount)); + Amount = 0; + }else{ + DeleteObject(Obj); + Amount -= ObjAmount; + } + }else if(ObjType.getFlag(CONTAINER)){ + Amount = DeleteCoins(Obj, Type, Amount); + } + Obj = Next; + } + return Amount; +} + +static void CreateMoney(Object Con, int Amount){ + int Crystal = (Amount / 10000); + int Platinum = (Amount % 10000) / 100; + int Gold = (Amount % 10000) % 100; + + while(Crystal > 0){ + int StackAmount = std::min(Crystal, 100); + CreateCoins(Con, GetSpecialObject(MONEY_TENTHOUSAND), StackAmount); + Crystal -= StackAmount; + } + + if(Platinum > 0){ + CreateCoins(Con, GetSpecialObject(MONEY_HUNDRED), Platinum); + } + + if(Gold > 0){ + CreateCoins(Con, GetSpecialObject(MONEY_ONE), Gold); + } +} + +static void DeleteMoney(Object Con, int Amount){ + int Crystal = CountObjects(GetFirstContainerObject(Con), GetSpecialObject(MONEY_TENTHOUSAND), 0); + int Platinum = CountObjects(GetFirstContainerObject(Con), GetSpecialObject(MONEY_HUNDRED), 0); + int Gold = CountObjects(GetFirstContainerObject(Con), GetSpecialObject(MONEY_ONE), 0); + CalculateChange(Amount, &Gold, &Platinum, &Crystal); + + if(Gold > 0){ + DeleteCoins(Con, GetSpecialObject(MONEY_ONE), Gold); + }else if(Gold < 0){ + CreateCoins(Con, GetSpecialObject(MONEY_ONE), -Gold); + } + + if(Platinum > 0){ + DeleteCoins(Con, GetSpecialObject(MONEY_HUNDRED), Platinum); + }else if(Platinum < 0){ + CreateCoins(Con, GetSpecialObject(MONEY_HUNDRED), -Platinum); + } + + ASSERT(Crystal >= 0); + if(Crystal > 0){ + DeleteCoins(Con, GetSpecialObject(MONEY_TENTHOUSAND), Crystal); + } +} + +static Object CreateTempDepot(void){ + // TODO(fusion): All house processing functions use this temporary box placed + // at the starting position in Rookgaard when loading player depots. It could + // be problematic in the wrong circumstances (mostly exceptions) but doing + // it differently at this point would just increase complexity. We just need + // to make sure this box is destroyed at the end of any house processing. + int TempX, TempY, TempZ; + GetStartPosition(&TempX, &TempY, &TempZ, true); + Object TempDepot = SetObject(GetMapContainer(TempX, TempY, TempZ), + GetSpecialObject(DEPOT_LOCKER), 0); + return TempDepot; +} + +// NOTE(fusion): This is used inside house processing functions to empty the depot +// container after processing a player's depot. +static void DeleteContainerObjects(Object Con){ + Object Obj = GetFirstContainerObject(Con); + while(Obj != NONE){ + Object Next = Obj.getNextObject(); + DeleteObject(Obj); + Obj = Next; + } +} + +void CleanField(int x, int y, int z, Object Depot){ + if(Depot == NONE){ + error("CleanField: Depot-Box existiert nicht.\n"); + return; + } + + Object Obj = GetFirstObject(x, y, z); + while(Obj != NONE){ + Object Next = Obj.getNextObject(); + ObjectType ObjType = Obj.getObjectType(); + + if(ObjType.getFlag(NAMEDOOR) && ObjType.getFlag(TEXT)){ + // TODO(fusion): I don't think we even set `EDITOR` for name doors + // at all. We're also using `Change` which notifies clients, whereas + // below we're using non notifying functions like `MoveObject` and + // `DeleteObject`. + DeleteDynamicString(Obj.getAttribute(TEXTSTRING)); + DeleteDynamicString(Obj.getAttribute(EDITOR)); + Change(Obj, TEXTSTRING, 0); + Change(Obj, EDITOR, 0); + } + + if(!ObjType.getFlag(UNMOVE) && ObjType.getFlag(TAKE)){ + MoveObject(Obj, Depot); + }else{ + if(ObjType.getFlag(CONTAINER)){ + Object Help = GetFirstContainerObject(Obj); + while(Help != NONE){ + Object HelpNext = Help.getNextObject(); + MoveObject(Help, Depot); + Help = HelpNext; + } + } + + if(!ObjType.getFlag(UNMOVE)){ + DeleteObject(Obj); + } + } + + Obj = Next; + } +} + +void CleanHouse(THouse *House, TPlayerData *PlayerData){ + if(House == NULL){ + error("CleanHouse: house ist NULL.\n"); + return; + } + + if(House->OwnerID == 0){ + error("CleanHouse: Haus %d hat keinen Besitzer.\n", House->ID); + return; + } + + bool PlayerDataAssigned = false; + if(PlayerData == NULL){ + PlayerData = AssignPlayerPoolSlot(House->OwnerID, false); + if(PlayerData == NULL){ + error("CleanHouse: Kann keinen Slot für Spielerdaten zuweisen.\n"); + return; + } + + PlayerDataAssigned = true; + } + + Object TempDepot = CreateTempDepot(); + LoadDepot(PlayerData, House->DepotNr, TempDepot); + + int MinX = House->CenterX - MaxHouseX; + int MaxX = House->CenterX + MaxHouseX; + int MinY = House->CenterY - MaxHouseY; + int MaxY = House->CenterY + MaxHouseY; + int MinZ = SectorZMin; + int MaxZ = SectorZMax; + for(int FieldZ = MinZ; FieldZ <= MaxZ; FieldZ += 1) + for(int FieldY = MinY; FieldY <= MaxY; FieldY += 1) + for(int FieldX = MinX; FieldX <= MaxX; FieldX += 1){ + bool HouseField = (GetHouseID(FieldX, FieldY, FieldZ) == House->ID); + + if(!HouseField && CoordinateFlag(FieldX, FieldY, FieldZ, HOOKSOUTH)){ + HouseField = (GetHouseID(FieldX - 1, FieldY + 1, FieldZ) == House->ID + || GetHouseID(FieldX, FieldY + 1, FieldZ) == House->ID + || GetHouseID(FieldX + 1, FieldY + 1, FieldZ) == House->ID); + } + + if(!HouseField && CoordinateFlag(FieldX, FieldY, FieldZ, HOOKEAST)){ + HouseField = (GetHouseID(FieldX + 1, FieldY - 1, FieldZ) == House->ID + || GetHouseID(FieldX + 1, FieldY, FieldZ) == House->ID + || GetHouseID(FieldX + 1, FieldY + 1, FieldZ) == House->ID); + } + + if(HouseField){ + CleanField(FieldX, FieldY, FieldZ, TempDepot); + } + } + + SaveDepot(PlayerData, House->DepotNr, TempDepot); + DeleteObject(TempDepot); + + if(PlayerDataAssigned){ + ReleasePlayerPoolSlot(PlayerData); + } +} + +void ClearHouse(THouse *House){ + House->OwnerID = 0; + House->OwnerName[0] = 0; + House->Subowners = 0; + House->Guests = 0; +} + +bool FinishAuctions(void){ + Log("houses","Bearbeite beendete Auktionen...\n"); + + // TODO(fusion): It could be worse. + int NumberOfAuctions = Houses; + uint16 *HouseIDs = (uint16*)alloca(NumberOfAuctions * sizeof(uint16)); + uint32 *CharacterIDs = (uint32*)alloca(NumberOfAuctions * sizeof(uint32)); + char (*CharacterNames)[30] = (char(*)[30])alloca(NumberOfAuctions * 30); + int *Bids = (int*)alloca(NumberOfAuctions * sizeof(int)); + int Ret = QueryManagerConnection->finishAuctions(&NumberOfAuctions, + HouseIDs, CharacterIDs, CharacterNames, Bids); + if(Ret != 0){ + error("FinishAuctions: Kann Versteigerungen nicht ermitteln.\n"); + return false; + } + + // TODO(fusion): `AddSlashes` will add escape slashes so it should probably + // be called `EscapeString` or something similar. + char HelpWorld[60]; + AddSlashes(HelpWorld, WorldName); + + int TimeStamp = (int)time(NULL); + Object TempDepot = CreateTempDepot(); + for(int AuctionNr = 0; AuctionNr < NumberOfAuctions; AuctionNr += 1){ + uint16 HouseID = HouseIDs[AuctionNr]; + uint32 CharacterID = CharacterIDs[AuctionNr]; + const char *CharacterName = CharacterNames[AuctionNr]; + int Bid = Bids[AuctionNr]; + + Log("houses", "Auktion für Haus %d beendet: Ersteigert von %s für %d Gold.\n", + HouseID, CharacterName, Bid); + Log("houses", "bei Reset: INSERT INTO HouseAssignments VALUES ('%s',%d,%d,%d);\n", + HelpWorld, HouseID, CharacterID, Bid); + + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("FinishAuctions: Haus mit Nummer %d existiert nicht.\n", + HouseID); + continue; + } + + if(House->OwnerID != 0){ + error("FinishAuctions: Haus mit Nummer %d gehört schon Charakter %u.\n", + HouseID, House->OwnerID); + continue; + } + + TPlayerData *PlayerData = AssignPlayerPoolSlot(CharacterID, false); + if(PlayerData == NULL){ + error("FinishAuctions: Kann keinen Slot für Spielerdaten zuweisen.\n"); + continue; + } + + LoadDepot(PlayerData, House->DepotNr, TempDepot); + int DepotMoney = CountMoney(GetFirstContainerObject(TempDepot)); + if(DepotMoney < (House->Rent + Bid)){ + Log("houses", "Ersteigerer hat nicht genügend Geld.\n"); + House->OwnerID = CharacterID; + strcpy(House->OwnerName, CharacterName); + House->PaidUntil = 0; + }else{ + Log("houses", "Ersteigerer hat genügend Geld.\n"); + DeleteMoney(TempDepot, (House->Rent + Bid)); + + char WelcomeMessage[500]; + snprintf(WelcomeMessage, sizeof(WelcomeMessage), + "Welcome!\n" + "\n" + "Congratulations on your choice\n" + "for house \"%s\".\n" + "The rent for the first month\n" + "has already been debited to your\n" + "depot. The next rent will be\n" + "payable in thirty days.\n" + "Have a good time in your new home!", + House->Name); + Object WelcomeLetter = SetObject(TempDepot, GetSpecialObject(LETTER_STAMPED), 0); + ChangeObject(WelcomeLetter, TEXTSTRING, AddDynamicString(WelcomeMessage)); + SaveDepot(PlayerData, House->DepotNr, TempDepot); + + House->OwnerID = CharacterID; + strcpy(House->OwnerName, CharacterName); + House->LastTransition = TimeStamp; + House->PaidUntil = TimeStamp + (30 * 24 * 60 * 60); // one month + } + + DeleteContainerObjects(TempDepot); + ReleasePlayerPoolSlot(PlayerData); + } + + DeleteObject(TempDepot); + + for(int HouseNr = 0; HouseNr < Houses; HouseNr += 1){ + THouse *H = House.at(HouseNr); + if(H->PaidUntil == 0 && H->OwnerID != 0){ + if(QueryManagerConnection->excludeFromAuctions(H->OwnerID, true) != 0){ + error("FinishAuctions: Kann Ersteigerer nicht verbannen.\n"); + } + + ClearHouse(H); + } + } + + return true; +} + +bool TransferHouses(void){ + Log("houses", "Bearbeite freiwillige Kündigungen...\n"); + int NumberOfTransfers = Houses; + uint16 *HouseIDs = (uint16*)alloca(NumberOfTransfers * sizeof(uint16)); + uint32 *NewOwnerIDs = (uint32*)alloca(NumberOfTransfers * sizeof(uint32)); + char (*NewOwnerNames)[30] = (char(*)[30])alloca(NumberOfTransfers * 30); + int *Prices = (int*)alloca(NumberOfTransfers * sizeof(int)); + int Ret = QueryManagerConnection->transferHouses(&NumberOfTransfers, + HouseIDs, NewOwnerIDs, NewOwnerNames, Prices); + if(Ret != 0){ + error("CollectRents: Kann Kündigungen nicht ermitteln.\n"); + return false; + } + + char HelpWorld[60]; + AddSlashes(HelpWorld, WorldName); + + int TimeStamp = (int)time(NULL); + Object TempDepot = CreateTempDepot(); + for(int TransferNr = 0; TransferNr < NumberOfTransfers; TransferNr += 1){ + uint16 HouseID = HouseIDs[TransferNr]; + uint32 NewOwnerID = NewOwnerIDs[TransferNr]; + const char *NewOwnerName = NewOwnerNames[TransferNr]; + int TransferPrice = Prices[TransferNr]; + + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("CollectRents: Haus mit Nummer %d existiert nicht.\n", HouseID); + continue; + } + + if(NewOwnerID != 0 && TransferPrice > 0){ + Log("houses", "Verkaufe Haus %d an %u für %d Gold.\n", + HouseID, NewOwnerID, TransferPrice); + TPlayerData *PlayerData = AssignPlayerPoolSlot(NewOwnerID, false); + if(PlayerData == NULL){ + error("CollectRents: Kann keinen Slot für Spielerdaten zuweisen (1a).\n"); + continue; + } + + LoadDepot(PlayerData, House->DepotNr, TempDepot); + int DepotMoney = CountMoney(GetFirstContainerObject(TempDepot)); + if(DepotMoney < TransferPrice){ + Log("houses", "Käufer hat nicht genügend Geld.\n"); + + char WarningMessage[500]; + snprintf(WarningMessage, sizeof(WarningMessage), + "Warning!\n" + "\n" + "You have not enough gold to pay\n" + "the price for house \"%s\".\n" + "Therefore the transfer is cancelled.", + House->Name); + Object WarningLetter = SetObject(TempDepot, GetSpecialObject(LETTER_STAMPED), 0); + ChangeObject(WarningLetter, TEXTSTRING, AddDynamicString(WarningMessage)); + SaveDepot(PlayerData, House->DepotNr, TempDepot); + DeleteContainerObjects(TempDepot); + ReleasePlayerPoolSlot(PlayerData); + + Log("houses", "bei Reset: UPDATE HouseOwners SET Termination=null,NewOwner=null,Accepted=0,Price=null WHERE World=\'%s\' AND HouseID=%d;\n", + HelpWorld, HouseID); + QueryManagerConnection->cancelHouseTransfer(HouseID); + continue; + } + + DeleteMoney(TempDepot, TransferPrice); + SaveDepot(PlayerData, House->DepotNr, TempDepot); + DeleteContainerObjects(TempDepot); + ReleasePlayerPoolSlot(PlayerData); + + PlayerData = AssignPlayerPoolSlot(House->OwnerID, false); + if(PlayerData == NULL){ + error("CollectRents: Kann keinen Slot für Spielerdaten zuweisen (1b).\n"); + continue; + } + + LoadDepot(PlayerData, House->DepotNr, TempDepot); + CreateMoney(TempDepot, TransferPrice); + SaveDepot(PlayerData, House->DepotNr, TempDepot); + DeleteContainerObjects(TempDepot); + ReleasePlayerPoolSlot(PlayerData); + } + + // TODO(fusion): The old owner needs to manually move out when transfering + // to a new owner? + Log("houses", "Räume Haus %d von %u.\n", HouseID, House->OwnerID); + if(NewOwnerID == 0){ + CleanHouse(House, NULL); + } + + ClearHouse(House); + House->Help = 1; + + if(NewOwnerID != 0){ + Log("houses", "Übertrage Haus %d an %u.\n", HouseID, NewOwnerID); + House->OwnerID = NewOwnerID; + strcpy(House->OwnerName, NewOwnerName); + House->LastTransition = TimeStamp; + Log("houses", "bei Reset: UPDATE HouseOwners SET Termination=%d,NewOwner=%u,Accepted=1,Price=%d WHERE World='%s' AND HouseID=%d;\n", + TimeStamp, NewOwnerID, TransferPrice, HelpWorld, HouseID); + }else{ + Log("houses", "bei Reset: UPDATE HouseOwners SET Termination=%d,NewOwner=null,Accepted=0,Price=0 WHERE World=\'%s\' AND HouseID=%d;\n", + TimeStamp, HelpWorld, HouseID); + } + } + + DeleteObject(TempDepot); + return true; +} + +bool EvictFreeAccounts(void){ + int NumberOfEvictions = Houses; + uint16 *HouseIDs = (uint16*)alloca(NumberOfEvictions * sizeof(uint16)); + uint32 *OwnerIDs = (uint32*)alloca(NumberOfEvictions * sizeof(uint32)); + int Ret = QueryManagerConnection->evictFreeAccounts(&NumberOfEvictions, HouseIDs, OwnerIDs); + if(Ret == 0){ + error("CollectRents: Kann Zahlungsdaten nicht ermitteln.\n"); + return false; + } + + for(int EvictionNr = 0; EvictionNr < NumberOfEvictions; EvictionNr += 1){ + uint16 HouseID = HouseIDs[EvictionNr]; + uint32 OwnerID = OwnerIDs[EvictionNr]; + + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("CollectRents: Haus mit Nummer %d existiert nicht.\n", HouseID); + continue; + } + + Log("houses", "Account von Haus %d ist nicht mehr bezahlt.\n", HouseID); + if(OwnerID != House->OwnerID){ + Log("houses", "... aber Haus wurde eben noch übertragen.\n"); + continue; + } + + CleanHouse(House, NULL); + ClearHouse(House); + House->Help = 1; + } + + return true; +} + +bool EvictDeletedCharacters(void){ + int NumberOfEvictions = Houses; + uint16 *HouseIDs = (uint16*)alloca(NumberOfEvictions * sizeof(uint16)); + int Ret = QueryManagerConnection->evictDeletedCharacters(&NumberOfEvictions, HouseIDs); + if(Ret == 0){ + error("CollectRents: Kann gelöschte Charaktere nicht ermitteln.\n"); + return false; + } + + for(int EvictionNr = 0; EvictionNr < NumberOfEvictions; EvictionNr += 1){ + uint16 HouseID = HouseIDs[EvictionNr]; + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("CollectRents: Haus mit Nummer %d existiert nicht.\n", HouseID); + continue; + } + + Log("houses", "Besitzer von Haus %d ist gelöscht.\n", HouseID); + CleanHouse(House, NULL); + ClearHouse(House); + House->Help = 1; + } + + return true; +} + +bool EvictExGuildLeaders(void){ + int NumberOfGuildHouses = 0; + uint16 *HouseIDs = (uint16*)alloca(Houses * sizeof(uint16)); + uint32 *GuildLeaders = (uint32*)alloca(Houses * sizeof(uint32)); + for(int HouseNr = 0; HouseNr < Houses; HouseNr += 1){ + THouse *H = House.at(HouseNr); + if(H->GuildHouse && H->OwnerID != 0){ + HouseIDs[NumberOfGuildHouses] = H->ID; + GuildLeaders[NumberOfGuildHouses] = H->OwnerID; + NumberOfGuildHouses += 1; + } + } + + if(NumberOfGuildHouses > 0){ + int NumberOfEvictions; + int Ret = QueryManagerConnection->evictExGuildleaders( + NumberOfGuildHouses, &NumberOfEvictions, HouseIDs, GuildLeaders); + if(Ret == 0){ + error("CollectRents: Kann Gildenränge nicht ermitteln.\n"); + return false; + } + + for(int EvictionNr = 0; EvictionNr < NumberOfEvictions; EvictionNr += 1){ + uint16 HouseID = HouseIDs[EvictionNr]; + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("CollectRents: Haus mit Nummer %d existiert nicht.\n", HouseID); + continue; + } + + Log("houses", "Mieter von Gildenhaus %d ist kein Gildenführer mehr.\n", HouseID); + CleanHouse(House, NULL); + ClearHouse(House); + House->Help = 1; + } + } + + return true; +} + +void CollectRent(void){ + Log("houses", "Treibe Mieten ein...\n"); + int TimeStamp = (int)time(NULL); + Object TempDepot = CreateTempDepot(); + for(int HouseNr = 0; HouseNr < Houses; HouseNr += 1){ + THouse *H = House.at(HouseNr); + if(H->OwnerID == 0 || H->PaidUntil > TimeStamp){ + continue; + } + + Log("houses", "Treibe Miete für Haus %d von %u ein.\n", H->ID, H->OwnerID); + + int Deadline = H->PaidUntil + (7 * 24 * 60 * 60); // 1 week notice + // TODO(fusion): How is `PaymentExtension` set? This doesn't make a lot of sense. + if(Deadline < PaymentExtension){ + Deadline = PaymentExtension; + } + + TPlayerData *PlayerData = AssignPlayerPoolSlot(H->OwnerID, false); + if(PlayerData == NULL){ + error("CollectRents: Kann keinen Slot für Spielerdaten zuweisen (2).\n"); + continue; + } + + LoadDepot(PlayerData, H->DepotNr, TempDepot); + int DepotMoney = CountMoney(GetFirstContainerObject(TempDepot)); + if(DepotMoney < H->Rent){ + if(TimeStamp < Deadline){ + Log("houses", "Mieter erhält Mahnung.\n"); + + char WarningMessage[500]; + int DaysLeft = 1 + ((Deadline - TimeStamp - 3600) / 86400); + snprintf(WarningMessage, sizeof(WarningMessage), + "Warning!\n" + "\n" + "The monthly rent of %d gold\n" + "for your house \"%s\"\n" + "is payable. Have it available\n" + "within %d day%s, or you will\n" + "lose this house.", + H->Rent, H->Name, DaysLeft, (DaysLeft != 1 ? "s" : "")); + Object WarningLetter = SetObject(TempDepot, GetSpecialObject(LETTER_STAMPED), 0); + ChangeObject(WarningLetter, TEXTSTRING, AddDynamicString(WarningMessage)); + SaveDepot(PlayerData, H->DepotNr, TempDepot); + }else{ + Log("houses", "Mieter wird hinausgeworfen.\n"); + + if(QueryManagerConnection->excludeFromAuctions(H->OwnerID, false) != 0){ + error("CollectRents: Kann Mieter nicht verbannen.\n"); + } + + CleanHouse(H, PlayerData); + ClearHouse(H); + } + }else{ + Log("houses", "Mieter hat genügend Geld.\n"); + DeleteMoney(TempDepot, H->Rent); + SaveDepot(PlayerData, H->DepotNr, TempDepot); + H->PaidUntil += 30 * 24 * 60 * 60; // one month + } + + DeleteContainerObjects(TempDepot); + ReleasePlayerPoolSlot(PlayerData); + } + DeleteObject(TempDepot); +} + +void ProcessRent(void){ + for(int HouseNr = 0; HouseNr < Houses; HouseNr += 1){ + House.at(HouseNr)->Help = 0; + } + + // TODO(fusion): These functions were all inlined here but each one did some + // stack allocation and it was a complete mess. I'd assume they were using + // variable length arrays instead of `alloca` which makes sense but it's not + // widely supported in C++. + if(!TransferHouses() + || !EvictFreeAccounts() + || !EvictDeletedCharacters() + || !EvictExGuildLeaders()){ + return; + } + + for(int HouseNr = 0; HouseNr < Houses; HouseNr += 1){ + THouse *H = House.at(HouseNr); + if(H->Help == 1){ + if(QueryManagerConnection->deleteHouseOwner(H->ID) != 0){ + error("CollectRents: Kann Haus %d nicht aus HouseOwners austragen.\n", H->ID); + } + } + } + + CollectRent(); +} + + +bool StartAuctions(void){ + Log("houses", "Starte neue Versteigerungen...\n"); + + int NumberOfAuctions = Houses; + uint16 *HouseIDs = (uint16*)alloca(NumberOfAuctions * sizeof(uint16)); + int Ret = QueryManagerConnection->getAuctions(&NumberOfAuctions, HouseIDs); + if(Ret != 0){ + error("StartAuctions: Kann laufende Versteigerungen nicht ermitteln.\n"); + return false; + } + + for(int HouseNr = 0; HouseNr < Houses; HouseNr += 1){ + House.at(HouseNr)->Help = 0; + } + + for(int AuctionNr = 0; AuctionNr < NumberOfAuctions; AuctionNr += 1){ + THouse *House = GetHouse(HouseIDs[AuctionNr]); + if(House == NULL){ + error("StartAuctions: Haus mit Nummer %d existiert nicht (1).\n", HouseIDs[AuctionNr]); + continue; + } + + House->Help = 1; + } + + char HelpWorld[60]; + AddSlashes(HelpWorld, WorldName); + for(int HouseNr = 0; HouseNr < Houses; HouseNr += 1){ + THouse *H = House.at(HouseNr); + if(H->OwnerID == 0 && H->Help == 0 && !H->NoAuction){ + Log("houses", "Trage Haus %d zur Versteigerung ein.\n", H->ID); + Log("houses", "bei Reset: DELETE FROM Auctions WHERE World=\'%s\' AND HouseID=%d;\n", + HelpWorld, H->ID); + if(QueryManagerConnection->startAuction(H->ID) != 0){ + error("StartAuctions: Kann Haus %d nicht zur Versteigerung eintragen.\n", H->ID); + } + } + } + + return true; +} + +bool UpdateHouseOwners(void){ + int NumberOfOwners = Houses; + uint16 *HouseIDs = (uint16*)alloca(NumberOfOwners * sizeof(uint16)); + uint32 *OwnerIDs = (uint32*)alloca(NumberOfOwners * sizeof(uint32)); + char (*OwnerNames)[30] = (char(*)[30])alloca(NumberOfOwners * 30); + int *PaidUntils = (int*)alloca(NumberOfOwners * sizeof(int)); + int Ret = QueryManagerConnection->getHouseOwners(&NumberOfOwners, + HouseIDs, OwnerIDs, OwnerNames, PaidUntils); + if(Ret != 0){ + error("StartAuctions: Kann eingetragene vermietete Häuser nicht ermitteln.\n"); + return false; + } + + for(int HouseNr = 0; HouseNr < Houses; HouseNr += 1){ + House.at(HouseNr)->Help = 0; + } + + for(int OwnerNr = 0; OwnerNr < NumberOfOwners; OwnerNr += 1){ + THouse *House = GetHouse(HouseIDs[OwnerNr]); + if(House == NULL){ + error("StartAuctions: Haus mit Nummer %d existiert nicht (2).\n", HouseIDs[OwnerNr]); + continue; + } + + if(House->OwnerID == OwnerIDs[OwnerNr] && House->PaidUntil == PaidUntils[OwnerNr]){ + House->Help = 1; + }else{ + House->Help = 2; + } + } + + Log("houses", "Aktualisiere Liste der Mieter...\n"); + for(int HouseNr = 0; HouseNr < Houses; HouseNr += 1){ + THouse *H = House.at(HouseNr); + + if(H->OwnerID == 0 && H->Help != 0){ + Log("houses", "Trage nicht mehr vermietetes Haus %d aus.\n", H->ID); + if(QueryManagerConnection->deleteHouseOwner(H->ID) != 0){ + error("StartAuctions: Kann nicht mehr vermietetes Haus %d nicht austragen.\n", H->ID); + } + } + + if(H->OwnerID != 0 && H->Help == 0){ + Log("houses", "Trage vermietetes Haus %d ein.\n", H->ID); + if(QueryManagerConnection->insertHouseOwner(H->ID, H->OwnerID, H->PaidUntil) != 0){ + error("StartAuctions: Kann vermietetes Haus %d nicht eintragen.\n", H->ID); + } + } + + if(H->Help == 2){ + Log("houses", "Aktualisiere vermietetes Haus %d.\n", H->ID); + if(QueryManagerConnection->updateHouseOwner(H->ID, H->OwnerID, H->PaidUntil) != 0){ + error("StartAuctions: Kann Daten des vermieteten Hauses %d nicht aktualisieren.\n", H->ID); + } + } + } + + return true; +} + +void PrepareHouseCleanup(void){ + HelpDepots = 0; +} + +void FinishHouseCleanup(void){ + for(int HelpDepotNr = 0; HelpDepotNr < HelpDepots; HelpDepotNr += 1){ + THelpDepot *Help = HelpDepot.at(HelpDepotNr); + TPlayerData *PlayerData = AssignPlayerPoolSlot(Help->CharacterID, false); + if(PlayerData == NULL){ + error("FinishHouseCleanup: Kann keinen Slot für Spielerdaten zuweisen.\n"); + continue; + } + + SaveDepot(PlayerData, Help->DepotNr, Help->Box); + DeleteObject(Help->Box); + ReleasePlayerPoolSlot(PlayerData); + } + + HelpDepots = 0; +} + +void CleanHouseField(int x, int y, int z){ + uint16 HouseID = GetHouseID(x, y, z); + + if(HouseID == 0 && CoordinateFlag(x, y, z, HOOKSOUTH)){ + HouseID = GetHouseID(x, y + 1, z); + + if(HouseID == 0){ + HouseID = GetHouseID(x - 1, y + 1, z); + } + + if(HouseID == 0){ + HouseID = GetHouseID(x + 1, y + 1, z); + } + } + + if(HouseID == 0 && CoordinateFlag(x, y, z, HOOKEAST)){ + HouseID = GetHouseID(x + 1, y, z); + + if(HouseID == 0){ + HouseID = GetHouseID(x + 1, y - 1, z); + } + + if(HouseID == 0){ + HouseID = GetHouseID(x + 1, y + 1, z); + } + } + + if(HouseID == 0){ + error("CleanHouseField: Kein Haus zu Feld [%d,%d,%d] gefunden.\n", x, y, z); + return; + } + + THouse *House = GetHouse(HouseID); + if(House == NULL || House->OwnerID == 0){ + return; + } + + int HelpDepotNr = 0; + while(HelpDepotNr < HelpDepots){ + THelpDepot *Help = HelpDepot.at(HelpDepotNr); + if(Help->CharacterID == House->OwnerID && Help->DepotNr == House->DepotNr){ + break; + } + HelpDepotNr += 1; + } + + if(HelpDepotNr >= HelpDepots){ + TPlayerData *PlayerData = AssignPlayerPoolSlot(House->OwnerID, false); + if(PlayerData == NULL){ + error("CleanHouseField: Kann keinen Slot für Spielerdaten zuweisen.\n"); + return; + } + + HelpDepotNr = HelpDepots; + HelpDepots += 1; + + THelpDepot *Help = HelpDepot.at(HelpDepotNr); + Help->CharacterID = House->OwnerID; + Help->DepotNr = House->DepotNr; + Help->Box = CreateTempDepot(); + LoadDepot(PlayerData, House->DepotNr, Help->Box); + ReleasePlayerPoolSlot(PlayerData); + } + + CleanField(x, y, z, HelpDepot.at(HelpDepotNr)->Box); +} + +void LoadHouseAreas(void){ + Log("houses", "Lade Daten der Häusergebiete...\n"); + + char FileName[4096]; + snprintf(FileName, sizeof(FileName), "%s/houseareas.dat", DATAPATH); + if(!FileExists(FileName)){ + Log("houses", "Keine Daten für Häusergebiete gefunden.\n"); + return; + } + + TReadScriptFile Script; + Script.open(FileName); + while(true){ + Script.nextToken(); + if(Script.Token == ENDOFFILE){ + Script.close(); + break; + } + + // TODO(fusion): Any identifier? Seems that `Area` is used so we should + // probably check that?. + //if(strcmp(Script.getIdentifier(), "area") != 0){ + // Script.error("area expected"); + //} + Script.getIdentifier(); + + THouseArea *Area = HouseArea.at(HouseAreas); + Script.readSymbol('='); + Script.readSymbol('('); + Area->ID = (uint16)Script.readNumber(); + Script.readSymbol(','); + Script.readNumber(); // area name + Script.readSymbol(','); + Area->SQMPrice = Script.readNumber(); + Script.readSymbol(','); + Area->DepotNr = Script.readNumber(); + Script.readSymbol(')'); + HouseAreas += 1; + } +} + +void LoadHouses(void){ + Log("houses", "Lade Häuserdaten...\n"); + + Houses = 0; + MaxHouseX = 0; + MaxHouseY = 0; + + char FileName[4096]; + snprintf(FileName, sizeof(FileName), "%s/houses.dat", DATAPATH); + if(!FileExists(FileName)){ + Log("houses", "Keine Häuserdaten gefunden.\n"); + return; + } + + TReadScriptFile Script; + Script.open(FileName); + while(true){ + Script.nextToken(); + if(Script.Token == ENDOFFILE){ + Script.close(); + break; + } + + // TODO(fusion): We expect house fields to be in an exact order and the + // identifiers don't matter at all. For whatever reason these feel precarious + // when compared to other loaders. + + Script.getIdentifier(); // "id" + Script.readSymbol('='); + uint16 HouseID = (uint16)Script.readNumber(); + if(HouseID == 0){ + error("LoadHouses: Ungültige ID %d.\n", HouseID); + throw "cannot load houses"; + } + + if(Houses > 0 && HouseID <= House.at(Houses - 1)->ID){ + error("LoadHouses: IDs nicht aufsteigend sortiert (ID=%d).\n", HouseID); + throw "cannot load houses"; + } + + THouse *H = House.at(Houses); + H->ID = HouseID; + + Script.readIdentifier(); // "name" + Script.readSymbol('='); + strcpy(H->Name, Script.readString()); + + Script.readIdentifier(); // "description" + Script.readSymbol('='); + strcpy(H->Description, Script.readString()); + + Script.readIdentifier(); // "rentoffset" + Script.readSymbol('='); + int RentOffset = Script.readNumber(); + + Script.readIdentifier(); // "area" + Script.readSymbol('='); + uint16 AreaID = (uint16)Script.readNumber(); + THouseArea *Area = GetHouseArea(AreaID); + if(Area == NULL){ + error("LoadHouses: Gebiet für Haus %d existiert nicht.\n", HouseID); + throw "cannot load houses"; + } + H->DepotNr = Area->DepotNr; + + Script.readIdentifier(); // "guildhouse" + Script.readSymbol('='); + H->GuildHouse = (strcmp(Script.readIdentifier(), "true") == 0); + + H->NoAuction = false; + + Script.readIdentifier(); // "exit" + Script.readSymbol('='); + Script.readCoordinate(&H->ExitX, &H->ExitY, &H->ExitZ); + if(H->ExitX == 0){ + error("LoadHouses: Ausgang für Haus %d nicht gesetzt.\n", HouseID); + } + + Script.readIdentifier(); // "center" + Script.readSymbol('='); + Script.readCoordinate(&H->CenterX, &H->CenterY, &H->CenterZ); + if(H->CenterX == 0){ + // TODO(fusion): Same error message as above? + error("LoadHouses: Ausgang für Haus %d nicht gesetzt.\n", HouseID); + } + + Script.readIdentifier(); // "fields" + Script.readSymbol('='); + Script.readSymbol('{'); + while(true){ + Script.nextToken(); + if(Script.Token == SPECIAL){ + if(Script.getSpecial() == '}'){ + break; + }else if(Script.getSpecial() == ','){ + continue; + } + } + + int FieldX, FieldY, FieldZ; + Script.getCoordinate(&FieldX, &FieldY, &FieldZ); + SetHouseID(FieldX, FieldY, FieldZ, HouseID); + H->Size += 1; + + int RadiusX = std::abs(FieldX - H->CenterX); + int RadiusY = std::abs(FieldY - H->CenterY); + + if(RadiusX > MaxHouseX){ + MaxHouseX = RadiusX; + } + + if(RadiusY > MaxHouseY){ + MaxHouseY = RadiusY; + } + } + + H->Rent = Area->SQMPrice * H->Size + RentOffset; + H->OwnerID = 0; + H->OwnerName[0] = 0; + H->LastTransition = 0; + H->PaidUntil = 0; + H->Subowners = 0; + H->Guests = 0; + + Houses += 1; + } + + uint16 *HouseIDs = (uint16*)alloca(Houses * sizeof(uint16)); + char **Names = (char**)alloca(Houses * sizeof(char*)); + int *Rents = (int*)alloca(Houses * sizeof(int)); + char **Descriptions = (char**)alloca(Houses * sizeof(char*)); + int *Sizes = (int*)alloca(Houses * sizeof(int)); + int *PositionsX = (int*)alloca(Houses * sizeof(int)); + int *PositionsY = (int*)alloca(Houses * sizeof(int)); + int *PositionsZ = (int*)alloca(Houses * sizeof(int)); + char (*Towns)[30] = (char(*)[30])alloca(Houses * 30); + bool *Guildhouses = (bool*)alloca(Houses * sizeof(bool)); + for(int HouseNr = 0; HouseNr < Houses; HouseNr += 1){ + THouse *H = House.at(HouseNr); + HouseIDs[HouseNr] = H->ID; + Names[HouseNr] = H->Name; + Rents[HouseNr] = H->Rent; + Descriptions[HouseNr] = H->Description; + Sizes[HouseNr] = H->Size; + PositionsX[HouseNr] = H->CenterX; + PositionsY[HouseNr] = H->CenterY; + PositionsZ[HouseNr] = H->CenterZ; + strcpy(Towns[HouseNr], GetDepotName(H->DepotNr)); + Guildhouses[HouseNr] = H->GuildHouse; + } + + int QueryBufferSize = Houses * 600; + if(QueryBufferSize < (int)KB(16)){ + QueryBufferSize = (int)KB(16); + } + + QueryManagerConnection = new TQueryManagerConnection(QueryBufferSize); + int Ret = QueryManagerConnection->insertHouses(Houses, HouseIDs, Names, Rents, + Descriptions, Sizes, PositionsX, PositionsY, PositionsZ, Towns, Guildhouses); + if(Ret != 0){ + error("LoadHouses: Kann Stammdaten der Häuser nicht eintragen.\n"); + } +} + +void LoadOwners(void){ + Log("houses", "Lade Mieterdaten...\n"); + + PaymentExtension = 0; + bool ClearGuests = false; + bool ClearBeds = false; + + char FileName[4096]; + snprintf(FileName, sizeof(FileName), "%s/owners.dat", DATAPATH); + if(!FileExists(FileName)){ + Log("houses", "Keine Mieterdaten gefunden.\n"); + return; + } + + TReadScriptFile Script; + Script.open(FileName); + while(true){ + Script.nextToken(); + if(Script.Token == ENDOFFILE){ + Script.close(); + break; + } + + const char *Identifier = Script.getIdentifier(); + if(strcmp(Identifier, "extension") == 0){ + Script.readSymbol('='); + PaymentExtension = Script.readNumber(); + }else if(strcmp(Identifier, "clearguests") == 0){ + ClearGuests = true; + }else if(strcmp(Identifier, "clearbeds") == 0){ + ClearBeds = true; + }else if(strcmp(Identifier, "id") == 0){ + Script.readSymbol('='); + uint16 HouseID = (uint16)Script.readNumber(); + THouse *House = GetHouse(HouseID); + if(House == NULL){ + error("LoadOwners: Haus zu ID %d existiert nicht.", HouseID); + throw "Cannot load owners"; + } + + Script.readIdentifier(); // "owner" + Script.readSymbol('='); + House->OwnerID = (uint32)Script.readNumber(); + + Script.readIdentifier(); // "lasttransition" + Script.readSymbol('='); + House->LastTransition = Script.readNumber(); + + Script.readIdentifier(); // "paiduntil" + Script.readSymbol('='); + House->PaidUntil = Script.readNumber(); + + Script.readIdentifier(); // "guests" + Script.readSymbol('='); + Script.readSymbol('{'); + while(true){ + Script.nextToken(); + if(Script.Token == SPECIAL){ + if(Script.getSpecial() == '}'){ + break; + }else if(Script.getSpecial() == ','){ + continue; + } + } + + strcpy(House->Guest.at(House->Guests)->Name, Script.readString()); + House->Guests += 1; + } + + Script.readIdentifier(); // "subowners" + Script.readSymbol('='); + Script.readSymbol('{'); + while(true){ + Script.nextToken(); + if(Script.Token == SPECIAL){ + if(Script.getSpecial() == '}'){ + break; + }else if(Script.getSpecial() == ','){ + continue; + } + } + + strcpy(House->Subowner.at(House->Subowners)->Name, Script.readString()); + House->Subowners += 1; + } + + if(ClearGuests){ + House->Guests = 0; + } + }else{ + Script.error("Unknown identifier"); + } + } + + int NumberOfOwners = Houses; + uint16 *HouseIDs = (uint16*)alloca(NumberOfOwners * sizeof(uint16)); + uint32 *OwnerIDs = (uint32*)alloca(NumberOfOwners * sizeof(uint32)); + char (*OwnerNames)[30] = (char(*)[30])alloca(NumberOfOwners * 30); + int *PaidUntils = (int*)alloca(NumberOfOwners * sizeof(int)); + int Ret = QueryManagerConnection->getHouseOwners(&NumberOfOwners, + HouseIDs, OwnerIDs, OwnerNames, PaidUntils); + if(Ret != 0){ + error("LoadOwners: Kann Namen der Mieter nicht ermitteln.\n"); + throw "Cannot load owners"; + } + + for(int OwnerNr = 0; OwnerNr < NumberOfOwners; OwnerNr += 1){ + THouse *House = GetHouse(HouseIDs[OwnerNr]); + if(House == NULL){ + error("LoadOwners: Haus %d existiert nicht.\n", HouseIDs[OwnerNr]); + continue; + } + + if(House->OwnerID != 0){ + strcpy(House->OwnerName, OwnerNames[OwnerNr]); + } + } + + if(ClearBeds){ + print(1, "Räume alle Betten...\n"); + + for(int HouseNr = 0; HouseNr < Houses; HouseNr += 1){ + THouse *H = House.at(HouseNr); + int MinX = H->CenterX - MaxHouseX; + int MaxX = H->CenterX + MaxHouseX; + int MinY = H->CenterY - MaxHouseY; + int MaxY = H->CenterY + MaxHouseY; + int MinZ = SectorZMin; + int MaxZ = SectorZMax; + for(int FieldZ = MinZ; FieldZ <= MaxZ; FieldZ += 1) + for(int FieldY = MinY; FieldY <= MaxY; FieldY += 1) + for(int FieldX = MinX; FieldX <= MaxX; FieldX += 1){ + Object Bed = GetFirstObject(FieldX, FieldY, FieldZ); + while(Bed != NONE){ + if(Bed.getObjectType().getFlag(BED)){ + break; + } + Bed = Bed.getNextObject(); + } + + if(Bed != NONE && Bed.getAttribute(TEXTSTRING) != 0){ + try{ + UseObjects(0, Bed, Bed); + }catch(RESULT r){ + error("LoadOwners: Exception %d beim Aufräumen eines Bettes.\n", r); + } + } + } + } + } +} + +void SaveOwners(void){ + char FileName[4096]; + snprintf(FileName, sizeof(FileName), "%s/owners.dat", DATAPATH); + + TWriteScriptFile Script; + Script.open(FileName); + + if(PaymentExtension > (int)time(NULL)){ + Script.writeText("Extension = "); + Script.writeNumber(PaymentExtension); + Script.writeLn(); + Script.writeLn(); + } + + for(int HouseNr = 0; HouseNr < Houses; HouseNr += 1){ + THouse *H = House.at(HouseNr); + if(H->OwnerID == 0){ + continue; + } + + Script.writeText("ID = "); + Script.writeNumber((int)H->ID); + Script.writeLn(); + + Script.writeText("Owner = "); + Script.writeNumber((int)H->OwnerID); + Script.writeLn(); + + Script.writeText("LastTransition = "); + Script.writeNumber((int)H->LastTransition); + Script.writeLn(); + + Script.writeText("PaidUntil = "); + Script.writeNumber((int)H->PaidUntil); + Script.writeLn(); + + Script.writeText("Guests = {"); + for(int i = 0; i < H->Guests; i += 1){ + if(i > 0){ + Script.writeText(","); + } + Script.writeString(H->Guest.at(i)->Name); + } + Script.writeText("}"); + Script.writeLn(); + + Script.writeText("Subowners = {"); + for(int i = 0; i < H->Subowners; i += 1){ + if(i > 0){ + Script.writeText(","); + } + Script.writeString(H->Subowner.at(i)->Name); + } + Script.writeText("}"); + Script.writeLn(); + + Script.writeLn(); + } + + Script.close(); +} + +void ProcessHouses(void){ + FinishAuctions(); + ProcessRent(); + if(StartAuctions()){ + UpdateHouseOwners(); + } +} + +void InitHouses(void){ + // TODO(fusion): Connect to query manager HERE then pass the connection around + // house initialization and processing functions. It is currently connecting in + // `LoadHouses`, used by other functions, then deleted at the end of this function. + //TQueryManagerConnection QueryManagerConnection(QueryBufferSize); + + InitLog("houses"); + LoadHouseAreas(); + LoadHouses(); + LoadOwners(); + ProcessHouses(); + delete QueryManagerConnection; +} + +void SaveHouses(void){ + SaveOwners(); +} diff --git a/src/houses.hh b/src/houses.hh new file mode 100644 index 0000000..9326e65 --- /dev/null +++ b/src/houses.hh @@ -0,0 +1,104 @@ +#ifndef TIBIA_HOUSES_HH_ +#define TIBIA_HOUSES_HH_ 1 + +#include "common.hh" +#include "containers.hh" +#include "cr.hh" +#include "map.hh" + +#define MAX_HOUSE_GUEST_NAME 60 + +struct THelpDepot { + uint32 CharacterID; + Object Box; + int DepotNr; +}; + +struct THouseArea { + uint16 ID; + int SQMPrice; + int DepotNr; +}; + +struct THouseGuest { + char Name[MAX_HOUSE_GUEST_NAME]; +}; + +struct THouse { + THouse(void) : Subowner(0, 4, 5), Guest(0, 9, 10) {} + + // TODO(fusion): Same as `TChannel` in `operate.hh`. + THouse(const THouse &Other); + void operator=(const THouse &Other); + + // DATA + // ================= + uint16 ID; + char Name[50]; + char Description[500]; + int Size; + int Rent; + int DepotNr; + bool NoAuction; + bool GuildHouse; + int ExitX; + int ExitY; + int ExitZ; + int CenterX; + int CenterY; + int CenterZ; + uint32 OwnerID; + char OwnerName[30]; + int LastTransition; + int PaidUntil; + vector Subowner; + int Subowners; + vector Guest; + int Guests; + int Help; +}; + +THouseArea *GetHouseArea(uint16 ID); +int CheckAccessRight(const char *Rule, TPlayer *Player); +THouse *GetHouse(uint16 ID); +bool IsOwner(uint16 HouseID, TPlayer *Player); +bool IsSubowner(uint16 HouseID, TPlayer *Player, int TimeStamp); +bool IsGuest(uint16 HouseID, TPlayer *Player, int TimeStamp); +bool IsInvited(uint16 HouseID, TPlayer *Player, int TimeStamp); +const char *GetHouseName(uint16 HouseID); +const char *GetHouseOwner(uint16 HouseID); +void ShowSubownerList(uint16 HouseID, TPlayer *Player, char *Buffer); +void ShowGuestList(uint16 HouseID, TPlayer *Player, char *Buffer); +void ChangeSubowners(uint16 HouseID, TPlayer *Player, const char *Buffer); +void ChangeGuests(uint16 HouseID, TPlayer *Player, const char *Buffer); +void GetExitPosition(uint16 HouseID, int *x, int *y, int *z); +void KickGuest(uint16 HouseID, TPlayer *Guest); +void KickGuest(uint16 HouseID, TPlayer *Host, TPlayer *Guest); +void KickGuests(uint16 HouseID); +bool MayOpenDoor(Object Door, TPlayer *Player); +void ShowNameDoor(Object Door, TPlayer *Player, char *Buffer); +void ChangeNameDoor(Object Door, TPlayer *Player, const char *Buffer); +void CleanField(int x, int y, int z, Object Depot); +void CleanHouse(THouse *House, TPlayerData *PlayerData); +void ClearHouse(THouse *House); +bool FinishAuctions(void); +bool TransferHouses(void); +bool EvictFreeAccounts(void); +bool EvictDeletedCharacters(void); +bool EvictExGuildLeaders(void); +void CollectRent(void); +void ProcessRent(void); +bool StartAuctions(void); +bool UpdateHouseOwners(void); +void PrepareHouseCleanup(void); +void FinishHouseCleanup(void); +void CleanHouseField(int x, int y, int z); +void LoadHouseAreas(void); +void LoadHouses(void); +void LoadOwners(void); +void SaveOwners(void); +void ProcessHouses(void); +void InitHouses(void); +void SaveHouses(void); + +#endif //TIBIA_HOUSES_HH_ diff --git a/src/info.cc b/src/info.cc index 13e777f..fa01ecb 100644 --- a/src/info.cc +++ b/src/info.cc @@ -777,9 +777,8 @@ bool SearchFreeField(int *x, int *y, int *z, int Distance, uint16 HouseID, bool } if(MovePossible){ - if(HouseID == HOUSEID_ANY - || !IsHouse(FieldX, FieldY, FieldZ) - || GetHouseID(FieldX, FieldY, FieldZ) == HouseID){ + if(HouseID == 0xFFFF || !IsHouse(FieldX, FieldY, FieldZ) + || (HouseID != 0 && GetHouseID(FieldX, FieldY, FieldZ) == HouseID)){ *x = FieldX; *y = FieldY; return true; @@ -831,7 +830,7 @@ static bool LoginPossible(int x, int y, int z, uint16 HouseID, bool Player){ return false; } - if(IsHouse(x, y, z) && GetHouseID(x, y, z) != HouseID){ + if(IsHouse(x, y, z) && (HouseID == 0 || GetHouseID(x, y, z) != HouseID)){ return false; } @@ -938,7 +937,7 @@ bool SearchSpawnField(int *x, int *y, int *z, int Distance, bool Player){ int FieldX = *x + OffsetX; int FieldY = *y + OffsetY; int FieldZ = *z; - if(IsHouse(FieldX, FieldY, FieldZ) && GetHouseID(FieldX, FieldY, FieldZ) != HouseID){ + if(IsHouse(FieldX, FieldY, FieldZ) && (HouseID == 0 || GetHouseID(FieldX, FieldY, FieldZ) != HouseID)){ continue; } diff --git a/src/info.hh b/src/info.hh index 8972276..154eb65 100644 --- a/src/info.hh +++ b/src/info.hh @@ -4,14 +4,6 @@ #include "common.hh" #include "map.hh" -// TODO(fusion): Probably move to `houses.hh` when we implement it? -constexpr uint16 HOUSEID_ANY = 0xFFFF; -enum HouseList: uint8 { - GUESTLIST = 1, - SUBOWNERLIST = 2, - DOORLIST = 3, -}; - const char *GetLiquidName(int LiquidType); uint8 GetLiquidColor(int LiquidType); const char *GetName(Object Obj); diff --git a/src/magic.cc b/src/magic.cc index e268a7d..1282e5d 100644 --- a/src/magic.cc +++ b/src/magic.cc @@ -1426,7 +1426,7 @@ void Teleport(TCreature *Actor, const char *Param){ int DestX = Actor->posx; int DestY = Actor->posy; int DestZ = Actor->posz; - uint16 HouseID = HOUSEID_ANY; + uint16 HouseID = 0xFFFF; // NOTE(fusion): See `SearchFreeField`. int MDGoStrength = Actor->Skills[SKILL_GO_STRENGTH]->MDAct; if(stricmp(Param, "up") == 0){ diff --git a/src/query.hh b/src/query.hh index e518b69..0db66cc 100644 --- a/src/query.hh +++ b/src/query.hh @@ -20,6 +20,29 @@ struct TQueryManagerConnection{ char (*BuddyNames)[30], uint8 *Rights, bool *PremiumAccountActivated); void decrementIsOnline(uint32 CharacterID); + int insertHouses(int NumberOfHouses, uint16 *HouseIDs, char **Names, + int *Rents, char **Descriptions, int *Sizes, int *PositionsX, + int *PositionsY, int *PositionsZ, char (*Towns)[30], bool *Guildhouses); + + int finishAuctions(int *NumberOfAuctions, uint16 *HouseIDs, + uint32 *CharacterIDs, char (*CharacterNames)[30], int *Bids); + int excludeFromAuctions(uint32 CharacterIDs, bool Banish); + + int transferHouses(int *NumberOfTransfers, uint16 *HouseIDs, + uint32 *NewOwnerIDs, char (*NewOwnerNames) [30], int *Prices); + int cancelHouseTransfer(uint16 HouseID); + int evictFreeAccounts(int *NumberOfEvictions, uint16 *HouseIDs, uint32 *OwnerIDs); + int evictDeletedCharacters(int *NumberOfEvictions, uint16 *HouseIDs); + int evictExGuildleaders(int NumberOfGuildhouses, int *NumberOfEvictions, + uint16 *HouseIDs, uint32 *Guildleaders); + int deleteHouseOwner(uint16 HouseID); + + int getAuctions(int *NumberOfAuctions, uint16 *HouseIDs); + int startAuction(uint16 HouseID); + int getHouseOwners(int *NumberOfHouses, uint16 *HouseIDs, + uint32 *OwnerIDs, char (*OwnerNames)[30], int *PaidUntils); + int insertHouseOwner(uint16 HouseID, uint32 OwnerID, int PaidUntil); + int updateHouseOwner(uint16 HouseID, uint32 OwnerID, int PaidUntil); bool isConnected(void){ return this->Socket >= 0; -- cgit v1.2.3