# Original code by Ralf @ GC-Forever and Aleron Ives # https://www.gc-forever.com/forums/viewtopic.php?t=2050 # https://www.gc-forever.com/forums/viewtopic.php?t=2049 # Xbox port by fuzziqersoftware # BB notes: # Currently beta quality, map objects that fade like boxes, and Pioneer's background billboards and elevators still # have regular draw distance. # TODO: 90% of stuff is included, bring home the last 10%. .meta visibility="all" .meta name="Draw Distance" .meta description="Extends the draw\ndistance of many\nobjects" entry_ptr: reloc0: .offsetof start .versions 3OJ2 3OJ3 3OJ4 3OJ5 3OE0 3OE1 3OE2 3OP0 start: .include WriteCodeBlocks .data 0x8000DFA0 .deltaof hook_start, hook_end .address 0x8000DFA0 hook_start: hook1: lfs f30, [r2 - ] fmuls f30, f30, f1 blr hook2: lfs f2, [r2 - ] lfs f0, [r30 + 0x001C] fmuls f0, f0, f2 blr hook3: lfs f28, [r2 - ] fmuls f28, f28, f2 blr hook4: lfs f0, [r2 - ] lfs f1, [r3 + 0x000C] fmuls f0, f0, f1 stfs [r3 + 0x000C], f0 lis r3, blr hook_end: .data .data 0x00000004 .address bl hook1 .data .data 0x00000004 .address bl hook2 .data .data 0x00000004 .address bl hook3 .data .data 0x00000004 .address bl hook1 .data .data 0x00000004 .address bl hook4 .data .data 0x00000004 .address bl hook4 .data .data 0x00000004 .float 90000 .data .data 0x00000004 .float 62500 .data .data 0x00000004 .float 640000 .data .data 0x00000004 .float 90000 .data .data 0x00000004 .float 1400 .data 0x00000000 .data 0x00000000 .versions 4OED 4OEU 4OJB 4OJD 4OJU 4OPD 4OPU start: .include WriteCodeBlocks .data # From 3OE1:80100B8C .deltaof p1_1s, p1_1e .address # From 3OE1:80100B8C p1_1s: call p1_2s nop p1_1e: .data .deltaof p1_2s, p1_2e .address p1_2s: fld st0, dword [esp + 0x1C] fadd st0, st0 fchs st0 ret p1_2e: .data # From 3OE1:80156AD8 .deltaof p2_1s, p2_1e .address # From 3OE1:80156AD8 p2_1s: call p2_2s p2_1e: .data .deltaof p2_2s, p2_2e .address p2_2s: fld st0, dword [ecx + 0x1C] fadd st0, st0 fld st0, st1 ret p2_2e: .data # From 3OE1:801A2040 .deltaof p3_1s, p3_1e .address # From 3OE1:801A2040 p3_1s: call p3_2s nop p3_1e: .data .deltaof p3_2s, p3_2e .address p3_2s: fld st0, dword [esp + 0x24] fadd st0, st0 fchs st0 ret p3_2e: .data # From 3OE1:801A2240 .deltaof p4_1s, p4_1e .address # From 3OE1:801A2240 p4_1s: call p4_2s nop p4_1e: .data .deltaof p4_2s, p4_2e .address p4_2s: fld st0, dword [esp + 0x28] fadd st0, st0 fchs st0 ret p4_2e: .data # From 3OE1:80205840 .deltaof p5_1s, p5_1e .address # From 3OE1:80205840 p5_1s: call p5_3s p5_1e: .data # From 3OE1:80205FE4 .deltaof p5_2s, p5_2e .address # From 3OE1:80205FE4 p5_2s: call p5_3s p5_2e: .data .deltaof p5_3s, p5_3e .address p5_3s: fld st0, dword [eax + 0x0C] fadd st0, st0 fstp dword [eax + 0x0C], st0 mov eax, [] ret p5_3e: .data # From 3OE1:805CFCD0 .data 0x00000004 .data 0x47AFC800 .data # From 3OE1:805D0B7C .data 0x00000004 .data 0x437A0000 .data # From 3OE1:805D11A4 .data 0x00000004 .data 0x491C4000 .data # From 3OE1:805D2030 .data 0x00000004 .data 0x47AFC800 .data # From 3OE1:805D25C0 .data 0x00000004 .data 0x44AF0000 .data # From 3OE1:805D25C0 .data 0x00000004 .data 0x44AF0000 .data 0x00000000 .data 0x00000000 .versions 59NJ 59NL write_call_func: .include WriteCallToCode start: mov eax, 0x41800000 # Environment clip distance mod 16.0f mov [], eax # This affects mostly static map objects mov [], eax mov [], eax mov ax, 0x9090 mov [], ax # Players draw distance 10000.0f always mov eax, 0x41000000 # Use newly acquired skipped branch room mov [], eax # to store our float multiplier call patch_func_1 # Floor items call patch_func_2 # Whole bunch of stuff, including NPCs call patch_func_3 # Duplicate function from above, reuse same hook call patch_func_4 # TODO: Which objects this affects? call patch_func_5 # TODO: This one too? call patch_func_6 # TODO: And this one? ret # Floor items patch_func_1: pop ecx push 8 push call get_code_size1 .deltaof patch_code1, patch_code_end1 get_code_size1: pop eax push dword [eax] call patch_code_end1 patch_code1: mov edx, [esp + 0x18] fld st0, dword [] fld st0, dword [esp + 0x14] fmulp st1, st0 ret patch_code_end1: push ecx jmp write_call_func # Whole bunch of stuff, including NPCs patch_func_2: pop ecx push 9 push call get_code_size2 .deltaof patch_code2, patch_code_end2 get_code_size2: pop eax push dword [eax] call patch_code_end2 patch_code2: test eax, 0x400 fld st0, dword [] fld st0, dword [esp + 0x2C] fmulp st1, st0 ret patch_code_end2: push ecx jmp write_call_func # Duplicate function from above, reuse same hook patch_func_3: mov eax, dword [] add eax, 0x002A1C74 mov dword [], eax mov byte [], 0xE8 mov dword [], 0x90909090 ret # TOComputerMachine01 patch_func_4: pop ecx push 7 push call get_code_size4 .deltaof patch_code4, patch_code_end4 get_code_size4: pop eax push dword [eax] call patch_code_end4 patch_code4: lea edx, [edi + 0x38] fld st0, dword [] fld st0, dword [esp + 0x14] fmulp st1, st0 ret patch_code_end4: push ecx jmp write_call_func # TObjCamera patch_func_5: pop ecx push 6 push call get_code_size5 .deltaof patch_code5, patch_code_end5 get_code_size5: pop eax push dword [eax] call patch_code_end5 patch_code5: fld st0, dword [] fld st0, dword [esp + 0x28] fmulp st1, st0 fchs st0 ret patch_code_end5: push ecx jmp write_call_func # TODO: And this one? patch_func_6: pop ecx push 6 push call get_code_size6 .deltaof patch_code6, patch_code_end6 get_code_size6: pop eax push dword [eax] call patch_code_end6 patch_code6: mov ebp, ecx fld st0, dword [] fld st0, dword [esp + 0x30] fmulp st1, st0 ret patch_code_end6: push ecx jmp write_call_func