dawn/notes/
dawn/src/
dawn/src/docs/
/**************************************************************************/
// debug.cpp - Kal's budget debug system :)
/***************************************************************************
 * The Dawn of Time v1.69r (c)1997-2004 Michael Garratt                    *
 * >> A number of people have contributed to the Dawn codebase, with the   *
 *    majority of code written by Michael Garratt - www.dawnoftime.org     *
 * >> To use this source code, you must fully comply with the dawn license *
 *    in licenses.txt... In particular, you may not remove this copyright  *
 *    notice.                                                              *
 **************************************************************************/
#include "include.h"
#include "interp.h"
#include "olc.h"

ROOM_INDEX_DATA *	find_location	args( ( char_data *ch, char *arg ) );
/**************************************************************************/
void do_debugroom( char_data *ch, char *argument )
{
    char			buf[MSL];
    char			arg[MIL];
    ROOM_INDEX_DATA *location;
    OBJ_DATA		*obj;
    char_data		*rch;
    int				door;
	AFFECT_DATA		*paf, *paf_last = NULL;

    one_argument( argument, arg );
    location = ( arg[0] == '\0' ) ? ch->in_room : find_location( ch, arg );
    if ( location == NULL )
    {
		ch->println("No such location.");
		ch->println("The syntax is just like 'stat room'.");
		return;
    }

	if (ch->in_room != location
		&& is_room_private_to_char( location, ch ) 
		&& !IS_TRUSTED(ch,IMPLEMENTOR))
	{
		ch->println("That room is private right now.");
		return;
    }

	ch->println("`RDEBUG_ROOM SET TO THE FOLLOWING ROOM:`x");
	DEBUG_ROOM=location;

	ch->printlnf("Name: '%s'\nArea: '%s'  Filename '%s'",
				location->name,
				location->area->name,
				location->area->file_name );

	ch->printlnf("Vnum: %d  Sector: %s  Light: %d  Healing: %d  Mana: %d",
				location->vnum,
				flag_string( sector_types, location->sector_type ),
				location->light,
				location->heal_rate,
				location->mana_rate );

	ch->printf("Room flags: %s.\nDescription:\n%s",
				room_flags_bit_name(location->room_flags),
				location->description );

    if ( location->extra_descr != NULL )
    {
		EXTRA_DESCR_DATA *ed;

		ch->print("Extra description keywords: '");
		for ( ed = location->extra_descr; ed; ed = ed->next )
		{
			ch->printf("%s", ed->keyword );
			if ( ed->next != NULL )
				ch->print(" ");
		}
		ch->println("'.");
	}

	ch->print("Characters:");
	for ( rch = location->people; rch; rch = rch->next_in_room )
	{
		if (can_see(ch,rch))
		{
			ch->print(" ");
			one_argument( rch->name, buf );
			ch->printf("%s", buf );
		}
	}

	ch->print(".\nObjects:   ");
	for ( obj = location->contents; obj; obj = obj->next_content )
	{
		ch->print(" ");
		one_argument( obj->name, buf );
		ch->printf("%s", buf );
	}
	ch->println(".");

	for ( door = 0; door <= 9; door++ )
	{
		EXIT_DATA *pexit;

		if ( ( pexit = location->exit[door] ) != NULL )
		{
			ch->printf("Door: %d.  To: %d.  Key: %d.  Exit flags: %s.  Reset flags: %s\nKeyword: '%s'.  Description: %s",
				door,
				(pexit->u1.to_room == NULL ? -1 : pexit->u1.to_room->vnum),
				pexit->key,
				flag_string( exit_flags, pexit->exit_info ),
				flag_string( exit_flags, pexit->rs_flags),
				pexit->keyword,
				pexit->description[0] != '\0'
				? pexit->description : "(none).\r\n" );

		}
	}

	if ( location->affected_by )
	{
		ch->println("`rThe room has the following affects on it.`x");
		for ( paf = location->affected; paf; paf = paf->next )
		{
			if (paf_last && paf->type == paf_last->type){
				continue;
			}else{
				ch->printf("Spell: %-15s", skill_table[paf->type].name );
				if ( paf->duration == -1 )
					ch->print("until the world reforms");
				else
					ch->printf("for %d hours", paf->duration );
			}
			ch->println("");
			paf_last = paf;
		}
	}

	return;
}


/**************************************************************************/
int get_sublevels_for_level(int level);
/**************************************************************************/
void do_debugmob( char_data *ch, char *argument )
{
    char arg[MIL];
    char_data *victim;
    char buf[MSL];
    AFFECT_DATA *paf;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
        ch->println("Stat whom?");
        return;
    }

    if (( victim = get_char_world( ch, argument ) ) == NULL )
    {
        ch->println("They aren't here.");
        return;
    }

	ch->println("`RDEBUG_MOB SET TO THE FOLLOWING MOBILE:`x");
	DEBUG_MOB=victim;

	ch->println("_______________________________________________________________________________\n|                                                                             |");
	
	if(IS_NPC(victim)){
		ch->printlnf("| `xName:`B %-68s`x|", victim->name);
	}else{
		sprintf(buf, "`xName:`B %s`x   Created: %s",
			victim->name, ctime( (time_t *) & (victim->id)));
		buf[str_len(buf)-1]='\0';
		ch->printlnf("| %-82s|", buf);
	}

	if (!IS_NPC(victim) && IS_TRUSTED(ch, ADMIN))
	{
		// for email banning verification
		bool print=false;
		if(!IS_NULLSTR(victim->pcdata->email)){
			ch->printlnf("| Email: `b%-68s`x |", victim->pcdata->email);
			print=true;
		}
		if(!IS_NULLSTR(victim->pcdata->created_from)){
			ch->printf("| Created_from: `b%-38s`x  ", victim->pcdata->created_from);
			print=true;
		}
		if(!IS_NULLSTR(victim->pcdata->unlock_id)){
			if(str_len(victim->pcdata->unlock_id)==6){
				ch->printlnf("Unlock_id: `b%-10s`x |", victim->pcdata->unlock_id);
				print=true;
			}
		}
		if(print){
			ch->println("");
		}
	}

	ch->println("|_____________________________________________________________________________|");
	ch->println("|                                                                             |");


    ch->printlnf("| Vnum: %-5d  Format: %-3s  Room: `m%-5d`x  LastIC: `M%-5d`x  Recall:  %-5d        |",
        IS_NPC(victim) ? victim->pIndexData->vnum : 0,
        IS_NPC(victim) ? "npc" : "pc",
        victim->in_room == NULL ? 0 : victim->in_room->vnum,
		victim->last_ic_room == NULL ? 0 : victim->last_ic_room ->vnum,
		victim->recall_room );


	if (IS_NPC(victim))
    {
		ch->printlnf("| Count: %-3d   Killed: %-3d   XP Mod: %-3d                                      |",
        victim->pIndexData->count,victim->pIndexData->killed, victim->pIndexData->xp_mod);
    }


	ch->printlnf("| Race: `B%-10s  `xGroup: `B%-2d  `xSex: `B%-7s`x                                   |",
		race_table[victim->race]->name,
		IS_NPC(victim) ? victim->group : 0, sex_table[victim->sex].name );
         
	ch->printf("| Lv: `G%-3d  `xClass: `G%-12s  `xTendency: `g%+d  `xAlliance: `g%+d`x                    |\n| `Y-$$$ `xBank: `y%-6ld  `xGold: `y%-5ld  `xSilver: `s%-5ld`x  Exp: `M%-6d`x",
		victim->level,       
        IS_NPC(victim) ? "mobile" : class_table[victim->clss].name,
		victim->tendency, victim->alliance, victim->bank,
		victim->gold, victim->silver, victim->exp );

	if ( !IS_NPC( victim ))
		ch->printlnf("  HeroXP: %-5d   |", victim->pcdata->heroxp );
	else
		ch->println("                  |");

	if(!IS_NPC(victim) && victim->level>=50){
		ch->printlnf("`g|`G|`x  Sublevel:  %2d/%2d  subprac %d  subtrain %d", 
			victim->pcdata->sublevel, get_sublevels_for_level(victim->level),
			victim->pcdata->sublevel_pracs, victim->pcdata->sublevel_trains);
	}

	ch->printlnf("| Armor: pierce: `b%-6d  `xbash: `b%-6d  `xslash: `b%-6d  `xmagic: `b%-6d`x           |",
		GET_AC(victim,AC_PIERCE), GET_AC(victim,AC_BASH),
		GET_AC(victim,AC_SLASH),  GET_AC(victim,AC_EXOTIC));

    ch->printlnf("| Hit: `c%-3d`x  Dam: `c%-3d`x  Saves: `c%-3d`x  Size: %-7s  Pos: %-8s  Wimpy: %-3d    |",
        GET_HITROLL(victim), GET_DAMROLL(victim), victim->saving_throw,
        size_table[victim->size].name, position_table[victim->position].name,
        victim->wimpy );

    if (IS_NPC(victim))
    {
		ch->printlnf("| Damage: `C%2dd%-2d  `xMessage: `c%-15s`x                                     |",
			victim->damage[DICE_NUMBER],victim->damage[DICE_TYPE],
			attack_table[victim->dam_type].noun);
    }else{
		ch->printlnf("| victim->pcdata->objrestrict = %d |",	victim->pcdata->objrestrict);
	}

	ch->println("|_____________________________________________________________________________|\n|                                                                             |");

	ch->printlnf("| Fighting: `C%-54s  `c%s`x |",
		victim->fighting ? victim->fighting->name : "(none)" ,
		victim->no_xp ? "NO_XP_SET" : "         ");

//	ch->printlnf("| Memory: {r%-67s{x |",
//		victim->mobmemory ? victim->mobmemory->name : "(none)" );

	if ( !IS_NPC(victim) )
    {
		ch->printf(
           "| Thirst: `c%-2d  `xHunger: `c%-2d  `xFull: `c%-2d  `xDrunk: `c%-2d  `xTired: `c%-2d`x                      |\r\n",
            victim->pcdata->condition[COND_THIRST],
            victim->pcdata->condition[COND_HUNGER],
            victim->pcdata->condition[COND_FULL],
            victim->pcdata->condition[COND_DRUNK],
            victim->pcdata->tired );

        if (victim->clan){
	        ch->printlnf("| `xClan: %-10s `xRank: %s%-15s (%d)`x                                  |",
				victim->clan->cwho_name(),
				victim->clan->color_str(),
				victim->clan->clan_rank_title(victim->clanrank),
				victim->clanrank);              
		}
    }

    if (!IS_NPC(victim))
    {
		ch->printf("| Played: %d(%0.03f%%)  LastLevel: %-4d ",
            (int) (GET_SECONDS_PLAYED(victim)/ 3600), 
			GET_SECONDS_PLAYED(victim)* 100/ (double)(current_time-victim->id),
			victim->pcdata->last_level);
    }

    // display the timer on pcs and only on mobs if they have one 
    if (!IS_NPC(victim)){
		ch->printlnf("Timer: %-2d                         |", victim->timer);
    }else if (victim->timer>0){
        ch->printlnf("Timer: %-2d  Idle: %-2d               |", victim->timer, victim->idle);
	}

    if (IS_NPC(victim) && victim->off_flags)
        ch->printlnf("| Offense: %-66s |",off_bit_name(victim->off_flags));

    if (victim->imm_flags)
		ch->printlnf("| Immune: %-67s |",imm_bit_name(victim->imm_flags));
 
    if (victim->res_flags)
		ch->printlnf("| Resist: %-67s |", imm_bit_name(victim->res_flags));

    if (victim->vuln_flags)
		ch->printlnf("| Vulnerable: %-63s |", imm_bit_name(victim->vuln_flags));

    if (!IS_NULLSTR(victim->prompt))
	{
        sprintf(buf,"| Prompt: %-67s |",victim->prompt);
        ch->printlnbw(buf);	
    }

    if (!IS_NULLSTR(victim->olcprompt))
    {
        sprintf(buf,"| OLCPrompt: %-68s ",victim->olcprompt);
        ch->printlnbw(buf);
    }

	if (victim->comm)
		ch->printlnf("| Comm: %-69s ",comm_bit_name(victim->comm));

	if (victim->config){
		ch->printlnf("| Config: %-67s ", 
			flag_string( config_flags, victim->config));
	}
    
	ch->printlnf("| Act: %-70s ", act_bit_name(victim->act));
    
    if (victim->affected_by)
    {
        ch->printlnf("| Affected by: `c%-63s`x ", 
            affect_bit_name(victim->affected_by));
    }

	ch->printlnf("| Parts: %-68s \n| Form: %-69s |",
        part_bit_name(victim->parts), form_bit_name(victim->form));

    ch->printlnf("| Master: %-15s  Leader: %-15s  Pet: %-15s      |",
        victim->master      ? victim->master->name   : "(none)",
        victim->leader      ? victim->leader->name   : "(none)",
        victim->pet         ? victim->pet->name      : "(none)");
    
	ch->printlnf("| Mounted on: %-15s  Ridden by: %-15s                     |",
        victim->mounted_on      ? victim->mounted_on->name   : "(none)",
        victim->ridden_by       ? victim->ridden_by->name    : "(none)");
    
    if (victim->last_force > -20)
	{
		    ch->printlnf("| Wildness: %-3d  Will: %-3d  Last_force: %-10ld (%-4ld tick%s ago)           |",
				victim->wildness, victim->will,
				victim->last_force, tick_counter -victim->last_force,
				(tick_counter -victim->last_force<=1)?" ":"s");
    }
    else
    {
			ch->printlnf("| Wildness: %-3d  Will: %-3d  Last_force: never                                 |",
				victim->wildness, victim->will);
    }

	ch->println("|_____________________________________________________________________________|\n|                                                                             |");

    ch->printlnf("| Pkills: `R%-2d`x  PkDefeats: `r%-2d`x                                                   |",
             victim->pkkills, victim->pkdefeats);

	ch->printlnf("| Pksafe: `C%-2d`x  PkOOL: `C%-4d`x  PkNorecall: `C%-2d`x  Pknoquit: `C%-2d`x                       |",
			 victim->pksafe, victim->pkool, victim->pknorecall, victim->pknoquit);

    if(!IS_NPC(victim))         
    {
        ch->printlnf("| MKills: `B%-4d`x  MDefeats: `B%-3d`x                              |",
			victim->pcdata->mkills, victim->pcdata->mdefeats);

		if(victim->pcdata->council)
			ch->printlnf("Councils: %s", flag_string( council_flags, victim->pcdata->council ));

        ch->printlnf("| Realm Bits: %s", flag_string( realm_flags, victim->pcdata->realms));
        ch->printlnf("| Sphere Bits: %s", flag_string( sphere_flags, victim->pcdata->spheres));
        ch->printlnf("| Element&Season Bits: %s", flag_string( element_flags, victim->pcdata->elements));			

        ch->printf("| Karns: `Y%d`x    NextKarn: `y%-5d`x  Sec: `c%d`x  Subdued: `c%-2d`x  ",
			victim->pcdata->karns,
			victim->pcdata->next_karn_countdown,
			victim->pcdata->security,
			victim->subdued_timer);
		
		if (IS_ADMIN(ch))
		{
			char buf2[MIL];
			
			ch->printf("Trust: %-3d  ",
				(IS_TRUSTED(victim,get_trust(ch))? get_trust(ch):get_trust(victim)));

			if (IS_SET(victim->act, PLR_LOG))
				sprintf(buf, "`#`RLOGGED`&");
			else
				sprintf(buf, "      ");

			// show xp penality
			if (victim->pcdata->xp_penalty>0)
			{
				sprintf( buf2, "`#`RXP PEN: %-4d `^",victim->pcdata->xp_penalty);
			}else{
				sprintf(buf2, "         ");
			}
			strcat(buf, buf2);

			ch->print(buf);
		}else ch->print("                       ");
		
		ch->println(" |");


		ch->printlnf("| Creation points: %-4d  XPPerLvl: `m%-4d`x  XPTillNextlvl: `m%-5d`x  RPS: `m%-6ld`x    |",
            victim->pcdata->points,
            exp_per_level(victim, victim->pcdata->points),
            (victim->level+1)*exp_per_level(victim, victim->pcdata->points)-(victim->exp),
            victim->pcdata->rp_points );
    }           

	ch->println("|_____________________________________________________________________________|\n|                                                                             |");

    if IS_NPC(victim)
	{
        ch->printlnf("| Short description: %-56s |\r\n| Long  description: %s",
        victim->short_descr,
        IS_NULLSTR(victim->long_descr)? "(none)" : victim->long_descr );
	}else{
        ch->printlnf("| Short description: %-56s |",
        victim->short_descr);
	}


	// ADMIN CAN SEE NOTES BEING WRITTEN
	if (IS_ADMIN(ch) && ch->level > victim->level)
	{	
		if (victim->pnote)
        {
			ch->println("|_____________________________________________________________________________|\n|                                                                             |");

			sprintf(buf,"`#`?%s is writing the following %s:`&", 
				victim->name, get_notetype(victim->pnote->type));
			ch->printlnf("| %-82s|", buf);
            ch->printlnf("| %-15s: %-58s |\n| To: %-71s |",
				victim->pnote->sender,
				victim->pnote->subject,
				victim->pnote->to_list);
			if (IS_SET(victim->act,PLR_AUTOREFORMAT)){
				char *tempdup= note_format_string(str_dup(victim->pnote->text));
				ch->print(tempdup);
				free_string(tempdup);
			}else{
				ch->print(victim->pnote->text);
			}
			ch->print("`x");
		}

	}

    if ( IS_NPC(victim) && victim->spec_fun != 0 )
    {
        ch->printlnf("Mobile has special procedure `G%-20s`x                             |",
			spec_name(victim->spec_fun));
    }

	// where definitions 
    for ( paf = victim->affected; paf != NULL; paf = paf->next )
    {
//		ch->println("|                                                                             |");
        switch (paf->where)
        {
        case WHERE_WEAPON:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d hr%s (weaponbits %s), lvl%d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                weapon_bit_name( paf->bitvector ),
                paf->level);
            break;

        case WHERE_VULN:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d hr%s (vulnbits %s), lvl %d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                imm_bit_name( paf->bitvector ),
                paf->level);
            break;

        case WHERE_RESIST:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d hr%s (resistbits %s), lvl%d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                imm_bit_name( paf->bitvector ),
                paf->level);
            break;

        case WHERE_IMMUNE:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d hr%s (immunebits %s), lvl%d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                imm_bit_name( paf->bitvector ),
                paf->level);
            break;

        case WHERE_OBJEXTRA:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d hr%s (objbits %s), lvl%d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                extra_bit_name(paf->bitvector),
                paf->level);
            break;

        case WHERE_AFFECTS:
        default:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d hr%s (affbits %s), lvl%d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                affect_bit_name( paf->bitvector ),
                paf->level);
            break;
        case WHERE_AFFECTS2:
            sprintf( buf,
                "`WSp:`x '%s' mods %s by %d for %d hr%s (aff2bits %s), lvl%d.",
                skill_table[(int) paf->type].name,
                affect_loc_name( paf->location ),
                paf->modifier,
                paf->duration,
				paf->duration==1?"":"s",
                affect2_bit_name( paf->bitvector ),
                paf->level);
            break;
        }
		ch->printlnf("| %-80s|", buf);
    }


	//dawn2?
	// show last time skills were used
	{
		int sn;
		if (!IS_NPC(victim))
		{
			for ( sn = 0; sn < MAX_SKILL; sn++ )
			{
				if ( skill_table[sn].name != NULL && victim->pcdata->last_used[sn] > 0 )
				{
					ch->println("|_____________________________________________________________________________|\n|                                                                             |");

					ch->printlnf("| `YSpell LastUsed:`x '%-25s' at %-15s                    |",
						skill_table[sn].name, 
						(char *) ctime( &victim->pcdata->last_used[sn]) );
				}
			}
		}
	}

	ch->println("|_____________________________________________________________________________|");

    return;
}
/**************************************************************************/
void ostat_show_to_char( char_data *ch, OBJ_DATA *obj);
/**************************************************************************/
void do_debugobject( char_data *ch, char *argument )
{
    char arg[MIL];
    OBJ_DATA *obj;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	ch->println("Stat what?");
	return;
    }

    if ( ( obj = get_obj_world( ch, argument ) ) == NULL )
    {
		ch->println("Nothing like that in hell, earth, or heaven.");
		return;
    }

	ch->println("`RDEBUG_OBJECT SET TO THE FOLLOWING OBJECT:`x");
	DEBUG_OBJECT=obj;

	ostat_show_to_char(ch, obj);
    return;
}
/**************************************************************************/
void make_corefile();
/**************************************************************************/
void do_makecorefile( char_data *ch, char *)
{
	make_corefile();
	ch->println("`RCorefile created!`x");
}
/**************************************************************************/