]> git.pond.sub.org Git - empserver/blob - src/lib/commands/lten.c
Indentation fixes; suspect indent-emp is to blame.
[empserver] / src / lib / commands / lten.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  *  lten.c: Transfer commodity from a ship to a land unit the ship is
29  *          carrying
30  * 
31  *  Known contributors to this file:
32  *     Dave Pare, 1986
33  *     Thomas Ruschak
34  *     Ken Stevens, 1995
35  *     Steve McClure, 1998
36  */
37
38 #include "misc.h"
39 #include "player.h"
40 #include "var.h"
41 #include "xy.h"
42 #include "file.h"
43 #include "ship.h"
44 #include "item.h"
45 #include "nsc.h"
46 #include "nat.h"
47 #include "plane.h"
48 #include "nuke.h"
49 #include "land.h"
50 #include "genitem.h"
51 #include "commands.h"
52
53 static void expose_land(struct shpstr *s1, struct lndstr *l1);
54
55 int
56 ltend(void)
57 {
58     struct nstr_item targets;
59     struct nstr_item tenders;
60     struct shpstr tender;
61     struct lndstr target;
62     struct ichrstr *ip;
63     struct mchrstr *vbase;
64     struct lchrstr *lbase;
65     int amt;
66     int ontender;
67     int ontarget;
68     int maxtender;
69     int maxtarget;
70     int transfer;
71     int total;
72     s_char *p;
73     s_char buf[1024];
74
75     if (!(ip = whatitem(player->argp[1], "Transfer what commodity? ")))
76         return RET_SYN;
77
78     if (!snxtitem(&tenders, EF_SHIP,
79                   getstarg(player->argp[2], "Tender(s)? ", buf)))
80         return RET_SYN;
81     while (nxtitem(&tenders, (s_char *)&tender)) {
82         if (!player->owner)
83             continue;
84         if ((p =
85              getstarg(player->argp[3], "Amount to transfer? ", buf)) == 0)
86             break;
87         if (!check_ship_ok(&tender))
88             return RET_FAIL;
89         if ((amt = atoi(p)) == 0)
90             break;
91         ontender = getvar(ip->i_vtype, (s_char *)&tender, EF_SHIP);
92         if (ontender == 0 && amt > 0) {
93             pr("No %s on %s\n", ip->i_name, prship(&tender));
94             return RET_FAIL;
95         }
96         vbase = &mchr[(int)tender.shp_type];
97         maxtender = vl_find(ip->i_vtype, vbase->m_vtype,
98                             vbase->m_vamt, (int)vbase->m_nv);
99         if (maxtender == 0) {
100             pr("A %s cannot hold any %s\n",
101                mchr[(int)tender.shp_type].m_name, ip->i_name);
102             break;
103         }
104         if (!snxtitem(&targets, EF_LAND,
105                       getstarg(player->argp[4], "Units to be tended? ",
106                                buf)))
107             break;
108         if (!check_ship_ok(&tender))
109             return RET_FAIL;
110         total = 0;
111         while (tend_nxtitem(&targets, (s_char *)&target)) {
112             if (!player->owner)
113                 continue;
114
115             if (target.lnd_ship != tender.shp_uid)
116                 continue;
117             ontarget = getvar(ip->i_vtype, (s_char *)&target, EF_LAND);
118             if (ontarget == 0 && amt < 0) {
119                 pr("No %s on %s\n",
120                    ip->i_name, prship((struct shpstr *)&target));
121                 continue;
122             }
123             lbase = &lchr[(int)target.lnd_type];
124             maxtarget = vl_find(ip->i_vtype, lbase->l_vtype,
125                                 lbase->l_vamt, (int)lbase->l_nv);
126             if (amt < 0) {
127                 if (!player->owner)
128                     amt = 0;
129
130                 /* take from target and give to tender */
131                 transfer = min(ontarget, -amt);
132                 transfer = min(maxtender - ontender, transfer);
133                 if (transfer == 0)
134                     continue;
135                 putvar(ip->i_vtype, ontarget - transfer,
136                        (s_char *)&target, EF_LAND);
137                 ontender += transfer;
138                 total += transfer;
139             } else {
140                 /* give to target from tender */
141                 transfer = min(ontender, amt);
142                 transfer = min(transfer, maxtarget - ontarget);
143                 if (transfer == 0)
144                     continue;
145                 putvar(ip->i_vtype, ontarget + transfer,
146                        (s_char *)&target, EF_LAND);
147                 ontender -= transfer;
148                 total += transfer;
149             }
150             expose_land(&tender, &target);
151             putland(target.lnd_uid, &target);
152             if (amt > 0 && ontender == 0) {
153                 pr("%s out of %s\n", prship(&tender), ip->i_name);
154                 break;
155             }
156         }
157         pr("%d total %s transferred %s %s\n",
158            total, ip->i_name, (amt > 0) ? "off of" : "to",
159            prship(&tender));
160         putvar(ip->i_vtype, ontender, (s_char *)&tender, EF_SHIP);
161         tender.shp_mission = 0;
162         putship(tender.shp_uid, &tender);
163     }
164     return RET_OK;
165 }
166
167 static void
168 expose_land(struct shpstr *s1, struct lndstr *l1)
169 {
170     if (getvar(V_PSTAGE, (s_char *)s1, EF_SHIP) == PLG_INFECT &&
171         getvar(V_PSTAGE, (s_char *)l1, EF_LAND) == PLG_HEALTHY)
172         putvar(V_PSTAGE, PLG_EXPOSED, (s_char *)l1, EF_LAND);
173     if (getvar(V_PSTAGE, (s_char *)l1, EF_LAND) == PLG_INFECT &&
174         getvar(V_PSTAGE, (s_char *)s1, EF_SHIP) == PLG_HEALTHY)
175         putvar(V_PSTAGE, PLG_EXPOSED, (s_char *)s1, EF_SHIP);
176 }