3
|
1 /* $Id: rotate.c,v 1.1.1.1 1997/12/06 05:41:30 darius Exp $ */
|
|
2
|
|
3 /*
|
|
4 * rotate.c
|
|
5 *
|
|
6 */
|
|
7 #include "copyright2.h"
|
|
8
|
|
9 #include <stdio.h>
|
|
10 #include <sys/types.h>
|
|
11 #ifndef AMIGA /* not that this file needs any network
|
|
12 stuff... -JR */
|
|
13 #include <sys/socket.h>
|
|
14 #include <sys/time.h>
|
|
15 #include <netinet/in.h>
|
|
16 #include <netinet/tcp.h>
|
|
17 #include <netdb.h>
|
|
18 #endif
|
|
19 #include <math.h>
|
|
20 #include <errno.h>
|
|
21 #include "Wlib.h"
|
|
22 #include "defs.h"
|
|
23 #include "struct.h"
|
|
24 #include "data.h"
|
|
25 #include "packets.h"
|
|
26
|
|
27 #ifdef ROTATERACE
|
|
28
|
|
29 void
|
|
30 rotate_dir(d, r)
|
|
31 unsigned char *d;
|
|
32 int r;
|
|
33 {
|
|
34 (*d) += r;
|
|
35 }
|
|
36
|
|
37 /* general rotation */
|
|
38
|
|
39 void
|
|
40 rotate_coord(x, y, d, cx, cy)
|
|
41 int *x, *y; /* values used and returned */
|
|
42 int d; /* degree (pi == 128) */
|
|
43 int cx, cy; /* around center point */
|
|
44 {
|
|
45 register
|
|
46 int ox, oy;
|
|
47
|
|
48 ox = *x;
|
|
49 oy = *y;
|
|
50
|
|
51 switch (d) {
|
|
52
|
|
53 case 0:
|
|
54 return;
|
|
55
|
|
56 case 64:
|
|
57 case -192:
|
|
58 *x = cy - oy + cx;
|
|
59 *y = ox - cx + cy;
|
|
60 break;
|
|
61
|
|
62 case 128:
|
|
63 case -128:
|
|
64 *x = cx - ox + cx;
|
|
65 *y = cy - oy + cy;
|
|
66 break;
|
|
67
|
|
68 case 192:
|
|
69 case -64:
|
|
70 *x = oy - cy + cx;
|
|
71 *y = cx - ox + cy;
|
|
72 break;
|
|
73
|
|
74 default:{
|
|
75 /* do it the hard way */
|
|
76 /*
|
|
77 there is another way to do this, by using the cos(d) and
|
|
78 sin(d) and the stock rotation matrix from linear algebra.
|
|
79 */
|
|
80 double dir;
|
|
81 double r, dx, dy;
|
|
82 double rd = (double) d * 3.1415927 / 128.;
|
|
83
|
|
84 if (*x != cx || *y != cy) {
|
|
85 dx = (double) (*x - cx);
|
|
86 dy = (double) (cy - *y);
|
|
87 dir = atan2(dx, dy) - 3.1415927 / 2.;
|
|
88 r = hypot(dx, dy);
|
|
89 dir += rd;
|
|
90 *x = (int) (r * cos(dir) + cx);
|
|
91 *y = (int) (r * sin(dir) + cy);
|
|
92 }
|
|
93 }
|
|
94 }
|
|
95 }
|
|
96
|
|
97 void
|
|
98 rotate_gcenter(x, y)
|
|
99 int *x, *y; /* values used and returned */
|
|
100 {
|
|
101 rotate_coord(x, y, rotate_deg, blk_gwidth / 2, blk_gwidth / 2);
|
|
102 }
|
|
103
|
|
104 #endif
|
|
105
|
|
106 void rotate_all()
|
|
107 {
|
|
108 register i;
|
|
109 register struct planet *l;
|
|
110 register struct player *j;
|
|
111
|
|
112 int nplan = (paradise) ? nplanets : 40;
|
|
113 int old_rotate_deg = rotate_deg;
|
|
114
|
|
115 redrawall = 1;
|
|
116 reinitPlanets = 1;
|
|
117
|
|
118 rotate_deg = -old_rotate_deg + rotate * 64;
|
|
119
|
|
120 for (i = 0, l = planets; i < nplan; i++, l++) {
|
|
121 rotate_gcenter(&l->pl_x, &l->pl_y);
|
|
122 }
|
|
123
|
|
124 for (i=0, j = players; i < nplayers; i++, j++) {
|
|
125 rotate_gcenter(&j->p_x, &j->p_y);
|
|
126 rotate_dir(&j->p_dir, rotate_deg);
|
|
127 }
|
|
128
|
|
129 rotate_deg = rotate * 64;
|
|
130 }
|