/*
* memory.cpp
* Memory added by Charles Marchant for Mordor 3.x
* ____ _
* | _ \ ___ __ _| |_ __ ___ ___
* | |_) / _ \/ _` | | '_ ` _ \/ __|
* | _ < __/ (_| | | | | | | \__ \
* |_| \_\___|\__,_|_|_| |_| |_|___/
*
* Permission to use, modify and distribute is granted via the
* Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License
* http://creativecommons.org/licenses/by-nc-sa/3.0/
*
* Copyright (C) 2007-2012 Jason Mitchell, Randi Mitchell
* Contributions by Tim Callahan, Jonathan Hseu
* Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman
*
*/
#include "mud.h"
//*********************************************************************
// sizeInfo
//*********************************************************************
bstring sizeInfo(long size) {
int i=0;
for(; size > 1024 && i < 4; i++)
size /= 1024;
switch(i) {
case 0:
return((bstring)size + " bytes");
case 1:
return((bstring)size + "kb");
case 2:
return((bstring)size + "mb");
case 3:
return((bstring)size + "gb");
default:
return((bstring)size + "tb");
}
}
//*********************************************************************
// showMemory
//*********************************************************************
void Config::showMemory(Socket* sock) {
char buf[80];
int crts = 0;
int rooms = 0;
int objects = 0;
int talks = 0;
int actions = 0;
int badtalk = 0;
long crt_mem = 0L;
long rom_mem = 0L;
long obj_mem = 0L;
long talk_mem = 0L;
long act_mem = 0L;
// long total_mem = 0L;
long bt_mem = 0L;
long total=0;
ttag *tlk;
UniqueRoom* r=0;
std::map<bstring, rsparse>::iterator it;
for(it = roomQueue.begin(); it != roomQueue.end() ; it++) {
r = (*it).second.rom;
if(!r)
continue;
rooms++;
rom_mem += sizeof(UniqueRoom);
for(Monster* mons : r->monsters) {
crts++;
crt_mem += sizeof(Monster);
// add object counting on crts
// and object wear on crts
if(mons->first_tlk) {
tlk = mons->first_tlk;
if(mons->flagIsSet(M_TALKS)) {
for(; tlk; tlk = tlk->next_tag) {
talks++;
talk_mem += sizeof(ttag);
if(tlk->key)
talk_mem += strlen(tlk->key);
if(tlk->response)
talk_mem += strlen(tlk->response);
if(tlk->action)
talk_mem += strlen(tlk->action);
if(tlk->target)
talk_mem += strlen(tlk->target);
}
} else if(mons->flagIsSet(M_LOGIC_MONSTER)) {
for(; tlk; tlk = tlk->next_tag) {
actions++;
act_mem += sizeof(ttag);
if(tlk->response)
act_mem += strlen(tlk->response);
if(tlk->action)
act_mem += strlen(tlk->action);
if(tlk->target)
act_mem += strlen(tlk->target);
}
} else {
sprintf(buf, "%s has a talk and should not.", mons->getCName());
loge(buf);
for(; tlk; tlk = tlk->next_tag) {
badtalk++;
bt_mem += sizeof(ttag);
if(tlk->key)
bt_mem += strlen(tlk->key);
if(tlk->response)
bt_mem += strlen(tlk->response);
if(tlk->action)
bt_mem += strlen(tlk->action);
if(tlk->target)
bt_mem += strlen(tlk->target);
}
}
}
}
objects += r->objects.size();
obj_mem += r->objects.size() * sizeof(Object);
}
total = bt_mem + rom_mem + obj_mem + crt_mem + act_mem + talk_mem;
sock->print("Memory Status:\n");
sock->print("Total Rooms : %-5d", rooms);
sock->print(" %ld -> Total memory\n", rom_mem);
sock->print("Total Objects: %-5d", objects);
sock->print(" %ld -> Total memory\n", obj_mem);
sock->print("Total Creatures: %-5d", crts);
sock->print(" %ld -> Total memory\n", crt_mem);
sock->print("Total Actions: %-5d", actions);
sock->print(" %ld -> Total memory\n", act_mem);
sock->print("Total Bad Talks: %-5d", badtalk);
sock->print(" %ld -> Total memory\n", bt_mem);
sock->print("Total Talks: %-5d", talks);
sock->print(" %ld -> Total memory\n", talk_mem);
sock->print("Total Memory: %ld (%s)\n\n", total, sizeInfo(total).c_str());
}
//*********************************************************************
// dmMemory
//*********************************************************************
int dmMemory(Player* player, cmd* cmnd) {
gConfig->showMemory(player->getSock());
return(0);
}