CStudioHdr::RunFlexRulesOld
0x000e2b70 · 2841 bytes · __thiscall
_ZN10CStudioHdr15RunFlexRulesOldEPKfPf
Decompiled
undefined (3 params)
/* WARNING: Type propagation algorithm not settling */
/* CStudioHdr::RunFlexRulesOld(float const*, float*) */
void __thiscall CStudioHdr::RunFlexRulesOld(CStudioHdr *this,float *param_1,float *param_2)
{
float fVar1;
float fVar2;
float fVar3;
int iVar4;
int iVar5;
int iVar6;
int *piVar7;
int iVar8;
int iVar9;
float *pfVar10;
int iVar11;
int iVar12;
int iVar13;
int iVar14;
undefined4 *puVar15;
float fVar16;
float fVar17;
float fVar18;
int local_b8;
float local_a0;
float local_9c [35];
local_a0 = *(float *)this;
if (0 < *(int *)((int)local_a0 + 0x104)) {
iVar6 = 0;
do {
param_2[iVar6] = 0.0;
iVar6 = iVar6 + 1;
local_a0 = *(float *)this;
} while (iVar6 < *(int *)((int)local_a0 + 0x104));
}
local_9c[0] = 0.0;
local_9c[1] = 0.0;
if (0 < *(int *)((int)local_a0 + 0x114)) {
do {
pfVar10 = local_9c + 2;
for (iVar6 = 0x20; iVar6 != 0; iVar6 = iVar6 + -1) {
*pfVar10 = 0.0;
pfVar10 = pfVar10 + 1;
}
piVar7 = (int *)((int)local_9c[0] + *(int *)((int)local_a0 + 0x118) + (int)local_a0);
iVar6 = *piVar7;
if ((-1 < iVar6) && (iVar4 = *(int *)((int)local_a0 + 0x104), iVar6 < iVar4)) {
iVar5 = piVar7[1];
fVar16 = 0.0;
if (0 < iVar5) {
puVar15 = (undefined4 *)((int)piVar7 + piVar7[2]);
iVar11 = 0;
iVar14 = 0;
do {
switch(*puVar15) {
case 1:
if (iVar11 < 0x20) {
local_9c[iVar11 + 2] = (float)puVar15[1];
iVar11 = iVar11 + 1;
}
break;
case 2:
if (((iVar11 < 0x20) && (iVar9 = puVar15[1], -1 < iVar9)) &&
(iVar9 < *(int *)((int)local_a0 + 0x10c))) {
local_9c[iVar11 + 2] =
param_1[*(int *)((int)local_a0 + iVar9 * 0x14 + *(int *)((int)local_a0 + 0x110)
+ 8)];
iVar11 = iVar11 + 1;
}
break;
case 3:
if (((iVar11 < 0x20) && (iVar9 = puVar15[1], -1 < iVar9)) && (iVar9 < iVar4)) {
local_9c[iVar11 + 2] = param_2[iVar9];
iVar11 = iVar11 + 1;
}
break;
case 4:
if (1 < iVar11) {
local_9c[iVar11] = local_9c[iVar11] + local_9c[iVar11 + 1];
iVar11 = iVar11 + -1;
}
break;
case 5:
if (1 < iVar11) {
local_9c[iVar11] = local_9c[iVar11] - local_9c[iVar11 + 1];
iVar11 = iVar11 + -1;
}
break;
case 6:
if (1 < iVar11) {
local_9c[iVar11] = local_9c[iVar11] * local_9c[iVar11 + 1];
iVar11 = iVar11 + -1;
}
break;
case 7:
if (1 < iVar11) {
if (local_9c[iVar11 + 1] <= 0.0001) {
local_9c[iVar11] = 0.0;
iVar11 = iVar11 + -1;
}
else {
local_9c[iVar11] = local_9c[iVar11] / local_9c[iVar11 + 1];
iVar11 = iVar11 + -1;
}
}
break;
case 8:
if (0 < iVar11) {
local_9c[iVar11 + 1] = (float)((uint)local_9c[iVar11 + 1] ^ 0x80000000);
}
break;
case 0xd:
if (1 < iVar11) {
fVar16 = local_9c[iVar11];
if (local_9c[iVar11] <= local_9c[iVar11 + 1]) {
fVar16 = local_9c[iVar11 + 1];
}
local_9c[iVar11] = fVar16;
iVar11 = iVar11 + -1;
}
break;
case 0xe:
if (1 < iVar11) {
fVar16 = local_9c[iVar11];
if (local_9c[iVar11 + 1] <= local_9c[iVar11]) {
fVar16 = local_9c[iVar11 + 1];
}
local_9c[iVar11] = fVar16;
iVar11 = iVar11 + -1;
}
break;
case 0xf:
if (((iVar11 < 0x20) && (iVar9 = puVar15[1], -1 < iVar9)) &&
(iVar9 < *(int *)((int)local_a0 + 0x10c))) {
fVar16 = param_1[*(int *)((int)local_a0 + iVar9 * 0x14 +
*(int *)((int)local_a0 + 0x110) + 8)] + 1.0;
if (1.0 <= param_1[*(int *)((int)local_a0 + iVar9 * 0x14 +
*(int *)((int)local_a0 + 0x110) + 8)] + 1.0) {
fVar16 = 1.0;
}
if (fVar16 <= 0.0) {
fVar16 = 0.0;
}
local_9c[iVar11 + 2] = 1.0 - fVar16;
iVar11 = iVar11 + 1;
}
break;
case 0x10:
if (((iVar11 < 0x20) && (iVar9 = puVar15[1], -1 < iVar9)) &&
(iVar9 < *(int *)((int)local_a0 + 0x10c))) {
fVar16 = param_1[*(int *)((int)local_a0 + iVar9 * 0x14 +
*(int *)((int)local_a0 + 0x110) + 8)];
if (1.0 <= fVar16) {
fVar16 = 1.0;
}
if (fVar16 <= 0.0) {
fVar16 = 0.0;
}
local_9c[iVar11 + 2] = fVar16;
iVar11 = iVar11 + 1;
}
break;
case 0x11:
if ((((4 < iVar11) && (iVar9 = puVar15[1], -1 < iVar9)) &&
(iVar9 < *(int *)((int)local_a0 + 0x10c))) &&
((iVar13 = (int)local_9c[iVar11 + 1], -1 < iVar13 &&
(iVar13 < *(int *)((int)local_a0 + 0x10c))))) {
fVar17 = 0.0;
fVar16 = param_1[*(int *)((int)local_a0 + 8 +
*(int *)((int)local_a0 + 0x110) + iVar13 * 0x14)];
fVar18 = (&local_a0)[iVar11];
fVar1 = local_9c[iVar11];
fVar2 = local_9c[iVar11 + 0xfffffffd];
fVar3 = local_9c[iVar11 + 0xfffffffe];
if ((fVar2 < fVar16) && (fVar16 < fVar1)) {
if (fVar3 <= fVar16) {
fVar17 = 1.0;
if ((fVar18 < fVar16) && (fVar1 != fVar18)) {
fVar16 = (fVar16 - fVar18) / (fVar1 - fVar18);
if (1.0 <= fVar16) {
fVar16 = 1.0;
}
if (fVar16 <= 0.0) {
fVar16 = 0.0;
}
fVar17 = 1.0 - fVar16;
}
}
else if (fVar3 != fVar2) {
fVar16 = (fVar16 - fVar2) / (fVar3 - fVar2);
if (1.0 <= fVar16) {
fVar16 = 1.0;
}
if (0.0 <= fVar16) {
fVar17 = fVar16;
}
}
}
local_9c[iVar11 + 0xfffffffd] =
fVar17 * param_1[*(int *)((int)local_a0 + 8 +
*(int *)((int)local_a0 + 0x110) + iVar9 * 0x14)];
iVar11 = iVar11 + -4;
}
break;
case 0x12:
iVar9 = puVar15[1];
if (((iVar9 < 0) || (*(int *)((int)local_a0 + 0x10c) <= iVar9)) ||
((iVar11 < iVar9 || ((iVar9 == 0 && (0x1f < iVar11)))))) break;
iVar9 = iVar11 - iVar9;
iVar13 = iVar9 + 1;
fVar16 = local_9c[2];
if (iVar13 < iVar11) {
fVar18 = local_9c[iVar9 + 2];
pfVar10 = local_9c + iVar9 + 3;
do {
fVar18 = fVar18 * *pfVar10;
pfVar10 = pfVar10 + 1;
local_9c[iVar9 + 2] = fVar18;
fVar16 = local_9c[2];
} while (pfVar10 != local_9c + iVar11 + 2);
}
goto joined_r0x000e3042;
case 0x13:
iVar9 = puVar15[1];
if (((-1 < iVar9) && (iVar9 < *(int *)((int)local_a0 + 0x10c))) && (iVar9 < iVar11)) {
iVar9 = iVar11 - iVar9;
fVar16 = local_9c[iVar9 + 2];
if (iVar9 + 1 < iVar11) {
pfVar10 = local_9c + iVar9 + 3;
do {
fVar16 = fVar16 * *pfVar10;
pfVar10 = pfVar10 + 1;
} while (pfVar10 != local_9c + iVar11 + 2);
}
local_9c[iVar9 + 1] = (1.0 - fVar16) * local_9c[iVar9 + 1];
iVar11 = iVar9;
}
break;
case 0x14:
if ((((2 < iVar11) && (iVar9 = puVar15[1], -1 < iVar9)) &&
(iVar13 = *(int *)((int)local_a0 + 0x10c), iVar9 < iVar13)) &&
((iVar12 = (int)local_9c[iVar11 + 1], -1 < iVar12 && (iVar12 < iVar13)))) {
if (((-1 < (int)local_9c[iVar11]) &&
(((int)local_9c[iVar11] < iVar13 &&
(iVar8 = (int)local_9c[iVar11 + 0xffffffff], -1 < iVar8)))) && (iVar8 < iVar13)
) {
iVar13 = *(int *)((int)local_a0 + 0x110);
iVar9 = iVar13 + iVar9 * 0x14 + (int)local_a0;
fVar16 = *(float *)(iVar9 + 0x10);
fVar18 = *(float *)(iVar9 + 0xc);
if (fVar16 == fVar18) {
fVar16 = (float)(~-(uint)(fVar16 <= param_1[*(int *)(iVar9 + 8)]) & 0x3f800000);
}
else {
fVar16 = (param_1[*(int *)(iVar9 + 8)] - fVar18) / (fVar16 - fVar18);
if (1.0 <= fVar16) {
fVar16 = 1.0;
}
if (fVar16 <= 0.0) {
fVar16 = 0.0;
}
fVar16 = 1.0 - fVar16;
}
iVar9 = iVar13 + iVar12 * 0x14 + (int)local_a0;
fVar18 = *(float *)(iVar9 + 0x10);
fVar1 = *(float *)(iVar9 + 0xc);
if (fVar18 == fVar1) {
fVar16 = (float)((uint)fVar16 & -(uint)(fVar18 <= param_1[*(int *)(iVar9 + 8)]))
;
}
else {
fVar18 = (param_1[*(int *)(iVar9 + 8)] - fVar1) / (fVar18 - fVar1);
if (1.0 <= fVar18) {
fVar18 = 1.0;
}
if (fVar18 <= 0.0) {
fVar18 = 0.0;
}
fVar16 = fVar16 * fVar18;
}
iVar9 = iVar13 + iVar8 * 0x14 + (int)local_a0;
fVar18 = *(float *)(iVar9 + 0x10);
fVar1 = *(float *)(iVar9 + 0xc);
if (fVar18 == fVar1) {
if (param_1[*(int *)(iVar9 + 8)] < fVar18) goto LAB_000e35b3;
fVar16 = 0.0;
}
else {
fVar18 = (param_1[*(int *)(iVar9 + 8)] - fVar1) / (fVar18 - fVar1);
if (1.0 <= fVar18) {
fVar18 = 1.0;
}
if (fVar18 <= 0.0) {
fVar18 = 0.0;
}
fVar18 = (fVar18 + fVar18) - 1.0;
if (fVar18 <= 0.0) goto LAB_000e35b3;
fVar16 = (1.0 - fVar18) * fVar16;
}
local_9c[iVar11 + 0xffffffff] = fVar16;
iVar11 = iVar11 + -2;
}
}
break;
case 0x15:
if ((((2 < iVar11) && (iVar9 = puVar15[1], -1 < iVar9)) &&
(iVar13 = *(int *)((int)local_a0 + 0x10c), iVar9 < iVar13)) &&
((iVar12 = (int)local_9c[iVar11 + 1], -1 < iVar12 && (iVar12 < iVar13)))) {
if (((-1 < (int)local_9c[iVar11]) &&
(((int)local_9c[iVar11] < iVar13 &&
(iVar8 = (int)local_9c[iVar11 + 0xffffffff], -1 < iVar8)))) && (iVar8 < iVar13)
) {
iVar13 = *(int *)((int)local_a0 + 0x110);
iVar9 = iVar13 + iVar9 * 0x14 + (int)local_a0;
fVar16 = *(float *)(iVar9 + 0x10);
fVar18 = *(float *)(iVar9 + 0xc);
if (fVar16 == fVar18) {
fVar16 = (float)(-(uint)(fVar16 <= param_1[*(int *)(iVar9 + 8)]) & 0x3f800000);
}
else {
fVar16 = (param_1[*(int *)(iVar9 + 8)] - fVar18) / (fVar16 - fVar18);
if (1.0 <= fVar16) {
fVar16 = 1.0;
}
if (fVar16 <= 0.0) {
fVar16 = 0.0;
}
}
iVar9 = iVar13 + iVar12 * 0x14 + (int)local_a0;
fVar18 = *(float *)(iVar9 + 0x10);
fVar1 = *(float *)(iVar9 + 0xc);
if (fVar18 == fVar1) {
fVar16 = (float)((uint)fVar16 & -(uint)(fVar18 <= param_1[*(int *)(iVar9 + 8)]))
;
}
else {
fVar18 = (param_1[*(int *)(iVar9 + 8)] - fVar1) / (fVar18 - fVar1);
if (1.0 <= fVar18) {
fVar18 = 1.0;
}
if (fVar18 <= 0.0) {
fVar18 = 0.0;
}
fVar16 = fVar16 * fVar18;
}
iVar9 = iVar13 + iVar8 * 0x14 + (int)local_a0;
fVar18 = *(float *)(iVar9 + 0x10);
fVar1 = *(float *)(iVar9 + 0xc);
if (fVar18 == fVar1) {
if (fVar18 <= param_1[*(int *)(iVar9 + 8)]) {
LAB_000e2df1:
local_9c[iVar11 + 0xffffffff] = fVar16;
iVar11 = iVar11 + -2;
break;
}
fVar16 = 0.0;
}
else {
fVar18 = (param_1[*(int *)(iVar9 + 8)] - fVar1) / (fVar18 - fVar1);
if (1.0 <= fVar18) {
fVar18 = 1.0;
}
if (fVar18 <= 0.0) {
fVar18 = 0.0;
}
fVar18 = (fVar18 + fVar18) - 1.0;
if (0.0 <= fVar18) goto LAB_000e2df1;
fVar16 = (fVar18 + 1.0) * fVar16;
}
LAB_000e35b3:
local_b8 = iVar11 + -2;
local_9c[iVar11 + 0xffffffff] = fVar16;
iVar11 = local_b8;
}
}
}
iVar13 = iVar11;
fVar16 = local_9c[2];
joined_r0x000e3042:
iVar11 = iVar13;
puVar15 = puVar15 + 2;
iVar14 = iVar14 + 1;
local_9c[2] = fVar16;
} while (iVar14 != iVar5);
}
param_2[iVar6] = fVar16;
local_a0 = *(float *)this;
}
local_9c[1] = (float)((int)local_9c[1] + 1);
local_9c[0] = (float)((int)local_9c[0] + 0xc);
} while ((int)local_9c[1] < *(int *)((int)local_a0 + 0x114));
}
return;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.