diff --git a/Memory.xml b/Memory.xml index a315c4e8b..eadeba4f3 100644 --- a/Memory.xml +++ b/Memory.xml @@ -3002,6 +3002,7 @@ + WORLD: 0x93f77a0 Address name="vector" value="0x0940b174" diff --git a/library/DFContext.cpp b/library/DFContext.cpp index 03542aad1..ca633f786 100644 --- a/library/DFContext.cpp +++ b/library/DFContext.cpp @@ -116,6 +116,10 @@ bool Context::Resume() } bool Context::ForceResume() { + for(unsigned int i = 0 ; i < d->allModules.size(); i++) + { + d->allModules[i]->OnResume(); + } return d->p->forceresume(); } bool Context::isSuspended() diff --git a/library/modules/Maps.cpp b/library/modules/Maps.cpp index 9f57a6966..14ee72ae4 100644 --- a/library/modules/Maps.cpp +++ b/library/modules/Maps.cpp @@ -639,6 +639,10 @@ bool Maps::StopFeatures() } return false; } +typedef uint32_t _DWORD; +typedef uint8_t _BYTE; +#define BYTEn(x, n) (*((_BYTE*)&(x)+n)) +#define BYTE4(x) BYTEn(x, 4) bool Maps::StartFeatures() { @@ -679,6 +683,34 @@ bool Maps::StartFeatures() for(uint32_t blockX = 0; blockX < d->x_block_count; blockX ++) for(uint32_t blockY = 0; blockY < d->x_block_count; blockY ++) { + int16_t zz; // bx@1 + signed int xx; // edx@2 + signed int yy; // edi@4 + int v7; // eax@7 + int block; // ebx@8 + int designation; // eax@9 + int32_t x_cooked_; // eax@11 + int16_t y_cooked; // dx@11 + int loc_f_array16x16; // esi@11 + int64_t x_esquare; // qax@11 + int64_t x_cooked; // si@11 + int64_t y_esquare; // qax@11 + int v16; // eax@12 + int local_f_idx; // edx@12 + int v18; // eax@12 + int result; // eax@14 + int v20; // ebx@17 + int designation_; // [sp+14h] [bp+4h]@9 + x_esquare = blockX / 3 + d->regionX; // *(_DWORD *)(WORLD + 0x55720); + x_cooked = ((BYTE4(x_esquare) & 0xF) + (_DWORD)x_esquare) >> 4; + y_esquare = blockY / 3 + d->regionY; + y_cooked = ((BYTE4(y_esquare) & 0xF) + (_DWORD)y_esquare) >> 4; + x_cooked_ = x_cooked; + uint32_t array_elem = p->readDWord(base + 4 * (x_cooked >> 4)); + loc_f_array16x16 = p->readDWord((y_cooked & 0xFFFFFFF0) + 4 + array_elem); + +/* + // region X coord (48x48 tiles) uint16_t region_x_local = ( (blockX / 3) + d->regionX ) / 16; // region Y coord (48x48 tiles) @@ -688,11 +720,16 @@ bool Maps::StartFeatures() uint32_t array_elem = p->readDWord(base + (region_x_local / 16) * 4); // 16B structs, second DWORD of the struct is a pointer - uint32_t loc_f_array16x16 = p->readDWord(array_elem + ( sizeof_elem * ( (uint32_t)region_y_local/16)) + offset_elem); + uint32_t loc_f_array16x16 = p->readDWord(array_elem + + ( sizeof_elem * ( (uint32_t)region_y_local/16)) + + offset_elem); + */ if(loc_f_array16x16) { // wtf + sizeof(vector) * crap; - uint32_t feat_vector = loc_f_array16x16 + sizeof_vec * (16 * (region_x_local % 16) + (region_y_local % 16)); + //uint32_t feat_vector = loc_f_array16x16 + sizeof_vec * (16 * (region_x_local % 16) + (region_y_local % 16)); + uint32_t feat_vector = loc_f_array16x16 + sizeof_vec/*16*/ * (y_cooked % 16 + 16 * x_cooked_ % 16); + //loc_f_array16x16 + sizeof_vec * (16 * (x_cooked % 16) + (region_y_local % 16)); DfVector p_features(p, feat_vector); uint32_t size = p_features.size(); DFCoord pc(blockX,blockY); diff --git a/tools/supported/probe.cpp b/tools/supported/probe.cpp index f9954df9d..c35fb8904 100644 --- a/tools/supported/probe.cpp +++ b/tools/supported/probe.cpp @@ -70,11 +70,7 @@ int main (int numargs, const char ** args) p->readDWord (region_y_offset, (uint32_t &)regionY); p->readDWord (region_z_offset, (uint32_t &)regionZ); - vector global_features; - std::map > local_features; - - bool have_local = Maps->ReadLocalFeatures(local_features); - bool have_global = Maps->ReadGlobalFeatures(global_features); + bool have_features = Maps->StartFeatures(); int32_t cursorX, cursorY, cursorZ; Gui->getCursorCoords(cursorX,cursorY,cursorZ); @@ -172,26 +168,33 @@ int main (int numargs, const char ** args) PRINT_FLAG( rained ); DFCoord pc(blockX, blockY); - PRINT_FLAG( feature_local ); - - if( des.feature_local && have_local ) + + if(have_features) { - printf("%-16s %4d (%2d) %s\n", "", - block.local_feature, - local_features[pc][block.local_feature]->type, - sa_feature(local_features[pc][block.local_feature]->type) - ); + t_feature * local = 0; + t_feature * global = 0; + Maps->ReadFeatures(&(b->raw),&local,&global); + PRINT_FLAG( feature_local ); + if(local) + { + printf("%-16s", ""); + printf(" %4d", block.local_feature); + printf(" (%2d)", local->type); + printf(" %s\n", sa_feature(local->type)); + } + PRINT_FLAG( feature_global ); + if(global) + { + printf("%-16s", ""); + printf(" %4d", block.global_feature); + printf(" (%2d)", global->type); + printf(" %s\n", sa_feature(global->type)); + } } - - PRINT_FLAG( feature_global ); - - if( des.feature_global && have_global ) + else { - printf("%-16s %4d (%2d) %s\n", "", - block.global_feature, - global_features[block.global_feature].type, - sa_feature(global_features[block.global_feature].type) - ); + PRINT_FLAG( feature_local ); + PRINT_FLAG( feature_global ); } #undef PRINT_FLAG cout << "local feature idx: " << block.local_feature << endl;