home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / volume14 / xbattle / part05 < prev    next >
Encoding:
Internet Message Format  |  1993-01-26  |  48.0 KB

  1. Path: uunet!zephyr.ens.tek.com!master!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v14i076:  xbattle - multi-player battle strategy game for X-Windows, Part05/07
  5. Message-ID: <3515@master.CNA.TEK.COM>
  6. Date: 7 Sep 92 21:23:18 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 1742
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: slehar@cns.bu.edu
  12. Posting-number: Volume 14, Issue 76
  13. Archive-name: xbattle/Part05
  14. Environment: Xlib
  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 5 (of 7)."
  25. # Contents:  global.h init.c
  26. # Wrapped by billr@saab on Mon Sep  7 14:18:50 1992
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'global.h' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'global.h'\"
  30. else
  31. echo shar: Extracting \"'global.h'\" \(11098 characters\)
  32. sed "s/^X//" >'global.h' <<'END_OF_FILE'
  33. X#include <stdio.h>
  34. X  
  35. X/**** x include files ****/
  36. X#include <X11/Xlib.h>
  37. X#include <X11/Xutil.h>
  38. X#include <X11/Xatom.h>
  39. X#include <X11/keysym.h>
  40. X#include <X11/keysymdef.h>
  41. X
  42. X#include "extern.h"
  43. X
  44. X/**** global variables ****/
  45. Xxwindow_type *xwindow[MAXPLAYERS];
  46. X
  47. Xint colorarray[MAXPLAYERS],
  48. X    rcolorarray[MAXHUES],
  49. X    sidemap[MAXPLAYERS];
  50. X
  51. Xchar lettermap[MAXSIDES][2];
  52. X
  53. Xint winopen[MAXPLAYERS],
  54. X    winwatch[MAXPLAYERS];
  55. X
  56. XFILE *fpout, *fopen();
  57. Xchar filename[50];
  58. X
  59. X/**** default mappings from color to b/w ****/
  60. Xint color2bw[MAXHUES+1] = {NONE,
  61. X                           BLACK,
  62. X                           GRAY3,
  63. X                           GRAY2,
  64. X                           GRAY1,
  65. X                           WHITE,
  66. X                           BLACK,
  67. X                           WHITE,
  68. X                           BLACK,
  69. X                           WHITE,
  70. X                           BLACK,
  71. X                           WHITE};
  72. X
  73. Xdouble     sea,    
  74. X     farms,            
  75. X    gamespeed=5.0,
  76. X    towns;
  77. X
  78. Xdouble    slowfactor[MAXSIDES],
  79. X        artillery[MAXSIDES],
  80. X        paratroops[MAXSIDES],
  81. X        firepower[MAXSIDES],
  82. X        militia[MAXSIDES],
  83. X        hillfactor[MAXSIDES],    
  84. X    forest[MAXSIDES],    
  85. X        areavalue[MAXVAL+5],
  86. X    decayrate[MAXSIDES],
  87. X    eroderate[MAXSIDES],
  88. X        shuntval[MAXSIDES];
  89. X
  90. Xint     delay=10000,
  91. X    boardsizex=BOARDSIZE,
  92. X    boardsizey=BOARDSIZE;
  93. X
  94. Xint     nplayers,
  95. X    nsides,    
  96. X    none,    
  97. X    dark,
  98. X     light,
  99. X        maxviewrange,
  100. X    fillcost=MAXVAL-2,    
  101. X    digcost=MAXVAL-2,
  102. X        fillnumber,
  103. X        directions,
  104. X        paused=FALSE,
  105. X        dir[MAXPLAYERS][DIRS],
  106. X        dirtype[MAXPLAYERS],
  107. X        oldx[MAXPLAYERS],
  108. X        oldy[MAXPLAYERS],
  109. X    seed;
  110. X
  111. Xint    armies[MAXSIDES],
  112. X        bases[MAXSIDES],
  113. X        rbases[MAXSIDES],
  114. X        buildrate[MAXSIDES],
  115. X        scuttlerate[MAXSIDES],
  116. X        marchrate[MAXSIDES],
  117. X    viewrange[MAXSIDES],
  118. X    squaresize[MAXSIDES],
  119. X        textyh[MAXSIDES][MAXSIDES],
  120. X        textyl[MAXSIDES][MAXSIDES];
  121. X
  122. Xint     enable_anywrap    = FALSE,
  123. X        enable_horizon    = FALSE,
  124. X        enable_march      = FALSE,
  125. X        enable_bound      = FALSE,
  126. X    enable_hills      = FALSE,
  127. X    enable_forest     = FALSE,
  128. X    enable_sea        = FALSE,
  129. X    enable_border     = FALSE,
  130. X    enable_terrain    = FALSE,
  131. X        enable_decay      = FALSE,
  132. X        enable_area      = FALSE,
  133. X        enable_anylocalmap = FALSE,
  134. X        enable_storage      = FALSE,
  135. X        enable_replay     = FALSE,
  136. X        enable_hex        = FALSE,
  137. X        enable_edit       = FALSE,
  138. X        enable_load       = FALSE,
  139. X        enable_farms      = FALSE,
  140. X        enable_armies     = FALSE,
  141. X        enable_militia    = FALSE,
  142. X        enable_bases      = FALSE,
  143. X        enable_rbases     = FALSE,
  144. X        enable_towns      = FALSE;
  145. X
  146. Xint    enable_dig[MAXSIDES],
  147. X       enable_fill[MAXSIDES],
  148. X       enable_scuttle[MAXSIDES],
  149. X       enable_build[MAXSIDES],
  150. X    enable_artillery[MAXSIDES],
  151. X    enable_paratroops[MAXSIDES],
  152. X        enable_personalmarch[MAXSIDES],
  153. X        enable_grid[MAXSIDES],
  154. X        enable_manpos[MAXSIDES],
  155. X        enable_wrap[MAXSIDES],
  156. X    enable_hidden[MAXSIDES],
  157. X    enable_attack[MAXSIDES],
  158. X    enable_nospigot[MAXSIDES],
  159. X        enable_disrupt[MAXSIDES],
  160. X        enable_personalhorizon[MAXSIDES],
  161. X        enable_personalbound[MAXSIDES],
  162. X        enable_erode[MAXSIDES],
  163. X        enable_repeat[MAXSIDES],
  164. X        enable_map[MAXSIDES],
  165. X        enable_basemap[MAXSIDES],
  166. X        enable_localmap[MAXSIDES],
  167. X        enable_reserve[MAXSIDES],
  168. X        enable_digin[MAXSIDES];
  169. X
  170. Xchar outdated[MAXBOARDSIZE][MAXBOARDSIZE],
  171. X     oldvalue[MAXBOARDSIZE][MAXBOARDSIZE];
  172. X
  173. Xint hex_side,
  174. X    hex_halfside,
  175. X    hex_quarterside,
  176. X    hex_3quarterside,
  177. X    hex_vert,
  178. X    hex_halfvert,
  179. X    hex_chart[2*MAXSQUARESIZE][2*MAXSQUARESIZE][2],
  180. X    hex_horizon_even[200][2], hex_horizon_odd[200][2],
  181. X    hex_horizon_number;
  182. Xdouble hex_slope;
  183. XXPoint hex_points[7];
  184. X
  185. Xdouble drand48();
  186. Xvoid srand48();
  187. X
  188. Xchar graytitle[MAXSIDES+1][40] = {"blank",
  189. X                                  "xbattle BLACK SIDE",
  190. X                                  "xbattle DARK SIDE",
  191. X                                  "xbattle GRAY2 SIDE",
  192. X                                  "xbattle LIGHT SIDE",
  193. X                                  "xbattle WHITE SIDE"};
  194. Xchar huetitle[MAXSIDES+1][40] = {"blank",
  195. X                                 "xbattle BLACK SIDE",
  196. X                                 "xbattle DARK SIDE",
  197. X                                 "xbattle GRAY2 SIDE",
  198. X                                 "xbattle LIGHT SIDE",
  199. X                                 "xbattle WHITE SIDE",
  200. X                                 "xbattle RED SIDE",
  201. X                                 "xbattle CYAN SIDE",
  202. X                                 "xbattle MAGENTA SIDE",
  203. X                                 "xbattle GREEN SIDE",
  204. X                                 "xbattle BLUE SIDE",
  205. X                                 "xbattle YELLOW SIDE"};
  206. X
  207. Xchar grayname[MAXHUES+1][10] = {"blank",
  208. X                                "black",
  209. X                                "dark",
  210. X                                "gray2",
  211. X                                "light",
  212. X                                "white",
  213. X                                "junk",
  214. X                                "junk",
  215. X                                "junk",
  216. X                                "junk",
  217. X                                "junk",
  218. X                                "junk"};
  219. Xchar huename[MAXHUES+1][10] = {"blank",
  220. X                   "black",
  221. X                               "dark",
  222. X                               "gray2",
  223. X                               "light",
  224. X                               "white",
  225. X                               "red",
  226. X                               "cyan",
  227. X                               "magenta",
  228. X                               "green",
  229. X                               "blue",
  230. X                               "yellow"};
  231. X
  232. Xchar messagestr[512],
  233. X     personal_messagestr[MAXSIDES][512],
  234. X     storagename[100],
  235. X     replayname[100],
  236. X     mapname[100],
  237. X     blankline[]   = {"                                                                                          "};
  238. X
  239. Xint palette[MAXSIDES+1][3] = {{210, 220, 150},
  240. X                  {  0,   0,   0},
  241. X                  {140, 140, 140},
  242. X                  {160, 160, 160},
  243. X                  {180, 180, 180},
  244. X                  {255, 255, 255},
  245. X                  {255,   0,   0},
  246. X                  {100, 255, 210},
  247. X                  {255,   0, 255},
  248. X                  {130, 255,   0},
  249. X                  {  0,   0, 175},
  250. X                  {250, 250, 130}};
  251. X
  252. Xdouble hillslope[3] = {5.0, -9.0, 0.0};
  253. Xdouble hillintersect[3] = {175.0, 220.0, 100};
  254. X
  255. Xint hillpalette[3] =   {165, 170,  90},
  256. X    forestpalette[3] = {  0, 130,   0},
  257. X    seapalette[3] =    { 80, 152, 224};
  258. X/**
  259. X    seapalette[3] =    {  0,   0, 150};
  260. X**/
  261. X
  262. Xchar *usage = "\
  263. XUSAGE: xbattle\n\
  264. X                -<c1>      <display>      display name side uses color c1 with\n\
  265. X                                          default color to b/w mapping\n\
  266. X                -<c1><c2>  <display>      display name side uses color c1 with\n\
  267. X                                          b/w terminals using b/w shade c2\n\
  268. X                -hex                      Use hexagonal display \n\
  269. X                -bases     <n>            number of bases per side\n\
  270. X                -rbases    <n>            number of randomly placed bases per side\n\
  271. X                -armies    <n>            initial number of armies per side\n\
  272. X                -militia   <n>            density of random militia\n\
  273. X                -hills     <1-10>         hill steepness\n\
  274. X                -forest    <1-10>         forest thickness\n\
  275. X                -sea       <1-10>         sea density\n\
  276. X                -farms     <1-10>         max farm production rate\n\
  277. X                -decay     <1-10>         troop decay rate\n\
  278. X                -erode     <1-10>         empty square erode rate\n\
  279. X                -towns     <1-10>         density of towns\n\
  280. X                -guns      <1-10>         range of artillery\n\
  281. X                -para      <1-10>         range of paratroopers\n\
  282. X                -fight     <1-10>         fire power\n\
  283. X                -speed     <1-10>         game speed\n\
  284. X                -move      <1-10>         terrain roughness\n\
  285. X                -digin     <1-10>         enable shunting\n\
  286. X                -seed      <n>            random number seed for hills etc\n\
  287. X                -horizon   <n>            limit range of vision to n spaces\n\
  288. X                -map                      no preknown map -  drawn during play \n\
  289. X                -basemap                  remember position of towns/bases/rbases \n\
  290. X                -localmap                 no terrain memory \n\
  291. X                -dig       <n>            allow digging of sea, n full squares \n\
  292. X                -fill      <n>            allow filling of sea, n full squares \n\
  293. X                -scuttle                  allow scuttling of bases \n\
  294. X                -reserve                  allow troop reserves \n\
  295. X                -build     <n>            build base with <n> segments \n\
  296. X                -march     <n>            allow troop march, speed <n> \n\
  297. X                -hidden                      obscure enemy movement arrows\n\
  298. X                -area                      use areal display mode for square size\n\
  299. X                -bound                      allow bounding box\n\
  300. X                -repeat                      allow repeat of last command via right button\n\
  301. X                -disrupt                  attack disrupts movement\n\
  302. X                -wrap                     wraparound mode\n\
  303. X                -border                   border of sea\n\
  304. X                -nogrid                   do not draw grid\n\
  305. X                -manpos                   do not automatically position screen\n\
  306. X                -square    <n>            size of game square in pixels\n\
  307. X                -board     <n>            number of game squares on a side\n\
  308. X                -boardx    <n>            number of game squares on x side\n\
  309. X                -boardy    <n>            number of game squares on y side\n\
  310. X                -store     <file>         store game in <file> for replay\n\
  311. X                -replay    <file>         replay game in <file>\n\
  312. X                -options   <file>         use options from <file>\n\
  313. X                -load      <file>         use map from <file>\n\
  314. X                -edit      <file>         enter terrain editing mode\n";
  315. X
  316. Xchar options[NOPTS][10] =     {"-bases",
  317. X                 "-rbases",
  318. X                 "-armies",
  319. X                 "-militia",
  320. X                 "-hills",
  321. X                 "-forest",
  322. X                 "-sea",
  323. X                 "-farms",
  324. X                 "-decay",
  325. X                 "-erode",
  326. X                 "-towns",
  327. X                 "-guns",
  328. X                 "-para",
  329. X                 "-march",
  330. X                 "-fight",
  331. X                 "-speed",
  332. X                 "-move",
  333. X                 "-digin",
  334. X                 "-seed",
  335. X                 "-dig",
  336. X                 "-fill",
  337. X                 "-square",
  338. X                 "-board",
  339. X                 "-boardx",
  340. X                 "-boardy",
  341. X                 "-build",    /** end of non flags **/
  342. X                 "-horizon",
  343. X                 "-options",
  344. X                 "-load",
  345. X                 "-edit",
  346. X                 "-store",
  347. X                 "-replay",     /** end of variable flags **/
  348. X                 "-hex",
  349. X                 "-map",
  350. X                 "-basemap",
  351. X                 "-localmap",
  352. X                 "-scuttle",
  353. X                                 "-reserve",
  354. X                 "-hidden",
  355. X                 "-area",
  356. X                 "-disrupt",
  357. X                 "-bound",
  358. X                 "-repeat",
  359. X                 "-wrap",
  360. X                 "-border",
  361. X                 "-attack",
  362. X                 "-nospigot",
  363. X                 "-nogrid",
  364. X                 "-manpos"};
  365. END_OF_FILE
  366. if test 11098 -ne `wc -c <'global.h'`; then
  367.     echo shar: \"'global.h'\" unpacked with wrong size!
  368. fi
  369. # end of 'global.h'
  370. fi
  371. if test -f 'init.c' -a "${1}" != "-c" ; then 
  372.   echo shar: Will not clobber existing file \"'init.c'\"
  373. else
  374. echo shar: Extracting \"'init.c'\" \(34283 characters\)
  375. sed "s/^X//" >'init.c' <<'END_OF_FILE'
  376. X#include <stdio.h>
  377. X  
  378. X/**** x include files ****/
  379. X#include <X11/Xlib.h>
  380. X#include <X11/Xutil.h>
  381. X#include <X11/Xatom.h>
  382. X#include <X11/keysym.h>
  383. X#include <X11/keysymdef.h>
  384. X
  385. X#include "extern.h"
  386. X
  387. X/*************************************************************************/
  388. X/**    initboard                            **/
  389. X/** Initialize the squares of the game board                **/
  390. X/**    Steve Lehar (slehar@park.bu.edu)                **/
  391. X/*************************************************************************/
  392. Xinit_board(board)
  393. X  square_type *board;
  394. X{
  395. X  int i, j, k,
  396. X      even;
  397. X
  398. X  /**** initialize random number generator ****/
  399. X#if NODRAND48
  400. X  srand((long)seed);
  401. X#else
  402. X  srand48((long)seed);
  403. X#endif
  404. X
  405. X  printf ("seed: %d\n", seed);
  406. X
  407. X  /**** initialize the board values ****/
  408. X  for (j=0; j<boardsizey; j++)
  409. X  {
  410. X    even = TRUE;
  411. X
  412. X    for (i=0; i<boardsizex; i++)
  413. X    {
  414. X      SQUARE(board,i,j)->x           = i;
  415. X      SQUARE(board,i,j)->y           = j;
  416. X      SQUARE(board,i,j)->color       = none;
  417. X      SQUARE(board,i,j)->oldcolor    = none;
  418. X      SQUARE(board,i,j)->value[none] = 0;
  419. X      for (k=0; k<(nsides+2); k++)
  420. X        SQUARE(board,i,j)->value[k]  = 0;
  421. X      SQUARE(board,i,j)->lowbound    = 0;
  422. X      SQUARE(board,i,j)->growth      = 0;
  423. X      SQUARE(board,i,j)->oldgrowth   = 0;
  424. X      SQUARE(board,i,j)->angle       = 0;
  425. X      SQUARE(board,i,j)->age         = 0;
  426. X      SQUARE(board,i,j)->anymarch    = FALSE;
  427. X      for (k=0; k<nsides; k++)
  428. X        SQUARE(board,i,j)->march[k]  = FALSE;
  429. X      SQUARE(board,i,j)->move        = 0;
  430. X      for (k=0; k<directions; k++)
  431. X        SQUARE(board,i,j)->dir[k]    = 0;
  432. X
  433. X      for (k=0; k<nsides; k++)
  434. X        SQUARE(board,i,j)->seen[k]   = TRUE;
  435. X
  436. X      /** define centers **/
  437. X
  438. X      if (enable_hex)
  439. X      {
  440. X        if (even)
  441. X          SQUARE(board,i,j)->ypos = j*2*hex_vert + hex_vert;
  442. X        else
  443. X          SQUARE(board,i,j)->ypos = j*2*hex_vert + 2*hex_vert;
  444. X
  445. X        SQUARE(board,i,j)->xpos = hex_side + i*(3*hex_side/2);
  446. X
  447. X        even = !even;
  448. X      }
  449. X      else
  450. X      {
  451. X        SQUARE(board,i,j)->xpos = i * squaresize[0] + squaresize[0]/2;
  452. X        SQUARE(board,i,j)->ypos = j * squaresize[0] + squaresize[0]/2;
  453. X      }
  454. X    }
  455. X  }
  456. X
  457. X  if (enable_hex)
  458. X    set_hex_connections (board);
  459. X  else
  460. X    set_square_connections (board);
  461. X
  462. X  if (enable_edit)
  463. X  {
  464. X    for (i=0; i<boardsizex; i++)
  465. X      for (j=0; j<boardsizey; j++)
  466. X      {
  467. X        if (enable_hills)
  468. X          SQUARE(board,i,j)->value[none] = NHILLTONES/2;
  469. X        else if (enable_forest)
  470. X          SQUARE(board,i,j)->value[none] = NFORESTTONES/2;
  471. X        else if (enable_sea)
  472. X          SQUARE(board,i,j)->value[none] = 1;
  473. X      }
  474. X
  475. X    return;
  476. X  }
  477. X
  478. X  if (enable_load)
  479. X  {
  480. X    load_board (board, mapname, FALSE);
  481. X  }
  482. X  else
  483. X  {
  484. X    if (enable_terrain)
  485. X      init_hills(board, seed);
  486. X  }
  487. X
  488. X  if (enable_farms)
  489. X    init_farms(board, farms);
  490. X
  491. X  if (enable_towns)
  492. X    init_towns(board,towns,seed);
  493. X
  494. X  if (enable_bases)
  495. X    init_bases(board,bases);
  496. X
  497. X  if (enable_rbases)
  498. X    init_rbases(board,rbases,seed);
  499. X
  500. X  if (enable_armies)
  501. X    init_armies(board,armies);
  502. X
  503. X  if (enable_militia)
  504. X    init_militia(board,militia,seed);
  505. X
  506. X  init_unseen(board);
  507. X
  508. X  if (enable_horizon && enable_hex)
  509. X    init_horizon (board);
  510. X}
  511. X
  512. X
  513. X/*************************************************************************/
  514. X/**    init_horizon                            **/
  515. X/** Initialize horizon for hexagonal board                **/
  516. X/**    Greg Lesher (lesher@cns.bu.edu)                    **/
  517. X/*************************************************************************/
  518. Xinit_horizon (board)
  519. X  square_type *board;
  520. X{
  521. X  int i, j, k,
  522. X      ibase, jbase,
  523. X      half,
  524. X      index;
  525. X
  526. X  square_type *square;
  527. X
  528. X  half = boardsizex/2;
  529. X  if (half%2 == 0)
  530. X    square = SQUARE (board, half, boardsizey/2);
  531. X  else
  532. X    square = SQUARE (board, half+1, boardsizey/2);
  533. X
  534. X  ibase = square->x;
  535. X  jbase = square->y;
  536. X
  537. X  index = 0;
  538. X
  539. X  for (i=0; i<viewrange[0]; i++)
  540. X  {
  541. X    square = square->connect[HEX_UP];
  542. X
  543. X    for (j=0; j<6; j++)
  544. X    {
  545. X      for (k=0; k<(i+1); k++)
  546. X      {
  547. X        square = square->connect[(HEX_RIGHT_DOWN+j)%6];
  548. X
  549. X        hex_horizon_even[index][0] = square->x - ibase;
  550. X        hex_horizon_even[index][1] = square->y - jbase;
  551. X        index++;
  552. X      }
  553. X    }
  554. X  }
  555. X
  556. X  if (half%2 == 0)
  557. X    square = SQUARE (board, half+1, boardsizey/2);
  558. X  else
  559. X    square = SQUARE (board, half, boardsizey/2);
  560. X
  561. X  ibase = square->x;
  562. X  jbase = square->y;
  563. X
  564. X  index = 0;
  565. X
  566. X  for (i=0; i<viewrange[0]; i++)
  567. X  {
  568. X    square = square->connect[HEX_UP];
  569. X
  570. X    for (j=0; j<6; j++)
  571. X    {
  572. X      for (k=0; k<(i+1); k++)
  573. X      {
  574. X        square = square->connect[(HEX_RIGHT_DOWN+j)%6];
  575. X
  576. X        hex_horizon_odd[index][0] = square->x - ibase;
  577. X        hex_horizon_odd[index][1] = square->y - jbase;
  578. X        index++;
  579. X      }
  580. X    }
  581. X  }
  582. X
  583. X  hex_horizon_number = index;
  584. X}
  585. X
  586. X
  587. X/*************************************************************************/
  588. X/**    init_hex                            **/
  589. X/** Initialize array for use in getsquare with hexagonal board        **/
  590. X/**    Greg Lesher (lesher@cns.bu.edu)                    **/
  591. X/*************************************************************************/
  592. Xinit_hex (squaresize)
  593. X  int squaresize;
  594. X{
  595. X  int i, j,
  596. X      int_angle, mod_angle;
  597. X
  598. X  double xpos, ypos,
  599. X         angle,
  600. X         atan2();
  601. X
  602. X  hex_side = squaresize;
  603. X  hex_halfside = hex_side/2;
  604. X  hex_quarterside = hex_side/4;
  605. X  hex_3quarterside = (3*hex_side)/4;
  606. X  hex_vert = (int)(SQ3D2 * hex_side + 0.5);
  607. X  hex_halfvert = hex_vert/2;
  608. X
  609. X  hex_slope = ((double)(hex_vert))/hex_halfside;
  610. X
  611. X  hex_points[0].x = 0;
  612. X  hex_points[0].y = 0;
  613. X
  614. X  hex_points[1].x = hex_side;
  615. X  hex_points[1].y = 0;
  616. X
  617. X  hex_points[2].x = hex_halfside;
  618. X  hex_points[2].y = hex_vert;
  619. X
  620. X  hex_points[3].x = -hex_halfside;
  621. X  hex_points[3].y = hex_vert;
  622. X
  623. X  hex_points[4].x = -hex_side;
  624. X  hex_points[4].y = 0;
  625. X
  626. X  hex_points[5].x = -hex_halfside;
  627. X  hex_points[5].y = -hex_vert;
  628. X
  629. X  hex_points[6].x = hex_halfside;
  630. X  hex_points[6].y = -hex_vert;
  631. X
  632. X  for (i=0; i<2*hex_side; i++)
  633. X  {
  634. X    for (j=0; j<2*hex_side; j++)
  635. X    {
  636. X      xpos = i - hex_side;
  637. X      ypos = j - hex_side;
  638. X
  639. X      if ((i - hex_side) == 0)
  640. X      {
  641. X        if (ypos > 0)
  642. X          angle = 90.0;
  643. X        else
  644. X          angle = 270.0;
  645. X      }
  646. X      else
  647. X      {
  648. X        angle = atan2 (ypos, xpos);
  649. X        angle = angle * 180.0 / 3.1415927;
  650. X      }
  651. X      
  652. X      if (angle < 0)
  653. X        angle = 360.0 + angle;
  654. X
  655. X      int_angle = (int)(angle + 0.5);
  656. X      mod_angle = int_angle/60;
  657. X
  658. X      switch (mod_angle)
  659. X      {
  660. X        case 0:
  661. X          hex_chart[i][j][0] = HEX_RIGHT_UP;
  662. X          break;
  663. X        case 1:
  664. X          hex_chart[i][j][0] = HEX_UP;
  665. X          break;
  666. X        case 2:
  667. X          hex_chart[i][j][0] = HEX_LEFT_UP;
  668. X          break;
  669. X        case 3:
  670. X          hex_chart[i][j][0] = HEX_LEFT_DOWN;
  671. X          break;
  672. X        case 4:
  673. X          hex_chart[i][j][0] = HEX_DOWN;
  674. X          break;
  675. X        case 5:
  676. X          hex_chart[i][j][0] = HEX_RIGHT_DOWN;
  677. X          break;
  678. X      }
  679. X
  680. X      hex_chart[i][j][1] = -1;
  681. X      mod_angle = int_angle/15;
  682. X
  683. X      switch (mod_angle)
  684. X      {
  685. X        case 0:
  686. X          hex_chart[i][j][1] = HEX_RIGHT_DOWN;
  687. X          break;
  688. X        case 3:
  689. X          hex_chart[i][j][1] = HEX_UP;
  690. X          break;
  691. X        case 4:
  692. X          hex_chart[i][j][1] = HEX_RIGHT_UP;
  693. X          break;
  694. X        case 7:
  695. X          hex_chart[i][j][1] = HEX_LEFT_UP;
  696. X          break;
  697. X        case 8:
  698. X          hex_chart[i][j][1] = HEX_UP;
  699. X          break;
  700. X        case 11:
  701. X          hex_chart[i][j][1] = HEX_LEFT_DOWN;
  702. X          break;
  703. X        case 12:
  704. X          hex_chart[i][j][1] = HEX_LEFT_UP;
  705. X          break;
  706. X        case 15:
  707. X          hex_chart[i][j][1] = HEX_DOWN;
  708. X          break;
  709. X        case 16:
  710. X          hex_chart[i][j][1] = HEX_LEFT_DOWN;
  711. X          break;
  712. X        case 19:
  713. X          hex_chart[i][j][1] = HEX_RIGHT_DOWN;
  714. X          break;
  715. X        case 20:
  716. X          hex_chart[i][j][1] = HEX_DOWN;
  717. X          break;
  718. X        case 23:
  719. X          hex_chart[i][j][1] = HEX_RIGHT_UP;
  720. X          break;
  721. X      }
  722. X
  723. X      if (xpos*xpos + ypos*ypos < 2*CSIZE*CSIZE)
  724. X        hex_chart[i][j][0] = -1;
  725. X
  726. X      if (xpos*xpos + ypos*ypos < 2*CSIZE*CSIZE)
  727. X        hex_chart[i][j][1] = -1;
  728. X    }
  729. X  }
  730. X}
  731. X
  732. X
  733. X/*************************************************************************/
  734. X/**    set_square_connections                        **/
  735. X/** Initialize connections for square board                **/
  736. X/**    Greg Lesher (lesher@cns.bu.edu)                    **/
  737. X/*************************************************************************/
  738. Xset_square_connections (board)
  739. X  square_type *board;
  740. X{
  741. X  int i, j;
  742. X
  743. X  for (j=0; j<boardsizey; j++)
  744. X  {
  745. X    for (i=0; i<boardsizex; i++)
  746. X    {
  747. X
  748. X      if (j != 0)
  749. X        SQUARE(board,i,j)->connect[UP] = SQUARE(board,i,j-1);
  750. X      else
  751. X        SQUARE(board,i,j)->connect[UP] = SQUARE(board,i,j);
  752. X
  753. X      if (j != boardsizey-1)
  754. X        SQUARE(board,i,j)->connect[DOWN] = SQUARE(board,i,j+1);
  755. X      else
  756. X        SQUARE(board,i,j)->connect[DOWN] = SQUARE(board,i,j);
  757. X
  758. X      if (i != 0)
  759. X        SQUARE(board,i,j)->connect[LEFT] = SQUARE(board,i-1,j);
  760. X      else
  761. X        SQUARE(board,i,j)->connect[LEFT] = SQUARE(board,i,j);
  762. X
  763. X      if (i != boardsizex-1)
  764. X        SQUARE(board,i,j)->connect[RIGHT] = SQUARE(board,i+1,j);
  765. X      else
  766. X        SQUARE(board,i,j)->connect[RIGHT] = SQUARE(board,i,j);
  767. X    }
  768. X  }
  769. X
  770. X  if (enable_anywrap)
  771. X  {
  772. X    for (i=0; i<boardsizex; i++)
  773. X    {
  774. X      SQUARE(board,i,0)->connect[UP] = SQUARE(board,i,boardsizey-1);
  775. X      SQUARE(board,i,boardsizey-1)->connect[DOWN] = SQUARE(board,i,0);
  776. X    }
  777. X
  778. X    for (j=0; j<boardsizey; j++)
  779. X    {
  780. X      SQUARE(board,0,j)->connect[LEFT] = SQUARE(board,boardsizex-1,j);
  781. X      SQUARE(board,boardsizex-1,j)->connect[RIGHT] = SQUARE(board,0,j);
  782. X    }
  783. X  }
  784. X}
  785. X
  786. X
  787. X/*************************************************************************/
  788. X/**    set_hex_connections                        **/
  789. X/** Initialize connections for hexagonal board                **/
  790. X/**    Greg Lesher (lesher@cns.bu.edu)                    **/
  791. X/*************************************************************************/
  792. Xset_hex_connections (board)
  793. X  square_type *board;
  794. X
  795. X{
  796. X  int i, j,
  797. X      even;
  798. X
  799. X  for (j=0; j<boardsizey; j++)
  800. X  {
  801. X    even = TRUE;
  802. X
  803. X    for (i=0; i<boardsizex; i++)
  804. X    {
  805. X      if (j != 0)
  806. X        SQUARE(board,i,j)->connect[HEX_UP] = SQUARE(board,i,j-1);
  807. X      else
  808. X        SQUARE(board,i,j)->connect[HEX_UP] = SQUARE(board,i,j);
  809. X
  810. X      if (j != boardsizey-1)
  811. X        SQUARE(board,i,j)->connect[HEX_DOWN] = SQUARE(board,i,j+1);
  812. X      else
  813. X        SQUARE(board,i,j)->connect[HEX_DOWN] = SQUARE(board,i,j);
  814. X
  815. X      if (i != 0)
  816. X      {
  817. X        if (j != 0)
  818. X        {
  819. X          if (even)
  820. X            SQUARE(board,i,j)->connect[HEX_LEFT_UP] = SQUARE(board,i-1,j-1);
  821. X          else
  822. X            SQUARE(board,i,j)->connect[HEX_LEFT_UP] = SQUARE(board,i-1,j);
  823. X        }
  824. X        else if (!even)
  825. X          SQUARE(board,i,j)->connect[HEX_LEFT_UP] = SQUARE(board,i-1,j);
  826. X        else
  827. X          SQUARE(board,i,j)->connect[HEX_LEFT_UP] = SQUARE(board,i,j);
  828. X
  829. X        if (j != boardsizey-1)
  830. X        {
  831. X          if (even)
  832. X            SQUARE(board,i,j)->connect[HEX_LEFT_DOWN] = SQUARE(board,i-1,j);
  833. X          else
  834. X            SQUARE(board,i,j)->connect[HEX_LEFT_DOWN] = SQUARE(board,i-1,j+1);
  835. X        }
  836. X        else if (even)
  837. X          SQUARE(board,i,j)->connect[HEX_LEFT_DOWN] = SQUARE(board,i-1,j);
  838. X        else
  839. X          SQUARE(board,i,j)->connect[HEX_LEFT_DOWN] = SQUARE(board,i,j);
  840. X      }
  841. X      else
  842. X      {
  843. X        SQUARE(board,i,j)->connect[HEX_LEFT_UP] = SQUARE(board,i,j);
  844. X        SQUARE(board,i,j)->connect[HEX_LEFT_DOWN] = SQUARE(board,i,j);
  845. X      }
  846. X
  847. X      if (i != boardsizex-1)
  848. X      {
  849. X        if (j != 0)
  850. X        {
  851. X          if (even)
  852. X            SQUARE(board,i,j)->connect[HEX_RIGHT_UP] = SQUARE(board,i+1,j-1);
  853. X          else
  854. X            SQUARE(board,i,j)->connect[HEX_RIGHT_UP] = SQUARE(board,i+1,j);
  855. X        }
  856. X        else if (!even)
  857. X          SQUARE(board,i,j)->connect[HEX_RIGHT_UP] = SQUARE(board,i+1,j);
  858. X        else
  859. X          SQUARE(board,i,j)->connect[HEX_RIGHT_UP] = SQUARE(board,i,j);
  860. X
  861. X        if (j != boardsizey-1)
  862. X        {
  863. X          if (even)
  864. X            SQUARE(board,i,j)->connect[HEX_RIGHT_DOWN] = SQUARE(board,i+1,j);
  865. X          else
  866. X            SQUARE(board,i,j)->connect[HEX_RIGHT_DOWN] = SQUARE(board,i+1,j+1);
  867. X        }
  868. X        else if (even)
  869. X          SQUARE(board,i,j)->connect[HEX_RIGHT_DOWN] = SQUARE(board,i+1,j);
  870. X        else
  871. X          SQUARE(board,i,j)->connect[HEX_RIGHT_DOWN] = SQUARE(board,i,j);
  872. X
  873. X      }
  874. X      else
  875. X      {
  876. X        SQUARE(board,i,j)->connect[HEX_RIGHT_UP] = SQUARE(board,i,j);
  877. X        SQUARE(board,i,j)->connect[HEX_RIGHT_DOWN] = SQUARE(board,i,j);
  878. X      }
  879. X
  880. X      even = !even;
  881. X    }
  882. X  }
  883. X
  884. X  if (enable_anywrap)
  885. X  {
  886. X    for (i=0; i<boardsizex; i++)
  887. X    {
  888. X      SQUARE(board,i,0)->connect[HEX_UP] = SQUARE(board,i,boardsizey-1);
  889. X      SQUARE(board,i,boardsizey-1)->connect[HEX_DOWN] = SQUARE(board,i,0);
  890. X
  891. X      if (i%2 == 1)
  892. X      {
  893. X        if (i!=0)
  894. X          SQUARE(board,i,0)->connect[HEX_LEFT_UP] = SQUARE(board,i-1,boardsizey-1);
  895. X
  896. X        if (i!=boardsizex-1)
  897. X          SQUARE(board,i,0)->connect[HEX_RIGHT_UP] = SQUARE(board,i+1,boardsizey-1);
  898. X
  899. X        if (i!=0)
  900. X          SQUARE(board,i,boardsizey-1)->connect[HEX_LEFT_DOWN] = SQUARE(board,i-1,0);
  901. X
  902. X        if (i!=boardsizex-1)
  903. X          SQUARE(board,i,boardsizey-1)->connect[HEX_RIGHT_DOWN] = SQUARE(board,i+1,0);
  904. X      }
  905. X    }
  906. X
  907. X    if (boardsizex%2 == 0)
  908. X    {
  909. X      for (j=0; j<boardsizey; j++)
  910. X      {
  911. X        if (j==0)
  912. X          SQUARE(board,0,j)->connect[HEX_LEFT_UP] = SQUARE(board,boardsizex-1,boardsizey-1);
  913. X        else
  914. X          SQUARE(board,0,j)->connect[HEX_LEFT_UP] = SQUARE(board,boardsizex-1,j-1);
  915. X
  916. X        SQUARE(board,0,j)->connect[HEX_LEFT_DOWN] = SQUARE(board,boardsizex-1,j);
  917. X
  918. X        SQUARE(board,boardsizex-1,j)->connect[HEX_RIGHT_UP] = SQUARE(board,0,j);
  919. X
  920. X        if (j == boardsizey-1)
  921. X          SQUARE(board,boardsizex-1,j)->connect[HEX_RIGHT_DOWN] = SQUARE(board,0,0);
  922. X        else
  923. X          SQUARE(board,boardsizex-1,j)->connect[HEX_RIGHT_DOWN] = SQUARE(board,0,j+1);
  924. X      }
  925. X    }
  926. X  }
  927. X}
  928. X
  929. X
  930. X/*************************************************************************/
  931. X/**    init_unseen                            **/
  932. X/** Make all squares unseen                        **/
  933. X/**    Greg Lesher (lesher@park.bu.edu)                **/
  934. X/*************************************************************************/
  935. Xinit_unseen (board)
  936. X  square_type *board;
  937. X{
  938. X  int i, j, k;
  939. X
  940. X  for (i=0; i<boardsizex; i++)
  941. X    for (j=0; j<boardsizey; j++)
  942. X      for (k=0; k<nsides; k++)
  943. X        if (enable_map[k] || enable_localmap[k])
  944. X          SQUARE(board,i,j)->seen[k] = FALSE;
  945. X}
  946. X
  947. X
  948. X/*************************************************************************/
  949. X/**    init_hills                            **/
  950. X/** set the hills on the game board.  Hills take energy  to climb, but    **/
  951. X/** return it again on the way down,  so they can  be used to tactical    **/
  952. X/** advantage.                                **/
  953. X/**                                    **/
  954. X/**    Steve Lehar (slehar@park.bu.edu)                **/
  955. X/**    Greg Lesher (lesher@park.bu.edu)                **/
  956. X/*************************************************************************/
  957. Xinit_hills(board,seed)
  958. X  square_type *board;
  959. X  int seed;
  960. X{
  961. X  int i, j,
  962. X      offset;
  963. X  double limit;
  964. X
  965. X  if (enable_hills)
  966. X    limit = (double)(NHILLTONES);
  967. X  if (enable_forest)
  968. X    limit = (double)(NFORESTTONES);
  969. X  else if (enable_sea && !enable_hills && !enable_forest)
  970. X    limit = sea;
  971. X
  972. X  /**** set initial random values ****/
  973. X  for (i=0; i<boardsizex; i++)
  974. X  {
  975. X    for (j=0; j<boardsizey; j++)
  976. X    {
  977. X      SQUARE(board,i,j)->value[none] = (int)(drand48()*limit);
  978. X    }
  979. X  }
  980. X
  981. X  if (enable_border && enable_sea)
  982. X  {
  983. X    for (i=0; i<boardsizex; i++)
  984. X    {
  985. X     SQUARE(board,i,0)->value[none] = 0;
  986. X     SQUARE(board,i,boardsizey-1)->value[none] = 0;
  987. X    }
  988. X    for (j=0; j<boardsizey; j++)
  989. X    {
  990. X     SQUARE(board,0, j)->value[none] = 0;
  991. X     SQUARE(board,boardsizex-1,j)->value[none] = 0;
  992. X    }
  993. X
  994. X    offset = 2;
  995. X  }
  996. X  else
  997. X    offset = 1;
  998. X  
  999. X  
  1000. X
  1001. X  /**** smooth out the hills ****/
  1002. X  for (j=offset; j<boardsizey-offset; j++)
  1003. X  {
  1004. X    for (i=offset; i<boardsizex-offset; i++)
  1005. X    {
  1006. X      if (SQUARE(board,i,j+1)->value[none] == SQUARE(board,i,j-1)->value[none])
  1007. X    SQUARE(board,i,j)->value[none] = SQUARE(board,i,j-1)->value[none];
  1008. X      if (SQUARE(board,i+1,j)->value[none] == SQUARE(board,i-1,j)->value[none])
  1009. X    SQUARE(board,i,j)->value[none] = SQUARE(board,i-1,j)->value[none];
  1010. X    }
  1011. X  }
  1012. X
  1013. X  /**** if just sea enabled, flatten all hills to 2nd lowest level ****/
  1014. X  if (enable_sea && !enable_hills && !enable_forest)
  1015. X    for (i=0; i<boardsizex; i++)
  1016. X      for (j=0; j<boardsizey; j++)
  1017. X        if (SQUARE(board,i,j)->value[none] == 0)
  1018. X          SQUARE(board,i,j)->value[none] = 0;
  1019. X        else
  1020. X          SQUARE(board,i,j)->value[none] = 1;
  1021. X}
  1022. X
  1023. X
  1024. X/*************************************************************************/
  1025. X/**    init_towns                            **/
  1026. X/** set the towns on the game board.  Towns are sources of troops, and    **/
  1027. X/** appear as circles  whose radius  is  proportional  to the  rate of    **/
  1028. X/** troop production.                              **/
  1029. X/**                                    **/
  1030. X/**    Steve Lehar (slehar@park.bu.edu)                **/
  1031. X/**    Greg Lesher (lesher@park.bu.edu)                **/
  1032. X/*************************************************************************/
  1033. Xinit_towns(board,val,seed)
  1034. X  square_type *board;
  1035. X  double val;
  1036. X  int seed;
  1037. X{
  1038. X  int i, j;
  1039. X
  1040. X  /**** set the random towns ****/
  1041. X  for (i=0; i<boardsizex; i++)
  1042. X  {
  1043. X    for (j=0; j<boardsizey; j++)
  1044. X    {
  1045. X      if (drand48() <= val/40.0)
  1046. X      {
  1047. X         if (!(enable_sea && SQUARE(board,i,j)->value[none] <= 0))
  1048. X         {
  1049. X       SQUARE(board,i,j)->growth =  (int)(drand48()*40.0+0.5)+60;
  1050. X       SQUARE(board,i,j)->oldgrowth = SQUARE(board,i,j)->growth;
  1051. X       SQUARE(board,i,j)->angle = 23040; 
  1052. X         }
  1053. X       }
  1054. X    }
  1055. X  }
  1056. X}
  1057. X
  1058. X
  1059. X/*************************************************************************/
  1060. X/**    init_farms                            **/
  1061. X/** set the  farms on  the   game board.  Farms   produce troops  at a    **/
  1062. X/** constant slow rate val, and  must be cultivated  in large areas to    **/
  1063. X/** be effective.                            **/
  1064. X/**    Steve Lehar (slehar@park.bu.edu)                **/
  1065. X/*************************************************************************/
  1066. Xinit_farms(board,val)
  1067. X  square_type *board;
  1068. X  double val;
  1069. X{
  1070. X  int i, j;
  1071. X
  1072. X  /**** set growth values ****/
  1073. X  for (i=0; i<boardsizex; i++)
  1074. X  {
  1075. X    for (j=0; j<boardsizey; j++)
  1076. X    {
  1077. X      if (!(enable_sea && SQUARE(board,i,j)->value[none] <= 0))
  1078. X      {
  1079. X        if (SQUARE(board,i,j)->growth < 50);
  1080. X          SQUARE(board,i,j)->growth = (int)val;
  1081. X      }
  1082. X    }
  1083. X  }
  1084. X}
  1085. X
  1086. X
  1087. X/*************************************************************************/
  1088. X/**    init_bases                            **/
  1089. X/** set the bases on the game board.  Bases provide a steady supply of    **/
  1090. X/** a large  number  of troops, and thus   are   of enormous strategic    **/
  1091. X/** advantage.                                **/
  1092. X/**    Steve Lehar (slehar@park.bu.edu)                **/
  1093. X/**    Greg Lesher (lesher@park.bu.edu)                **/
  1094. X/*************************************************************************/
  1095. Xinit_bases(board,n)
  1096. X  square_type *board;
  1097. X  int n[];
  1098. X{
  1099. X  int i, sep[MAXSIDES];
  1100. X  
  1101. X  /**** separation between bases ****/
  1102. X  for (i=0; i<nsides; i++)
  1103. X    sep[i] = (boardsizex-n[i])/2;
  1104. X
  1105. X  /**** initialize the bases ****/
  1106. X  if (nsides >= 1)
  1107. X  {
  1108. X    for (i=sep[0]; i<sep[0]+n[0]; i++)
  1109. X    {
  1110. X      if (!(enable_sea && SQUARE(board,i,1)->value[none] <= 0))
  1111. X      {
  1112. X        SQUARE(board,i,1)->color  = 0;
  1113. X        SQUARE(board,i,1)->value[0]  = 1;
  1114. X        SQUARE(board,i,1)->growth = 100;
  1115. X        SQUARE(board,i,1)->oldgrowth = 100;
  1116. X        SQUARE(board,i,1)->angle = 23040; 
  1117. X      }
  1118. X    }
  1119. X  }
  1120. X
  1121. X  if (nsides >= 2)
  1122. X  {
  1123. X    for (i=sep[1]; i<sep[1]+n[1]; i++)
  1124. X    {
  1125. X      if (!(enable_sea && SQUARE(board,i,boardsizey-2)->value[none] <= 0))
  1126. X      {
  1127. X        SQUARE(board,i,boardsizey-2)->color  = 1;
  1128. X        SQUARE(board,i,boardsizey-2)->value[1]  = 1;
  1129. X        SQUARE(board,i,boardsizey-2)->growth = 100;
  1130. X        SQUARE(board,i,boardsizey-2)->oldgrowth = 100;
  1131. X        SQUARE(board,i,boardsizey-2)->angle = 23040; 
  1132. X      }
  1133. X    }
  1134. X  }
  1135. X
  1136. X  if (nsides >= 3)
  1137. X  {
  1138. X    for (i=sep[2]; i<sep[2]+n[2]; i++)
  1139. X    {
  1140. X      if (!(enable_sea && SQUARE(board,1,i)->value[none] <= 0))
  1141. X      {
  1142. X        SQUARE(board,1,i)->color  = 2;
  1143. X        SQUARE(board,1,i)->value[2]  = 1;
  1144. X        SQUARE(board,1,i)->growth = 100;
  1145. X        SQUARE(board,1,i)->oldgrowth = 100;
  1146. X        SQUARE(board,1,i)->angle = 23040; 
  1147. X      }
  1148. X    }
  1149. X  }
  1150. X
  1151. X  if (nsides >= 4)
  1152. X  {
  1153. X    for (i=sep[3]; i<sep[3]+n[3]; i++)
  1154. X    {
  1155. X      if (!(enable_sea && SQUARE(board,boardsizex-2,i)->value[none] <= 0))
  1156. X      {
  1157. X        SQUARE(board,boardsizex-2,i)->color  = 3;
  1158. X        SQUARE(board,boardsizex-2,i)->value[3]  = 1;
  1159. X        SQUARE(board,boardsizex-2,i)->growth = 100;
  1160. X        SQUARE(board,boardsizex-2,i)->oldgrowth = 100;
  1161. X        SQUARE(board,boardsizex-2,i)->angle = 23040; 
  1162. X      }
  1163. X    }
  1164. X  }
  1165. X}
  1166. X
  1167. X
  1168. X/*************************************************************************/
  1169. X/**    init_rbases                            **/
  1170. X/** set the bases on the game board.  Bases provide a steady supply of    **/
  1171. X/** a large  number  of troops, and thus   are   of enormous strategic    **/
  1172. X/** advantage.                                **/
  1173. X/**    Mark Lauer (elric@cs.su.oz.au)                    **/
  1174. X/** Modified to handle multiple players                    **/
  1175. X/**    Greg Lesher (lesher@park.bu.edu)                **/
  1176. X/*************************************************************************/
  1177. Xinit_rbases(board,n,seed)
  1178. X  square_type *board;
  1179. X  int n[],
  1180. X      seed;
  1181. X{
  1182. X  int i, j, k, l, x, y,
  1183. X      i1, i2, j1, j2,
  1184. X      range,
  1185. X      maxn,
  1186. X      done,
  1187. X      count;
  1188. X
  1189. X  /**** create randomly placed bases for each side ****/
  1190. X
  1191. X  maxn = 0;
  1192. X  for (i=0; i<nsides; i++)
  1193. X    if (n[i] > maxn)
  1194. X      maxn = n[i];
  1195. X
  1196. X  if (maxviewrange < BASERANGE)
  1197. X    range = BASERANGE;
  1198. X  else
  1199. X    range = maxviewrange;
  1200. X
  1201. X  for (k=0; k<maxn; k++)
  1202. X  {
  1203. X    for (l=0; l<nsides; l++)
  1204. X    {
  1205. X      if (k >= n[l])
  1206. X        continue;
  1207. X
  1208. X      count = 0;
  1209. X      do
  1210. X      {
  1211. X        done = TRUE;
  1212. X        i = (int)(drand48()*boardsizex);
  1213. X        j = (int)(drand48()*boardsizey);
  1214. X
  1215. X        if (SQUARE(board,i,j)->growth > 50 || (enable_sea && SQUARE(board,i,j)->value[none] <= 0))
  1216. X          done = FALSE+FALSE;
  1217. X
  1218. X        i1 = i-range;
  1219. X        i2 = i+range;
  1220. X        j1 = j-range;
  1221. X        j2 = j+range;
  1222. X
  1223. X        /**** search for nearby squares of color color ****/
  1224. X        if (enable_anywrap)
  1225. X        {
  1226. X          for (x=i1; x<=i2; x++)
  1227. X            for (y=j1; y<=j2; y++)
  1228. X              if (SQUARE(board,MODX(x),MODY(y))->color != l &&
  1229. X                               SQUARE(board,MODX(x),MODY(y))->color != none) 
  1230. X                done = FALSE;
  1231. X        }
  1232. X        else
  1233. X        {
  1234. X          i1 = (i1<0) ? 0 : i1;
  1235. X          i2 = (i2>boardsizex-1) ? boardsizex-1 : i2;
  1236. X          j1 = (j1<0) ? 0 : j1;
  1237. X          j2 = (j2>boardsizey-1) ? boardsizey-1 : j2;
  1238. X
  1239. X          for (x=i1; x<=i2; x++)
  1240. X            for (y=j1; y<=j2; y++)
  1241. X              if (SQUARE(board,x,y)->color != l && SQUARE(board,x,y)->color != none)
  1242. X                done = FALSE;
  1243. X        }
  1244. X        count++;
  1245. X
  1246. X        if (count > 50 && done!=(FALSE+FALSE))
  1247. X          done = TRUE;
  1248. X
  1249. X      } while (!done);
  1250. X
  1251. X      SQUARE(board,i,j)->color = l;
  1252. X      SQUARE(board,i,j)->value[l] = 1;
  1253. X      SQUARE(board,i,j)->growth = 100;
  1254. X      SQUARE(board,i,j)->oldgrowth = 100;
  1255. X      SQUARE(board,i,j)->angle = 23040; 
  1256. X    }
  1257. X  }
  1258. X}
  1259. X
  1260. X
  1261. X/*************************************************************************/
  1262. X/**    init_armies                            **/
  1263. X/** set the armies on the game board                    **/
  1264. X/**    Steve Lehar (slehar@park.bu.edu)                **/
  1265. X/**    Greg Lesher (lesher@park.bu.edu)                **/
  1266. X/*************************************************************************/
  1267. Xinit_armies(board,n)
  1268. X  square_type *board;
  1269. X  int n[];
  1270. X{
  1271. X  int i, sep[MAXSIDES];
  1272. X  
  1273. X  for (i=0; i<nsides; i++)
  1274. X    sep[i] = (boardsizex-n[i])/2;
  1275. X
  1276. X  /**** initialize armies for each side ****/
  1277. X
  1278. X  if (nsides >= 1)
  1279. X  {
  1280. X    for (i=sep[0]; i<sep[0]+n[0]; i++)
  1281. X    {
  1282. X      if (!(enable_sea && SQUARE(board,i,2)->value[none] <= 0))
  1283. X      {
  1284. X        SQUARE(board,i,2)->color  = 0;
  1285. X        SQUARE(board,i,2)->value[0]  = MAXVAL;
  1286. X      }
  1287. X    }
  1288. X  }
  1289. X
  1290. X  if (nsides >= 2)
  1291. X  {
  1292. X    for (i=sep[1]; i<sep[1]+n[1]; i++)
  1293. X    {
  1294. X      if (!(enable_sea && SQUARE(board,i,boardsizey-3)->value[none] <= 0))
  1295. X      {
  1296. X        SQUARE(board,i,boardsizey-3)->color  = 1;
  1297. X        SQUARE(board,i,boardsizey-3)->value[1]  = MAXVAL;
  1298. X      }
  1299. X    }
  1300. X  }
  1301. X
  1302. X  if (nsides >= 3)
  1303. X  {
  1304. X    for (i=sep[2]; i<sep[2]+n[2]; i++)
  1305. X    {
  1306. X      if (!(enable_sea && SQUARE(board,2,i)->value[none] <= 0))
  1307. X      {
  1308. X        SQUARE(board,2,i)->color  = 2;
  1309. X        SQUARE(board,2,i)->value[2]  = MAXVAL;
  1310. X      }
  1311. X    }
  1312. X  }
  1313. X
  1314. X  if (nsides >= 4)
  1315. X  {
  1316. X    for (i=sep[3]; i<sep[3]+n[3]; i++)
  1317. X    {
  1318. X      if (!(enable_sea && SQUARE(board,boardsizex-3,i)->value[none] <= 0))
  1319. X      {
  1320. X        SQUARE(board,boardsizex-3,i)->color  = 3;
  1321. X        SQUARE(board,boardsizex-3,i)->value[3]  = MAXVAL;
  1322. X      }
  1323. X    }
  1324. X  }
  1325. X}
  1326. X
  1327. X
  1328. X/*************************************************************************/
  1329. X/**    init_militia                            **/
  1330. X/** set random militia on the game board.                 **/
  1331. X/**    Steve Lehar (slehar@park.bu.edu)                **/
  1332. X/**    Greg Lesher (lesher@park.bu.edu)                **/
  1333. X/*************************************************************************/
  1334. Xinit_militia(board,val,seed)
  1335. X  square_type *board;
  1336. X  double val[];
  1337. X  int seed;
  1338. X{
  1339. X  int i, j, k, l,
  1340. X      scramble;
  1341. X
  1342. X  double roll,
  1343. X         thresh;
  1344. X
  1345. X  scramble = 0;
  1346. X  thresh = 1.0/((double)(nsides));
  1347. X
  1348. X  /**** set the random militia ****/
  1349. X  for (i=0; i<boardsizex; i++)
  1350. X  {
  1351. X    for (j=0; j<boardsizey; j++)
  1352. X    {
  1353. X      scramble += 217;
  1354. X
  1355. X      for (k=0; k<nsides; k++)
  1356. X      {
  1357. X        l = (scramble+k)%nsides;
  1358. X
  1359. X        if (drand48() <= val[l]/40.0)
  1360. X        {
  1361. X          if (!(enable_sea && SQUARE(board,i,j)->value[none] <= 0))
  1362. X          {
  1363. X        SQUARE(board,i,j)->color =  l;
  1364. X        SQUARE(board,i,j)->value[l]  = (int)(drand48()*(double)MAXVAL);
  1365. X            k = nsides;
  1366. X          }
  1367. X        }
  1368. X      }
  1369. X    }
  1370. X  }
  1371. X}
  1372. X
  1373. X
  1374. Xedit_board (board)
  1375. X  square_type *board;
  1376. X{
  1377. X  XEvent event;
  1378. X
  1379. X  int i,
  1380. X      player,
  1381. X      currentcolor,
  1382. X      value,
  1383. X      x, y,
  1384. X      textcount,
  1385. X      tdir[DIRS];
  1386. X
  1387. X  char text[20];
  1388. X
  1389. X  KeySym key;
  1390. X
  1391. X  square_type *square;
  1392. X
  1393. X  player = 0;
  1394. X  currentcolor = colorarray[player];
  1395. X
  1396. X  drawboard (board, player, TRUE);
  1397. X
  1398. X  while (TRUE)
  1399. X  {
  1400. X    XNextEvent(xwindow[player]->display, &event);
  1401. X
  1402. X    getsquare(event.xbutton.x,event.xbutton.y,&x,&y,tdir,squaresize[colorarray[player]], board, FALSE);
  1403. X    square = SQUARE(board,x,y);
  1404. X
  1405. X    switch (event.type)
  1406. X    {
  1407. X      case Expose:
  1408. X        drawboard (board, player, TRUE);
  1409. X        break;
  1410. X
  1411. X      case ButtonPress:
  1412. X        switch (event.xbutton.button)
  1413. X        {
  1414. X          case Button1:
  1415. X          case Button2:
  1416. X          case Button3:
  1417. X            if (event.xbutton.button == Button1)
  1418. X              square->value[none] -= 1;
  1419. X            else if (event.xbutton.button == Button2)
  1420. X              square->value[none] += 1;
  1421. X            else
  1422. X            {
  1423. X              if (square->value[none] != 0)
  1424. X                square->value[none] = 0;
  1425. X              else
  1426. X              {
  1427. X                if (enable_hills)
  1428. X                  square->value[none] = NHILLTONES/2;
  1429. X                else if (enable_forest)
  1430. X                  square->value[none] = NFORESTTONES/2;
  1431. X                else if (enable_sea)
  1432. X                  square->value[none] = 1;
  1433. X              }
  1434. X            }
  1435. X
  1436. X            if (square->value[none] < 0)
  1437. X              square->value[none] = 0;
  1438. X            else if (enable_hills)
  1439. X            {
  1440. X              if (square->value[none] >= NHILLTONES)
  1441. X                square->value[none] = NHILLTONES-1;
  1442. X            }
  1443. X            else if (enable_forest)
  1444. X            {
  1445. X              if (square->value[none] >= NFORESTTONES)
  1446. X                square->value[none] = NFORESTTONES-1;
  1447. X            }
  1448. X            else if (enable_sea)
  1449. X            {
  1450. X              if (square->value[none] >= NSEATONES)
  1451. X                square->value[none] = NSEATONES-1;
  1452. X            }
  1453. X            else
  1454. X              square->value[none] = 0;
  1455. X
  1456. X            if (enable_sea && square->value[none] == 0)
  1457. X            {
  1458. X              if (square->color != none)
  1459. X              {
  1460. X                square->value[square->color] = 0;
  1461. X                square->color = none;
  1462. X              }
  1463. X
  1464. X              square->growth = 0;
  1465. X              square->oldgrowth = 0;
  1466. X              square->angle = 0;
  1467. X            }
  1468. X
  1469. X            drawsquare(xwindow[player], square, colorarray[player],
  1470. X                                        squaresize[colorarray[player]]);
  1471. X            break;
  1472. X        } 
  1473. X        break;
  1474. X
  1475. X      case KeyPress:
  1476. X        
  1477. X        textcount = XLookupString(&event, text, 10, &key, NULL);
  1478. X        if (textcount == 0)
  1479. X          break;
  1480. X
  1481. X        switch (text[0])
  1482. X        {
  1483. X          case 'c':
  1484. X          case 't':
  1485. X          case 'v':
  1486. X            if (enable_sea && square->value[none] <= 0)
  1487. X              break;
  1488. X          
  1489. X            if (text[0] == 'c')
  1490. X              square->growth = 100;
  1491. X            else if (text[0] == 't')
  1492. X              square->growth = 80;
  1493. X            else
  1494. X              square->growth = 60;
  1495. X
  1496. X            square->oldgrowth = square->growth;
  1497. X            square->angle = 23040;
  1498. X            break;
  1499. X
  1500. X          case 's':
  1501. X            if (square->oldgrowth > 50)
  1502. X            {
  1503. X              square->growth = 0;
  1504. X              square->angle -= 2304;
  1505. X
  1506. X              if (square->angle < 10)
  1507. X              {
  1508. X                square->growth = 0;
  1509. X                square->oldgrowth = 0;
  1510. X                square->angle = 0;
  1511. X              }
  1512. X            }
  1513. X            break;
  1514. X
  1515. X          case 'b':
  1516. X            if (square->oldgrowth > 50)
  1517. X            {
  1518. X              square->angle += 2304;
  1519. X
  1520. X              if (square->angle > 23030)
  1521. X              {
  1522. X                square->growth = square->oldgrowth;
  1523. X                square->angle = 23040;
  1524. X              }
  1525. X            }
  1526. X            break;
  1527. X
  1528. X          case 'j':
  1529. X            if (square->growth > 50)
  1530. X            {
  1531. X              square->growth *= 0.95;
  1532. X              square->oldgrowth = square->growth;
  1533. X            }
  1534. X
  1535. X            if (square->growth < 60)
  1536. X            {
  1537. X              square->growth = 0;
  1538. X              square->oldgrowth = 0;
  1539. X              square->angle = 0;
  1540. X            }
  1541. X            break;
  1542. X
  1543. X          case 'k':
  1544. X            if (square->growth > 50)
  1545. X            {
  1546. X              square->growth *= 1.05;
  1547. X              square->oldgrowth = square->growth;
  1548. X            }
  1549. X
  1550. X            if (square->growth > 100)
  1551. X            {
  1552. X              square->growth = 100;
  1553. X              square->oldgrowth = 100;
  1554. X            }
  1555. X            break;
  1556. X
  1557. X          case 'r':
  1558. X            currentcolor += 1;
  1559. X            if (currentcolor >= nsides)
  1560. X              currentcolor = 0;
  1561. X            break;
  1562. X
  1563. X          case 'f':
  1564. X            if (square->color != none)
  1565. X            {
  1566. X              value = square->value[square->color];
  1567. X              square->value[square->color] = 0;
  1568. X              square->color += 1;
  1569. X              if (square->color >= nsides)
  1570. X                square->color = 0;
  1571. X              square->value[square->color] = value;
  1572. X            }
  1573. X            break;
  1574. X
  1575. X          case '1':
  1576. X          case '2':
  1577. X          case '3':
  1578. X          case '4':
  1579. X          case '5':
  1580. X          case '6':
  1581. X          case '7':
  1582. X          case '8':
  1583. X          case '9':
  1584. X          case '0':
  1585. X          case '[':
  1586. X          case ']':
  1587. X            if (enable_sea && square->value[none] <= 0)
  1588. X              break;
  1589. X
  1590. X            if (square->color == none)
  1591. X              square->color = currentcolor;
  1592. X
  1593. X            if (text[0] == ']')
  1594. X              square->value[square->color] += 1;
  1595. X            else if (text[0] == '[')
  1596. X            {
  1597. X              if (square->value[square->color] > 0)
  1598. X                square->value[square->color] -= 1;
  1599. X            }
  1600. X            else
  1601. X              square->value[square->color] = (text[0] - '0')*MAXVAL/9;
  1602. X
  1603. X            if (square->value[square->color] == 0)
  1604. X              square->color = none;
  1605. X            else if (square->value[square->color] > MAXVAL)
  1606. X                square->value[square->color] = MAXVAL;
  1607. X            break;
  1608. X
  1609. X          case 'd':
  1610. X            dump_board (board, mapname);
  1611. X            drawboard (board, player, TRUE);
  1612. X            break;
  1613. X
  1614. X          case 'l':
  1615. X            load_board (board, mapname, TRUE);
  1616. X            drawboard (board, player, TRUE);
  1617. X            break;
  1618. X
  1619. X          case 'e':
  1620. X            exit (0);
  1621. X            break;
  1622. X        }
  1623. X
  1624. X        drawsquare(xwindow[player], square, colorarray[player],
  1625. X                                        squaresize[colorarray[player]]);
  1626. X
  1627. X        break;
  1628. X    }
  1629. X  }
  1630. X}
  1631. X
  1632. X
  1633. Xdump_board (board, filename)
  1634. X  square_type *board;
  1635. X  char filename[];
  1636. X{
  1637. X  int i, j;
  1638. X
  1639. X  FILE *fp,
  1640. X       *fopen();
  1641. X
  1642. X  if ((fp = fopen (filename, "w")) == NULL)
  1643. X  {
  1644. X    printf ("Unable to open map file: %s\n", filename);
  1645. X    exit (0);
  1646. X  }
  1647. X
  1648. X  fwrite (&boardsizex, sizeof(int), 1, fp);
  1649. X  fwrite (&boardsizey, sizeof(int), 1, fp);
  1650. X  fwrite (&enable_hex, sizeof(int), 1, fp);
  1651. X  fwrite (&enable_hills, sizeof(int), 1, fp);
  1652. X  fwrite (&enable_forest, sizeof(int), 1, fp);
  1653. X  fwrite (&enable_sea, sizeof(int), 1, fp);
  1654. X  fwrite (&enable_terrain, sizeof(int), 1, fp);
  1655. X  fwrite (&none, sizeof(int), 1, fp);
  1656. X
  1657. X  for (i=0; i<boardsizex; i++)
  1658. X    for (j=0; j<boardsizey; j++)
  1659. X      fwrite (SQUARE(board,i,j), sizeof(square_type), 1, fp);
  1660. X
  1661. X  fwrite (&nplayers, sizeof(int), 1, fp);
  1662. X
  1663. X  fclose (fp);
  1664. X}
  1665. X
  1666. X
  1667. Xload_board (board, filename, friendly)
  1668. X  square_type *board;
  1669. X  char filename[];
  1670. X  int friendly;
  1671. X{
  1672. X  int i, j,
  1673. X      temp_enable_hills,
  1674. X      temp_enable_forest,
  1675. X      temp_enable_sea,
  1676. X      temp_enable_terrain,
  1677. X      temp_none;
  1678. X
  1679. X  FILE *fp,
  1680. X       *fopen();
  1681. X
  1682. X  if ((fp = fopen (filename, "r")) == NULL)
  1683. X  {
  1684. X    printf ("Unable to open map file: %s\n", filename);
  1685. X    exit (0);
  1686. X  }
  1687. X
  1688. X  fread (&boardsizex, sizeof(int), 1, fp);
  1689. X  fread (&boardsizey, sizeof(int), 1, fp);
  1690. X  fread (&enable_hex, sizeof(int), 1, fp);
  1691. X  fread (&temp_enable_hills, sizeof(int), 1, fp);
  1692. X  fread (&temp_enable_forest, sizeof(int), 1, fp);
  1693. X  fread (&temp_enable_sea, sizeof(int), 1, fp);
  1694. X  fread (&temp_enable_terrain, sizeof(int), 1, fp);
  1695. X  fread (&temp_none, sizeof(int), 1, fp);
  1696. X
  1697. X  for (i=0; i<boardsizex; i++)
  1698. X    for (j=0; j<boardsizey; j++)
  1699. X      fread (SQUARE(board,i,j), sizeof(square_type), 1, fp);
  1700. X
  1701. X  for (i=0; i<boardsizex; i++)
  1702. X    for (j=0; j<boardsizey; j++)
  1703. X    {
  1704. X      SQUARE(board,i,j)->value[none] = SQUARE(board,i,j)->value[temp_none];
  1705. X
  1706. X      if (none > temp_none)
  1707. X        SQUARE(board,i,j)->value[temp_none] = 0;
  1708. X
  1709. X      if (SQUARE(board,i,j)->color > none)
  1710. X      {
  1711. X        SQUARE(board,i,j)->value[SQUARE(board,i,j)->color] = 0;
  1712. X        SQUARE(board,i,j)->color = none; 
  1713. X      }
  1714. X      else if (SQUARE(board,i,j)->color == temp_none)
  1715. X      {
  1716. X        SQUARE(board,i,j)->color = none; 
  1717. X      }
  1718. X    }
  1719. X
  1720. X  if (!friendly)
  1721. X  {
  1722. X    enable_hills = temp_enable_hills;
  1723. X    enable_forest = temp_enable_forest;
  1724. X    enable_sea = temp_enable_sea;
  1725. X    enable_terrain = temp_enable_terrain;
  1726. X  }
  1727. X
  1728. X  fclose (fp);
  1729. X}
  1730. END_OF_FILE
  1731. if test 34283 -ne `wc -c <'init.c'`; then
  1732.     echo shar: \"'init.c'\" unpacked with wrong size!
  1733. fi
  1734. # end of 'init.c'
  1735. fi
  1736. echo shar: End of archive 5 \(of 7\).
  1737. cp /dev/null ark5isdone
  1738. MISSING=""
  1739. for I in 1 2 3 4 5 6 7 ; do
  1740.     if test ! -f ark${I}isdone ; then
  1741.     MISSING="${MISSING} ${I}"
  1742.     fi
  1743. done
  1744. if test "${MISSING}" = "" ; then
  1745.     echo You have unpacked all 7 archives.
  1746.     rm -f ark[1-9]isdone
  1747. else
  1748.     echo You still need to unpack the following archives:
  1749.     echo "        " ${MISSING}
  1750. fi
  1751. ##  End of shell archive.
  1752. exit 0
  1753.