home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / mqix / part01 < prev    next >
Encoding:
Internet Message Format  |  1992-04-07  |  47.5 KB

  1. Path: uunet!wupost!waikato.ac.nz!ccc_rex
  2. From: ccc_rex@waikato.ac.nz
  3. Newsgroups: vmsnet.sources.games
  4. Subject: MQIX 1/2 (mulit-user QIX)
  5. Message-ID: <1992Apr9.151506.7336@waikato.ac.nz>
  6. Date: 9 Apr 92 15:15:06 +1200
  7. Organization: University of Waikato, Hamilton, New Zealand
  8. Lines: 1574
  9.  
  10. This is part 1 of 2 of MQIX - multi-user QIX.
  11.  
  12. All players have to be in the same UIC group to play this game.
  13. An easy way to achieve this is to all log into the same username.
  14.  
  15. You move arround using the keypad keys 2,4,6,8.
  16. Remember to type SPACE before you can leave the walls.
  17.  
  18. You need the UTIL.OLB that is separately posted.
  19.  
  20.                 - Rex Croft    ccc_rex@waikato.ac.nz
  21.  
  22. $! ------------------ CUT HERE -----------------------
  23. $ v='f$verify(f$trnlnm("SHARE_VERIFY"))'
  24. $!
  25. $! This archive created by VMS_SHARE Version 7.2-007  22-FEB-1990
  26. $!   On  9-APR-1992 09:58:36.76   By user CCC_REX 
  27. $!
  28. $! This VMS_SHARE Written by:
  29. $!    Andy Harper, Kings College London UK
  30. $!
  31. $! Acknowledgements to:
  32. $!    James Gray       - Original VMS_SHARE
  33. $!    Michael Bednarek - Original Concept and implementation
  34. $!
  35. $!+ THIS PACKAGE DISTRIBUTED IN 2 PARTS, TO KEEP EACH PART
  36. $!  BELOW 100 BLOCKS
  37. $!
  38. $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER
  39. $! AND EXECUTE AS A COMMAND PROCEDURE  (  @name  )
  40. $!
  41. $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING:
  42. $!       1. MQIX.COM;2
  43. $!       2. MQIX.PAS;131
  44. $!       3. MQIXH.FOR;7
  45. $!       4. MQIXH.SCN;6
  46. $!       5. MQIXM.MAR;13
  47. $!
  48. $set="set"
  49. $set symbol/scope=(nolocal,noglobal)
  50. $f=f$parse("SHARE_TEMP","SYS$SCRATCH:.TMP_"+f$getjpi("","PID"))
  51. $e="write sys$error  ""%UNPACK"", "
  52. $w="write sys$output ""%UNPACK"", "
  53. $ if f$trnlnm("SHARE_LOG") then $ w = "!"
  54. $ ve=f$getsyi("version")
  55. $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto START
  56. $ e "-E-OLDVER, Must run at least VMS 4.4"
  57. $ v=f$verify(v)
  58. $ exit 44
  59. $UNPACK: SUBROUTINE ! P1=filename, P2=checksum
  60. $ if f$search(P1) .eqs. "" then $ goto file_absent
  61. $ e "-W-EXISTS, File ''P1' exists. Skipped."
  62. $ delete 'f'*
  63. $ exit
  64. $file_absent:
  65. $ if f$parse(P1) .nes. "" then $ goto dirok
  66. $ dn=f$parse(P1,,,"DIRECTORY")
  67. $ w "-I-CREDIR, Creating directory ''dn'."
  68. $ create/dir 'dn'
  69. $ if $status then $ goto dirok
  70. $ e "-E-CREDIRFAIL, Unable to create ''dn'. File skipped."
  71. $ delete 'f'*
  72. $ exit
  73. $dirok:
  74. $ w "-I-PROCESS, Processing file ''P1'."
  75. $ if .not. f$verify() then $ define/user sys$output nl:
  76. $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='P1'
  77. PROCEDURE Unpacker ON_ERROR ENDON_ERROR;SET(FACILITY_NAME,"UNPACK");SET(
  78. SUCCESS,OFF);SET(INFORMATIONAL,OFF);f:=GET_INFO(COMMAND_LINE,"file_name");b:=
  79. CREATE_BUFFER(f,f);p:=SPAN(" ")@r&LINE_END;POSITION(BEGINNING_OF(b));
  80. LOOP EXITIF SEARCH(p,FORWARD)=0;POSITION(r);ERASE(r);ENDLOOP;POSITION(
  81. BEGINNING_OF(b));g:=0;LOOP EXITIF MARK(NONE)=END_OF(b);x:=ERASE_CHARACTER(1);
  82. IF g=0 THEN IF x="X" THEN MOVE_VERTICAL(1);ENDIF;IF x="V" THEN APPEND_LINE;
  83. MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);ENDIF;IF x="+" THEN g:=1;
  84. ERASE_LINE;ENDIF;ELSE IF x="-" THEN IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+")=
  85. 1 THEN g:=0;ENDIF;ENDIF;ERASE_LINE;ENDIF;ENDLOOP;t:="0123456789ABCDEF";
  86. POSITION(BEGINNING_OF(b));LOOP r:=SEARCH("`",FORWARD);EXITIF r=0;POSITION(r);
  87. ERASE(r);x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,ERASE_CHARACTER(1))-1;
  88. COPY_TEXT(ASCII(16*x1+x2));ENDLOOP;WRITE_FILE(b,GET_INFO(COMMAND_LINE,
  89. "output_file"));ENDPROCEDURE;Unpacker;QUIT;
  90. $ delete/nolog 'f'*
  91. $ CHECKSUM 'P1'
  92. $ IF CHECKSUM$CHECKSUM .eqs. P2 THEN $ EXIT
  93. $ e "-E-CHKSMFAIL, Checksum of ''P1' failed."
  94. $ ENDSUBROUTINE
  95. $START:
  96. $ create 'f'
  97. X$ PASCAL MQIX`09`09! ignore warnings
  98. X$ FORTRAN MQIXH
  99. X$ MACRO MQIXM
  100. X$!
  101. X$ LINK /NODEBUG /NOTRACE  MQIX, MQIXM, MQIXH, UTIL/LIB
  102. $ CALL UNPACK MQIX.COM;2 1980044860
  103. $ create 'f'
  104. X`7B$S-`7D
  105. X`7B
  106. X
  107. X`09`09Program`09: Multi USer Qix`20
  108. X
  109. X`09`09Authors`09: Rex Croft       - Macro
  110. X
  111. X                          Murray Speight - Pascal`20
  112. X
  113. X`09`09Place`09: University Of Waikato`20
  114. X
  115. X`09`09Date `09: Jan 1983
  116. X
  117. X`09Software Is Subject To Change Without Notification
  118. X        The Author And His Family assume No Rsponsability For
  119. X`09Its Reliabliity Or Use.`20
  120. X
  121. X         `7D
  122. X
  123. XProgram MQix(Input,Output);
  124. X
  125. XLabel`099999;  `7B For Abortive exit Of Pgm `7D
  126. X
  127. X
  128. XConst `09Max_Num_Players`09= 8;             `7B Up To 8 Players `7D
  129. X`09Screen_Dim_R `09= 24;            `7B PLaying Board 40 * 23 `7D
  130. X`09Screen_Dim_C`09= 40;
  131. X`09Len_Of_Buff`09= 1920;          `7B Buffer to Write Chars `7D
  132. X        Max_Name_Length = 32;            `7B Lenngth of a players name `7D
  133. X
  134. XType `09Player_Responce = Packed Array `5B1..Max_Num_Players`5D Of Char;
  135. X`09Buffer`09`09= Packed Array `5B1..Len_Of_Buff`5D Of Char;`09
  136. X`09Positions`09= Array `5B1..Max_Num_Players`5D Of INteger;
  137. X`09Players_Screen`09= Array `5B1..Screen_Dim_R,1..Screen_Dim_C`5D Of Char;
  138. X`09Died_Type`09= Array `5B1..Max_NUm_Players`5D Of Boolean;
  139. X`09Name_Line`09= Packed array `5B1..max_Name_Length`5D of Char;
  140. X        Name_Table`09= Array `5B1..Max_Num_Players`5D of name_LIne;
  141. X
  142. XVar `09Responce `09,`09`09`09`7B What Players Have Typed `7D
  143. X   `09Ch_on`09`09,
  144. X`09Head_Sym`09: Player_Responce;      `7B What Symbol is THe Head `7D
  145. X   `09Cal`09`09,
  146. X`09Screen`09`09: Players_Screen;       `7B 23 * 40 Array For Screen`7D
  147. X`09Name`09`09: Name_Table;           `7B Names Of Each Player `7D
  148. X        Init_pos_R`09,                       `7B Where initaially Players St
  149. Vart `7D
  150. X        Init_pos_C      ,                       `7B  "" "" For Y Coord `7D
  151. X`09Score`09`09,                       `7B Score Of Each PLayer `7D
  152. X        Game`09`09,                       `7B Num Games Each PLayer Played `
  153. V7D
  154. X`09Games_Won `09,                       `7B Games Won By Each PLayer `7D
  155. X`09Move_R`09`09,                       `7B What Dir Each Playe Is Moving X C
  156. Voord `7D
  157. X`09Move_C`09`09,                       `7B "" "" Y Coord `7D
  158. X`09Head_R`09`09,                       `7B Where The Head Is For Each Player
  159. V X Coord `7D
  160. X`09Head_C`09 `09,                       `7B "" "" Y Coord `7D
  161. X        Rand`09`09: Positions;
  162. X`09TT_Buff`09`09: Buffer;               `7B Lenght Of Buffer To Hold Screen
  163. V Output `7D
  164. X`09TT_Len`09`09,                       `7B String To Hold Screen Output `7D
  165. X        Cursor_R`09,
  166. X        Cursor_C`09,
  167. X        Who_Is_PLaying  ,                       `7B Word With Bits Set As To
  168. V Who is Playing `7D
  169. X`09You`09`09,                       `7B Which Number You are `7D`20
  170. X`09Dummy `09`09,                       `7B Dummy argument `7D
  171. X        Area_75_Per`09,
  172. X   `09Area_Filled`09,
  173. X`09Num_players     ,                       `7B How Many people are Playing `
  174. V7D
  175. X`09Max_Player_Number : integer;                     `7B The Highest PLayers
  176. V Number who is Playing `7D
  177. X`09Quit`09`09,                       `7B Has The PLayer Quit (not playing )
  178. V or is He Playing `7D
  179. X   `09Can_Create`09,
  180. X`09Creating`09: Died_Type;            `7B Has The PLayer Died ( Died If He h
  181. Vas Quit ) `7D
  182. X`09Back_space`09,
  183. X`09Line_Feed`09,
  184. X`09Up_Line`09`09,
  185. X`09Esc`09`09: Char;                 `7B esc For escape sequences `7D
  186. X`09Seed`09`09: Real;                 `7B Seed for random number generaotor `
  187. V7D
  188. X        Time_Now`09: Packed array `5B1..11`5D Of Char;
  189. X
  190. XProcedure Break_Buff;
  191. X
  192. X   Procedure Snake_Screen( Var Line : Buffer ; Var Lenght : Integer );extern
  193. V;`20
  194. X
  195. X`7B Only Call This Once From The Add_head Function`20
  196. X
  197. X   Does not write array to screen `7D
  198. X
  199. XBegin
  200. X   Snake_Screen(TT_Buff,TT_Len);`20
  201. X   TT_Len := 0;
  202. Xend;
  203. X
  204. X
  205. X   procedure Write_5( ch1,ch2,ch3,ch4,ch5 : CHar);
  206. X  `20
  207. X   Begin
  208. X    TT_len := TT_len + 1;
  209. X    TT_Buff`5BTT_len`5D := Ch1;
  210. X    TT_len := TT_len + 1;
  211. X    TT_Buff`5BTT_len`5D := Ch2;
  212. X    TT_len := TT_len + 1;
  213. X    TT_Buff`5BTT_len`5D := Ch3;
  214. X    TT_len := TT_len + 1;
  215. X    TT_Buff`5BTT_len`5D := Ch4;
  216. X    TT_len := TT_len + 1;
  217. X    TT_Buff`5BTT_len`5D := Ch5;
  218. X   end;
  219. X  `20
  220. X
  221. X
  222. X   procedure Write_4( ch1,ch2,ch3,ch4 : CHar);
  223. X  `20
  224. X   Begin
  225. X    TT_len := TT_len + 1;
  226. X    TT_Buff`5BTT_len`5D := Ch1;
  227. X    TT_len := TT_len + 1;
  228. X    TT_Buff`5BTT_len`5D := Ch2;
  229. X    TT_len := TT_len + 1;
  230. X    TT_Buff`5BTT_len`5D := Ch3;
  231. X    TT_len := TT_len + 1;
  232. X    TT_Buff`5BTT_len`5D := Ch4;
  233. X   end;
  234. X  `20
  235. X
  236. X
  237. X   procedure Write_3( ch1,ch2,ch3 : CHar);
  238. X  `20
  239. X   Begin
  240. X    TT_len := TT_len + 1;
  241. X    TT_Buff`5BTT_len`5D := Ch1;
  242. X    TT_len := TT_len + 1;
  243. X    TT_Buff`5BTT_len`5D := Ch2;
  244. X    TT_len := TT_len + 1;
  245. X    TT_Buff`5BTT_len`5D := Ch3;
  246. X   end;
  247. X  `20
  248. X
  249. X
  250. X   procedure Write_2( ch1,ch2 : CHar);
  251. X  `20
  252. X   Begin
  253. X    TT_len := TT_len + 1;
  254. X    TT_Buff`5BTT_len`5D := Ch1;
  255. X    TT_len := TT_len + 1;
  256. X    TT_Buff`5BTT_len`5D := Ch2;
  257. X   end;
  258. X  `20
  259. X
  260. X
  261. X   procedure Write_1( ch1 : CHar);
  262. X  `20
  263. X   Begin
  264. X    TT_len := TT_len + 1;
  265. X    TT_Buff`5BTT_len`5D := Ch1;
  266. X   end;
  267. X  `20
  268. X
  269. X
  270. X   procedure at(R,C:Integer;ch : char );
  271. X  `20
  272. X   Begin`20
  273. X      If ( Abs(R-Cursor_R) <= 2 ) and ( Abs(C-Cursor_C) <= 2 ) Then Begin`20
  274. X`09 Case ( R - Cursor_R  )*5 + ( C - Cursor_C )  of`20
  275. X`09  `7B Up  ,       -2, 0  `7D -10 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch
  276. V);
  277. X`09  `7B Up  ,LEft   -2,-1  `7D -11 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch
  278. V);
  279. X`09  `7B Up  ,LEft   -2,-2  `7D -12 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch
  280. V);
  281. X`09  `7B Up  ,Right  -2, 1  `7D  -9 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch
  282. V);
  283. X`09  `7B Up  ,Right  -2, 2  `7D  -8 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch
  284. V);
  285. X`09  `7B Up  ,LEft   -1,-2  `7D  -7 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch
  286. V);
  287. X`09  `7B Up  ,LEft   -1,-1  `7D  -6 : write_4(Esc,'A',chr(8),Ch);
  288. X`09  `7B Up  ,       -1, 0  `7D  -5 : write_3(Esc,'A',ch);
  289. X`09  `7B Up  ,Right  -1, 1  `7D  -4 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch
  290. V);
  291. X`09  `7B Up  ,Right  -1, 2  `7D  -3 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch
  292. V);
  293. X`09  `7B     ,Left    0,-2  `7D  -2 : write_3(chr(8),chr(8),ch);
  294. X`09  `7B     ,Left    0,-1  `7D  -1 : write_2(chr(8),ch);
  295. X`09  `7B     ,        0, 0  `7D   0 : write_1(ch);`20
  296. X`09  `7B     ,Right   0, 1  `7D   1 : write_3(Esc,'C',ch);
  297. X`09  `7B     ,Right   0, 2  `7D   2 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch
  298. V);
  299. X`09  `7B Down,Left    1,-2  `7D   3 : write_4(Chr(10),Chr(8),chr(8),ch);
  300. X`09  `7B Down,Left    1,-1  `7D   4 : write_3(Chr(10),Chr(8),ch);
  301. X`09  `7B Down         1, 0  `7D   5 : Write_2(Chr(10),ch);
  302. X`09  `7B Down,Right   1, 1  `7D   6 : Write_4(Chr(10),Esc,'C',ch);
  303. X`09  `7B Down,Right   1, 2  `7D   7 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch
  304. V);
  305. X`09  `7B Down,Left    2,-2  `7D   8 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch
  306. V);
  307. X`09  `7B Down,Left    2,-1  `7D   9 : write_4(Chr(10),chr(10),Chr(8),ch);
  308. X`09  `7B Down         2, 0  `7D  10 : Write_3(Chr(10),chr(10),ch);
  309. X`09  `7B Down,Right   2, 1  `7D  11 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch
  310. V);
  311. X`09  `7B Down,Right   2, 2  `7D  12 : Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch
  312. V);
  313. X`09 end;
  314. X      end else  Begin
  315. X`09 Write_5(Esc,'Y',Chr(31+R),Chr(31+C),ch);
  316. X      end;
  317. X      Cursor_R := R;
  318. X      Cursor_C := C + 1;
  319. X      If C >= 40 Then`20
  320. X`09 Cursor_C := 999;
  321. X   end;
  322. X
  323. X
  324. X   Procedure new_Screen_Char( R,C : Integer );  `20
  325. X
  326. X   var Count : Integer;
  327. X
  328. X   Begin
  329. X`09 Count := 0;  `20
  330. X`09 If r-1 > 0 then`20
  331. X`09    If Screen`5Br-1,c`5D in `5B'$','l','w','k','t','n','u','x'`5D Then`20
  332. X`09       Count := Count + 1;
  333. X`09 If c - 1 > 0 then`20
  334. X`09    If screen`5Br,c-1`5D in `5B'$','l','w','t','n','m','v','q'`5D  Then
  335. X`09       Count := Count + 2;
  336. X`09 If c + 1 <= screen_Dim_C  then`20
  337. X`09    If Screen`5Br,c+1`5D in `5B'$','w','k','n','u','v','j','q'`5D  Then`2
  338. V0
  339. X`09       Count := Count + 4;
  340. X`09 If r +1 <= Screen_Dim_R then`20
  341. X`09    If Screen`5Br+1,c`5D in `5B'$','t','n','u','m','v','j','x'`5D Then`20
  342. X`09       Count := Count + 8;
  343. X`09 Case Count Of`20
  344. X`09    0`09: Screen`5BR,C`5D := ' ';`20
  345. X`09    1,8,9 : Screen`5BR,C`5D := 'x';
  346. X`09    2,4,6 : Screen`5BR,C`5D := 'q';
  347. X`09    3`09: Screen`5BR,C`5D := 'j';
  348. X`09    5`09: Screen`5BR,C`5D := 'm';
  349. X`09    7`09: Screen`5BR,C`5D := 'v';
  350. X`09    10`09: Screen`5BR,C`5D := 'k';
  351. X`09    11`09: Screen`5BR,C`5D := 'u';
  352. X`09    12`09: Screen`5BR,C`5D := 'l';
  353. X`09    13`09: Screen`5BR,C`5D := 't';
  354. X`09    14`09: Screen`5BR,C`5D := 'w';
  355. X`09    15`09: Screen`5BR,C`5D := 'n'
  356. X`09 end `7B case `7D;
  357. X   end;
  358. X
  359. X
  360. X
  361. XProcedure Help_Screen;extern;
  362. X
  363. XFunction pos( R,C : Integer ): CHar;
  364. X
  365. X`7B Write Char at Pos X,Y in Buffer `7D
  366. X
  367. XBegin
  368. X   Write(Esc,'Y',Chr(31+R),Chr(31+C));
  369. X   pos := Chr(0);
  370. Xend;
  371. X
  372. XFunction Snake_Init(Var You :  INteger ; Var Game_going : Integer):Integer;e
  373. Vxtern;
  374. X
  375. XProcedure Name_Set(Var Name : Name_Line );extern;
  376. X
  377. XProcedure Name_Get(Var Name : Name_Line ; var Play : `5BREADONLY`5D Integer
  378. V );
  379. X`09`09`09`09`09`09`09`09`09extern;
  380. XProcedure Score_Set( VAR Player: `5BREADONLY`5D INTEGER;
  381. X`09`09`09`09VAR Score,Games_PLayed,wins : INTEGER); extern;
  382. XProcedure Score_Get( Var Player : `5BREADONLY`5D INTEGER;
  383. X`09`09`09`09VAR Score,Games_Played,wins : Integer );extern;
  384. X
  385. XProcedure Snake_Start(var Whos_PLaying : Integer ; var Rand : Positions );Ex
  386. Vtern;
  387. X
  388. XProcedure Snake_Read(Var Directions : Player_Responce );Extern;
  389. X
  390. XProcedure Snake_Game_End;extern;
  391. X
  392. XProcedure Snake_Wait;Extern;
  393. X
  394. XProcedure Snake_Game_count( Var Num : Integer);extern;
  395. X
  396. XProcedure Snake_Dead(Var PLayer : Integer );extern;
  397. X
  398. XProcedure Sleep( Num_Sec : Integer);extern;
  399. X
  400. XFunction Mth$Random(var Seed : real):Real;extern;
  401. X
  402. XProcedure Draw_Scores;
  403. X
  404. XConst Len_Scale = 50;
  405. X
  406. XVar I,num_on_table,play,Top_play,Total_Num_Games: Integer;
  407. X    This_Score,`09Max_score , Score_Ratio : Real;
  408. X
  409. X
  410. XBegin
  411. X   Time(Time_Now);
  412. X   Num_on_Table := 0;
  413. X   Writeln(Esc,'<',Esc,'`5B0m',Esc,'`5B?2l');
  414. X   Write(esc,'H',Esc,'J',Esc,'G');
  415. X   Write(' Player   User         Name               Score  Game    ');
  416. X   If ( Time_Now`5B1`5D = '2' ) Then Begin
  417. X      If ( Time_Now`5B2`5D >= '2' ) Then Begin
  418. X         Time_Now`5B1`5D := '1';
  419. X         Time_Now`5B2`5D := chr( Ord(Time_Now`5B2`5D) - 2);
  420. X      end Else begin
  421. X         Time_Now`5B1`5D := ' ';
  422. X         Time_Now`5B2`5D := chr( Ord(Time_Now`5B2`5D) + 8);
  423. X      end;
  424. X      Write(Time_Now:5);
  425. X      Writeln(' pm');
  426. X   End Else Begin
  427. X      If (( Time_Now`5B1`5D = '1' ) and ( Time_Now`5B2`5D > '2' )) THen Begi
  428. Vn
  429. X         Time_Now`5B1`5D := ' ';
  430. X         Time_Now`5B2`5D := chr( Ord(Time_Now`5B2`5D) - 2);
  431. X         Write(Time_Now:5);
  432. X         Writeln(' pm');
  433. X      end Else Begin
  434. X         If Time_Now`5B1`5D = '0' Then`20
  435. X            Time_Now`5B1`5D := ' ';
  436. X         Write(Time_Now:5);
  437. X         If Time_Now`5B2`5D = '2' Then`20
  438. X            Writeln(' pm')
  439. X         else
  440. X            Writeln(' am');
  441. X      end;
  442. X   end;
  443. X   writeln;
  444. X   Max_score := -99999.0;
  445. X
  446. X   `7B Find The Top Player  goes By The his Score And Num Of Games Played `7
  447. VD
  448. X   For PLay := 1 to Max_Num_PLayers do  begin
  449. X      Score_get(Play,Score`5BPLay`5D,Game`5BPLay`5D,Games_won`5Bplay`5D);
  450. X      If Game`5BPlay`5D > 0 Then Begin
  451. X         This_score := (Score`5Bplay`5D+ Games_won`5Bplay`5D*10) / (Game`5Bp
  452. Vlay`5D)**(0.9);
  453. X         If This_score > Max_score Then Begin
  454. X            Top_Play := Play;
  455. X            Max_score := This_score + 1.0;
  456. X         end;
  457. X      end;
  458. X   end;
  459. X   For Play := 1 to Max_Num_PLayers do Begin
  460. X      If Game`5BPLay`5D > 0  Then Begin   `7B IF Games PLayed > 0 Then You A
  461. Vre PLaying  `7D
  462. X         Num_On_Table := Num_On_Table + 1;
  463. X         Name_Get(Name`5BPlay`5D,Play);
  464. X         Write(Play:4);
  465. X         Write('    ',Name`5BPlay`5D:32);
  466. X         write(Score`5BPLay`5D:7);         `7B Print Info `7D
  467. X         Writeln(Game`5BPlay`5D:6);
  468. X      End;
  469. X   End;
  470. X   writeln;`20
  471. X   Writeln(' Player  Score Indicator ');
  472. X   Writeln;
  473. X   For Play := 1 to Max_Num_PLayers do Begin
  474. X      If Game`5BPLay`5D > 0  Then Begin   `7B IF Games PLayed > 0 Then You A
  475. Vre PLaying  `7D
  476. X         Write(Play:4);
  477. X         Write('     ',Esc,'F'); `7B Graphics `7D
  478. X         Score_Ratio := (Score`5Bplay`5D+Games_won`5BPLay`5D*10)*Len_Scale
  479. X                            / ((Game`5Bplay`5D)**(0.9)*Round(max_score));
  480. X         For I := 1 to Round(Score_Ratio) do`20
  481. X            Write('a');
  482. X         If PLay = Top_PLay Then`20
  483. X             Write(Esc,'G  ** Champ ** ');
  484. X         Writeln; `7B Normal Video `7D
  485. X      end;
  486. X    End;
  487. X
  488. X`7B Print The Games You Have Played With The Totak Num of Games Played so Fa
  489. Vr `7D
  490. X   Snake_Game_Count( Total_Num_games );
  491. X   writeln(Esc,'G');
  492. X   Writeln(' Game # ',Game`5BYou`5D:1,'    Total # ',Total_Num_Games:1,
  493. X           '`09`09Please Wait For Next Game ... ',Esc,'F');
  494. X`7B   If Num_on_Table <= 1 Then`20
  495. X      Goto 9999;  `7D
  496. Xend;
  497. X
  498. XProcedure Draw_screen;
  499. X
  500. XVar play,I,R,C,Line_at : Integer;
  501. X
  502. X   Function Min(A,B:Integer):Integer;
  503. X
  504. X   Begin
  505. X      If A < B Then`20
  506. X         Min := A`20
  507. X      Else
  508. X         Min := B
  509. X   end;
  510. X
  511. XBegin `7B Draw Screen `7D
  512. X   Write(esc,'H',esc,'J',Esc,'F'); `7B Clear Home `7D
  513. X   Write('l',Esc,'<',Esc,'#6',Esc,'`5B?2l',Esc,'F');
  514. X   For C := 1 To (Screen_Dim_C-2) Do`20
  515. X      Write('q');
  516. X   Writeln('k');
  517. X   For R := 2 To ( Screen_dim_R - 1 )  Do begin
  518. X      Write('x',Esc,'<',Esc,'#6',Esc,'`5B?2l',Esc,'F');
  519. X      Writeln(Pos(R,Screen_dim_C),'x');
  520. X   end;
  521. X   Write('m',Esc,'<',Esc,'#6',Esc,'`5B?2l',Esc,'F');
  522. X   For C := 2 to (Screen_Dim_C-1) Do`20
  523. X      Write('q');
  524. X   Writeln('j',Esc,'H');
  525. Xend;
  526. X
  527. X  `20
  528. XProcedure initalise_Positions;
  529. X
  530. X
  531. X
  532. XVar Mult,Play,R,C : Integer;
  533. X
  534. X
  535. XBegin
  536. X
  537. XArea_Filled := Screen_Dim_R*2 + Screen_Dim_C*2 - 4;
  538. X
  539. XCursor_C := 9999;
  540. X
  541. XSnake_Start(Who_Is_Playing,Rand);
  542. X
  543. X`7B Randomly Position The Starting Pos Of The PLayers `7D
  544. XFor play := 1 to Max_num_players do  Begin
  545. X   Head_R`5BPlay`5D := Init_pos_R`5BRand`5BPlay`5D`5D;
  546. X   Head_C`5Bplay`5D := Init_pos_C`5BRand`5BPLay`5D`5D;
  547. X   Can_Create`5Bplay`5D := False;
  548. X   Creating`5Bplay`5D := False;
  549. X   Move_R`5BPlay`5D := 1;
  550. X   Move_C`5BPLay`5D := 0;
  551. Xend;
  552. X
  553. XMult := 2**(Max_num_Players - 1 );  `7B 2 ** Number of PLayers - 1`7D
  554. XNum_Players := 0;
  555. X
  556. X`7B Examine Each Bit In Mult To See If You Are Playing `7D
  557. XMax_player_number := 0;
  558. XFor Play := Max_Num_PLayers downto 1 do begin
  559. X   If ( Who_Is_PLaying div Mult ) = 1 Then begin
  560. X      Num_Players := Num_PLayers + 1;
  561. X      Quit`5Bplay`5D := False;   `7B Bit Set You Are Playing `7D
  562. X      Who_is_Playing := Who_is_Playing - Mult;
  563. X      If Max_player_number = 0 Then`20
  564. X         Max_player_number := play ;`7B The Highest Numbered Player `7D
  565. X   end else begin
  566. X      Quit`5BPlay`5D := True;   `7B Bit Not Set Not Playing ie Quit `7D
  567. X   end;
  568. X   Mult := Mult div 2;
  569. Xend;
  570. X
  571. X`7B If You are PLaying Then You Havnt Died `7D
  572. XFor R := 1 To Screen_Dim_R do`20
  573. X   For C := 1 to Screen_Dim_C do
  574. X      Screen`5BR,C`5D := ' ';
  575. XFor C := 1 To Screen_Dim_C do Begin
  576. X   Screen`5B1,C`5D := 'q';
  577. X   Screen`5BScreen_Dim_R,C`5D := 'q';
  578. Xend;
  579. XFor R := 1 To Screen_Dim_R Do Begin
  580. X   Screen`5BR,1`5D := 'x';
  581. X   Screen`5BR,Screen_Dim_C`5D := 'x';`20
  582. Xend;
  583. XScreen`5B1,1`5D := 'l';
  584. XScreen`5B1,Screen_Dim_C`5D := 'k';
  585. XScreen`5BScreen_Dim_R,1`5D := 'm';
  586. XScreen`5BScreen_Dim_R,Screen_Dim_C`5D := 'j';
  587. XHead_Sym`5B1`5D := chr(128+ord('1'));  `7B Set The Bits In The Chars `7D
  588. XHead_Sym`5B2`5D := chr(128+ord('2'));
  589. XHead_Sym`5B3`5D := chr(128+ord('3'));
  590. XHead_Sym`5B4`5D := chr(128+ord('4'));
  591. XHead_Sym`5B5`5D := chr(128+ord('5'));
  592. XHead_Sym`5B6`5D := chr(128+ord('6'));
  593. XHead_Sym`5B7`5D := chr(128+ord('7'));
  594. XHead_Sym`5B8`5D := chr(128+ord('8'));
  595. X
  596. X`7B Note If This Procedure Is Only Called When You Are Master Snake`20
  597. X  Draw Screen Should Be In The Mainlkine Before Init_Pos
  598. X  And The Writing Of The PLayers Pos Should Be To The Buffer`20
  599. X  And Then Written To All Who Are PLaying `7D
  600. X
  601. XDraw_screen;  `20
  602. X
  603. X`7B Pos Inital Player Positions `7D
  604. XFor Play := 1 to Max_Num_Players Do  Begin
  605. X   responce`5BPlay`5D := ' ';   `7B Initalise First Responce Should Not BE N
  606. Veeded `7D
  607. X   Game`5BPLay`5D := Game`5BPLay`5D;
  608. Xend;
  609. XFor Play := 1 to Max_Num_PLayers do `20
  610. X   If Not Quit`5BPlay`5D  Then  begin
  611. X     Ch_On`5Bplay`5D := Screen`5BHead_R`5BPlay`5D,Head_C`5BPlay`5D`5D;
  612. X     Screen`5BHead_R`5BPlay`5D,Head_C`5BPlay`5D`5D := '*';
  613. X     If ( Play <> You ) Then `20
  614. X      Writeln(pos(Head_R`5BPlay`5D,Head_C`5BPlay`5D),Head_sym`5BPlay`5D,Esc,
  615. V'H')
  616. X     Else  Begin`20
  617. X      Writeln(pos(Head_R`5BYou`5D,Head_C`5BYou`5D),'`60',Esc,'H');
  618. X     end;
  619. X   end;
  620. XSleep(1);
  621. Xend;
  622. X
  623. XProcedure Initalise_Mainline;
  624. X
  625. XVar Zero,Init_Rep,PLay,Name_Pos,Game_Going : Integer;
  626. X
  627. XProcedure Verify_name(VAr Name : Name_Line );
  628. X
  629. XVar I : INteger;
  630. X
  631. X
  632. XBegin
  633. X   For I := 1 to Max_Name_length do   `7B Remove All Invalid Chars From The
  634. V Name`7D
  635. X      If ( Name`5Bi`5D < ' ' ) Then Begin
  636. X            Write(chr(7));
  637. X            Name`5Bi`5D := ' ';
  638. X      end;
  639. Xend;
  640. X
  641. X
  642. XBegin
  643. X   Esc := Chr(27);
  644. X   Back_Space := CHr(8);
  645. X   Line_Feed  := Chr(10);
  646. X   Up_Line    := 'A'   `7B Used With <ESC>A For Move up One Line `7D;
  647. X   Area_75_Per := Trunc ( Screen_Dim_R * Screen_Dim_C * (0.90 ));
  648. X   Seed := Clock;
  649. X   TT_Len := 0;
  650. X  `20
  651. X
  652. X   `7B set where Each Player Starts `7D
  653. X
  654. X   Init_pos_R`5B1`5D := 1;
  655. X   Init_pos_C`5B1`5D := 1;
  656. X  `20
  657. X   Init_pos_R`5B2`5D := Screen_dim_R ;
  658. X   Init_pos_C`5B2`5D := Screen_dim_C ;
  659. X  `20
  660. X   Init_pos_R`5B3`5D := 1;
  661. X   Init_pos_C`5B3`5D := Screen_dim_C;
  662. X  `20
  663. X   Init_pos_R`5B4`5D := Screen_dim_R;
  664. X   Init_pos_C`5B4`5D := 1;
  665. X  `20
  666. X   Init_pos_R`5B5`5D := 1;
  667. X   Init_pos_C`5B5`5D := Screen_dim_C div 2;
  668. X  `20
  669. X   Init_pos_R`5B6`5D := Screen_dim_R;
  670. X   Init_pos_C`5B6`5D := Screen_dim_C div 2;
  671. X  `20
  672. X   Init_pos_R`5B7`5D := Screen_dim_R div 2;
  673. X   Init_pos_C`5B7`5D := 1;
  674. X  `20
  675. X   Init_pos_R`5B8`5D := Screen_dim_R div 2;
  676. X   Init_pos_C`5B8`5D := Screen_dim_C;
  677. X
  678. X   Writeln(Esc,'<',Esc,'`5B?2l'); `7B Vt52 Mode `7D
  679. X   Writeln(Esc,'H',Esc,'J');    `7B Clear Screen `7D
  680. X   Init_rep := Snake_Init(You,Game_going);
  681. X   You := You + 1;  `20
  682. X   If Init_rep = 1 Then Begin
  683. X      `7B you are the First Person to play zero all the scores `7D
  684. X      For Play := 1 to Max_Num_PLayers do begin
  685. X         Zero := 0;
  686. X         Score_Set(Play,Zero,zero,zero);
  687. X      end;
  688. X      Help_Screen;
  689. X      Writeln(Esc,'`5B?2l',Esc,'H');
  690. X      Writeln(pos(22,3),' Please Enter Your Name Player #',You:1);
  691. X      Write(pos(22,51));
  692. X      Readln(Name`5BYou`5D);
  693. X      Verify_Name(Name`5BYou`5D);
  694. X      Name_set(Name`5BYou`5D);
  695. X      Write(pos(22,3), ' Hit < Return > When Others Ready   ');
  696. X      Readln;
  697. X      Writeln;
  698. X      Write(pos(22,3), ' Please Wait For Game To Start      ');
  699. X      Writeln;
  700. X   end Else Begin
  701. X      If You = 0 Then Begin
  702. X         Writeln(pos(1,33),'Multi User Qix');
  703. X         Writeln;
  704. X         Writeln(pos(4,10),' Sorry No Qix''s Available');
  705. X`09 Sleep(3);
  706. X         goto 9999;
  707. X      end else begin `7B Init_rep = 0 `7D`20
  708. X         Help_Screen;
  709. X         Writeln(Esc,'`5B?2l',esc,'H');
  710. X         Writeln(pos(22,3),' Please Enter Your Name Player # ',You:1);
  711. X         Write(pos(22,51));
  712. X         Readln(Name`5BYou`5D);
  713. X         Verify_name(Name`5BYou`5D);
  714. X         Name_set(Name`5BYou`5D);
  715. X         Writeln;
  716. X         Write(pos(22,3), ' Please Wait For Game To Start     ');
  717. X         Writeln;
  718. X         If Game_Going = 1 Then`20
  719. X            Snake_Game_End;
  720. X      end;
  721. X   end;
  722. X   Game`5BYou`5D := 0;
  723. Xend `7B Initalise Mainline `7D;
  724. X
  725. X`5BGLOBAL`5D Function Add_head( Var Responce : Player_responce ):Integer;
  726. X
  727. XVar Play : Integer;
  728. X
  729. XProcedure Add_this_players_Head;
  730. X
  731. Xvar P,pos_R,Pos_c,dir_R,dir_C : Integer;
  732. X
  733. X   Procedure New_join_Char( Into_wall : Boolean) ;
  734. X
  735. X   var count : Integer;
  736. X
  737. X   Begin
  738. X         Case Screen`5Bpos_r,pos_C`5D of`20
  739. X`09    'k' : Count := 10;
  740. X`09    'u' : Count := 11;
  741. X`09    'l' : Count := 12;
  742. X`09    't' : Count := 13;
  743. X`09    'w' : Count := 14;
  744. X`09    'n' : Count := 15;
  745. X`09    'j' : Count := 3;
  746. X`09    'm' : Count := 5;
  747. X`09    'q' : Count := 6;
  748. X`09    'v' : Count := 7;
  749. X`09    'x' : Count := 9;
  750. X`09 end;`09       `09
  751. X         If into_Wall Then`20
  752. X`09    Case ( Dir_R + 1 ) + ( Dir_C + 1 ) * 2 of`20
  753. X`09       2 : Count := Count + 8;
  754. X`09       4 : Count := Count + 1;
  755. X`09       1 : Count := Count + 4;
  756. X`09       5 : Count := Count + 2;
  757. X`09    end
  758. X   `09 else
  759. X`09    Case ( Dir_R + 1 ) + ( Dir_C + 1 ) * 2 of`20
  760. X`09       2 : Count := Count + 1;
  761. X`09       4 : Count := Count + 8;
  762. X`09       1 : Count := Count + 2;
  763. X`09       5 : Count := Count + 4;
  764. X`09    end;
  765. X`09 Case Count Of`20
  766. X`09    0`09: Screen`5Bpos_r,Pos_C`5D := ' ';`20
  767. X`09    1,8,9 : Screen`5Bpos_r,Pos_C`5D := 'x';
  768. X`09    2,4,6 : Screen`5Bpos_r,Pos_C`5D := 'q';
  769. X`09    3`09: Screen`5Bpos_r,Pos_C`5D := 'j';
  770. X`09    5`09: Screen`5Bpos_r,Pos_C`5D := 'm';
  771. X`09    7`09: Screen`5Bpos_r,Pos_C`5D := 'v';
  772. X`09    10`09: Screen`5Bpos_r,Pos_C`5D := 'k';
  773. X`09    11`09: Screen`5Bpos_r,Pos_C`5D := 'u';
  774. X`09    12`09: Screen`5Bpos_r,Pos_C`5D := 'l';
  775. X`09    13`09: Screen`5Bpos_r,Pos_C`5D := 't';
  776. X`09    14`09: Screen`5Bpos_r,Pos_C`5D := 'w';
  777. X`09    15`09: Screen`5Bpos_r,Pos_C`5D := 'n'
  778. X`09 end `7B case `7D;
  779. X   end;
  780. X
  781. X
  782. X   procedure new_tail_CHar;
  783. X
  784. X   begin
  785. X    Case (move_R`5Bplay`5D+1) + (Move_C`5Bplay`5D+1)*4 of`20
  786. X      6 : `7B Down `7D
  787. X             Case (Dir_R+1) + (Dir_C+1)*4 Of`20
  788. X               6 : `7B Down `7D
  789. X                   Screen`5BPos_R,Pos_C`5D  := 'x';
  790. X               9 : `7B Right `7D
  791. X                   Screen`5BPos_R,Pos_C`5D  := 'm';
  792. X               1 : `7B Left `7D
  793. X                   Screen`5BPos_R,Pos_C`5D  := 'j';
  794. X               4 : `7B Up Note : This Is Poss On First Move `7D
  795. X                   Screen`5BPos_R,Pos_C`5D  := 'x';
  796. X               end `7B Case `7D;
  797. X      4 : `7B Up `7D
  798. X             Case (Dir_R+1) + (Dir_C+1)*4 Of`20
  799. X               6 : `7B Down `7D
  800. X                   Screen`5BPos_R,Pos_C`5D  := 'x';
  801. X               4 : `7B Up `7D
  802. X                   Screen`5BPos_R,Pos_C`5D  := 'x';              `20
  803. X               9 : `7B Right `7D
  804. X                   Screen`5BPos_R,Pos_C`5D  := 'l';
  805. X               1 : `7B Left `7D
  806. X                   Screen`5BPos_R,Pos_C`5D  := 'k';  `20
  807. X               end `7B Case `7D;
  808. X     `20
  809. X      9 : `7B Right `7D
  810. X             Case (Dir_R+1) + (Dir_C+1)*4 Of`20
  811. X               6 : `7B Down `7D
  812. X                   Screen`5BPos_R,Pos_C`5D  := 'k';              `20
  813. X               4 : `7B Up `7D
  814. X                   Screen`5BPos_R,Pos_C`5D  := 'j';              `20
  815. X               9 : `7B Right `7D
  816. X                   Screen`5BPos_R,Pos_C`5D  := 'q';
  817. X               1 : `7B Left `7D
  818. X                   Screen`5BPos_R,Pos_C`5D  := 'q';  `20
  819. X               end `7B Case `7D;
  820. X
  821. X      1 : `7B Left `7D
  822. X             Case (Dir_R+1) + (Dir_C+1)*4 Of`20
  823. X               9 : `7B Right `7D
  824. X                   Screen`5BPos_R,Pos_C`5D  := 'q';
  825. X               6 : `7B Down `7D
  826. X                   Screen`5BPos_R,Pos_C`5D  := 'l';              `20
  827. X               4 : `7B Up `7D
  828. X                   Screen`5BPos_R,Pos_C`5D  := 'm';              `20
  829. X               1 : `7B Left `7D
  830. X                   Screen`5BPos_R,Pos_C`5D  := 'q';  `20
  831. X               end `7B Case `7D;
  832. X
  833. X      end `7B Case `7D;
  834. X   end;`09`20
  835. X
  836. X   Function move_Anti_Clock( var R,C,Prev_R,Prev_C : integer):Boolean;
  837. X
  838. X   var`20
  839. X     Save_R,Save_C : Integer;
  840. X
  841. X   Begin
  842. X     Save_R := R;
  843. X     Save_C := C;
  844. X     Case ( Prev_C - C ) of`20
  845. X      1 :`20
  846. X`09 Case Screen`5BR,C`5D of`20
  847. X`09    'l' : R := R + 1;
  848. X      `09    'w' : R := R + 1;
  849. X      `09    't' : R := R + 1;
  850. X      `09    'n' : R := R + 1;
  851. X`09    'm' : R := R - 1;
  852. X`09    'v' : C := C - 1;
  853. X`09    'q' : C := C - 1;
  854. X`09 end;
  855. X      0 :
  856. X`09 Case ( prev_R - R ) Of`20
  857. X`09    1 :
  858. X`09       Case Screen`5BR,c`5D of
  859. X`09`09  'l' : C := C + 1;
  860. X`09`09  'w' : C := C - 1;
  861. X`09`09  'k' : C := C - 1;
  862. X`09`09  't' : R := R - 1;
  863. X`09`09  'n' : C := C - 1;
  864. X`09`09  'u' : C := C - 1;
  865. X`09`09  'x' : R := R - 1;
  866. X`09       end;
  867. X`09    0 : ;
  868. X`09    -1:
  869. X`09       Case Screen`5BR,c`5D of`20
  870. X`09`09  't' : C := C + 1;
  871. X`09`09  'n' : C := C + 1;`20
  872. X`09`09  'u' : R := R + 1;
  873. X`09`09  'm' : C := C + 1;
  874. X`09`09  'v' : C := C + 1;
  875. X`09`09  'j' : C := C - 1;
  876. X`09`09  'x' : R := R + 1;
  877. X`09       end;
  878. X`09 end;
  879. X      -1:
  880. X`09 Case Screen`5BR,c`5D of`20
  881. X`09    'w' : C := C + 1;
  882. X`09    'k' : R := R + 1;
  883. X`09    'n' : R := R - 1;
  884. X`09    'u' : R := R - 1;
  885. X`09    'v' : R := R - 1;
  886. X`09    'j' : R := R - 1;
  887. X`09    'q' : C := C + 1;
  888. X`09 end;
  889. X   end;
  890. X   move_Anti_Clock := true;
  891. X   Prev_R := Save_R;
  892. X   Prev_C := Save_C;
  893. X   If Screen`5BR,C`5D = 'a' Then begin `7B reverse `7D
  894. X     prev_R := R;
  895. X     prev_C := C;
  896. X     R := Save_R;
  897. X     C := Save_C;
  898. X   end else    `20
  899. X    If Screen`5BR,c`5D = '*' Then`20
  900. X   `09move_Anti_Clock := False
  901. X    Else
  902. X      IF Screen`5BR,C`5D = ' ' Then`20
  903. X   `09 Writeln(' **** INTERNAL ERROR **** MOVE_ANTI_CLOCK ');
  904. Xend;   `09   `20
  905. X
  906. X
  907. X   Function Move_Clock( var R,C,Prev_R,Prev_C : Integer):Boolean;
  908. X
  909. X   var`20
  910. X     Save_R,Save_C : Integer;
  911. X
  912. X   Begin
  913. X     Save_R := R;
  914. X     Save_C := C;
  915. X     Case ( Prev_C - C ) of`20
  916. X      1 :`20
  917. X`09 Case Screen`5BR,C`5D of`20
  918. X`09    'l' : R := R + 1;
  919. X      `09    'w' : C := C - 1;
  920. X      `09    't' : R := R - 1;
  921. X      `09    'n' : R := R - 1;
  922. X`09    'm' : R := R - 1;
  923. X`09    'v' : R := R - 1;
  924. X`09    'q' : C := C - 1;
  925. X`09 end;
  926. X      0 :
  927. X`09 Case ( prev_R - R ) Of`20
  928. X`09    1 :
  929. X`09       Case Screen`5BR,c`5D of
  930. X`09`09  'l' : C := C + 1;
  931. X`09`09  'w' : C := C + 1;
  932. X`09`09  'k' : C := C - 1;
  933. X`09`09  't' : C := C + 1;
  934. X`09`09  'n' : C := C + 1;
  935. X`09`09  'u' : R := R - 1;
  936. X`09`09  'x' : R := R - 1;
  937. X`09       end;
  938. X`09    0 : ;
  939. X`09    -1:
  940. X`09       Case Screen`5BR,c`5D of`20
  941. X`09`09  't' : R := R + 1;
  942. X`09`09  'n' : C := C - 1;`20
  943. X`09`09  'u' : C := C - 1;
  944. X`09`09  'm' : C := C + 1;
  945. X`09`09  'v' : C := C - 1;
  946. X`09`09  'j' : C := C - 1;
  947. X`09`09  'x' : R := R + 1;
  948. X`09       end;
  949. X`09 end;
  950. X      -1:
  951. X`09 Case Screen`5BR,c`5D of`20
  952. X`09    'w' : R := R + 1;
  953. X`09    'k' : R := R + 1;
  954. X`09    'n' : R := R + 1;
  955. X`09    'u' : R := R + 1;
  956. X`09    'v' : C := C + 1;
  957. X`09    'j' : R := R - 1;
  958. X`09    'q' : C := C + 1;
  959. X`09 end;
  960. X   end;
  961. X   move_Clock := true;
  962. X   Prev_R := Save_R;
  963. X   Prev_C := Save_C;
  964. X   If Screen`5BR,C`5D = 'a' Then begin `7B reverse `7D
  965. X     prev_R := R;
  966. X     prev_C := C;
  967. X     R := Save_R;
  968. X     C := Save_C;
  969. X   end else    `20
  970. X    If Screen`5BR,c`5D = '*' Then`20
  971. X   `09move_Clock := False
  972. X    Else
  973. X      IF Screen`5BR,C`5D = ' ' Then`20
  974. X   `09 Writeln(' **** INTERNAL ERROR **** MOVE_CLOCK ');
  975. Xend;   `09   `20
  976. X
  977. X
  978. XProcedure fill_area;
  979. X
  980. Xvar Sr,Sc,R,C,Prev_R,Prev_C,area_C,Area_A: Integer;
  981. X    some_one_there : Boolean;
  982. X
  983. X   procedure Bfill_C(Fr,Fc: Integer);
  984. X
  985. X   Begin
  986. X     If Cal`5BFr,Fc`5D = ' ' Then Begin
  987. X   `09Cal`5BFR,FC`5D := 'C';
  988. X        BFill_C(FR-1,FC);
  989. X   `09BFill_C(FR,FC+1);
  990. X        BFill_C(FR+1,FC);
  991. X        BFill_C(FR,FC-1);
  992. X   `09Bfill_C(FR+1,Fc+1);
  993. X   `09Bfill_C(FR+1,Fc-1);
  994. X   `09Bfill_C(FR-1,Fc+1);
  995. X   `09Bfill_C(FR-1,Fc-1);
  996. X     end else`20
  997. X      If Cal`5BFR,FC`5D in `5B'A','*'`5D Then`20
  998. X   `09Some_one_there := true;
  999. X   end;
  1000. X
  1001. X   procedure Bfill_A(FR,FC: Integer);
  1002. X
  1003. X   Begin
  1004. X     If Cal`5BFR,FC`5D = ' ' Then Begin
  1005. X   `09Cal`5BFR,FC`5D := 'A';
  1006. X        BFill_A(FR-1,FC);
  1007. X   `09BFill_A(FR,FC+1);
  1008. X        BFill_A(FR+1,FC);
  1009. X        BFill_A(FR,FC-1);
  1010. X
  1011. X        BFill_A(FR+1,FC+1);
  1012. X   `09BFill_A(FR+1,FC-1);
  1013. X        BFill_A(FR-1,FC+1);
  1014. X        BFill_A(FR-1,FC-1);
  1015. X     end else`20
  1016. X      If Cal`5BFR,FC`5D in `5B'C','*'`5D Then`20
  1017. X   `09Some_one_there := true;
  1018. X   end;
  1019. X
  1020. X   Procedure Display_Fill( Ch : Char );
  1021. X
  1022. X   var S,R,C : Integer;
  1023. X       H   : Char;
  1024. X
  1025. X   begin
  1026. X     H := Chr( Ord('a') + Ord(Head_sym`5Bplay`5D) - Ord('1') );
  1027. X     R := 1 ;
  1028. X     S := 0 ;`20
  1029. X     Write_5(Esc,'<',Esc,'`5B','7');
  1030. X     write_5('m',Esc,'`5B','?','2');
  1031. X     Write_3('l',Esc,'F');
  1032. X     While R <= Screen_Dim_R do begin
  1033. X   `09C := 1;
  1034. X   `09While ( C < Screen_Dim_C ) do  begin
  1035. X   `09  While ( C < screen_Dim_C ) and ( Cal`5BR,C`5D<>ch ) do`20
  1036. X   `09   C := C + 1;
  1037. X   `09  If Cal`5BR,C`5D = Ch then `20
  1038. X`09    Write_4(Esc,'Y',Chr(31+R),Chr(31+C));
  1039. X   `09  While ( C < screen_Dim_C) and ( Cal`5BR,C`5D = ch ) do  begin
  1040. X   `09   write_1(H);
  1041. X   `09   Screen`5BR,C`5D := '*';
  1042. X   `09   S := S + 1;
  1043. X   `09   C := C + 1;
  1044. X   `09  end;
  1045. X        end;
  1046. X   `09r := R + 1;
  1047. X     end;   `09 `20
  1048. X     Score`5Bplay`5D := S + Score`5Bplay`5D;
  1049. X     Area_Filled := Area_Filled + S;
  1050. X     Write_5(Esc,'<',Esc,'`5B','0');
  1051. X     write_5('m',Esc,'`5B','?','2');
  1052. X     Write_3('l',Esc,'F');
  1053. X     Cursor_R := 9999;
  1054. X   end;
  1055. X
  1056. X     `20
  1057. XBegin
  1058. X  `7B First Move Around Clock, to check no one on walls for building from wa
  1059. Vlls`7D
  1060. X  Cal := Screen; `7B Uses A Lot Of Processing `7D
  1061. X  R := Pos_R;
  1062. X  C := Pos_C;
  1063. X  Prev_R := pos_R - Dir_R;
  1064. X  prev_C := Pos_C - Dir_C;
  1065. X  Area_C := 0;
  1066. X  Some_one_there := False;
  1067. X  repeat`20
  1068. X    Some_one_there := Not move_Clock(R,C,Prev_r,Prev_C);
  1069. X  Until (Some_one_There or (( R = Pos_R ) and ( C = pos_C ))) ;
  1070. X  If not Some_one_there Then Begin
  1071. X    R := Pos_R;
  1072. X    C := Pos_C;
  1073. X    Prev_R := pos_R - Dir_R;
  1074. X    prev_C := Pos_C - Dir_C;
  1075. X    repeat
  1076. X      If move_Clock(R,C,Prev_r,Prev_C) Then  begin
  1077. X        If Screen`5BR,C`5D In `5B'q','x'`5D Then  begin
  1078. X          Sr := R + ( C - Prev_C );
  1079. X          Sc := C - ( R - Prev_R );
  1080. X          Bfill_C(Sr,Sc)
  1081. X        end;
  1082. X       end Else
  1083. X         Some_one_there := true;
  1084. X     Until (Some_one_There or (( R = Pos_R ) and ( C = pos_C ))) ;
  1085. X  end;
  1086. X  If Not Some_one_There Then`20
  1087. X    Display_Fill('C');
  1088. X  R := Pos_R;
  1089. X  C := Pos_C;
  1090. X  Prev_R := pos_R - Dir_R;
  1091. X  Prev_C := Pos_C - Dir_C;
  1092. X  repeat`20
  1093. X     Some_one_there := Not move_Anti_Clock(R,C,Prev_r,Prev_C)`20
  1094. X  until ( Some_one_There or (( R = Pos_R ) and ( C = pos_C ))) ;
  1095. X  If not some_one_there  Then begin
  1096. X     R := Pos_R;
  1097. X     C := Pos_C;
  1098. X     Prev_R := pos_R - Dir_R;
  1099. X     prev_C := Pos_C - Dir_C;
  1100. X     Some_one_there := False;
  1101. X     repeat
  1102. X       If move_Anti_Clock(R,C,Prev_r,Prev_C) Then  begin
  1103. X`09If Screen`5BR,C`5D In `5B'q','x'`5D Then  begin
  1104. X`09  Sr := R - ( C - Prev_C );
  1105. X`09  Sc := C + ( R - Prev_R );
  1106. X`09  Bfill_A(Sr,Sc)
  1107. X`09end;
  1108. X       end Else
  1109. X      Some_one_there := true;
  1110. X     until ( Some_one_There or (( R = Pos_R ) and ( C = pos_C ))) ;
  1111. X  end;
  1112. X  If Not Some_one_there Then`20
  1113. X     Display_Fill('A');
  1114. Xend;
  1115. X
  1116. XFunction Valid_move : Boolean;
  1117. X
  1118. XBegin`20
  1119. X    Valid_move := False;
  1120. X    Case (Dir_R+1) + (Dir_C+1)*4 Of`20
  1121. X      9 : `7B Right `7D
  1122. X   `09  If Ch_on`5BPlay`5D in `5B'l','w','t','n','m','v','q'`5D Then`20
  1123. X   `09      Valid_move := True;
  1124. X
  1125. X      6 : `7B Down `7D
  1126. X   `09  If Ch_on`5BPlay`5D in `5B'l','w','k','t','n','u','x'`5D Then`20
  1127. X   `09      Valid_move := True;
  1128. X
  1129. X      4 : `7B Up `7D
  1130. X   `09  If Ch_on`5BPlay`5D in `5B't','n','u','m','v','j','x'`5D Then
  1131. X   `09      Valid_move := True;
  1132. X
  1133. X      1 : `7B Left `7D
  1134. X   `09  If Ch_on`5BPlay`5D in `5B'w','k','n','u','v','j','q'`5D Then`20
  1135. X   `09      Valid_move := True;
  1136. X
  1137. X      end `7B Case `7D;
  1138. Xend;
  1139. X
  1140. Xbegin
  1141. X   If Not Quit`5BPlay`5D And (Ord(Responce`5BPLay`5D) = 0 )  Then begin
  1142. X      Quit`5BPLay`5D := True;         `7BInitalise all Variables `7D
  1143. X      Game`5BPlay`5D := 0;
  1144. X      Score`5BPlay`5D := 0;
  1145. X      Games_Won`5BPLay`5D := 0;
  1146. X      Score_Set(Play,Score`5BPlay`5D,Game`5BPLay`5D,Games_Won`5BPLay`5D);
  1147. X   end else`20
  1148. X      If Not Quit`5BPlay`5D  Then Begin
  1149. X         Dir_R := Move_R`5BPlay`5D;
  1150. X         Dir_C := Move_C`5BPLay`5D;
  1151. X`09 pos_R := Head_R`5BPlay`5D;
  1152. X         pos_C := Head_C`5BPlay`5D;
  1153. X         `7B Change Direction Of The Position You Move To is Not A Wall ie =
  1154. V '.' `7D
  1155. X   `09 IF ( Ord(responce`5Bplay`5D) > 128 ) Then`20
  1156. X   `09    Can_create`5Bplay`5D := true;
  1157. X`09 Responce`5Bplay`5D := Chr(Ord(Responce`5Bplay`5D) mod 16 );
  1158. X         Case Ord(responce`5BPlay`5D) Of`20
  1159. X            8 :   Begin
  1160. X                     Dir_R := -1 ;
  1161. X                     Dir_C := 0 ;      `7B Moving Up `7D
  1162. X                  end;
  1163. X            2 :   Begin
  1164. X                     Dir_R := 1;
  1165. X                     Dir_C := 0;         `7B Moving Down `7D
  1166. X                  end;
  1167. X            4 :   Begin
  1168. X                     Dir_R := 0;          `7B Moving Left `7D
  1169. X                     Dir_C := -1;
  1170. X                  end;
  1171. X            6 :   Begin
  1172. X                     Dir_R := 0;            `7B Moving Right `7D
  1173. X                     Dir_C := 1;
  1174. X                  end;
  1175. X            otherwise `7B Do Nothing Same Dir As Before `7D
  1176. X         end `7B Case `7D;
  1177. X   `09 If ((  pos_r + dir_r ) > 0 ) and`20
  1178. X   `09    ((  pos_r + dir_r ) <= Screen_Dim_R ) and`20
  1179. X   `09    ((  pos_c + dir_c ) > 0 ) and`20
  1180. X   `09    ((  pos_c + dir_c ) <= Screen_Dim_C ) Then`20
  1181. X`09    If Creating`5Bplay`5D Then begin
  1182. X               If ( Dir_R = -1*Move_R`5Bplay`5D) and ( Dir_C = -1*Move_C`5Bp
  1183. Vlay`5D) Then Begin
  1184. X                    Dir_R := Move_R`5BPlay`5D; `7B Can't Reverse Your Direct
  1185. Vion `7D
  1186. X                    Dir_C := Move_C`5BPlay`5D;
  1187. X               end;
  1188. X`09       If Screen`5Bpos_r + Dir_r, Pos_c + Dir_C`5D = ' ' THen Begin
  1189. X   `09`09  Area_Filled := Area_Filled + 1;
  1190. X   `09`09  New_Tail_Char;
  1191. X`09    `09  At(pos_r,Pos_C,Screen`5BPos_r,Pos_C`5D);
  1192. X                  pos_r := Pos_R + Dir_R; Pos_C := Pos_C + Dir_C;
  1193. X`09    `09  at(pos_R,pos_C,Head_sym`5Bplay`5D);
  1194. X`09       end else begin `7B v Must Be a Wall `7D
  1195. X`09    `09  If not ( Screen`5Bpos_r + Dir_r, Pos_c + Dir_C`5D = '*') Then be
  1196. Vgin
  1197. X   `09`09     new_tail_Char;
  1198. X`09    `09     At(pos_r,Pos_C,Screen`5BPos_r,Pos_C`5D);
  1199. X   `09`09     write_1(Chr(7));
  1200. X                     pos_r := Pos_R + Dir_R; Pos_C := Pos_C + Dir_C;
  1201. X   `09`09     New_Join_Char(True); `7B Going into the wall `7D
  1202. X`09`09     If ( Screen`5BPos_r,POs_C`5D = ' ') then`20
  1203. X`09`09`09 Writeln('ERROR NEW JOIN CHAR IS BLANK ');
  1204. X`09       `09     Creating`5Bplay`5D := False;
  1205. X`09       `09     Can_create`5Bplay`5D := False;
  1206. X`09    `09     at(pos_R,pos_C,Head_sym`5Bplay`5D);
  1207. X`09`09     Fill_area;
  1208. X`09`09  end`20
  1209. X`09       end;`09`09  `09`09`20
  1210. X`09    End Else `7B Not Creating `7D
  1211. X`09       If Not Valid_Move Then`20
  1212. X`09`09  If ( Screen`5Bpos_r + Dir_r, Pos_c + Dir_C`5D = ' ' ) Then`20
  1213. X`09`09     If Can_Create`5Bplay`5D Then Begin
  1214. X`09`09`09Creating`5Bplay`5D := true;
  1215. X`09`09`09Screen`5BPos_R,Pos_C`5D := Ch_on`5Bplay`5D; `7B For New_join_Char `
  1216. V7D
  1217. X`09`09`09New_join_Char(false); `7B Going Out Form Wall `7D
  1218. X`09`09`09At(pos_r,Pos_C,Screen`5BPos_r,Pos_C`5D);
  1219. X`09`09`09Pos_r := Pos_R + Dir_R; Pos_C := Pos_C + Dir_C;
  1220. X`09    `09`09At(pos_R,pos_C,Head_sym`5Bplay`5D);
  1221. X`09`09     end else`20
  1222. X   `09`09  else`20
  1223. X   `09       else begin
  1224. X`09`09  If ( Screen`5Bpos_r + Dir_r, Pos_c + Dir_C`5D <> '*' ) Then Begin
  1225. X`09`09     Screen`5BPos_r,Pos_C`5D := Ch_on`5Bplay`5D;
  1226. X`09`09     At(pos_r,Pos_C,Screen`5BPos_r,Pos_C`5D);
  1227. X`09`09     pos_r := Pos_R + Dir_R; Pos_C := Pos_C + Dir_C;
  1228. X`09`09     At(pos_R,pos_C,Head_sym`5Bplay`5D);
  1229. X   `09`09  end`20
  1230. X`09       end
  1231. X   `09    `7Bend`7D;
  1232. X   `09 If Not (( Pos_R = Head_R`5Bplay`5D ) and ( Pos_C = Head_C`5Bplay`5D))
  1233. V Then Begin
  1234. X            Move_R`5BPlay`5D := Dir_r;
  1235. X            Move_C`5BPLay`5D := Dir_c;
  1236. X`09    Head_R`5BPlay`5D := pos_r;
  1237. X            Head_C`5BPlay`5D := pos_c;
  1238. X   `09    Ch_on`5Bplay`5D  := Screen`5Bpos_r,Pos_C`5D;
  1239. X   `09end;
  1240. X   `09Screen`5BPos_r,Pos_C`5D := '*';
  1241. X      end;
  1242. Xend;`09`09    `20
  1243. X`09`09    `20
  1244. X
  1245. X begin
  1246. X   If ( Game`5BYou`5D Mod 2 ) = 1 Then Begin      `7B If 1 Then Loop Clockwi
  1247. Vse `7D
  1248. X      For Play := 1 to Max_Player_number do`20
  1249. X         add_This_Players_head;
  1250. X   end else`20
  1251. X      Begin
  1252. X         For Play := Max_Player_Number downto 1 do`20
  1253. X            add_This_Players_head;               `7B Go Clockwise In Updatin
  1254. Vg `7D
  1255. X      end;
  1256. X   If Area_Filled > Area_75_per Then  begin
  1257. X      For Play := 1 to max_player_number do begin
  1258. X   `09game`5Bplay`5D := game`5Bplay`5D + 1;
  1259. X        Score_Set(Play,Score`5BPlay`5D,Game`5BPLay`5D,Games_Won`5BPLay`5D);
  1260. X     end;
  1261. X     Add_head := 0
  1262. X   end else
  1263. X     Add_Head := 1;            `7B 1 To Continue `7D
  1264. X   at(24,80,chr(0));
  1265. X   Break_Buff;    `7B does not write the buffer just says To`20
  1266. X                   Write this buffer to all the players when add_head exits
  1267. V `7D
  1268. Xend `7B add_Head`7D;
  1269. X
  1270. X
  1271. XProcedure Snake_PLay;extern;
  1272. X
  1273. X
  1274. XBegin `7B Mainline `7D
  1275. X   LineLimit(Output,MaxInt);
  1276. X   Initalise_Mainline;
  1277. X   While True Do Begin
  1278. X      Initalise_Positions;      `7B initalises Pos Only relavent for master
  1279. V snake `7D
  1280. X      Snake_Play;               `7B Calls Add_head with the Moves of the pla
  1281. Vyers  until add_head returns 1 ( end of game ) `7D
  1282. X      Draw_Scores;
  1283. X      Snake_Game_End;           `7B Syncs all players Together `7D
  1284. X   end;
  1285. X9999 :`20
  1286. X  Writeln(esc,'<');
  1287. Xend.
  1288. X
  1289. $ CALL UNPACK MQIX.PAS;131 1594095908
  1290. $ create 'f'
  1291. X`09`09`09SUBROUTINE`09Help_Screen
  1292. XC
  1293. X`09PARAMETER ESC = 27
  1294. X`09CHARACTER Line*256
  1295. X`09BYTE LINEL(256)
  1296. X`09EQUIVALENCE (LINE, LINEL)
  1297. X        BYte REP
  1298. X`09INTEGER Len_Line,ErrNum
  1299. XC
  1300. X        type 111, esc
  1301. X111     Format(X,A1,'<')
  1302. X1`09OPEN( UNIT=4, FILE='Games:MQixH.Scn', ReadOnly,
  1303. X`091 STATUS='OLD',IoStat=ErrNum)
  1304. X        If (ERRNUM.EQ.30) Goto 50
  1305. X        If (ERRNUM.NE.0 ) Goto 999
  1306. X100     READ(4,110,END=200) LEN_LINE, LINE(:LEN_LINE)
  1307. X110     FORMAT(Q,A)
  1308. X`09Call Snake_write(%ref(LIne(:len_line)),Len_line)
  1309. X        GOTO 100
  1310. X200`09close (unit = 4)
  1311. X999`09RETURN
  1312. XC
  1313. X50`09write(Line,51),Esc,Esc
  1314. X51      FORMAT(X,A1,'`5B2J',A1,'`5B1;1HPlease wait...')
  1315. X        Call Snake_Write(%ref(Line(1:25)),25)
  1316. X`09Call Sleep(4)
  1317. X        Goto 1
  1318. X        END
  1319. $ CALL UNPACK MQIXH.FOR;7 457915174
  1320. $ create 'f'
  1321. X`1B`5BH`1B`5BJ`1B(B`1B`5B0m
  1322. X`1B`5B1;1H`1B(0lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
  1323. Vqqqqqqqqqqqqqqqqqqk
  1324. X`1B`5B2;1Hx   lk lk  lqqk  qwq  qk lq                      `1B`5B2;80Hx`1B`5
  1325. VB3;1Hx   xmwjx lj  x   x    mwj
  1326. X`1B`5B3;27H                              `1B`5B3;66H              x`1B`5B4;1
  1327. VHx   x x x x  kx   x    lvk    `20
  1328. X`1B`5B4;32H                 `1B`5B4;80Hx`1B`5B5;1Hx   x   x mqqvvk qvq  qj m
  1329. Vq                      `1B`5B5;80Hx
  1330. X`1B`5B6;1Hx`1B`5B6;16Hm                      `1B`5B6;80Hx`1B`5B7;1Hx`1B`5B7;
  1331. V80Hx`1B`5B8;1Hx    Y`1B(Bou are the qix.`1B`5B8;47H
  1332. X`1B`5B8;47HMovement :`1B`5B8;80H`1B(0x`1B`5B9;1Hx`1B`5B9;80Hx`1B`5B10;1Hx
  1333. V    F`1B(Bence off as much of the  screen`1B`5B10;47H
  1334. X`1B`5B10;47H8  - Up`1B`5B10;63H6 - Right        `1B(0x`1B`5B11;1Hx
  1335. V                                    `1B`5B11;47H  `20
  1336. X`1B`5B11;50H    `1B`5B11;63H                 x`1B`5B12;1Hx    `1B(Bas possib
  1337. Vle before some one else`1B`5B12;47H2  - D
  1338. X`1B`5B12;53Hown       4 - Left`1B`5B12;80H`1B(0x`1B`5B13;1Hx
  1339. V                                    `1B`5B13;47H        `20
  1340. X`1B`5B13;56H               `1B`5B13;80Hx`1B`5B14;1Hx    `1B`5B14;47H`1B(B< S
  1341. Vpace Bar > - Draw Fence       `1B(0x
  1342. X`1B`5B15;1Hx         `1B`5B15;47H                                 x`1B`5B16;
  1343. V1Hx    A`1B(Breas only score if no o
  1344. X`1B`5B16;30Hne else`1B`5B16;80H`1B(0x`1B`5B17;1Hx
  1345. V                                    `1B`5B17;80Hx
  1346. X`1B`5B18;1Hx    `1B(Bis inside.`1B`5B18;80H`1B(0x`1B`5B19;1Hx`1B`5B19;80Hx`1
  1347. VB`5B20;1Hmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
  1348. X`1B`5B20;37Hqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj`1B`5B21;1Hlqqqqqqqq
  1349. Vqqqq M`1B(Bessages `1B(0qqqqqqqqqqq
  1350. X`1B`5B21;35Hqqqqk   lqqqqqqqqqqqq N`1B(Bame `1B(0qqqqqqqqqqqqqqqqqqk`1B`5B22
  1351. V;1Hx `1B`5B22;39Hx   x     `1B(B*`1B(0`7E`1B`5B22;70H
  1352. X`1B`5B22;70H`7E`1B(B*        `1B(0x`1B`5B23;1Hmqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
  1353. Vqqqqqqqqj   mqqqqqqqqqqqqqqqqqqqqqqqq`1B`5B1;1H
  1354. X`1B`5B23;68Hqqqqqqqqqqqqj`1B`5B1;1H
  1355. X
  1356. X
  1357. X
  1358. X`1B`5B6;17H`7Eqq`60
  1359. X`1B`5B6;20Hqq`60
  1360. X`1B`5B6;22Hqq`60
  1361. X`1B`5B6;24Hqq`60
  1362. X`1B`5B6;26Hqq`60
  1363. X`1B`5B6;28Hqq`60
  1364. X`1B`5B4;30H`60`1B`5B5;30Hx`1B`5B6;30Hj
  1365. X`1B`5B2;30H`60`1B`5B3;30Hx`1B`5B4;30Hx
  1366. X`1B`5B2;30Hlqq`60
  1367. X`1B`5B2;33Hqq`60
  1368. X`1B`5B2;35Hqq`60
  1369. X`1B`5B2;37Hqq`60
  1370. X`1B`5B2;39Hqq`60
  1371. X`1B`5B2;41Hqq`60
  1372. X`1B`5B2;43Hqq`60
  1373. X`1B`5B2;45Hqq`60
  1374. X`1B`5B2;47Hqq`60
  1375. X`1B`5B2;49Hqq`60
  1376. X`1B`5B2;51Hqq`60
  1377. X`1B`5B2;53Hqq`60
  1378. X`1B`5B2;55Hqq`60
  1379. X`1B`5B2;57Hqq`60
  1380. X`1B`5B2;59Hk`1B`5B3;58H`60j
  1381. X`1B`5B3;56H`60qq
  1382. X`1B`5B3;54H`60qq
  1383. X`1B`5B3;52H`60qq
  1384. X`1B`5B3;50H`60qq
  1385. X`1B`5B3;48H`60qq
  1386. X`1B`5B3;46H`60qq
  1387. X`1B`5B3;44H`60qq
  1388. X`1B`5B3;42H`60qq
  1389. X`1B`5B3;40H`60qq
  1390. X`1B`5B3;40Hl`1B`5B4;40Hx`1B`5B5;40H`60
  1391. X`1B`5B5;40Hx`1B`5B6;40Hx`1B`5B7;40H`60
  1392. X`1B`5B7;40Hx`1B`5B8;40Hx`1B`5B9;40H`60
  1393. X`1B`5B9;40Hx`1B`5B10;40Hx`1B`5B11;40H`60
  1394. X`1B`5B11;40Hx`1B`5B12;40Hx`1B`5B13;40H`60
  1395. X`1B`5B13;40Hx`1B`5B14;40Hx`1B`5B15;40H`60
  1396. X`1B`5B15;40Hx`1B`5B16;40Hx`1B`5B17;40H`60
  1397. X`1B`5B17;40Hx`1B`5B18;40Hx`1B`5B19;40H`60
  1398. X`1B`5B19;40Hmq`60
  1399. X`1B`5B19;42Hqq`60
  1400. X`1B`5B19;44Hqq`60
  1401. X`1B`5B19;46Hqq`60
  1402. X`1B`5B19;48Hqq`60
  1403. X`1B`5B19;50Hqq`60
  1404. X`1B`5B19;52Hqq`60
  1405. X`1B`5B19;54Hqq`60
  1406. X`1B`5B19;56Hqq`60
  1407. X`1B`5B19;58Hqq`60
  1408. X`1B`5B19;60Hqq`60
  1409. X`1B`5B19;62Hqq`60
  1410. X`1B`5B19;64Hqq`60
  1411. X`1B`5B19;66Hqq`60
  1412. X`1B`5B19;68Hqq`60
  1413. X`1B`5B19;70Hqq`60
  1414. X`1B`5B19;72Hqq`60
  1415. X`1B`5B19;74Hqq`60
  1416. X`1B`5B17;76H`60`1B`5B18;76Hx`1B`5B19;76Hj
  1417. X`1B`5B17;74H`60qk
  1418. X`1B`5B17;72H`60qq
  1419. X`1B`5B17;70H`60qq
  1420. X`1B`5B17;68H`60qq
  1421. X`1B`5B15;68H`60`1B`5B16;68Hx`1B`5B17;68Hm
  1422. X`1B`5B15;66H`60qk
  1423. X`1B`5B15;64H`60qq
  1424. X`1B`5B15;62H`60qq
  1425. X`1B`5B15;60H`60qq
  1426. X`1B`5B15;58H`60qq
  1427. X`1B`5B15;56H`60qq
  1428. X`1B`5B15;54H`60qq
  1429. X`1B`5B15;52H`60qq
  1430. X`1B`5B15;50H`60qq
  1431. X`1B`5B15;48H`60qq
  1432. X`1B`5B15;46H`60qq
  1433. X`1B`5B13;44H`60`1B`5B14;44Hx`1B`5B15;44Hmqq
  1434. X`1B`5B11;44H`60`1B`5B12;44Hx`1B`5B13;44Hx
  1435. X`1B`5B10;43H`60`1B`5B11;43Hmk
  1436. X`1B`5B8;43H`60`1B`5B9;43Hx`1B`5B10;43Hx
  1437. X`1B`5B6;43H`60`1B`5B7;43Hx`1B`5B8;43Hx
  1438. X`1B`5B6;43Hlq`60
  1439. X`1B`5B6;45Hqq`60
  1440. X`1B`5B6;47Hqq`60
  1441. X`1B`5B6;49Hqq`60
  1442. X`1B`5B6;51Hqq`60
  1443. X`1B`5B6;53Hqq`60
  1444. X`1B`5B6;55Hqq`60
  1445. X`1B`5B6;57Hqq`60
  1446. X`1B`5B6;59Hqq`60
  1447. X`1B`5B6;61Hk`1B`5B7;61Hx`1B`5B8;61H`60
  1448. X`1B`5B8;61Hmqq`60
  1449. X`1B`5B8;64Hqq`60
  1450. X`1B`5B8;66Hqq`60
  1451. X`1B`5B8;68Hqq`60
  1452. X`1B`5B8;70Hqq`60
  1453. X`1B`5B8;72Hqq`60
  1454. X`1B`5B6;74H`60`1B`5B7;74Hx`1B`5B8;74Hj
  1455. X`1B`5B4;74H`60`1B`5B5;74Hx`1B`5B6;74Hx
  1456. X`1B`5B2;74H`60`1B`5B3;74Hx`1B`5B4;74Hx
  1457. X`1B`5B2;72H`60qk
  1458. X`1B`5B2;70H`60qq
  1459. X`1B`5B2;68H`60qq
  1460. X`1B`5B2;66H`60qq
  1461. X`1B`5B2;64H`60qq
  1462. X`1B`5B2;62H`60qq
  1463. X`1B`5B2;60H`60qq
  1464. X`1B`5B2;59H`60q
  1465. X`1B`5B3;60H`1B`5B7m              `1B`5B4;41H
  1466. V                                 `1B`5B5;41H                         `20
  1467. X`1B`5B5;67H       `1B`5B6;41H  `1B`5B6;62H            `1B`5B7;41H  `1B`5B7;6
  1468. V2H            `1B`5B8;41H `20
  1469. X`1B`5B9;41H  `1B`5B10;41H  `1B`5B11;41H  `1B`5B12;41H   `1B`5B13;41H   `1B`5
  1470. VB14;41H   `1B`5B15;41H   `1B`5B16;41H                 `20
  1471. X`1B`5B16;59H         `1B`5B17;41H                           `1B`5B18;41H
  1472. V                                  `20
  1473. X`1B`5B0m
  1474. X`1B`5B2;59Hw`60
  1475. X`1B`5B2;60Hq`60
  1476. X`1B`5B2;61Hq`60
  1477. X`1B`5B2;62Hq`60
  1478. X`1B`5B2;63Hq`60
  1479. X`1B`5B2;64Hq`60
  1480. X`1B`5B2;65Hq`60
  1481. X`1B`5B2;66Hq`60
  1482. X`1B`5B2;67Hq`60
  1483. X`1B`5B2;68Hq`60
  1484. X`1B`5B2;69Hqq`60
  1485. X`1B`5B2;71Hq`60
  1486. X`1B`5B2;72Hq`60
  1487. X`1B`5B2;73Hq`60
  1488. X`1B`5B2;74Hk`1B`5B3;74H`60
  1489. X`1B`5B3;74Hx`1B`5B4;74H`60
  1490. X`1B`5B4;74Hx`1B`5B5;74H`60
  1491. X`1B`5B5;74Hx`1B`5B6;74H`60
  1492. X`1B`5B6;74Hx`1B`5B7;74H`60
  1493. X`1B`5B7;74Hx`1B`5B8;74H`60
  1494. X`1B`5B8;74Hu`1B`5B9;74H`60
  1495. X`1B`5B9;74Hx`1B`5B10;74H`60
  1496. X`1B`5B10;74Hx`1B`5B11;74H`60
  1497. X`1B`5B11;74Hx`1B`5B12;74H`60
  1498. X`1B`5B12;74Hx`1B`5B13;74H`60
  1499. X`1B`5B13;74Hx`1B`5B14;74H`60
  1500. X`1B`5B14;74Hx`1B`5B15;74H`60
  1501. X`1B`5B15;74Hx`1B`5B16;74H`60
  1502. X`1B`5B16;74Hx`1B`5B17;74H`60
  1503. $ CALL UNPACK MQIXH.SCN;6 1797764174
  1504. $ create 'f'
  1505. X`09.title`09MULTIM`09Multi user game control
  1506. X;+
  1507. X;`09if $$MQIX is non zero
  1508. X;
  1509. X;`09if $$SOCCER is non zero
  1510. X;-
  1511. X
  1512. X`09$$SOCCER= 0
  1513. X`09$$MQIX  = 1
  1514. X
  1515. X.if ndf $$MQIX
  1516. X`09$$SOCCER= 1
  1517. X`09$$MQIX  = 0
  1518. X.endc
  1519. X
  1520. X
  1521. X`09$dibdef
  1522. X`09$iodef
  1523. X`09$qiodef
  1524. X`09$secdef
  1525. X`09$jpidef
  1526. X
  1527. X`09.default displacement word
  1528. X
  1529. Xesc`09`09= 27
  1530. X
  1531. Xsnake`09`09= 8`09`09; number of snakes
  1532. X
  1533. X;`09meaning of event flags in cluster 2
  1534. X
  1535. Xflag$v_master`09= 0`09`09; set if a master snake exists
  1536. Xflag$v_read`09= 1`09`09; set if all snakes should read command
  1537. Xflag$v_update`09= 2`09`09; set if all snakes should update screen
  1538. Xflag$v_game`09= 3`09`09; set if game is in progress
  1539. Xflag$v_endofgame= 4`09`09; set if we have reached the end of the game
  1540. Xflag$v_synch`09= 5
  1541. Xflag$v_done`09= 8`09`09; set if operation (read,update) is complete
  1542. X
  1543. Xcheck_timer`09= 13`09`09; check timer id
  1544. X
  1545. Xflag$v_io`09= 9`09`09; event flag in cluster 0 (set on read completion)
  1546. X
  1547. X
  1548. X`09.psect`09$rodata`09nowrt, noexe, shr, pic, long
  1549. X
  1550. Xttname_descr:
  1551. X`09.ascid`09/TT/
  1552. X
  1553. Xmbxcnv:
  1554. X`09.ascid`09/_MBA!UW:/`09; convert mbx unit number to physical name
  1555. X
  1556. Xmbxbuf_descr:
  1557. X`09.word`09mbxbuf_siz, 0
  1558. X`09.long`09mbxbuf
  1559. X
  1560. Xdibbuf_descr:
  1561. X`09.word`09dib$k_length, 0
  1562. X`09.long`09dibbuf
  1563. X
  1564. X`09.align long
  1565. Xsnake_desc_2:
  1566. X.if ne $$SOCCER
  1567. X`09.ascid`09/SOCCER_1/`09`09; name of snake event flags
  1568. X.endc
  1569. X.if ne $$MQIX
  1570. X`09.ascid`09/MQIX_1/
  1571. X.endc
  1572. X
  1573. X`09.align`09long
  1574. Xsnake_map_name:
  1575. X.if ne $$SOCCER
  1576. X`09.ascid`09/SOCCER_DATA/
  1577. X.endc
  1578. X.if ne $$MQIX
  1579. X`09.ascid`09/MQIX_DATA/
  1580. X.endc
  1581. X
  1582. Xtext = .
  1583. +-+-+-+-+-+-+-+-  END  OF PART 1 +-+-+-+-+-+-+-+-
  1584.