home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / reflex / part02 < prev    next >
Internet Message Format  |  1993-04-08  |  21KB

  1. Path: uunet!decwrl!waikato.ac.nz!cguthrey
  2. From: cguthrey@waikato.ac.nz
  3. Newsgroups: vmsnet.sources.games
  4. Subject: Reflex - Test your, [2/2]
  5. Message-ID: <1993Apr9.211422.15379@waikato.ac.nz>
  6. Date: 9 Apr 93 21:14:22 +1200
  7. Organization: University of Waikato, Hamilton, New Zealand
  8. Lines: 730
  9. Xref: uunet vmsnet.sources.games:679
  10.  
  11. -+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+
  12. X          current_state.games`5Bj`5D := old_games;
  13. X          me := j;
  14. X        END;
  15. X      current_state.score`5Bme`5D := this_score;
  16. X      IF present(newname) then
  17. X        current_state.name`5Bme`5D := newname;
  18. X    END;
  19. XEND;
  20. X
  21. X`5BGLOBAL`5D
  22. XPROCEDURE  increment_game_count;
  23. XVAR
  24. X  last_score : integer;
  25. X  directory : v_array;
  26. X  gamename  : v_array;
  27. X  username  : v_array;
  28. X  i,j,k, me : integer;
  29. X  newname : s_array;
  30. X  current_state : everything;
  31. X  date_time : date_time_type;
  32. XBEGIN
  33. X  username := Get_jpi_str(jpi$_username,8);
  34. X  Get_Image_dir_and_ACN_name (directory,gamename);
  35. X
  36. X  REPEAT
  37. X    OPEN (newfile,directory+gamename+'.ACN',old,,direct,error:=continue);
  38. X    CASE status(newfile) of
  39. X      PAS$K_SUCCESS,
  40. X      PAS$K_FILNOTFOU,
  41. X      PAS$K_ACCMETINC,
  42. X      PAS$K_RECLENINC : ;
  43. X      OTHERWISE sleep (1);
  44. X    END;
  45. X  UNTIL (status(newfile)=PAS$K_SUCCESS) or
  46. X        (status(newfile)=PAS$K_FILNOTFOU) or
  47. X        (status(newfile)=PAS$K_ACCMETINC) or
  48. X        (status(newfile)=PAS$K_RECLENINC);
  49. X
  50. X  IF status(newfile)=PAS$K_SUCCESS THEN
  51. X    BEGIN
  52. X      reset (newfile);
  53. X      current_state := newfile`5E;
  54. X      date_time := Get_Date_time;`20
  55. X      update_topten (current_state,date_time,username,-maxint-1,me,last_scor
  56. Ve);
  57. X      rewrite (newfile);
  58. X      newfile`5E := current_state;
  59. X      Put (newfile);
  60. X      Close (newfile);
  61. X      game_count_incremented := true;
  62. X    END;
  63. XEND;
  64. X
  65. X`5BGLOBAL`5D
  66. XPROCEDURE  read_top_ten;
  67. XVAR
  68. X  last_score : integer;
  69. X  directory : v_array;
  70. X  gamename  : v_array;
  71. X  username  : v_array;
  72. X  i,j,k, me : integer;
  73. X  newname : s_array;
  74. X  current_state : everything;
  75. X  date_time : date_time_type;
  76. XBEGIN
  77. X  reset_screen;
  78. X  clear;
  79. X  posn (1,1);
  80. X
  81. X  username := Get_jpi_str(jpi$_username,8);
  82. X  Get_Image_dir_and_ACN_name (directory,gamename);
  83. X
  84. X  REPEAT
  85. X    OPEN (infile,directory+gamename+'.ACN',old,,direct,error:=continue);
  86. X    CASE status(infile) of
  87. X      PAS$K_SUCCESS : ;
  88. X      PAS$K_FILNOTFOU : BEGIN
  89. X            qio_writeln ('Can''t find file '+gamename+'.ACN Creating New Fil
  90. Ve ...');
  91. X            date_time := Get_Date_time;`20
  92. X            create_new_score_file(directory,gamename,date_time);
  93. X          END;
  94. X      PAS$K_ACCMETINC,
  95. X      PAS$K_RECLENINC : BEGIN
  96. X            qio_writeln ('Error in file format of '+gamename+'.ACN');
  97. X            $exit(1);
  98. X          END;
  99. X      OTHERWISE sleep (1);
  100. X    END;
  101. X  UNTIL status(infile)=PAS$K_SUCCESS;
  102. X  reset (infile);
  103. X  current_state := infile`5E;
  104. X  close (infile);
  105. X
  106. X  date_time := Get_Date_time;`20
  107. X  update_topten (current_state,date_time,username,-maxint-1,me,last_score);
  108. X  Display_screen (current_state,date_time,me,gamename,last_score);
  109. XEND;
  110. X
  111. X`5BGLOBAL`5D
  112. XFUNCTION  read_last_score : integer;
  113. XVAR
  114. X  last_score : integer;
  115. X  directory : v_array;
  116. X  gamename  : v_array;
  117. X  username  : v_array;
  118. X  i,j,k, me : integer;
  119. X  newname : s_array;
  120. X  current_state : everything;
  121. X  date_time : date_time_type;
  122. XBEGIN
  123. X  username := Get_jpi_str(jpi$_username,8);
  124. X  Get_Image_dir_and_ACN_name (directory,gamename);
  125. X  REPEAT
  126. X    OPEN (infile,directory+gamename+'.ACN',old,,direct,error:=continue);
  127. X    CASE status(infile) of
  128. X      PAS$K_SUCCESS,
  129. X      PAS$K_FILNOTFOU,
  130. X      PAS$K_ACCMETINC,
  131. X      PAS$K_RECLENINC : last_score := -maxint-1;
  132. X      OTHERWISE sleep (1);
  133. X    END;
  134. X  UNTIL (status(infile)=PAS$K_SUCCESS) or
  135. X        (status(infile)=PAS$K_FILNOTFOU) or
  136. X        (status(infile)=PAS$K_ACCMETINC) or
  137. X        (status(infile)=PAS$K_RECLENINC);
  138. X `20
  139. X  IF status(infile)=PAS$K_SUCCESS THEN
  140. X    BEGIN
  141. X      reset (infile);
  142. X      current_state := infile`5E;
  143. X      close (infile);
  144. X      date_time := Get_Date_time;`20
  145. X      update_topten (current_state,date_time,username,-maxint-1,me,last_scor
  146. Ve);
  147. X    END;
  148. X  read_last_score := last_score;
  149. XEND;
  150. X
  151. X`5BGLOBAL`5D
  152. XPROCEDURE  top_ten ( this_score : integer );
  153. XVAR
  154. X  last_score : integer;
  155. X  directory : v_array;
  156. X  gamename  : v_array;
  157. X  username  : v_array;
  158. X  i,j,k, me : integer;
  159. X  v_name : v_array;
  160. X  newname : s_array;
  161. X  current_state : everything;
  162. X  date_time : date_time_type;
  163. XBEGIN
  164. X  reset_screen;
  165. X  clear;
  166. X  posn (1,1);
  167. X
  168. X  username := Get_jpi_str(jpi$_username,8);
  169. X  Get_Image_dir_and_ACN_name (directory,gamename);
  170. X
  171. X  REPEAT
  172. X    OPEN (infile,directory+gamename+'.ACN',old,,direct,error:=continue);
  173. X    CASE status(infile) of
  174. X      PAS$K_SUCCESS : ;
  175. X      PAS$K_FILNOTFOU : BEGIN
  176. X            qio_writeln ('Can''t find file '+gamename+'.ACN Creating New Fil
  177. Ve ...');
  178. X            date_time := Get_Date_time;`20
  179. X            create_new_score_file(directory,gamename,date_time);
  180. X          END;
  181. X      PAS$K_ACCMETINC,
  182. X      PAS$K_RECLENINC : BEGIN
  183. X            qio_writeln ('Error in file format of '+gamename+'.ACN');
  184. X            $exit(1);
  185. X          END;
  186. X      OTHERWISE sleep (1);
  187. X    END;
  188. X  UNTIL status(infile)=PAS$K_SUCCESS;
  189. X  reset (infile);
  190. X  current_state := infile`5E;
  191. X  close (infile);
  192. X
  193. X  date_time := Get_Date_time;`20
  194. X  update_topten (current_state,date_time,username,this_score,me,last_score);
  195. X  Display_screen (current_state,date_time,me,gamename,last_score);
  196. X  Display_current_score (last_score,this_score);
  197. X  Display_update_prompts(me,last_score,this_score);
  198. X
  199. X  newname := current_state.name`5Bme`5D;
  200. X  IF (( last_score < this_score ) or ( last_score = -maxint-1 )) AND ( me <
  201. V 12 ) THEN
  202. X    BEGIN
  203. X      Formated_read (v_name,'XXXXXXXXXXXX',55,5+me,newname);
  204. X      newname := v_name;
  205. X    END;
  206. X
  207. X  REPEAT
  208. X    OPEN (newfile,directory+gamename+'.ACN',old,,direct,error:=continue);
  209. X    CASE status(newfile) of
  210. X      PAS$K_SUCCESS : ;
  211. X      PAS$K_FILNOTFOU,
  212. X      PAS$K_ACCMETINC,
  213. X      PAS$K_RECLENINC : BEGIN
  214. X            qio_writeln ('Unknown File Error in '+gamename+'.ACN');
  215. X            $exit(1);
  216. X          END;
  217. X      OTHERWISE
  218. X          BEGIN
  219. X            sleep (1);
  220. X            clear;
  221. X            Posn(1,1);
  222. X            qio_writeln (trim(Username)+', Updating Please Wait ...');
  223. X          END;
  224. X    END;
  225. X  UNTIL status(newfile)=PAS$K_SUCCESS;
  226. X  reset (newfile);
  227. X  current_state := newfile`5E;
  228. X  date_time := Get_Date_time;`20
  229. X  update_topten (current_state,date_time,username,this_score,me,last_score,n
  230. Vewname);
  231. X  rewrite (newfile);
  232. X  newfile`5E := current_state;
  233. X  Put (newfile);
  234. X  Close (newfile);
  235. X  posn (1,23);
  236. XEND;
  237. X
  238. X
  239. XEND.
  240. $ CALL UNPACK MISC.PAS;19 2069850872
  241. $ create 'f'
  242. X(***************************************************************************
  243. V*
  244. X ***************************************************************************
  245. V*
  246. X **
  247. X **  Reflex.  Written By Chris Guthrey, 1991.`20
  248. X **  This code copyright, University Of Waikato.`20
  249. X **  No warranty of any kind is supplied.
  250. X **
  251. X **  Based on an old CP/M game. I don't know who created original concept.
  252. X **
  253. X **  email: CGUTHREY@WAIKATO.AC.NZ
  254. X **
  255. X ** This was written specifically for the Waikato University games library.
  256. X ** It may or may not work on any other VAX system without modification.
  257. X **)
  258. X
  259. X`5BINHERIT('misc')`5D
  260. XPROGRAM Reflex;
  261. X
  262. X(*****************************
  263. X * Display Characters
  264. X *)
  265. XCONST          `20
  266. X  player_C = 'O';
  267. X  enemy_C  = '@';
  268. X  target_C = '$';
  269. X  mines_C  = '+';
  270. X  hyper_C  = 'H';
  271. X  left_deflect_C  = '/';
  272. X  right_deflect_C = '\';
  273. X  carriage_return = CHR(13);
  274. X(********************
  275. X * keyboard control characters
  276. X *)
  277. X  kbd_left = '4';
  278. X  kbd_right= '6';
  279. X  kbd_delete='5';
  280. X  kbd_quit = 'Q';
  281. X  kbd_redraw = 'R';
  282. X
  283. X(*******************
  284. X * game constants
  285. X *)
  286. X  x_ofs = 1;
  287. X  y_ofs = 1;
  288. X  pf_width = 38;
  289. X  pf_length = 21;
  290. X  start_delay = 0.160;
  291. X  delay_decrement = 0.02;
  292. X(********************
  293. X * type decls
  294. X *)
  295. XTYPE
  296. X  directions  = (up,down,left,right);
  297. X  game_states = (_playing, _quit, _dead, _hit_target, _hit_mine, _hit_hyper,
  298. V`20
  299. X                 _hit_enemy, _hit_left, _hit_right );
  300. X
  301. X  player_type = RECORD
  302. X                  c      : CHAR;
  303. X                  x, y   : INTEGER;
  304. X                  _x,_y  : INTEGER;
  305. X                  state  : game_states;
  306. X                  dir    : directions;
  307. X                  score  : INTEGER;
  308. X                  level  : INTEGER;`20
  309. X                  delete : BOOLEAN;
  310. X                  delay  : REAL;
  311. X                  moving : BOOLEAN;
  312. X               END;
  313. X
  314. X  enemy_type  = RECORD
  315. X                  active : BOOLEAN;
  316. X                  c      : CHAR;
  317. X                  state  : game_states;
  318. X                  x, y   : INTEGER;
  319. X                  _x,_y  : INTEGER;
  320. X                  dir    : directions;
  321. X                  speed  : INTEGER;
  322. X                END;`20
  323. X
  324. X  target_type = RECORD
  325. X                  c        : CHAR;`20
  326. X                  x, y     : INTEGER;
  327. X                  timeleft : REAL;
  328. X                END;                `20
  329. X(*******************
  330. X * Game Global Vars
  331. X *)
  332. XVAR
  333. X  PlayField : ARRAY`5B0..pf_width,0..pf_length`5D OF CHAR := ZERO;
  334. X  sp_init : BOOLEAN := TRUE;
  335. X  player  : player_type;
  336. X  enemy   : enemy_type;
  337. X  target  : target_type;  `20
  338. X  mines   : INTEGER := 0;
  339. X  cx,cy   : INTEGER := 0; (* Global current x and y pos *)
  340. X  level_jump : INTEGER := 10;
  341. X
  342. XPROCEDURE WriteScoreBoard;
  343. XBEGIN
  344. X  `20
  345. X  QIO_Write( Get_Posn( 7,24 )+ UDEC( player.score,6 ) );
  346. X  QIO_Write( Get_Posn( 22,24 )+ UDEC( player.level,2 ) );
  347. X  QIO_Write( Get_Posn( 37,24 ) + UDEC( TRUNC(target.timeleft),3 ) );
  348. XEND;
  349. X
  350. XPROCEDURE RepositionTarget;
  351. XVAR x,y,i : INTEGER;
  352. XBEGIN
  353. X  REPEAT
  354. X    target.x := Rnd(1, pf_width ); target.y := Rnd( 1,pf_length );
  355. X  UNTIL (player.x <> target.x) AND (player.y<>target.y);
  356. X  target.timeleft := 200.0;
  357. X  PlayField`5Btarget.x,target.y`5D := target_C;
  358. X  qio_write( Get_Posn( x_ofs+target.x, y_ofs+target.y ) + target.c );`20
  359. X  FOR i := 1 TO mines DO BEGIN
  360. X    REPEAT
  361. X      x := Rnd( 1,pf_width )-1; y := Rnd( 1,pf_length );
  362. X    UNTIL PlayField`5Bx,y`5D = ' ';
  363. X    PlayField`5Bx,y`5D := mines_C;
  364. X    Qio_Write( Get_Posn( x_ofs+x, y_ofs+y ) + mines_C );`20
  365. X  END;
  366. XEND;
  367. X
  368. XPROCEDURE Draw_Screen;
  369. XVAR x,y : INTEGER;
  370. XBEGIN
  371. X  Clear;
  372. X  FOR y := 1 TO 24 DO BEGIN
  373. X    QIO_Write( Get_Posn( 1,y ) + VT100_wide );
  374. X  END;
  375. X  Square( 1,1, pf_width +2, pf_length+2 );
  376. X  QIO_Write( Get_Posn( 1,24 ) + 'SCORE:         LEVEL:     TIME LEFT:');
  377. X  WriteScoreBoard;
  378. XEND;
  379. X
  380. XPROCEDURE ReDraw_PlayField;
  381. XVAR x,y : INTEGER;
  382. X    s   : VARYING`5B80`5D OF CHAR;
  383. XBEGIN
  384. X  Draw_Screen;
  385. X  FOR y := 1 TO pf_length DO BEGIN
  386. X    s := '';
  387. X    FOR x := 1 TO pf_width DO`20
  388. X      s := s + PlayField`5Bx,y`5D;
  389. X    QIO_Write( Get_Posn( x_ofs+1,y_ofs+y)+s );
  390. X  END;
  391. XEND;
  392. X
  393. XPROCEDURE ReDraw_Screen;
  394. XBEGIN
  395. X  Draw_Screen;
  396. X  ReDraw_PlayField;
  397. XEND;
  398. X
  399. XPROCEDURE Clear_PlayField;
  400. XVAR x,y :INTEGER;
  401. XBEGIN
  402. X  FOR y := 1 TO pf_length DO
  403. X    FOR x := 1 TO pf_width DO
  404. X      PlayField`5Bx,y`5D := ' ';
  405. X  ReDraw_PlayField;
  406. X  player.x := pf_width DIV 2;  player.y := pf_length DIV 2;
  407. X  player.c := Player_C;
  408. X  player.moving := false;
  409. X  player.state := _playing;
  410. X  player._x := player.x;  player._y := player.y;
  411. X  qio_write( Get_Posn( x_ofs+player.x, y_ofs+player.y ) + player.c );
  412. X  target.c := Target_C;
  413. X  RepositionTarget;
  414. XEND;
  415. X
  416. XPROCEDURE SetUp_PlayField_Players;
  417. XVAR x,y :INTEGER;
  418. XBEGIN
  419. X  Draw_Screen;
  420. X  sp_init := TRUE;
  421. X  FOR y := 1 TO pf_length DO
  422. X    FOR x := 1 TO pf_width DO
  423. X      PlayField`5Bx,y`5D := ' ';
  424. X  Seed_Initialize;
  425. X  player.x := pf_width DIV 2;  player.y := pf_length DIV 2;
  426. X  player.c := Player_C;
  427. X  player.state := _playing;
  428. X  player.moving := false;
  429. X  player._x := player.x;  player._y := player.y;
  430. X  qio_write(Get_Posn( x_ofs+player.x, y_ofs+player.y ) +  player.c );
  431. X  target.c := Target_C;
  432. X  RepositionTarget;
  433. XEND;
  434. X
  435. XPROCEDURE UpDatePlayerDisplay;
  436. XBEGIN
  437. X  IF player.moving THEN BEGIN
  438. X    CASE player.dir OF
  439. X    right: IF player.x > 1 THEN BEGIN
  440. X             QIO_Write( Get_Posn( x_ofs+player._x, y_ofs+player._y ) +`20
  441. X                PlayField`5Bplayer._x, player._y`5D+player.c );
  442. X           END;
  443. X    left : IF player.x < pf_width THEN BEGIN
  444. X             QIO_Write( Get_Posn( x_ofs+player.x, y_ofs+player.y ) +`20
  445. X                player.c+PlayField`5Bplayer._x, player._y`5D );
  446. X           END;
  447. X    OTHERWISE`20
  448. X      BEGIN
  449. X        QIO_Write( Get_Posn( x_ofs+player.x, y_ofs+player.y ) + player.c );
  450. X        QIO_Write( Get_Posn( x_ofs+player._x, y_ofs+player._y ) +`20
  451. X            PlayField`5Bplayer._x, player._y`5D);
  452. X      END;
  453. X    END;
  454. X    QIO_Write( Carriage_Return );
  455. X    player._x := player.x; player._y := player.y;
  456. X  END;
  457. XEND;`20
  458. X
  459. XPROCEDURE NormalMovePlayer;
  460. XBEGIN
  461. X  IF player.moving THEN
  462. X    CASE player.dir OF
  463. X    up    : IF player.y > 1 THEN
  464. X              player.y := player.y -1
  465. X            ELSE BEGIN
  466. X              player.dir := down;
  467. X            END;
  468. X    down  : IF player.y < pf_length THEN
  469. X              player.y := player.y +1
  470. X            ELSE BEGIN
  471. X              player.dir := up;
  472. X            END;
  473. X    left  : IF player.x > 1 THEN
  474. X              player.x := player.x -1
  475. X            ELSE BEGIN
  476. X              player.dir := right;
  477. X            END;
  478. X    right : IF player.x < pf_width THEN
  479. X              player.x := player.x +1
  480. X            ELSE BEGIN
  481. X              player.dir := left;
  482. X            END;
  483. X    END;
  484. XEND; `7BNormalMovePlayer`7D
  485. X
  486. XPROCEDURE ReflexLeft;  `7B/`7D
  487. XBEGIN
  488. X  IF player.delete THEN BEGIN`20
  489. X
  490. X    PlayField`5Bplayer.x,player.y`5D := ' ';
  491. X    player.delete := FALSE;
  492. X    player.score := player.score - 100;
  493. X    IF player.score < 0 THEN player.score :=0;
  494. X    END
  495. X  ELSE BEGIN   `20
  496. X    CASE player.dir OF
  497. X      up   : player.dir := right;
  498. X      down : player.dir := left;
  499. X      left : player.dir := down;
  500. X      right: player.dir := up;
  501. X    END;
  502. X  END;
  503. X  player.state := _playing;
  504. X  NormalMovePlayer;
  505. X  UpdatePlayerDisplay;
  506. XEND;   `20
  507. X
  508. XPROCEDURE ReflexRight; `7B\`7D
  509. XBEGIN
  510. X  IF player.delete THEN BEGIN
  511. X    PlayField`5Bplayer.x,player.y`5D := ' ';
  512. X    player.delete := FALSE;
  513. X    player.score := player.score - 100;
  514. X    IF player.score < 0 THEN player.score :=0;
  515. X    END
  516. X  ELSE BEGIN   `20
  517. X    CASE player.dir OF
  518. X      up   : player.dir := left;
  519. X      down : player.dir := right;
  520. X      left : player.dir := up;
  521. X      right: player.dir := down;
  522. X    END;
  523. X  END;
  524. X  player.state := _playing;
  525. X  NormalMovePlayer;
  526. X  UpdatePlayerDisplay;
  527. XEND;
  528. X
  529. XPROCEDURE NextLevel;
  530. XVAR i : INTEGER;
  531. XBEGIN
  532. X  player.level := player.level + 1;
  533. X  IF player.level mod level_jump = 0 THEN BEGIN (* clear screen, inc. speed
  534. V *)
  535. X    IF player.delay > 0.0 THEN         `20
  536. X      player.delay := player.delay - delay_decrement;
  537. X      if player.delay < 0.0 then player.delay := 0.0;
  538. X    mines := player.level div level_jump;
  539. X    Clear_PlayField;
  540. X  END ELSE BEGIN
  541. X    (*mines := mines + 1;*)
  542. X    PlayField`5Btarget.x,target.y`5D := ' ';
  543. X    RepositionTarget;
  544. X  END;
  545. X  player.state := _playing;
  546. X  FOR i := 1 TO (TRUNC(target.timeleft) DIV 10) DO BEGIN
  547. X    player.score := player.score + 10+player.level;
  548. X    WriteScoreBoard;
  549. X    sleep(0,0.025);
  550. X  END;
  551. XEND;
  552. X
  553. XPROCEDURE DieFool;
  554. XVAR i  : INTEGER;
  555. XBEGIN
  556. X  player.state := _dead;
  557. X  FOR i := 32 TO 96 DO BEGIN
  558. X    Posn( x_ofs+player.x, y_ofs+player.y);
  559. X    Qio_Write( CHR(i) );
  560. X  END;
  561. X  FOR i := 95 DOWNTO 32 DO BEGIN
  562. X    Posn( x_ofs+player.x, y_ofs+player.y);
  563. X    Qio_Write( CHR(i) );
  564. X  END;
  565. XEND; `20
  566. X
  567. XPROCEDURE GameLoop;
  568. XVAR ch : CHAR;
  569. X    oldtime : INTEGER;
  570. XBEGIN
  571. X  WHILE (player.state = _playing) DO BEGIN
  572. X    (* check player space *)
  573. X    CASE PlayField`5Bplayer.x,player.y`5D OF
  574. X      enemy_C : player.state := _hit_enemy;
  575. X      target_C: player.state := _hit_target;
  576. X      mines_C : player.state := _hit_mine;
  577. X      hyper_C : player.state := _hit_hyper;
  578. X      left_deflect_C : player.state := _hit_left;
  579. X      right_deflect_C : player.state := _hit_right;
  580. X    END;  `20
  581. X
  582. X    IF (player.moving) THEN BEGIN
  583. X      oldtime := TRUNC( target.timeleft );
  584. X      target.timeleft := target.timeleft - player.delay;
  585. X      IF oldtime <> TRUNC( target.timeleft ) THEN
  586. X        WriteScoreBoard;
  587. X      IF target.timeleft <= 0 THEN player.state := _dead;
  588. X    END;
  589. X
  590. X      (* get player input *)
  591. X    ch := Upper_Case( QIO_1_Char_Now );
  592. X    IF (player.state = _playing) OR (player.state= _hit_right)
  593. X       OR (player.state = _hit_left) THEN BEGIN   `20
  594. X      CASE ch OF
  595. X        kbd_left : BEGIN
  596. X                     PlayField`5Bplayer.x,player.y`5D := left_deflect_C;
  597. X                     player.state := _hit_left;
  598. X                     if not player.moving then player.moving := true;
  599. X                   END;
  600. X        kbd_right: BEGIN`20
  601. X                     PlayField`5Bplayer.x,player.y`5D := right_deflect_C;
  602. X                     player.state := _hit_right;
  603. X                     if not player.moving then player.moving := true;
  604. X                   END;
  605. X      END;`7Bcase`7D
  606. X    END;`7Bif`7D
  607. X
  608. X    CASE ch OF
  609. X      kbd_delete: IF player.moving THEN player.delete:= TRUE;
  610. X      kbd_quit : player.state := _quit;
  611. X      kbd_redraw : Redraw_Screen;
  612. X    END;
  613. X `20
  614. X    CASE player.state OF
  615. X      _playing    : BEGIN
  616. X                      NormalMovePlayer;
  617. X                      UpDatePlayerDisplay;
  618. X                      Sleep( 0, player.delay );
  619. X                    END;
  620. X      _hit_target : NextLevel;
  621. X      _hit_mine   : DieFool;
  622. X      _hit_hyper  : `7BHyperJump`7D;
  623. X      _hit_enemy  : DieFool;
  624. X      _hit_left   : ReflexLeft;
  625. X      _hit_right  : ReflexRight;
  626. X    END;
  627. X  END;
  628. X  Top_Ten( player.score );
  629. XEND;
  630. X
  631. X
  632. XPROCEDURE ExitHandler;
  633. XBEGIN
  634. X  Reset_Screen;
  635. X  Posn( 1,21 );
  636. XEND;
  637. X
  638. XBEGIN`20
  639. X  Initialize_Channel;
  640. X  Setup_Handler( iaddress( ExitHandler ) );
  641. X  Force;
  642. X  mines := 0;
  643. X  player.delay := start_delay;
  644. X  player.score := 0;
  645. X  enemy.active := FALSE; (* no enemies yet *)
  646. X  Show_graphedt( 'REFLEX.PIC', true );
  647. X  Increment_Game_Count;
  648. X  SetUp_PlayField_Players;
  649. X  GameLoop;
  650. XEND.
  651. $ CALL UNPACK REFLEX.PAS;39 370274486
  652. $ create 'f'
  653. X`1B`5BH`1B`5BJ`1B(B`1B`5B0m
  654. X`1B`5B1;1H`1B#6       `1B(0lqqqqqqqqqqqqqqqqqqqqqqqqk
  655. X`1B`5B2;1H`1B#3lqqqqqqu`1B(B* ** *** REFLEX *** ** *`1B(0tqqqqqqk
  656. X`1B`5B3;1H`1B#4l      u`1B(B* ** *** REFLEX *** ** *`1B(0t      k
  657. X`1B`5B4;1H`1B#6x      mqqqqqqqqqqqqqqqqqqqqqqqqj      x
  658. X`1B`5B5;1H`1B#6x`1B(B   Chris Guthrey, Waikato University `1B`5B5;40H`1B(0x
  659. X`1B`5B6;1H`1B#6x`1B(B         Hamilton, New Zealand       `1B`5B6;40H`1B(0x
  660. X`1B`5B7;1H`1B#6tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu
  661. X`1B`5B8;1H`1B#6x
  662. X`1B`5B8;12Hlqk   lqk
  663. X`1B`5B8;40Hx`1B`5B9;1H`1B#6x  U`1B(Bse the `1B(0x4x `1B(B& `1B(0x6x`20
  664. X`1B`5B9;22H`1B(Bkeys to deflect   `1B(0x
  665. X`1B`5B10;1H`1B#6x
  666. X`1B`5B10;12Hmqj   mqj
  667. X`1B`5B10;40Hx`1B`5B11;1H`1B#6x     `1B(Byourself towards the target.  `20
  668. X`1B`5B11;38H  `1B(0x
  669. X`1B`5B12;1H`1B#6x`1B`5B12;11Hlqk`1B`5B12;40Hx
  670. X`1B`5B13;1H`1B#6x U`1B(Bse the `1B(0x5x `1B(Bkey to destroy the next  `1B(0x
  671. X`1B`5B14;1H`1B#6x`1B`5B14;11Hmqj`1B`5B14;40Hx
  672. X`1B`5B15;1H`1B#6x  `1B(Bdeflector you hit. (Costs points)   `1B(0x
  673. X`1B`5B16;1H`1B#6x`1B`5B16;40Hx`1B`5B17;1H`1B#6tqqqqqqqqqqqqqqqqqqqqqq
  674. X`1B`5B17;24Hqqqqqqqqqqqqqqqqu
  675. X`1B`5B18;1H`1B#6x  Y`1B(Bou - O    Target - $    Mines - +  `1B(0x
  676. X`1B`5B19;1H`1B#6x`1B`5B19;40Hx
  677. X`1B`5B20;1H`1B#6x
  678. X`1B`5B20;12HD`1B(Beflectors - /  \`1B`5B20;40H`1B(0x
  679. X`1B`5B21;1H`1B#6x`1B`5B21;40Hx
  680. X`1B`5B22;1H`1B#6mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj`1B`5B1;1H`1B(B`1B*
  681. $ CALL UNPACK REFLEX.PIC;9 1919887789
  682. $ create 'f'
  683. X(* DIGITAL VT100 Terminal Control Codes.`20
  684. X *
  685. X * * This file is a component of the INTERACT Pascal Games Library * *
  686. X *       ** from Waikato University, Hamilton, NEW ZEALAND **
  687. X *
  688. X *  Written by Paul Denize (PDENIZE@WAIKATO.AC.NZ)`20
  689. X *
  690. X *  Contributing authors: Rex Croft (CCC_REX@WAIKATO.AC.NZ)
  691. X *                        Lawrence D'Oliviero (LDO@WAIKATO.AC.NZ)
  692. X *                        Chris Guthrey (CGUTHREY@WAIKATO.AC.NZ)
  693. X *)
  694. XCONST
  695. X  VT100_ESC  = chr(27);
  696. X
  697. X  VT100_top      = ''(27)'#3';
  698. X  VT100_bottom   = ''(27)'#4';
  699. X  VT100_wide     = ''(27)'#6';
  700. X
  701. X  VT100_normal   = ''(27)'`5Bm';
  702. X  VT100_bright   = ''(27)'`5B1m';
  703. X  VT100_flash    = ''(27)'`5B5m';
  704. X  VT100_inverse  = ''(27)'`5B7m';
  705. X
  706. X  VT100_bright_only  = ''(27)'`5B0;1m';
  707. X  VT100_flash_only   = ''(27)'`5B0;5m';
  708. X  VT100_inverse_only = ''(27)'`5B0;7m';
  709. X
  710. X  VT100_store    = ''(27)'7';
  711. X  VT100_restore  = ''(27)'8';
  712. X
  713. X  VT100_graphics_on  = ''(27)'(0';
  714. X  VT100_graphics_off = ''(27)'(B';
  715. X  VT100_Alternate_graphics = ''(27)')0';
  716. X
  717. X  VT100_normal_scroll = ''(27)'`5B0;24r';
  718. X  VT100               = ''(27)'<';
  719. X
  720. X  VT100_application_keypad    = ''(27)'=';
  721. X  VT100_no_application_keypad = ''(27)'>';
  722. X
  723. X  VT100_bell = chr(7);
  724. X  VT100_bs   = chr(8);
  725. X  VT100_lf   = chr(10);
  726. X  VT100_cr   = chr(13);
  727. X  VT100_si   = chr(14);
  728. X  VT100_so   = chr(15);
  729. X
  730. X  (* VT320 Specific Codes added by Chris Guthrey (10 March 93) *)
  731. X
  732. X  VT320_G1_Char_Set = chr( 14 );
  733. X  VT320_G0_Char_Set = chr( 15 );
  734. X
  735. X  VT320_VT100_Mode = ''(27)'`5B61"p';
  736. X  VT320_8bit_Mode = ''(27)'`5B62"p';
  737. X  VT320_7bit_Mode = ''(27)'`5B63;1"p';   (* default Vt320 mode *)
  738. $ CALL UNPACK VT100_ESC_SEQS.PAS;12 1666029369
  739. $ v=f$verify(v)
  740. $ EXIT
  741.