Documentation cleanup.
[vms-empire.git] / data.c
1 /* %W% %G% %U% - (c) Copyright 1987, 1988 Chuck Simmons */
2
3 /*
4  *    Copyright (C) 1987, 1988 Chuck Simmons
5  * 
6  * See the file COPYING, distributed with empire, for restriction
7  * and warranty information.
8  */
9
10 /*
11 Static data.
12
13 One of our hopes is that changing the types of pieces that
14 exist in the game is mostly a matter of modifying this file.
15 However, see also the help routine, empire.h, and empire.6.
16 */
17
18 #include "empire.h"
19
20 /*
21 Piece attributes.  Notice that the Transport is allowed only one hit.
22 In the previous version of this game, the user could easily win simply
23 by building armies and troop transports.  We attempt to alleviate this
24 problem by making transports far more fragile.  We have also increased
25 the range of a fighter from 20 to 30 so that fighters will be somewhat
26 more useful.
27 */
28
29 piece_attr_t piece_attr[] = {
30         {'A', /* character for printing piece */
31          "army", /* name of piece */ 
32          "army", /* nickname */
33          "an army", /* name with preceding article */
34          "armies", /* plural */
35          "+", /* terrain */
36          5, /* units to build */
37          1, /* strength */
38          1, /* max hits */
39          1, /* movement */
40          0, /* capacity */
41          INFINITY}, /* range */
42
43         /*
44          For fighters, the range is set to an even multiple of the speed.
45          This allows user to move fighter, say, two turns out and two
46          turns back.
47         */
48          
49         {'F', "fighter", "fighter", "a fighter", "fighters",
50                 ".+", 10, 1,  1, 8, 0, 32},
51
52         {'P', "patrol boat", "patrol", "a patrol boat", "patrol boats",
53                 ".",  15, 1,  1, 4, 0, INFINITY},
54                 
55         {'D', "destroyer", "destroyer", "a destroyer", "destroyers",
56                 ".",  20, 1,  3, 2, 0, INFINITY},
57
58         {'S', "submarine", "submarine", "a submarine", "submarines",
59                 ".",  20, 3,  2, 2, 0, INFINITY},
60
61         {'T', "troop transport", "transport", "a troop transport", "troop transports",
62                 ".",  30, 1,  1, 2, 6, INFINITY},
63
64         {'C', "aircraft carrier", "carrier", "an aircraft carrier", "aircraft carriers",
65                 ".",  30, 1,  8, 2, 8, INFINITY},
66
67         {'B', "battleship", "battleship", "a battleship", "battleships",
68                 ".",  40, 2, 10, 2, 0, INFINITY},
69                 
70         {'Z', "satellite", "satellite", "a satellite", "satellites",
71                 ".+", 50, 0, 1, 10, 0, 500}
72 };
73
74 /* Direction offsets. */
75
76 int dir_offset [] = {-MAP_WIDTH, /* north */
77                      -MAP_WIDTH+1, /* northeast */
78                      1, /* east */
79                      MAP_WIDTH+1, /* southeast */
80                      MAP_WIDTH, /* south */
81                      MAP_WIDTH-1, /* southwest */
82                      -1, /* west */
83                      -MAP_WIDTH-1}; /* northwest */
84
85 /* Names of movement functions. */
86
87 char *func_name[] = {"none", "random", "sentry", "fill", "land",
88                         "explore", "load", "attack", "load", "repair",
89                         "transport",
90                         "W", "E", "D", "C", "X", "Z", "A", "Q"};
91
92 /* The order in which pieces should be moved. */
93 int move_order[] = {SATELLITE, TRANSPORT, CARRIER, BATTLESHIP, 
94                     PATROL, SUBMARINE, DESTROYER, ARMY, FIGHTER};
95
96 /* types of pieces, in declared order */
97 char type_chars[] = "AFPDSTCBZ";
98
99 /* Lists of attackable objects if object is adjacent to moving piece. */
100
101 char tt_attack[] = "T";
102 char army_attack[] = "O*TACFBSDP";
103 char fighter_attack[] = "TCFBSDPA";
104 char ship_attack[] = "TCBSDP";
105
106 /* Define various types of objectives */
107
108 move_info_t tt_explore = { /* water objectives */
109         COMP, /* home city */
110         " ", /* objectives */
111         {1} /* weights */
112 };
113 move_info_t tt_load = { /* land objectives */
114         COMP, "$",           {1}
115 };
116
117 /*
118 Rationale for 'tt_unload':
119
120      Any continent with four or more cities is extremely attractive,
121 and we should grab it quickly.  A continent with three cities is
122 fairly attractive, but we are willing to go slightly out of our
123 way to find a better continent.  Similarily for two cities on a
124 continent.  At one city on a continent, things are looking fairly
125 unattractive, and we are willing to go quite a bit out of our way
126 to find a better continent.
127
128      Cities marked with a '0' are on continents where we already
129 have cities, and these cities will likely fall to our armies anyway,
130 so we don't need to dump armies on them unless everything else is
131 real far away.  We would prefer to use unloading transports for
132 taking cities instead of exploring, but we are willing to explore
133 if interesting cities are too far away.
134
135      It has been suggested that continents containing one city
136 are not interesting.  Unfortunately, most of the time what the
137 computer sees is a single city on a continent next to lots of
138 unexplored territory.  So it dumps an army on the continent to
139 explore the continent and the army ends up attacking the city
140 anyway.  So, we have decided we might as well send the tt to
141 the city in the first place and increase the speed with which
142 the computer unloads its tts.
143 */
144
145 move_info_t tt_unload     = {
146         COMP, "9876543210 ", {1, 1, 1, 1, 1, 1, 11, 21, 41, 101, 61}
147 };
148
149 /*
150  '$' represents loading tt must be first
151  'x' represents tt producing city
152  '0' represnets explorable territory
153 */
154 move_info_t army_fight    = { /* land objectives */
155         COMP, "O*TA ",       {1, 1, 1, 1, 11}
156 };
157 move_info_t army_load     = { /* water objectives */
158         COMP, "$x",          {1, W_TT_BUILD}
159 };
160
161 move_info_t fighter_fight = {
162         COMP, "TCFBSDPA ",   {1, 1, 5, 5, 5, 5, 5, 5, 9}
163 };
164 move_info_t ship_fight    = {
165         COMP, "TCBSDP ",     {1, 1, 3, 3, 3, 3, 21}
166 };
167 move_info_t ship_repair   = {
168         COMP, "X",           {1}
169 };
170
171 move_info_t user_army        = {
172         USER, " ",   {1}
173 };
174 move_info_t user_army_attack = {
175         USER, "*Xa ", {1, 1, 1, 12}
176 };
177 move_info_t user_fighter     = {
178         USER, " ",   {1}
179 };
180 move_info_t user_ship        = {
181         USER, " ",   {1}
182 };
183 move_info_t user_ship_repair = {
184         USER, "O",   {1}
185 };
186
187 /*
188 Various help texts.
189 */
190
191 char *help_cmd[] = {
192         "COMMAND MODE",
193         "Auto:     enter automove mode",
194         "City:     give city to computer",
195         "Date:     print round",
196         "Examine:  examine enemy map",
197         "File:     print map to file",
198         "Give:     give move to computer",
199         "Help:     display this text",
200         "J:        enter edit mode",
201         "Move:     make a move",
202         "N:        give N moves to computer",
203         "Print:    print a sector",
204         "Quit:     quit game",
205         "Restore:  restore game",
206         "Save:     save game",
207         "Trace:    save movie in empmovie.dat",
208         "Watch:    watch movie",
209         "Zoom:     display compressed map",
210         "<ctrl-L>: redraw screen"
211 };
212 int cmd_lines = 19;
213
214 char *help_user[] = {
215         "USER MODE",
216         "QWE",
217         "A D       movement directions",
218         "ZXC",
219         "<space>:  sit",
220         "Build:    change city production",
221         "Fill:     set func to fill",
222         "Grope:    set func to explore",
223         "Help:     display this text",
224         "I <dir>:  set func to dir",
225         "J:        enter edit mode",
226         "Kill:     set func to awake",
227         "Land:     set func to land",
228         "Out:      leave automove mode",
229         "Print:    redraw screen",
230         "Random:   set func to random",
231         "Sentry:   set func to sentry",
232         "Upgrade:  set func to repair",
233         "V <piece> <func>:  set city func",
234         "Y:        set func to attack",
235         "<ctrl-L>: redraw screen",
236         "?:        describe piece"
237 };
238 int user_lines = 22;
239         
240 char *help_edit[] = {
241         "EDIT MODE",
242         "QWE",
243         "A D       movement directions",
244         "ZXC",
245         "Build:    change city production",
246         "Fill:     set func to fill",
247         "Grope:    set func to explore",
248         "Help:     display this text",
249         "I <dir>:  set func to dir",
250         "Kill:     set func to awake",
251         "Land:     set func to land",
252         "Mark:     mark piece",
253         "N:        set dest for marked piece",
254         "Out:      exit edit mode",
255         "Print:    print sector",
256         "Random:   set func to random",
257         "Sentry:   set func to sentry",
258         "Upgrade:  set func to repair",
259         "V <piece> <func>:  set city func",
260         "Y:        set func to attack",
261         "<ctrl-L>: redraw screen",
262         "?:        describe piece"
263 };
264 int edit_lines = 22;