/*
Debug.c
File for debug of the hardcode routines.
2.15.93- rdm created
* $Id: debug.c,v 1.1 2005/06/13 20:50:49 murrayma Exp $
* Last modified: Sun Jun 28 20:54:06 1998 fingon
Serious knifing / new functions by Markus Stenberg <fingon@iki.fi>
*/
#include "config.h"
#include "externs.h"
#include "debug.h"
#include "glue.h"
#include "muxevent.h"
#include "mech.h"
#include "create.h"
#include "mux_tree.h"
#include "p.mux_tree.h"
#include "p.map.obj.h"
#include "p.mech.startup.h"
#include "p.mech.partnames.h"
void GoThruTree(Tree tree, int (*func) (Node *));
void debug_list(dbref player, void *data, char *buffer)
{
char *args[3];
int argc;
argc = mech_parseattributes(buffer, args, 3);
if (argc == 0)
return;
else if (args[0][0] == 'M' || args[0][0] == 'm')
if (args[0][1] == 'E' || args[0][1] == 'e')
DumpMechs(player);
if (args[0][1] == 'A' || args[0][1] == 'a')
DumpMaps(player);
}
void debug_savedb(dbref player, void *data, char *buffer)
{
notify(player, "--- Saving ---");
SaveSpecialObjects(DUMP_NORMAL);
notify(player, "--- Done ---");
}
void debug_loaddb(dbref player, void *data, char *buffer)
{
notify(player, "--- Loading ---");
LoadSpecialObjects();
notify(player, "--- Done ---");
}
static int *number;
static int *smallest;
static int *largest;
static int *total;
static dbref cheat_player;
extern Tree xcode_tree;
extern int global_specials;
extern SpecialObjectStruct SpecialObjects[];
static int debug_check_stuff(Node * tmp)
{
int osize, size, t;
MAP *map;
t = NodeType(tmp);
osize = size = SpecialObjects[t].datasize;
switch (t) {
case GTYPE_MAP:
map = (MAP *) NodeData(tmp);
if (map->map) {
size +=
sizeof(map->map[0][0]) * map->map_width * map->map_height;
#ifdef BT_ENABLED
size += bit_size(map);
size += obj_size(map);
size += mech_size(map);
#endif
}
break;
}
if (smallest[t] < 0 || size < smallest[t])
smallest[t] = size;
if (largest[t] < 0 || size > largest[t])
largest[t] = size;
total[t] += size;
number[t]++;
if (cheat_player > 0 && osize != size)
notify(cheat_player, tprintf("#%d: %s (%d bytes)", NodeKey(tmp),
SpecialObjects[t].type, size));
return 1;
}
void debug_memory(dbref player, void *data, char *buffer)
{
int i, gtotal = 0;
Create(number, int, global_specials);
Create(smallest, int, global_specials);
Create(largest, int, global_specials);
Create(total, int, global_specials);
for (i = 0; i < global_specials; i++) {
number[i] = 0;
smallest[i] = -1;
largest[i] = -1;
total[i] = 0;
}
cheat_player = player;
skipws(buffer);
if (strcmp(buffer, ""))
cheat_player = player;
else
cheat_player = -1;
GoThruTree(xcode_tree, debug_check_stuff);
for (i = 0; i < global_specials; i++) {
if (number[i]) {
if (smallest[i] == largest[i])
notify(player,
tprintf("%4d %-20s: %d bytes total, %d each",
number[i], SpecialObjects[i].type, total[i],
total[i] / number[i]));
else
notify(player,
tprintf
("%4d %-20s: %d bytes total, %d avg, %d/%d small/large",
number[i], SpecialObjects[i].type, total[i],
total[i] / number[i], smallest[i], largest[i]));
}
gtotal += total[i];
}
notify(player, tprintf("Grand total: %d bytes.", gtotal));
free((void *) number);
free((void *) total);
free((void *) smallest);
free((void *) largest);
}
#ifdef BT_ENABLED
void ShutDownMap(dbref player, dbref mapnumber)
{
MAP *map;
MECH *mech;
int j;
Node *tmp;
tmp = FindNode(xcode_tree, mapnumber);
if (tmp) {
map = (MAP *) NodeData(tmp);
for (j = 0; j < map->first_free; j++)
if (map->mechsOnMap[j] != -1) {
mech = getMech(map->mechsOnMap[j]);
if (mech) {
notify(player,
tprintf
("Shutting down Mech #%d and restting map index to -1....",
map->mechsOnMap[j]));
mech_shutdown(GOD, (void *) mech, "");
MechLastX(mech) = 0;
MechLastY(mech) = 0;
MechX(mech) = 0;
MechY(mech) = 0;
remove_mech_from_map(map, mech);
}
}
map->first_free = 0;
notify(player, "Map Cleared");
return;
}
}
void debug_shutdown(dbref player, void *data, char *buffer)
{
char *args[3];
int argc;
argc = mech_parseattributes(buffer, args, 3);
if (argc > 0)
ShutDownMap(player, atoi(args[0]));
}
void debug_setvrt(dbref player, void *data, char *buffer)
{
char *args[3];
int vrt;
int id, brand;
DOCHECK(mech_parseattributes(buffer, args, 3) != 2,
"Invalid arguments!");
DOCHECK(Readnum(vrt, args[1]), "Invalid value!");
DOCHECK(vrt <= 0, "VRT needs to be >0");
DOCHECK(vrt > 127, "VRT can be at max 127");
DOCHECK(!find_matching_vlong_part(args[0], NULL, &id, &brand),
"That is no weapon!");
DOCHECK(!IsWeapon(id), "That is no weapon!");
MechWeapons[Weapon2I(id)].vrt = vrt;
notify(player, tprintf("VRT for %s set to %d.",
MechWeapons[Weapon2I(id)].name, vrt));
STARTLOG(LOG_ALWAYS, "WIZ", "CHANGE") {
log_text(tprintf("VRT for %s set to %d by ",
MechWeapons[Weapon2I(id)].name, vrt));
log_name(player);
ENDLOG;
}}
#endif