]> git.pond.sub.org Git - empserver/blob - src/lib/commands/stre.c
Import of Empire 4.2.12
[empserver] / src / lib / commands / stre.c
1 /*
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
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  *  stre.c: Calculate military strengths of sectors
29  * 
30  *  Known contributors to this file:
31  *     Ken Stevens, 1995
32  */
33
34 #include <math.h>
35 #include "misc.h"
36 #include "player.h"
37 #include "file.h"
38 #include "var.h"
39 #include "sect.h"
40 #include "path.h"
41 #include "news.h"
42 #include "treaty.h"
43 #include "nat.h"
44 #include "xy.h"
45 #include "land.h"
46 #include "nsc.h"
47 #include "mission.h"
48 #include "ship.h"
49 #include "combat.h"
50 #include "commands.h"
51
52 static double units_in_sector(struct combat *def);
53 static void stre_hdr(void);
54
55 int
56 stre(void)
57 {
58         struct  sctstr sect;
59         int     nsect = 0;
60         struct  nstr_sect nstr;
61         double  dtotal, r_total, eff;
62         struct  combat  def[1];
63         int     dummy;
64         int     mines;
65
66         if (!snxtsct(&nstr, player->argp[1]))
67                 return RET_SYN;
68         prdate();
69         nsect = 0;
70         att_combat_init(def, EF_SECTOR);
71         while (nxtsct(&nstr, &sect)) {
72                 if (!player->owner)
73                         continue;
74                 if (nsect++ == 0)
75                         stre_hdr();
76                 if (player->god)
77                         pr("%3d ", sect.sct_own);
78                 prxy("%4d,%-4d", nstr.x, nstr.y, player->cnum);
79                 pr(" %c", dchr[sect.sct_type].d_mnem);
80                 pr("%4d%%", sect.sct_effic);
81                 def->x = nstr.x;
82                 def->y = nstr.y;
83                 def->set = 0;
84                 att_get_combat(def, 1);
85                 if (def->mil)
86                         pr("%5d", def->mil);
87                 else
88                         pr("%5s", "");
89                 dtotal = units_in_sector(def);
90                 if (dtotal > 0)
91                         pr("%7d", (int)dtotal);
92                 else
93                         pr("%7s", "");
94
95                 r_total = att_reacting_units(def, 0, 0, &dummy, 9999999);
96                 def->own = 0;
97                 eff = att_combat_eff(def);
98                 if (sect.sct_own == sect.sct_oldown) {
99                         mines = getvar(V_MINE, (s_char *)&sect, EF_SECTOR);
100                         if (mines > 0)
101                                 pr("%7d", mines);
102                         else
103                                 pr("%7s", "");
104                         eff *= (1.0 + min(mines,20) * 0.02);
105                 } else {
106                         pr("%7s", "?");
107                 }
108                 pr("%6.2f", eff);
109                 pr("%9d", (int)((dtotal + def->mil) * eff));
110                 if (r_total > 0)
111                         pr(" %9d", (int)(r_total * eff));
112                 else
113                         pr(" %9s", "");
114                 pr("%9d\n", (int)((dtotal + def->mil + r_total) * eff));
115         }
116         if (!nsect) {
117                 if (player->argp[1])
118                         pr("%s: No sector(s)\n", player->argp[1]);
119                 else
120                         pr("%s: No sector(s)\n", "");
121                 return RET_FAIL;
122         } else
123                 pr("%d sector%s\n", nsect, splur(nsect));
124         return 0;
125 }
126
127 static double
128 units_in_sector(struct combat *def)
129 {
130         double d_unit;
131         double dtotal = 0.0;
132         struct  nstr_item ni;
133         struct  lndstr land;
134
135         snxtitem_xy(&ni,EF_LAND,def->x, def->y);
136         while(nxtitem(&ni,(s_char *)&land)){
137                 if (land.lnd_own == 0)
138                         continue;
139                 if (land.lnd_own != def->own)
140                         continue;
141                 if (land.lnd_ship >= 0)
142                         continue;
143                 d_unit = defense_val(&land);
144                 if (!has_supply(&land))
145                         d_unit /= 2.0;
146                 dtotal += d_unit;
147         }
148         return dtotal;
149 }
150
151 static void
152 stre_hdr(void)
153 {
154         if (player->god)
155                 pr("    ");
156         pr("DEFENSE STRENGTH               land  sect   sector  reacting    total\n");
157         if (player->god)
158                 pr("own ");
159         pr("  sect       eff  mil  units  mines  mult  defense     units  defense\n");
160 }
161