home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume16 / nethack31 / part20 < prev    next >
Internet Message Format  |  1993-02-01  |  60KB

  1. Path: uunet!news.tek.com!master!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v16i020:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part20/108
  5. Message-ID: <4308@master.CNA.TEK.COM>
  6. Date: 29 Jan 93 20:43:51 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 2308
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1577
  11.  
  12. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  13. Posting-number: Volume 16, Issue 20
  14. Archive-name: nethack31/Part20
  15. Supersedes: nethack3p9: Volume 10, Issue 46-102
  16. Environment: Amiga, Atari, Mac, MS-DOS, OS2, Unix, VMS, X11
  17.  
  18.  
  19.  
  20. #! /bin/sh
  21. # This is a shell archive.  Remove anything before this line, then unpack
  22. # it by saving it into a file and typing "sh file".  To overwrite existing
  23. # files, type "sh file -c".  You can also feed this as standard input via
  24. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  25. # will see the following message at the end:
  26. #        "End of archive 20 (of 108)."
  27. # Contents:  dat/Valkyrie.des sys/amiga/winami.c1
  28. # Wrapped by billr@saab on Wed Jan 27 16:08:53 1993
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'dat/Valkyrie.des' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'dat/Valkyrie.des'\"
  32. else
  33. echo shar: Extracting \"'dat/Valkyrie.des'\" \(10123 characters\)
  34. sed "s/^X//" >'dat/Valkyrie.des' <<'END_OF_FILE'
  35. X#    SCCS Id: @(#)Valkyrie.des    3.1    91/09/30
  36. X#    Copyright (c) 1989 by Jean-Christophe Collet
  37. X#    Copyright (c) 1991-2 by M. Stephenson
  38. X# NetHack may be freely redistributed.  See license for details.
  39. X#
  40. X#    The "start" level for the quest.
  41. X#
  42. X#    Here you meet your (besieged) class leader, the Norn,
  43. X#    and receive your quest assignment.
  44. X#
  45. XMAZE: "V-start",' '
  46. XFLAGS: noteleport,hardfloor
  47. XGEOMETRY:center,center
  48. XMAP
  49. XIIIIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
  50. XIIIIPPPPPIIIIIIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...IIIIIIIIIIIIIIIIIIIII
  51. XIIIIPLLPPIIIIIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII..{..IIIIIIIIIIIIIIIIIIII
  52. XIIIIPLPPIIIIIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.....IIIIIIPPPIIIIIIIIII
  53. XIIIPPPPPIIIIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.IIIIIPPLPIIIIIIIIII
  54. XIIIIPIIIIIIII..IIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.IIIIIPLPPIIIIIIIIII
  55. XIIIIIIIIIIII..IIIIIPLPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII..IIIIIPPPIIIIIIIIIII
  56. XIIIIIIII.....IIIIIIPPPIIII|----------------|IIIIIPPPIII.IIIIIIIIIIIIIIIIIIII
  57. XIIIIIII..III...IIIIIIIIIII|................|IIIIIPLPII..IIIIIIIIIIIIIIIIIIII
  58. XIIIIII..IIIIII......IIIII.|................|.IIIIPPPII.IIIIIIIIIIIIIIIIIIIII
  59. XIIIII..IIIIIIIIIIII.......+................+...IIIIIII.IIIIIIIIIIIIIIIIIIIII
  60. XIIII..IIIIIIIII.....IIIII.|................|.I...IIIII.IIIIIIIIIIIIIIIIIIIII
  61. XIII..IIIIIIIII..IIIIIIIIII|................|IIII.......IIIIIIIIIIIIIIIIIIIII
  62. XIIII..IIIIIII..IIIIIIIIIII|----------------|IIIIIIIIII...IIIIIIIIIIIIIIIIIII
  63. XIIIIII..IIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPPPPIIII...IIIIIIIIIIIIIIIII
  64. XIIIIIII......IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPLLPPIIIII...IIIIIIIIIIIIIII
  65. XIIIIPPPIP...IIIIIIIIIIIPIIIIIIIIIIIIIIIIIIIIIIIIPPPPIIIIIIII...I......IIIIII
  66. XIIIPPLPPIIIIIIIIIIIIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.........IIIII
  67. XIIIIPPPIIIIIIIIIIIIIIPPLPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.......IIIIII
  68. XIIIIIIIIIIIIIIIIIIIIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
  69. XENDMAP
  70. X# Random Monsters
  71. XRANDOM_MONSTERS: 'a', 'H'
  72. X# Dungeon Description
  73. XREGION:(00,00,75,19),lit,"ordinary"
  74. XREGION:(27,08,42,12),lit,"ordinary"
  75. X# Portal arrival point
  76. XBRANCH:(66,17,66,17),(0,0,0,0)
  77. X# Stairs
  78. XSTAIR:(18,01),down
  79. X# Doors
  80. XDOOR:locked,(26,10)
  81. XDOOR:locked,(43,10)
  82. X# Norn
  83. XMONSTER:'@',"Norn",(35,10)
  84. X# The treasure of the Norn
  85. XOBJECT:'(',"chest",(36,10)
  86. X# valkyrie guards for the audience chamber
  87. XMONSTER:'@',"warrior",(27,08)
  88. XMONSTER:'@',"warrior",(27,09)
  89. XMONSTER:'@',"warrior",(27,11)
  90. XMONSTER:'@',"warrior",(27,12)
  91. XMONSTER:'@',"warrior",(42,08)
  92. XMONSTER:'@',"warrior",(42,09)
  93. XMONSTER:'@',"warrior",(42,11)
  94. XMONSTER:'@',"warrior",(42,12)
  95. X# Non diggable walls
  96. XNON_DIGGABLE:(26,07,43,13)
  97. X# Random traps
  98. XTRAP:"fire",random
  99. XTRAP:"fire",random
  100. XTRAP:"fire",random
  101. XTRAP:"fire",random
  102. XTRAP:"fire",random
  103. XTRAP:"fire",random
  104. X# Monsters on siege duty.
  105. XMONSTER: 'a',"fire ant",(04,12)
  106. XMONSTER: 'a',"fire ant",(08,08)
  107. XMONSTER: 'a',"fire ant",(14,04)
  108. XMONSTER: 'a',"fire ant",(17,11)
  109. XMONSTER: 'a',"fire ant",(24,10)
  110. XMONSTER: 'a',"fire ant",(45,10)
  111. XMONSTER: 'a',"fire ant",(54,02)
  112. XMONSTER: 'a',"fire ant",(55,07)
  113. XMONSTER: 'a',"fire ant",(58,14)
  114. XMONSTER: 'a',"fire ant",(63,17)
  115. XMONSTER: 'H',"fire giant",(18,01),hostile
  116. XMONSTER: 'H',"fire giant",(10,16),hostile
  117. X#
  118. X#    The "locate" level for the quest.
  119. X#
  120. X#    Here you have to find the cave of Surtur to go
  121. X#    further towards your assigned quest.
  122. X#
  123. X
  124. XMAZE: "V-locate",' '
  125. XFLAGS: hardfloor
  126. XINIT_MAP: '.' , 'I' , true , true , lit , false
  127. XGEOMETRY:center,center
  128. XMAP
  129. XPPPP....                      ....PPPPP.
  130. XPLP...                          .PPLLLPP
  131. XPPP    .......................    PPPLLP
  132. X..   ............................   PPPP
  133. X.  ...............................  ....
  134. X  .................................   ..
  135. X....................................   .
  136. X  ...................................   
  137. X.  ..................................  .
  138. X..   ..............................   PP
  139. X.PPP  ..........................     PLP
  140. X.PLLP                             ..PLLP
  141. X.PPPP..                         ....PPPP
  142. XENDMAP
  143. X# Random Monsters
  144. XRANDOM_MONSTERS: 'a', 'H'
  145. X# Dungeon Description
  146. XREGION:(00,00,39,12),lit,"ordinary"
  147. X# Stairs
  148. XSTAIR:(48,14),up
  149. XSTAIR:(20,06),down
  150. X# Non diggable walls
  151. XNON_DIGGABLE:(00,00,39,12)
  152. X# Objects
  153. XOBJECT:random,random,random
  154. XOBJECT:random,random,random
  155. XOBJECT:random,random,random
  156. XOBJECT:random,random,random
  157. XOBJECT:random,random,random
  158. XOBJECT:random,random,random
  159. XOBJECT:random,random,random
  160. XOBJECT:random,random,random
  161. XOBJECT:random,random,random
  162. XOBJECT:random,random,random
  163. XOBJECT:random,random,random
  164. XOBJECT:random,random,random
  165. XOBJECT:random,random,random
  166. XOBJECT:random,random,random
  167. XOBJECT:random,random,random
  168. X# Random traps
  169. XTRAP:"fire",random
  170. XTRAP:"fire",random
  171. XTRAP:"fire",random
  172. XTRAP:"fire",random
  173. XTRAP:random,random
  174. XTRAP:random,random
  175. X# Random monsters.
  176. XMONSTER:'a',"fire ant",random
  177. XMONSTER:'a',"fire ant",random
  178. XMONSTER:'a',"fire ant",random
  179. XMONSTER:'a',"fire ant",random
  180. XMONSTER:'a',"fire ant",random
  181. XMONSTER:'a',"fire ant",random
  182. XMONSTER:'a',"fire ant",random
  183. XMONSTER:'a',"fire ant",random
  184. XMONSTER:'a',"fire ant",random
  185. XMONSTER:'a',"fire ant",random
  186. XMONSTER:'a',"fire ant",random
  187. XMONSTER:'a',"fire ant",random
  188. XMONSTER:'a',"fire ant",random
  189. XMONSTER:'a',"fire ant",random
  190. XMONSTER:'a',"fire ant",random
  191. XMONSTER:'a',"fire ant",random
  192. XMONSTER:'a',"fire ant",random
  193. XMONSTER:'a',random,random
  194. XMONSTER:'H',random,random,hostile
  195. XMONSTER:'H',"fire giant",random,hostile
  196. XMONSTER:'H',"fire giant",random,hostile
  197. XMONSTER:'H',"fire giant",random,hostile
  198. XMONSTER:'H',"fire giant",random,hostile
  199. XMONSTER:'H',"fire giant",random,hostile
  200. XMONSTER:'H',"fire giant",random,hostile
  201. XMONSTER:'H',"fire giant",random,hostile
  202. XMONSTER:'H',random,random,hostile
  203. X
  204. X#
  205. X#    The "goal" level for the quest.
  206. X#
  207. X#    Here you meet Lord Surtur your nemesis monster.  You have to
  208. X#    defeat Lord Surtur in combat to gain the artifact you have
  209. X#    been assigned to retrieve.
  210. X#
  211. X
  212. XMAZE: "V-goal", 'L'
  213. XINIT_MAP: '.' , 'L' , true , true , lit , false
  214. XGEOMETRY:center,center
  215. XMAP
  216. X.L............................LLLLL
  217. XLLL.........LLLLL.LLLLL.........LLL
  218. X.LLL......LLLLLLLLLLLLLLL.......LL.
  219. X.LLL.....LLL|---------|LLL.....L...
  220. X..LL....LL|--.........--|LL.....LLL
  221. X.......LL|-...LLLLLLL...-|LL.....L.
  222. X.......LL|...LL.....LL...|LL.......
  223. X......LL|-..LL.......LL..-|LL......
  224. X......LL|.................|LL......
  225. X......LL|-..LL.......LL..-|LL......
  226. X.......LL|...LL.....LL...|LL.......
  227. X.......LL|-...LLLLLLL...-|LL.......
  228. X..L.....LL|--.........--|LL.....LL.
  229. X..LL.....LLL|---------|LLL....LLLL.
  230. X..LLL.....LLLLLLLLLLLLLLL...LLLLL..
  231. X.LLLL.......LLLLL.LLLLL.....LLLL...
  232. X..LL...............................
  233. XENDMAP
  234. X# Random Monsters
  235. XRANDOM_MONSTERS: 'a', 'H'
  236. X# Dungeon Description
  237. XREGION:(00,00,34,16),lit,"ordinary"
  238. X# Stairs
  239. X# Note:  The up stairs are *intentionally* off of the map.
  240. XSTAIR:(45,10),up
  241. X# Non diggable walls
  242. XNON_DIGGABLE:(00,00,34,16)
  243. X# Drawbridges
  244. XDRAWBRIDGE:(17,02),south,open
  245. XDRAWBRIDGE:(17,14),north,open
  246. X# Objects
  247. XOBJECT:'(',"crystal ball",(17,08),blessed,0,"The Orb of Fate"
  248. XOBJECT:random,random,random
  249. XOBJECT:random,random,random
  250. XOBJECT:random,random,random
  251. XOBJECT:random,random,random
  252. XOBJECT:random,random,random
  253. XOBJECT:random,random,random
  254. XOBJECT:random,random,random
  255. XOBJECT:random,random,random
  256. XOBJECT:random,random,random
  257. XOBJECT:random,random,random
  258. XOBJECT:random,random,random
  259. XOBJECT:random,random,random
  260. XOBJECT:random,random,random
  261. XOBJECT:random,random,random
  262. X# Random traps
  263. XTRAP:"fire",random
  264. XTRAP:"fire",random
  265. XTRAP:"fire",random
  266. XTRAP:"fire",random
  267. XTRAP:random,random
  268. XTRAP:random,random
  269. X# Random monsters.
  270. XMONSTER:'H',"Lord Surtur",(17,08)
  271. XMONSTER:'a',"fire ant",random
  272. XMONSTER:'a',"fire ant",random
  273. XMONSTER:'a',"fire ant",random
  274. XMONSTER:'a',"fire ant",random
  275. XMONSTER:'a',random,random
  276. XMONSTER:'a',random,random
  277. XMONSTER:'H',"fire giant",(10,06),hostile
  278. XMONSTER:'H',"fire giant",(10,07),hostile
  279. XMONSTER:'H',"fire giant",(10,08),hostile
  280. XMONSTER:'H',"fire giant",(10,09),hostile
  281. XMONSTER:'H',"fire giant",(10,10),hostile
  282. XMONSTER:'H',"fire giant",(24,06),hostile
  283. XMONSTER:'H',"fire giant",(24,07),hostile
  284. XMONSTER:'H',"fire giant",(24,08),hostile
  285. XMONSTER:'H',"fire giant",(24,09),hostile
  286. XMONSTER:'H',"fire giant",(24,10),hostile
  287. XMONSTER:'H',"fire giant",random,hostile
  288. XMONSTER:'H',"fire giant",random,hostile
  289. XMONSTER:'H',random,random,hostile
  290. X
  291. X#
  292. X#    The "fill" levels for the quest.
  293. X#
  294. X#    These levels are used to fill out any levels not occupied by specific
  295. X#    levels as defined above. "filla" is the upper filler, between the
  296. X#    start and locate levels, and "fillb" the lower between the locate
  297. X#    and goal levels.
  298. X#
  299. X
  300. XMAZE: "V-filla" , 'I'
  301. XINIT_MAP: '.' , 'I' , true , true , lit, false
  302. XNOMAP
  303. X#
  304. XSTAIR: random, up
  305. XSTAIR: random, down
  306. X#
  307. XOBJECT: random, random, random
  308. XOBJECT: random, random, random
  309. XOBJECT: random, random, random
  310. XOBJECT: random, random, random
  311. XOBJECT: random, random, random
  312. XOBJECT: random, random, random
  313. XOBJECT: random, random, random
  314. XOBJECT: random, random, random
  315. XOBJECT: random, random, random
  316. X#
  317. XMONSTER: 'a', "fire ant", random
  318. XMONSTER: 'a', "fire ant", random
  319. XMONSTER: 'a', "fire ant", random
  320. XMONSTER: 'a', "fire ant", random
  321. XMONSTER: 'a', "fire ant", random
  322. XMONSTER: 'a', random, random
  323. XMONSTER: 'H', "fire giant", random, hostile
  324. X#
  325. XTRAP: random, random
  326. XTRAP: random, random
  327. XTRAP: random, random
  328. XTRAP: random, random
  329. XTRAP: random, random
  330. XTRAP: random, random
  331. XTRAP: random, random
  332. X
  333. XMAZE: "V-fillb" , 'L'
  334. XINIT_MAP: '.' , 'L' , true , true , lit, false
  335. XNOMAP
  336. X#
  337. XSTAIR: random, up
  338. XSTAIR: random, down
  339. X#
  340. XOBJECT: random, random, random
  341. XOBJECT: random, random, random
  342. XOBJECT: random, random, random
  343. XOBJECT: random, random, random
  344. XOBJECT: random, random, random
  345. XOBJECT: random, random, random
  346. XOBJECT: random, random, random
  347. XOBJECT: random, random, random
  348. XOBJECT: random, random, random
  349. XOBJECT: random, random, random
  350. XOBJECT: random, random, random
  351. X#
  352. XMONSTER: 'a', "fire ant", random
  353. XMONSTER: 'a', "fire ant", random
  354. XMONSTER: 'a', "fire ant", random
  355. XMONSTER: 'a', random, random
  356. XMONSTER: 'H', "fire giant", random, hostile
  357. XMONSTER: 'H', "fire giant", random, hostile
  358. XMONSTER: 'H', "fire giant", random, hostile
  359. X#
  360. XTRAP: "fire", random
  361. XTRAP: "fire", random
  362. XTRAP: "fire", random
  363. XTRAP: "fire", random
  364. XTRAP: "fire", random
  365. XTRAP: random, random
  366. XTRAP: random, random
  367. END_OF_FILE
  368. if test 10123 -ne `wc -c <'dat/Valkyrie.des'`; then
  369.     echo shar: \"'dat/Valkyrie.des'\" unpacked with wrong size!
  370. fi
  371. # end of 'dat/Valkyrie.des'
  372. fi
  373. if test -f 'sys/amiga/winami.c1' -a "${1}" != "-c" ; then 
  374.   echo shar: Will not clobber existing file \"'sys/amiga/winami.c1'\"
  375. else
  376. echo shar: Extracting \"'sys/amiga/winami.c1'\" \(45206 characters\)
  377. sed "s/^X//" >'sys/amiga/winami.c1' <<'END_OF_FILE'
  378. X/*    SCCS Id: @(#)winami.c    3.1    93/01/07 */
  379. X/* Copyright (c) Gregg Wonderly, Naperville, Illinois,  1991,1992,1993. */
  380. X/* NetHack may be freely redistributed.  See license for details. */
  381. X
  382. X#include "hack.h"
  383. X#include "wintype.h"
  384. X#include "winami.h"
  385. X#include "func_tab.h"
  386. X
  387. X#ifdef AMIGA_INTUITION
  388. X
  389. X/* These should probably not even be options, but, I will leave them
  390. X * for now... GGW
  391. X */
  392. X
  393. X/*#define   TOPL_GETLINE    /* Don't use a window for getlin() */
  394. X/*#define   WINDOW_YN        /* Use a window for y/n questions */
  395. X
  396. X#include <exec/types.h>
  397. X#include <exec/io.h>
  398. X#include <exec/alerts.h>
  399. X#include <exec/devices.h>
  400. X#include <devices/console.h>
  401. X#include <devices/conunit.h>
  402. X#include <graphics/gfxbase.h>
  403. X#include <intuition/intuition.h>
  404. X#include <intuition/intuitionbase.h>
  405. X#include <libraries/dosextens.h>
  406. X#include <ctype.h>
  407. X#undef  strcmpi
  408. X#include <string.h>
  409. X#include <errno.h>
  410. X
  411. X#ifdef  IDCMP_CLOSEWINDOW
  412. X# define    INTUI_NEW_LOOK
  413. X#endif
  414. X
  415. X#ifdef AZTEC_C
  416. X#include <functions.h>
  417. X#else
  418. X#include <proto/dos.h>
  419. X#include <proto/exec.h>
  420. X#include <proto/console.h>
  421. X#include <proto/diskfont.h>
  422. X
  423. X/* kludge - see amirip for why */
  424. X#undef red
  425. X#undef green
  426. X#undef blue
  427. X#include <proto/graphics.h>
  428. X#ifndef __SASC_60
  429. X#undef index
  430. X# define index strchr
  431. X#endif
  432. X
  433. X#include <proto/intuition.h>
  434. X#endif
  435. X
  436. Xstatic void RandomWindow( char * );
  437. X
  438. X/* cw->data[x] contains 2 characters worth of special information.  These
  439. X * characters are stored at the offsets as described here.
  440. X */
  441. X#define VATTR      0    /* Video attribute is in this slot */
  442. X#define SEL_ITEM  1    /* If this is a select item, slot is 1 else 0 */
  443. X#define SOFF      2    /* The string starts here.  */
  444. X
  445. X/* Nethack defines NULL as ((char *)0) which is very inconvienent... */
  446. X#undef NULL
  447. X#define NULL 0L
  448. X
  449. X/*
  450. X * Versions we need of various libraries.  We can't use LIBRARY_VERSION
  451. X * as defined in <exec/types.h> because some of the libraries we need
  452. X * don't have that version number in the 1.2 ROM.
  453. X */
  454. X
  455. X#define INTUITION_VERSION    33L
  456. X#define GRAPHICS_VERSION    33L
  457. X#define DISKFONT_VERSION    34L
  458. X#define ICON_VERSION        34L
  459. X
  460. X/* These values are just sorta suggestions in use, but are minimum requirements
  461. X * in reality...
  462. X */
  463. X#define WINDOWHEIGHT    192
  464. X#define SCREENHEIGHT    200
  465. X#define WIDTH        640
  466. X
  467. X/* This character is a solid block (cursor) in Hack.font */
  468. X#define CURSOR_CHAR    0x90
  469. X
  470. X/* All we currently support is hack.font at 8x8... */
  471. X#define FONTWIDTH    8
  472. X#define FONTHEIGHT    8
  473. X#define FONTBASELINE    8
  474. X
  475. X/* If Compiling with the "New Look", redefine these now */
  476. X#ifdef  INTUI_NEW_LOOK
  477. X#define NewWindow ExtNewWindow
  478. X#define NewScreen ExtNewScreen
  479. X#endif
  480. X
  481. X/* Get the prototypes for our files */
  482. X#include "Amiga:winami.p"
  483. X#include "Amiga:amiwind.p"
  484. X#include "Amiga:amidos.p"
  485. X
  486. X/* Interface definition, for use by windows.c and winprocs.h to provide
  487. X * the intuition interface for the amiga...
  488. X */
  489. Xstruct window_procs amii_procs =
  490. X{
  491. X    "amii",
  492. X    amii_init_nhwindows,
  493. X    amii_player_selection,
  494. X    amii_askname,
  495. X    amii_get_nh_event,
  496. X    amii_exit_nhwindows,
  497. X    amii_suspend_nhwindows,
  498. X    amii_resume_nhwindows,
  499. X    amii_create_nhwindow,
  500. X    amii_clear_nhwindow,
  501. X    amii_display_nhwindow,
  502. X    amii_destroy_nhwindow,
  503. X    amii_curs,
  504. X    amii_putstr,
  505. X    amii_display_file,
  506. X    amii_start_menu,
  507. X    amii_add_menu,
  508. X    amii_end_menu,
  509. X    amii_select_menu,
  510. X    amii_update_inventory,
  511. X    amii_mark_synch,
  512. X    amii_wait_synch,
  513. X#ifdef CLIPPING
  514. X    amii_cliparound,
  515. X#endif
  516. X    amii_print_glyph,
  517. X    amii_raw_print,
  518. X    amii_raw_print_bold,
  519. X    amii_nhgetch,
  520. X    amii_nh_poskey,
  521. X    amii_bell,
  522. X    amii_doprev_message,
  523. X    amii_yn_function,
  524. X    amii_getlin,
  525. X#ifdef COM_COMPL
  526. X    amii_get_ext_cmd,
  527. X#endif /* COM_COMPL */
  528. X    amii_number_pad,
  529. X    amii_delay_output,
  530. X    /* other defs that really should go away (they're tty specific) */
  531. X    amii_delay_output,
  532. X    amii_delay_output,
  533. X};
  534. X
  535. Xextern struct GfxBase *GfxBase;
  536. Xextern struct Library *DiskfontBase;
  537. Xextern struct IntuitionBase *IntuitionBase;
  538. X
  539. X/* All kinds of shared stuff */
  540. Xextern struct TextAttr Hack80;
  541. Xextern struct Screen *HackScreen;
  542. Xextern struct Window *pr_WindowPtr;
  543. Xextern struct Menu HackMenu[];
  544. Xextern unsigned char KbdBuffered;
  545. Xextern struct TextFont *HackFont;
  546. Xextern struct IOStdReq ConsoleIO;
  547. Xextern struct Library *ConsoleDevice;
  548. Xextern struct MsgPort *HackPort;
  549. Xextern char Initialized;
  550. Xextern char toplines[BUFSZ];
  551. X
  552. Xchar morc;  /* the character typed in response to a --more-- prompt */
  553. Xchar spaces[] =
  554. X"                                                                           ";
  555. Xextern winid WIN_MESSAGE;
  556. Xextern winid WIN_MAP;
  557. Xextern winid WIN_STATUS;
  558. Xextern winid WIN_INVEN;
  559. X
  560. Xwinid WIN_BASE = WIN_ERR;
  561. X
  562. X/* Changed later during window/screen opens... */
  563. Xint txwidth=FONTWIDTH, txheight=FONTHEIGHT, txbaseline = FONTBASELINE;
  564. X
  565. X/* If a 240 or more row screen is in front when we start, this will be
  566. X * set to 1, and the windows will be given borders to allow them to be
  567. X * arranged differently.  The Message window may eventually get a scroller...
  568. X */
  569. Xint bigscreen = 0;
  570. X
  571. Xstatic void outmore(struct WinDesc *);
  572. Xstatic void outsubstr(struct WinDesc *,char *,int);
  573. Xstatic void dismiss_nhwindow(winid);
  574. X
  575. X/* This gadget data is replicated for menu/text windows... */
  576. Xstatic struct PropInfo PropScroll = { AUTOKNOB+FREEVERT,
  577. X                    0xffff,0xffff, 0xffff,0xffff, };
  578. Xstatic struct Image Image1 = { 0,0, 7,102, 0, NULL, 0x0000,0x0000, NULL };
  579. Xstatic struct Gadget MenuScroll = {
  580. X    NULL, -15,10, 15,-19, GRELRIGHT|GRELHEIGHT,
  581. X    RELVERIFY|FOLLOWMOUSE|RIGHTBORDER,
  582. X    PROPGADGET, (APTR)&Image1, NULL, NULL, NULL, (APTR)&PropScroll,
  583. X    1, NULL
  584. X};
  585. X
  586. Xint wincnt=0;   /* # of nh windows opened */
  587. X
  588. X/* We advertise a public screen to allow some people to do other things
  589. X * while they are playing...  like compiling...
  590. X */
  591. X
  592. X#ifdef  INTUI_NEW_LOOK
  593. Xstruct TagItem tags[] =
  594. X{
  595. X    { WA_PubScreenName, (ULONG)"NetHack", },
  596. X    { TAG_DONE, 0, },
  597. X};
  598. X#endif
  599. X
  600. X/*
  601. X * The default dimensions and status values for each window type.  The
  602. X * data here is generally changed in create_nhwindow(), so beware that
  603. X * what you see here may not be exactly what you get.
  604. X */
  605. Xstruct win_setup {
  606. X    struct NewWindow newwin;
  607. X    xchar offx,offy,maxrow,rows,maxcol,cols;    /* CHECK TYPES */
  608. X} new_wins[] = {
  609. X
  610. X    /* First entry not used, types are based on 1 */
  611. X    {{0}},
  612. X
  613. X    /* NHW_MESSAGE */
  614. X    {{0,1,640,11,0xff,0xff,
  615. X    RAWKEY,
  616. X    BORDERLESS|ACTIVATE|SMART_REFRESH
  617. X#ifdef  INTUI_NEW_LOOK
  618. X    |WFLG_NW_EXTENDED
  619. X#endif
  620. X    ,
  621. X    NULL,NULL,(UBYTE*)"Messages",NULL,NULL,-1,-1,0xffff,0xffff,CUSTOMSCREEN,
  622. X#ifdef  INTUI_NEW_LOOK
  623. X    tags,
  624. X#endif
  625. X    },
  626. X    0,0,1,1,80,80},
  627. X
  628. X    /* NHW_STATUS */
  629. X    {{0,181,640,24,0xff,0xff,RAWKEY|MENUPICK|DISKINSERTED,
  630. X    BORDERLESS|ACTIVATE|SMART_REFRESH
  631. X#ifdef  INTUI_NEW_LOOK
  632. X    |WFLG_NW_EXTENDED
  633. X#endif
  634. X    ,
  635. X    NULL,NULL,(UBYTE*)"Game Status",NULL,NULL,-1,-1,0xffff,0xffff,CUSTOMSCREEN,
  636. X#ifdef  INTUI_NEW_LOOK
  637. X    tags,
  638. X#endif
  639. X    },
  640. X    0,0,2,2,78,78},
  641. X
  642. X    /* NHW_MAP */
  643. X    {{0,0,WIDTH,WINDOWHEIGHT,0xff,0xff,
  644. X    RAWKEY|MENUPICK|MOUSEBUTTONS|ACTIVEWINDOW
  645. X#ifdef  INTUI_NEW_LOOK
  646. X    |WFLG_NW_EXTENDED
  647. X#endif
  648. X    ,
  649. X    BORDERLESS|ACTIVATE|SMART_REFRESH|BACKDROP,
  650. X    NULL,NULL,(UBYTE*)"Dungeon Map",NULL,NULL,-1,-1,0xffff,0xffff,CUSTOMSCREEN,
  651. X#ifdef  INTUI_NEW_LOOK
  652. X    tags,
  653. X#endif
  654. X    },
  655. X    0,0,22,22,80,80},
  656. X
  657. X    /* NHW_MENU */
  658. X    {{400,10,10,10,80,30,
  659. X    RAWKEY|MENUPICK|DISKINSERTED|MOUSEMOVE|MOUSEBUTTONS|
  660. X    GADGETUP|GADGETDOWN|CLOSEWINDOW|VANILLAKEY|NEWSIZE
  661. X#ifdef  INTUI_NEW_LOOK
  662. X    |WFLG_NW_EXTENDED
  663. X#endif
  664. X    ,
  665. X    WINDOWSIZING|WINDOWCLOSE|WINDOWDRAG|ACTIVATE|SMART_REFRESH,
  666. X    &MenuScroll,NULL,(UBYTE*)"Pick an Item",
  667. X    NULL,NULL,-1,-1,0xffff,0xffff,CUSTOMSCREEN,
  668. X#ifdef  INTUI_NEW_LOOK
  669. X    tags,
  670. X#endif
  671. X    },
  672. X    0,0,1,1,22,78},
  673. X
  674. X    /* NHW_TEXT */
  675. X    {{0,0,640,200,0xff,0xff,
  676. X    RAWKEY|MENUPICK|DISKINSERTED|MOUSEMOVE|
  677. X    GADGETUP|CLOSEWINDOW|VANILLAKEY|NEWSIZE
  678. X#ifdef  INTUI_NEW_LOOK
  679. X    |WFLG_NW_EXTENDED
  680. X#endif
  681. X    ,
  682. X    WINDOWSIZING|WINDOWCLOSE|WINDOWDRAG|ACTIVATE|SMART_REFRESH,
  683. X    &MenuScroll,NULL,(UBYTE*)NULL,NULL,NULL,-1,-1,0xffff,0xffff,CUSTOMSCREEN,
  684. X#ifdef  INTUI_NEW_LOOK
  685. X    tags,
  686. X#endif
  687. X    },
  688. X    0,0,1,1,22,78},
  689. X
  690. X    /* NHW_BASE */
  691. X    {{0,0,WIDTH,WINDOWHEIGHT,0xff,0xff,
  692. X    RAWKEY|MENUPICK|MOUSEBUTTONS
  693. X#ifdef  INTUI_NEW_LOOK
  694. X    |WFLG_NW_EXTENDED
  695. X#endif
  696. X    ,
  697. X    BORDERLESS|ACTIVATE|SMART_REFRESH|BACKDROP,
  698. X    NULL,NULL,(UBYTE*)NULL,NULL,NULL,-1,-1,0xffff,0xffff,CUSTOMSCREEN,
  699. X#ifdef  INTUI_NEW_LOOK
  700. X    tags,
  701. X#endif
  702. X    },
  703. X    0,0,22,22,80,80},
  704. X};
  705. X
  706. X/* The physical screen information */
  707. Xstruct DisplayDesc *amiIDisplay;
  708. X
  709. X/* The opened windows information */
  710. Xstruct WinDesc *wins[MAXWIN + 1];
  711. X
  712. X/* The last Window event is stored here for reference. */
  713. Xextern WEVENT lastevent;
  714. X
  715. Xstatic const char winpanicstr[]="Bad winid %d in %s()";
  716. X#define         SIZEOF_DISKNAME 8
  717. X
  718. X/* The current color map */
  719. Xunsigned short amii_curmap[] = {
  720. X#define C_BLACK        0
  721. X#define C_WHITE        1
  722. X#define C_BROWN        2
  723. X#define C_CYAN        3
  724. X#define C_GREEN        4
  725. X#define C_MAGENTA    5
  726. X#define C_BLUE        6
  727. X#define C_RED        7
  728. X    0x0AAA, /* color #0 */
  729. X    0x0FFF, /* color #1 */
  730. X    0x0620, /* color #2 */
  731. X    0x0B08, /* color #3 */
  732. X    0x0181, /* color #4 */
  733. X    0x0C06, /* color #5 */
  734. X    0x023E, /* color #6 */
  735. X    0x0D00  /* color #7 */
  736. X};
  737. X
  738. X#ifdef  INTUI_NEW_LOOK
  739. XUWORD scrnpens[] = {
  740. X    C_BROWN,
  741. X    C_BLACK,
  742. X    C_WHITE,
  743. X    C_WHITE,
  744. X    C_BROWN,
  745. X    C_CYAN,
  746. X    C_BROWN,
  747. X    C_BLACK,
  748. X    C_RED,
  749. X};
  750. Xstruct TagItem scrntags[] =
  751. X{
  752. X    { SA_PubName, (ULONG)"NetHack" },
  753. X    { SA_Pens, (ULONG)scrnpens },
  754. X    { TAG_DONE, 0 },
  755. X};
  756. X#endif
  757. X
  758. Xstruct NewScreen NewHackScreen =
  759. X{
  760. X    0, 0, WIDTH, SCREENHEIGHT, DEPTH,
  761. X    C_BLACK, C_WHITE,     /* DetailPen, BlockPen */
  762. X    HIRES,
  763. X    CUSTOMSCREEN
  764. X#ifdef  INTUI_NEW_LOOK
  765. X    |NS_EXTENDED
  766. X#endif
  767. X    ,
  768. X    &Hack80,  /* Font */
  769. X    (UBYTE *)" NetHack 3.1",
  770. X    NULL,     /* Gadgets */
  771. X    NULL,     /* CustomBitmap */
  772. X#ifdef  INTUI_NEW_LOOK
  773. X    scrntags,
  774. X#endif
  775. X};
  776. X
  777. X/* Make sure the user sees a text string when no windowing is available */
  778. X
  779. Xvoid
  780. Xamii_raw_print(s)
  781. X    register const char *s;
  782. X{
  783. X    if( !s )
  784. X    return;
  785. X    if(amiIDisplay)amiIDisplay->rawprint++;
  786. X
  787. X    if( Initialized == 0 && WIN_BASE == WIN_ERR )
  788. X        init_nhwindows();
  789. X
  790. X    if( WIN_MAP != WIN_ERR && wins[ WIN_MAP ] )
  791. X    amii_putstr( WIN_MAP, 0, s );
  792. X    else if( WIN_BASE != WIN_ERR && wins[ WIN_BASE ] )
  793. X    amii_putstr( WIN_BASE, 0, s );
  794. X    else {
  795. X    printf("%s\n", s);
  796. X    fflush(stdout);
  797. X    }
  798. X}
  799. X
  800. X/* Make sure the user sees a bold text string when no windowing
  801. X * is available
  802. X */
  803. X
  804. Xvoid
  805. Xamii_raw_print_bold(s)
  806. X    register const char *s;
  807. X{
  808. X    if( !s )
  809. X    return;
  810. X
  811. X    if(amiIDisplay)amiIDisplay->rawprint++;
  812. X
  813. X    if( Initialized == 0 && WIN_BASE == WIN_ERR )
  814. X        init_nhwindows();
  815. X
  816. X    if( WIN_MAP != WIN_ERR && wins[ WIN_MAP ] )
  817. X    amii_putstr( WIN_MAP, 1, s );
  818. X    else if( WIN_BASE != WIN_ERR && wins[ WIN_BASE ] )
  819. X    amii_putstr( WIN_BASE, 1, s );
  820. X    else {
  821. X    printf("\33[1m%s\33[0m\n",s);
  822. X    fflush(stdout);
  823. X    }
  824. X}
  825. X
  826. X/* Start building the text for a menu */
  827. Xvoid
  828. Xamii_start_menu(window)
  829. X    register winid window;
  830. X{
  831. X    register struct WinDesc *cw;
  832. X
  833. X    if(window == WIN_ERR || (cw = wins[window]) == NULL || cw->type != NHW_MENU)
  834. X    panic(winpanicstr,window, "start_menu");
  835. X
  836. X    amii_clear_nhwindow(window);
  837. X    if( cw->resp )
  838. X    *cw->resp = 0;
  839. X    cw->maxrow = cw->maxcol = 0;
  840. X
  841. X    return;
  842. X}
  843. X
  844. X/* Add a string to a menu */
  845. Xvoid
  846. Xamii_add_menu(window,ch,attr,str)
  847. X    register winid window;
  848. X    register char ch;
  849. X    register int attr;
  850. X    register const char *str;
  851. X{
  852. X    register struct WinDesc *cw;
  853. X    char tmpbuf[2];
  854. X
  855. X    if(str == NULL)return;
  856. X
  857. X    if(window == WIN_ERR || (cw = wins[window]) == NULL || cw->type != NHW_MENU)
  858. X    panic(winpanicstr,window, "add_menu");
  859. X
  860. X    /* this should translate fonts if a title line */
  861. X    amii_putstr(window, attr, str);
  862. X
  863. X    if( !cw->resp )
  864. X    panic("No response buffer in add_menu()");
  865. X
  866. X    if( !cw->data )
  867. X    panic("No data buffer in add_menu()");
  868. X
  869. X    if(ch != '\0')
  870. X    {
  871. X    tmpbuf[0]=ch;
  872. X    tmpbuf[1]=0;
  873. X    Strcat(cw->resp, tmpbuf);
  874. X    cw->data[ cw->cury - 1 ][ SEL_ITEM ] = 1;
  875. X    }
  876. X    else
  877. X    {
  878. X    /* Use something as a place holder.  ^A is probably okay */
  879. X
  880. X    tmpbuf[0]=1;
  881. X    tmpbuf[1]=0;
  882. X    Strcat(cw->resp, tmpbuf);
  883. X    cw->data[ cw->cury - 1 ][ SEL_ITEM ] = 0;
  884. X    }
  885. X}
  886. X
  887. X/* Done building a menu. */
  888. X
  889. Xvoid
  890. Xamii_end_menu(window,cancel,str,morestr)
  891. X    register winid window;
  892. X    register char cancel;
  893. X    register const char *str;
  894. X    register const char *morestr;
  895. X{
  896. X    register struct WinDesc *cw;
  897. X
  898. X    if(window == WIN_ERR || (cw=wins[window]) == NULL || cw->type != NHW_MENU
  899. X      || cw->canresp)
  900. X    panic(winpanicstr,window, "end_menu");
  901. X
  902. X    if(str)
  903. X    {
  904. X    cw->canresp = (char*) alloc(strlen(str)+2);
  905. X    cw->canresp[0]=cancel;
  906. X    Strcpy(&cw->canresp[1],str);
  907. X
  908. X    if( !cw->resp )
  909. X        panic("No response buffer in end_menu()");
  910. X
  911. X    strncat(cw->resp, str, 1);
  912. X    }
  913. X
  914. X    if(morestr)
  915. X    {
  916. X    cw->morestr =(char *) alloc(strlen(morestr)+1);
  917. X    Strcpy(cw->morestr, morestr);
  918. X    }
  919. X}
  920. X
  921. X/* Select something from the menu. */
  922. X
  923. Xchar
  924. Xamii_select_menu(window)
  925. X    register winid window;
  926. X{
  927. X    register struct WinDesc *cw;
  928. X
  929. X    if( window == WIN_ERR || ( cw=wins[window] ) == NULL ||
  930. X      cw->type != NHW_MENU )
  931. X    panic(winpanicstr,window, "select_menu");
  932. X
  933. X    morc = 0;                       /* very ugly global variable */
  934. X    amii_display_nhwindow(window,TRUE); /* this waits for input */
  935. X    dismiss_nhwindow(window);       /* Now tear it down */
  936. X    return morc;
  937. X}
  938. X
  939. X/* Rebuild/update the inventory if the window is up.  This is currently
  940. X * a noop for us because we always take any menu window off of the
  941. X * screen by deleting it when the user makes a selection, or cancels
  942. X * the menu.
  943. X */
  944. Xvoid
  945. Xamii_update_inventory()
  946. X{
  947. X    register struct WinDesc *cw;
  948. X
  949. X    if( WIN_INVEN != WIN_ERR && ( cw = wins[ WIN_INVEN ] ) &&
  950. X      cw->type == NHW_MENU && cw->win )
  951. X    {
  952. X    display_inventory( NULL, FALSE );
  953. X    WindowToFront( cw->win );
  954. X    ActivateWindow( cw->win );
  955. X    }
  956. X}
  957. X
  958. X/* Humm, doesn't really do anything useful */
  959. X
  960. Xvoid
  961. Xamii_mark_synch()
  962. X{
  963. X    if(!amiIDisplay)
  964. X    fflush(stderr);
  965. X/* anything else?  do we need this much? */
  966. X}
  967. X
  968. X/* Wait for everything to sync.  Nothing is asynchronous, so we just
  969. X * ask for a key to be pressed.
  970. X */
  971. Xvoid
  972. Xamii_wait_synch()
  973. X{
  974. X    if(!amiIDisplay || amiIDisplay->rawprint)
  975. X    {
  976. X    if(amiIDisplay) amiIDisplay->rawprint=0;
  977. X    }
  978. X    else
  979. X    {
  980. X    display_nhwindow(WIN_MAP,TRUE);
  981. X    flush_glyph_buffer( wins[ WIN_MAP ]->win );
  982. X    }
  983. X}
  984. X
  985. X#ifdef CLIPPING
  986. Xvoid
  987. Xamii_setclipped()
  988. X{
  989. X    clipping = TRUE;
  990. X    clipx=clipy=0;
  991. X    clipxmax=CO;        /* WRONG */
  992. X    clipymax=LI-5;      /* WRONG */
  993. X}
  994. X
  995. Xvoid
  996. Xamii_cliparound(x,y)
  997. X    register int x,y;
  998. X{
  999. X/* pull this from wintty.c - LATER */
  1000. X}
  1001. X#endif
  1002. X
  1003. X/*
  1004. X * plname is filled either by an option (-u Player  or  -uPlayer) or
  1005. X * explicitly (by being the wizard) or by askname.
  1006. X * It may still contain a suffix denoting pl_character.
  1007. X * Always called after init_nhwindows() and before display_gamewindows().
  1008. X */
  1009. Xvoid
  1010. Xamii_askname()
  1011. X{
  1012. X    *plname = 0;
  1013. X    do {
  1014. X    getlin( "Who are you?", plname );
  1015. X    } while( strlen( plname ) == 0 );
  1016. X
  1017. X    if( *plname == '\33' )
  1018. X    {
  1019. X    clearlocks();
  1020. X    exit_nhwindows(NULL);
  1021. X    terminate(0);
  1022. X    }
  1023. X}
  1024. X
  1025. X#include "Amiga:char.c"
  1026. X
  1027. X/* Get the player selection character */
  1028. X
  1029. Xvoid
  1030. Xamii_player_selection()
  1031. X{
  1032. X    extern const char *roles[];
  1033. X    register struct Window *cwin;
  1034. X    register struct IntuiMessage *imsg;
  1035. X    register int aredone = 0;
  1036. X    register struct Gadget *gd;
  1037. X    static int once=0;
  1038. X    long class, code;
  1039. X    int i;
  1040. X
  1041. X    amii_clear_nhwindow( WIN_BASE );
  1042. X    if( *pl_character ){
  1043. X    pl_character[ 0 ] = toupper( pl_character[ 0 ] );
  1044. X    if( index( pl_classes, pl_character[ 0 ] ) )
  1045. X        return;
  1046. X    }
  1047. X
  1048. X    if( !once ){
  1049. X    if( bigscreen ){
  1050. X        Type_NewWindowStructure1.TopEdge =
  1051. X          (HackScreen->Height/2) - (Type_NewWindowStructure1.Height/2);
  1052. X    }
  1053. X    for( gd = Type_NewWindowStructure1.FirstGadget; gd;
  1054. X      gd = gd->NextGadget )
  1055. X    {
  1056. X        if( gd->GadgetID != 0 )
  1057. X        SetBorder( gd );
  1058. X    }
  1059. X    once = 1;
  1060. X    }
  1061. X
  1062. X    Type_NewWindowStructure1.Screen = HackScreen;
  1063. X    if( ( cwin = OpenShWindow( (void *)&Type_NewWindowStructure1 ) ) == NULL )
  1064. X    {
  1065. X    return;
  1066. X    }
  1067. X
  1068. X    while( !aredone )
  1069. X    {
  1070. X    WaitPort( cwin->UserPort );
  1071. X    while( ( imsg = (void *) GetMsg( cwin->UserPort ) ) != NULL )
  1072. X    {
  1073. X        class = imsg->Class;
  1074. X        code = imsg->Code;
  1075. X        gd = (struct Gadget *)imsg->IAddress;
  1076. X        ReplyMsg( (struct Message *)imsg );
  1077. X
  1078. X        switch( class )
  1079. X        {
  1080. X        case VANILLAKEY:
  1081. X        if( index( pl_classes, toupper( code ) ) )
  1082. X        {
  1083. X            pl_character[0] = toupper( code );
  1084. X            aredone = 1;
  1085. X        }
  1086. X        else if( code == ' ' || code == '\n' || code == '\r' )
  1087. X        {
  1088. X#ifdef  TOURIST
  1089. X            strcpy( pl_character, roles[ rnd( 11 ) ] );
  1090. X#else
  1091. X            strcpy( pl_character, roles[ rnd( 10 ) ] );
  1092. X#endif
  1093. X            aredone = 1;
  1094. X            amii_clear_nhwindow( WIN_BASE );
  1095. X            CloseShWindow( cwin );
  1096. X            RandomWindow( pl_character );
  1097. X            return;
  1098. X        }
  1099. X        else if( code == 'q' || code == 'Q' )
  1100. X        {
  1101. X        CloseShWindow( cwin );
  1102. X        clearlocks();
  1103. X        exit_nhwindows(NULL);
  1104. X        terminate(0);
  1105. X        }
  1106. X        else
  1107. X            DisplayBeep( NULL );
  1108. X        break;
  1109. X
  1110. X        case GADGETUP:
  1111. X        switch( gd->GadgetID )
  1112. X        {
  1113. X        case 1: /* Random Character */
  1114. X#ifdef  TOURIST
  1115. X            strcpy( pl_character, roles[ rnd( 11 ) ] );
  1116. X#else
  1117. X            strcpy( pl_character, roles[ rnd( 10 ) ] );
  1118. X#endif
  1119. X            amii_clear_nhwindow( WIN_BASE );
  1120. X            CloseShWindow( cwin );
  1121. X            RandomWindow( pl_character );
  1122. X            return;
  1123. X
  1124. X        default:
  1125. X            pl_character[0] = gd->GadgetID;
  1126. X            break;
  1127. X        }
  1128. X        aredone = 1;
  1129. X        break;
  1130. X
  1131. X        case CLOSEWINDOW:
  1132. X        CloseShWindow( cwin );
  1133. X        clearlocks();
  1134. X        exit_nhwindows(NULL);
  1135. X        terminate(0);
  1136. X        break;
  1137. X        }
  1138. X    }
  1139. X    }
  1140. X    amii_clear_nhwindow( WIN_BASE );
  1141. X    CloseShWindow( cwin );
  1142. X}
  1143. X
  1144. X#ifndef KENI_S_WAY
  1145. X#include "Amiga:randwin.c"
  1146. X
  1147. Xstatic void
  1148. XRandomWindow( name )
  1149. X    char *name;
  1150. X{
  1151. X    struct MsgPort *tport;
  1152. X    struct timerequest *trq;
  1153. X    static int once = 0;
  1154. X    struct Gadget *gd;
  1155. X    struct Window *w;
  1156. X    struct IntuiMessage *imsg;
  1157. X    int ticks = 0, aredone = 0, timerdone = 0;
  1158. X    long mask, got;
  1159. X
  1160. X    tport = CreatePort( 0, 0 );
  1161. X    trq = (struct timerequest *)CreateExtIO( tport, sizeof( *trq ) );
  1162. X    if( tport == NULL || trq == NULL )
  1163. X    {
  1164. Xallocerr:
  1165. X    if( tport ) DeletePort( tport );
  1166. X    if( trq ) DeleteExtIO( (struct IORequest *)trq );
  1167. X    Delay( 8 * 50 );
  1168. X    }
  1169. X
  1170. X    if( OpenDevice( TIMERNAME, UNIT_VBLANK, (struct IORequest *)trq, 0L ) != 0 )
  1171. X    goto allocerr;
  1172. X
  1173. X    trq->tr_node.io_Command = TR_ADDREQUEST;
  1174. X    trq->tr_time.tv_secs = 8;
  1175. X    trq->tr_time.tv_micro = 0;
  1176. X
  1177. X    SendIO( (struct IORequest *)trq );
  1178. X
  1179. X    /* Place the name in the center of the screen */
  1180. X    Rnd_IText5.IText = name;
  1181. X    Rnd_IText6.LeftEdge = Rnd_IText4.LeftEdge +
  1182. X        (strlen(Rnd_IText4.IText)+1)*txwidth;
  1183. X    Rnd_NewWindowStructure1.Width = (
  1184. X        (strlen( Rnd_IText2.IText )+1) * txwidth ) +
  1185. X        HackScreen->WBorLeft + HackScreen->WBorRight;
  1186. X    Rnd_IText5.LeftEdge = (Rnd_NewWindowStructure1.Width -
  1187. X        (strlen(name)*txwidth))/2;
  1188. X
  1189. X    gd = Rnd_NewWindowStructure1.FirstGadget;
  1190. X    gd->LeftEdge = (Rnd_NewWindowStructure1.Width - gd->Width)/2;
  1191. X    /* Chose correct modifier */
  1192. X    Rnd_IText6.IText = "a";
  1193. X    switch( *name )
  1194. X    {
  1195. X    case 'a': case 'e': case 'i': case 'o':
  1196. X    case 'u': case 'A': case 'E': case 'I':
  1197. X    case 'O': case 'U':
  1198. X    Rnd_IText6.IText = "an";
  1199. X    break;
  1200. X    }
  1201. X
  1202. X    if( !once )
  1203. X    {
  1204. X    if( bigscreen )
  1205. X    {
  1206. X        Rnd_NewWindowStructure1.TopEdge =
  1207. X        (HackScreen->Height/2) - (Rnd_NewWindowStructure1.Height/2);
  1208. X    }
  1209. X    for( gd = Rnd_NewWindowStructure1.FirstGadget; gd; gd = gd->NextGadget )
  1210. X    {
  1211. X        if( gd->GadgetID != 0 )
  1212. X        SetBorder( gd );
  1213. X    }
  1214. X    once = 1;
  1215. X    }
  1216. X
  1217. X    Rnd_NewWindowStructure1.Screen = HackScreen;
  1218. X    if( ( w = OpenShWindow( (void *)&Rnd_NewWindowStructure1 ) ) == NULL )
  1219. X    {
  1220. X    AbortIO( (struct IORequest *)trq );
  1221. X    WaitIO( (struct IORequest *)trq );
  1222. X    CloseDevice( (struct IORequest *)trq );
  1223. X    DeleteExtIO( (struct IORequest *) trq );
  1224. X    DeletePort( tport );
  1225. X    Delay( 50 * 8 );
  1226. X    return;
  1227. X    }
  1228. X    PrintIText( w->RPort, &Rnd_IntuiTextList1, 0, 0 );
  1229. X
  1230. X    mask = (1L << tport->mp_SigBit)|(1L << w->UserPort->mp_SigBit);
  1231. X    while( !aredone )
  1232. X    {
  1233. X    got = Wait( mask );
  1234. X    if( got & (1L << tport->mp_SigBit ) )
  1235. X    {
  1236. X        aredone = 1;
  1237. X        timerdone = 1;
  1238. X        GetMsg( tport );
  1239. X        CloseShWindow( w );
  1240. X        w = NULL;
  1241. X        }
  1242. X        while( w && ( imsg = (struct IntuiMessage *) GetMsg( w->UserPort ) ) )
  1243. X        {
  1244. X        switch( imsg->Class )
  1245. X        {
  1246. X        /* Must be up for a little while... */
  1247. X        case INACTIVEWINDOW:
  1248. X        if( ticks >= 40 )
  1249. X            aredone = 1;
  1250. X        break;
  1251. X
  1252. X        case INTUITICKS:
  1253. X        ++ticks;
  1254. X        break;
  1255. X
  1256. X        case GADGETUP:
  1257. X        aredone = 1;
  1258. X        break;
  1259. X        }
  1260. X        ReplyMsg( (struct Message *)imsg );
  1261. X        }
  1262. X    }
  1263. X
  1264. X    if( !timerdone )
  1265. X    {
  1266. X    AbortIO( (struct IORequest *)trq );
  1267. X    WaitIO( (struct IORequest *)trq );
  1268. X    }
  1269. X
  1270. X    CloseDevice( (struct IORequest *)trq );
  1271. X    DeleteExtIO( (struct IORequest *) trq );
  1272. X    DeletePort( tport );
  1273. X    if(w) CloseShWindow( w );
  1274. X}
  1275. X#endif
  1276. X
  1277. X/* this should probably not be needed (or be renamed)
  1278. Xvoid
  1279. Xflush_output(){} */
  1280. X
  1281. Xvoid
  1282. Xamii_destroy_nhwindow(win)      /* just hide */
  1283. X    register winid win;
  1284. X{
  1285. X    register struct WinDesc *cw;
  1286. X    register int i;
  1287. X
  1288. X    if( win == WIN_ERR || ( cw = wins[win] ) == NULL )
  1289. X    {
  1290. X    panic(winpanicstr,win,"destroy_nhwindow");
  1291. X    }
  1292. X
  1293. X    /* Tear down the Intuition stuff */
  1294. X    dismiss_nhwindow(win);
  1295. X
  1296. X    if( cw->data && cw->type == NHW_MESSAGE ||
  1297. X                cw->type == NHW_MENU || cw->type == NHW_TEXT )
  1298. X    {
  1299. X    for( i = 0; i < cw->maxrow; ++i )
  1300. X    {
  1301. X        if( cw->data[ i ] )
  1302. X        free( cw->data[ i ] );
  1303. X    }
  1304. X    free( cw->data );
  1305. X    cw->data = NULL;
  1306. X    }
  1307. X
  1308. X    if( cw->resp )
  1309. X    free( cw->resp );
  1310. X    cw->resp = NULL;
  1311. X
  1312. X    if( cw->canresp )
  1313. X    free( cw->canresp );
  1314. X    cw->canresp = NULL;
  1315. X
  1316. X    if( cw->morestr )
  1317. X    free( cw->morestr );
  1318. X    cw->morestr = NULL;
  1319. X
  1320. X    free( cw );
  1321. X    wins[win] = NULL;
  1322. X}
  1323. X
  1324. Xamii_create_nhwindow(type)
  1325. X    register int type;
  1326. X{
  1327. X    register struct Window *w = NULL;
  1328. X    register struct NewWindow *nw = NULL;
  1329. X    register struct WinDesc *wd = NULL;
  1330. X    struct Window *mapwin = NULL, *stwin = NULL, *msgwin = NULL;
  1331. X    register int newid;
  1332. X
  1333. X    if( WIN_STATUS != WIN_ERR && wins[ WIN_STATUS ] )
  1334. X    stwin = wins[ WIN_STATUS ]->win;
  1335. X
  1336. X    if( WIN_MESSAGE != WIN_ERR && wins[ WIN_MESSAGE ] )
  1337. X    msgwin = wins[ WIN_MESSAGE ]->win;
  1338. X
  1339. X    if( WIN_MAP != WIN_ERR && wins[ WIN_MAP ] )
  1340. X    mapwin = wins[ WIN_MAP ]->win;
  1341. X
  1342. X    /* Create Port anytime that we need it */
  1343. X
  1344. X    if( HackPort == NULL )
  1345. X    {
  1346. X    HackPort = CreatePort( NULL, 0 );
  1347. X    if( !HackPort )
  1348. X        panic( "no memory for msg port" );
  1349. X    }
  1350. X
  1351. X    nw = &new_wins[ type ].newwin;
  1352. X    nw->Width = amiIDisplay->xpix;
  1353. X    nw->Screen = HackScreen;
  1354. X
  1355. X    if( type == NHW_MAP || type == NHW_BASE )
  1356. X    {
  1357. X    nw->DetailPen = C_WHITE;
  1358. X    nw->BlockPen = C_MAGENTA;
  1359. X    nw->TopEdge = 1;
  1360. X    nw->LeftEdge = 0;
  1361. X    nw->Height = amiIDisplay->ypix - nw->TopEdge;
  1362. X    if( bigscreen && type == NHW_MAP )
  1363. X    {
  1364. X        int h;
  1365. X        if( msgwin && stwin )
  1366. X        {
  1367. X        h = (stwin->TopEdge - nw->TopEdge - 1) -
  1368. X                (msgwin->TopEdge + msgwin->Height + 1);
  1369. X        h = h - ( (22 * stwin->RPort->TxHeight) +
  1370. X                    stwin->BorderTop + stwin->BorderBottom );
  1371. X        /* h is now the available space excluding the map window so
  1372. X         * divide by 2 and use it to space out the map window.
  1373. X         */
  1374. X        if( h > 0 )
  1375. X            h /= 2;
  1376. X        else
  1377. X            h = 0;
  1378. X        nw->TopEdge = msgwin->TopEdge + msgwin->Height + 1 + h;
  1379. X        nw->Height = stwin->TopEdge + 1 - nw->TopEdge - h;
  1380. X        }
  1381. X        else
  1382. X        {
  1383. X        h = amiIDisplay->ypix - (22 * FONTHEIGHT) - 12 - 10;
  1384. X        if( h > 0 )
  1385. X        {
  1386. X            nw->TopEdge = h / 2;
  1387. X            nw->Height = (22 * FONTHEIGHT) + 12 + 10;
  1388. X        }
  1389. X        else
  1390. X        {
  1391. X            nw->Height -= 85;
  1392. X            nw->TopEdge += 35;
  1393. X        }
  1394. X        }
  1395. X    }
  1396. X    }
  1397. X    else if( type == NHW_STATUS )
  1398. X    {
  1399. X    nw->DetailPen = C_CYAN;
  1400. X    nw->BlockPen = C_CYAN;
  1401. X    if( WIN_MAP != WIN_ERR && wins[ WIN_MAP ] )
  1402. X        w = wins[ WIN_MAP ]->win;
  1403. X    else if( WIN_BASE != WIN_ERR && wins[ WIN_BASE ] )
  1404. X        w = wins[ WIN_BASE ]->win;
  1405. X    else
  1406. X        panic( "No window to base STATUS location from" );
  1407. X
  1408. X    /* Status window is relative to bottom of WIN_BASE/WIN_MAP */
  1409. X
  1410. X    if( mapwin && bigscreen )
  1411. X    {
  1412. X        nw->TopEdge = mapwin->TopEdge + mapwin->Height;
  1413. X        nw->Height = amiIDisplay->ypix - nw->TopEdge - 1;
  1414. X    }
  1415. X    else
  1416. X    {
  1417. X        /* Expand the height of window by borders */
  1418. X        if( bigscreen )
  1419. X        nw->Height = (txheight * 2) + 17;
  1420. X
  1421. X        nw->TopEdge = amiIDisplay->ypix - nw->Height;
  1422. X        nw->LeftEdge = w->LeftEdge;
  1423. X        if( nw->LeftEdge + nw->Width >= amiIDisplay->xpix )
  1424. X        nw->LeftEdge = 0;
  1425. X        if( nw->Width >= amiIDisplay->xpix - nw->LeftEdge )
  1426. X        nw->Width = amiIDisplay->xpix - nw->LeftEdge;
  1427. X    }
  1428. X    }
  1429. X    else if( type == NHW_MESSAGE )
  1430. X    {
  1431. X    nw->DetailPen = C_RED;
  1432. X    nw->BlockPen = C_RED;
  1433. X    if( WIN_MAP != WIN_ERR && wins[ WIN_MAP ] )
  1434. X        w = wins[ WIN_MAP ]->win;
  1435. X    else if( WIN_BASE != WIN_ERR && wins[ WIN_BASE ] )
  1436. X        w = wins[ WIN_BASE ]->win;
  1437. X    else
  1438. X        panic( "No window to base STATUS location from" );
  1439. X
  1440. X    nw->TopEdge = 1;
  1441. X    if( bigscreen )
  1442. X    {
  1443. X        if( mapwin )
  1444. X        {
  1445. X        nw->Height = mapwin->TopEdge - 2;
  1446. X        }
  1447. X        else
  1448. X        {
  1449. X        nw->Height += 15;
  1450. X        }
  1451. X    }
  1452. X    }
  1453. X    else
  1454. X    {
  1455. X    nw->DetailPen = C_WHITE;
  1456. X    nw->BlockPen = C_MAGENTA;
  1457. X    }
  1458. X
  1459. X    /* When Interlaced, there is "Room" for all this stuff */
  1460. X/* WRONG - still not enough space on MAP for right border */
  1461. X    if( bigscreen && type != NHW_BASE )
  1462. X    {
  1463. X    nw->Flags &= ~( BORDERLESS | BACKDROP );
  1464. X#if 1
  1465. X    nw->Flags |= ( WINDOWDRAG | WINDOWDEPTH );
  1466. X#else
  1467. X    nw->Flags |= ( WINDOWDRAG | WINDOWDEPTH | SIZEBRIGHT );
  1468. X    if( type == NHW_MAP )
  1469. X        nw->Flags |= WINDOWSIZING;
  1470. X#endif
  1471. X    }
  1472. X    /* No titles on a hires only screen */
  1473. X    if( !bigscreen )
  1474. X    nw->Title = 0;
  1475. X
  1476. X    /* Don't open MENU or TEXT windows yet */
  1477. X
  1478. X    if( type == NHW_MENU || type == NHW_TEXT )
  1479. X    w = NULL;
  1480. X    else
  1481. X    w=OpenShWindow( (void *)nw );
  1482. X
  1483. X    if( w == NULL && type != NHW_MENU && type != NHW_TEXT )
  1484. X    panic("bad openwin %d",type);
  1485. X
  1486. X    /* Check for an empty slot */
  1487. X
  1488. X    for(newid = 0; newid<MAXWIN + 1; newid++)
  1489. X    {
  1490. X    if(wins[newid] == 0)
  1491. X        break;
  1492. X    }
  1493. X
  1494. X    if(newid==MAXWIN+1)
  1495. X    panic("time to write re-alloc code\n");
  1496. X
  1497. X    /* Set wincnt accordingly */
  1498. X
  1499. X    if( newid > wincnt )
  1500. X    wincnt = newid;
  1501. X
  1502. X    /* Do common initialization */
  1503. X
  1504. X    wd = (struct WinDesc *)alloc(sizeof(struct WinDesc));
  1505. X    memset( wd, 0, sizeof( struct WinDesc ) );
  1506. X    wins[newid] = wd;
  1507. X
  1508. X    wd->newwin = NULL;
  1509. X    wd->win = w;
  1510. X    wd->type = type;
  1511. X    wd->flags = 0;
  1512. X    wd->active = FALSE;
  1513. X    wd->curx=wd->cury = 0;
  1514. X    wd->resp = wd->canresp = wd->morestr = 0;   /* CHECK THESE */
  1515. X    wd->offx = new_wins[type].offx;
  1516. X    wd->offy = new_wins[type].offy;
  1517. X    wd->maxrow = new_wins[type].maxrow;
  1518. X    wd->maxcol = new_wins[type].maxcol;
  1519. X
  1520. X    if( type != NHW_TEXT && type != NHW_MENU )
  1521. X    {
  1522. X    wd->rows = ( w->Height - w->BorderTop - w->BorderBottom ) /(txheight+1);
  1523. X    wd->cols = ( w->Width - w->BorderLeft - w->BorderRight ) / txwidth;
  1524. X    }
  1525. X
  1526. X    /* Okay, now do the individual type initialization */
  1527. X
  1528. X    switch(type)
  1529. X    {
  1530. X    /* History lines for MESSAGE windows are stored in cw->data[?].
  1531. X     * maxcol and maxrow are used as cursors.  maxrow is the count
  1532. X     * of the number of history lines stored.  maxcol is the cursor
  1533. X     * to the last line that was displayed by ^P.
  1534. X     */
  1535. X    case NHW_MESSAGE:
  1536. X        if(flags.msg_history<20)flags.msg_history=20;
  1537. X        if(flags.msg_history>200)flags.msg_history=200;
  1538. X        flags.window_inited=TRUE;
  1539. X        wd->data = (char **)alloc( flags.msg_history*sizeof( char * ) );
  1540. X        memset( wd->data, 0, flags.msg_history * sizeof( char * ) );
  1541. X        wd->maxrow = wd->maxcol = 0;
  1542. X        /* Indicate that we have not positioned the cursor yet */
  1543. X        wd->curx = -1;
  1544. X        break;
  1545. X
  1546. X        /* A MENU contains a list of lines in wd->data[?].  These
  1547. X         * lines are created in amii_putstr() by reallocating the size
  1548. X         * of wd->data to hold enough (char *)'s.  wd->rows is the
  1549. X         * number of (char *)'s allocated.  wd->maxrow is the number
  1550. X         * used.  wd->maxcol is used to track how wide the menu needs
  1551. X         * to be.  wd->resp[x] contains the characters that correspond
  1552. X         * to selecting wd->data[x].  wd->resp[x] corresponds to
  1553. X         * wd->data[x] for any x. Elements of wd->data[?] that are not
  1554. X         * valid selections have the corresponding element of
  1555. X         * wd->resp[] set to a value of '\01';  i.e. a ^A which is
  1556. X         * not currently a valid keystroke for responding to any
  1557. X         * MENU or TEXT window.
  1558. X         */
  1559. X    case NHW_MENU:
  1560. X        wd->resp=(char*)alloc(256);
  1561. X        wd->resp[0]=0;
  1562. X        wd->rows = wd->maxrow = 0;
  1563. X        wd->maxcol = 0;
  1564. X        wd->data = NULL;
  1565. X        break;
  1566. X
  1567. X        /* See the explanation of MENU above.  Except, wd->resp[] is not
  1568. X         * used for TEXT windows since there is no selection of a
  1569. X         * a line performed/allowed.  The window is always full
  1570. X         * screen width.
  1571. X         */
  1572. X    case NHW_TEXT:
  1573. X        wd->rows = wd->maxrow = 0;
  1574. X        wd->maxcol = wd->cols = amiIDisplay->cols;
  1575. X        wd->data = NULL;
  1576. X        wd->morestr = NULL;
  1577. X        break;
  1578. X
  1579. X        /* The status window has only two lines.  These are stored in
  1580. X         * wd->data[], and here we allocate the space for them.
  1581. X         */
  1582. X    case NHW_STATUS:
  1583. X        /* wd->cols is the number of characters which fit across the
  1584. X         * screen.
  1585. X         */
  1586. X        wd->data=(char **)alloc(3*sizeof(char *));
  1587. X        wd->data[0] = (char *)alloc(wd->cols + 10);
  1588. X        wd->data[1] = (char *)alloc(wd->cols + 10);
  1589. X        wd->data[2] = NULL;
  1590. X        break;
  1591. X
  1592. X        /* NHW_MAP does not use wd->data[] or the other text
  1593. X         * manipulating members of the WinDesc structure.
  1594. X         */
  1595. X    case NHW_MAP:
  1596. X        SetMenuStrip(w, HackMenu);
  1597. X        break;
  1598. X
  1599. X        /* The base window must exist until CleanUp() deletes it. */
  1600. X    case NHW_BASE:
  1601. X        /* Make our requesters come to our screen */
  1602. X        {
  1603. X        register struct Process *myProcess =
  1604. X                    (struct Process *) FindTask(NULL);
  1605. X        pr_WindowPtr = (struct Window *)(myProcess->pr_WindowPtr);
  1606. X        myProcess->pr_WindowPtr = (APTR) w;
  1607. X        }
  1608. X
  1609. X        /* Need this for RawKeyConvert() */
  1610. X
  1611. X        ConsoleIO.io_Data = (APTR) w;
  1612. X        ConsoleIO.io_Length = sizeof( struct Window * );
  1613. X        ConsoleIO.io_Message.mn_ReplyPort = CreatePort(NULL, 0L);
  1614. X        if( OpenDevice("console.device", 0L,
  1615. X                (struct IORequest *) &ConsoleIO, 0L) != 0)
  1616. X        {
  1617. X        Abort(AG_OpenDev | AO_ConsoleDev);
  1618. X        }
  1619. X
  1620. X        ConsoleDevice = (struct Library *) ConsoleIO.io_Device;
  1621. X
  1622. X        KbdBuffered = 0;
  1623. X
  1624. X#ifdef HACKFONT
  1625. X        if( HackFont )
  1626. X        SetFont(w->RPort, HackFont);
  1627. X#endif
  1628. X        txwidth = w->RPort->TxWidth;
  1629. X        txheight = w->RPort->TxHeight;
  1630. X        txbaseline = w->RPort->TxBaseline;
  1631. X        break;
  1632. X
  1633. X    default:
  1634. X        panic("bad create_nhwindow( %d )\n",type);
  1635. X        return WIN_ERR;
  1636. X    }
  1637. X
  1638. X    return( newid );
  1639. X}
  1640. X
  1641. X/* Initialize the windowing environment */
  1642. X
  1643. Xvoid
  1644. Xamii_init_nhwindows()
  1645. X{
  1646. X    if (IntuitionBase)
  1647. X    panic( "init_nhwindow() called twice", 0 );
  1648. X
  1649. X    WIN_MESSAGE = WIN_ERR;
  1650. X    WIN_MAP = WIN_ERR;
  1651. X    WIN_STATUS = WIN_ERR;
  1652. X    WIN_INVEN = WIN_ERR;
  1653. X    WIN_BASE = WIN_ERR;
  1654. X
  1655. X    if ( (IntuitionBase = (struct IntuitionBase *)
  1656. X        OpenLibrary("intuition.library", INTUITION_VERSION)) == NULL)
  1657. X    {
  1658. X    Abort(AG_OpenLib | AO_Intuition);
  1659. X    }
  1660. X
  1661. X    if ( (GfxBase = (struct GfxBase *)
  1662. X        OpenLibrary("graphics.library", GRAPHICS_VERSION)) == NULL)
  1663. X    {
  1664. X    Abort(AG_OpenLib | AO_GraphicsLib);
  1665. X    }
  1666. X
  1667. X#ifdef HACKFONT
  1668. X    /*
  1669. X     *  Force our own font to be loaded, if possible.
  1670. X     *  If we can open diskfont.library, but not our font, we can close
  1671. X     *  the diskfont.library again since it just wastes memory.
  1672. X     *  Even if we can open the font, we don't need the diskfont.library
  1673. X     *  anymore, since CloseFont is a graphics.library function.
  1674. X     */
  1675. X
  1676. X    if ((HackFont = OpenFont(&Hack80)) == NULL)
  1677. X    {
  1678. X    if (DiskfontBase =
  1679. X            OpenLibrary("diskfont.library", DISKFONT_VERSION))
  1680. X    {
  1681. X        Hack80.ta_Name -= SIZEOF_DISKNAME;
  1682. X        HackFont = OpenDiskFont(&Hack80);
  1683. X        Hack80.ta_Name += SIZEOF_DISKNAME;
  1684. X        CloseLibrary(DiskfontBase);
  1685. X        DiskfontBase = NULL;
  1686. X    }
  1687. X    }
  1688. X#endif
  1689. X
  1690. X    amiIDisplay=(struct DisplayDesc *)alloc(sizeof(struct DisplayDesc));
  1691. X    memset( amiIDisplay, 0, sizeof( struct DisplayDesc ) );
  1692. X
  1693. X    /* Use Intuition sizes for overscan screens... */
  1694. X
  1695. X    amiIDisplay->ypix = GfxBase->NormalDisplayRows;
  1696. X    amiIDisplay->xpix = GfxBase->NormalDisplayColumns;
  1697. X
  1698. X    amiIDisplay->cols = amiIDisplay->xpix / FONTWIDTH;
  1699. X
  1700. X    amiIDisplay->toplin=0;
  1701. X    amiIDisplay->rawprint=0;
  1702. X    amiIDisplay->lastwin=0;
  1703. X
  1704. X    if( bigscreen == 0 )
  1705. X    {
  1706. X    if( ( GfxBase->ActiView->ViewPort->Modes & LACE ) == LACE )
  1707. X    {
  1708. X        amiIDisplay->ypix *= 2;
  1709. X        NewHackScreen.ViewModes |= LACE;
  1710. X        bigscreen = 1;
  1711. X    }
  1712. X    else if( GfxBase->NormalDisplayRows >= 240 )
  1713. X    {
  1714. X        bigscreen = 1;
  1715. X    }
  1716. X    }
  1717. X    else if( bigscreen == -1 )
  1718. X    bigscreen = 0;
  1719. X    else if( bigscreen )
  1720. X    {
  1721. X    /* If bigscreen requested and we don't have enough rows in
  1722. X     * noninterlaced mode, switch to interlaced...
  1723. X     */
  1724. X    if( GfxBase->NormalDisplayRows < 240 )
  1725. X    {
  1726. X        amiIDisplay->ypix *= 2;
  1727. X        NewHackScreen.ViewModes |= LACE;
  1728. X    }
  1729. X    }
  1730. X    amiIDisplay->rows = amiIDisplay->ypix / FONTHEIGHT;
  1731. X
  1732. X    /* This is the size screen we want to open, within reason... */
  1733. X
  1734. X    NewHackScreen.Width = max( WIDTH, amiIDisplay->xpix );
  1735. X    NewHackScreen.Height = max( SCREENHEIGHT, amiIDisplay->ypix );
  1736. X
  1737. X    if( ( HackScreen = OpenScreen( (void *)&NewHackScreen ) ) == NULL )
  1738. X    Abort( AN_OpenScreen & ~AT_DeadEnd );
  1739. X#ifdef  INTUI_NEW_LOOK
  1740. X    if( IntuitionBase->LibNode.lib_Version >= 37 )
  1741. X    {
  1742. X    PubScreenStatus( HackScreen, 0 );
  1743. X    }
  1744. X#endif
  1745. X
  1746. X#ifdef TEXTCOLOR
  1747. X    LoadRGB4(&HackScreen->ViewPort, amii_curmap, 1L << DEPTH );
  1748. X#endif
  1749. X
  1750. X    /* Display the copyright etc... */
  1751. X
  1752. X    if( WIN_BASE == WIN_ERR )
  1753. X    WIN_BASE = amii_create_nhwindow( NHW_BASE );
  1754. X    amii_clear_nhwindow( WIN_BASE );
  1755. X    amii_putstr( WIN_BASE, 0, "" );
  1756. X    amii_putstr( WIN_BASE, 0, "" );
  1757. X    amii_putstr( WIN_BASE, 0, "" );
  1758. X    amii_putstr( WIN_BASE, 0,
  1759. X      "NetHack, Copyright 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993.");
  1760. X    amii_putstr( WIN_BASE, 0,
  1761. X    "         By Stichting Mathematisch Centrum and M. Stephenson.");
  1762. X    amii_putstr( WIN_BASE, 0, "         See license for details.");
  1763. X    amii_putstr( WIN_BASE, 0, "");
  1764. X
  1765. X    Initialized = 1;
  1766. X}
  1767. X
  1768. X#ifdef COM_COMPL
  1769. X/* Read in an extended command - doing command line completion for
  1770. X * when enough characters have been entered to make a unique command.
  1771. X */
  1772. Xvoid
  1773. Xamii_get_ext_cmd(bufp)
  1774. Xregister char *bufp;
  1775. X{
  1776. X    register char *obufp = bufp;
  1777. X    register int c;
  1778. X    int com_index, oindex;
  1779. X    struct WinDesc *cw;
  1780. X    struct Window *w;
  1781. X    int colx;
  1782. X
  1783. X    if( WIN_MESSAGE == WIN_ERR || ( cw = wins[ WIN_MESSAGE ] ) == NULL )
  1784. X    panic(winpanicstr, WIN_MESSAGE, "get_ext_cmd");
  1785. X    amii_clear_nhwindow( NHW_MESSAGE );
  1786. X    pline("# ");
  1787. X    colx = 3;
  1788. X    w = cw->win;
  1789. X
  1790. X    while((c = WindowGetchar()) != EOF)
  1791. X    {
  1792. X    amii_curs( WIN_MESSAGE, colx, 0 );
  1793. X    if(c == '?' )
  1794. X    {
  1795. X        int win, i, sel;
  1796. X        char buf[ 100 ];
  1797. X
  1798. X        win = amii_create_nhwindow( NHW_MENU );
  1799. X        amii_start_menu( win );
  1800. X
  1801. X        for( i = 0; extcmdlist[ i ].ef_txt != NULL; ++i )
  1802. X        {
  1803. X        sprintf( buf, "%-10s - %s ",
  1804. X             extcmdlist[ i ].ef_txt,
  1805. X             extcmdlist[ i ].ef_desc );
  1806. X        amii_add_menu( win, extcmdlist[i].ef_txt[0], 0, buf );
  1807. X        }
  1808. X
  1809. X        amii_end_menu( win, i, "\33", NULL );
  1810. X        sel = amii_select_menu( win );
  1811. X        amii_destroy_nhwindow( win );
  1812. X
  1813. X        if( sel == '\33' )
  1814. X        {
  1815. X        *obufp = '\33';
  1816. X        obufp[ 1 ] = 0;
  1817. X        }
  1818. X        else
  1819. X        {
  1820. X        for( i = 0; extcmdlist[ i ].ef_txt != NULL; ++i )
  1821. X        {
  1822. X            if( sel == extcmdlist[i].ef_txt[0] )
  1823. X            break;
  1824. X        }
  1825. X
  1826. X        /* copy in the text */
  1827. X        amii_clear_nhwindow( WIN_MESSAGE );
  1828. X        strcpy( obufp, extcmdlist[ i ].ef_txt );
  1829. X        colx = 0;
  1830. X        pline( "# " );
  1831. X        pline( obufp );
  1832. X        bufp = obufp + 2;
  1833. X        }
  1834. X        return;
  1835. X    }
  1836. X    else if(c == '\033')
  1837. X    {
  1838. X        *obufp = c;
  1839. X        obufp[1] = 0;
  1840. X        return;
  1841. X    }
  1842. X    else if(c == '\b')
  1843. X    {
  1844. X        if(bufp != obufp)
  1845. X        {
  1846. X        bufp--;
  1847. X        amii_curs( WIN_MESSAGE, --colx, 0);
  1848. X        Text( w->RPort, spaces, 1 );
  1849. X        amii_curs( WIN_MESSAGE, colx, 0);
  1850. X        }
  1851. X        else
  1852. X        DisplayBeep( NULL );
  1853. X    }
  1854. X    else if( c == '\n' || c == '\r' )
  1855. X    {
  1856. X        *bufp = 0;
  1857. X        return;
  1858. X    }
  1859. X    else if(' ' <= c && c < '\177')
  1860. X    {
  1861. X        /* avoid isprint() - some people don't have it
  1862. X           ' ' is not always a printing char */
  1863. X        *bufp = c;
  1864. X        bufp[1] = 0;
  1865. X        oindex = 0;
  1866. X        com_index = -1;
  1867. X
  1868. X        while(extcmdlist[oindex].ef_txt != NULL)
  1869. X        {
  1870. X        if(!strncmpi(obufp, extcmdlist[oindex].ef_txt, strlen(obufp)))
  1871. X        {
  1872. X            if(com_index == -1) /* No matches yet*/
  1873. X            com_index = oindex;
  1874. X            else /* More than 1 match */
  1875. X            com_index = -2;
  1876. X        }
  1877. X        oindex++;
  1878. X        }
  1879. X
  1880. X        if(com_index >= 0 && *obufp )
  1881. X        {
  1882. X        Strcpy(obufp, extcmdlist[com_index].ef_txt);
  1883. X        /* finish printing our string */
  1884. X        Text( w->RPort, bufp, strlen( bufp ) );
  1885. X        amii_curs( WIN_MESSAGE, colx += strlen( bufp ), 0);
  1886. X        bufp = obufp; /* reset it */
  1887. X        if(strlen(obufp) < BUFSZ-1 && strlen(obufp) < COLNO)
  1888. X            bufp += strlen(obufp);
  1889. X        }
  1890. X        else
  1891. X        {
  1892. X        Text( w->RPort, bufp, strlen( bufp ) );
  1893. X        amii_curs( WIN_MESSAGE, colx += strlen( bufp ), 0);
  1894. X        if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO)
  1895. X            bufp++;
  1896. X        }
  1897. X    }
  1898. X    else if(c == ('X'-64) || c == '\177')
  1899. X    {
  1900. X        colx = 0;
  1901. X        amii_clear_nhwindow( WIN_MESSAGE );
  1902. X        pline( "# " );
  1903. X        bufp = obufp;
  1904. X    } else
  1905. X        DisplayBeep( NULL );
  1906. X    }
  1907. X    *bufp = 0;
  1908. X    return;
  1909. X}
  1910. X#endif /* COM_COMPL */
  1911. X
  1912. X#ifdef WINDOW_YN
  1913. XSHORT Ask_BorderVectors1[] = { 0,0, 29,0, 29,11, 0,11, 0,0 };
  1914. Xstruct Border Ask_Border1 = { -1,-1, 3,0,JAM1, 5, Ask_BorderVectors1, NULL };
  1915. Xstruct IntuiText Ask_IText1 = { 3,0,JAM2, 2,1, NULL, "(?)", NULL };
  1916. X
  1917. Xstruct Gadget Ask_Gadget1 = {
  1918. X    NULL, 9,4, 28,10, NULL, RELVERIFY, BOOLGADGET, (APTR)&Ask_Border1,
  1919. X    NULL, &Ask_IText1, NULL, NULL, NULL, NULL
  1920. X};
  1921. X
  1922. X#define Ask_GadgetList1 Ask_Gadget1
  1923. X
  1924. Xstruct IntuiText Ask_IText2 = { 1,0,JAM2, 44,5, NULL, NULL, NULL };
  1925. X
  1926. X#define Ask_IntuiTextList1 Ask_IText2
  1927. X
  1928. Xstruct NewWindow Ask_Window = {
  1929. X    75,85, 524,18, 0,1, GADGETUP+VANILLAKEY, ACTIVATE+NOCAREREFRESH,
  1930. X    &Ask_Gadget1, NULL, NULL, NULL, NULL, 5,5, -1,-1, CUSTOMSCREEN
  1931. X};
  1932. X#endif
  1933. X
  1934. X/* Ask a question and get a response */
  1935. X
  1936. Xchar amii_yn_function( prompt, resp, def )
  1937. X    const char *prompt,*resp;
  1938. X    char def;
  1939. X{
  1940. X    char ch;
  1941. X#ifndef WINDOW_YN
  1942. X    char buf[ 80 ];
  1943. X
  1944. X    if( def && def!='q')
  1945. X    {
  1946. X    sprintf( buf, "%s [%c] ", prompt, def );
  1947. X    amii_addtopl( buf );
  1948. X    } else {
  1949. X    amii_addtopl( prompt );
  1950. X    }
  1951. X
  1952. X    cursor_on( WIN_MESSAGE );
  1953. X    do {
  1954. X    ch = WindowGetchar();
  1955. X    if( ch == '\33' )
  1956. X        break;
  1957. X    else if( def && ( ch == '\n' || ch == '\r' ) )
  1958. X    {
  1959. X        ch = def;
  1960. X        break;
  1961. X    }
  1962. X    } while( resp && *resp && index( resp, ch ) == 0 );
  1963. X
  1964. X    cursor_off( WIN_MESSAGE );
  1965. X    if( ch == '\33' )
  1966. X    {
  1967. X    /*amii_addtopl( " you change your mind..." );*/
  1968. X    ch = 0;
  1969. X    }
  1970. X    /* Try this to make topl behave more appropriately? */
  1971. X    clear_nhwindow( WIN_MESSAGE );
  1972. X#else
  1973. X    struct Window *cwin;
  1974. X    struct IntuiMessage *imsg;
  1975. X    int aredone = 0, xcor;
  1976. X    struct Gadget *gd;
  1977. X    char buf[ 4 ];
  1978. X
  1979. X    *StrString = 0;
  1980. X
  1981. X    Ask_Window.Screen = HackScreen;
  1982. X    Ask_IText1.IText = buf;
  1983. X    Ask_IText2.IText = prompt;
  1984. X    if( def )
  1985. X    {
  1986. X    sprintf( buf, "[%c]", def );
  1987. X    Ask_Window.FirstGadget = &Ask_Gadget1;
  1988. X    Ask_IText2.LeftEdge = 44;
  1989. X    }
  1990. X    else
  1991. X    {
  1992. X    Ask_Window.FirstGadget = NULL;
  1993. X    Ask_IText2.LeftEdge = 9;
  1994. X    }
  1995. X
  1996. X    /* Use this RPort to get needed dimensions */
  1997. X
  1998. X    if( cwin = wins[WIN_MAP]->win )
  1999. X    {
  2000. X    Ask_IText1.LeftEdge =
  2001. X    (Ask_Gadget1.Width - cwin->BorderLeft - cwin->BorderRight) / 2;
  2002. X    Ask_Window.Width =
  2003. X     Ask_IText2.LeftEdge + (5 + strlen( prompt )) * txwidth;
  2004. X    xcor = Ask_IText2.LeftEdge + (2 + strlen( prompt )) * txwidth;
  2005. X    }
  2006. X
  2007. X    if( ( cwin = OpenShWindow( (void *)&Ask_Window ) ) == NULL )
  2008. X    return( 0 );
  2009. X
  2010. X    PrintIText( cwin->RPort, &Ask_IntuiTextList1, 0, 0 );
  2011. X
  2012. X    while( !aredone )
  2013. X    {
  2014. X    WaitPort( cwin->UserPort );
  2015. X    while( ( imsg = (void *) GetMsg( cwin->UserPort ) ) != NULL )
  2016. X    {
  2017. X        switch( imsg->Class )
  2018. X        {
  2019. X        case VANILLAKEY:
  2020. X            Move( cwin->RPort, xcor,
  2021. X            Ask_IText2.TopEdge + txheight - 1 );
  2022. X            ch = imsg->Code;
  2023. X            if( ch != '\33' )
  2024. X            {
  2025. X            Text( cwin->RPort, &ch, 1 );
  2026. X            if( resp == NULL || *resp == 0 ||
  2027. X                            index( resp, ch ) )
  2028. X            {
  2029. X                aredone = 1;
  2030. X                Delay( 45 );
  2031. X            }
  2032. X            else
  2033. X                DisplayBeep( NULL );
  2034. X            }
  2035. X            else
  2036. X            {
  2037. X            aredone = 1;
  2038. X            }
  2039. X            break;
  2040. X
  2041. X        case GADGETUP:
  2042. X            gd = (struct Gadget *) imsg->IAddress;
  2043. X            switch( gd->GadgetID )
  2044. X            {
  2045. X            case 1:
  2046. X                ch = def;
  2047. X                aredone = 1;
  2048. X                break;
  2049. X            }
  2050. X            break;
  2051. X        }
  2052. X        ReplyMsg( (struct Message *) imsg );
  2053. X    }
  2054. X    }
  2055. X
  2056. X    CloseShWindow( cwin );
  2057. X#endif
  2058. X    return( ch );
  2059. X}
  2060. X
  2061. X/* Add a line in the message window */
  2062. X
  2063. Xvoid
  2064. Xamii_addtopl(s)
  2065. X    const char *s;
  2066. X{
  2067. X    amii_putstr(WIN_MESSAGE,0,s);   /* is this right? */
  2068. X}
  2069. X
  2070. Xvoid
  2071. XTextSpaces( rp, nr )
  2072. X    struct RastPort *rp;
  2073. X    int nr;
  2074. X{
  2075. X    if( nr < 1 )
  2076. X    return;
  2077. X
  2078. X    while (nr > sizeof(spaces) - 1)
  2079. X    {
  2080. X    Text(rp, spaces, (long)sizeof(spaces) - 1);
  2081. X    nr -= sizeof(spaces) - 1;
  2082. X    }
  2083. X    if (nr > 0)
  2084. X    Text(rp, spaces, (long)nr);
  2085. X}
  2086. X
  2087. X/* Put a string into the indicated window using the indicated attribute */
  2088. X
  2089. Xvoid
  2090. Xamii_putstr(window,attr,str)
  2091. X    winid window;
  2092. X    int attr;
  2093. X    const char *str;
  2094. X{
  2095. X    struct Window *w;
  2096. X    register struct WinDesc *cw;
  2097. X    register char *ob;
  2098. X    int i, j, n0;
  2099. X
  2100. X    /* Always try to avoid a panic when there is no window */
  2101. X    if( window == WIN_ERR )
  2102. X    {
  2103. X    window = WIN_BASE;
  2104. X    if( window == WIN_ERR )
  2105. X        window = WIN_BASE = amii_create_nhwindow( NHW_BASE );
  2106. X    }
  2107. X
  2108. X    if( window == WIN_ERR || ( cw = wins[window] ) == NULL )
  2109. X    {
  2110. X    /* tty does this differently - is this OK? */
  2111. X    flags.window_inited=0;
  2112. X    panic(winpanicstr,window, "putstr");
  2113. X    }
  2114. X
  2115. X    w = cw->win;
  2116. X
  2117. X    if(!str)return;
  2118. X    amiIDisplay->lastwin=window;    /* do we care??? */
  2119. X
  2120. X    /* NHW_MENU windows are not opened immediately, so check if we
  2121. X     * have the window pointer yet
  2122. X     */
  2123. X
  2124. X    if( w )
  2125. X    {
  2126. X    /* Force the drawing mode and pen colors */
  2127. X
  2128. X    SetDrMd( w->RPort, JAM2 );
  2129. X    if( cw->type == NHW_STATUS )
  2130. X        SetAPen( w->RPort, attr ? C_BLUE : C_CYAN );
  2131. X    else if( cw->type == NHW_MESSAGE )
  2132. X        SetAPen( w->RPort, attr ? C_RED : C_WHITE );
  2133. X    else
  2134. X        SetAPen( w->RPort, attr ? C_WHITE : C_RED );
  2135. X    SetBPen( w->RPort, C_BLACK );
  2136. X    }
  2137. X    else if( cw->type != NHW_MENU && cw->type != NHW_TEXT )
  2138. X    {
  2139. X    panic( "NULL window pointer in putstr 2" );
  2140. X    }
  2141. X
  2142. X    /* Okay now do the work for each type */
  2143. X
  2144. X    switch(cw->type)
  2145. X    {
  2146. X#define MORE_FUDGE  10  /* 8 for --more--, 1 for preceeding sp, 1 for */
  2147. X        /* putstr pad */
  2148. X    case NHW_MESSAGE:
  2149. X    strncpy( toplines, str, sizeof( toplines ) );
  2150. X    toplines[ sizeof( toplines ) - 1 ] = 0;
  2151. X        /* Needed for initial message to be visible */
  2152. X    if( cw->curx == -1 )
  2153. X    {
  2154. X        amii_curs( WIN_MESSAGE, 1, 0 );
  2155. X        cw->curx = 0;
  2156. X    }
  2157. X
  2158. X    if(strlen(str) >= (cw->cols-MORE_FUDGE))
  2159. X    {
  2160. X        int i;
  2161. X        char *p;
  2162. X
  2163. X        while( strlen( str ) >= (cw->cols-MORE_FUDGE) )
  2164. X        {
  2165. X        for(p=(&str[ cw->cols ])-MORE_FUDGE; !isspace(*p) && p != str;)
  2166. X        {
  2167. X            --p;
  2168. X        }
  2169. X        if( p == str )
  2170. X            p = &str[ cw->cols ];
  2171. X        outsubstr( cw, str, i = (long)p-(long)str );
  2172. X        cw->curx += i;
  2173. X        amii_cl_end( cw, cw->curx );
  2174. X        str = p+1;
  2175. X        }
  2176. X        if( *str )
  2177. X        {
  2178. X        outsubstr( cw, str, i = strlen( str ) );
  2179. X        cw->curx += i;
  2180. X        amii_cl_end( cw, cw->curx );
  2181. X        }
  2182. X    }
  2183. X    else
  2184. X    {
  2185. X        outsubstr( cw, str, i = strlen( str ) );
  2186. X        cw->curx += i;
  2187. X        amii_cl_end( cw, cw->curx );
  2188. X    }
  2189. X
  2190. X        /* If used all of history lines, move them down */
  2191. X
  2192. X        if( cw->maxrow == flags.msg_history )
  2193. X        {
  2194. X        if( cw->data[ 0 ] )
  2195. X            free( cw->data[ 0 ] );
  2196. X        memcpy( cw->data, &cw->data[ 1 ],
  2197. X            ( flags.msg_history - 1 ) * sizeof( char * ) );
  2198. X        cw->data[ flags.msg_history - 1 ] =
  2199. X                (char *) alloc( strlen( toplines ) + 1 );
  2200. X        strcpy( cw->data[ flags.msg_history - 1 ], toplines );
  2201. X        }
  2202. X        else
  2203. X        {
  2204. X        /* Otherwise, allocate a new one and copy the line in */
  2205. X        cw->data[ cw->maxrow ] = (char *)
  2206. X                        alloc( strlen( toplines ) + 1 );
  2207. X        strcpy( cw->data[ cw->maxrow++ ], toplines );
  2208. X        }
  2209. X        cw->maxcol = cw->maxrow;
  2210. X        break;
  2211. X
  2212. X    case NHW_STATUS:
  2213. X    if( cw->data[ cw->cury ] == NULL )
  2214. X        panic( "NULL pointer for status window" );
  2215. X    ob = &cw->data[cw->cury][j = cw->curx];
  2216. X    if(flags.botlx) *ob = 0;
  2217. X
  2218. X        /* Display when beam at top to avoid flicker... */
  2219. X    WaitTOF();
  2220. X    Text(w->RPort,str,strlen(str));
  2221. X    if( cw->cols > strlen( str ) )
  2222. X        TextSpaces( w->RPort, cw->cols - strlen( str ) );
  2223. X
  2224. X    (void) strncpy(cw->data[cw->cury], str, cw->cols );
  2225. X    cw->data[cw->cury][cw->cols-1] = '\0'; /* null terminate */
  2226. X    cw->cury = (cw->cury+1) % 2;
  2227. X    cw->curx = 0;
  2228. X    break;
  2229. X
  2230. X    case NHW_MAP:
  2231. X    case NHW_BASE:
  2232. X    amii_curs(window, cw->curx+1, cw->cury);
  2233. X    Text(w->RPort,str,strlen(str));
  2234. X    cw->curx = 0;
  2235. X        /* CR-LF is automatic in these windows */
  2236. X    cw->cury++;
  2237. X    break;
  2238. X
  2239. X    case NHW_MENU:
  2240. X    case NHW_TEXT:
  2241. X
  2242. X    /* always grows one at a time, but alloc 12 at a time */
  2243. X
  2244. X    if( cw->cury >= cw->rows || !cw->data ) {
  2245. X        char **tmp;
  2246. X
  2247. X        /* Allocate 12 more rows */
  2248. X        cw->rows += 12;
  2249. X        tmp = (char**) alloc(sizeof(char*) * cw->rows);
  2250. X
  2251. X        /* Copy the old lines */
  2252. X        for(i=0; i<cw->cury; i++)
  2253. X        tmp[i] = cw->data[i];
  2254. X
  2255. X        if( cw->data )
  2256. X        free( cw->data );
  2257. X
  2258. X        cw->data = tmp;
  2259. X
  2260. X        /* Null out the unused entries. */
  2261. X        for(i=cw->cury; i<cw->rows; i++)
  2262. X        cw->data[i] = 0;
  2263. X    }
  2264. X
  2265. X    if( !cw->data )
  2266. X        panic("no data storage");
  2267. X
  2268. X        /* Shouldn't need to do this, but... */
  2269. X
  2270. X    if( cw->data && cw->data[cw->cury] )
  2271. X        free( cw->data[cw->cury] );
  2272. X
  2273. X    n0 = strlen(str)+1;
  2274. X    cw->data[cw->cury] = (char*) alloc(n0+SOFF);
  2275. X
  2276. X        /* avoid nuls, for convenience */
  2277. X    cw->data[cw->cury][VATTR] = attr+1;
  2278. X    cw->data[cw->cury][SEL_ITEM] = 0;
  2279. X    Strcpy( cw->data[cw->cury] + SOFF, str);
  2280. X
  2281. X    if(n0 > cw->maxcol) cw->maxcol = n0;
  2282. X    if(++cw->cury > cw->maxrow) cw->maxrow = cw->cury;
  2283. X    break;
  2284. X
  2285. X    default:
  2286. X    panic("Invalid or unset window type in putstr()");
  2287. X    }
  2288. X}
  2289. X
  2290. END_OF_FILE
  2291. if test 45206 -ne `wc -c <'sys/amiga/winami.c1'`; then
  2292.     echo shar: \"'sys/amiga/winami.c1'\" unpacked with wrong size!
  2293. fi
  2294. # end of 'sys/amiga/winami.c1'
  2295. fi
  2296. echo shar: End of archive 20 \(of 108\).
  2297. cp /dev/null ark20isdone
  2298. MISSING=""
  2299. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  2300. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  2301. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  2302. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  2303. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  2304. 101 102 103 104 105 106 107 108 ; do
  2305.     if test ! -f ark${I}isdone ; then
  2306.     MISSING="${MISSING} ${I}"
  2307.     fi
  2308. done
  2309. if test "${MISSING}" = "" ; then
  2310.     echo You have unpacked all 108 archives.
  2311.     echo "Now execute 'rebuild.sh'"
  2312.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  2313. else
  2314.     echo You still need to unpack the following archives:
  2315.     echo "        " ${MISSING}
  2316. fi
  2317. ##  End of shell archive.
  2318. exit 0
  2319.