]> git.pond.sub.org Git - empserver/blob - src/lib/commands/setsect.c
Do not include var.h where no longer needed. Clean up register keywords in these...
[empserver] / src / lib / commands / setsect.c
1 /*
2  *  Empire - A multi-player, client/server Internet based war game.
3  *  Copyright (C) 1986-2004, 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  *  setsect.c: Give resources to a country
29  * 
30  *  Known contributors to this file:
31  *     David Muir Sharnoff
32  *     Steve McClure, 1998
33  */
34
35 #include <stdio.h>
36 #include <ctype.h>
37 #include "misc.h"
38 #include "player.h"
39 #include "xy.h"
40 #include "sect.h"
41 #include "nat.h"
42 #include "news.h"
43 #include "nsc.h"
44 #include "item.h"
45 #include "file.h"
46 #include "commands.h"
47 #include "optlist.h"
48
49
50 /*
51  * format: setres thing <sect> <#>
52  */
53 int
54 setsector(void)
55 {
56     struct sctstr sect;
57     s_char *what;
58     int amt, current;
59     s_char *p;
60     struct nstr_sect nstr;
61     s_char buf[1024];
62     s_char char0, char1;
63
64     if ((what = getstarg(player->argp[1],
65                          "Give What (iron, gold, oil, uranium, fertility, owner, eff., mob., work, avail., oldown, mines)? ",
66                          buf)) == 0)
67         return RET_SYN;
68     char0 = what[0];
69     char1 = what[1];
70
71     switch (char0) {
72     case 'i':
73         if (!snxtsct(&nstr, player->argp[2]))
74             return RET_SYN;
75         while (nxtsct(&nstr, &sect) > 0) {
76             if (!(p = getstarg(player->argp[3], "What value : ", buf)) ||
77                 (*p == '\0'))
78                 return RET_SYN;
79             amt = atoi(p);
80             current = sect.sct_min;
81             current += amt;
82             if (current < 0)
83                 current = 0;
84             if (current > 100)
85                 current = 100;
86             if (sect.sct_own != 0)
87                 resnoise(&sect, 1, "Iron ore content",
88                          (int)sect.sct_min, current);
89             sect.sct_min = (u_char)current;
90             putsect(&sect);
91         }
92         break;
93     case 'g':
94         if (!snxtsct(&nstr, player->argp[2]))
95             return RET_SYN;
96         while (nxtsct(&nstr, &sect) > 0) {
97             if (!(p = getstarg(player->argp[3], "What value : ", buf)) ||
98                 (*p == '\0'))
99                 return RET_SYN;
100             amt = atoi(p);
101             current = sect.sct_gmin;
102             current += amt;
103             if (current < 0)
104                 current = 0;
105             if (current > 100)
106                 current = 100;
107             if (sect.sct_own != 0)
108                 resnoise(&sect, 1, "Gold content",
109                          (int)sect.sct_gmin, current);
110             sect.sct_gmin = (u_char)current;
111             putsect(&sect);
112         }
113         break;
114     case 'o':
115         switch (char1) {
116         case 'i':
117             if (!snxtsct(&nstr, player->argp[2]))
118                 return RET_SYN;
119             while (nxtsct(&nstr, &sect) > 0) {
120                 if (!(p = getstarg(player->argp[3], "What value : ", buf))
121                     || (*p == '\0'))
122                     return RET_SYN;
123                 amt = atoi(p);
124                 current = sect.sct_oil;
125                 current += amt;
126                 if (current < 0)
127                     current = 0;
128                 if (current > 100)
129                     current = 100;
130                 if (sect.sct_own != 0)
131                     resnoise(&sect, 1, "Oil content",
132                              (int)sect.sct_oil, current);
133                 sect.sct_oil = (u_char)current;
134                 putsect(&sect);
135             }
136             break;
137         case 'w':
138             if (!snxtsct(&nstr, player->argp[2]))
139                 return RET_SYN;
140             while (nxtsct(&nstr, &sect) > 0) {
141                 if (!(p = getstarg(player->argp[3], "What value : ", buf))
142                     || (*p == '\0'))
143                     return RET_SYN;
144                 amt = atoi(p);
145                 if ((amt < 0) || (amt > MAXNOC - 1))
146                     return RET_SYN;
147                 pr("Owner of %s changed from %s (#%d) to %s (#%d).\n",
148                    xyas(sect.sct_x, sect.sct_y, player->cnum),
149                    cname(sect.sct_own), sect.sct_own, cname(amt), amt);
150                 if (sect.sct_own) {
151                     wu(player->cnum, sect.sct_own,
152                        "Sector %s lost to deity intervention\n",
153                        xyas(sect.sct_x, sect.sct_y, sect.sct_own));
154                 }
155                 if (amt)
156                     wu(player->cnum, amt,
157                        "Sector %s gained from deity intervention\n",
158                        xyas(sect.sct_x, sect.sct_y, amt));
159                 makelost(EF_SECTOR, sect.sct_own, 0, sect.sct_x,
160                          sect.sct_y);
161                 makenotlost(EF_SECTOR, amt, 0, sect.sct_x, sect.sct_y);
162
163                 sect.sct_own = (natid)amt;
164                 putsect(&sect);
165             }
166             break;
167         case 'l':
168             if (!snxtsct(&nstr, player->argp[2]))
169                 return RET_SYN;
170             while (nxtsct(&nstr, &sect) > 0) {
171                 if (!(p = getstarg(player->argp[3], "What value : ", buf))
172                     || (*p == '\0'))
173                     return RET_SYN;
174                 amt = atoi(p);
175                 if ((amt < 0) || (amt > MAXNOC - 1))
176                     return RET_SYN;
177                 pr("Old owner of %s changed from %s (#%d) to %s (#%d).\n",
178                    xyas(sect.sct_x, sect.sct_y, player->cnum),
179                    cname(sect.sct_oldown),
180                    sect.sct_oldown, cname(amt), amt);
181                 sect.sct_oldown = (natid)amt;
182                 putsect(&sect);
183             }
184             break;
185         default:
186             pr("huh?\n");
187             return RET_SYN;
188         }
189         break;
190     case 'e':
191         if (!snxtsct(&nstr, player->argp[2]))
192             return RET_SYN;
193         while (nxtsct(&nstr, &sect) > 0) {
194             if (!(p = getstarg(player->argp[3], "What value : ", buf)) ||
195                 (*p == '\0'))
196                 return RET_SYN;
197             amt = atoi(p);
198             current = sect.sct_effic;
199             current += amt;
200             if (current < 0)
201                 current = 0;
202             if (current > 100)
203                 current = 100;
204             pr("Efficiency in %s changed to %d.\n",
205                xyas(sect.sct_x, sect.sct_y, player->cnum), current);
206             sect.sct_effic = (u_char)current;
207             putsect(&sect);
208         }
209         break;
210     case 'm':
211         switch (char1) {
212         case 'i':
213             if (!snxtsct(&nstr, player->argp[2]))
214                 return RET_SYN;
215             while (nxtsct(&nstr, &sect) > 0) {
216                 if (!(p = getstarg(player->argp[3], "What value : ", buf))
217                     || (*p == '\0'))
218                     return RET_SYN;
219                 amt = atoi(p);
220                 current = sect.sct_mines;
221                 current += amt;
222                 if (current < 0)
223                     current = 0;
224                 if (current > MINES_MAX)
225                     current = MINES_MAX;
226                 if (sect.sct_own != 0)
227                     resnoise(&sect, 1, "Mines", sect.sct_mines, current);
228                 sect.sct_mines = current;
229                 putsect(&sect);
230             }
231             break;
232         case 'o':
233             if (!snxtsct(&nstr, player->argp[2]))
234                 return RET_SYN;
235             while (nxtsct(&nstr, &sect) > 0) {
236                 if (!(p = getstarg(player->argp[3], "What value : ", buf))
237                     || (*p == '\0'))
238                     return RET_SYN;
239                 amt = atoi(p);
240                 current = sect.sct_mobil;
241                 current += amt;
242                 if (current < -127)
243                     current = -127;
244                 if (current > 127)
245                     current = 127;
246                 pr("Mobility in %s changed to %d.\n",
247                    xyas(sect.sct_x, sect.sct_y, player->cnum), current);
248                 sect.sct_mobil = (short)current;
249                 putsect(&sect);
250             }
251             break;
252         default:
253             pr("huh?\n");
254             return RET_SYN;
255         }
256         break;
257     case 'a':
258         if (!snxtsct(&nstr, player->argp[2]))
259             return RET_SYN;
260         while (nxtsct(&nstr, &sect) > 0) {
261             if (!(p = getstarg(player->argp[3], "What value : ", buf)) ||
262                 (*p == '\0'))
263                 return RET_SYN;
264             amt = atoi(p);
265             current = sect.sct_avail;
266             current += amt;
267             if (current < 0)
268                 current = 0;
269             if (current > 9999)
270                 current = 9999;
271             pr("Available in %s changed to %d.\n",
272                xyas(sect.sct_x, sect.sct_y, player->cnum), current);
273             sect.sct_avail = (short)current;
274             putsect(&sect);
275         }
276         break;
277     case 'w':
278         if (!snxtsct(&nstr, player->argp[2]))
279             return RET_SYN;
280         while (nxtsct(&nstr, &sect) > 0) {
281             if (!(p = getstarg(player->argp[3], "What value : ", buf)) ||
282                 (*p == '\0'))
283                 return RET_SYN;
284             amt = atoi(p);
285             current = sect.sct_work;
286             current += amt;
287             if (current < 0)
288                 current = 0;
289             if (current > 100)
290                 current = 100;
291             pr("Work in %s changed to %d.\n",
292                xyas(sect.sct_x, sect.sct_y, player->cnum), current);
293             sect.sct_work = (u_char)current;
294             putsect(&sect);
295         }
296         break;
297     case 'f':
298         if (!snxtsct(&nstr, player->argp[2]))
299             return RET_SYN;
300         while (nxtsct(&nstr, &sect) > 0) {
301             if (!(p = getstarg(player->argp[3], "What value : ", buf)) ||
302                 (*p == '\0'))
303                 return RET_SYN;
304             amt = atoi(p);
305             current = sect.sct_fertil;
306             current += amt;
307             if (current < 0)
308                 current = 0;
309             if (current > 120)
310                 current = 120;
311             if (sect.sct_own != 0)
312                 resnoise(&sect, 1, "Fertility content",
313                          (int)sect.sct_fertil, current);
314             sect.sct_fertil = (u_char)current;
315             putsect(&sect);
316         }
317         break;
318     case 'u':
319         if (!snxtsct(&nstr, player->argp[2]))
320             return RET_SYN;
321         while (nxtsct(&nstr, &sect) > 0) {
322             if (!(p = getstarg(player->argp[3], "What value : ", buf)) ||
323                 (*p == '\0'))
324                 return RET_SYN;
325             amt = atoi(p);
326             current = sect.sct_uran;
327             current += amt;
328             if (current < 0)
329                 current = 0;
330             if (current > 100)
331                 current = 100;
332             if (sect.sct_own != 0)
333                 resnoise(&sect, 1, "Uranium content",
334                          (int)sect.sct_uran, current);
335             sect.sct_uran = (u_char)current;
336             putsect(&sect);
337         }
338         break;
339     default:
340         pr("huh?\n");
341         return RET_SYN;
342     }
343     return RET_OK;
344 }
345
346 static void
347 resbenefit(natid who, int good)
348 {
349     if (!opt_GODNEWS)
350         return;
351
352     if (good) {
353         if (who)
354             nreport(player->cnum, N_AIDS, who, 1);
355     } else {
356         if (who)
357             nreport(player->cnum, N_HURTS, who, 1);
358     }
359 }
360
361 void
362 resnoise(struct sctstr *sptr, int public_amt, s_char *name, int old,
363          int new)
364 {
365     s_char p[100];
366
367     pr("%s of %s changed from %d to %d%%\n",
368        name, xyas(sptr->sct_x, sptr->sct_y, player->cnum), old, new);
369     if (public_amt)
370         (void)sprintf(p, "changed from %d to %d", old, new);
371     else
372         (void)sprintf(p, "%s", old < new ? "increased" : "decreased");
373     if (sptr->sct_own)
374         wu(0, sptr->sct_own,
375            "%s in %s was %s by an act of %s\n",
376            name, xyas(sptr->sct_x, sptr->sct_y, sptr->sct_own),
377            p, cname(player->cnum));
378     resbenefit(sptr->sct_own, (old < new));
379 }