2 * Empire - A multi-player, client/server Internet based war game.
3 * Copyright (C) 1986-2016, 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-2016
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
70 * Return the item value tracked in @bp for sector @sp's item @comm.
71 * @comm must be a tracked item type.
74 bp_get_item(struct bp *bp, struct sctstr *sp, i_type comm)
76 enum bp_item_idx idx = bud_key[comm];
78 if (CANT_HAPPEN(idx < 0))
79 return sp->sct_item[comm];
80 return bp[sp->sct_uid].bp_item[idx];
84 * Set item value tracked in @bp for sector @sp's item @comm to @amount.
87 bp_put_item(struct bp *bp, struct sctstr *sp, i_type comm, int amount)
89 enum bp_item_idx idx = bud_key[comm];
92 bp[sp->sct_uid].bp_item[idx] = amount;
95 /* Set the item values tracked in @bp from sector @sp. */
97 bp_put_items(struct bp *bp, struct sctstr *sp)
102 for (i = I_NONE + 1; i <= I_MAX; i++) {
105 bp[sp->sct_uid].bp_item[idx] = sp->sct_item[i];
109 /* Return avail tracked in @bp for sector @sp. */
111 bp_get_avail(struct bp *bp, struct sctstr *sp)
113 return bp[sp->sct_uid].bp_avail;
116 /* Set avail tracked in @bp for sector @sp to @amount. */
118 bp_put_avail(struct bp *bp, struct sctstr *sp, int amount)
120 bp[sp->sct_uid].bp_avail = amount;
123 /* Set the values tracked in @bp for sector @sp to the values in @sp. */
125 bp_set_from_sect(struct bp *bp, struct sctstr *sp)
127 bp_put_items(bp, sp);
128 bp_put_avail(bp, sp, sp->sct_avail);
132 * Return a new bp map.
133 * Caller should pass it to free() when done with it.
138 return calloc(WORLD_SZ(), sizeof(struct bp));