home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / volume13 / ishido / part02 < prev    next >
Encoding:
Internet Message Format  |  1992-04-09  |  25.7 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: v13i071:  ishido - Unix/X11 solitare game, Part02/02
  5. Message-ID: <2644@master.CNA.TEK.COM>
  6. Date: 23 Mar 92 21:18:40 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 1034
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: jjs40@cd.amdahl.COM (John Sullivan)
  12. Posting-number: Volume 13, Issue 71
  13. Archive-name: ishido/Part02
  14. Environment: Unix, X11
  15.  
  16.  
  17. #! /bin/sh
  18. # This is a shell archive.  Remove anything before this line, then unpack
  19. # it by saving it into a file and typing "sh file".  To overwrite existing
  20. # files, type "sh file -c".  You can also feed this as standard input via
  21. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  22. # will see the following message at the end:
  23. #        "End of archive 2 (of 2)."
  24. # Contents:  ./ishido.c
  25. # Wrapped by jjs40@anubis on Fri Feb 21 16:26:44 1992
  26. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  27. if test -f './ishido.c' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'./ishido.c'\"
  29. else
  30. echo shar: Extracting \"'./ishido.c'\" \(23630 characters\)
  31. sed "s/^X//" >'./ishido.c' <<'END_OF_FILE'
  32. X/*
  33. X * ishido.c - Ancient stone matching game.  
  34. X * 
  35. X * Authors:  John Sullivan, Amdahl Corporation (jjs40@cd.amdahl.com)
  36. X *           Sean Cummins, Amdahl Corporation (spc10@cd.amdahl.com)
  37. X * 
  38. X * "No matter how great your achievements or how stunning your defeats, over a
  39. X * billion Chinese couldn't care less."
  40. X * 
  41. X */
  42. X
  43. X/****************************************************************************/
  44. X
  45. X#include <stdio.h>
  46. X#include <pwd.h>
  47. X#include "gl.h"
  48. X
  49. X/****************************************************************************/
  50. X
  51. X#include "bitmap/hwood.bm"
  52. X#include "bitmap/vwood.bm"
  53. X#include "bitmap/atom.bm"
  54. X#include "bitmap/dollar.bm"
  55. X#include "bitmap/hammer.bm"
  56. X#include "bitmap/maple.bm"
  57. X#include "bitmap/smile.bm"
  58. X#include "bitmap/star.bm"
  59. X
  60. X/****************************************************************************/
  61. X
  62. X#define TILE_WIDTH        50
  63. X#define TILE_HEIGHT        50
  64. X#define    BOARD_WIDTH        12
  65. X#define BOARD_HEIGHT        8
  66. X#define MARGIN_X        10
  67. X#define MARGIN_Y        10
  68. X
  69. X/****************************************************************************/
  70. X
  71. X#define BOARD_X        MARGIN_X
  72. X#define BOARD_Y        MARGIN_Y
  73. X#define BOARD_W        (TILE_WIDTH*BOARD_WIDTH)
  74. X#define BOARD_H        (TILE_HEIGHT*BOARD_HEIGHT)
  75. X#define TILE_X(x)    (BOARD_X+TILE_WIDTH*(x))
  76. X#define TILE_Y(y)    (BOARD_Y+TILE_HEIGHT*(y))
  77. X#define SCORE_X        MARGIN_X*2+BOARD_W
  78. X#define SCORE_Y        BOARD_Y
  79. X#define    SCORE_W        20*GL_FONT_WIDTH
  80. X#define SCREEN_W    MARGIN_X*3+BOARD_W+SCORE_W
  81. X#define SCREEN_H    MARGIN_Y*2+BOARD_H
  82. X#define QUITB_H        25
  83. X#define QUITB_W        SCORE_W
  84. X#define QUITB_X        SCORE_X
  85. X#define QUITB_Y        SCREEN_H-MARGIN_Y-QUITB_H-1
  86. X
  87. X#define RULEB_H        25
  88. X#define RULEB_W        SCORE_W
  89. X#define RULEB_X        SCORE_X
  90. X#define RULEB_Y        QUITB_Y-MARGIN_Y-GAMEB_H
  91. X
  92. X#define GAMEB_H        25
  93. X#define GAMEB_W        SCORE_W
  94. X#define GAMEB_X        SCORE_X
  95. X#define GAMEB_Y        RULEB_Y-MARGIN_Y-GAMEB_H
  96. X#define SCORE_H        GAMEB_Y-MARGIN_Y-SCORE_Y
  97. X
  98. X/****************************************************************************/
  99. X
  100. X#define IS_INTERIOR(x,y) ((x > 0) && (x < BOARD_WIDTH-1) && \
  101. X              (y > 0) && (y < BOARD_HEIGHT-1))
  102. X
  103. X/****************************************************************************/
  104. X
  105. X#define TILE_SHAPES        6
  106. X#define DECK_SIZE        TILE_SHAPES*TILE_SHAPES*2
  107. X
  108. X#define TILE_EMPTY         -1
  109. Xtypedef int     TILE;
  110. X
  111. X#define TILE_COLOR(x)     ((x)%TILE_SHAPES)
  112. X#define TILE_SHAPE(x)     ((x)/TILE_SHAPES)
  113. X
  114. X/****************************************************************************/
  115. X
  116. X#ifndef HIGH_SCORE_FILE
  117. X#define HIGH_SCORE_FILE        "ishido_scores"
  118. X#endif
  119. X
  120. X#define NUM_HIGH_SCORES     20
  121. X
  122. Xtypedef struct HIGH_SCORE_STRUCT {
  123. X    char            name[12];
  124. X    int             score;
  125. X    int             fourways;
  126. X    int             tiles;
  127. X}               HIGH_SCORE;
  128. X
  129. X/****************************************************************************/
  130. X
  131. Xextern void     quit_button();
  132. Xextern void     new_game_button();
  133. Xextern void     end_game_button();
  134. Xextern void     rule_button();
  135. X
  136. X/****************************************************************************/
  137. X
  138. X#define streq(a,b) (strcmp(a,b)==0)
  139. X
  140. X/****************************************************************************/
  141. X
  142. XGL_PIXEL        pix_bg;
  143. XGL_PIXEL        pix_border;
  144. XGL_PIXEL        pix_text;
  145. XGL_PIXEL        pix_wood_fg[2];
  146. XGL_PIXEL        pix_wood_bg[2];
  147. XGL_PIXEL        pix_tile_bg[TILE_SHAPES];
  148. XGL_PIXEL        pix_tile_fg;
  149. XGL_PIXEL    pix_highlight;
  150. X
  151. XGL_BITMAP       bitmap_wood[2];
  152. XGL_BITMAP       bitmap_tile[TILE_SHAPES];
  153. X
  154. XGB_BUTTON       button[3];
  155. X
  156. X/****************************************************************************/
  157. X
  158. XHIGH_SCORE      high_score[NUM_HIGH_SCORES];
  159. X
  160. Xint             game_over;
  161. Xint             rule_screen;
  162. X
  163. XTILE            board[BOARD_WIDTH][BOARD_HEIGHT];
  164. X
  165. Xint             num_deck_tiles;
  166. XTILE            deck[DECK_SIZE];
  167. X
  168. Xint             score;
  169. Xint             fourways;
  170. Xint        bonehead;
  171. Xint         silent;
  172. X
  173. Xint        num_possible;
  174. Xint        possible_x[BOARD_WIDTH*BOARD_HEIGHT];
  175. Xint        possible_y[BOARD_WIDTH*BOARD_HEIGHT];
  176. X
  177. X/****************************************************************************/
  178. X
  179. Xint
  180. Xint_rand(m)
  181. X    int             m;
  182. X{
  183. X    int             v;
  184. X
  185. X    v = (lrand48() % m);
  186. X    return (v);
  187. X};
  188. X
  189. X/****************************************************************************/
  190. X
  191. Xvoid
  192. Xseed_rand()
  193. X{
  194. X    srand48(time(NULL));
  195. X};
  196. X
  197. X/****************************************************************************/
  198. X
  199. Xchar           *
  200. Xget_user_name()
  201. X{
  202. X    int             uid;
  203. X    struct passwd  *passwd;
  204. X
  205. X    uid = geteuid();
  206. X    passwd = getpwuid(uid);
  207. X    return (passwd->pw_name);
  208. X};
  209. X
  210. X/****************************************************************************/
  211. X
  212. Xvoid
  213. Xdeck_init()
  214. X{
  215. X    int             i, j, n, c;
  216. X    TILE            tile;
  217. X
  218. X    num_deck_tiles = DECK_SIZE;
  219. X    for (i = 0; i < DECK_SIZE; i++) {
  220. X        deck[i] = i / 2;
  221. X    };
  222. X    for (i = 0; i < DECK_SIZE - 1; i++) {
  223. X        n = int_rand(DECK_SIZE - i - 1);
  224. X        tile = deck[i + n + 1];
  225. X        deck[i + n + 1] = deck[i];
  226. X        deck[i] = tile;
  227. X    };
  228. X    i = 0;
  229. X    c = 0;
  230. X    while (c < TILE_SHAPES) {
  231. X        n = 0;
  232. X        for (j = 0; j < c; j++) {
  233. X            if (TILE_COLOR(deck[i]) == TILE_COLOR(deck[j])) {
  234. X                n++;
  235. X            };
  236. X            if (TILE_SHAPE(deck[i]) == TILE_SHAPE(deck[j])) {
  237. X                n++;
  238. X            };
  239. X        };
  240. X        if (n == 0) {
  241. X            tile = deck[c];
  242. X            deck[c] = deck[i];
  243. X            deck[i] = tile;
  244. X            c++;
  245. X        };
  246. X        i++;
  247. X    };
  248. X};
  249. X
  250. X/****************************************************************************/
  251. X
  252. Xvoid
  253. Xdeck_print()
  254. X{
  255. X    int             i, c;
  256. X
  257. X    printf("num_deck_tiles = %d:\n", num_deck_tiles);
  258. X
  259. X    c = 0;
  260. X    for (i = 0; i < num_deck_tiles; i++) {
  261. X        printf("%4d ", deck[i]);
  262. X        c++;
  263. X        if (c == 14) {
  264. X            printf("\n");
  265. X            c = 0;
  266. X        };
  267. X    };
  268. X    printf("\n");
  269. X};
  270. X
  271. X/****************************************************************************/
  272. X
  273. XTILE
  274. Xdeck_take_tile()
  275. X{
  276. X    int             i;
  277. X    TILE            tile;
  278. X
  279. X    tile = deck[0];
  280. X
  281. X    for (i = 0; i < num_deck_tiles - 1; i++) {
  282. X        deck[i] = deck[i + 1];
  283. X    };
  284. X    num_deck_tiles = num_deck_tiles - 1;
  285. X    return (tile);
  286. X};
  287. X
  288. X/****************************************************************************/
  289. X
  290. Xvoid
  291. Xboard_init()
  292. X{
  293. X    int             i, j;
  294. X
  295. X    for (j = 0; j < BOARD_HEIGHT; j++) {
  296. X        for (i = 0; i < BOARD_WIDTH; i++) {
  297. X            board[i][j] = TILE_EMPTY;
  298. X        };
  299. X    };
  300. X    board[0][0] = deck_take_tile();
  301. X    board[0][7] = deck_take_tile();
  302. X    board[11][0] = deck_take_tile();
  303. X    board[11][7] = deck_take_tile();
  304. X    board[5][3] = deck_take_tile();
  305. X    board[6][4] = deck_take_tile();
  306. X};
  307. X
  308. X/****************************************************************************/
  309. X
  310. XTILE
  311. Xboard_get_tile(x, y)
  312. X    int             x, y;
  313. X{
  314. X    if ((x < 0) || (x >= BOARD_WIDTH)) {
  315. X        return (TILE_EMPTY);
  316. X    };
  317. X    if ((y < 0) || (y >= BOARD_HEIGHT)) {
  318. X        return (TILE_EMPTY);
  319. X    };
  320. X    return (board[x][y]);
  321. X};
  322. X
  323. X/****************************************************************************/
  324. X
  325. Xint
  326. Xboard_adjacent_tiles(tile, x, y, c, s)
  327. X    TILE            tile;
  328. X    int             x, y;
  329. X    int            *c;
  330. X    int            *s;
  331. X{
  332. X    int             i;
  333. X    int             num;
  334. X    TILE            adjtile[4];
  335. X
  336. X    adjtile[0] = board_get_tile(x - 1, y);
  337. X    adjtile[1] = board_get_tile(x + 1, y);
  338. X    adjtile[2] = board_get_tile(x, y - 1);
  339. X    adjtile[3] = board_get_tile(x, y + 1);
  340. X    num = 0;
  341. X    for (i = 0; i < 4; i++) {
  342. X        if (adjtile[i] != TILE_EMPTY) {
  343. X            c[num] = (TILE_COLOR(tile) == TILE_COLOR(adjtile[i]));
  344. X            s[num] = (TILE_SHAPE(tile) == TILE_SHAPE(adjtile[i]));
  345. X            num++;
  346. X        };
  347. X    };
  348. X    return (num);
  349. X};
  350. X
  351. X/****************************************************************************/
  352. X
  353. Xint
  354. Xboard_can_place_tile(x, y)
  355. X    int             x, y;
  356. X{
  357. X    int             num;
  358. X    TILE            tile;
  359. X    int             c[4], s[4];
  360. X
  361. X    if (board[x][y] != TILE_EMPTY) {
  362. X        return (0);
  363. X    };
  364. X    tile = deck[0];
  365. X    num = board_adjacent_tiles(tile, x, y, c, s);
  366. X    if (num == 1) {
  367. X        if (s[0] || c[0])
  368. X            return (num);
  369. X    };
  370. X    if (num == 2) {
  371. X        if (s[0] && c[1])
  372. X            return (num);
  373. X        if (s[1] && c[0])
  374. X            return (num);
  375. X    };
  376. X    if (num == 3) {
  377. X        if (s[0] && c[1] && c[2])
  378. X            return (num);
  379. X        if (s[1] && c[2] && c[0])
  380. X            return (num);
  381. X        if (s[2] && c[0] && c[1])
  382. X            return (num);
  383. X        if (c[0] && s[1] && s[2])
  384. X            return (num);
  385. X        if (c[1] && s[2] && s[0])
  386. X            return (num);
  387. X        if (c[2] && s[0] && s[1])
  388. X            return (num);
  389. X    };
  390. X    if (num == 4) {
  391. X        if (s[0] && s[1] && c[2] && c[3])
  392. X            return (num);
  393. X        if (s[0] && s[2] && c[1] && c[3])
  394. X            return (num);
  395. X        if (s[0] && s[3] && c[1] && c[2])
  396. X            return (num);
  397. X        if (s[1] && s[2] && c[0] && c[3])
  398. X            return (num);
  399. X        if (s[1] && s[3] && c[0] && c[2])
  400. X            return (num);
  401. X        if (s[2] && s[3] && c[0] && c[1])
  402. X            return (num);
  403. X    };
  404. X    return (0);
  405. X};
  406. X
  407. X/****************************************************************************/
  408. X
  409. Xvoid board_update_possible_moves()
  410. X{
  411. X    int i,j;
  412. X    int c;
  413. X    
  414. X    num_possible = 0;
  415. X    if (num_deck_tiles == 0) {
  416. X        return;
  417. X    };
  418. X    for (j = 0; j < BOARD_HEIGHT; j++) {
  419. X            for (i = 0; i < BOARD_WIDTH; i++) {
  420. X            if (board_can_place_tile(i,j)) {
  421. X                possible_x[num_possible] = i;
  422. X                possible_y[num_possible] = j;
  423. X                num_possible++;
  424. X            };
  425. X        };
  426. X    };
  427. X};
  428. X
  429. X/****************************************************************************/
  430. X
  431. Xint             four_way_bonus[] = {
  432. X    25, 50, 100, 200, 400, 600, 800, 1000, 5000, 10000, 25000, 50000
  433. X};
  434. X
  435. X/****************************************************************************/
  436. X
  437. Xint
  438. Xboard_place_tile(x, y)
  439. X    int             x, y;
  440. X{
  441. X    int             num;
  442. X
  443. X    if (num_deck_tiles == 0) {
  444. X        return (0);
  445. X    };
  446. X    num = board_can_place_tile(x, y);
  447. X    if (num == 0) {
  448. X        return (0);
  449. X    };
  450. X    board[x][y] = deck_take_tile();
  451. X    if (IS_INTERIOR(x, y)) {
  452. X        if (num == 1)
  453. X            score = score + 1;
  454. X        if (num == 2)
  455. X            score = score + 2;
  456. X        if (num == 3)
  457. X            score = score + 4;
  458. X        if (num == 4) {
  459. X            score = score + 8;
  460. X            if (fourways < 12) {
  461. X                score = score + four_way_bonus[fourways];
  462. X            } else {
  463. X                score = score + four_way_bonus[11];
  464. X            };
  465. X            fourways++;
  466. X        };
  467. X    };
  468. X    return (1);
  469. X};
  470. X
  471. X/****************************************************************************/
  472. X
  473. Xvoid
  474. Xhigh_score_load()
  475. X{
  476. X    FILE           *f;
  477. X    int             i;
  478. X
  479. X    f = fopen(HIGH_SCORE_FILE, "r");
  480. X    if (f != NULL) {
  481. X        fread(high_score, sizeof(HIGH_SCORE), NUM_HIGH_SCORES, f);
  482. X    } else {
  483. X        for (i = 0; i < NUM_HIGH_SCORES; i++) {
  484. X            strcpy(high_score[i].name, "nobody");
  485. X            high_score[i].score = 0;
  486. X            high_score[i].fourways = 0;
  487. X            high_score[i].tiles = 66;
  488. X        };
  489. X    };
  490. X    fclose(f);
  491. X};
  492. X
  493. X/****************************************************************************/
  494. X
  495. Xvoid
  496. Xhigh_score_save()
  497. X{
  498. X    FILE           *f;
  499. X
  500. X    f = fopen(HIGH_SCORE_FILE, "w");
  501. X    if (f != NULL) {
  502. X        fwrite(high_score, sizeof(HIGH_SCORE), NUM_HIGH_SCORES, f);
  503. X    };
  504. X    fclose(f);
  505. X};
  506. X
  507. X/****************************************************************************/
  508. X
  509. Xvoid
  510. Xhigh_score_add(name, sc, fw, ti)
  511. X    char           *name;
  512. X    int             sc;
  513. X    int             fw;
  514. X    int             ti;
  515. X{
  516. X    int             i;
  517. X    int             pos;
  518. X
  519. X    high_score_load();
  520. X    pos = NUM_HIGH_SCORES;
  521. X    for (i = NUM_HIGH_SCORES - 1; i >= 0; i--) {
  522. X        if (sc >= high_score[i].score) {
  523. X            pos = i;
  524. X        };
  525. X    };
  526. X    if (pos < NUM_HIGH_SCORES) {
  527. X        for (i = NUM_HIGH_SCORES - 1; i > pos; i--) {
  528. X            strcpy(high_score[i].name, high_score[i - 1].name);
  529. X            high_score[i].score = high_score[i - 1].score;
  530. X            high_score[i].fourways = high_score[i - 1].fourways;
  531. X            high_score[i].tiles = high_score[i - 1].tiles;
  532. X        };
  533. X        strcpy(high_score[pos].name, name);
  534. X        high_score[pos].score = sc;
  535. X        high_score[pos].fourways = fw;
  536. X        high_score[pos].tiles = ti;
  537. X        high_score_save();
  538. X    };
  539. X};
  540. X
  541. X/****************************************************************************/
  542. X
  543. Xvoid
  544. Xinit_game_play()
  545. X{
  546. X    strcpy(button[0].label, "End Game");
  547. X    button[0].event_fn = end_game_button;
  548. X
  549. X    game_over = 0;
  550. X    rule_screen = 0;
  551. X
  552. X    seed_rand();
  553. X    deck_init();
  554. X    board_init();
  555. X    board_update_possible_moves();
  556. X
  557. X    score = 0;
  558. X    fourways = 0;
  559. X};
  560. X
  561. X/****************************************************************************/
  562. X
  563. Xvoid
  564. Xinit_game_over()
  565. X{
  566. X    strcpy(button[0].label, "New Game");
  567. X    button[0].event_fn = new_game_button;
  568. X
  569. X    high_score_load();
  570. X
  571. X    game_over = 1;
  572. X    rule_screen = 0;
  573. X};
  574. X
  575. X/****************************************************************************/
  576. X
  577. Xvoid
  578. Xinit_game_end()
  579. X{
  580. X    char           *name;
  581. X
  582. X    if (num_deck_tiles == 0)
  583. X        score = score + 1000;
  584. X    if (num_deck_tiles == 1)
  585. X        score = score + 500;
  586. X    if (num_deck_tiles == 2)
  587. X        score = score + 100;
  588. X    name = get_user_name();
  589. X    high_score_add(name, score, fourways, num_deck_tiles);
  590. X};
  591. X
  592. X/****************************************************************************/
  593. X
  594. Xvoid
  595. Xinit_game(argc, argv)
  596. X   int argc;
  597. X   char **argv;
  598. X{
  599. X    int i;
  600. X    int help;
  601. X
  602. X    pix_bg = gl_alloc_color("black");
  603. X    pix_border = gl_alloc_color("red");
  604. X    pix_text = gl_alloc_color("white");
  605. X    pix_wood_fg[0] = gl_alloc_color("tan4");
  606. X    pix_wood_fg[1] = gl_alloc_color("tan3");
  607. X    pix_wood_bg[0] = gl_alloc_color("sienna4");
  608. X    pix_wood_bg[1] = gl_alloc_color("sienna3");
  609. X    pix_tile_fg = gl_alloc_color("black");
  610. X    pix_tile_bg[0] = gl_alloc_color("red");
  611. X    pix_tile_bg[1] = gl_alloc_color("green");
  612. X    pix_tile_bg[2] = gl_alloc_color("skyblue1");
  613. X    pix_tile_bg[3] = gl_alloc_color("yellow");
  614. X    pix_tile_bg[4] = gl_alloc_color("mediumpurple1");
  615. X    pix_tile_bg[5] = gl_alloc_color("pink");
  616. X    pix_highlight = gl_alloc_color("magenta");
  617. X
  618. X    bitmap_wood[0] = gl_load_bitmap(hwood_bits, hwood_width, hwood_height);
  619. X    bitmap_wood[1] = gl_load_bitmap(vwood_bits, vwood_width, vwood_height);
  620. X
  621. X    bitmap_tile[0] = gl_load_bitmap(atom_bits, atom_width, atom_height);
  622. X    bitmap_tile[1] = gl_load_bitmap(dollar_bits, dollar_width, dollar_height);
  623. X    bitmap_tile[2] = gl_load_bitmap(hammer_bits, hammer_width, hammer_height);
  624. X    bitmap_tile[3] = gl_load_bitmap(maple_bits, maple_width, maple_height);
  625. X    bitmap_tile[4] = gl_load_bitmap(smile_bits, smile_width, smile_height);
  626. X    bitmap_tile[5] = gl_load_bitmap(star_bits, star_width, star_height);
  627. X
  628. X    button[0].x = GAMEB_X;
  629. X    button[0].y = GAMEB_Y;
  630. X    button[0].w = GAMEB_W;
  631. X    button[0].h = GAMEB_H;
  632. X    button[0].border = pix_border;
  633. X    button[0].background = pix_bg;
  634. X    button[0].text = pix_text;
  635. X
  636. X    button[1].x = RULEB_X;
  637. X    button[1].y = RULEB_Y;
  638. X    button[1].w = RULEB_W;
  639. X    button[1].h = RULEB_H;
  640. X    button[1].border = pix_border;
  641. X    button[1].background = pix_bg;
  642. X    button[1].text = pix_text;
  643. X    strcpy(button[1].label, "Rules");
  644. X    button[1].event_fn = rule_button;
  645. X
  646. X    button[2].x = QUITB_X;
  647. X    button[2].y = QUITB_Y;
  648. X    button[2].w = QUITB_W;
  649. X    button[2].h = QUITB_H;
  650. X    button[2].border = pix_border;
  651. X    button[2].background = pix_bg;
  652. X    button[2].text = pix_text;
  653. X    strcpy(button[2].label, "Quit");
  654. X    button[2].event_fn = quit_button;
  655. X
  656. X    num_possible = 0;
  657. X
  658. X    bonehead = 0;
  659. X    silent = 0;
  660. X    help = 0;
  661. X
  662. X    for (i = 1; i < argc; i++) {
  663. X        if (streq(argv[i],"-bonehead")) {
  664. X            bonehead = 1;
  665. X        } else if (streq(argv[i],"-silent")) {
  666. X            silent = 1;
  667. X        } else if (streq(argv[i],"-h")) {
  668. X            help = 1;
  669. X        } else {
  670. X            help = 1;
  671. X        };
  672. X    };
  673. X
  674. X    if (help) {
  675. X        printf("usage: ishido [-bonehead] [-silent]\n");
  676. X        printf("       -bonehead       Shows possible moves.\n");
  677. X        printf("       -silent         Turns off bell.\n");
  678. X        printf("       -h              This message.\n");
  679. X        gl_exit();
  680. X    };
  681. X
  682. X    init_game_play();
  683. X    init_game_over();
  684. X};
  685. X
  686. X/****************************************************************************/
  687. X
  688. Xvoid
  689. Xdraw_tile(x, y, tile)
  690. X    int             x, y;
  691. X    TILE            tile;
  692. X{
  693. X
  694. X    gl_set_fg(pix_tile_fg);
  695. X    gl_set_bg(pix_tile_bg[TILE_COLOR(tile)]);
  696. X    gl_draw_bitmap(bitmap_tile[TILE_SHAPE(tile)], x, y,
  697. X               TILE_WIDTH, TILE_HEIGHT);
  698. X};
  699. X
  700. X/****************************************************************************/
  701. X
  702. Xvoid
  703. Xdraw_board_tile(x, y)
  704. X    int             x, y;
  705. X{
  706. X    TILE            tile;
  707. X
  708. X    tile = board[x][y];
  709. X    if (tile == TILE_EMPTY) {
  710. X        gl_set_fg_bg(pix_wood_fg[IS_INTERIOR(x, y)],
  711. X                 pix_wood_bg[IS_INTERIOR(x, y)]);
  712. X        gl_draw_bitmap(bitmap_wood[(x + y) % 2],
  713. X                   TILE_X(x), TILE_Y(y),
  714. X                   TILE_WIDTH, TILE_HEIGHT);
  715. X    } else {
  716. X        draw_tile(TILE_X(x), TILE_Y(y), tile);
  717. X    };
  718. X};
  719. X
  720. X/****************************************************************************/
  721. X
  722. Xvoid
  723. Xdraw_board_highlight_tile(x, y)
  724. X    int             x, y;
  725. X{
  726. X    gl_set_fg_bg(pix_highlight,
  727. X             pix_wood_bg[IS_INTERIOR(x, y)]);
  728. X    gl_draw_bitmap(bitmap_wood[(x + y) % 2],
  729. X                   TILE_X(x), TILE_Y(y),
  730. X                   TILE_WIDTH, TILE_HEIGHT);
  731. X};
  732. X
  733. X/****************************************************************************/
  734. X
  735. Xvoid draw_board_show_possible_moves()
  736. X{
  737. X    int i;
  738. X
  739. X        for (i = 0; i < num_possible; i++) {
  740. X        draw_board_highlight_tile(possible_x[i],possible_y[i]);
  741. X    };
  742. X};
  743. X
  744. X
  745. X/****************************************************************************/
  746. X
  747. Xvoid
  748. Xdraw_board_hide_possible_moves()
  749. X{
  750. X    int i;
  751. X    
  752. X    for (i = 0; i < num_possible; i++) {
  753. X        draw_board_tile(possible_x[i], possible_y[i]);
  754. X    };
  755. X};
  756. X
  757. X/****************************************************************************/
  758. X
  759. Xvoid
  760. Xdraw_board()
  761. X{
  762. X    int             i, j;
  763. X
  764. X    for (j = 0; j < BOARD_HEIGHT; j++) {
  765. X        for (i = 0; i < BOARD_WIDTH; i++) {
  766. X            draw_board_tile(i, j);
  767. X        };
  768. X    };
  769. X    if (bonehead) {
  770. X        draw_board_show_possible_moves();
  771. X    };
  772. X};
  773. X
  774. X/****************************************************************************/
  775. X
  776. Xvoid
  777. Xdraw_score()
  778. X{
  779. X    char            buf[128];
  780. X
  781. X    gl_set_fg_bg(pix_text, pix_bg);
  782. X    gu_draw_centered_text(SCORE_X + SCORE_W / 2,
  783. X                  SCORE_Y + GL_FONT_HEIGHT * 1, "Ishido v1.0");
  784. X    gu_draw_centered_text(SCORE_X + SCORE_W / 2,
  785. X                  SCORE_Y + GL_FONT_HEIGHT * 3, "Score");
  786. X    sprintf(buf, "%06d", score);
  787. X    gu_draw_centered_text(SCORE_X + SCORE_W / 2,
  788. X                  SCORE_Y + GL_FONT_HEIGHT * 4, buf);
  789. X    gu_draw_centered_text(SCORE_X + SCORE_W / 2,
  790. X                  SCORE_Y + GL_FONT_HEIGHT * 5, "4-Way Matches");
  791. X    sprintf(buf, "%d", fourways);
  792. X    gu_draw_centered_text(SCORE_X + SCORE_W / 2,
  793. X                  SCORE_Y + GL_FONT_HEIGHT * 6, buf);
  794. X    gu_draw_centered_text(SCORE_X + SCORE_W / 2,
  795. X              SCORE_Y + GL_FONT_HEIGHT * 7, "Tiles Remaining");
  796. X    sprintf(buf, "%02d", num_deck_tiles);
  797. X    gu_draw_centered_text(SCORE_X + SCORE_W / 2,
  798. X                  SCORE_Y + GL_FONT_HEIGHT * 8, buf);
  799. X    if ((game_over) || (num_deck_tiles == 0)) {
  800. X        gu_draw_centered_text(SCORE_X + SCORE_W / 2,
  801. X            SCORE_Y + GL_FONT_HEIGHT * 10, "              ");
  802. X        gu_draw_centered_text(SCORE_X + SCORE_W / 2,
  803. X                SCORE_Y + GL_FONT_HEIGHT * 11, "    ");
  804. X        gu_draw_centered_text(SCORE_X + SCORE_W / 2,
  805. X                SCORE_Y + GL_FONT_HEIGHT * 12, "         ");
  806. X        gl_set_fg_bg(pix_bg, pix_bg);
  807. X        gl_fill_rect(SCORE_X + SCORE_W / 2 - TILE_WIDTH / 2,
  808. X            SCORE_Y + GL_FONT_HEIGHT * 13, TILE_WIDTH, TILE_HEIGHT);
  809. X    } else {
  810. X        gu_draw_centered_text(SCORE_X + SCORE_W / 2,
  811. X            SCORE_Y + GL_FONT_HEIGHT * 10, "Possible Moves");
  812. X        if (bonehead) {
  813. X            sprintf(buf, "%02d", num_possible);
  814. X        } else {
  815. X            if (num_possible > 0) {
  816. X                sprintf(buf,"Yes");
  817. X            } else {
  818. X                sprintf(buf,"None ");
  819. X            };
  820. X        };
  821. X        gu_draw_centered_text(SCORE_X + SCORE_W / 2,
  822. X                SCORE_Y + GL_FONT_HEIGHT * 11, buf);
  823. X        gu_draw_centered_text(SCORE_X + SCORE_W / 2,
  824. X                SCORE_Y + GL_FONT_HEIGHT * 12, "Next Tile");
  825. X        draw_tile(SCORE_X + SCORE_W / 2 - TILE_WIDTH / 2,
  826. X              SCORE_Y + GL_FONT_HEIGHT * 13, deck[0]);
  827. X    };
  828. X};
  829. X
  830. X/****************************************************************************/
  831. X
  832. Xint             rule_lines = 21;
  833. Xchar           *rule_text[] = {
  834. X    "There are 72 tiles, two of each combination of six colors and six shapes.",
  835. X    "At the start of the game, there are six tiles on the board representing",
  836. X    "each shape and color.  To place an additional tile on the board, you",
  837. X    "must match at least one adjacent tile according to the following rules:",
  838. X    "   - To match a single tile, you must match either the color or shape.",
  839. X    "   - To match two tiles, you must match one shape and one color.",
  840. X    "   - To match three tiles, you must match two colors and one shape OR two",
  841. X    "     shapes and one color.",
  842. X    "   - To match four tiles, you must match two colors and two shapes.",
  843. X    "",
  844. X    "Tiles placed on the interior (lighter) squares score points when placed,",
  845. X    "according to the number of adjacent tiles that they match.",
  846. X    "   - Matching one tile:    1 point.    - Matching three tiles:  4 points.",
  847. X    "   - Matching two tiles:   2 points.   - Matching four tiles:   8 points.",
  848. X    "",
  849. X    "In addition to the regular score there is an increasing bonus for each",
  850. X    "four-way match starting with 25 points for the first and continuing with",
  851. X    "50, 100, 200, 400, 600, 800, 1000, 5000, 10000, and 50000 points.",
  852. X    "",
  853. X    "A bonus of 1000 points is awarded at the end of the game placing for all",
  854. X    "72 tiles.  500 and 100 points are awarded for one and two tiles remaining."
  855. X};
  856. X
  857. X/****************************************************************************/
  858. X
  859. Xvoid
  860. Xdraw_rule_screen()
  861. X{
  862. X    int             i;
  863. X
  864. X    gl_set_fg(pix_bg);
  865. X    gl_fill_rect(BOARD_X, BOARD_Y, BOARD_W, BOARD_H);
  866. X    gl_set_fg_bg(pix_text, pix_bg);
  867. X    gu_draw_centered_text(BOARD_X + BOARD_W / 2, BOARD_Y + GL_FONT_HEIGHT,
  868. X                  "Rules");
  869. X    for (i = 0; i < rule_lines; i++) {
  870. X        gl_draw_text(BOARD_X + GL_FONT_WIDTH,
  871. X                 BOARD_Y + GL_FONT_HEIGHT * (i + 2),
  872. X                 rule_text[i]);
  873. X    };
  874. X};
  875. X
  876. X/****************************************************************************/
  877. X
  878. Xvoid
  879. Xdraw_high_scores()
  880. X{
  881. X    int             i;
  882. X    char            buf[200];
  883. X
  884. X    gl_set_fg(pix_bg);
  885. X    gl_fill_rect(BOARD_X, BOARD_Y, BOARD_W, BOARD_H);
  886. X    gl_set_fg_bg(pix_text, pix_bg);
  887. X    gu_draw_centered_text(BOARD_X + BOARD_W / 2, BOARD_Y + GL_FONT_HEIGHT * 1,
  888. X                  "-- Game Over --");
  889. X    gu_draw_centered_text(BOARD_X + BOARD_W / 2, BOARD_Y + GL_FONT_HEIGHT * 2,
  890. X                  "##  Name          Score  4-Ways  Tiles");
  891. X    gu_draw_centered_text(BOARD_X + BOARD_W / 2, BOARD_Y + GL_FONT_HEIGHT * 3,
  892. X                  "--------------------------------------");
  893. X    for (i = 0; i < NUM_HIGH_SCORES; i++) {
  894. X        sprintf(buf, "%2d  %-12s  %5d    %2d      %2d ", i + 1,
  895. X            high_score[i].name, high_score[i].score,
  896. X            high_score[i].fourways, high_score[i].tiles);
  897. X        gu_draw_centered_text(BOARD_X + BOARD_W / 2,
  898. X                   BOARD_Y + GL_FONT_HEIGHT * (i + 4), buf);
  899. X    };
  900. X};
  901. X
  902. X/****************************************************************************/
  903. X
  904. Xvoid
  905. Xredraw()
  906. X{
  907. X    gl_set_fg_bg(pix_border, pix_bg);
  908. X    gu_draw_border(BOARD_X, BOARD_Y, BOARD_W, BOARD_H, 2);
  909. X    gu_draw_border(SCORE_X, SCORE_Y, SCORE_W, SCORE_H, 2);
  910. X
  911. X    gl_set_fg(pix_bg);
  912. X    gl_fill_rect(SCORE_X, SCORE_Y, SCORE_W, SCORE_H);
  913. X    draw_score();
  914. X
  915. X    gb_draw_buttons(3, button);
  916. X
  917. X    if (rule_screen) {
  918. X        draw_rule_screen();
  919. X    } else if (game_over) {
  920. X        draw_high_scores();
  921. X    } else {
  922. X        draw_board();
  923. X    };
  924. X};
  925. X
  926. X/****************************************************************************/
  927. X
  928. Xvoid
  929. Xquit_button()
  930. X{
  931. X    if (!game_over) {
  932. X        init_game_end();
  933. X    };
  934. X    gl_exit_main();
  935. X};
  936. X
  937. X/****************************************************************************/
  938. X
  939. Xvoid
  940. Xnew_game_button()
  941. X{
  942. X    init_game_play();
  943. X    redraw();
  944. X};
  945. X
  946. X/****************************************************************************/
  947. X
  948. Xvoid
  949. Xend_game_button()
  950. X{
  951. X    init_game_end();
  952. X    init_game_over();
  953. X    redraw();
  954. X};
  955. X
  956. X/****************************************************************************/
  957. X
  958. Xvoid
  959. Xrule_button()
  960. X{
  961. X    rule_screen = 1 - rule_screen;
  962. X    redraw();
  963. X};
  964. X
  965. X/****************************************************************************/
  966. X
  967. Xvoid
  968. Xboard_button(event)
  969. X    GL_EVENT       *event;
  970. X{
  971. X    int             x, y;
  972. X
  973. X    x = (event->x - BOARD_X) / TILE_WIDTH;
  974. X    y = (event->y - BOARD_Y) / TILE_WIDTH;
  975. X    if (board_place_tile(x, y)) {
  976. X        if (bonehead) {
  977. X                draw_board_hide_possible_moves();
  978. X        };
  979. X        board_update_possible_moves();
  980. X        draw_board_tile(x, y);
  981. X        if (bonehead) {
  982. X            draw_board_show_possible_moves();
  983. X        };
  984. X        draw_score();
  985. X    } else if (silent == 0) {
  986. X        gl_ring_bell();
  987. X    };
  988. X};
  989. X
  990. X/****************************************************************************/
  991. X
  992. Xvoid
  993. Xevent(event)
  994. X    GL_EVENT       *event;
  995. X{
  996. X    if ((gb_button_event(event, 3, button) == GL_FALSE) && (!game_over)) {
  997. X        if (gu_event_in_rect(event, BOARD_X, BOARD_Y, BOARD_W, BOARD_H)) {
  998. X            board_button(event);
  999. X        }
  1000. X    };
  1001. X};
  1002. X
  1003. X/****************************************************************************/
  1004. X
  1005. Xmain(argc, argv)
  1006. X    int             argc;
  1007. X    char           **argv;
  1008. X{
  1009. X
  1010. X
  1011. X    gl_init(argc, argv, SCREEN_W, SCREEN_H);
  1012. X
  1013. X    gl_redraw_func(redraw);
  1014. X    gl_event_func(event);
  1015. X
  1016. X    init_game(argc, argv);
  1017. X
  1018. X    gl_start();
  1019. X    gl_main_loop();
  1020. X    gl_exit();
  1021. X};
  1022. END_OF_FILE
  1023. if test 23630 -ne `wc -c <'./ishido.c'`; then
  1024.     echo shar: \"'./ishido.c'\" unpacked with wrong size!
  1025. fi
  1026. # end of './ishido.c'
  1027. fi
  1028. echo shar: End of archive 2 \(of 2\).
  1029. cp /dev/null ark2isdone
  1030. MISSING=""
  1031. for I in 1 2 ; do
  1032.     if test ! -f ark${I}isdone ; then
  1033.     MISSING="${MISSING} ${I}"
  1034.     fi
  1035. done
  1036. if test "${MISSING}" = "" ; then
  1037.     echo You have unpacked both archives.
  1038.     rm -f ark[1-9]isdone
  1039. else
  1040.     echo You still need to unpack the following archives:
  1041.     echo "        " ${MISSING}
  1042. fi
  1043. ##  End of shell archive.
  1044. exit 0
  1045.