Commit Graph

  • aad45bc751 [saco] Implement/match sub_100A5410; copying a VECTOR element wise avoids the scratch base register a struct assignment would need ricardoofnl 2026-09-05 08:28:53 +07:00
  • 83a6d7e517 [saco] Implement/match FUNC_100A2FC0 and FUNC_100A46F0; the flag clear masks with a literal 0xBF, ~0x40 would fit a sign extended imm8 ricardoofnl 2026-09-05 08:22:06 +07:00
  • 487ea99c5f [saco] Implement/match FUNC_100A3070, FUNC_100A4670, FUNC_100A4E20 and FUNC_100A5F30; the single add esp, 0x20 is MSVC pooling the cleanup of three __cdecl calls ricardoofnl 2026-09-05 08:08:06 +07:00
  • 75c7514fcc [saco] Implement/match FUNC_100A4DC0, FUNC_100A5570 and FUNC_100A5EB0; AddDebugMessage is variadic so its this is pushed as the leftmost argument ricardoofnl 2026-09-05 08:02:20 +07:00
  • 3bcd9ffbde [saco] Implement/match FUNC_100A41A0, FUNC_100A4340, FUNC_100A43B0, FUNC_100A4D40, FUNC_100A2F60 and FUNC_100A5530; the load-then-push argument pairs are asm, a C call would use push dword ptr ricardoofnl 2026-09-05 07:59:57 +07:00
  • 9b7439cb06 [saco] Implement/match the three plate raster helpers; the mov edx, 0x34/lea pair is hand written asm and the trailing return 0 is what keeps the zero path last ricardoofnl 2026-09-05 07:52:12 +07:00
  • 366fbef654 [saco] Implement/match eight naked hook stubs; the bare pushad/popad pair marks where a body was compiled out ricardoofnl 2026-09-05 07:46:45 +07:00
  • 27f52e5fbe [saco] Implement/match CPlayerPed::FUNC_100ACE90; the weapon out-parameter is a full int that only its low byte is tested through ricardoofnl 2026-09-05 08:35:13 +07:00
  • faee9024b8 [saco] Implement/match CPlayerPed::FUNC_100AEC50; the same argument-slot tail call, into FUNC_100AEB10 ricardoofnl 2026-09-05 08:35:09 +07:00
  • 56ef225874 [saco] Implement/match CPlayerPed::FUNC_100AEC10; the frame index goes back into the second argument slot, so the call tails into FUNC_100AEA80 ricardoofnl 2026-09-05 08:35:05 +07:00
  • bc954875b3 [saco] Implement/match CPlayerPed::FUNC_100AE1E0; split _gap2BD into field_2BD and lock the offset with a probe ricardoofnl 2026-09-05 08:18:13 +07:00
  • 133894cdf5 [saco] Implement/match CPlayerPed::FUNC_100AC6C0; the tasks local is initialised before its own test, so the store precedes the branch ricardoofnl 2026-09-05 08:14:23 +07:00
  • f6c6d653a2 [saco] Implement/match CPlayerPed::FUNC_100AEA30; the same clump lookup again, reading the third word ricardoofnl 2026-09-05 08:14:19 +07:00
  • 67d91f09e0 [saco] Implement/match CPlayerPed::FUNC_100AE9E0; the same clump lookup as FUNC_100AE990, reading the second word ricardoofnl 2026-09-05 08:14:13 +07:00
  • ba2861f0be [saco] Implement/match CPlayerPed::FUNC_100AE990; the clump lookup keeps the GTA address in its own local so the _asm can call through it ricardoofnl 2026-09-05 08:14:07 +07:00
  • b345b1b9c8 [saco] Implement/match CPlayerPed::FUNC_100AD080; the task pointer is cached for the _asm and reloaded through Tasks for the clear ricardoofnl 2026-09-05 08:10:34 +07:00
  • 55151572b6 [saco] Implement/match CPlayerPed::FUNC_100AE560; the first branch has its own epilogue, so it ends in an explicit return ricardoofnl 2026-09-05 08:10:27 +07:00
  • 1e23436cb7 [saco] Implement/match CPlayerPed::FUNC_100AEBB0; the locals are declared up front so the renderware store precedes the two constants ricardoofnl 2026-09-05 08:10:23 +07:00
  • 6164c3283b [saco] Implement/match CPlayerPed::FUNC_100AD3E0; the object teardown Destroy spells out inline, as its own function ricardoofnl 2026-09-05 08:10:18 +07:00
  • 226301087b [saco] Implement/match CPlayerPed::FUNC_100AD030; nesting the tests keeps mov eax, 1 instead of folding the compare into neg/sbb ricardoofnl 2026-09-05 08:10:14 +07:00
  • 7d27da3613 [saco] Implement/match CPlayerPed::FUNC_100AD8B0; the GetWeaponInfo result is written back into the parameter slot ricardoofnl 2026-09-05 08:10:10 +07:00
  • 8cd945bd9f [saco] Implement/match CPlayerPed::FUNC_100ACE50; the else branch needs a zeroed register, which is why retail cmps instead of tests ricardoofnl 2026-09-05 08:10:06 +07:00
  • 9938023f49 [saco] Implement/match CPlayerPed::FUNC_100ADA00; the explicit else pins the early FALSE block ahead of the IsAdded call ricardoofnl 2026-09-05 08:10:02 +07:00
  • 371a18f009 [saco] Implement/match CPlayerPed::FUNC_100AE960; the result local is declared before the ped pointer, which is what orders the two stack slots ricardoofnl 2026-09-05 08:09:57 +07:00
  • e04d49c02f [saco] Implement/match CPlayerPed::FUNC_100AC690; a single && condition, so both tests jump forward to one zero return ricardoofnl 2026-09-05 08:09:51 +07:00
  • e39cc31f7e [saco] Implement/match CPlayerPed::FUNC_100AE5D0; testing the number positively is what zero-extends it up front for the widened call ricardoofnl 2026-09-05 08:09:47 +07:00
  • a037dff6c5 [saco] Implement/match FUNC_100AE520; a file-scope WORD clear of the GTA global at 0xB7CEDC ricardoofnl 2026-09-05 07:56:55 +07:00
  • 2d204144e0 [saco] Implement/match CPlayerPed::FUNC_100AEF60; the renderware test goes through ecx so m_pPed stays in eax ricardoofnl 2026-09-05 07:56:52 +07:00
  • dfd7768541 [saco] Implement/match CPlayerPed::FUNC_100AEC90; the _asm call is what forces the ebp frame here ricardoofnl 2026-09-05 07:56:47 +07:00
  • 83e944cbea [saco] Implement/match CPlayerPed::FUNC_100AC720; the pool lookup is tested before m_pPed, not after ricardoofnl 2026-09-05 07:56:44 +07:00
  • c6d663e825 [saco] Implement/match CPlayerPed::FUNC_100AD880; the first store can alias m_pPed, which forces the reload for the second ricardoofnl 2026-09-05 07:56:40 +07:00
  • 55846225c4 [saco] Implement/match CPlayerPed::FUNC_100AD860; dwStateFlags & 3 narrows to a byte test ricardoofnl 2026-09-05 07:56:36 +07:00
  • 4835be7464 [saco] Implement/match CPlayerPed::FUNC_100ACF00; only al is live at the retn 4, so the setter returns void ricardoofnl 2026-09-05 07:56:32 +07:00
  • 8801e505b2 [saco] Implement/match CPlayerPed::FUNC_100ACEF0; the same setnz shape as FUNC_100ACE40, on field_2DE ricardoofnl 2026-09-05 07:56:29 +07:00
  • 77b4179732 [saco] Implement/match CPlayerPed::FUNC_100ACE40; the BOOL return of field_2E2 != 0 normalises through xor/test/setnz ricardoofnl 2026-09-05 07:56:25 +07:00
  • 72081093cb [saco] Implement/match CPlayerPed::FUNC_100AE260; a bare field_2F2 getter ricardoofnl 2026-09-05 07:56:21 +07:00
  • 40f011845e [saco] Implement/match ScrUnk57; a single goto exit gives the one shared epilogue while keeping push esi delayed, which neither early returns nor nesting produced ricardoofnl 2026-09-05 08:20:57 +07:00
  • 810a3cffbd [saco] Implement/match ScrUnk71; CPlayerPool::GetAt will not inline here, so the ternary has to be spelled out, and the attach test is negated ricardoofnl 2026-09-05 08:09:01 +07:00
  • d8bc0efab5 [saco] Implement/match ScrUnk94; two GetAt lookups on different ids keep both slot tests, and the trailer is the this of the pair of calls ricardoofnl 2026-09-05 08:02:02 +07:00
  • b18ac60ce5 [saco] Implement/match ScrUnk70; it forwards to CGame::PlayCrimeReport with the position passed by pointer ricardoofnl 2026-09-05 08:00:45 +07:00
  • 26cbdd6983 [saco] Implement/match ScrUnk38; it is CNetGame::SetMapIcon, and the contiguous ascending X/Y/Z slots mean a VECTOR rather than three floats ricardoofnl 2026-09-05 07:58:29 +07:00
  • f904873daf [saco] Implement/match ScrUnk7B; zeroing the 33-byte buffer with memset gives eight aligned dwords plus a trailing byte, an = {0} initializer does not ricardoofnl 2026-09-05 07:53:53 +07:00
  • 787d1811fd [saco] Implement/match ScrUnk2D; the read order lands X in the second float slot, not the first ricardoofnl 2026-09-05 07:49:58 +07:00
  • 235b85f926 Document the build: VC7.1 toolchain, the Release flags and per-file overrides, and why the DLL does not link yet ricardoofnl 2026-09-05 07:40:52 +07:00
  • 7cf34084ce [saco] Implement/match FUNC_100B5D20; it swaps the offscreen rasters into the scene camera around three GTA calls ricardoofnl 2026-09-04 22:27:36 +07:00
  • 315ae05989 [saco] Add FUNC_100B4430; the second asm block reads the 0x4D3A60 result straight out of eax ricardoofnl 2026-09-04 22:27:32 +07:00
  • 237a0fe6bb [saco] Implement/match FUNC_100B42B0; the asm-visible copy is taken after the state tests so the object pointer stays in eax ricardoofnl 2026-09-04 22:27:27 +07:00
  • db738d9c73 [saco] Add FUNC_100B41F0 and FUNC_100B4240; both dispatch the version-dependent 0x7EE2D0/0x7EE310 pair on the scene camera ricardoofnl 2026-09-04 22:27:24 +07:00
  • 17b3f3d248 [saco] Implement/match FUNC_100B3D30; the object pool walk advances the pointer in the for increment, after the counter ricardoofnl 2026-09-04 22:27:20 +07:00
  • 1bb92445f6 [saco] Implement/match FUNC_100B4A70; the unit-range test is <= and >= on all three components ricardoofnl 2026-09-04 22:27:16 +07:00
  • cd7c129445 [saco] Implement/match VectorNormaliseTo; casting the sum to double picks the fsqrt intrinsic instead of the float sqrt overload ricardoofnl 2026-09-04 22:27:13 +07:00
  • 783584be6e [saco] Implement/match VectorCrossProduct; each product needs its own statement or MSVC canonicalises the fmul operands by address ricardoofnl 2026-09-04 22:27:09 +07:00
  • 500a3abcd3 [saco] Implement/match FastSqrt; one newton step on the 0x5F3759D5 inverse-sqrt seed, scaled back up by x ricardoofnl 2026-09-04 22:27:06 +07:00
  • 0c4148e8a4 [saco] Add FUNC_100B4BC0; a 0x59C730 thunk with the same three-pop cleanup as FUNC_100B4C00 ricardoofnl 2026-09-04 22:27:02 +07:00
  • ec3b61abfa [saco] Implement/match Packet_AimSync, Packet_PassengerSync and Packet_TrailerSync; the pool pointer is fetched before the id bound check ricardoofnl 2026-09-04 22:33:09 +07:00
  • 4ec0c924cf [saco] Implement/match CChatWindow::FUNC_10067ED0; it only re-renders the target texture when m_bRedraw is set or the scroll position moved ricardoofnl 2026-09-04 22:55:16 +07:00
  • f1d8eabde1 [saco] Implement/match CChatWindow::WriteChatLog; the entry type is a switch (subtract chain) and the timestamp buffer takes 68 stack bytes ricardoofnl 2026-09-04 22:52:45 +07:00
  • 256a3d372c [saco] Implement/match CChatWindow::FUNC_10067E00; the scrollbar stays visible while scrolled off the bottom or the cmd window is open ricardoofnl 2026-09-04 22:42:41 +07:00
  • 6ce44a81b5 [saco] Implement/match CChatWindow::FUNC_10067120; it DT_CALCRECTs "Y" for the line height and "[19:58:34]" for the timestamp width in field_63E6 ricardoofnl 2026-09-04 22:41:23 +07:00
  • 3c6628a812 [saco] Implement/match CChatWindow::ReleaseTextures and the FUNC_10067410 tail call into it, which is a bare 5-byte jmp ricardoofnl 2026-09-04 22:35:18 +07:00
  • 1e1006c1f1 [saco] Implement/match CChatWindow::AddInfoMessage; same body as AddDebugMessage with entry type 4 and m_dwChatInfoColor ricardoofnl 2026-09-04 22:29:16 +07:00
  • 8fa52f694e [saco] Implement/match ScrUnk2B, ScrUnk2E and ScrUnk2F; CObjectPool::FUNC_10012850 takes a 16-bit object id, so the caller pushes the slot dword with no movzx ricardoofnl 2026-09-04 23:05:10 +07:00
  • f685a0bcd9 [saco] Implement/match ScrPutPlayerInVehicle, ScrUnk9F and ScrUnk50; repeating GetVehiclePool() instead of caching it in a local is what keeps the second slot-state test ricardoofnl 2026-09-04 23:02:03 +07:00
  • 13029ebe53 [saco] Implement/match ScrDisplayGameText and ScrUnk69; the inline memset of a stack buffer is what forces the 8-byte aligned frame ricardoofnl 2026-09-04 23:00:28 +07:00
  • 6eede0e150 [saco] Implement/match ScrSetPlayerPos and ScrUnk0D; the ground-Z fixup is FindGroundZForCoord plus a 1.5f float literal ricardoofnl 2026-09-04 22:59:54 +07:00
  • 2a481d8ff8 [saco] Match CMenuPool::GetSlotState; ScrInitMenu reaches the slot array through it, not by direct indexing ricardoofnl 2026-09-04 23:03:37 +07:00
  • 63c79b1162 [saco] Implement/match ScrUnk45; its local-player arm inlines a new CLocalPlayer::SetTeam, whose COMDAT is the body at 0x10017C70 ricardoofnl 2026-09-04 22:55:04 +07:00
  • 0fedc9c0bc [saco] Match CLocalPlayer::FUNC_10006FE0, the enter-vehicle key handler; fcomp/test ah, 5/jp is a float < ricardoofnl 2026-09-04 22:47:01 +07:00
  • 773bf14843 [saco] Match CLocalPlayer::FUNC_10005AD0; the flag byte comes from a branch not setne, and the GTA id needs its own local to reuse esi ricardoofnl 2026-09-04 22:40:47 +07:00
  • c2a7c3ad17 [saco] Match CLocalPlayer::FUNC_10005BF0; the guards must nest, sequential returns each emit their own BitStream dtor ricardoofnl 2026-09-04 22:26:59 +07:00
  • 4def6b65da [saco] Implement/match CNetGame::UpdateScoresPingsIPs; the six argument RPC overload sits at vtable slot 25 because MSVC reverses an overload set ricardoofnl 2026-09-04 22:18:55 +07:00
  • de62ab5a26 [saco] Implement/match CNetGame::ResetWorldBounds; the guard byte is struc_41 offset 0x2B ricardoofnl 2026-09-04 22:07:42 +07:00
  • ab008a3286 [saco] Implement/match the three message-only handlers Packet_RSAPublicKeyMismatch, Packet_ConnectionBanned and Packet_ConnectionSucceeded ricardoofnl 2026-09-04 22:04:46 +07:00
  • 01fd323e8d [saco] Implement/match CVehiclePool::FUNC_1001ED10; the waiting slots are 100 forty byte entries and the scan must be a do/while(i != n) ricardoofnl 2026-09-04 21:55:56 +07:00
  • 56909c4418 [saco] Implement/match CVehiclePool::FUNC_1001EF30; field-wise point copies keep vecStart enregistered and spill this ricardoofnl 2026-09-04 21:40:55 +07:00
  • 86edcdf9af [saco] Implement/match CVehiclePool::FUNC_1001EC70; the closest-distance float has to be initialised before the id ricardoofnl 2026-09-04 21:17:50 +07:00
  • a6dc7e699d [saco] Implement/match CVehiclePool::FUNC_1001EE20; the 300 unit cutoff is a float literal and the walk is a plain int ricardoofnl 2026-09-04 21:16:24 +07:00
  • 80b6155fd6 [saco] Implement/match CVehiclePool::FUNC_1001EEB0; the sentinel stays 32-bit only while the loop exit assigns it ricardoofnl 2026-09-04 21:14:02 +07:00
  • ea6365cdc6 [saco] Implement/match CVehiclePool::FUNC_1001ED70; the plate texture is built by a thiscall on the renderer global ricardoofnl 2026-09-04 20:52:10 +07:00
  • e23f696955 [saco] Implement/match CVehiclePool::FUNC_1001EC00; the int return is what zero-extends the WORD id ricardoofnl 2026-09-04 20:49:22 +07:00
  • 1ab9ab262c [saco] Implement/match CChatWindow::AddClientMessage; it drops anything over 144 chars and calls ReplaceControlChars out of line ricardoofnl 2026-09-04 22:25:01 +07:00
  • b6e839d49f [saco] Implement/match CChatWindow::AddChatMessage; the control-char scrub is written out again instead of calling ReplaceControlChars ricardoofnl 2026-09-04 22:22:03 +07:00
  • 13e0a5e9e8 [saco] Implement/match the four CChatWindow scrollbar pokes; CDXUTScrollBar::GetTrackPos comes along as the out-of-line COMDAT at 0x100670D0 ricardoofnl 2026-09-04 22:16:53 +07:00
  • 272d63d75b [saco] Implement/match CChatWindow::ReplaceControlChars; its range test is signed, unlike the ReplaceUnprintableChars in game/util.cpp ricardoofnl 2026-09-04 22:14:57 +07:00
  • d9312cbda5 [saco] Implement/match CChatWindow::SetPageSize; it returns void, retail leaves the leftover FUNC_10067200 return in eax ricardoofnl 2026-09-04 22:05:55 +07:00
  • 6452edd2f1 [saco] Match CLocalPlayer::SelectNextClass; the class step plays sound 1052/1053 through CAudio at pGame+0 ricardoofnl 2026-09-04 22:19:16 +07:00
  • a9f1f78a02 [saco] Match CLocalPlayer::RequestClass and SendStatsUpdate; the stats packet is ID_STATS_UPDATE over Send, not an RPC ricardoofnl 2026-09-04 22:09:23 +07:00
  • 67d0758e1d [saco] Match the three CLocalPlayer damage reports; RELIABLE_ORDERED is 9 and the WORD arg copy widens to a dword ricardoofnl 2026-09-04 22:03:57 +07:00
  • 441f89429a [saco] Implement/match UnkAA; the Read(bool&) specialization cannot throw so the frame carries no EH state ricardoofnl 2026-09-04 20:49:38 +07:00
  • e4c72ce5f7 [saco] Implement/match the four ped heading patch helpers; each is an inlined memcpy/memset over the saved code arrays ricardoofnl 2026-09-04 20:48:54 +07:00
  • 5bd0b5c882 [saco] Match FUNC_1000D2C0, the state 1 twin of FUNC_1000D320, and add its FUNC_1000C650 callee ricardoofnl 2026-09-04 21:16:54 +07:00
  • de2ab66e6f [saco] Match FUNC_1000D1E0; split DOWNLOAD_ENTRY.field_5A out as the retry countdown it ticks ricardoofnl 2026-09-04 21:15:20 +07:00
  • f5c4ef93fd [saco] Match the three CDownloadManager slot counters; the six-slot loop gets fully unrolled ricardoofnl 2026-09-04 21:12:44 +07:00
  • c8719debd2 [saco] Match FUNC_1000C0F0/FUNC_1000C140, the slot hold flag pair on field_5 ricardoofnl 2026-09-04 20:42:48 +07:00
  • 47d6497b95 [saco] Match FUNC_1000D240/FUNC_1000D280; they return the dff/txd id of a staged entry ricardoofnl 2026-09-04 20:41:13 +07:00
  • e504cb236e [saco] Match the three CDownloadList delete helpers; _snprintf with sizeof(buf) - 1 into a 261-byte frame ricardoofnl 2026-09-04 20:38:27 +07:00
  • 662d3331b9 [saco] Implement/match ReplaceUnprintableChars; both ends of the range test are unsigned ricardoofnl 2026-09-04 20:19:44 +07:00
  • ce1f1e9c34 [saco] Add FUNC_100B4BE0 and FUNC_100B4C00; the first GTA callee cleans its own stack, the second does not ricardoofnl 2026-09-04 20:18:48 +07:00
  • fc68e18131 [saco] Implement/match IsValidModel; the BOOL return normalizes GetModelInfo through neg/sbb/neg ricardoofnl 2026-09-04 20:18:31 +07:00
  • 371b742e82 [saco] Match FUNC_100B3CD0 and FUNC_100B3D00; the used-slot count is an inlined member on a constant this ricardoofnl 2026-09-04 20:17:42 +07:00