shithub: scoundrel

ref: 2f7ec64f856564b48d3ae7493fae937afe29c794
dir: /main.c/

View raw version
#include <u.h>
#include <libc.h>
#include <draw.h>
#include <keyboard.h>
#include <event.h>
#include "dat.h"
#include "fns.h"

static void
usage(void)
{
	fprint(2, "usage: %s\n", argv0);
	exits("usage");
}

Point carddim;

static void
drawroom(int *cards)
{
	int i;
	Point p;
	Image *img;
	
	for (i = 0; i < 4; i++) {
		if (cards[i] < 0)
			continue;
		img = getimage(cards[i]);
		if (!img)
			sysfatal("%r");
		p.x = i * Dx(img->r);
		p.y = 0;
		p = addpt(p, screen->r.min);
		draw(screen, rectaddpt(img->r, p), img, nil, ZP);
	}
}

int useweapon = 0;

static void
drawweapon(int weapon, int killed)
{
	Point p;
	Image *img;
	
	if (weapon < 0)
		return;
	
	img = getimage(weapon);
	if (!img)
		sysfatal("%r");
	
	p.x = 0;
	p.y = Dy(img->r);
	p = addpt(p, screen->r.min);
	draw(screen, rectaddpt(img->r, p), img, nil, ZP);
	
	if (useweapon) {
		p.x = Dx(img->r)+10;
		p.y = Dy(img->r) + 10;
		p = addpt(p, screen->r.min);
		line(screen, p, Pt(p.x, p.y + Dy(img->r) - 10),
			Enddisc, Enddisc, 4, display->black, ZP);
	}
	
	if (killed < 0)
		return;
	
	img = getimage(killed);
	if (!img)
		sysfatal("%r");
	
	p.x = 0;
	p.y = Dy(img->r) + 30;
	p = addpt(p, screen->r.min);
	draw(screen, rectaddpt(img->r, p), img, nil, ZP);
}

static void
drawstats(State *state)
{
	Point p;
	char s[64];
	
	p.x = carddim.x + 100;
	p.y = carddim.y + 40;
	p = addpt(p, screen->r.min);
	
	snprint(s, sizeof s, "Deck: %d", state->deckcards);
	string(screen, p, display->black, ZP, font, s);
	
	p.y += 50;
	snprint(s, sizeof s, "HP: %d", state->hp);
	string(screen, p, display->black, ZP, font, s);
}

static void
redraw(void)
{
	State *state;
	draw(screen, screen->r, display->white, nil, ZP);
	
	state = getstate();
	
	if (!state->running)
		return;
	
	drawroom(state->room);
	drawweapon(state->weapon, state->lastweaponkill);
	drawstats(state);
}

void
eresized(int new)
{
	if (new && getwindow(display, Refnone) < 0)
		sysfatal("resized: %r");
	
	redraw();
}

static void
handlekbd(int key)
{
	int i;
	switch (key) {
	case 'w':
		useweapon = !useweapon;
		redraw();
		break;
	case '1':
	case '2':
	case '3':
	case '4':
		i = key - '0';
		i = roomaction(i-1, useweapon);
		useweapon = 0;
		if (i) goto Redraw;
		break;
	case 's':
		if (startgame()) goto Redraw;
		break;
	case 'n':
		if (nextround()) goto Redraw;
		break;
	}
Redraw:
	redraw();
}

static void
handlemouse(Mouse m)
{
	int i;
	
	if (m.buttons != 1)
		return;
	
	m.xy.x -= screen->r.min.x;
	m.xy.y -= screen->r.min.y;
	
	if (m.xy.y < carddim.y) {
		/* first row: room cards */
		i = m.xy.x / carddim.x;
		if (roomaction(i, useweapon)) redraw();
		return;
	}
	if (m.xy.y < carddim.y*2) {
		if (m.xy.x < carddim.x) {
			/* weapon card pressed */
			useweapon = !useweapon;
			redraw();
			return;
		}
	}
}

void
main(int argc, char **argv)
{
	int e;
	Event ev;
	Image *img;
	
	ARGBEGIN{
	case 'h':
		usage();
		break;
	}ARGEND;
	
	if (initdraw(nil, nil, "scoundrel") < 0)
		sysfatal("initdraw: %r");
	
	einit(Emouse|Ekeyboard);
	
	loadimages("img");
	
	/* 2 must be valid */
	img = getimage(2);
	carddim.x = Dx(img->r);
	carddim.y = Dy(img->r);
	
	redraw();
	
	for (;;) {
		e = event(&ev);
		switch (e) {
		case Emouse:
			handlemouse(ev.mouse);
			break;
		case Ekeyboard:
			if (ev.kbdc == Kesc || ev.kbdc == 'q')
				exits(nil);
			handlekbd(ev.kbdc);
		}
	}
}