CSpeechScriptBridge::MakeOldResponse
0x0080b810 · 1500 bytes · __thiscall
_ZN19CSpeechScriptBridge15MakeOldResponseEP11AI_ResponsePKNS_17CSpeechResponse_tEf
Decompiled
undefined (4 params)
/* CSpeechScriptBridge::MakeOldResponse(AI_Response*, CSpeechScriptBridge::CSpeechResponse_t const*,
float) */
char __thiscall
CSpeechScriptBridge::MakeOldResponse
(CSpeechScriptBridge *this,AI_Response *param_1,CSpeechResponse_t *param_2,float param_3)
{
HSCRIPT__ *pHVar1;
HSCRIPT__ *pHVar2;
HSCRIPT__ *pHVar3;
bool bVar4;
char cVar5;
char cVar6;
undefined2 uVar7;
undefined4 uVar8;
undefined1 uVar9;
undefined4 *puVar10;
int *piVar11;
float fVar12;
AI_Response *pAVar13;
bool local_79;
HSCRIPT__ *local_78;
float local_74;
HSCRIPT__ *local_70;
HSCRIPT__ *local_6c;
float local_68;
undefined1 local_64 [4];
HSCRIPT__ *local_60;
char *local_5c;
undefined4 local_58;
undefined2 local_54;
ushort local_52;
char *local_50;
undefined4 local_4c;
undefined2 local_48;
ushort local_46;
undefined4 local_44;
undefined2 local_40;
undefined2 local_3e;
short local_3c;
ushort local_3a;
undefined2 local_38;
ushort local_36;
undefined1 local_34;
undefined2 local_33;
undefined2 local_31;
undefined4 local_2f;
undefined4 local_2b;
undefined4 local_27;
undefined4 local_23;
puVar10 = &local_44;
/* try { // try from 0080b829 to 0080b82d has its CatchHandler @ 0080bf26 */
CSpeechResponse_t::CallFunc();
pHVar3 = local_44;
uVar9 = SUB41(puVar10,0);
if (local_3c == 0) {
Warning("Script failed to return response after matching rule.\n",param_2);
LAB_0080b850:
if ((local_3a & 1) != 0) {
free(local_44);
}
return '\0';
}
if (local_3c != 0x20) {
/* try { // try from 0080b84b to 0080b883 has its CatchHandler @ 0080bf0b */
Warning("Script returned a response of inappropriate type %d\n",(int)local_3c);
goto LAB_0080b850;
}
if ((local_3a & 1) != 0) {
free(local_44);
uVar9 = SUB41(local_44,0);
}
local_54 = 0;
local_52 = 0;
local_36 = 0;
local_38 = 100;
local_3c = 0;
local_3a = 0;
local_33 = 0;
local_31 = 0;
local_48 = 0;
local_46 = 0;
local_44 = (HSCRIPT__ *)0x0;
local_40 = 0;
local_3e = 0;
*(float *)(param_1 + 0xb0) = param_3;
local_5c = (char *)0x0;
local_2b = 0;
local_27 = 0;
local_23 = 0;
local_34 = 0;
local_2f = 0;
local_50 = (char *)0x0;
local_78 = (HSCRIPT__ *)0x0;
local_74 = 0.0;
local_60 = (HSCRIPT__ *)0x0;
/* try { // try from 0080b958 to 0080b95c has its CatchHandler @ 0080bf19 */
bVar4 = SafeGet<int>(pHVar3,"kind",(int *)&local_60,(bool)uVar9);
pHVar1 = local_60;
cVar5 = '\0';
if (!bVar4) goto LAB_0080b967;
local_60 = (HSCRIPT__ *)0x0;
/* try { // try from 0080ba27 to 0080ba2b has its CatchHandler @ 0080bee2 */
cVar5 = GetValueToAutoRef((CScriptAutoRef *)&local_60,pHVar3,"func");
pHVar2 = local_60;
if (cVar5 != '\0') {
if (*(int *)(param_1 + 0x84) != 0) {
/* try { // try from 0080baef to 0080bb17 has its CatchHandler @ 0080bee2 */
piVar11 = g_pScriptVM;
(**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,*(int *)(param_1 + 0x84));
uVar9 = SUB41(piVar11,0);
*(undefined4 *)(param_1 + 0x84) = 0;
}
if (pHVar2 != (HSCRIPT__ *)0x0) {
piVar11 = g_pScriptVM;
uVar8 = (**(code **)(*g_pScriptVM + 0x40))(g_pScriptVM,pHVar2);
uVar9 = SUB41(piVar11,0);
*(undefined4 *)(param_1 + 0x84) = uVar8;
}
}
if (local_60 != (HSCRIPT__ *)0x0) {
piVar11 = g_pScriptVM;
(**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,local_60);
uVar9 = SUB41(piVar11,0);
}
if ((pHVar1 == (HSCRIPT__ *)0x3) || (pHVar1 == (HSCRIPT__ *)0x6)) {
if (pHVar1 == (HSCRIPT__ *)0x6) {
if ((local_52 & 1) != 0) {
free(local_5c);
uVar9 = SUB41(local_5c,0);
local_52 = local_52 & 0xfffe;
}
local_58 = 0;
local_54 = 0x1f;
local_5c = "(script)";
}
else {
/* try { // try from 0080ba6d to 0080ba71 has its CatchHandler @ 0080bf19 */
bVar4 = SafeGet<CVariantBase<CVariantDefaultAllocator>>
(pHVar3,"target",(CVariantBase *)&local_5c,(bool)uVar9);
if (!bVar4) goto LAB_0080bb50;
}
local_70 = (HSCRIPT__ *)0x0;
/* try { // try from 0080ba91 to 0080ba95 has its CatchHandler @ 0080bedb */
cVar6 = GetValueToAutoRef((CScriptAutoRef *)&local_70,pHVar3,"rule");
cVar5 = '\0';
if (cVar6 != '\0') {
/* try { // try from 0080bb99 to 0080bb9d has its CatchHandler @ 0080bedb */
bVar4 = SafeGet<CVariantBase<CVariantDefaultAllocator>>
(local_70,"rulename",(CVariantBase *)&local_50,(bool)uVar9);
if (!bVar4) {
if ((local_46 & 1) != 0) {
free(local_50);
uVar9 = SUB41(local_50,0);
local_46 = local_46 & 0xfffe;
}
local_4c = 0;
local_48 = 0x1f;
local_50 = "(broken)";
}
local_6c = (HSCRIPT__ *)0x0;
/* try { // try from 0080bbe0 to 0080bbe4 has its CatchHandler @ 0080bed4 */
cVar5 = GetValueToAutoRef((CScriptAutoRef *)&local_6c,pHVar3,"params");
if (cVar5 != '\0') {
/* try { // try from 0080bc1f to 0080bd5e has its CatchHandler @ 0080bed4 */
bVar4 = SafeGet<float>(local_6c,"predelay",&local_68,(bool)uVar9);
if (bVar4) {
local_36 = local_36 | 0x100;
fVar12 = local_68;
local_31 = float16::ConvertFloatTo16bits(local_68);
uVar9 = SUB41(fVar12,0);
}
bVar4 = SafeGet<float>(local_6c,"delay",&local_68,(bool)uVar9);
if (bVar4) {
local_36 = local_36 | 1;
fVar12 = local_68;
uVar7 = float16::ConvertFloatTo16bits(local_68);
uVar9 = SUB41(fVar12,0);
local_44 = (HSCRIPT__ *)CONCAT22(uVar7,(undefined2)local_44);
}
bVar4 = SafeGet<bool>(local_6c,"speakonce",&local_79,(bool)uVar9);
if ((bVar4) && (local_79 != false)) {
local_36 = local_36 | 2;
}
bVar4 = SafeGet<bool>(local_6c,"noscene",&local_79,(bool)uVar9);
if ((bVar4) && (local_79 != false)) {
local_36 = local_36 | 0x20;
}
bVar4 = SafeGet<bool>(local_6c,"stop_on_nonidle",&local_79,(bool)uVar9);
if (bVar4) {
uVar9 = 0x2c;
Warning();
}
bVar4 = SafeGet<int>(local_6c,"odds",(int *)local_64,(bool)uVar9);
if (bVar4) {
local_38 = local_64._0_2_;
}
else {
local_38 = 1;
}
bVar4 = SafeGet<float>(local_6c,"respeakdelay",&local_68,(bool)uVar9);
if (bVar4) {
local_3e = float16::ConvertFloatTo16bits(local_68);
uVar9 = SUB41(local_68,0);
}
bVar4 = SafeGet<int>(local_6c,"soundlevel",(int *)local_64,(bool)uVar9);
if (bVar4) {
local_34 = local_64[0];
}
pAVar13 = param_1;
AI_Response::Init(param_1,pHVar1,local_5c,&local_44,local_50,0,0);
uVar9 = SUB41(pAVar13,0);
local_60 = (HSCRIPT__ *)0x0;
/* try { // try from 0080bd71 to 0080bd75 has its CatchHandler @ 0080be17 */
cVar6 = GetValueToAutoRef((CScriptAutoRef *)&local_60,local_6c,"followup");
if (cVar6 != '\0') {
/* try { // try from 0080bdbc to 0080be11 has its CatchHandler @ 0080be17 */
cVar6 = GetValueToAutoRef((CScriptAutoRef *)&local_78,local_60,"func");
if ((cVar6 == '\0') ||
(bVar4 = SafeGet<float>(local_60,"delay",&local_74,(bool)uVar9), !bVar4)) {
Warning("Script response in rule %s had a \'followup\' parameter, but it didn\'t have \'func\' and \'delay\' keys"
,local_50);
}
else {
AI_Response::SetScriptFollowup(param_1,local_78,local_60,local_74);
}
}
if (local_60 != (HSCRIPT__ *)0x0) {
(**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,local_60);
local_60 = (HSCRIPT__ *)0x0;
}
}
if (local_6c != (HSCRIPT__ *)0x0) {
(**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,local_6c);
local_6c = (HSCRIPT__ *)0x0;
}
}
if (local_70 != (HSCRIPT__ *)0x0) {
(**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,local_70);
local_70 = (HSCRIPT__ *)0x0;
}
}
else {
/* try { // try from 0080bb4b to 0080bb4f has its CatchHandler @ 0080bf19 */
Warning("Unsupported response type %d",pHVar1);
LAB_0080bb50:
cVar5 = '\0';
}
LAB_0080b967:
if (local_78 != (HSCRIPT__ *)0x0) {
(**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,local_78);
local_78 = (HSCRIPT__ *)0x0;
}
if ((local_46 & 1) != 0) {
free(local_50);
local_46 = local_46 & 0xfffe;
}
local_50 = (char *)0x0;
local_4c = 0;
local_48 = 0;
AI_ResponseParams::ScriptFollowup_t::Release((ScriptFollowup_t *)&local_2b);
if ((local_52 & 1) != 0) {
free(local_5c);
local_52 = local_52 & 0xfffe;
}
local_5c = (char *)0x0;
local_58 = 0;
local_54 = 0;
if (pHVar3 == (HSCRIPT__ *)0x0) {
return cVar5;
}
(**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,pHVar3);
return cVar5;
}
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.