CResponseSystem::SelectWeightedResponseFromResponseGroup
0x005b6da0 · 1311 bytes · __thiscall
_ZN15CResponseSystem39SelectWeightedResponseFromResponseGroupEP13ResponseGroupP15IResponseFilter
Decompiled
undefined (3 params)
/* CResponseSystem::SelectWeightedResponseFromResponseGroup(ResponseGroup*, IResponseFilter*) */
int __thiscall
CResponseSystem::SelectWeightedResponseFromResponseGroup
(CResponseSystem *this,ResponseGroup *param_1,IResponseFilter *param_2)
{
ResponseGroup *pRVar1;
ResponseGroup RVar2;
ResponseGroup RVar3;
ushort uVar4;
byte bVar5;
char cVar6;
int iVar7;
int iVar8;
int iVar9;
int iVar10;
longdouble lVar11;
longdouble lVar12;
float fVar13;
float fVar14;
byte local_34;
byte local_21;
int local_20;
iVar9 = *(int *)(param_1 + 8);
if (iVar9 == 0) {
return -1;
}
FakeDepletes(this,param_1,param_2);
local_21 = (byte)param_1[0x13] & 1;
if (((byte)param_1[0x13] & 1) == 0) {
RVar2 = param_1[0x12];
}
else {
iVar10 = *(int *)(param_1 + 8);
if (iVar10 < 1) {
RVar3 = param_1[0x12];
LAB_005b6e1b:
param_1[0x12] = (ResponseGroup)((char)RVar3 + '\x01');
FakeDepletes(this,param_1,param_2);
RVar2 = param_1[0x13];
local_34 = (byte)RVar2 & 1;
if (((byte)RVar2 & 1) != 0) {
if (*(int *)(param_1 + 8) < 1) {
return -1;
}
RVar3 = *(ResponseGroup *)(*(int *)param_1 + 0x2e);
if (RVar3 == param_1[0x12]) {
iVar8 = 0;
iVar10 = *(int *)param_1;
do {
iVar8 = iVar8 + 1;
if (iVar8 == *(int *)(param_1 + 8)) {
return -1;
}
pRVar1 = (ResponseGroup *)(iVar10 + 0x7e);
iVar10 = iVar10 + 0x50;
} while (*pRVar1 == RVar3);
}
}
if (((byte)RVar2 & 0x10) != 0) {
param_1[0x10] = (ResponseGroup)0x0;
return -1;
}
RVar2 = param_1[0x12];
if (local_34 == 0) {
local_21 = 0;
}
else {
iVar10 = *(int *)(param_1 + 8);
if (0 < iVar10) goto LAB_005b7067;
}
}
else {
RVar2 = param_1[0x12];
RVar3 = *(ResponseGroup *)(*(int *)param_1 + 0x2e);
if (RVar3 == RVar2) {
iVar7 = 0;
iVar8 = *(int *)param_1;
do {
iVar7 = iVar7 + 1;
if (iVar7 == iVar10) goto LAB_005b6e1b;
pRVar1 = (ResponseGroup *)(iVar8 + 0x7e);
iVar8 = iVar8 + 0x50;
} while (*pRVar1 == RVar3);
}
LAB_005b7067:
iVar8 = *(int *)param_1;
local_20 = 0;
iVar7 = iVar8;
do {
if ((RVar2 != *(ResponseGroup *)(iVar7 + 0x2e)) && ((*(byte *)(iVar7 + 0x2f) & 0x40) != 0))
{
if (local_20 == -1) goto LAB_005b6e97;
goto LAB_005b711d;
}
local_20 = local_20 + 1;
iVar7 = iVar7 + 0x50;
} while (local_20 != iVar10);
local_20 = 0;
iVar7 = iVar8;
do {
if ((RVar2 != *(ResponseGroup *)(iVar7 + 0x2e)) && (*(char *)(iVar7 + 0x2f) < '\0')) {
iVar7 = 0;
iVar10 = iVar8;
if (iVar9 < 1) goto LAB_005b711d;
goto LAB_005b70f0;
}
local_20 = local_20 + 1;
iVar7 = iVar7 + 0x50;
} while (local_20 < iVar10);
}
}
LAB_005b6e97:
if (0 < iVar9) {
iVar8 = *(int *)param_1;
LAB_005b6ea4:
fVar13 = 0.0;
iVar10 = 0;
local_20 = -1;
do {
iVar8 = iVar8 + iVar10 * 0x50;
iVar7 = local_20;
if ((local_21 == 0) ||
((*(ResponseGroup *)(iVar8 + 0x2e) != RVar2 && (-1 < *(char *)(iVar8 + 0x2f))))) {
uVar4 = *(ushort *)(iVar8 + 0x2c);
if (fVar13 == 0.0) {
iVar7 = iVar10;
}
if ((uVar4 & 0x7fff) == 0x7c00) {
fVar14 = 65504.0;
if ((short)uVar4 < 0) {
fVar14 = -65504.0;
}
}
else {
bVar5 = (byte)(uVar4 >> 8);
if ((bVar5 & 0x7c) == 0x7c) {
fVar14 = 0.0;
if ((uVar4 & 0x3ff) == 0) goto LAB_005b723d;
}
else if (((uVar4 & 0x7c00) == 0) && ((uVar4 & 0x3ff) != 0)) {
fVar14 = 1.0;
if ((short)uVar4 < 0) {
fVar14 = -1.0;
}
fVar14 = ((float)(uVar4 & 0x3ff) + 0.0) * 5.9604645e-08 * fVar14;
}
else {
LAB_005b723d:
fVar14 = (float)((uVar4 & 0x3ff) << 0xd | (uint)(bVar5 >> 7) << 0x1f |
((uVar4 >> 10 & 0x1f) + 0x70) * (uint)((uVar4 >> 10 & 0x1f) != 0) *
0x800000);
}
}
fVar13 = fVar13 + fVar14;
if (fVar13 == 0.0) {
LAB_005b6f8b:
iVar7 = iVar10;
}
else {
lVar11 = (longdouble)(**(code **)(*random_valve + 4))(random_valve,0,fVar13);
lVar12 = (longdouble)float16::Convert16bitFloatTo32bits(*(ushort *)(iVar8 + 0x2c));
if ((float)lVar11 < (float)lVar12) goto LAB_005b6f8b;
}
if ((((local_21 != 1) && (iVar7 != local_20)) && (param_2 != (IResponseFilter *)0x0)) &&
(cVar6 = (*(code *)**(undefined4 **)param_2)
(param_2,*(byte *)(iVar8 + 0x2f) & 0x3f,*(undefined4 *)(iVar8 + 0x28))
, cVar6 == '\0')) {
lVar11 = (longdouble)float16::Convert16bitFloatTo32bits(*(ushort *)(iVar8 + 0x2c));
fVar13 = fVar13 - (float)lVar11;
iVar7 = local_20;
}
}
local_20 = iVar7;
if (iVar10 + 1 == iVar9) goto LAB_005b71e7;
iVar10 = iVar10 + 1;
iVar8 = *(int *)param_1;
} while( true );
}
local_20 = -1;
goto LAB_005b7130;
LAB_005b71e7:
if (((local_20 == -1) || (((byte)param_1[0x13] & 1) == 0)) || (local_20 < 0)) goto LAB_005b7130;
goto LAB_005b720c;
while( true ) {
iVar7 = iVar7 + 1;
iVar10 = iVar10 + 0x50;
if (iVar7 == iVar9) break;
LAB_005b70f0:
if ((*(ResponseGroup *)(iVar10 + 0x2e) != RVar2) && (-1 < *(char *)(iVar10 + 0x2f))) {
if (iVar7 < iVar9) goto LAB_005b6ea4;
break;
}
}
LAB_005b711d:
if (((byte)param_1[0x13] & 1) == 0) goto LAB_005b7130;
LAB_005b720c:
if (local_20 < *(int *)(param_1 + 8)) {
*(ResponseGroup *)(local_20 * 0x50 + *(int *)param_1 + 0x2e) = param_1[0x12];
}
LAB_005b7130:
iVar9 = 0;
if (0 < *(int *)(this + 0x38c0)) {
do {
iVar10 = iVar9 * 4;
iVar9 = iVar9 + 1;
*(undefined1 *)(*(int *)(*(int *)(this + 0x38b4) + iVar10) * 0x50 + *(int *)param_1 + 0x2e) =
0;
} while (iVar9 < *(int *)(this + 0x38c0));
}
*(undefined4 *)(this + 0x38c0) = 0;
return local_20;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.