diff options
| author | fusion32 <marcopuzziello@gmail.com> | 2025-06-29 18:25:23 -0300 |
|---|---|---|
| committer | fusion32 <marcopuzziello@gmail.com> | 2025-06-29 18:25:23 -0300 |
| commit | c09d30cb144ce421ef0e1a786d2965f9abcde0aa (patch) | |
| tree | 877611a3837996b9acddc5eaa8d30a9aa4424955 | |
| parent | e59667ec6be0a21ce702ce077154357a1c7f7c04 (diff) | |
| download | game-c09d30cb144ce421ef0e1a786d2965f9abcde0aa.tar.gz game-c09d30cb144ce421ef0e1a786d2965f9abcde0aa.zip | |
`houses.cc`
| -rw-r--r-- | Makefile | 8 | ||||
| -rw-r--r-- | TODO.md | 7 | ||||
| -rw-r--r-- | reference/game.c | 5432 | ||||
| -rw-r--r-- | reference/types.hh | 42 | ||||
| -rw-r--r-- | src/crnonpl.cc | 20 | ||||
| -rw-r--r-- | src/enums.hh | 6 | ||||
| -rw-r--r-- | src/houses.cc | 1909 | ||||
| -rw-r--r-- | src/houses.hh | 104 | ||||
| -rw-r--r-- | src/info.cc | 9 | ||||
| -rw-r--r-- | src/info.hh | 8 | ||||
| -rw-r--r-- | src/magic.cc | 2 | ||||
| -rw-r--r-- | src/query.hh | 23 |
12 files changed, 2067 insertions, 5503 deletions
@@ -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 $@ $< @@ -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<THouseArea>::operator()(&HouseArea,i_00);
- if (pTVar1->ID == ID) {
- pTVar1 = vector<THouseArea>::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<THouse>::operator()(&House,i);
- if (pTVar1->ID == ID) {
- pTVar1 = vector<THouse>::operator()(&House,i);
- return pTVar1;
- }
- pTVar1 = vector<THouse>::operator()(&House,i);
- iVar2 = i + 1;
- if (ID <= pTVar1->ID) {
- iVar2 = local_14;
- }
- pTVar1 = vector<THouse>::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<THouse> **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = &House;
- *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x8063385;
- pTVar8 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2),
- *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2));
- if (pTVar8->PaidUntil == 0) {
- *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = iVar7;
- *(vector<THouse> **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) = &House;
- *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80633b0;
- pTVar8 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2),
- *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2));
- if (pTVar8->OwnerID != 0) {
- *(int *)(&stack0xfffffcf8 + iVar12 + uVar11 * -2 + iVar2) = iVar7;
- *(vector<THouse> **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) =
- &House;
- *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80633ca;
- pTVar8 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&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<THouse> **)(&stack0xfffffcf4 + iVar12 + uVar11 * -2 + iVar2) =
- &House;
- *(undefined4 *)((int)&local_310 + iVar12 + uVar11 * -2 + iVar2) = 0x80633fd;
- pTVar8 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&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<THouse>::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<THouse> **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) =
- &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x806434e
- ;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x8064376;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x8064390;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x80643ad;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) =
- &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x8064223
- ;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x806424a;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x8064272;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)(aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) =
- &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = 0x8063d3b
- ;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x8063d72;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x8063d90;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (aiStack_330 +
- iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c),
- *(int *)(&stack0xfffffcb8 +
- iVar6 + iVar16 + uVar11 * -2 + iVar15));
- *(int *)(&stack0xfffffcb8 + iVar6 + iVar16 + uVar11 * -2 + iVar15) = iVar8;
- *(vector<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x8063da2;
- pTVar10 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x8063dd7;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x8063e14;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15)
- = 0x8063e51;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) = &House;
- *(undefined4 *)((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15)
- = 0x8063eb7;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (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<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) =
- &House;
- *(undefined4 *)
- ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x8063f42;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) =
- &House;
- *(undefined4 *)
- ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x8064012;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) =
- &House;
- *(undefined4 *)
- ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x80640dc;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) =
- &House;
- *(undefined4 *)
- ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x806410f;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) =
- &House;
- *(undefined4 *)
- ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x8064131;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) =
- &House;
- *(undefined4 *)
- ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x8064187;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) =
- &House;
- *(undefined4 *)
- ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x80641c1;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse> **)
- (aiStack_330 + iVar6 + iVar16 + uVar11 * -2 + iVar15 + -0x1c) =
- &House;
- *(undefined4 *)
- ((int)&local_350 + iVar6 + iVar16 + uVar11 * -2 + iVar15) =
- 0x80641f3;
- pTVar9 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse>::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<THouse> **)(&stack0xffffff74 + iVar9) = &House;
- *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8064fa7;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)(&stack0xffffff74 + iVar9),
- *(int *)(&stack0xffffff78 + iVar9));
- if (pTVar6->OwnerID == 0) {
- *(int *)(&stack0xffffff78 + iVar9) = iVar5;
- *(vector<THouse> **)(&stack0xffffff74 + iVar9) = &House;
- *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8064fd0;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)(&stack0xffffff74 + iVar9),
- *(int *)(&stack0xffffff78 + iVar9));
- if (pTVar6->Help == 0) {
- *(int *)(&stack0xffffff78 + iVar9) = iVar5;
- *(vector<THouse> **)(&stack0xffffff74 + iVar9) = &House;
- *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8064fea;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)(&stack0xffffff74 + iVar9),
- *(int *)(&stack0xffffff78 + iVar9));
- if (pTVar6->NoAuction == false) {
- *(int *)(&stack0xffffff78 + iVar9) = iVar5;
- *(vector<THouse> **)(&stack0xffffff74 + iVar9) = &House;
- *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8065003;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)(&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<THouse> **)(&stack0xffffff74 + iVar9) = &House;
- *(int *)(&stack0xffffff78 + iVar9) = iVar5;
- *(undefined4 *)((int)&uStack_90 + iVar9) = 0x806502e;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)(&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<THouse> **)(&stack0xffffff74 + iVar9) = &House;
- *(int *)(&stack0xffffff78 + iVar9) = iVar5;
- *(undefined4 *)((int)&uStack_90 + iVar9) = 0x806505d;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)(&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<THouse> **)(&stack0xffffff74 + iVar9) = &House;
- *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8065089;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)(&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<THouse> **)(&stack0xffffff74 + iVar9) = &House;
- *(undefined4 *)((int)&uStack_90 + iVar9) = 0x8064f83;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)(&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<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064c70;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c),
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c));
- if (pTVar6->OwnerID == 0) {
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13;
- *(vector<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064e60;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c),
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c));
- if (pTVar6->Help != 0) {
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13;
- *(vector<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) =
- &House;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064e7e
- ;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&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<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) =
- &House;
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064ea9
- ;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&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<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) =
- &House;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) =
- 0x8064ed5;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&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<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064c8e;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c),
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c));
- if (pTVar6->OwnerID != 0) {
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13;
- *(vector<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064d87;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c),
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c));
- if (pTVar6->Help == 0) {
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13;
- *(vector<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) =
- &House;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064da5
- ;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&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<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) =
- &House;
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064dd0
- ;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c),
- *(int *)(&stack0xffffff78 +
- iVar3 + iVar10 + iVar4 + 0x8c));
- *(vector<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) =
- &House;
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064de2
- ;
- pTVar7 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c),
- *(int *)(&stack0xffffff78 +
- iVar3 + iVar10 + iVar4 + 0x8c));
- *(vector<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) =
- &House;
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064df4
- ;
- pTVar8 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&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<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) =
- &House;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) =
- 0x8064e34;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&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<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064cac;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c),
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c));
- if (pTVar6->Help == 2) {
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13;
- *(vector<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064cd0;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&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<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House;
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064cfb;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c),
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c));
- *(vector<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House;
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064d0d;
- pTVar7 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c),
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c));
- *(vector<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) = &House;
- *(int *)(&stack0xffffff78 + iVar3 + iVar10 + iVar4 + 0x8c) = iVar13;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064d1f;
- pTVar8 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&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<THouse> **)(&stack0xffffff74 + iVar3 + iVar10 + iVar4 + 0x8c) =
- &House;
- *(undefined4 *)((int)&uStack_90 + iVar3 + iVar10 + iVar4 + 0x8c) = 0x8064d5f
- ;
- pTVar6 = vector<THouse>::operator()
- (*(vector<THouse> **)
- (&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<THelpDepot>::operator()(&HelpDepot,i_00);
- PlayerData_00 = AssignPlayerPoolSlot(pTVar1->CharacterID,false);
- if (PlayerData_00 == (TPlayerData *)0x0) {
- error(&DAT_080f4860);
- return;
- }
- pTVar1 = vector<THelpDepot>::operator()(&HelpDepot,i_00);
- local_2c[0].ObjectID = (pTVar1->Box).ObjectID;
- pTVar1 = vector<THelpDepot>::operator()(&HelpDepot,i_00);
- SaveDepot(PlayerData_00,pTVar1->DepotNr,local_2c);
- iVar2 = i_00 + 1;
- pTVar1 = vector<THelpDepot>::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<THelpDepot>::operator()(&HelpDepot,i);
- if ((pTVar3->CharacterID == pTVar2->OwnerID) &&
- (pTVar3 = vector<THelpDepot>::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<THelpDepot>::operator()(&HelpDepot,HelpDepots);
- pTVar3->CharacterID = pTVar2->OwnerID;
- pTVar3 = vector<THelpDepot>::operator()(&HelpDepot,HelpDepots);
- pTVar3->DepotNr = pTVar2->DepotNr;
- GetStartPosition((int *)&PlayerData,&sx,&sy,true);
- pTVar3 = vector<THelpDepot>::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<THelpDepot>::operator()(&HelpDepot,HelpDepots);
- sz = (pTVar3->Box).ObjectID;
- LoadDepot(PlayerData_00,pTVar2->DepotNr,(Object *)&sz);
- iVar4 = HelpDepots;
- ReleasePlayerPoolSlot(PlayerData_00);
- }
- pTVar3 = vector<THelpDepot>::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<THouseArea>::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<THouseArea>::operator()(&HouseArea,HouseAreas);
- iVar3 = TReadScriptFile::readNumber((TReadScriptFile *)local_4ffc);
- pTVar2->SQMPrice = iVar3;
- TReadScriptFile::readSymbol((TReadScriptFile *)local_4ffc,',');
- pTVar2 = vector<THouseArea>::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<THouse>::operator()(&House,Houses);
- uStack_5080 = 0x80658b0;
- iVar5 = TReadScriptFile::readNumber((TReadScriptFile *)&z);
- pTVar4->ID = (ushort)iVar5;
- uStack_5080 = 0x80658c8;
- pTVar4 = vector<THouse>::operator()(&House,Houses);
- if (pTVar4->ID == 0) {
- uStack_5080 = 0x8066056;
- pTVar4 = vector<THouse>::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<THouse>::operator()(&House,Houses);
- uStack_5080 = 0x8065903;
- pTVar6 = vector<THouse>::operator()(&House,Houses + -1);
- if (pTVar4->ID <= pTVar6->ID) {
- uStack_5080 = 0x8066023;
- pTVar4 = vector<THouse>::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<THouse>::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<THouse>::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<THouseArea>::operator()(&HouseArea,iVar11);
- if (pTVar8->ID == (ushort)iVar5) {
- uStack_5080 = 0x8066003;
- local_5018 = vector<THouseArea>::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<THouse>::operator()(&House,Houses);
- uVar12 = (uint)pTVar4->ID;
- uStack_5080 = 0x8065fbb;
- error(&DAT_080f4a00);
- goto LAB_08065fc4;
- }
- uStack_5080 = 0x8065a63;
- pTVar4 = vector<THouse>::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<THouse>::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<THouse>::operator()(&House,Houses);
- pTVar4->NoAuction = false;
- uStack_5080 = 0x8065af1;
- TReadScriptFile::readIdentifier((TReadScriptFile *)&z);
- uStack_5080 = 0x8065b07;
- TReadScriptFile::readSymbol((TReadScriptFile *)&z,'=');
- uStack_5080 = 0x8065b1c;
- vector<THouse>::operator()(&House,Houses);
- uStack_5080 = 0x8065b37;
- vector<THouse>::operator()(&House,Houses);
- uStack_5080 = 0x8065b52;
- vector<THouse>::operator()(&House,Houses);
- uStack_5080 = 0x8065b71;
- TReadScriptFile::readCoordinate((TReadScriptFile *)&z);
- uStack_5080 = 0x8065b86;
- pTVar4 = vector<THouse>::operator()(&House,Houses);
- if (pTVar4->ExitX == 0) {
- uStack_5080 = 0x8065f7b;
- vector<THouse>::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<THouse>::operator()(&House,Houses);
- uStack_5080 = 0x8065be2;
- vector<THouse>::operator()(&House,Houses);
- uStack_5080 = 0x8065bfd;
- vector<THouse>::operator()(&House,Houses);
- uStack_5080 = 0x8065c16;
- TReadScriptFile::readCoordinate((TReadScriptFile *)&z);
- uStack_5080 = 0x8065c2b;
- pTVar4 = vector<THouse>::operator()(&House,Houses);
- if (pTVar4->CenterX == 0) {
- uStack_5080 = 0x8065f4e;
- vector<THouse>::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<THouse>::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<THouse>::operator()(&House,Houses);
- uStack_5080 = 0x8065d3c;
- SetHouseID(local_5008,x,y,pTVar4->ID);
- uStack_5080 = 0x8065d51;
- pTVar4 = vector<THouse>::operator()(&House,Houses);
- pTVar4->Size = pTVar4->Size + 1;
- uStack_5080 = 0x8065d6c;
- pTVar4 = vector<THouse>::operator()(&House,Houses);
- uVar12 = local_5008 - pTVar4->CenterX;
- if (0x7fffffff < uVar12) {
- uVar12 = -uVar12;
- }
- if (MaxHouseX < (int)uVar12) {
- uStack_5080 = 0x8065e12;
- pTVar4 = vector<THouse>::operator()(&House,Houses);
- MaxHouseX = local_5008 - pTVar4->CenterX;
- if (0x7fffffff < (uint)MaxHouseX) {
- MaxHouseX = -MaxHouseX;
- }
- }
- uStack_5080 = 0x8065da1;
- pTVar4 = vector<THouse>::operator()(&House,Houses);
- uVar12 = x - pTVar4->CenterY;
- if (0x7fffffff < uVar12) {
- uVar12 = -uVar12;
- }
- if (MaxHouseY < (int)uVar12) {
- uStack_5080 = 0x8065dda;
- pTVar4 = vector<THouse>::operator()(&House,Houses);
- MaxHouseY = x - pTVar4->CenterY;
- if (0x7fffffff < (uint)MaxHouseY) {
- MaxHouseY = -MaxHouseY;
- }
- }
- }
- }
- uStack_5080 = 0x8065e4a;
- pTVar4 = vector<THouse>::operator()(&House,Houses);
- uStack_5080 = 0x8065e61;
- pTVar6 = vector<THouse>::operator()(&House,Houses);
- iVar5 = Houses;
- pTVar4->Rent = local_5018->SQMPrice * pTVar6->Size + local_5014;
- uStack_5080 = 0x8065e96;
- pTVar4 = vector<THouse>::operator()(&House,iVar5);
- pTVar4->OwnerID = 0;
- uStack_5080 = 0x8065eb3;
- pTVar4 = vector<THouse>::operator()(&House,Houses);
- pTVar4->OwnerName[0] = '\0';
- uStack_5080 = 0x8065ecf;
- pTVar4 = vector<THouse>::operator()(&House,Houses);
- pTVar4->LastTransition = 0;
- uStack_5080 = 0x8065eec;
- pTVar4 = vector<THouse>::operator()(&House,Houses);
- pTVar4->PaidUntil = 0;
- uStack_5080 = 0x8065f09;
- pTVar4 = vector<THouse>::operator()(&House,Houses);
- pTVar4->Subowners = 0;
- uStack_5080 = 0x8065f26;
- pcVar7 = (char *)Houses;
- pTVar4 = vector<THouse>::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<THouse> **)((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<THouse>::operator()
- (*(vector<THouse> **)
- ((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<THouse> **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10)
- = &House;
- *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) =
- 0x80661c6;
- pTVar4 = vector<THouse>::operator()
- (*(vector<THouse> **)
- ((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<THouse> **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10)
- = &House;
- *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) =
- 0x80661e2;
- pTVar4 = vector<THouse>::operator()
- (*(vector<THouse> **)
- ((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<THouse> **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10)
- = &House;
- *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) =
- 0x8066201;
- pTVar4 = vector<THouse>::operator()
- (*(vector<THouse> **)
- ((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<THouse> **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10)
- = &House;
- *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) =
- 0x806621d;
- pTVar4 = vector<THouse>::operator()
- (*(vector<THouse> **)
- ((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<THouse> **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10)
- = &House;
- *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) =
- 0x806623c;
- pTVar4 = vector<THouse>::operator()
- (*(vector<THouse> **)
- ((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<THouse> **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10)
- = &House;
- *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) =
- 0x806625b;
- pTVar4 = vector<THouse>::operator()
- (*(vector<THouse> **)
- ((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<THouse> **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10)
- = &House;
- *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) =
- 0x806627a;
- pTVar4 = vector<THouse>::operator()
- (*(vector<THouse> **)
- ((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<THouse> **)((int)local_506c + iVar1 + iVar5 + uVar12 * -7 + iVar11 + -0x10)
- = &House;
- *(undefined4 *)((int)&uStack_5080 + iVar1 + iVar5 + uVar12 * -7 + iVar11) =
- 0x8066299;
- pTVar4 = vector<THouse>::operator()
- (*(vector<THouse> **)
- ((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<THouse> **)((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<THouse>::operator()
- (*(vector<THouse> **)
- ((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<THouse> **)(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<THouse>::operator()
- (*(vector<THouse> **)
- (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<THouse>::operator()(&House,(int)pcVar5);
- if (pTVar2->OwnerID != 0) {
- TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,"ID = ");
- pTVar2 = vector<THouse>::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<THouse>::operator()(&House,(int)pcVar5);
- TWriteScriptFile::writeNumber((TWriteScriptFile *)local_202c,pTVar2->OwnerID);
- TWriteScriptFile::writeLn((TWriteScriptFile *)local_202c);
- TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,"LastTransition = ");
- pTVar2 = vector<THouse>::operator()(&House,(int)pcVar5);
- TWriteScriptFile::writeNumber((TWriteScriptFile *)local_202c,pTVar2->LastTransition)
- ;
- TWriteScriptFile::writeLn((TWriteScriptFile *)local_202c);
- TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,"PaidUntil = ");
- pTVar2 = vector<THouse>::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<THouse>::operator()(&House,(int)pcVar5),
- iVar4 < pTVar2->Guests; iVar4 = iVar4 + 1) {
- if (0 < iVar4) {
- TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,",");
- }
- pTVar2 = vector<THouse>::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<THouse>::operator()(&House,(int)pcVar5),
- iVar4 < pTVar2->Subowners; iVar4 = iVar4 + 1) {
- if (0 < iVar4) {
- TWriteScriptFile::writeText((TWriteScriptFile *)local_202c,",");
- }
- pTVar2 = vector<THouse>::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<THouseGuest> Subowner; - int Subowners; - struct vector<THouseGuest> 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<int>(Amount, 100); - CreateAtCreature(this->Interlocutor, Type, StackSize); - Amount -= StackSize; + int StackAmount = std::min<int>(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<THelpDepot> HelpDepot(0, 9, 10); +static int HelpDepots; + +static vector<THouseArea> HouseArea(0, 99, 50); +static int HouseAreas; + +static vector<THouse> 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<int>(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<THouseGuest> Subowner; + int Subowners; + vector<THouseGuest> 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; |
