2 * Empire - A multi-player, client/server Internet based war game.
3 * Copyright (C) 1986-2021, 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 * control.c: Military control functions
29 * Known contributors to this file:
31 * Markus Armbruster, 2014-2016
39 #include "prototypes.h"
44 * Return strength of security detail in @sp.
45 * Store sum of efficiency of land units with security capability in
46 * @seceffp unless it is null.
49 security_strength(struct sctstr *sp, int *seceffp)
56 strength = sp->sct_item[I_MILIT];
58 snxtitem_xy(&ni, EF_LAND, sp->sct_x, sp->sct_y);
59 while (nxtitem(&ni, &land)) {
60 if (land.lnd_own != sp->sct_own)
62 if (land.lnd_ship >= 0 || land.lnd_land >= 0)
64 strength += land.lnd_item[I_MILIT];
65 if (lchr[land.lnd_type].l_flags & L_SECURITY) {
66 strength += land.lnd_item[I_MILIT] * land.lnd_effic / 100.0;
67 seceff += land.lnd_effic;
77 * Does the player->owner have military control of this sector?
80 military_control(struct sctstr *sp)
84 if (sp->sct_oldown != sp->sct_own) {
85 tot_mil = sp->sct_item[I_MILIT] + security_strength(sp, NULL);
86 if (tot_mil * 10 < sp->sct_item[I_CIVIL])
94 * Ask user to confirm abandonment of sector @sp, if any.
95 * If removing @amnt commodities of type @vtype and the land units in
96 * @list would abandon the sector, ask the user to confirm.
97 * All land units in @land_list must be in this sector, owned by the
98 * player, and not loaded onto anything. @land_list may be null.
99 * Return zero when abandonment was declined, else non-zero.
102 abandon_askyn(struct sctstr *sp, i_type vtype, int amnt,
103 struct ulist *land_list)
108 * First, would we be abandoning it? If not, just return that
109 * it's OK to move out.
111 if (!would_abandon(sp, vtype, amnt, land_list))
114 sprintf(prompt, "Do you really want to abandon %s [yn]? ",
115 xyas(sp->sct_x, sp->sct_y, player->cnum));
117 return askyn(prompt);
121 * Would removing this stuff from @sp abandon it?
122 * Consider removal of @amnt commodities of type @vtype and the land
123 * units in @land_list.
124 * All land units in @land_list must be in this sector, owned by the
125 * player, and not loaded onto anything. @land_list may be null.
128 would_abandon(struct sctstr *sp, i_type vtype, int amnt,
129 struct ulist *land_list)
131 int mil, civs, nland;
136 * sct_prewrite() abandons when there are no civilians, military
137 * and own units left.
140 if (vtype != I_CIVIL && vtype != I_MILIT)
143 mil = sp->sct_item[I_MILIT];
144 civs = sp->sct_item[I_CIVIL];
146 if (vtype == I_MILIT)
148 if (vtype == I_CIVIL)
151 if (!sp->sct_own || civs > 0 || mil > 0)
155 * Okay, no civilians and no military would be left. Any own land
156 * units left? Land units on ships stay, so count them. Land
157 * units not on anything stay unless in @land_list, so count them,
158 * then subtract length of @land_list. Land units on land units
159 * stay if their carrier stays, and therefore won't change the
160 * outcome; don't count them.
164 snxtitem_xy(&ni, EF_LAND, sp->sct_x, sp->sct_y);
165 while (nxtitem(&ni, &land)) {
166 if (land.lnd_own == player->cnum && land.lnd_land < 0)
171 nland -= emp_quelen(&land_list->queue);