Added CCOH and missing areas Changed some areas to be craftable, Fixed some on death issues, Fixed the Gaurd
420 lines
15 KiB
Plaintext
420 lines
15 KiB
Plaintext
//============================================================================
|
|
//
|
|
// Name: CS Debugging Subsystem - Actual Debug Functions
|
|
// File: cs_dbg_debug
|
|
// Author: Craig Smith (Galap) <craig@smith.dropbear.id.au>
|
|
// Magnus Tyrland (Athinair)
|
|
//
|
|
// $Id: cs_dbg_debug.nss,v 1.3 2004/05/28 14:11:00 cs Exp $
|
|
// $Source: /local/cvs/nwn/debug/cs_dbg_debug.nss,v $
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
// This software is distributed in the hope that it will be useful. It is
|
|
// provided "as is" WITHOUT WARRANTY OF ANY KIND, either expressed or implied,
|
|
// including, but not limited to, the implied warranties of merchantability
|
|
// and fitness for a particular purpose. You may redistribute or modify this
|
|
// software for your own purposes so long as all original credit information
|
|
// remains intact.
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Introduction
|
|
// ------------
|
|
// This file contains the real debug functions. Use these when testing your
|
|
// scripts.
|
|
//
|
|
// To change your code from using the release stub debug functions to the
|
|
// actual functions, edit the "cs_dbg" file and change the #include directive
|
|
// at the bottom of the file to the following line:
|
|
//
|
|
// #include "cs_dbg_debug"
|
|
//
|
|
// Of course, if you change from debug functions to release stub functions
|
|
// or back again, a complete build of your module is recommended.
|
|
//
|
|
// Do not just include the "cs_dbg_debug" file directly into your own
|
|
// scripts!
|
|
//
|
|
//============================================================================
|
|
|
|
|
|
//============================================================================
|
|
//
|
|
// Data Types and Constants
|
|
//
|
|
//============================================================================
|
|
|
|
// Local variable names for debug support.
|
|
const string CS_DBG_VAR_LEVEL = "cs_dbgLevel";
|
|
const string CS_DBG_VAR_PC = "cs_dbgPc";
|
|
const string CS_DBG_VAR_INDENT = "cs_dbgIndent";
|
|
const string CS_DBG_VAR_DESTINATION = "cs_dbgDestination";
|
|
|
|
// Predefined constants for indentation. Anyone who is calling more then 20
|
|
// levels deep is getting silly.
|
|
const string CS_DBG_INDENT_1 = " ";
|
|
const string CS_DBG_INDENT_2 = " ";
|
|
const string CS_DBG_INDENT_3 = " ";
|
|
const string CS_DBG_INDENT_4 = " ";
|
|
const string CS_DBG_INDENT_5 = " ";
|
|
const string CS_DBG_INDENT_6 = " ";
|
|
const string CS_DBG_INDENT_7 = " ";
|
|
const string CS_DBG_INDENT_8 = " ";
|
|
const string CS_DBG_INDENT_9 = " ";
|
|
const string CS_DBG_INDENT_10 = " ";
|
|
const string CS_DBG_INDENT_11 = " ";
|
|
const string CS_DBG_INDENT_12 = " ";
|
|
const string CS_DBG_INDENT_13 = " ";
|
|
const string CS_DBG_INDENT_14 = " ";
|
|
const string CS_DBG_INDENT_15 = " ";
|
|
const string CS_DBG_INDENT_16 = " ";
|
|
const string CS_DBG_INDENT_17 = " ";
|
|
const string CS_DBG_INDENT_18 = " ";
|
|
const string CS_DBG_INDENT_19 = " ";
|
|
const string CS_DBG_INDENT_20 = " ";
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_Enable(int level) {
|
|
SetLocalInt(GetModule(), CS_DBG_VAR_LEVEL, level);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_Disable(int level) {
|
|
object mod = GetModule();
|
|
int currentLevel = GetLocalInt(mod, CS_DBG_VAR_LEVEL);
|
|
SetLocalInt(mod, CS_DBG_VAR_LEVEL, currentLevel & ~level);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int cs_dbg_GetIsEnabled(int which = 0xffffffff) {
|
|
return GetLocalInt(GetModule(), CS_DBG_VAR_LEVEL) & which;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_EnableDestination(int destination) {
|
|
SetLocalInt(GetModule(), CS_DBG_VAR_DESTINATION, destination);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_DisableDestination(int destination) {
|
|
object mod = GetModule();
|
|
int currentDestination = GetLocalInt(mod, CS_DBG_VAR_DESTINATION);
|
|
SetLocalInt(mod, CS_DBG_VAR_LEVEL, currentDestination & ~destination);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int cs_dbg_GetIsDestinationEnabled(int which = 0xffffffff) {
|
|
return GetLocalInt(GetModule(), CS_DBG_VAR_DESTINATION) & which;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_SetPCListener(object PC) {
|
|
SetLocalObject(GetModule(), CS_DBG_VAR_PC, PC);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
object cs_dbg_GetPCListener() {
|
|
object PC = GetLocalObject(GetModule(), CS_DBG_VAR_PC);
|
|
if (!GetIsObjectValid(PC)) {
|
|
PC = OBJECT_INVALID;
|
|
}
|
|
return PC;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_PrintString(int debugLevel, string msg, object override=OBJECT_INVALID) {
|
|
object mod = GetModule();
|
|
|
|
// If we have no override target, check the calling object to see if
|
|
// there is a debug target set for it.
|
|
if (!GetIsObjectValid(override)) {
|
|
object debug = GetLocalObject(OBJECT_SELF, CS_DBG_VAR_DEBUG_TARGET);
|
|
if (GetIsObjectValid(debug)) {
|
|
override = debug;
|
|
}
|
|
}
|
|
|
|
// If the specified debug level for this message is not currently
|
|
// being displayed, and we have no override target, ignore the message.
|
|
if ((debugLevel & GetLocalInt(mod, CS_DBG_VAR_LEVEL)) ||
|
|
GetIsObjectValid(override)
|
|
) {
|
|
// Build a time stamp prefix. The time stamp will be the same for
|
|
// all messages generated within the same script call, but debug
|
|
// output just doesn't look right without one...
|
|
int indent = GetLocalInt(mod, CS_DBG_VAR_INDENT);
|
|
switch (indent) {
|
|
case 0:
|
|
// We do nothing at indent level 0.
|
|
break;
|
|
case 1:
|
|
msg = CS_DBG_INDENT_1 + msg;
|
|
break;
|
|
case 2:
|
|
msg = CS_DBG_INDENT_2 + msg;
|
|
break;
|
|
case 3:
|
|
msg = CS_DBG_INDENT_3 + msg;
|
|
break;
|
|
case 4:
|
|
msg = CS_DBG_INDENT_4 + msg;
|
|
break;
|
|
case 5:
|
|
msg = CS_DBG_INDENT_5 + msg;
|
|
break;
|
|
case 6:
|
|
msg = CS_DBG_INDENT_6 + msg;
|
|
break;
|
|
case 7:
|
|
msg = CS_DBG_INDENT_7 + msg;
|
|
break;
|
|
case 8:
|
|
msg = CS_DBG_INDENT_8 + msg;
|
|
break;
|
|
case 9:
|
|
msg = CS_DBG_INDENT_9 + msg;
|
|
break;
|
|
case 10:
|
|
msg = CS_DBG_INDENT_10 + msg;
|
|
break;
|
|
case 11:
|
|
msg = CS_DBG_INDENT_11 + msg;
|
|
break;
|
|
case 12:
|
|
msg = CS_DBG_INDENT_12 + msg;
|
|
break;
|
|
case 13:
|
|
msg = CS_DBG_INDENT_13 + msg;
|
|
break;
|
|
case 14:
|
|
msg = CS_DBG_INDENT_14 + msg;
|
|
break;
|
|
case 15:
|
|
msg = CS_DBG_INDENT_15 + msg;
|
|
break;
|
|
case 16:
|
|
msg = CS_DBG_INDENT_16 + msg;
|
|
break;
|
|
case 17:
|
|
msg = CS_DBG_INDENT_17 + msg;
|
|
break;
|
|
case 18:
|
|
msg = CS_DBG_INDENT_18 + msg;
|
|
break;
|
|
case 19:
|
|
msg = CS_DBG_INDENT_19 + msg;
|
|
break;
|
|
default:
|
|
// Any more deeply indented than 20 is getting silly.
|
|
msg = CS_DBG_INDENT_20 + msg;
|
|
}
|
|
|
|
// Determine the destinations. If a subsystem override has been
|
|
// specified, use that as the player destination.
|
|
int destination;
|
|
object pc;
|
|
if (GetIsObjectValid(override)) {
|
|
destination = CS_DBG_LOGPC | CS_DBG_LOGFILE;
|
|
pc = override;
|
|
}
|
|
else {
|
|
destination = GetLocalInt(mod, CS_DBG_VAR_DESTINATION);
|
|
pc = GetLocalObject(mod, CS_DBG_VAR_PC);
|
|
}
|
|
string timestamp = IntToString(GetTimeHour() / 10) +
|
|
IntToString(GetTimeHour() % 10) + ":" +
|
|
IntToString(GetTimeMinute() / 10) +
|
|
IntToString(GetTimeMinute() % 10) + ":" +
|
|
IntToString(GetTimeSecond() / 10) +
|
|
IntToString(GetTimeSecond() % 10) + " ";
|
|
|
|
// Write message, plus timestamp and indentation, to PC message log.
|
|
if ((destination & CS_DBG_LOGPC) && (GetIsPC(pc) || GetIsDM(pc))) {
|
|
SendMessageToPC(pc, timestamp + msg);
|
|
}
|
|
|
|
// Write message, plus timestamp and indentation, to all DMs.
|
|
if (destination & CS_DBG_LOGDM) {
|
|
SendMessageToAllDMs(timestamp + msg);
|
|
}
|
|
|
|
// Write message, plus indentation, to log file. Log messages have
|
|
// their own timestamps.
|
|
if (destination & CS_DBG_LOGFILE) {
|
|
WriteTimestampedLogEntry(msg);
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_Critical(string msg, object override=OBJECT_INVALID) {
|
|
cs_dbg_PrintString(CS_DBG_CRITICAL, msg, override);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_Error(string msg, object override=OBJECT_INVALID) {
|
|
cs_dbg_PrintString(CS_DBG_ERROR, msg, override);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_Warning(string msg, object override=OBJECT_INVALID) {
|
|
cs_dbg_PrintString(CS_DBG_WARNING, msg, override);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_Info(string msg, object override=OBJECT_INVALID) {
|
|
cs_dbg_PrintString(CS_DBG_INFO, msg, override);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_Trace(string msg, object override=OBJECT_INVALID) {
|
|
cs_dbg_PrintString(CS_DBG_TRACE, msg, override);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_Enter(string msg, object override=OBJECT_INVALID) {
|
|
cs_dbg_PrintString(CS_DBG_TRACE, "Entering " + msg, override);
|
|
|
|
// Indentation of debug messages is tracked even if debug is turned off.
|
|
object mod = GetModule();
|
|
int indent = GetLocalInt(mod, CS_DBG_VAR_INDENT);
|
|
indent++;
|
|
SetLocalInt(mod, CS_DBG_VAR_INDENT, indent);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_Exit(string msg, object override=OBJECT_INVALID) {
|
|
// Indentation of debug messages is tracked even if debug is turned off.
|
|
object mod = GetModule();
|
|
int indent = GetLocalInt(mod, CS_DBG_VAR_INDENT);
|
|
indent--;
|
|
SetLocalInt(mod, CS_DBG_VAR_INDENT, indent);
|
|
|
|
cs_dbg_PrintString(CS_DBG_TRACE, "Exiting " + msg, override);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
string cs_dbg_VectorToString(vector vec) {
|
|
string str = FloatToString(vec.x) + ", " +
|
|
FloatToString(vec.y) + ", " +
|
|
FloatToString(vec.z);
|
|
return str;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
string cs_dbg_LocationToString(location loc) {
|
|
object area = GetAreaFromLocation(loc);
|
|
vector vec = GetPositionFromLocation(loc);
|
|
float facing = GetFacingFromLocation(loc);
|
|
string str = GetName(area) + ", " +
|
|
cs_dbg_VectorToString(vec) +
|
|
FloatToString(facing);
|
|
return str;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_SetLocalString(object container, string name, string value) {
|
|
cs_dbg_PrintString(
|
|
CS_DBG_INFO,
|
|
name + " set to '" + value + "' on " + GetName(container)
|
|
);
|
|
SetLocalString(container, name, value);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_SetLocalInt(object container, string name, int value) {
|
|
cs_dbg_PrintString(
|
|
CS_DBG_INFO,
|
|
name + " set to " + IntToString(value) + " on " + GetName(container)
|
|
);
|
|
SetLocalInt(container, name, value);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_SetLocalObject(object container, string name, object value) {
|
|
cs_dbg_PrintString(
|
|
CS_DBG_INFO,
|
|
name + " set to " + GetName(value) + " on " + GetName(container)
|
|
);
|
|
SetLocalObject(container, name, value);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
string cs_dbg_GetLocalString(object container, string name) {
|
|
string value = GetLocalString(container, name);
|
|
cs_dbg_PrintString(
|
|
CS_DBG_INFO,
|
|
name + " retrieved from " + GetName(container) + ": '" + value + "'"
|
|
);
|
|
return value;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int cs_dbg_GetLocalInt(object container, string name) {
|
|
int value = GetLocalInt(container, name);
|
|
cs_dbg_PrintString(
|
|
CS_DBG_INFO,
|
|
name + " retrieved from " + GetName(container) + ": " +
|
|
IntToString(value)
|
|
);
|
|
return value;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
object cs_dbg_GetLocalObject(object container, string name) {
|
|
object value = GetLocalObject(container, name);
|
|
cs_dbg_PrintString(
|
|
CS_DBG_INFO,
|
|
name + " retrieved from " + GetName(container) + ": " +
|
|
GetName(value)
|
|
);
|
|
return value;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_DeleteLocalString(object container, string name) {
|
|
cs_dbg_PrintString(
|
|
CS_DBG_INFO,
|
|
name + " deleted from " + GetName(container)
|
|
);
|
|
DeleteLocalString(container, name);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_DeleteLocalInt(object container, string name) {
|
|
cs_dbg_PrintString(
|
|
CS_DBG_INFO,
|
|
name + " deleted from " + GetName(container)
|
|
);
|
|
DeleteLocalInt(container, name);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_DeleteLocalObject(object container, string name) {
|
|
cs_dbg_PrintString(
|
|
CS_DBG_INFO,
|
|
name + " deleted from " + GetName(container)
|
|
);
|
|
DeleteLocalObject(container, name);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cs_dbg_SetCustomToken(int token, string value) {
|
|
cs_dbg_PrintString(
|
|
CS_DBG_INFO,
|
|
"Token " + IntToString(token) + " set to '" + value + "'"
|
|
);
|
|
SetLocalString(GetModule(), CS_DBG_TOKEN_PREFIX + IntToString(token), value);
|
|
SetCustomToken(token, value);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
string cs_dbg_GetCustomToken(int token) {
|
|
string value = GetLocalString(GetModule(), CS_DBG_TOKEN_PREFIX + IntToString(token));
|
|
cs_dbg_PrintString(
|
|
CS_DBG_INFO,
|
|
"Token " + IntToString(token) + " value is '" + value + "'"
|
|
);
|
|
return value;
|
|
}
|