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

  1. Path: uunet!elroy.jpl.nasa.gov!decwrl!waikato.ac.nz!cguthrey
  2. From: cguthrey@waikato.ac.nz
  3. Newsgroups: vmsnet.sources.games
  4. Subject: Reflex - Test your, [1/2]
  5. Message-ID: <1993Apr9.211217.15378@waikato.ac.nz>
  6. Date: 9 Apr 93 21:12:17 +1200
  7. Organization: University of Waikato, Hamilton, New Zealand
  8. Lines: 1356
  9. Xref: uunet vmsnet.sources.games:678
  10.  
  11. Hello VMS Game Players,
  12.  
  13. Here's a simple little game in VAX Pascal for VT100 compatable terminals.
  14.  
  15. The files included are
  16.  
  17. $README.TXT   (this one)
  18. REFLEX.PAS   Game source
  19. REFLEX.PIC   Introduction screen 
  20. MISC.PAS     Usefull routines extracted from Paul Denize's INTERACT Library.
  21. VT100_ESC_SEQS.PAS  Terminal Escape Codes used in INTERACT.
  22.  
  23.  
  24. This isn't a very impressive game at all, but it was quick and easy to
  25. write.  You may enjoy it.  It may inspire you to write your own games for
  26. the VAX. If you do, let me know!
  27.  
  28. The game REFLEX will create a score file called REFLEX.ACN.
  29.  
  30. Many thanks to Paul Denize for providing the source to his INTERACT library.
  31.  
  32. No warranty of any kind is provided with this software. This software is
  33. copyright of the University Of Waikato, Hamilton, New Zealand.
  34. You may distribute these files provided you retain the headers and credits.
  35.  
  36.  
  37. Have fun,
  38. Chris Guthrey
  39. cguthrey@waikato.ac.nz
  40.  
  41.  
  42. $! ------------------ CUT HERE -----------------------
  43. $ v='f$verify(f$trnlnm("SHARE_VERIFY"))'
  44. $!
  45. $! This archive created by VMS_SHARE Version 7.2-007  22-FEB-1990
  46. $!   On  9-APR-1993 20:52:07.44   By user CGUTHREY (Chris R. Guthrey)
  47. $!
  48. $! This VMS_SHARE Written by:
  49. $!    Andy Harper, Kings College London UK
  50. $!
  51. $! Acknowledgements to:
  52. $!    James Gray       - Original VMS_SHARE
  53. $!    Michael Bednarek - Original Concept and implementation
  54. $!
  55. $!+ THIS PACKAGE DISTRIBUTED IN 2 PARTS, TO KEEP EACH PART
  56. $!  BELOW 80 BLOCKS
  57. $!
  58. $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER
  59. $! AND EXECUTE AS A COMMAND PROCEDURE  (  @name  )
  60. $!
  61. $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING:
  62. $!       1. $README.TXT;1
  63. $!       2. MAKE.COM;1
  64. $!       3. MISC.PAS;19
  65. $!       4. REFLEX.PAS;39
  66. $!       5. REFLEX.PIC;9
  67. $!       6. VT100_ESC_SEQS.PAS;12
  68. $!
  69. $set="set"
  70. $set symbol/scope=(nolocal,noglobal)
  71. $f=f$parse("SHARE_TEMP","SYS$SCRATCH:.TMP_"+f$getjpi("","PID"))
  72. $e="write sys$error  ""%UNPACK"", "
  73. $w="write sys$output ""%UNPACK"", "
  74. $ if f$trnlnm("SHARE_LOG") then $ w = "!"
  75. $ ve=f$getsyi("version")
  76. $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto START
  77. $ e "-E-OLDVER, Must run at least VMS 4.4"
  78. $ v=f$verify(v)
  79. $ exit 44
  80. $UNPACK: SUBROUTINE ! P1=filename, P2=checksum
  81. $ if f$search(P1) .eqs. "" then $ goto file_absent
  82. $ e "-W-EXISTS, File ''P1' exists. Skipped."
  83. $ delete 'f'*
  84. $ exit
  85. $file_absent:
  86. $ if f$parse(P1) .nes. "" then $ goto dirok
  87. $ dn=f$parse(P1,,,"DIRECTORY")
  88. $ w "-I-CREDIR, Creating directory ''dn'."
  89. $ create/dir 'dn'
  90. $ if $status then $ goto dirok
  91. $ e "-E-CREDIRFAIL, Unable to create ''dn'. File skipped."
  92. $ delete 'f'*
  93. $ exit
  94. $dirok:
  95. $ w "-I-PROCESS, Processing file ''P1'."
  96. $ if .not. f$verify() then $ define/user sys$output nl:
  97. $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='P1'
  98. PROCEDURE Unpacker ON_ERROR ENDON_ERROR;SET(FACILITY_NAME,"UNPACK");SET(
  99. SUCCESS,OFF);SET(INFORMATIONAL,OFF);f:=GET_INFO(COMMAND_LINE,"file_name");b:=
  100. CREATE_BUFFER(f,f);p:=SPAN(" ")@r&LINE_END;POSITION(BEGINNING_OF(b));
  101. LOOP EXITIF SEARCH(p,FORWARD)=0;POSITION(r);ERASE(r);ENDLOOP;POSITION(
  102. BEGINNING_OF(b));g:=0;LOOP EXITIF MARK(NONE)=END_OF(b);x:=ERASE_CHARACTER(1);
  103. IF g=0 THEN IF x="X" THEN MOVE_VERTICAL(1);ENDIF;IF x="V" THEN APPEND_LINE;
  104. MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);ENDIF;IF x="+" THEN g:=1;
  105. ERASE_LINE;ENDIF;ELSE IF x="-" THEN IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+")=
  106. 1 THEN g:=0;ENDIF;ENDIF;ERASE_LINE;ENDIF;ENDLOOP;t:="0123456789ABCDEF";
  107. POSITION(BEGINNING_OF(b));LOOP r:=SEARCH("`",FORWARD);EXITIF r=0;POSITION(r);
  108. ERASE(r);x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,ERASE_CHARACTER(1))-1;
  109. COPY_TEXT(ASCII(16*x1+x2));ENDLOOP;WRITE_FILE(b,GET_INFO(COMMAND_LINE,
  110. "output_file"));ENDPROCEDURE;Unpacker;QUIT;
  111. $ delete/nolog 'f'*
  112. $ CHECKSUM 'P1'
  113. $ IF CHECKSUM$CHECKSUM .eqs. P2 THEN $ EXIT
  114. $ e "-E-CHKSMFAIL, Checksum of ''P1' failed."
  115. $ ENDSUBROUTINE
  116. $START:
  117. $ create 'f'
  118. XREFLEX `20
  119. X
  120. XSingle Player game for VT100 compatable terminals.
  121. X
  122. XWritten in VAX Pascal, under VMS A5.2.
  123. X
  124. XThe files included are
  125. X
  126. X$README.TXT   (this one)
  127. XREFLEX.PAS   Game source
  128. XREFLEX.PIC   Introduction screen`20
  129. XMISC.PAS     Usefull routines extracted from Paul Denize's INTERACT Library.
  130. XVT100_ESC_SEQS.PAS  Terminal Escape Codes used in INTERACT.
  131. X
  132. XThe game REFLEX will create a score file called REFLEX.ACN.
  133. X
  134. XThis isn't a very impressive game at all, but it was quick and easy to
  135. Xwrite.  You may enjoy it.  It may inspire you to write your own games for
  136. Xthe VAX. If you do, let me know!
  137. X
  138. XMany thanks to Paul Denize for providing the source to his INTERACT library.
  139. X
  140. XNo warranty of any kind is provided with this software. This software is
  141. Xcopyright of the University Of Waikato, Hamilton, New Zealand.
  142. XYou may distribute these files provided you retain the headers and credits.
  143. X
  144. XHere is the header of the file MISC.PAS:
  145. X
  146. X(****************** This file is a collection of routines from  ************
  147. V**
  148. X ******************    the INTERACT Pascal Games Library...     ************
  149. V**
  150. X *****************                                               ***********
  151. V**
  152. X ****************  (c) Waikato University, Hamilton, NEW ZEALAND  **********
  153. V**
  154. X *
  155. X *  The INTERACT Library was written by Paul Denize   PDENIZE@WAIKATO.AC.NZ`
  156. V20
  157. X *
  158. X *  Contributing authors: Rex Croft                   CCC_REX@WAIKATO.AC.NZ
  159. X *                        Lawrence D'Oliviero         LDO@WAIKATO.AC.NZ
  160. X *                        Chris Guthrey               CGUTHREY@WAIKATO.AC.NZ
  161. X *
  162. X *  Several improvements to the TOPTEN Score Table System`20
  163. X *  contributed by:
  164. X *                        Bill Brenessel      MASMUMMY@ubvmsc.cc.buffalo.edu
  165. X *
  166. X * You are granted permission to use the routines in this file or any other
  167. X * routines from any INTERACT Library File on condition that this header is
  168. X * retained and credit given where due.
  169. X *
  170. X * Note of course that there is no warranty of any kind whatsoever.
  171. X *
  172. X *)
  173. X
  174. X
  175. XHave fun,
  176. XChris Guthrey
  177. Xcguthrey@waikato.ac.nz
  178. $ CALL UNPACK $README.TXT;1 1163196366
  179. $ create 'f'
  180. X$ write sys$output "Compiling..."
  181. X$ pascal/opt/nodebug misc, reflex
  182. X$ write sys$output "Linking..."
  183. X$ link/nodebug reflex, misc
  184. X$ write sys$output "Finished!"
  185. $ CALL UNPACK MAKE.COM;1 1560878412
  186. $ create 'f'
  187. X(****************** This file is a collection of routines from  ************
  188. V**
  189. X ******************    the INTERACT Pascal Games Library...     ************
  190. V**
  191. X *****************                                               ***********
  192. V**
  193. X ****************  (c) Waikato University, Hamilton, NEW ZEALAND  **********
  194. V**
  195. X *
  196. X *  The INTERACT Library was written by Paul Denize   PDENIZE@WAIKATO.AC.NZ`
  197. V20
  198. X *
  199. X *  Contributing authors: Rex Croft                   CCC_REX@WAIKATO.AC.NZ
  200. X *                        Lawrence D'Oliviero         LDO@WAIKATO.AC.NZ
  201. X *                        Chris Guthrey               CGUTHREY@WAIKATO.AC.NZ
  202. X *
  203. X *  Several improvements to the TOPTEN Score Table System`20
  204. X *  contributed by:
  205. X *                        Bill Brenessel      MASMUMMY@ubvmsc.cc.buffalo.edu
  206. X *
  207. X * You are granted permission to use the routines in this file or any other
  208. X * routines from any INTERACT Library File on condition that this header is
  209. X * retained and credit given where due.
  210. X *
  211. X * Note of course that there is no warranty of any kind whatsoever.
  212. X *
  213. X *)
  214. X`5B
  215. X  Inherit(
  216. X    (*'GEN$:`5BPAS`5DVAXTYPES', *)
  217. X    'SYS$LIBRARY:PASCAL$LIB_ROUTINES',
  218. X    'SYS$LIBRARY:STARLET'`20
  219. X    (* 'GEN$:`5BPAS`5DVMSRTL' *)`20
  220. X  ),
  221. X  Environment
  222. X    ('MISC.PEN')
  223. X`5D
  224. XMODULE MISC( OUTPUT );
  225. X
  226. X(*****************************************************************
  227. X ** THIS FILE IS MERELY A CONCISE COMPILATION OF ROUTINES TAKEN **
  228. X ** FROM A NUMBER OF INTERACT GAMES LIBRARY SOURCE FILES. ONLY  **
  229. X ** THE ROUTINES NEEDED BY THIS PARTICULAR GAME ARE INCLUDED.   **
  230. X *****************************************************************)
  231. X
  232. X%INCLUDE 'VT100_ESC_SEQS.PAS'
  233. X
  234. XTYPE
  235. X      `7B signed integer types `7D
  236. X`09$byte = `5BBYTE`5D -128..127;
  237. X`09$word = `5BWORD`5D -32768..32767;
  238. X`09$quad = `5BQUAD,UNSAFE`5D RECORD
  239. X`09`09l0:UNSIGNED; l1:INTEGER; END;
  240. X`09$octa = `5BOCTA,UNSAFE`5D RECORD
  241. X`09`09l0,l1,l2:UNSIGNED; l3:INTEGER; END;
  242. X
  243. X      `7B unsigned integer types `7D
  244. X`09$ubyte = `5BBYTE`5D 0..255;
  245. X`09$uword = `5BWORD`5D 0..65535;
  246. X`09$uquad = `5BQUAD,UNSAFE`5D RECORD
  247. X`09`09l0,l1:UNSIGNED; END;
  248. X`09$uocta = `5BOCTA,UNSAFE`5D RECORD
  249. X`09`09l0,l1,l2,l3:UNSIGNED; END;
  250. X
  251. X      `7B miscellaneous types `7D
  252. X`09$packed_dec = `5BBIT(4),UNSAFE`5D 0..15;
  253. X`09$deftyp = `5BUNSAFE`5D INTEGER;
  254. X`09$defptr = `5BUNSAFE`5D `5E$DEFTYP;
  255. X
  256. X
  257. X`5BHIDDEN`5D
  258. XTYPE
  259. X  v_array = varying `5B256`5D of char;
  260. X
  261. X`5BGLOBAL`5D
  262. XFUNCTION System_Call ( ret_status : integer ) : Boolean;
  263. XBEGIN
  264. X  IF not odd(ret_status) then
  265. X    LIB$SIGNAL(ret_status);
  266. X  System_Call := odd(ret_status);
  267. XEND;
  268. X
  269. X`5BGLOBAL`5D
  270. XPROCEDURE  TERMINATE ( code : integer := 1 );
  271. XBEGIN
  272. X  $EXIT ( code );
  273. XEND;
  274. X
  275. X`5BGLOBAL`5D
  276. XPROCEDURE  KILL ( PID : `5BTRUNCATE`5D UNSIGNED );
  277. XBEGIN
  278. X  IF PRESENT(PID) then
  279. X    System_Call ($DELPRC(pidadr:=PID))
  280. X  ELSE
  281. X    System_Call ($DELPRC);
  282. XEND;
  283. X
  284. XVAR
  285. X  terminal_input_channel    : $UWORD;
  286. X  terminal_output_channel   : $UWORD;
  287. X  channel_initialized : Boolean := False;
  288. X
  289. X
  290. X`5BGLOBAL`5D
  291. XPROCEDURE  initialize_channel( input_device : v_array := 'TT:';
  292. X                               output_device : v_array := 'TT:' );
  293. XBEGIN
  294. X  IF not channel_initialized then
  295. X    BEGIN `20
  296. X      System_Call ($assign ( chan := terminal_output_channel , devnam := out
  297. Vput_device));
  298. X      IF input_device = output_device THEN     `7Bare in and out devices sam
  299. Ve?`7D
  300. X        terminal_input_channel := terminal_output_channel `7Bsame channel`7D
  301. X      ELSE
  302. X        System_Call ($assign ( chan := terminal_input_channel ,devnam := inp
  303. Vut_device ));
  304. X    END;
  305. XEND;
  306. X
  307. X`5BGLOBAL`5D
  308. XFUNCTION  QIO_1_char_now : char;
  309. XVAR
  310. X  buffer : packed array `5B1..1`5D of char;
  311. XBEGIN
  312. X  buffer`5B1`5D := chr(-1);
  313. X  System_Call ($qiow ( chan:= terminal_input_channel,
  314. X                        func:= io$_readvblk+io$m_timed+io$m_noecho+io$m_nofi
  315. Vltr,
  316. X                        p1:= buffer,
  317. X                        p2:= 1, `7B bufferlength `7D
  318. X                        p3:= 0 ));
  319. X   Qio_1_char_now := buffer`5B1`5D;
  320. XEND;
  321. X
  322. X
  323. X`5BGLOBAL`5D
  324. XFUNCTION  QIO_readln ( characters : integer ) : v_array;
  325. XTYPE
  326. X  iosb_type = `5BQUAD`5D Record
  327. X                       Status : $uword;
  328. X                       Nrbytes : $uword;
  329. X                       Terminator : char;
  330. X                       Reserved : $ubyte;
  331. X                       Terminator_length : $ubyte;
  332. X                       Cursor_offset : $ubyte
  333. X                     End;
  334. XVAR
  335. X  temp : v_array;
  336. X  Read_iosb : iosb_type;
  337. XBEGIN
  338. X  system_Call ( $qiow ( chan:= terminal_input_channel,
  339. X                        func:= io$m_timed+io$_readvblk+io$m_noecho+io$m_nofi
  340. Vltr+io$m_escape,
  341. X                        iosb:= read_iosb,
  342. X                          p1:= temp.body,
  343. X                          p2:= characters,
  344. X                          p3:= 0 ));
  345. X   temp.length := ( read_iosb.Nrbytes );
  346. X   qio_readln := temp;
  347. XEND;
  348. X
  349. X
  350. X`5BGLOBAL`5D
  351. XFUNCTION  QIO_1_char : char;
  352. XVAR
  353. X  buffer : packed array `5B1..1`5D of char;
  354. XBEGIN
  355. X  System_Call ($qiow ( chan:= terminal_input_channel,
  356. X                        func:= io$_readvblk+io$m_noecho+io$m_nofiltr,
  357. X                          p1:= buffer,
  358. X                          p2:= 1 ));
  359. X  Qio_1_char := buffer`5B1`5D;
  360. XEND;
  361. X
  362. X
  363. X`5BGLOBAL`5D
  364. XPROCEDURE  QIO_purge;
  365. XBEGIN
  366. X  System_Call ($qiow ( chan:= terminal_input_channel,
  367. X                        func:= io$_readvblk+io$m_purge ));
  368. XEND;
  369. X
  370. X
  371. X`5BGLOBAL`5D
  372. XFUNCTION  QIO_1_char_timed ( delay : integer ) : char;
  373. XVAR
  374. X  buffer : packed array `5B1..1`5D of char;
  375. XBEGIN
  376. X  buffer`5B1`5D := chr(255);
  377. X  System_Call ($qiow ( chan:= terminal_input_channel,
  378. X                        func:=io$m_timed+io$_readvblk+io$m_noecho+io$m_nofil
  379. Vtr+io$m_escape,
  380. X                          p1:= buffer,
  381. X                          p2:= 1,
  382. X                          p3:= delay ));
  383. X  Qio_1_char_timed := buffer`5B1`5D;
  384. XEND;
  385. X
  386. X`5BGLOBAL`5D
  387. XPROCEDURE  QIO_write ( text : v_array );
  388. XBEGIN
  389. X  System_Call ($qiow (chan:= terminal_output_channel,
  390. X                       func:= io$_writevblk,
  391. X                         p1:= text.body,
  392. X                         p2:= text.length ));
  393. XEND;
  394. X
  395. X
  396. X`5BGLOBAL`5D
  397. XPROCEDURE  QIO_writeln ( text : `5BTRUNCATE`5D v_array );
  398. XVAR
  399. X  outline     : v_array;
  400. XBEGIN
  401. X  IF present(text) then
  402. X    BEGIN
  403. X      outline := text + VT100_cr + VT100_lf;
  404. X      System_Call ($qiow (chan:= terminal_output_channel,
  405. X                           func:= io$_writevblk,
  406. X                             p1:= outline.body,
  407. X                             p2:= outline.length  ));
  408. X    END
  409. X  ELSE
  410. X    BEGIN
  411. X      outline := VT100_cr + VT100_lf;
  412. X      System_Call ($qiow (chan:= terminal_output_channel,
  413. X                           func:= io$_writevblk,
  414. X                             p1:= outline.body,
  415. X                             p2:= outline.length  ));
  416. X    END;
  417. XEND;
  418. X
  419. X`5BGLOBAL`5D
  420. XPROCEDURE  Sleep ( sec : integer := 0; frac : `5BTRUNCATE`5D real );
  421. XVAR
  422. X  Hundredths : integer;
  423. X  delta_wake_time : $quad;
  424. XBEGIN
  425. X  Hundredths := sec*100;
  426. X  IF PRESENT(frac) then
  427. X    Hundredths := Hundredths + round(frac*100);
  428. X  IF ( hundredths > 0 ) then
  429. X    BEGIN
  430. X      System_Call (LIB$EMUL (Hundredths, -100000, 0, delta_wake_time));
  431. X      IF System_Call ($Schdwk ( daytim := delta_wake_time )) then
  432. X        System_Call ($Hiber);
  433. X    END;
  434. XEND;
  435. X
  436. XTYPE
  437. X  portiontype = (The_Screen,The_Line);
  438. X  cleartype   = (Wholething, To_Start, To_End);
  439. X `20
  440. X`5BHIDDEN`5D
  441. XVAR
  442. X  desblk : Record
  443. X             findlink   : integer;
  444. X             proc       : integer;
  445. X             arglist    : array `5B0..1`5D of integer;
  446. X             exitreason : integer;
  447. X           End;
  448. X
  449. X
  450. X`5BHIDDEN`5D
  451. XPROCEDURE  ctrlc_ast;
  452. XBEGIN
  453. X  $exit ( code := ss$_clifrcext );
  454. XEND;
  455. X
  456. X`5BGLOBAL`5D
  457. XPROCEDURE  Force;
  458. XBEGIN
  459. X  System_Call ($qiow ( chan := terminal_output_channel,
  460. X                        func := io$_setmode + io$m_ctrlcast,
  461. X                        p1   := %immed iaddress (ctrlc_ast)));
  462. XEND;
  463. X
  464. X
  465. X`5BGLOBAL`5D
  466. XPROCEDURE Setup_handler ( handler_address : integer );
  467. XBEGIN
  468. X  WITH desblk do
  469. X    BEGIN
  470. X      proc       := handler_address;
  471. X      arglist`5B0`5D := 1;
  472. X      arglist`5B1`5D := iaddress(exitreason);
  473. X    END;
  474. X
  475. X  System_Call ($DCLEXH (desblk));
  476. XEND;`20
  477. X
  478. X
  479. X`5BGLOBAL`5D
  480. XPROCEDURE  No_handler;
  481. XBEGIN
  482. X  System_Call ($CANEXH (desblk));
  483. XEND;
  484. X
  485. X
  486. X`5BGLOBAL`5D
  487. XFUNCTION  Upper_case ( c : char ) : char;
  488. XBEGIN
  489. X  IF ( c in `5B'a'..'z'`5D ) then
  490. X    c := chr ( ord(c) - ord('a') + ord('A') );
  491. X  upper_case := c;
  492. XEND;
  493. X
  494. X`5BGLOBAL`5D
  495. XPROCEDURE  Clear ( portion : portiontype := The_Screen;
  496. X                   clear   : cleartype   := Wholething );
  497. XVAR
  498. X  outline : v_array;
  499. XBEGIN
  500. X  outline := VT100_ESC + '`5B';
  501. X
  502. X  IF ( clear = Wholething ) then
  503. X    outline := outline + '2'
  504. X  ELSE
  505. X  IF ( clear = To_Start ) then
  506. X    outline := outline + '1';
  507. X
  508. X  IF ( portion = The_Screen ) then
  509. X    outline := outline + 'J'
  510. X  ELSE
  511. X  IF ( portion = The_Line ) then
  512. X    outline := outline + 'K';
  513. X
  514. X  qio_write (outline);
  515. XEND;
  516. X
  517. X
  518. X`5BGLOBAL`5D
  519. XPROCEDURE  ERROR ( text : `5BTRUNCATE`5D v_array );
  520. XBEGIN
  521. X  writeln ( VT100 + VT100_graphics_off + VT100_normal + VT100_normal_scroll
  522. V + VT100_no_application_keypad + VT100_ESC + '`5BJ' );
  523. X  IF present(text) then
  524. X    writeln (text)
  525. X  else
  526. X    writeln ('No Message');
  527. X  $EXIT;
  528. XEND;
  529. X
  530. X
  531. X`5BGLOBAL`5D
  532. XFUNCTION  Get_Posn ( x , y : integer ) : v_array;
  533. XVAR
  534. X  outline,sx,sy : v_array;
  535. XBEGIN
  536. X  outline := VT100_ESC + '`5B';
  537. X
  538. X  IF ( y > 1 ) then
  539. X    BEGIN
  540. X      writev (sy,y:1);
  541. X      outline := outline + sy;
  542. X    END;
  543. X
  544. X  IF ( x > 1 ) then
  545. X    BEGIN
  546. X      writev (sx,x:1);
  547. X      outline := outline + ';' + sx;
  548. X    END;
  549. X
  550. X  get_posn := outline + 'H';
  551. XEND;
  552. X
  553. X`5BGLOBAL`5D
  554. XPROCEDURE  Posn ( x , y : integer );
  555. XBEGIN
  556. X  qio_write (get_posn(x,y));
  557. XEND;
  558. X
  559. X
  560. X`5BHIDDEN`5D
  561. XVAR
  562. X  seed : integer;
  563. X  seed_initialized : boolean;
  564. X
  565. X
  566. X`5BGLOBAL`5D
  567. XPROCEDURE  Seed_initialize ( users_seed : `5BTRUNCATE`5D integer );
  568. XVAR
  569. X  time : packed array `5B0..1`5D of integer;
  570. XBEGIN
  571. X  seed_initialized := true;
  572. X  IF present(users_seed) then
  573. X    seed := users_seed
  574. X  ELSE
  575. X    BEGIN
  576. X      $gettim(time);
  577. X      seed := time`5B0`5D;
  578. X    END;
  579. XEND;
  580. X
  581. X
  582. X`5BGLOBAL`5D
  583. XFUNCTION  Random ( ub : integer ) : integer;
  584. X`7B Produce random integer between 1 & ub inclusive `7D
  585. X
  586. X        FUNCTION  Mth$Random ( VAR seed : integer ) : real;
  587. X          extern;
  588. X
  589. XBEGIN
  590. X  If not seed_initialized then
  591. X    seed_initialize;
  592. X  Random := Trunc (( Mth$Random ( seed ) * ub ) + 1);
  593. XEND; `7B Random `7D
  594. X
  595. X
  596. X`5BGLOBAL`5D
  597. XFUNCTION  Rnd ( lb, ub : integer ) : integer;
  598. X`7B Produce random integer between lb & ub `7D
  599. X
  600. X        FUNCTION  Mth$Random ( VAR seed : integer ) : real;
  601. X          extern;
  602. X
  603. XBEGIN
  604. X  If not seed_initialized then
  605. X    seed_initialize;
  606. X  rnd := Trunc (( Mth$Random ( seed ) * (ub-lb+1) ) + lb );
  607. XEND; `7B Random `7D
  608. X
  609. X
  610. X`5BGLOBAL`5D
  611. XFUNCTION  _Dec ( number    : integer;
  612. X                pad_char  : char := ' ';
  613. X                pad_len   : integer := 0
  614. X              ) : v_array;
  615. XVAR
  616. X  Result : v_array;
  617. XBEGIN
  618. X  Writev (result,number:0);
  619. X  WHILE ( result.length < abs(pad_len) ) do
  620. X    IF ( pad_len < 0 ) then
  621. X      result := result + pad_char
  622. X    ELSE
  623. X      result := pad_char + result;
  624. X  _dec := result;
  625. XEND;
  626. X
  627. X`5BGLOBAL`5D
  628. XFUNCTION  Get_jpi_Str ( jpicode , retlen : integer ) : v_array;
  629. XVAR
  630. X  itemlist    : record
  631. X                  item : array `5B1..1`5D of`20
  632. X                    record
  633. X                      bufsize : $uword;
  634. X                      code    : $uword;
  635. X                      bufadr  : integer;
  636. X                      lenadr  : integer
  637. X                    end;
  638. X                  no_more : integer;
  639. X                end;
  640. X  name : packed array `5B1..256`5D of char;
  641. X  retname : v_array;
  642. XBEGIN
  643. X  WITH itemlist do
  644. X   BEGIN
  645. X     WITH item`5B1`5D do
  646. X       BEGIN
  647. X         Bufsize := retlen;
  648. X         Code := jpicode;
  649. X         Bufadr := iaddress(name);
  650. X         Lenadr := 0
  651. X       END;
  652. X     No_more := 0
  653. X   END;
  654. X  System_Call ($Getjpiw(itmlst := itemlist));
  655. X  retname := name;
  656. X  retname.length := retlen;
  657. X  get_jpi_str := retname;
  658. XEND;
  659. X
  660. XFUNCTION  Get_jpi_Val ( jpicode : INTEGER ) : UNSIGNED;
  661. XVAR
  662. X  itemlist    : record
  663. X                  item : array `5B1..1`5D of`20
  664. X                    record
  665. X                      bufsize : $uword;
  666. X                      code    : $uword;
  667. X                      bufadr  : integer;
  668. X                      lenadr  : integer
  669. X                    end;
  670. X                  no_more : integer;
  671. X                end;
  672. X  resulting_value : UNSIGNED;
  673. X  retname : v_array;
  674. XBEGIN
  675. X  WITH itemlist do
  676. X   BEGIN
  677. X     WITH item`5B1`5D do
  678. X       BEGIN
  679. X         Bufsize := 4;
  680. X         Code := jpicode;
  681. X         Bufadr := iaddress(resulting_value);
  682. X         Lenadr := 0
  683. X       END;
  684. X     No_more := 0
  685. X   END;
  686. X  System_Call ($Getjpiw(itmlst := itemlist));
  687. X  get_jpi_val := resulting_value;
  688. XEND;
  689. X
  690. X`5BHIDDEN`5DVAR
  691. X  image_dir_done : boolean;
  692. X
  693. X
  694. X`5BGLOBAL`5D
  695. XPROCEDURE  Image_dir;
  696. XVAR
  697. X  itemlist    : record
  698. X                  item : array `5B1..1`5D of`20
  699. X                    record
  700. X                      bufsize : $uword;
  701. X                      code    : $uword;
  702. X                      bufadr  : integer;
  703. X                      lenadr  : integer
  704. X                    end;
  705. X                  no_more : integer;
  706. X                end;
  707. X  the_name : v_array;
  708. X  name_str : packed array `5B1..256`5D of char;
  709. XBEGIN
  710. X  IF not image_dir_done then
  711. X    BEGIN
  712. X      image_dir_done := true;
  713. X      the_name := Get_jpi_str(jpi$_imagname,100);
  714. X   `20
  715. X      WHILE ( index(the_name,'`5D`5B') <> 0 ) do
  716. X        BEGIN
  717. X          the_name := substr(the_name,1,index(the_name,'`5D`5B')-1) + substr
  718. V(the_name,index(the_name,'`5D`5B')+2,length(the_name)-(index(the_name,'`5D`5
  719. VB')+2));
  720. X        END;
  721. X   `20
  722. X      the_name := substr(the_name,1,index(the_name,'`5D'));
  723. X      name_str := the_name;
  724. X   `20
  725. X      WITH itemlist do
  726. X       BEGIN
  727. X         WITH item`5B1`5D do
  728. X           BEGIN
  729. X             Bufsize := length(the_name);
  730. X             Code := lnm$_string;
  731. X             Bufadr := iaddress(name_str);
  732. X             Lenadr := 0
  733. X           END;
  734. X         No_more := 0
  735. X       END;
  736. X
  737. X      System_Call ($Crelnm (tabnam:='LNM$PROCESS_TABLE',
  738. X                             lognam:='IMAGE_DIR',
  739. X                             itmlst:=itemlist ));
  740. X    END;
  741. XEND;
  742. X
  743. X
  744. X`5BGLOBAL`5D
  745. XPROCEDURE  Square ( x1 , y1 , x2 , y2 : integer );
  746. XVAR
  747. X  i : integer;
  748. X  sx : v_array;
  749. X  buffer : v_array;
  750. XBEGIN
  751. X  IF ( x1 > x2 - 1 ) or ( y1 > y2 - 1 ) then
  752. X    ERROR ('%INTERACT-SQUARE, Top Corner Bottom Corner Overlap');
  753. X  IF ( abs(x2-x1) > 132 ) then
  754. X    ERROR ('%INTERACT-SQUARE, Size Error delta x distance too large.');
  755. X  IF ( abs(y2-y1) > 24 ) then
  756. X    ERROR ('%INTERACT-SQUARE, Size Error delta y distance too large.');
  757. X
  758. X  buffer := get_posn (x1,y1) + VT100_graphics_on + 'l';
  759. X  FOR i := x1+1 to x2-1 do
  760. X    buffer := buffer + 'q';
  761. X  buffer := buffer + 'k';
  762. X  qio_write (buffer);
  763. X  writev(sx,x2-x1-1:1);
  764. X  sx := 'x' + VT100_ESC + '`5B' + sx + 'C' + 'x';
  765. X  FOR i := y1+1 to y2-1 do
  766. X    qio_write ( get_posn(x1,i)+ sx );
  767. X  buffer := get_posn (x1,y2) + 'm';
  768. X  IF ( x1 < x2 - 1 ) then
  769. X    FOR i := x1+1 to x2-1 do
  770. X      buffer := buffer + 'q';
  771. X  buffer := buffer + 'j' + VT100_graphics_off;
  772. X  qio_write (buffer);
  773. XEND;
  774. X
  775. X
  776. X`5BGLOBAL`5D
  777. XPROCEDURE  Reset_screen;
  778. XBEGIN
  779. X  qio_write ( VT100 + VT100_graphics_off + VT100_normal + VT100_normal_scrol
  780. Vl + VT100_no_application_keypad );
  781. XEND;
  782. X
  783. X`5BHIDDEN`5D
  784. XVAR
  785. X  ingraphedt     : text;
  786. X
  787. X`5BGLOBAL`5D
  788. XFUNCTION Show_graphedt ( filename : v_array; wait : boolean := true ) : CHAR
  789. V;
  790. X(*`20
  791. X  IF wait is true then the character that is pressed is returned, otherwise
  792. X   chr(255) is returned
  793. X*)
  794. XVAR
  795. X  line : v_array;
  796. X  rep : char := chr(255);
  797. X  ret_val : char;
  798. XBEGIN
  799. X  IF not image_dir_done then
  800. X    Image_dir;
  801. X  IF ( wait ) then
  802. X    rep := qio_1_char_now;
  803. X  OPEN (ingraphedt,'image_dir:'+filename,history:=readonly,error:=continue);
  804. X  IF status(ingraphedt) = 0 then
  805. X    BEGIN
  806. X      reset (ingraphedt);
  807. X      WHILE not eof(ingraphedt) and (( rep = chr(-1)) or ( not wait )) do
  808. X        BEGIN
  809. X          IF wait then
  810. X            rep := qio_1_char_now;
  811. X          readln (ingraphedt,line);
  812. X          qio_writeln(line);
  813. X        END;
  814. X      close (ingraphedt);
  815. X      posn (1,1);
  816. X      IF wait and ( rep = chr(-1) ) then
  817. X        rep := qio_1_char;
  818. X    END
  819. X  ELSE
  820. X    BEGIN
  821. X      clear;
  822. X      posn (18,10);
  823. X      qio_write ('couldn''t find filename .... '+filename);
  824. X      posn (28,20);
  825. X      qio_write (VT100_Bright+'Press  <'+VT100_Flash+'Return'+VT100_normal+V
  826. VT100_bright+'>'+VT100_normal);
  827. X      posn (1,1);
  828. X      IF ( rep  = chr(-1) ) then
  829. X        rep := qio_1_char;
  830. X    END;
  831. X  reset_screen;
  832. X  Show_GraphEdt := rep;
  833. XEND;
  834. X
  835. X`5BGLOBAL`5D
  836. XFUNCTION  Full_char ( character : char ) : v_array;
  837. XVAR
  838. X  c : integer;
  839. XBEGIN
  840. X  c := ord(character);
  841. X  IF ( c in `5B0..31,127`5D ) then
  842. X    full_char := VT100_inverse + chr(64+c) + VT100_normal
  843. X  ELSE
  844. X  IF ( c < 128 ) then
  845. X    full_char := character
  846. X  ELSE
  847. X  IF ( (c-128) in `5B0..31,127`5D ) then
  848. X    full_char := VT100_inverse + VT100_bright + chr(c-64) + VT100_normal
  849. X  ELSE
  850. X    full_char := VT100_bright + character;
  851. XEND;
  852. X
  853. X
  854. X`5BGlobal`5D
  855. XPROCEDURE  Formated_read
  856. X (VAR return_value   : v_array;
  857. X      picture_clause : v_array;
  858. X      x_posn         : integer;
  859. X      y_posn         : integer;
  860. X      default_value  : v_array := '';
  861. X      field_full_terminate : boolean := false;
  862. X      begin_brace    : v_array := '';
  863. X      end_brace      : v_array := ''
  864. X );
  865. XVAR
  866. X  i : integer;
  867. X  ch : char;
  868. X  outline : v_array;
  869. X
  870. X
  871. X    PROCEDURE  Go_left;
  872. X    BEGIN
  873. X      IF ( i <> 1 ) then
  874. X        BEGIN
  875. X          REPEAT
  876. X            i := i - 1;
  877. X          UNTIL ( i = 1 ) or ( picture_clause`5Bi`5D in `5B'9','X'`5D );
  878. X          IF not ( picture_clause`5Bi`5D in `5B'9','X'`5D ) then
  879. X            BEGIN
  880. X              WHILE not ( picture_clause`5Bi`5D in `5B'9','X'`5D ) do
  881. X                i := i + 1;
  882. X            END;
  883. X        END;
  884. X    END;
  885. X
  886. X
  887. X    PROCEDURE  Go_right;
  888. X    BEGIN
  889. X      IF ( i <> length(picture_clause) ) then
  890. X        BEGIN
  891. X          REPEAT
  892. X            i := i + 1;
  893. X          UNTIL ( i = length(picture_clause) ) or ( picture_clause`5Bi`5D in
  894. V `5B'9','X'`5D );
  895. X          IF not ( picture_clause`5Bi`5D in `5B'9','X'`5D ) then
  896. X            BEGIN
  897. X              WHILE not ( picture_clause`5Bi`5D in `5B'9','X'`5D ) do
  898. X                i := i - 1;
  899. X            END;
  900. X        END;
  901. X    END;
  902. X
  903. X
  904. X    PROCEDURE  Escape_sequence;
  905. X    BEGIN
  906. X      ch := qio_1_char;
  907. X      IF ( ch = '`5B' ) then
  908. X        BEGIN
  909. X          ch := qio_1_char;
  910. X          CASE ch of
  911. X            'C' : go_right;
  912. X            'D' : go_left;
  913. X            Otherwise
  914. X             qio_write (chr(7));               `20
  915. X          End;
  916. X        END
  917. X      ELSE
  918. X        qio_write (chr(7));               `20
  919. X    END;
  920. X
  921. X
  922. X    PROCEDURE  Delete;
  923. X    VAR
  924. X      last : integer;
  925. X    BEGIN
  926. X      IF ( i <> 1 ) then
  927. X        BEGIN
  928. X          last := length(picture_clause)+1;
  929. X          REPEAT
  930. X            last := last - 1;
  931. X          UNTIL ( last = 1 ) or ( picture_clause`5Blast`5D in `5B'9','X'`5D
  932. V );
  933. X
  934. X          IF ( i <> last ) or ( return_value`5Bi`5D = ' ' ) then
  935. X            REPEAT
  936. X              i := i - 1;
  937. X            UNTIL ( i = 1 ) or ( picture_clause`5Bi`5D in `5B'9','X'`5D );
  938. X
  939. X          IF not ( picture_clause`5Bi`5D in `5B'9','X'`5D ) then
  940. X            BEGIN
  941. X              WHILE not ( picture_clause`5Bi`5D in `5B'9','X'`5D ) do
  942. X                i := i + 1;
  943. X            END
  944. X          ELSE
  945. X            BEGIN
  946. X              posn (x_posn+i-1,y_posn);
  947. X               qio_write (' '+VT100_bs);
  948. X              return_value`5Bi`5D := ' ';
  949. X            END;
  950. X        END;
  951. X    END;
  952. X
  953. X
  954. X    PROCEDURE  Key_control;
  955. X    BEGIN
  956. X      IF ( ch = chr(13) ) then
  957. X        BEGIN
  958. X          field_full_terminate := true;
  959. X          i := length(picture_clause) + 1;
  960. X        END
  961. X      ELSE
  962. X      IF ( ch = chr(27) ) then
  963. X        escape_sequence
  964. X      ELSE
  965. X      IF ( ch = chr(127) ) then
  966. X        delete
  967. X      ELSE
  968. X        qio_write (chr(7));               `20
  969. X    END;
  970. X
  971. X
  972. XBEGIN
  973. X  return_value := '';
  974. X
  975. X`7B get x & y if left out `7D
  976. X
  977. X  FOR i := 1 to length(picture_clause) do
  978. X      CASE picture_clause`5Bi`5D of
  979. X        '9' : IF length(default_value) < i then
  980. X                return_value := return_value + ' '
  981. X              ELSE
  982. X              IF ( default_value`5Bi`5D in `5B' ','0'..'9'`5D ) then
  983. X                return_value := return_value + default_value`5Bi`5D
  984. X              ELSE
  985. X                ERROR ('DEFAULT VALUE /'+default_value`5Bi`5D+'/ DOES NOT MA
  986. VTCH PICTURE CLAUSE /'+picture_clause`5Bi`5D+'/');
  987. X        'X' : IF length(default_value) < i then
  988. X                return_value := return_value + ' '
  989. X              ELSE
  990. X              IF ( default_value`5Bi`5D in `5B' '..'`7E'`5D ) then
  991. X                return_value := return_value + default_value`5Bi`5D
  992. X              ELSE
  993. X                ERROR ('%INTERACT-F-DVMM, DEFAULT VALUE /'+full_char(default
  994. V_value`5Bi`5D)+'/ DOES NOT MATCH PICTURE CLAUSE /'+picture_clause`5Bi`5D+'/'
  995. V);
  996. X       otherwise`20
  997. X          return_value := return_value + picture_clause`5Bi`5D;
  998. X      End;
  999. X
  1000. X  outline := '';
  1001. X
  1002. X  posn (x_posn,y_posn);
  1003. X  IF length(begin_brace) > 0 then
  1004. X    outline := outline + begin_brace;
  1005. X  outline := outline + return_value;
  1006. X  IF length(end_brace) > 0 then
  1007. X    outline := outline + end_brace;
  1008. X
  1009. X  qio_write (outline);
  1010. X
  1011. X  IF length(begin_brace) > 0 then
  1012. X    x_posn := x_posn + length(begin_brace);
  1013. X
  1014. X  i := 1;
  1015. X  REPEAT
  1016. X    WHILE ( i <= length(picture_clause) ) do
  1017. X      BEGIN
  1018. X        posn (x_posn+i-1,y_posn);
  1019. X        CASE picture_clause`5Bi`5D of
  1020. X          '9' : BEGIN
  1021. X                  ch := qio_1_char;
  1022. X                  IF ( ch in `5B' ','0'..'9'`5D ) then
  1023. X                    BEGIN
  1024. X                      return_value`5Bi`5D := ch;
  1025. X                      qio_write (ch);
  1026. X                      i := i + 1;
  1027. X                    END
  1028. X                  ELSE
  1029. X                    key_control;
  1030. X                END;
  1031. X          'X' : BEGIN
  1032. X                  ch := qio_1_char;
  1033. X                  IF ( ch in `5B' '..'`7E'`5D ) then
  1034. X                    BEGIN
  1035. X                      return_value`5Bi`5D := ch;
  1036. X                      qio_write (ch);
  1037. X                      i := i + 1;
  1038. X                    END
  1039. X                  ELSE
  1040. X                    key_control;
  1041. X                END;
  1042. X         otherwise`20
  1043. X            i := i + 1;
  1044. X        End;
  1045. X      END;
  1046. X    IF ( i > length(picture_clause) ) and ( not field_full_terminate ) then
  1047. X      i := length(picture_clause);
  1048. X  UNTIL ( i > length(picture_clause) );
  1049. XEND;
  1050. X
  1051. X
  1052. X`5BASYNCHRONOUS, EXTERNAL(STR$TRIM)`5D
  1053. XFUNCTION  $Trim
  1054. X  ( VAR destination_str : `5BCLASS_S`5D PACKED ARRAY `5B$L1 .. $U1 : INTEGER
  1055. V`5D OF CHAR;
  1056. X        source_str      : `5BCLASS_S`5D PACKED ARRAY `5B$L2 .. $U2 : INTEGER
  1057. V`5D OF CHAR;
  1058. X    VAR return_length   : $UWORD
  1059. X  ) : integer;
  1060. XExtern;
  1061. X
  1062. X`5BGLOBAL`5D
  1063. XFUNCTION  Trim ( text : v_array ) : v_array;
  1064. XBEGIN
  1065. X  System_Call ($trim (text.body,text,text.length));
  1066. X  trim := text;
  1067. XEND;
  1068. X
  1069. XTYPE
  1070. X  date_time_type = array `5B1..7`5D of $uword;
  1071. X
  1072. X
  1073. X`5BASYNCHRONOUS, EXTERNAL(LIB$DAY_OF_WEEK)`5D
  1074. XFUNCTION  $Day_of_week
  1075. X    (
  1076. X        time     : $quad := %IMMED 0;
  1077. X    VAR day_num  : integer
  1078. X    ) : integer;
  1079. XExtern;
  1080. X
  1081. X
  1082. X`5BGLOBAL`5D
  1083. XFUNCTION  Get_Date_time : date_time_type;
  1084. XVAR
  1085. X  Date_time : date_time_type;
  1086. XBEGIN
  1087. X  System_Call ($numtim (date_time));
  1088. X  get_date_time := date_time;
  1089. XEND;
  1090. X
  1091. X
  1092. X`5BGLOBAL`5D
  1093. XFUNCTION  Day_num ( Date_Time : date_time_type ) : integer;
  1094. XVAR
  1095. X  temp : integer;
  1096. X  q : $quad;
  1097. XBEGIN
  1098. X  System_Call ($gettim(q));
  1099. X  System_Call ($day_of_week(q,temp));
  1100. X  day_num := temp;
  1101. XEND;
  1102. X
  1103. X
  1104. X`5BHIDDEN`5D
  1105. XCONST
  1106. X(* These values are returned by the predefined STATUS function. *)
  1107. X
  1108. X    PAS$K_SUCCESS    =    0;    (* last operation successful *)
  1109. X    PAS$K_FILNOTFOU  =    3;    (* file not found *)
  1110. X    PAS$K_ACCMETINC  =    5;    (* ACCESS_METHOD specified is incompatible w
  1111. Vith this file *)
  1112. X    PAS$K_RECLENINC  =    6;    (* RECORD_LENGTH specified is inconsistent w
  1113. Vith this file *)
  1114. X
  1115. X`5BHIDDEN`5D
  1116. XTYPE
  1117. X  u_array = varying `5B8`5D of char;
  1118. X  s_array = varying `5B12`5D of char;
  1119. X  everything = Record
  1120. X                 tot_games : integer;
  1121. X                 month     : integer;
  1122. X                 m_user    : array `5B1..12`5D of u_array;
  1123. X                 m_name    : array `5B1..12`5D of s_array;
  1124. X                 m_score   : array `5B1..12`5D of integer;
  1125. X                 user      : array `5B0..19`5D of u_array;
  1126. X                 name      : array `5B0..19`5D of s_array;
  1127. X                 score     : array `5B0..19`5D of integer;
  1128. X                 games     : array `5B0..19`5D of integer;
  1129. X               End;
  1130. X`5BHIDDEN`5D
  1131. XVAR
  1132. X  infile  : File of everything;
  1133. X  newfile : File of everything;
  1134. X  game_count_incremented : boolean := false;
  1135. X
  1136. X`5BHIDDEN`5D
  1137. XPROCEDURE  Get_Image_dir_and_ACN_name ( VAR directory, gamename : v_array );
  1138. XVAR
  1139. X  the_name : v_array;
  1140. XBEGIN
  1141. X  the_name := Get_jpi_str(jpi$_imagname,100);
  1142. X  WHILE ( index(the_name,'`5D`5B') <> 0 ) do
  1143. X    BEGIN
  1144. X      the_name := substr(the_name,1,index(the_name,'`5D`5B')-1) + substr(the
  1145. V_name,index(the_name,'`5D`5B')+2,length(the_name)-(index(the_name,'`5D`5B')+
  1146. V2));
  1147. X    END;
  1148. X  directory := substr(the_name,1,index(the_name,'`5D'));
  1149. X  the_name := substr(the_name,index(the_name,'`5D')+1,the_name.length-index(
  1150. Vthe_name,'`5D'));
  1151. X  gamename := substr(the_name,1,index(the_name,'.')-1);
  1152. XEND;
  1153. X
  1154. X`5BHIDDEN`5D
  1155. XFUNCTION  month_of_year ( i : integer ) : v_array;
  1156. XBEGIN
  1157. X  month_of_year := substr('JanFebMarAprMayJunJulAugSepOctNovDec',(i*3)-2,3);
  1158. XEND;
  1159. X
  1160. X`5BHIDDEN`5D
  1161. XPROCEDURE  Display_Screen ( current_state : everything; date_time : date_tim
  1162. Ve_type; me : integer; gamename : v_array; last_score : integer );
  1163. XVAR
  1164. X  i : integer;
  1165. X  year_now  : integer;
  1166. X  month_now : integer;
  1167. XBEGIN
  1168. X  year_now  := date_time`5B1`5D;
  1169. X  month_now := date_time`5B2`5D;
  1170. X  clear;
  1171. X  posn (1,1);
  1172. X  qio_write ('Immortal Players For '+_dec(year_now-1)+' - '+_dec(year_now)+'
  1173. V               Top Players For '+month_of_year(month_now)+' ');
  1174. X  qio_writeln (VT100_bright+_dec(current_state.tot_games,,6)+' Games'+VT100_
  1175. Vnormal);
  1176. X  qio_writeln (VT100_graphics_on+'oooooooooooooooooooooooooooooooo
  1177. V               ooooooooooooooooooo'+VT100_graphics_off);
  1178. X  qio_writeln ('Month  Username  Name         Score     Num Username  Name
  1179. V         Score   Games');
  1180. X  qio_writeln;
  1181. X
  1182. X  For i := month_now-1 downto 1 do
  1183. X    IF ( current_state.m_score`5Bi`5D <> -maxint-1 ) then
  1184. X      qio_writeln (' '+month_of_year(i)+'   '+current_state.m_user`5Bi`5D+'
  1185. V  '+current_state.m_name`5Bi`5D+' '+_dec(current_state.m_score`5Bi`5D,,5))
  1186. X    ELSE
  1187. X      qio_writeln;
  1188. X  For i := 12 downto month_now do
  1189. X    IF ( current_state.m_score`5Bi`5D <> -maxint-1 ) then
  1190. X      qio_writeln (' '+month_of_year(i)+'   '+current_state.m_user`5Bi`5D+'
  1191. V  '+current_state.m_name`5Bi`5D+' '+_dec(current_state.m_score`5Bi`5D,,5))
  1192. X    ELSE
  1193. X      qio_writeln;
  1194. X
  1195. X  For i := 0 to 11 do
  1196. X    IF ( current_state.score`5Bi`5D <> -maxint-1 ) then
  1197. X      qio_write (get_posn(41,5+i)+_dec(i+1,,3)+' '+current_state.user`5Bi`5D
  1198. V+'  '+current_state.name`5Bi`5D+' '+_dec(current_state.score`5Bi`5D,,5)+'
  1199. V   '+_dec(current_state.games`5Bi`5D,,3));
  1200. X
  1201. X  posn (5,18);
  1202. X  qio_write ('You Are Seated At '+_dec(me+1)+' In '+gamename);
  1203. X
  1204. X  IF ( last_score <> -maxint-1 ) THEN
  1205. X    BEGIN
  1206. X        `7B doing worse on or off board or better but still off board `7D
  1207. X      posn (42,18);
  1208. X      qio_writeln ('Previous Score '+_dec(last_score));
  1209. X    END;
  1210. XEND;
  1211. X
  1212. X`5BHIDDEN`5D
  1213. XPROCEDURE  Display_Current_Score (last_score : integer; this_score : integer
  1214. V );
  1215. XBEGIN
  1216. X  posn (42,20);
  1217. X  qio_writeln ('Current Score '+_dec(this_score));
  1218. XEND;
  1219. X
  1220. X`5BHIDDEN`5D
  1221. XPROCEDURE  Display_Update_Prompts (me : integer; last_score : integer; this_
  1222. Vscore : integer );
  1223. XBEGIN
  1224. X  IF ( me < 12 ) THEN
  1225. X    BEGIN
  1226. X      posn (5,20);
  1227. X      qio_writeln (VT100_bright+'Enter Your Name `5B Return to Leave `5D'+VT
  1228. V100_normal);
  1229. X    END;
  1230. XEND;
  1231. X
  1232. X`5BHIDDEN`5D
  1233. XPROCEDURE  Create_new_score_file ( directory : v_array; gamename : v_array;
  1234. V date_time : date_time_type );
  1235. XVAR
  1236. X  i : integer;
  1237. X  month_now : integer;
  1238. XBEGIN
  1239. X  month_now := date_time`5B2`5D;
  1240. X  OPEN(newfile,directory+gamename+'.ACN',new,,direct,error:=continue);
  1241. X  IF status(newfile) <> PAS$K_SUCCESS THEN
  1242. X    BEGIN
  1243. X      qio_writeln ('Can''t Create '+gamename+'.ACN Insufficient priviledge.'
  1244. V);
  1245. X      $exit(1);
  1246. X    END;
  1247. X  rewrite (newfile);
  1248. X  newfile`5E.tot_games := 0;
  1249. X  newfile`5E.month     := month_now;
  1250. X  FOR i := 1 to 12 do
  1251. X    BEGIN
  1252. X      newfile`5E.m_user`5Bi`5D := '        ';
  1253. X      newfile`5E.m_name`5Bi`5D := '            ';
  1254. X      newfile`5E.m_score`5Bi`5D := -maxint-1;
  1255. X    END;
  1256. X  FOR i := 0 to 19 do
  1257. X    BEGIN
  1258. X      newfile`5E.user`5Bi`5D := '        ';
  1259. X      newfile`5E.name`5Bi`5D := '            ';
  1260. X      newfile`5E.score`5Bi`5D := -maxint-1;
  1261. X    END;
  1262. X  newfile`5E.games := zero;
  1263. X  put (newfile);
  1264. X  close (newfile);
  1265. XEND;
  1266. X
  1267. X`5BHIDDEN`5D
  1268. XPROCEDURE  Update_Topten ( VAR current_state : everything;`20
  1269. X                            date_time : date_time_type;`20
  1270. X                            username : v_array;`20
  1271. X                            this_score : integer;`20
  1272. X                        VAR me : integer;`20
  1273. X                        VAR last_score : integer;`20
  1274. X                            newname : `5BTRUNCATE`5D s_array );
  1275. XVAR
  1276. X  i, j, k : integer;
  1277. X  old_name  : s_array;
  1278. X  old_games : integer;
  1279. X  month_now : integer;
  1280. XBEGIN
  1281. X  `7B high score for the month `7D
  1282. X  month_now := date_time`5B2`5D;
  1283. X
  1284. X  if not game_count_incremented then
  1285. X    current_state.tot_games := current_state.tot_games + 1;
  1286. X  IF ( current_state.month <> month_now ) and ( current_state.month <> 0 ) t
  1287. Vhen
  1288. X    BEGIN
  1289. X      if month_now > current_state.month then
  1290. X        FOR i := current_state.month to month_now-1 do
  1291. X          BEGIN
  1292. X            newfile`5E.m_user`5Bi`5D := '        ';
  1293. X            newfile`5E.m_name`5Bi`5D := '            ';
  1294. X            newfile`5E.m_score`5Bi`5D := -maxint-1;
  1295. X          END
  1296. X      else
  1297. X        BEGIN
  1298. X          FOR i := current_state.month to 12 do
  1299. X            BEGIN
  1300. X              newfile`5E.m_user`5Bi`5D := '        ';
  1301. X              newfile`5E.m_name`5Bi`5D := '            ';
  1302. X              newfile`5E.m_score`5Bi`5D := -maxint-1;
  1303. X            END;
  1304. X          IF month_now-1 >= 1 THEN
  1305. X            FOR i := 1 to month_now-1 do
  1306. X              BEGIN
  1307. X                newfile`5E.m_user`5Bi`5D := '        ';
  1308. X                newfile`5E.m_name`5Bi`5D := '            ';
  1309. X                newfile`5E.m_score`5Bi`5D := -maxint-1;
  1310. X              END;
  1311. X        END;
  1312. X      current_state.m_user`5Bcurrent_state.month`5D := current_state.user`5B
  1313. V0`5D;
  1314. X      current_state.m_name`5Bcurrent_state.month`5D := current_state.name`5B
  1315. V0`5D;
  1316. X      current_state.m_score`5Bcurrent_state.month`5D := current_state.score`
  1317. V5B0`5D;
  1318. X      FOR i := 0 to 19 do
  1319. X        BEGIN
  1320. X          current_state.user`5Bi`5D := '        ';
  1321. X          current_state.name`5Bi`5D := '            ';
  1322. X          current_state.score`5Bi`5D := -maxint-1;
  1323. X        END;
  1324. X      current_state.games := zero;
  1325. X    END;
  1326. X  current_state.month := month_now;
  1327. X
  1328. X`7B insert/find user somewhere `7D
  1329. X
  1330. X  i := 0;
  1331. X  WHILE ( i<19 ) and ( current_state.user`5Bi`5D<>username ) do
  1332. X    i := i + 1;
  1333. X  IF ( current_state.user`5Bi`5D<>username ) then
  1334. X    BEGIN
  1335. X      current_state.user`5Bi`5D := username;
  1336. X      current_state.name`5Bi`5D := '            ';
  1337. X      current_state.score`5Bi`5D := -maxint-1;
  1338. X      current_state.games`5Bi`5D := 1;
  1339. X    END
  1340. X  ELSE
  1341. X    if not game_count_incremented then
  1342. X      current_state.games`5Bi`5D := current_state.games`5Bi`5D + 1;
  1343. X  last_score := current_state.score`5Bi`5D;
  1344. X  me := i;
  1345. X
  1346. X`7B move user up `7D
  1347. X
  1348. X  IF this_score > current_state.score`5Bi`5D then
  1349. X    BEGIN
  1350. X      j := 0;
  1351. X      WHILE this_score <= current_state.score`5Bj`5D do
  1352. X        j := j + 1;
  1353. X      IF j < i then
  1354. X        BEGIN
  1355. X          old_name := current_state.name`5Bi`5D;
  1356. X          old_games := current_state.games`5Bi`5D;
  1357. X          FOR k := i downto j+1 do
  1358. X            BEGIN
  1359. X              current_state.user`5Bk`5D := current_state.user`5Bk-1`5D;
  1360. X              current_state.name`5Bk`5D := current_state.name`5Bk-1`5D;
  1361. X              current_state.score`5Bk`5D := current_state.score`5Bk-1`5D;
  1362. X              current_state.games`5Bk`5D := current_state.games`5Bk-1`5D;
  1363. X            END;
  1364. X          current_state.user`5Bj`5D := username;
  1365. X          current_state.name`5Bj`5D := old_name;
  1366. +-+-+-+-+-+-+-+-  END  OF PART 1 +-+-+-+-+-+-+-+-
  1367.