# kill.awk
# A program to scan the killlog and summarize
# Now scans for new players too
# Author: Linh Ngo
# Date: June 12, 1992
# Modification History:
# 6/29/92 Added scanning for new players
#

# Array setup
BEGIN {
	invalid = "~~~~~~~~~~~~~~~~~~~~~~"
	killed[invalid]		= 0;
	killer[invalid]		= 0;
	count			= 0;
	new[invalid]		= 0;
	conn[invalid]		= 0;
	eof			= 0;
	drops[invalid]		= 0;
	gives[invalid]		= 0;
	load[invalid]		= 0;

}

# killed & killer arrays filled by scanning the log which looks like:
#
#Wed Jun 17 16:18:46 1992 :: Flip killed by Baalzebul at Castle Tower
#Wed Jun 17 17:12:35 1992 :: Chumlee killed by the Elite Red Guard at...
#Wed Jun 17 21:16:27 1992 :: Toidi killed by Princess at Breakfast Nook
# 1   2   3     4     5   6   7      8    9    10     11   12       13

( $8 == "killed" && $9 == "by" ) {
	killed[$7] ++;
	if( $10 != "the" && $10 != "The" && $10 != "a" && $10 != "A" ) {
		name = $10;
		if( name >= "A" && name <= "Z") {
			killer[$10] ++;
		}
	}
	count ++;
}
# Scan for new players. Example of log looks like this:
#Sun Jun 28 19:00:50 1992 :: WIZ: Leia [hydra.gatech.edu] new player.
#Sun Jun 28 19:15:20 1992 :: WIZ: Guardian [bugs.mty.itesm.mx] new player.
#Mon Jun 29 16:54:01 1992 :: WIZ: Larin [wpi.WPI.EDU] new player.
#Mon Jun 29 17:57:47 1992 :: WIZ: Solta [cory.Berkeley.EDU] new player.
#Mon Jun 29 18:01:05 1992 :: WIZ: RH [gold.ucs.indiana.edu] new player.
# 1    2  3    4      5   6   7    8           9             10    11

( $10 == "new" && $11 == "player.") {
	new[$8] = $9
}

# Connections
#Sun Jun 28 19:00:14 1992 :: Baq[spot.Colorado.EDU] has connected.
#Sun Jun 28 19:00:14 1992 :: Alexander[l_ecn09.icaen.uiowa.edu] has connected.
#Sun Jun 28 19:00:14 1992 :: CrystalDeath[tramp.cc.utexas.edu] has connected.
#Sun Jun 28 19:00:17 1992 :: Wint[rose.ucs.indiana.edu] has connected.
# 1   2   3   4       5    6           7                 8    9

( $8 == "has" && $9 == "connected." ) {
	conn[$7] ++;
}
# EOF 
#Sun Jun 28 19:05:48 1992 :: EOF encountered on socket read.
#Sun Jun 28 19:07:35 1992 :: EOF encountered on socket read.
#Sun Jun 28 19:07:58 1992 :: EOF encountered on socket read.
#Sun Jun 28 19:11:32 1992 :: EOF encountered on socket read.
#Sun Jun 28 19:16:41 1992 :: EOF encountered on socket read.
# 1   2  3     4       5   6  7      8        9    10  11
( $7 == "EOF" && $10 == "socket" && $11 == "read." ) {
	eof ++;
}

#Sun Jun 28 19:08:13 1992 :: WIZINFO: (Alexander) load  obj 3902
#Sun Jun 28 19:08:45 1992 :: WIZINFO: (Dbra) load  o 3099
# 1   2   3    4       5   6   7          8   9   10  11

( $7 == "WIZINFO:" && $9 == "load" ) {
	load[$8] ++
}

#Wed Sep  2 03:31:41 1992 :: WIZ: Large transaction: Isaiah drops 1160850 coins
# 1   2   3   4       5   6    7      8         9      10    11    12      13

( $8 == "Large" && $9 == "transaction:" && $11 == "drops" ) {
	drops[$10] += $12;
}

#Wed Sep  2 03:31:49 1992 :: WIZ: Large transaction: Kryal gives 129180 coins to Foo
# 1   2   3   4       5   6    7    8         9       10    11    12     13  14  15

( $8 == "Large" && $9 == "transaction:" && $11 == "gives" ) {
	gives[$10 " to " $15 ] += $12;
}

END {
	printf("----------------------------\n")
	printf("WIZARD LOADS\n\n")
	for (var in load) {
		if(load[var]){
			printf("%-15s %5d\n", var, load[var])
		}
	}
	printf("----------------------------\n")
	printf ("EOF encountered on socket read: %d\n", eof)
	printf("----------------------------\n")
	printf("Total kills %d\n", count);
	printf("----------------------------\n")
	printf("Large transactions: DROPS\n");
	for ( var in drops ) {
		if(drops[var]){
			printf("%15s %-9d\n", var, drops[var])
		}
	}
	printf("----------------------------\n")
	printf("Large transactions: GIVES\n");
	for ( var in gives ) {
		if(gives[var]){
			printf("%25s %-9d\n", var, gives[var])
		}
	}
	printf("----------------------------\n")
	printf("PLAYER KILLERS (could be an NPC):\n\n");
#
# Search for the largest element, print it out, then set it to zero.
# Break out of infinite while loop when all elements are zero.
#
	while (1){
		largest=0
		for (var in killer){
			if (killer[var] >largest){
				largest=killer[var]
				keepvar=var
			}
		}
		if(largest!=0){
			printf("%-15s %7d\n", keepvar, killer[keepvar])
			killer[keepvar]=0
		} else {
			break
		}
	}
	printf("----------------------------\n")
	printf("PLAYERS KILLED (only PC's):\n\n");
#
# Search for the largest element, print it out, then set it to zero.
# Break out of infinite while loop when all elements are zero.
#
	while (1){
		largest=0
		for (var in killed){
			if (killed[var] >largest){
				largest=killed[var]
				keepvar=var
			}
		}
		if(largest!=0){
			printf("%-15s %7d\n", keepvar, killed[keepvar])
			killed[keepvar]=0
		} else {
			break
		}
	}
	printf("----------------------------\n")
	printf("NEW PLAYERS\n\n")
	for (var in new) {
		if( new[var] != 0){
			printf("%-25s %s\n", var, new[var])
		}
	}
	printf("----------------------------\n")
	printf("CONNECTIONS\n\n")
	while (1){
		largest=0
		for (var in conn){
			if (conn[var] >largest){
				largest=conn[var]
				keepvar=var
			}
		}
		if(largest!=0){
			printf("%7d %s\n", conn[keepvar], keepvar)
			conn[keepvar]=0
		} else {
			break
		}
	}
}