/*
===========================================================================
ARX FATALIS GPL Source Code
Copyright (C) 1999-2010 Arkane Studios SA, a ZeniMax Media company.
This file is part of the Arx Fatalis GPL Source Code ('Arx Fatalis Source Code').
Arx Fatalis Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Arx Fatalis Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with Arx Fatalis Source Code. If not, see
.
In addition, the Arx Fatalis Source Code is also subject to certain additional terms. You should have received a copy of these
additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Arx
Fatalis Source Code. If not, please request a copy in writing from Arkane Studios at the address below.
If you have questions concerning this license or the applicable additional terms, you may contact in writing Arkane Studios, c/o
ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
===========================================================================
*/
#include
#include
#include
#include
#include "..\DANAE_Debugger\SCRIPT_DEBUGGER_Dialog.h"
#include "arx_interactive.h"
#include "arx_time.h"
#include "eeriepoly.h"
#include
#define _CRTDBG_MAP_ALLOC
#include
typedef void (APIENTRY * CREATEDIALOG)(HWND, ScriptDebuggerInfos &);
typedef void (APIENTRY * SETPARAMS)(ScriptDebuggerInfos &);
typedef bool (APIENTRY * DD_EXISTS)();
typedef void (APIENTRY * DD_KILL)();
typedef void (APIENTRY * DD_GETPARAMS)(ScriptDebuggerUpdate &);
typedef unsigned long(APIENTRY * DD_GETVERSION)();
CREATEDIALOG DD_DebugDialog = NULL;
SETPARAMS DD_SetParams = NULL;
DD_EXISTS DD_Exists = NULL;
DD_KILL DD_Kill = NULL;
DD_GETPARAMS DD_GetParams = NULL;
DD_GETVERSION DD_GetVersion = NULL;
void DANAE_DEBUGGER_Launch(HWND hWnd)
{
HMODULE hm = LoadLibrary("ARX_SCRIPT_DEBUGGER");
if (!(DD_GetVersion = (DD_GETVERSION) GetProcAddress(hm, "SCRIPT_DEBUGGER_GetVersion"))) goto invalid;
unsigned long version;
version = DD_GetVersion();
if (version != MAKELONG(1, 0)) goto invalid;
if (!(DD_DebugDialog = (CREATEDIALOG) GetProcAddress(hm, "SCRIPT_DEBUGGER_CreateDialog"))) goto invalid;
if (!(DD_SetParams = (SETPARAMS) GetProcAddress(hm, "SCRIPT_DEBUGGER_SetParams"))) goto invalid;
if (!(DD_Exists = (DD_EXISTS) GetProcAddress(hm, "SCRIPT_DEBUGGER_WindowOpened"))) goto invalid;
if (!(DD_Kill = (DD_KILL) GetProcAddress(hm, "SCRIPT_DEBUGGER_Destroy"))) goto invalid;
if (!(DD_GetParams = (DD_GETPARAMS) GetProcAddress(hm, "SCRIPT_DEBUGGER_GetParams"))) goto invalid;
printf("%lu\n", GetLastError());
printf("yo\n");
if (DD_DebugDialog)
{
ScriptDebuggerInfos s;
memset(&s, 0, sizeof(ScriptDebuggerInfos));
DD_DebugDialog(hWnd, s);
}
return;
invalid:
;
ShowPopup("ARX_SCRIPT_DEBUGGER: Invalid DLL version.");
return;
}
long NEED_DEBUGGER_CLEAR;
extern long LastSelectedIONum;
extern INTERACTIVE_OBJ * IO_DEBUG;
void DANAE_DEBUGGER_Update()
{
static INTERACTIVE_OBJ * lastio = NULL;
static long MODIFFF = 1;
if (!DD_Exists) return;
if (!DD_Exists()) return;
int i;
char buffer[20];
ScriptDebuggerUpdate su;
memset(&su, 0, sizeof(ScriptDebuggerUpdate));
char p1[256];
char p2[256];
char p3[256];
char p4[256];
su.globalVar.lpszVarName = p1;
su.globalVar.lpszVarValue = p2;
su.localVar.lpszVarName = p3;
su.localVar.lpszVarValue = p4;
DD_GetParams(su);
ScriptDebuggerInfos s;
memset(&s, 0, sizeof(ScriptDebuggerInfos));
INTERACTIVE_OBJ * io;
if (ValidIONum(LastSelectedIONum))
io = inter.iobj[LastSelectedIONum];
else io = NULL;
IO_DEBUG = io;
if (lastio != io)
{
NEED_DEBUGGER_CLEAR = 1;
memset(&s, 0, sizeof(ScriptDebuggerInfos));
s.lpszObjName = strdup("No Object Selected");
DD_SetParams(s);
free(s.lpszObjName);
MODIFFF = 1;
}
lastio = io;
if (NEED_DEBUGGER_CLEAR)
{
s.bClear = 1;
NEED_DEBUGGER_CLEAR = 0;
}
if (LastSelectedIONum < 0)
{
memset(&s, 0, sizeof(ScriptDebuggerInfos));
s.lpszObjName = strdup("No Object Selected");
DD_SetParams(s);
free(s.lpszObjName);
goto suite;
}
if ((ARXPausedTimer) && (!MODIFFF)) goto suite;
MODIFFF = 0;
char temp[256];
sprintf(temp, "%s_%04d", GetName(io->filename), io->ident);
s.lpszObjName = strdup(temp);
sprintf(buffer, "%5.0f", io->pos.x);
s.p3ObjPos[0] = strdup(buffer);
sprintf(buffer, "%5.0f", io->pos.y);
s.p3ObjPos[1] = strdup(buffer);
sprintf(buffer, "%5.0f", io->pos.z);
s.p3ObjPos[2] = strdup(buffer);
INTERACTIVE_OBJ * tio;
tio = NULL;
if (ValidIONum(io->targetinfo))
tio = inter.iobj[io->targetinfo];
else if (io->targetinfo == -2)
tio = io;
if (tio)
{
sprintf(temp, "%s_%04d", GetName(tio->filename), tio->ident);
s.lpszTargetName = strdup(temp);
sprintf(buffer, "%5.0f", tio->pos.x);
s.p3TargetPos[0] = strdup(buffer);
sprintf(buffer, "%5.0f", tio->pos.y);
s.p3TargetPos[1] = strdup(buffer);
sprintf(buffer, "%5.0f", tio->pos.z);
s.p3TargetPos[2] = strdup(buffer);
}
else
{
s.lpszTargetName = strdup("None");
s.p3TargetPos[0] = strdup(" ");
s.p3TargetPos[1] = strdup(" ");
s.p3TargetPos[2] = strdup(" ");
}
if (su.bVariables)
{
s.iNbGlobals = NB_GLOBALS;
Vars * vg;
vg = NULL;
if (s.iNbGlobals)
{
vg = new Vars[s.iNbGlobals];
for (i = 0; i < s.iNbGlobals; i++)
{
vg[i].lpszVarName = strdup(svar[i].name);
switch (svar[i].type)
{
case TYPE_G_TEXT:
vg[i].lpszVarValue = strdup(svar[i].text);
break;
case TYPE_G_LONG:
sprintf(temp, "%d", svar[i].ival);
vg[i].lpszVarValue = strdup(temp);
break;
case TYPE_G_FLOAT:
sprintf(temp, "%f", svar[i].fval);
vg[i].lpszVarValue = strdup(temp);
break;
default:
sprintf(temp, " ");
vg[i].lpszVarValue = strdup(temp);
break;
}
}
}
s.pGlobalVars = vg;
EERIE_SCRIPT * es;
es = &io->script;
s.iNbLocals = es->nblvar;
Vars * vl;
vl = NULL;
if (s.iNbLocals)
{
vl = new Vars[s.iNbLocals];
for (i = 0; i < s.iNbLocals; i++)
{
vl[i].lpszVarName = strdup(es->lvar[i].name);
switch (es->lvar[i].type)
{
case TYPE_L_TEXT:
sprintf(temp, "%s", es->lvar[i].text);
vl[i].lpszVarValue = strdup(temp);
break;
case TYPE_L_LONG:
sprintf(temp, "%d", es->lvar[i].ival);
vl[i].lpszVarValue = strdup(temp);
break;
case TYPE_L_FLOAT:
sprintf(temp, "%f", es->lvar[i].fval);
vl[i].lpszVarValue = strdup(temp);
break;
default:
sprintf(temp, " ");
vl[i].lpszVarValue = strdup(temp);
break;
}
}
}
s.pLocalVars = vl;
}
if (io->ioflags & IO_NPC)
{
if (io->_npcdata->behavior & BEHAVIOUR_MOVE_TO)
strcpy(temp, "MOVE_TO");
else if (io->_npcdata->behavior & BEHAVIOUR_GO_HOME)
strcpy(temp, "GO_HOME");
else if (io->_npcdata->behavior & BEHAVIOUR_FLEE)
strcpy(temp, "FLEE");
else if (io->_npcdata->behavior & BEHAVIOUR_LOOK_FOR)
strcpy(temp, "LOOK_FOR");
else if (io->_npcdata->behavior & BEHAVIOUR_HIDE)
strcpy(temp, "HIDE");
else if (io->_npcdata->behavior & BEHAVIOUR_WANDER_AROUND)
strcpy(temp, "WANDER_AROUND");
else if (io->_npcdata->behavior & BEHAVIOUR_GUARD)
strcpy(temp, "GUARD");
else if (io->_npcdata->behavior & BEHAVIOUR_FRIENDLY)
strcpy(temp, "FRIENDLY");
else strcpy(temp, "NONE");
if (io->_npcdata->behavior & BEHAVIOUR_LOOK_AROUND)
strcat(temp, " Look_Around");
if (io->_npcdata->behavior & BEHAVIOUR_SNEAK)
strcat(temp, " Sneak");
if (io->_npcdata->behavior & BEHAVIOUR_DISTANT)
strcat(temp, " Distant");
if (io->_npcdata->behavior & BEHAVIOUR_FIGHT)
strcat(temp, " Fight");
if (io->_npcdata->behavior & BEHAVIOUR_MAGIC)
strcat(temp, " Magic");
s.lpszBehavior = strdup(temp);
}
else
{
s.lpszBehavior = strdup("Not an NPC...");
}
s.bEvents = false;
if (su.bEvents)
{
s.bEvents = true;
s.lpszEvents = (char *) malloc(BIG_DEBUG_POS + 1);
memcpy(s.lpszEvents, BIG_DEBUG_STRING, BIG_DEBUG_POS + 1);
BIG_DEBUG_POS = 0;
BIG_DEBUG_STRING[0] = 0;
}
long count;
count = 0;
for (i = 0; i < MAX_TIMER_SCRIPT; i++)
{
if ((scr_timer[i].exist) && (scr_timer[i].io == io))
count++;
}
s.bTimers = false;
s.lpszTimers = NULL;
if (su.bTimers)
{
s.bTimers = true;
char buf[16000];
ZeroMemory(buf, 16000);
long num;
num = 0;
for (i = 0; i < MAX_TIMER_SCRIPT; i++)
{
if ((scr_timer[i].exist) && (scr_timer[i].io == io))
{
sprintf(temp, "%s %d %dms\r\n", scr_timer[i].name, scr_timer[i].times, scr_timer[i].msecs);
strcat(buf, temp);
}
}
s.lpszTimers = strdup(buf);
}
DD_SetParams(s);
if (s.lpszObjName) free(s.lpszObjName);
if (s.p3ObjPos[0]) free(s.p3ObjPos[0]);
if (s.p3ObjPos[1]) free(s.p3ObjPos[1]);
if (s.p3ObjPos[2]) free(s.p3ObjPos[2]);
if (s.lpszTargetName) free(s.lpszTargetName);
if (s.p3TargetPos[0]) free(s.p3TargetPos[0]);
if (s.p3TargetPos[1]) free(s.p3TargetPos[1]);
if (s.p3TargetPos[2]) free(s.p3TargetPos[2]);
if (su.bVariables)
{
for (i = 0; i < s.iNbGlobals; i++)
{
if (s.pGlobalVars[i].lpszVarName) free(s.pGlobalVars[i].lpszVarName);
if (s.pGlobalVars[i].lpszVarValue) free(s.pGlobalVars[i].lpszVarValue);
}
if (s.iNbGlobals) delete [] s.pGlobalVars;
for (i = 0; i < s.iNbLocals; i++)
{
if (s.pLocalVars[i].lpszVarName) free(s.pLocalVars[i].lpszVarName);
if (s.pLocalVars[i].lpszVarValue) free(s.pLocalVars[i].lpszVarValue);
}
if (s.iNbLocals) delete [] s.pLocalVars;
}
if (s.lpszBehavior) free(s.lpszBehavior);
if (s.bEvents)
{
if (s.lpszEvents) free(s.lpszEvents);
}
if (s.bTimers)
{
if (s.lpszTimers) free(s.lpszTimers);
}
suite:
;
if (su.bPause)
{
if (!ARXPausedTimer)
{
ARX_TIME_Pause();
}
else
{
ARX_TIME_UnPause();
}
}
if (su.bStep)
{
if (ARXPausedTimer)
{
ARXTotalPausedTime -= 100;
MODIFFF = 1;
}
}
if (su.bUpdateGlobalVar)
{
ARX_SCRIPT_SetVar(NULL, su.globalVar.lpszVarName, su.globalVar.lpszVarValue);
MODIFFF = 1;
}
if ((su.bUpdateLocalVar) && (io))
{
ARX_SCRIPT_SetVar(io, su.localVar.lpszVarName, su.localVar.lpszVarValue);
MODIFFF = 1;
}
}