home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume6 / rndweather < prev    next >
Text File  |  1989-03-25  |  39KB  |  1,341 lines

  1. Newsgroups: comp.sources.misc
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Subject: v06i080: Random Weather Generator for RPGs
  4. Reply-To: slocum@hi-csc.UUCP
  5.  
  6. Posting-number: Volume 6, Issue 80
  7. Submitted-by: slocum@hi-csc.UUCP
  8. Archive-name: rndweather
  9.  
  10. This is a random weather generator for use with roleplaying games.
  11. It is customizable, and contains several different climates and
  12. calendars.  See README file for for info.  See Makefile for
  13. instructions on making various versions.
  14.  
  15. Brett Slocum   UUCP: ...uunet!hi-csc!slocum
  16.                Arpa: hi-csc!slocum@uunet.uu.net
  17. "My name is Inigo Montoya. You killed my father. Prepare to die."
  18.  
  19. #--------------------------------CUT HERE-------------------------------------
  20.  
  21.  
  22. # This is a shell archive.  Remove anything before this line, then
  23. # unpack it by saving it in a file and typing "sh file".  (Files
  24. # unpacked will be owned by you and have default permissions.)
  25. #
  26. # This archive contains:
  27. # README Makefile weather.c gregorian.h gulf.h japan.h mid_atlantic.h middle_earth.h n_atlantic.h n_pacific.h s_atlantic.h weather.h
  28.  
  29. echo x - README
  30. cat > "README" << '//E*O*F README//'
  31. When playing roleplaying games (RPGs), it often adds some realism if the GM
  32. can determine what kind of weather is occuring.  This program generates random
  33. weather for a year that is tunable to various climates.  Several example
  34. climates are included: north, south, and mid atlantic, gulf, and north
  35. pacific.
  36.  
  37. In addition, several different calendars are included: Gregorian, medieval
  38. Japanese, and the Middle Earth calendar detailed in the appendices of
  39. Tolkien's The Lord of the Rings.
  40.  
  41. The details of these are provided so that the user can create his or her own
  42. climate profiles or calendars.
  43.  
  44. Please send any improvements, new climate profiles, new calendars, or
  45. better versions of the current climate profiles to one of the addresses below.
  46.  
  47. -----------------------------------------------------------------
  48. Brett Slocum   UUCP: ...uunet!hi-csc!slocum
  49.                Arpa: hi-csc!slocum@uunet.uu.net
  50. "My name is Inigo Montoya. You killed my father. Prepare to die."
  51. -----------------------------------------------------------------
  52.  
  53. //E*O*F README//
  54.  
  55. echo x - Makefile
  56. cat > "Makefile" << '//E*O*F Makefile//'
  57. # Makefile: makefile for weather.c
  58. # make <choice>
  59. # will create a specific climate program.
  60. #
  61. # make
  62. # will create 'england', an English climate program.
  63. #
  64. # make all
  65. # will create all climate programs.
  66. #
  67. # To make addition climate programs, just add the calendar
  68. # and climate choices as -D options.
  69. #
  70. # Calendar choices:
  71. # GREGORIAN - uses essentially modern calendar, without leap years.
  72. #
  73. # JAPAN     - uses medieval Japanese calendar.
  74. #
  75. # MIDDLE_EARTH - uses calendar described in appendices of Tolkien's
  76. #                'The Lord of the Rings'.
  77. #
  78. # Climate choices:
  79. #
  80. # N_ATLANTIC   - useful for Scandinavia coastal or interior continential US
  81. #                or Europe.
  82. # MID_ATLANTIC - useful for England, European coastal, New England, etc.
  83. # S_ATLANTIC   - useful for Spain, Southern coastal US
  84. # GULF         - useful for Gulf States, Mediterranean, etc.
  85. # N_PACIFIC    - useful for Japan, Korea, Southern Alaskan coast, etc.
  86.  
  87. england: weather.c weather.h gregorian.h mid_atlantic.h
  88.     cc -DGREGORIAN -DMID_ATLANTIC -o england -g weather.c
  89.  
  90. minnesota: weather.c weather.h gregorian.h n_atlantic.h
  91.     cc -DGREGORIAN -DN_ATLANTIC -o minnesota -g weather.c
  92.  
  93. japan: weather.c weather.h japan.h n_pacific.h
  94.     cc -DJAPAN -DN_PACIFIC -o japan -g weather.c
  95.  
  96. florida: weather.c weather.h gregorian.h gulf.h
  97.     cc -DGREGORIAN -DGULF -o florida -g weather.c
  98.  
  99. shire: weather.c weather.h middle_earth.h mid_atlantic.h
  100.     cc -DMIDDLE_EARTH -DMID_ATLANTIC -o shire -g weather.c
  101.  
  102. georgia: weather.c weather.h gregorian.h s_atlantic.h
  103.     cc -DGREGORIAN -DS_ATLANTIC -o georgia -g weather.c
  104.  
  105. all: england minnesota japan florida shire georgia
  106.  
  107. //E*O*F Makefile//
  108.  
  109. echo x - weather.c
  110. cat > "weather.c" << '//E*O*F weather.c//'
  111. /**************************************************************************
  112.  *  Weather - generates random weather                                    *
  113.  *                                                                        *
  114.  *  Copyright 1988 by Brett Slocum.  All rights reserved.                 *
  115.  *  Permission is granted to distribute or modify this program, or use    *
  116.  *  portions of this program in other programs, as long as this notice    *
  117.  *  remains intact.                                                       *
  118.  *  This program or its derivatives may not be sold for profit without    *
  119.  *  permission of the author.                                             *
  120.  *                                                                        *
  121.  *  Original UNIX Version: Brett Slocum UUCP: ...uunet!hi-csc!slocum      *
  122.  *                                      ARPA: hi-csc!slocum@uunet.uu.net  *
  123.  *                                                                        *
  124.  **************************************************************************/
  125.  
  126. #include "weather.h"
  127.  
  128. typedef UBYTE MONTH_T;
  129.  
  130. /* Calendar choices */
  131. #ifdef GREGORIAN
  132. #include "gregorian.h"
  133. #else
  134. #ifdef JAPAN
  135. #include "japan.h"
  136. #else
  137. #ifdef MIDDLE_EARTH
  138. #include "middle_earth.h"
  139. #endif
  140. #endif
  141. #endif
  142.  
  143. /* Climate choices */
  144. #ifdef N_ATLANTIC
  145. #include "n_atlantic.h"
  146. #else
  147. #ifdef MID_ATLANTIC
  148. #include "mid_atlantic.h"
  149. #else
  150. #ifdef S_ATLANTIC
  151. #include "s_atlantic.h"
  152. #else
  153. #ifdef GULF
  154. #include "gulf.h"
  155. #else
  156. #ifdef N_PACIFIC
  157. #include "n_pacific.h"
  158. #endif
  159. #endif
  160. #endif
  161. #endif
  162. #endif
  163.  
  164. UBYTE Stat_Table[N_MONTHS][N_STAT] = {
  165.     {200,0,0}, {200,0,0}, {200,0,0}, {200,0,0}, {200,0,0}, {200,0,0}, 
  166.     {200,0,0}, {200,0,0}, {200,0,0}, {200,0,0}, {200,0,0}, {200,0,0}
  167. };
  168.  
  169. WIND_T     Wind = CALM;          /* today's wind conditions */
  170. TEMP_T     Temp_Class = CHILLY;  /* today's temperature class */
  171. PRECIP_T   Precip_Class = NONE;  /* today's precipitation */
  172. WEATHER_T  Weather;              /* today's weather */
  173. OVERCAST_T Sky;                  /* today's sky conditions */
  174.  
  175. UBYTE Temperature = 0,           /* today's actual temperature */
  176.       Duration = 0;              /* today's precipitation duration */
  177.  
  178. BOOL Duration_Hours = TRUE,      /* flag that indicates whether precip lasted */
  179.                                  /* hours (TRUE) or minutes (FALSE) */
  180.      Catastrophe = FALSE,        /* flag that indicates whether a catastrophe */
  181.                                  /* occurred today */
  182.      Storm = FALSE,              /* flag that indicates whether precip was a storm */
  183.      Long_Storm = FALSE,         /* flag that indicates whether precip was a */
  184.                                  /* long storm lasting more than one day */
  185.      Snow = FALSE;               /* flag that indicates whether snow fell today */
  186.  
  187. float Rainfall = 0.0,            /* yearly total rainfall */
  188.       Snowfall = 0.0,            /* yearly total snowfall */
  189.       Snow_Depth = 0.0;          /* today's snow depth, including new accumulations */
  190.                                  /* and melting */
  191.  
  192. WEATHER_T 
  193. gen_weather(month, ptr_catastrophe)
  194.     MONTH_T month;
  195.     BOOL *ptr_catastrophe;
  196.     /* This routine generates the overall weather for the day. */
  197.     /* It also determines whether a catastrophe has occurred.  */
  198.     /* A catastrophe can be localized or wide-spread, natural  */
  199.     /* or man-made. Such things as fires, earthquakes, floods, */
  200.     /* etc. are possible.                                      */
  201. {
  202.      int       roll;
  203.      WEATHER_T i, 
  204.                return_val;
  205.  
  206.      /* get die-roll.  if catastrophe, set flag and roll again. */
  207.      do {  
  208.          roll = DIE(100);
  209.          if (roll == 100)
  210.              *ptr_catastrophe = TRUE;
  211.      }
  212.      while (roll == 100);
  213.  
  214.      /* if it rained more than a sprinkle yesterday, it more likely */
  215.      /* to be at least overcast, if not rainy today. */
  216.      if (Precip_Class > SPRINKLE) {
  217.          roll = roll - 10;
  218.          if (roll < 1)
  219.              roll = 1;
  220.      }
  221.  
  222.      /* find the type of weather from the die-roll */
  223.      return_val = CLEAR;
  224.      for (i = CLEAR; i >= PRECIPITATION; i--)
  225.          if (roll <= Weather_Table[month][i])
  226.              return_val = i;
  227.      return(return_val);
  228. }
  229.  
  230. TEMP_T 
  231. gen_temp(month)
  232.     MONTH_T month;
  233.     /* generates the day's temperature and set the temp type */
  234. {
  235.      int roll, data, i;
  236.      TEMP_T return_val;
  237.  
  238.      /* determine temperature variation from monthly average */
  239.      /*   +/- 20 degrees */
  240.      roll = DIE(100);
  241.      data = 8;
  242.      for (i = 8; i >= 0; i--)
  243.          if (roll <= Temp_Variation[i])
  244.              data = i;
  245.      Temperature = Ave_Temp[month] + ((data-4) * 5);
  246.  
  247.      /* classify the temperature class */
  248.      if (Temperature < 25) 
  249.          return_val = COLD;
  250.      else
  251.      if ((Temperature >= 25) AND (Temperature < 40)) 
  252.          return_val = CHILLY;
  253.      else
  254.      if ((Temperature >= 40) AND (Temperature < 65)) 
  255.          return_val = FAIR;
  256.      else
  257.      if ((Temperature >= 65) AND (Temperature < 80)) 
  258.          return_val = WARM;
  259.      else
  260.      if (Temperature >= 80) 
  261.          return_val = HOT;
  262.  
  263.      /* accumulate monthly statistics */
  264.      Stat_Table[month][HIGH] = MAX(Temperature, Stat_Table[month][HIGH]);
  265.      Stat_Table[month][LOW] = MIN(Temperature, Stat_Table[month][LOW]);
  266.      return(return_val);
  267. }
  268.  
  269. WIND_T
  270. gen_wind(month)
  271.     MONTH_T month;
  272.     /* generate the wind class */
  273. {
  274.      int roll;
  275.      WIND_T return_val, i;
  276.  
  277.      /* modify the roll for current weather.  Clear weather is less likely */
  278.      /* to be windy, and rainy weather is more likely. */
  279.      roll = DIE(100);
  280.      switch (Weather) {
  281.      case CLEAR : 
  282.          roll -= 20;
  283.          break;
  284.      case PRECIPITATION:
  285.          roll += 20;
  286.          break;
  287.      } /* switch */
  288.  
  289.      /* if yesterday was very windy, today will be windier */
  290.      if (Wind >= BLUSTERY) 
  291.          roll += 20;
  292.  
  293.      /* limit to boundaries 1-100 */
  294.      if (roll < 1) 
  295.          roll = 1;
  296.      if (roll > 100) 
  297.          roll = 100;
  298.  
  299.      /* find wind type */
  300.      return_val = GALE;
  301.      for (i = GALE; i >= CALM; i--)
  302.          if (roll <= Wind_Table[month][i]) 
  303.              return_val = i;
  304.      if (Weather == TAIFUN) 
  305.          return_val = GALE;
  306.      return(return_val);
  307.  }
  308.  
  309. PRECIP_T
  310. gen_precip(month)
  311.     MONTH_T month;
  312.     /* generate today's precipitation */
  313. {
  314.      int roll;
  315.      PRECIP_T return_val, i;
  316.  
  317.      return_val = NONE;
  318.      if (Weather == PRECIPITATION)
  319.      {
  320.          roll = DIE(100);
  321.          return_val = STEADY;
  322.          for (i = STEADY; i >= SPRINKLE; i--)
  323.              if (roll <= Precip_Table[month][i])
  324.                  return_val = i;
  325.      }
  326.  
  327.      /* if yesterday had steady precipitation, there is a 1/3 chance */ 
  328.      /* on the second day and 1/6 chance on succeeding days that today */
  329.      /* also has steady precipitation */
  330.      if ((Precip_Class == STEADY) AND (DIE(6) <= 2 - Long_Storm))
  331.      {
  332.          Weather = PRECIPITATION;
  333.          return_val = STEADY;
  334.      }
  335.  
  336.      return(return_val);
  337. }
  338.  
  339. void
  340. precip_statistics()
  341.      /* determines various flags including Snow, Storm and Long_Storm. */
  342.      /* Also determines precipitation duration and amount, updates */
  343.      /* yearly Rainfall and Snowfall statistics, daily Snow_Depth, */
  344.      /* and snow melting */
  345. {
  346.      float amount;
  347.  
  348.      if (Weather == PRECIPITATION)
  349.      {
  350.          /* set flags */
  351.          if (Precip_Class != STEADY) 
  352.              Long_Storm = FALSE;
  353.          if (Temperature < 35)
  354.              Snow = TRUE;
  355.          else
  356.              Snow = FALSE;
  357.          if ((Temp_Class >= WARM) AND ((Precip_Class == SHOWER) OR (Precip_Class == HEAVY)))
  358.              Storm = TRUE;
  359.          else
  360.              Storm = FALSE;
  361.          if (Snow AND (Precip_Class >= HEAVY) AND (Wind >= BLUSTERY))
  362.              Storm = TRUE;
  363.  
  364.          /* determine duration and amount of precipitation */
  365.          switch (Precip_Class) {
  366.          case SPRINKLE :
  367.              Duration = 5 * DIE(6);
  368.              Duration_Hours = FALSE;
  369.              amount = 0.1;
  370.              break;
  371.          case SHOWER :
  372.              Duration = 10 * (DIE(6) + DIE(6));
  373.              Duration_Hours = FALSE;
  374.              amount = Duration / 100;
  375.              break;
  376.          case HEAVY : 
  377.              Duration = 1 + DIE(6);
  378.              Duration_Hours = TRUE;
  379.              amount = (DIE(4) + (Storm * Duration));
  380.              break;
  381.          case STEADY :
  382.              Duration = 24;
  383.              Duration_Hours = TRUE;
  384.              amount = (DIE(6) + DIE(6)) + (Storm * (DIE(6) + DIE(6))); 
  385.              break;
  386.          }
  387.          if (Storm)
  388.              amount *= 2.0;
  389.  
  390.          /* update yearly and daily statistics */
  391.          Rainfall += (amount / 10);
  392.          if (Snow)
  393.              {
  394.                  Snow_Depth += amount;
  395.                  Snowfall += amount;
  396.              }
  397.          else
  398.              switch (Precip_Class) {
  399.              case SHOWER : 
  400.                  Snow_Depth -= Duration / 60;
  401.                  break;
  402.              case HEAVY : 
  403.                  Snow_Depth -= Duration;
  404.                  break;
  405.              case STEADY :
  406.                  Snow_Depth -= 12;
  407.                  break;
  408.              }
  409.      }
  410.  
  411.      /* melt snow in weather above freezing */
  412.      switch (Temp_Class) {
  413.      case CHILLY :
  414.          if (Temperature > 32) 
  415.              Snow_Depth -= 1.0;
  416.          break;
  417.      case FAIR :
  418.          Snow_Depth -= Temperature / 8;
  419.          break;
  420.      case WARM :
  421.          Snow_Depth -= Temperature - 40;
  422.          break;
  423.      case HOT : 
  424.          Snow_Depth -= Temperature - 20;
  425.          break;
  426.      }
  427.      if (Snow_Depth < 0.1)
  428.          Snow_Depth = 0.0;
  429. }
  430.  
  431. OVERCAST_T
  432. gen_overcast(weather)
  433.     WEATHER_T weather;
  434.     /* generate today's level of cloudiness */
  435. {
  436.      int roll;
  437.      OVERCAST_T return_val, i;
  438.  
  439.      return_val = CLOUDY;
  440.      switch (weather) {
  441.      case PRECIPITATION:
  442.      case OVERCAST :
  443.           roll = DIE(100);
  444.           return_val = CLOUDY;
  445.           for (i = CLOUDY; i >= HEAVY_FOG; i--)
  446.               if (roll <= Overcast_Table[i])
  447.                   return_val = i;
  448.           break;
  449.      case TAIFUN : return_val = CLOUDY;
  450.      }
  451.      return(return_val);
  452. }
  453.  
  454. void
  455. print_notes(day, month)
  456.     UBYTE day;
  457.     MONTH_T month;
  458.     /* print snow depth, precipitation type and duration, */
  459.     /* catastrophe, and holidays */
  460. {
  461.      char *precip,
  462.           *dur;
  463.  
  464.      if (Precip_Class != NONE) 
  465.      {
  466.          if (Snow) 
  467.              precip = (Storm ? "Blizzard" : "Snow");
  468.          else
  469.              precip = (Storm ? "Storm" : "Rain");
  470.          dur = (Duration_Hours ? "hours" : "minutes");
  471.          printf(" %s - %2d %s,", precip, Duration, dur);
  472.      }
  473.      if (Catastrophe)
  474.          printf(" Catastrophe,");
  475.      print_holiday(day, month);
  476. }
  477.  
  478. void
  479. print_weather(day, month)
  480.     UBYTE day;
  481.     MONTH_T month;
  482.     /* print today's weather */
  483. {
  484.      printf("%4d  %13s", day, Weather_Name[Weather]);
  485.      printf("%11s", ((Weather==CLEAR) ? "Clear" : Overcast_Name[Sky]));
  486.      printf("%8s (%3d)  %8s  %8s", Temp_Name[Temp_Class], Temperature, Precip_Name[Precip_Class], Wind_Name[Wind]);
  487.      if (Snow_Depth > 0.0) 
  488.          printf(" %5.1f\" ", Snow_Depth);
  489.      else
  490.          printf("%8c", ' ');
  491.      print_notes(day, month);
  492.      printf("\n");
  493.  }
  494.  
  495. void
  496. init_winter()
  497.      /* initialize last year's winter */
  498. {
  499.      UBYTE day;
  500.      MONTH_T month;
  501.  
  502.      /* calculate snow depth for Oct. thru Dec. */
  503.      for (month = LAST_MONTH-2; month <= LAST_MONTH; month++)
  504.          for (day = 1; day <= Day_Table[month]; day++)
  505.          {
  506.              Catastrophe = FALSE;
  507.              if (DIE(100) > 50) 
  508.                  Weather = gen_weather(month, &Catastrophe);
  509.              Wind = gen_wind(month);
  510.              Temp_Class = gen_temp(month);
  511.              Precip_Class = gen_precip(month);
  512.              precip_statistics();
  513.              Sky = gen_overcast(Weather);
  514.          }
  515. }
  516.  
  517. init_stat()
  518. {
  519.     MONTH_T month;
  520.     STAT_T stat;
  521.  
  522.     for (month = FIRST_MONTH; month <= LAST_MONTH; month++)
  523.     {
  524.         Stat_Table[month][LOW] = 200;
  525.         for (stat = AVERAGE; stat <= HIGH; stat++)
  526.             Stat_Table[month][stat] = 0;
  527.     }
  528. }
  529.  
  530. main(argc, argv)  
  531. int argc;
  532. char *argv[];
  533. {
  534.      int cum_temp;               /* cumulative temp used for calculating average temp */
  535.      unsigned int sunshine = 0;  /* number of days of sunshine */
  536.      MONTH_T month;              /* month counter */
  537.      UBYTE day,                  /* day counter */
  538.            year,                 /* year counter */
  539.            n_years = 1;          /* number of years */
  540.  
  541.      srandom((int)time(0));
  542.      if (argc > 1)
  543.          n_years = atoi(argv[1]);
  544.      init_winter();
  545.      for (year = 1; year <= n_years; year++)
  546.      {
  547.          Rainfall = 0.0;
  548.          Snowfall = 0.0;
  549.          sunshine = 0;
  550.          init_stat();
  551.          printf("%64c%6s\n", ' ',"Snow");
  552.          printf("Year %3d%11s%11s%14s%10s%10s%7s%7s\n", year, "Weather", "Sky", "Temperature", "Precip", "Wind", "Depth", "Notes");
  553.          for (month = FIRST_MONTH; month <= LAST_MONTH; month++)
  554.          {
  555.              cum_temp = 0;
  556.              printf("%-9s\n", Month_Name[month]);
  557.              for (day = 1; day <= Day_Table[month]; day++)
  558.              {
  559.                  Catastrophe = FALSE;
  560.     
  561.                  /* half the time, Weather is the same as yesterday */
  562.                  if (DIE(100) > 50) 
  563.                      Weather = gen_weather(month, &Catastrophe);
  564.                  Wind = gen_wind(month);
  565.                  Temp_Class = gen_temp(month);
  566.                  cum_temp += Temperature;
  567.                  Precip_Class = gen_precip(month);
  568.                  precip_statistics();
  569.                  Sky = gen_overcast(Weather);
  570.     
  571.                  /* count sunny days */
  572.                  if (Weather == CLEAR) 
  573.                      sunshine++;
  574.                  print_weather(day, month);
  575.              }
  576.              Stat_Table[month][AVERAGE] = (cum_temp / Day_Table[month]);
  577.              printf("High Temp = %3d, Low Temp = %3d, Average Temp = %3d\n\n", Stat_Table[month][HIGH], Stat_Table[month][LOW], Stat_Table[month][AVERAGE]);
  578.          }
  579.          /* print yearly statistics */
  580.          printf("Sunshine = %3d days\n", sunshine);
  581.          printf("Rainfall = %4.1f\"\n", Rainfall);
  582.          printf("Snowfall = %4.1f\"\n\n", Snowfall);
  583.      }
  584. }
  585.  
  586. //E*O*F weather.c//
  587.  
  588. echo x - gregorian.h
  589. cat > "gregorian.h" << '//E*O*F gregorian.h//'
  590. /* Copyright 1988 by Brett D. Slocum - 12/12/88 */
  591. /* All rights reserved */
  592. /* This is the calendar include file is for weather generation */
  593. /* It includes calendar and holiday information */
  594.  
  595. /* To create a new calendar file, 
  596.        1) define month names for use by MONTH_T type,
  597.        2) define FIRST_MONTH and LAST_MONTH,
  598.        3) define string array Month_Name with printable version of month,
  599.        4) define number of days per month array Day_Table,
  600.        5) add printf statements in print_holidays for holidays
  601. */
  602.  
  603. /* Month types */
  604. #define JANUARY   0
  605. #define FEBRUARY  1
  606. #define MARCH     2
  607. #define APRIL     3
  608. #define MAY       4
  609. #define JUNE      5
  610. #define JULY      6
  611. #define AUGUST    7
  612. #define SEPTEMBER 8
  613. #define OCTOBER   9
  614. #define NOVEMBER  10
  615. #define DECEMBER  11
  616.  
  617. #define FIRST_MONTH JANUARY
  618. #define LAST_MONTH  DECEMBER
  619.  
  620. #define N_MONTHS (LAST_MONTH - FIRST_MONTH) + 1
  621.  
  622. char *Month_Name[N_MONTHS] = {
  623.     "January", 
  624.     "February",
  625.     "March",
  626.     "April",
  627.     "May",
  628.     "June",
  629.     "July",
  630.     "August",
  631.     "September",
  632.     "October",
  633.     "November",
  634.     "December"
  635. };
  636.  
  637. UBYTE Day_Table[N_MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  638.  
  639. void
  640. print_holiday(day, month)
  641.     UBYTE day;
  642.     MONTH_T month;
  643. {
  644.      switch (month) {
  645.      case JANUARY : 
  646.          if (day == 1) 
  647.              printf(" New Years (s)");
  648.          if (day == 6) 
  649.              printf(" Twelfth Night");
  650.          break;
  651.      case FEBRUARY : 
  652.          if (day == 2) 
  653.              printf(" Candlemas");
  654.          if (day == 14) 
  655.              printf(" St. Valentine's Day");
  656.          break;
  657.      case MARCH : 
  658.          if (day == 21) 
  659.              printf(" Spring Equinox");
  660.          break;
  661.      case APRIL : 
  662.          break;
  663.      case MAY : 
  664.          if (day == 1) 
  665.              printf(" May Day");
  666.          break;
  667.      case JUNE : 
  668.          if (day == 21) 
  669.              printf(" Midsummer Day");
  670.          break;
  671.      case JULY : 
  672.          break;
  673.      case AUGUST : 
  674.          if (day == 2) 
  675.              printf(" Lammas");
  676.          break;
  677.      case SEPTEMBER : 
  678.          if (day == 21) 
  679.              printf(" Fall Equinox");
  680.          break;
  681.      case OCTOBER : 
  682.          if (day == 31) 
  683.              printf(" Halloween");
  684.          break;
  685.      case NOVEMBER : 
  686.          break;
  687.      case DECEMBER : 
  688.          if (day == 21) 
  689.              printf(" Winter Solstice");
  690.          if (day == 25) 
  691.              printf(" Christmas");
  692.          break;
  693.      }
  694. }
  695.  
  696. //E*O*F gregorian.h//
  697.  
  698. echo x - gulf.h
  699. cat > "gulf.h" << '//E*O*F gulf.h//'
  700. /* Most of the info provided in this file could be found in an almanac. */
  701.  
  702. /* Ave_Temp       - the average temperature for each month */
  703. /* Weather_Table  - each entry in the table is the weather profile for each month */
  704. /*                  for a random 1-100 die roll. */
  705. /*  month profile - {precipitation, overcast, taifun/hurricane, clear} */        
  706. /*        example - {30,35,0,100} means that in this month a roll of : */
  707. /*                  1-30  = precipitation        */
  708. /*                 31-35  = overcast             */
  709. /*                 no chance of taifun/hurricane */
  710. /*                 36-100 = clear                */
  711.  
  712. /* Wind_Table     - is structured like the Weather_Table. */
  713. /*  month profile - {Calm, Light, Brisk, Blustery, Gale}  */
  714.  
  715. /* Precip_Table   - as above */
  716. /*  month profile - {None, Sprinkle, Shower, Heavy, Steady} */
  717.  
  718. /* Overcast_Table - {Heavy Fog, Light Fog, Mist, Cloudy} */
  719.  
  720. UBYTE Ave_Temp[N_MONTHS] = {65, 70, 75, 80, 85, 95, 95, 90, 85, 75, 70, 65};
  721.  
  722. UBYTE Weather_Table[N_MONTHS][N_WEATHER] = {
  723.     {30,35,0,100}, {25,35,0,100}, {20,30,0,100}, {35,50,0,100}, {25,40,0,100}, {15,25,0,100}, 
  724.     {10,15,0,100}, {10,15,0,100}, {15,25,0,100}, {25,35,0,100}, {25,40,0,100}, {30,45,0,100}
  725. };
  726.  
  727. UBYTE Wind_Table[N_MONTHS][N_WIND] = {
  728.     {60,80,90,100,0}, {50,70,85,100,0}, {40,60,75,99,100}, {60,85,95,100,0}, {70,90,100,0,0}, {80,90,100,0,0}, 
  729.     {80,100,0,0,0}, {80,100,0,0,0}, {60,80,95,100,0}, {40,65,85,97,100}, {40,60,80,95,100}, {60,80,90,100,0}
  730. };
  731.  
  732. UBYTE Precip_Table[N_MONTHS][N_PRECIP] = {
  733.     {0,40,70,80,100},
  734.     {0,50,80,95,100},
  735.     {0,60,80,100,0},
  736.     {0,40,70,90,100},
  737.     {0,50,80,100,0},
  738.     {0,60,90,100,0},
  739.     {0,80,95,100,0},
  740.     {0,80,95,100,0},
  741.     {0,60,80,90,100},
  742.     {0,50,80,90,100},
  743.     {0,40,70,85,100},
  744.     {0,40,70,80,100}
  745. };
  746.  
  747. UBYTE Overcast_Table[N_OVERCAST] = {10,20,70,100};
  748.  
  749.  
  750. //E*O*F gulf.h//
  751.  
  752. echo x - japan.h
  753. cat > "japan.h" << '//E*O*F japan.h//'
  754. /* Copyright 1988 by Brett D. Slocum - 12/12/88 */
  755. /* All rights reserved */
  756. /* This is the calendar include file is for weather generation */
  757. /* It includes calendar and holiday information */
  758.  
  759. /* To create a new calendar file, 
  760.        1) define month names for use by MONTH_T type,
  761.        2) define FIRST_MONTH and LAST_MONTH,
  762.        3) define string array Month_Name with printable version of month,
  763.        4) define number of days per month array Day_Table,
  764.        5) add printf statements in print_holidays for holidays
  765. */
  766.  
  767. /* Month types */
  768. #define RAT    0
  769. #define BULL   1
  770. #define TIGER  2
  771. #define HARE   3
  772. #define DRAGON 4
  773. #define SNAKE  5
  774. #define HORSE  6
  775. #define SHEEP  7
  776. #define MONKEY 8
  777. #define BIRD   9
  778. #define DOG    10
  779. #define BOAR   11
  780.  
  781. #define FIRST_MONTH RAT
  782. #define LAST_MONTH  BOAR
  783.  
  784. #define N_MONTHS (LAST_MONTH - FIRST_MONTH) + 1
  785.  
  786. /* text version of month names */
  787. char *Month_Name[N_MONTHS] = {
  788.     "Rat",
  789.     "Bull",
  790.     "Tiger",
  791.     "Hare",
  792.     "Dragon",
  793.     "Snake",
  794.     "Horse",
  795.     "Sheep",
  796.     "Monkey",
  797.     "Bird",
  798.     "Dog",
  799.     "Boar"
  800. };
  801.  
  802. /* table of days per month */
  803. UBYTE Day_Table[N_MONTHS] = {29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30};
  804.  
  805. void
  806. print_holiday(day,month)
  807.     UBYTE day;
  808.     MONTH_T month;
  809.     /* prints holidays that fall on a given day */
  810. {
  811.      if (day == 15)
  812.          printf(" Full Moon,");
  813.      if (day == Day_Table[month])
  814.          printf(" New Moon,");
  815.      switch (day) { 
  816.      case 1:
  817.      case 15 : printf(" Shinto,");
  818.           break;
  819.      case 8:
  820.      case 18 : printf(" Buddhist,");
  821.           break;
  822.      case 28 : printf(" Buddhist, Shinto,");
  823.           break;
  824.      }
  825.      switch (month) {
  826.      case RAT : 
  827.          if ((day >= 1) AND (day <= 6))
  828.              printf(" New Years (s)");
  829.          break;
  830.      case BULL :
  831.          switch (day) { 
  832.          case 1: case 2: case 4: case 5: case 6: case 7:
  833.              printf(" Equinox (b)");
  834.              break;
  835.          case 3: 
  836.              printf(" Setsuban (1st Day of Spring) (s)");
  837.              break;
  838.          }
  839.          break;
  840.      case TIGER :
  841.          if (day == 3) 
  842.              printf(" Doll Festival (c)");
  843.          break;
  844.      case HARE :
  845.          if (day == 8)
  846.              printf(" Buddha's Birthday (b)");
  847.          break;
  848.      case DRAGON :
  849.          if (day == 5) 
  850.              printf(" Boy's Day (c)");
  851.          break;
  852.      case SNAKE :
  853.          switch (day) {
  854.          case 1: case 2: case 3: case 4: case 5: case 6: case 7: 
  855.              printf(" Rice Planting Festival (p)");
  856.              break;
  857.          case 30 : 
  858.              printf(" All debts paid (p)");
  859.          }
  860.          break;
  861.      case HORSE :
  862.          switch (day) {
  863.          case 1 : 
  864.              printf(" Midyear (p)");
  865.              break;
  866.          case 7 : 
  867.              printf(" Tanabata (Star Festival) (c)");
  868.              break;
  869.          case 13: case 14: case 15: 
  870.              printf(" Bon Festival (for the dead) (b)");
  871.          }
  872.          break;
  873.      case SHEEP :
  874.          if ((day >= 1) AND (day <= 7)) 
  875.              printf(" Equinox (b)");
  876.          break;
  877.      case BIRD :
  878.          switch (day) { 
  879.          case 15 : 
  880.               printf(" Rice Harvest Festival (p)");
  881.               break;
  882.          case 20 : 
  883.               printf(" Festival of Ebishu (s)");
  884.          } 
  885.          break;
  886.      case DOG :
  887.          if (day == 8) 
  888.              printf(" Feast of the Bellows (s)");
  889.          break;
  890.      case BOAR :
  891.          if (day == 30) 
  892.              printf(" All debts paid (p)");
  893.      }
  894. }
  895.  
  896. //E*O*F japan.h//
  897.  
  898. echo x - mid_atlantic.h
  899. cat > "mid_atlantic.h" << '//E*O*F mid_atlantic.h//'
  900. /* Most of the info provided in this file could be found in an almanac. */
  901.  
  902. /* Ave_Temp       - the average temperature for each month */
  903. /* Weather_Table  - each entry in the table is the weather profile for each month */
  904. /*                  for a random 1-100 die roll. */
  905. /*  month profile - {precipitation, overcast, taifun/hurricane, clear} */        
  906. /*        example - {30,35,0,100} means that in this month a roll of : */
  907. /*                  1-30  = precipitation        */
  908. /*                 31-35  = overcast             */
  909. /*                 no chance of taifun/hurricane */
  910. /*                 36-100 = clear                */
  911.  
  912. /* Wind_Table     - is structured like the Weather_Table. */
  913. /*  month profile - {Calm, Light, Brisk, Blustery, Gale}  */
  914.  
  915. /* Precip_Table   - as above */
  916. /*  month profile - {None, Sprinkle, Shower, Heavy, Steady} */
  917.  
  918. /* Overcast_Table - {Heavy Fog, Light Fog, Mist, Cloudy} */
  919.  
  920. UBYTE Ave_Temp[N_MONTHS] = {20, 35, 45, 55, 65, 75, 85, 80, 65, 50, 35, 25};
  921.  
  922. UBYTE Weather_Table[N_MONTHS][N_WEATHER] = {
  923.     {30,35,0,100}, {25,35,0,100}, {20,30,0,100}, {35,50,0,100}, {25,40,0,100}, {15,25,0,100}, 
  924.     {10,15,0,100}, {10,15,0,100}, {15,25,0,100}, {25,35,0,100}, {25,40,0,100}, {30,45,0,100}
  925. };
  926.  
  927. UBYTE Wind_Table[N_MONTHS][N_WIND] = {
  928.     {60,80,90,100,0}, {50,70,85,100,0}, {40,60,75,95,100}, {60,85,95,100,0}, {70,90,100,0,0}, {80,90,100,0,0}, 
  929.     {80,100,0,0,0}, {80,100,0,0,0}, {60,80,95,100,0}, {40,65,85,95,100}, {40,60,80,90,100}, {60,80,90,95,100}
  930. };
  931.  
  932. UBYTE Precip_Table[N_MONTHS][N_PRECIP] = {
  933.     {0,40,70,80,100},
  934.     {0,50,80,95,100},
  935.     {0,60,80,100,0},
  936.     {0,40,70,90,100},
  937.     {0,50,80,100,0},
  938.     {0,60,90,100,0},
  939.     {0,80,95,100,0},
  940.     {0,80,95,100,0},
  941.     {0,60,80,90,100},
  942.     {0,50,80,90,100},
  943.     {0,40,70,85,100},
  944.     {0,40,70,80,100}
  945. };
  946.  
  947. UBYTE Overcast_Table[N_OVERCAST] = {10,20,70,100};
  948.  
  949.  
  950. //E*O*F mid_atlantic.h//
  951.  
  952. echo x - middle_earth.h
  953. cat > "middle_earth.h" << '//E*O*F middle_earth.h//'
  954. /* Copyright 1988 by Brett D. Slocum - 12/12/88 */
  955. /* All rights reserved */
  956. /* This is the calendar include file is for weather generation */
  957. /* It includes calendar and holiday information */
  958.  
  959. /* To create a new calendar file, 
  960.        1) define month names for use by MONTH_T type,
  961.        2) define FIRST_MONTH and LAST_MONTH,
  962.        3) define string array Month_Name with printable version of month,
  963.        4) define number of days per month array Day_Table,
  964.        5) add printf statements in print_holidays for holidays
  965. */
  966.  
  967. /* Month types */
  968. #define AFTERYULE   0
  969. #define SOLMATH     1
  970. #define RETHE       2
  971. #define ASTRON      3
  972. #define THRIMIDGE   4
  973. #define FORELITHE   5
  974. #define AFTERLITHE  6
  975. #define WEDMATH     7
  976. #define HALIMATH    8
  977. #define WINTERFILTH 9
  978. #define BLOTMATH    10
  979. #define FOREYULE    11
  980.  
  981. #define FIRST_MONTH AFTERYULE
  982. #define LAST_MONTH  FOREYULE
  983.  
  984. #define N_MONTHS (LAST_MONTH - FIRST_MONTH) + 1
  985.  
  986. char *Month_Name[N_MONTHS] = {
  987.     "Afteryule",
  988.     "Solmath",
  989.     "Rethe",
  990.     "Astron",
  991.     "Thrimidge",
  992.     "Forelithe",
  993.     "Afterlithe",
  994.     "Wedmath",
  995.     "Halimath",
  996.     "Winterfilth",
  997.     "Blotmath",
  998.     "Foreyule",
  999. };
  1000.  
  1001. UBYTE Day_Table[N_MONTHS] = {30, 30, 30, 30, 30, 31, 30, 30, 30, 30, 30, 34};
  1002.  
  1003. void
  1004. print_holiday(day, month)
  1005.     UBYTE day;
  1006.     MONTH_T month;
  1007. {
  1008.      switch (month) {
  1009.      case AFTERYULE:
  1010.          break;
  1011.      case SOLMATH:
  1012.          break;
  1013.      case RETHE:
  1014.          break;
  1015.      case ASTRON:
  1016.          break;
  1017.      case THRIMIDGE:
  1018.          break;
  1019.      case FORELITHE:
  1020.          if (day == 31) 
  1021.              printf(" Midsummer Day");
  1022.          break;
  1023.      case AFTERLITHE:
  1024.          break;
  1025.      case WEDMATH:
  1026.          break;
  1027.      case HALIMATH:
  1028.          break;
  1029.      case WINTERFILTH:
  1030.          break;
  1031.      case BLOTMATH:
  1032.          break;
  1033.      case FOREYULE:
  1034.          if ((day >= 31) AND (day <= 34))
  1035.              printf(" Yule");
  1036.          break;
  1037.      }
  1038. }
  1039.  
  1040. //E*O*F middle_earth.h//
  1041.  
  1042. echo x - n_atlantic.h
  1043. cat > "n_atlantic.h" << '//E*O*F n_atlantic.h//'
  1044. /* Most of the info provided in this file could be found in an almanac. */
  1045.  
  1046. /* Ave_Temp       - the average temperature for each month */
  1047. /* Weather_Table  - each entry in the table is the weather profile for each month */
  1048. /*                  for a random 1-100 die roll. */
  1049. /*  month profile - {precipitation, overcast, taifun/hurricane, clear} */        
  1050. /*        example - {30,35,0,100} means that in this month a roll of : */
  1051. /*                  1-30  = precipitation        */
  1052. /*                 31-35  = overcast             */
  1053. /*                 no chance of taifun/hurricane */
  1054. /*                 36-100 = clear                */
  1055.  
  1056. /* Wind_Table     - is structured like the Weather_Table. */
  1057. /*  month profile - {Calm, Light, Brisk, Blustery, Gale}  */
  1058.  
  1059. /* Precip_Table   - as above */
  1060. /*  month profile - {None, Sprinkle, Shower, Heavy, Steady} */
  1061.  
  1062. /* Overcast_Table - {Heavy Fog, Light Fog, Mist, Cloudy} */
  1063.  
  1064. UBYTE Ave_Temp[N_MONTHS] = {10, 15, 25, 40, 55, 70, 85, 80, 60, 35, 20, 15};
  1065.  
  1066. UBYTE Weather_Table[N_MONTHS][N_WEATHER] = {
  1067.     {30,40,0,100}, /* January or the first month in non-Gregorian calendar */
  1068.     {25,35,0,100}, /* February */
  1069.     {20,30,0,100}, /* March */
  1070.     {35,50,0,100}, /* April */
  1071.     {25,40,0,100}, /* May */
  1072.     {15,25,0,100}, /* June */
  1073.     {10,15,0,100}, /* July */
  1074.     {10,15,0,100}, /* August */
  1075.     {15,30,0,100}, /* September */
  1076.     {25,40,0,100}, /* October */
  1077.     {25,40,0,100}, /* November */
  1078.     {30,45,0,100}  /* December */
  1079. };
  1080.  
  1081. UBYTE Wind_Table[N_MONTHS][N_WIND] = {
  1082.     {60,80,90,100,0},    /* January */
  1083.     {50,70,85,100,0},    /* February */  
  1084.     {40,60,75,95,100},   /* March */     
  1085.     {60,85,95,100,0},    /* April */     
  1086.     {70,90,100,0,0},     /* May */       
  1087.     {80,90,100,0,0},     /* June */      
  1088.     {80,100,0,0,0},      /* July */      
  1089.     {80,100,0,0,0},      /* August */    
  1090.     {60,80,95,100,0},    /* September */ 
  1091.     {40,65,85,95,100},   /* October */   
  1092.     {40,60,80,90,100},   /* November */  
  1093.     {60,80,90,95,100}    /* December */  
  1094. };
  1095.  
  1096. UBYTE Precip_Table[N_MONTHS][N_PRECIP] = {
  1097.     {0,40,70,80,100},   /* January */  
  1098.     {0,50,80,95,100},   /* February */ 
  1099.     {0,60,80,100,0},    /* March */    
  1100.     {0,40,70,90,100},   /* April */    
  1101.     {0,50,80,100,0},    /* May */      
  1102.     {0,60,90,100,0},    /* June */     
  1103.     {0,80,95,100,0},    /* July */     
  1104.     {0,80,95,100,0},    /* August */   
  1105.     {0,60,80,90,100},   /* September */
  1106.     {0,50,80,90,100},   /* October */  
  1107.     {0,40,70,85,100},   /* November */ 
  1108.     {0,40,70,80,100}    /* December */ 
  1109. };
  1110.  
  1111. UBYTE Overcast_Table[N_OVERCAST] = {10,20,70,100};
  1112.  
  1113.  
  1114. //E*O*F n_atlantic.h//
  1115.  
  1116. echo x - n_pacific.h
  1117. cat > "n_pacific.h" << '//E*O*F n_pacific.h//'
  1118. /* Most of the info provided in this file could be found in an almanac. */
  1119.  
  1120. /* Ave_Temp       - the average temperature for each month */
  1121. /* Weather_Table  - each entry in the table is the weather profile for each month */
  1122. /*                  for a random 1-100 die roll. */
  1123. /*  month profile - {precipitation, overcast, taifun/hurricane, clear} */        
  1124. /*        example - {30,35,0,100} means that in this month a roll of : */
  1125. /*                  1-30  = precipitation        */
  1126. /*                 31-35  = overcast             */
  1127. /*                 no chance of taifun/hurricane */
  1128. /*                 36-100 = clear                */
  1129.  
  1130. /* Wind_Table     - is structured like the Weather_Table. */
  1131. /*  month profile - {Calm, Light, Brisk, Blustery, Gale}  */
  1132.  
  1133. /* Precip_Table   - as above */
  1134. /*  month profile - {None, Sprinkle, Shower, Heavy, Steady} */
  1135.  
  1136. /* Overcast_Table - {Heavy Fog, Light Fog, Mist, Cloudy} */
  1137.  
  1138. UBYTE Ave_Temp[N_MONTHS] = {40, 50, 60, 65, 70, 80, 85, 75, 65, 50, 40, 35};
  1139.  
  1140. UBYTE Weather_Table[N_MONTHS][N_WEATHER] = {
  1141.     {10,15,0,100}, {35,45,0,100}, {50,70,0,100}, {50,70,0,100}, {50,60,0,100}, {50,60,0,100}, 
  1142.     {35,40,0,100}, {40,45,55,100}, {40,45,55,100}, {10,15,17,100}, {10,15,0,100}, {10,15,0,100}
  1143. };
  1144.  
  1145. UBYTE Wind_Table[N_MONTHS][N_WIND] = {
  1146.     {40,70,90,100,0}, {40,70,90,100,0}, {40,70,90,100,0}, {40,70,90,100,0}, {40,70,90,100,0}, {40,70,90,100,0}, 
  1147.     {40,70,90,100,0}, {40,70,90,100,0}, {40,70,90,100,0}, {40,70,90,100,0}, {40,70,90,100,0}, {40,70,90,100,0}
  1148. };
  1149.  
  1150. UBYTE Precip_Table[N_MONTHS][N_PRECIP] = {
  1151.     {0,40,70,80,100},
  1152.     {0,50,80,95,100},
  1153.     {0,60,80,100,0},
  1154.     {0,40,70,90,100},
  1155.     {0,50,80,100,0},
  1156.     {0,60,90,100,0},
  1157.     {0,80,95,100,0},
  1158.     {0,80,95,100,0},
  1159.     {0,60,80,90,100},
  1160.     {0,50,80,90,100},
  1161.     {0,40,70,85,100},
  1162.     {0,40,70,80,100}
  1163. };
  1164.  
  1165. UBYTE Overcast_Table[N_OVERCAST] = {10,20,70,100};
  1166.  
  1167.  
  1168. //E*O*F n_pacific.h//
  1169.  
  1170. echo x - s_atlantic.h
  1171. cat > "s_atlantic.h" << '//E*O*F s_atlantic.h//'
  1172. /* Most of the info provided in this file could be found in an almanac. */
  1173.  
  1174. /* Ave_Temp       - the average temperature for each month */
  1175. /* Weather_Table  - each entry in the table is the weather profile for each month */
  1176. /*                  for a random 1-100 die roll. */
  1177. /*  month profile - {precipitation, overcast, taifun/hurricane, clear} */        
  1178. /*        example - {30,35,0,100} means that in this month a roll of : */
  1179. /*                  1-30  = precipitation        */
  1180. /*                 31-35  = overcast             */
  1181. /*                 no chance of taifun/hurricane */
  1182. /*                 36-100 = clear                */
  1183.  
  1184. /* Wind_Table     - is structured like the Weather_Table. */
  1185. /*  month profile - {Calm, Light, Brisk, Blustery, Gale}  */
  1186.  
  1187. /* Precip_Table   - as above */
  1188. /*  month profile - {None, Sprinkle, Shower, Heavy, Steady} */
  1189.  
  1190. /* Overcast_Table - {Heavy Fog, Light Fog, Mist, Cloudy} */
  1191.  
  1192. UBYTE Ave_Temp[N_MONTHS] = {50, 60, 65, 70, 75, 80, 85, 80, 75, 65, 55, 50};
  1193.  
  1194. UBYTE Weather_Table[N_MONTHS][N_WEATHER] = {
  1195.     {30,35,0,100}, {25,35,0,100}, {20,30,0,100}, {35,50,0,100}, {25,40,0,100}, {15,25,0,100}, 
  1196.     {10,15,0,100}, {10,15,0,100}, {15,25,0,100}, {25,35,0,100}, {25,40,0,100}, {30,45,0,100}
  1197. };
  1198.  
  1199. UBYTE Wind_Table[N_MONTHS][N_WIND] = {
  1200.     {60,80,90,100,0}, {50,70,85,100,0}, {40,60,75,99,100}, {60,85,95,100,0}, {70,90,100,0,0}, {80,90,100,0,0}, 
  1201.     {80,100,0,0,0}, {80,100,0,0,0}, {60,80,95,100,0}, {40,65,85,97,100}, {40,60,80,95,100}, {60,80,90,100,0}
  1202. };
  1203.  
  1204. UBYTE Precip_Table[N_MONTHS][N_PRECIP] = {
  1205.     {0,40,70,80,100},
  1206.     {0,50,80,95,100},
  1207.     {0,60,80,100,0},
  1208.     {0,40,70,90,100},
  1209.     {0,50,80,100,0},
  1210.     {0,60,90,100,0},
  1211.     {0,80,95,100,0},
  1212.     {0,80,95,100,0},
  1213.     {0,60,80,90,100},
  1214.     {0,50,80,90,100},
  1215.     {0,40,70,85,100},
  1216.     {0,40,70,80,100}
  1217. };
  1218.  
  1219. UBYTE Overcast_Table[N_OVERCAST] = {10,20,70,100};
  1220.  
  1221.  
  1222. //E*O*F s_atlantic.h//
  1223.  
  1224. echo x - weather.h
  1225. cat > "weather.h" << '//E*O*F weather.h//'
  1226. #ifdef SYSV
  1227. #define srandom srand48
  1228. #define random lrand48
  1229. #endif
  1230.  
  1231. #define DIE(n) ((int)(random() % (unsigned)n)+1)
  1232. #define MIN(a,b) ((a<b) ? a : b)
  1233. #define MAX(a,b) ((a>b) ? a : b)
  1234.  
  1235. #define AND &&
  1236. #define OR  ||
  1237.  
  1238. typedef unsigned char UBYTE;
  1239. typedef UBYTE BOOL;
  1240.  
  1241. typedef short STAT_T;
  1242. typedef short WEATHER_T;
  1243. typedef short OVERCAST_T;
  1244. typedef short WIND_T;
  1245. typedef short TEMP_T;
  1246. typedef short PRECIP_T;
  1247.  
  1248. /* Boolean types */
  1249. #define FALSE 0
  1250. #define TRUE  1
  1251.  
  1252. /* Statistics types */
  1253. #define N_STAT  3
  1254. #define LOW     0
  1255. #define AVERAGE 1
  1256. #define HIGH    2
  1257.  
  1258. /* Weather types */
  1259. #define N_WEATHER     4
  1260. #define PRECIPITATION 0
  1261. #define OVERCAST      1
  1262. #define TAIFUN        2
  1263. #define CLEAR         3
  1264.  
  1265. char *Weather_Name[N_WEATHER] = {
  1266.     "Precipitation",
  1267.     "Overcast",
  1268.     "Typhoon",
  1269.     "Clear"
  1270. };
  1271.  
  1272. /* Overcast types */
  1273. #define N_OVERCAST 4
  1274. #define HEAVY_FOG  0
  1275. #define LIGHT_FOG  1
  1276. #define MIST       2
  1277. #define CLOUDY     3
  1278.  
  1279. char *Overcast_Name[N_OVERCAST] = {
  1280.     "Heavy Fog",
  1281.     "Light Fog",
  1282.     "Mist",
  1283.     "Cloudy",
  1284. };
  1285.  
  1286. /* Wind types */
  1287. #define N_WIND   5
  1288. #define CALM     0
  1289. #define LIGHT    1
  1290. #define BRISK    2
  1291. #define BLUSTERY 3
  1292. #define GALE     4
  1293.  
  1294. char *Wind_Name[N_WIND] = {
  1295.     "Calm",
  1296.     "Light",
  1297.     "Brisk",
  1298.     "Blustery",
  1299.     "Gale",
  1300. };
  1301.  
  1302. /* Temperature types */
  1303. #define N_TEMP 5
  1304. #define COLD   0
  1305. #define CHILLY 1
  1306. #define FAIR   2
  1307. #define WARM   3
  1308. #define HOT    4
  1309.  
  1310. char *Temp_Name[N_TEMP] = {
  1311.     "Cold",
  1312.     "Chilly",
  1313.     "Fair",
  1314.     "Warm",
  1315.     "Hot",
  1316. };
  1317.  
  1318. /* Precipitation types */
  1319. #define N_PRECIP 5
  1320. #define NONE     0
  1321. #define SPRINKLE 1
  1322. #define SHOWER   2
  1323. #define HEAVY    3
  1324. #define STEADY   4
  1325.  
  1326. char *Precip_Name[N_PRECIP] = {
  1327.     "None",
  1328.     "Sprinkle",
  1329.     "Shower",
  1330.     "Heavy",
  1331.     "Steady",
  1332. };
  1333.  
  1334. UBYTE Temp_Variation[9] = {1, 5, 13, 25, 75, 87, 95, 99, 100};
  1335. //E*O*F weather.h//
  1336.  
  1337. exit 0
  1338.  
  1339.