2 * Empire - A multi-player, client/server Internet based war game.
3 * Copyright (C) 1986-2014, Dave Pare, Jeff Bailey, Thomas Ruschak,
4 * Ken Stevens, Steve McClure, Markus Armbruster
6 * Empire 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 3 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, see <http://www.gnu.org/licenses/>.
21 * See files README, COPYING and CREDITS in the root of the source
22 * tree for related information and legal notices. It is expected
23 * that future projects/authors will amend these files as needed.
27 * bp.c: The `build pointer' (bp) map
29 * Known contributors to this file:
30 * Ville Virrankoski, 1996
31 * Markus Armbruster, 2007
35 * Some commands call update functions to simulate the update.
36 * Naturally, these functions must not change game state then.
37 * Instead, they track values separate data structure, namely the bp
46 /* Item types we want to track. */
48 BP_NONE = -1, /* not tracked */
49 BP_MILIT, BP_LCM, BP_HCM,
54 * Stuff to track for a sector.
55 * A bp map is an array of these.
58 short bp_item[BP_MAX + 1];
62 /* Map i_type to enum bp_item_idx. */
63 static enum bp_item_idx bud_key[I_MAX + 1] = {
64 BP_NONE, BP_MILIT, BP_NONE, BP_NONE,
65 BP_NONE, BP_NONE, BP_NONE, BP_NONE, BP_NONE, BP_NONE,
66 BP_LCM, BP_HCM, BP_NONE, BP_NONE
69 /* Return pointer to the element of BP belonging to SP. */
71 bp_ref(struct bp *bp, struct sctstr *sp)
73 return &bp[sp->sct_uid];
77 * Return the item value tracked in BP for sector SP's item COMM.
78 * COMM must be a tracked item type.
81 bp_get_item(struct bp *bp, struct sctstr *sp, i_type comm)
83 enum bp_item_idx idx = bud_key[comm];
85 if (CANT_HAPPEN(idx < 0))
86 return sp->sct_item[comm];
87 return bp_ref(bp, sp)->bp_item[idx];
90 /* Set the item value tracked in BP for sector SP's item COMM. */
92 bp_put_item(struct bp *bp, struct sctstr *sp, i_type comm, int amount)
94 enum bp_item_idx idx = bud_key[comm];
97 bp_ref(bp, sp)->bp_item[idx] = amount;
100 /* Set the item values tracked in BP for sector SP from VEC. */
102 bp_put_items(struct bp *bp, struct sctstr *sp, short *vec)
104 enum bp_item_idx idx;
105 struct bp *p = bp_ref(bp, sp);
108 for (i = I_NONE + 1; i <= I_MAX; i++) {
111 p->bp_item[idx] = vec[i];
115 /* Return avail tracked in BP for sector SP. */
117 bp_get_avail(struct bp *bp, struct sctstr *sp)
119 return bp_ref(bp, sp)->bp_avail;
122 /* Set avail tracked in BP for sector SP. */
124 bp_put_avail(struct bp *bp, struct sctstr *sp, int amount)
126 bp_ref(bp, sp)->bp_avail = amount;
129 /* Set the values tracked in BP for sector SP to the values in SP. */
131 bp_set_from_sect(struct bp *bp, struct sctstr *sp)
133 bp_put_items(bp, sp, sp->sct_item);
134 bp_put_avail(bp, sp, sp->sct_avail);
138 * Return a new bp map.
139 * Caller should pass it to free() when done with it.
144 return calloc(WORLD_SZ(), sizeof(struct bp));