|
|
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 a
Length: 4801 (0x12c1)
Types: TextFile
Names: »animate.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/X/Xmille/animate.c«
/*
* animation
*/
# include "mille.h"
# include "ui.h"
# include "card.h"
# include <math.h>
extern int iscolor;
animate_move (player, orig_type, orig_arg, dest_type, dest_arg)
{
#if 0
int ox, oy, dx, dy;
compute_position (player, orig_type, orig_arg, &ox, &oy);
compute_position (player, dest_type, dest_arg, &dx, &dy);
do_animate (ox, oy, dx, dy);
#endif
}
# define abs(x) ((x) < 0 ? -(x) : (x))
# define SPEED_FACTOR (2.5)
# define accerate(v,r) ((v) + (0.1 * (r)))
static
do_animate (ox, oy, dx, dy)
{
double x, y;
double xc, yc;
int xd, yd;
int xp, yp;
int x1, y1, x2, y2, x3, y3, x4, y4;
int ix, iy;
double dist;
double rx, ry;
x = ox;
y = oy;
xd = dx - ox;
yd = dy - oy;
dist = sqrt ((double) xd * xd + yd * yd);
rx = (double) xd / dist;
ry = (double) yd / dist;
xc = SPEED_FACTOR * rx;
yc = SPEED_FACTOR * ry;
xp = yp = -32767;
XFlush (dpy);
while (abs(dx - x) > abs (xc) || abs(dy - y) > abs (yc)) {
ix = x;
iy = y;
if (xp == -32767)
draw_square (ix, iy, ix + WIDTH, iy + HEIGHT);
else {
if (xp < ix) {
x1 = xp + WIDTH;
x2 = ix + WIDTH;
x3 = ix;
x4 = ix + WIDTH;
} else if (xp > ix) {
x1 = ix;
x2 = xp;
x3 = ix;
x4 = ix + WIDTH;
} else {
x1 = -32767;
x2 = -32767;
x3 = ix;
x4 = ix + WIDTH;
}
if (yp < iy) {
y1 = iy;
y2 = yp + HEIGHT;
y3 = yp + HEIGHT;
y4 = iy + HEIGHT;
} else if (yp > iy) {
y1 = yp;
y2 = iy + HEIGHT;
y3 = iy;
y4 = yp;
} else {
y1 = iy;
y2 = iy + HEIGHT;
y3 = -32767;
y4 = -32767;
}
if (x1 != -32767 && y1 != -32767)
draw_square (x1, y1, x2, y2);
if (x3 != -32767 && y3 != -32767)
draw_square (x3, y3, x4, y4);
if (ix < xp) {
x1 = ix + WIDTH;
x2 = xp + WIDTH;
x3 = xp;
x4 = xp + WIDTH;
} else if (ix > xp) {
x1 = xp;
x2 = ix;
x3 = xp;
x4 = xp + WIDTH;
} else {
x1 = -32767;
x2 = -32767;
x3 = xp;
x4 = xp + WIDTH;
}
if (iy < yp) {
y1 = yp;
y2 = iy + HEIGHT;
y3 = iy + HEIGHT;
y4 = yp + HEIGHT;
} else if (iy > yp) {
y1 = iy;
y2 = yp + HEIGHT;
y3 = yp;
y4 = iy;
} else {
y1 = yp;
y2 = yp + HEIGHT;
y3 = -32767;
y4 = -32767;
}
if (x1 != -32767 && y1 != -32767)
draw_square (x1, y1, x2, y2);
if (x3 != -32767 && y3 != -32767)
draw_square (x3, y3, x4, y4);
}
xp = ix;
yp = iy;
if (abs (dx - x) > xc)
x += xc;
if (abs (dy - y) > yc)
y += yc;
xc = accerate(xc, rx);
yc = accerate(yc, ry);
}
draw_square (xp, yp, xp+WIDTH, yp+HEIGHT);
XFlush (dpy);
}
static
draw_square (x1, y1, x2, y2)
{
XSetFunction(dpy, cheap_gc, GXxor);
XSetFillStyle(dpy, cheap_gc, FillSolid);
if (iscolor)
XSetForeground(dpy, cheap_gc,
BlackPixel(dpy, DefaultScreen(dpy)));
else
XSetForeground(dpy, cheap_gc,
WhitePixel(dpy, DefaultScreen(dpy)));
XFillRectangle (dpy, xwindow, cheap_gc, x1, y1, x2-x1, y2-y1);
}
static
compute_position (player, type, arg, xp, yp)
int *xp, *yp;
{
switch (type) {
case ANIMATE_HAND:
switch (player) {
case 0:
*xp = HUM_HAND_X + (WIDTH + PAD_CARD) * arg;
*yp = HUM_HAND_Y;
break;
case 1:
*xp = COMP_HAND_X + (WIDTH + PAD_CARD) * arg;
*yp = COMP_HAND_Y;
break;
}
break;
case ANIMATE_DECK:
*xp = DECK_X;
*yp = DECK_Y;
break;
case ANIMATE_DISC:
*xp = DISCARD_X;
*yp = DISCARD_Y;
break;
case ANIMATE_MILES:
switch (player) {
case 0:
*xp = HUM_PLAY_X + (WIDTH + PAD_CARD) * (2 + C_200 - arg);
*yp = HUM_PLAY_Y;
break;
case 1:
*xp = COMP_PLAY_X + (WIDTH + PAD_CARD) * (2 + C_200 - arg);
*yp = COMP_PLAY_Y;
break;
}
break;
case ANIMATE_BATTLE:
switch (player) {
case 0:
*xp = HUM_PLAY_X + WIDTH + PAD_CARD;
*yp = HUM_PLAY_Y;
break;
case 1:
*xp = COMP_PLAY_X + WIDTH + PAD_CARD;
*yp = COMP_PLAY_Y;
break;
}
break;
case ANIMATE_SPEED:
switch (player) {
case 0:
*xp = HUM_PLAY_X;
*yp = HUM_PLAY_Y;
break;
case 1:
*xp = COMP_PLAY_X;
*yp = COMP_PLAY_Y;
break;
}
break;
case ANIMATE_OBATTLE:
switch (1-player) {
case 0:
*xp = HUM_PLAY_X + WIDTH + PAD_CARD;
*yp = HUM_PLAY_Y;
break;
case 1:
*xp = COMP_PLAY_X + WIDTH + PAD_CARD;
*yp = COMP_PLAY_Y;
break;
}
break;
case ANIMATE_OSPEED:
switch (1-player) {
case 0:
*xp = HUM_PLAY_X;
*yp = HUM_PLAY_Y;
break;
case 1:
*xp = COMP_PLAY_X;
*yp = COMP_PLAY_Y;
break;
}
break;
case ANIMATE_SAFETY:
switch (player) {
case 0:
*xp = HUM_SAFE_X + safety_offsets[arg - S_CONV].x;
*yp = HUM_SAFE_Y + safety_offsets[arg - S_CONV].y;
break;
case 1:
*xp = COMP_SAFE_X + safety_offsets[arg - S_CONV].x;
*yp = COMP_SAFE_Y + safety_offsets[arg - S_CONV].y;
break;
}
break;
}
}