/*
 * display.c 
 *
 *  Scott Adkins
 *    sadkins@bigbird.cs.ohiou.edu
 *    sadkins@oucsace.cs.ohiou.edu
 *
 *  Purpose: Provides a curses display for corewars.
 *
 */

#ifdef CURSES
#include "corewar.h"


int CursesInitDisplay()
{
	initscr();

	clear();
	refresh();

	return (1);
}

int CursesEndDisplay()
{
	move(LINES-2,0);
	refresh();

	endwin();

	return (1);
}

int CursesDisplayCore(Core, size, cycles, update, fade, programs, Tasks)
CORE *Core;
int size, cycles, update, fade, programs, *Tasks;
{
	int modulo, offset, owner[MAX_PROG+1];
	int current, age, row, colm;
	register int i, j, k;
	char ch;

	if ((update > 0) && (cycles % update)) return (1);

	modulo = size / ((LINES-4) * (COLS-1));
	if (modulo < 1) modulo = 1;

	for (i = 0; i < LINES-4; i++) {
		for (j = 0; j < COLS-1; j++) {
			if (i*j > size) continue;
			for (k = 0; k <= programs; k++) owner[k] = 0;

			offset = ((i*(COLS-1) + j) * modulo) % size;
			for (k = 0; k < modulo; k++) {
				offset = (offset + k) % size;
				if (Core[offset].Owner <= programs) {
					age = cycles - Core[offset].Aging;
					if ((fade) && (age > fade)) owner[0]++;
					else owner[Core[offset].Owner]++;
				} else owner[0]++;
			}

			owner[0] = 0;
			for (k = 1, current = 0; k <= programs; k++)
				if (owner[k] > owner[current]) current = k;

			if (current < 10) ch = current + '0';
			else ch = current - 10 + 'A';
			if (current == 0) ch = ' ';
			mvaddch(i,j,ch);
		}
	}

	mvprintw(LINES-4,COLS-17,"Cycles: %8d",cycles);
	mvprintw(LINES-4,0,"Tasks:");

	for (i = 1; i <= programs; i++) {
		if (i%2) row = LINES-4;
		else row = LINES-3;
		colm = 7*(i/2 + i%2);
		if (i < 10) ch = i + '0';
		else ch = i - 10 + 'A';
		mvprintw(row,colm,"%c=%3d",ch,Tasks[i-1]);
	}
		
	refresh();

	return (1);
}

int CursesDisplayString(string)
char *string;
{
	mvprintw(LINES-3,COLS-strlen(string)-1,string);
	refresh();
}
#endif
