PageRenderTime 38ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/mirrormagic-2.0.2/src/main.c

#
C | 633 lines | 556 code | 27 blank | 50 comment | 0 complexity | 03905be8109529b373c144f67a4eda3c MD5 | raw file
Possible License(s): GPL-2.0
  1. /***********************************************************
  2. * Mirror Magic -- McDuffin's Revenge *
  3. *----------------------------------------------------------*
  4. * (c) 1994-2001 Artsoft Entertainment *
  5. * Holger Schemel *
  6. * Detmolder Strasse 189 *
  7. * 33604 Bielefeld *
  8. * Germany *
  9. * e-mail: info@artsoft.org *
  10. *----------------------------------------------------------*
  11. * main.c *
  12. ***********************************************************/
  13. #include "libgame/libgame.h"
  14. #include "main.h"
  15. #include "init.h"
  16. #include "game.h"
  17. #include "events.h"
  18. GC tile_clip_gc, line_gc[2];
  19. Bitmap *pix[NUM_BITMAPS];
  20. Pixmap tile_clipmask[NUM_TILES];
  21. DrawBuffer *fieldbuffer;
  22. DrawBuffer *drawto_field;
  23. int game_status = MAINMENU;
  24. boolean level_editor_test_game = FALSE;
  25. boolean network_playing = FALSE;
  26. int key_joystick_mapping = 0;
  27. boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
  28. int redraw_x1 = 0, redraw_y1 = 0;
  29. short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  30. short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  31. short Hit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  32. short Box[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  33. short Angle[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  34. short MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  35. short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  36. short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  37. short Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  38. short Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  39. short StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  40. short Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  41. boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  42. short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  43. short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
  44. short AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
  45. unsigned long Elementeigenschaften[MAX_ELEMENTS];
  46. int level_nr;
  47. int lev_fieldx,lev_fieldy, scroll_x,scroll_y;
  48. int FX = SX, FY = SY, ScrollStepSize;
  49. int ScreenMovDir = MV_NO_MOVING, ScreenMovPos = 0;
  50. int ScreenGfxPos = 0;
  51. int GameFrameDelay = GAME_FRAME_DELAY;
  52. int FfwdFrameDelay = FFWD_FRAME_DELAY;
  53. int BX1 = 0, BY1 = 0, BX2 = SCR_FIELDX-1, BY2 = SCR_FIELDY-1;
  54. int SBX_Left, SBX_Right;
  55. int SBY_Upper, SBY_Lower;
  56. int ZX,ZY, ExitX,ExitY;
  57. int AllPlayersGone;
  58. int TimeFrames, TimePlayed, TimeLeft;
  59. #if 0
  60. boolean network_player_action_received = FALSE;
  61. #endif
  62. struct LevelInfo level;
  63. #if 0
  64. struct PlayerInfo stored_player[MAX_PLAYERS], *local_player = NULL;
  65. #endif
  66. struct HiScore highscore[MAX_SCORE_ENTRIES];
  67. struct SetupInfo setup;
  68. struct GameInfo game;
  69. struct LaserInfo laser;
  70. struct EditorInfo editor;
  71. struct GlobalInfo global;
  72. short LX,LY, XS,YS, ELX,ELY;
  73. short CT,Ct;
  74. Pixel pen_fg, pen_bg, pen_ray, pen_magicolor[2];
  75. int color_status;
  76. struct XY Step[16] =
  77. {
  78. { 1, 0 },
  79. { 2, -1 },
  80. { 1, -1 },
  81. { 1, -2 },
  82. { 0, -1 },
  83. { -1, -2 },
  84. { -1, -1 },
  85. { -2, -1 },
  86. { -1, 0 },
  87. { -2, 1 },
  88. { -1, 1 },
  89. { -1, 2 },
  90. { 0, 1 },
  91. { 1, 2 },
  92. { 1, 1 },
  93. { 2, 1 }
  94. };
  95. /* "Sign" has the following structure:
  96. each 4-bit-value represents the values d*8 + c*4 + b*2 + a*1
  97. at the pixel positions
  98. a b 1 2
  99. c d 4 8
  100. so the value "0xA" (=> (d=1)*8 + (c=0)*4 + (b=1)*2 + (a=0)*1)
  101. would result in the pixel pattern
  102. 0 1 _ x
  103. 0 1 or _ x
  104. x x x x x x x x x x
  105. x _ x x _ _ x x _ x
  106. 6 2
  107. x x 5 4 3 x x
  108. x x 7 1 x x
  109. x _ _ x
  110. x _ 8 0 _ x
  111. x x 9 15 x x
  112. x x 11 12 13 x x
  113. 10 14
  114. x _ x x _ _ x x _ x
  115. x x x x x x x x x x
  116. */
  117. short Sign[16] =
  118. {
  119. 0xA,0xF,0xB,0xF,
  120. 0x3,0xF,0x7,0xF,
  121. 0x5,0xF,0xD,0xF,
  122. 0xC,0xF,0xE,0xF
  123. };
  124. /* data needed for playing sounds */
  125. char *sound_name[NUM_SOUNDS] =
  126. {
  127. "amoebe.wav",
  128. "antigrav.wav",
  129. "autsch.wav",
  130. "bong.wav",
  131. "fuel.wav",
  132. "halloffame.wav",
  133. "holz.wav",
  134. "hui.wav",
  135. "kabumm.wav",
  136. "kink.wav",
  137. "kling.wav",
  138. "laser.wav",
  139. "oeffnen.wav",
  140. "quiek.wav",
  141. "rhythmloop.wav",
  142. "roaaar.wav",
  143. "sirr.wav",
  144. "slurp.wav",
  145. "warnton.wav",
  146. "whoosh.wav"
  147. };
  148. /* background music */
  149. int background_loop[] =
  150. {
  151. #if 0
  152. SND_TYGER,
  153. SND_VOYAGER,
  154. #endif
  155. };
  156. int num_bg_loops = sizeof(background_loop)/sizeof(int);
  157. char *element_info[] =
  158. {
  159. "empty space", /* 0 */
  160. "mirror (0°)",
  161. "mirror (11.25°)",
  162. "mirror (22.5°)",
  163. "mirror (33.75°)",
  164. "mirror (45°)",
  165. "mirror (56.25°)",
  166. "mirror (67.5°)",
  167. "mirror (78.75°)",
  168. "mirror (90°)",
  169. "mirror (101.25°)", /* 10 */
  170. "mirror (112.5°)",
  171. "mirror (123.75°)",
  172. "mirror (135°)",
  173. "mirror (146.25°)",
  174. "mirror (157.5°)",
  175. "mirror (168.75°)",
  176. "fixed steel polarisator (0°)",
  177. "fixed steel polarisator (90°)",
  178. "fixed steel polarisator (45°)",
  179. "fixed steel polarisator (135°)", /* 20 */
  180. "Gregor McDuffin (looking right)",
  181. "Gregor McDuffin (looking up)",
  182. "Gregor McDuffin (looking left)",
  183. "Gregor McDuffin (looking down)",
  184. "closed exit",
  185. "opening exit",
  186. "opening exit",
  187. "open exit",
  188. "magic kettle",
  189. "bomb", /* 30 */
  190. "prism",
  191. "steel wall",
  192. "steel wall",
  193. "steel wall",
  194. "steel wall",
  195. "steel wall",
  196. "steel wall",
  197. "steel wall",
  198. "steel wall",
  199. "steel wall", /* 40 */
  200. "steel wall",
  201. "steel wall",
  202. "steel wall",
  203. "steel wall",
  204. "steel wall",
  205. "steel wall",
  206. "steel wall",
  207. "wooden wall",
  208. "wooden wall",
  209. "wooden wall", /* 50 */
  210. "wooden wall",
  211. "wooden wall",
  212. "wooden wall",
  213. "wooden wall",
  214. "wooden wall",
  215. "wooden wall",
  216. "wooden wall",
  217. "wooden wall",
  218. "wooden wall",
  219. "wooden wall", /* 60 */
  220. "wooden wall",
  221. "wooden wall",
  222. "wooden wall",
  223. "ice wall",
  224. "ice wall",
  225. "ice wall",
  226. "ice wall",
  227. "ice wall",
  228. "ice wall",
  229. "ice wall", /* 70 */
  230. "ice wall",
  231. "ice wall",
  232. "ice wall",
  233. "ice wall",
  234. "ice wall",
  235. "ice wall",
  236. "ice wall",
  237. "ice wall",
  238. "ice wall",
  239. "amoeba wall", /* 80 */
  240. "amoeba wall",
  241. "amoeba wall",
  242. "amoeba wall",
  243. "amoeba wall",
  244. "amoeba wall",
  245. "amoeba wall",
  246. "amoeba wall",
  247. "amoeba wall",
  248. "amoeba wall",
  249. "amoeba wall", /* 90 */
  250. "amoeba wall",
  251. "amoeba wall",
  252. "amoeba wall",
  253. "amoeba wall",
  254. "amoeba wall",
  255. "wooden block",
  256. "gray ball",
  257. "beamer (0°)",
  258. "beamer (22.5°)",
  259. "beamer (45°)", /* 100 */
  260. "beamer (67.5°)",
  261. "beamer (90°)",
  262. "beamer (112.5°)",
  263. "beamer (135°)",
  264. "beamer (157.5°)",
  265. "beamer (180°)",
  266. "beamer (202.5°)",
  267. "beamer (225°)",
  268. "beamer (247.5°)",
  269. "beamer (270°)", /* 110 */
  270. "beamer (292.5°)",
  271. "beamer (315°)",
  272. "beamer (337.5°)",
  273. "fuse",
  274. "pac man (starts moving right)",
  275. "pac man (starts moving up)",
  276. "pac man (starts moving left)",
  277. "pac man (starts moving down)",
  278. "polarisator (0°)",
  279. "polarisator (11.25°)", /* 120 */
  280. "polarisator (22.5°)",
  281. "polarisator (33.75°)",
  282. "polarisator (45°)",
  283. "polarisator (56.25°)",
  284. "polarisator (67.5°)",
  285. "polarisator (78.75°)",
  286. "polarisator (90°)",
  287. "polarisator (101.25°)",
  288. "polarisator (112.5°)",
  289. "polarisator (123.75°)", /* 130 */
  290. "polarisator (135°)",
  291. "polarisator (146.25°)",
  292. "polarisator (157.5°)",
  293. "polarisator (168.75°)",
  294. "two-way polarisator (0°)",
  295. "two-way polarisator (22.5°)",
  296. "two-way polarisator (45°)",
  297. "two-way polarisator (67.5°)",
  298. "fixed mirror (0°)",
  299. "fixed mirror (45°)", /* 140 */
  300. "fixed mirror (90°)",
  301. "fixed mirror (135°)",
  302. "reflecting stone lock",
  303. "key",
  304. "light bulb (dark)",
  305. "ligh bulb (glowing)",
  306. "bonus ball",
  307. "reflecting stone block",
  308. "wooden lock",
  309. "extra energy ball (full)", /* 150 */
  310. "fixed wooden polarisator (0°)",
  311. "fixed wooden polarisator (90°)",
  312. "fixed wooden polarisator (45°)",
  313. "fixed wooden polarisator (135°)",
  314. "extra energy ball (empty)",
  315. "unused",
  316. "unused",
  317. "unused",
  318. "unused",
  319. "letter ' '", /* 160 */
  320. "letter '!'",
  321. "letter '\"'",
  322. "letter '#'",
  323. "letter '$'",
  324. "letter '%'",
  325. "letter '&'",
  326. "letter '''",
  327. "letter '('",
  328. "letter ')'",
  329. "letter '*'", /* 170 */
  330. "letter '+'",
  331. "letter ','",
  332. "letter '-'",
  333. "letter '.'",
  334. "letter '/'",
  335. "letter '0'",
  336. "letter '1'",
  337. "letter '2'",
  338. "letter '3'",
  339. "letter '4'", /* 180 */
  340. "letter '5'",
  341. "letter '6'",
  342. "letter '7'",
  343. "letter '8'",
  344. "letter '9'",
  345. "letter ':'",
  346. "letter ';'",
  347. "letter '<'",
  348. "letter '='",
  349. "letter '>'", /* 190 */
  350. "letter '?'",
  351. "letter '@'",
  352. "letter 'A'",
  353. "letter 'B'",
  354. "letter 'C'",
  355. "letter 'D'",
  356. "letter 'E'",
  357. "letter 'F'",
  358. "letter 'G'",
  359. "letter 'H'", /* 200 */
  360. "letter 'I'",
  361. "letter 'J'",
  362. "letter 'K'",
  363. "letter 'L'",
  364. "letter 'M'",
  365. "letter 'N'",
  366. "letter 'O'",
  367. "letter 'P'",
  368. "letter 'Q'",
  369. "letter 'R'", /* 210 */
  370. "letter 'S'",
  371. "letter 'T'",
  372. "letter 'U'",
  373. "letter 'V'",
  374. "letter 'W'",
  375. "letter 'X'",
  376. "letter 'Y'",
  377. "letter 'Z'",
  378. "letter 'Ä'",
  379. "letter 'Ö'", /* 220 */
  380. "letter 'Ü'",
  381. "letter '^'",
  382. "letter ''",
  383. "letter ''",
  384. "letter ''",
  385. "letter ''",
  386. "letter ''",
  387. "letter ''",
  388. "letter ''",
  389. "letter ''", /* 230 */
  390. "letter ''",
  391. "letter ''",
  392. "letter ''",
  393. "letter ''",
  394. "letter ''",
  395. "letter ''",
  396. "letter ''",
  397. "letter ''",
  398. "letter ''",
  399. "mirror (0°)", /* 240 */
  400. "mirror (11.25°)",
  401. "mirror (22.5°)",
  402. "mirror (33.75°)",
  403. "mirror (45°)",
  404. "mirror (56.25°)",
  405. "mirror (67.5°)",
  406. "mirror (78.75°)",
  407. "mirror (90°)",
  408. "mirror (101.25°)",
  409. "mirror (112.5°)", /* 250 */
  410. "mirror (123.75°)",
  411. "mirror (135°)",
  412. "mirror (146.25°)",
  413. "mirror (157.5°)",
  414. "mirror (168.75°)",
  415. "fixed wooden polarisator (0°)",
  416. "fixed wooden polarisator (22.5°)",
  417. "fixed wooden polarisator (45°)",
  418. "fixed wooden polarisator (67.5°)",
  419. "fixed wooden polarisator (90°)", /* 260 */
  420. "fixed wooden polarisator (112.5°)",
  421. "fixed wooden polarisator (135°)",
  422. "fixed wooden polarisator (157.5°)",
  423. "fixed steel polarisator (0°)",
  424. "fixed steel polarisator (22.5°)",
  425. "fixed steel polarisator (45°)",
  426. "fixed steel polarisator (67.5°)",
  427. "fixed steel polarisator (90°)",
  428. "fixed steel polarisator (112.5°)",
  429. "fixed steel polarisator (135°)", /* 270 */
  430. "fixed steel polarisator (157.5°)",
  431. "deflektor style wooden wall",
  432. "deflektor style wooden wall",
  433. "deflektor style wooden wall",
  434. "deflektor style wooden wall",
  435. "deflektor style wooden wall",
  436. "deflektor style wooden wall",
  437. "deflektor style wooden wall",
  438. "deflektor style wooden wall",
  439. "deflektor style wooden wall", /* 280 */
  440. "deflektor style wooden wall",
  441. "deflektor style wooden wall",
  442. "deflektor style wooden wall",
  443. "deflektor style wooden wall",
  444. "deflektor style wooden wall",
  445. "deflektor style wooden wall",
  446. "deflektor style wooden wall",
  447. "deflektor style steel wall",
  448. "deflektor style steel wall",
  449. "deflektor style steel wall", /* 290 */
  450. "deflektor style steel wall",
  451. "deflektor style steel wall",
  452. "deflektor style steel wall",
  453. "deflektor style steel wall",
  454. "deflektor style steel wall",
  455. "deflektor style steel wall",
  456. "deflektor style steel wall",
  457. "deflektor style steel wall",
  458. "deflektor style steel wall",
  459. "deflektor style steel wall", /* 300 */
  460. "deflektor style steel wall",
  461. "deflektor style steel wall",
  462. "deflektor style steel wall",
  463. "empty space",
  464. "cell",
  465. "mine",
  466. "refractor",
  467. "laser cannon (shooting right)",
  468. "laser cannon (shooting up)",
  469. "laser cannon (shooting left)", /* 310 */
  470. "laser cannon (shooting down)",
  471. "laser receiver (directed right)",
  472. "laser receiver (directed up)",
  473. "laser receiver (directed left)",
  474. "laser receiver (directed down)",
  475. "fibre optic (1a)",
  476. "fibre optic (1b)",
  477. "fibre optic (2a)",
  478. "fibre optic (2b)",
  479. "fibre optic (3a)", /* 320 */
  480. "fibre optic (3b)",
  481. "fibre optic (4a)",
  482. "fibre optic (4b)",
  483. "rotating mirror (0°)",
  484. "rotating mirror (11.25°)",
  485. "rotating mirror (22.5°)",
  486. "rotating mirror (33.75°)",
  487. "rotating mirror (45°)",
  488. "rotating mirror (56.25°)",
  489. "rotating mirror (67.5°)", /* 330 */
  490. "rotating mirror (78.75°)",
  491. "rotating mirror (90°)",
  492. "rotating mirror (101.25°)",
  493. "rotating mirror (112.5°)",
  494. "rotating mirror (123.75°)",
  495. "rotating mirror (135°)",
  496. "rotating mirror (146.25°)",
  497. "rotating mirror (157.5°)",
  498. "rotating mirror (168.75°)",
  499. "rotating wooden polarisator (0°)", /* 340 */
  500. "rotating wooden polarisator (22.5°)",
  501. "rotating wooden polarisator (45°)",
  502. "rotating wooden polarisator (67.5°)",
  503. "rotating wooden polarisator (90°)",
  504. "rotating wooden polarisator (112.5°)",
  505. "rotating wooden polarisator (135°)",
  506. "rotating wooden polarisator (157.5°)",
  507. "rotating steel polarisator (0°)",
  508. "rotating steel polarisator (22.5°)",
  509. "rotating steel polarisator (45°)", /* 350 */
  510. "rotating steel polarisator (67.5°)",
  511. "rotating steel polarisator (90°)",
  512. "rotating steel polarisator (112.5°)",
  513. "rotating steel polarisator (135°)",
  514. "rotating steel polarisator (157.5°)",
  515. "red beamer (0°)",
  516. "red beamer (22.5°)",
  517. "red beamer (45°)",
  518. "red beamer (67.5°)",
  519. "red beamer (90°)", /* 360 */
  520. "red beamer (112.5°)",
  521. "red beamer (135°)",
  522. "red beamer (157.5°)",
  523. "red beamer (180°)",
  524. "red beamer (202.5°)",
  525. "red beamer (225°)",
  526. "red beamer (247.5°)",
  527. "red beamer (270°)",
  528. "red beamer (292.5°)",
  529. "red beamer (315°)", /* 370 */
  530. "red beamer (337.5°)",
  531. "yellow beamer (0°)",
  532. "yellow beamer (22.5°)",
  533. "yellow beamer (45°)",
  534. "yellow beamer (67.5°)",
  535. "yellow beamer (90°)",
  536. "yellow beamer (112.5°)",
  537. "yellow beamer (135°)",
  538. "yellow beamer (157.5°)",
  539. "yellow beamer (180°)", /* 380 */
  540. "yellow beamer (202.5°)",
  541. "yellow beamer (225°)",
  542. "yellow beamer (247.5°)",
  543. "yellow beamer (270°)",
  544. "yellow beamer (292.5°)",
  545. "yellow beamer (315°)",
  546. "yellow beamer (337.5°)",
  547. "green beamer (0°)",
  548. "green beamer (22.5°)",
  549. "green beamer (45°)", /* 390 */
  550. "green beamer (67.5°)",
  551. "green beamer (90°)",
  552. "green beamer (112.5°)",
  553. "green beamer (135°)",
  554. "green beamer (157.5°)",
  555. "green beamer (180°)",
  556. "green beamer (202.5°)",
  557. "green beamer (225°)",
  558. "green beamer (247.5°)",
  559. "green beamer (270°)", /* 400 */
  560. "green beamer (292.5°)",
  561. "green beamer (315°)",
  562. "green beamer (337.5°)",
  563. "blue beamer (0°)",
  564. "blue beamer (22.5°)",
  565. "blue beamer (45°)",
  566. "blue beamer (67.5°)",
  567. "blue beamer (90°)",
  568. "blue beamer (112.5°)",
  569. "blue beamer (135°)", /* 410 */
  570. "blue beamer (157.5°)",
  571. "blue beamer (180°)",
  572. "blue beamer (202.5°)",
  573. "blue beamer (225°)",
  574. "blue beamer (247.5°)",
  575. "blue beamer (270°)",
  576. "blue beamer (292.5°)",
  577. "blue beamer (315°)",
  578. "blue beamer (337.5°)",
  579. "unknown", /* 420 */
  580. /*
  581. "-------------------------------",
  582. */
  583. };
  584. int num_element_info = sizeof(element_info)/sizeof(char *);
  585. /* ========================================================================= */
  586. /* main() */
  587. /* ========================================================================= */
  588. int main(int argc, char *argv[])
  589. {
  590. InitCommandName(argv[0]);
  591. InitExitFunction(CloseAllAndExit);
  592. InitPlatformDependantStuff();
  593. GetOptions(argv);
  594. OpenAll();
  595. EventLoop();
  596. CloseAllAndExit(0);
  597. exit(0); /* to keep compilers happy */
  598. }