aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfusion32 <marcopuzziello@gmail.com>2025-06-29 18:25:23 -0300
committerfusion32 <marcopuzziello@gmail.com>2025-06-29 18:25:23 -0300
commitc09d30cb144ce421ef0e1a786d2965f9abcde0aa (patch)
tree877611a3837996b9acddc5eaa8d30a9aa4424955
parente59667ec6be0a21ce702ce077154357a1c7f7c04 (diff)
downloadgame-c09d30cb144ce421ef0e1a786d2965f9abcde0aa.tar.gz
game-c09d30cb144ce421ef0e1a786d2965f9abcde0aa.zip
`houses.cc`
-rw-r--r--Makefile8
-rw-r--r--TODO.md7
-rw-r--r--reference/game.c5432
-rw-r--r--reference/types.hh42
-rw-r--r--src/crnonpl.cc20
-rw-r--r--src/enums.hh6
-rw-r--r--src/houses.cc1909
-rw-r--r--src/houses.hh104
-rw-r--r--src/info.cc9
-rw-r--r--src/info.hh8
-rw-r--r--src/magic.cc2
-rw-r--r--src/query.hh23
12 files changed, 2067 insertions, 5503 deletions
diff --git a/Makefile b/Makefile
index 8c7a22b..dca6a3c 100644
--- a/Makefile
+++ b/Makefile
@@ -13,9 +13,9 @@ else
CFLAGS += -O2
endif
-HEADERS = $(SRCDIR)/common.hh $(SRCDIR)/communication.hh $(SRCDIR)/config.hh $(SRCDIR)/connections.hh $(SRCDIR)/containers.hh $(SRCDIR)/cr.hh $(SRCDIR)/crypto.hh $(SRCDIR)/enums.hh $(SRCDIR)/info.hh $(SRCDIR)/magic.hh $(SRCDIR)/map.hh $(SRCDIR)/moveuse.hh $(SRCDIR)/objects.hh $(SRCDIR)/operate.hh $(SRCDIR)/query.hh $(SRCDIR)/script.hh $(SRCDIR)/stubs.hh $(SRCDIR)/threads.hh
+HEADERS = $(SRCDIR)/common.hh $(SRCDIR)/communication.hh $(SRCDIR)/config.hh $(SRCDIR)/connections.hh $(SRCDIR)/containers.hh $(SRCDIR)/cr.hh $(SRCDIR)/crypto.hh $(SRCDIR)/enums.hh $(SRCDIR)/houses.hh $(SRCDIR)/info.hh $(SRCDIR)/magic.hh $(SRCDIR)/map.hh $(SRCDIR)/moveuse.hh $(SRCDIR)/objects.hh $(SRCDIR)/operate.hh $(SRCDIR)/query.hh $(SRCDIR)/script.hh $(SRCDIR)/stubs.hh $(SRCDIR)/threads.hh
-$(BUILDDIR)/$(OUTPUTEXE): $(BUILDDIR)/communication.obj $(BUILDDIR)/config.obj $(BUILDDIR)/connections.obj $(BUILDDIR)/cract.obj $(BUILDDIR)/crcombat.obj $(BUILDDIR)/crmain.obj $(BUILDDIR)/crnonpl.obj $(BUILDDIR)/crplayer.obj $(BUILDDIR)/crskill.obj $(BUILDDIR)/crypto.obj $(BUILDDIR)/info.obj $(BUILDDIR)/magic.obj $(BUILDDIR)/main.obj $(BUILDDIR)/map.obj $(BUILDDIR)/moveuse.obj $(BUILDDIR)/objects.obj $(BUILDDIR)/operate.obj $(BUILDDIR)/query.obj $(BUILDDIR)/receiving.obj $(BUILDDIR)/script.obj $(BUILDDIR)/sending.obj $(BUILDDIR)/shm.obj $(BUILDDIR)/strings.obj $(BUILDDIR)/threads.obj $(BUILDDIR)/time.obj $(BUILDDIR)/utils.obj
+$(BUILDDIR)/$(OUTPUTEXE): $(BUILDDIR)/communication.obj $(BUILDDIR)/config.obj $(BUILDDIR)/connections.obj $(BUILDDIR)/cract.obj $(BUILDDIR)/crcombat.obj $(BUILDDIR)/crmain.obj $(BUILDDIR)/crnonpl.obj $(BUILDDIR)/crplayer.obj $(BUILDDIR)/crskill.obj $(BUILDDIR)/crypto.obj $(BUILDDIR)/houses.obj $(BUILDDIR)/info.obj $(BUILDDIR)/magic.obj $(BUILDDIR)/main.obj $(BUILDDIR)/map.obj $(BUILDDIR)/moveuse.obj $(BUILDDIR)/objects.obj $(BUILDDIR)/operate.obj $(BUILDDIR)/query.obj $(BUILDDIR)/receiving.obj $(BUILDDIR)/script.obj $(BUILDDIR)/sending.obj $(BUILDDIR)/shm.obj $(BUILDDIR)/strings.obj $(BUILDDIR)/threads.obj $(BUILDDIR)/time.obj $(BUILDDIR)/utils.obj
@echo $(CC) $(CFLAGS) $(LFLAGS) -o $@ $^
$(BUILDDIR)/communication.obj: $(SRCDIR)/communication.cc $(HEADERS)
@@ -58,6 +58,10 @@ $(BUILDDIR)/crypto.obj: $(SRCDIR)/crypto.cc $(HEADERS)
@mkdir -p $(@D)
$(CC) -c $(CFLAGS) -o $@ $<
+$(BUILDDIR)/houses.obj: $(SRCDIR)/houses.cc $(HEADERS)
+ @mkdir -p $(@D)
+ $(CC) -c $(CFLAGS) -o $@ $<
+
$(BUILDDIR)/info.obj: $(SRCDIR)/info.cc $(HEADERS)
@mkdir -p $(@D)
$(CC) -c $(CFLAGS) -o $@ $<
diff --git a/TODO.md b/TODO.md
index dce0e29..bc73f14 100644
--- a/TODO.md
+++ b/TODO.md
@@ -1,5 +1,4 @@
## TODO NEXT
-- HOUSES.CC <- GAME
- QUERY.CC
- READER.CC
- WRITER.CC
@@ -9,7 +8,8 @@
- The map container uses type id zero but it seems to also be used as a "no type"
id which makes me want to add some `isNone()`, `isNull()`, `isVoid()` check to
`ObjectType` to be used as an alias when pertinent.
-- Make some `TNonplayer` random step function? One version that does a random step and another that does a random step keeping some distance from a certain position.
+- Make some `TNonplayer` random step function? One version that does a random step
+ and another that does a random step keeping some distance from a certain position.
- I realized that `Change` with an `ObjectType` parameter was being called where
the version with `INSTANCEATTRIBUTE` parameter was expected due to `ObjectType`
@@ -17,7 +17,8 @@
all converting constructors explicit to avoid these types of errors, although
there aren't that many function overloads.
-- Define a few constants like `MAX_NAME_LENGTH`, `MAX_SKILLS`, and `MAX_OPEN_CONTAINERS` instead of relying on `NARRAY`.
+- Define a few constants like `MAX_NAME_LENGTH`, `MAX_SKILLS`, and `MAX_OPEN_CONTAINERS`
+ instead of relying on `NARRAY`.
## Stack allocations
Any functions that use `alloca` or some other form of dynamic stack allocations will cause decompiled functions to be an absolute mess. It usually shows up in the decompiled code as both a size computation like `-(VAR + CONST & 0xfffffff0)`, followed by some assignment. It doesn't make total sense without looking at the disassembly. I've encountered ~30 such computations and expect the functions containing them to be amongt the most challenging/annoying to be properly decompiled.
diff --git a/reference/game.c b/reference/game.c
index b6cd717..92c0837 100644
--- a/reference/game.c
+++ b/reference/game.c
@@ -3388,5438 +3388,6 @@ void __static_initialization_and_destruction_0(int __initialize_p,int __priority
return;
}
-
-
-THouseArea * GetHouseArea(ushort ID)
-
-{
- THouseArea *pTVar1;
- int i;
- int i_00;
-
- i_00 = 0;
- if (0 < HouseAreas) {
- do {
- pTVar1 = vector<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;