home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / volume14 / xpilot / part22 < prev    next >
Encoding:
Internet Message Format  |  1992-08-30  |  55.2 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: v14i024:  xpilot - Multiplayer gravity war game hand-shake program, Part22/24
  5. Message-ID: <3319@master.CNA.TEK.COM>
  6. Date: 4 Aug 92 19:31:58 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 2396
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: Bjoern Stabell <bjoerns@staff.cs.uit.no>
  12. Posting-number: Volume 14, Issue 24
  13. Archive-name: xpilot/Part22
  14. Environment: X11, ANSI C
  15.  
  16.  
  17.  
  18. #! /bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 22 (of 24)."
  25. # Contents:  fonts/map-5.bdf maps/README maps/doggy.uue
  26. #   src/cmdline.c src/dbuff.h src/lib/socklib.h src/player.c
  27. #   src/robot.c
  28. # Wrapped by billr@saab on Tue Aug  4 10:38:59 1992
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'fonts/map-5.bdf' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'fonts/map-5.bdf'\"
  32. else
  33. echo shar: Extracting \"'fonts/map-5.bdf'\" \(3350 characters\)
  34. sed "s/^X//" >'fonts/map-5.bdf' <<'END_OF_FILE'
  35. XSTARTFONT 2.1
  36. XCOMMENT This is a custom-made font for the xpilot game
  37. XFONT map-5
  38. XSIZE 1 1 1
  39. XFONTBOUNDINGBOX 5 5 0 0
  40. XSTARTPROPERTIES 3
  41. XFONT_ASCENT 5
  42. XFONT_DESCENT 0
  43. XDEFAULT_CHAR 36
  44. XENDPROPERTIES 
  45. XCHARS 29
  46. XSTARTCHAR Others
  47. XENCODING 36
  48. XSWIDTH 350 0 
  49. XDWIDTH 5 0 
  50. XBBX 5 5 0 0
  51. XBITMAP 
  52. X88
  53. X50
  54. X20
  55. X50
  56. X88
  57. XENDCHAR
  58. XSTARTCHAR PosGrav
  59. XENCODING 43
  60. XSWIDTH 350 0
  61. XDWIDTH 5 0
  62. XBBX 5 5 0 0
  63. XBITMAP 
  64. X20
  65. X20
  66. XF8
  67. X20
  68. X20
  69. XENDCHAR
  70. XSTARTCHAR NegGrav 
  71. XENCODING 45
  72. XSWIDTH 350 0 
  73. XDWIDTH 5 0 
  74. XBBX 5 5 0 0
  75. XBITMAP 
  76. X00
  77. X00
  78. XF8
  79. X00
  80. X00
  81. XENDCHAR
  82. XSTARTCHAR Slash
  83. XENCODING 47
  84. XSWIDTH 350 0 
  85. XDWIDTH 5 0 
  86. XBBX 5 5 0 0
  87. XBITMAP 
  88. X08
  89. X10
  90. X20
  91. X40
  92. X80
  93. XENDCHAR
  94. XSTARTCHAR Dot
  95. XENCODING 46
  96. XSWIDTH 350 0
  97. XDWIDTH 5 0
  98. XBBX 5 5 0 0
  99. XBITMAP
  100. X00
  101. X00
  102. X00
  103. X18
  104. X18
  105. XENDCHAR
  106. XSTARTCHAR Upperleft 
  107. XENCODING 113 
  108. XSWIDTH 350 0 
  109. XDWIDTH 5 0 
  110. XBBX 5 5 0 0
  111. XBITMAP 
  112. X08
  113. X18
  114. X38
  115. X78
  116. XF8
  117. XENDCHAR 
  118. XSTARTCHAR Upperright 
  119. XENCODING 119 
  120. XSWIDTH 350 0 
  121. XDWIDTH 5 0 
  122. XBBX 5 5 0 0 
  123. XBITMAP 
  124. X80
  125. XC0
  126. XE0
  127. XF0
  128. XF8
  129. XENDCHAR 
  130. XSTARTCHAR Lowerleft 
  131. XENCODING 97 
  132. XSWIDTH 350 0 
  133. XDWIDTH 5 0 
  134. XBBX 5 5 0 0 
  135. XBITMAP 
  136. XF8
  137. X78
  138. X38
  139. X18
  140. X08
  141. XENDCHAR 
  142. XSTARTCHAR Lowerright 
  143. XENCODING 115 
  144. XSWIDTH 350 0 
  145. XDWIDTH 5 0 
  146. XBBX 5 5 0 0 
  147. XBITMAP 
  148. XF8
  149. XF0
  150. XE0
  151. XC0
  152. X80
  153. XENDCHAR 
  154. XSTARTCHAR Upcannon 
  155. XENCODING 114
  156. XSWIDTH 350 0 
  157. XDWIDTH 5 0 
  158. XBBX 5 5 0 0 
  159. XBITMAP 
  160. X00
  161. X00
  162. X20
  163. X50
  164. X88
  165. XENDCHAR
  166. XSTARTCHAR Downcannon 
  167. XENCODING 99 
  168. XSWIDTH 350 0 
  169. XDWIDTH 5 0 
  170. XBBX 5 5 0 0
  171. XBITMAP 
  172. X88
  173. X50
  174. X20
  175. X00
  176. X00
  177. XENDCHAR 
  178. XSTARTCHAR Rightcannon 
  179. XENCODING 102 
  180. XSWIDTH 350 0 
  181. XDWIDTH 5 0 
  182. XBBX 5 5 0 0 
  183. XBITMAP 
  184. X80
  185. X40
  186. X20
  187. X40
  188. X80
  189. XENDCHAR 
  190. XSTARTCHAR Leftcannon 
  191. XENCODING 100 
  192. XSWIDTH 350 0 
  193. XDWIDTH 5 0 
  194. XBBX 5 5 0 0 
  195. XBITMAP
  196. X08
  197. X10
  198. X20
  199. X10
  200. X08
  201. XENDCHAR 
  202. XSTARTCHAR Square 
  203. XENCODING 120 
  204. XSWIDTH 350 0 
  205. XDWIDTH 5 0 
  206. XBBX 5 5 0 0 
  207. XBITMAP 
  208. XF8
  209. XF8
  210. XF8
  211. XF8
  212. XF8
  213. XENDCHAR 
  214. XSTARTCHAR Homebase 
  215. XENCODING 42
  216. XSWIDTH 350 0 
  217. XDWIDTH 5 0 
  218. XBBX 5 5 0 0 
  219. XBITMAP 
  220. X20
  221. X20
  222. XA8
  223. X70
  224. X20
  225. XENDCHAR
  226. XSTARTCHAR Fuel 
  227. XENCODING 70 
  228. XSWIDTH 350 0 
  229. XDWIDTH 5 0 
  230. XBBX 5 5 0 0 
  231. XBITMAP 
  232. XF8
  233. X88
  234. X88
  235. X88
  236. XF8
  237. XENDCHAR 
  238. XSTARTCHAR Open 
  239. XENCODING 32 
  240. XSWIDTH 350 0 
  241. XDWIDTH 5 0 
  242. XBBX 5 5 0 0 
  243. XBITMAP 
  244. X00
  245. X00
  246. X20
  247. X00
  248. X00
  249. XENDCHAR
  250. XSTARTCHAR Postnil
  251. XENCODING 48
  252. XSWIDTH 350 0 
  253. XDWIDTH 5 0 
  254. XBBX 5 5 0 0
  255. XBITMAP
  256. X20
  257. X50
  258. X88
  259. X50
  260. X20
  261. XENDCHAR
  262. XSTARTCHAR Postone
  263. XENCODING 49
  264. XSWIDTH 350 0 
  265. XDWIDTH 5 0 
  266. XBBX 5 5 0 0
  267. XBITMAP
  268. X20
  269. X50
  270. X88
  271. X50
  272. X20
  273. XENDCHAR
  274. XSTARTCHAR Posttwo
  275. XENCODING 50
  276. XSWIDTH 350 0 
  277. XDWIDTH 5 0 
  278. XBBX 5 5 0 0
  279. XBITMAP
  280. X20
  281. X50
  282. X88
  283. X50
  284. X20
  285. XENDCHAR
  286. XSTARTCHAR Postthree
  287. XENCODING 51
  288. XSWIDTH 350 0 
  289. XDWIDTH 5 0 
  290. XBBX 5 5 0 0
  291. XBITMAP
  292. X20
  293. X50
  294. X88
  295. X50
  296. X20
  297. XENDCHAR
  298. XSTARTCHAR Postfour
  299. XENCODING 52
  300. XSWIDTH 350 0 
  301. XDWIDTH 5 0 
  302. XBBX 5 5 0 0
  303. XBITMAP
  304. X20
  305. X50
  306. X88
  307. X50
  308. X20
  309. XENDCHAR
  310. XSTARTCHAR Postfive
  311. XENCODING 53
  312. XSWIDTH 350 0 
  313. XDWIDTH 5 0 
  314. XBBX 5 5 0 0
  315. XBITMAP
  316. X20
  317. X50
  318. X88
  319. X50
  320. X20
  321. XENDCHAR
  322. XSTARTCHAR Postsix
  323. XENCODING 54
  324. XSWIDTH 350 0 
  325. XDWIDTH 5 0 
  326. XBBX 5 5 0 0
  327. XBITMAP
  328. X20
  329. X50
  330. X88
  331. X50
  332. X20
  333. XENDCHAR
  334. XSTARTCHAR Postseven
  335. XENCODING 55
  336. XSWIDTH 350 0 
  337. XDWIDTH 5 0 
  338. XBBX 5 5 0 0
  339. XBITMAP
  340. X20
  341. X50
  342. X88
  343. X50
  344. X20
  345. XENDCHAR
  346. XSTARTCHAR Posteight
  347. XENCODING 56
  348. XSWIDTH 350 0 
  349. XDWIDTH 5 0 
  350. XBBX 5 5 0 0
  351. XBITMAP
  352. X20
  353. X50
  354. X88
  355. X50
  356. X20
  357. XENDCHAR
  358. XSTARTCHAR Postnine
  359. XENCODING 57
  360. XSWIDTH 350 0 
  361. XDWIDTH 5 0 
  362. XBBX 5 5 0 0
  363. XBITMAP
  364. X20
  365. X50
  366. X88
  367. X50
  368. X20
  369. XENDCHAR
  370. XSTARTCHAR counterclockwise
  371. XCOMMENT a curling forcefield with a counterclockwise curl
  372. XCOMMENT typed as '<' represented by a curling arrow
  373. XENCODING 60
  374. XSWIDTH 350 0
  375. XDWIDTH 5 0
  376. XBBX 5 5 0 0
  377. XBITMAP
  378. X40
  379. XF0
  380. X48
  381. X08
  382. X10
  383. XENDCHAR
  384. XSTARTCHAR clockwise
  385. XCOMMENT a curling forcefield with a clockwise curl
  386. XCOMMENT typed as '>' represented by a curling arrow 
  387. XENCODING 62
  388. XSWIDTH 350 0
  389. XDWIDTH 5 0
  390. XBBX 5 5 0 0
  391. XBITMAP
  392. X10
  393. X78
  394. X90
  395. X80
  396. X40
  397. XENDCHAR
  398. XENDFONT
  399. END_OF_FILE
  400. if test 3350 -ne `wc -c <'fonts/map-5.bdf'`; then
  401.     echo shar: \"'fonts/map-5.bdf'\" unpacked with wrong size!
  402. fi
  403. # end of 'fonts/map-5.bdf'
  404. fi
  405. if test -f 'maps/README' -a "${1}" != "-c" ; then 
  406.   echo shar: Will not clobber existing file \"'maps/README'\"
  407. else
  408. echo shar: Extracting \"'maps/README'\" \(160 characters\)
  409. sed "s/^X//" >'maps/README' <<'END_OF_FILE'
  410. XThe xpilots program will probably not find these maps automatically (if you
  411. Xhaven't specified the correct MAPDIR), so you will have to specify the
  412. Xwhole path.
  413. X
  414. END_OF_FILE
  415. if test 160 -ne `wc -c <'maps/README'`; then
  416.     echo shar: \"'maps/README'\" unpacked with wrong size!
  417. fi
  418. # end of 'maps/README'
  419. fi
  420. if test -f 'maps/doggy.uue' -a "${1}" != "-c" ; then 
  421.   echo shar: Will not clobber existing file \"'maps/doggy.uue'\"
  422. else
  423. echo shar: Extracting \"'maps/doggy.uue'\" \(3524 characters\)
  424. sed "s/^X//" >'maps/doggy.uue' <<'END_OF_FILE'
  425. Xbegin 644 doggy.map
  426. XM-#EX-3`*-`I$;V=G>5-T>6QE"DMJ96QL($ER9V5N<PIX>'AX>'AX>'AX>'AX
  427. XM>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX"G@N+BXN+BXN
  428. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+G@*>"XN
  429. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  430. XM>`IX+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  431. XM+BXN+BYX"G@N+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  432. XM+BXN+BXN+BXN+G@*>"XN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  433. XM+BXN+BXN+BXN+BXN+BXN>`IX+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  434. XM+BXN+BXN+BXN+BXN+BXN+BXN+BYX"G@N+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  435. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+G@*>"XN+BXN+BXN+BXN+BXN+BXN
  436. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN>`IX+BXN+BXN+BXN+BXN
  437. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BYX"G@N+BXN+BXN
  438. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+G@*>"XN
  439. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  440. XM>`IX+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  441. XM+BXN+BYX"G@N+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  442. XM+BXN+BXN+BXN+G@*>"XN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  443. XM+BXN+BXN+BXN+BXN+BXN>`IX+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  444. XM+BXN+BXN+BXN+BXN+BXN+BXN+BYX"G@N+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  445. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+G@*>"XN+BXN+BXN+BXN+BXN+BXN
  446. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN>`IX+BXN+BXN+BXN+BXN
  447. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BYX"G@N+BXN+BXN
  448. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+G@*>"XN
  449. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  450. XM>`IX+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  451. XM+BXN+BYX"G@N+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  452. XM+BXN+BXN+BXN+G@*>"XN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  453. XM+BXN+BXN+BXN+BXN+BXN>`IX+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  454. XM+BXN+BXN+BXN+BXN+BXN+BXN+BYX"G@N+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  455. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+G@*>"XN+BXN+BXN+BXN+BXN+BXN
  456. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN>`IX+BXN+BXN+BXN+BXN
  457. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BYX"G@N+BXN+BXN
  458. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+G@*>"XN
  459. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  460. XM>`IX+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  461. XM+BXN+BYX"G@N+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  462. XM+BXN+BXN+BXN+G@*>"XN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  463. XM+BXN+BXN+BXN+BXN+BXN>`IX+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  464. XM+BXN+BXN+BXN+BXN+BXN+BXN+BYX"G@N+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  465. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+G@*>"XN+BXN+BXN+BXN+BXN+BXN
  466. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN>`IX+BXN+BXN+BXN+BXN
  467. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BYX"G@N+BXN+BXN
  468. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+G@*>"XN
  469. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  470. XM>`IX+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  471. XM+BXN+BYX"G@N+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  472. XM+BXN+BXN+BXN+G@*>"XN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  473. XM+BXN+BXN+BXN+BXN+BXN>`IX+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  474. XM+BXN+BXN+BXN+BXN+BXN+BXN+BYX"G@N+BXN+BXN+BXN+BXN+BXN+BXN+BXN
  475. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+G@*>"XN+BXN+BXN+BXN+BXN+BXN
  476. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN>`IX+BXN+BXN+BXN+BXN
  477. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BYX"G@N+BXN+BXN
  478. XM+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+BXN+G@*>"XN
  479. XM<BXN+G(N+BYR+BXN<BXN+G(N+G(N+BYR+BXN<BXN+G(N+BYR+BXN<BXN+G(N
  480. XM>`IX+BI&*BXJ1BHN*D8J+BI&*BXJ1BXJ1BHN*D8J+BI&*BXJ1BHN*D8J+BI&
  481. XM*BXJ1BIX"GAX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX>'AX
  482. X1>'AX>'AX>'AX>'@*"@H*"@IX
  483. X`
  484. Xend
  485. END_OF_FILE
  486. if test 3524 -ne `wc -c <'maps/doggy.uue'`; then
  487.     echo shar: \"'maps/doggy.uue'\" unpacked with wrong size!
  488. fi
  489. # end of 'maps/doggy.uue'
  490. fi
  491. if test -f 'src/cmdline.c' -a "${1}" != "-c" ; then 
  492.   echo shar: Will not clobber existing file \"'src/cmdline.c'\"
  493. else
  494. echo shar: Extracting \"'src/cmdline.c'\" \(3323 characters\)
  495. sed "s/^X//" >'src/cmdline.c' <<'END_OF_FILE'
  496. X/* $Id: cmdline.c,v 1.6 1992/07/10 23:19:56 bjoerns Exp $
  497. X *
  498. X *    This file is part of the XPilot project, written by
  499. X *
  500. X *        Bjxrn Stabell (bjoerns@stud.cs.uit.no)
  501. X *        Ken Ronny Schouten (kenrsc@stud.cs.uit.no)
  502. X *
  503. X *    Copylefts are explained in the LICENSE file.
  504. X */
  505. X
  506. X#include <stdlib.h>
  507. X#include "global.h"
  508. X#include "robot.h"
  509. X#include "map.h"
  510. X
  511. X#ifndef    lint
  512. Xstatic char sourceid[] =
  513. X    "@(#)$Id: cmdline.c,v 1.6 1992/07/10 23:19:56 bjoerns Exp $";
  514. X#endif
  515. X
  516. Xdouble        Gravity = -0.14;    /* Power of gravity */
  517. Xdouble        ShipMass = 20.0;    /* Default mass of ship */
  518. Xdouble        ShotsMass = 0.1;    /* Default mass of shots */
  519. Xdouble        ShotsSpeed = 21.0;    /* Default speed of shots */
  520. Xint        ShotsLife = 90;        /* Default number of ticks */
  521. X                    /* each shot will live */
  522. Xint        WantedNumRobots = -1;    /* How many robots should enter */
  523. X                    /* the game? */
  524. Xint        ShotsMax = 256;        /* Max shots pr. player */
  525. Xbool        ShotsGravity = true;    /* Shots affected by gravity */
  526. Xbool        LooseMass = false;    /* Loose mass when firering */
  527. X
  528. Xbool        RawMode = false;    /* Let robots live even if there */
  529. X                    /* are no players logged in */
  530. Xbool        NoQuit = false;        /* Don't quit even if there are */
  531. X                    /* no human players playing */
  532. X
  533. X
  534. Xvoid Parser(int argc, char *argv[])
  535. X{
  536. X    int i;
  537. X    bool map_loaded = false;
  538. X
  539. X
  540. X    for (i=1; i<argc; i++) {
  541. X
  542. X    if (strncmp("-help", argv[i], 2) == 0) {
  543. X        printf("Usage:    %s [-options ..]\n\n"
  544. X           "Where options include:\n"
  545. X           "    -help            print out this message\n"
  546. X           "    -version        print out current version\n"
  547. X           "    -map <file>        use alternative map\n"
  548. X           "    -gravity <real>        sets gravity power\n"
  549. X           "    -shots <int>        new maximum shot limit\n"
  550. X           "    -shotspeed <real>    default speed of shots\n"
  551. X           "    -shotmass <real>    mass of players' shots\n"
  552. X           "    -shotlife <ticks>    how long shots should last\n"
  553. X           "    -shipmass <real>    mass of players' ship\n"
  554. X           "    -rawmode        don't sleep if there are "
  555. X           "only robots left\n"
  556. X           "    -noquit            don't quit if there are only "
  557. X           "robots left\n"
  558. X           "    -robots <int>        number of robots\n",
  559. X           argv[0]);
  560. X        exit(0);
  561. X    }
  562. X
  563. X    if (strncmp("-version", argv[i], 2) == 0) {
  564. X        puts(TITLE);
  565. X        exit(0);
  566. X    }
  567. X
  568. X    if (strcmp("-robots", argv[i]) == 0) {
  569. X        WantedNumRobots = atoi(argv[++i]);
  570. X        if (WantedNumRobots < 0)
  571. X        WantedNumRobots = INT_MAX;
  572. X        continue;
  573. X    }
  574. X
  575. X    if (strcmp("-rawmode", argv[i]) == 0) {
  576. X        RawMode = true;
  577. X        continue;
  578. X    }
  579. X
  580. X    if (strcmp("-noquit", argv[i]) == 0) {
  581. X        NoQuit = true;
  582. X        continue;
  583. X    }
  584. X
  585. X    if (strcmp("-map", argv[i]) == 0) {
  586. X        Load_map(argv[++i]);
  587. X        map_loaded = true;
  588. X        continue;
  589. X    }
  590. X
  591. X    if (strcmp("-gravity", argv[i]) == 0) {
  592. X        Gravity = atof(argv[++i]);
  593. X        continue;
  594. X    }
  595. X
  596. X    if (strcmp("-shots", argv[i]) == 0) {
  597. X        ShotsMax = atoi(argv[++i]);
  598. X        continue;
  599. X    }
  600. X
  601. X    if (strcmp("-shotmass", argv[i]) == 0) {
  602. X        ShotsMass = atof(argv[++i]);
  603. X        continue;
  604. X    }
  605. X
  606. X    if (strcmp("-shipmass", argv[i]) == 0) {
  607. X        ShipMass = atof(argv[++i]);
  608. X        continue;
  609. X    }
  610. X
  611. X    if (strcmp("-shotlife", argv[i]) == 0) {
  612. X        ShotsLife = atoi(argv[++i]);
  613. X        continue;
  614. X    }
  615. X
  616. X    if (strcmp("-shotspeed", argv[i]) == 0) {
  617. X        ShotsSpeed = atof(argv[++i]);
  618. X        continue;
  619. X    }
  620. X
  621. X    printf("Unkown option \"%s\".\n", argv[i]);
  622. X    }
  623. X
  624. X    if (!map_loaded) {
  625. X#ifndef SILENT
  626. X    printf("Map not specified, trying to open " DEFAULT_MAP ".\n");
  627. X#endif
  628. X    Load_map(DEFAULT_MAP);
  629. X    }
  630. X}
  631. END_OF_FILE
  632. echo shar: 1 control character may be missing from \"'src/cmdline.c'\"
  633. if test 3323 -ne `wc -c <'src/cmdline.c'`; then
  634.     echo shar: \"'src/cmdline.c'\" unpacked with wrong size!
  635. fi
  636. # end of 'src/cmdline.c'
  637. fi
  638. if test -f 'src/dbuff.h' -a "${1}" != "-c" ; then 
  639.   echo shar: Will not clobber existing file \"'src/dbuff.h'\"
  640. else
  641. echo shar: Extracting \"'src/dbuff.h'\" \(818 characters\)
  642. sed "s/^X//" >'src/dbuff.h' <<'END_OF_FILE'
  643. X/* dbuff.h,v 1.6 1992/06/25 03:23:51 bjoerns Exp
  644. X *
  645. X *    This file is part of the XPilot project, written by
  646. X *
  647. X *        Bjxrn Stabell (bjoerns@stud.cs.uit.no)
  648. X *        Ken Ronny Schouten (kenrsc@stud.cs.uit.no)
  649. X *
  650. X *    Copylefts are explained in the LICENSE file.
  651. X */
  652. X
  653. X#ifndef    DBUFF_H
  654. X#define    DBUFF_H
  655. X
  656. X#include <X11/Xlib.h>
  657. X
  658. Xtypedef struct {
  659. X    Display        *display;
  660. X    Colormap        cmap;
  661. X    unsigned long   drawing_planes;
  662. X    int            buffer;
  663. X    XColor        *colormaps[2];
  664. X    int            map_size;
  665. X    unsigned long   masks[2];
  666. X    unsigned long   *planes;
  667. X    unsigned long   pixel;
  668. X} dbuff_state_t;
  669. X
  670. X/*
  671. X * Prototypes.
  672. X */
  673. Xextern dbuff_state_t    *start_dbuff(int, Display *, Colormap,
  674. X                     unsigned long, XColor *);
  675. Xextern void        dbuff_switch(int, dbuff_state_t *);
  676. Xextern void        end_dbuff(int, dbuff_state_t *);
  677. X
  678. X#endif
  679. END_OF_FILE
  680. echo shar: 1 control character may be missing from \"'src/dbuff.h'\"
  681. if test 818 -ne `wc -c <'src/dbuff.h'`; then
  682.     echo shar: \"'src/dbuff.h'\" unpacked with wrong size!
  683. fi
  684. # end of 'src/dbuff.h'
  685. fi
  686. if test -f 'src/lib/socklib.h' -a "${1}" != "-c" ; then 
  687.   echo shar: Will not clobber existing file \"'src/lib/socklib.h'\"
  688. else
  689. echo shar: Extracting \"'src/lib/socklib.h'\" \(3113 characters\)
  690. sed "s/^X//" >'src/lib/socklib.h' <<'END_OF_FILE'
  691. X/* -*-C-*-
  692. X *
  693. X * Project :     TRACE
  694. X *
  695. X * File    :     socklib.h
  696. X *
  697. X * Description
  698. X *
  699. X * Copyright (C) 1991 by Arne Helme, The TRACE project
  700. X *
  701. X * Rights to use this source is granted for all non-commercial and research
  702. X * uses. Creation of derivate forms of this software may be subject to
  703. X * restriction. Please obtain written permission from the author.
  704. X *
  705. X * This software is provided "as is" without any express or implied warranty.
  706. X *
  707. X * RCS:      /users/staff/bjoerns/src/cvs/xpilot/src/lib/socklib.h,v 1.1.1.1 1992/05/11 12:32:34 bjoerns Exp
  708. X * Log:      socklib.h,v
  709. X * Revision 1.1.1.1  1992/05/11  12:32:34  bjoerns
  710. X * XPilot v1.0
  711. X *
  712. X * Revision 1.2  91/10/02  08:38:20  08:38:20  arne (Arne Helme)
  713. X * "ANSI C prototypes added."
  714. X * 
  715. X * Revision 1.1  91/10/02  08:34:53  08:34:53  arne (Arne Helme)
  716. X * Initial revision
  717. X * 
  718. X */
  719. X
  720. X#ifndef _SOCKLIB_INCLUDED
  721. X#define _SOCKLIB_INCLUDED
  722. X
  723. X/* Include files */
  724. X#include <sys/types.h>
  725. X#if(hpux)
  726. X#include <time.h>
  727. X#else
  728. X#include <sys/time.h>
  729. X#endif
  730. X#include <sys/socket.h>
  731. X#include <netinet/in.h>
  732. X#include <arpa/inet.h>
  733. X#include <stdio.h>
  734. X#include <netdb.h>
  735. X#include <signal.h>
  736. X#include <setjmp.h>
  737. X#include <errno.h>
  738. X
  739. X/* Error values and their meanings */
  740. X#define SL_ESOCKET        0    /* socket system call error */
  741. X#define SL_EBIND        1    /* bind system call error */
  742. X#define SL_ELISTEN        2    /* listen system call error */
  743. X#define SL_EHOSTNAME        3    /* Invalid host name format */
  744. X#define SL_ECONNECT        5    /* connect system call error */
  745. X#define SL_ESHUTD        6    /* shutdown system call error */
  746. X#define SL_ECLOSE        7    /* close system call error */
  747. X#define SL_EWRONGHOST        8    /* message arrived from unspec. host */
  748. X#define SL_ENORESP        9    /* No response */
  749. X#define SL_ERECEIVE        10    /* Receive error */
  750. X
  751. X#ifndef _SOCKLIB_LIBSOURCE
  752. Xextern int
  753. X    sl_errno,
  754. X    sl_timeout_s,
  755. X    sl_timeout_us,
  756. X    sl_default_retries,
  757. X    sl_broadcast_enabled;
  758. Xextern struct sockaddr_in
  759. X    sl_dgram_lastaddr;
  760. X#ifdef __STDC__
  761. Xextern void    SetTimeout(int, int);
  762. Xextern int    CreateServerSocket(int);
  763. Xextern int    GetPortNum(int);
  764. Xextern int    CreateClientSocket(char *, int);
  765. Xextern int    SocketAccept(int);
  766. Xextern int    SocketReadable(int);
  767. Xextern int    SocketRead(int, char *, int);
  768. Xextern int    SocketWrite(int, char *, int);
  769. Xextern int    SocketClose(int);
  770. Xextern int    CreateDgramSocket(int);
  771. Xextern int    DgramSend(int, char *, int, char *, int);
  772. Xextern int    DgramReceiveAny(int, char *, int);
  773. Xextern int    DgramReceive(int, char *, char *, int);
  774. Xextern int    DgramSendRec(int, char *, int, char *, int, char *, int);
  775. Xextern char    *DgramLastaddr(void);
  776. Xextern int    DgramLastport(void);
  777. X#else /* __STDC__ */
  778. Xextern void    SetTimeout();
  779. Xextern int    CreateServerSocket();
  780. Xextern int    GetPortNum();
  781. Xextern int    CreateClientSocket();
  782. Xextern int    SocketAccept();
  783. Xextern int    SocketReadable();
  784. Xextern int    SocketRead();
  785. Xextern int    SocketWrite();
  786. Xextern int    SocketClose();
  787. Xextern int    CreateDgramSocket();
  788. Xextern int    DgramSend();
  789. Xextern int    DgramReceiveAny();
  790. Xextern int    DgramReceive();
  791. Xextern int    DgramSendRec();
  792. Xextern char    *DgramLastaddr();
  793. Xextern int    DgramLastport();
  794. X#endif /* __STDC__ */
  795. X#endif /* _SOCKLIB_LIBSOURCE */
  796. X#endif /* _SOCKLIB_INCLUDED */
  797. END_OF_FILE
  798. if test 3113 -ne `wc -c <'src/lib/socklib.h'`; then
  799.     echo shar: \"'src/lib/socklib.h'\" unpacked with wrong size!
  800. fi
  801. # end of 'src/lib/socklib.h'
  802. fi
  803. if test -f 'src/player.c' -a "${1}" != "-c" ; then 
  804.   echo shar: Will not clobber existing file \"'src/player.c'\"
  805. else
  806. echo shar: Extracting \"'src/player.c'\" \(7761 characters\)
  807. sed "s/^X//" >'src/player.c' <<'END_OF_FILE'
  808. X/* player.c,v 1.12 1992/06/28 05:38:24 bjoerns Exp
  809. X *
  810. X *    This file is part of the XPilot project, written by
  811. X *
  812. X *        Bjxrn Stabell (bjoerns@stud.cs.uit.no)
  813. X *        Ken Ronny Schouten (kenrsc@stud.cs.uit.no)
  814. X *
  815. X *    Copylefts are explained in the LICENSE file.
  816. X */
  817. X
  818. X#include <stdio.h>
  819. X#include "global.h"
  820. X#include "map.h"
  821. X#include "score.h"
  822. X#include "robot.h"
  823. X
  824. X#ifndef    lint
  825. Xstatic char sourceid[] =
  826. X    "@(#)player.c,v 1.12 1992/06/28 05:38:24 bjoerns Exp";
  827. X#endif
  828. X
  829. X
  830. Xstatic char msg[MSG_LEN];
  831. X
  832. X
  833. X
  834. X/********** **********
  835. X * functions on player array.
  836. X */
  837. X
  838. Xvoid Pick_startpos(int ind)
  839. X{
  840. X    int    start, i;
  841. X    bool alone;
  842. X
  843. X
  844. X    do {
  845. X    alone = true;
  846. X    start = rand()%World.NumBases;
  847. X
  848. X    for (i=0; i<NumPlayers; i++)
  849. X        if (i != ind && Players[i]->home_base == start)
  850. X        alone = false;
  851. X    } while (!alone);
  852. X
  853. X    Players[ind]->home_base = start;
  854. X}
  855. X
  856. X
  857. X
  858. Xvoid Go_home(int ind)
  859. X{
  860. X    player *pl = Players[ind];
  861. X
  862. X    pl->pos.x = World.base[pl->home_base].x
  863. X        * BLOCK_SZ + BLOCK_SZ/2.0;
  864. X    pl->pos.y = World.base[pl->home_base].y
  865. X        * BLOCK_SZ - ships[DIR_UP].pts[1].y;
  866. X    pl->acc.x = pl->acc.y = 0.0;
  867. X    pl->vel.x = pl->vel.y = pl->velocity = 0.0;
  868. X
  869. X    CLR_BIT(pl->status, THRUSTING);
  870. X
  871. X    if (pl->robot_mode != RM_NOT_ROBOT)
  872. X    pl->robot_mode = RM_TAKE_OFF;
  873. X}
  874. X
  875. X
  876. Xvoid Init_player(int ind)
  877. X{
  878. X    player *pl = Players[ind];
  879. X    bool too_late = false;
  880. X    int i;
  881. X
  882. X
  883. X    pl->world.x = pl->world.y    = 0.0;
  884. X    pl->vel.x    = pl->vel.y    = 0.0;
  885. X    pl->acc.x    = pl->acc.y    = 0.0;
  886. X    pl->dir    = pl->double_dir= DIR_UP;
  887. X    pl->turnvel        = 0.0;
  888. X    pl->turnacc        = 0.0;
  889. X    pl->fuel        = DEFAULT_PLAYER_FUEL + (rand()%400) - 200;
  890. X    pl->max_fuel    = MAX_PLAYER_FUEL;
  891. X
  892. X    Pick_startpos(ind);
  893. X    Go_home(ind);
  894. X
  895. X    if (BIT(World.rules->mode, TIMING)) {
  896. X    pl->power    = MAX_PLAYER_POWER;
  897. X    pl->turnspeed    = 27.0;
  898. X    }
  899. X    pl->mass    = pl->emptymass    = ShipMass;
  900. X
  901. X    pl->check        = 0;
  902. X    pl->round        = 0;
  903. X    pl->time        = 0;
  904. X    pl->last_lap_time    = 0;
  905. X    pl->last_time    = 0;
  906. X    pl->last_lap    = 0;
  907. X    pl->best_run    = 0;
  908. X    pl->best_lap    = 0;
  909. X    pl->count        = -1;
  910. X    pl->control_count    = 0;
  911. X    pl->fuel_count    = 0;
  912. X
  913. X    pl->type        = OBJ_PLAYER;
  914. X    pl->shots        = 0;
  915. X    pl->extra_shots    = 0;
  916. X    pl->missiles    = 0;
  917. X    pl->mines        = 0;
  918. X    pl->cloaks        = 0;
  919. X    pl->sensors        = 0;
  920. X    pl->forceVisible    = 0;
  921. X    pl->shot_speed    = ShotsSpeed;
  922. X    pl->sensor_range    = MAX(pl->fuel*ENERGY_RANGE_FACTOR,VISIBILITY_DISTANCE);
  923. X    pl->max_speed    = SPEED_LIMIT - pl->shot_speed;
  924. X    pl->shot_max    = ShotsMax;
  925. X    pl->shot_life    = ShotsLife;
  926. X    pl->shot_mass    = ShotsMass;
  927. X    pl->score        = 0;
  928. X    pl->fs        = 0;
  929. X    pl->name[0]        = '\0';
  930. X
  931. X    pl->info_press    = false;
  932. X    pl->help_press    = false;
  933. X    pl->help_page    = 0;
  934. X
  935. X    pl->mode        = World.rules->mode;
  936. X    pl->status        = PLAYING | GRAVITY | DEF_BITS;
  937. X    pl->have        = DEF_HAVE;
  938. X    pl->used        = DEF_USED;
  939. X
  940. X    pl->mychar        = ' ';
  941. X    pl->life        = World.rules->lives;
  942. X
  943. X    /*
  944. X     * If limited lives and if nobody has lost a life yet, you may enter
  945. X     * now, otherwise you will have to wait 'til everyone gets GAME OVER.
  946. X     */
  947. X    if (BIT(pl->mode, LIMITED_LIVES)) {
  948. X    for (i=0; i<NumPlayers; i++)
  949. X        if (Players[i]->life < 3)
  950. X        too_late = true;
  951. X    if (too_late) {
  952. X        pl->mychar    = 'W';
  953. X        pl->life    = 0;
  954. X        pl->status |= GAME_OVER;
  955. X    }
  956. X    }
  957. X
  958. X    if (BIT(World.rules->mode, TIMING))
  959. X    pl->team = 0;
  960. X
  961. X    pl->lock.tagged    = LOCK_NONE;
  962. X    pl->lock.pl_id    = 0;
  963. X    pl->lock.pos.x    = pl->pos.x;
  964. X    pl->lock.pos.y    = pl->pos.y;
  965. X
  966. X    pl->robot_mode    = RM_NOT_ROBOT;
  967. X    pl->robot_count    = 0;
  968. X    pl->robot_ind    = -1;
  969. X
  970. X    pl->id        = Id;
  971. X    GetInd[Id]        = ind;
  972. X}
  973. X
  974. X
  975. X
  976. Xvoid Alloc_players(int number)
  977. X{
  978. X    int i;
  979. X
  980. X    for (i=0; i<number; i++)
  981. X    Players[i]=(player *)malloc(sizeof(player));
  982. X}
  983. X
  984. X
  985. X
  986. Xvoid Free_players(int number)
  987. X{
  988. X    int i;
  989. X
  990. X    for (i=0; i<number; i++)            
  991. X    free(Players[i]);
  992. X}
  993. X
  994. X
  995. X
  996. Xvoid Set_label_strings(void)
  997. X{
  998. X    int i, j, hi_ind;
  999. X    double hi, hi_tmp;
  1000. X    player *pl, *tmp;
  1001. X
  1002. X
  1003. X    /*
  1004. X     * Sorts players after score. (selection sort)
  1005. X     */
  1006. X    for (i=0; i<NumPlayers; i++) {
  1007. X
  1008. X    hi = Players[i]->score;
  1009. X    hi_ind = i;
  1010. X    for (j=i+1; j<NumPlayers; j++)
  1011. X        if (Players[j]->score > hi)
  1012. X        hi = Players[hi_ind=j]->score;
  1013. X
  1014. X    if (hi_ind != i) {
  1015. X        tmp = Players[hi_ind];
  1016. X        Players[hi_ind] = Players[i];
  1017. X        Players[i] = tmp;
  1018. X        GetInd[Players[i]->id] = i;
  1019. X        GetInd[Players[hi_ind]->id] = hi_ind;
  1020. X    }
  1021. X    }
  1022. X
  1023. X    /*
  1024. X     * Get the person with the best kill-ratio (i.e. score/number of deaths.)
  1025. X     */
  1026. X    hi = (double)Players[0]->score / (Players[0]->life+1);
  1027. X    hi_ind = 0;
  1028. X    for (i=1; i<NumPlayers; i++)
  1029. X    if ((hi_tmp = (double)Players[i]->score/(Players[i]->life+1)) > hi) {
  1030. X        hi = hi_tmp;
  1031. X        hi_ind = i;
  1032. X    }
  1033. X
  1034. X    /*
  1035. X     * Re-formats the labels.
  1036. X     */
  1037. X    for (i=0; i<NumPlayers; i++) {
  1038. X    pl = Players[i];
  1039. X
  1040. X    sprintf(pl->lblstr, "%c%c %-19s%03d%6d", (hi_ind==i)?'*':pl->mychar,
  1041. X        (pl->team==0)?' ':pl->team+'0',
  1042. X        pl->name, pl->life, pl->score);
  1043. X    }
  1044. X
  1045. X    Set_labels();
  1046. X}
  1047. X
  1048. X
  1049. X/*
  1050. XIKKE FERDIG
  1051. Xvoid Reset_all_players(void)
  1052. X{
  1053. X    int i;
  1054. X
  1055. X
  1056. X    for (i=0; i<NumPlayers; i++) {
  1057. X    printf("Resetting player %s\n", Players[i]->name);
  1058. X    CLR_BIT(Players[i]->status, GAME_OVER);
  1059. X    Players[i]->life = World.rules->lives;
  1060. X    Players[i]->mychar = ' ';
  1061. X    }
  1062. X    Set_label_strings();
  1063. X}
  1064. XKalles fra Comput_game_status()
  1065. X*/
  1066. X
  1067. X
  1068. Xvoid Compute_game_status(void)
  1069. X{
  1070. X/*  int i;
  1071. X    int num_alive = 0, num_waiting = 0;
  1072. X    bool too_late = false;
  1073. X    int pl_id;
  1074. X
  1075. X
  1076. X    for (i=0; i<NumPlayers; i++) {
  1077. X    if (!BIT(Players[i]->status, GAME_OVER)) {
  1078. X        num_alive++;
  1079. X        pl_id = i;
  1080. X    }
  1081. X    if (Players[i]->mychar == 'W')
  1082. X        num_waiting++;
  1083. X    }
  1084. X
  1085. XDette er ikke ferdig Ken.  :)
  1086. X
  1087. X    if (NumPlayers>1 && num_alive<=1) {
  1088. X    if (num_alive == 0)
  1089. X        Set_message("Game over! No apparent winners.");
  1090. X
  1091. X
  1092. X    if ((num_alive == 1) && (NumPlayers != 1)) {
  1093. X    sprintf(msg, "%s has won the game!!!!!!! Long live %s!",
  1094. X        Players[pl_id]->name, Players[pl_id]->name);
  1095. X    Set_message(msg);
  1096. X    Players[pl_id]->score += PTS_GAME_WON;
  1097. X    Reset_all_players();
  1098. X    } else if (num_alive == 0) {
  1099. X    Reset_all_players();
  1100. X    }    
  1101. X*/
  1102. X}
  1103. X
  1104. X
  1105. X
  1106. Xvoid Delete_player(int ind)
  1107. X{
  1108. X    player *pl;
  1109. X    int i, id;
  1110. X
  1111. X
  1112. X    pl = Players[ind];
  1113. X    id = pl->id;
  1114. X
  1115. X    for (i=0; i<NumObjs; i++)        /* Delete all remaining shots */
  1116. X    if (Obj[i]->id == id)
  1117. X        Delete_shot(i);
  1118. X
  1119. X    NumPlayers--;
  1120. X    if (pl->robot_mode != RM_NOT_ROBOT)
  1121. X    NumRobots--;
  1122. X
  1123. X    /*
  1124. X     * Swap entry no 'ind' with the last one.
  1125. X     */
  1126. X    pl            = Players[NumPlayers];    /* Swap pointers... */
  1127. X    Players[NumPlayers]    = Players[ind];
  1128. X    Players[ind]    = pl;
  1129. X
  1130. X    GetInd[Players[ind]->id] = ind;
  1131. X
  1132. X    for (i=0; i<NumPlayers; i++)
  1133. X    if ((Players[i]->lock.pl_id == id) || NumPlayers <= 1)
  1134. X        Players[i]->lock.tagged = LOCK_NONE;
  1135. X}
  1136. X
  1137. X
  1138. X
  1139. Xvoid Kill_player(int ind)
  1140. X{
  1141. X    player *pl;
  1142. X
  1143. X
  1144. X    Explode(ind);
  1145. X
  1146. X    pl            = Players[ind];
  1147. X    pl->vel.x        = pl->vel.y    = 0.0;
  1148. X    pl->acc.x        = pl->acc.y    = 0.0;
  1149. X    pl->double_dir    = pl->dir    = DIR_UP;
  1150. X    pl->turnacc        = 0.0;
  1151. X    pl->turnvel        = 0.0;
  1152. X    pl->mass        = ShipMass;
  1153. X    pl->status        |= WAITING_SHOTS | DEF_BITS;
  1154. X    pl->status        &= ~(KILL_BITS);
  1155. X    pl->extra_shots    = 0;
  1156. X    pl->missiles    = 0;
  1157. X    pl->mines        = 0;
  1158. X    pl->cloaks        = 0;
  1159. X    pl->sensors        = 0;
  1160. X    pl->forceVisible    = 0;
  1161. X    pl->shot_speed    = ShotsSpeed;
  1162. X    pl->shot_max    = ShotsMax;
  1163. X    pl->shot_life    = ShotsLife;
  1164. X    pl->shot_mass    = ShotsMass;
  1165. X    pl->last_time    = pl->time;
  1166. X    pl->last_lap    = 0;
  1167. X    pl->count        = RECOVERY_DELAY;
  1168. X
  1169. X    pl->fuel *= 0.90;                /* Loose 10% of fuel */
  1170. X    pl->fuel = MAX(pl->fuel, MIN_PLAYER_FUEL+(rand()%(int)MIN_PLAYER_FUEL)/5);
  1171. X
  1172. X    if (BIT(World.rules->mode, TIMING))
  1173. X    pl->fuel = RACE_PLAYER_FUEL;
  1174. X
  1175. X    if (BIT(pl->mode, LIMITED_LIVES))
  1176. X    pl->life--;
  1177. X    else
  1178. X    pl->life++;
  1179. X
  1180. X    if (pl->life == -1) {
  1181. X    pl->life = 0;
  1182. X    SET_BIT(pl->status, GAME_OVER);
  1183. X    pl->mychar = 'D';
  1184. X    }
  1185. X
  1186. X    pl->have    = DEF_HAVE;
  1187. X    pl->used    |= DEF_USED;
  1188. X    pl->used    &= ~(USED_KILL);
  1189. X    pl->used    &= pl->have;
  1190. X}
  1191. END_OF_FILE
  1192. echo shar: 1 control character may be missing from \"'src/player.c'\"
  1193. if test 7761 -ne `wc -c <'src/player.c'`; then
  1194.     echo shar: \"'src/player.c'\" unpacked with wrong size!
  1195. fi
  1196. # end of 'src/player.c'
  1197. fi
  1198. if test -f 'src/robot.c' -a "${1}" != "-c" ; then 
  1199.   echo shar: Will not clobber existing file \"'src/robot.c'\"
  1200. else
  1201. echo shar: Extracting \"'src/robot.c'\" \(27268 characters\)
  1202. sed "s/^X//" >'src/robot.c' <<'END_OF_FILE'
  1203. X/* robot.c,v 1.3 1992/06/26 15:25:46 bjoerns Exp
  1204. X *
  1205. X *    This file is part of the XPilot project, written by
  1206. X *
  1207. X *        Bjxrn Stabell (bjoerns@stud.cs.uit.no)
  1208. X *        Ken Ronny Schouten (kenrsc@stud.cs.uit.no)
  1209. X *
  1210. X *    Copylefts are explained in the LICENSE file.
  1211. X *
  1212. X *      Thanks to Maurice Abraham for this piece of code, and what
  1213. X *      a beauty it is :)
  1214. X */
  1215. X
  1216. X#include "global.h"
  1217. X#include "map.h"
  1218. X#include "score.h"
  1219. X#include "draw.h"
  1220. X#include "robot.h"
  1221. X
  1222. X#ifndef    lint
  1223. Xstatic char sourceid[] =
  1224. X    "@(#)robot.c,v 1.3 1992/06/26 15:25:46 bjoerns Exp";
  1225. X#endif
  1226. X
  1227. X
  1228. Xextern long    KILLING_SHOTS;
  1229. X
  1230. Xint        NumRobots = 0;
  1231. Xstatic int    MAX_ROBOTS = 1;
  1232. X
  1233. Xstatic robot_t Robots[] = {
  1234. X    "Mad Max",        94, 20,
  1235. X    "Blackie",        10, 90,
  1236. X    "Kryten",        70, 40,
  1237. X    "Marvin",        30, 70,
  1238. X    "R2D2",        50, 60,
  1239. X    "C3PO",        60, 50,
  1240. X    "K9",        50, 50,
  1241. X    "Robby",        45, 55,
  1242. X    "Mickey",        05, 95,
  1243. X    "Hermes",        15, 85,
  1244. X    "Pan",        60, 60,
  1245. X    "Azurion",        40, 30,
  1246. X    "Droidion",        60, 30,
  1247. X    "Terminator",    80, 40,
  1248. X    "Sniper",        30, 90,
  1249. X    "Slugger",        40, 40,
  1250. X    "Uzi",        95,  5,
  1251. X    "Capone",        80, 50,
  1252. X    "Tanx",        40, 70,
  1253. X    "Chrome Star",    60, 60,
  1254. X    "Bully",        80, 10,
  1255. X    "Metal Hero",    40, 45,
  1256. X    "Aurora",        60, 55,
  1257. X    "Dalt Wisney",    30, 75,
  1258. X    "Psycho",        65, 55,
  1259. X    "Gorgon",        30, 40,
  1260. X    "Pompel",        50, 50,
  1261. X    "Pilt",        50, 50,
  1262. X    "Sparky",        20, 40,
  1263. X    "Cobra",        85, 60,
  1264. X    "Falcon",        70, 20,
  1265. X    "Boson",        25, 35,
  1266. X    "Blazy",        40, 40,
  1267. X    "Pixie",        15, 93,
  1268. X    "Wimpy",         5, 98,
  1269. X    "Bonnie",        30, 40,
  1270. X    "Clyde",        40, 45,
  1271. X    "Neuro",        70, 70,
  1272. X    NULL,         0,  0
  1273. X};
  1274. X
  1275. X
  1276. X/*
  1277. X * Private functions.
  1278. X */
  1279. Xstatic void Calculate_max_robots(void);
  1280. Xstatic void New_robot(void);
  1281. Xstatic void Delete_robot(void);
  1282. Xstatic bool Check_robot_navigate(int ind, bool *no_evade);
  1283. Xstatic bool Check_robot_evade(int ind, int mine_i, int ship_i);
  1284. Xstatic bool Check_robot_target(int ind, int item_x, int item_y, int new_mode,
  1285. X                int attack_level);
  1286. X
  1287. X
  1288. X
  1289. X/********** **********
  1290. X * Updating robots and the like.
  1291. X */
  1292. X
  1293. Xstatic void Calculate_max_robots(void)
  1294. X{
  1295. X    int    i;
  1296. X
  1297. X    for (i=0; Robots[i].name != NULL; i++)
  1298. X    ;
  1299. X
  1300. X    MAX_ROBOTS = i;
  1301. X}
  1302. X
  1303. X
  1304. X
  1305. Xstatic void Delete_robot(void)
  1306. X{
  1307. X    long    i, low_score = LONG_MAX, low_i = -1;
  1308. X
  1309. X
  1310. X    for (i=0; i<NumPlayers; i++) {
  1311. X    if (Players[i]->robot_mode == RM_NOT_ROBOT)
  1312. X        continue;
  1313. X
  1314. X    if (Players[i]->score < low_score) {
  1315. X        low_i = i;
  1316. X        low_score = Players[i]->score;
  1317. X    }
  1318. X    }
  1319. X
  1320. X    if (low_i >= 0) {
  1321. X    Quit(low_i);
  1322. X    }
  1323. X}
  1324. X
  1325. X
  1326. X
  1327. Xstatic void New_robot(void)
  1328. X{
  1329. X    player    *robot;
  1330. X    robot_t    *rob;
  1331. X    int        i, num;
  1332. X    static bool    first_time = true;
  1333. X
  1334. X
  1335. X    if (first_time) {
  1336. X    Calculate_max_robots();
  1337. X    first_time = false;
  1338. X    }
  1339. X
  1340. X    if (NumPlayers >= World.NumBases-1)
  1341. X    return;
  1342. X
  1343. X    Init_player(NumPlayers);
  1344. X    robot = Players[NumPlayers];
  1345. X
  1346. X new_name:
  1347. X    num = rand()%MAX_ROBOTS;
  1348. X
  1349. X    for (i=0; i<NumPlayers; i++)
  1350. X    if (num == Players[i]->robot_ind)
  1351. X        goto new_name;
  1352. X
  1353. X    rob = &Robots[num];
  1354. X
  1355. X    strcpy(robot->name, rob->name);
  1356. X    strcpy(robot->realname, "robot");
  1357. X
  1358. X    robot->disp_type    = DT_NONE;
  1359. X    robot->color    = WHITE;
  1360. X    robot->name_length    = strlen(robot->name) * 6;
  1361. X    robot->turnspeed    = MAX_PLAYER_TURNSPEED;
  1362. X    robot->turnspeed_s    = MAX_PLAYER_TURNSPEED;
  1363. X    robot->turnresistance    = 0.12;
  1364. X    robot->turnresistance_s    = 0.12;
  1365. X    robot->power    = MAX_PLAYER_POWER;
  1366. X    robot->power_s    = MAX_PLAYER_POWER;
  1367. X    robot->instruments    = 0;
  1368. X    robot->team        = 0;
  1369. X    robot->mychar    = 'R';
  1370. X    robot->robot_mode    = RM_TAKE_OFF;
  1371. X    robot->robot_ind    = num;
  1372. X
  1373. X/*    robot->shot_speed    = ShotsSpeed + (rob->attack - 50) / 5.0;
  1374. X    robot->shot_mass    = ShotsMass + (rob->defense - rob->attack) / 10.0;
  1375. X    robot->max_speed    = SPEED_LIMIT - robot->shot_speed;
  1376. X*/
  1377. X    NumPlayers++;
  1378. X    Id++;
  1379. X    NumRobots++;
  1380. X
  1381. X#ifndef    SILENT    
  1382. X    printf("%s (%d, %s) starts at startpos %d.\n",
  1383. X       robot->name, NumPlayers, robot->realname, robot->home_base);
  1384. X#endif
  1385. X
  1386. X    Set_label_strings();
  1387. X}
  1388. X
  1389. X
  1390. Xstatic bool Check_robot_navigate(int ind, bool *no_evade)
  1391. X{
  1392. X    int i,j,k;
  1393. X    player *pl;
  1394. X    int area_val[10][10];
  1395. X    int calc_val[10][10];
  1396. X    int locn_block;
  1397. X    long dx, dy;
  1398. X    int di, dj;
  1399. X    bool found_wall;
  1400. X    bool found_grav;
  1401. X    bool cannon_dead;
  1402. X    bool near_wall;
  1403. X    int best_val;
  1404. X    int best_i, best_j;
  1405. X    float best_vx, best_vy;
  1406. X    int best_dir;
  1407. X    int delta_dir;
  1408. X
  1409. X    pl = Players[ind];
  1410. X
  1411. X    if (pl->velocity > 2.0 || ABS(pl->vel.x) > 1.5)
  1412. X    return false;
  1413. X
  1414. X    for (i = 0; i < 10; i ++) {
  1415. X    for (j = 0; j < 10; j ++) {
  1416. X        area_val[i][j] = 0;
  1417. X    }
  1418. X    }
  1419. X
  1420. X    found_wall = false;
  1421. X    found_grav = false;
  1422. X
  1423. X    for (i = 0; i < 10; i += 2) {
  1424. X    for (j = 0; j < 10; j += 2) {
  1425. X
  1426. X        dx = (long)(pl->pos.x / BLOCK_SZ) + (i / 2) - 2;
  1427. X        dy = (long)(pl->pos.y / BLOCK_SZ) + (j / 2) - 2;
  1428. X
  1429. X        if (dx<0 || dx>=World.x || dy<0 || dy>=World.y)
  1430. X        locn_block = FILLED;
  1431. X        else
  1432. X        locn_block = World.block[dx][dy];
  1433. X
  1434. X        switch (locn_block) {
  1435. X
  1436. X        case SPACE:
  1437. X        case BASE:
  1438. X        case WORMHOLE:
  1439. X        area_val[i][j] = 1;
  1440. X        area_val[i+1][j] = 1;
  1441. X        area_val[i+1][j+1] = 1;
  1442. X        area_val[i][j+1] = 1;
  1443. X        break;
  1444. X
  1445. X        case REC_LU:
  1446. X        area_val[i+1][j] = 1;
  1447. X        found_wall = true;
  1448. X        break;
  1449. X
  1450. X        case REC_LD:
  1451. X        area_val[i+1][j+1] = 1;
  1452. X        found_wall = true;
  1453. X        break;
  1454. X
  1455. X        case REC_RU:
  1456. X        area_val[i][j] = 1;
  1457. X        found_wall = true;
  1458. X        break;
  1459. X
  1460. X        case REC_RD:
  1461. X        area_val[i][j+1] = 1;
  1462. X        found_wall = true;
  1463. X        break;
  1464. X
  1465. X        case POS_GRAV:
  1466. X        case NEG_GRAV:
  1467. X        case CWISE_GRAV:
  1468. X        case ACWISE_GRAV:
  1469. X        found_grav = true;
  1470. X        break;
  1471. X
  1472. X        case CANNON:
  1473. X        cannon_dead = true;
  1474. X        for (k = 0; k < World.NumCannons; k ++) {
  1475. X            if (World.cannon[k].pos.x == dx
  1476. X                && World.cannon[k].pos.y == dy
  1477. X                && World.cannon[k].dead_time <= 50)
  1478. X            cannon_dead = false;
  1479. X        }
  1480. X        if (cannon_dead) {
  1481. X            area_val[i][j] = 1;
  1482. X            area_val[i+1][j] = 1;
  1483. X            area_val[i+1][j+1] = 1;
  1484. X            area_val[i][j+1] = 1;
  1485. X        }
  1486. X        found_wall = true;
  1487. X        break;
  1488. X
  1489. X        default:
  1490. X        found_wall = true;
  1491. X        break;
  1492. X        }
  1493. X    }
  1494. X    }
  1495. X
  1496. X    if (found_grav || !found_wall)
  1497. X    return false;
  1498. X
  1499. X    /* iterate twice for weighting, central 6x6 square should be accurate */
  1500. X
  1501. X    for (k = 0; k < 2; k ++) {
  1502. X    for (i = 0; i < 10; i ++) {
  1503. X        for (j = 0; j < 10; j ++) {
  1504. X
  1505. X        calc_val[i][j] = 0;
  1506. X        if (area_val[i][j] == 0)
  1507. X            continue;
  1508. X
  1509. X        if (i <= 0 || i >= 9 || j <= 0 || j >= 9)
  1510. X            continue;
  1511. X
  1512. X        calc_val[i][j] += 2*area_val[i-1][j];
  1513. X        calc_val[i][j] += 2*area_val[i][j+1];
  1514. X        calc_val[i][j] += 2*area_val[i+1][j];
  1515. X        calc_val[i][j] += 2*area_val[i][j-1];
  1516. X
  1517. X        calc_val[i][j] += area_val[i-1][j-1];
  1518. X        calc_val[i][j] += area_val[i-1][j+1];
  1519. X        calc_val[i][j] += area_val[i+1][j-1];
  1520. X        calc_val[i][j] += area_val[i+1][j+1];
  1521. X        }
  1522. X    }
  1523. X
  1524. X    for (i = 0; i < 10; i ++) {
  1525. X        for (j = 0; j < 10; j ++) {
  1526. X        area_val[i][j] = calc_val[i][j];
  1527. X        }
  1528. X    }
  1529. X    }
  1530. X
  1531. X    /* now focus in to local 3x3 square */
  1532. X
  1533. X    dx = pl->pos.x;
  1534. X    dy = pl->pos.y;
  1535. X
  1536. X    dx = dx - (dx / BLOCK_SZ * BLOCK_SZ);
  1537. X    dy = dy - (dy / BLOCK_SZ * BLOCK_SZ);
  1538. X
  1539. X    di = 3;
  1540. X    dj = 3;
  1541. X
  1542. X    if (dx > BLOCK_SZ/2) {
  1543. X    di ++;
  1544. X    dx -= BLOCK_SZ/2;
  1545. X    }
  1546. X
  1547. X    if (dy > BLOCK_SZ/2) {
  1548. X    dj ++;
  1549. X    dy -= BLOCK_SZ/2;
  1550. X    }
  1551. X
  1552. X    for (i = 0; i < 3; i ++) {
  1553. X    for (j = 0; j < 3; j ++) {
  1554. X        area_val[i][j] = area_val[di+i][dj+j];
  1555. X    }
  1556. X    }
  1557. X
  1558. X    *no_evade = true;
  1559. X
  1560. X    if (ABS(pl->vel.x) < 0.5) {
  1561. X
  1562. X    best_i = 1;
  1563. X    best_j = (pl->vel.y > 0 ? 2 : 0);
  1564. X
  1565. X    } else if (ABS(pl->vel.y) < 0.5) {
  1566. X
  1567. X    best_i = (pl->vel.x > 0 ? 2 : 0);
  1568. X    best_j = 1;
  1569. X
  1570. X    } else {
  1571. X
  1572. X    best_i = (pl->vel.x > 0 ? 2 : 0);
  1573. X    best_j = (pl->vel.y > 0 ? 2 : 0);
  1574. X    }
  1575. X
  1576. X    best_val = area_val[best_i][best_j];
  1577. X    near_wall = false;
  1578. X
  1579. X    for (j = 2; j >= 0; j --) {
  1580. X    for (i = 0; i <= 2; i ++) {
  1581. X
  1582. X        if (i == 1 && j == 1)
  1583. X        continue;
  1584. X
  1585. X        if (area_val[i][j] == 0) {
  1586. X        near_wall = true;
  1587. X        if (i == 1 && (j == 0 || j == 2)) {
  1588. X            best_i = 1;
  1589. X            best_j = (2 - j);
  1590. X            best_val = 99999;
  1591. X        }
  1592. X        continue;
  1593. X        }
  1594. X
  1595. X        if (area_val[i][j] > best_val) {
  1596. X        best_i = i;
  1597. X        best_j = j;
  1598. X        best_val = area_val[i][j];
  1599. X        }
  1600. X    }
  1601. X    }
  1602. X
  1603. X    if (area_val[1][1] >= best_val)
  1604. X    return false;
  1605. X
  1606. X    if (!near_wall) {
  1607. X    if (BIT(pl->used, OBJ_REFUEL)) {
  1608. X        /* refueling, so hang around */
  1609. X        best_i = 1;
  1610. X        best_j = 1;
  1611. X        best_val = area_val[1][1];
  1612. X    } else {
  1613. X        return false;
  1614. X    }
  1615. X    }
  1616. X
  1617. X    if (best_j == 1) {
  1618. X    if (dy < BLOCK_SZ/6)
  1619. X        best_j = 2;
  1620. X    if (dy > BLOCK_SZ/3)
  1621. X        best_j = 0;
  1622. X    }
  1623. X
  1624. X    pl->turnspeed = MAX_PLAYER_TURNSPEED;
  1625. X    pl->power = pl->mass / 2;
  1626. X    LIMIT(pl->power, MIN_PLAYER_POWER, MAX_PLAYER_POWER);
  1627. X
  1628. X    best_vx = (best_i - 1) * 0.75;
  1629. X    best_vy = (best_j - 1) * 1.25;
  1630. X
  1631. X    if (pl->vel.x > best_vx + 0.75)
  1632. X    best_dir = 3*RES/8;
  1633. X    else
  1634. X    if (pl->vel.x < best_vx - 0.75)
  1635. X    best_dir = RES/8;
  1636. X    else
  1637. X    if (pl->vel.x > best_vx + 0.25)
  1638. X    best_dir = 5*RES/16;
  1639. X    else
  1640. X    if (pl->vel.x < best_vx - 0.25)
  1641. X    best_dir = 3*RES/16;
  1642. X    else
  1643. X    best_dir = RES/4;
  1644. X
  1645. X    delta_dir = best_dir - pl->dir;
  1646. X    delta_dir = MOD(delta_dir, RES);
  1647. X
  1648. X    if (delta_dir > RES/8 && delta_dir < 7*RES/8) {
  1649. X    pl->turnacc = (delta_dir < RES/2 ?
  1650. X            pl->turnspeed : (-pl->turnspeed));
  1651. X    } else if (delta_dir > RES/64 && delta_dir < 63*RES/64) {
  1652. X    pl->turnspeed = MIN_PLAYER_TURNSPEED;
  1653. X    pl->turnacc = (delta_dir < RES/2 ?
  1654. X            pl->turnspeed : (-pl->turnspeed));
  1655. X    } else {
  1656. X    pl->turnacc = 0;
  1657. X    }
  1658. X
  1659. X    if (pl->vel.y > best_vy + 0.25) {
  1660. X    CLR_BIT(pl->status, THRUSTING);
  1661. X    } else if (pl->vel.y < best_vy - 0.25) {
  1662. X    SET_BIT(pl->status, THRUSTING);
  1663. X    }
  1664. X
  1665. X    return true;
  1666. X}
  1667. X
  1668. X
  1669. Xstatic bool Check_robot_evade(int ind, int mine_i, int ship_i)
  1670. X{
  1671. X    int i;
  1672. X    player *pl;
  1673. X    object *shot;
  1674. X    player *ship;
  1675. X    int stop_dist;
  1676. X    bool evade;
  1677. X    bool left_ok,right_ok;
  1678. X    int safe_width;
  1679. X    int travel_dir;
  1680. X    int delta_dir;
  1681. X    int aux_dir;
  1682. X    int px[3],py[3];
  1683. X    int dist;
  1684. X    int locn_block;
  1685. X    vector *gravity;
  1686. X    int gravity_dir;
  1687. X    int dx,dy;
  1688. X
  1689. X    pl        = Players[ind];
  1690. X    safe_width    = 3*SHIP_SZ/2;
  1691. X    stop_dist    =
  1692. X    (RES * pl->velocity) / (MAX_PLAYER_TURNSPEED * pl->turnresistance)
  1693. X        + (pl->velocity * pl->velocity * pl->mass) / (2 * MAX_PLAYER_POWER)
  1694. X        + safe_width;
  1695. X    evade = false;
  1696. X
  1697. X    if (pl->velocity <= 0.2)
  1698. X    travel_dir = DIR_DOWN;
  1699. X    else {
  1700. X    travel_dir = atan2(pl->vel.y, pl->vel.x) * RES / (2.0 * PI);
  1701. X    travel_dir = MOD(travel_dir, RES);
  1702. X    }
  1703. X
  1704. X    aux_dir = MOD(travel_dir+RES/4, RES);
  1705. X    px[0] = pl->pos.x;                /* ship center x */
  1706. X    py[0] = pl->pos.y;                /* ship center y */
  1707. X    px[1] = px[0] + safe_width * tcos(aux_dir);    /* ship left side x */
  1708. X    py[1] = py[0] + safe_width * tsin(aux_dir);    /* ship left side y */
  1709. X    px[2] = 2 * px[0] - px[1];            /* ship right side x */
  1710. X    py[2] = 2 * py[0] - py[1];            /* ship right side y */
  1711. X
  1712. X    left_ok = true;
  1713. X    right_ok = true;
  1714. X
  1715. X    for (dist=0; dist<stop_dist+BLOCK_SZ/2; dist+=BLOCK_SZ/2) {
  1716. X    for (i=0; i<3; i++) {
  1717. X        dx = (px[i] + dist * tcos(travel_dir)) / BLOCK_SZ;
  1718. X        dy = (py[i] + dist * tsin(travel_dir)) / BLOCK_SZ;
  1719. X
  1720. X        if (dx<0 || dx>=World.x || dy<0 || dy>=World.y) {
  1721. X        evade = true;
  1722. X        if (i==1) left_ok = false;
  1723. X        if (i==2) right_ok = false;
  1724. X        continue;
  1725. X        }
  1726. X
  1727. X        locn_block = World.block[dx][dy];
  1728. X        if (locn_block != SPACE && locn_block != BASE
  1729. X        && locn_block != POS_GRAV && locn_block != NEG_GRAV
  1730. X        && locn_block != CWISE_GRAV && locn_block != ACWISE_GRAV) {
  1731. X
  1732. X        evade = true;
  1733. X        if (i == 1) left_ok = false;
  1734. X        if (i == 2) right_ok = false;
  1735. X        continue;
  1736. X            }
  1737. X
  1738. X        gravity = &World.gravity[dx][dy]; /* watch out for strong gravity */
  1739. X            if (LENGTH(gravity->x, gravity->y) >= 1.0) {
  1740. X        gravity_dir = atan2(gravity->y-pl->pos.y, gravity->x-pl->pos.x)
  1741. X                    * RES / (2.0 * PI);
  1742. X        gravity_dir = MOD(gravity_dir, RES);
  1743. X        if (MOD(gravity_dir-travel_dir, RES) <= RES/4 ||
  1744. X            MOD(gravity_dir-travel_dir, RES) >= 3*RES/4) {
  1745. X            evade = true;
  1746. X            if (i == 1) left_ok = false;
  1747. X            if (i == 2) right_ok = false;
  1748. X            continue;
  1749. X        }
  1750. X        }
  1751. X    }
  1752. X    }
  1753. X
  1754. X    if (mine_i >= 0) {
  1755. X    shot = Obj[mine_i];
  1756. X    aux_dir = atan2(shot->pos.y-pl->pos.y, shot->pos.x-pl->pos.x)
  1757. X                * RES/(2.0*PI);
  1758. X    aux_dir = MOD(aux_dir, RES);
  1759. X    delta_dir = MOD(aux_dir - travel_dir,RES);
  1760. X    if (delta_dir < RES/4) {
  1761. X        left_ok = false;
  1762. X        evade = true;
  1763. X    }
  1764. X    if (delta_dir > RES*3/4) {
  1765. X        right_ok = false;
  1766. X        evade = true;
  1767. X    }
  1768. X    }
  1769. X
  1770. X    if (ship_i >= 0) {
  1771. X    ship = Players[ship_i];
  1772. X    aux_dir = atan2(ship->pos.y-pl->pos.y, ship->pos.x-pl->pos.x)
  1773. X                * RES/(2.0*PI);
  1774. X    aux_dir = MOD(aux_dir, RES);
  1775. X    delta_dir = MOD(aux_dir - travel_dir,RES);
  1776. X    if (delta_dir < RES/4) {
  1777. X        left_ok = false;
  1778. X        evade = true;
  1779. X    }
  1780. X    if (delta_dir > RES*3/4) {
  1781. X        right_ok = false;
  1782. X        evade = true;
  1783. X    }
  1784. X    }
  1785. X
  1786. X    if (pl->velocity > MAX_ROBOT_SPEED)
  1787. X    evade = true;
  1788. X
  1789. X    if (!evade)
  1790. X    return false;
  1791. X
  1792. X    delta_dir = 0;
  1793. X    while (!left_ok && !right_ok && delta_dir<7*RES/8) {
  1794. X    delta_dir += RES/16;
  1795. X
  1796. X    left_ok = true;
  1797. X    aux_dir = MOD(travel_dir+delta_dir,RES);
  1798. X    for (dist=0; dist < stop_dist+BLOCK_SZ/2; dist += BLOCK_SZ/2) {
  1799. X        dx = (px[0] + dist * tcos(aux_dir)) / BLOCK_SZ;
  1800. X        dy = (py[0] + dist * tsin(aux_dir)) / BLOCK_SZ;
  1801. X
  1802. X        if (dx<0 || dx>=World.x || dy<0 || dy>=World.y) {
  1803. X        left_ok = false;
  1804. X        continue;
  1805. X        }
  1806. X
  1807. X        locn_block = World.block[dx][dy];
  1808. X        if (locn_block != SPACE && locn_block != BASE
  1809. X        && locn_block != POS_GRAV && locn_block != NEG_GRAV
  1810. X        && locn_block != CWISE_GRAV && locn_block != ACWISE_GRAV)
  1811. X        {
  1812. X        left_ok = false;
  1813. X        continue;
  1814. X            }
  1815. X
  1816. X        /* watch out for strong gravity */
  1817. X        gravity = &World.gravity[dx][dy];
  1818. X            if (LENGTH(gravity->x, gravity->y) >= 1.0) {
  1819. X        gravity_dir = atan2(gravity->y-pl->pos.y, gravity->x-pl->pos.x)
  1820. X                    * RES / (2.0 * PI);
  1821. X        gravity_dir = MOD(gravity_dir, RES);
  1822. X        if (MOD(gravity_dir-travel_dir, RES) <= RES/4 ||
  1823. X            MOD(gravity_dir-travel_dir, RES) >= 3*RES/4) {
  1824. X
  1825. X            left_ok = false;
  1826. X            continue;
  1827. X        }
  1828. X        }
  1829. X    }
  1830. X
  1831. X    right_ok = true;
  1832. X    aux_dir = MOD(travel_dir-delta_dir, RES);
  1833. X    for (dist=0; dist < stop_dist+BLOCK_SZ/2; dist += BLOCK_SZ/2) {
  1834. X        dx = (px[0] + dist * tcos(aux_dir)) / BLOCK_SZ;
  1835. X        dy = (py[0] + dist * tsin(aux_dir)) / BLOCK_SZ;
  1836. X
  1837. X        if (dx<0 || dx>=World.x || dy<0 || dy>=World.y) {
  1838. X        right_ok = false;
  1839. X        continue;
  1840. X        }
  1841. X
  1842. X        locn_block = World.block[dx][dy];
  1843. X        if (locn_block != SPACE && locn_block != BASE
  1844. X        && locn_block != POS_GRAV && locn_block != NEG_GRAV
  1845. X        && locn_block != CWISE_GRAV && locn_block != ACWISE_GRAV) {
  1846. X
  1847. X        right_ok = false;
  1848. X        continue;
  1849. X            }
  1850. X
  1851. X        /* watch out for strong gravity */
  1852. X        gravity = &World.gravity[dx][dy];
  1853. X            if (LENGTH(gravity->x, gravity->y)>=1.0) {
  1854. X        gravity_dir = atan2(gravity->y-pl->pos.y, gravity->x-pl->pos.x)
  1855. X                    * RES / (2.0 * PI);
  1856. X        gravity_dir = MOD(gravity_dir, RES);
  1857. X        if (MOD(gravity_dir-travel_dir, RES) <= RES/4 ||
  1858. X            MOD(gravity_dir-travel_dir, RES) >= 3*RES/4) {
  1859. X
  1860. X            right_ok = false;
  1861. X            continue;
  1862. X        }
  1863. X        }
  1864. X    }
  1865. X    }
  1866. X
  1867. X    pl->turnspeed = MAX_PLAYER_TURNSPEED;
  1868. X    pl->power = MAX_PLAYER_POWER;
  1869. X
  1870. X    delta_dir = MOD(pl->dir - travel_dir, RES);
  1871. X
  1872. X    if (pl->robot_mode != RM_EVADE_LEFT && pl->robot_mode != RM_EVADE_RIGHT) {
  1873. X    if (left_ok && !right_ok)
  1874. X        pl->robot_mode = RM_EVADE_LEFT;
  1875. X    else if (right_ok && !left_ok)
  1876. X        pl->robot_mode = RM_EVADE_RIGHT;
  1877. X    else
  1878. X        pl->robot_mode = (delta_dir < RES/2 ?
  1879. X                RM_EVADE_LEFT : RM_EVADE_RIGHT);
  1880. X    }
  1881. X
  1882. X    if (delta_dir < 3*RES/8 || delta_dir > 5*RES/8) {
  1883. X    pl->turnacc = (pl->robot_mode == RM_EVADE_LEFT ?
  1884. X               pl->turnspeed : (-pl->turnspeed));
  1885. X    CLR_BIT(pl->status, THRUSTING);
  1886. X    } else {
  1887. X    pl->turnacc = 0;
  1888. X    SET_BIT(pl->status, THRUSTING);
  1889. X    pl->robot_mode = (delta_dir < RES/2 ? RM_EVADE_LEFT : RM_EVADE_RIGHT);
  1890. X    }
  1891. X
  1892. X    return true;
  1893. X}
  1894. X
  1895. X
  1896. Xstatic bool Check_robot_target(int ind, int item_x, int item_y, int new_mode,
  1897. X                   int attack_level)
  1898. X{
  1899. X    int i;
  1900. X    player *pl;
  1901. X    long item_dist;
  1902. X    int item_dir;
  1903. X    int travel_dir;
  1904. X    int delta_dir;
  1905. X    int dx, dy;
  1906. X    int dist;
  1907. X    int locn_block;
  1908. X    bool clear_path;
  1909. X    bool slowing;
  1910. X
  1911. X
  1912. X    pl = Players[ind];
  1913. X
  1914. X    dx = item_x - pl->pos.x;
  1915. X    dy = item_y - pl->pos.y;
  1916. X
  1917. X    if (new_mode != RM_CANNON_KILL)
  1918. X    dy += SHIP_SZ/2;
  1919. X
  1920. X    item_dist    = LENGTH(dy, dx);
  1921. X    item_dir    = atan2(dy, dx) * RES/(2.0*PI);
  1922. X    item_dir    = MOD(item_dir, RES);
  1923. X
  1924. X    if (new_mode == RM_REFUEL || new_mode == RM_CANNON_KILL)
  1925. X    item_dist -= 2*BLOCK_SZ;
  1926. X
  1927. X    clear_path = true;
  1928. X
  1929. X    for (dist = 0; clear_path && dist < item_dist; dist += BLOCK_SZ/2) {
  1930. X
  1931. X    dx = (pl->pos.x + dist*tcos(item_dir)) / BLOCK_SZ;
  1932. X    dy = (pl->pos.y + dist*tsin(item_dir)) / BLOCK_SZ;
  1933. X
  1934. X    if (dx < 0 || dx >= World.x || dy < 0 || dy >= World.y) {
  1935. X        clear_path = false;
  1936. X        continue;
  1937. X    }
  1938. X
  1939. X    locn_block = World.block[dx][dy];
  1940. X    if (locn_block != SPACE && locn_block != BASE && locn_block != CANNON
  1941. X        && locn_block != POS_GRAV && locn_block != NEG_GRAV
  1942. X        && locn_block != CWISE_GRAV && locn_block != ACWISE_GRAV) {
  1943. X
  1944. X        clear_path = false;
  1945. X        continue;
  1946. X    }
  1947. X    }
  1948. X
  1949. X    if (!clear_path)
  1950. X    return false;
  1951. X    
  1952. X    if (pl->velocity <= 0.2)
  1953. X    travel_dir = DIR_DOWN;
  1954. X    else {
  1955. X    travel_dir = atan2(pl->vel.y,pl->vel.x) * RES/(2.0*PI);
  1956. X    travel_dir = MOD(travel_dir, RES);
  1957. X    }
  1958. X
  1959. X    pl->turnspeed = MAX_PLAYER_TURNSPEED/2;
  1960. X    pl->power     = MAX_PLAYER_POWER/2;
  1961. X
  1962. X    delta_dir = MOD(item_dir-travel_dir,RES);
  1963. X    if (delta_dir >= RES/4 && delta_dir <= 3*RES/4 && item_dist > 2*BLOCK_SZ) {
  1964. X
  1965. X    if (new_mode == RM_HARVEST) {         /* reverse direction of travel */
  1966. X        item_dir    = MOD(travel_dir+RES/2, RES);
  1967. X    }
  1968. X
  1969. X    pl->turnspeed    = MAX_PLAYER_TURNSPEED;
  1970. X    slowing        = true;
  1971. X
  1972. X    } else if (new_mode == RM_CANNON_KILL && item_dist <= 0) {
  1973. X
  1974. X    /* too close, to move away */
  1975. X    pl->turnspeed    = MAX_PLAYER_TURNSPEED;
  1976. X        item_dir    = MOD(item_dir+RES/2,RES);
  1977. X    slowing        = true;
  1978. X
  1979. X    } else {
  1980. X
  1981. X    slowing        = false;
  1982. X    }
  1983. X
  1984. X    delta_dir = MOD(item_dir-pl->dir, RES);
  1985. X    if (delta_dir > RES/8 && delta_dir < 7*RES/8) {
  1986. X    pl->turnacc = (delta_dir < RES/2 ?
  1987. X               pl->turnspeed : (-pl->turnspeed));
  1988. X    } else if ((delta_dir > RES/64 && delta_dir < 63*RES/64)
  1989. X           || (pl->robot_mode == RM_CANNON_KILL)
  1990. X           || (pl->robot_count%8) == 0) {
  1991. X    pl->turnspeed    = MIN_PLAYER_TURNSPEED;
  1992. X    pl->turnacc    = (delta_dir < RES/2
  1993. X               ? pl->turnspeed : (-pl->turnspeed));
  1994. X    } else {
  1995. X    pl->turnacc = 0.0;
  1996. X    }
  1997. X
  1998. X    if (slowing) {
  1999. X
  2000. X    SET_BIT(pl->status, THRUSTING);
  2001. X
  2002. X    } else if (item_dist < 0) {
  2003. X
  2004. X    CLR_BIT(pl->status, THRUSTING);
  2005. X
  2006. X    } else if (item_dist < BLOCK_SZ) {
  2007. X
  2008. X    if (pl->velocity < NORMAL_ROBOT_SPEED/3)
  2009. X        SET_BIT(pl->status, THRUSTING);
  2010. X    if (pl->velocity > NORMAL_ROBOT_SPEED/2)
  2011. X        CLR_BIT(pl->status, THRUSTING);
  2012. X
  2013. X    } else if (item_dist < 4*BLOCK_SZ) {
  2014. X
  2015. X    if (pl->velocity < NORMAL_ROBOT_SPEED/2)
  2016. X        SET_BIT(pl->status, THRUSTING);
  2017. X    if (pl->velocity > NORMAL_ROBOT_SPEED)
  2018. X        CLR_BIT(pl->status, THRUSTING);
  2019. X
  2020. X    } else if (new_mode != RM_ATTACK) {
  2021. X
  2022. X    if (pl->velocity < NORMAL_ROBOT_SPEED)
  2023. X        SET_BIT(pl->status, THRUSTING);
  2024. X    if (pl->velocity > 3*NORMAL_ROBOT_SPEED/2)
  2025. X        CLR_BIT(pl->status, THRUSTING);
  2026. X
  2027. X    } else {
  2028. X
  2029. X    if (pl->velocity < ATTACK_ROBOT_SPEED/2)
  2030. X        SET_BIT(pl->status, THRUSTING);
  2031. X    if (pl->velocity > ATTACK_ROBOT_SPEED)
  2032. X        CLR_BIT(pl->status, THRUSTING);
  2033. X    }
  2034. X
  2035. X    if (new_mode == RM_ATTACK) {
  2036. X    if ((pl->robot_count%10) == 0 && pl->missiles > 0) {
  2037. X
  2038. X        Fire_shot(ind, OBJ_SMART_SHOT, pl->dir);
  2039. X
  2040. X    } else if ((pl->robot_count%2) == 0
  2041. X           && item_dist < VISIBILITY_DISTANCE
  2042. X           && (pl->robot_count %
  2043. X               (110-Robots[pl->robot_ind].attack)) < 15+attack_level) {
  2044. X
  2045. X        Fire_shot(ind, OBJ_SHOT, pl->dir);
  2046. X        for (i=0; i<pl->extra_shots; i++) {
  2047. X        Fire_shot(ind,OBJ_SHOT, MOD(pl->dir+(1+i)*SHOTS_ANGLE, RES));
  2048. X        Fire_shot(ind,OBJ_SHOT, MOD(pl->dir-(1+i)*SHOTS_ANGLE, RES));
  2049. X        }
  2050. X
  2051. X        if (BIT(pl->have, OBJ_REAR_SHOT))
  2052. X        Fire_shot(ind, OBJ_SHOT, MOD(pl->dir+RES/2, RES));
  2053. X    }
  2054. X
  2055. X    if (pl->fuel < pl->fuel2 && pl->mines > 0 && (pl->robot_count%30)==0) {
  2056. X        Place_mine(ind);
  2057. X        pl->mines--;
  2058. X        CLR_BIT(pl->used, OBJ_CLOAKING_DEVICE);
  2059. X    }
  2060. X    }
  2061. X    
  2062. X    if (new_mode == RM_CANNON_KILL && !slowing) {
  2063. X    if ((pl->robot_count%2) == 0 && item_dist < VISIBILITY_DISTANCE) {
  2064. X
  2065. X        Fire_shot(ind, OBJ_SHOT, pl->dir);
  2066. X        for (i=0; i<pl->extra_shots; i++) {
  2067. X        Fire_shot(ind,OBJ_SHOT, MOD(pl->dir+(1+i)*SHOTS_ANGLE, RES));
  2068. X        Fire_shot(ind,OBJ_SHOT, MOD(pl->dir-(1+i)*SHOTS_ANGLE, RES));
  2069. X        }
  2070. X
  2071. X        if (BIT(pl->have, OBJ_REAR_SHOT))
  2072. X        Fire_shot(ind, OBJ_SHOT, MOD(pl->dir+RES/2, RES));
  2073. X    }
  2074. X    }
  2075. X    
  2076. X    pl->robot_mode = new_mode;
  2077. X    return true;
  2078. X}
  2079. X
  2080. X
  2081. Xvoid Update_robots(void)
  2082. X{
  2083. X    player    *pl, *ship;
  2084. X    object    *shot;
  2085. X    double    distance, mine_dist, item_dist,
  2086. X            ship_dist, enemy_dist, cannon_dist, fuel_dist;
  2087. X    int        i, j, mine_i, item_i, ship_i, enemy_i, cannon_i, fuel_i;
  2088. X    long    dx, dy;
  2089. X    bool    harvest_checked;
  2090. X    bool    fuel_checked;
  2091. X    bool    evade_checked;
  2092. X    int        attack_level;
  2093. X
  2094. X
  2095. X    if (NumRobots < WantedNumRobots
  2096. X    && NumPlayers < World.NumBases
  2097. X    && NumRobots < MAX_ROBOTS) {
  2098. X
  2099. X    New_robot();
  2100. X    }
  2101. X
  2102. X    if (NumRobots <= 0)
  2103. X    return;
  2104. X
  2105. X    if (NumPlayers >= World.NumBases && NumRobots > 0) {
  2106. X    Delete_robot();
  2107. X    }
  2108. X
  2109. X    for (i=0; i<NumPlayers; i++) {
  2110. X    pl = Players[i];
  2111. X    if (pl->robot_mode == RM_NOT_ROBOT)
  2112. X        continue;
  2113. X    if (!BIT(pl->status, PLAYING))
  2114. X        continue;
  2115. X
  2116. X    if (pl->robot_count <= 0)
  2117. X        pl->robot_count = 1000 + rand()%20;
  2118. X
  2119. X    pl->robot_count--;
  2120. X
  2121. X    CLR_BIT(pl->used, OBJ_SHIELD|OBJ_CLOAKING_DEVICE);
  2122. X    harvest_checked    = false;
  2123. X    fuel_checked    = false;
  2124. X    evade_checked    = false;
  2125. X
  2126. X    mine_i        = -1;
  2127. X    mine_dist    = SHIP_SZ + 200;
  2128. X    item_i        = -1;
  2129. X    item_dist    = VISIBILITY_DISTANCE;
  2130. X
  2131. X    if (BIT(pl->have, OBJ_CLOAKING_DEVICE) && pl->fuel > pl->fuel3)
  2132. X        SET_BIT(pl->used, OBJ_CLOAKING_DEVICE);
  2133. X
  2134. X    for (j=0; j<NumObjs; j++) {
  2135. X        shot = Obj[j];
  2136. X
  2137. X        switch (shot->type) {
  2138. X        case OBJ_WIDEANGLE_SHOT:
  2139. X        case OBJ_REAR_SHOT:
  2140. X        case OBJ_SMART_SHOT:
  2141. X        case OBJ_CLOAKING_DEVICE:
  2142. X        case OBJ_ENERGY_PACK:
  2143. X        case OBJ_MINE_PACK:
  2144. X        case OBJ_SENSOR_PACK:
  2145. X        dx = shot->pos.x - pl->pos.x;
  2146. X        dy = shot->pos.y - pl->pos.y;
  2147. X
  2148. X        if ((distance = LENGTH(dx,dy)) < item_dist) {
  2149. X            item_i    = j;
  2150. X            item_dist    = distance;
  2151. X        }
  2152. X        break;
  2153. X
  2154. X        case OBJ_MINE:
  2155. X        dx = shot->pos.x - pl->pos.x;
  2156. X        dy = shot->pos.y - pl->pos.y;
  2157. X
  2158. X        if ((distance = LENGTH(dx,dy)) < mine_dist) {
  2159. X            mine_i    = j;
  2160. X            mine_dist    = distance;
  2161. X        }
  2162. X        break;
  2163. X        }
  2164. X
  2165. X        if (BIT(shot->type, KILLING_SHOTS)
  2166. X        && ABS(shot->pos.x - pl->pos.x) < SHIP_SZ+20
  2167. X        && ABS(shot->pos.y - pl->pos.y) < SHIP_SZ+20
  2168. X        && shot->id != pl->id
  2169. X        && (shot->type == OBJ_CANNON_SHOT
  2170. X            || pl->robot_count%100
  2171. X                < (Robots[pl->robot_ind].defense+700)/8)) {
  2172. X        SET_BIT(pl->used, OBJ_SHIELD);
  2173. X        }
  2174. X    }
  2175. X
  2176. X    if (Check_robot_navigate(i, &evade_checked))
  2177. X        continue;
  2178. X
  2179. X    ship_i        = -1;
  2180. X    ship_dist    = (pl->fuel >= pl->fuel1 ? SHIP_SZ*6 : 0);
  2181. X    enemy_i        = -1;
  2182. X    enemy_dist    = (pl->fuel >= pl->fuel3 ?
  2183. X               VISIBILITY_DISTANCE*2 : VISIBILITY_DISTANCE);
  2184. X
  2185. X    for (j=0; j<NumPlayers; j++) {
  2186. X        ship = Players[j];
  2187. X        if (j==i || !(BIT(ship->status, PLAYING)))
  2188. X        continue;
  2189. X
  2190. X        dx = ship->pos.x - pl->pos.x;
  2191. X        dy = ship->pos.y - pl->pos.y;
  2192. X
  2193. X        if (ABS(dx) < ship_dist && ABS(dy) < ship_dist
  2194. X        && (distance = LENGTH(dx,dy)) < ship_dist) {
  2195. X
  2196. X        ship_i    = j;
  2197. X        ship_dist = distance;
  2198. X        }
  2199. X
  2200. X        if (ship->robot_mode == RM_NOT_ROBOT
  2201. X        && (distance = LENGTH(dx,dy)) < enemy_dist) {
  2202. X
  2203. X        enemy_i    = j;
  2204. X        enemy_dist = distance;
  2205. X        }
  2206. X    }
  2207. X
  2208. X    if (pl->lock.tagged == LOCK_PLAYER) {
  2209. X        ship = Players[GetInd[pl->lock.pl_id]];
  2210. X        if (!(BIT(ship->status, PLAYING))
  2211. X        || pl->lock.distance > 2*VISIBILITY_DISTANCE
  2212. X        || (!(pl->visibility[GetInd[pl->lock.pl_id]].canSee)
  2213. X            && (pl->robot_count%25) == 0)) {
  2214. X        pl->lock.pl_id    = 1;
  2215. X        pl->lock.tagged    = LOCK_NONE;
  2216. X        pl->lock.pos.x    = pl->pos.x;
  2217. X        pl->lock.pos.y    = pl->pos.y;
  2218. X        pl->lock.distance    = 0;
  2219. X        }
  2220. X    }
  2221. X
  2222. X    if (enemy_i >= 0) {
  2223. X        ship = Players[enemy_i];
  2224. X        if (pl->lock.tagged == LOCK_NONE
  2225. X        || enemy_dist < 3*pl->lock.distance/4) {
  2226. X        if (!(pl->visibility[enemy_i].canSee)
  2227. X            || (BIT(ship->status, THRUSTING)
  2228. X            && enemy_dist < VISIBILITY_DISTANCE)) {
  2229. X            pl->lock.pl_id    = ship->id;
  2230. X            pl->lock.tagged    = LOCK_PLAYER;
  2231. X            pl->lock.pos.x    = ship->pos.x;
  2232. X            pl->lock.pos.y    = ship->pos.y;
  2233. X            pl->lock.distance    = LENGTH(pl->pos.x-ship->pos.x,
  2234. X                         pl->pos.y-ship->pos.y);
  2235. X            pl->sensor_range    = VISIBILITY_DISTANCE;
  2236. X        }
  2237. X        }
  2238. X    }
  2239. X
  2240. X    if (!evade_checked) {
  2241. X        if (Check_robot_evade(i, mine_i, ship_i))
  2242. X        continue;
  2243. X    }
  2244. X
  2245. X    if (item_i >= 0 && enemy_dist > 2*item_dist
  2246. X        && enemy_dist > 12*BLOCK_SZ) {
  2247. X
  2248. X        harvest_checked = true;
  2249. X        dx = Obj[item_i]->pos.x;
  2250. X        dy = Obj[item_i]->pos.y;
  2251. X
  2252. X        if (Check_robot_target(i, dx, dy, RM_HARVEST, 0))
  2253. X            continue;
  2254. X    }
  2255. X
  2256. X    if (pl->lock.tagged == LOCK_PLAYER) {
  2257. X
  2258. X        ship = Players[GetInd[pl->lock.pl_id]];
  2259. X        dx = ship->pos.x;
  2260. X        dy = ship->pos.y;
  2261. X        attack_level = MAX(ship->score/8, 0);
  2262. X
  2263. X        if (Check_robot_target(i, dx, dy, RM_ATTACK, attack_level))
  2264. X        continue;
  2265. X    }
  2266. X
  2267. X    if (item_i >= 0 && !harvest_checked) {
  2268. X
  2269. X        dx = Obj[item_i]->pos.x;
  2270. X        dy = Obj[item_i]->pos.y;
  2271. X
  2272. X        if (Check_robot_target(i, dx, dy, RM_HARVEST, 0))
  2273. X        continue;
  2274. X    }
  2275. X
  2276. X    cannon_i    = -1;
  2277. X    cannon_dist    = VISIBILITY_DISTANCE;
  2278. X    fuel_i        = -1;
  2279. X    fuel_dist    = VISIBILITY_DISTANCE;
  2280. X
  2281. X    for (j = 0; j < World.NumCannons; j ++) {
  2282. X
  2283. X        if (World.cannon[j].dead_time > 0)
  2284. X        continue;
  2285. X
  2286. X        dx = World.cannon[j].pos.x * BLOCK_SZ + BLOCK_SZ/2 - pl->pos.x;
  2287. X        dy = World.cannon[j].pos.y * BLOCK_SZ + BLOCK_SZ/2 - pl->pos.y;
  2288. X
  2289. X        if (ABS(dx) < cannon_dist && ABS(dy) < cannon_dist &&
  2290. X            (distance=LENGTH(dx,dy)) < cannon_dist) {
  2291. X        cannon_i    = j;
  2292. X        cannon_dist = distance;
  2293. X        }
  2294. X    }
  2295. X
  2296. X    for (j = 0; j < World.NumFuels; j ++) {
  2297. X
  2298. X        if (World.fuel[j].left < 100 || pl->fuel >= MAX_PLAYER_FUEL-200)
  2299. X        continue;
  2300. X
  2301. X        dx = World.fuel[j].pos.x - pl->pos.x;
  2302. X        dy = World.fuel[j].pos.y - pl->pos.y;
  2303. X
  2304. X        if (ABS(dx) < fuel_dist && ABS(dy) < fuel_dist &&
  2305. X            (distance=LENGTH(dx,dy)) < fuel_dist) {
  2306. X        fuel_i    = j;
  2307. X        fuel_dist = distance;
  2308. X        }
  2309. X    }
  2310. X
  2311. X    if (fuel_i >= 0 && cannon_dist > fuel_dist) {
  2312. X
  2313. X        fuel_checked = true;
  2314. X        dx = World.fuel[fuel_i].pos.x;
  2315. X        dy = World.fuel[fuel_i].pos.y;
  2316. X
  2317. X        SET_BIT (pl->used, OBJ_REFUEL);
  2318. X        pl->fs = fuel_i;
  2319. X
  2320. X        if (Check_robot_target(i, dx, dy, RM_REFUEL, 0))
  2321. X        continue;
  2322. X    }
  2323. X
  2324. X    if (cannon_i >= 0) {
  2325. X
  2326. X        dx = World.cannon[cannon_i].pos.x * BLOCK_SZ + BLOCK_SZ/2;
  2327. X        dy = World.cannon[cannon_i].pos.y * BLOCK_SZ + BLOCK_SZ/2;
  2328. X
  2329. X        if (Check_robot_target(i, dx, dy, RM_CANNON_KILL, 0))
  2330. X        continue;
  2331. X    }
  2332. X
  2333. X    if (fuel_i >= 0 && !fuel_checked) {
  2334. X
  2335. X        dx = World.fuel[fuel_i].pos.x;
  2336. X        dy = World.fuel[fuel_i].pos.y;
  2337. X
  2338. X        SET_BIT (pl->used, OBJ_REFUEL);
  2339. X        pl->fs = fuel_i;
  2340. X
  2341. X        if (Check_robot_target(i, dx, dy, RM_REFUEL, 0))
  2342. X        continue;
  2343. X    }
  2344. X
  2345. X    if (pl->fuel < DEFAULT_PLAYER_FUEL)
  2346. X        pl->fuel += 0.2;
  2347. X    if (pl->fuel < MIN_PLAYER_FUEL)
  2348. X        pl->fuel = MIN_PLAYER_FUEL;
  2349. X
  2350. X    if (pl->vel.y < (-NORMAL_ROBOT_SPEED) || (pl->robot_count%64) < 32) {
  2351. X
  2352. X        pl->robot_mode = RM_ROBOT_CLIMB;
  2353. X        pl->turnspeed = MAX_PLAYER_TURNSPEED/2;
  2354. X        pl->power       = MAX_PLAYER_POWER/2;
  2355. X        if (ABS(pl->dir-RES/4) > RES/16) {
  2356. X        pl->turnacc = (pl->dir < RES/4
  2357. X                   || pl->dir >= 3*RES/4
  2358. X                   ? pl->turnspeed : (-pl->turnspeed));
  2359. X        } else {
  2360. X        pl->turnacc = 0.0;
  2361. X        }
  2362. X        if (pl->vel.y < NORMAL_ROBOT_SPEED/2
  2363. X           && pl->velocity < ATTACK_ROBOT_SPEED)
  2364. X        SET_BIT(pl->status, THRUSTING);
  2365. X        if (pl->vel.y > NORMAL_ROBOT_SPEED)
  2366. X        CLR_BIT(pl->status, THRUSTING);
  2367. X        continue;
  2368. X    }
  2369. X    
  2370. X    /* must be idle */
  2371. X    pl->robot_mode    = RM_ROBOT_IDLE;
  2372. X    pl->turnspeed    = MAX_PLAYER_TURNSPEED/2;
  2373. X    pl->turnacc    = 0;
  2374. X    pl->power    = MAX_PLAYER_POWER/2;
  2375. X    CLR_BIT(pl->status, THRUSTING);
  2376. X    if (pl->velocity < NORMAL_ROBOT_SPEED/2)
  2377. X        SET_BIT(pl->status, THRUSTING);
  2378. X    if (pl->velocity > NORMAL_ROBOT_SPEED)
  2379. X        CLR_BIT(pl->status, THRUSTING);
  2380. X    }
  2381. X}
  2382. END_OF_FILE
  2383. echo shar: 1 control character may be missing from \"'src/robot.c'\"
  2384. if test 27268 -ne `wc -c <'src/robot.c'`; then
  2385.     echo shar: \"'src/robot.c'\" unpacked with wrong size!
  2386. fi
  2387. # end of 'src/robot.c'
  2388. fi
  2389. echo shar: End of archive 22 \(of 24\).
  2390. cp /dev/null ark22isdone
  2391. MISSING=""
  2392. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ; do
  2393.     if test ! -f ark${I}isdone ; then
  2394.     MISSING="${MISSING} ${I}"
  2395.     fi
  2396. done
  2397. if test "${MISSING}" = "" ; then
  2398.     echo You have unpacked all 24 archives.
  2399.     echo "\nNow run 'bldmaps.sh' to build the map files"
  2400.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2401. else
  2402.     echo You still need to unpack the following archives:
  2403.     echo "        " ${MISSING}
  2404. fi
  2405. ##  End of shell archive.
  2406. exit 0
  2407.