home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-386-Vol-2of3.iso / b / boodfly.zip / BOODLES.CPP < prev    next >
C/C++ Source or Header  |  1992-10-27  |  9KB  |  341 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <alloc.h>
  4. #include "boodles.h"
  5. #include "xlib.h"
  6. #include "xtext.h"
  7.  
  8. int score = 0;
  9. int turns = 0;
  10. int numboodles, numgrumjugs;
  11. boodlepiece ** boodles;
  12. boodlepiece ** grumjugs;
  13.  
  14.  
  15. icon logo;
  16.  
  17. void load_boodle_icons(void)
  18. {
  19.   logo.load("boodlog.drw");
  20.  
  21.   factor::load_factor(BOODLE, "", "", "", "", "", "boodle", "", "", "", "");
  22.   factor::load_factor(BOODLEWIZ, "","","","","", "boodwiz", "","","","");
  23.   factor::load_factor(BOODLINO, "","","","","","boodlino", "", "", "", "");
  24.   factor::load_factor(BOODLETTAH, "","","","","","boodlett", "","","","");
  25.   factor::load_factor(UNSETBOODLEBLASTER, "","","","","","ubblast", "","","","");
  26.   factor::load_factor(GRUMKING, "","","","","","grumking", "","","","");
  27.   factor::load_factor(GRUMBUGGY, "","","","","lgrumbug","grumbugg", "grumbugg","","","");
  28.   factor::load_factor(UNSETGRUMBOMB, "","","","","","grumbom4", "", "", "", "");
  29.   factor::load_factor(GRUMJUG, "", "", "sgrumjug", "", "lgrumjug", "cgrumjug", "grumjug",
  30.                    "", "ngrumjug", "");
  31.   factor::load_factor(DEAD, "", "", "", "", "", "grave", "", "", "", "");
  32.   factor::load_factor(BOODLEBLASTER, "", "", "", "", "", "bblast", "", "","","");
  33.   factor::load_factor(GRUMBOMB, "","","","","","grumbomb","","","","");
  34.   factor::load_factor(CURSOR, "","","","","","cursor","","","","");
  35.   factor::load_factor(BROKEBUGGY, "","","","","","brokebug", "","","","");
  36.   factor::load_factor(SAFEBOODLE, "","","","","","house","","","","");
  37.   fevent::load_fevent(3, "","","","","","grumbomb","","","","");
  38.   event::load_event(1, "spell");
  39.   fevent::load_fevent(0, "","","","","","boodbop", "","","","");
  40.   fevent::load_fevent(1, "","","sgrumjug", "","lgrumbop","cgrumjug","rgrumbop","","ngrumjug","");
  41.   fevent::load_fevent(2, "","","","","","bblast","","","","");
  42.   FILE *f;
  43.   char far * newfnt = (char far *) farmalloc(256*16+4);
  44.   f=fopen("6x8b.fnt","rb");
  45.   fread(newfnt,1,256*8+4,f);
  46.   fclose(f);
  47.   x_register_userfont(newfnt);
  48.   x_set_font(2);
  49. }
  50.  
  51. void getdeltas(byte direction, int &deltax, int &deltay)
  52. {
  53.   deltax = deltay = 0;
  54.   switch(direction)
  55.   {
  56.     case NORTH     : --deltay; break;
  57.     case SOUTH     : ++deltay; break;
  58.     case WEST      : --deltax; break;
  59.     case CENTER    : break;
  60.     case EAST      : ++deltax; break;
  61.     case NORTHWEST : --deltay; --deltax; break;
  62.     case NORTHEAST : --deltay; ++deltax; break;
  63.     case SOUTHWEST : ++deltay; --deltax; break;
  64.     case SOUTHEAST : ++deltay; ++deltax; break;
  65.   }
  66. }
  67.  
  68. void boodlepiece::grumwomp(animactor * thebomb)
  69. {
  70.   if (my_identity != DEAD)  //no need to womp dead critters...
  71.   {
  72.     thebomb->spawn((animactor *) new bombeat);
  73.     die();
  74.   }
  75. }
  76.  
  77.  
  78. void boodlepiece::advance(void)
  79. {
  80.   factor::advance();
  81.   animactor * thebomb;
  82.   if ((thebomb = (animactor *)isinsquare(GRUMBOMB)) && (my_identity != DEAD))
  83.     grumwomp(thebomb); //we're sending grumwomp the address of the bomb,
  84.                //not the womped target.
  85. }
  86.  
  87. void boodlepiece::attack(boodlepiece * target)
  88. {
  89. }
  90.  
  91.  
  92. void boodlepiece::drop(void)
  93. {
  94.   if (cargo != NULL)
  95.   {
  96.     cargo->put(mapx, mapy);
  97.     cargo = NULL;
  98.   }
  99. }
  100.  
  101. void boodlepiece::move(byte direction)
  102. {
  103.   int deltax, deltay;
  104.   getdeltas(direction, deltax, deltay);
  105.   if (movesleft > 0)
  106.   if (((((mymap->mapdata[mapx + deltax][mapy + deltay].my_terrain_type & 239) == GRASS) ||
  107.      (mymap->mapdata[mapx + deltax][mapy + deltay].my_terrain_type & 239) == VALLEY))
  108.      && (((my_identity == GRUMJUG) || (my_identity == GRUMBUGGY) || (my_identity == BROKEBUGGY))
  109.        ||((my_identity != GRUMJUG)
  110.      &&(my_identity != GRUMBUGGY)
  111.      &&(my_identity != BROKEBUGGY)
  112.      &&(!(mymap->isinsquare(mapx+deltax, mapy+deltay, GRUMJUG))))))
  113.     switch (direction)
  114.     {
  115.       case NORTH     : addcommand(FINESLIDE, 4, 0,0, -24); --movesleft; break;
  116.       case SOUTH     : addcommand(FINESLIDE, 4, 0,0, 24); --movesleft; break;
  117.       case WEST      : addcommand(FINESLIDE, 4, 0, -24, 0); --movesleft; break;
  118.       case CENTER    : addcommand(DO_NOTHING, 0,0,0,0); --movesleft; break;
  119.       case EAST      : addcommand(FINESLIDE, 4, 0, 24,0); --movesleft; break;
  120.       case NORTHWEST : addcommand(FINESLIDE, 4, 0,-24, -24); --movesleft; break;
  121.       case NORTHEAST : addcommand(FINESLIDE, 4, 0,24, -24); --movesleft; break;
  122.       case SOUTHWEST : addcommand(FINESLIDE, 4, 0,-24, 24); --movesleft; break;
  123.       case SOUTHEAST : addcommand(FINESLIDE, 4, 0,24, 24); --movesleft; break;
  124.     }
  125.   if (((mymap->mapdata[mapx + deltax][mapy + deltay].my_terrain_type & 239) == VALLEY)
  126.       && (my_identity != GRUMJUG)
  127.       && (my_identity != GRUMBUGGY))
  128.   {
  129.     movesleft = 0;
  130.     ++score;
  131.     if (my_identity == BOODLETTAH)
  132.       score += 3;
  133.     assign_icon(SAFEBOODLE, ONEFACE);
  134.   }
  135. }
  136.  
  137. void boodlepiece::setmovement(void)
  138. {};
  139.  
  140. void boodlepiece::die(void)
  141. {
  142.   assign_icon(DEAD, ONEFACE, DEAD);
  143.   if (cargo != NULL)
  144.     cargo->put(mapx, mapy);
  145.   movesleft = 0;
  146. };
  147.  
  148.  
  149. void boodle::setmovement(void)
  150. {
  151.   movesleft = random(6) + 1;
  152.   if ((my_identity == DEAD) || (my_identity == SAFEBOODLE))
  153.     movesleft = 0;
  154. };
  155.  
  156. void boodle::pick_up(void)
  157. {
  158.   boodlepiece * target;
  159.   if (((target = (boodlepiece *)isinsquare(UNSETBOODLEBLASTER)) != NULL) && (cargo == NULL))
  160.   {
  161.     target->remove();
  162.     cargo = target;
  163.   }
  164. }
  165.  
  166. void boodlino::move(byte direction)
  167. {
  168.   int deltax = 0, deltay = 0;
  169.   boodlepiece * target;
  170.   getdeltas(direction, deltax, deltay);
  171.   if (target = (boodlepiece *)mymap->isinsquare(mapx + deltax, mapy + deltay, GRUMJUG))
  172.     {
  173.     attack(target);
  174.     return;
  175.     }
  176.   if ((my_identity != DEAD) && (movesleft > 0))
  177.     boodlepiece::move(direction);
  178. }
  179.  
  180. void boodlino::attack(boodlepiece * target)
  181. {
  182.   if (random(6) + 1 < 4)
  183.     {
  184.     spawn(new boodbop);
  185.     target->die();
  186.     }
  187.   else
  188.     target->attack(this);
  189. }
  190.  
  191. void boodleblaster::setmovement(void) {movesleft = 0;};
  192.  
  193. void grumjug::setmovement(void) {movesleft = 1;if (my_identity == DEAD) movesleft = 0;};
  194.  
  195. void grumjug::pick_up(void)
  196. {
  197.   boodlepiece * target;
  198.   if (((target = (boodlepiece *)isinsquare(UNSETGRUMBOMB)) != NULL) && (cargo == NULL))
  199.   {
  200.     target->remove();
  201.     cargo = target;
  202.   }
  203. }
  204.  
  205. void grumjug::move(byte direction)
  206. {
  207.   int deltax, deltay;
  208.   boodlepiece * target;
  209.   getdeltas(direction, deltax, deltay);
  210.   if (deltax < 0) turn(WEST);
  211.   if (deltax > 0) turn(EAST);
  212.   if (target = (boodlepiece *)mymap->isinsquare(mapx + deltax, mapy + deltay, BOODLINO))
  213.   {
  214.     attack(target);
  215.     return;
  216.   }
  217.   else if (target = (boodlepiece *)mymap->isinsquare(mapx + deltax, mapy + deltay, BOODLETTAH))
  218.   {
  219.     attack(target);
  220.     return;
  221.   }
  222.   else if (target = (boodlepiece *)mymap->isinsquare(mapx + deltax, mapy + deltay, BOODLEWIZ))
  223.   {
  224.     attack(target);
  225.     return;
  226.   }
  227.   else if (target = (boodlepiece *)mymap->isinsquare(mapx + deltax, mapy + deltay, BOODLE))
  228.   {
  229.     attack(target);
  230.     return;
  231.   }
  232.   if ((my_identity != DEAD) && (mymap->mapdata[mapx+deltax][mapy+deltay].my_terrain_type != VALLEY))
  233.     boodlepiece::move(direction);
  234. }
  235.  
  236. void grumjug::attack(boodlepiece * target)
  237. {
  238.   switch(target->my_identity)
  239.   {
  240.     case BOODLINO: if (random(6) + 1 < 4)
  241.            {
  242.              spawn(new grumbop);
  243.              target->die();
  244.            }
  245.            else
  246.              target->attack(this);
  247.            break;
  248.     case BOODLE:
  249.     case BOODLEWIZ:
  250.     case BOODLETTAH: if (random(6) + 1 < 6)
  251.              {
  252.                spawn(new grumbop);
  253.                target->die();
  254.              }
  255.              else
  256.                target->attack(this);
  257.              break;
  258.   }
  259. }
  260.  
  261. void grumking::setmovement(void) {movesleft = 0;};
  262.  
  263. void grumbuggy::pick_up(void)
  264. {
  265.   boodlepiece * target;
  266.   if (((target = (boodlepiece *)isinsquare(GRUMJUG)) != NULL) && (cargo == NULL))
  267.   {
  268.     target->remove();
  269.     target->my_identity = CARRIEDGRUMJUG;
  270.     cargo = target;
  271.   }
  272.   else if (((target = (boodlepiece *)isinsquare(GRUMJUG)) != NULL) && (cargo2 == NULL) ||
  273.      (((target = (boodlepiece *)isinsquare(UNSETGRUMBOMB)) != NULL) && (cargo2 == NULL)))
  274.   {
  275.     target->remove();
  276.     if (target->my_identity == GRUMJUG)
  277.       target->my_identity = CARRIEDGRUMJUG;
  278.     cargo2 = target;
  279.   }
  280.   if (movesleft == 0)
  281.     movesleft = 4;
  282. }
  283.  
  284. void grumbuggy::drop(void)
  285. {
  286.   if (cargo2 != NULL)
  287.   {
  288.     cargo2->put(mapx, mapy);
  289.     if (cargo2->my_identity == CARRIEDGRUMJUG)
  290.       cargo2->my_identity = GRUMJUG;
  291.     cargo2 = NULL;
  292.   }
  293.   else if (cargo != NULL)
  294.   {
  295.     cargo->put(mapx, mapy);
  296.     if (cargo->my_identity == CARRIEDGRUMJUG)
  297.       cargo->my_identity = GRUMJUG;
  298.     cargo = NULL;
  299.     movesleft = 0;
  300.   }
  301. }
  302.  
  303.  
  304. void grumbuggy::setmovement(void)
  305. {
  306.   if (cargo != NULL)
  307.   {
  308.     movesleft = 4;
  309.   }
  310.   else
  311.     movesleft = 0;
  312.   if (my_identity == BROKEBUGGY)
  313.     movesleft = 0;
  314. };
  315.  
  316.  
  317. void grumbuggy::move(byte direction)
  318. {
  319.   int deltax, deltay;
  320.   getdeltas(direction, deltax, deltay);
  321.   boodlepiece::move(direction);
  322.   if (((mymap->mapdata[mapx+deltax][mapy+deltay].my_terrain_type & 16) == 16) &&
  323.      (mymap->mapdata[mapx+deltax][mapy+deltay].my_terrain_type != VALLEY))
  324.  
  325.   {
  326.     assign_icon(BROKEBUGGY, ONEFACE);
  327.     movesleft = 0;
  328.   }
  329. }
  330.  
  331. void grumbomb::move(byte direction)
  332. {
  333.   assign_icon(GRUMBOMB, ONEFACE);
  334.   movesleft = 0;
  335. }
  336.  
  337. void grumbomb::setmovement(void)
  338. {
  339.     movesleft = 0;
  340. };
  341.