Skip to content

Instantly share code, notes, and snippets.

@MrSapps
Last active March 29, 2026 01:46
Show Gist options
  • Select an option

  • Save MrSapps/3c2f594708cf925feefdecf0ae36cd4a to your computer and use it in GitHub Desktop.

Select an option

Save MrSapps/3c2f594708cf925feefdecf0ae36cd4a to your computer and use it in GitHub Desktop.
Car_78
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