2 * Empire - A multi-player, client/server Internet based war game.
3 * Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
4 * Ken Stevens, Steve McClure
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.
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.
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
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.
28 * vlist.c: manage variable lists
30 * Known contributors to this file:
44 static int freeslot(u_char *vec, register u_char *end);
47 vl_find(register int vtype, u_char *typevec, u_short *amtvec, int nelem)
51 register u_char *endp;
53 if (vtype < 0 || vtype > V_MAX)
58 for ( ; vp < endp; vp++, ap++) {
66 vl_set(register int vtype, u_int amt, u_char *typevec, u_short *amtvec, u_char *nvp, int max)
69 register u_char *endp;
73 if (vtype < 0 || vtype > V_MAX)
76 logerror("vl_set: bad amt %d (%x), vtype %d\n", (int)amt, amt,
83 for ( ; vp < endp; vp++, ap++) {
89 /* deleting, but not present */
93 if (isdel(vtype) || isdist(vtype))
95 /* replace any del or dst entries */
96 if ((n = freeslot(typevec, endp)) < 0)
108 /* altering; just change value */
114 /* if not last element, copy last to current */
123 vl_damage(register int pct, register u_char *typevec, register u_short *amtvec, register int nelem)
127 extern double people_damage;
133 for (i=0; i<nelem; i++) {
134 if (!isitem(typevec[i]))
136 if (opt_SUPER_BARS && typevec[i] == V_BAR)
138 lose = roundavg((double)amtvec[i] * pct * 0.01);
139 if (typevec[i] == V_CIVIL ||
140 typevec[i] == V_MILIT ||
142 lose = ldround(people_damage * lose, 1);
143 if ((amtvec[i] -= lose) + 1 == 0) {
147 typevec[i] = typevec[nelem];
148 amtvec[i] = amtvec[nelem];
156 * extract all "mask" items from the variable list
157 * caller must pass a pointer to an aray of I_MAX+1,
158 * or else bad things will happen.
161 vl_getvec(register u_char *src_type, register u_short *src_amt, register int src_nv, register int class, register int *dst_amt)
167 for (n=0; n<I_MAX+1; n++)
169 for (count=0, n=0; n<src_nv; n++) {
170 if ((src_type[n] & VT_TYPE) != class)
172 item = src_type[n] & ~VT_TYPE;
174 logerror("vl_getvec: bad I-type %d (vtype %d)\n",
178 dst_amt[item] = src_amt[n];
185 * Copy the vec into the variable list. All items zero in
186 * the vec will be deleted from the vlist, and all items
187 * present in the vec will be added to the vlist.
190 vl_setvec(register u_char *type, register u_short *amt, u_char *nvp, int max, register int class, register int *vec)
200 if ((type[n] & VT_TYPE) != class) {
204 /* find non-zero vec entry to overwrite current slot */
205 for ( ; vec_n <= I_MAX; vec_n++)
209 /* no more elements left; delete */
212 /* copy last entry over current entry */
217 /* use new (unused) entry */
218 type[n] = vec_n | class;
225 if (n >= nv && vec_n > I_MAX)
227 /* free slots at end; copy rest of vec into the vlist */
228 for ( ; vec_n <= I_MAX && nv < max; vec_n++) {
231 type[nv] = vec_n | class;
232 amt[nv] = vec[vec_n];
236 if (vec_n <= I_MAX && (class == VT_ITEM || class == VT_COND)) {
238 * still stuff left; make free slots out of deliveries
239 * and distributes and stuff 'em in (only for item or cond)
241 for ( ; vec_n <= I_MAX; vec_n++) {
244 if ((n = freeslot(type, &type[max])) < 0) {
245 logerror("vl_setvec: no free slots left\n");
248 logerror("vl_setvec: replacing type %d amt %d\n",
250 type[n] = vec_n | class;
255 /* checking for overflow */
256 while (vec_n <= I_MAX) {
260 if (vec_n <= I_MAX) {
261 logerror("vl_setvec: no space for i-type #%d (%d)\n",
270 * make a free slot; deliveries and distributions
271 * are fair game for us.
275 freeslot(u_char *vec, register u_char *end)
279 for (vp=vec; vp < end; vp++) {
280 if (isdel(*vp) || isdist(*vp))