Last active
March 29, 2026 01:46
-
-
Save MrSapps/3c2f594708cf925feefdecf0ae36cd4a to your computer and use it in GitHub Desktop.
Car_78
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| void __thiscall Car_78::sub_44D1D0(Car_78 *this) | |
| { | |
| char v2; // bl | |
| __int32 field_24_flags; // eax | |
| int v4; // ebp | |
| _DWORD *v5; // eax | |
| Sprite *field_50_car_sprite; // ecx | |
| __int32 field_1C_zpos; // edi | |
| int v8; // edx | |
| __int32 v9; // eax | |
| Sprite *v10; // eax | |
| Car_78 *v11; // eax | |
| unsigned __int8 v12; // bl | |
| int v13; // edi | |
| int v14; // eax | |
| int v15; // ebp | |
| int v16; // eax | |
| int v17; // ecx | |
| int v18; // edx | |
| gmp_block_info *block_4DFE10; // eax | |
| char v20; // bl | |
| char v21; // dl | |
| __int32 v22; // eax | |
| __int32 v23; // edx | |
| int v24; // edi | |
| Sprite *v25; // ecx | |
| int v26; // ebp | |
| _DWORD *v27; // eax | |
| Sprite *v28; // ecx | |
| __int32 v29; // edi | |
| int v30; // edx | |
| __int32 v31; // eax | |
| __int64 v32; // rax | |
| int v33; // ebp | |
| _DWORD *v34; // eax | |
| Sprite *v35; // ecx | |
| __int32 v36; // edi | |
| int v37; // edx | |
| __int32 v38; // eax | |
| __int64 v39; // rax | |
| int v40; // ebp | |
| _DWORD *v41; // eax | |
| Sprite *v42; // ecx | |
| __int32 v43; // edi | |
| int v44; // edx | |
| __int32 v45; // eax | |
| __int64 v46; // rax | |
| int v47; // ebp | |
| _DWORD *v48; // eax | |
| __int64 v49; // rax | |
| int v50; // ebp | |
| _DWORD *v51; // eax | |
| Sprite *v52; // ecx | |
| __int32 v53; // edi | |
| int v54; // edx | |
| __int32 v55; // eax | |
| __int64 v56; // rax | |
| int v57; // ebp | |
| _DWORD *v58; // eax | |
| __int64 v59; // rax | |
| int v60; // ebp | |
| _DWORD *v61; // eax | |
| Sprite *v62; // ecx | |
| __int32 v63; // edi | |
| int v64; // edx | |
| __int32 v65; // eax | |
| __int64 v66; // rax | |
| int v67; // ebp | |
| _DWORD *v68; // eax | |
| Sprite *v69; // ecx | |
| __int32 v70; // edi | |
| int v71; // edx | |
| __int32 v72; // eax | |
| __int32 v73; // ecx | |
| Sprite *v74; // eax | |
| Car_78 *v75; // ecx | |
| __int32 v76; // edx | |
| int v77; // edi | |
| Sprite *v78; // ecx | |
| Sprite *v79; // ecx | |
| __int32 v80; // edi | |
| __int32 v81; // edx | |
| __int32 v82; // eax | |
| Sprite *v83; // ecx | |
| __int32 v84; // edi | |
| __int32 v85; // edx | |
| __int32 v86; // eax | |
| Sprite *v87; // ecx | |
| __int32 v88; // edi | |
| __int32 v89; // edx | |
| __int32 v90; // eax | |
| int v91; // edi | |
| Sprite *v92; // ecx | |
| __int32 v93; // edi | |
| __int32 v94; // edx | |
| __int32 v95; // eax | |
| int v96; // edi | |
| __int64 v97; // rax | |
| Sprite *v98; // ecx | |
| __int32 v99; // edi | |
| __int32 v100; // edx | |
| __int32 v101; // eax | |
| Sprite *v102; // ecx | |
| __int32 v103; // edi | |
| __int32 v104; // edx | |
| __int32 v105; // eax | |
| char v106; // al | |
| char v107; // cl | |
| bool v108; // cc | |
| char v109; // [esp+12h] [ebp-12h] BYREF | |
| char v110; // [esp+13h] [ebp-11h] | |
| int v111; // [esp+14h] [ebp-10h] BYREF | |
| int v112; // [esp+18h] [ebp-Ch] BYREF | |
| int v113; // [esp+1Ch] [ebp-8h] BYREF | |
| int v114; // [esp+20h] [ebp-4h] BYREF | |
| v2 = 0; | |
| v109 = 0; | |
| byte_677A94 = 0; | |
| if ( this->field_0->field_84_car_info_idx == BUS ) | |
| { | |
| return; | |
| } | |
| if ( this->field_2B <= 0x14u ) | |
| { | |
| return; | |
| } | |
| if ( byte_677C90 ) | |
| { | |
| return; | |
| } | |
| field_24_flags = this->field_24_flags; | |
| if ( (field_24_flags & 0x10) == 0 ) | |
| { | |
| return; | |
| } | |
| if ( this->field_8 ) | |
| { | |
| return; | |
| } | |
| if ( (field_24_flags & 0x4000) != 0 ) | |
| { | |
| return; | |
| } | |
| if ( (field_24_flags & 0x40000) == 0x40000 | |
| || (field_24_flags & 0x80000) == 0x80000 ) | |
| { | |
| byte_677A94 = 1; | |
| this->field_70 = this->field_0->field_50_car_sprite; | |
| } | |
| else | |
| { | |
| v4 = (dword_677B9C * (__int64)gSin_table_667A80[this->field_10]) >> 14; | |
| v111 = gCos_table_669260[this->field_10]; | |
| v5 = Fix16::Multiply_408680(&v111, &v113, &dword_677B9C); | |
| field_50_car_sprite = this->field_0->field_50_car_sprite; | |
| field_1C_zpos = field_50_car_sprite->field_1C_zpos; | |
| v8 = *v5 + field_50_car_sprite->field_14_xy.y.mValue; | |
| v9 = v4 + field_50_car_sprite->field_14_xy.x.mValue; | |
| if ( field_50_car_sprite->field_14_xy.x.mValue != v9 | |
| || field_50_car_sprite->field_14_xy.y.mValue != v8 ) | |
| { | |
| field_50_car_sprite->field_14_xy.x.mValue = v9; | |
| field_50_car_sprite->field_14_xy.y.mValue = v8; | |
| field_50_car_sprite->field_1C_zpos = field_1C_zpos; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(field_50_car_sprite); | |
| } | |
| if ( !this->field_70 ) | |
| { | |
| this->field_70 = PurpleDoom::FindNearestSpriteOfType_477E60( | |
| gPurpleDoom_1_679208, | |
| this->field_0->field_50_car_sprite, | |
| 0); | |
| } | |
| } | |
| v10 = this->field_70; | |
| if ( !v10 ) | |
| { | |
| return; | |
| } | |
| if ( v10->field_30_sprite_type_enum != sprite_type_2_Car_BC ) | |
| { | |
| return; | |
| } | |
| if ( byte_677BBC && dword_6779B0 == v10->field_8_uni1.cBC ) | |
| { | |
| return; | |
| } | |
| if ( !byte_677A94 ) | |
| { | |
| if ( *Car_BC::sub_43A240(v10->field_8_uni1.cBC, &v113) < dword_677A8C ) | |
| { | |
| v2 = 1; | |
| } | |
| if ( byte_677A6C && this->field_70->field_8_uni1.cBC == dword_6779B0 ) | |
| { | |
| return; | |
| } | |
| v11 = this->field_70->field_8_uni1.cBC->field_5C; | |
| if ( v11 ) | |
| { | |
| if ( dword_677A8C > v11->field_74 ) | |
| { | |
| v2 = 1; | |
| } | |
| if ( (v11->field_24_flags & 0x100) == 0x100 ) | |
| { | |
| return; | |
| } | |
| } | |
| if ( !v2 ) | |
| { | |
| return; | |
| } | |
| } | |
| v12 = 0; | |
| LOBYTE(v111) = 0; | |
| do | |
| { | |
| v13 = this->field_10; | |
| v14 = gSin_table_667A80[v13]; | |
| v112 = (dword_677B94 * (__int64)((unsigned __int8)v111 << 14)) >> 14; | |
| v15 = (v112 * (__int64)v14) >> 14; | |
| v113 = gCos_table_669260[v13]; | |
| v16 = *Fix16::Multiply_408680(&v113, &v114, &v112); | |
| v17 = v15 + this->field_0->field_50_car_sprite->field_14_xy.x.mValue; | |
| dword_677A74 = v17; | |
| v18 = v16 + this->field_0->field_50_car_sprite->field_14_xy.y.mValue; | |
| dword_677A80 = v18; | |
| if ( v17 > dword_677B90 | |
| && v18 > dword_677B90 | |
| && v17 < dword_677950 | |
| && v18 < dword_677950 ) | |
| { | |
| block_4DFE10 = Map_0x370::get_block_4DFE10( | |
| gMap_0x370_6F6268, | |
| v17 >> 14, | |
| v18 >> 14, | |
| this->field_0->field_50_car_sprite->field_1C_zpos >> 14); | |
| if ( !block_4DFE10 | |
| || (block_4DFE10->field_B_slope_type & 0xFC) == 0 | |
| || (block_4DFE10->field_B_slope_type & 0xFCu) >= 0xB4 | |
| || (block_4DFE10->field_B_slope_type & 3) == 0 ) | |
| { | |
| block_4DFE10 = Map_0x370::get_block_4DFE10( | |
| gMap_0x370_6F6268, | |
| dword_677A74 >> 14, | |
| dword_677A80 >> 14, | |
| (this->field_0->field_50_car_sprite->field_1C_zpos >> 14) | |
| - 1); | |
| } | |
| if ( block_4DFE10 && Car_78::sub_447D40(this, block_4DFE10) ) | |
| { | |
| v22 = this->field_24_flags; | |
| BYTE1(v22) &= ~1u; | |
| this->field_24_flags = v22; | |
| return; | |
| } | |
| } | |
| LOBYTE(v111) = ++v12; | |
| } | |
| while ( v12 < 5u ); | |
| v20 = Car_BC::CountConsecutiveArrowBlocks_4410D0( | |
| this->field_0, | |
| this->field_10, | |
| &v109, | |
| dword_677C38, | |
| dword_677C30); | |
| v110 = v20; | |
| if ( v109 <= 1 ) | |
| { | |
| return; | |
| } | |
| v21 = byte_677A94; | |
| if ( byte_677A94 ) | |
| { | |
| if ( (this->field_24_flags & 0x80000) == 0 ) | |
| { | |
| goto LABEL_90; | |
| } | |
| LABEL_48: | |
| if ( v20 == v109 - 1 ) | |
| { | |
| if ( byte_677A94 | |
| || dword_677A8C > (int)dword_6779C0 | |
| || *Car_BC::sub_43A240(this->field_70->field_8_uni1.cBC, &v114) == dword_677B90 ) | |
| { | |
| v23 = dword_677C48; | |
| v24 = dword_677C30; | |
| v25 = this->field_0->field_50_car_sprite; | |
| if ( v25->field_14_xy.x.mValue != dword_677C38 | |
| || v25->field_14_xy.y.mValue != dword_677C30 | |
| || v25->field_1C_zpos != dword_677C48 ) | |
| { | |
| v25->field_14_xy.x.mValue = dword_677C38; | |
| v25->field_14_xy.y.mValue = v24; | |
| v25->field_1C_zpos = v23; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v25); | |
| } | |
| switch ( this->field_4C ) | |
| { | |
| case 1: | |
| v26 = (dword_6779D4 * (__int64)gSin_table_667A80[word_677B08]) >> 14; | |
| v113 = gCos_table_669260[word_677B08]; | |
| v27 = Fix16::Multiply_408680(&v113, &v114, &dword_6779D4); | |
| v28 = this->field_0->field_50_car_sprite; | |
| v29 = v28->field_1C_zpos; | |
| v30 = *v27 + v28->field_14_xy.y.mValue; | |
| v31 = v26 + v28->field_14_xy.x.mValue; | |
| if ( v28->field_14_xy.x.mValue != v31 | |
| || v28->field_14_xy.y.mValue != v30 ) | |
| { | |
| v28->field_14_xy.x.mValue = v31; | |
| v28->field_14_xy.y.mValue = v30; | |
| v28->field_1C_zpos = v29; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v28); | |
| } | |
| if ( !PurpleDoom::FindNearestSpriteOfType_477E60( | |
| gPurpleDoom_1_679208, | |
| this->field_0->field_50_car_sprite, | |
| 0) ) | |
| { | |
| v32 = (dword_677B98 * (__int64)gSin_table_667A80[word_677ADE]) >> 14; | |
| v113 = gCos_table_669260[word_677ADE]; | |
| v33 = v32; | |
| v34 = Fix16::Multiply_408680(&v113, &v114, &dword_677B98); | |
| v35 = this->field_0->field_50_car_sprite; | |
| v36 = v35->field_1C_zpos; | |
| v37 = *v34 + v35->field_14_xy.y.mValue; | |
| v38 = v33 + v35->field_14_xy.x.mValue; | |
| if ( v35->field_14_xy.x.mValue == v38 | |
| && v35->field_14_xy.y.mValue == v37 ) | |
| { | |
| goto LABEL_65; | |
| } | |
| goto LABEL_64; | |
| } | |
| break; | |
| case 2: | |
| v39 = (dword_6779D4 | |
| * (__int64)gSin_table_667A80[(__int16)dword_6779E4]) >> 14; | |
| v113 = gCos_table_669260[(__int16)dword_6779E4]; | |
| v40 = v39; | |
| v41 = Fix16::Multiply_408680(&v113, &v114, &dword_6779D4); | |
| v42 = this->field_0->field_50_car_sprite; | |
| v43 = v42->field_1C_zpos; | |
| v44 = *v41 + v42->field_14_xy.y.mValue; | |
| v45 = v40 + v42->field_14_xy.x.mValue; | |
| if ( v42->field_14_xy.x.mValue != v45 | |
| || v42->field_14_xy.y.mValue != v44 ) | |
| { | |
| v42->field_14_xy.x.mValue = v45; | |
| v42->field_14_xy.y.mValue = v44; | |
| v42->field_1C_zpos = v43; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v42); | |
| } | |
| if ( !PurpleDoom::FindNearestSpriteOfType_477E60( | |
| gPurpleDoom_1_679208, | |
| this->field_0->field_50_car_sprite, | |
| 0) ) | |
| { | |
| v46 = (dword_677B98 * (__int64)gSin_table_667A80[word_677CE8]) >> 14; | |
| v113 = gCos_table_669260[word_677CE8]; | |
| v47 = v46; | |
| v48 = Fix16::Multiply_408680(&v113, &v114, &dword_677B98); | |
| v35 = this->field_0->field_50_car_sprite; | |
| v36 = v35->field_1C_zpos; | |
| v37 = *v48 + v35->field_14_xy.y.mValue; | |
| v38 = v47 + v35->field_14_xy.x.mValue; | |
| if ( v35->field_14_xy.x.mValue != v38 | |
| || v35->field_14_xy.y.mValue != v37 ) | |
| { | |
| goto LABEL_64; | |
| } | |
| goto LABEL_65; | |
| } | |
| break; | |
| case 3: | |
| v49 = (dword_6779D4 * (__int64)gSin_table_667A80[word_677ADE]) >> 14; | |
| v113 = gCos_table_669260[word_677ADE]; | |
| v50 = v49; | |
| v51 = Fix16::Multiply_408680(&v113, &v114, &dword_6779D4); | |
| v52 = this->field_0->field_50_car_sprite; | |
| v53 = v52->field_1C_zpos; | |
| v54 = *v51 + v52->field_14_xy.y.mValue; | |
| v55 = v50 + v52->field_14_xy.x.mValue; | |
| if ( v52->field_14_xy.x.mValue != v55 | |
| || v52->field_14_xy.y.mValue != v54 ) | |
| { | |
| v52->field_14_xy.x.mValue = v55; | |
| v52->field_14_xy.y.mValue = v54; | |
| v52->field_1C_zpos = v53; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v52); | |
| } | |
| if ( !PurpleDoom::FindNearestSpriteOfType_477E60( | |
| gPurpleDoom_1_679208, | |
| this->field_0->field_50_car_sprite, | |
| 0) ) | |
| { | |
| v56 = (dword_677B98 | |
| * (__int64)gSin_table_667A80[(__int16)dword_6779E4]) >> 14; | |
| v113 = gCos_table_669260[(__int16)dword_6779E4]; | |
| v57 = v56; | |
| v58 = Fix16::Multiply_408680(&v113, &v114, &dword_677B98); | |
| v35 = this->field_0->field_50_car_sprite; | |
| v36 = v35->field_1C_zpos; | |
| v37 = *v58 + v35->field_14_xy.y.mValue; | |
| v38 = v57 + v35->field_14_xy.x.mValue; | |
| if ( v35->field_14_xy.x.mValue != v38 | |
| || v35->field_14_xy.y.mValue != v37 ) | |
| { | |
| LABEL_64: | |
| v35->field_14_xy.x.mValue = v38; | |
| v35->field_14_xy.y.mValue = v37; | |
| v35->field_1C_zpos = v36; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v35); | |
| } | |
| LABEL_65: | |
| if ( !PurpleDoom::FindNearestSpriteOfType_477E60( | |
| gPurpleDoom_1_679208, | |
| this->field_0->field_50_car_sprite, | |
| 0) ) | |
| { | |
| goto LABEL_89; | |
| } | |
| } | |
| break; | |
| case 4: | |
| v59 = (dword_6779D4 * (__int64)gSin_table_667A80[word_677CE8]) >> 14; | |
| v113 = gCos_table_669260[word_677CE8]; | |
| v60 = v59; | |
| v61 = Fix16::Multiply_408680(&v113, &v114, &dword_6779D4); | |
| v62 = this->field_0->field_50_car_sprite; | |
| v63 = v62->field_1C_zpos; | |
| v64 = *v61 + v62->field_14_xy.y.mValue; | |
| v65 = v60 + v62->field_14_xy.x.mValue; | |
| if ( v62->field_14_xy.x.mValue != v65 | |
| || v62->field_14_xy.y.mValue != v64 ) | |
| { | |
| v62->field_14_xy.x.mValue = v65; | |
| v62->field_14_xy.y.mValue = v64; | |
| v62->field_1C_zpos = v63; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v62); | |
| } | |
| if ( !PurpleDoom::FindNearestSpriteOfType_477E60( | |
| gPurpleDoom_1_679208, | |
| this->field_0->field_50_car_sprite, | |
| 0) ) | |
| { | |
| v66 = (dword_677B98 * (__int64)gSin_table_667A80[word_677B08]) >> 14; | |
| v113 = gCos_table_669260[word_677B08]; | |
| v67 = v66; | |
| v68 = Fix16::Multiply_408680(&v113, &v114, &dword_677B98); | |
| v69 = this->field_0->field_50_car_sprite; | |
| v70 = v69->field_1C_zpos; | |
| v71 = *v68 + v69->field_14_xy.y.mValue; | |
| v72 = v67 + v69->field_14_xy.x.mValue; | |
| if ( v69->field_14_xy.x.mValue != v72 | |
| || v69->field_14_xy.y.mValue != v71 ) | |
| { | |
| v69->field_14_xy.x.mValue = v72; | |
| v69->field_14_xy.y.mValue = v71; | |
| v69->field_1C_zpos = v70; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v69); | |
| } | |
| if ( !PurpleDoom::FindNearestSpriteOfType_477E60( | |
| gPurpleDoom_1_679208, | |
| this->field_0->field_50_car_sprite, | |
| 0) ) | |
| { | |
| LABEL_89: | |
| v73 = this->field_24_flags; | |
| this->field_2D = v20; | |
| BYTE1(v73) |= 1u; | |
| this->field_2E = v20; | |
| this->field_24_flags = v73; | |
| this->field_2F = v20 - 1; | |
| } | |
| } | |
| break; | |
| default: | |
| return; | |
| } | |
| } | |
| else | |
| { | |
| dword_677A8C = *Car_BC::sub_43A240( | |
| this->field_70->field_8_uni1.cBC, | |
| &v114); | |
| } | |
| } | |
| return; | |
| } | |
| if ( v20 > 0 ) | |
| { | |
| goto LABEL_48; | |
| } | |
| LABEL_90: | |
| v74 = this->field_70; | |
| v75 = v74->field_8_uni1.cBC->field_5C; | |
| if ( v75 ) | |
| { | |
| if ( v75->field_2A < 50u ) | |
| { | |
| return; | |
| } | |
| } | |
| else | |
| { | |
| if ( *Car_BC::sub_43A240(v74->field_8_uni1.cBC, &v114) > dword_677B64 ) | |
| { | |
| return; | |
| } | |
| v21 = byte_677A94; | |
| } | |
| if ( dword_677B00 < dword_677B60 || v21 ) | |
| { | |
| v76 = dword_677C48; | |
| v77 = dword_677C30; | |
| v78 = this->field_0->field_50_car_sprite; | |
| if ( v78->field_14_xy.x.mValue != dword_677C38 | |
| || v78->field_14_xy.y.mValue != dword_677C30 | |
| || v78->field_1C_zpos != dword_677C48 ) | |
| { | |
| v78->field_14_xy.x.mValue = dword_677C38; | |
| v78->field_14_xy.y.mValue = v77; | |
| v78->field_1C_zpos = v76; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v78); | |
| } | |
| switch ( this->field_4C ) | |
| { | |
| case 1: | |
| v111 = (gSin_table_667A80[(__int16)dword_6779E4] * (__int64)dword_6779D4) >> 14; | |
| v79 = this->field_0->field_50_car_sprite; | |
| v80 = v79->field_1C_zpos; | |
| v81 = ((gCos_table_669260[(__int16)dword_6779E4] * (__int64)dword_6779D4) >> 14) | |
| + v79->field_14_xy.y.mValue; | |
| v82 = v111 + v79->field_14_xy.x.mValue; | |
| if ( v79->field_14_xy.x.mValue != v82 | |
| || v79->field_14_xy.y.mValue != v81 ) | |
| { | |
| v79->field_14_xy.x.mValue = v82; | |
| v79->field_14_xy.y.mValue = v81; | |
| v79->field_1C_zpos = v80; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v79); | |
| } | |
| if ( !PurpleDoom::FindNearestSpriteOfType_477E60( | |
| gPurpleDoom_1_679208, | |
| this->field_0->field_50_car_sprite, | |
| 0) ) | |
| { | |
| v111 = (gSin_table_667A80[word_677ADE] * (__int64)dword_677B98) >> 14; | |
| v83 = this->field_0->field_50_car_sprite; | |
| v84 = v83->field_1C_zpos; | |
| v85 = ((gCos_table_669260[word_677ADE] * (__int64)dword_677B98) >> 14) | |
| + v83->field_14_xy.y.mValue; | |
| v86 = v111 + v83->field_14_xy.x.mValue; | |
| if ( v83->field_14_xy.x.mValue == v86 | |
| && v83->field_14_xy.y.mValue == v85 ) | |
| { | |
| goto LABEL_109; | |
| } | |
| goto LABEL_108; | |
| } | |
| break; | |
| case 2: | |
| v111 = (gSin_table_667A80[word_677B08] * (__int64)dword_6779D4) >> 14; | |
| v87 = this->field_0->field_50_car_sprite; | |
| v88 = v87->field_1C_zpos; | |
| v89 = ((gCos_table_669260[word_677B08] * (__int64)dword_6779D4) >> 14) | |
| + v87->field_14_xy.y.mValue; | |
| v90 = v111 + v87->field_14_xy.x.mValue; | |
| if ( v87->field_14_xy.x.mValue != v90 | |
| || v87->field_14_xy.y.mValue != v89 ) | |
| { | |
| v87->field_14_xy.x.mValue = v90; | |
| v87->field_14_xy.y.mValue = v89; | |
| v87->field_1C_zpos = v88; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v87); | |
| } | |
| if ( !PurpleDoom::FindNearestSpriteOfType_477E60( | |
| gPurpleDoom_1_679208, | |
| this->field_0->field_50_car_sprite, | |
| 0) ) | |
| { | |
| v91 = word_677CE8; | |
| goto LABEL_121; | |
| } | |
| break; | |
| case 3: | |
| v111 = (gSin_table_667A80[word_677CE8] * (__int64)dword_6779D4) >> 14; | |
| v92 = this->field_0->field_50_car_sprite; | |
| v93 = v92->field_1C_zpos; | |
| v94 = ((gCos_table_669260[word_677CE8] * (__int64)dword_6779D4) >> 14) | |
| + v92->field_14_xy.y.mValue; | |
| v95 = v111 + v92->field_14_xy.x.mValue; | |
| if ( v92->field_14_xy.x.mValue != v95 | |
| || v92->field_14_xy.y.mValue != v94 ) | |
| { | |
| v92->field_14_xy.x.mValue = v95; | |
| v92->field_14_xy.y.mValue = v94; | |
| v92->field_1C_zpos = v93; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v92); | |
| } | |
| if ( !PurpleDoom::FindNearestSpriteOfType_477E60( | |
| gPurpleDoom_1_679208, | |
| this->field_0->field_50_car_sprite, | |
| 0) ) | |
| { | |
| v91 = (__int16)dword_6779E4; | |
| LABEL_121: | |
| v96 = v91; | |
| v111 = (gSin_table_667A80[v96] * (__int64)dword_677B98) >> 14; | |
| v97 = (gCos_table_669260[v96] * (__int64)dword_677B98) >> 14; | |
| v83 = this->field_0->field_50_car_sprite; | |
| v84 = v83->field_1C_zpos; | |
| v85 = v97 + v83->field_14_xy.y.mValue; | |
| v86 = v111 + v83->field_14_xy.x.mValue; | |
| if ( v83->field_14_xy.x.mValue != v86 | |
| || v83->field_14_xy.y.mValue != v85 ) | |
| { | |
| LABEL_108: | |
| v83->field_14_xy.x.mValue = v86; | |
| v83->field_14_xy.y.mValue = v85; | |
| v83->field_1C_zpos = v84; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v83); | |
| } | |
| LABEL_109: | |
| if ( !PurpleDoom::FindNearestSpriteOfType_477E60( | |
| gPurpleDoom_1_679208, | |
| this->field_0->field_50_car_sprite, | |
| 0) ) | |
| { | |
| goto LABEL_132; | |
| } | |
| } | |
| break; | |
| case 4: | |
| v111 = (gSin_table_667A80[word_677ADE] * (__int64)dword_6779D4) >> 14; | |
| v98 = this->field_0->field_50_car_sprite; | |
| v99 = v98->field_1C_zpos; | |
| v100 = ((gCos_table_669260[word_677ADE] * (__int64)dword_6779D4) >> 14) | |
| + v98->field_14_xy.y.mValue; | |
| v101 = v111 + v98->field_14_xy.x.mValue; | |
| if ( v98->field_14_xy.x.mValue != v101 | |
| || v98->field_14_xy.y.mValue != v100 ) | |
| { | |
| v98->field_14_xy.x.mValue = v101; | |
| v98->field_14_xy.y.mValue = v100; | |
| v98->field_1C_zpos = v99; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v98); | |
| } | |
| if ( !PurpleDoom::FindNearestSpriteOfType_477E60( | |
| gPurpleDoom_1_679208, | |
| this->field_0->field_50_car_sprite, | |
| 0) ) | |
| { | |
| v111 = (gSin_table_667A80[word_677B08] * (__int64)dword_677B98) >> 14; | |
| v102 = this->field_0->field_50_car_sprite; | |
| v103 = v102->field_1C_zpos; | |
| v104 = ((gCos_table_669260[word_677B08] * (__int64)dword_677B98) >> 14) | |
| + v102->field_14_xy.y.mValue; | |
| v105 = v111 + v102->field_14_xy.x.mValue; | |
| if ( v102->field_14_xy.x.mValue != v105 | |
| || v102->field_14_xy.y.mValue != v104 ) | |
| { | |
| v102->field_14_xy.x.mValue = v105; | |
| v102->field_14_xy.y.mValue = v104; | |
| v102->field_1C_zpos = v103; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v102); | |
| } | |
| if ( !PurpleDoom::FindNearestSpriteOfType_477E60( | |
| gPurpleDoom_1_679208, | |
| this->field_0->field_50_car_sprite, | |
| 0) ) | |
| { | |
| LABEL_132: | |
| v106 = v110 + 1; | |
| v107 = v109 - 1; | |
| v108 = (unsigned __int8)(v110 + 1) <= (unsigned __int8)(v109 - 1); | |
| this->field_24_flags |= 0x100u; | |
| this->field_2D = 0; | |
| this->field_2E = 0; | |
| this->field_2F = v106; | |
| if ( !v108 ) | |
| { | |
| this->field_2F = v107; | |
| } | |
| } | |
| } | |
| break; | |
| default: | |
| return; | |
| } | |
| } | |
| } | |
| void __thiscall Car_78::sub_451980(Car_78 *this) | |
| { | |
| int v2; // edi | |
| Car_BC *pCar_; // ebp | |
| Ped *field_54_driver; // eax | |
| Sprite *field_50_car_sprite; // eax | |
| __int32 mValue; // edx | |
| int *v7; // eax | |
| int v8; // eax | |
| __int16 v9; // dx | |
| __int32 field_24_flags; // eax | |
| CarPhysics_B0 *field_58_physics; // eax | |
| int v12; // eax | |
| Car_BC *v13; // ecx | |
| CarPhysics_B0 *v14; // ecx | |
| CarPhysics_B0 *v15; // eax | |
| __int32 flags; // eax | |
| Hamburger_40 *v17; // ecx | |
| Hamburger_40 *v18; // eax | |
| __int32 f88; // eax | |
| Sprite *v20; // eax | |
| __int16 *v21; // eax | |
| Car_BC *v22; // ecx | |
| __int16 v23; // bp | |
| Hamburger_40 *v24; // eax | |
| __int32 v25; // eax | |
| __int16 v26; // si | |
| __int16 v27; // di | |
| CarPhysics_B0 *pPhysics; // eax | |
| Car_BC *pCar; // ecx | |
| int *v30; // [esp-4h] [ebp-2Ch] | |
| bool v31; // [esp+12h] [ebp-16h] | |
| char v32; // [esp+13h] [ebp-15h] | |
| Car_BC *pRet_Ang16; // [esp+14h] [ebp-14h] BYREF | |
| Fix16 pMaybeY_FP16; // [esp+18h] [ebp-10h] BYREF | |
| int pMaybeX_FP16; // [esp+1Ch] [ebp-Ch] BYREF | |
| int v36; // [esp+20h] [ebp-8h] BYREF | |
| int v37; // [esp+24h] [ebp-4h] BYREF | |
| v2 = dword_677B94; | |
| v31 = 0; | |
| v32 = 0; | |
| pCar_ = this->field_70->field_8_uni1.cBC; | |
| if ( this->field_8 ) | |
| { | |
| v31 = *ComputeShortestAngleDelta_4056C0( | |
| &pRet_Ang16, | |
| (int)pCar_->field_50_car_sprite, | |
| &this->field_0->field_50_car_sprite->field_0.field_0) > (unsigned __int16)dword_6779E4; | |
| } | |
| if ( pCar_ ) | |
| { | |
| field_54_driver = pCar_->field_54_driver; | |
| if ( field_54_driver ) | |
| { | |
| if ( field_54_driver->field_28C_threat_reaction == react_as_emergency_1 ) | |
| { | |
| v32 = 1; | |
| } | |
| } | |
| } | |
| field_50_car_sprite = pCar_->field_50_car_sprite; | |
| mValue = field_50_car_sprite->field_14_xy.y.mValue; | |
| pMaybeY_FP16.mValue = field_50_car_sprite->field_14_xy.x.mValue - dword_677C38; | |
| pRet_Ang16 = (Car_BC *)(mValue - dword_677C30); | |
| v30 = Fix16::Abs_436A50(&pMaybeX_FP16, (int *)&pRet_Ang16); | |
| v7 = Fix16::Abs_436A50(&v36, &pMaybeY_FP16.mValue); | |
| v8 = *Fix16::Max_44E540(&v37, v7, v30); | |
| if ( v8 > dword_677B98 ) | |
| { | |
| if ( byte_677BBC || (this->field_24_flags & 0x200000) != 0 ) | |
| { | |
| v31 = 1; | |
| } | |
| if ( pCar_->field_7C_uni_num == 2 ) | |
| { | |
| Car_78::sub_44D1D0(this); | |
| } | |
| else if ( (__int16)*ComputeShortestAngleDelta_4056C0( | |
| &pRet_Ang16, | |
| (int)pCar_->field_50_car_sprite, | |
| &this->field_0->field_50_car_sprite->field_0.field_0) > word_677A38 ) | |
| { | |
| v31 = 1; | |
| } | |
| if ( v32 ) | |
| { | |
| v31 = 0; | |
| } | |
| goto LABEL_46; | |
| } | |
| if ( v8 > v2 ) | |
| { | |
| v31 = 1; | |
| v9 = *ComputeShortestAngleDelta_4056C0( | |
| &pRet_Ang16, | |
| (int)pCar_->field_50_car_sprite, | |
| &this->field_0->field_50_car_sprite->field_0.field_0); | |
| field_24_flags = this->field_24_flags; | |
| if ( v9 > (__int16)dword_6779E4 ) | |
| { | |
| if ( (field_24_flags & 0x200000) != 0 ) | |
| { | |
| LABEL_20: | |
| v31 = 1; | |
| Car_BC::sub_4416D0(this->field_0, 2); | |
| goto LABEL_46; | |
| } | |
| byte_677B3C = 0; | |
| field_58_physics = this->field_0->field_58_physics; | |
| goto LABEL_22; | |
| } | |
| if ( (field_24_flags & 0x20000) != 0 ) | |
| { | |
| byte_677B3C = 0; | |
| Car_BC::sub_43A950(this->field_0); | |
| goto LABEL_46; | |
| } | |
| if ( byte_677BBC && dword_6779B0 ) | |
| { | |
| if ( dword_6779B0 == pCar_ ) | |
| { | |
| v12 = *Car_BC::sub_43A240(pCar_, &v37); | |
| dword_677A8C = v12; | |
| v13 = this->field_0; | |
| if ( this->field_0->field_60->field_8_maybe_path_type == 2 ) | |
| { | |
| if ( v12 == dword_677B90 ) | |
| { | |
| Car_BC::sub_43A950(v13); | |
| goto LABEL_46; | |
| } | |
| v14 = v13->field_58_physics; | |
| if ( dword_677B00 >= v12 ) | |
| { | |
| LABEL_32: | |
| v14->field_95 = 1; | |
| v14->field_91_is_foot_brake_on = 0; | |
| v14->field_94_is_backward_gas_on = 0; | |
| v14->field_93_is_forward_gas_on = 0; | |
| goto LABEL_46; | |
| } | |
| } | |
| else | |
| { | |
| v14 = v13->field_58_physics; | |
| if ( dword_677B00 >= v12 ) | |
| { | |
| goto LABEL_32; | |
| } | |
| } | |
| v14->field_93_is_forward_gas_on = 1; | |
| v14->field_91_is_foot_brake_on = 0; | |
| v14->field_94_is_backward_gas_on = 0; | |
| v14->field_95 = 0; | |
| goto LABEL_46; | |
| } | |
| byte_677B3C = 0; | |
| v15 = this->field_0->field_58_physics; | |
| LABEL_36: | |
| v15->field_91_is_foot_brake_on = 0; | |
| v15->field_93_is_forward_gas_on = 0; | |
| v15->field_94_is_backward_gas_on = 0; | |
| v15->field_95 = 0; | |
| goto LABEL_46; | |
| } | |
| if ( (field_24_flags & 0x200000) == 0 ) | |
| { | |
| byte_677B3C = 0; | |
| v15 = this->field_0->field_58_physics; | |
| goto LABEL_36; | |
| } | |
| LABEL_45: | |
| v31 = 1; | |
| goto LABEL_46; | |
| } | |
| if ( pCar_->field_7C_uni_num == 2 ) | |
| { | |
| if ( (this->field_24_flags & 0x200000) != 0 ) | |
| { | |
| goto LABEL_20; | |
| } | |
| byte_677B3C = 0; | |
| field_58_physics = this->field_0->field_58_physics; | |
| LABEL_22: | |
| field_58_physics->field_91_is_foot_brake_on = 0; | |
| field_58_physics->field_93_is_forward_gas_on = 0; | |
| field_58_physics->field_94_is_backward_gas_on = 0; | |
| field_58_physics->field_95 = 0; | |
| Car_BC::sub_4416D0(this->field_0, 2); | |
| goto LABEL_46; | |
| } | |
| if ( (__int16)*ComputeShortestAngleDelta_4056C0( | |
| &pRet_Ang16, | |
| (int)pCar_->field_50_car_sprite, | |
| &this->field_0->field_50_car_sprite->field_0.field_0) > (__int16)dword_6779E4 ) | |
| { | |
| v31 = 1; | |
| } | |
| if ( (this->field_24_flags & 0x20000) == 0x20000 ) | |
| { | |
| goto LABEL_45; | |
| } | |
| LABEL_46: | |
| flags = this->field_24_flags; | |
| if ( (flags & 0x100) != 0 || v31 ) | |
| { | |
| if ( byte_677BBC ) | |
| { | |
| v17 = this->field_0->field_60; | |
| if ( !v17->field_22 ) | |
| { | |
| v18 = pCar_->field_60; | |
| if ( !v18 || v17->field_30_ped_to_follow != v18->field_30_ped_to_follow ) | |
| { | |
| if ( pCar_ ) | |
| { | |
| if ( pCar_ != dword_6779B0 ) | |
| { | |
| if ( pCar_->field_76_last_seen_timer <= 5 ) | |
| { | |
| v20 = pCar_->field_50_car_sprite; | |
| pMaybeY_FP16.mValue = v20->field_14_xy.x.mValue - dword_677C38; | |
| pMaybeX_FP16 = v20->field_14_xy.y.mValue - dword_677C30; | |
| v21 = atan2_fixed_405320( | |
| (__int16 *)&pRet_Ang16, | |
| (Fix16 *)&pMaybeX_FP16, | |
| &pMaybeY_FP16); | |
| v22 = this->field_0; | |
| v23 = *v21; | |
| pRet_Ang16 = v22; | |
| v24 = v22->field_60; | |
| if ( v24 ) | |
| { | |
| switch ( v24->field_C_state ) | |
| { | |
| case 3: | |
| case 6: | |
| case 8: | |
| v22->field_58_physics->field_AD_turn_direction = 1; | |
| byte_677BBC = 0; | |
| byte_677A5D = 0; | |
| break; | |
| case 4: | |
| case 7: | |
| case 9: | |
| v22->field_58_physics->field_AD_turn_direction = -1; | |
| byte_677BBC = 0; | |
| byte_677A5D = 0; | |
| break; | |
| default: | |
| goto LABEL_64; | |
| } | |
| } | |
| else | |
| { | |
| LABEL_64: | |
| v25 = this->field_4C; | |
| v26 = this->field_10; | |
| if ( v25 == 2 ) | |
| { | |
| v26 += word_677ADE; | |
| if ( v26 < 0 ) | |
| { | |
| v26 += 1440 * ((1439 - v26) / 0x5A0u); | |
| } | |
| if ( v26 >= 1440 ) | |
| { | |
| v26 %= 0x5A0u; | |
| } | |
| v27 = v23 + word_677ADE; | |
| if ( (__int16)(v23 + word_677ADE) < 0 ) | |
| { | |
| v27 += 1440 * ((1439 - v27) / 0x5A0u); | |
| } | |
| if ( v27 >= 1440 ) | |
| { | |
| v27 %= 0x5A0u; | |
| } | |
| } | |
| else | |
| { | |
| v27 = v23; | |
| } | |
| if ( v26 >= v27 ) | |
| { | |
| pRet_Ang16->field_58_physics->field_AD_turn_direction = 1; | |
| } | |
| else | |
| { | |
| pRet_Ang16->field_58_physics->field_AD_turn_direction = -1; | |
| } | |
| byte_677BBC = 0; | |
| byte_677A5D = 0; | |
| } | |
| } | |
| else if ( pCar_->field_7C_uni_num == 3 ) | |
| { | |
| f88 = pCar_->field_88; | |
| if ( f88 != 5 && f88 != 2 && f88 != 3 ) | |
| { | |
| pCar_->field_88 = 4; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| else if ( dword_677B00 == dword_677B90 ) | |
| { | |
| if ( (flags & 0x90) != 0 ) | |
| { | |
| pPhysics = this->field_0->field_58_physics; | |
| pPhysics->field_91_is_foot_brake_on = 0; | |
| pPhysics->field_93_is_forward_gas_on = 0; | |
| pPhysics->field_94_is_backward_gas_on = 0; | |
| pPhysics->field_95 = 0; | |
| } | |
| else | |
| { | |
| Car_78::sub_453C00(this); | |
| } | |
| byte_677B3C = 0; | |
| } | |
| else | |
| { | |
| byte_677B3C = 0; | |
| if ( (this->field_24_flags & 0x1000) == 0 | |
| || this->field_68->field_7C_uni_num != 2 ) | |
| { | |
| pCar = this->field_0; | |
| if ( dword_677B00 <= dword_6779C8 ) | |
| { | |
| Car_BC::sub_43A950(pCar); | |
| } | |
| else | |
| { | |
| Car_BC::sub_43A970(pCar); | |
| } | |
| } | |
| } | |
| } | |
| char __thiscall Map_0x370::CheckColumnHasSolidAbove_4E7FC0( | |
| Map_0x370 *this, | |
| int x, | |
| int y, | |
| int z) | |
| { | |
| gmp_compressed_map_32 *pDMap; // ecx | |
| int z_int; // eax | |
| gmp_col_info *pColInfo; // edi | |
| int height; // ebp | |
| int offset; // esi | |
| int block_d_idx; // eax | |
| gmp_block_info *pBlockInfo; // ebx | |
| int next_block_d_idx; // edx | |
| __int32 block_idx; // eax | |
| __int16 lid; // cx | |
| gmp_block_info *pInfo; // eax | |
| unsigned __int8 slope_type; // al | |
| unsigned __int8 slope_type_masked; // cl | |
| int remainder; // ebp | |
| __int32 *i; // edi | |
| __int16 lid_; // cx | |
| unsigned __int8 slope_type_masked_; // al | |
| pDMap = this->field_0_pDmap; | |
| z_int = z >> 14; | |
| pColInfo = (gmp_col_info *)&pDMap->field_40008_pColumn[pDMap->field_0_base[y >> 14][x >> 14]]; | |
| height = pColInfo->field_0_height; | |
| if ( z >> 14 < height ) | |
| { | |
| offset = pColInfo->field_1_offset; | |
| if ( z_int < offset ) | |
| { | |
| z_int = pColInfo->field_1_offset; | |
| } | |
| block_d_idx = z_int - offset; | |
| pBlockInfo = pDMap->field_4000C_block; | |
| next_block_d_idx = block_d_idx + 1; | |
| block_idx = pColInfo->field_4_blockd[block_d_idx]; | |
| lid = pBlockInfo[block_idx].field_8_lid; | |
| pInfo = &pBlockInfo[block_idx]; | |
| if ( lid ) | |
| { | |
| if ( (lid & 0x1000) == 0 ) | |
| { | |
| slope_type = pInfo->field_B_slope_type; | |
| slope_type_masked = slope_type & 0xFC; | |
| if ( ((slope_type & 0xFCu) < 0xB4 || slope_type_masked > 0xF4u) | |
| && (!slope_type_masked | |
| || slope_type_masked >= 0xB4u | |
| || (slope_type & 3) == 0) ) | |
| { | |
| return 1; | |
| } | |
| } | |
| } | |
| remainder = height - offset; | |
| if ( next_block_d_idx < remainder ) | |
| { | |
| for ( i = &pColInfo->field_4_blockd[next_block_d_idx]; ; ++i ) | |
| { | |
| lid_ = pBlockInfo[*i].field_8_lid; | |
| if ( lid_ ) | |
| { | |
| if ( (lid_ & 0x1000) == 0 ) | |
| { | |
| slope_type_masked_ = pBlockInfo[*i].field_B_slope_type & 0xFC; | |
| if ( slope_type_masked_ < 0xB4u || slope_type_masked_ > 0xF4u ) | |
| { | |
| break; | |
| } | |
| } | |
| } | |
| if ( ++next_block_d_idx >= remainder ) | |
| { | |
| return 0; | |
| } | |
| } | |
| return 1; | |
| } | |
| } | |
| return 0; | |
| } | |
| char __thiscall Map_0x370::FindSlopeIntersectionAndSpawnMarker_4E1520( | |
| Map_0x370 *this, | |
| int zLayer) | |
| { | |
| int y_coord; // ebx | |
| int right; // eax | |
| int x_coord; // esi | |
| __int32 left; // ebp | |
| gmp_block_info *pBlock; // eax | |
| unsigned int slope_type; // edi | |
| int y; // ecx | |
| Sprite *pDirObj; // edi | |
| _DWORD *v11; // eax | |
| _DWORD *v12; // eax | |
| __int32 *v13; // eax | |
| __int32 v14; // [esp-8h] [ebp-40h] | |
| __int32 z_fp; // [esp-4h] [ebp-3Ch] BYREF | |
| Map_0x370 *this_; // [esp+10h] [ebp-28h] BYREF | |
| int v17; // [esp+14h] [ebp-24h] BYREF | |
| int v18; // [esp+18h] [ebp-20h] BYREF | |
| Fix16_Point point; // [esp+1Ch] [ebp-1Ch] BYREF | |
| int x_fp; // [esp+24h] [ebp-14h] BYREF | |
| int y_fp; // [esp+28h] [ebp-10h] | |
| int seh; // [esp+34h] [ebp-4h] | |
| this_ = this; | |
| y_coord = gPurple_top_6F6108; | |
| seh = 1; | |
| if ( gPurple_top_6F6108 > gPurple_bottom_6F5F38 ) | |
| { | |
| return 0; | |
| } | |
| right = gPurple_right_6F5B80; | |
| while ( 1 ) | |
| { | |
| x_coord = gPurple_left_6F5FD4; | |
| if ( gPurple_left_6F5FD4 <= right ) | |
| { | |
| break; | |
| } | |
| LABEL_16: | |
| if ( ++y_coord > gPurple_bottom_6F5F38 ) | |
| { | |
| return 0; | |
| } | |
| } | |
| left = (gPurple_left_6F5FD4 + 1) << 14; | |
| while ( 1 ) | |
| { | |
| pBlock = Map_0x370::get_block_4DFE10(this_, x_coord, y_coord, zLayer); | |
| if ( pBlock ) | |
| { | |
| slope_type = pBlock->field_B_slope_type & 0xFC; | |
| if ( slope_type >= 0xB4 && slope_type <= 0xD0 ) | |
| { | |
| if ( slope_type == 0xB4 | |
| || slope_type == 0xC0 | |
| || slope_type == 0xC4 | |
| || slope_type == 0xD0 ) | |
| { | |
| x_fp = x_coord << 14; | |
| y_fp = (y_coord + 1) << 14; | |
| point.x.mValue = left; | |
| y = y_coord; | |
| } | |
| else | |
| { | |
| x_fp = x_coord << 14; | |
| y_fp = y_coord << 14; | |
| point.x.mValue = left; | |
| y = y_coord + 1; | |
| } | |
| point.y.mValue = y << 14; | |
| if ( Sprite::PointInsideRotatedBounds_5A1490( | |
| dword_6F61E8, | |
| (int)&x_fp, | |
| &point) ) | |
| { | |
| break; | |
| } | |
| } | |
| } | |
| right = gPurple_right_6F5B80; | |
| ++x_coord; | |
| left += 0x4000; | |
| if ( x_coord > gPurple_right_6F5B80 ) | |
| { | |
| goto LABEL_16; | |
| } | |
| } | |
| pDirObj = Object_5C::GetDirectionalObject_5298E0( | |
| gObject_5C_6F8F84, | |
| slope_type)->field_4; | |
| this_ = (Map_0x370 *)&z_fp; | |
| z_fp = zLayer << 14; | |
| v11 = Fix16::FromInt_4926F0(&this_, y_coord); | |
| v14 = *Fix16::Add_408660(v11, &zLayer, &dword_6F5FE0); | |
| v12 = Fix16::FromInt_4926F0(&v18, x_coord); | |
| v13 = Fix16::Add_408660(v12, &v17, &dword_6F5FE0); | |
| Sprite::set_xyz_lazy_451950(pDirObj, *v13, v14, z_fp); | |
| Sprite::UpdateCollisionBoundsIfNeeded_59E9C0(pDirObj); | |
| gRozza_679188.field_0_type = 3; | |
| gRozza_679188.field_20_pSprite = pDirObj; | |
| return 1; | |
| } | |
| char __thiscall Map_0x370::CanSpriteEnterTileRegion_4E1A30( | |
| Map_0x370 *this, | |
| int tileX_min, | |
| int tileX_max, | |
| int tileY_min, | |
| int tileY_max, | |
| int zLevel) | |
| { | |
| int tileY_min_; // edi | |
| Map_0x370 *this_; // ebx | |
| int tileX_min_; // esi | |
| bool bLoopEnd; // cc | |
| gmp_block_info *pBlock1; // eax | |
| unsigned __int8 gradient_direction; // al | |
| int v12; // ecx | |
| gmp_block_info *pBlock2; // eax | |
| unsigned __int8 field_0_gradient_direction; // al | |
| int v15; // ecx | |
| gmp_block_info *pBlock3; // eax | |
| unsigned __int8 gradient_direction_; // al | |
| int v18; // ecx | |
| gmp_block_info *pBlock4; // eax | |
| __int32 v20; // ecx | |
| unsigned __int8 v21; // al | |
| int v22; // ecx | |
| int v24; // [esp-Ch] [ebp-20h] BYREF | |
| Fix16 v25; // [esp-8h] [ebp-1Ch] BYREF | |
| int mValue; // [esp-4h] [ebp-18h] | |
| Map_0x370 *this__; // [esp+10h] [ebp-4h] | |
| __int32 x_value_iter; // [esp+20h] [ebp+Ch] | |
| tileY_min_ = tileY_min; | |
| this_ = this; | |
| this__ = this; | |
| if ( tileY_min > tileY_max ) | |
| { | |
| return 0; | |
| } | |
| while ( 1 ) | |
| { | |
| tileX_min_ = tileX_min; | |
| if ( tileX_min <= tileX_max ) | |
| { | |
| break; | |
| } | |
| LABEL_28: | |
| if ( ++tileY_min_ > tileY_max ) | |
| { | |
| return 0; | |
| } | |
| } | |
| x_value_iter = (tileX_min + 1) << 14; | |
| bLoopEnd = tileX_min < tileX_max; | |
| while ( 1 ) | |
| { | |
| if ( bLoopEnd ) | |
| { | |
| pBlock1 = Map_0x370::sub_4DFE60(this_, tileX_min_, tileY_min_, zLevel); | |
| if ( pBlock1 ) | |
| { | |
| if ( ((unsigned __int16)word_6F6002 & pBlock1->field_2_right) != 0 ) | |
| { | |
| gradient_direction = gSlopeTypes_6F5BA8[pBlock1->field_B_slope_type >> 2].field_0_gradient_direction; | |
| if ( gradient_direction != 1 && gradient_direction != 2 ) | |
| { | |
| v25.mValue = x_value_iter; | |
| mValue = x_value_iter; | |
| Fix16::FromInt_4369F0(&v25, tileY_min_ + 1); | |
| v24 = v12; | |
| Fix16::FromInt_4926F0(&v24, tileY_min_); | |
| if ( Sprite::HitTestVerticalLine_5A0EF0( | |
| dword_6F61E8, | |
| v24, | |
| v25.mValue, | |
| mValue) ) | |
| { | |
| return 1; | |
| } | |
| } | |
| } | |
| } | |
| pBlock2 = Map_0x370::sub_4DFE60(this_, tileX_min_ + 1, tileY_min_, zLevel); | |
| if ( pBlock2 ) | |
| { | |
| if ( ((unsigned __int16)word_6F6002 & pBlock2->field_0_left) != 0 ) | |
| { | |
| field_0_gradient_direction = gSlopeTypes_6F5BA8[pBlock2->field_B_slope_type >> 2].field_0_gradient_direction; | |
| if ( field_0_gradient_direction != 1 | |
| && field_0_gradient_direction != 2 ) | |
| { | |
| v25.mValue = x_value_iter; | |
| mValue = x_value_iter; | |
| Fix16::FromInt_4369F0(&v25, tileY_min_ + 1); | |
| v24 = v15; | |
| Fix16::FromInt_4926F0(&v24, tileY_min_); | |
| if ( Sprite::HitTestVerticalLine_5A0EF0( | |
| dword_6F61E8, | |
| v24, | |
| v25.mValue, | |
| mValue) ) | |
| { | |
| return 1; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| if ( tileY_min_ < tileY_max ) | |
| { | |
| pBlock3 = Map_0x370::sub_4DFE60(this_, tileX_min_, tileY_min_, zLevel); | |
| if ( pBlock3 ) | |
| { | |
| if ( ((unsigned __int16)word_6F6002 & pBlock3->field_6_bottom) != 0 ) | |
| { | |
| gradient_direction_ = gSlopeTypes_6F5BA8[pBlock3->field_B_slope_type >> 2].field_0_gradient_direction; | |
| if ( gradient_direction_ != 3 && gradient_direction_ != 4 ) | |
| { | |
| v25.mValue = (tileY_min_ + 1) << 14; | |
| mValue = v25.mValue; | |
| Fix16::FromInt_4369F0(&v25, tileX_min_ + 1); | |
| v24 = v18; | |
| Fix16::FromInt_4926F0(&v24, tileX_min_); | |
| if ( Sprite::CheckBBoxScanlineIntersection_5A0970( | |
| dword_6F61E8, | |
| v24, | |
| v25.mValue, | |
| mValue) ) | |
| { | |
| return 1; | |
| } | |
| } | |
| } | |
| } | |
| pBlock4 = Map_0x370::sub_4DFE60( | |
| this__, | |
| tileX_min_, | |
| tileY_min_ + 1, | |
| zLevel); | |
| if ( pBlock4 ) | |
| { | |
| LOWORD(v20) = word_6F6002; | |
| if ( ((unsigned __int16)word_6F6002 & pBlock4->field_4_top) != 0 ) | |
| { | |
| v21 = gSlopeTypes_6F5BA8[pBlock4->field_B_slope_type >> 2].field_0_gradient_direction; | |
| if ( v21 != 3 && v21 != 4 ) | |
| { | |
| v25.mValue = v20; | |
| mValue = (tileY_min_ + 1) << 14; | |
| Fix16::FromInt_4369F0(&v25, tileX_min_ + 1); | |
| v24 = v22; | |
| Fix16::FromInt_4926F0(&v24, tileX_min_); | |
| if ( Sprite::CheckBBoxScanlineIntersection_5A0970( | |
| dword_6F61E8, | |
| v24, | |
| v25.mValue, | |
| mValue) ) | |
| { | |
| return 1; | |
| } | |
| } | |
| } | |
| } | |
| this_ = this__; | |
| } | |
| bLoopEnd = ++tileX_min_ < tileX_max; | |
| x_value_iter += 0x4000; | |
| if ( tileX_min_ > tileX_max ) | |
| { | |
| goto LABEL_28; | |
| } | |
| } | |
| } | |
| char __thiscall Map_0x370::sub_4E11E0(Map_0x370 *this, Fix16_Rect *pRect) | |
| { | |
| int *z_sum; // eax | |
| int y_count; // ebx | |
| int z_calc; // ebp | |
| int pRight; // eax | |
| int x_count; // edi | |
| __int32 left; // esi | |
| gmp_block_info *pBlock; // eax | |
| int slope_mask; // eax | |
| __int32 *pTop; // ebx | |
| __int32 *pRight_1; // ebp | |
| __int32 *pBottom; // esi | |
| __int32 left_; // [esp+10h] [ebp-2Ch] | |
| int last_y_count; // [esp+14h] [ebp-28h] | |
| int z_calc_; // [esp+1Ch] [ebp-20h] BYREF | |
| Fix16_Point p2; // [esp+20h] [ebp-1Ch] BYREF | |
| Fix16_Point p1; // [esp+28h] [ebp-14h] BYREF | |
| int seh; // [esp+38h] [ebp-4h] | |
| seh = 1; | |
| Fix16_Rect::DoSetCurrentRect_59DD60(pRect); | |
| z_sum = Fix16::Add_408660(&pRect->field_10, &z_calc_, &pRect->field_14); | |
| y_count = gPurple_top_6F6108; | |
| last_y_count = gPurple_top_6F6108; | |
| z_calc = (*z_sum - (*z_sum >> 31)) >> 15; | |
| z_calc_ = z_calc; | |
| if ( gPurple_top_6F6108 <= gPurple_bottom_6F5F38 ) | |
| { | |
| pRight = gPurple_right_6F5B80; | |
| do | |
| { | |
| x_count = gPurple_left_6F5FD4; | |
| if ( gPurple_left_6F5FD4 <= pRight ) | |
| { | |
| left = (gPurple_left_6F5FD4 + 1) << 14; | |
| left_ = left; | |
| do | |
| { | |
| pBlock = Map_0x370::get_block_4DFE10(this, x_count, y_count, z_calc); | |
| if ( pBlock ) | |
| { | |
| slope_mask = pBlock->field_B_slope_type & 0xFC; | |
| if ( slope_mask >= 0xB4 && slope_mask <= 0xD0 ) | |
| { | |
| if ( slope_mask == 0xB4 | |
| || slope_mask == 0xC0 | |
| || slope_mask == 0xC4 | |
| || slope_mask == 0xD0 ) | |
| { | |
| p1.x.mValue = x_count << 14; | |
| p1.y.mValue = (y_count + 1) << 14; | |
| p2.x.mValue = left; | |
| } | |
| else | |
| { | |
| p1.x.mValue = x_count << 14; | |
| p1.y.mValue = y_count << 14; | |
| p2.x.mValue = left; | |
| ++y_count; | |
| } | |
| p2.y.mValue = y_count << 14; | |
| pTop = &pRect->field_8_top; | |
| pRight_1 = &pRect->field_4_right; | |
| if ( ComputeScanlineIntersectionY_4F76A0( | |
| &pRect->field_0_left, | |
| &pRect->field_4_right, | |
| &pRect->field_8_top, | |
| &p1, | |
| &p2) ) | |
| { | |
| return 1; | |
| } | |
| pBottom = &pRect->field_C_bottom; | |
| if ( ComputeScanlineIntersectionY_4F76A0( | |
| &pRect->field_0_left, | |
| pRight_1, | |
| &pRect->field_C_bottom, | |
| &p1, | |
| &p2) | |
| || IntersectVerticalLineWithSegment_4F77D0( | |
| pTop, | |
| pBottom, | |
| &pRect->field_0_left, | |
| &p1, | |
| &p2) | |
| || IntersectVerticalLineWithSegment_4F77D0( | |
| pTop, | |
| pBottom, | |
| pRight_1, | |
| &p1, | |
| &p2) ) | |
| { | |
| return 1; | |
| } | |
| left = left_; | |
| y_count = last_y_count; | |
| z_calc = z_calc_; | |
| } | |
| } | |
| pRight = gPurple_right_6F5B80; | |
| ++x_count; | |
| left += 0x4000; | |
| left_ = left; | |
| } | |
| while ( x_count <= gPurple_right_6F5B80 ); | |
| } | |
| last_y_count = ++y_count; | |
| } | |
| while ( y_count <= gPurple_bottom_6F5F38 ); | |
| } | |
| return 0; | |
| } | |
| void __thiscall Char_B4::HandleObjectCollision_548840( | |
| Char_B4 *this, | |
| Object_2C *pObj) | |
| { | |
| Object_2C *pObj_; // ebp | |
| char bUnknown; // bl | |
| Phi_74 *pPhi; // edx | |
| unsigned int phi_type; // eax | |
| unsigned __int8 field_26_varrok_idx; // cl | |
| __int32 f_4C; // eax | |
| Sprite *pSprite; // ecx | |
| int new_z; // edx | |
| __int32 new_y; // edi | |
| Sprite *pSprite_; // ecx | |
| Ang16 *ang; // eax | |
| char out3; // [esp+12h] [ebp-26h] BYREF | |
| char a6; // [esp+13h] [ebp-25h] BYREF | |
| Fix16_Point point; // [esp+14h] [ebp-24h] BYREF | |
| Fix16_Point a4; // [esp+1Ch] [ebp-1Ch] BYREF | |
| Fix16_Point hit_point; // [esp+24h] [ebp-14h] BYREF | |
| int v19; // [esp+34h] [ebp-4h] | |
| pObj_ = pObj; | |
| out3 = 0; | |
| bUnknown = 0; | |
| v19 = 4; | |
| pPhi = pObj->field_8; | |
| phi_type = pPhi->field_34_type; | |
| if ( phi_type == 6 | |
| || phi_type == 7 | |
| || phi_type == 8 | |
| || phi_type == 9 | |
| || phi_type == 10 | |
| || phi_type == 1 | |
| || phi_type == 12 | |
| || (field_26_varrok_idx = pObj->field_26_varrok_idx) == 0 | |
| || field_26_varrok_idx != this->field_7C_pPed->field_267_varrok_idx ) | |
| { | |
| if ( phi_type != 3 && phi_type != 4 && (phi_type > 2 || pPhi->field_44 != 2) ) | |
| { | |
| goto LABEL_28; | |
| } | |
| if ( Ped::IsField238_45EDE0(this->field_7C_pPed, 2) ) | |
| { | |
| if ( this->field_10_char_state == 15 ) | |
| { | |
| goto LABEL_28; | |
| } | |
| } | |
| else | |
| { | |
| f_4C = pObj_->field_8->field_4C; | |
| if ( f_4C == 3 ) | |
| { | |
| bUnknown = 1; | |
| } | |
| if ( f_4C && !bUnknown ) | |
| { | |
| goto LABEL_28; | |
| } | |
| } | |
| if ( pObj_->field_8->field_18 < dword_6FDAB0 ) | |
| { | |
| pSprite = this->field_80_sprite_ptr; | |
| new_z = dword_6FD7FC; | |
| new_y = dword_6FD800; | |
| if ( pSprite->field_14_xy.x.mValue != dword_6FD7F8 | |
| || pSprite->field_14_xy.y.mValue != dword_6FD800 | |
| || pSprite->field_1C_zpos != dword_6FD7FC ) | |
| { | |
| pSprite->field_14_xy.x.mValue = dword_6FD7F8; | |
| pSprite->field_14_xy.y.mValue = new_y; | |
| pSprite->field_1C_zpos = new_z; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(pSprite); | |
| } | |
| pSprite_ = this->field_80_sprite_ptr; | |
| ang = (Ang16 *)&pObj; | |
| LOWORD(ang) = pSprite_->field_0.field_0; | |
| point = *Sprite::FindCollisionIntersectionPoint_5A2710( | |
| pSprite_, | |
| &hit_point, | |
| pObj_->field_4, | |
| &a4, | |
| ang, | |
| &a6, | |
| (char *)&pObj, | |
| &out3); | |
| Object_2C::ResolveCollisionWithPed_5229B0(pObj_, this, &point, 1); | |
| return; | |
| } | |
| this->field_5C = 10; | |
| LABEL_28: | |
| Char_B4::HandleGenericCollision_54A530(this, 0, pObj_, 0); | |
| } | |
| } | |
| void __thiscall Char_B4::HandlePedCollision_548BD0(Char_B4 *this, Char_B4 *a2) | |
| { | |
| Char_B4 *v3; // edi | |
| Ped *field_7C_pPed; // eax | |
| ped_state_1 field_8_ped_state_1; // edx | |
| Ped *v6; // ecx | |
| int v7; // ebp | |
| Char_B4 *field_168_game_object; // eax | |
| char v9; // dl | |
| Char_B4 *v10; // edx | |
| char v11; // cl | |
| PedGroup *v12; // eax | |
| Sprite *v13; // eax | |
| Sprite *v14; // esi | |
| Sprite *field_80_sprite_ptr; // ecx | |
| int v16; // edx | |
| __int32 v17; // edi | |
| __int32 field_38_velocity; // edx | |
| PedGroup *field_164_ped_group; // eax | |
| Sprite *v20; // eax | |
| Sprite *v21; // esi | |
| Ped *v22; // ecx | |
| PedGroup *v23; // eax | |
| Sprite *v24; // eax | |
| Sprite *v25; // esi | |
| Ped *v26; // ecx | |
| PedGroup *v27; // eax | |
| Sprite *v28; // eax | |
| Sprite *v29; // esi | |
| __int16 v30; // si | |
| Ped *v31; // ecx | |
| __int32 field_25C_car_state; // eax | |
| Sprite *v33; // edi | |
| Sprite *v34; // eax | |
| Sprite *v35; // edi | |
| Sprite *v36; // eax | |
| Sprite *v37; // eax | |
| Sprite *v38; // esi | |
| __int16 *v39; // eax | |
| bool v40; // sf | |
| __int16 v41; // si | |
| __int16 v42; // si | |
| __int16 v43; // [esp+10h] [ebp-4Ch] BYREF | |
| __int16 v44; // [esp+12h] [ebp-4Ah] BYREF | |
| __int16 pRet_Ang16; // [esp+14h] [ebp-48h] BYREF | |
| __int16 v46; // [esp+16h] [ebp-46h] BYREF | |
| __int16 v47; // [esp+18h] [ebp-44h] BYREF | |
| __int16 v48; // [esp+1Ah] [ebp-42h] BYREF | |
| __int16 v49; // [esp+1Ch] [ebp-40h] BYREF | |
| __int16 v50; // [esp+1Eh] [ebp-3Eh] BYREF | |
| int v51; // [esp+20h] [ebp-3Ch] BYREF | |
| Fix16 pMaybeY_FP16; // [esp+24h] [ebp-38h] BYREF | |
| int pMaybeX_FP16; // [esp+28h] [ebp-34h] BYREF | |
| Fix16 v54; // [esp+2Ch] [ebp-30h] BYREF | |
| Fix16 v55; // [esp+30h] [ebp-2Ch] BYREF | |
| Fix16 v56; // [esp+34h] [ebp-28h] BYREF | |
| Fix16 v57; // [esp+38h] [ebp-24h] BYREF | |
| Fix16 v58; // [esp+3Ch] [ebp-20h] BYREF | |
| Fix16 v59; // [esp+40h] [ebp-1Ch] BYREF | |
| Fix16 v60; // [esp+44h] [ebp-18h] BYREF | |
| Fix16 v61; // [esp+48h] [ebp-14h] BYREF | |
| Fix16 v62; // [esp+4Ch] [ebp-10h] BYREF | |
| Fix16 v63; // [esp+50h] [ebp-Ch] BYREF | |
| Fix16 v64; // [esp+54h] [ebp-8h] BYREF | |
| Fix16 v65; // [esp+58h] [ebp-4h] BYREF | |
| v3 = a2; | |
| field_7C_pPed = this->field_7C_pPed; | |
| field_8_ped_state_1 = a2->field_8_ped_state_1; | |
| v51 = field_7C_pPed->field_238; | |
| v6 = a2->field_7C_pPed; | |
| v7 = v6->field_238; | |
| if ( field_8_ped_state_1 != dead_9 | |
| && field_8_ped_state_1 != immobilized_8 | |
| && SLOBYTE(this->field_58_flags) >= 0 | |
| && this->field_10_char_state != 15 ) | |
| { | |
| if ( field_7C_pPed->field_15C_player ) | |
| { | |
| if ( v6->field_240_occupation == elvis ) | |
| { | |
| field_168_game_object = field_7C_pPed->field_168_game_object; | |
| if ( field_168_game_object != v6->field_138 ) | |
| { | |
| v9 = v6->field_224; | |
| v6->field_138 = field_168_game_object; | |
| v6->field_224 = v9 & 0xFB; | |
| field_168_game_object->field_7C_pPed->field_138 = v6->field_168_game_object; | |
| if ( (v6->field_21C & 0x1000000) == 0 ) | |
| { | |
| v6->field_250 = 22; | |
| } | |
| } | |
| goto LABEL_15; | |
| } | |
| } | |
| else if ( (field_7C_pPed->field_200_id & 3) != 0 ) | |
| { | |
| LABEL_15: | |
| switch ( v51 ) | |
| { | |
| case 2: | |
| switch ( v7 ) | |
| { | |
| case 2: | |
| field_80_sprite_ptr = this->field_80_sprite_ptr; | |
| v16 = dword_6FD7FC; | |
| v17 = dword_6FD800; | |
| if ( field_80_sprite_ptr->field_14_xy.x.mValue != dword_6FD7F8 | |
| || field_80_sprite_ptr->field_14_xy.y.mValue != dword_6FD800 | |
| || field_80_sprite_ptr->field_1C_zpos != dword_6FD7FC ) | |
| { | |
| goto LABEL_24; | |
| } | |
| break; | |
| case 3: | |
| case 4: | |
| case 6: | |
| field_38_velocity = this->field_38_velocity; | |
| this->field_10_char_state = 1; | |
| if ( field_38_velocity != k_dword_6FD7C0 ) | |
| { | |
| field_164_ped_group = this->field_7C_pPed->field_164_ped_group; | |
| if ( !field_164_ped_group | |
| || v3->field_7C_pPed->field_164_ped_group != field_164_ped_group ) | |
| { | |
| v20 = v3->field_80_sprite_ptr; | |
| v3->field_6A = 4; | |
| v21 = this->field_80_sprite_ptr; | |
| v54.mValue = v21->field_14_xy.x.mValue | |
| - v20->field_14_xy.x.mValue; | |
| v55.mValue = v21->field_14_xy.y.mValue | |
| - v20->field_14_xy.y.mValue; | |
| v43 = k_dword_6FD936 + *atan2_fixed_405320(&v46, &v55, &v54); | |
| Ang16::Normalize_406C20(&v43); | |
| v3->field_74 = v43; | |
| } | |
| } | |
| break; | |
| case 5: | |
| v12 = this->field_7C_pPed->field_164_ped_group; | |
| if ( !v12 || v3->field_7C_pPed->field_164_ped_group != v12 ) | |
| { | |
| if ( v3->field_7C_pPed->field_240_occupation == stand_still_bloke ) | |
| { | |
| field_80_sprite_ptr = this->field_80_sprite_ptr; | |
| v16 = dword_6FD7FC; | |
| v17 = dword_6FD800; | |
| if ( field_80_sprite_ptr->field_14_xy.x.mValue != dword_6FD7F8 | |
| || field_80_sprite_ptr->field_14_xy.y.mValue != dword_6FD800 | |
| || field_80_sprite_ptr->field_1C_zpos != dword_6FD7FC ) | |
| { | |
| LABEL_24: | |
| field_80_sprite_ptr->field_14_xy.x.mValue = dword_6FD7F8; | |
| field_80_sprite_ptr->field_14_xy.y.mValue = v17; | |
| field_80_sprite_ptr->field_1C_zpos = v16; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(field_80_sprite_ptr); | |
| } | |
| } | |
| else | |
| { | |
| v13 = v3->field_80_sprite_ptr; | |
| v3->field_6A = 4; | |
| v14 = this->field_80_sprite_ptr; | |
| pMaybeY_FP16.mValue = v14->field_14_xy.x.mValue | |
| - v13->field_14_xy.x.mValue; | |
| pMaybeX_FP16 = v14->field_14_xy.y.mValue | |
| - v13->field_14_xy.y.mValue; | |
| LOWORD(a2) = k_dword_6FD936 | |
| + *atan2_fixed_405320( | |
| &pRet_Ang16, | |
| (Fix16 *)&pMaybeX_FP16, | |
| &pMaybeY_FP16); | |
| Ang16::Normalize_406C20((__int16 *)&a2); | |
| v3->field_74 = (__int16)a2; | |
| } | |
| } | |
| break; | |
| default: | |
| return; | |
| } | |
| break; | |
| case 3: | |
| v31 = this->field_7C_pPed; | |
| field_25C_car_state = v31->field_25C_car_state; | |
| if ( field_25C_car_state == 48 | |
| || field_25C_car_state == 37 | |
| || field_25C_car_state == 38 | |
| || field_25C_car_state == 12 ) | |
| { | |
| this->field_38_velocity = k_dword_6FD7CC; | |
| } | |
| else | |
| { | |
| switch ( v7 ) | |
| { | |
| case 2: | |
| if ( v3->field_7C_pPed->field_20A_wanted_points < 1 | |
| || !Ped::sub_45B4E0(v31) ) | |
| { | |
| if ( v3->field_38_velocity == k_dword_6FD7C0 ) | |
| { | |
| v33 = v3->field_80_sprite_ptr; | |
| v34 = this->field_80_sprite_ptr; | |
| v60.mValue = v34->field_14_xy.x.mValue | |
| - v33->field_14_xy.x.mValue; | |
| v61.mValue = v34->field_14_xy.y.mValue | |
| - v33->field_14_xy.y.mValue; | |
| this->field_40_rotation = *atan2_fixed_405320( | |
| &v49, | |
| &v61, | |
| &v60); | |
| } | |
| else | |
| { | |
| this->field_38_velocity = dword_6FD860; | |
| } | |
| } | |
| break; | |
| case 3: | |
| if ( !this->field_20 ) | |
| { | |
| v37 = v3->field_80_sprite_ptr; | |
| v3->field_6A = 4; | |
| v38 = this->field_80_sprite_ptr; | |
| v64.mValue = v38->field_14_xy.x.mValue | |
| - v37->field_14_xy.x.mValue; | |
| v65.mValue = v38->field_14_xy.y.mValue | |
| - v37->field_14_xy.y.mValue; | |
| v39 = atan2_fixed_405320((__int16 *)&v51, &v65, &v64); | |
| v40 = (__int16)(k_dword_6FD936 + *v39) < 0; | |
| v41 = k_dword_6FD936 + *v39; | |
| LOWORD(a2) = v41; | |
| if ( v40 ) | |
| { | |
| v41 += 1440 * ((1439 - v41) / 0x5A0u); | |
| LOWORD(a2) = v41; | |
| } | |
| if ( v41 >= 1440 ) | |
| { | |
| LOWORD(a2) = v41 % 0x5A0u; | |
| } | |
| v42 = dword_6FD888 + (_WORD)a2; | |
| if ( (__int16)(dword_6FD888 + (_WORD)a2) < 0 ) | |
| { | |
| v42 += 1440 * ((1439 - v42) / 0x5A0u); | |
| } | |
| if ( v42 >= 1440 ) | |
| { | |
| v42 %= 0x5A0u; | |
| } | |
| v3->field_74 = v42; | |
| } | |
| break; | |
| case 4: | |
| case 6: | |
| this->field_38_velocity = dword_6FD860; | |
| break; | |
| case 5: | |
| if ( v3->field_38_velocity == k_dword_6FD7C0 ) | |
| { | |
| v35 = v3->field_80_sprite_ptr; | |
| v36 = this->field_80_sprite_ptr; | |
| v62.mValue = v36->field_14_xy.x.mValue | |
| - v35->field_14_xy.x.mValue; | |
| v63.mValue = v36->field_14_xy.y.mValue | |
| - v35->field_14_xy.y.mValue; | |
| this->field_40_rotation = *atan2_fixed_405320( | |
| &v50, | |
| &v63, | |
| &v62); | |
| } | |
| else | |
| { | |
| this->field_38_velocity = dword_6FD860; | |
| } | |
| break; | |
| default: | |
| return; | |
| } | |
| } | |
| break; | |
| case 4: | |
| case 6: | |
| switch ( v7 ) | |
| { | |
| case 2: | |
| if ( v3->field_7C_pPed->field_20A_wanted_points >= 1 ) | |
| { | |
| Ped::sub_45B4E0(this->field_7C_pPed); | |
| } | |
| break; | |
| case 3: | |
| v28 = v3->field_80_sprite_ptr; | |
| v3->field_6A = 4; | |
| v29 = this->field_80_sprite_ptr; | |
| v58.mValue = v29->field_14_xy.x.mValue - v28->field_14_xy.x.mValue; | |
| v59.mValue = v29->field_14_xy.y.mValue - v28->field_14_xy.y.mValue; | |
| v30 = k_dword_6FD936 + *atan2_fixed_405320(&v48, &v59, &v58); | |
| if ( v30 < 0 ) | |
| { | |
| v30 += 1440 * ((1439 - v30) / 0x5A0u); | |
| } | |
| if ( v30 >= 1440 ) | |
| { | |
| v30 %= 0x5A0u; | |
| } | |
| v3->field_74 = v30; | |
| break; | |
| case 4: | |
| case 6: | |
| if ( this->field_10_char_state == 10 ) | |
| { | |
| goto LABEL_46; | |
| } | |
| v26 = this->field_7C_pPed; | |
| if ( v26->field_200_id >= (unsigned __int32)v3->field_7C_pPed->field_200_id ) | |
| { | |
| goto LABEL_46; | |
| } | |
| v27 = v26->field_164_ped_group; | |
| if ( (!v27 || v27->field_30) | |
| && this->field_8_ped_state_1 != entering_car_3 ) | |
| { | |
| if ( v26->field_25C_car_state != 11 ) | |
| { | |
| for ( this->field_40_rotation += dword_6FD888; | |
| this->field_40_rotation < 0; | |
| this->field_40_rotation += 1440 ) | |
| { | |
| ; | |
| } | |
| for ( ; | |
| this->field_40_rotation >= 1440; | |
| this->field_40_rotation -= 1440 ) | |
| { | |
| ; | |
| } | |
| } | |
| goto LABEL_59; | |
| } | |
| break; | |
| default: | |
| return; | |
| } | |
| break; | |
| case 5: | |
| switch ( v7 ) | |
| { | |
| case 3: | |
| case 4: | |
| case 6: | |
| v24 = v3->field_80_sprite_ptr; | |
| v3->field_6A = 4; | |
| v25 = this->field_80_sprite_ptr; | |
| v56.mValue = v25->field_14_xy.x.mValue - v24->field_14_xy.x.mValue; | |
| v57.mValue = v25->field_14_xy.y.mValue - v24->field_14_xy.y.mValue; | |
| v44 = *atan2_fixed_405320(&v47, &v57, &v56) + k_dword_6FD936; | |
| Ang16::Normalize_406C20(&v44); | |
| v3->field_74 = v44; | |
| break; | |
| case 5: | |
| if ( this->field_10_char_state == 10 | |
| || (v22 = this->field_7C_pPed, | |
| v22->field_200_id >= (unsigned __int32)v3->field_7C_pPed->field_200_id) ) | |
| { | |
| LABEL_46: | |
| this->field_10_char_state = 1; | |
| } | |
| else | |
| { | |
| v23 = v22->field_164_ped_group; | |
| if ( !v23 || v23->field_30 ) | |
| { | |
| if ( this->field_8_ped_state_1 == entering_car_3 ) | |
| { | |
| this->field_38_velocity = k_dword_6FD7C0; | |
| } | |
| else if ( v22->field_25C_car_state == 11 ) | |
| { | |
| LABEL_59: | |
| this->field_10_char_state = 10; | |
| } | |
| else | |
| { | |
| for ( this->field_40_rotation += dword_6FD888; | |
| this->field_40_rotation < 0; | |
| this->field_40_rotation += 1440 ) | |
| { | |
| ; | |
| } | |
| for ( ; | |
| this->field_40_rotation >= 1440; | |
| this->field_40_rotation -= 1440 ) | |
| { | |
| ; | |
| } | |
| this->field_10_char_state = 10; | |
| } | |
| } | |
| } | |
| break; | |
| default: | |
| return; | |
| } | |
| break; | |
| default: | |
| return; | |
| } | |
| return; | |
| } | |
| if ( !v6->field_15C_player && a2 != field_7C_pPed->field_138 ) | |
| { | |
| v10 = field_7C_pPed->field_168_game_object; | |
| v11 = field_7C_pPed->field_224 | 4; | |
| field_7C_pPed->field_138 = a2; | |
| field_7C_pPed->field_224 = v11; | |
| v3->field_7C_pPed->field_138 = v10; | |
| } | |
| goto LABEL_15; | |
| } | |
| } | |
| void __thiscall Char_B4::ApplyMovement_54CC40(Char_B4 *this) | |
| { | |
| __int32 *v2; // edi | |
| int v3; // eax | |
| int *v4; // eax | |
| int v5; // edx | |
| int *v6; // eax | |
| Sprite *v7; // ecx | |
| __int32 v8; // esi | |
| __int32 v9; // edx | |
| __int32 v10; // eax | |
| int v11; // eax | |
| int *v12; // eax | |
| int v13; // edx | |
| int *v14; // eax | |
| Sprite *v15; // ecx | |
| __int32 v16; // esi | |
| __int32 v17; // edx | |
| __int32 v18; // eax | |
| __int32 *p_field_38_velocity; // edi | |
| int v20; // eax | |
| int *v21; // eax | |
| int v22; // edx | |
| int *v23; // eax | |
| Sprite *field_80_sprite_ptr; // ecx | |
| __int32 field_1C_zpos; // esi | |
| __int32 v26; // edx | |
| __int32 v27; // eax | |
| int v28; // eax | |
| int *v29; // eax | |
| int v30; // edx | |
| int *v31; // eax | |
| Sprite *v32; // ecx | |
| __int32 v33; // esi | |
| __int32 v34; // edx | |
| __int32 v35; // eax | |
| int v36; // eax | |
| int *v37; // eax | |
| int v38; // edx | |
| int *v39; // eax | |
| Sprite *v40; // ecx | |
| __int32 v41; // esi | |
| __int32 v42; // edx | |
| __int32 v43; // eax | |
| int v44; // eax | |
| int *v45; // eax | |
| int v46; // edx | |
| int *v47; // eax | |
| Sprite *v48; // ecx | |
| __int32 v49; // esi | |
| __int32 v50; // edx | |
| __int32 v51; // eax | |
| __int32 *v52; // edi | |
| int *v53; // eax | |
| int v54; // edx | |
| int v55; // eax | |
| int *v56; // eax | |
| int v57; // edx | |
| int *v58; // eax | |
| Sprite *v59; // ecx | |
| __int32 v60; // esi | |
| __int32 v61; // edx | |
| __int32 v62; // eax | |
| int v63; // eax | |
| int *v64; // eax | |
| int v65; // edx | |
| int *v66; // eax | |
| Sprite *v67; // ecx | |
| __int32 v68; // esi | |
| __int32 v69; // edx | |
| __int32 v70; // eax | |
| __int32 *v71; // edi | |
| int v72; // eax | |
| int *v73; // eax | |
| int v74; // edx | |
| int *v75; // eax | |
| Sprite *v76; // ecx | |
| __int32 v77; // esi | |
| __int32 v78; // edx | |
| __int32 v79; // eax | |
| int v80; // eax | |
| int *v81; // eax | |
| int v82; // edx | |
| int *v83; // eax | |
| Sprite *v84; // ecx | |
| __int32 v85; // esi | |
| __int32 v86; // edx | |
| __int32 v87; // eax | |
| int v88; // eax | |
| int *v89; // eax | |
| int v90; // edx | |
| _DWORD *v91; // eax | |
| int *v92; // eax | |
| Sprite *v93; // eax | |
| __int32 *v94; // eax | |
| __int32 v95; // [esp-8h] [ebp-58h] | |
| __int32 v96; // [esp-4h] [ebp-54h] | |
| int v97; // [esp+8h] [ebp-48h] BYREF | |
| int v98; // [esp+Ch] [ebp-44h] BYREF | |
| int v99; // [esp+10h] [ebp-40h] BYREF | |
| int v100; // [esp+14h] [ebp-3Ch] BYREF | |
| int v101; // [esp+18h] [ebp-38h] BYREF | |
| int v102; // [esp+1Ch] [ebp-34h] BYREF | |
| int v103; // [esp+20h] [ebp-30h] BYREF | |
| int v104; // [esp+24h] [ebp-2Ch] BYREF | |
| int v105; // [esp+28h] [ebp-28h] BYREF | |
| int v106; // [esp+2Ch] [ebp-24h] BYREF | |
| int v107; // [esp+30h] [ebp-20h] BYREF | |
| int v108; // [esp+34h] [ebp-1Ch] BYREF | |
| int v109; // [esp+38h] [ebp-18h] BYREF | |
| int v110; // [esp+3Ch] [ebp-14h] BYREF | |
| int v111; // [esp+40h] [ebp-10h] BYREF | |
| int v112; // [esp+44h] [ebp-Ch] BYREF | |
| int v113; // [esp+48h] [ebp-8h] BYREF | |
| int v114; // [esp+4Ch] [ebp-4h] BYREF | |
| LOBYTE(v99) = Ang16::ToAng8_4056A0((Ang16 *)&this->field_40_rotation); | |
| switch ( dword_623F44 ) | |
| { | |
| case 1: | |
| switch ( (char)v99 ) | |
| { | |
| case 0: | |
| case 1: | |
| case 2: | |
| case 3: | |
| p_field_38_velocity = &this->field_38_velocity; | |
| v110 = gSin_table_667A80[word_6FDA64]; | |
| v97 = *Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v110 = gCos_table_669260[word_6FDA64]; | |
| v20 = *Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v97 += dword_6FD7F8; | |
| v98 = dword_6FD800 + v20; | |
| word_6FD808 = word_6FDA64; | |
| if ( Char_B4::CanStepDiagonal_54EF60( | |
| this, | |
| v97 >> 14, | |
| (dword_6FD800 + v20) >> 14) ) | |
| { | |
| v101 = ((__int64)*p_field_38_velocity << 14) / k_dword_6FD9EC; | |
| v110 = gSin_table_667A80[word_6FDA64]; | |
| v21 = Fix16::Multiply_408680(&v110, &v111, &v101); | |
| v22 = gCos_table_669260[word_6FDA64]; | |
| v97 = *v21; | |
| v110 = v22; | |
| v23 = Fix16::Multiply_408680(&v110, &v111, &v101); | |
| field_80_sprite_ptr = this->field_80_sprite_ptr; | |
| v98 = *v23; | |
| field_1C_zpos = field_80_sprite_ptr->field_1C_zpos; | |
| v26 = v98 + field_80_sprite_ptr->field_14_xy.y.mValue; | |
| v27 = v97 + field_80_sprite_ptr->field_14_xy.x.mValue; | |
| if ( field_80_sprite_ptr->field_14_xy.x.mValue != v27 | |
| || field_80_sprite_ptr->field_14_xy.y.mValue != v26 ) | |
| { | |
| field_80_sprite_ptr->field_14_xy.x.mValue = v27; | |
| field_80_sprite_ptr->field_14_xy.y.mValue = v26; | |
| field_80_sprite_ptr->field_1C_zpos = field_1C_zpos; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(field_80_sprite_ptr); | |
| } | |
| } | |
| else | |
| { | |
| v110 = gSin_table_667A80[word_6FDB3C]; | |
| v97 = *Fix16::Multiply_408680( | |
| &v110, | |
| &v111, | |
| &this->field_38_velocity); | |
| v110 = gCos_table_669260[word_6FDB3C]; | |
| v28 = *Fix16::Multiply_408680( | |
| &v110, | |
| &v111, | |
| &this->field_38_velocity); | |
| v97 += dword_6FD7F8; | |
| v98 = dword_6FD800 + v28; | |
| word_6FD808 = word_6FDB3C; | |
| if ( Char_B4::CanStepDiagonal_54EF60( | |
| this, | |
| v97 >> 14, | |
| (dword_6FD800 + v28) >> 14) ) | |
| { | |
| v102 = ((__int64)*p_field_38_velocity << 14) / k_dword_6FD9EC; | |
| v110 = gSin_table_667A80[word_6FDB3C]; | |
| v29 = Fix16::Multiply_408680(&v110, &v111, &v102); | |
| v30 = gCos_table_669260[word_6FDB3C]; | |
| v97 = *v29; | |
| v110 = v30; | |
| v31 = Fix16::Multiply_408680(&v110, &v111, &v102); | |
| v32 = this->field_80_sprite_ptr; | |
| v98 = *v31; | |
| v33 = v32->field_1C_zpos; | |
| v34 = v98 + v32->field_14_xy.y.mValue; | |
| v35 = v97 + v32->field_14_xy.x.mValue; | |
| if ( v32->field_14_xy.x.mValue != v35 | |
| || v32->field_14_xy.y.mValue != v34 ) | |
| { | |
| v32->field_14_xy.x.mValue = v35; | |
| v32->field_14_xy.y.mValue = v34; | |
| v32->field_1C_zpos = v33; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v32); | |
| } | |
| } | |
| } | |
| break; | |
| case 4: | |
| case 5: | |
| case 6: | |
| case 7: | |
| v2 = &this->field_38_velocity; | |
| v110 = gSin_table_667A80[word_6FD904]; | |
| v97 = *Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v110 = gCos_table_669260[word_6FD904]; | |
| v3 = *Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v97 += dword_6FD7F8; | |
| v98 = dword_6FD800 + v3; | |
| word_6FD808 = word_6FD904; | |
| if ( Char_B4::CanStepDiagonal_54EF60( | |
| this, | |
| v97 >> 14, | |
| (dword_6FD800 + v3) >> 14) ) | |
| { | |
| v99 = ((__int64)*v2 << 14) / k_dword_6FD9EC; | |
| v110 = gSin_table_667A80[word_6FD904]; | |
| v4 = Fix16::Multiply_408680(&v110, &v111, &v99); | |
| v5 = gCos_table_669260[word_6FD904]; | |
| v97 = *v4; | |
| v110 = v5; | |
| v6 = Fix16::Multiply_408680(&v110, &v111, &v99); | |
| v7 = this->field_80_sprite_ptr; | |
| v98 = *v6; | |
| v8 = v7->field_1C_zpos; | |
| v9 = v98 + v7->field_14_xy.y.mValue; | |
| v10 = v97 + v7->field_14_xy.x.mValue; | |
| if ( v7->field_14_xy.x.mValue != v10 | |
| || v7->field_14_xy.y.mValue != v9 ) | |
| { | |
| v7->field_14_xy.x.mValue = v10; | |
| v7->field_14_xy.y.mValue = v9; | |
| v7->field_1C_zpos = v8; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v7); | |
| } | |
| } | |
| else | |
| { | |
| v110 = gSin_table_667A80[word_6FDB3C]; | |
| v97 = *Fix16::Multiply_408680( | |
| &v110, | |
| &v111, | |
| &this->field_38_velocity); | |
| v110 = gCos_table_669260[word_6FDB3C]; | |
| v11 = *Fix16::Multiply_408680( | |
| &v110, | |
| &v111, | |
| &this->field_38_velocity); | |
| v97 += dword_6FD7F8; | |
| v98 = dword_6FD800 + v11; | |
| word_6FD808 = word_6FDB3C; | |
| if ( Char_B4::CanStepDiagonal_54EF60( | |
| this, | |
| v97 >> 14, | |
| (dword_6FD800 + v11) >> 14) ) | |
| { | |
| v100 = ((__int64)*v2 << 14) / k_dword_6FD9EC; | |
| v110 = gSin_table_667A80[word_6FDB3C]; | |
| v12 = Fix16::Multiply_408680(&v110, &v111, &v100); | |
| v13 = gCos_table_669260[word_6FDB3C]; | |
| v97 = *v12; | |
| v110 = v13; | |
| v14 = Fix16::Multiply_408680(&v110, &v111, &v100); | |
| v15 = this->field_80_sprite_ptr; | |
| v98 = *v14; | |
| v16 = v15->field_1C_zpos; | |
| v17 = v98 + v15->field_14_xy.y.mValue; | |
| v18 = v97 + v15->field_14_xy.x.mValue; | |
| if ( v15->field_14_xy.x.mValue != v18 | |
| || v15->field_14_xy.y.mValue != v17 ) | |
| { | |
| v15->field_14_xy.x.mValue = v18; | |
| v15->field_14_xy.y.mValue = v17; | |
| v15->field_1C_zpos = v16; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v15); | |
| } | |
| } | |
| } | |
| break; | |
| default: | |
| return; | |
| } | |
| break; | |
| case 2: | |
| switch ( (char)v99 ) | |
| { | |
| case 0: | |
| case 1: | |
| case 2: | |
| case 3: | |
| v52 = &this->field_38_velocity; | |
| v110 = gSin_table_667A80[word_6FDA64]; | |
| v53 = Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v54 = gCos_table_669260[word_6FDA64]; | |
| v97 = *v53; | |
| v110 = v54; | |
| v55 = *Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v97 += dword_6FD7F8; | |
| v98 = dword_6FD800 + v55; | |
| word_6FD808 = word_6FDA64; | |
| if ( Char_B4::CanStepDiagonal_54EF60( | |
| this, | |
| v97 >> 14, | |
| (dword_6FD800 + v55) >> 14) ) | |
| { | |
| v105 = ((__int64)*v52 << 14) / k_dword_6FD9EC; | |
| v110 = gSin_table_667A80[word_6FDA64]; | |
| v56 = Fix16::Multiply_408680(&v110, &v111, &v105); | |
| v57 = gCos_table_669260[word_6FDA64]; | |
| v97 = *v56; | |
| v110 = v57; | |
| v58 = Fix16::Multiply_408680(&v110, &v111, &v105); | |
| v59 = this->field_80_sprite_ptr; | |
| v98 = *v58; | |
| v60 = v59->field_1C_zpos; | |
| v61 = v98 + v59->field_14_xy.y.mValue; | |
| v62 = v97 + v59->field_14_xy.x.mValue; | |
| if ( v59->field_14_xy.x.mValue != v62 | |
| || v59->field_14_xy.y.mValue != v61 ) | |
| { | |
| v59->field_14_xy.x.mValue = v62; | |
| v59->field_14_xy.y.mValue = v61; | |
| v59->field_1C_zpos = v60; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v59); | |
| } | |
| } | |
| else | |
| { | |
| v110 = gSin_table_667A80[word_6FD8E8]; | |
| v97 = *Fix16::Multiply_408680( | |
| &v110, | |
| &v111, | |
| &this->field_38_velocity); | |
| v110 = gCos_table_669260[word_6FD8E8]; | |
| v63 = *Fix16::Multiply_408680( | |
| &v110, | |
| &v111, | |
| &this->field_38_velocity); | |
| v97 += dword_6FD7F8; | |
| v98 = dword_6FD800 + v63; | |
| word_6FD808 = word_6FD8E8; | |
| if ( Char_B4::CanStepDiagonal_54EF60( | |
| this, | |
| v97 >> 14, | |
| (dword_6FD800 + v63) >> 14) ) | |
| { | |
| v106 = ((__int64)*v52 << 14) / k_dword_6FD9EC; | |
| v110 = gSin_table_667A80[word_6FD8E8]; | |
| v64 = Fix16::Multiply_408680(&v110, &v111, &v106); | |
| v65 = gCos_table_669260[word_6FD8E8]; | |
| v97 = *v64; | |
| v110 = v65; | |
| v66 = Fix16::Multiply_408680(&v110, &v111, &v106); | |
| v67 = this->field_80_sprite_ptr; | |
| v98 = *v66; | |
| v68 = v67->field_1C_zpos; | |
| v69 = v98 + v67->field_14_xy.y.mValue; | |
| v70 = v97 + v67->field_14_xy.x.mValue; | |
| if ( v67->field_14_xy.x.mValue != v70 | |
| || v67->field_14_xy.y.mValue != v69 ) | |
| { | |
| v67->field_14_xy.x.mValue = v70; | |
| v67->field_14_xy.y.mValue = v69; | |
| v67->field_1C_zpos = v68; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v67); | |
| } | |
| } | |
| } | |
| break; | |
| case 4: | |
| case 5: | |
| case 6: | |
| case 7: | |
| v71 = &this->field_38_velocity; | |
| v110 = gSin_table_667A80[word_6FD904]; | |
| v97 = *Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v110 = gCos_table_669260[word_6FD904]; | |
| v72 = *Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v97 += dword_6FD7F8; | |
| v98 = dword_6FD800 + v72; | |
| word_6FD808 = word_6FD904; | |
| if ( Char_B4::CanStepDiagonal_54EF60( | |
| this, | |
| v97 >> 14, | |
| (dword_6FD800 + v72) >> 14) ) | |
| { | |
| v107 = ((__int64)*v71 << 14) / k_dword_6FD9EC; | |
| v110 = gSin_table_667A80[word_6FD904]; | |
| v73 = Fix16::Multiply_408680(&v110, &v111, &v107); | |
| v74 = gCos_table_669260[word_6FD904]; | |
| v97 = *v73; | |
| v110 = v74; | |
| v75 = Fix16::Multiply_408680(&v110, &v111, &v107); | |
| v76 = this->field_80_sprite_ptr; | |
| v98 = *v75; | |
| v77 = v76->field_1C_zpos; | |
| v78 = v98 + v76->field_14_xy.y.mValue; | |
| v79 = v97 + v76->field_14_xy.x.mValue; | |
| if ( v76->field_14_xy.x.mValue != v79 | |
| || v76->field_14_xy.y.mValue != v78 ) | |
| { | |
| v76->field_14_xy.x.mValue = v79; | |
| v76->field_14_xy.y.mValue = v78; | |
| v76->field_1C_zpos = v77; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v76); | |
| } | |
| } | |
| else | |
| { | |
| v110 = gSin_table_667A80[word_6FD8E8]; | |
| v97 = *Fix16::Multiply_408680( | |
| &v110, | |
| &v111, | |
| &this->field_38_velocity); | |
| v110 = gCos_table_669260[word_6FD8E8]; | |
| v80 = *Fix16::Multiply_408680( | |
| &v110, | |
| &v111, | |
| &this->field_38_velocity); | |
| v97 += dword_6FD7F8; | |
| v98 = dword_6FD800 + v80; | |
| word_6FD808 = word_6FD8E8; | |
| if ( Char_B4::CanStepDiagonal_54EF60( | |
| this, | |
| v97 >> 14, | |
| (dword_6FD800 + v80) >> 14) ) | |
| { | |
| v108 = ((__int64)*v71 << 14) / k_dword_6FD9EC; | |
| v110 = gSin_table_667A80[word_6FD8E8]; | |
| v81 = Fix16::Multiply_408680(&v110, &v111, &v108); | |
| v82 = gCos_table_669260[word_6FD8E8]; | |
| v97 = *v81; | |
| v110 = v82; | |
| v83 = Fix16::Multiply_408680(&v110, &v111, &v108); | |
| v84 = this->field_80_sprite_ptr; | |
| v98 = *v83; | |
| v85 = v84->field_1C_zpos; | |
| v86 = v98 + v84->field_14_xy.y.mValue; | |
| v87 = v97 + v84->field_14_xy.x.mValue; | |
| if ( v84->field_14_xy.x.mValue != v87 | |
| || v84->field_14_xy.y.mValue != v86 ) | |
| { | |
| v84->field_14_xy.x.mValue = v87; | |
| v84->field_14_xy.y.mValue = v86; | |
| v84->field_1C_zpos = v85; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v84); | |
| } | |
| } | |
| } | |
| break; | |
| default: | |
| return; | |
| } | |
| break; | |
| case 3: | |
| switch ( (char)v99 ) | |
| { | |
| case 0: | |
| case 1: | |
| case 6: | |
| case 7: | |
| v110 = gSin_table_667A80[word_6FDB3C]; | |
| v97 = *Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v110 = gCos_table_669260[word_6FDB3C]; | |
| v44 = *Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v97 += dword_6FD7F8; | |
| v98 = dword_6FD800 + v44; | |
| word_6FD808 = word_6FDB3C; | |
| if ( Char_B4::CanStepDiagonal_54EF60( | |
| this, | |
| v97 >> 14, | |
| (dword_6FD800 + v44) >> 14) ) | |
| { | |
| v104 = ((__int64)this->field_38_velocity << 14) / k_dword_6FD9EC; | |
| v110 = gSin_table_667A80[word_6FDB3C]; | |
| v45 = Fix16::Multiply_408680(&v110, &v111, &v104); | |
| v46 = gCos_table_669260[word_6FDB3C]; | |
| v97 = *v45; | |
| v110 = v46; | |
| v47 = Fix16::Multiply_408680(&v110, &v111, &v104); | |
| v48 = this->field_80_sprite_ptr; | |
| v98 = *v47; | |
| v49 = v48->field_1C_zpos; | |
| v50 = v98 + v48->field_14_xy.y.mValue; | |
| v51 = v97 + v48->field_14_xy.x.mValue; | |
| if ( v48->field_14_xy.x.mValue != v51 | |
| || v48->field_14_xy.y.mValue != v50 ) | |
| { | |
| v48->field_14_xy.x.mValue = v51; | |
| v48->field_14_xy.y.mValue = v50; | |
| v48->field_1C_zpos = v49; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v48); | |
| } | |
| } | |
| break; | |
| case 2: | |
| case 3: | |
| case 4: | |
| case 5: | |
| v110 = gSin_table_667A80[word_6FD8E8]; | |
| v97 = *Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v110 = gCos_table_669260[word_6FD8E8]; | |
| v36 = *Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v97 += dword_6FD7F8; | |
| v98 = dword_6FD800 + v36; | |
| word_6FD808 = word_6FD8E8; | |
| if ( Char_B4::CanStepDiagonal_54EF60( | |
| this, | |
| v97 >> 14, | |
| (dword_6FD800 + v36) >> 14) ) | |
| { | |
| v103 = ((__int64)this->field_38_velocity << 14) / k_dword_6FD9EC; | |
| v110 = gSin_table_667A80[word_6FD8E8]; | |
| v37 = Fix16::Multiply_408680(&v110, &v111, &v103); | |
| v38 = gCos_table_669260[word_6FD8E8]; | |
| v97 = *v37; | |
| v110 = v38; | |
| v39 = Fix16::Multiply_408680(&v110, &v111, &v103); | |
| v40 = this->field_80_sprite_ptr; | |
| v98 = *v39; | |
| v41 = v40->field_1C_zpos; | |
| v42 = v98 + v40->field_14_xy.y.mValue; | |
| v43 = v97 + v40->field_14_xy.x.mValue; | |
| if ( v40->field_14_xy.x.mValue != v43 | |
| || v40->field_14_xy.y.mValue != v42 ) | |
| { | |
| v40->field_14_xy.x.mValue = v43; | |
| v40->field_14_xy.y.mValue = v42; | |
| v40->field_1C_zpos = v41; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v40); | |
| } | |
| } | |
| break; | |
| default: | |
| return; | |
| } | |
| break; | |
| case 4: | |
| switch ( (char)v99 ) | |
| { | |
| case 0: | |
| case 1: | |
| case 6: | |
| case 7: | |
| Ang16::sub_451730(&word_6FDB3C, &this->field_38_velocity, &v97, &v98); | |
| v97 += dword_6FD7F8; | |
| v98 += dword_6FD800; | |
| word_6FD808 = word_6FDB3C; | |
| if ( Char_B4::CanStepDiagonal_54EF60(this, v97 >> 14, v98 >> 14) ) | |
| { | |
| v92 = Fix16::Divide_436A20( | |
| &this->field_38_velocity, | |
| &v112, | |
| &k_dword_6FD9EC); | |
| Ang16::sub_451730(&word_6FDB3C, v92, &v97, &v98); | |
| v93 = this->field_80_sprite_ptr; | |
| v96 = v93->field_1C_zpos; | |
| v95 = *Fix16::Add_408660(&v93->field_14_xy.y.mValue, &v113, &v98); | |
| v94 = Fix16::Add_408660( | |
| &this->field_80_sprite_ptr->field_14_xy.x.mValue, | |
| &v114, | |
| &v97); | |
| Sprite::set_xyz_lazy_451950( | |
| this->field_80_sprite_ptr, | |
| *v94, | |
| v95, | |
| v96); | |
| } | |
| break; | |
| case 2: | |
| case 3: | |
| case 4: | |
| case 5: | |
| v110 = gSin_table_667A80[word_6FD8E8]; | |
| v97 = *Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v110 = gCos_table_669260[word_6FD8E8]; | |
| v88 = *Fix16::Multiply_408680(&v110, &v111, &this->field_38_velocity); | |
| v97 += dword_6FD7F8; | |
| v98 = dword_6FD800 + v88; | |
| word_6FD808 = word_6FD8E8; | |
| if ( Char_B4::CanStepDiagonal_54EF60( | |
| this, | |
| v97 >> 14, | |
| (dword_6FD800 + v88) >> 14) ) | |
| { | |
| v109 = ((__int64)this->field_38_velocity << 14) / k_dword_6FD9EC; | |
| v110 = gSin_table_667A80[word_6FD8E8]; | |
| v89 = Fix16::Multiply_408680(&v110, &v111, &v109); | |
| v90 = gCos_table_669260[word_6FD8E8]; | |
| v97 = *v89; | |
| v110 = v90; | |
| v91 = Fix16::Multiply_408680(&v110, &v111, &v109); | |
| Sprite::set_xyz_lazy_451950( | |
| this->field_80_sprite_ptr, | |
| v97 + this->field_80_sprite_ptr->field_14_xy.x.mValue, | |
| *v91 + this->field_80_sprite_ptr->field_14_xy.y.mValue, | |
| this->field_80_sprite_ptr->field_1C_zpos); | |
| } | |
| break; | |
| default: | |
| return; | |
| } | |
| break; | |
| default: | |
| return; | |
| } | |
| } | |
| char __thiscall Char_B4::CanStepForwardWithRegionCheck_54ECB0( | |
| Char_B4 *this, | |
| int a2) | |
| { | |
| Sprite *field_80_sprite_ptr; // eax | |
| int mValue; // edi | |
| int v5; // esi | |
| int field_1C_zpos; // eax | |
| int v7; // ebx | |
| int v8; // esi | |
| int v9; // edi | |
| gmp_block_info *block_4DFE10; // eax | |
| unsigned __int8 field_B_slope_type; // al | |
| char result; // al | |
| Sprite *v13; // ecx | |
| int v14; // edx | |
| __int32 v15; // ebx | |
| Sprite *v16; // ebp | |
| __int32 v17; // edx | |
| Sprite *v18; // ecx | |
| gmp_block_info *v19; // eax | |
| __int32 field_58_flags; // eax | |
| char v21; // [esp+13h] [ebp-11h] BYREF | |
| int v22; // [esp+14h] [ebp-10h] | |
| int v23; // [esp+18h] [ebp-Ch] | |
| int v24; // [esp+1Ch] [ebp-8h] | |
| int v25; // [esp+20h] [ebp-4h] | |
| field_80_sprite_ptr = this->field_80_sprite_ptr; | |
| mValue = field_80_sprite_ptr->field_14_xy.x.mValue; | |
| v5 = field_80_sprite_ptr->field_14_xy.y.mValue; | |
| field_1C_zpos = field_80_sprite_ptr->field_1C_zpos; | |
| v23 = v5; | |
| v24 = field_1C_zpos; | |
| v7 = field_1C_zpos >> 14; | |
| v25 = mValue; | |
| v22 = (field_1C_zpos >> 14) - 1; | |
| v8 = v5 >> 14; | |
| v9 = mValue >> 14; | |
| block_4DFE10 = Map_0x370::get_block_4DFE10( | |
| gMap_0x370_6F6268, | |
| v9, | |
| v8, | |
| (field_1C_zpos - k_dword_6FD9E8) >> 14); | |
| if ( block_4DFE10 ) | |
| { | |
| field_B_slope_type = block_4DFE10->field_B_slope_type; | |
| if ( (field_B_slope_type & 0xFC) != 0 | |
| && (field_B_slope_type & 0xFCu) < 0xB4 | |
| && (field_B_slope_type & 3) != 0 ) | |
| { | |
| v22 = v7; | |
| } | |
| } | |
| if ( Map_0x370::CanMoveOntoSlopeTile_4E0130( | |
| gMap_0x370_6F6268, | |
| v9, | |
| v8, | |
| v7, | |
| a2, | |
| &v21, | |
| 0) ) | |
| { | |
| dword_623F44 = a2; | |
| return 0; | |
| } | |
| if ( !byte_6FDB57 ) | |
| { | |
| LOWORD(v15) = v24; | |
| goto LABEL_27; | |
| } | |
| v13 = this->field_80_sprite_ptr; | |
| v14 = dword_6FD8BC; | |
| if ( v13->field_14_xy.x.mValue != dword_6FD8B8 | |
| || v13->field_14_xy.y.mValue != dword_6FD8BC ) | |
| { | |
| v15 = v24; | |
| LABEL_14: | |
| v13->field_14_xy.x.mValue = dword_6FD8B8; | |
| v13->field_14_xy.y.mValue = v14; | |
| v13->field_1C_zpos = v15; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v13); | |
| goto LABEL_15; | |
| } | |
| v15 = v24; | |
| if ( v13->field_1C_zpos != v24 ) | |
| { | |
| goto LABEL_14; | |
| } | |
| LABEL_15: | |
| Char_B4::sub_548590(this); | |
| if ( Sprite::CheckSpriteMovementRegion_5A2500(this->field_80_sprite_ptr) ) | |
| { | |
| dword_623F44 = a2; | |
| v16 = this->field_80_sprite_ptr; | |
| if ( v16->field_14_xy.x.mValue != v25 | |
| || v16->field_14_xy.y.mValue != v23 | |
| || v16->field_1C_zpos != v15 ) | |
| { | |
| v17 = v23; | |
| v16->field_14_xy.x.mValue = v25; | |
| v16->field_14_xy.y.mValue = v17; | |
| v16->field_1C_zpos = v15; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v16); | |
| } | |
| gMap_0x370_6F6268->field_36E = 0; | |
| return 0; | |
| } | |
| v18 = this->field_80_sprite_ptr; | |
| if ( v18->field_14_xy.x.mValue != v25 | |
| || v18->field_14_xy.y.mValue != v23 | |
| || v18->field_1C_zpos != v15 ) | |
| { | |
| v18->field_14_xy.x.mValue = v25; | |
| v18->field_14_xy.y.mValue = v23; | |
| v18->field_1C_zpos = v15; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v18); | |
| } | |
| Char_B4::sub_548590(this); | |
| LABEL_27: | |
| switch ( a2 ) | |
| { | |
| case 1: | |
| v19 = Map_0x370::get_block_4DFE10(gMap_0x370_6F6268, v9, v8 - 1, v22); | |
| if ( !v19 ) | |
| { | |
| goto LABEL_37; | |
| } | |
| goto LABEL_35; | |
| case 2: | |
| v19 = Map_0x370::get_block_4DFE10(gMap_0x370_6F6268, v9, v8 + 1, v22); | |
| if ( v19 ) | |
| { | |
| goto LABEL_35; | |
| } | |
| goto LABEL_37; | |
| case 3: | |
| v19 = Map_0x370::get_block_4DFE10(gMap_0x370_6F6268, v9 + 1, v8, v22); | |
| if ( v19 ) | |
| { | |
| goto LABEL_35; | |
| } | |
| goto LABEL_37; | |
| case 4: | |
| v19 = Map_0x370::get_block_4DFE10(gMap_0x370_6F6268, v9 - 1, v8, v22); | |
| if ( !v19 ) | |
| { | |
| goto LABEL_37; | |
| } | |
| LABEL_35: | |
| if ( (v19->field_B_slope_type & 3) != 0 ) | |
| { | |
| goto LABEL_36; | |
| } | |
| LABEL_37: | |
| field_58_flags = this->field_58_flags; | |
| if ( (this->field_58_flags & 1) != 1 ) | |
| { | |
| goto LABEL_36; | |
| } | |
| if ( (v15 & 0x3FFF) >= dword_6FD91C ) | |
| { | |
| if ( Ped::IsField238_45EDE0(this->field_7C_pPed, 2) ) | |
| { | |
| LABEL_36: | |
| result = 1; | |
| } | |
| else | |
| { | |
| result = 0; | |
| } | |
| } | |
| else | |
| { | |
| LOBYTE(field_58_flags) = field_58_flags & 0xFE; | |
| this->field_58_flags = field_58_flags; | |
| result = Char_B4::CanStepForward_54FEC0(this, a2); | |
| this->field_58_flags |= 1u; | |
| } | |
| break; | |
| default: | |
| goto LABEL_37; | |
| } | |
| return result; | |
| } | |
| __int16 *__thiscall Char_B4::GetNextRotationToward_550F60( | |
| Char_B4 *this, | |
| __int16 *a2, | |
| __int16 a3) | |
| { | |
| __int16 *p_field_40_rotation; // esi | |
| unsigned __int8 v5; // bl | |
| __int16 *result; // eax | |
| __int32 field_38_velocity; // edi | |
| __int16 *v8; // eax | |
| __int16 *v9; // edx | |
| __int16 v10; // si | |
| __int16 *v11; // edx | |
| __int16 v12; // [esp+Eh] [ebp-22h] BYREF | |
| __int16 v13; // [esp+10h] [ebp-20h] BYREF | |
| __int16 v14; // [esp+12h] [ebp-1Eh] BYREF | |
| __int16 v15; // [esp+14h] [ebp-1Ch] BYREF | |
| __int16 v16; // [esp+16h] [ebp-1Ah] BYREF | |
| __int16 v17; // [esp+18h] [ebp-18h] BYREF | |
| __int16 v18; // [esp+1Ah] [ebp-16h] BYREF | |
| __int16 v19; // [esp+1Ch] [ebp-14h] BYREF | |
| __int16 v20; // [esp+1Eh] [ebp-12h] BYREF | |
| __int16 v21; // [esp+20h] [ebp-10h] BYREF | |
| __int16 v22; // [esp+22h] [ebp-Eh] BYREF | |
| int v23; // [esp+24h] [ebp-Ch] BYREF | |
| int v24; // [esp+28h] [ebp-8h] BYREF | |
| int v25; // [esp+2Ch] [ebp-4h] BYREF | |
| p_field_40_rotation = &this->field_40_rotation; | |
| v5 = Ang16::ToAng4_405680((Ang16 *)&this->field_40_rotation); | |
| LOBYTE(v23) = v5; | |
| LOBYTE(v24) = Ang16::ToAng4_405680((Ang16 *)&a3); | |
| v25 = (this->field_38_velocity * (__int64)(word_6FDB2E << 14)) >> 14; | |
| Ang16::FromFP_4516B0(&v12, &v25, 0); | |
| if ( this->field_10_char_state == 10 ) | |
| { | |
| result = a2; | |
| *a2 = a3; | |
| return result; | |
| } | |
| field_38_velocity = this->field_38_velocity; | |
| if ( field_38_velocity <= k_dword_6FD7C0 ) | |
| { | |
| v12 = dword_6FD89C; | |
| } | |
| else if ( field_38_velocity <= k_CollisionRepulsionSpeed_6FD7BC ) | |
| { | |
| v12 = word_6FD890; | |
| } | |
| else | |
| { | |
| v12 = k_dword_6FD892; | |
| } | |
| switch ( (char)v24 ) | |
| { | |
| case 0: | |
| if ( (unsigned __int8)v23 == 2 ) | |
| { | |
| if ( (__int16)*ComputeShortestAngleDelta_4056C0( | |
| &v25, | |
| (int)p_field_40_rotation, | |
| &a3) >= (__int16)k_dword_6FD936 ) | |
| { | |
| v20 = *p_field_40_rotation + v12; | |
| Ang16::Normalize_406C20(&v20); | |
| result = a2; | |
| *a2 = v20; | |
| } | |
| else | |
| { | |
| v19 = *p_field_40_rotation - v12; | |
| Ang16::Normalize_406C20(&v19); | |
| result = a2; | |
| *a2 = v19; | |
| } | |
| } | |
| else | |
| { | |
| if ( (unsigned __int8)v23 != 3 ) | |
| { | |
| goto LABEL_29; | |
| } | |
| v8 = ComputeShortestAngleDelta_4056C0( | |
| &v24, | |
| (int)&a3, | |
| p_field_40_rotation); | |
| if ( *v8 >= v12 ) | |
| { | |
| *a2 = *p_field_40_rotation + v12; | |
| Ang16::Normalize_406C20(a2); | |
| return a2; | |
| } | |
| else | |
| { | |
| result = a2; | |
| *a2 = a3; | |
| } | |
| } | |
| return result; | |
| case 1: | |
| if ( v5 != 3 ) | |
| { | |
| goto LABEL_29; | |
| } | |
| if ( (__int16)*ComputeShortestAngleDelta_4056C0( | |
| &v23, | |
| (int)p_field_40_rotation, | |
| &a3) >= (__int16)k_dword_6FD936 ) | |
| { | |
| v18 = *p_field_40_rotation + v12; | |
| Ang16::Normalize_406C20(&v18); | |
| result = a2; | |
| *a2 = v18; | |
| } | |
| else | |
| { | |
| v17 = *p_field_40_rotation - v12; | |
| Ang16::Normalize_406C20(&v17); | |
| result = a2; | |
| *a2 = v17; | |
| } | |
| return result; | |
| case 2: | |
| if ( v5 ) | |
| { | |
| goto LABEL_29; | |
| } | |
| if ( (__int16)*ComputeShortestAngleDelta_4056C0( | |
| &v22, | |
| (int)&a3, | |
| p_field_40_rotation) <= (__int16)k_dword_6FD936 ) | |
| { | |
| v16 = *p_field_40_rotation - v12; | |
| Ang16::Normalize_406C20(&v16); | |
| result = a2; | |
| *a2 = v16; | |
| } | |
| else | |
| { | |
| v15 = *p_field_40_rotation + v12; | |
| Ang16::Normalize_406C20(&v15); | |
| result = a2; | |
| *a2 = v15; | |
| } | |
| return result; | |
| case 3: | |
| if ( v5 > 1u ) | |
| { | |
| goto LABEL_29; | |
| } | |
| if ( (__int16)*ComputeShortestAngleDelta_4056C0( | |
| &v21, | |
| (int)&a3, | |
| p_field_40_rotation) <= (__int16)k_dword_6FD936 ) | |
| { | |
| v14 = *p_field_40_rotation - v12; | |
| Ang16::Normalize_406C20(&v14); | |
| result = a2; | |
| *a2 = v14; | |
| } | |
| else | |
| { | |
| v13 = *p_field_40_rotation + v12; | |
| Ang16::Normalize_406C20(&v13); | |
| result = a2; | |
| *a2 = v13; | |
| } | |
| return result; | |
| default: | |
| LABEL_29: | |
| if ( a3 <= *p_field_40_rotation ) | |
| { | |
| v11 = ComputeShortestAngleDelta_4056C0( | |
| &v25, | |
| (int)p_field_40_rotation, | |
| &a3); | |
| if ( *v11 > v12 ) | |
| { | |
| v10 = *p_field_40_rotation - v12; | |
| if ( v10 >= 0 ) | |
| { | |
| goto LABEL_36; | |
| } | |
| goto LABEL_35; | |
| } | |
| } | |
| else | |
| { | |
| v9 = ComputeShortestAngleDelta_4056C0( | |
| &v25, | |
| (int)&a3, | |
| p_field_40_rotation); | |
| if ( *v9 > v12 ) | |
| { | |
| v10 = *p_field_40_rotation + v12; | |
| if ( v10 >= 0 ) | |
| { | |
| goto LABEL_36; | |
| } | |
| LABEL_35: | |
| v10 += 1440 * ((1439 - v10) / 0x5A0u); | |
| LABEL_36: | |
| if ( v10 >= 1440 ) | |
| { | |
| result = a2; | |
| *a2 = v10 % 0x5A0u; | |
| return result; | |
| } | |
| goto LABEL_39; | |
| } | |
| } | |
| v10 = a3; | |
| LABEL_39: | |
| result = a2; | |
| *a2 = v10; | |
| return result; | |
| } | |
| } | |
| char __thiscall Char_B4::CanStepInDirection_551350(Char_B4 *this, __int16 ang) | |
| { | |
| Sprite *pSprite; // eax | |
| int mul_factor; // eax | |
| __int32 y_v; // [esp+10h] [ebp-Ch] | |
| __int32 x_v; // [esp+14h] [ebp-8h] | |
| pSprite = this->field_80_sprite_ptr; | |
| y_v = pSprite->field_14_xy.y.mValue; | |
| x_v = pSprite->field_14_xy.x.mValue; | |
| if ( this->field_C_ped_state_2 == Unknown_3 ) | |
| { | |
| mul_factor = dword_6FDB18; | |
| } | |
| else | |
| { | |
| mul_factor = dword_6FDB08; | |
| } | |
| return Char_B4::CanReachTile_550090( | |
| this, | |
| (int)(x_v + ((gSin_table_667A80[ang] * (__int64)mul_factor) >> 14)) >> 14, | |
| (int)(y_v + ((gCos_table_669260[ang] * (__int64)mul_factor) >> 14)) >> 14); | |
| } | |
| void __thiscall Char_B4::ChooseNextMovementTile_551400(Char_B4 *this) | |
| { | |
| int v1; // edi | |
| __int32 field_1C4_x; // eax | |
| int v4; // ecx | |
| int v5; // edx | |
| char v6; // cl | |
| char v7; // al | |
| int field_1C8_y; // eax | |
| int v9; // ecx | |
| int v10; // edx | |
| char v11; // dl | |
| int v12; // eax | |
| char v13; // cl | |
| char v14; // al | |
| v1 = dword_623F44; | |
| switch ( dword_623F44 ) | |
| { | |
| case 1: | |
| case 2: | |
| field_1C4_x = this->field_7C_pPed->field_1C4_x; | |
| if ( field_1C4_x > dword_6FD7F8 ) | |
| { | |
| LOBYTE(field_1C4_x) = byte_6FDAD9; | |
| word_6FD808 = word_6FD904; | |
| if ( Char_B4::CanReachTile_550090(this, byte_6FDAD8 - 1, field_1C4_x) ) | |
| { | |
| this->field_72 = byte_6FDAD8 - 1; | |
| this->field_73 = byte_6FDAD9; | |
| this->field_60 = 4; | |
| this->field_55 = 40; | |
| return; | |
| } | |
| LOBYTE(v5) = byte_6FDAD9; | |
| word_6FD808 = word_6FDA64; | |
| if ( Char_B4::CanReachTile_550090(this, byte_6FDAD8 + 1, v5) ) | |
| { | |
| this->field_72 = byte_6FDAD8 + 1; | |
| this->field_73 = byte_6FDAD9; | |
| this->field_60 = 3; | |
| this->field_55 = 40; | |
| return; | |
| } | |
| } | |
| else | |
| { | |
| word_6FD808 = word_6FDA64; | |
| if ( Char_B4::CanReachTile_550090( | |
| this, | |
| byte_6FDAD8 + 1, | |
| (unsigned __int8)byte_6FDAD9) ) | |
| { | |
| this->field_72 = byte_6FDAD8 + 1; | |
| this->field_73 = byte_6FDAD9; | |
| this->field_60 = 3; | |
| this->field_55 = 40; | |
| return; | |
| } | |
| LOBYTE(v4) = byte_6FDAD9; | |
| word_6FD808 = word_6FD904; | |
| if ( Char_B4::CanReachTile_550090(this, byte_6FDAD8 - 1, v4) ) | |
| { | |
| this->field_72 = byte_6FDAD8 - 1; | |
| this->field_73 = byte_6FDAD9; | |
| this->field_60 = 4; | |
| this->field_55 = 40; | |
| return; | |
| } | |
| } | |
| this->field_72 = byte_6FDAD8; | |
| if ( v1 == 1 ) | |
| { | |
| v6 = byte_6FDAD9 + 1; | |
| this->field_55 = 40; | |
| this->field_73 = v6; | |
| } | |
| else | |
| { | |
| v7 = byte_6FDAD9 - 1; | |
| this->field_55 = 40; | |
| this->field_73 = v7; | |
| } | |
| return; | |
| case 3: | |
| case 4: | |
| field_1C8_y = this->field_7C_pPed->field_1C8_y; | |
| v9 = dword_6FD800; | |
| if ( field_1C8_y > dword_6FD800 ) | |
| { | |
| LOBYTE(v9) = byte_6FDAD9 - 1; | |
| word_6FD808 = word_6FD8E8; | |
| if ( Char_B4::CanReachTile_550090(this, byte_6FDAD8, v9) ) | |
| { | |
| this->field_72 = byte_6FDAD8; | |
| v13 = byte_6FDAD9 - 1; | |
| this->field_55 = 40; | |
| this->field_73 = v13; | |
| return; | |
| } | |
| LOBYTE(v12) = byte_6FDAD9 + 1; | |
| word_6FD808 = word_6FDB3C; | |
| if ( !Char_B4::CanReachTile_550090(this, byte_6FDAD8, v12) ) | |
| { | |
| goto LABEL_22; | |
| } | |
| LABEL_21: | |
| this->field_72 = byte_6FDAD8; | |
| v14 = byte_6FDAD9 + 1; | |
| this->field_55 = 40; | |
| this->field_73 = v14; | |
| return; | |
| } | |
| LOBYTE(field_1C8_y) = byte_6FDAD9 + 1; | |
| word_6FD808 = word_6FDB3C; | |
| if ( Char_B4::CanReachTile_550090(this, byte_6FDAD8, field_1C8_y) ) | |
| { | |
| goto LABEL_21; | |
| } | |
| LOBYTE(v10) = byte_6FDAD9 - 1; | |
| word_6FD808 = word_6FD8E8; | |
| if ( Char_B4::CanReachTile_550090(this, byte_6FDAD8, v10) ) | |
| { | |
| this->field_72 = byte_6FDAD8; | |
| v11 = byte_6FDAD9 - 1; | |
| this->field_55 = 40; | |
| this->field_73 = v11; | |
| return; | |
| } | |
| LABEL_22: | |
| if ( v1 != 3 ) | |
| { | |
| this->field_72 = byte_6FDAD8 + 1; | |
| this->field_73 = byte_6FDAD9; | |
| goto LABEL_25; | |
| } | |
| this->field_72 = byte_6FDAD8 - 1; | |
| this->field_73 = byte_6FDAD9; | |
| this->field_55 = 40; | |
| return; | |
| default: | |
| LABEL_25: | |
| this->field_55 = 40; | |
| return; | |
| } | |
| } | |
| void __thiscall Char_B4::SelectNextTileFast_5516F0(Char_B4 *this) | |
| { | |
| int v1; // edi | |
| __int32 field_1C4_x; // eax | |
| int v4; // ecx | |
| int v5; // edx | |
| int field_1C8_y; // eax | |
| int v7; // ecx | |
| int v8; // edx | |
| int v9; // eax | |
| v1 = dword_623F44; | |
| switch ( dword_623F44 ) | |
| { | |
| case 1: | |
| case 2: | |
| field_1C4_x = this->field_7C_pPed->field_1C4_x; | |
| if ( field_1C4_x < dword_6FD7F8 ) | |
| { | |
| LOBYTE(field_1C4_x) = byte_6FDAD9; | |
| word_6FD808 = word_6FD904; | |
| if ( Char_B4::CanReachTile_550090(this, byte_6FDAD8 - 1, field_1C4_x) ) | |
| { | |
| this->field_72 = byte_6FDAD8 - 1; | |
| this->field_73 = byte_6FDAD9; | |
| return; | |
| } | |
| LOBYTE(v5) = byte_6FDAD9; | |
| word_6FD808 = word_6FDA64; | |
| if ( Char_B4::CanReachTile_550090(this, byte_6FDAD8 + 1, v5) ) | |
| { | |
| this->field_72 = byte_6FDAD8 + 1; | |
| this->field_73 = byte_6FDAD9; | |
| return; | |
| } | |
| } | |
| else | |
| { | |
| word_6FD808 = word_6FDA64; | |
| if ( Char_B4::CanReachTile_550090( | |
| this, | |
| byte_6FDAD8 + 1, | |
| (unsigned __int8)byte_6FDAD9) ) | |
| { | |
| this->field_72 = byte_6FDAD8 + 1; | |
| this->field_73 = byte_6FDAD9; | |
| return; | |
| } | |
| LOBYTE(v4) = byte_6FDAD9; | |
| word_6FD808 = word_6FD904; | |
| if ( Char_B4::CanReachTile_550090(this, byte_6FDAD8 - 1, v4) ) | |
| { | |
| this->field_72 = byte_6FDAD8 - 1; | |
| this->field_73 = byte_6FDAD9; | |
| return; | |
| } | |
| } | |
| this->field_72 = byte_6FDAD8; | |
| if ( v1 == 1 ) | |
| { | |
| this->field_73 = byte_6FDAD9 + 1; | |
| } | |
| else | |
| { | |
| this->field_73 = byte_6FDAD9 - 1; | |
| } | |
| return; | |
| case 3: | |
| case 4: | |
| field_1C8_y = this->field_7C_pPed->field_1C8_y; | |
| v7 = dword_6FD800; | |
| if ( field_1C8_y < dword_6FD800 ) | |
| { | |
| LOBYTE(v7) = byte_6FDAD9 - 1; | |
| word_6FD808 = word_6FD8E8; | |
| if ( Char_B4::CanReachTile_550090(this, byte_6FDAD8, v7) ) | |
| { | |
| this->field_72 = byte_6FDAD8; | |
| this->field_73 = byte_6FDAD9 - 1; | |
| return; | |
| } | |
| LOBYTE(v9) = byte_6FDAD9 + 1; | |
| word_6FD808 = word_6FDB3C; | |
| if ( !Char_B4::CanReachTile_550090(this, byte_6FDAD8, v9) ) | |
| { | |
| goto LABEL_22; | |
| } | |
| LABEL_21: | |
| this->field_72 = byte_6FDAD8; | |
| this->field_73 = byte_6FDAD9 + 1; | |
| return; | |
| } | |
| LOBYTE(field_1C8_y) = byte_6FDAD9 + 1; | |
| word_6FD808 = word_6FDB3C; | |
| if ( Char_B4::CanReachTile_550090(this, byte_6FDAD8, field_1C8_y) ) | |
| { | |
| goto LABEL_21; | |
| } | |
| LOBYTE(v8) = byte_6FDAD9 - 1; | |
| word_6FD808 = word_6FD8E8; | |
| if ( Char_B4::CanReachTile_550090(this, byte_6FDAD8, v8) ) | |
| { | |
| this->field_72 = byte_6FDAD8; | |
| this->field_73 = byte_6FDAD9 - 1; | |
| return; | |
| } | |
| LABEL_22: | |
| if ( v1 == 3 ) | |
| { | |
| this->field_72 = byte_6FDAD8 - 1; | |
| } | |
| else | |
| { | |
| this->field_72 = byte_6FDAD8 + 1; | |
| } | |
| this->field_73 = byte_6FDAD9; | |
| return; | |
| default: | |
| return; | |
| } | |
| } | |
| bool __thiscall Char_B4::sub_5532C0(Char_B4 *this) | |
| { | |
| int ret1; // [esp+4h] [ebp-8h] BYREF | |
| int ret2; // [esp+8h] [ebp-4h] BYREF | |
| ret1 = 0; | |
| ret2 = 0; | |
| Fix16::sub_545640(dword_6FD7F8, &ret1); | |
| Fix16::sub_545670(dword_6FD800, &ret2); | |
| return (__int16)ret1 > 20 | |
| && (__int16)ret1 < 44 | |
| && (__int16)ret2 > 20 | |
| && (__int16)ret2 < 44; | |
| } | |
| void __thiscall Char_B4::HandleCarImpact_5538A0( | |
| Char_B4 *this, | |
| Car_BC *pCar, | |
| int a3, | |
| int a4, | |
| int a5) | |
| { | |
| _DWORD *v6; // eax | |
| int *v7; // eax | |
| Ped *field_7C_pPed; // eax | |
| Ped *field_54_driver; // ecx | |
| Car_78 *v10; // eax | |
| __int16 v11; // di | |
| Ped *v12; // ecx | |
| bool IsField238_45EDE0; // al | |
| __int16 v14; // bp | |
| Ped *v15; // ecx | |
| Ped *v16; // ecx | |
| __int16 v17; // bx | |
| _DWORD *v18; // [esp-4h] [ebp-30h] | |
| int v19; // [esp+10h] [ebp-1Ch] BYREF | |
| int v20; // [esp+14h] [ebp-18h] BYREF | |
| Fix16 pMaybeY_FP16; // [esp+18h] [ebp-14h] BYREF | |
| int pMaybeX_FP16[4]; // [esp+1Ch] [ebp-10h] BYREF | |
| pMaybeY_FP16.mValue = a4; | |
| pMaybeX_FP16[0] = a5; | |
| pMaybeX_FP16[3] = 0; | |
| if ( a4 == k_dword_6FD9E4 ) | |
| { | |
| if ( a5 <= 0 ) | |
| { | |
| Fix16::Negate_4086A0((Fix16 *)pMaybeX_FP16, &a4); | |
| } | |
| else | |
| { | |
| a4 = a5; | |
| } | |
| } | |
| else if ( a5 == k_dword_6FD9E4 ) | |
| { | |
| if ( a4 <= 0 ) | |
| { | |
| Fix16::Negate_4086A0(&pMaybeY_FP16, &a4); | |
| } | |
| } | |
| else | |
| { | |
| v18 = Fix16::Multiply_408680(pMaybeX_FP16, &a5, pMaybeX_FP16); | |
| v6 = Fix16::Multiply_408680( | |
| &pMaybeY_FP16.mValue, | |
| &v20, | |
| &pMaybeY_FP16.mValue); | |
| v7 = Fix16::Add_408660(v6, &v19, v18); | |
| Fix16::SquareRoot_436A70(&a4, v7); | |
| } | |
| atan2_fixed_405320((__int16 *)&a5, (Fix16 *)pMaybeX_FP16, &pMaybeY_FP16); | |
| field_7C_pPed = this->field_7C_pPed; | |
| if ( field_7C_pPed->field_208_invulnerability ) | |
| { | |
| Char_B4::DoJump_5454D0(this); | |
| return; | |
| } | |
| if ( a4 < gRunOrJumpSpeed_6FD7D0 ) | |
| { | |
| a4 = gRunOrJumpSpeed_6FD7D0; | |
| } | |
| if ( !field_7C_pPed->field_267_varrok_idx ) | |
| { | |
| this->field_7C_pPed->field_267_varrok_idx = Varrok_7F8::sub_59B060( | |
| gVarrok_7F8_703398, | |
| field_7C_pPed->field_200_id); | |
| } | |
| this->field_6C_animation_state = 12; | |
| this->field_68_animation_frame = 0; | |
| field_54_driver = pCar->field_54_driver; | |
| if ( field_54_driver ) | |
| { | |
| if ( (field_54_driver->field_21C & 8) == 0 | |
| && Ped::IsField238_45EDE0(field_54_driver, 3) ) | |
| { | |
| v10 = pCar->field_5C; | |
| if ( v10 ) | |
| { | |
| v10->field_30 = 100; | |
| } | |
| } | |
| } | |
| if ( a4 < dword_6FD824 ) | |
| { | |
| if ( this->field_C_ped_state_2 != lying_on_floor_22 ) | |
| { | |
| this->field_7C_pPed->field_184_pObj2C = Object_5C::NewUnknown_52A240( | |
| gObject_5C_6F8F84, | |
| 110, | |
| this->field_80_sprite_ptr->field_14_xy.x.mValue, | |
| this->field_80_sprite_ptr->field_14_xy.y.mValue, | |
| this->field_80_sprite_ptr->field_1C_zpos, | |
| a5, | |
| this->field_80_sprite_ptr->field_0.field_0, | |
| a4, | |
| -dword_6FD824, | |
| k_dword_6FD9E4); | |
| this->field_7C_pPed->field_184_pObj2C->field_10_obj_3c->field_10 = k_dword_6FD9E4; | |
| Object_2C::SetDamageOwner_529080( | |
| this->field_7C_pPed->field_184_pObj2C, | |
| this->field_7C_pPed->field_267_varrok_idx); | |
| Ped::ChangeNextPedState1_45C500(this->field_7C_pPed, 8); | |
| Ped::ChangeNextPedState2_45C540(this->field_7C_pPed, 24); | |
| this->field_C_ped_state_2 = Unknown_24; | |
| return; | |
| } | |
| goto LABEL_38; | |
| } | |
| if ( Ped::IsField238_45EDE0(this->field_7C_pPed, 3) ) | |
| { | |
| Ped::Kill_46F9D0(this->field_7C_pPed); | |
| Particle_8::EmitBloodBurst_53E450( | |
| gParticle_8_6FD5E8, | |
| this->field_80_sprite_ptr->field_14_xy.x.mValue, | |
| this->field_80_sprite_ptr->field_14_xy.y.mValue, | |
| this->field_80_sprite_ptr->field_1C_zpos, | |
| a5); | |
| return; | |
| } | |
| if ( a4 >= dword_6FD830 ) | |
| { | |
| v16 = this->field_7C_pPed; | |
| v17 = a5; | |
| if ( v16->field_208_invulnerability ) | |
| { | |
| this->field_7C_pPed->field_184_pObj2C = Object_5C::NewUnknown_52A240( | |
| gObject_5C_6F8F84, | |
| 110, | |
| this->field_80_sprite_ptr->field_14_xy.x.mValue, | |
| this->field_80_sprite_ptr->field_14_xy.y.mValue, | |
| this->field_80_sprite_ptr->field_1C_zpos, | |
| a5, | |
| this->field_80_sprite_ptr->field_0.field_0, | |
| ((__int64)a4 << 14) | |
| / k_dword_6FD9EC, | |
| -dword_6FD824, | |
| k_dword_6FD9E4); | |
| this->field_7C_pPed->field_184_pObj2C->field_10_obj_3c->field_10 = k_dword_6FD9E4; | |
| Object_2C::SetDamageOwner_529080( | |
| this->field_7C_pPed->field_184_pObj2C, | |
| this->field_7C_pPed->field_267_varrok_idx); | |
| Ped::ChangeNextPedState1_45C500(this->field_7C_pPed, 8); | |
| Ped::ChangeNextPedState2_45C540(this->field_7C_pPed, 24); | |
| this->field_C_ped_state_2 = Unknown_24; | |
| } | |
| else | |
| { | |
| Ped::Kill_46F9D0(v16); | |
| } | |
| Particle_8::EmitBloodBurst_53E450( | |
| gParticle_8_6FD5E8, | |
| this->field_80_sprite_ptr->field_14_xy.x.mValue, | |
| this->field_80_sprite_ptr->field_14_xy.y.mValue, | |
| this->field_80_sprite_ptr->field_1C_zpos, | |
| v17); | |
| } | |
| else | |
| { | |
| if ( a4 < dword_6FD82C ) | |
| { | |
| if ( this->field_C_ped_state_2 != lying_on_floor_22 ) | |
| { | |
| v11 = a5; | |
| this->field_7C_pPed->field_184_pObj2C = Object_5C::NewUnknown_52A240( | |
| gObject_5C_6F8F84, | |
| 110, | |
| this->field_80_sprite_ptr->field_14_xy.x.mValue, | |
| this->field_80_sprite_ptr->field_14_xy.y.mValue, | |
| this->field_80_sprite_ptr->field_1C_zpos, | |
| a5, | |
| this->field_80_sprite_ptr->field_0.field_0, | |
| ((__int64)a4 << 14) | |
| / k_dword_6FD9EC, | |
| -dword_6FD824, | |
| k_dword_6FD9E4); | |
| this->field_7C_pPed->field_184_pObj2C->field_10_obj_3c->field_10 = dword_6FD9B0; | |
| this->field_7C_pPed->field_184_pObj2C->field_10_obj_3c->field_2A = 1; | |
| Object_2C::SetDamageOwner_529080( | |
| this->field_7C_pPed->field_184_pObj2C, | |
| this->field_7C_pPed->field_267_varrok_idx); | |
| Ped::ChangeNextPedState1_45C500(this->field_7C_pPed, 8); | |
| v12 = this->field_7C_pPed; | |
| if ( v12->field_208_invulnerability ) | |
| { | |
| Ped::ChangeNextPedState2_45C540(v12, 24); | |
| } | |
| else if ( pCar->field_7C_uni_num == 2 ) | |
| { | |
| Ped::ChangeNextPedState2_45C540(v12, 26); | |
| } | |
| else | |
| { | |
| Ped::ChangeNextPedState2_45C540(v12, 25); | |
| } | |
| this->field_C_ped_state_2 = Unknown_24; | |
| Particle_8::EmitBloodBurst_53E450( | |
| gParticle_8_6FD5E8, | |
| this->field_80_sprite_ptr->field_14_xy.x.mValue, | |
| this->field_80_sprite_ptr->field_14_xy.y.mValue, | |
| this->field_80_sprite_ptr->field_1C_zpos, | |
| v11); | |
| return; | |
| } | |
| LABEL_38: | |
| Ped::Kill_46F9D0(this->field_7C_pPed); | |
| return; | |
| } | |
| IsField238_45EDE0 = Ped::IsField238_45EDE0(this->field_7C_pPed, 2); | |
| v14 = a5; | |
| if ( !IsField238_45EDE0 || pCar->field_7C_uni_num == 2 ) | |
| { | |
| Ped::Kill_46F9D0(this->field_7C_pPed); | |
| Particle_8::EmitBloodBurst_53E450( | |
| gParticle_8_6FD5E8, | |
| this->field_80_sprite_ptr->field_14_xy.x.mValue, | |
| this->field_80_sprite_ptr->field_14_xy.y.mValue, | |
| this->field_80_sprite_ptr->field_1C_zpos, | |
| v14); | |
| return; | |
| } | |
| if ( this->field_C_ped_state_2 == lying_on_floor_22 ) | |
| { | |
| goto LABEL_38; | |
| } | |
| Ped::ChangeNextPedState1_45C500(this->field_7C_pPed, 8); | |
| this->field_7C_pPed->field_184_pObj2C = Object_5C::NewUnknown_52A240( | |
| gObject_5C_6F8F84, | |
| 110, | |
| this->field_80_sprite_ptr->field_14_xy.x.mValue, | |
| this->field_80_sprite_ptr->field_14_xy.y.mValue, | |
| this->field_80_sprite_ptr->field_1C_zpos, | |
| v14, | |
| this->field_80_sprite_ptr->field_0.field_0, | |
| ((__int64)a4 << 14) | |
| / k_dword_6FD9EC, | |
| -dword_6FD824, | |
| k_dword_6FD9E4); | |
| this->field_7C_pPed->field_184_pObj2C->field_10_obj_3c->field_10 = dword_6FD824; | |
| this->field_7C_pPed->field_184_pObj2C->field_10_obj_3c->field_2A = 1; | |
| Object_2C::SetDamageOwner_529080( | |
| this->field_7C_pPed->field_184_pObj2C, | |
| this->field_7C_pPed->field_267_varrok_idx); | |
| v15 = this->field_7C_pPed; | |
| if ( v15->field_208_invulnerability ) | |
| { | |
| Ped::ChangeNextPedState2_45C540(v15, 24); | |
| } | |
| else | |
| { | |
| Ped::ChangeNextPedState2_45C540(v15, 25); | |
| } | |
| this->field_C_ped_state_2 = Unknown_24; | |
| Particle_8::EmitBloodBurst_53E450( | |
| gParticle_8_6FD5E8, | |
| this->field_80_sprite_ptr->field_14_xy.x.mValue, | |
| this->field_80_sprite_ptr->field_14_xy.y.mValue, | |
| this->field_80_sprite_ptr->field_1C_zpos, | |
| v14); | |
| } | |
| } | |
| void __thiscall CarPhysics_B0::HandleCarCollision_55FF20( | |
| CarPhysics_B0 *this, | |
| Car_BC *pCar) | |
| { | |
| Car_BC *v3; // ebx | |
| CarPhysics_B0 *field_58_physics; // edi | |
| Fix16_Point *v5; // eax | |
| int *v6; // eax | |
| Fix16_Point *v7; // eax | |
| __int32 mValue; // edx | |
| __int32 field_98_surface_type; // eax | |
| __int64 v10; // rax | |
| Fix16_Point *v11; // eax | |
| Fix16_Point *v12; // eax | |
| Fix16_2 *v13; // eax | |
| Car_BC *field_5C_pCar; // ebp | |
| Fix16_Point *v15; // eax | |
| __int32 v16; // eax | |
| Car_BC *v17; // ebp | |
| Ped *field_54_driver; // ecx | |
| _DWORD *v19; // eax | |
| int *v20; // eax | |
| Car_BC *v21; // ecx | |
| char v22; // bl | |
| Ped *EffectiveDriver_43E990; // eax | |
| __int16 v24; // bp | |
| Ped *v25; // eax | |
| Player *field_15C_player; // eax | |
| Fix16_Point *v27; // eax | |
| Car_BC *v28; // eax | |
| car_model_enum v29; // eax | |
| Car_BC *v30; // ebx | |
| __int16 v31; // di | |
| __int16 v32; // ax | |
| Ped *v33; // eax | |
| Player *v34; // eax | |
| Fix16 *p_y; // ecx | |
| _DWORD *v36; // eax | |
| int *v37; // eax | |
| Fix16_Point *v38; // eax | |
| int v39; // ecx | |
| int v40; // edx | |
| Ped *v41; // eax | |
| Car_78 *v42; // eax | |
| Car_78 *v43; // eax | |
| int v44; // [esp-Ch] [ebp-78h] | |
| __int32 field_6C_cp3; // [esp-Ch] [ebp-78h] | |
| int v46; // [esp-8h] [ebp-74h] | |
| int v47; // [esp-4h] [ebp-70h] | |
| unsigned __int8 field_84_car_info_idx; // [esp-4h] [ebp-70h] | |
| _DWORD *v49; // [esp-4h] [ebp-70h] | |
| _DWORD *v50; // [esp-4h] [ebp-70h] | |
| int v51; // [esp+10h] [ebp-5Ch] BYREF | |
| int v52; // [esp+14h] [ebp-58h] BYREF | |
| Fix16_Point v53; // [esp+18h] [ebp-54h] BYREF | |
| Fix16_Point pLhs; // [esp+20h] [ebp-4Ch] BYREF | |
| Fix16_Point v55; // [esp+28h] [ebp-44h] BYREF | |
| Fix16_Point v56; // [esp+30h] [ebp-3Ch] BYREF | |
| Fix16_Point v57; // [esp+38h] [ebp-34h] BYREF | |
| Fix16_Point v58; // [esp+40h] [ebp-2Ch] BYREF | |
| Fix16_2 arg0; // [esp+48h] [ebp-24h] BYREF | |
| Fix16_Point v60; // [esp+50h] [ebp-1Ch] BYREF | |
| Fix16_Point pRhs; // [esp+58h] [ebp-14h] BYREF | |
| int v62; // [esp+68h] [ebp-4h] | |
| v62 = 5; | |
| CarPhysics_B0::CalculateMass_559FF0(this, &v52); | |
| v3 = pCar; | |
| Car_BC::SetupCarPhysicsAndSpriteBinding_43BCA0(pCar); | |
| field_58_physics = v3->field_58_physics; | |
| CarPhysics_B0::SetCurrentCarInfoAndModelPhysics_562EF0(field_58_physics); | |
| pRhs = *CarPhysics_B0::ComputeRelativePointVelocity_561130( | |
| field_58_physics, | |
| &v55, | |
| &stru_6FE1A0); | |
| CarPhysics_B0::SetCurrentCarInfoAndModelPhysics_562EF0(this); | |
| v5 = CarPhysics_B0::ComputeRelativePointVelocity_561130( | |
| this, | |
| &v55, | |
| &stru_6FE1A0); | |
| v60 = *Fix16_Point::subtract_40AC80(v5, &pLhs, &pRhs); | |
| v57 = *CarPhysics_B0::ComputeCombinedCenterOfMass_559EC0(this, &v55); | |
| v58 = *CarPhysics_B0::ComputeCombinedCenterOfMass_559EC0( | |
| field_58_physics, | |
| &v55); | |
| stru_6FE1F0 = *Fix16_Point::subtract_40AC80(&v57, &v55, &stru_6FE1A0); | |
| v47 = dword_6FE0D0; | |
| v46 = *CarPhysics_B0::GetEffectiveMomentOfInertia_55A050( | |
| field_58_physics, | |
| &v51); | |
| v44 = *CarPhysics_B0::GetEffectiveMomentOfInertia_55A050(this, &v53); | |
| v6 = CarPhysics_B0::CalculateMass_559FF0(field_58_physics, &pLhs); | |
| v7 = ComputeLineLineIntersection_55F3B0( | |
| &v55, | |
| v52, | |
| *v6, | |
| &v60, | |
| &stru_6FE1F0, | |
| &stru_6FE1A0, | |
| &v57, | |
| &v58, | |
| v44, | |
| v46, | |
| v47); | |
| v56.x.mValue = v7->x.mValue; | |
| mValue = v7->y.mValue; | |
| field_98_surface_type = this->field_98_surface_type; | |
| v56.y.mValue = mValue; | |
| if ( field_98_surface_type != 6 | |
| || v3->field_50_car_sprite->field_1C_zpos == this->field_5C_pCar->field_50_car_sprite->field_1C_zpos ) | |
| { | |
| dword_6FE33C = 0; | |
| } | |
| else | |
| { | |
| v10 = (dword_6FDFF4 * (__int64)-this->field_68_z_pos) >> 14; | |
| this->field_68_z_pos = v10; | |
| if ( (int)v10 <= 0 ) | |
| { | |
| LODWORD(v10) = -(int)v10; | |
| } | |
| if ( (int)v10 < *(int *)((char *)&dword_6FE116 + 2) ) | |
| { | |
| this->field_68_z_pos = kFP16Zero_6FE20C; | |
| } | |
| v51 = 10; | |
| v11 = Fix16_Point::subtract_40AC80(&v57, &v55, &v58); | |
| LOBYTE(v62) = 6; | |
| v12 = Fix16_Point::NormalizeSafe_442AD0(v11, &pLhs); | |
| v13 = (Fix16_2 *)Fix16_Point::Divide_55F9E0(v12, &v53, &v51); | |
| field_5C_pCar = this->field_5C_pCar; | |
| arg0 = *v13; | |
| field_84_car_info_idx = field_5C_pCar->field_84_car_info_idx; | |
| LOBYTE(v62) = 5; | |
| if ( (gtx_0x106C::get_car_info_5AA3B0( | |
| gGtx_0x106C_703DD4, | |
| field_84_car_info_idx)->info_flags_2 & 1) != 1 | |
| || field_5C_pCar->field_84_car_info_idx != TANK | |
| && Car_BC::sub_564300(field_5C_pCar) | |
| || (gtx_0x106C::get_car_info_5AA3B0( | |
| gGtx_0x106C_703DD4, | |
| v3->field_84_car_info_idx)->info_flags_2 & 1) == 1 ) | |
| { | |
| CarPhysics_B0::AccumulateImpulse_55FC30(this, (Fix16_Point *)&arg0, 50); | |
| v15 = Fix16_Point::Negate_40ACB0((Fix16_Point *)&arg0, &v55); | |
| LOBYTE(v62) = 7; | |
| CarPhysics_B0::AccumulateImpulse_55FC30(field_58_physics, v15, 50); | |
| LOBYTE(v62) = 5; | |
| } | |
| else | |
| { | |
| HIBYTE(this->field_5C_pCar->field_78_flags) |= 0x20u; | |
| } | |
| v16 = this->field_70; | |
| if ( v16 <= 0 ) | |
| { | |
| v16 = -v16; | |
| } | |
| dword_6FE33C = 50 * ((v52 * (__int64)v16) >> 14); | |
| } | |
| v17 = this->field_5C_pCar; | |
| if ( (gtx_0x106C::get_car_info_5AA3B0( | |
| gGtx_0x106C_703DD4, | |
| v17->field_84_car_info_idx)->info_flags_2 & 1) != 1 ) | |
| { | |
| goto LABEL_36; | |
| } | |
| if ( v17->field_84_car_info_idx != TANK ) | |
| { | |
| field_54_driver = v17->field_54_driver; | |
| if ( field_54_driver ) | |
| { | |
| if ( !Ped::IsField238_45EDE0(field_54_driver, 2) ) | |
| { | |
| goto LABEL_36; | |
| } | |
| } | |
| } | |
| if ( (gtx_0x106C::get_car_info_5AA3B0( | |
| gGtx_0x106C_703DD4, | |
| v3->field_84_car_info_idx)->info_flags_2 & 1) == 1 ) | |
| { | |
| goto LABEL_36; | |
| } | |
| if ( v56.x.mValue == kFP16Zero_6FE20C ) | |
| { | |
| if ( v56.y.mValue <= 0 ) | |
| { | |
| Fix16::Negate_4086A0(&v56.y, &v51); | |
| } | |
| else | |
| { | |
| v51 = v56.y.mValue; | |
| } | |
| } | |
| else if ( v56.y.mValue == kFP16Zero_6FE20C ) | |
| { | |
| Fix16::Abs_436A50(&v51, &v56.x.mValue); | |
| } | |
| else | |
| { | |
| v49 = Fix16::Multiply_408680(&v56.y.mValue, &pLhs, &v56.y.mValue); | |
| v19 = Fix16::Multiply_408680(&v56.x.mValue, &v55, &v56.x.mValue); | |
| v20 = Fix16::Add_408660(v19, &v53, v49); | |
| Fix16::SquareRoot_436A70(&v51, v20); | |
| } | |
| if ( v51 > dword_6FDFD8 | |
| && (Fix16_Point::GetLength_453590(&this->field_40_linvel_1, &v51), | |
| v51 > dword_6FE1C4) ) | |
| { | |
| v21 = pCar; | |
| v22 = 1; | |
| HIBYTE(this->field_5C_pCar->field_78_flags) |= 0x20u; | |
| if ( Car_BC::IsPoliceCar_439EC0(v21) ) | |
| { | |
| EffectiveDriver_43E990 = Car_BC::GetEffectiveDriver_43E990(this->field_5C_pCar); | |
| if ( EffectiveDriver_43E990 ) | |
| { | |
| if ( EffectiveDriver_43E990->field_15C_player ) | |
| { | |
| if ( EffectiveDriver_43E990->field_20A_wanted_points < 600 ) | |
| { | |
| EffectiveDriver_43E990->field_20A_wanted_points = 600; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| else | |
| { | |
| LABEL_36: | |
| v22 = 0; | |
| dword_6FE33C += *CarPhysics_B0::ApplyImpactForcesAndDamage_55FA60( | |
| this, | |
| &v55.x.mValue, | |
| &stru_6FE1A0, | |
| &v56, | |
| 50); | |
| } | |
| Car_BC::AssignDriverBlameForExplosion_43B7B0(this->field_5C_pCar, pCar); | |
| v24 = Car_BC::ApplyImpactDamage_43D5D0(this->field_5C_pCar, dword_6FE33C); | |
| if ( v24 > 200 ) | |
| { | |
| v25 = Car_BC::GetEffectiveDriver_43E990(pCar); | |
| if ( v25 ) | |
| { | |
| field_15C_player = v25->field_15C_player; | |
| if ( field_15C_player ) | |
| { | |
| eager_benz::sub_593030( | |
| &field_15C_player->field_2D4_scores, | |
| this->field_5C_pCar, | |
| v24); | |
| } | |
| } | |
| } | |
| if ( !v22 ) | |
| { | |
| CarPhysics_B0::SetCurrentCarInfoAndModelPhysics_562EF0(field_58_physics); | |
| v27 = Fix16_Point::Negate_40ACB0(&v56, &pLhs); | |
| LOBYTE(v62) = 8; | |
| CarPhysics_B0::ApplyImpactForcesAndDamage_55FA60( | |
| field_58_physics, | |
| &v55.x.mValue, | |
| &stru_6FE1A0, | |
| v27, | |
| 50); | |
| v28 = this->field_5C_pCar; | |
| LOBYTE(v62) = 5; | |
| v29 = v28->field_84_car_info_idx; | |
| if ( v29 == TRAIN || v29 == TRAINCAB || v29 == TRAINFB || v29 == boxcar ) | |
| { | |
| v30 = pCar; | |
| Car_BC::HandleCarExplosion_43D840(pCar, 19); | |
| v31 = 32000; | |
| } | |
| else | |
| { | |
| v32 = Car_BC::ApplyImpactDamage_43D5D0(pCar, dword_6FE33C); | |
| v30 = pCar; | |
| v31 = v32; | |
| if ( v32 <= 200 ) | |
| { | |
| LABEL_51: | |
| CarPhysics_B0::SetCurrentCarInfoAndModelPhysics_562EF0(this); | |
| goto LABEL_53; | |
| } | |
| } | |
| v33 = Car_BC::GetEffectiveDriver_43E990(this->field_5C_pCar); | |
| if ( v33 ) | |
| { | |
| v34 = v33->field_15C_player; | |
| if ( v34 ) | |
| { | |
| eager_benz::sub_593030(&v34->field_2D4_scores, v30, v31); | |
| } | |
| } | |
| goto LABEL_51; | |
| } | |
| v30 = pCar; | |
| LABEL_53: | |
| p_y = &this->field_40_linvel_1.y; | |
| if ( this->field_40_linvel_1.x.mValue == kFP16Zero_6FE20C ) | |
| { | |
| if ( p_y->mValue <= 0 ) | |
| { | |
| Fix16::Negate_4086A0(p_y, &pCar); | |
| } | |
| else | |
| { | |
| pCar = (Car_BC *)p_y->mValue; | |
| } | |
| } | |
| else if ( p_y->mValue == kFP16Zero_6FE20C ) | |
| { | |
| Fix16::Abs_436A50((int *)&pCar, &this->field_40_linvel_1.x.mValue); | |
| } | |
| else | |
| { | |
| v50 = Fix16::Multiply_408680( | |
| &p_y->mValue, | |
| &v55, | |
| &this->field_40_linvel_1.y.mValue); | |
| v36 = Fix16::Multiply_408680( | |
| &this->field_40_linvel_1.x.mValue, | |
| &v53, | |
| &this->field_40_linvel_1.x.mValue); | |
| v37 = Fix16::Add_408660(v36, &pLhs, v50); | |
| Fix16::SquareRoot_436A70(&pCar, v37); | |
| } | |
| if ( (int)pCar > FastCarMinVelocity_6FE1CC | |
| && this->field_5C_pCar->field_74_damage != 32001 ) | |
| { | |
| v38 = Fix16_Point::Negate_40ACB0(&v60, &v55); | |
| v39 = v38->y.mValue; | |
| v40 = v38->x.mValue; | |
| field_6C_cp3 = this->field_6C_cp3; | |
| LOBYTE(v62) = 9; | |
| Particle_8::EmitImpactParticles_53FE40( | |
| gParticle_8_6FD5E8, | |
| stru_6FE1A0.x.mValue, | |
| stru_6FE1A0.y.mValue, | |
| field_6C_cp3, | |
| v40, | |
| v39); | |
| LOBYTE(v62) = 5; | |
| } | |
| if ( dword_6FE33C > dword_6FDFE4 ) | |
| { | |
| Car_BC::TryDamageArea_43D2C0(this->field_5C_pCar, pOut1, dword_6FE33C); | |
| Car_BC::TryDamageArea_43D2C0(v30, pOut2, dword_6FE33C); | |
| if ( dword_6FE33C > dword_6FDFF0 && Car_BC::IsPoliceCar_439EC0(v30) ) | |
| { | |
| v41 = Car_BC::GetEffectiveDriver_43E990(this->field_5C_pCar); | |
| if ( v41 ) | |
| { | |
| if ( v41->field_15C_player ) | |
| { | |
| if ( v41->field_20A_wanted_points < 600 ) | |
| { | |
| v41->field_20A_wanted_points = 600; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| v42 = this->field_5C_pCar->field_5C; | |
| if ( v42 ) | |
| { | |
| v42->field_24_flags |= 0x1000u; | |
| this->field_5C_pCar->field_5C->field_68 = v30; | |
| } | |
| v43 = v30->field_5C; | |
| if ( v43 ) | |
| { | |
| v43->field_24_flags |= 0x1000u; | |
| v30->field_5C->field_68 = this->field_5C_pCar; | |
| } | |
| } | |
| void __thiscall CarPhysics_B0::HandleObjectCollision_5606C0( | |
| CarPhysics_B0 *this, | |
| Object_2C *p2C, | |
| char damage_area) | |
| { | |
| Object_2C *p2c_; // edi | |
| Phi_74 *pPhi; // eax | |
| unsigned int f_34_type; // ecx | |
| Fix16_Point *v7; // eax | |
| int *effectiveMomentOfInertia; // eax | |
| Fix16_Point *v9; // eax | |
| int *EffectiveMomentOfInertia_55A050; // eax | |
| __int64 v11; // rax | |
| Fix16_Point *v12; // eax | |
| Fix16_Point *v13; // eax | |
| Phi_74 *v14; // ecx | |
| unsigned int f34_type; // eax | |
| Fix16_Point *v16; // eax | |
| __int32 mValue; // eax | |
| Fix16_Point *v18; // eax | |
| int v19; // ecx | |
| int v20; // edx | |
| __int32 field_6C_cp3; // [esp-Ch] [ebp-74h] | |
| int v22; // [esp-8h] [ebp-70h] | |
| int v23; // [esp-8h] [ebp-70h] | |
| int v24; // [esp-4h] [ebp-6Ch] | |
| int v25; // [esp-4h] [ebp-6Ch] | |
| int f18_phi; // [esp+8h] [ebp-60h] BYREF | |
| Fix16_Point pLhs; // [esp+Ch] [ebp-5Ch] BYREF | |
| Fix16_Point v28; // [esp+14h] [ebp-54h] BYREF | |
| Fix16_Point a2; // [esp+1Ch] [ebp-4Ch] BYREF | |
| Fix16_Point v30; // [esp+24h] [ebp-44h] BYREF | |
| Fix16_Point v31; // [esp+2Ch] [ebp-3Ch] BYREF | |
| Fix16_Point pRhs; // [esp+34h] [ebp-34h] BYREF | |
| Fix16_Point arg0a; // [esp+3Ch] [ebp-2Ch] BYREF | |
| Fix16_Point v34; // [esp+44h] [ebp-24h] BYREF | |
| Fix16_Point v35; // [esp+4Ch] [ebp-1Ch] BYREF | |
| Fix16_Point v36; // [esp+54h] [ebp-14h] BYREF | |
| int seh; // [esp+64h] [ebp-4h] | |
| p2c_ = p2C; | |
| seh = 2; | |
| Object_2C::GetXY_52AE70(p2C, &pRhs); | |
| LOBYTE(seh) = 4; | |
| CarPhysics_B0::ComputeCombinedCenterOfMass_559EC0(this, &v31); | |
| LOBYTE(seh) = 5; | |
| CarPhysics_B0::CalculateMass_559FF0(this, &p2C); | |
| stru_6FE1F0 = *Fix16_Point::subtract_40AC80(&v31, &pLhs, &stru_6FE1A0); | |
| pPhi = p2c_->field_8; | |
| f_34_type = pPhi->field_34_type; | |
| if ( f_34_type == 3 || f_34_type == 4 || f_34_type <= 2 && pPhi->field_44 == 2 ) | |
| { | |
| f18_phi = pPhi->field_18; | |
| a2 = *Object_2C::GetRot_52AE90(p2c_, &pLhs); | |
| v7 = CarPhysics_B0::ComputeRelativePointVelocity_561130( | |
| this, | |
| &pLhs, | |
| &stru_6FE1A0); | |
| v28 = *Fix16_Point::subtract_40AC80(v7, &v34, &a2); | |
| v24 = dword_6FE0D4; | |
| v22 = dword_6FE0F4; | |
| effectiveMomentOfInertia = CarPhysics_B0::GetEffectiveMomentOfInertia_55A050( | |
| this, | |
| &pLhs); | |
| v30 = *ComputeLineLineIntersection_55F3B0( | |
| &v34, | |
| (int)p2C, | |
| f18_phi, | |
| &v28, | |
| &stru_6FE1F0, | |
| &stru_6FE1A0, | |
| &v31, | |
| &pRhs, | |
| *effectiveMomentOfInertia, | |
| v22, | |
| v24); | |
| v9 = Fix16_Point::Negate_40ACB0(&v30, &v34); | |
| a2 = *Fix16_Point::Divide_442CB0(v9, &pLhs, &f18_phi); | |
| Object_2C::SetMovementVectorWithRandomState_522640(p2c_, &a2); | |
| } | |
| else | |
| { | |
| v28 = *CarPhysics_B0::ComputeRelativePointVelocity_561130( | |
| this, | |
| &v34, | |
| &stru_6FE1A0); | |
| v25 = dword_6FDFB8; | |
| v23 = dword_6FE0F4; | |
| EffectiveMomentOfInertia_55A050 = CarPhysics_B0::GetEffectiveMomentOfInertia_55A050( | |
| this, | |
| &pLhs); | |
| v30 = *ComputeLineLineIntersection_55F3B0( | |
| &v34, | |
| (int)p2C, | |
| dword_6FDF1C, | |
| &v28, | |
| &stru_6FE1F0, | |
| &stru_6FE1A0, | |
| &v31, | |
| &pRhs, | |
| *EffectiveMomentOfInertia_55A050, | |
| v23, | |
| v25); | |
| } | |
| if ( this->field_98_surface_type != 6 | |
| || p2c_->field_4->field_1C_zpos == this->field_5C_pCar->field_50_car_sprite->field_1C_zpos ) | |
| { | |
| dword_6FE33C = 0; | |
| } | |
| else | |
| { | |
| v11 = (dword_6FDFF4 * (__int64)-this->field_68_z_pos) >> 14; | |
| this->field_68_z_pos = v11; | |
| if ( (int)v11 <= 0 ) | |
| { | |
| LODWORD(v11) = -(int)v11; | |
| } | |
| if ( (int)v11 < *(int *)((char *)&dword_6FE116 + 2) ) | |
| { | |
| this->field_68_z_pos = kFP16Zero_6FE20C; | |
| } | |
| pLhs.x.mValue = 10; | |
| v12 = Fix16_Point::subtract_40AC80(&v31, &v34, &pRhs); | |
| LOBYTE(seh) = 6; | |
| v13 = Fix16_Point::NormalizeSafe_442AD0(v12, &v35); | |
| arg0a = *Fix16_Point::Divide_55F9E0(v13, &v36, &pLhs.x.mValue); | |
| LOBYTE(seh) = 5; | |
| CarPhysics_B0::AccumulateImpulse_55FC30(this, &arg0a, 50); | |
| v14 = p2c_->field_8; | |
| f34_type = v14->field_34_type; | |
| if ( f34_type == 3 || f34_type == 4 || f34_type <= 2 && v14->field_44 == 2 ) | |
| { | |
| v16 = Fix16_Point::Negate_40ACB0(&arg0a, &v36); | |
| LOBYTE(seh) = 7; | |
| Object_2C::SetMovementVectorWithRandomState_522640(p2c_, v16); | |
| LOBYTE(seh) = 5; | |
| } | |
| mValue = this->field_70; | |
| if ( mValue <= 0 ) | |
| { | |
| Fix16::Negate_4086A0((Fix16 *)&this->field_70, &pLhs); | |
| mValue = pLhs.x.mValue; | |
| } | |
| dword_6FE33C = 50 * (((int)p2C * (__int64)mValue) >> 14); | |
| } | |
| dword_6FE33C += *CarPhysics_B0::ApplyImpactForcesAndDamage_55FA60( | |
| this, | |
| &pLhs.x.mValue, | |
| &stru_6FE1A0, | |
| &v30, | |
| 15); | |
| Car_BC::ApplyImpactDamage_43D5D0(this->field_5C_pCar, dword_6FE33C); | |
| Object_2C::HandleImpact_528E50(p2c_, this->field_5C_pCar->field_50_car_sprite); | |
| if ( dword_6FE33C > dword_6FDFE4 ) | |
| { | |
| if ( this->field_5C_pCar->field_74_damage != 32001 ) | |
| { | |
| v18 = Fix16_Point::Negate_40ACB0(&v28, &v36); | |
| v19 = v18->y.mValue; | |
| v20 = v18->x.mValue; | |
| field_6C_cp3 = this->field_6C_cp3; | |
| LOBYTE(seh) = 8; | |
| Particle_8::EmitImpactParticles_53FE40( | |
| gParticle_8_6FD5E8, | |
| stru_6FE1A0.x.mValue, | |
| stru_6FE1A0.y.mValue, | |
| field_6C_cp3, | |
| v20, | |
| v19); | |
| LOBYTE(seh) = 5; | |
| } | |
| Car_BC::TryDamageArea_43D2C0(this->field_5C_pCar, damage_area, dword_6FE33C); | |
| } | |
| } | |
| void __thiscall CarPhysics_B0::HandleWorldCollision_55FD00( | |
| CarPhysics_B0 *this, | |
| Fix16_Point *pHitPoint) | |
| { | |
| Fix16_Point *combinedCentreOfmass; // edi | |
| int *momentOfInertia; // eax | |
| Fix16_Point *v5; // ebp | |
| int *carMass; // eax | |
| __int32 field_98_surface_type; // eax | |
| __int64 v8; // rax | |
| int damage; // eax | |
| Fix16 *p_y; // ecx | |
| _DWORD *xXx; // eax | |
| int *xXy; // eax | |
| Fix16_Point *v13; // eax | |
| int mValue; // ecx | |
| int v15; // edx | |
| int v16; // [esp-24h] [ebp-64h] | |
| Fix16_Point *v17; // [esp-20h] [ebp-60h] | |
| int v18; // [esp-Ch] [ebp-4Ch] | |
| __int32 field_6C_cp3; // [esp-Ch] [ebp-4Ch] | |
| int v20; // [esp-8h] [ebp-48h] | |
| int v21; // [esp-4h] [ebp-44h] | |
| _DWORD *yXy; // [esp-4h] [ebp-44h] | |
| int v23; // [esp+Ch] [ebp-34h] BYREF | |
| int v24; // [esp+10h] [ebp-30h] BYREF | |
| int v25; // [esp+14h] [ebp-2Ch] BYREF | |
| int v26; // [esp+18h] [ebp-28h] BYREF | |
| Fix16_Point v27; // [esp+1Ch] [ebp-24h] BYREF | |
| Fix16_Point v28; // [esp+24h] [ebp-1Ch] BYREF | |
| Fix16_Point v29; // [esp+2Ch] [ebp-14h] BYREF | |
| int seh; // [esp+3Ch] [ebp-4h] | |
| combinedCentreOfmass = CarPhysics_B0::ComputeCombinedCenterOfMass_559EC0( | |
| this, | |
| &v29); | |
| v21 = dword_6FE1A8; | |
| v20 = kFP16Zero_6FE20C; | |
| seh = 0; | |
| momentOfInertia = CarPhysics_B0::GetEffectiveMomentOfInertia_55A050( | |
| this, | |
| &v23); | |
| v5 = pHitPoint; | |
| v18 = *momentOfInertia; | |
| v17 = pHitPoint; | |
| v16 = dword_6FDF1C; | |
| carMass = CarPhysics_B0::CalculateMass_559FF0(this, &v24); | |
| ComputeLineLineIntersection_55F3B0( | |
| &v28, | |
| *carMass, | |
| v16, | |
| v17, | |
| &stru_6FE1F0, | |
| &stru_6FE1A0, | |
| combinedCentreOfmass, | |
| &stru_6FE300, | |
| v18, | |
| v20, | |
| v21); | |
| field_98_surface_type = this->field_98_surface_type; | |
| LOBYTE(seh) = 2; | |
| if ( field_98_surface_type == 6 && this->field_70 <= kFP16Zero_6FE20C ) | |
| { | |
| v8 = (-this->field_68_z_pos * (__int64)dword_6FDFF4) >> 14; | |
| this->field_68_z_pos = v8; | |
| if ( (int)v8 <= 0 ) | |
| { | |
| LODWORD(v8) = -(int)v8; | |
| } | |
| if ( (int)v8 < *(int *)((char *)&dword_6FE116 + 2) ) | |
| { | |
| this->field_68_z_pos = kFP16Zero_6FE20C; | |
| } | |
| } | |
| damage = *CarPhysics_B0::ApplyImpactForcesAndDamage_55FA60( | |
| this, | |
| (int *)&pHitPoint, | |
| &stru_6FE1A0, | |
| &v28, | |
| 15); | |
| dword_6FE33C = damage; | |
| if ( this->field_98_surface_type == 6 | |
| && this->field_70 == kFP16Zero_6FE20C | |
| && this->field_68_z_pos == kFP16Zero_6FE20C | |
| && this->field_40_linvel_1.x.mValue == kFP16Zero_6FE20C | |
| && this->field_40_linvel_1.y.mValue == kFP16Zero_6FE20C | |
| && damage < dword_6FE098 ) | |
| { | |
| damage = dword_6FE098; | |
| dword_6FE33C = dword_6FE098; | |
| } | |
| Car_BC::ApplyImpactDamage_43D5D0(this->field_5C_pCar, damage); | |
| p_y = &this->field_40_linvel_1.y; | |
| if ( this->field_40_linvel_1.x.mValue == kFP16Zero_6FE20C ) | |
| { | |
| if ( p_y->mValue <= 0 ) | |
| { | |
| Fix16::Negate_4086A0(p_y, &pHitPoint); | |
| } | |
| else | |
| { | |
| pHitPoint = (Fix16_Point *)p_y->mValue; | |
| } | |
| } | |
| else if ( p_y->mValue == kFP16Zero_6FE20C ) | |
| { | |
| Fix16::Abs_436A50((int *)&pHitPoint, &this->field_40_linvel_1.x.mValue); | |
| } | |
| else | |
| { | |
| yXy = Fix16::Multiply_408680( | |
| &p_y->mValue, | |
| &v25, | |
| &this->field_40_linvel_1.y.mValue); | |
| xXx = Fix16::Multiply_408680( | |
| &this->field_40_linvel_1.x.mValue, | |
| &v27, | |
| &this->field_40_linvel_1.x.mValue); | |
| xXy = Fix16::Add_408660(xXx, &v26, yXy); | |
| Fix16::SquareRoot_436A70(&pHitPoint, xXy); | |
| } | |
| if ( (int)pHitPoint > FastCarMinVelocity_6FE1CC ) | |
| { | |
| if ( this->field_5C_pCar->field_74_damage != 32001 ) | |
| { | |
| v13 = Fix16_Point::Negate_40ACB0(v5, &v27); | |
| mValue = v13->y.mValue; | |
| v15 = v13->x.mValue; | |
| field_6C_cp3 = this->field_6C_cp3; | |
| LOBYTE(seh) = 3; | |
| Particle_8::EmitImpactParticles_53FE40( | |
| gParticle_8_6FD5E8, | |
| stru_6FE1A0.x.mValue, | |
| stru_6FE1A0.y.mValue, | |
| field_6C_cp3, | |
| v15, | |
| mValue); | |
| LOBYTE(seh) = 2; | |
| } | |
| Car_BC::TryDamageArea_43D2C0(this->field_5C_pCar, pOut1, dword_6FE33C); | |
| } | |
| } | |
| void __thiscall CarPhysics_B0::HandleMapBoundaryCollisionX_55C820( | |
| CarPhysics_B0 *this, | |
| Fix16_Point *a2, | |
| Ang16 *a3) | |
| { | |
| Sprite *pCarSprite; // ecx | |
| int v5; // eax | |
| __int32 mValue; // esi | |
| Fix16_Point *v7; // edx | |
| _DWORD *v8; // eax | |
| _DWORD *v9; // eax | |
| __int32 v10; // eax | |
| __int32 v11; // eax | |
| Fix16_Point *v12; // eax | |
| __int32 v13; // ecx | |
| _DWORD *v14; // [esp-4h] [ebp-3Ch] | |
| _DWORD *v15; // [esp-4h] [ebp-3Ch] | |
| int v16; // [esp+Ch] [ebp-2Ch] BYREF | |
| Fix16 v17; // [esp+10h] [ebp-28h] BYREF | |
| int v18; // [esp+14h] [ebp-24h] BYREF | |
| int v19; // [esp+18h] [ebp-20h] BYREF | |
| Fix16_Point v20; // [esp+1Ch] [ebp-1Ch] BYREF | |
| Fix16_Point v21; // [esp+24h] [ebp-14h] BYREF | |
| int maybe_seh; // [esp+34h] [ebp-4h] | |
| pCarSprite = this->field_5C_pCar->field_50_car_sprite; | |
| maybe_seh = 0; | |
| if ( Sprite::GetNearestVerticalEdgeToCoordinate_5A1030( | |
| pCarSprite, | |
| gRozza_679188.field_14_mapx_t2, | |
| &stru_6FE1A0.x.mValue, | |
| &pOut1) ) | |
| { | |
| stru_6FE1F0.x.mValue = this->field_38_cp1.x.mValue | |
| - gRozza_679188.field_14_mapx_t2; | |
| stru_6FE1F0.y.mValue = 0; | |
| v21 = *CarPhysics_B0::ComputeRelativePointVelocity_561130( | |
| this, | |
| &v20, | |
| &stru_6FE1A0); | |
| } | |
| else | |
| { | |
| stru_6FE1A0 = *(Fix16_Point *)&gRozza_679188.field_14_mapx_t2; | |
| stru_6FE1A0.x.mValue = gRozza_679188.field_14_mapx_t2 - a2->x.mValue; | |
| stru_6FE1A0.y.mValue = gRozza_679188.field_18_mapy_t1 - a2->y.mValue; | |
| LOWORD(a3) = this->field_58_theta - (_WORD)a3; | |
| Ang16::Normalize_406C20((__int16 *)&a3); | |
| v5 = (__int16)a3; | |
| mValue = stru_6FE1A0.x.mValue; | |
| v7 = (Fix16_Point *)gCos_table_669260[v5]; | |
| v16 = gSin_table_667A80[v5]; | |
| a2 = v7; | |
| v14 = Fix16::Multiply_408680(&stru_6FE1A0.y.mValue, &v17, &v16); | |
| v8 = Fix16::Multiply_408680(&stru_6FE1A0.x.mValue, &v19, (int *)&a2); | |
| stru_6FE1A0.x.mValue = *Fix16::Add_408660(v8, &v18, v14); | |
| v17.mValue = -mValue; | |
| v15 = Fix16::Multiply_408680(&stru_6FE1A0.y.mValue, &v19, (int *)&a2); | |
| v9 = Fix16::Multiply_408680(&v17.mValue, &v20, &v16); | |
| stru_6FE1A0.y.mValue = *Fix16::Add_408660(v9, &v18, v15); | |
| stru_6FE1A0.y.mValue += this->field_38_cp1.y.mValue; | |
| v10 = stru_6FE1A0.y.mValue; | |
| stru_6FE1A0.x.mValue = gRozza_679188.field_14_mapx_t2; | |
| a2 = (Fix16_Point *)(stru_6FE1A0.y.mValue - gRozza_679188.field_10); | |
| if ( stru_6FE1A0.y.mValue - gRozza_679188.field_10 <= 0 ) | |
| { | |
| Fix16::Negate_4086A0((Fix16 *)&a2, &a3); | |
| v10 = stru_6FE1A0.y.mValue; | |
| } | |
| else | |
| { | |
| a3 = (Ang16 *)(stru_6FE1A0.y.mValue - gRozza_679188.field_10); | |
| } | |
| v11 = v10 - gRozza_679188.field_C_mapy_t2; | |
| v17.mValue = v11; | |
| if ( v11 <= 0 ) | |
| { | |
| Fix16::Negate_4086A0(&v17, &v16); | |
| v11 = v16; | |
| } | |
| if ( v11 >= (int)a3 ) | |
| { | |
| stru_6FE1A0.y.mValue = gRozza_679188.field_10; | |
| } | |
| else | |
| { | |
| stru_6FE1A0.y.mValue = gRozza_679188.field_C_mapy_t2; | |
| } | |
| v12 = CarPhysics_B0::ComputeRelativePointVelocity_561130( | |
| this, | |
| &v20, | |
| &stru_6FE1A0); | |
| v13 = this->field_38_cp1.x.mValue; | |
| v21 = *v12; | |
| if ( v13 >= stru_6FE1A0.x.mValue ) | |
| { | |
| stru_6FE1F0.x.mValue = k_dword_6FE210; | |
| } | |
| else | |
| { | |
| stru_6FE1F0.x.mValue = -k_dword_6FE210; | |
| } | |
| stru_6FE1F0.y.mValue = 0; | |
| } | |
| CarPhysics_B0::HandleWorldCollision_55FD00(this, &v21); | |
| } | |
| void __thiscall CarPhysics_B0::HandleMapBoundaryCollisionY_55C5C0( | |
| CarPhysics_B0 *this, | |
| Fix16_Point *a2, | |
| Ang16 *a3) | |
| { | |
| Sprite *pSprite; // ecx | |
| __int32 v5; // eax | |
| int v6; // eax | |
| __int32 mValue; // esi | |
| Fix16_Point *v8; // edx | |
| _DWORD *v9; // eax | |
| _DWORD *v10; // eax | |
| __int32 v11; // ecx | |
| __int32 v12; // ecx | |
| Fix16_Point *v13; // eax | |
| __int32 v14; // edx | |
| __int32 v15; // eax | |
| _DWORD *v16; // [esp-8h] [ebp-3Ch] | |
| _DWORD *v17; // [esp-8h] [ebp-3Ch] | |
| int v18; // [esp+8h] [ebp-2Ch] BYREF | |
| Fix16 v19; // [esp+Ch] [ebp-28h] BYREF | |
| int v20; // [esp+10h] [ebp-24h] BYREF | |
| int v21; // [esp+14h] [ebp-20h] BYREF | |
| Fix16_Point v22; // [esp+18h] [ebp-1Ch] BYREF | |
| Fix16_Point v23; // [esp+20h] [ebp-14h] BYREF | |
| int v24; // [esp+30h] [ebp-4h] | |
| pSprite = this->field_5C_pCar->field_50_car_sprite; | |
| v24 = 0; | |
| if ( Sprite::GetNearestHorizontalEdgeToCoordinate_5A0A70( | |
| pSprite, | |
| gRozza_679188.field_18_mapy_t1, | |
| &stru_6FE1A0.x.mValue, | |
| &pOut1) ) | |
| { | |
| v5 = this->field_38_cp1.y.mValue - gRozza_679188.field_18_mapy_t1; | |
| stru_6FE1F0.x.mValue = 0; | |
| stru_6FE1F0.y.mValue = v5; | |
| v23 = *CarPhysics_B0::ComputeRelativePointVelocity_561130( | |
| this, | |
| &v22, | |
| &stru_6FE1A0); | |
| } | |
| else | |
| { | |
| stru_6FE1A0 = *(Fix16_Point *)&gRozza_679188.field_14_mapx_t2; | |
| stru_6FE1A0.x.mValue = gRozza_679188.field_14_mapx_t2 - a2->x.mValue; | |
| stru_6FE1A0.y.mValue = gRozza_679188.field_18_mapy_t1 - a2->y.mValue; | |
| LOWORD(a3) = this->field_58_theta - (_WORD)a3; | |
| Ang16::Normalize_406C20((__int16 *)&a3); | |
| v6 = (__int16)a3; | |
| mValue = stru_6FE1A0.x.mValue; | |
| v8 = (Fix16_Point *)gCos_table_669260[v6]; | |
| v18 = gSin_table_667A80[v6]; | |
| a2 = v8; | |
| v16 = Fix16::Multiply_408680(&stru_6FE1A0.y.mValue, &v19, &v18); | |
| v9 = Fix16::Multiply_408680(&stru_6FE1A0.x.mValue, &v21, (int *)&a2); | |
| stru_6FE1A0.x.mValue = *Fix16::Add_408660(v9, &v20, v16); | |
| v19.mValue = -mValue; | |
| v17 = Fix16::Multiply_408680(&stru_6FE1A0.y.mValue, &v21, (int *)&a2); | |
| v10 = Fix16::Multiply_408680(&v19.mValue, &v22, &v18); | |
| stru_6FE1A0.y.mValue = *Fix16::Add_408660(v10, &v20, v17); | |
| v11 = this->field_38_cp1.x.mValue + stru_6FE1A0.x.mValue; | |
| stru_6FE1A0.y.mValue = gRozza_679188.field_18_mapy_t1; | |
| stru_6FE1A0.x.mValue = v11; | |
| a2 = (Fix16_Point *)(v11 - gRozza_679188.field_8); | |
| if ( v11 - gRozza_679188.field_8 <= 0 ) | |
| { | |
| Fix16::Negate_4086A0((Fix16 *)&a2, &a3); | |
| v11 = stru_6FE1A0.x.mValue; | |
| } | |
| else | |
| { | |
| a3 = (Ang16 *)(v11 - gRozza_679188.field_8); | |
| } | |
| v12 = v11 - gRozza_679188.field_4_mapx_t1; | |
| v19.mValue = v12; | |
| if ( v12 <= 0 ) | |
| { | |
| Fix16::Negate_4086A0(&v19, &v18); | |
| v12 = v18; | |
| } | |
| if ( v12 >= (int)a3 ) | |
| { | |
| stru_6FE1A0.x.mValue = gRozza_679188.field_8; | |
| } | |
| else | |
| { | |
| stru_6FE1A0.x.mValue = gRozza_679188.field_4_mapx_t1; | |
| } | |
| v13 = CarPhysics_B0::ComputeRelativePointVelocity_561130( | |
| this, | |
| &v22, | |
| &stru_6FE1A0); | |
| v23.x.mValue = v13->x.mValue; | |
| v14 = v13->y.mValue; | |
| v15 = this->field_38_cp1.y.mValue; | |
| v23.y.mValue = v14; | |
| stru_6FE1F0.x.mValue = 0; | |
| if ( v15 >= stru_6FE1A0.y.mValue ) | |
| { | |
| stru_6FE1F0.y.mValue = k_dword_6FE210; | |
| } | |
| else | |
| { | |
| stru_6FE1F0.y.mValue = -k_dword_6FE210; | |
| } | |
| } | |
| CarPhysics_B0::HandleWorldCollision_55FD00(this, &v23); | |
| } | |
| void __thiscall Car_BC::sub_441D40(Car_BC *this) | |
| { | |
| CarDamageAreasFlags field_8_damaged_areas; // eax | |
| CarDamageAreasFlags v2; // edx | |
| CarDamageAreasFlags v3; // eax | |
| CarDamageAreasFlags v4; // edx | |
| CarDamageAreasFlags v5; // eax | |
| CarDamageAreasFlags v6; // edx | |
| CarDamageAreasFlags v7; // eax | |
| CarDamageAreasFlags v8; // edx | |
| CarDamageAreasFlags v9; // eax | |
| CarDamageAreasFlags v10; // edx | |
| CarDamageAreasFlags v11; // eax | |
| CarDamageAreasFlags v12; // edx | |
| CarDamageAreasFlags v13; // eax | |
| CarDamageAreasFlags v14; // edx | |
| CarDamageAreasFlags v15; // eax | |
| CarDamageAreasFlags v16; // eax | |
| if ( !(rng_dword_67AB34->field_0_rng % 3u) ) | |
| { | |
| field_8_damaged_areas = this->field_8_damaged_areas; | |
| if ( (this->field_A4 & 4) != 0 ) | |
| { | |
| if ( (field_8_damaged_areas & 0x800) == 0x800 ) | |
| { | |
| v2 = this->field_8_damaged_areas; | |
| BYTE1(v2) = BYTE1(field_8_damaged_areas) & ~8; | |
| v3 = v2; | |
| this->field_8_damaged_areas = v2; | |
| BYTE1(v3) = BYTE1(v2) | 0x10; | |
| this->field_8_damaged_areas = v3; | |
| } | |
| else if ( (field_8_damaged_areas & 0x1000) == 0x1000 ) | |
| { | |
| v4 = this->field_8_damaged_areas; | |
| BYTE1(v4) &= ~0x10u; | |
| v5 = v4; | |
| this->field_8_damaged_areas = v4; | |
| BYTE1(v5) = BYTE1(v4) | 0x20; | |
| this->field_8_damaged_areas = v5; | |
| } | |
| else if ( (field_8_damaged_areas & 0x2000) == 0x2000 ) | |
| { | |
| v6 = this->field_8_damaged_areas; | |
| BYTE1(v6) &= ~0x20u; | |
| v7 = v6; | |
| this->field_8_damaged_areas = v6; | |
| BYTE1(v7) = BYTE1(v6) | 0x40; | |
| this->field_8_damaged_areas = v7; | |
| } | |
| else if ( (field_8_damaged_areas & 0x4000) == 0x4000 ) | |
| { | |
| v8 = this->field_8_damaged_areas; | |
| BYTE1(v8) &= ~0x40u; | |
| v9 = v8; | |
| this->field_8_damaged_areas = v8; | |
| BYTE1(v9) = BYTE1(v8) | 0x80; | |
| this->field_8_damaged_areas = v9; | |
| } | |
| } | |
| else if ( (field_8_damaged_areas & 0x4000) == 0x4000 ) | |
| { | |
| v10 = this->field_8_damaged_areas; | |
| BYTE1(v10) &= ~0x40u; | |
| v11 = v10; | |
| this->field_8_damaged_areas = v10; | |
| BYTE1(v11) = BYTE1(v10) | 0x20; | |
| this->field_8_damaged_areas = v11; | |
| } | |
| else if ( (field_8_damaged_areas & 0x2000) == 0x2000 ) | |
| { | |
| v12 = this->field_8_damaged_areas; | |
| BYTE1(v12) &= ~0x20u; | |
| v13 = v12; | |
| this->field_8_damaged_areas = v12; | |
| BYTE1(v13) = BYTE1(v12) | 0x10; | |
| this->field_8_damaged_areas = v13; | |
| } | |
| else if ( (field_8_damaged_areas & 0x1000) == 0x1000 ) | |
| { | |
| v14 = this->field_8_damaged_areas; | |
| BYTE1(v14) &= ~0x10u; | |
| v15 = v14; | |
| this->field_8_damaged_areas = v14; | |
| BYTE1(v15) = BYTE1(v14) | 8; | |
| this->field_8_damaged_areas = v15; | |
| } | |
| else if ( (field_8_damaged_areas & 0x800) == 0x800 ) | |
| { | |
| v16 = this->field_8_damaged_areas; | |
| BYTE1(v16) &= ~8u; | |
| this->field_8_damaged_areas = v16; | |
| } | |
| } | |
| } | |
| void __thiscall Wolfy_30::sub_540A40(Wolfy_30 *this) | |
| { | |
| __int16 count_down_rng; // ax | |
| __int32 v3; // eax | |
| Particle_4C *v4; // eax | |
| __int32 v5; // edx | |
| Particle_4C *v6; // esi | |
| Sprite *v7; // ecx | |
| Sprite *field_30_pNext; // ecx | |
| __int16 v9; // ax | |
| Sprite *v10; // ecx | |
| Sprite *v11; // ecx | |
| Sprite *v12; // eax | |
| __int32 field_1C_zpos; // edx | |
| __int32 mValue; // ebx | |
| __int32 v15; // eax | |
| __int32 v16; // [esp-18h] [ebp-4Ch] | |
| __int32 v17; // [esp-14h] [ebp-48h] | |
| __int32 v18; // [esp-14h] [ebp-48h] | |
| __int32 v19; // [esp-10h] [ebp-44h] | |
| __int32 v20; // [esp-10h] [ebp-44h] | |
| __int32 v21; // [esp-Ch] [ebp-40h] | |
| __int32 v22; // [esp-Ch] [ebp-40h] | |
| __int32 v23; // [esp-8h] [ebp-3Ch] | |
| __int32 v24; // [esp-8h] [ebp-3Ch] | |
| int v25; // [esp+10h] [ebp-24h] BYREF | |
| int v26; // [esp+14h] [ebp-20h] BYREF | |
| int v27; // [esp+18h] [ebp-1Ch] BYREF | |
| int v28; // [esp+1Ch] [ebp-18h] BYREF | |
| int v29; // [esp+20h] [ebp-14h] BYREF | |
| int v30; // [esp+24h] [ebp-10h] BYREF | |
| int v31; // [esp+28h] [ebp-Ch] BYREF | |
| int v32; // [esp+2Ch] [ebp-8h] BYREF | |
| Fix16 v33; // [esp+30h] [ebp-4h] BYREF | |
| count_down_rng = this->field_18_rng_value; | |
| if ( count_down_rng ) | |
| { | |
| this->field_18_rng_value = count_down_rng - 1; | |
| } | |
| else | |
| { | |
| v25 = 4; | |
| gWoflyRngValue_6FD5F8 = rng::get_int_4F7AE0(&stru_6F6784, (__int16 *)&v25); | |
| switch ( gWoflyRngValue_6FD5F8 ) | |
| { | |
| case 0: | |
| v23 = dword_6FD450; | |
| v21 = dword_6FD450; | |
| v3 = dword_6FD44C; | |
| v19 = dword_6FD330; | |
| v17 = dword_6FD44C; | |
| goto LABEL_7; | |
| case 1: | |
| v24 = dword_6FD450; | |
| v22 = *Fix16::Negate_4086A0((Fix16 *)&dword_6FD450, &v25); | |
| v20 = dword_6FD330; | |
| v18 = dword_6FD44C; | |
| v16 = *Fix16::Negate_4086A0((Fix16 *)&dword_6FD44C, &v26); | |
| v4 = Particle_8::New_53E3C0( | |
| gParticle_8_6FD5E8, | |
| v16, | |
| v18, | |
| v20, | |
| v22, | |
| v24, | |
| 0); | |
| goto LABEL_8; | |
| case 2: | |
| v23 = *Fix16::Negate_4086A0((Fix16 *)&dword_6FD450, &v27); | |
| v21 = dword_6FD450; | |
| v19 = dword_6FD330; | |
| v5 = *Fix16::Negate_4086A0((Fix16 *)&dword_6FD44C, &v28); | |
| v3 = dword_6FD44C; | |
| v17 = v5; | |
| goto LABEL_7; | |
| case 3: | |
| v23 = *Fix16::Negate_4086A0((Fix16 *)&dword_6FD450, &v29); | |
| v21 = *Fix16::Negate_4086A0((Fix16 *)&dword_6FD450, &v30); | |
| v19 = dword_6FD330; | |
| v17 = *Fix16::Negate_4086A0((Fix16 *)&dword_6FD44C, &v31); | |
| v3 = *Fix16::Negate_4086A0((Fix16 *)&dword_6FD44C, &v32); | |
| LABEL_7: | |
| v4 = Particle_8::New_53E3C0( | |
| gParticle_8_6FD5E8, | |
| v3, | |
| v17, | |
| v19, | |
| v21, | |
| v23, | |
| 0); | |
| LABEL_8: | |
| v6 = v4; | |
| if ( v4 ) | |
| { | |
| v4->field_40_pUnknown = this; | |
| v4->field_44 = this->field_6_id; | |
| v7 = this->field_14_obj_2c->field_4; | |
| if ( v7 ) | |
| { | |
| v4->field_20 = Object_2C::sub_5290F0(v7->field_8_uni1.o2c, &v33)->mValue; | |
| v6->field_24.field_0 = this->field_14_obj_2c->field_4->field_8_uni1.o2c->field_10_obj_3c->field_4.field_0; | |
| } | |
| field_30_pNext = v6->field_30_pNext; | |
| v6->field_34 = 1; | |
| v6->field_38_state = 6; | |
| v6->field_2C_counter = 100; | |
| v6->field_2E = 100; | |
| field_30_pNext->field_30_sprite_type_enum = 8; | |
| Sprite::sub_59E960(field_30_pNext); | |
| v9 = gPhi_8CA8_6FCF00->field_8CA4; | |
| v10 = v6->field_30_pNext; | |
| if ( v10->field_22_sprite_id != v9 ) | |
| { | |
| v10->field_22_sprite_id = v9; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(v10); | |
| } | |
| v11 = v6->field_30_pNext; | |
| v12 = this->field_14_obj_2c->field_4; | |
| field_1C_zpos = v12->field_1C_zpos; | |
| mValue = v12->field_14_xy.y.mValue; | |
| v15 = v12->field_14_xy.x.mValue; | |
| if ( v11->field_14_xy.x.mValue != v15 | |
| || v11->field_14_xy.y.mValue != mValue | |
| || v11->field_1C_zpos != field_1C_zpos ) | |
| { | |
| v11->field_14_xy.x.mValue = v15; | |
| v11->field_14_xy.y.mValue = mValue; | |
| v11->field_1C_zpos = field_1C_zpos; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v11); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| v6->field_30_pNext); | |
| v25 = 5; | |
| this->field_18_rng_value = rng::get_int_4F7AE0( | |
| &stru_6F6784, | |
| (__int16 *)&v25); | |
| } | |
| break; | |
| default: | |
| return; | |
| } | |
| } | |
| } | |
| void __thiscall Wolfy_30::state_3_12_540D30(Wolfy_30 *this, int a2, int a3) | |
| { | |
| __int16 v4; // bx | |
| int v5; // ebp | |
| __int16 v6; // si | |
| int v7; // ecx | |
| int v8; // eax | |
| int v9; // ecx | |
| __int64 v10; // rax | |
| _DWORD *v11; // eax | |
| _DWORD *v12; // eax | |
| __int32 v13; // ecx | |
| __int16 field_18_rng_value; // ax | |
| Particle_4C *v15; // eax | |
| Particle_4C *v16; // esi | |
| Sprite *field_30_pNext; // ecx | |
| __int16 field_6_id; // ax | |
| Sprite *v19; // ecx | |
| __int16 v20; // ax | |
| Sprite *v21; // ecx | |
| Sprite *v22; // eax | |
| __int32 field_1C_zpos; // edx | |
| __int32 mValue; // ebx | |
| __int32 v25; // eax | |
| __int16 int_4F7AE0; // ax | |
| _DWORD *v27; // [esp-4h] [ebp-38h] BYREF | |
| int v28; // [esp+10h] [ebp-24h] BYREF | |
| int v29; // [esp+14h] [ebp-20h] BYREF | |
| int v30; // [esp+18h] [ebp-1Ch] BYREF | |
| int v31; // [esp+1Ch] [ebp-18h] BYREF | |
| __int32 v32; // [esp+20h] [ebp-14h] BYREF | |
| __int32 v33[4]; // [esp+24h] [ebp-10h] BYREF | |
| v4 = a2; | |
| v5 = a3; | |
| v6 = a2 + word_6FD3EE; | |
| v33[3] = 0; | |
| v32 = a3; | |
| v33[0] = a3; | |
| if ( (__int16)(a2 + word_6FD3EE) < 0 ) | |
| { | |
| v6 += 1440 * ((1439 - v6) / 0x5A0u); | |
| } | |
| if ( v6 >= 1440 ) | |
| { | |
| v6 %= 0x5A0u; | |
| } | |
| v7 = v6; | |
| v8 = gSin_table_667A80[v7]; | |
| v9 = gCos_table_669260[v7]; | |
| v28 = v8; | |
| v10 = a3 * (__int64)v8; | |
| a3 = v9; | |
| a2 = v10 >> 14; | |
| v11 = Fix16::Multiply_408680(&v32, &v30, &a3); | |
| v32 = *Fix16::Add_408660(v11, &v29, &a2); | |
| a2 = -v5; | |
| v27 = Fix16::Multiply_408680(v33, &v30, &a3); | |
| v12 = Fix16::Multiply_408680(&a2, &v31, &v28); | |
| v13 = *Fix16::Add_408660(v12, &v29, v27); | |
| field_18_rng_value = this->field_18_rng_value; | |
| v33[0] = v13; | |
| this->field_8 = v5; | |
| this->field_C = v4; | |
| if ( field_18_rng_value ) | |
| { | |
| int_4F7AE0 = field_18_rng_value - 1; | |
| } | |
| else | |
| { | |
| a3 = (int)&v27; | |
| v15 = Particle_8::New_53E3C0( | |
| gParticle_8_6FD5E8, | |
| v32, | |
| v33[0], | |
| dword_6FD330, | |
| v32, | |
| v33[0], | |
| 0); | |
| v16 = v15; | |
| if ( !v15 ) | |
| { | |
| return; | |
| } | |
| field_30_pNext = v15->field_30_pNext; | |
| v15->field_40_pUnknown = this; | |
| field_6_id = this->field_6_id; | |
| v16->field_20 = v5; | |
| v16->field_44 = field_6_id; | |
| v16->field_24.field_0 = v4; | |
| v16->field_34 = 0; | |
| v16->field_46_sub_state = 0; | |
| v16->field_2C_counter = 32; | |
| v16->field_2E = 32; | |
| field_30_pNext->field_30_sprite_type_enum = 8; | |
| Sprite::sub_59E960(field_30_pNext); | |
| v16->field_38_state = 3; | |
| v19 = v16->field_30_pNext; | |
| v20 = gPhi_8CA8_6FCF00->field_8CA4 + 96; | |
| if ( v19->field_22_sprite_id != v20 ) | |
| { | |
| v19->field_22_sprite_id = v20; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(v19); | |
| } | |
| v16->field_30_pNext->field_2C_flags |= 4u; | |
| v21 = v16->field_30_pNext; | |
| v22 = this->field_14_obj_2c->field_4; | |
| field_1C_zpos = v22->field_1C_zpos; | |
| mValue = v22->field_14_xy.y.mValue; | |
| v25 = v22->field_14_xy.x.mValue; | |
| if ( v21->field_14_xy.x.mValue != v25 | |
| || v21->field_14_xy.y.mValue != mValue | |
| || v21->field_1C_zpos != field_1C_zpos ) | |
| { | |
| v21->field_14_xy.x.mValue = v25; | |
| v21->field_14_xy.y.mValue = mValue; | |
| v21->field_1C_zpos = field_1C_zpos; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v21); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| v16->field_30_pNext); | |
| a3 = 2; | |
| int_4F7AE0 = rng::get_int_4F7AE0(&stru_6F6784, (__int16 *)&a3); | |
| } | |
| this->field_18_rng_value = int_4F7AE0; | |
| } | |
| void __thiscall Wolfy_30::state_4_540F90(Wolfy_30 *this, int a2, int a3) | |
| { | |
| __int16 v4; // bx | |
| int v5; // ebp | |
| __int16 v6; // si | |
| int v7; // ecx | |
| int v8; // eax | |
| int v9; // ecx | |
| __int64 v10; // rax | |
| _DWORD *v11; // eax | |
| _DWORD *v12; // eax | |
| int v13; // ecx | |
| __int16 field_18_rng_value; // ax | |
| Particle_4C *v15; // eax | |
| Particle_4C *v16; // esi | |
| Sprite *field_30_pNext; // ecx | |
| __int16 field_6_id; // ax | |
| __int16 v19; // ax | |
| Sprite *v20; // ecx | |
| Sprite *v21; // ecx | |
| Sprite *v22; // eax | |
| __int32 field_1C_zpos; // edx | |
| __int32 mValue; // ebx | |
| __int32 v25; // eax | |
| __int16 int_4F7AE0; // ax | |
| _DWORD *v27; // [esp-4h] [ebp-38h] BYREF | |
| int v28; // [esp+10h] [ebp-24h] BYREF | |
| int v29; // [esp+14h] [ebp-20h] BYREF | |
| int v30; // [esp+18h] [ebp-1Ch] BYREF | |
| int v31; // [esp+1Ch] [ebp-18h] BYREF | |
| __int32 xpos; // [esp+20h] [ebp-14h] BYREF | |
| int ypos; // [esp+24h] [ebp-10h] BYREF | |
| int v34; // [esp+30h] [ebp-4h] | |
| v4 = a2; | |
| v5 = a3; | |
| v6 = a2 + word_6FD3EE; | |
| v34 = 0; | |
| xpos = a3; | |
| ypos = a3; | |
| if ( (__int16)(a2 + word_6FD3EE) < 0 ) | |
| { | |
| v6 += 1440 * ((1439 - v6) / 0x5A0u); | |
| } | |
| if ( v6 >= 1440 ) | |
| { | |
| v6 %= 0x5A0u; | |
| } | |
| v7 = v6; | |
| v8 = gSin_table_667A80[v7]; | |
| v9 = gCos_table_669260[v7]; | |
| v28 = v8; | |
| v10 = a3 * (__int64)v8; | |
| a3 = v9; | |
| a2 = v10 >> 14; | |
| v11 = Fix16::Multiply_408680(&xpos, &v30, &a3); | |
| xpos = *Fix16::Add_408660(v11, &v29, &a2); | |
| a2 = -v5; | |
| v27 = Fix16::Multiply_408680(&ypos, &v30, &a3); | |
| v12 = Fix16::Multiply_408680(&a2, &v31, &v28); | |
| v13 = *Fix16::Add_408660(v12, &v29, v27); | |
| field_18_rng_value = this->field_18_rng_value; | |
| ypos = v13; | |
| this->field_8 = v5; | |
| this->field_C = v4; | |
| if ( field_18_rng_value ) | |
| { | |
| int_4F7AE0 = field_18_rng_value - 1; | |
| } | |
| else | |
| { | |
| a3 = (int)&v27; | |
| v15 = Particle_8::New_53E3C0( | |
| gParticle_8_6FD5E8, | |
| xpos, | |
| ypos, | |
| dword_6FD330, | |
| xpos, | |
| ypos, | |
| 0); | |
| v16 = v15; | |
| if ( !v15 ) | |
| { | |
| return; | |
| } | |
| field_30_pNext = v15->field_30_pNext; | |
| v15->field_40_pUnknown = this; | |
| field_6_id = this->field_6_id; | |
| v16->field_20 = v5; | |
| v16->field_44 = field_6_id; | |
| v16->field_24.field_0 = v4; | |
| v16->field_34 = 0; | |
| v16->field_46_sub_state = 0; | |
| v16->field_2C_counter = 32; | |
| v16->field_2E = 32; | |
| field_30_pNext->field_30_sprite_type_enum = 8; | |
| Sprite::sub_59E960(field_30_pNext); | |
| v16->field_38_state = 4; | |
| v19 = gPhi_8CA8_6FCF00->field_8CA4; | |
| v20 = v16->field_30_pNext; | |
| if ( v20->field_22_sprite_id != v19 ) | |
| { | |
| v20->field_22_sprite_id = v19; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(v20); | |
| } | |
| v16->field_30_pNext->field_2C_flags |= 4u; | |
| v21 = v16->field_30_pNext; | |
| v22 = this->field_14_obj_2c->field_4; | |
| field_1C_zpos = v22->field_1C_zpos; | |
| mValue = v22->field_14_xy.y.mValue; | |
| v25 = v22->field_14_xy.x.mValue; | |
| if ( v21->field_14_xy.x.mValue != v25 | |
| || v21->field_14_xy.y.mValue != mValue | |
| || v21->field_1C_zpos != field_1C_zpos ) | |
| { | |
| v21->field_14_xy.x.mValue = v25; | |
| v21->field_14_xy.y.mValue = mValue; | |
| v21->field_1C_zpos = field_1C_zpos; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v21); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| v16->field_30_pNext); | |
| a3 = 2; | |
| int_4F7AE0 = rng::get_int_4F7AE0(&stru_6F6784, (__int16 *)&a3); | |
| } | |
| this->field_18_rng_value = int_4F7AE0; | |
| } | |
| void __thiscall Wolfy_30::state_13_14_5411E0(Wolfy_30 *this, int a2, int a3) | |
| { | |
| __int16 v4; // bx | |
| int v5; // ebp | |
| __int16 v6; // si | |
| int v7; // ecx | |
| int v8; // eax | |
| int v9; // ecx | |
| __int64 v10; // rax | |
| _DWORD *v11; // eax | |
| _DWORD *v12; // eax | |
| int v13; // ecx | |
| __int16 field_18_rng_value; // ax | |
| Particle_4C *v15; // eax | |
| Particle_4C *v16; // esi | |
| Sprite *field_30_pNext; // ecx | |
| __int16 field_6_id; // ax | |
| __int16 v19; // ax | |
| Sprite *v20; // ecx | |
| Sprite *v21; // ecx | |
| Sprite *v22; // eax | |
| __int32 field_1C_zpos; // edx | |
| __int32 mValue; // ebx | |
| __int32 v25; // eax | |
| __int16 int_4F7AE0; // ax | |
| _DWORD *v27; // [esp-4h] [ebp-38h] BYREF | |
| int v28; // [esp+10h] [ebp-24h] BYREF | |
| int v29; // [esp+14h] [ebp-20h] BYREF | |
| int v30; // [esp+18h] [ebp-1Ch] BYREF | |
| int v31; // [esp+1Ch] [ebp-18h] BYREF | |
| __int32 xpos; // [esp+20h] [ebp-14h] BYREF | |
| int ypos; // [esp+24h] [ebp-10h] BYREF | |
| int v34; // [esp+30h] [ebp-4h] | |
| v4 = a2; | |
| v5 = a3; | |
| v6 = a2 + word_6FD3EE; | |
| v34 = 0; | |
| xpos = a3; | |
| ypos = a3; | |
| if ( (__int16)(a2 + word_6FD3EE) < 0 ) | |
| { | |
| v6 += 1440 * ((1439 - v6) / 0x5A0u); | |
| } | |
| if ( v6 >= 1440 ) | |
| { | |
| v6 %= 0x5A0u; | |
| } | |
| v7 = v6; | |
| v8 = gSin_table_667A80[v7]; | |
| v9 = gCos_table_669260[v7]; | |
| v28 = v8; | |
| v10 = a3 * (__int64)v8; | |
| a3 = v9; | |
| a2 = v10 >> 14; | |
| v11 = Fix16::Multiply_408680(&xpos, &v30, &a3); | |
| xpos = *Fix16::Add_408660(v11, &v29, &a2); | |
| a2 = -v5; | |
| v27 = Fix16::Multiply_408680(&ypos, &v30, &a3); | |
| v12 = Fix16::Multiply_408680(&a2, &v31, &v28); | |
| v13 = *Fix16::Add_408660(v12, &v29, v27); | |
| field_18_rng_value = this->field_18_rng_value; | |
| ypos = v13; | |
| this->field_8 = v5; | |
| this->field_C = v4; | |
| if ( field_18_rng_value ) | |
| { | |
| int_4F7AE0 = field_18_rng_value - 1; | |
| } | |
| else | |
| { | |
| a3 = (int)&v27; | |
| v15 = Particle_8::New_53E3C0( | |
| gParticle_8_6FD5E8, | |
| xpos, | |
| ypos, | |
| dword_6FD330, | |
| xpos, | |
| ypos, | |
| 0); | |
| v16 = v15; | |
| if ( !v15 ) | |
| { | |
| return; | |
| } | |
| field_30_pNext = v15->field_30_pNext; | |
| v15->field_40_pUnknown = this; | |
| field_6_id = this->field_6_id; | |
| v16->field_20 = v5; | |
| v16->field_44 = field_6_id; | |
| v16->field_24.field_0 = v4; | |
| v16->field_34 = 0; | |
| v16->field_46_sub_state = 0; | |
| v16->field_2C_counter = 32; | |
| v16->field_2E = 32; | |
| field_30_pNext->field_30_sprite_type_enum = 8; | |
| Sprite::sub_59E960(field_30_pNext); | |
| v16->field_38_state = 36; | |
| v19 = gPhi_8CA8_6FCF00->field_8CA4; | |
| v20 = v16->field_30_pNext; | |
| if ( v20->field_22_sprite_id != v19 ) | |
| { | |
| v20->field_22_sprite_id = v19; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(v20); | |
| } | |
| v16->field_30_pNext->field_2C_flags |= 4u; | |
| v21 = v16->field_30_pNext; | |
| v22 = this->field_14_obj_2c->field_4; | |
| field_1C_zpos = v22->field_1C_zpos; | |
| mValue = v22->field_14_xy.y.mValue; | |
| v25 = v22->field_14_xy.x.mValue; | |
| if ( v21->field_14_xy.x.mValue != v25 | |
| || v21->field_14_xy.y.mValue != mValue | |
| || v21->field_1C_zpos != field_1C_zpos ) | |
| { | |
| v21->field_14_xy.x.mValue = v25; | |
| v21->field_14_xy.y.mValue = mValue; | |
| v21->field_1C_zpos = field_1C_zpos; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v21); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| v16->field_30_pNext); | |
| a3 = 2; | |
| int_4F7AE0 = rng::get_int_4F7AE0(&stru_6F6784, (__int16 *)&a3); | |
| } | |
| this->field_18_rng_value = int_4F7AE0; | |
| } | |
| void __thiscall Wolfy_30::state_5_541430(Wolfy_30 *this, int a2, int a3) | |
| { | |
| __int16 v4; // bx | |
| int v5; // ebp | |
| int v6; // ecx | |
| int v7; // eax | |
| int v8; // ecx | |
| _DWORD *v9; // eax | |
| int *v10; // eax | |
| _DWORD *v11; // eax | |
| int *v12; // eax | |
| Object_2C *field_14_obj_2c; // ecx | |
| __int16 field_18_rng_value; // ax | |
| Particle_4C *v15; // eax | |
| Particle_4C *v16; // esi | |
| Sprite *field_30_pNext; // ecx | |
| __int16 field_6_id; // ax | |
| Sprite *v19; // ecx | |
| __int16 v20; // ax | |
| Sprite *v21; // ecx | |
| Sprite *v22; // eax | |
| __int32 field_1C_zpos; // edx | |
| __int32 mValue; // ebx | |
| __int32 v25; // eax | |
| Fix16 *v26; // [esp-4h] [ebp-40h] BYREF | |
| int v27; // [esp+10h] [ebp-2Ch] BYREF | |
| int v28; // [esp+14h] [ebp-28h] BYREF | |
| Fix16 v29; // [esp+18h] [ebp-24h] BYREF | |
| int v30; // [esp+1Ch] [ebp-20h] BYREF | |
| int v31; // [esp+20h] [ebp-1Ch] BYREF | |
| int v32; // [esp+24h] [ebp-18h] BYREF | |
| __int32 xpos; // [esp+28h] [ebp-14h] BYREF | |
| int ypos; // [esp+2Ch] [ebp-10h] BYREF | |
| int v35; // [esp+38h] [ebp-4h] | |
| v4 = a2; | |
| v5 = a3; | |
| v35 = 0; | |
| xpos = a3; | |
| ypos = a3; | |
| LOWORD(a3) = a2 + word_6FD3EE; | |
| Ang16::Normalize_406C20((__int16 *)&a3); | |
| v6 = (__int16)a3; | |
| v29.mValue = xpos; | |
| v7 = gSin_table_667A80[v6]; | |
| v8 = gCos_table_669260[v6]; | |
| v28 = v7; | |
| a2 = v8; | |
| v27 = (ypos * (__int64)v7) >> 14; | |
| v9 = Fix16::Multiply_408680(&xpos, &v31, &a2); | |
| xpos = *Fix16::Add_408660(v9, &v30, &v27); | |
| v26 = (Fix16 *)Fix16::Multiply_408680(&ypos, &v31, &a2); | |
| v10 = Fix16::Negate_4086A0(&v29, &v32); | |
| v11 = Fix16::Multiply_408680(v10, &v27, &v28); | |
| v12 = Fix16::Add_408660(v11, &v30, v26); | |
| field_14_obj_2c = this->field_14_obj_2c; | |
| ypos = *v12; | |
| v26 = (Fix16 *)&a3; | |
| this->field_8 = v5; | |
| this->field_C = v4; | |
| if ( Object_2C::sub_5290F0(field_14_obj_2c, v26)->mValue == dword_6FD49C | |
| && this->field_1A_timer == 9999 ) | |
| { | |
| this->field_1A_timer = 20; | |
| } | |
| field_18_rng_value = this->field_18_rng_value; | |
| if ( field_18_rng_value ) | |
| { | |
| this->field_18_rng_value = field_18_rng_value - 1; | |
| } | |
| else | |
| { | |
| a3 = (int)&v26; | |
| v15 = Particle_8::New_53E3C0( | |
| gParticle_8_6FD5E8, | |
| xpos, | |
| ypos, | |
| dword_6FD330, | |
| xpos, | |
| ypos, | |
| 0); | |
| v16 = v15; | |
| if ( v15 ) | |
| { | |
| field_30_pNext = v15->field_30_pNext; | |
| v15->field_40_pUnknown = this; | |
| field_6_id = this->field_6_id; | |
| v16->field_20 = v5; | |
| v16->field_44 = field_6_id; | |
| v16->field_24.field_0 = v4; | |
| v16->field_34 = 0; | |
| v16->field_46_sub_state = 0; | |
| v16->field_2C_counter = 32; | |
| v16->field_2E = 32; | |
| field_30_pNext->field_30_sprite_type_enum = 8; | |
| Sprite::sub_59E960(field_30_pNext); | |
| v16->field_38_state = 5; | |
| v19 = v16->field_30_pNext; | |
| v20 = gPhi_8CA8_6FCF00->field_8CA4 + 96; | |
| if ( v19->field_22_sprite_id != v20 ) | |
| { | |
| v19->field_22_sprite_id = v20; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(v19); | |
| } | |
| v21 = v16->field_30_pNext; | |
| v22 = this->field_14_obj_2c->field_4; | |
| field_1C_zpos = v22->field_1C_zpos; | |
| mValue = v22->field_14_xy.y.mValue; | |
| v25 = v22->field_14_xy.x.mValue; | |
| if ( v21->field_14_xy.x.mValue != v25 | |
| || v21->field_14_xy.y.mValue != mValue | |
| || v21->field_1C_zpos != field_1C_zpos ) | |
| { | |
| v21->field_14_xy.x.mValue = v25; | |
| v21->field_14_xy.y.mValue = mValue; | |
| v21->field_1C_zpos = field_1C_zpos; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v21); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| v16->field_30_pNext); | |
| a3 = 2; | |
| this->field_18_rng_value = rng::get_int_4F7AE0( | |
| &stru_6F6784, | |
| (__int16 *)&a3); | |
| v16->field_30_pNext->field_2C_flags = -94; | |
| v16->field_30_pNext->field_2C_flags |= 4u; | |
| } | |
| } | |
| } | |
| _DWORD *__thiscall Wolfy_30::sub_541680(Wolfy_30 *this, _DWORD *a2) | |
| { | |
| _DWORD *result; // eax | |
| switch ( this->field_10_type_or_state ) | |
| { | |
| case 18: | |
| case 22: | |
| case 23: | |
| case 24: | |
| case 25: | |
| result = a2; | |
| *a2 = dword_6FD39C; | |
| break; | |
| case 19: | |
| case 32: | |
| result = a2; | |
| *a2 = dword_6FD4A0; | |
| break; | |
| case 20: | |
| result = a2; | |
| *a2 = dword_6FD4A4; | |
| break; | |
| case 33: | |
| result = a2; | |
| *a2 = dword_6FD370; | |
| break; | |
| default: | |
| result = a2; | |
| *a2 = a2; | |
| break; | |
| } | |
| return result; | |
| } | |
| _DWORD *__thiscall Wolfy_30::sub_541710(Wolfy_30 *this, _DWORD *a2) | |
| { | |
| _DWORD *result; // eax | |
| switch ( this->field_10_type_or_state ) | |
| { | |
| case 18: | |
| case 19: | |
| case 20: | |
| case 22: | |
| case 23: | |
| case 24: | |
| case 25: | |
| case 32: | |
| case 33: | |
| result = a2; | |
| *a2 = dword_6FD2F0; | |
| break; | |
| default: | |
| result = a2; | |
| *a2 = a2; | |
| break; | |
| } | |
| return result; | |
| } | |
| void __thiscall Wolfy_30::sub_541760(Wolfy_30 *this) | |
| { | |
| __int32 type_or_state; // eax | |
| Particle_947C *gRoot; // eax | |
| Particle_4C *v4; // edx | |
| Particle_4C *v5; // esi | |
| Sprite *field_0_first_free; // edi | |
| Sprite *field_30_pNext; // ecx | |
| __int16 v8; // ax | |
| Sprite *v9; // ecx | |
| Sprite *v10; // eax | |
| __int32 field_1C_zpos; // edx | |
| __int32 mValue; // edi | |
| __int32 v13; // eax | |
| type_or_state = this->field_10_type_or_state; | |
| if ( type_or_state != 18 && type_or_state != 32 ) | |
| { | |
| gRoot = gParticle_4C_Pool_6FD5E4; | |
| if ( gParticle_4C_Pool_6FD5E4->field_0 ) | |
| { | |
| v4 = gParticle_4C_Pool_6FD5E4->field_4; | |
| v5 = gParticle_4C_Pool_6FD5E4->field_0; | |
| gParticle_4C_Pool_6FD5E4->field_0 = gParticle_4C_Pool_6FD5E4->field_0->field_3C_mpNext; | |
| v5->field_3C_mpNext = v4; | |
| gRoot->field_4 = v5; | |
| Particle_4C::PoolAllocate_53E2C0(v5); | |
| v5->field_46_sub_state = 0; | |
| v5->field_38_state = 29; | |
| field_0_first_free = gSprite_Pool_703818->field_0_first_free; | |
| gSprite_Pool_703818->field_0_first_free = gSprite_Pool_703818->field_0_first_free->field_C_uni2.pSprite; | |
| Sprite::Init_5A2CF0(field_0_first_free); | |
| v5->field_30_pNext = field_0_first_free; | |
| field_0_first_free->field_30_sprite_type_enum = 8; | |
| Sprite::sub_59E960(field_0_first_free); | |
| v5->field_30_pNext->field_2C_flags |= 4u; | |
| field_30_pNext = v5->field_30_pNext; | |
| v8 = gPhi_8CA8_6FCF00->field_8CA4 + 37; | |
| if ( field_30_pNext->field_22_sprite_id != v8 ) | |
| { | |
| field_30_pNext->field_22_sprite_id = v8; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(field_30_pNext); | |
| } | |
| v9 = v5->field_30_pNext; | |
| v10 = this->field_14_obj_2c->field_4; | |
| field_1C_zpos = v10->field_1C_zpos; | |
| mValue = v10->field_14_xy.y.mValue; | |
| v13 = v10->field_14_xy.x.mValue; | |
| if ( v9->field_14_xy.x.mValue != v13 | |
| || v9->field_14_xy.y.mValue != mValue | |
| || v9->field_1C_zpos != field_1C_zpos ) | |
| { | |
| v9->field_14_xy.x.mValue = v13; | |
| v9->field_14_xy.y.mValue = mValue; | |
| v9->field_1C_zpos = field_1C_zpos; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v9); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| v5->field_30_pNext); | |
| v5->field_48_timer = 10; | |
| } | |
| } | |
| } | |
| void __thiscall Wolfy_30::TimerAfter50Handler_541850( | |
| Wolfy_30 *this, | |
| unsigned __int16 a2) | |
| { | |
| __int32 v3; // ecx | |
| __int64 v4; // rax | |
| Sprite *v5; // ecx | |
| __int32 v6; // edi | |
| __int32 v7; // ebp | |
| __int32 v8; // ebx | |
| __int32 field_1C_zpos; // ecx | |
| __int32 v10; // eax | |
| __int32 v11; // ecx | |
| bool v12; // zf | |
| Object_2C *field_14_obj_2c; // ecx | |
| Sprite *v14; // edi | |
| sprite_type_enum sprite_type_enum; // eax | |
| Sprite_union v16; // ebp | |
| Ped *field_7C_pPed; // ecx | |
| __int32 field_0_ped_id; // eax | |
| Object_2C *v19; // eax | |
| __int32 mValue; // ecx | |
| __int16 v21; // dx | |
| Object_2C *v22; // eax | |
| Sprite *v23; // eax | |
| __int32 v24; // ecx | |
| __int32 v25; // edx | |
| __int32 v26; // eax | |
| int *v27; // eax | |
| int v28; // edi | |
| __int32 v29; // eax | |
| int v30; // eax | |
| Sprite_union v31; // ebp | |
| car_model_enum field_84_car_info_idx; // eax | |
| Sprite *v33; // eax | |
| __int32 v34; // ecx | |
| __int32 v35; // eax | |
| int *v36; // eax | |
| __int32 v37; // eax | |
| __int16 v38; // ax | |
| Ped *v39; // eax | |
| Ped *v40; // edi | |
| Sprite *v41; // ecx | |
| int v42; // edx | |
| __int32 v43; // eax | |
| __int32 v44; // ecx | |
| __int32 v45; // eax | |
| Fix16_Point *x_y_443580; // eax | |
| Object_2C *o2c; // edi | |
| int *v48; // [esp-4h] [ebp-8Ch] | |
| __int16 pRet_Ang16; // [esp+12h] [ebp-76h] BYREF | |
| struct_4 v50; // [esp+14h] [ebp-74h] BYREF | |
| char a5[4]; // [esp+18h] [ebp-70h] | |
| Car_BC *a2a; // [esp+1Ch] [ebp-6Ch] | |
| __int32 v53; // [esp+20h] [ebp-68h] BYREF | |
| Fix16 v54; // [esp+24h] [ebp-64h] BYREF | |
| __int32 v55; // [esp+28h] [ebp-60h] BYREF | |
| __int32 v56; // [esp+2Ch] [ebp-5Ch] BYREF | |
| __int32 v57; // [esp+30h] [ebp-58h] BYREF | |
| int v58; // [esp+34h] [ebp-54h] BYREF | |
| Fix16 pMaybeY_FP16; // [esp+38h] [ebp-50h] BYREF | |
| int pMaybeX_FP16; // [esp+3Ch] [ebp-4Ch] BYREF | |
| Fix16 v61; // [esp+40h] [ebp-48h] BYREF | |
| int v62; // [esp+44h] [ebp-44h] BYREF | |
| int v63; // [esp+48h] [ebp-40h] BYREF | |
| int v64; // [esp+4Ch] [ebp-3Ch] BYREF | |
| int v65; // [esp+50h] [ebp-38h] BYREF | |
| int v66; // [esp+54h] [ebp-34h] BYREF | |
| int v67; // [esp+58h] [ebp-30h] BYREF | |
| Fix16_Point v68; // [esp+5Ch] [ebp-2Ch] BYREF | |
| Fix16_Rect rect; // [esp+64h] [ebp-24h] BYREF | |
| int v70; // [esp+84h] [ebp-4h] | |
| v50.field_0_p18 = 0; | |
| Wolfy_30::sub_541710(this, &v58); | |
| Wolfy_30::sub_541680(this, &v57); | |
| v3 = v57; | |
| this->field_28 = v57; | |
| v4 = (v3 * (__int64)dword_6FD4A4) >> 14; | |
| v5 = this->field_14_obj_2c->field_4; | |
| HIDWORD(v4) = v4 + v5->field_14_xy.y.mValue; | |
| v6 = v5->field_14_xy.x.mValue - v4; | |
| v7 = v4 + v5->field_14_xy.x.mValue; | |
| v8 = v5->field_14_xy.y.mValue - v4; | |
| field_1C_zpos = v5->field_1C_zpos; | |
| v54.mValue = HIDWORD(v4); | |
| v10 = field_1C_zpos - v58; | |
| v11 = v58 + field_1C_zpos; | |
| v12 = this->field_1A_timer == 99; | |
| v55 = v10; | |
| v56 = v11; | |
| if ( v12 && unk_6FD5F6 == 1 ) | |
| { | |
| Wolfy_30::sub_541760(this); | |
| v11 = v56; | |
| v10 = v55; | |
| } | |
| rect.field_14 = v11; | |
| field_14_obj_2c = this->field_14_obj_2c; | |
| rect.field_10 = v10; | |
| rect.field_0_left = v6; | |
| rect.field_4_right = v7; | |
| rect.field_8_top = v8; | |
| rect.field_C_bottom = v54.mValue; | |
| if ( PurpleDoom::CollectRectCollisions_477F30( | |
| gPurpleDoom_1_679208, | |
| &rect, | |
| 0, | |
| 0, | |
| field_14_obj_2c->field_4, | |
| &v50) ) | |
| { | |
| while ( v50.field_0_p18 ) | |
| { | |
| v14 = struct_4::sub_5A6DA0(&v50); | |
| sprite_type_enum = v14->field_30_sprite_type_enum; | |
| if ( sprite_type_enum == sprite_type_3_Char_B4 | |
| && (v16.sprite_4c_ptr = (Sprite_4C *)v14->field_8_uni1, v16.pSprite) ) | |
| { | |
| if ( a2 > 0x32u && v16.sprite_4c_ptr->field_8 != 8 ) | |
| { | |
| field_7C_pPed = v16.cB4->field_7C_pPed; | |
| field_0_ped_id = gVarrok_7F8_703398->field_0[this->field_14_obj_2c->field_26_varrok_idx].field_0_ped_id; | |
| if ( field_0_ped_id ) | |
| { | |
| field_7C_pPed->field_204_killer_id = field_0_ped_id; | |
| } | |
| else | |
| { | |
| field_7C_pPed->field_204_killer_id = this->field_2C_ped_id; | |
| } | |
| v16.cB4->field_7C_pPed->field_290 = 4; | |
| v16.cB4->field_7C_pPed->field_264 = 50; | |
| v19 = this->field_14_obj_2c; | |
| mValue = v14->field_14_xy.y.mValue; | |
| pMaybeY_FP16.mValue = v14->field_14_xy.x.mValue | |
| - v19->field_4->field_14_xy.x.mValue; | |
| pMaybeX_FP16 = mValue - v19->field_4->field_14_xy.y.mValue; | |
| v21 = *atan2_fixed_405320( | |
| &pRet_Ang16, | |
| (Fix16 *)&pMaybeX_FP16, | |
| &pMaybeY_FP16); | |
| v22 = this->field_14_obj_2c; | |
| LOWORD(a2a) = v21; | |
| v23 = v22->field_4; | |
| v24 = v23->field_14_xy.x.mValue - v14->field_14_xy.x.mValue; | |
| v25 = v23->field_14_xy.y.mValue; | |
| v26 = v14->field_14_xy.y.mValue; | |
| v61.mValue = v24; | |
| v54.mValue = v25 - v26; | |
| v48 = Fix16::Abs_436A50(&v62, &v54.mValue); | |
| v27 = Fix16::Abs_436A50(&v63, &v61.mValue); | |
| v28 = *Fix16::Max_44E540(&v64, v27, v48); | |
| v29 = this->field_28; | |
| if ( v28 <= v29 ) | |
| { | |
| if ( v28 >= (int)((dword_6FD39C * (__int64)v29) >> 14) ) | |
| { | |
| v30 = dword_6FD2E8; | |
| a5[0] = 1; | |
| } | |
| else | |
| { | |
| v30 = dword_6FD2F4; | |
| a5[0] = 2; | |
| } | |
| Char_B4::HandleGenericImpact_553E00( | |
| v16.cB4, | |
| (int)a2a, | |
| dword_6FD484, | |
| v30, | |
| a5[0]); | |
| } | |
| else if ( a2 < 70u ) | |
| { | |
| Char_B4::HandleGenericImpact_553E00( | |
| v16.cB4, | |
| (int)a2a, | |
| dword_6FD2E8 + dword_6FD46C, | |
| dword_6FD49C, | |
| 0); | |
| } | |
| } | |
| } | |
| else if ( sprite_type_enum == sprite_type_2_Car_BC | |
| && (v31.cBC = (Car_BC *)v14->field_8_uni1, v31.pSprite) ) | |
| { | |
| if ( (a2 <= 0x32u || a2 >= 0x3Cu) && (a2 <= 0x50u || a2 >= 0x5Au) ) | |
| { | |
| if ( a2 == 99 ) | |
| { | |
| v41 = this->field_14_obj_2c->field_4; | |
| v42 = v41->field_14_xy.x.mValue - v14->field_14_xy.x.mValue; | |
| v43 = v41->field_14_xy.y.mValue; | |
| v44 = v14->field_14_xy.y.mValue; | |
| v54.mValue = v42; | |
| v45 = v43 - v44; | |
| v61.mValue = v45; | |
| if ( v45 <= 0 ) | |
| { | |
| Fix16::Negate_4086A0(&v61, &v55); | |
| v42 = v54.mValue; | |
| } | |
| else | |
| { | |
| v55 = v45; | |
| } | |
| if ( v42 <= 0 ) | |
| { | |
| Fix16::Negate_4086A0(&v54, &v56); | |
| } | |
| else | |
| { | |
| v56 = v42; | |
| } | |
| if ( *Fix16::Max_44E540(&v67, &v56, &v55) <= this->field_28 ) | |
| { | |
| x_y_443580 = Sprite::get_x_y_443580( | |
| this->field_14_obj_2c->field_4, | |
| &v68); | |
| v70 = 0; | |
| Car_BC::sub_443710(v31.cBC, x_y_443580); | |
| v70 = -1; | |
| } | |
| } | |
| } | |
| else if ( v31.cBC->field_74_damage != 32001 ) | |
| { | |
| field_84_car_info_idx = v31.cBC->field_84_car_info_idx; | |
| if ( field_84_car_info_idx != TRAIN | |
| && field_84_car_info_idx != TRAINCAB | |
| && field_84_car_info_idx != TRAINFB | |
| && field_84_car_info_idx != boxcar | |
| && !Car_BC::sub_43B850(v31.cBC, this->field_10_type_or_state) ) | |
| { | |
| v33 = this->field_14_obj_2c->field_4; | |
| v34 = v33->field_14_xy.x.mValue - v14->field_14_xy.x.mValue; | |
| v35 = v33->field_14_xy.y.mValue - v14->field_14_xy.y.mValue; | |
| v54.mValue = v34; | |
| v61.mValue = v35; | |
| if ( v35 <= 0 ) | |
| { | |
| Fix16::Negate_4086A0(&v61, &v53); | |
| } | |
| else | |
| { | |
| v53 = v35; | |
| } | |
| v36 = Fix16::Abs_436A50(&v65, &v54.mValue); | |
| if ( *Fix16::Max_44E540(&v66, v36, &v53) > this->field_28 ) | |
| { | |
| Car_BC::ApplyVisualDamage_43A9F0(v31.cBC); | |
| } | |
| else | |
| { | |
| v37 = gVarrok_7F8_703398->field_0[this->field_14_obj_2c->field_26_varrok_idx].field_0_ped_id; | |
| if ( v37 ) | |
| { | |
| v31.cBC->field_70_exploder_ped_id = v37; | |
| } | |
| else | |
| { | |
| v31.cBC->field_70_exploder_ped_id = this->field_2C_ped_id; | |
| } | |
| v31.cBC->field_90 = 4; | |
| v31.cBC->field_94 = 50; | |
| v38 = Car_BC::AccumulateDamage_43DA90( | |
| v31.cBC, | |
| 32000, | |
| &stru_6FD570); | |
| if ( v31.cBC->field_70_exploder_ped_id ) | |
| { | |
| if ( v38 > 0 ) | |
| { | |
| v39 = Char_C::PedById( | |
| gPedManager_6787BC, | |
| v31.cBC->field_70_exploder_ped_id); | |
| v40 = v39; | |
| if ( v39 ) | |
| { | |
| if ( Ped::IsField238_45EDE0(v39, 2) ) | |
| { | |
| eager_benz::sub_593150( | |
| &v40->field_15C_player->field_2D4_scores, | |
| v31.cBC, | |
| 1); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| else | |
| { | |
| if ( sprite_type_enum == sprite_type_4_Object_5C | |
| || sprite_type_enum == sprite_type_5_Object_5C | |
| || sprite_type_enum == sprite_type_1_Object_5C ) | |
| { | |
| o2c = v14->field_8_uni1.o2c; | |
| } | |
| else | |
| { | |
| o2c = 0; | |
| } | |
| if ( a2 > 0x32u && a2 < 0x3Cu ) | |
| { | |
| Object_2C::sub_525190(o2c, this->field_14_obj_2c->field_26_varrok_idx); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| void __thiscall Wolfy_30::state_18_33_541D60(Wolfy_30 *this) | |
| { | |
| Particle_947C *v1; // eax | |
| __int16 field_1A_timer; // cx | |
| int v4; // edx | |
| Particle_947C *v5; // eax | |
| Particle_4C *v6; // esi | |
| Particle_4C *v7; // ecx | |
| Sprite *v8; // ebx | |
| Sprite *v9; // ecx | |
| Sprite *v10; // ecx | |
| __int16 v11; // ax | |
| Object_2C *v12; // ecx | |
| __int32 v13; // edi | |
| Sprite *v14; // edx | |
| Sprite *v15; // ecx | |
| __int32 v16; // edx | |
| Particle_4C *v17; // esi | |
| Particle_4C *v18; // edx | |
| Sprite *field_0_first_free; // ebp | |
| Sprite *field_30_pNext; // ecx | |
| __int16 v21; // ax | |
| Object_2C *field_14_obj_2c; // eax | |
| __int32 mValue; // edi | |
| __int32 field_1C_zpos; // edx | |
| Sprite *v25; // ecx | |
| int v26; // [esp+10h] [ebp-Ch] BYREF | |
| int v27; // [esp+14h] [ebp-8h] BYREF | |
| int v28; // [esp+18h] [ebp-4h] BYREF | |
| v1 = gParticle_4C_Pool_6FD5E4; | |
| if ( gParticle_4C_Pool_6FD5E4->field_0 ) | |
| { | |
| field_1A_timer = this->field_1A_timer; | |
| if ( (unsigned __int16)field_1A_timer > 0x52u ) | |
| { | |
| if ( (unsigned __int16)field_1A_timer <= 0x5Au ) | |
| { | |
| stru_6FD388 = this->field_14_obj_2c->field_4->field_14_xy; | |
| v17 = gParticle_4C_Pool_6FD5E4->field_0; | |
| v18 = gParticle_4C_Pool_6FD5E4->field_4; | |
| gParticle_4C_Pool_6FD5E4->field_0 = gParticle_4C_Pool_6FD5E4->field_0->field_3C_mpNext; | |
| v17->field_3C_mpNext = v18; | |
| v1->field_4 = v17; | |
| Particle_4C::PoolAllocate_53E2C0(v17); | |
| v17->field_46_sub_state = 0; | |
| v17->field_38_state = 18; | |
| field_0_first_free = gSprite_Pool_703818->field_0_first_free; | |
| gSprite_Pool_703818->field_0_first_free = gSprite_Pool_703818->field_0_first_free->field_C_uni2.pSprite; | |
| Sprite::Init_5A2CF0(field_0_first_free); | |
| v17->field_30_pNext = field_0_first_free; | |
| field_0_first_free->field_30_sprite_type_enum = 8; | |
| Sprite::sub_59E960(field_0_first_free); | |
| v17->field_30_pNext->field_2C_flags |= 4u; | |
| field_30_pNext = v17->field_30_pNext; | |
| v21 = gPhi_8CA8_6FCF00->field_8CA4 + 20; | |
| if ( field_30_pNext->field_22_sprite_id != v21 ) | |
| { | |
| field_30_pNext->field_22_sprite_id = v21; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(field_30_pNext); | |
| } | |
| field_14_obj_2c = this->field_14_obj_2c; | |
| mValue = stru_6FD388.y.mValue; | |
| field_1C_zpos = field_14_obj_2c->field_4->field_1C_zpos; | |
| v25 = v17->field_30_pNext; | |
| if ( v25->field_14_xy.x.mValue != stru_6FD388.x.mValue | |
| || v25->field_14_xy.y.mValue != stru_6FD388.y.mValue | |
| || v25->field_1C_zpos != field_1C_zpos ) | |
| { | |
| v25->field_14_xy.x.mValue = stru_6FD388.x.mValue; | |
| v25->field_14_xy.y.mValue = mValue; | |
| v25->field_1C_zpos = field_1C_zpos; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v25); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| v17->field_30_pNext); | |
| Sprite::ApplyScaleToDimensions_59E4C0( | |
| v17->field_30_pNext, | |
| (int)dword_6FD2EC, | |
| 0); | |
| v17->field_48_timer = 5; | |
| } | |
| else | |
| { | |
| v26 = 8; | |
| v27 = (this->field_24 | |
| * (__int64)(rng::get_int_4F7AE0(&stru_6F6784, (__int16 *)&v26) << 14)) >> 14; | |
| v28 = 360; | |
| LOWORD(v26) = (int)((dword_6FD448 | |
| * (__int64)(rng::get_int_4F7AE0( | |
| &stru_6F6784, | |
| (__int16 *)&v28) << 14)) >> 14) | |
| / 71; | |
| Ang16::Normalize_406C20((__int16 *)&v26); | |
| v4 = (__int16)v26; | |
| this->field_22 = v26; | |
| stru_6FD388.x.mValue = (v27 * (__int64)gSin_table_667A80[v4]) >> 14; | |
| v28 = gCos_table_669260[this->field_22]; | |
| stru_6FD388.y.mValue = *Fix16::Multiply_408680(&v28, &v26, &v27); | |
| stru_6FD388.x.mValue += this->field_14_obj_2c->field_4->field_14_xy.x.mValue; | |
| stru_6FD388.y.mValue += this->field_14_obj_2c->field_4->field_14_xy.y.mValue; | |
| v5 = gParticle_4C_Pool_6FD5E4; | |
| v6 = gParticle_4C_Pool_6FD5E4->field_0; | |
| v7 = gParticle_4C_Pool_6FD5E4->field_4; | |
| gParticle_4C_Pool_6FD5E4->field_0 = gParticle_4C_Pool_6FD5E4->field_0->field_3C_mpNext; | |
| v6->field_3C_mpNext = v7; | |
| v5->field_4 = v6; | |
| Particle_4C::PoolAllocate_53E2C0(v6); | |
| v6->field_46_sub_state = 0; | |
| v6->field_38_state = 18; | |
| v8 = gSprite_Pool_703818->field_0_first_free; | |
| v9 = gSprite_Pool_703818->field_0_first_free; | |
| gSprite_Pool_703818->field_0_first_free = gSprite_Pool_703818->field_0_first_free->field_C_uni2.pSprite; | |
| Sprite::Init_5A2CF0(v9); | |
| v6->field_30_pNext = v8; | |
| v8->field_30_sprite_type_enum = 8; | |
| Sprite::sub_59E960(v8); | |
| v6->field_30_pNext->field_2C_flags |= 4u; | |
| v10 = v6->field_30_pNext; | |
| v11 = gPhi_8CA8_6FCF00->field_8CA4 + 20; | |
| if ( v10->field_22_sprite_id != v11 ) | |
| { | |
| v10->field_22_sprite_id = v11; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(v10); | |
| } | |
| v12 = this->field_14_obj_2c; | |
| v13 = stru_6FD388.y.mValue; | |
| v14 = v12->field_4; | |
| v15 = v6->field_30_pNext; | |
| v16 = v14->field_1C_zpos; | |
| if ( v15->field_14_xy.x.mValue != stru_6FD388.x.mValue | |
| || v15->field_14_xy.y.mValue != stru_6FD388.y.mValue | |
| || v15->field_1C_zpos != v16 ) | |
| { | |
| v15->field_14_xy.x.mValue = stru_6FD388.x.mValue; | |
| v15->field_14_xy.y.mValue = v13; | |
| v15->field_1C_zpos = v16; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v15); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| v6->field_30_pNext); | |
| v6->field_48_timer = 1; | |
| } | |
| } | |
| } | |
| } | |
| void __thiscall Wolfy_30::state_19_32_542060(Wolfy_30 *this) | |
| { | |
| Particle_947C *v1; // eax | |
| int v3; // edx | |
| Particle_947C *v4; // eax | |
| Particle_4C *v5; // esi | |
| Particle_4C *v6; // ecx | |
| Sprite *v7; // ebp | |
| Sprite *v8; // ecx | |
| Sprite *v9; // ecx | |
| __int16 v10; // ax | |
| Object_2C *v11; // ecx | |
| __int32 v12; // edi | |
| Sprite *v13; // edx | |
| Sprite *v14; // ecx | |
| __int32 v15; // edx | |
| Particle_4C *v16; // esi | |
| Particle_4C *v17; // edx | |
| Sprite *field_0_first_free; // ebp | |
| Sprite *field_30_pNext; // ecx | |
| __int16 v20; // ax | |
| Object_2C *field_14_obj_2c; // eax | |
| __int32 mValue; // edi | |
| __int32 field_1C_zpos; // edx | |
| Sprite *v24; // ecx | |
| int v25; // [esp+Ch] [ebp-Ch] BYREF | |
| int v26; // [esp+10h] [ebp-8h] BYREF | |
| int v27; // [esp+14h] [ebp-4h] BYREF | |
| v1 = gParticle_4C_Pool_6FD5E4; | |
| if ( gParticle_4C_Pool_6FD5E4->field_0 ) | |
| { | |
| if ( this->field_1A_timer <= 8u ) | |
| { | |
| stru_6FD388 = this->field_14_obj_2c->field_4->field_14_xy; | |
| v16 = gParticle_4C_Pool_6FD5E4->field_0; | |
| v17 = gParticle_4C_Pool_6FD5E4->field_4; | |
| gParticle_4C_Pool_6FD5E4->field_0 = gParticle_4C_Pool_6FD5E4->field_0->field_3C_mpNext; | |
| v16->field_3C_mpNext = v17; | |
| v1->field_4 = v16; | |
| Particle_4C::PoolAllocate_53E2C0(v16); | |
| v16->field_46_sub_state = 0; | |
| v16->field_38_state = 19; | |
| field_0_first_free = gSprite_Pool_703818->field_0_first_free; | |
| gSprite_Pool_703818->field_0_first_free = gSprite_Pool_703818->field_0_first_free->field_C_uni2.pSprite; | |
| Sprite::Init_5A2CF0(field_0_first_free); | |
| v16->field_30_pNext = field_0_first_free; | |
| field_0_first_free->field_30_sprite_type_enum = 8; | |
| Sprite::sub_59E960(field_0_first_free); | |
| v16->field_30_pNext->field_2C_flags |= 4u; | |
| field_30_pNext = v16->field_30_pNext; | |
| v20 = gPhi_8CA8_6FCF00->field_8CA4 + 20; | |
| if ( field_30_pNext->field_22_sprite_id != v20 ) | |
| { | |
| field_30_pNext->field_22_sprite_id = v20; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(field_30_pNext); | |
| } | |
| field_14_obj_2c = this->field_14_obj_2c; | |
| mValue = stru_6FD388.y.mValue; | |
| field_1C_zpos = field_14_obj_2c->field_4->field_1C_zpos; | |
| v24 = v16->field_30_pNext; | |
| if ( v24->field_14_xy.x.mValue != stru_6FD388.x.mValue | |
| || v24->field_14_xy.y.mValue != stru_6FD388.y.mValue | |
| || v24->field_1C_zpos != field_1C_zpos ) | |
| { | |
| v24->field_14_xy.x.mValue = stru_6FD388.x.mValue; | |
| v24->field_14_xy.y.mValue = mValue; | |
| v24->field_1C_zpos = field_1C_zpos; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v24); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| v16->field_30_pNext); | |
| v16->field_48_timer = 5; | |
| } | |
| else | |
| { | |
| v25 = 48; | |
| v26 = (this->field_24 | |
| * (__int64)(rng::get_int_4F7AE0(&stru_6F6784, (__int16 *)&v25) << 14)) >> 14; | |
| v27 = 360; | |
| LOWORD(v25) = (int)((dword_6FD448 | |
| * (__int64)(rng::get_int_4F7AE0( | |
| &stru_6F6784, | |
| (__int16 *)&v27) << 14)) >> 14) | |
| / 71; | |
| Ang16::Normalize_406C20((__int16 *)&v25); | |
| v3 = (__int16)v25; | |
| this->field_22 = v25; | |
| stru_6FD388.x.mValue = (v26 * (__int64)gSin_table_667A80[v3]) >> 14; | |
| v27 = gCos_table_669260[this->field_22]; | |
| stru_6FD388.y.mValue = *Fix16::Multiply_408680(&v27, &v25, &v26); | |
| stru_6FD388.x.mValue += this->field_14_obj_2c->field_4->field_14_xy.x.mValue; | |
| stru_6FD388.y.mValue += this->field_14_obj_2c->field_4->field_14_xy.y.mValue; | |
| v4 = gParticle_4C_Pool_6FD5E4; | |
| v5 = gParticle_4C_Pool_6FD5E4->field_0; | |
| v6 = gParticle_4C_Pool_6FD5E4->field_4; | |
| gParticle_4C_Pool_6FD5E4->field_0 = gParticle_4C_Pool_6FD5E4->field_0->field_3C_mpNext; | |
| v5->field_3C_mpNext = v6; | |
| v4->field_4 = v5; | |
| Particle_4C::PoolAllocate_53E2C0(v5); | |
| v5->field_46_sub_state = 0; | |
| v5->field_38_state = 19; | |
| v7 = gSprite_Pool_703818->field_0_first_free; | |
| v8 = gSprite_Pool_703818->field_0_first_free; | |
| gSprite_Pool_703818->field_0_first_free = gSprite_Pool_703818->field_0_first_free->field_C_uni2.pSprite; | |
| Sprite::Init_5A2CF0(v8); | |
| v5->field_30_pNext = v7; | |
| v7->field_30_sprite_type_enum = 8; | |
| Sprite::sub_59E960(v7); | |
| v5->field_30_pNext->field_2C_flags |= 4u; | |
| v9 = v5->field_30_pNext; | |
| v5->field_40_pUnknown = this; | |
| v10 = gPhi_8CA8_6FCF00->field_8CA4 + 20; | |
| if ( v9->field_22_sprite_id != v10 ) | |
| { | |
| v9->field_22_sprite_id = v10; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(v9); | |
| } | |
| v11 = this->field_14_obj_2c; | |
| v12 = stru_6FD388.y.mValue; | |
| v13 = v11->field_4; | |
| v14 = v5->field_30_pNext; | |
| v15 = v13->field_1C_zpos; | |
| if ( v14->field_14_xy.x.mValue != stru_6FD388.x.mValue | |
| || v14->field_14_xy.y.mValue != stru_6FD388.y.mValue | |
| || v14->field_1C_zpos != v15 ) | |
| { | |
| v14->field_14_xy.x.mValue = stru_6FD388.x.mValue; | |
| v14->field_14_xy.y.mValue = v12; | |
| v14->field_1C_zpos = v15; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v14); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| v5->field_30_pNext); | |
| Sprite::ApplyScaleToDimensions_59E4C0( | |
| v5->field_30_pNext, | |
| dword_6FD39C + dword_6FD4A0, | |
| 0); | |
| v5->field_48_timer = 1; | |
| } | |
| } | |
| } | |
| void __thiscall Wolfy_30::state_20_542340(Wolfy_30 *this) | |
| { | |
| Particle_947C *v1; // eax | |
| int v3; // edx | |
| Particle_947C *v4; // eax | |
| Particle_4C *v5; // esi | |
| Particle_4C *v6; // ecx | |
| Sprite *v7; // ebx | |
| Sprite *v8; // ecx | |
| Sprite *v9; // ecx | |
| __int16 v10; // ax | |
| Object_2C *v11; // ecx | |
| __int32 v12; // edi | |
| Sprite *v13; // edx | |
| Sprite *v14; // ecx | |
| __int32 v15; // edx | |
| Particle_4C *v16; // esi | |
| Particle_4C *v17; // edx | |
| Sprite *field_0_first_free; // ebx | |
| Sprite *field_30_pNext; // ecx | |
| __int16 v20; // ax | |
| Object_2C *field_14_obj_2c; // eax | |
| __int32 mValue; // edi | |
| __int32 field_1C_zpos; // edx | |
| Sprite *v24; // ecx | |
| int v25; // [esp+Ch] [ebp-Ch] BYREF | |
| int v26; // [esp+10h] [ebp-8h] BYREF | |
| int v27; // [esp+14h] [ebp-4h] BYREF | |
| v1 = gParticle_4C_Pool_6FD5E4; | |
| if ( gParticle_4C_Pool_6FD5E4->field_0 ) | |
| { | |
| if ( this->field_1A_timer <= 8u ) | |
| { | |
| stru_6FD388 = this->field_14_obj_2c->field_4->field_14_xy; | |
| v16 = gParticle_4C_Pool_6FD5E4->field_0; | |
| v17 = gParticle_4C_Pool_6FD5E4->field_4; | |
| gParticle_4C_Pool_6FD5E4->field_0 = gParticle_4C_Pool_6FD5E4->field_0->field_3C_mpNext; | |
| v16->field_3C_mpNext = v17; | |
| v1->field_4 = v16; | |
| Particle_4C::PoolAllocate_53E2C0(v16); | |
| v16->field_46_sub_state = 0; | |
| v16->field_38_state = 20; | |
| field_0_first_free = gSprite_Pool_703818->field_0_first_free; | |
| gSprite_Pool_703818->field_0_first_free = gSprite_Pool_703818->field_0_first_free->field_C_uni2.pSprite; | |
| Sprite::Init_5A2CF0(field_0_first_free); | |
| v16->field_30_pNext = field_0_first_free; | |
| field_0_first_free->field_30_sprite_type_enum = 8; | |
| Sprite::sub_59E960(field_0_first_free); | |
| v16->field_30_pNext->field_2C_flags |= 4u; | |
| field_30_pNext = v16->field_30_pNext; | |
| v20 = gPhi_8CA8_6FCF00->field_8CA4 + 56; | |
| if ( field_30_pNext->field_22_sprite_id != v20 ) | |
| { | |
| field_30_pNext->field_22_sprite_id = v20; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(field_30_pNext); | |
| } | |
| field_14_obj_2c = this->field_14_obj_2c; | |
| mValue = stru_6FD388.y.mValue; | |
| field_1C_zpos = field_14_obj_2c->field_4->field_1C_zpos; | |
| v24 = v16->field_30_pNext; | |
| if ( v24->field_14_xy.x.mValue != stru_6FD388.x.mValue | |
| || v24->field_14_xy.y.mValue != stru_6FD388.y.mValue | |
| || v24->field_1C_zpos != field_1C_zpos ) | |
| { | |
| v24->field_14_xy.x.mValue = stru_6FD388.x.mValue; | |
| v24->field_14_xy.y.mValue = mValue; | |
| v24->field_1C_zpos = field_1C_zpos; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v24); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| v16->field_30_pNext); | |
| v16->field_48_timer = 5; | |
| } | |
| else | |
| { | |
| v25 = 80; | |
| v26 = (this->field_24 | |
| * (__int64)(rng::get_int_4F7AE0(&stru_6F6784, (__int16 *)&v25) << 14)) >> 14; | |
| v27 = 360; | |
| LOWORD(v25) = (int)((dword_6FD448 | |
| * (__int64)(rng::get_int_4F7AE0( | |
| &stru_6F6784, | |
| (__int16 *)&v27) << 14)) >> 14) | |
| / 71; | |
| Ang16::Normalize_406C20((__int16 *)&v25); | |
| v3 = (__int16)v25; | |
| this->field_22 = v25; | |
| stru_6FD388.x.mValue = (v26 * (__int64)gSin_table_667A80[v3]) >> 14; | |
| v27 = gCos_table_669260[this->field_22]; | |
| stru_6FD388.y.mValue = *Fix16::Multiply_408680(&v27, &v25, &v26); | |
| stru_6FD388.x.mValue += this->field_14_obj_2c->field_4->field_14_xy.x.mValue; | |
| stru_6FD388.y.mValue += this->field_14_obj_2c->field_4->field_14_xy.y.mValue; | |
| v4 = gParticle_4C_Pool_6FD5E4; | |
| v5 = gParticle_4C_Pool_6FD5E4->field_0; | |
| v6 = gParticle_4C_Pool_6FD5E4->field_4; | |
| gParticle_4C_Pool_6FD5E4->field_0 = gParticle_4C_Pool_6FD5E4->field_0->field_3C_mpNext; | |
| v5->field_3C_mpNext = v6; | |
| v4->field_4 = v5; | |
| Particle_4C::PoolAllocate_53E2C0(v5); | |
| v5->field_46_sub_state = 0; | |
| v5->field_38_state = 20; | |
| v7 = gSprite_Pool_703818->field_0_first_free; | |
| v8 = gSprite_Pool_703818->field_0_first_free; | |
| gSprite_Pool_703818->field_0_first_free = gSprite_Pool_703818->field_0_first_free->field_C_uni2.pSprite; | |
| Sprite::Init_5A2CF0(v8); | |
| v5->field_30_pNext = v7; | |
| v7->field_30_sprite_type_enum = 8; | |
| Sprite::sub_59E960(v7); | |
| v5->field_30_pNext->field_2C_flags |= 4u; | |
| v9 = v5->field_30_pNext; | |
| v10 = gPhi_8CA8_6FCF00->field_8CA4 + 56; | |
| if ( v9->field_22_sprite_id != v10 ) | |
| { | |
| v9->field_22_sprite_id = v10; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(v9); | |
| } | |
| v11 = this->field_14_obj_2c; | |
| v12 = stru_6FD388.y.mValue; | |
| v13 = v11->field_4; | |
| v14 = v5->field_30_pNext; | |
| v15 = v13->field_1C_zpos; | |
| if ( v14->field_14_xy.x.mValue != stru_6FD388.x.mValue | |
| || v14->field_14_xy.y.mValue != stru_6FD388.y.mValue | |
| || v14->field_1C_zpos != v15 ) | |
| { | |
| v14->field_14_xy.x.mValue = stru_6FD388.x.mValue; | |
| v14->field_14_xy.y.mValue = v12; | |
| v14->field_1C_zpos = v15; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v14); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| v5->field_30_pNext); | |
| v5->field_48_timer = 1; | |
| } | |
| } | |
| } | |
| void __thiscall Wolfy_30::state_18_19_20_32_33_542790(Wolfy_30 *this) | |
| { | |
| bool v2; // bl | |
| int v3; // ecx | |
| Fix16 *v4; // eax | |
| Object_2C *Explosion_52A3D0; // ebp | |
| Object_2C *field_14_obj_2c; // ecx | |
| int *v7; // ecx | |
| Object_2C *v8; // eax | |
| unsigned int v9; // edx | |
| Object_2C *v10; // edi | |
| unsigned int v11; // ecx | |
| int v12; // ecx | |
| unsigned int v13; // ecx | |
| unsigned int v14; // ecx | |
| __int32 v15; // ecx | |
| __int32 v16; // ecx | |
| Object_2C *v17; // eax | |
| int v18; // ecx | |
| Object_2C *v19; // ebp | |
| int v20; // ecx | |
| __int64 v21; // rax | |
| __int32 v22; // ecx | |
| unsigned __int16 field_1A_timer; // ax | |
| __int16 v24; // ax | |
| Fix16 v25; // [esp-18h] [ebp-30h] BYREF | |
| Fix16 v26; // [esp-14h] [ebp-2Ch] BYREF | |
| __int64 v27; // [esp-10h] [ebp-28h] BYREF | |
| _QWORD v28[3]; // [esp-8h] [ebp-20h] BYREF | |
| Fix16 v29; // [esp+10h] [ebp-8h] BYREF | |
| Fix16 v30; // [esp+14h] [ebp-4h] BYREF | |
| v2 = 1; | |
| if ( this->field_1A_timer < 90u ) | |
| { | |
| v2 = Game_0x40::is_point_on_screen_4B9A80( | |
| gGame_0x40_67E008, | |
| this->field_14_obj_2c->field_4->field_14_xy.x.mValue, | |
| this->field_14_obj_2c->field_4->field_14_xy.y.mValue) != 0; | |
| } | |
| unk_6FD5F6 = 0; | |
| if ( v2 ) | |
| { | |
| HIWORD(v3) = 0; | |
| switch ( this->field_10_type_or_state ) | |
| { | |
| case 18: | |
| case 33: | |
| Wolfy_30::state_18_33_541D60(this); | |
| break; | |
| case 19: | |
| case 32: | |
| Wolfy_30::state_19_32_542060(this); | |
| goto LABEL_8; | |
| case 20: | |
| Wolfy_30::state_20_542340(this); | |
| LABEL_8: | |
| unk_6FD5F6 = 1; | |
| break; | |
| default: | |
| break; | |
| } | |
| switch ( this->field_1A_timer ) | |
| { | |
| case 59: | |
| case 69: | |
| case 79: | |
| case 89: | |
| LOWORD(v3) = word_6FD5D4; | |
| HIDWORD(v28[0]) = this->field_2C_ped_id; | |
| LODWORD(v28[0]) = 5; | |
| HIDWORD(v27) = v3; | |
| LODWORD(v27) = v3; | |
| Fix16::FromInt_4369F0((Fix16 *)&v27, 2); | |
| v26.mValue = Fix16::FromInt_4369F0(&v29, 145)->mValue; | |
| v4 = Fix16::FromInt_4369F0(&v30, 113); | |
| Explosion_52A3D0 = Object_5C::CreateExplosion_52A3D0( | |
| gObject_5C_6F8F84, | |
| v4->mValue, | |
| v26.mValue, | |
| v27, | |
| SWORD2(v27), | |
| v28[0], | |
| SHIDWORD(v28[0])); | |
| if ( Explosion_52A3D0 ) | |
| { | |
| field_14_obj_2c = this->field_14_obj_2c; | |
| HIDWORD(v28[0]) = dword_6FD2F0; | |
| v7 = (int *)&field_14_obj_2c->field_4->field_0.field_0; | |
| LODWORD(v28[0]) = -dword_6FD540; | |
| v8 = Object_5C::NewUnknown_52A240( | |
| gObject_5C_6F8F84, | |
| 127, | |
| v7[5], | |
| v7[6], | |
| v7[7], | |
| this->field_22, | |
| word_6FD5D4, | |
| dword_6FD484, | |
| -dword_6FD540, | |
| dword_6FD2F0); | |
| LOWORD(v9) = word_6FD5D4; | |
| v10 = v8; | |
| v28[0] = __PAIR64__(v9, v11); | |
| Fix16::FromInt_4369F0((Fix16 *)v28, 0); | |
| HIDWORD(v27) = v12; | |
| Fix16::FromInt_4369F0((Fix16 *)&v27 + 1, 0); | |
| Sprite::DispatchCollisionEvent_5A3100( | |
| v10->field_4, | |
| Explosion_52A3D0->field_4, | |
| SHIDWORD(v27), | |
| v28[0], | |
| SWORD2(v28[0])); | |
| v28[0] = v13 | 0xFF00000000LL; | |
| Fix16::FromInt_4369F0((Fix16 *)v28, 3); | |
| v27 = v14 | 0xFF800000000000LL; | |
| Fix16::FromInt_4369F0((Fix16 *)&v27, 2); | |
| v26.mValue = v15; | |
| Fix16::FromInt_4369F0(&v26, 138); | |
| v25.mValue = v16; | |
| Fix16::FromInt_4369F0(&v25, 94); | |
| v17 = Object_5C::NewLight_529A40( | |
| gObject_5C_6F8F84, | |
| v25.mValue, | |
| v26.mValue, | |
| v27, | |
| SHIDWORD(v27), | |
| v28[0], | |
| BYTE4(v28[0])); | |
| LOWORD(v18) = word_6FD5D4; | |
| v19 = v17; | |
| HIDWORD(v28[0]) = v18; | |
| LODWORD(v28[0]) = v18; | |
| Fix16::FromInt_4369F0((Fix16 *)v28, 0); | |
| HIDWORD(v27) = v20; | |
| Fix16::FromInt_4369F0((Fix16 *)&v27 + 1, 0); | |
| Sprite::DispatchCollisionEvent_5A3100( | |
| v10->field_4, | |
| v19->field_4, | |
| SHIDWORD(v27), | |
| v28[0], | |
| SWORD2(v28[0])); | |
| } | |
| break; | |
| default: | |
| break; | |
| } | |
| } | |
| if ( this->field_1A_timer <= 0x1Eu ) | |
| { | |
| if ( this->field_24 > dword_6FD448 ) | |
| { | |
| this->field_24 = dword_6FD448; | |
| } | |
| v28[0] = dword_6FD4A4; | |
| v27 = (__int64)dword_6FD540 << 14; | |
| v22 = this->field_24 - v27 / dword_6FD4A4; | |
| } | |
| else | |
| { | |
| v21 = (dword_6FD448 * (__int64)dword_6FD4A4) >> 14; | |
| if ( this->field_24 > (int)v21 ) | |
| { | |
| this->field_24 = v21; | |
| } | |
| v28[0] = dword_6FD4A4; | |
| v27 = (__int64)dword_6FD540 << 14; | |
| v22 = v27 / dword_6FD4A4 + this->field_24; | |
| } | |
| this->field_24 = v22; | |
| field_1A_timer = this->field_1A_timer; | |
| if ( field_1A_timer > 50u ) | |
| { | |
| Wolfy_30::TimerAfter50Handler_541850(this, field_1A_timer); | |
| } | |
| if ( this->field_1A_timer == 99 ) | |
| { | |
| v28[0] = this->field_14_obj_2c->field_4->field_14_xy; | |
| HIDWORD(v27) = HIDWORD(v28[0]); | |
| Fix16::FromInt_4369F0((Fix16 *)&v27 + 1, 8); | |
| Game_0x40::sub_4B9790( | |
| gGame_0x40_67E008, | |
| SHIDWORD(v27), | |
| v28[0], | |
| SHIDWORD(v28[0])); | |
| } | |
| v24 = this->field_1A_timer; | |
| if ( v24 != 9999 ) | |
| { | |
| this->field_1A_timer = v24 - 1; | |
| } | |
| if ( this->field_1A_timer > 9999u ) | |
| { | |
| this->field_1A_timer = 1; | |
| } | |
| } | |
| void __thiscall Wolfy_30::state_22_23_24_25_542E30(Wolfy_30 *this, char a2) | |
| { | |
| Sprite *v3; // eax | |
| int mValue; // ecx | |
| int v5; // eax | |
| Particle_947C *v6; // eax | |
| Particle_4C *v7; // edi | |
| Particle_4C *v8; // edx | |
| int v9; // ecx | |
| __int32 v10; // ecx | |
| int v11; // edx | |
| int *v12; // ecx | |
| int v13; // ecx | |
| __int32 v14; // ecx | |
| int v15; // edx | |
| int v16; // edx | |
| __int32 v17; // edx | |
| int v18; // eax | |
| int v19; // eax | |
| __int32 v20; // eax | |
| int v21; // ecx | |
| int v22; // edx | |
| Sprite *field_0_first_free; // ebp | |
| Sprite *v24; // ecx | |
| int v25; // eax | |
| __int64 v26; // rax | |
| Sprite *field_30_pNext; // ecx | |
| __int16 v28; // ax | |
| __int32 v29; // ebp | |
| __int32 field_1C_zpos; // eax | |
| __int32 v31; // edx | |
| Sprite *v32; // ecx | |
| Object_2C *field_14_obj_2c; // ecx | |
| Sprite *v34; // eax | |
| __int16 *v35; // edx | |
| char *v36; // eax | |
| unsigned __int16 field_1A_timer; // ax | |
| __int16 v38; // ax | |
| Fix16 v39; // [esp-Ch] [ebp-84h] BYREF | |
| char *v40; // [esp-8h] [ebp-80h] | |
| __int16 *v41; // [esp-4h] [ebp-7Ch] | |
| char v42; // [esp+13h] [ebp-65h] | |
| __int16 v43; // [esp+14h] [ebp-64h] BYREF | |
| __int16 v44; // [esp+16h] [ebp-62h] BYREF | |
| __int16 v45; // [esp+18h] [ebp-60h] BYREF | |
| __int16 v46; // [esp+1Ah] [ebp-5Eh] BYREF | |
| int v47; // [esp+1Ch] [ebp-5Ch] BYREF | |
| int v48; // [esp+20h] [ebp-58h] BYREF | |
| int v49; // [esp+24h] [ebp-54h] BYREF | |
| int v50; // [esp+28h] [ebp-50h] BYREF | |
| int v51; // [esp+2Ch] [ebp-4Ch] BYREF | |
| int v52; // [esp+30h] [ebp-48h] BYREF | |
| int v53; // [esp+34h] [ebp-44h] BYREF | |
| int v54; // [esp+38h] [ebp-40h] BYREF | |
| int v55; // [esp+3Ch] [ebp-3Ch] BYREF | |
| int v56; // [esp+40h] [ebp-38h] BYREF | |
| int v57; // [esp+44h] [ebp-34h] BYREF | |
| int v58; // [esp+48h] [ebp-30h] BYREF | |
| int v59; // [esp+4Ch] [ebp-2Ch] BYREF | |
| int v60; // [esp+50h] [ebp-28h] BYREF | |
| int v61; // [esp+54h] [ebp-24h] BYREF | |
| int v62; // [esp+58h] [ebp-20h] BYREF | |
| char v63; // [esp+5Ch] [ebp-1Ch] BYREF | |
| int v64; // [esp+60h] [ebp-18h] BYREF | |
| char v65; // [esp+64h] [ebp-14h] BYREF | |
| int v66; // [esp+68h] [ebp-10h] BYREF | |
| char v67; // [esp+6Ch] [ebp-Ch] BYREF | |
| int v68; // [esp+70h] [ebp-8h] BYREF | |
| char v69; // [esp+74h] [ebp-4h] BYREF | |
| v3 = this->field_14_obj_2c->field_4; | |
| mValue = v3->field_14_xy.x.mValue; | |
| if ( mValue < 4161536 && mValue > dword_6FD4A0 ) | |
| { | |
| v5 = v3->field_14_xy.y.mValue; | |
| if ( v5 < 4161536 && v5 > dword_6FD4A0 ) | |
| { | |
| v6 = gParticle_4C_Pool_6FD5E4; | |
| unk_6FD5F6 = 0; | |
| v42 = 0; | |
| while ( !v6->field_0 ) | |
| { | |
| LABEL_29: | |
| if ( (unsigned __int8)++v42 >= 2u ) | |
| { | |
| if ( this->field_1A_timer == 99 ) | |
| { | |
| field_14_obj_2c = this->field_14_obj_2c; | |
| v34 = field_14_obj_2c->field_4; | |
| v35 = (__int16 *)v34->field_14_xy.y.mValue; | |
| v36 = (char *)v34->field_14_xy.x.mValue; | |
| v41 = v35; | |
| v40 = v36; | |
| v39.mValue = (__int32)field_14_obj_2c; | |
| Fix16::FromInt_4369F0(&v39, 8); | |
| Game_0x40::sub_4B9790( | |
| gGame_0x40_67E008, | |
| v39.mValue, | |
| (__int32)v40, | |
| (__int32)v41); | |
| } | |
| field_1A_timer = this->field_1A_timer; | |
| if ( field_1A_timer > 50u ) | |
| { | |
| Wolfy_30::TimerAfter50Handler_541850(this, field_1A_timer); | |
| } | |
| v38 = this->field_1A_timer; | |
| if ( v38 != 9999 ) | |
| { | |
| if ( (unsigned __int16)v38 > 0x3Cu ) | |
| { | |
| this->field_1A_timer = v38 - 1; | |
| } | |
| if ( this->field_1A_timer > 9999u ) | |
| { | |
| this->field_1A_timer = 1; | |
| } | |
| } | |
| return; | |
| } | |
| } | |
| v7 = v6->field_0; | |
| v8 = v6->field_4; | |
| v6->field_0 = v6->field_0->field_3C_mpNext; | |
| v7->field_3C_mpNext = v8; | |
| v6->field_4 = v7; | |
| Particle_4C::PoolAllocate_53E2C0(v7); | |
| v7->field_46_sub_state = 0; | |
| switch ( a2 ) | |
| { | |
| case 0: | |
| v41 = (__int16 *)&v53; | |
| v7->field_38_state = 24; | |
| v53 = 45; | |
| LOWORD(v47) = (int)((dword_6FD448 | |
| * (__int64)(rng::get_int_4F7AE0(&stru_6F6784, v41) << 14)) >> 14) | |
| / 71; | |
| Ang16::Normalize_406C20((__int16 *)&v47); | |
| LOWORD(v48) = dword_6FD40C + dword_6FD350; | |
| Ang16::Normalize_406C20((__int16 *)&v48); | |
| v43 = v48 + v47; | |
| Ang16::Normalize_406C20(&v43); | |
| v41 = (__int16 *)&dword_6FD540; | |
| v9 = v43; | |
| this->field_22 = v43; | |
| v54 = gSin_table_667A80[v9]; | |
| v10 = *Fix16::Multiply_408680(&v54, &v62, (int *)v41); | |
| v41 = (__int16 *)&dword_6FD540; | |
| stru_6FD388.x.mValue = v10; | |
| v11 = this->field_22; | |
| v40 = &v63; | |
| v12 = &v54; | |
| v54 = gCos_table_669260[v11]; | |
| goto LABEL_13; | |
| case 1: | |
| v41 = (__int16 *)&v55; | |
| v7->field_38_state = 25; | |
| v55 = 90; | |
| LOWORD(v49) = (int)((dword_6FD448 | |
| * (__int64)(rng::get_int_4F7AE0(&stru_6F6784, v41) << 14)) >> 14) | |
| / 71; | |
| Ang16::Normalize_406C20((__int16 *)&v49); | |
| LOWORD(v50) = dword_6FD350 + dword_6FD418; | |
| Ang16::Normalize_406C20((__int16 *)&v50); | |
| v44 = v50 + v49; | |
| Ang16::Normalize_406C20(&v44); | |
| v41 = (__int16 *)&dword_6FD540; | |
| v13 = v44; | |
| this->field_22 = v44; | |
| v54 = gSin_table_667A80[v13]; | |
| v14 = *Fix16::Multiply_408680(&v54, &v64, (int *)v41); | |
| v41 = (__int16 *)&dword_6FD540; | |
| stru_6FD388.x.mValue = v14; | |
| v15 = this->field_22; | |
| v40 = &v65; | |
| v12 = &v54; | |
| v54 = gCos_table_669260[v15]; | |
| goto LABEL_13; | |
| case 2: | |
| v41 = (__int16 *)&v56; | |
| v7->field_38_state = 23; | |
| v56 = 90; | |
| LOWORD(v51) = (int)((dword_6FD448 | |
| * (__int64)(rng::get_int_4F7AE0(&stru_6F6784, v41) << 14)) >> 14) | |
| / 71; | |
| Ang16::Normalize_406C20((__int16 *)&v51); | |
| LOWORD(v52) = dword_6FD350 + dword_6FD3E0; | |
| Ang16::Normalize_406C20((__int16 *)&v52); | |
| v54 = v52 + v51; | |
| Ang16::GetNormalizedCopy_409300(&v45, (__int16 *)&v54, 0); | |
| v41 = (__int16 *)&dword_6FD540; | |
| v16 = v45; | |
| this->field_22 = v45; | |
| v54 = gSin_table_667A80[v16]; | |
| v17 = *Fix16::Multiply_408680(&v54, &v66, (int *)v41); | |
| v41 = (__int16 *)&dword_6FD540; | |
| stru_6FD388.x.mValue = v17; | |
| v18 = this->field_22; | |
| v40 = &v67; | |
| v54 = gCos_table_669260[v18]; | |
| v12 = &v54; | |
| goto LABEL_13; | |
| case 3: | |
| v41 = (__int16 *)&v57; | |
| v7->field_38_state = 22; | |
| v57 = 90; | |
| v54 = (int)((dword_6FD448 | |
| * (__int64)(rng::get_int_4F7AE0(&stru_6F6784, v41) << 14)) >> 14) | |
| / 71; | |
| Ang16::GetNormalizedCopy_409300((__int16 *)&v59, (__int16 *)&v54, 0); | |
| v58 = dword_6FD350 + dword_6FD35C; | |
| Ang16::GetNormalizedCopy_409300((__int16 *)&v60, (__int16 *)&v58, 0); | |
| v61 = v60 + v59; | |
| Ang16::GetNormalizedCopy_409300(&v46, (__int16 *)&v61, 0); | |
| v41 = (__int16 *)&dword_6FD540; | |
| v19 = v46; | |
| this->field_22 = v46; | |
| v61 = gSin_table_667A80[v19]; | |
| v20 = *Fix16::Multiply_408680(&v61, &v68, (int *)v41); | |
| v41 = (__int16 *)&dword_6FD540; | |
| stru_6FD388.x.mValue = v20; | |
| v21 = this->field_22; | |
| v40 = &v69; | |
| v22 = gCos_table_669260[v21]; | |
| v12 = &v61; | |
| v61 = v22; | |
| LABEL_13: | |
| stru_6FD388.y.mValue = *Fix16::Multiply_408680(v12, v40, (int *)v41); | |
| stru_6FD388.x.mValue += this->field_14_obj_2c->field_4->field_14_xy.x.mValue; | |
| stru_6FD388.y.mValue += this->field_14_obj_2c->field_4->field_14_xy.y.mValue; | |
| break; | |
| default: | |
| break; | |
| } | |
| field_0_first_free = gSprite_Pool_703818->field_0_first_free; | |
| v24 = gSprite_Pool_703818->field_0_first_free; | |
| gSprite_Pool_703818->field_0_first_free = gSprite_Pool_703818->field_0_first_free->field_C_uni2.pSprite; | |
| Sprite::Init_5A2CF0(v24); | |
| v7->field_30_pNext = field_0_first_free; | |
| field_0_first_free->field_30_sprite_type_enum = 8; | |
| Sprite::sub_59E960(field_0_first_free); | |
| v7->field_48_timer = 0; | |
| v7->field_46_sub_state = 0; | |
| v7->field_24.field_0 = this->field_22; | |
| LOWORD(v25) = this->field_1A_timer; | |
| if ( (unsigned __int16)v25 <= 29u ) | |
| { | |
| v42 = 4; | |
| } | |
| v61 = v25; | |
| v26 = (dword_6FD548 | |
| * (__int64)(rng::get_int_4F7AE0(&stru_6F6784, (__int16 *)&v61) << 14)) >> 14; | |
| field_30_pNext = v7->field_30_pNext; | |
| v7->field_20 = v26; | |
| v28 = gPhi_8CA8_6FCF00->field_8CA4 + 40; | |
| if ( field_30_pNext->field_22_sprite_id != v28 ) | |
| { | |
| field_30_pNext->field_22_sprite_id = v28; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(field_30_pNext); | |
| } | |
| v29 = stru_6FD388.y.mValue; | |
| field_1C_zpos = this->field_14_obj_2c->field_4->field_1C_zpos; | |
| v31 = field_1C_zpos + dword_6FD4A0; | |
| if ( field_1C_zpos + dword_6FD4A0 < dword_6FD4C0 ) | |
| { | |
| v32 = v7->field_30_pNext; | |
| if ( v32->field_14_xy.x.mValue == stru_6FD388.x.mValue | |
| && v32->field_14_xy.y.mValue == stru_6FD388.y.mValue | |
| && v32->field_1C_zpos == v31 ) | |
| { | |
| goto LABEL_28; | |
| } | |
| v32->field_14_xy.x.mValue = stru_6FD388.x.mValue; | |
| v32->field_14_xy.y.mValue = v29; | |
| v32->field_1C_zpos = v31; | |
| } | |
| else | |
| { | |
| v32 = v7->field_30_pNext; | |
| if ( v32->field_14_xy.x.mValue == stru_6FD388.x.mValue | |
| && v32->field_14_xy.y.mValue == stru_6FD388.y.mValue | |
| && v32->field_1C_zpos == field_1C_zpos ) | |
| { | |
| goto LABEL_28; | |
| } | |
| v32->field_14_xy.x.mValue = stru_6FD388.x.mValue; | |
| v32->field_14_xy.y.mValue = v29; | |
| v32->field_1C_zpos = field_1C_zpos; | |
| } | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v32); | |
| LABEL_28: | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| v7->field_30_pNext); | |
| v7->field_30_pNext->field_2C_flags |= 4u; | |
| v6 = gParticle_4C_Pool_6FD5E4; | |
| goto LABEL_29; | |
| } | |
| } | |
| } | |
| char __thiscall Wolfy_30::Update_5434A0(Wolfy_30 *this, int a3, __int16 a2) | |
| { | |
| __int16 timer; // ax | |
| char result; // al | |
| timer = this->field_1A_timer; | |
| if ( timer != 9999 ) | |
| { | |
| if ( timer ) | |
| { | |
| this->field_1A_timer = timer - 1; | |
| } | |
| } | |
| if ( this->field_1A_timer ) | |
| { | |
| if ( bSkip_particles_67D64D ) | |
| { | |
| return 1; | |
| } | |
| else | |
| { | |
| switch ( this->field_10_type_or_state ) | |
| { | |
| case 3: | |
| case 12: | |
| Wolfy_30::state_3_12_540D30(this, a2, a3); | |
| result = 0; | |
| break; | |
| case 4: | |
| Wolfy_30::state_4_540F90(this, a2, a3); | |
| result = 0; | |
| break; | |
| case 5: | |
| Wolfy_30::state_5_541430(this, a2, a3); | |
| result = 0; | |
| break; | |
| case 13: | |
| case 14: | |
| Wolfy_30::state_13_14_5411E0(this, a2, a3); | |
| result = 0; | |
| break; | |
| case 18: | |
| case 19: | |
| case 20: | |
| case 32: | |
| case 33: | |
| Wolfy_30::state_18_19_20_32_33_542790(this); | |
| result = 0; | |
| break; | |
| case 22: | |
| Wolfy_30::state_22_23_24_25_542E30(this, 3); | |
| goto LABEL_18; | |
| case 23: | |
| Wolfy_30::state_22_23_24_25_542E30(this, 2); | |
| result = 0; | |
| break; | |
| case 24: | |
| Wolfy_30::state_22_23_24_25_542E30(this, 0); | |
| result = 0; | |
| break; | |
| case 25: | |
| Wolfy_30::state_22_23_24_25_542E30(this, 1); | |
| result = 0; | |
| break; | |
| default: | |
| LABEL_18: | |
| result = 0; | |
| break; | |
| } | |
| } | |
| } | |
| else | |
| { | |
| Wolfy_30::DeInit_543610(this); | |
| return 1; | |
| } | |
| return result; | |
| } | |
| void __thiscall Wolfy_7A8::sub_543690(Wolfy_7A8 *this) | |
| { | |
| unsigned __int8 v1; // dl | |
| unsigned __int8 v2; // bl | |
| Wolfy_30 *v3; // eax | |
| unsigned __int8 v4; // [esp+13h] [ebp-9h] | |
| unsigned __int8 v5; // [esp+14h] [ebp-8h] | |
| unsigned __int8 v6; // [esp+18h] [ebp-4h] | |
| v1 = 0; | |
| v2 = 0; | |
| v4 = 99; | |
| v6 = 99; | |
| v5 = 0; | |
| do | |
| { | |
| if ( this->field_780_bUsed[v5] == 1 ) | |
| { | |
| v3 = &this->field_0_pool[v5]; | |
| switch ( v3->field_10_type_or_state ) | |
| { | |
| case 2: | |
| case 3: | |
| case 4: | |
| case 21: | |
| case 31: | |
| case 34: | |
| goto LABEL_12; | |
| case 5: | |
| case 28: | |
| case 29: | |
| case 30: | |
| v1 = 2; | |
| goto LABEL_12; | |
| case 12: | |
| case 14: | |
| case 15: | |
| v1 = 5; | |
| goto LABEL_12; | |
| case 13: | |
| v1 = 4; | |
| goto LABEL_12; | |
| case 16: | |
| case 17: | |
| v1 = 6; | |
| goto LABEL_12; | |
| case 18: | |
| case 33: | |
| if ( v3->field_1A_timer < 82u ) | |
| { | |
| v1 = 3; | |
| } | |
| goto LABEL_12; | |
| case 19: | |
| case 20: | |
| case 32: | |
| if ( v3->field_1A_timer < 50u ) | |
| { | |
| goto LABEL_11; | |
| } | |
| goto LABEL_12; | |
| case 22: | |
| case 23: | |
| case 24: | |
| case 25: | |
| LABEL_11: | |
| v1 = 3; | |
| LABEL_12: | |
| if ( v1 < v4 ) | |
| { | |
| v4 = v1; | |
| v6 = v2; | |
| } | |
| break; | |
| default: | |
| this->field_0_pool[v5].field_1A_timer = 0; | |
| return; | |
| } | |
| } | |
| v5 = ++v2; | |
| } | |
| while ( v2 < 40u ); | |
| this->field_0_pool[v6].field_1A_timer = 0; | |
| } | |
| Wolfy_30 *__thiscall Wolfy_7A8::New_40_543800(Wolfy_7A8 *this) | |
| { | |
| unsigned __int8 k20Idx; // bl | |
| unsigned __int8 idx_to_use; // bp | |
| Wolfy_30 *result; // eax | |
| Wolfy_30 *pNew; // edi | |
| unsigned __int8 _20IdxCopy; // [esp+10h] [ebp-4h] | |
| unsigned __int8 k40Idx; // [esp+10h] [ebp-4h] | |
| k20Idx = 0; | |
| _20IdxCopy = 0; | |
| while ( 1 ) | |
| { | |
| idx_to_use = _20IdxCopy; | |
| if ( !this->field_780_bUsed[_20IdxCopy] ) | |
| { | |
| break; | |
| } | |
| _20IdxCopy = ++k20Idx; | |
| if ( k20Idx >= 20u ) | |
| { | |
| Wolfy_7A8::sub_543690(this); | |
| k20Idx = 0; | |
| k40Idx = 0; | |
| while ( 1 ) | |
| { | |
| idx_to_use = k40Idx; | |
| if ( !this->field_780_bUsed[k40Idx] ) | |
| { | |
| break; | |
| } | |
| k40Idx = ++k20Idx; | |
| if ( k20Idx >= 40u ) | |
| { | |
| return 0; | |
| } | |
| } | |
| break; | |
| } | |
| } | |
| pNew = &this->field_0_pool[idx_to_use]; | |
| Wolfy_30::Init_543650(pNew); | |
| pNew->field_4_idx = k20Idx; | |
| pNew->field_6_id = gWolfyId_40_pool_623F18; | |
| pNew->field_0_bIn20Pool = 0; | |
| ++gWolfyId_40_pool_623F18; | |
| result = pNew; | |
| this->field_780_bUsed[idx_to_use] = 1; | |
| return result; | |
| } | |
| Particle_4C *__thiscall Particle_8::New_53E3C0( | |
| Particle_8 *this, | |
| __int32 xpos, | |
| __int32 ypos, | |
| __int32 a4, | |
| __int32 a5, | |
| __int32 a6, | |
| __int32 a7) | |
| { | |
| Particle_4C *result; // eax | |
| Particle_947C *pRoot; // eax | |
| Particle_4C *pNew4C; // esi | |
| Particle_4C *pNext; // edx | |
| Sprite *field_0_first_free; // edi | |
| result = 0; | |
| if ( gParticle_4C_Pool_6FD5E4->field_0 ) | |
| { | |
| if ( gSprite_Pool_703818->field_0_first_free ) | |
| { | |
| pRoot = gParticle_4C_Pool_6FD5E4; | |
| pNew4C = gParticle_4C_Pool_6FD5E4->field_0; | |
| pNext = gParticle_4C_Pool_6FD5E4->field_4; | |
| gParticle_4C_Pool_6FD5E4->field_0 = gParticle_4C_Pool_6FD5E4->field_0->field_3C_mpNext; | |
| pNew4C->field_3C_mpNext = pNext; | |
| pRoot->field_4 = pNew4C; | |
| Particle_4C::PoolAllocate_53E2C0(pNew4C); | |
| pNew4C->field_8_xpos = xpos; | |
| pNew4C->field_C_ypos = ypos; | |
| pNew4C->field_10 = a4; | |
| pNew4C->field_14 = a5; | |
| pNew4C->field_18 = a6; | |
| pNew4C->field_1C = a7; | |
| pNew4C->field_0_id = gParticleInstCount_6FD5F4; | |
| field_0_first_free = gSprite_Pool_703818->field_0_first_free; | |
| gSprite_Pool_703818->field_0_first_free = gSprite_Pool_703818->field_0_first_free->field_C_uni2.pSprite; | |
| Sprite::Init_5A2CF0(field_0_first_free); | |
| pNew4C->field_30_pNext = field_0_first_free; | |
| ++gParticleInstCount_6FD5F4; | |
| return pNew4C; | |
| } | |
| } | |
| return result; | |
| } | |
| int __thiscall Particle_4C::Service_53D260(Particle_4C *this) | |
| { | |
| __int32 field_38_state; // eax | |
| int result; // eax | |
| char field_48_timer; // al | |
| unsigned __int8 v5; // dl | |
| Sprite *field_30_pNext; // ecx | |
| __int16 v7; // ax | |
| Sprite *v8; // ecx | |
| __int32 field_1C_zpos; // eax | |
| __int32 mValue; // edi | |
| __int32 v11; // edx | |
| char v12; // al | |
| unsigned __int8 v13; // dl | |
| Sprite *v14; // ecx | |
| __int16 v15; // ax | |
| Sprite *v16; // ecx | |
| __int32 v17; // eax | |
| __int32 v18; // edi | |
| __int32 v19; // edx | |
| char v20; // al | |
| unsigned __int8 v21; // dl | |
| Sprite *v22; // ecx | |
| __int16 v23; // ax | |
| Sprite *v24; // ecx | |
| __int32 v25; // eax | |
| __int32 v26; // edi | |
| __int32 v27; // edx | |
| char v28; // al | |
| unsigned __int8 v29; // dl | |
| Sprite *v30; // ecx | |
| __int16 v31; // ax | |
| __int32 v32; // edi | |
| __int32 v33; // eax | |
| Sprite *v34; // ecx | |
| __int32 v35; // edx | |
| __int32 v36; // edx | |
| Sprite *v37; // ecx | |
| Sprite *v38; // ecx | |
| __int16 v39; // ax | |
| field_38_state = this->field_38_state; | |
| --this->field_2C_counter; | |
| result = field_38_state - 1; | |
| switch ( result ) | |
| { | |
| case 0: | |
| LOBYTE(result) = Particle_4C::UpdateSimpleBallisticMotion_state_1_53ABA0(this); | |
| return result; | |
| case 2: | |
| case 11: | |
| LOBYTE(result) = Particle_4C::UpdateDirectedProjectile_state_3_12_5384C0(this); | |
| return result; | |
| case 3: | |
| LOBYTE(result) = Particle_4C::UpdateDirectedBurstSweep_state_4_539040(this); | |
| return result; | |
| case 4: | |
| LOBYTE(result) = Particle_4C::UpdateCircularBurst_state_5_539890(this); | |
| return result; | |
| case 5: | |
| case 14: | |
| case 15: | |
| case 16: | |
| LOBYTE(result) = Particle_4C::UpdateFloatingParticle_state_6_15_16_17_538060(this); | |
| return result; | |
| case 6: | |
| Particle_4C::UpdateDebrisArc_state_7_53B1A0(this); | |
| return result; | |
| case 7: | |
| goto LABEL_77; | |
| case 8: | |
| case 9: | |
| LOBYTE(result) = Particle_4C::UpdateAttachedEmitter_state_9_10_53B670(this); | |
| return result; | |
| case 12: | |
| case 13: | |
| case 35: | |
| LOBYTE(result) = Particle_4C::UpdateDirectedBurst_state_13_14_36_539480(this); | |
| return result; | |
| case 17: | |
| case 32: | |
| field_48_timer = this->field_48_timer; | |
| if ( field_48_timer ) | |
| { | |
| this->field_48_timer = field_48_timer - 1; | |
| LOBYTE(result) = 0; | |
| } | |
| else | |
| { | |
| v5 = this->field_46_sub_state + 1; | |
| this->field_46_sub_state = v5; | |
| if ( v5 < 6u || v5 > 0xAu ) | |
| { | |
| this->field_48_timer = 1; | |
| } | |
| PurpleDoom::Remove_477B00(gPurpleDoom_3_679210, this->field_30_pNext); | |
| LOBYTE(result) = this->field_46_sub_state; | |
| if ( (unsigned __int8)result <= 0xFu ) | |
| { | |
| field_30_pNext = this->field_30_pNext; | |
| v7 = (unsigned __int8)result + gPhi_8CA8_6FCF00->field_8CA4 + 20; | |
| if ( field_30_pNext->field_22_sprite_id != v7 ) | |
| { | |
| field_30_pNext->field_22_sprite_id = v7; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(field_30_pNext); | |
| } | |
| v8 = this->field_30_pNext; | |
| field_1C_zpos = v8->field_1C_zpos; | |
| if ( field_1C_zpos + dword_6FD2F0 < dword_6FD28C ) | |
| { | |
| mValue = v8->field_14_xy.y.mValue; | |
| v11 = field_1C_zpos + dword_6FD2E8; | |
| if ( v8->field_1C_zpos != field_1C_zpos + dword_6FD2E8 ) | |
| { | |
| v8->field_14_xy.x.mValue = v8->field_14_xy.x.mValue; | |
| v8->field_14_xy.y.mValue = mValue; | |
| v8->field_1C_zpos = v11; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v8); | |
| } | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| this->field_30_pNext); | |
| if ( this->field_46_sub_state == 2 ) | |
| { | |
| this->field_30_pNext->field_2C_flags = -94; | |
| } | |
| this->field_30_pNext->field_2C_flags |= 4u; | |
| ret_0: | |
| LOBYTE(result) = 0; | |
| } | |
| else | |
| { | |
| LOBYTE(result) = 1; | |
| } | |
| } | |
| return result; | |
| case 18: | |
| case 31: | |
| v12 = this->field_48_timer; | |
| if ( v12 ) | |
| { | |
| this->field_48_timer = v12 - 1; | |
| LOBYTE(result) = 0; | |
| } | |
| else | |
| { | |
| v13 = this->field_46_sub_state + 1; | |
| this->field_46_sub_state = v13; | |
| if ( v13 < 6u || v13 > 10u ) | |
| { | |
| this->field_48_timer = 1; | |
| } | |
| PurpleDoom::Remove_477B00(gPurpleDoom_3_679210, this->field_30_pNext); | |
| LOBYTE(result) = this->field_46_sub_state; | |
| if ( (unsigned __int8)result <= 0xFu ) | |
| { | |
| v14 = this->field_30_pNext; | |
| v15 = (unsigned __int8)result + gPhi_8CA8_6FCF00->field_8CA4 + 20; | |
| if ( v14->field_22_sprite_id != v15 ) | |
| { | |
| v14->field_22_sprite_id = v15; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(v14); | |
| } | |
| v16 = this->field_30_pNext; | |
| v17 = v16->field_1C_zpos; | |
| if ( v17 + dword_6FD2F0 < dword_6FD28C ) | |
| { | |
| v18 = v16->field_14_xy.y.mValue; | |
| v19 = v17 + dword_6FD2E8; | |
| if ( v16->field_1C_zpos != v17 + dword_6FD2E8 ) | |
| { | |
| v16->field_14_xy.x.mValue = v16->field_14_xy.x.mValue; | |
| v16->field_14_xy.y.mValue = v18; | |
| v16->field_1C_zpos = v19; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v16); | |
| } | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| this->field_30_pNext); | |
| if ( this->field_46_sub_state == 2 ) | |
| { | |
| this->field_30_pNext->field_2C_flags = -94; | |
| } | |
| this->field_30_pNext->field_2C_flags |= 4u; | |
| Sprite::ApplyScaleToDimensions_59E4C0( | |
| this->field_30_pNext, | |
| dword_6FD4A0 + dword_6FD39C, | |
| 0); | |
| LOBYTE(result) = 0; | |
| } | |
| else | |
| { | |
| LOBYTE(result) = 1; | |
| } | |
| } | |
| return result; | |
| case 19: | |
| v20 = this->field_48_timer; | |
| if ( v20 ) | |
| { | |
| this->field_48_timer = v20 - 1; | |
| LOBYTE(result) = 0; | |
| } | |
| else | |
| { | |
| v21 = this->field_46_sub_state + 1; | |
| this->field_46_sub_state = v21; | |
| if ( v21 < 6u || v21 > 0xAu ) | |
| { | |
| this->field_48_timer = 1; | |
| } | |
| PurpleDoom::Remove_477B00(gPurpleDoom_3_679210, this->field_30_pNext); | |
| LOBYTE(result) = this->field_46_sub_state; | |
| if ( (unsigned __int8)result <= 0xFu ) | |
| { | |
| v22 = this->field_30_pNext; | |
| v23 = (unsigned __int8)result + gPhi_8CA8_6FCF00->field_8CA4 + 56; | |
| if ( v22->field_22_sprite_id != v23 ) | |
| { | |
| v22->field_22_sprite_id = v23; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(v22); | |
| } | |
| v24 = this->field_30_pNext; | |
| v25 = v24->field_1C_zpos; | |
| if ( v25 + dword_6FD2F0 < dword_6FD28C ) | |
| { | |
| v26 = v24->field_14_xy.y.mValue; | |
| v27 = v25 + dword_6FD2E8; | |
| if ( v24->field_1C_zpos != v25 + dword_6FD2E8 ) | |
| { | |
| v24->field_14_xy.x.mValue = v24->field_14_xy.x.mValue; | |
| v24->field_14_xy.y.mValue = v26; | |
| v24->field_1C_zpos = v27; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v24); | |
| } | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| this->field_30_pNext); | |
| if ( this->field_46_sub_state == 2 ) | |
| { | |
| this->field_30_pNext->field_2C_flags = -94; | |
| } | |
| this->field_30_pNext->field_2C_flags |= 4u; | |
| Sprite::ApplyScaleToDimensions_59E4C0( | |
| this->field_30_pNext, | |
| dword_6FD4A4, | |
| 0); | |
| LOBYTE(result) = 0; | |
| } | |
| else | |
| { | |
| LOBYTE(result) = 1; | |
| } | |
| } | |
| return result; | |
| case 21: | |
| case 22: | |
| case 23: | |
| case 24: | |
| v28 = this->field_48_timer; | |
| if ( v28 ) | |
| { | |
| this->field_48_timer = v28 - 1; | |
| LOBYTE(result) = 0; | |
| return result; | |
| } | |
| PurpleDoom::Remove_477B00(gPurpleDoom_3_679210, this->field_30_pNext); | |
| v29 = this->field_46_sub_state + 1; | |
| this->field_48_timer = 1; | |
| this->field_46_sub_state = v29; | |
| if ( v29 > 0xCu ) | |
| { | |
| LOBYTE(result) = 1; | |
| return result; | |
| } | |
| v30 = this->field_30_pNext; | |
| v31 = v29 + gPhi_8CA8_6FCF00->field_8CA4 + 147; | |
| if ( v30->field_22_sprite_id != v31 ) | |
| { | |
| v30->field_22_sprite_id = v31; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(v30); | |
| } | |
| stru_6FD388.x.mValue = (gSin_table_667A80[this->field_24.field_0] | |
| * (__int64)this->field_20) >> 14; | |
| stru_6FD388.y.mValue = (gCos_table_669260[this->field_24.field_0] | |
| * (__int64)this->field_20) >> 14; | |
| v32 = this->field_30_pNext->field_14_xy.x.mValue + stru_6FD388.x.mValue; | |
| stru_6FD388.x.mValue = v32; | |
| v33 = this->field_30_pNext->field_14_xy.y.mValue + stru_6FD388.y.mValue; | |
| stru_6FD388.y.mValue = v33; | |
| v34 = this->field_30_pNext; | |
| v35 = v34->field_1C_zpos; | |
| if ( this->field_46_sub_state >= 9u ) | |
| { | |
| v36 = dword_6FD46C + v35; | |
| if ( v34->field_14_xy.x.mValue != v32 | |
| || v34->field_14_xy.y.mValue != v33 | |
| || v34->field_1C_zpos != v36 ) | |
| { | |
| goto LABEL_62; | |
| } | |
| } | |
| else | |
| { | |
| v36 = dword_6FD2E8 + v35; | |
| if ( v34->field_14_xy.x.mValue != v32 | |
| || v34->field_14_xy.y.mValue != v33 | |
| || v34->field_1C_zpos != v36 ) | |
| { | |
| LABEL_62: | |
| v34->field_14_xy.x.mValue = v32; | |
| v34->field_14_xy.y.mValue = v33; | |
| v34->field_1C_zpos = v36; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v34); | |
| } | |
| } | |
| v37 = this->field_30_pNext; | |
| if ( v37->field_1C_zpos > dword_6FD28C ) | |
| { | |
| v37->field_1C_zpos = dword_6FD28C; | |
| Sprite::ResetZCollisionAndDebugBoxes_59E7B0(v37); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| this->field_30_pNext); | |
| result = (int)this->field_30_pNext; | |
| *(_BYTE *)(result + 44) = 82; | |
| this->field_30_pNext->field_2C_flags |= 4u; | |
| LOBYTE(result) = 0; | |
| return result; | |
| case 25: | |
| PurpleDoom::Remove_477B00(gPurpleDoom_3_679210, this->field_30_pNext); | |
| if ( this->field_2C_counter ) | |
| { | |
| v38 = this->field_30_pNext; | |
| v39 = gPhi_8CA8_6FCF00->field_8CA4; | |
| if ( v38->field_22_sprite_id != v39 ) | |
| { | |
| v38->field_22_sprite_id = v39; | |
| Sprite::UpdateDimensionsFromSpriteIndex_59FA40(v38); | |
| } | |
| PurpleDoom::AddToSingleBucket_477AE0( | |
| gPurpleDoom_3_679210, | |
| this->field_30_pNext); | |
| this->field_30_pNext->field_2C_flags |= 4u; | |
| LOBYTE(result) = 0; | |
| } | |
| else | |
| { | |
| LABEL_77: | |
| LOBYTE(result) = 1; | |
| } | |
| return result; | |
| case 28: | |
| case 29: | |
| LOBYTE(result) = Particle_4C::UpdateBurstAnimation_state_29_30_53B9F0(this); | |
| return result; | |
| case 30: | |
| case 33: | |
| LOBYTE(result) = Particle_4C::UpdateCollisionBurst_state_31_34_53BAC0(this); | |
| return result; | |
| case 34: | |
| LOBYTE(result) = Particle_4C::UpdateLargeBallisticDebris_state_35_53AE60(this); | |
| return result; | |
| case 36: | |
| LOBYTE(result) = Particle_4C::UpdateShortAnim_state_37_53B580(this); | |
| return result; | |
| case 37: | |
| LOBYTE(result) = Particle_4C::UpdateObjectBeamLink_state_38_538AC0(this); | |
| return result; | |
| case 38: | |
| LOBYTE(result) = Particle_4C::UpdateStaticAnim_state_39_53A180(this); | |
| return result; | |
| case 39: | |
| case 40: | |
| LOBYTE(result) = Particle_4C::UpdateSkidOrScrapeSpark_state_40_41_53A280(this); | |
| return result; | |
| case 41: | |
| LOBYTE(result) = Particle_4C::Empty_state_42_53AB70(); | |
| return result; | |
| case 42: | |
| LOBYTE(result) = Particle_4C::UpdateBeamSegment_state_43_538A40(this); | |
| return result; | |
| case 43: | |
| LOBYTE(result) = Particle_4C::Empty_state_44_53B170(); | |
| return result; | |
| default: | |
| goto ret_0; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment