home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume13 / dominion / part24 / printmap.c < prev    next >
C/C++ Source or Header  |  1992-02-11  |  13KB  |  506 lines

  1.  /* printmap.c -- print the nation */
  2.  
  3. /*
  4.  * Copyright (C) 1990 Free Software Foundation, Inc.
  5.  * Written by the dominion project.
  6.  *
  7.  * This file is part of dominion.
  8.  *
  9.  * dominion is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License as published
  11.  * by the Free Software Foundation; either version 1, or (at your option)
  12.  * any later version.
  13.  *
  14.  * This software is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this software; see the file COPYING.  If not, write to
  21.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  */
  23.  
  24. #include "dominion.h"
  25. #include "misc.h"
  26. #include "army.h"
  27. #include <stdio.h>
  28. #include <signal.h>
  29. #include <math.h>
  30.  
  31. extern Sworld world;
  32. extern Suser user;
  33. extern int debug;
  34. extern int viewall;
  35. extern char libdir[];
  36. extern int (*wrapx)(), (*wrapy)();
  37. #ifdef BSD
  38. extern char current_dir[];
  39. #else /* BSD */
  40. extern char *current_dir, *getcwd();
  41. #endif
  42. extern int euid, ruid;
  43.  
  44. int reverse_water=0;
  45. int ascii_map=0;
  46. int dash_sectors=0;
  47. #ifdef ANDREW
  48. int beroot = 1;
  49. #endif
  50.  
  51. Sdiplo **allocate_diplo();
  52. char *des();
  53.  
  54. main(argc, argv)
  55.      int argc;
  56.      char *argv[];
  57. {
  58.   char nation[NAMELEN], passwd[NAMELEN];
  59.   Snation *np;
  60.   Ssector *sp;
  61.   int i, j, iw, jw, ii, jj;        /* for loops */
  62.   int rel_xcenter, rel_ycenter, abs_xcenter, abs_ycenter;
  63.   int map_size, visibility, c, ascii=0;
  64.   int type1, type2, mark1, mark2;
  65.   extern char *optarg;
  66.   extern int optind;
  67.  
  68.   /* rel_center vars are map center coords relative to your capital */
  69.   /* abs_center is the map center in absolute coordinates.  Secret! */
  70.   /* map_size is the number of sectors to display across the map    */
  71.   /* type1 is map shading type, type2 is desig || nation_mark text  */
  72.  
  73.   strcpy(libdir, DEF_LIBDIR);
  74. #ifdef ANDREW
  75.   while ((c = getopt(argc, argv, "d:uxaWb")) != EOF) {
  76. #else
  77.   while ((c = getopt(argc, argv, "d:xaWs")) != EOF) {
  78. #endif
  79.     switch (c) {
  80. #ifdef ANDREW
  81.      case 'u':
  82.        beroot = 0;
  83.        break;
  84. #endif
  85.     case 'a':            /* ascii instead of postscript */
  86.       ascii = 1;
  87.       break;
  88.     case 'x':            /* debug mode */
  89.       debug = 1;
  90.       break;
  91.     case 'd':            /* lib directory */
  92.       strcpy(libdir, optarg);
  93.       break;
  94.     case 'W':            /* reverse above/below water */
  95.       reverse_water = 1;
  96.       break;
  97.     case 's':            /* show invisible sectors dashed */
  98.       dash_sectors = 1;
  99.       break;
  100.     }
  101.   }
  102.  
  103.   /* now get some unix system information */
  104. #ifdef ANDREW
  105.   if (beroot == 1) {
  106.     Authenticate();
  107.     beGames();
  108.   }
  109. #else
  110.   ruid = getuid();
  111.   euid = geteuid();
  112. #endif
  113.  
  114.   if (chdir(libdir) == -1) {
  115.     fprintf(stderr,"Error: cannot cd to directory %s\n",libdir);
  116.     clean_exit();
  117.     exit();
  118.   }
  119.   dom_print_intro();
  120.   load_army_types();
  121.   load_spirit_types();
  122.   get_user();            /* select & load nation */
  123.  
  124.   get_display_type(&type1, &type2); /* display type (nation, desig... */
  125.   get_map_info(&rel_xcenter, &rel_ycenter, &map_size);
  126.  
  127.   abs_xcenter = user.np->capital.x + rel_xcenter;
  128.   abs_ycenter = user.np->capital.y + rel_ycenter;
  129.  
  130. #ifdef UID_SECURITY
  131.   setuid(ruid);
  132. #endif
  133. #ifdef ANDREW
  134.   if (beroot == 1) {
  135.     bePlayer();
  136.     unAuth();
  137.     beroot = 0;
  138.   }
  139. #endif
  140.   
  141.   ps_prolog(map_size, type1, type2);
  142.  
  143.   ii = 0;
  144.   jj = map_size-1;
  145.  
  146.   for (j = abs_ycenter - map_size/2; j < abs_ycenter + map_size/2; j++) {
  147.     for (i = abs_xcenter - map_size/2; i < abs_xcenter + map_size/2; i++) {
  148.       iw = (*wrapx)(i,j);
  149.       jw = (*wrapy)(i,j);
  150.       visibility = user.visible_sectors[iw][jw];
  151.       if (type1 != 99) {    /* do some kind of shading */
  152.     user.display = type1;
  153.     mark1 = which_mark(iw, jw, &user);
  154.       }
  155.       if (type2 != 99) {    /* do some text in sectors */
  156.     user.display = type2;
  157.     mark2 = which_mark(iw, jw, &user);
  158.       }
  159.  
  160.       if (ascii_map) asc_mark(mark1, mark2, type1, type2, visibility);
  161.       else ps_mark(ii, jj, mark1, mark2, type1, type2, visibility);
  162.       ii++;
  163.     }
  164.  
  165.     jj--; ii = 0;
  166.     if (ascii_map) printf("\n");
  167.   }
  168.   if (!ascii_map) {
  169.     draw_axes(map_size, rel_xcenter, rel_ycenter);
  170.     if (type1 != 99)
  171.       draw_key();
  172.     printf("\nshowpage\n\n");
  173.   }
  174. }
  175.  
  176. asc_mark(m, v)
  177.      int m, v;
  178. {
  179. }
  180.  
  181.  
  182. draw_key()
  183. {
  184.   printf("\ngrestore\n");
  185.   printf("/Times-Roman findfont 15 scalefont setfont\n");
  186.   printf("0 .1 1.01 { /i exch def\n");
  187.   printf("  /x 2.1 inch i 300 mul add def\n  /y 2 inch def\n");
  188.   printf("  x y moveto 18 0 rlineto 0 18 rlineto 18 neg 0 rlineto\n");
  189.   printf("  closepath gsave 1 i sub setgray fill grestore stroke\n");
  190.   printf("  x 4 add y .2 inch sub moveto i 10 mul round cvi str cvs show\n");
  191.   printf("  } for\n");
  192. }
  193.  
  194.  
  195. draw_axes(size, xc, yc)
  196.      int size, xc, yc;
  197. {
  198.   int x, y, step=1;
  199.  
  200.   if (size > 50) step = 5;
  201.   else printf("\nsmallfont\n");
  202.  
  203.   printf("\n/str 15 string def   /size %d def\n", size);
  204.   printf("/minx %d def  /miny %d def\n", xc-size/2, yc-size/2);
  205.   printf("0 %d size 1 sub { /i exch def /i2 i def\n", step);
  206.   printf("   i   -0.8    i minx add str cvs 1 letter  /i i2 def\n");
  207.   printf("   i   size    i minx add str cvs 1 letter  /i i2 def\n");
  208.   printf("  -1   size i sub 1 sub i miny add str cvs 1 letter  /i i2 def\n");
  209.   printf("  size size i sub 1 sub i miny add str cvs 1 letter\n");
  210.   printf("} for\n");
  211. }
  212.  
  213. ps_prolog(size, type1, type2)
  214.      int size, type1, type2;
  215. {
  216.   printf("%%!\n");
  217.   printf("/inch { 72 mul } def\n");
  218.   printf("/center {dup stringwidth pop 2 div neg 0 rmoveto} bind def\n");
  219.   printf("/smallfont { /Courier findfont 25 scalefont setfont } def\n\n");
  220.  
  221.   printf("/xaxis { /t exch def /x exch def gsave smallfont\n");
  222.   printf("   x .8 neg t 1 letter   x %d t 1 letter\n", size);
  223.   printf("   grestore } def\n");
  224.  
  225.   printf("/yaxis { /t exch def /y exch def gsave smallfont\n");
  226.   printf("   1 neg y t 1 letter   %d y t 1 letter\n", size);
  227.   printf("   grestore } def\n\n");
  228.  
  229.   printf("/box { newpath 0 0 moveto 0 64 lineto 64 64 lineto 64 0 lineto\n");
  230.   printf("     closepath } def\n\n");
  231.  
  232.   printf("/graybox { /g exch def /y exch def /x exch def gsave\n");
  233.   printf("     x inch y inch translate box g setgray fill grestore } def\n\n");
  234.  
  235.   printf("/emptybox { /y exch def /x exch def gsave\n");
  236.   printf("   x inch y inch translate box 0 setgray stroke grestore } def\n\n");
  237.  
  238.   printf("/dashbox { /y exch def /x exch def gsave\n");
  239.   printf("     x inch y inch translate [3 9] 1 setdash box\n");
  240.   printf("     0 setgray stroke grestore } def\n");
  241.  
  242.   printf("/waterbox { /y exch def /x exch def gsave\n");
  243.   printf("     x inch y inch translate  0 12 64 { /i exch def\n");
  244.   printf("       0 i moveto  64 i lineto stroke \n");
  245.   printf("     } for  grestore } def\n\n");
  246.  
  247.   printf("/letter { /g exch def /t exch def /y exch def /x exch def\n");
  248.   printf("     gsave  x inch 20 add y inch 15 add translate 0 0 moveto\n");
  249.   printf("     g 0.5 lt { 1 setgray } { 0 setgray } ifelse\n");
  250.   printf("     t show grestore } def\n\n");
  251.  
  252.   printf("/Times-Roman findfont 20 scalefont setfont\n");
  253.   printf("4.25 inch 10.5 inch moveto (%s) center show\n", user.np->name);
  254.   printf("/Times-Roman findfont 15 scalefont setfont\n");
  255.   printf("4.25 inch 10 inch moveto (%s/%s) center show\n", des(type1), des(type2));
  256.   printf("/Courier findfont 50 scalefont setfont\n\n");
  257.   printf("0.01 setlinewidth  gsave\n");
  258.   printf("1 inch 3 inch translate\n");
  259.   printf("%f %f scale\n\n", 6.5/size, 6.5/size);
  260. }
  261.  
  262. ps_mark(x, y, m1, m2, t1, t2, vis)
  263.      int x, y, m1, m2, t1, t2, vis;
  264. {
  265.   float gray;
  266.   int other_char = '~';        /* which char represents 'other' world */
  267.  
  268.   if (debug)
  269.     fprintf(stderr, "x=%d y=%d m1=%c m2=%c t1=%d t2=%d vis=%d\n",
  270.         x, y, m1, m2, t1, t2, vis);
  271.  
  272.   if (user.underwater)
  273.     other_char = '.';
  274.  
  275.   if (vis > SEE_NOTHING) {
  276.     if (m1 == other_char || m2 == other_char) {
  277.       printf("%d %d waterbox\n", x, y);
  278.     } else {
  279.       if (t1 != 99) {        /* if we are doing shading */
  280.     if (m1 == 'I' || m1 == '+') gray = 0.0;
  281.     else gray = 1 - (float)(m1 - '0') / 10.0;
  282.     if (gray == 1.0)    /* make blank white box visible */
  283.       printf("%d %d emptybox\n", x, y);
  284.     else            /* print a box of proper gray shade */
  285.       printf("%d %d %3.2f graybox\n", x, y, gray);
  286.       }
  287.       if (t2 != 99) {        /* do some text */
  288.     if (t1 == 99) {        /* haven't done anything yet, make box */
  289.       printf("%d %d emptybox\n", x, y);
  290.       gray = 1.0;
  291.     }
  292.     printf("%d %d (%c) %3.2f letter\n", x, y, m2, gray);
  293.       }
  294.     }
  295.   } else {            /* invisible sectors are dashed */
  296.     if (dash_sectors)
  297.       printf("%d %d dashbox\n", x, y);
  298.   }
  299. }
  300.  
  301. critical()
  302. {
  303. }
  304. noncritical()
  305. {
  306. }
  307. cleanup()
  308. {
  309. }
  310. clean_exit()
  311. {
  312. #ifdef ANDREW
  313.   if (beroot == 1) {
  314.     bePlayer();
  315.     unAuth();
  316.     beroot = 0;
  317.   }
  318. #endif
  319. }
  320.  
  321. /* GET_MAP_INFO asks the user where to center the map, and what size
  322.    it should be */
  323. get_map_info(x, y, size, type1, type2)
  324.      int *x, *y, *size, *type1, *type2;
  325. {
  326.   char buff[NAMELEN];
  327.   int temp;
  328.  
  329.   *x = *y = 0;
  330.   *size = 30;
  331.   fprintf(stderr, "\nCenter the map around what sector?\n");
  332.   fprintf(stderr, "       x coordinate [0]: ");
  333.   gets(buff);
  334.   if (strlen(buff)) {
  335.     sscanf(buff, "%d", &temp);
  336.     *x = temp;
  337.   }
  338.   fprintf(stderr, "       y coordinate [0]: ");
  339.   gets(buff);
  340.   if (strlen(buff)) {
  341.     sscanf(buff, "%d", &temp);
  342.     *y = temp;
  343.   }
  344.   fprintf(stderr, "\nHow many sectors across the map [30]: ");
  345.   gets(buff);
  346.   if (strlen(buff)) {
  347.     sscanf(buff, "%d", &temp);
  348.     if ( (float)(temp) / 2.0 != (float)(temp / 2) ) /* even number */
  349.       temp++;
  350.     *size = temp;
  351.   }
  352.   if (*size < 10) *size = 10;
  353. }
  354.  
  355. /* GET_DISPLAY_TYPE get's the user's choice of the display parameter */
  356. get_display_type(t1, t2)
  357.      int *t1, *t2;
  358. {
  359.   char buff[NAMELEN], a;
  360.  
  361.   fprintf(stderr, "\np: population\t A: Altitude\t w: Climate\n");
  362.   fprintf(stderr, "t: Terrain\t s: Soil\t m: Metal\n");
  363.   fprintf(stderr, "j: Jewels\t M: Movecost\t N: None\n");
  364.   fprintf(stderr, "\nSelect sector shading from above list [None]: ");
  365.  
  366.   gets(buff);
  367.   a = buff[0];
  368.  
  369.   switch (a) {
  370.   case 'p':
  371.     *t1 = POPULATION;
  372.     break;
  373.   case 'A':
  374.     *t1 = ALTITUDE;
  375.     break;
  376.   case 'w':
  377.     *t1 = CLIMATE;
  378.     break;
  379.   case 't':
  380.     *t1 = TERRAIN;
  381.     break;
  382.   case 's':
  383.     *t1 = SOIL;
  384.     break;
  385.   case 'm':
  386.     *t1 = METAL;
  387.     break;
  388.   case 'j':
  389.     *t1 = JEWELS;
  390.     break;
  391.   case 'M':
  392.     *t1 = MOVECOST;
  393.     break;
  394.   default:
  395.     *t1 = 99;
  396.     break;
  397.   }
  398.  
  399.   fprintf(stderr, "\nn: Nation Mark\t d: Designation\t N: None\n");
  400.   fprintf(stderr, "\nSelect sector text from above list [designation]: ");
  401.  
  402.   gets(buff);
  403.   a = buff[0];
  404.  
  405.   switch (a) {
  406.   case 'N':
  407.     *t2 = 99;
  408.     break;
  409.   case 'n':
  410.     *t2 = NATION_MARK;
  411.     break;
  412.   case 'd':
  413.   default:
  414.     *t2 = DESIGNATION;
  415.     break;
  416.   }
  417. }
  418.  
  419. /* GET_USER actually takes care of reading in the world, selecting and
  420.    loading a nation, and setting up data (such as visibility) */
  421. get_user()
  422. {
  423.   char nation[NAMELEN], passwd[NAMELEN];
  424.   int i;
  425.  
  426.   read_world(&world, WORLD_FILE);
  427.   fprintf(stderr, "Enter nation name: ");
  428.   getline(nation, NAMELEN);
  429.   user.id = get_nation_id(nation);
  430.   get_crypt_pass("Your password: ", passwd, NULL, NULL);
  431.   if (strcmp(world.nations[user.id].passwd, passwd)) {
  432.     fprintf(stderr, "\nInvalid password.  AND, *I* only give you one try!\n");
  433.     exit(1);
  434.   }
  435.   user.np = &world.nations[user.id];
  436.  
  437.   user.avail_armies = NULL;
  438.   get_avail_armies(&user, user.np->tech_skill);
  439.  
  440.   user.spell_list = NULL;
  441.   user.spirit_list = NULL;
  442.   get_spells(&user, user.np->mag_skill);
  443.   get_spirits(&user, user.np->mag_skill);
  444.  
  445.   if (user.id != 0)        /* Gamemaster is already loaded   */
  446.     load_nation(user.id, user.np); /* load their exec file etc    */
  447.  
  448.   user.underwater = 0;
  449.   if (user.np->race.pref_alt < 0) /* set underwater preference   */
  450.     user.underwater = 1;
  451.   if (user.id == 0)        /* give Gamemaster clairvoyance */
  452.     viewall = 1;
  453.  
  454.   user.diplo_matrix = allocate_diplo(world.n_nations);
  455.   read_in_diplo(user.diplo_matrix, world.n_nations);
  456.  
  457.   user.visible_sectors = (int **) malloc(world.xmax*sizeof(int *));
  458.   for (i = 0; i < world.xmax; ++i)
  459.     user.visible_sectors[i] = (int *) malloc(world.ymax*sizeof(int));
  460.   find_visible_sectors(user.visible_sectors);
  461.  
  462.   chdir("..");
  463. }
  464.  
  465.  
  466. dom_print_intro()
  467. {
  468.   fprintf(stderr, "\ndom_print - postscript map printer\n\n");
  469.   fprintf(stderr, "Redirect output to file or pipe to printer.\n\n");
  470.   fprintf(stderr, " -d dir = set lib directory\n");
  471.   fprintf(stderr, " -W = invert above/below water\n");
  472.   fprintf(stderr, " -s = show invisible sectors dashed\n\n");
  473. }
  474.  
  475.  
  476. char *des(x)
  477.      int x;
  478. {
  479.   switch (x) {
  480.   case POPULATION:
  481.     return "Population";
  482.   case ALTITUDE:
  483.     return "Altitude";
  484.   case CLIMATE:
  485.     return "Climate";
  486.   case TERRAIN:
  487.     return "Terrain";
  488.   case SOIL:
  489.     return "Soil";
  490.   case METAL:
  491.     return "Metal";
  492.   case JEWELS:
  493.     return "Jewels";
  494.   case MOVECOST:
  495.     return "Movecost";
  496.   case DESIGNATION:
  497.     return "Designation";
  498.   case NATION_MARK:
  499.     return "Nation Mark";
  500.   default:
  501.     return " ";
  502.   }
  503. }
  504.  
  505.  
  506.