ref: f5aa8e66aaa6184506d08b27ccd4f2b9b0726f12
dir: /main.c/
#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);
}
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);
}
}
}