]> git.pond.sub.org Git - empserver/blob - include/ship.h
Document struct equivalence hack and implications of EFF_XY and
[empserver] / include / ship.h
1 /*
2  *  Empire - A multi-player, client/server Internet based war game.
3  *  Copyright (C) 1986-2005, Dave Pare, Jeff Bailey, Thomas Ruschak,
4  *                           Ken Stevens, Steve McClure
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  *  ---
21  *
22  *  See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
23  *  related information and legal notices. It is expected that any future
24  *  projects/authors will amend these files as needed.
25  *
26  *  ---
27  *
28  *  ship.h: Definitions for things having to do with ships
29  * 
30  *  Known contributors to this file:
31  *     Dave Pare
32  *     Thomas Rushack, 1992
33  *     Ken Stevens, 1995
34  *     Steve McClure, 1998
35  */
36
37 #ifndef _SHIP_H_
38 #define _SHIP_H_
39
40 #include "item.h"
41 #include "queue.h"
42 #include "misc.h"
43 #include "retreat.h"
44
45 #define SHIP_MINEFF     20
46
47 /* bit masks for the autonav mode flags */
48
49 #define AN_SAILDIR bit(1)
50 #define AN_AUTONAV bit(2)
51 #define AN_STANDBY bit(3)
52 #define AN_LOADING bit(4)
53 #define AN_SCUTTLE bit(5)       /* Auto-scuttle of trade ships */
54
55 /* TMAX is the number of cargo holds a ship use in the autonav code. */
56 #define TMAX 6
57
58
59 #define MAXSHPPATH      28
60 #define MAXSHPNAMLEN    24
61
62 struct shpstr {
63     /* initial part must match struct genitem */
64     short ef_type;
65     natid shp_own;              /* owner's country num */
66     short shp_uid;              /* unit id (ship #) */
67     coord shp_x;                /* x location in abs coords */
68     coord shp_y;                /* y location in abs coords */
69     s_char shp_type;            /* index in mchr[] */
70     s_char shp_effic;           /* 0% to 100% */
71     s_char shp_mobil;           /* mobility units */
72     short shp_tech;             /* tech level ship was built at */
73     s_char shp_fleet;           /* group membership */
74     coord shp_opx, shp_opy;     /* Op sector coords */
75     short shp_mission;          /* mission code */
76     short shp_radius;           /* mission radius */
77     /* end of part matching struct genitem */
78     u_char shp_nplane;          /* number of planes on board */
79     u_char shp_nland;           /* number of land units on board */
80     short shp_armor;
81     short shp_speed;
82     short shp_visib;
83     short shp_frnge;
84     short shp_glim;
85     coord shp_destx[2];         /* location for ship destination */
86     coord shp_desty[2];
87     i_type shp_tstart[TMAX];    /* what goods to pick up at start point */
88     i_type shp_tend[TMAX];      /* what goods to pick up at end point   */
89     short shp_lstart[TMAX];     /* How much do we pick up at the start  */
90     short shp_lend[TMAX];       /* How much do we pick up at the end    */
91     u_char shp_autonav;         /* autonavigation flags */
92     short shp_item[I_MAX+1];    /* amount of items on board */
93     short shp_pstage;           /* plague stage */
94     short shp_ptime;            /* how many etus remain in this stage */
95     time_t shp_access;          /* Last time mob was updated (MOB_ACCESS) */
96     time_t shp_timestamp;       /* Last time this ship was touched. */
97     u_char shp_mobquota;        /* mobility quota */
98     s_char shp_path[MAXSHPPATH];
99     short shp_follow;
100     s_char shp_name[MAXSHPNAMLEN];      /* name set with the "name" command */
101     u_char shp_fuel;            /* How much fuel do we have */
102     u_char shp_nchoppers;       /* How many choppers on board? */
103     u_char shp_nxlight;         /* How many xlight planes on board? */
104     coord shp_orig_x;
105     coord shp_orig_y;           /* Where we were built */
106     natid shp_orig_own;         /* Who built us */
107     int shp_rflags;             /* When do I retreat? */
108     s_char shp_rpath[RET_LEN];  /* retreat path */
109 };
110
111 struct fltelemstr {
112     int num;
113     int own;
114     double mobil, mobcost;
115     struct fltelemstr *next;
116 };
117
118 struct fltheadstr {
119     int leader;
120     s_char real_q;
121 /* defines for the real_q member */
122 #define LEADER_VIRTUAL  0
123 #define LEADER_REAL     1
124 #define LEADER_WRONGSECT        2
125     coord x, y;
126     natid own;
127     unsigned maxmoves;
128     struct fltelemstr *head;
129     struct fltheadstr *next;
130 };
131
132 struct mchrstr {
133     u_short m_item[I_MAX+1];    /* load limit */
134     int m_lcm;                  /* units of lcm to build */
135     int m_hcm;                  /* units of hcm to build */
136     int m_armor;                /* how well armored it is */
137     int m_speed;                /* how fast it can go */
138     int m_visib;                /* how well it can be seen */
139     int m_vrnge;                /* how well it can see */
140     int m_frnge;                /* how far it can fire */
141     int m_glim;                 /* how many guns it can fire */
142     u_char m_nxlight;           /* maximum number of xlight planes */
143     u_char m_nchoppers;         /* maximum number of choppers */
144     u_char m_fuelc;             /* fuel capacity */
145     u_char m_fuelu;             /* fuel used per 10 mob */
146     char *m_name;               /* full name of type of ship */
147     int m_tech;                 /* tech required to build */
148     int m_cost;                 /* how much it costs to build */
149     long m_flags;               /* what special things can this ship do */
150     u_char m_nplanes;           /* maximum number of planes this ship holds */
151     u_char m_nland;             /* maximum number of units this ship holds */
152 };
153
154 #define M_FOOD          bit(0)  /* catch that fish! */
155 #define M_TORP          bit(1)  /* fire torpedoes */
156 #define M_DCH           bit(2)  /* drop depth charges on subs */
157 #define M_FLY           bit(3)  /* launch and recover planes */
158 /* M_MSL will be automatically set in init_global() if m_nplanes > 0
159    and M_FLY is not set */
160 #define M_MSL           bit(4)  /* launch missiles */
161 #define M_OIL           bit(5)  /* drill for oil */
162 #define M_SONAR         bit(6)  /* locate submarines */
163 #define M_MINE          bit(7)  /* drop mines */
164 #define M_SWEEP         bit(8)  /* clean up the mines */
165 #define M_SUB           bit(9)  /* a submarine */
166 #define M_SPY           bit(10) /* gather intelligence info */
167 #define M_LAND          bit(11) /* allows full landing ability */
168 #define M_SUBT          bit(12) /* allows torping of other subs */
169 #define M_TRADE         bit(13) /* is a trade ship */
170 #define M_SEMILAND      bit(14) /* can land 1/4 */
171 /* M_XLIGHT will be automatically set in init_global() if m_nxlight > 0 */
172 #define M_XLIGHT        bit(15) /* can hold xlight planes */
173 /* M_CHOPPER will be automatically set in init_global() if m_nchoppers > 0 */
174 #define M_CHOPPER       bit(16) /* can hold choppers */
175 #define M_OILER         bit(17) /* can re-fuel ships */
176 #define M_SUPPLY        bit(18) /* Can supply units/sects/ships */
177 /* M_UNIT will be automatically set in init_global() if m_nland > 0 */
178 #define M_UNIT          bit(19) /* Can carry units */
179 #define M_ANTIMISSILE   bit(20) /* Shoot down missile */
180
181 #define getship(n, p) \
182         ef_read(EF_SHIP, n, p)
183 #define putship(n, p) \
184         ef_write(EF_SHIP, n, p)
185 #define getshipp(n) \
186         (struct shpstr *) ef_ptr(EF_SHIP, n)
187
188 extern struct mchrstr mchr[];
189 extern int shp_maxno;
190
191 struct mlist {
192     struct emp_qelem queue;     /* list of ships */
193     struct mchrstr *mcp;        /* pointer to desc of ship */
194     struct shpstr ship;         /* struct ship */
195     double mobil;               /* how much mobility the ship has left */
196 };
197
198 #define SHP_DEF(b, t) (t ? (b * (logx((double)t, (double)40.0) < 1.0 ? 1.0 : \
199                              logx((double)t, (double)40.0))) : b)
200 #define SHP_SPD(b, t) (t ? (b * (logx((double)t, (double)35.0) < 1.0 ? 1.0 : \
201                              logx((double)t, (double)35.0))) : b)
202 #define SHP_VIS(b, t) (b * (1 - (sqrt((double)t) / 50)))
203 #define SHP_RNG(b, t) (t ? (b * (logx((double)t, (double)35.0) < 1.0 ? 1.0 : \
204                              logx((double)t, (double)35.0))) : b)
205 #define SHP_FIR(b, t) (t ? (b * (logx((double)t, (double)60.0) < 1.0 ? 1.0 : \
206                              logx((double)t, (double)60.0))) : b)
207
208 /* Work required for building 100% */
209 #define SHP_BLD_WORK(lcm, hcm) (20 + (lcm) + 2 * (hcm))
210
211  /* return codes from shp_check_nav */
212 #define CN_NAVIGABLE    (0)
213 #define CN_LANDLOCKED   (1)
214 #define CN_CONSTRUCTION (2)
215 #define CN_ERROR        (-1)
216
217 enum {
218     SHP_AIROPS_EFF = 50,        /* min. efficiency for air ops */
219     SHP_TORP_SHELLS = 3         /* number of shells used by a torpedo */
220 };
221
222 #endif /* _SHIP_H_ */