#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"


#ifndef WINDOWS
#include <sys/times.h>
#include <sys/types.h>
#include <sys/resource.h>
#endif  


long mytime(void) {
#ifndef WINDOWS
     struct rusage resources;
     int who = RUSAGE_SELF;   

     int ierr;       
/*     int i;*/

     long utime;   
     long stime;   

     ierr = getrusage (who, &resources);

/* -------------------------------------- */
/* In case of error, return garbage value */
/* -------------------------------------- */

     if (ierr != 0) 
      {
         utime = -1.0;
         stime = -1.0;
         return (utime + stime);
      }

/* ------------------------------------------------ */
/* Otherwise, unpack structure for return of values */
/* ------------------------------------------------ */
/*fprintf(stderr,"%g %ld %g %ld\n",(double) resources.ru_utime.tv_sec,
	resources.ru_utime.tv_usec,
	(double) resources.ru_stime.tv_sec,
	resources.ru_stime.tv_usec);*/

      utime = (resources.ru_utime.tv_sec*1000000) +
      resources.ru_utime.tv_usec;

      stime = (resources.ru_stime.tv_sec*1000000) +
      resources.ru_stime.tv_usec;

      return (utime + stime);
#else
return 0;
#endif

}

long info_mem(int i) { /* 1 = shared, 2 = unshared data, 3 = stack */
#ifndef WINDOWS
     struct rusage resources;
     int who = RUSAGE_SELF;   
	int ierr;
     ierr = getrusage (who, &resources);
fprintf(stderr,"%ld %ld %ld\n",resources.ru_ixrss,resources.ru_idrss,
		resources.ru_isrss);
     if (i==1) return resources.ru_ixrss;
     if (i==2) return resources.ru_idrss;
     if (i==3) return resources.ru_isrss; 
else 
#endif
return 0;
}

#define GENERIC 0
#define ARMS 1
#define HEAD 2
#define BODY 3
#define LEGS 4

int tx,ty;
CHAR_DATA *c;

void send_java_info(DESCRIPTOR_DATA *d) {
int i;
char buf[5000];
i=0;
sprintf(buf,"%c%c",(char)19,(char)32);
while (str_cmp(race_info[i].name,"Blank")) {
	sprintf(buf+strlen(buf),"%c%s\n",((char) (i+1)),race_info[i].name);
	sprintf(buf+strlen(buf),"%c%c%c%c%c",(char)race_info[i].limits[0],
		(char)race_info[i].limits[4],
		(char)race_info[i].limits[3],
		(char)race_info[i].limits[2],
		(char)race_info[i].limits[1]);
	i++;
	}
sprintf(buf+strlen(buf),"%c",(char)200);
write_to_descriptor2(d,buf,0);
return;
}

void java_nc(CHAR_DATA *ch,char *nc) { /* Next command indicator */
char buf[500];
if (!IS_JAVA(ch) && IS_PLAYER(ch)) {
	gotoxy(ch,25,1);
	send_to_char(nc,ch);
	gotoxy(ch,1,ch->pcdata->pagelen);
	return;
	}
sprintf(buf,"%c%c%s%c",(char)19,(char)22,nc,(char)19);
write_to_buffer(ch->desc,buf,0);
return;
}

void java_timeup(CHAR_DATA *ch) { /* Change color */
char buf[500];
if (!IS_JAVA(ch)) {
	return;
	}
sprintf(buf,"%c%c",(char) 29,(char) 3);
write_to_buffer(ch->desc,buf,0);
return;
}
void java_cc(CHAR_DATA *ch,char col) { /* Change color */
char buf[500];
if (!IS_JAVA(ch)) {
	return;
	}
sprintf(buf,"%c%c%c",(char)23,(char)65,(char) col);
write_to_buffer(ch->desc,buf,0);
return;
}

void java_send_profile(CHAR_DATA *ch) {
char buf[10000];
char b1;
char b2;
int wear;
SINGLE_OBJECT *o;
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c",(char)23,(char)66);
for (o=ch->carrying; o!=NULL; o=o->next_content) {
	if (o->wear_loc==WEAR_NONE) continue;
	get_condition(o);
	if (o->pIndexData->java[0]=='\0') {
		b1=(char)1;
		b2=(char)1;
		} else {
		b1=(char)o->pIndexData->java[0];
		b2=(char)o->pIndexData->java[1];
		}
		sprintf(buf+strlen(buf),"%s%c%s%c%c%c%c%s%c",o->pIndexData->name,
		(char)1, o->pIndexData->short_descr, (char)1,
		(char)(o->wear_loc+1),(char)b1,(char)b2,
		condition_var,(char)2);
	}
	sprintf(buf+strlen(buf),"%c",(char)199);
write_to_buffer(ch->desc,buf,0);
return;
}

void java_cnc(CHAR_DATA *ch,char *nc) { /* Clear next command indicator */
char buf[500];
if (!IS_JAVA(ch) && IS_PLAYER(ch)) {
	gotoxy(ch,25,1);
	send_to_char("                   ",ch);
	gotoxy(ch,1,ch->pcdata->pagelen);
	return;
	}
sprintf(buf,"%c%c",(char)19,(char)24);
write_to_buffer(ch->desc,buf,0);
return;
}

void request_java_info(CHAR_DATA *ch, char *argy) {
char persn[500];
CHAR_DATA *victim;
char buf[500];
DEFINE_COMMAND("rui",request_java_info,POSITION_DEAD,110,LOG_NORMAL,"None.. unused.")
argy=one_argy(argy,persn);
if ( (victim=get_char_world(ch,persn)) == NULL ) {
	send_to_char("Player not found.\n\r",ch);
	return;
	}
if (!IS_JAVA(victim)) {
	send_to_char("Character isn't using the java interface.\n\r",ch);
	return;
	}
sprintf(buf,"%c%c",(char)23,(char)69);
write_to_buffer(victim->desc,buf,0);
return;
}

void recieve_java_info(CHAR_DATA *ch, char *argy) {
char buf[2000];
DEFINE_COMMAND("GII",recieve_java_info,POSITION_DEAD,0,LOG_NORMAL,"Java quick-fetch info.  Internal use.")
if (!IS_JAVA(ch)) return;
if (!orn) return;
send_to_char(argy,orn);
send_to_char("\n\r",orn);
return;
}

/* Java client may send GS x y    (Get status of thing at x,y) */
/* Server returns a number from 1 to 100 , preceded by 19,23 */
void handle_gs_da(CHAR_DATA *ch, int x, int y) {
int h,hm;
int nm;
COMBAT_FIELD *cf;
char b1[500];
char b2[500];
int v,iv;
if (!ch->fgt || !ch->fgt->field) return;
if ( (cf=ch->fgt->field) == NULL) return;
if (x<0 || x>6) return;
if (y<0 || y>6) return;
if (!ch->fgt->field->map[x][y]) return;
h=ch->hit;
hm=ch->max_hit;
nm=(h*100)/hm;
if (nm<1) nm=1;
if (nm>100) nm=100;
sprintf(b1,"%c%c%c%c%c",(char)19,(char)23,(char)x+1,(char)y+1,(char)nm);
for (v=0; v<7; v++) {
	for (iv=0; iv<7; iv++) {
		if (!cf->map[v][iv]) continue;
		if (IS_JAVA(cf->map[v][iv])) {
			write_to_buffer(cf->map[v][iv]->desc,b1,0);
			}
		}
	}

return;
}



/* Java client may send GS x y    (Get status of thing at x,y) */
/* Server returns a number from 1 to 100 , preceded by 19,23 */
void handle_gs_d(CHAR_DATA *ch, int x, int y) {
int h,hm;
int nm;
char b1[500];
char b2[500];
if (!IS_JAVA(ch)) return;
if (!ch->fgt || !ch->fgt->field) return;
if (x<0 || x>6) return;
if (y<0 || y>6) return;
if (!ch->fgt->field->map[x][y]) return;
h=ch->fgt->field->map[x][y]->hit;
hm=ch->fgt->field->map[x][y]->max_hit;
nm=(h*100)/hm;
if (nm<1) nm=1;
if (nm>100) nm=100;
sprintf(b1,"%c%c%c%c%c",(char)19,(char)23,(char)x+1,(char)y+1,(char)nm);
write_to_buffer(ch->desc,b1,0);
return;
}



/* Java client may send GS x y    (Get status of thing at x,y) */
/* Server returns a number from 1 to 100 , preceded by 19,23 */
void handle_gs(CHAR_DATA *ch, char *argy) {
int h,hm;
int x,y;
int nm;
char b1[500];
char b2[500];
DEFINE_COMMAND("GS",handle_gs,POSITION_DEAD,0,LOG_NORMAL,"Java quick-fetch mob status by field coord.  Internal use.")
if (!IS_JAVA(ch)) return;
if (!ch->fgt || !ch->fgt->field) return;
argy=one_argy(argy,b1);
argy=one_argy(argy,b2);
x=atoi(b1);
y=atoi(b2);
if (x<0 || x>6) return;
if (y<0 || y>6) return;
if (!ch->fgt->field->map[x][y]) return;
h=ch->fgt->field->map[x][y]->hit;
hm=ch->fgt->field->map[x][y]->max_hit;
nm=(h*100)/hm;
if (nm<1) nm=1;
if (nm>100) nm=100;
sprintf(b1,"%c%c%c%c%c",(char)19,(char)23,(char)x+1,(char)y+1,(char)nm);
write_to_buffer(ch->desc,b1,0);
return;
}


void java_hit_field(COMBAT_FIELD *cf, CHAR_DATA *ch, int oldx, int oldy, int x, int y) {
char buf[500];
oldx++;
oldy++;
x++;
y++;

for (tx=0; tx<7; tx++) {
	for (ty=0; ty<7; ty++) {
		if (cf->map[tx][ty]) {
			if (IS_JAVA(cf->map[tx][ty])) {
				c=cf->map[tx][ty];
				sprintf(buf,"%c%c%c%c%c%c",(char)19,(char)2,(char)oldx,(char)oldy,(char)x,(char)y);
				write_to_buffer(cf->map[tx][ty]->desc,buf,0);
				}
			}
		}
	}

return;
}

void java_send_field(COMBAT_FIELD *cf, CHAR_DATA *ch) {
char buf[500];
if (IS_MOB(ch)) return;
for (tx=0; tx<7; tx++) {
	for (ty=0; ty<7; ty++) {
		if (cf->map[tx][ty]) {
			if (IS_JAVA(ch)) {
				c=cf->map[tx][ty];
				sprintf(buf,"%c%c%c%c",(char)19,(char)4,(char)tx+1,(char)ty+1);
				if (c==ch) {
					sprintf(buf+strlen(buf),"%c%c",(char)1,(char)1);
					} else
				if (IS_PLAYER(c) || c->pIndexData->java[0]=='\0') {
					sprintf(buf+strlen(buf),"%c%c",(char)1,(char)2);
					/* No appearance, show human */
					} else {
					sprintf(buf+strlen(buf),"%c%c",c->pIndexData->java[0],
								/* Appearance */
							       c->pIndexData->java[1]);
					}
				write_to_buffer(ch->desc,buf,0);
				handle_gs_d(ch,tx,ty);
				} else
				{
				c=cf->map[tx][ty];
				gotoxy(ch,tx+50,ty+1);
				if (c==ch) {
					send_to_char("\x1B[37;1mX\x1B[37;0m",ch);
					} else
				if (IS_MOB(c)) {
					send_to_char("#",ch);
					} else {
					if (IS_EVIL(c)) 
					send_to_char("\x1B[31;1mP\x1B[37;0m",ch); 
					else
					send_to_char("\x1B[34;1mP\x1B[37;0m",ch);
					}
				}
			}
		}
	}
if (!IS_JAVA(ch)) gotoxy(ch,1,ch->pcdata->pagelen);

return;
}

void add_ansi(CHAR_DATA *victim, COMBAT_FIELD *cf) {
	if (!IS_SET(victim->pcdata->act3,ACT3_MAPPING) || 
	IS_SET(victim->pcdata->act3,ACT3_DISABLED)) {
		char b[500];
		sprintf(b,"\x1B[9;%dr",victim->pcdata->pagelen);
		send_to_char(b,victim);
		gotoxy(victim,1,1);
		send_to_char("\x1B[K",victim);
		gotoxy(victim,1,2);
		send_to_char("\x1B[K",victim);
		gotoxy(victim,1,3);
		send_to_char("\x1B[K",victim);
		gotoxy(victim,1,4);
		send_to_char("\x1B[K",victim);
		gotoxy(victim,1,5);
		send_to_char("\x1B[K",victim);
		gotoxy(victim,1,6);
		send_to_char("\x1B[K",victim);
		gotoxy(victim,1,7);
		send_to_char("\x1B[K",victim);
		send_to_char("\x1B[8;1f\x1B[37;1m-----------------------------------------------------------------------------\x1B[37;0m",victim);
		}
	gotoxy(victim,50,1);
	send_to_char(".......",victim);
	gotoxy(victim,50,2);
	send_to_char(".......",victim);
	gotoxy(victim,50,3);
	send_to_char(".......",victim);
	gotoxy(victim,50,4);
	send_to_char(".......",victim);
	gotoxy(victim,50,5);
	send_to_char(".......",victim);
	gotoxy(victim,50,6);
	send_to_char(".......",victim);
	gotoxy(victim,50,7);
	send_to_char(".......",victim);
	java_send_field(victim->fgt->field,victim);
return;
}

void java_add_to_field(COMBAT_FIELD *cf, CHAR_DATA *victim,int x,int y) {
int tx,ty;
CHAR_DATA *c;
char buf[500];
x++;
y++;
if (victim->desc && IS_JAVA(victim)) { /* activate combat window for this person. */
	sprintf(buf,"%c%c",(char)19,(char)20);
	write_to_buffer(victim->desc,buf,0);
	java_send_field(cf,victim);
 	}
if (victim->desc && !IS_JAVA(victim)) {	
	add_ansi(victim,cf);
	}
for (tx=0; tx<7; tx++) {
	for (ty=0; ty<7; ty++) {
		if (cf->map[tx][ty])
			if (IS_JAVA(cf->map[tx][ty])) {
				c=cf->map[tx][ty];
				sprintf(buf,"%c%c%c%c",(char)19,(char)4,(char)x,(char)y);
				if (victim==c) {
					sprintf(buf+strlen(buf),"%c%c",(char)1,(char)1);
					} else
				if (IS_PLAYER(victim) || victim->pIndexData->java[0]=='\0') {
					sprintf(buf+strlen(buf),"%c%c",(char)1,(char)2);
					/* No appearance, show human */
					} else {
					sprintf(buf+strlen(buf),"%c%c",victim->pIndexData->java[0],
								/* Appearance */
							       victim->pIndexData->java[1]);
					}
				write_to_buffer(c->desc,buf,0);
				handle_gs_d(c,x-1,y-1);
				} else {
				c=cf->map[tx][ty];
				if (IS_MOB(c)) continue;
				gotoxy(c,x+49,y);
				if (victim==c) {
					send_to_char("\x1B[37;1mX\x1B[37;0m",c);
					} else
				if (IS_MOB(victim)) {
					send_to_char("#",c);
					} else {
					if (IS_EVIL(c)) 
					send_to_char("\x1B[31;1mP\x1B[37;0m",c); 
					else
					send_to_char("\x1B[34;1mP\x1B[37;0m",c);
					}
				gotoxy(c,1,c->pcdata->pagelen);
			}
		}
	}

return;
}

void java_remove_from_combat_field(COMBAT_FIELD *cf, CHAR_DATA *ch, int x, int y) {
char buf[500];
x++;
y++;
if (IS_JAVA(ch)) { /* out of combat, tell it to end */
	sprintf(buf,"%c%c",(char)19,(char)21);
	write_to_buffer(ch->desc,buf,0);
	} else
if (IS_PLAYER(ch)) {
	if (!IS_SET(ch->pcdata->act3,ACT3_MAPPING) || 
	IS_SET(ch->pcdata->act3,ACT3_DISABLED)) {
		char b[500];
		sprintf(b,"\x1B[1;%dr",ch->pcdata->pagelen);
		send_to_char(b,ch);
		}
	gotoxy(ch,50,1);
	send_to_char("\x1B[K",ch);
	gotoxy(ch,50,2);
	send_to_char("\x1B[K",ch);
	gotoxy(ch,50,3);
	send_to_char("\x1B[K",ch);
	gotoxy(ch,50,4);
	send_to_char("\x1B[K",ch);
	gotoxy(ch,50,5);
	send_to_char("\x1B[K",ch);
	gotoxy(ch,50,6);
	send_to_char("\x1B[K",ch);
	gotoxy(ch,50,7);
	send_to_char("\x1B[K",ch);
	gotoxy(ch,1,ch->pcdata->pagelen);
	}
for (tx=0; tx<7; tx++) {
	for (ty=0; ty<7; ty++) {
		if (cf->map[tx][ty]) {
			if (IS_JAVA(cf->map[tx][ty])) {
				c=cf->map[tx][ty];
				sprintf(buf,"%c%c%c%c",(char)19,(char)3,(char)x,(char)y);
				write_to_buffer(c->desc,buf,0);
				} else {
				c=cf->map[tx][ty];
				if (IS_MOB(c)) continue;
				gotoxy(c,x+49,y);
				send_to_char(".",c);
				gotoxy(c,1,c->pcdata->pagelen);
				}
			}
		}
	}

return;
}

void java_make_splat(COMBAT_FIELD *cf, int x, int y) {
char buf[500];
x++;
y++;
for (tx=0; tx<7; tx++) {
	for (ty=0; ty<7; ty++) {
		if (cf->map[tx][ty] && IS_JAVA(cf->map[tx][ty])) {
			c=cf->map[tx][ty];
			sprintf(buf,"%c%c%c%c",(char)19,(char)7,(char)x,(char)y);
			write_to_buffer(c->desc,buf,0);
			}
		}
	}

return;
}

void java_update_field(COMBAT_FIELD *cf, CHAR_DATA *ch, int oldx, int oldy, int x, int y) {
char buf[500];
oldx++;
oldy++;
x++;
y++;
for (tx=0; tx<7; tx++) {
	for (ty=0; ty<7; ty++) {
		if (cf->map[tx][ty]) {
		 		if (IS_JAVA(cf->map[tx][ty])) {
				c=cf->map[tx][ty];
				sprintf(buf,"%c%c%c%c%c%c",(char)19,(char)1,(char)oldx,(char)oldy,(char)x,(char)y);
				write_to_buffer(c->desc,buf,0);
				handle_gs_d(c,x-1,y-1);
				} else {
				c=cf->map[tx][ty];
				if (IS_MOB(c)) continue;
				gotoxy(c,oldx+49,oldy);
				send_to_char(".",c);
				gotoxy(c,x+49,y);
				if (ch==c) {
					send_to_char("\x1B[37;1mX\x1B[37;0m",c);
					} else {
				if (IS_MOB(ch)) {
					send_to_char("#",c);
					} else {
					if (IS_EVIL(c)) 
					send_to_char("\x1B[31;1mP\x1B[37;0m",c); 
					else
					send_to_char("\x1B[34;1mP\x1B[37;0m",c);
					}
				   }
				gotoxy(c,1,c->pcdata->pagelen);
				}
			}
		}
	}

return;
}

/* Send java room exits information package.
   24,2 then OLD was NESEUD 
   New format: 24,2, then 1,2,3,4,5,6 (dir+1).
   if > 10, sub 10, add fly
   if > 20, sub 20, add swim
   if > 30, sub 30, add closed door
   if > 40, sub 40, add hidden (holywalk)
   if > 50, sub 50, add underwater
*/

void java_exits(CHAR_DATA *ch, char *s) { /* Add hidden/water/etc LATER!!! */
char buf[50];
if (!IS_JAVA(ch) || !ch->in_room) return;
sprintf(buf,"%c%c",(char)24,(char)2);
sprintf(buf+strlen(buf),"%s",s);
/*
if (ch->in_room->exit[DIR_NORTH] && ch->in_room->exit[DIR_NORTH]->to_room) {
	sprintf(buf+strlen(buf),"N");
	}
if (ch->in_room->exit[DIR_EAST] && ch->in_room->exit[DIR_EAST]->to_room) {
	sprintf(buf+strlen(buf),"E");
	}
if (ch->in_room->exit[DIR_SOUTH] && ch->in_room->exit[DIR_SOUTH]->to_room) {
	sprintf(buf+strlen(buf),"S");
	}
if (ch->in_room->exit[DIR_WEST] && ch->in_room->exit[DIR_WEST]->to_room) {
	sprintf(buf+strlen(buf),"W");
	}
if (ch->in_room->exit[DIR_UP] && ch->in_room->exit[DIR_UP]->to_room) {
	sprintf(buf+strlen(buf),"U");
	}
if (ch->in_room->exit[DIR_DOWN] && ch->in_room->exit[DIR_DOWN]->to_room) {
	sprintf(buf+strlen(buf),"D");
	}
*/
sprintf(buf+strlen(buf),"%c",(char)199); /* End packet */
write_to_buffer(ch->desc,buf,0);
return;
}

/*
Special flags: 26,105 = moving from room, clear mob window

 Data storage on client end:
 array of 10 pics (only show first 10 mobs)
 array of 10 strings, holding keywords for these 10 mobs.
 array of 10 strings, holding short descs for these 10 mobs.
 short desc shown under mob picture.
 when selecting, check from string 1 to see if a dupe is there.  If so,
 append 2. or 3., etc, to the front of the selection string.
 bottom of this window shows the mob info currently clicked on.

 Only display text.. but after a certain amount of time, display
 the pictures when sent 26 110
*/



void java_clear_inv_window(CHAR_DATA *ch) {
char buf[500];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c",(char)24,(char)8); /* 24 8 is prepare inventory window */
write_to_buffer(ch->desc,buf,0);
return;
}

void java_nomore_inv_window(CHAR_DATA *ch) {
char buf[500];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c",(char)24,(char)9); /* 24 9 is stop redir to inventory window */
write_to_buffer(ch->desc,buf,0);
return;
}

void invoke_who_window(CHAR_DATA *ch) {
char buf[500];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c",(char)24,(char)5); /* 24 5 is prepare who window */
write_to_buffer(ch->desc,buf,0);
return;
}

void add_who_entry(CHAR_DATA *ch, CHAR_DATA *wch) {
/* Only will work if in invoked who window mode */
char buf[500];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c",(char)24,(char)7); /* prepare for entry */
sprintf(buf+strlen(buf),"%c%c",(char)(wch->pcdata->quiet+10),(char)1);
	/* quiet + 10 so not sending double 1's */
sprintf(buf+strlen(buf),"%c%c",(char)(wch->desc->connected==CON_PLAYING?5:6),(char)1);
	/* 5 = playing, 6 = building */
sprintf(buf+strlen(buf),"%c%c",(char)(IS_EVIL(wch) ? 5 : 6),(char)1);
	/* 5 = evil, 6 = non-evil */
sprintf(buf+strlen(buf),"%c%c%c%c",(char)(IS_SET(wch->pcdata->act2,PLR_SILENCE)?6:5),(char)1,
	(char)(wch->pcdata->wizinvis!=0?6:5),(char)1);
	/* 6 = silenced, 5 = normal */
	/* 6 = wizinvis, 5 = normal */
sprintf(buf+strlen(buf),"%s%c%s%c",NAME(wch),(char)1,wch->pcdata->title,(char)1);
	/* Name, 1, Title, 1 */
sprintf(buf+strlen(buf),"%d%c",LEVEL(wch),(char)1);
	/* Level, 1 */
sprintf(buf+strlen(buf),"%c%c",(char)((wch->timer>49)?6:5),(char)1);
	/* AFK = 6, non AFK = 5 */

sprintf(buf+strlen(buf),"%c",(char)24); /* end entry */
write_to_buffer(ch->desc,buf,0);
return;
}

void show_who_window(CHAR_DATA *ch) {
char buf[500];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c",(char)24,(char)6); /* 24 6 is show who window */
write_to_buffer(ch->desc,buf,0);
return;
}

/* Remove color from object shorts. */

void java_add_obj_window(CHAR_DATA *ch, SINGLE_OBJECT *obj) { /* standard id 1 1 */
char buf[500];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c",(char)24,(char)1); /* 24 4 is ADD and repaint */
/* Add obj code */

if (obj->pIndexData->java[0]=='\0') {
	sprintf(buf+strlen(buf),"%c%c",(char)1,(char)1);
	/* No appearance, show as default */
	} else {
	sprintf(buf+strlen(buf),"%c%c",obj->pIndexData->java[0],
				/* Appearance */
			       obj->pIndexData->java[1]);
	}
	sprintf(buf+strlen(buf),"%s%c%s%c",obj->pIndexData->name, (char)1,
				   (obj->short_descr ? obj->short_descr : obj->pIndexData->short_descr),(char)1);

sprintf(buf+strlen(buf),"%c",(char)28); 	/* Done transmission */
/* 25 is code for OBJECT, not mob! */
write_to_buffer(ch->desc,buf,0);
return;
}

void java_add_obj_inv_window(CHAR_DATA *ch, SINGLE_OBJECT *obj) { /* standard id 1 1 */
char buf[500];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c",(char)24,(char)31);
/* Add obj code */

if (obj->pIndexData->java[0]=='\0') {
	sprintf(buf+strlen(buf),"%c%c",(char)1,(char)1);
	/* No appearance, show as default */
	} else {
	sprintf(buf+strlen(buf),"%c%c",obj->pIndexData->java[0],
				/* Appearance */
			       obj->pIndexData->java[1]);
	}
	sprintf(buf+strlen(buf),"%s%c%s%c",obj->pIndexData->name, (char)1,
				   (obj->short_descr ? obj->short_descr : obj->pIndexData->short_descr),(char)1);

sprintf(buf+strlen(buf),"%c",(char)28); 	/* Done transmission */
write_to_buffer(ch->desc,buf,0);
return;
}



void java_add_mob_window(CHAR_DATA *ch, CHAR_DATA *victim) { /* players id 1 1 */
char buf[500];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c",(char)24,(char)1);  /* 24 4 is repaint and add! */
/* Add mob code */

if (IS_PLAYER(victim) || victim->pIndexData->java[0]=='\0') {
	sprintf(buf+strlen(buf),"%c%c",(char)1,(char)1);
	/* No appearance, show human */
	} else {
	sprintf(buf+strlen(buf),"%c%c",victim->pIndexData->java[0],
				/* Appearance */
			       victim->pIndexData->java[1]);
	}

if (IS_PLAYER(victim)) {
	sprintf(buf+strlen(buf),"%s%c%s%c",NAME(victim), (char)1,
				   NAME(victim),(char)1);
	} else {
	sprintf(buf+strlen(buf),"%s%c%s%c",victim->pIndexData->name, (char)1,
				   victim->pIndexData->short_descr,(char)1);
	/* Mob's keywords, 1, short description, 1 */
	}

sprintf(buf+strlen(buf),"%c",(char)29); 	/* Done transmission */
write_to_buffer(ch->desc,buf,0);
return;
}


/* 24, 9, name, 24 ... remove obj from the window */
void java_remove_obj_stuff(CHAR_DATA *ch, SINGLE_OBJECT *victim) {
char buf[50];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c%s%c",(char) 24,(char) 3, 
	victim->pIndexData->name,
 	(char) 24);
write_to_buffer(ch->desc,buf,0);
return;
}

/* 24, 30, name, 24 ... remove obj from the inventory window */
void java_remove_obj_inv(CHAR_DATA *ch, SINGLE_OBJECT *victim) {
char buf[50];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c%s%c",(char) 24,(char) 30, 
	victim->pIndexData->name,
 	(char) 24);
write_to_buffer(ch->desc,buf,0);
return;
}



/* 24, 3, name, 24 ... remove mob from the window */
void java_remove_mob_stuff(CHAR_DATA *ch, CHAR_DATA *victim) {
char buf[50];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c%s%c",(char) 24,(char) 3, 
	(IS_MOB(victim) ? victim->pIndexData->name : NAME(victim)),
 	(char) 24);
write_to_buffer(ch->desc,buf,0);
return;
}

void java_clear_mob_window(CHAR_DATA *ch) {
char buf[50];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c ",(char) 26,(char) 105);
write_to_buffer(ch->desc,buf,0);
return;
}

void java_show_mob_window(CHAR_DATA *ch) {
char buf[50];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c ",(char) 26,(char) 110);
write_to_buffer(ch->desc,buf,0);
return;
}

void java_show_mob_window_pic(CHAR_DATA *ch) {
char buf[50];
if (!IS_JAVA(ch)) return;
sprintf(buf,"%c%c ",(char) 26,(char) 111);
write_to_buffer(ch->desc,buf,0);
return;
}

void java_obj_window(CHAR_DATA *ch, SINGLE_OBJECT *obj) { /* standard id 1 1 */
char buf[500];
if (!IS_JAVA(ch)) return;
ch->desc->pic_wait=PIC_WAIT;
sprintf(buf,"%c%c",(char)24,(char)1);
/* Add obj code */

if (obj->pIndexData->java[0]=='\0') {
	sprintf(buf+strlen(buf),"%c%c",(char)1,(char)1);
	/* No appearance, show as default */
	} else {
	sprintf(buf+strlen(buf),"%c%c",obj->pIndexData->java[0],
				/* Appearance */
			       obj->pIndexData->java[1]);
	}
	sprintf(buf+strlen(buf),"%s%c%s%c",obj->pIndexData->name, (char)1,
				   (obj->short_descr ? obj->short_descr : obj->pIndexData->short_descr),(char)1);

sprintf(buf+strlen(buf),"%c",(char)25); 	/* Done transmission */
/* 25 is code for OBJECT, not mob! */
write_to_buffer(ch->desc,buf,0);
return;
}



void java_mob_window(CHAR_DATA *ch, CHAR_DATA *victim) { /* players id 1 1 */
char buf[500];
if (!IS_JAVA(ch)) return;
ch->desc->pic_wait=PIC_WAIT;
sprintf(buf,"%c%c",(char)24,(char)1);
/* Add mob code */

if (IS_PLAYER(victim) || victim->pIndexData->java[0]=='\0') {
	sprintf(buf+strlen(buf),"%c%c",(char)1,(char)1);
	/* No appearance, show human */
	} else {
	sprintf(buf+strlen(buf),"%c%c",victim->pIndexData->java[0],
				/* Appearance */
			       victim->pIndexData->java[1]);
	}

if (IS_PLAYER(victim)) {
	sprintf(buf+strlen(buf),"%s%c%s%c",NAME(victim), (char)1,
				   NAME(victim),(char)1);
	} else {
	sprintf(buf+strlen(buf),"%s%c%s%c",victim->pIndexData->name, (char)1,
				   victim->pIndexData->short_descr,(char)1);
	/* Mob's keywords, 1, short description, 1 */
	}

sprintf(buf+strlen(buf),"%c",(char)24); 	/* Done transmission */
write_to_buffer(ch->desc,buf,0);
return;
}

void java_package(CHAR_DATA *ch) {  /* Send full data to stats window */
char b[500];
if (!IS_JAVA(ch)) return;

/* Start sequence */
sprintf(b,"%c",(char) 30);      /* Char 30 is start and end. 1 is delim */
sprintf(b+strlen(b),"%s%c",NAME(ch),(char) 1);
/* Name */
sprintf(b+strlen(b),"%s%c",race_info[ch->pcdata->race].name,(char) 1);
/* Race */
sprintf(b+strlen(b),"%s%c",(SEX(ch)==SEX_MALE ? "M" : "F"),(char) 1);
/* Sex */
sprintf(b+strlen(b),"%d'%d\"%c",ch->height/12,ch->height%12,(char) 1);
/* height */
sprintf(b+strlen(b),"%d%c%d%c", ch->hit, (char) 1, ch->max_hit, (char) 1);
/* hit/max hit */
sprintf(b+strlen(b),"%d%c%d%c", ch->move, (char) 1, ch->max_move, (char) 1);
/* move/max move */
sprintf(b+strlen(b),"%d%c", LEVEL(ch), (char) 1);
/* Level */
sprintf(b+strlen(b),"%d%c%d%c%d%c%d%c%d%c",get_curr_str(ch),(char) 1,
					   get_curr_con(ch),(char) 1,
					   get_curr_dex(ch),(char) 1,
					   get_curr_wis(ch),(char) 1,
					   get_curr_int(ch),(char) 1);
/* S,C,D,W,I */
sprintf(b+strlen(b),"%d%c%d%c",mana_now(ch),(char) 1,max_mana(ch),(char) 1);
/* Mana, max mana */
sprintf(b+strlen(b),"%d%c%d%c%ld%c%ld%c",ch->pcdata->tps,(char) 1,
				   (FIND_TPS(LEVEL(ch),0)-ch->pcdata->tps),(char) 1,
				   ch->exp,(char) 1,
				   (FIND_EXP(LEVEL(ch),0)-ch->exp),(char) 1);
/* TPS, TPS to level, EXP, EXP to level */
sprintf(b+strlen(b),"%d%c%d%c%ld%c",ch->gold,(char) 1,ch->copper,(char) 1,
				   ch->pcdata->bank,(char) 1);
/* Gold, Copper, bank copper */

sprintf(b+strlen(b),"%d%c%d%c",ch->pcdata->learn,(char) 1, ch->pcdata->practice,
				(char) 1);
/* Learns, pracs */
/*sprintf(b+strlen(b),"", (char) 1);
sprintf(b+strlen(b),"", (char) 1);
sprintf(b+strlen(b),"", (char) 1);
sprintf(b+strlen(b),"", (char) 1);
sprintf(b+strlen(b),"", (char) 1);
sprintf(b+strlen(b),"", (char) 1);
sprintf(b+strlen(b),"", (char) 1);
sprintf(b+strlen(b),"", (char) 1);
sprintf(b+strlen(b),"", (char) 1);
sprintf(b+strlen(b),"", (char) 1);*/
sprintf(b+strlen(b),"%c",(char) 30);
write_to_descriptor2(ch->desc,b,0);
return;
}

void java_position(CHAR_DATA *ch) {
char b[50];
if (!IS_JAVA(ch)) return;
sprintf(b,"%c%c%c ",(char) 26, (char) 73,(char)(ch->position+1)); /* 26,73 = update position */
write_to_buffer(ch->desc,b,0);
return;
}

void NEW_POSITION(CHAR_DATA *ch,int nw) {
if (ch->position==nw) return;
ch->position=nw;
if (IS_JAVA(ch)) java_position(ch);
return;
}

void java_hits(CHAR_DATA *ch) {
char b[50];
if (!IS_JAVA(ch)) return;
sprintf(b,"%c%c%d ",(char) 26, (char) 70,ch->hit); /* 26,70 = update hit points */
write_to_buffer(ch->desc,b,0);
return;
}

void java_mana(CHAR_DATA *ch) {
char b[50];
if (!IS_JAVA(ch)) return;
sprintf(b,"%c%c%d ",(char) 26, (char) 72,mana_now(ch)); /* 26,72 = update mana */
write_to_buffer(ch->desc,b,0);
return;
}


void java_moves(CHAR_DATA *ch) {
char b[50];
if (!IS_JAVA(ch)) return;
sprintf(b,"%c%c%d ",(char) 26, (char) 71,ch->move); /* 26,71 = update move points */
write_to_buffer(ch->desc,b,0);
return;
}

void SUBHIT(CHAR_DATA *ch,int i) {
MARK_CHAR_DEBUG("Subhit",ch)
if (!ch || ch->data_type==50) {
	fprintf(stderr,"NULL character or free'd character in SUBHIT.\n");
	return;
	}
ch->hit-=i;
if (IS_JAVA(ch)) {
	java_hits(ch);
	}
return;
}

void SUBMOVE(CHAR_DATA *ch,int i) {
MARK_CHAR_DEBUG("Submove",ch)
if (!ch || ch->data_type==50) {
	fprintf(stderr,"NULL character or free'd character in SUBMOVE.\n");
	return;
	}
ch->move-=i;
if (IS_JAVA(ch)) {
	java_moves(ch);
	}
return;
}

void ADDHIT(CHAR_DATA *ch,int i) {
MARK_DEBUG("Addhit")
ch->hit+=i;
if (IS_JAVA(ch)) {
	java_hits(ch);
	}
return;
}

void ADDMOVE(CHAR_DATA *ch,int i) {
MARK_DEBUG("Addmove")
if (!ch) return;
ch->move+=i;
if (IS_JAVA(ch)) {
	java_moves(ch);
	}
return;
}

void MAXHIT(CHAR_DATA *ch) {
ch->hit=ch->max_hit;
if (IS_JAVA(ch)) {
	java_hits(ch);
	}
return;
}

void MAXMOVE(CHAR_DATA *ch) {
ch->move=ch->max_move;
if (IS_JAVA(ch)) {
	java_moves(ch);
	}
return;
}



void
read_damages (void)
{
  FILE *df;
  int lastflag = 0;
  int lastmark[5];
  char buf[1000];
  lastmark[GENERIC] = 0;
  lastmark[ARMS] = 0;
  lastmark[HEAD] = 0;
  lastmark[BODY] = 0;
  lastmark[LEGS] = 0;
  bzero (&dmsg, sizeof (dmsg));
  if ((df = fopen ("dam.dat", "r")) == NULL)
    {
#ifdef MPV_LEVELS
      damt.kick_dam = str_dup ("dm42+k");
#else
      damt.kick_dam = str_dup ("d/2m35+k");
#endif
      write_damages ();
    }
  for (;;)
    {
      strcpy (buf, fread_word (df));
      if (!str_cmp (buf, "END"))
	break;
      if (!str_cmp (buf, "Kickd"))
	damt.kick_dam = str_dup (fread_word (df));
      if (!str_prefix ("#", buf))
	{
	  fread_to_eol (df);
	  continue;
	}
      if (!str_cmp (buf, "GENERIC"))
	{
	  lastflag = GENERIC;
	  dmsg.generic_range[lastmark[lastflag]][0] = fread_number (df);
	  dmsg.generic_range[lastmark[lastflag]][1] = fread_number (df);
	  dmsg.generic_percent[lastmark[lastflag]][0] = fread_number (df);
	  dmsg.generic_percent[lastmark[lastflag]][1] = fread_number (df);
	  fread_to_eol (df);
	  dmsg.gen_m[lastmark[lastflag]][0] = fread_string_eol (df);
	  dmsg.gen_m1[lastmark[lastflag]][0] = fread_string_eol (df);
	  dmsg.gen_m2[lastmark[lastflag]][0] = fread_string_eol (df);
	  lastmark[lastflag]++;
	}
      if (!str_cmp (buf, "BODY"))
	{
	  lastflag = BODY;
	  dmsg.body_range[lastmark[lastflag]][0] = fread_number (df);
	  dmsg.body_range[lastmark[lastflag]][1] = fread_number (df);
	  dmsg.body_percent[lastmark[lastflag]][0] = fread_number (df);
	  dmsg.body_percent[lastmark[lastflag]][1] = fread_number (df);
	  fread_to_eol (df);
	  dmsg.body_m[lastmark[lastflag]][0] = fread_string_eol (df);
	  dmsg.body_m1[lastmark[lastflag]][0] = fread_string_eol (df);
	  dmsg.body_m2[lastmark[lastflag]][0] = fread_string_eol (df);
	  lastmark[lastflag]++;
	}
      if (!str_cmp (buf, "LEGS"))
	{
	  lastflag = LEGS;
	  dmsg.leg_range[lastmark[lastflag]][0] = fread_number (df);
	  dmsg.leg_range[lastmark[lastflag]][1] = fread_number (df);
	  dmsg.leg_percent[lastmark[lastflag]][0] = fread_number (df);
	  dmsg.leg_percent[lastmark[lastflag]][1] = fread_number (df);
	  fread_to_eol (df);
	  dmsg.leg_m[lastmark[lastflag]][0] = fread_string_eol (df);
	  dmsg.leg_m1[lastmark[lastflag]][0] = fread_string_eol (df);
	  dmsg.leg_m2[lastmark[lastflag]][0] = fread_string_eol (df);
	  lastmark[lastflag]++;
	}
      if (!str_cmp (buf, "ARMS"))
	{
	  lastflag = ARMS;
	  dmsg.arm_range[lastmark[lastflag]][0] = fread_number (df);
	  dmsg.arm_range[lastmark[lastflag]][1] = fread_number (df);
	  dmsg.arm_percent[lastmark[lastflag]][0] = fread_number (df);
	  dmsg.arm_percent[lastmark[lastflag]][1] = fread_number (df);
	  fread_to_eol (df);
	  dmsg.arm_m[lastmark[lastflag]][0] = fread_string_eol (df);
	  dmsg.arm_m1[lastmark[lastflag]][0] = fread_string_eol (df);
	  dmsg.arm_m2[lastmark[lastflag]][0] = fread_string_eol (df);
	  lastmark[lastflag]++;
	}
      if (!str_cmp (buf, "HEAD"))
	{
	  lastflag = HEAD;
	  dmsg.head_range[lastmark[lastflag]][0] = fread_number (df);
	  dmsg.head_range[lastmark[lastflag]][1] = fread_number (df);
	  dmsg.head_percent[lastmark[lastflag]][0] = fread_number (df);
	  dmsg.head_percent[lastmark[lastflag]][1] = fread_number (df);
	  fread_to_eol (df);
	  dmsg.head_m[lastmark[lastflag]][0] = fread_string_eol (df);
	  dmsg.head_m1[lastmark[lastflag]][0] = fread_string_eol (df);
	  dmsg.head_m2[lastmark[lastflag]][0] = fread_string_eol (df);
	  lastmark[lastflag]++;
	}
      if (!str_cmp (buf, "SECOND_RANDOM"))
	{
	  fread_to_eol (df);
	  if (lastflag == GENERIC)
	    {
	      dmsg.gen_m[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	      dmsg.gen_m1[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	      dmsg.gen_m2[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	    }
	  if (lastflag == ARMS)
	    {
	      dmsg.arm_m[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	      dmsg.arm_m1[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	      dmsg.arm_m2[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	    }
	  if (lastflag == BODY)
	    {
	      dmsg.body_m[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	      dmsg.body_m1[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	      dmsg.body_m2[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	    }
	  if (lastflag == LEGS)
	    {
	      dmsg.leg_m[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	      dmsg.leg_m1[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	      dmsg.leg_m2[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	    }
	  if (lastflag == HEAD)
	    {
	      dmsg.head_m[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	      dmsg.head_m1[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	      dmsg.head_m2[lastmark[lastflag] - 1][1] = fread_string_eol (df);
	    }
	}
    }
  fclose (df);
  return;
}

char *
star_a (int dam, int maxhit)
{
  static char rs[100];
  int percent = (dam * 100) / maxhit;
  rs[0] = '\0';
  if (percent < 1)
    strcpy (rs, "barely scratches");
  else if (percent < 2)
    strcpy (rs, "lightly scratches");
  else if (percent < 3)
    strcpy (rs, "scratches");
  else if (percent < 5)
    strcpy (rs, "mildly wounds");
  else if (percent < 8)
    strcpy (rs, "wounds");
  else if (percent < 11)
    strcpy (rs, "badly wounds");
  else if (percent < 15)
    strcpy (rs, "causes major injury to");
  else if (percent < 20)
    strcpy (rs, "mangles");
  else if (percent < 35)
    strcpy (rs, "devastates");
  else if (percent < 70)
    strcpy (rs, "PULVERIZES");
  else
    strcpy (rs, "OBLITERATES");
  return rs;
}

char *
star_b (int dam, int maxhit)
{
  static char rst[100];
  int percent = (dam * 100) / maxhit;
  rst[0] = '\0';
  if (percent < 1)
    strcpy (rst, "barely scratching");
  else if (percent < 2)
    strcpy (rst, "lightly scratching");
  else if (percent < 3)
    strcpy (rst, "scratching");
  else if (percent < 5)
    strcpy (rst, "mildly wounding");
  else if (percent < 8)
    strcpy (rst, "wounding");
  else if (percent < 11)
    strcpy (rst, "badly wounding");
  else if (percent < 15)
    strcpy (rst, "causing major injury to");
  else if (percent < 20)
    strcpy (rst, "mangling");
  else if (percent < 35)
    strcpy (rst, "devastating");
  else if (percent < 70)
    strcpy (rst, "PULVERIZING");
  else
    strcpy (rst, "OBLITERATING");
  return rst;
}


void
display_dam_stuff (CHAR_DATA * ch)
{
  char buff[500];
  sprintf (buff, "Kick_dam....: %s --> %ld %ld %ld %ld\n", damt.kick_dam,
	   translate (damt.kick_dam,
		      LEVEL (ch), ch),
	   translate (damt.kick_dam,
		      LEVEL (ch), ch),
	   translate (damt.kick_dam,
		      LEVEL (ch), ch),
	   translate (damt.kick_dam,
		      LEVEL (ch), ch));
  send_to_char (buff, ch);
  return;
}

void
do_dam (CHAR_DATA * ch, char *argy)
{
  DEFINE_COMMAND ("damage", do_dam, POSITION_DEAD, 110, LOG_NORMAL, "Checks kick damage.")
    display_dam_stuff (ch);
  return;
}