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