adjust to match the expanded name.
[AROS-Contrib.git] / Games / Moria3D / Source / Moveing.c
blob10e820710afce7e967c85da61e8229210a4fcd0a
1 /****************************************************************************
2 * *
3 * Moveing.c 970319 *
4 * *
5 * Move Player around *
6 * *
7 ****************************************************************************/
9 #include <stdio.h>
10 #include <string.h>
11 #include <stdlib.h>
12 #include <intuition/intuition.h>
13 #include <proto/exec.h>
15 #include "MyTypes.h"
16 #include "Moveing.h"
17 #include "Gfx.h"
18 #include "Level.h"
19 #include "MyMath.h"
21 int32 XMove=0,YMove=0,ZMove=0;
22 int32 Button1,Button2;
24 struct MsgPort * WindowPort;
26 int32 MouseX=0,MouseY=0;
27 fix SpeedUp = DefSpeedUp;
28 fix SpeedDown = DefSpeedDown;
29 int16 Pause = !(0==0);
31 void TurnPlayer(pBot MyPlayer)
33 Matrix M;
34 Vct a,b;
36 #define COS1 0.0038053
37 #define SIN 0.0871557
40 printf("%f %f %f , %f %f %f , %f %f %f\n",MyPlayer->Direction.a.x,MyPlayer->Direction.a.y,MyPlayer->Direction.a.z,
41 MyPlayer->Direction.b.x,MyPlayer->Direction.b.y,MyPlayer->Direction.b.z,
42 MyPlayer->Direction.c.x,MyPlayer->Direction.c.y,MyPlayer->Direction.c.z);
44 /* Turn sideways */
46 VctMulFix(&MyPlayer->Direction.a,1.0-COS1*XMove*XMove,&a);
47 VctMulFix(&MyPlayer->Direction.c,SIN*XMove,&b);
48 VctAdd(&a,&b,&M.a);
50 M.b.x = MyPlayer->Direction.b.x;
51 M.b.y = MyPlayer->Direction.b.y;
52 M.b.z = MyPlayer->Direction.b.z;
54 VctMulFix(&MyPlayer->Direction.a,-SIN*XMove,&a);
55 VctMulFix(&MyPlayer->Direction.c,1-COS1*XMove*XMove,&b);
56 VctAdd(&a,&b,&M.c);
58 /* Turn Upwards */
60 MyPlayer->Direction.a.x = M.a.x;
61 MyPlayer->Direction.a.y = M.a.y;
62 MyPlayer->Direction.a.z = M.a.z;
64 VctMulFix(&M.b,1-COS1*YMove*YMove,&a);
65 VctMulFix(&M.c,SIN*YMove,&b);
66 VctAdd(&a,&b,&MyPlayer->Direction.b);
68 VctMulFix(&M.b,-SIN*YMove,&a);
69 VctMulFix(&M.c,1-COS1*YMove*YMove,&b);
70 VctAdd(&a,&b,&MyPlayer->Direction.c);
73 /* Turn Around */
75 VctMulFix(&MyPlayer->Direction.a,1.0-COS1*ZMove*ZMove,&a);
76 VctMulFix(&MyPlayer->Direction.b,SIN*ZMove,&b);
77 VctAdd(&a,&b,&M.a);
79 VctMulFix(&MyPlayer->Direction.a,-SIN*ZMove,&a);
80 VctMulFix(&MyPlayer->Direction.b,1-COS1*ZMove*ZMove,&b);
81 VctAdd(&a,&b,&M.b);
83 MyPlayer->Direction.a.x = M.a.x;
84 MyPlayer->Direction.a.y = M.a.y;
85 MyPlayer->Direction.a.z = M.a.z;
87 MyPlayer->Direction.b.x = M.b.x;
88 MyPlayer->Direction.b.y = M.b.y;
89 MyPlayer->Direction.b.z = M.b.z;
92 printf("%f %f %f , %f %f %f , %f %f %f\n",MyPlayer->Direction.a.x,MyPlayer->Direction.a.y,MyPlayer->Direction.a.z,
93 MyPlayer->Direction.b.x,MyPlayer->Direction.b.y,MyPlayer->Direction.b.z,
94 MyPlayer->Direction.c.x,MyPlayer->Direction.c.y,MyPlayer->Direction.c.z);
98 void MoveForward(pBot MyPlayer)
100 Vct a;
102 VctMulFix(&MyPlayer->Direction.c,SpeedUp,&a);
103 VctAdd(&MyPlayer->Speed,&a,&MyPlayer->Speed);
106 void MoveBackward(pBot MyPlayer)
108 Vct a;
110 VctMulFix(&MyPlayer->Direction.c,-SpeedUp,&a);
111 VctAdd(&MyPlayer->Speed,&a,&MyPlayer->Speed);
114 int16 CheckCollision(pBot MyPlayer)
116 Vct a;
117 int16 x;
118 fix d;
119 pBot MyBot,NextBot;
120 int16 Death= !(0==0);
123 printf("\n%d\n",MyPlayer->Cube);
126 /* Check Bot */
128 MyBot=MyPlayer->Cube->FirstBot;
130 while ((MyBot != 0) && (!Death))
132 NextBot = MyBot->Next;
134 if (MyBot != MyPlayer)
136 VctSub(&MyBot->Pos,&MyPlayer->Pos,&a);
137 d= VctLength(&a);
139 if (d == 0)
141 printf("Tele Frag\n");
143 else if (d<MyPlayer->Size+MyBot->Size) /* Do we hit it ? */
145 d=(MyPlayer->Size+MyBot->Size-d) / d;
147 if ((MyBot->Type & BotPush) != 0)
149 /* Push Player */
151 VctMulFix(&a,d,&a);
152 VctSub(&MyPlayer->Speed,&a,&MyPlayer->Speed);
154 if ((MyPlayer->Type & BotPickup) != 0)
156 /* Pickup Bot */
158 if ((MyBot->Type & BotPlayer) != 0) /* Only Player can Pickup */
160 /* Resolve Bot from Cube */
162 if (MyPlayer->Next != 0)
164 MyPlayer->Next->Prev = MyPlayer->Prev;
166 if (MyPlayer->Prev != 0)
168 MyPlayer->Prev->Next = MyPlayer->Next;
170 else
172 MyPlayer->Cube->FirstBot = MyPlayer->Next;
175 /* Resolve Bot from Abs Chain */
177 if (MyPlayer->AbsNext != 0)
179 MyPlayer->AbsNext->AbsPrev = MyPlayer->AbsPrev;
181 if (MyPlayer->AbsPrev != 0)
183 MyPlayer->AbsPrev->AbsNext = MyPlayer->AbsNext;
186 /* Insert Player into unused chain */
188 MyPlayer->Next = FirstUnusedBot;
189 MyPlayer->Prev = 0;
191 if (MyPlayer->Next != 0)
193 MyPlayer->Next->Prev = MyPlayer;
196 /* Add Thing to Bot */
198 if ((MyPlayer->Type & BotRing) != 0)
200 printf("Ring collected\n");
201 MyBot->NumRings++;
204 Death = (0==0);
210 MyBot = NextBot;
213 if (!Death)
215 /* Check Sides */
217 for (x=0;x<6;x++)
220 printf("Pos %f %f %f\n",MyPlayer->Pos.x,MyPlayer->Pos.y,MyPlayer->Pos.z);
223 VctSub(&MyPlayer->Pos,MyPlayer->Cube->Sides[x].Pnts[0],&a);
226 printf("Pos %f %f %f\n",a.x,a.y,a.z);
227 printf("Vct %f %f %f\n",MyPlayer->Cube->Sides[x].Rev.a.z,
228 MyPlayer->Cube->Sides[x].Rev.b.z,
229 MyPlayer->Cube->Sides[x].Rev.c.z);
232 d=a.x * MyPlayer->Cube->Sides[x].Rev.a.z
233 +a.y * MyPlayer->Cube->Sides[x].Rev.b.z
234 +a.z * MyPlayer->Cube->Sides[x].Rev.c.z;
237 printf("%d %f\n",x,d);
239 if (MyPlayer->Cube->Cubes[x] != 0)
241 if (d<0)
243 /* Resolve Bot from chains */
245 if (MyPlayer->Next != 0)
247 MyPlayer->Next->Prev = MyPlayer->Prev;
249 if (MyPlayer->Prev != 0)
251 MyPlayer->Prev->Next = MyPlayer->Next;
253 else
255 MyPlayer->Cube->FirstBot = MyPlayer->Next;
258 /* Change to new cube */
260 MyPlayer->Cube=MyPlayer->Cube->Cubes[x];
262 /* Insert into chain */
264 MyPlayer->Next = MyPlayer->Cube->FirstBot;
265 MyPlayer->Cube->FirstBot = MyPlayer;
266 MyPlayer->Prev = 0;
268 if (MyPlayer->Next != 0)
270 MyPlayer->Next->Prev = MyPlayer;
274 else
276 if (d<0)
278 printf("Side %d\n",x);
280 d=0.01;
282 if (d<MyPlayer->Size) /* Do we hit anything ? */
284 d=MyPlayer->Size-d;
286 VctMulFix(&MyPlayer->Cube->Sides[x].Normal,d,&a);
287 VctAdd(&MyPlayer->Speed,&a,&MyPlayer->Speed);
293 return Death;
296 void MoveSpeed(pBot MyPlayer)
299 printf("Bot %ld %f,%f,%f\n",MyPlayer,MyPlayer->Pos.x,MyPlayer->Pos.y,MyPlayer->Pos.z);
300 printf(" %ld %f,%f,%f\n",MyPlayer->Type,MyPlayer->Speed.x,MyPlayer->Speed.y,MyPlayer->Speed.z);
302 VctAdd(&MyPlayer->Pos,&MyPlayer->Speed,&MyPlayer->Pos);
303 VctMulFix(&MyPlayer->Speed,SpeedDown,&MyPlayer->Speed);
306 void MoveBot(pBot MyPlayer,pBot MyBot)
308 Vct a;
310 printf("Bot %ld\n",MyBot);
313 if ((MyBot->Type & BotMove) != 0)
315 VctSub(&MyPlayer->Pos,&MyBot->Pos,&a);
317 VctMulFix(&a,0.25/MyBot->Size/VctLength(&a),&a);
319 VctAdd(&a,&MyBot->Speed,&MyBot->Speed);
322 if (!CheckCollision(MyBot))
324 MoveSpeed(MyBot);
328 void MoveBots(void)
330 pBot MyBot,NextBot,MyPlayer;
332 if (!Pause)
334 MyPlayer=&MyLevelData.Bots[0];
336 printf("\nPlayer %ld\n",MyPlayer);
337 printf("Bot %ld\n",MyPlayer->AbsNext);
339 MyBot=MyPlayer->AbsNext;
341 while (MyBot != NULL)
343 NextBot = MyBot->AbsNext;
345 MoveBot(MyPlayer,MyBot);
347 MyBot = NextBot;
352 void MovePlayer(pBot MyPlayer)
354 struct IntuiMessage * MyMsg;
356 ZMove = 0;
358 while ((MyMsg=(struct IntuiMessage *)GetMsg(WindowPort)) != NULL)
360 switch (MyMsg->Class)
362 case IDCMP_VANILLAKEY:
364 switch(MyMsg->Code)
366 case 27: /* ESC quit */
368 printf("\n Sucide is illegal here!\n");
369 Finished = (0==0);
370 break;
372 case 32: /* SPACE hit */
374 printf("KILL .. KILL .. KILL .. KILL .. KILL\n");
375 break;
377 case '7': /* turn anti-clockwise */
379 ZMove = -1;
380 break;
382 case '9': /* turn clockwise */
384 ZMove = 1;
385 break;
387 case 'l': /* decrease Light */
389 LightLess-=0.001;
391 if (LightLess<0)
392 LightLess = 0.0;
394 printf("Lightless: %f\n",LightLess);
396 break;
398 case 'L': /* increase Light */
400 LightLess+=0.001;
402 if (LightLess > 1.0)
403 LightLess = 1.0;
405 printf("Lightless: %f\n",LightLess);
407 break;
409 case '+': /* Decrease CameraBehind */
411 CameraBehind-=0.1;
413 printf("CameraBehind: %f\n",CameraBehind);
415 break;
417 case '-': /* Increase CameraBehind */
419 CameraBehind+=0.1;
421 printf("CameraBehind: %f\n",CameraBehind);
423 break;
425 case 'p': /* Pause */
427 Pause = !Pause;
430 break;
432 case IDCMP_RAWKEY:
434 printf("Do you realy wanna harm that cute little cube?\n");
435 break;
437 case IDCMP_MOUSEBUTTONS:
439 switch(MyMsg->Code)
441 case 104:
443 Button1 = (0==0);
444 break;
446 case 232:
448 Button1 = !(0==0);
449 break;
451 case 105:
453 Button2 = (0==0);
454 break;
456 case 233:
458 Button2 = !(0==0);
459 break;
464 case IDCMP_MOUSEMOVE:
466 MouseX=MyMsg->MouseX;
467 MouseY=MyMsg->MouseY;
471 ReplyMsg((struct Message *)MyMsg);
474 if (MouseX<QuaterWidth)
476 XMove=+1;
478 else if (MouseX<HalfWidth+QuaterWidth)
480 XMove=0;
482 else
484 XMove=-1;
487 if (MouseY<QuaterHeight)
489 YMove=-1;
491 else if (MouseY<HalfHeight+QuaterHeight)
493 YMove=0;
495 else
497 YMove=1;
500 if (!Pause)
502 TurnPlayer(MyPlayer);
504 if (Button1)
506 MoveForward(MyPlayer);
508 if (Button2)
510 MoveBackward(MyPlayer);
513 if (!CheckCollision(MyPlayer))
515 MoveSpeed(MyPlayer);
517 else
519 /* RIP */