|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T q
Length: 6241 (0x1861)
Types: TextFile
Names: »qix.h«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/Sun/Qix/qix.h«
/*
* prototype joystick -- simple window with a joystick.
* click right mouse button to activate joystick.
* move mouse in direction to move drawing marker.
* click left mouse button to draw fast.
* click middle mouse button to draw slow.
* click right to stop moving.
* click right mouse twice (after stop moment) to return to normal state.
*
* The machine will not respond sometimes. I don't know why.
* I need suggestions on fixing this interface and making it
* more usable.
*
* compile -lsuntool -lsunwindow -lpixrect
*/
#include <stdio.h>
#include <suntool/sunview.h>
#include <suntool/canvas.h>
#include <sys/time.h>
#include <ctype.h>
#include <sunwindow/cms_rainbow.h>
/* qix uses 0..7 */
#define QIX_COLOR_BASE 0
#define TEXT_COLOR 8
#define SLOW_DRAW_COLOR 16
#define FAST_DRAW_COLOR 32
#define SPARKS_COLOR RED
#define AGGR_SPARK_COLOR BLUE
#define BORDER_COLOR 128
#define QIX_CMS_SIZE 256
#define QIX_CMS_NAME "QIX"
extern int text_mask;
extern int qix_mask;
extern int fast_draw_mask;
extern int slow_draw_mask;
extern int border_mask;
extern int all_mask;
#define when break;case
#define otherwise break;default
#define rrand random
Frame frame;
Canvas Draw, Joystick;
Pixwin *draw_win, *joystick_win;
Pixfont *big_font, *small_font;
int
/* routines to call on sigalrm or sigwinch */
move_joystick(), move_pen(), redraw_board(),
score, /* players score */
lives, /* chances left before end of game */
nitems; /* number of x/y coords in current line drawn */
#define MAX_LIVES 5 /* each game gives 5 lives */
#define LIVE 1
#define DIE -1
#define SPARK_TIME 500
struct itimerval timeout;
long interval; /* 50000 for monochrome or 35000 for color displays */
#define start_timer() \
timeout.it_value.tv_usec = interval, setitimer(ITIMER_REAL, &timeout, NULL);
#define stop_timer() \
timerclear(&timeout.it_value), setitimer(ITIMER_REAL, &timeout, NULL);
#define LINE_SPACE 5 /* dist pen draws from other lines */
#define MARKER_WIDTH 8
#define TOP_BORDER 25
#define BORDER 10 /* should be larger than MARKER_W */
#define BOARD_WIDTH_IN_PIXELS 700
#define BOARD_HEIGHT_IN_PIXELS 750
#define BOARD_WIDTH ((BOARD_WIDTH_IN_PIXELS - 2 * BORDER)/LINE_SPACE)
#define BOARD_HEIGHT ((BOARD_HEIGHT_IN_PIXELS-BORDER-TOP_BORDER)/LINE_SPACE)
#define TOTAL_AREA ((BOARD_WIDTH-1) * (BOARD_HEIGHT-1))
#define TOTAL_QUADRANTS (TOTAL_AREA * 4)
#define MID_X BOARD_WIDTH_IN_PIXELS / 2
#define MID_Y BOARD_HEIGHT_IN_PIXELS / 2
/* the board is a two dimentional array of ints. Values of ints are masked */
int board[BOARD_WIDTH][BOARD_HEIGHT];
/*
* each "cell" ("_CL_") in the playing board may have values masked in.
* If a line is drawn thru a cell, it is entered from one direction and
* is exited to another direction. It may be reentered thus setting the
* bits again. When a region is "closed", it will be painted with a value
* "_PNT_" -- initially, the left border of the board will contain cells whose
* values will have left parts of the cells painted and right parts unpainted.
*/
#define CL_LN_RT 0x0001
#define CL_LN_LF 0x0002
#define CL_LN_UP 0x0004
#define CL_LN_DN 0x0008
#define CL_PNT_UL 0x0010
#define CL_PNT_UR 0x0020
#define CL_PNT_LR 0x0040
#define CL_PNT_LL 0x0080
#define OLD_LINE 0x1000 /* line may be new, old, or neither */
#define NEW_LINE 0x2000
#define CL_PNT_TOP (CL_PNT_UL | CL_PNT_UR)
#define CL_PNT_BOT (CL_PNT_LL | CL_PNT_LR)
#define CL_PNT_LEFT (CL_PNT_UL | CL_PNT_LL)
#define CL_PNT_RIGHT (CL_PNT_UR | CL_PNT_LR)
#define PAINTED (CL_PNT_UL|CL_PNT_UR|CL_PNT_LL|CL_PNT_LR)
#define check_painted(x, y, paint) ((board[x][y] & paint) == paint)
#define SENS_FACTOR 3 /* mouse must move this many pixels to move joystick */
#define convert_x(coord) ((coord) * LINE_SPACE + BORDER)
#define convert_y(coord) ((coord) * LINE_SPACE + TOP_BORDER)
#define pen_coord_x(coord) (convert_x(coord) - MARKER_WIDTH)
#define pen_coord_y(coord) (convert_y(coord) - MARKER_WIDTH)
extern Pixrect pen_image;
/* place_pen() macro XOR's the pen at its current coordinates */
#define place_pen() \
pw_putattributes(draw_win, &qix_mask), \
pw_rop(draw_win, \
pen_coord_x(pen_x), pen_coord_y(pen_y), \
16, 16, XOR|PIX_COLOR(VIOLET), &pen_image, 0, 0)
#define XOR (PIX_SRC^PIX_DST)
#define draw(x1,y1,x2,y2,OP) pw_vector(draw_win, x1,y1,x2,y2,(OP),1)
#define box(x1,y1,x2,y2,OP) \
draw(x1,y1,x1,y2,OP), draw(x1,y2,x2,y2,OP), \
draw(x2,y2,x2,y1,OP), draw(x2,y1,x1,y1,OP)
#ifdef DEBUG
/* "Bert" is the little man who follows points in debug mode */
#define show_bert(x, y) \
if (debug > 2) \
box(convert_x(x)-3, convert_y(y)-3, \
convert_x(x)+3, convert_y(y)+3, XOR), \
usleep(30000), \
box(convert_x(x)-3, convert_y(y)-3, \
convert_x(x)+3, convert_y(y)+3, XOR)
#endif NOT_NOW
#define l_width(font) (font)->pf_defaultsize.x
#define l_height(font) (font)->pf_defaultsize.y
int
moving, /* if moving (e.g. !NO_MOVE), which direction */
#define NO_MOVE 0
#define STOP 1
#define LEFT 2
#define RIGHT 3
#define UP 4
#define DOWN 5
#define LEFT_OF(d) (d==UP? LEFT : d==LEFT ? DOWN : d==DOWN ? RIGHT : UP)
#define RIGHT_OF(d) (d==UP? RIGHT : d==RIGHT ? DOWN : d==DOWN ? LEFT : UP)
#define OPP_OF(d) (d==UP? DOWN : d==RIGHT ? LEFT : d==DOWN ? UP : RIGHT)
pen_x, pen_y, /* the coordinates of the drawing pen */
fast, /* when we're drawing, are we drawing "fast"? */
is_alive, /* if the current play is active or not */
drawing, /* boolean: the pen is/not down (drawing) */
level, /* completing 75% of the board raises you one level */
Speed; /* aggressiveness/speed of qix */
#define MAX_SPEED 15 /* I don't think speed'll ever reach this */
struct region {
int x, y;
struct region *next, *prev;
} *region, *cur_coord, *fuse;
int saved_edge; /* Starting edge's original value of newly drawn lines */
int area_closed;
#ifdef DEBUG
int debug, no_qix_kill; /* debugging stuff */
#endif DEBUG
int play_mode;
#define REAL_PLAY -1 /* must be last in list */
#define SHOW_SCORES 0
#define SHOW_POINTS 1
#define SHOW_QIX 2
#define SHOW_SPARKS 3
#define SHOW_FUSE 4
#define SHOW_SPIRAL 5
#define DEMO 6
int time_left;