/*
===========================================================================
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.
===========================================================================
*/
// version 0.1
// Script Debugger
// jeudi 28 juin 2001
// merge + rajout check variables
// fix sort + speed
// mercredi 27 juin 2001
// fixs + merge
// mardi 26 juin 2001
// merge + fix + interface revue
// events combo -> edit multiline
// timers combo -> edit multiline
// lundi 25 juin 2001
// ok done + waiting to merge + no memory leak
// vendredi 22 juin
// fix + memory check
// + tests memory leak + patch
// jeudi 21 juin
// points d'entrée
// mercredi 20 juin
// création DLL
// interface
//-----------------------------------------------------------------------------
#include "SCRIPT_DEBUGGER_Dialog.h"
#include
#include
#ifndef __RESOURCE_H
#include "Resource.h"
#endif
HINSTANCE ghInstance;
HWND ghDialog;
char GlobalName[128];
char LocalName[128];
bool gbDialog = false;
BOOL CALLBACK SCRIPT_DEBUGGER_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
ScriptDebuggerUpdate sdu;
//
// tsu
//-----------------------------------------------------------------------------
struct info
{
HWND hObjName;
HWND hObjPos[3];
HWND hTargetName;
HWND hTargetPos[3];
HWND hVariablesEnabled;
HWND hGlobals;
HWND hGlobalEdit;
HWND hLocals;
HWND hLocalEdit;
HWND hBehavior;
HWND hEventsEnabled;
HWND hEvents;
HWND hTimersEnabled;
HWND hTimers;
};
info iInfo;
//-----------------------------------------------------------------------------
void InitList(HWND _hwnd)
{
SendMessage(_hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM) LVS_EX_GRIDLINES);
LVCOLUMN lvc;
// Initialize the LVCOLUMN structure.
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;// | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = 145;//75
lvc.pszText = "Name";
SendMessage(_hwnd, LVM_INSERTCOLUMN, 0, (LPARAM) &lvc);
lvc.cx = 50;//75
lvc.pszText = "Value";
SendMessage(_hwnd, LVM_INSERTCOLUMN, 1, (LPARAM) &lvc);
}
//-----------------------------------------------------------------------------
void InsertItem(HWND _hwnd, char * _name, char * _value)
{
LVITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.pszText = "Should not be seen";
lvi.iItem = 1;
lvi.iSubItem = 0;
lvi.lParam = (LPARAM) strdup(_name);
int r = SendMessage(_hwnd, LVM_INSERTITEM, 0, (LPARAM)(const LV_ITEM FAR *)(&lvi));
ListView_SetItemText(_hwnd, r, 0, _name);
ListView_SetItemText(_hwnd, r, 1, _value);
}
//-----------------------------------------------------------------------------
BOOL CALLBACK SCRIPT_DEBUGGER_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
case WM_INITDIALOG:
{
//-------------------------------------------------------------------------
iInfo.hObjName = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_EDIT_OBJ_NAME);
iInfo.hObjPos[0] = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_EDIT_OBJ_POSX);
iInfo.hObjPos[1] = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_EDIT_OBJ_POSY);
iInfo.hObjPos[2] = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_EDIT_OBJ_POSZ);
iInfo.hTargetName = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_EDIT_TARGET_NAME);
iInfo.hTargetPos[0] = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_EDIT_TARGET_POSX);
iInfo.hTargetPos[1] = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_EDIT_TARGET_POSY);
iInfo.hTargetPos[2] = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_EDIT_TARGET_POSZ);
iInfo.hVariablesEnabled = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_CHECK_VARIABLES);
iInfo.hGlobals = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_LIST_GLOBALS);
iInfo.hGlobalEdit = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_EDIT_GLOBAL);
iInfo.hLocals = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_LIST_LOCALS);
iInfo.hLocalEdit = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_EDIT_LOCAL);
iInfo.hBehavior = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_EDIT_BEHAVIOR);
iInfo.hEventsEnabled = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_CHECK_EVENTS);
iInfo.hEvents = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_EDIT_EVENTS);
iInfo.hTimersEnabled = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_CHECK_TIMERS);
iInfo.hTimers = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_EDIT_TIMERS);
SendMessage(iInfo.hVariablesEnabled, BM_SETCHECK, (WPARAM) true, (LPARAM) 0);
SendMessage(iInfo.hEventsEnabled, BM_SETCHECK, (WPARAM) true, (LPARAM) 0);
SendMessage(iInfo.hTimersEnabled, BM_SETCHECK, (WPARAM) true, (LPARAM) 0);
HWND hwnd = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_LIST_GLOBALS);
InitList(hwnd);
hwnd = GetDlgItem(hWnd, IDC_SCRIPT_DEBUGGER_LIST_LOCALS);
InitList(hwnd);
}
break;
case WM_NOTIFY:
{
NMHDR * mf = (NMHDR *) lParam;
if (mf->code == NM_CLICK)
{
LPNMITEMACTIVATE lpnmitem = (LPNMITEMACTIVATE) lParam;
char name[256];
char value[256];
if (lpnmitem->iItem >= 0)
if (lpnmitem->iItem < ListView_GetItemCount(mf->hwndFrom))
{
ListView_GetItemText(mf->hwndFrom, lpnmitem->iItem, 0, name, 256);
ListView_GetItemText(mf->hwndFrom, lpnmitem->iItem, 1, value, 256);
if (mf->hwndFrom == iInfo.hGlobals)
{
strcpy(GlobalName, name);
}
else if (mf->hwndFrom == iInfo.hLocals)
{
strcpy(LocalName, name);
}
if (mf->hwndFrom == iInfo.hGlobals)
SendMessage(iInfo.hGlobalEdit, WM_SETTEXT, 0, (LPARAM) value);
if (mf->hwndFrom == iInfo.hLocals)
SendMessage(iInfo.hLocalEdit, WM_SETTEXT, 0, (LPARAM) value);
}
}
sdu.bVariables = false;
int iRes = SendMessage(iInfo.hVariablesEnabled, BM_GETCHECK, 0, 0);
if (iRes == BST_CHECKED) sdu.bVariables = true;
sdu.bEvents = false;
iRes = SendMessage(iInfo.hEventsEnabled, BM_GETCHECK, 0, 0);
if (iRes == BST_CHECKED) sdu.bEvents = true;
sdu.bTimers = false;
iRes = SendMessage(iInfo.hTimersEnabled, BM_GETCHECK, 0, 0);
if (iRes == BST_CHECKED) sdu.bTimers = true;
}
break;
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_SCRIPT_DEBUGGER_BUTTON_PAUSE:
{
sdu.bPause = true;
}
break;
case IDC_SCRIPT_DEBUGGER_BUTTON_STEP:
{
sdu.bStep = true;
}
break;
case IDC_SCRIPT_DEBUGGER_BUTTON_GLOBAL_UPDATE:
{
sdu.bUpdateGlobalVar = true;
}
break;
case IDC_SCRIPT_DEBUGGER_BUTTON_LOCAL_UPDATE:
{
sdu.bUpdateLocalVar = true;
}
break;
default:
{
//SCRIPT_DEBUGGER_Update_Params();
} break;
}
sdu.bVariables = false;
int iRes = SendMessage(iInfo.hVariablesEnabled, BM_GETCHECK, 0, 0);
if (iRes == BST_CHECKED) sdu.bVariables = true;
sdu.bEvents = false;
iRes = SendMessage(iInfo.hEventsEnabled, BM_GETCHECK, 0, 0);
if (iRes == BST_CHECKED) sdu.bEvents = true;
sdu.bTimers = false;
iRes = SendMessage(iInfo.hTimersEnabled, BM_GETCHECK, 0, 0);
if (iRes == BST_CHECKED) sdu.bTimers = true;
}
break;
case WM_CLOSE:
case WM_DESTROY:
{
//PostQuitMessage(0);
gbDialog = false;
Sleep(100);
EndDialog(hWnd, TRUE);
}
break;
default:
return FALSE;
//DefWindowProc(hWnd, uMsg, wParam, lParam);
break;
}
return TRUE;
}
//-----------------------------------------------------------------------------
BOOL WINAPI DllMain(HINSTANCE _hModule, DWORD _fdwreason, LPVOID _lpReserved)
//-----------------------------------------------------------------------------
{
switch (_fdwreason)
{
case DLL_PROCESS_ATTACH:
{
// Récupération du handle d'Instance du Module
InitCommonControls();
ghInstance = _hModule;
break;
}
}
return TRUE;
}
//-----------------------------------------------------------------------------
LPSTR APIFUNC SCRIPT_DEBUGGER_GetName()
{
return "SCRIPT DEBUGGER";
}
//-----------------------------------------------------------------------------
unsigned long APIFUNC SCRIPT_DEBUGGER_GetVersion()
{
return MAKELONG(1, 0);
}
//-----------------------------------------------------------------------------
void APIFUNC SCRIPT_DEBUGGER_CreateDialog(HWND _hWindow, ScriptDebuggerInfos & _s)
{
if (!gbDialog)
{
ZeroMemory(&iInfo, sizeof(info));
long dw = GetLastError();
ghDialog = CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_SCRIPT_DEBUGGER), _hWindow, (DLGPROC) SCRIPT_DEBUGGER_Proc);
dw = GetLastError();
ShowWindow(ghDialog, SW_SHOW);
sdu.bPause = false;
sdu.bStep = false;
sdu.bUpdateGlobalVar = false;
sdu.bUpdateLocalVar = false;
sdu.bVariables = true;
sdu.bEvents = true;
sdu.bTimers = true;
gbDialog = true;
}
}
//-----------------------------------------------------------------------------
int CALLBACK MyCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
char * a = (char *) lParam1;
char * b = (char *) lParam2;
return strcmp(a, b);
}
//-----------------------------------------------------------------------------
void APIFUNC SCRIPT_DEBUGGER_SetParams(ScriptDebuggerInfos & _s)
{
if (_s.bClear)
{
_s.bClear = false;
SendMessage(iInfo.hGlobals, LVM_DELETEALLITEMS, 0, 0);
SendMessage(iInfo.hLocals, LVM_DELETEALLITEMS, 0, 0);
SendMessage(iInfo.hObjName, WM_SETTEXT, 0, (LPARAM) "");
SendMessage(iInfo.hTargetName, WM_SETTEXT, 0, (LPARAM) "");
SendMessage(iInfo.hTargetPos[0], WM_SETTEXT, 0, (LPARAM) "");
SendMessage(iInfo.hTargetPos[1], WM_SETTEXT, 0, (LPARAM) "");
SendMessage(iInfo.hTargetPos[2], WM_SETTEXT, 0, (LPARAM) "");
SendMessage(iInfo.hBehavior, WM_SETTEXT, 0, (LPARAM) "");
SendMessage(iInfo.hTimers, WM_SETTEXT, (WPARAM) 0, (LPARAM) "");
SendMessage(iInfo.hEvents, WM_SETTEXT, (WPARAM) 0, (LPARAM) "");
}
int i;
SendMessage(iInfo.hObjName, WM_SETTEXT, 0, (LPARAM) _s.lpszObjName);
SendMessage(iInfo.hObjPos[0], WM_SETTEXT, 0, (LPARAM) _s.p3ObjPos[0]);
SendMessage(iInfo.hObjPos[1], WM_SETTEXT, 0, (LPARAM) _s.p3ObjPos[1]);
SendMessage(iInfo.hObjPos[2], WM_SETTEXT, 0, (LPARAM) _s.p3ObjPos[2]);
SendMessage(iInfo.hTargetName, WM_SETTEXT, 0, (LPARAM) _s.lpszTargetName);
SendMessage(iInfo.hTargetPos[0], WM_SETTEXT, 0, (LPARAM) _s.p3TargetPos[0]);
SendMessage(iInfo.hTargetPos[1], WM_SETTEXT, 0, (LPARAM) _s.p3TargetPos[1]);
SendMessage(iInfo.hTargetPos[2], WM_SETTEXT, 0, (LPARAM) _s.p3TargetPos[2]);
//SendMessage(iInfo.hGlobals, LVM_DELETEALLITEMS, 0, 0);
if (sdu.bVariables)
{
// Global Vars
for (i = 0; i < _s.iNbGlobals; i++)
{
int t = -1;
char buf[256];
for (int j = 0; j < ListView_GetItemCount(iInfo.hGlobals); j++)
{
ListView_GetItemText(iInfo.hGlobals, j, 0, buf, 256);
if (strcmp(buf, _s.pGlobalVars[i].lpszVarName) == 0)
{
t = j;
}
}
if (t != -1)
{
ListView_SetItemText(iInfo.hGlobals, t, 0, _s.pGlobalVars[i].lpszVarName);
ListView_SetItemText(iInfo.hGlobals, t, 1, _s.pGlobalVars[i].lpszVarValue);
}
else
{
InsertItem(iInfo.hGlobals, _s.pGlobalVars[i].lpszVarName, _s.pGlobalVars[i].lpszVarValue);
ListView_SortItems(iInfo.hGlobals, MyCompareFunc, 0);
}
}
// Local Vars
if (_s.iNbLocals == 0) SendMessage(iInfo.hLocals, LVM_DELETEALLITEMS, 0, 0);
for (i = 0; i < _s.iNbLocals; i++)
{
int t = -1;
char buf[256];
for (int j = 0; j < ListView_GetItemCount(iInfo.hLocals); j++)
{
ListView_GetItemText(iInfo.hLocals, j, 0, buf, 256);
if (strcmp(buf, _s.pLocalVars[i].lpszVarName) == 0)
{
t = j;
}
}
if (t != -1)
{
ListView_SetItemText(iInfo.hLocals, t, 0, _s.pLocalVars[i].lpszVarName);
ListView_SetItemText(iInfo.hLocals, t, 1, _s.pLocalVars[i].lpszVarValue);
}
else
{
InsertItem(iInfo.hLocals, _s.pLocalVars[i].lpszVarName, _s.pLocalVars[i].lpszVarValue);
ListView_SortItems(iInfo.hLocals, MyCompareFunc, 0);
}
}
}
SendMessage(iInfo.hBehavior, WM_SETTEXT, 0, (LPARAM) _s.lpszBehavior);
if (sdu.bEvents)
{
if (_s.bEvents)
{
int iSize = SendMessage(iInfo.hEvents, WM_GETTEXTLENGTH, 0, 0);
SendMessage(iInfo.hEvents, EM_SETSEL, (WPARAM) iSize, (LPARAM) iSize);
SendMessage(iInfo.hEvents, EM_REPLACESEL, (WPARAM) true, (LPARAM) _s.lpszEvents);
// slide tout en bas
SendMessage(iInfo.hEvents, WM_VSCROLL, SB_BOTTOM, 0);
}
}
if (sdu.bTimers)
{
if (_s.bTimers)
{
SendMessage(iInfo.hTimers, WM_SETTEXT, (WPARAM) 0, (LPARAM) _s.lpszTimers);
// slide tout en bas
SendMessage(iInfo.hTimers, WM_VSCROLL, SB_BOTTOM, 0);
}
}
UpdateWindow(ghDialog);
}
//-----------------------------------------------------------------------------
void APIFUNC SCRIPT_DEBUGGER_GetParams(ScriptDebuggerUpdate & _pp)
{
sdu.bEvents = false;
int iRes = SendMessage(iInfo.hEventsEnabled, BM_GETCHECK, 0, 0);
if (iRes == BST_CHECKED) sdu.bEvents = true;
sdu.bTimers = false;
iRes = SendMessage(iInfo.hTimersEnabled, BM_GETCHECK, 0, 0);
if (iRes == BST_CHECKED) sdu.bTimers = true;
_pp.bVariables = sdu.bVariables;
_pp.bEvents = sdu.bEvents;
_pp.bTimers = sdu.bTimers;
_pp.bPause = sdu.bPause;
_pp.bStep = sdu.bStep;
char dest[256];
if (_pp.bUpdateGlobalVar = sdu.bUpdateGlobalVar)
{
GetWindowText(iInfo.hGlobalEdit, dest, 255);
strcpy(_pp.globalVar.lpszVarValue, dest);
strcpy(_pp.globalVar.lpszVarName, GlobalName);
}
if (_pp.bUpdateLocalVar = sdu.bUpdateLocalVar)
{
GetWindowText(iInfo.hLocalEdit, dest, 255);
strcpy(_pp.localVar.lpszVarValue, dest);
strcpy(_pp.localVar.lpszVarName, LocalName);
}
sdu.bUpdateGlobalVar = false;
sdu.bUpdateLocalVar = false;
sdu.bPause = false;
sdu.bStep = false;
}
//-----------------------------------------------------------------------------
bool APIFUNC SCRIPT_DEBUGGER_WindowOpened()
{
return gbDialog;
}
//-----------------------------------------------------------------------------
void APIFUNC SCRIPT_DEBUGGER_Destroy()
{
if (gbDialog)
SendMessage(ghDialog, WM_CLOSE, 0, 0);
}