home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / volume13 / thricken / part01 < prev    next >
Encoding:
Internet Message Format  |  1992-08-02  |  47.0 KB

  1. Path: uunet!zephyr.ens.tek.com!master!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v13i101:  thricken - a multiscreen collect-the-objects style game, Part01/01
  5. Message-ID: <3068@master.CNA.TEK.COM>
  6. Date: 19 Jun 92 16:12:54 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 2015
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: James Bonfield <rince@dcs.warwick.ac.uk>
  12. Posting-number: Volume 13, Issue 101
  13. Archive-name: thricken/Part01
  14. Environment: curses
  15.  
  16.  
  17. [[Thricken is the sequel to perp. It's a more sophisticated system allowing for
  18. a far more flexible game. It is still outdated however and is a given up
  19. project. Even so, it is definitely in a playable state.
  20.  
  21.     James 'Rince' Bonfield]]
  22.  
  23. #! /bin/sh
  24. # This is a shell archive.  Remove anything before this line, then unpack
  25. # it by saving it into a file and typing "sh file".  To overwrite existing
  26. # files, type "sh file -c".  You can also feed this as standard input via
  27. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  28. # will see the following message at the end:
  29. #        "End of archive 1 (of 1)."
  30. # Contents:  README MANIFEST Makefile data data/00-03col data/00-03spr
  31. #   data/00level data/01level data/02level data/03level data/04col
  32. #   data/04level data/04spr data/05col data/05level data/05spr
  33. #   data/06col data/06level data/06spr data/README data/scores
  34. #   data/screen extern.h files.c main.c scores.c screen.c thricken.6
  35. #   thricken.h
  36. # Wrapped by billr@saab on Fri Jun 19 09:09:47 1992
  37. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  38. if test -f 'README' -a "${1}" != "-c" ; then 
  39.   echo shar: Will not clobber existing file \"'README'\"
  40. else
  41. echo shar: Extracting \"'README'\" \(632 characters\)
  42. sed "s/^X//" >'README' <<'END_OF_FILE'
  43. XThis is the game of thricken - written by James 'Rince' Bonfield.
  44. XYou may redistribute and modify any of this source provided that my name is
  45. Xstill mentioned in connection with the pieces of code I have written.
  46. X
  47. XI'd be interested in any screens you happen to write for the game - as can be
  48. Xseen by my (and Radagast aka Stephen Landmore) exploits the screens can be
  49. Xpretty flexible and unlike each other.
  50. X
  51. XEmail me at :
  52. X    rince@dcs.warwick.ac.uk
  53. X
  54. X
  55. XWhat this doesn't do :
  56. X    No decent high score system
  57. X    Currently it pretends to save what level you last got up to, but is
  58. X        somewhat buggy still in this area.
  59. X    Do project work for you.
  60. X
  61. END_OF_FILE
  62. if test 632 -ne `wc -c <'README'`; then
  63.     echo shar: \"'README'\" unpacked with wrong size!
  64. fi
  65. # end of 'README'
  66. fi
  67. if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  68.   echo shar: Will not clobber existing file \"'MANIFEST'\"
  69. else
  70. echo shar: Extracting \"'MANIFEST'\" \(1013 characters\)
  71. sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
  72. X   File Name        Archive #    Description
  73. X-----------------------------------------------------------
  74. X MANIFEST                   1    This shipping list
  75. X Makefile                   1    
  76. X README                     1    
  77. X data                       1    
  78. X data/00-03col              1    
  79. X data/00-03spr              1    
  80. X data/00level               1    
  81. X data/01level               1    
  82. X data/02level               1    
  83. X data/03level               1    
  84. X data/04col                 1    
  85. X data/04level               1    
  86. X data/04spr                 1    
  87. X data/05col                 1    
  88. X data/05level               1    
  89. X data/05spr                 1    
  90. X data/06col                 1    
  91. X data/06level               1    
  92. X data/06spr                 1    
  93. X data/README                1    
  94. X data/scores                1    
  95. X data/screen                1    
  96. X extern.h                   1    
  97. X files.c                    1    
  98. X main.c                     1    
  99. X scores.c                   1    
  100. X screen.c                   1    
  101. X thricken.6                 1    
  102. X thricken.h                 1    
  103. END_OF_FILE
  104. if test 1013 -ne `wc -c <'MANIFEST'`; then
  105.     echo shar: \"'MANIFEST'\" unpacked with wrong size!
  106. fi
  107. # end of 'MANIFEST'
  108. fi
  109. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  110.   echo shar: Will not clobber existing file \"'Makefile'\"
  111. else
  112. echo shar: Extracting \"'Makefile'\" \(898 characters\)
  113. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  114. X# compiler flags
  115. XCC = gcc
  116. XCFLAGS = -O
  117. XLDFLAGS = -s
  118. XLIBS = -lcurses -ltermcap
  119. X
  120. X# directories
  121. XBINDIR = /dcs/89/rince/open/bin.$(ARCH)
  122. XLIBDIR = /dcs/89/rince/open/lib/thricken
  123. XMANDIR = /dcs/89/rince/open/man
  124. X
  125. XOBJ = files.o main.o scores.o screen.o
  126. X
  127. XDEFS =    -DLIBDIR=\"$(LIBDIR)\"
  128. X
  129. Xthricken:    $(OBJ)
  130. X    $(CC) $(LDFLAGS) $(OBJ) -o $@ $(LIBS)
  131. X
  132. X%.o:    %.c
  133. X    $(CC) $(CFLAGS) $(DEFS) -c $<
  134. X    
  135. X
  136. Xinstall:    thricken thricken.6
  137. X    # the game
  138. X    -mkdir -p $(BINDIR)
  139. X    chmod a+xr $(BINDIR)
  140. X    -cp thricken $(BINDIR)
  141. X    chmod a+x $(BINDIR)/thricken
  142. X
  143. X    # the data files
  144. X    -mkdir -p $(LIBDIR)
  145. X    chmod a+xr $(LIBDIR)
  146. X    -cp data/* $(LIBDIR)
  147. X    chmod a+r $(LIBDIR)/*
  148. X
  149. X    # the man page
  150. X    -mkdir -p $(MANDIR)/man6
  151. X    chmod a+xr $(MANDIR)/man6
  152. X    -cp thricken.6 $(MANDIR)/man6
  153. X    chmod a+r $(MANDIR)/man6/thricken.6
  154. X
  155. Xclean:
  156. X    -rm thricken *.o *~
  157. X
  158. Xfiles.o: thricken.h
  159. Xmain.o: thricken.h extern.h
  160. Xscores.o: extern.h thricken.h
  161. Xscreen.o: extern.h thricken.h
  162. END_OF_FILE
  163. if test 898 -ne `wc -c <'Makefile'`; then
  164.     echo shar: \"'Makefile'\" unpacked with wrong size!
  165. fi
  166. # end of 'Makefile'
  167. fi
  168. if test ! -d 'data' ; then
  169.     echo shar: Creating directory \"'data'\"
  170.     mkdir 'data'
  171. fi
  172. if test -f 'data/00-03col' -a "${1}" != "-c" ; then 
  173.   echo shar: Will not clobber existing file \"'data/00-03col'\"
  174. else
  175. echo shar: Extracting \"'data/00-03col'\" \(372 characters\)
  176. sed "s/^X//" >'data/00-03col' <<'END_OF_FILE'
  177. X 0123
  178. X.oO@
  179. X..d@hjkl3
  180. Xoo.dhjkl5
  181. XOOo.hjkl7
  182. X@@Oohjkl13
  183. X0110hjkl0
  184. X0220hjkl0
  185. X0330hjkl0
  186. X1001hjkl0
  187. X1221hjkl0
  188. X1331hjkl0
  189. X2002hjkl0
  190. X2112hjkl0
  191. X2332hjkl0
  192. X3003hjkl0
  193. X3113hjkl0
  194. X3223hjkl0
  195. X00@Ohjkl0
  196. X11@Ohjkl0
  197. X22@Ohjkl0
  198. X33@Ohjkl0
  199. X.0.0hjkl0
  200. Xo0o0hjkl0
  201. XO0O0hjkl0
  202. X@0@0hjkl0
  203. X.1.1hjkl0
  204. Xo1o1hjkl0
  205. XO1O1hjkl0
  206. X@1@1hjkl0
  207. X.2.2hjkl0
  208. Xo2o2hjkl0
  209. XO2O2hjkl0
  210. X@2@2hjkl0
  211. X.3.3hjkl0
  212. Xo3o3hjkl0
  213. XO3O3hjkl0
  214. X@3@3hjkl0
  215. END_OF_FILE
  216. if test 372 -ne `wc -c <'data/00-03col'`; then
  217.     echo shar: \"'data/00-03col'\" unpacked with wrong size!
  218. fi
  219. # end of 'data/00-03col'
  220. fi
  221. if test -f 'data/00-03spr' -a "${1}" != "-c" ; then 
  222.   echo shar: Will not clobber existing file \"'data/00-03spr'\"
  223. else
  224. echo shar: Extracting \"'data/00-03spr'\" \(462 characters\)
  225. sed "s/^X//" >'data/00-03spr' <<'END_OF_FILE'
  226. X      
  227. X      
  228. X      
  229. X>
  230. X /O__o
  231. X \___/
  232. X /_\_ 
  233. X<
  234. Xo__O\ 
  235. X\___/ 
  236. X _/_\ 
  237. X^
  238. X ^__^ 
  239. X/----\
  240. X_/  \_
  241. Xv
  242. X O__O 
  243. X/----\
  244. X_/  \_
  245. X-
  246. X------
  247. X======  
  248. X------
  249. X|
  250. X| :: |
  251. X| :: |
  252. X| :: |
  253. X/
  254. X+-----
  255. X| ++==
  256. X| :: +
  257. X\
  258. X-----+
  259. X==++ |
  260. X+ :: |
  261. X`
  262. X| :: +
  263. X| ++==
  264. X+-----
  265. X'
  266. X+ :: |
  267. X==++ |
  268. X-----+
  269. Xd
  270. X      
  271. X  {}  
  272. X      
  273. X.
  274. X  ___ 
  275. X /...\
  276. X \.../
  277. Xo
  278. X  ___ 
  279. X /ooo\
  280. X \ooo/
  281. XO
  282. X  ___ 
  283. X /OOO\
  284. X \OOO/
  285. X@
  286. X  ___ 
  287. X /@@@\
  288. X \@@@/
  289. X0
  290. X++++++
  291. X+....+
  292. X++++++
  293. X1
  294. X......
  295. X.OOOO.
  296. X......
  297. X2
  298. XOOOOOO
  299. XO####O
  300. XOOOOOO
  301. X3
  302. X######
  303. X#++++#
  304. X######
  305. END_OF_FILE
  306. if test 462 -ne `wc -c <'data/00-03spr'`; then
  307.     echo shar: \"'data/00-03spr'\" unpacked with wrong size!
  308. fi
  309. # end of 'data/00-03spr'
  310. fi
  311. if test -f 'data/00level' -a "${1}" != "-c" ; then 
  312.   echo shar: Will not clobber existing file \"'data/00level'\"
  313. else
  314. echo shar: Extracting \"'data/00level'\" \(148 characters\)
  315. sed "s/^X//" >'data/00level' <<'END_OF_FILE'
  316. X00-03spr
  317. X00-03col
  318. X8
  319. X8
  320. X0
  321. X0
  322. X14
  323. X/------\
  324. X|      |
  325. X| 3012 |
  326. X| 0123 |
  327. X| 1230 |
  328. X| 2301 |
  329. X|      |
  330. X`------'
  331. Xbearings
  332. XCyclic Madness
  333. XJames 'Rince' Bonfield
  334. END_OF_FILE
  335. if test 148 -ne `wc -c <'data/00level'`; then
  336.     echo shar: \"'data/00level'\" unpacked with wrong size!
  337. fi
  338. # end of 'data/00level'
  339. fi
  340. if test -f 'data/01level' -a "${1}" != "-c" ; then 
  341.   echo shar: Will not clobber existing file \"'data/01level'\"
  342. else
  343. echo shar: Extracting \"'data/01level'\" \(172 characters\)
  344. sed "s/^X//" >'data/01level' <<'END_OF_FILE'
  345. X00-03spr
  346. X00-03col
  347. X8
  348. X11
  349. X2
  350. X2
  351. X14
  352. X/---------\
  353. X|         |
  354. X| 3003    |
  355. X|  2332   |
  356. X|   1221  |
  357. X|    0110 |
  358. X|         |
  359. X`---------'
  360. Xbearings
  361. XMore insanity
  362. XJames 'Rince' Bonfield
  363. END_OF_FILE
  364. if test 172 -ne `wc -c <'data/01level'`; then
  365.     echo shar: \"'data/01level'\" unpacked with wrong size!
  366. fi
  367. # end of 'data/01level'
  368. fi
  369. if test -f 'data/02level' -a "${1}" != "-c" ; then 
  370.   echo shar: Will not clobber existing file \"'data/02level'\"
  371. else
  372. echo shar: Extracting \"'data/02level'\" \(339 characters\)
  373. sed "s/^X//" >'data/02level' <<'END_OF_FILE'
  374. X00-03spr
  375. X00-03col
  376. X9
  377. X28
  378. X2
  379. X2
  380. X70
  381. X/--------------------------\
  382. X|                          |
  383. X| 123012 23 122320 03   22 |
  384. X| 21     11 02     21   30 |
  385. X| 301210 20 312310 3120203 |
  386. X| 03     11     12 03   30 |
  387. X| 13     03 020203 21   12 |
  388. X|                          |
  389. X`--------------------------'
  390. Xbearings
  391. XSwimming around
  392. XJames 'Rince' Bonfield
  393. END_OF_FILE
  394. if test 339 -ne `wc -c <'data/02level'`; then
  395.     echo shar: \"'data/02level'\" unpacked with wrong size!
  396. fi
  397. # end of 'data/02level'
  398. fi
  399. if test -f 'data/03level' -a "${1}" != "-c" ; then 
  400.   echo shar: Will not clobber existing file \"'data/03level'\"
  401. else
  402. echo shar: Extracting \"'data/03level'\" \(195 characters\)
  403. sed "s/^X//" >'data/03level' <<'END_OF_FILE'
  404. X00-03spr
  405. X00-03col
  406. X8
  407. X14
  408. X3
  409. X2
  410. X17
  411. X/------\/----\
  412. X|@ @   ||    |
  413. X|   @ @`'@ @ |
  414. X|@ @  @o   /-'
  415. X|   @ @/\@ `-\
  416. X|@ @   ||  @ |
  417. X| @ @ @||    |
  418. X`------'`.---'
  419. Xbearings
  420. XCarrots Bane
  421. XJames 'Rince' Bonfield
  422. END_OF_FILE
  423. if test 195 -ne `wc -c <'data/03level'`; then
  424.     echo shar: \"'data/03level'\" unpacked with wrong size!
  425. fi
  426. # end of 'data/03level'
  427. fi
  428. if test -f 'data/04col' -a "${1}" != "-c" ; then 
  429.   echo shar: Will not clobber existing file \"'data/04col'\"
  430. else
  431. echo shar: Extracting \"'data/04col'\" \(189 characters\)
  432. sed "s/^X//" >'data/04col' <<'END_OF_FILE'
  433. X .
  434. XoOsPhjklE
  435. Xssddhjkl15
  436. Xooddhjkl10
  437. XE.  hjkl0
  438. XPS dhjkl5
  439. XhH  h   15
  440. XjJ  jk  15
  441. XkK  kj  15
  442. XlL  l   15
  443. Xs..shjkl0
  444. Xo.o.hjkl0
  445. Xh.h.hjkl0
  446. Xj.j.hjkl0
  447. Xk.k.hjkl0
  448. Xl.l.hjkl0
  449. XP.P.hjkl0
  450. XS.S.hjkl0
  451. XO.O.hjkl0
  452. END_OF_FILE
  453. if test 189 -ne `wc -c <'data/04col'`; then
  454.     echo shar: \"'data/04col'\" unpacked with wrong size!
  455. fi
  456. # end of 'data/04col'
  457. fi
  458. if test -f 'data/04level' -a "${1}" != "-c" ; then 
  459.   echo shar: Will not clobber existing file \"'data/04level'\"
  460. else
  461. echo shar: Extracting \"'data/04level'\" \(992 characters\)
  462. sed "s/^X//" >'data/04level' <<'END_OF_FILE'
  463. X04spr
  464. X04col
  465. X30
  466. X30
  467. X2
  468. X2
  469. X216
  470. X##############################
  471. X#      #    #dodod  o #. .o o#
  472. X#    ok j   #ododoo . #o#o  .#
  473. X#       o  ....dd.#.s.#    oo#
  474. X#ododododo .....d.....#  o#oo#
  475. X# # #.###  .. sss.....# o  # #
  476. X# # #.#    ..s........#  #  o#
  477. X###.# #    ..s .......#d######
  478. X#s# o #   K...ssss ...#d#oooo#
  479. X#d#o# ###.J.......o...#d#oEEo#
  480. X#d OdOdO .o.......o..#dd#.d..#
  481. X#o do  . .do      o #ddd#odd.#
  482. X#########.o#oooooo.#.   #odd.#
  483. X#                 #o.   ###d##
  484. X#         ###d# ###o.       o#
  485. X# ######SS  #d# #d# .   ddd  #
  486. X# # ooo#PP  #o# #d#o.o. dEd  #
  487. X# d oo #    #d#o#o###.  ddd  #
  488. X# #ooo #     d..#do#.      # #
  489. X# #########  o s od#o o oo o #
  490. X#    odo#o#        #o######  #
  491. X# S  dodod# ########o#dodo# d#
  492. X# d  o#odo#    # d    oooo#dd#
  493. X# S  dodod###d # d   #odoo# d#
  494. X#    ododo  .P # d   ###### d#
  495. X#    do#od  .d # #   o ## o d#
  496. X#ooooododo  .P # d          d#
  497. X#           .  . d          d#
  498. X# o    #oo#o   # #ddddd     d#
  499. X##############################
  500. Xdiamonds
  501. XOrange Flamingos
  502. XBroadbane
  503. END_OF_FILE
  504. if test 992 -ne `wc -c <'data/04level'`; then
  505.     echo shar: \"'data/04level'\" unpacked with wrong size!
  506. fi
  507. # end of 'data/04level'
  508. fi
  509. if test -f 'data/04spr' -a "${1}" != "-c" ; then 
  510.   echo shar: Will not clobber existing file \"'data/04spr'\"
  511. else
  512. echo shar: Extracting \"'data/04spr'\" \(558 characters\)
  513. sed "s/^X//" >'data/04spr' <<'END_OF_FILE'
  514. X      
  515. X      
  516. X      
  517. X>
  518. X /O__o
  519. X \___/
  520. X /_\_ 
  521. X<
  522. Xo__O\ 
  523. X\___/ 
  524. X _/_\ 
  525. X^
  526. X ^__^ 
  527. X/----\
  528. X_/  \_
  529. Xv
  530. X O__O 
  531. X/----\
  532. X_/  \_
  533. X[
  534. X\\\\\\
  535. X\\\\\\
  536. X\\\\\\
  537. X]
  538. X//////
  539. X//////
  540. X//////
  541. X#
  542. X/\/\/\
  543. X\/\\/\
  544. X\/\/\/
  545. Xd
  546. X  /\  
  547. X <  > 
  548. X  \/  
  549. Xo
  550. X  ___  
  551. X /   \ 
  552. X \___/ 
  553. XO
  554. X  ___  
  555. X /@@@\ 
  556. X \@@@/ 
  557. Xh
  558. X| | /\
  559. X----||
  560. X    \/
  561. Xl
  562. X/\ | |
  563. X||----
  564. X\/    
  565. Xj
  566. X /--\ 
  567. X  \/  
  568. X==|   
  569. Xk
  570. X==|   
  571. X  /\  
  572. X \--/ 
  573. XH
  574. X  <<  
  575. X  <<  
  576. X  <<  
  577. XL
  578. X  >>  
  579. X  >>  
  580. X  >>  
  581. XJ
  582. X      
  583. Xvvvvvv
  584. X      
  585. XK
  586. X      
  587. X^^^^^^
  588. X      
  589. X.
  590. X. . . 
  591. X . . .
  592. X. . . 
  593. Xs
  594. X  ___ 
  595. X /ooo\
  596. X \ooo/
  597. XS
  598. XSOCKET
  599. XSOCKET
  600. XSOCKET
  601. XP
  602. X PLUG!
  603. X PLUG!
  604. X PLUG!
  605. XE
  606. XEATEAT
  607. XEATEAT
  608. XEATEAT
  609. END_OF_FILE
  610. if test 558 -ne `wc -c <'data/04spr'`; then
  611.     echo shar: \"'data/04spr'\" unpacked with wrong size!
  612. fi
  613. # end of 'data/04spr'
  614. fi
  615. if test -f 'data/05col' -a "${1}" != "-c" ; then 
  616.   echo shar: Will not clobber existing file \"'data/05col'\"
  617. else
  618. echo shar: Extracting \"'data/05col'\" \(64 characters\)
  619. sed "s/^X//" >'data/05col' <<'END_OF_FILE'
  620. Xo@hjkl
  621. Xooddhjkl10
  622. XhH  h   15
  623. XjJ  j   15
  624. XkK  k   15
  625. XlL  l   15
  626. END_OF_FILE
  627. if test 64 -ne `wc -c <'data/05col'`; then
  628.     echo shar: \"'data/05col'\" unpacked with wrong size!
  629. fi
  630. # end of 'data/05col'
  631. fi
  632. if test -f 'data/05level' -a "${1}" != "-c" ; then 
  633.   echo shar: Will not clobber existing file \"'data/05level'\"
  634. else
  635. echo shar: Extracting \"'data/05level'\" \(468 characters\)
  636. sed "s/^X//" >'data/05level' <<'END_OF_FILE'
  637. X05spr
  638. X05col
  639. X14
  640. X28
  641. X5
  642. X4
  643. X39
  644. X***************************
  645. X*********1234567890.*******
  646. X*D**do#       #  o o #  ***
  647. X****oo# #K### #j # # #h ***
  648. X**D*    #  H     hh# #od***
  649. X****oo  H  ####k#d   # o***
  650. X*D**######J#o #  o# ## o***
  651. X****dd##oo #o ###ddo#   ***
  652. X**D* @d### # o####do#  d***
  653. X**** o H        #####o  ***
  654. X*D** oo##  #@    @ @ @ o***
  655. X****d  #oooo@ o#   @    ***
  656. X**D************************
  657. X***************************
  658. Xdiamonds
  659. XExpanded minitures
  660. XJames 'Rince' Bonfield
  661. END_OF_FILE
  662. if test 468 -ne `wc -c <'data/05level'`; then
  663.     echo shar: \"'data/05level'\" unpacked with wrong size!
  664. fi
  665. # end of 'data/05level'
  666. fi
  667. if test -f 'data/05spr' -a "${1}" != "-c" ; then 
  668.   echo shar: Will not clobber existing file \"'data/05spr'\"
  669. else
  670. echo shar: Extracting \"'data/05spr'\" \(696 characters\)
  671. sed "s/^X//" >'data/05spr' <<'END_OF_FILE'
  672. X      
  673. X      
  674. X      
  675. X>
  676. X /O__o
  677. X \___/
  678. X /_\_ 
  679. X<
  680. Xo__O\ 
  681. X\___/ 
  682. X _/_\ 
  683. X^
  684. X ^__^ 
  685. X/----\
  686. X_/  \_
  687. Xv
  688. X O__O 
  689. X/----\
  690. X_/  \_
  691. X#
  692. X######
  693. X######
  694. X######
  695. Xd
  696. X  /\  
  697. X <  > 
  698. X  \/  
  699. Xo
  700. X  ___  
  701. X /   \ 
  702. X \___/ 
  703. X@
  704. X  ___  
  705. X /@@@\ 
  706. X \@@@/ 
  707. Xh
  708. X| | /\
  709. X----||
  710. X    \/
  711. Xl
  712. X/\ | |
  713. X||----
  714. X\/    
  715. Xj
  716. X /--\ 
  717. X  \/  
  718. X==|   
  719. Xk
  720. X==|   
  721. X  /\  
  722. X \--/ 
  723. XH
  724. X  <<  
  725. X  <<  
  726. X  <<  
  727. XL
  728. X  >>  
  729. X  >>  
  730. X  >>  
  731. XJ
  732. X      
  733. Xvvvvvv
  734. X      
  735. XK
  736. X      
  737. X^^^^^^
  738. X      
  739. X*
  740. X@@@@@@
  741. X@@@@@@
  742. X@@@@@@
  743. X1
  744. X@ B E 
  745. X@@@@@@
  746. X@@@@@@
  747. X2
  748. XW A R 
  749. X@@@@@@
  750. X@@@@@@
  751. X3
  752. XE    O
  753. X@@@@@@
  754. X@@@@@@
  755. X4
  756. X F    
  757. X@@@@@@
  758. X@@@@@@
  759. X5
  760. XS E G 
  761. X@@@@@@
  762. X@@@@@@
  763. X6
  764. XM E N 
  765. X@@@@@@
  766. X@@@@@@
  767. X7
  768. XT A T 
  769. X@@@@@@
  770. X@@@@@@
  771. X8
  772. XI O N 
  773. X@@@@@@
  774. X@@@@@@
  775. X9
  776. X   F A
  777. X@@@@@@
  778. X@@@@@@
  779. X0
  780. X U L T
  781. X@@@@@@
  782. X@@@@@@
  783. X.
  784. X S @@@
  785. X@@@@@@
  786. X@@@@@@
  787. XD
  788. X@@/\@@
  789. X@<<>>@
  790. X@@\/@@
  791. END_OF_FILE
  792. if test 696 -ne `wc -c <'data/05spr'`; then
  793.     echo shar: \"'data/05spr'\" unpacked with wrong size!
  794. fi
  795. # end of 'data/05spr'
  796. fi
  797. if test -f 'data/06col' -a "${1}" != "-c" ; then 
  798.   echo shar: Will not clobber existing file \"'data/06col'\"
  799. else
  800. echo shar: Extracting \"'data/06col'\" \(64 characters\)
  801. sed "s/^X//" >'data/06col' <<'END_OF_FILE'
  802. Xo@hjkl
  803. Xooddhjkl10
  804. XhH  h   15
  805. XjJ  j   15
  806. XkK  k   15
  807. XlL  l   15
  808. END_OF_FILE
  809. if test 64 -ne `wc -c <'data/06col'`; then
  810.     echo shar: \"'data/06col'\" unpacked with wrong size!
  811. fi
  812. # end of 'data/06col'
  813. fi
  814. if test -f 'data/06level' -a "${1}" != "-c" ; then 
  815.   echo shar: Will not clobber existing file \"'data/06level'\"
  816. else
  817. echo shar: Extracting \"'data/06level'\" \(282 characters\)
  818. sed "s/^X//" >'data/06level' <<'END_OF_FILE'
  819. X06spr
  820. X06col
  821. X14
  822. X14
  823. X5
  824. X5
  825. X4
  826. X##############
  827. X#    # #     #
  828. X# h  H H  h  #
  829. X# hj # #     #
  830. X#    # #     #
  831. X#J####o####KJ#
  832. X#  o  H      #
  833. X#K#### #### ##
  834. X#    L #ol   #
  835. X#  #K# #   k #
  836. X#k # # H     #
  837. X#  #    #kh  #
  838. X#o #    #    #
  839. X##############
  840. Xdiamonds
  841. XAn easy starter
  842. XJames 'Rince' Bonfield
  843. END_OF_FILE
  844. if test 282 -ne `wc -c <'data/06level'`; then
  845.     echo shar: \"'data/06level'\" unpacked with wrong size!
  846. fi
  847. # end of 'data/06level'
  848. fi
  849. if test -f 'data/06spr' -a "${1}" != "-c" ; then 
  850.   echo shar: Will not clobber existing file \"'data/06spr'\"
  851. else
  852. echo shar: Extracting \"'data/06spr'\" \(397 characters\)
  853. sed "s/^X//" >'data/06spr' <<'END_OF_FILE'
  854. X      
  855. X      
  856. X      
  857. X>
  858. X /O__o
  859. X \___/
  860. X /_\_ 
  861. X<
  862. Xo__O\ 
  863. X\___/ 
  864. X _/_\ 
  865. X^
  866. X ^__^ 
  867. X/----\
  868. X_/  \_
  869. Xv
  870. X O__O 
  871. X/----\
  872. X_/  \_
  873. X#
  874. X######
  875. X######
  876. X######
  877. Xd
  878. X  /\  
  879. X <  > 
  880. X  \/  
  881. Xo
  882. X  ___  
  883. X /   \ 
  884. X \___/ 
  885. X@
  886. X  ___  
  887. X /@@@\ 
  888. X \@@@/ 
  889. Xh
  890. X| | /\
  891. X----||
  892. X    \/
  893. Xl
  894. X/\ | |
  895. X||----
  896. X\/    
  897. Xj
  898. X /--\ 
  899. X  \/  
  900. X==|   
  901. Xk
  902. X==|   
  903. X  /\  
  904. X \--/ 
  905. XH
  906. X  <<  
  907. X  <<  
  908. X  <<  
  909. XL
  910. X  >>  
  911. X  >>  
  912. X  >>  
  913. XJ
  914. X      
  915. Xvvvvvv
  916. X      
  917. XK
  918. X      
  919. X^^^^^^
  920. X      
  921. END_OF_FILE
  922. if test 397 -ne `wc -c <'data/06spr'`; then
  923.     echo shar: \"'data/06spr'\" unpacked with wrong size!
  924. fi
  925. # end of 'data/06spr'
  926. fi
  927. if test -f 'data/README' -a "${1}" != "-c" ; then 
  928.   echo shar: Will not clobber existing file \"'data/README'\"
  929. else
  930. echo shar: Extracting \"'data/README'\" \(1887 characters\)
  931. sed "s/^X//" >'data/README' <<'END_OF_FILE'
  932. XDesigning screens:
  933. XUse 'thricken -d directory' where directory is where you have your own set of
  934. Xgame files. These consist of:
  935. XA screen file which must be called 'screen' - copy it out of here.
  936. XA 00level file (for level 0). (eg 01level, 02level etc)
  937. XA sprite file. (eg 0-3spr)
  938. XA collision file. (eg 0-3col)
  939. XA 'scores' file. This must exist - create it with something like 'touch scores'
  940. X
  941. X
  942. X
  943. Xlevel file
  944. X==========
  945. X
  946. Xline 1: sprite filename
  947. Xline 2: sprite data filename
  948. Xline 3: map height
  949. Xline 4: map width
  950. Xline 5: start x coord (top left of map is 0 0)
  951. Xline 6: start y coord
  952. Xline 7: no. of diamonds needed to finish the level
  953. Xthen  : map data (`height` lines)
  954. Xend-2 : name of diamonds
  955. Xend-1 : name of screen
  956. Xend   : author of level
  957. X
  958. XRules:
  959. Xsprite 'd' is always a diamond, and is the only collectable sprite
  960. Xsprite ' ' should always be a background (walkable) sprite.
  961. Xsprites <,v,^,> are the sprites for you facing left,down,up and right.
  962. X
  963. X
  964. X
  965. Xspr file
  966. X========
  967. X
  968. XConsists of a list of sprites.
  969. X
  970. XEach sprite is:
  971. X1 line containing a single char - the sprite character for map
  972. X3 lines of six characters - the sprite
  973. X
  974. X
  975. XCollision file
  976. X==============
  977. X
  978. Xline 1: list of sprites that can be walked over - such as ' '
  979. Xline 2: list of sprites that can be pushed - such as 'oO'
  980. Xthen  : list of sprite collisions with directions.
  981. X    char 1-2 = which sprites for collision
  982. X    char 3-4 = new sprites to replace old ones
  983. X    char 5-8 = directions for collision (must be 4 chars)
  984. X    char 9-  = decimal number for score change. 
  985. X        eg's:
  986. X    'ooddhjkl10' for boulders to diamonds
  987. X    'hH  h   15' for key & lock (from one direction).
  988. X
  989. Xsprites x, X and * are reserved
  990. Xthey are wildcards for collision.
  991. Xx = any non walkable sprite
  992. XX = any non pushable sprite
  993. X* = any sprite
  994. XHence 'GXGdh  l10' would be a sprite G which can turn any pushable sprite into
  995. Xa diamond (scoring 10 points), but only on directions left and right.
  996. END_OF_FILE
  997. if test 1887 -ne `wc -c <'data/README'`; then
  998.     echo shar: \"'data/README'\" unpacked with wrong size!
  999. fi
  1000. # end of 'data/README'
  1001. fi
  1002. if test -f 'data/scores' -a "${1}" != "-c" ; then 
  1003.   echo shar: Will not clobber existing file \"'data/scores'\"
  1004. else
  1005. echo shar: Extracting \"'data/scores'\" \(1 character\)
  1006. sed "s/^X//" >'data/scores' <<'END_OF_FILE'
  1007. X
  1008. END_OF_FILE
  1009. if test 1 -ne `wc -c <'data/scores'`; then
  1010.     echo shar: \"'data/scores'\" unpacked with wrong size!
  1011. fi
  1012. # end of 'data/scores'
  1013. fi
  1014. if test -f 'data/screen' -a "${1}" != "-c" ; then 
  1015.   echo shar: Will not clobber existing file \"'data/screen'\"
  1016. else
  1017. echo shar: Extracting \"'data/screen'\" \(1936 characters\)
  1018. sed "s/^X//" >'data/screen' <<'END_OF_FILE'
  1019. X                                                 
  1020. X                                                 
  1021. X                                                 
  1022. X                                                 
  1023. X                                                 
  1024. X                                                 
  1025. X                                                 
  1026. X                                                 
  1027. X                                                 
  1028. X                                                 
  1029. X                                                 
  1030. X                                                 
  1031. X                                                 
  1032. X                                                 
  1033. X                                                 
  1034. X                                                 
  1035. X                                                 
  1036. X                                                 
  1037. X                                                 
  1038. X                                                 
  1039. X                                                 
  1040. X                                                 
  1041. X                                                 
  1042. X                                                 
  1043. XO-----------------------------O
  1044. X| ___ . . ._. . ._ .  ._ . .  |
  1045. X|  |  |_| |_| | |  |/ |_ |\|  |
  1046. X|  |  | | | \ | |_ |\ |_ | |  |
  1047. X|                             |
  1048. X| \-------------------------/ |
  1049. X|  By James 'Rince' Bonfield  |
  1050. X| /-------------------------\ |
  1051. XO-----------------------------O
  1052. XO-----------------------------O
  1053. X|    <Name of this screen>    |
  1054. X+--------------+--------------+
  1055. X| Level:000000 |    xxxxxx    |
  1056. X|              |    xxxxxx    |
  1057. X| Score:000000 |    xxxxxx    |
  1058. X|              |              |
  1059. X| Moves:000000 | Diamonds:    |
  1060. X|              |   000000     |
  1061. X+--------------+--------------+
  1062. X| This screen was designed by |
  1063. X|   <Name of designer>        |
  1064. X|                             |
  1065. XO-----------------------------O
  1066. END_OF_FILE
  1067. if test 1936 -ne `wc -c <'data/screen'`; then
  1068.     echo shar: \"'data/screen'\" unpacked with wrong size!
  1069. fi
  1070. # end of 'data/screen'
  1071. fi
  1072. if test -f 'extern.h' -a "${1}" != "-c" ; then 
  1073.   echo shar: Will not clobber existing file \"'extern.h'\"
  1074. else
  1075. echo shar: Extracting \"'extern.h'\" \(338 characters\)
  1076. sed "s/^X//" >'extern.h' <<'END_OF_FILE'
  1077. Xextern int load_level(int level);
  1078. Xextern void init_display();
  1079. Xextern int draw_map(int y,int x);
  1080. Xextern void update_wins();
  1081. Xextern void draw_stats(char level);
  1082. Xextern void draw_you(char y, char x, char c);
  1083. Xextern void write_score();
  1084. Xextern char *readline(FILE *fp);
  1085. Xextern void display_scores();
  1086. Xextern struct scored *find_level(int uid);
  1087. END_OF_FILE
  1088. if test 338 -ne `wc -c <'extern.h'`; then
  1089.     echo shar: \"'extern.h'\" unpacked with wrong size!
  1090. fi
  1091. # end of 'extern.h'
  1092. fi
  1093. if test -f 'files.c' -a "${1}" != "-c" ; then 
  1094.   echo shar: Will not clobber existing file \"'files.c'\"
  1095. else
  1096. echo shar: Extracting \"'files.c'\" \(2365 characters\)
  1097. sed "s/^X//" >'files.c' <<'END_OF_FILE'
  1098. X#include <fcntl.h>
  1099. X#include <string.h>
  1100. X#include <stdio.h>
  1101. X#include "thricken.h"
  1102. X
  1103. Xchar *readline(FILE *fp);
  1104. Xint read_sprites();
  1105. Xchar *spr_file, *data_file;
  1106. X
  1107. Xint load_level(int level) {
  1108. X    int i,j;
  1109. X    FILE *fp;
  1110. X    char *level_file = strdup("xxlevel");
  1111. X    
  1112. X    level_file[0]='0'+((level<10)?0:(level/10));
  1113. X    level_file[1]='0'+level%10;
  1114. X    if ((fp = fopen(level_file,"r")) == NULL)
  1115. X    return -1;
  1116. X    spr_file = strdup(readline(fp));
  1117. X    data_file = strdup(readline(fp));
  1118. X    rows = atoi(readline(fp));
  1119. X    cols = atoi(readline(fp));
  1120. X    x = atoi(readline(fp));
  1121. X    y = atoi(readline(fp));
  1122. X    diamonds = atoi(readline(fp));
  1123. X    for (i=0; i<rows; i++)
  1124. X    map[i]=strdup(readline(fp));
  1125. X    if (dname)
  1126. X    free(dname);
  1127. X    dname = strdup(readline(fp));
  1128. X    if (lname)
  1129. X    free(lname);
  1130. X    lname = strdup(readline(fp));
  1131. X    if (author)
  1132. X    free(author);
  1133. X    author = strdup(readline(fp));
  1134. X    fclose(fp);
  1135. X    read_sprites();
  1136. X    read_sprdata();
  1137. X}
  1138. X
  1139. Xchar *readline(FILE *fp) {
  1140. X    /*
  1141. X     * buf is big enough for anything I'm going to use, but it's still
  1142. X     * a bit of a kludge.
  1143. X     */
  1144. X    static char buf[1024];
  1145. X    int i=0;
  1146. X    char c = '\0';
  1147. X    
  1148. X    if (fgets(buf,1000,fp) == (char *)0)
  1149. X    return (char *)-1;
  1150. X    buf[strlen(buf)-1] = '\0';
  1151. X    return buf;
  1152. X}
  1153. X
  1154. X
  1155. Xread_sprites() {
  1156. X    FILE *fp;
  1157. X    char spr;
  1158. X    char *ptr;
  1159. X    int j,i;
  1160. X    
  1161. X    if ((fp = fopen(spr_file,"r")) == NULL)
  1162. X    return -2;
  1163. X    while ((ptr = readline(fp)) != (char *)-1) {
  1164. X    spr = ptr[0];
  1165. X    for (j=0; j<SPRHEIGHT; j++) {
  1166. X        ptr = readline(fp);
  1167. X        for (i=0; i<SPRWIDTH; i++)
  1168. X        sprite[spr][j][i] = ptr[i];
  1169. X    }
  1170. X    }
  1171. X}
  1172. X
  1173. Xread_sprdata() {
  1174. X    FILE *fp;
  1175. X    int i;
  1176. X    char *ptr;
  1177. X    struct coll *c, *c2;
  1178. X
  1179. X    for (i=0; i<256; i++) {
  1180. X    if (c = sprdata[i]) {
  1181. X        do {
  1182. X        c2 = c->next;
  1183. X        free(c->dirs);
  1184. X        free(c->coll);
  1185. X        free(c);
  1186. X        c = c2;
  1187. X        } while (c);
  1188. X    }
  1189. X    sprdata[i]=0;
  1190. X    }
  1191. X    if ((fp = fopen(data_file,"r")) == NULL)
  1192. X    return -2;
  1193. X    walkable = strdup(readline(fp));
  1194. X    pushable = strdup(readline(fp));
  1195. X    while ((ptr = readline(fp)) != (char *)-1) {
  1196. X    if (sprdata[ptr[0]]) {
  1197. X        c = (struct coll *)malloc(sizeof(struct coll));
  1198. X        c->next = sprdata[ptr[0]];
  1199. X        sprdata[ptr[0]] = c;
  1200. X    } else {
  1201. X        c = sprdata[ptr[0]] = (struct coll *)malloc(sizeof(struct coll));
  1202. X        c->next = 0;
  1203. X    }
  1204. X    sscanf(ptr+8,"%d",&(c->score));
  1205. X    *(ptr+8)=0;c->dirs = strdup(ptr+4);
  1206. X    *(ptr+4)=0;c->coll = strdup(ptr+1);
  1207. X    }
  1208. X}
  1209. END_OF_FILE
  1210. if test 2365 -ne `wc -c <'files.c'`; then
  1211.     echo shar: \"'files.c'\" unpacked with wrong size!
  1212. fi
  1213. # end of 'files.c'
  1214. fi
  1215. if test -f 'main.c' -a "${1}" != "-c" ; then 
  1216.   echo shar: Will not clobber existing file \"'main.c'\"
  1217. else
  1218. echo shar: Extracting \"'main.c'\" \(4556 characters\)
  1219. sed "s/^X//" >'main.c' <<'END_OF_FILE'
  1220. X#include <signal.h>
  1221. X#include <errno.h>
  1222. X#include <curses.h>
  1223. X#include <string.h>
  1224. X#include "thricken.h"
  1225. X#include "extern.h"
  1226. X
  1227. Xextern int draw_sprite(WINDOW *w, int y,int x,char spr);
  1228. Xextern WINDOW *gw,*sw,*lw;
  1229. X
  1230. Xvoid init();
  1231. Xchar query_map(char y, char x);
  1232. Xchar face[] = "<v^>";
  1233. Xchar keys[] = "hjkl";
  1234. X/* short cut for setting up n1 & n2 */
  1235. Xchar zdir[] = {-1,0,0,1,-1,0};
  1236. X
  1237. Xchar xs,ys;
  1238. X
  1239. Xmain(int argc, char **argv) {
  1240. X    char c,level=-1;
  1241. X
  1242. X    extern char *optarg;
  1243. X
  1244. X    chdir(LIBDIR);
  1245. X
  1246. X    /* initialise variables */
  1247. X    score = moves = 0;
  1248. X    level=-1;
  1249. X
  1250. X    while ((c = getopt(argc,argv,"d:l:-s")) != -1)
  1251. X    switch(c) {
  1252. X    case 'd':
  1253. X        if (chdir(optarg)) {
  1254. X        perror(optarg);
  1255. X        exit(1);
  1256. X        }
  1257. X        break;
  1258. X    case 'l':
  1259. X        level=atoi(optarg);
  1260. X        break;
  1261. X    case 's':
  1262. X        display_scores();
  1263. X        exit(1);
  1264. X    case '?':
  1265. X        fprintf(stderr,"Usage: %s [-d directory] [-l level number]\n",
  1266. X            argv[0]);
  1267. X        exit(1);
  1268. X        break;
  1269. X    }
  1270. X    /* Remember the level we started the game on.
  1271. X     * This is used in the scoreboard routines to determine if we started
  1272. X     * on one of the levels we've done before.
  1273. X     */
  1274. X    if (level == -1) {
  1275. X    struct scored *s;
  1276. X    s = find_level(getuid());
  1277. X    level = s->level;
  1278. X    moves = s->moves;
  1279. X    }
  1280. X    startlevel = level;
  1281. X    play_game(level,moves);
  1282. X}
  1283. X
  1284. Xplay_game(char startl,int moves) {
  1285. X    char c,t1,t2,t3,t4;
  1286. X    char dir;
  1287. X
  1288. X    init_display();
  1289. X    level = startl;
  1290. X    do {
  1291. X    llevel = level;
  1292. X    lscore = score;
  1293. X    lmoves = moves;
  1294. X    if (load_level(level) == -1) {
  1295. X        nocbreak();
  1296. X        echo();
  1297. X        endwin();
  1298. X        puts("No such level");
  1299. X        exit(1);
  1300. X    }
  1301. X    save_map();
  1302. X    dir = 1;
  1303. X    draw_stats(level);
  1304. X    do {
  1305. X        t1 = (y/(SCRHEIGHT-2))*(SCRHEIGHT-2);
  1306. X        t2 = (x/(SCRWIDTH-2))*(SCRWIDTH-2);
  1307. X        t3 = SPRHEIGHT*(y%(SCRHEIGHT-2)+1);
  1308. X        t4 = SPRWIDTH*(x%(SCRWIDTH-2)+1);
  1309. X        draw_map(t1,t2);
  1310. X        draw_you(t3,t4, face[dir]);
  1311. X        update_wins();
  1312. X
  1313. X        switch(c = getchar()) {
  1314. X        case 'h':
  1315. X        case 'j':
  1316. X        case 'k':
  1317. X        case 'l':
  1318. X        moves++;
  1319. X        dir = (char)(strchr(keys,c)-keys);
  1320. X        move_dir(dir, c);
  1321. X        break;
  1322. X        case 's':
  1323. X        moves++;
  1324. X        save_map();
  1325. X        break;
  1326. X        case 'r':
  1327. X        restore_map();
  1328. X        moves++;
  1329. X        break;
  1330. X        case 'q':
  1331. X        kill(getpid(),SIGINT);
  1332. X        break;
  1333. X        }
  1334. X    } while (diamonds);
  1335. X    update_wins();
  1336. X    level++;
  1337. X    } while (1);
  1338. X}
  1339. X
  1340. Xmove_dir(char dir,char key) {
  1341. X    char n1,n2,bang;
  1342. X    char nx,ny,mx,my;
  1343. X    struct coll *c;
  1344. X
  1345. X    n1 = query_map(y+zdir[dir+2],x+zdir[dir]);
  1346. X    n2 = query_map(y+zdir[dir+2]*2,x+zdir[dir]*2);
  1347. X    nx = (x+zdir[dir]+cols)%cols;
  1348. X    mx = (x+zdir[dir]*2+cols)%cols;
  1349. X    ny = (y+zdir[dir+2]+rows)%rows;
  1350. X    my = (y+zdir[dir+2]*2+rows)%rows;
  1351. X    
  1352. X    /* now do the checking of valid moves & their actions */
  1353. X    if (n1 == 'd') {
  1354. X    set_map(ny,nx,' ');
  1355. X    diamonds--;
  1356. X    score+=10;
  1357. X    x = nx, y = ny;
  1358. X    }
  1359. X    bang = 0;
  1360. X    if (sprdata[n1]) {
  1361. X    c = sprdata[n1];
  1362. X    do {
  1363. X        /* if square is in our collision list
  1364. X         * or if coll is '*' (any sprite)
  1365. X         * or if coll is 'x' and ob is pushable
  1366. X         * or if coll is 'X' and ob is not walkable
  1367. X         * and we hit in the right direction
  1368. X         * then....
  1369. X         */
  1370. X        if ((n2 == *(c->coll) ||
  1371. X                   *(c->coll) == '*' ||
  1372. X                       (*(c->coll) == 'x' && strchr(pushable,n2)) ||
  1373. X                       (*(c->coll) == 'X' && !strchr(walkable,n2))
  1374. X                   ) && strchr(c->dirs,key)) {
  1375. X        set_map(ny,nx,c->coll[1]);
  1376. X        set_map(my,mx,c->coll[2]);
  1377. X        score += c->score;
  1378. X        if (strchr(walkable,c->coll[1]))
  1379. X            x = nx, y = ny;
  1380. X        bang = 1;
  1381. X        }
  1382. X    } while (c = c->next);
  1383. X    }
  1384. X    if (strchr(pushable,n1) && bang == 0 && strchr(walkable,n2)) {
  1385. X    set_map(ny,nx,' ');
  1386. X    set_map(my,mx,n1);
  1387. X    x = nx, y = ny;
  1388. X    }
  1389. X    if (strchr(walkable,query_map(ny,nx)))
  1390. X    x = nx, y = ny;
  1391. X}
  1392. X
  1393. X/* could do this as a #define I suppose  - it'd be quicker anyway */
  1394. Xchar query_map(char y, char x) {
  1395. X    return map[(y+rows+1)%rows][(x+cols+1)%cols];
  1396. X}
  1397. X
  1398. Xset_map(char y, char x, char p) {
  1399. X    map[(y+rows+1)%rows][(x+cols+1)%cols]=p;
  1400. X}
  1401. X
  1402. Xsave_map() {
  1403. X    int i;
  1404. X
  1405. X    for (i=0; i<100; i++) {
  1406. X    if (oldpos.map[i]) {
  1407. X        free(oldpos.map[i]);
  1408. X        oldpos.map[i] = 0;
  1409. X    }
  1410. X    if (map[i])
  1411. X        oldpos.map[i] = strdup(map[i]);
  1412. X    }
  1413. X    oldpos.score = score;
  1414. X    oldpos.level = level;
  1415. X    oldpos.diamonds = diamonds;
  1416. X    oldpos.moves = moves;
  1417. X    oldpos.x = x;
  1418. X    oldpos.y = y;
  1419. X}
  1420. X
  1421. Xrestore_map() {
  1422. X    int i;
  1423. X
  1424. X    for (i=0; i<100; i++) {
  1425. X    if (map[i]) {
  1426. X        free(map[i]);
  1427. X        map[i] = 0;
  1428. X    }
  1429. X    if (oldpos.map[i])
  1430. X        map[i] = strdup(oldpos.map[i]);
  1431. X    }
  1432. X    score = oldpos.score;
  1433. X    level = oldpos.level;
  1434. X    diamonds = oldpos.diamonds;
  1435. X    moves = oldpos.moves;
  1436. X    x = oldpos.x;
  1437. X    y = oldpos.y;
  1438. X
  1439. X}
  1440. END_OF_FILE
  1441. if test 4556 -ne `wc -c <'main.c'`; then
  1442.     echo shar: \"'main.c'\" unpacked with wrong size!
  1443. fi
  1444. # end of 'main.c'
  1445. fi
  1446. if test -f 'scores.c' -a "${1}" != "-c" ; then 
  1447.   echo shar: Will not clobber existing file \"'scores.c'\"
  1448. else
  1449. echo shar: Extracting \"'scores.c'\" \(3602 characters\)
  1450. sed "s/^X//" >'scores.c' <<'END_OF_FILE'
  1451. X#include <string.h>
  1452. X#include <stdlib.h>
  1453. X#include <stdio.h>
  1454. X#include <pwd.h>
  1455. X#include "extern.h"
  1456. X#include "thricken.h"
  1457. X
  1458. X#define SCWIDTH 57
  1459. X
  1460. X/*
  1461. X * not really a score file at the moment - but merely a list of how far
  1462. X * each player has got
  1463. X */
  1464. X
  1465. Xstruct score {
  1466. X    char user[8];
  1467. X    int score,moves,level;
  1468. X    char name[27];
  1469. X};
  1470. X
  1471. Xstruct score *read_entry(FILE *fp);
  1472. XFILE *open_scores(FILE *fp,char *mode);
  1473. Xvoid close_scores(FILE *fp);
  1474. X
  1475. Xvoid write_score() {
  1476. X    char *ptr1,*ptr2;
  1477. X    struct score *entry;
  1478. X    struct passwd *p;
  1479. X    int l;
  1480. X    FILE *fp;
  1481. X
  1482. X    if (llevel == 0) {
  1483. X    /* no need to bother saving anything as we didn't get anywhere */
  1484. X    return;
  1485. X    }
  1486. X
  1487. X    p=getpwuid(getuid());
  1488. X    l = find_level(getuid())->level;
  1489. X
  1490. X    /* if we cheated and started on a higher level then stop here */
  1491. X    if (l < startlevel) {
  1492. X    return;
  1493. X    }
  1494. X
  1495. X    if ((fp = open_scores(fp,"r+")) == NULL) {
  1496. X    return;
  1497. X    }
  1498. X    /* if we don't have an entry in the score file, then go to the end */
  1499. X    if (l == 0) {
  1500. X    /* offset of 0 from end-of-file (2) */
  1501. X    fseek(fp,0,2);
  1502. X    } else {
  1503. X    /* need to scan through score file looking for our entry */
  1504. X    do {
  1505. X        entry = read_entry(fp);
  1506. X    } while (entry && strcmp(entry->user,p->pw_name));
  1507. X    /* now skip back by one entry so when we write another it'll overwrite
  1508. X     * our existing entry. 
  1509. X     */
  1510. X    fseek(fp,-SCWIDTH,1);
  1511. X    }
  1512. X
  1513. X    /* now we need to write data to fp */
  1514. X    if (fprintf(fp,"%-8s %06d %06d %06d %-26s\n",
  1515. X        ptr2=getpwuid(getuid())->pw_name,
  1516. X        lscore,lmoves,llevel,
  1517. X        (ptr1=getenv("NAME"))?ptr1:ptr2) == EOF) {
  1518. X    fprintf(stderr,"No data written\n");
  1519. X    }
  1520. X    close_scores(fp);
  1521. X}
  1522. X
  1523. X/* opens the score file with some locking etc builtin.
  1524. X * see also close_scores
  1525. X */
  1526. XFILE *open_scores(FILE *fp,char *mode) {
  1527. X    if ((fp = fopen(SCOREFILE,mode)) == NULL) {
  1528. X    puts("No high scores yet.");
  1529. X    return (FILE *)0;
  1530. X    }
  1531. X    return fp;
  1532. X}
  1533. X
  1534. Xvoid close_scores(FILE *fp) {
  1535. X    fclose(fp);
  1536. X}
  1537. X
  1538. Xvoid display_scores() {
  1539. X    FILE *fp;
  1540. X    struct score *entry;
  1541. X    int rank=0;
  1542. X
  1543. X    if ((fp = open_scores(fp,"r")) == NULL) {
  1544. X    return;
  1545. X    }
  1546. X    puts("+------+----------------------------+----------+--------+--------+--------+");
  1547. X    puts("| Rank | Name                       | Usercode | Level  | Score  | Moves  |");
  1548. X    puts("+------+----------------------------+----------+--------+--------+--------+");
  1549. X    while (entry = read_entry(fp))
  1550. X    /* Rank | Name | Code | Level | Score | Moves */
  1551. X    printf("| %4d | %-26s | %-8s | %06d | %06d | %06d |\n",
  1552. X           ++rank,entry->name, entry->user, entry->level,
  1553. X           entry->score,entry->moves);
  1554. X    puts("+------+----------------------------+----------+--------+--------+--------+");
  1555. X    close_scores(fp);
  1556. X}
  1557. X
  1558. Xstruct scored *find_level(int uid) {
  1559. X    FILE *fp;
  1560. X    struct score *entry;
  1561. X    struct passwd *p;
  1562. X    static struct scored ret;
  1563. X
  1564. X    if ((fp = open_scores(fp,"r")) == NULL) {
  1565. X    return;
  1566. X    }
  1567. X    p=getpwuid(uid);
  1568. X    do {
  1569. X    entry = read_entry(fp);
  1570. X    } while (entry && strcmp(entry->user,p->pw_name));
  1571. X    if (entry) {
  1572. X    ret.level = entry->level;
  1573. X    ret.moves = entry->moves;
  1574. X    } else {
  1575. X    ret.level = 0;
  1576. X    ret.moves = 0;
  1577. X    }
  1578. X    close_scores(fp);
  1579. X    return &ret;
  1580. X}
  1581. X
  1582. Xstruct score *read_entry(FILE *fp) {
  1583. X    char *ptr,*tmp;
  1584. X    static struct score entry;
  1585. X
  1586. X    if ((ptr = readline(fp)) == (char *)-1)
  1587. X    return (struct score *)0;
  1588. X    *(ptr+8)='\0';
  1589. X    if (tmp = strchr(ptr,' '))
  1590. X    *tmp='\0';
  1591. X    strcpy(entry.user,ptr);
  1592. X    ptr+=9;
  1593. X    *(ptr+6)='\0';
  1594. X    entry.score = atoi(ptr);
  1595. X    ptr+=7;
  1596. X    *(ptr+6)='\0';
  1597. X    entry.moves = atoi(ptr);
  1598. X    ptr+=7;
  1599. X    *(ptr+6)='\0';
  1600. X    entry.level = atoi(ptr);
  1601. X    ptr+=7;
  1602. X    strcpy(entry.name,ptr);
  1603. X    return &entry;
  1604. X}
  1605. END_OF_FILE
  1606. if test 3602 -ne `wc -c <'scores.c'`; then
  1607.     echo shar: \"'scores.c'\" unpacked with wrong size!
  1608. fi
  1609. # end of 'scores.c'
  1610. fi
  1611. if test -f 'screen.c' -a "${1}" != "-c" ; then 
  1612.   echo shar: Will not clobber existing file \"'screen.c'\"
  1613. else
  1614. echo shar: Extracting \"'screen.c'\" \(2569 characters\)
  1615. sed "s/^X//" >'screen.c' <<'END_OF_FILE'
  1616. X#include <signal.h>
  1617. X#include <fcntl.h>
  1618. X#include <curses.h>
  1619. X#include "extern.h"
  1620. X#include "thricken.h"
  1621. X
  1622. XWINDOW *gw,*sw,*lw;
  1623. Xchar *init_file = "screen";
  1624. X
  1625. Xvoid myerror(char *error);
  1626. Xvoid stop();
  1627. Xvoid refresh3();
  1628. X
  1629. Xvoid cleanup() {
  1630. X    nocbreak();
  1631. X    echo();
  1632. X    endwin();
  1633. X    write_score();
  1634. X    exit(0);
  1635. X}
  1636. X
  1637. Xvoid init_display() {
  1638. X    int i,j;
  1639. X    char *ptr,s;
  1640. X    FILE *fp;
  1641. X    initscr();
  1642. X    signal(SIGTSTP,stop);
  1643. X    signal(SIGINT,cleanup);
  1644. X    clear();
  1645. X    noecho();
  1646. X    cbreak();
  1647. X    gw = newwin(HEIGHT, WIDTH, 0,0);
  1648. X    lw = newwin(9, 79-WIDTH, 0, WIDTH+1); 
  1649. X    sw = newwin(14, 79-WIDTH, 10, WIDTH+1); 
  1650. X    
  1651. X    if ((fp = fopen(init_file,"r")) == NULL) {
  1652. X    myerror(init_file);
  1653. X    }
  1654. X    for (i=0; i<24; i++) {
  1655. X    mvwaddstr(gw,i,0,readline(fp));
  1656. X    }
  1657. X    for (i=0; i<9; i++) {
  1658. X    mvwaddstr(lw,i,0,readline(fp));
  1659. X    }
  1660. X    for (i=0; i<14; i++) {
  1661. X    mvwaddstr(sw,i,0,readline(fp));
  1662. X    }
  1663. X    fclose(fp);
  1664. X}
  1665. X
  1666. Xvoid myerror(char *e) {
  1667. X    nocbreak();
  1668. X    echo();
  1669. X    endwin();
  1670. X    perror(e);
  1671. X    sleep(2);
  1672. X    exit(1);
  1673. X}
  1674. X
  1675. Xdraw_sprite(WINDOW *w, int y, int x, char spr) {
  1676. X    int i,j;
  1677. X
  1678. X    for (j=0; j<SPRHEIGHT; j++)
  1679. X    for (i=0; i<SPRWIDTH; i++)
  1680. X        mvwaddch(w,y+j,x+i,sprite[spr][j][i]);
  1681. X}
  1682. X
  1683. Xdraw_map(int y, int x) {
  1684. X    int i,j;
  1685. X
  1686. X    for (i=0; i<SCRWIDTH; i++)
  1687. X    for (j=0; j<SCRHEIGHT; j++) {
  1688. X        draw_sprite(gw, j*SPRHEIGHT, i*SPRWIDTH,
  1689. X            map[(y+j+rows)%rows][(x+i+cols)%cols]);
  1690. X    }
  1691. X}
  1692. X
  1693. Xvoid draw_you(char y, char x, char c) {
  1694. X    draw_sprite(gw, y, x, c);
  1695. X}
  1696. X
  1697. Xvoid draw_stats(char level) {
  1698. X    char buf[75-WIDTH];
  1699. X    char tmp;
  1700. X    
  1701. X    mvwprintw(sw,3,8,"%06d",level);
  1702. X    draw_sprite(sw,3,20,'d');
  1703. X    strncpy(buf,lname,74-WIDTH);
  1704. X    if ((tmp=strlen(lname)) < 74-WIDTH)
  1705. X    strncpy(buf+tmp,"                        \0",74-WIDTH-tmp);
  1706. X    buf[26]='\0';
  1707. X    mvwprintw(sw,1,3,"%s",buf);
  1708. X    strncpy(buf,author,74-WIDTH);
  1709. X    if ((tmp=strlen(author)) < 74-WIDTH)
  1710. X    strncpy(buf+tmp,"                        \0",74-WIDTH-tmp);
  1711. X    buf[25]='\0';
  1712. X    mvwprintw(sw,11,4,"%s",buf);
  1713. X    strncpy(buf,dname,74-WIDTH);
  1714. X    if ((tmp=strlen(dname)) < 74-WIDTH)
  1715. X    strncpy(buf+tmp,":                       \0",74-WIDTH-tmp);
  1716. X    buf[11]='\0';
  1717. X    mvwprintw(sw,7,17,"%s",buf);
  1718. X}
  1719. X
  1720. Xvoid update_wins() {
  1721. X    mvwprintw(sw,5,8,"%06d",score);
  1722. X    mvwprintw(sw,7,8,"%06d",moves);
  1723. X    mvwprintw(sw,8,19,"%06d",diamonds);
  1724. X    refresh3();
  1725. X}
  1726. X
  1727. Xvoid refresh3() {
  1728. X    wrefresh(gw);
  1729. X    wrefresh(sw);
  1730. X    wrefresh(lw);
  1731. X}
  1732. X
  1733. Xvoid refresh_all() {
  1734. X    clearok(curscr,TRUE);
  1735. X    wrefresh(curscr);
  1736. X}
  1737. X    
  1738. Xvoid stop() {
  1739. X    nocbreak();
  1740. X    echo();
  1741. X    kill(getpid(),SIGSTOP);
  1742. X    noecho();
  1743. X    cbreak();
  1744. X    refresh_all();
  1745. X}
  1746. END_OF_FILE
  1747. if test 2569 -ne `wc -c <'screen.c'`; then
  1748.     echo shar: \"'screen.c'\" unpacked with wrong size!
  1749. fi
  1750. # end of 'screen.c'
  1751. fi
  1752. if test -f 'thricken.6' -a "${1}" != "-c" ; then 
  1753.   echo shar: Will not clobber existing file \"'thricken.6'\"
  1754. else
  1755. echo shar: Extracting \"'thricken.6'\" \(7469 characters\)
  1756. sed "s/^X//" >'thricken.6' <<'END_OF_FILE'
  1757. X.TH THRICKEN 6 "9th April 1992"
  1758. X.SH NAME
  1759. Xthricken \- a multiscreen collect-the-objects style game
  1760. X.SH SYNOPSIS
  1761. X.I thricken
  1762. X[-l level_num ] [ -d directory ]
  1763. X.SH DESCRIPTION
  1764. X.I thricken
  1765. Xis designed to be a flexible game whereby the actual game strategies may vary
  1766. Xsubstantially from level to level. Each level can have it's own set of
  1767. Xsprites, it's own map, and it's own list of interactions between the sprites.
  1768. XAlthough the basic aim of each level is always the same - to collect all the
  1769. X'collectable' items (such as diamonds or bearings). The current item to
  1770. Xcollect is displayed in the panel on the right hand side of the screen. Also
  1771. Xin this window is the current number of items needed to collect before the
  1772. Xlevel is finished, the current score, the current number of moves, and the
  1773. Xcurrent level number.
  1774. X.sp
  1775. XYou may start on any level you wish by using the
  1776. X.I -l level_num
  1777. Xoption. If you attempt to start on a non existant level you will be told it
  1778. Xdoes not exist. This also happens when you finish the last level as there is
  1779. Xcurrently no 'end game' sequence. If you do not give the level number as an
  1780. Xoption then the game should automatically place you on the highest level you
  1781. Xhave reached so far. Note that you cannot (well, shouldn't) be able to fool
  1782. Xthe game into thinking you've completed the first 5 levels by starting on
  1783. Xlevel 5. Level 0 is the first level.
  1784. X.sp
  1785. XShould you wish to give the game a different feel when using a different set
  1786. Xof sprites and rules you may specify a directory as an argument using the
  1787. X.I -d directory
  1788. Xoption. This allows for the same program to utilise a different score (more
  1789. Xreally like a 'position') file, a different logo, and to some extent a
  1790. Xdifferent panel style. This is also a very useful feature should you wish to
  1791. Xdesign and play your own set of screens.
  1792. X.sp
  1793. XTo design your own screens for the game is relatively simple. In you \fBlib\fP
  1794. Xdirectory you *must* have files called \fIscreen\fP and \fIscore\fP. Any
  1795. Xlevels you write should be saved as the level number (two digits) followed by
  1796. X'level'. For instance, \fB00level\fP and \fB99level\fP. Each level file in
  1797. Xturn will reference a sprite file and a collisions file. These filenames are
  1798. Xspecified by the user.
  1799. X.sp
  1800. XThe format of a level file is as follows:
  1801. X.ta 1i
  1802. X.nf
  1803. Xline 1    : sprite filename
  1804. Xline 2    : collisions filename
  1805. Xline 3    : map height
  1806. Xline 4    : map width
  1807. Xline 5    : start x coord (top left of map is 0 0)
  1808. Xline 6    : start y coord
  1809. Xline 7    : no. of diamonds (collectables) needed to finish the level
  1810. Xthen    : map data (`height` lines)
  1811. Xend-2    : name of diamonds (collectables)
  1812. Xend-1    : name of screen
  1813. Xend    : author of level
  1814. X.fi
  1815. X.sp
  1816. XThe map data itself is just a matrix of ASCII characters. A few characters are
  1817. Xreserved and there meaning should not be changed.
  1818. X.br
  1819. X\fId\fP is always a diamond, and is the only collectable sprite
  1820. X.br
  1821. X\fI<space>\fP is always a background (walkable) sprite.
  1822. X.br
  1823. X\fI<\fP, \fIv\fP, \fI^\fP, \fI>\fP are the sprites for you facing left, down,
  1824. Xup and right respectively.
  1825. X.sp
  1826. XThe sprite data format is simpler to understand. It consists of a list of
  1827. Xsprite characters and data. Each character used on the map (such as 'you')
  1828. Xneeds to be defined in this file. Each sprite entry consists of one line for
  1829. Xthe sprite character to be used on the map, and three lines (of six characters
  1830. Xlong each) for what the sprite will look like on the screen. Care must be
  1831. Xtaken to ensure that the sprites are six characters wide. For instance, five
  1832. Xwide sprites need to be padded with a space. A snippet from an example sprite
  1833. Xfile (defining only you) is shown here:
  1834. X.sp
  1835. X.nf
  1836. X>
  1837. X /O__o
  1838. X \e\___/
  1839. X /_\e\_ 
  1840. X<
  1841. Xo__O\e\ 
  1842. X\e\___/ 
  1843. X _/_\e\ 
  1844. X^
  1845. X ^__^ 
  1846. X/----\e\ 
  1847. X_/  \e\_
  1848. Xv
  1849. X O__O 
  1850. X/----\e\ 
  1851. X_/  \e\_
  1852. X.fi
  1853. X.sp
  1854. XThe collisions file defines what happens to a sprite when you push it into
  1855. Xanother. Upon moving the game remembers the sprite directly in front of you,
  1856. Xand the sprite behind that one (which can be considered as the sprite that you
  1857. Xare trying to push the sprite directly next to you on to). To define a
  1858. Xcollision between two sprites we specify the two sprites colliding, the two
  1859. Xresultant sprites, the direction we were moving in, and the change in score.
  1860. X.sp
  1861. XThe first line of the file contains a list of sprites which can be walked
  1862. Xover, or which other sprites may be pushed over (unless a collision is defined
  1863. Xcontrary to this). This could simply be a single space on a line. The second
  1864. Xline is a list of pushable sprites - such as boulders and keys. The third
  1865. Xonwards lines define a single collision per line in the following format.
  1866. X.sp
  1867. X.nf
  1868. Xchar 1    : sprite nearest to player before collision
  1869. Xchar 2    : sprite furthest from player before collision
  1870. Xchar 3    : sprite nearest to player after collision
  1871. Xchar 4    : sprite furthest from player after collision
  1872. Xchar 5-8    : directions for which collision is valid
  1873. Xchars 9-    : decimal number for change in score
  1874. X.fi
  1875. X.sp
  1876. XA short note about the directions field (char 5-8) : There must be four
  1877. Xcharacters here. Each of the four characters corresponds to each of the four
  1878. Xdirections the player can walk in. Treat the four characters as a string. If
  1879. Xthe direction is in the string then the collision is valid. Otherwise the
  1880. Xstring must be padded with spaces upto the four character limit. For example:
  1881. X.sp
  1882. X\fIooddhjkl10\fP will turn two 'o's into two 'd's (the collectables) upon any
  1883. Xof the four directions, scoring 10 points.
  1884. X.br
  1885. X\fIhH  h   15\fP - when pusing an 'h' (eg a left key) into an 'H' (eg a left
  1886. Xdoor) from direction 'h' (left) replace both sprites with a blank (space) and
  1887. Xscore 15 points.
  1888. X.sp
  1889. XUpon a collision, if the resulting sprite directly in front of the player is a
  1890. Xwalkable sprite (or the collectable) the player is also moved forward one
  1891. Xsquare in addition to the collision being performed.
  1892. X.sp
  1893. XA few sprite names have special meaning in collisions (and so should not be
  1894. Xused on the map). They are wildcards for any sprite obeying the following
  1895. Xrules.
  1896. X.br
  1897. Xx = any non walkable sprite.
  1898. X.br
  1899. XX = any non pushable sprite.
  1900. X.br
  1901. X* = any sprite.
  1902. X.sp
  1903. XHence '\fIGXdh  l-5\fP' would be a sprite G which can turn any pushable sprite
  1904. Xinto a diamond (scoring -5 points), but only on directions left and right.
  1905. X.SH FILES
  1906. X.ta 2i
  1907. X.br
  1908. X.I LIBDIR/xxlevel    - The level files (00level to 99level)
  1909. X.br
  1910. X.I LIBDIR/scores    - The 'score' table
  1911. X.br
  1912. X.I LIBDIR/screen    - The initial screen and panel layout
  1913. X.br
  1914. Xwhere LIBDIR is usually /usr/games/lib/thricken.
  1915. X.SH AUTHOR
  1916. X.I thricken
  1917. Xwas written by James 'Rince' Bonfield. He can be contacted via email at
  1918. X'rince@dcs.warwick.ac.uk' (currently - not sure how long this shall last).
  1919. X.SH BUGS
  1920. XNo checks for relative pathnames are done within the level files. This means
  1921. Xthat there may be potential security problems if the game is installed setuid
  1922. Xor setgid. I would not recommend it.
  1923. X.sp
  1924. XThe score table is not really a score table. It can be examined using the
  1925. X\fI-s\fP option, but this is not a wise thing to take note of. It is a classic
  1926. Xexample of something started and never finished. The current state of the
  1927. Xscore table is simply to keep a record of whom has played up to which level
  1928. X(and not 100% bug free in that bit either). The rank of a player is not
  1929. Xcomputed. 
  1930. X.sp
  1931. XThe game concepts and ideas have already been junked in preference for a
  1932. Xbetter method. This was one reason for so little time being devoted to this
  1933. Xgame. I would like to see any new screens anyone produces, but I am not likely
  1934. Xto fix any bugs as I view it as a terminated project. Feel free to fix them
  1935. Xyourselves :-)
  1936. END_OF_FILE
  1937. if test 7469 -ne `wc -c <'thricken.6'`; then
  1938.     echo shar: \"'thricken.6'\" unpacked with wrong size!
  1939. fi
  1940. # end of 'thricken.6'
  1941. fi
  1942. if test -f 'thricken.h' -a "${1}" != "-c" ; then 
  1943.   echo shar: Will not clobber existing file \"'thricken.h'\"
  1944. else
  1945. echo shar: Extracting \"'thricken.h'\" \(1672 characters\)
  1946. sed "s/^X//" >'thricken.h' <<'END_OF_FILE'
  1947. X#define SCRWIDTH  8
  1948. X#define SCRHEIGHT 8
  1949. X#define SPRWIDTH  6
  1950. X#define SPRHEIGHT 3
  1951. X#define WIDTH (SPRWIDTH * SCRWIDTH)
  1952. X#define HEIGHT (SPRHEIGHT * SCRHEIGHT)
  1953. X#define SCOREFILE "scores"
  1954. X
  1955. Xchar *map[100];          /* The map array - Max 100 deep */
  1956. Xchar rows,cols;          /* of size rows x cols */
  1957. Xchar x,y;                /* Your start coordinates */
  1958. Xshort diamonds;          /* Number of diamonds left to collect */
  1959. Xchar sprite[256][SPRHEIGHT][SPRWIDTH];
  1960. Xint score, moves, level;
  1961. X                         /* copies of vars that are copied at the start of
  1962. X              * each level - used for saving the game as we can
  1963. X              * only save at the start of a new level
  1964. X              */
  1965. Xint startlevel;          /* level we started the game on */
  1966. Xint lscore, lmoves, llevel;
  1967. X                         /* sprites that can be walked over or pushed */
  1968. Xchar *pushable, *walkable;
  1969. X
  1970. Xstruct coll {
  1971. X    char *coll;          /* change of map data for collision */
  1972. X    char *dirs;          /* list of directions for valid collision */
  1973. X    int score;           /* change in score */
  1974. X    struct coll *next;   /* next collision info */
  1975. X};
  1976. Xstruct coll *sprdata[256];      /* table of collision for sprites */
  1977. X
  1978. Xchar *dname;          /* name of item to collect (diamond) */
  1979. Xchar *lname;          /* level name */
  1980. Xchar *author;         /* author of level */
  1981. X
  1982. Xstruct saved {
  1983. X    char *map[100];          /* The map array - Max 100 deep */
  1984. X    char x,y;                /* Your start coordinates */
  1985. X    short diamonds;          /* Number of diamonds left to collect */
  1986. X    int score, moves, level;
  1987. X};
  1988. X
  1989. Xstruct saved oldpos;
  1990. X
  1991. X/* structure to read from high score file */
  1992. Xstruct scored {
  1993. X    int level;
  1994. X    int moves;
  1995. X};
  1996. X
  1997. END_OF_FILE
  1998. if test 1672 -ne `wc -c <'thricken.h'`; then
  1999.     echo shar: \"'thricken.h'\" unpacked with wrong size!
  2000. fi
  2001. # end of 'thricken.h'
  2002. fi
  2003. echo shar: End of archive 1 \(of 1\).
  2004. cp /dev/null ark1isdone
  2005. MISSING=""
  2006. for I in 1 ; do
  2007.     if test ! -f ark${I}isdone ; then
  2008.     MISSING="${MISSING} ${I}"
  2009.     fi
  2010. done
  2011. if test "${MISSING}" = "" ; then
  2012.     echo You have the archive.
  2013.     rm -f ark[1-9]isdone
  2014. else
  2015.     echo You still need to unpack the following archives:
  2016.     echo "        " ${MISSING}
  2017. fi
  2018. ##  End of shell archive.
  2019. exit 0
  2020.