/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2010, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure
*
* This program is free software; you can redistribute it and/or modify
*
* ---
*
- * See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
- * related information and legal notices. It is expected that any future
- * projects/authors will amend these files as needed.
+ * See files README, COPYING and CREDITS in the root of the source
+ * tree for related information and legal notices. It is expected
+ * that future projects/authors will amend these files as needed.
*
* ---
*
* conv.c: Convert conquered populace into uw's
- *
+ *
* Known contributors to this file:
* Dave Pare, 1986
*/
* format: convert <SECTS> <NUMBER PER SECTOR>
*/
-#include "misc.h"
-#include "player.h"
-#include "var.h"
-#include "sect.h"
-#include "nat.h"
-#include "xy.h"
-#include "nsc.h"
-#include "file.h"
-#include "land.h"
-#include "commands.h"
+#include <config.h>
-long do_conv(struct nstr_sect nstr, int uwtoconvert, int for_real);
+#include "commands.h"
+#include "land.h"
int
conv(void)
{
- struct natstr *natp;
- long cash;
- long cost;
- struct nstr_sect nstr;
- int uwtoconvert;
-
- natp = getnatp(player->cnum);
- cash = natp->nat_money;
- if (!snxtsct(&nstr, player->argp[1]))
- return RET_SYN;
- uwtoconvert = onearg(player->argp[2], "Number to convert: ");
- if (uwtoconvert < 0)
- return RET_SYN;
- cost = do_conv(nstr, uwtoconvert, 0);
- if (chkmoney(cost, cash, player->argp[3]))
- return RET_SYN;
- return (int)do_conv(nstr, uwtoconvert, 1);
-}
+ struct natstr *natp;
+ struct sctstr sect;
+ struct nstr_sect nstr;
+ int uwtoconvert, newuw, totaluw, uw;
+ int maxpop, civ, mil, adj_mob, mob;
+ double security_extra = 1.0;
+ struct lndstr land;
+ struct nstr_item ni;
-long
-do_conv(struct nstr_sect nstr, int uwtoconvert, int for_real)
-{
- struct sctstr sect;
- int newuw, totaluw, uw;
- int civ, mil, adj_mob, mob;
- double security_extra=1.0;
- struct lndstr land;
- struct nstr_item ni;
- long cost = 0;
+ if (!snxtsct(&nstr, player->argp[1]))
+ return RET_SYN;
+ uwtoconvert = onearg(player->argp[2], "Number to convert: ");
+ if (uwtoconvert < 0)
+ return RET_SYN;
- totaluw = 0;
- while (nxtsct(&nstr, §)) {
- if (!player->owner)
- continue;
- if (sect.sct_oldown == player->cnum)
- continue;
- civ = getvar(V_CIVIL, (s_char *)§, EF_SECTOR);
- if (civ == 0)
- continue;
- mil = getvar(V_MILIT, (s_char *)§, EF_SECTOR);
+ totaluw = 0;
+ while (nxtsct(&nstr, §)) {
+ if (!player->owner)
+ continue;
+ if (sect.sct_oldown == player->cnum)
+ continue;
+ natp = getnatp(sect.sct_own);
+ maxpop = max_pop(natp->nat_level[NAT_RLEV], §);
+ civ = sect.sct_item[I_CIVIL];
+ mil = sect.sct_item[I_MILIT];
- /*
- * Military units count according to the number of
- * mil in them. (i.e. attack/defense modified don't
- * count.
- */
- snxtitem_xy(&ni, EF_LAND, sect.sct_x, sect.sct_y);
- while (nxtitem(&ni, (s_char *)&land)){
- mil += lnd_getmil(&land);
-/* mil += (lnd_getmil(&land) *
- ((double)land.lnd_effic/100.0));*/
+ /*
+ * Military units count according to the number of
+ * mil in them. (i.e. attack/defense modifier don't
+ * count.
+ */
+ snxtitem_xy(&ni, EF_LAND, sect.sct_x, sect.sct_y);
+ while (nxtitem(&ni, &land)) {
+ mil += land.lnd_item[I_MILIT];
- /* Anti-terrorist units count double */
- if (lchr[(int)land.lnd_type].l_flags & L_SECURITY){
+ /* Anti-terrorist units count double */
+ if (lchr[(int)land.lnd_type].l_flags & L_SECURITY) {
- /*
- * They also increase the efficiency of
- * the conversion process by 10% each.
- * (but they use 10 mobility doing it)
- */
- security_extra += .1;
- land.lnd_mobil -= 10;
- if (for_real)
- putland(land.lnd_uid,&land);
- mil += lnd_getmil(&land);
-/* mil += (lchr[land.lnd_type].l_mil *
- ((double)land.lnd_effic/100.0));*/
- }
- }
/*
- * Must have military control to convert captured civs.
+ * They also increase the efficiency of
+ * the conversion process by 10% each.
+ * (but they use 10 mobility doing it)
*/
- if (mil * 10 < civ)
- continue;
- newuw = civ;
- if (newuw > uwtoconvert)
- newuw = uwtoconvert;
- uw = getvar(V_UW, (s_char *)§, EF_SECTOR);
- if (uw > 999)
- continue;
- if (newuw > 999 - uw)
- newuw = 999 - uw;
- if (newuw == 0)
- continue;
- /*
- * So entire civilian populations don't disappear immediately
- * into re-education camps, charge a healthy mobility cost for
- * conversions.
- */
- mob = sect.sct_mobil * 5;
+ security_extra += .1;
+ land.lnd_mobil -= 10;
+ mil += land.lnd_item[I_MILIT];
+ }
+ }
+ /*
+ * Must have military control to convert captured civs.
+ */
+ if (mil * 10 < civ)
+ continue;
+ newuw = civ;
+ if (newuw > uwtoconvert)
+ newuw = uwtoconvert;
+ uw = sect.sct_item[I_UW];
+ if (newuw > maxpop - uw)
+ newuw = maxpop - uw;
+ if (newuw <= 0)
+ continue;
+ /*
+ * So entire civilian populations don't disappear immediately
+ * into re-education camps, charge a healthy mobility cost for
+ * conversions.
+ */
+ mob = sect.sct_mobil * 5;
- /* security troops make conversion more effective */
- adj_mob = ldround(((double)mob*security_extra),1);
+ /* security troops make conversion more effective */
+ adj_mob = ldround(((double)mob * security_extra), 1);
- if (adj_mob < newuw)
- newuw = adj_mob;
- if (newuw <= 0)
- continue;
- if (!for_real) {
- cost += newuw * 1.5;
- continue;
- }
- player->btused += (newuw - 1) / 100 + 1;
- player->dolcost += newuw * 1.5;
- if (newuw < mob)
- mob = newuw;
- if (putvar(V_UW, newuw + uw, (s_char *)§, EF_SECTOR) == 0) {
- pr("No room for new uw in %s\n",
- xyas(sect.sct_x, sect.sct_y, player->cnum));
- continue;
- }
- civ -= newuw;
- putvar(V_CIVIL, civ, (s_char *)§, EF_SECTOR);
- mob = roundavg(mob * 0.2);
- if (mob > sect.sct_mobil)
- mob = sect.sct_mobil;
- sect.sct_mobil -= (u_char)mob;
- pr("%3d conquered civilians converted in %s (%d)\n",
- newuw, xyas(sect.sct_x, sect.sct_y, player->cnum),
- uw + newuw);
- if (civ == 0) {
- sect.sct_oldown = sect.sct_own;
- pr("%s is now completely yours.\n",
- xyas(sect.sct_x, sect.sct_y, player->cnum));
- }
- putsect(§);
- totaluw += newuw;
+ if (adj_mob < newuw)
+ newuw = adj_mob;
+ if (newuw <= 0)
+ continue;
+ if (player->dolcost + newuw * 1.5 > natp->nat_money) {
+ pr("You can't afford to convert %d civilians in %s!\n",
+ newuw, xyas(sect.sct_x, sect.sct_y, player->cnum));
+ break;
+ }
+ player->btused += (newuw - 1) / 100 + 1;
+ player->dolcost += newuw * 1.5;
+ if (newuw < mob)
+ mob = newuw;
+ sect.sct_item[I_UW] = newuw + uw;
+ civ -= newuw;
+ sect.sct_item[I_CIVIL] = civ;
+ mob = roundavg(mob * 0.2);
+ if (mob > sect.sct_mobil)
+ mob = sect.sct_mobil;
+ sect.sct_mobil -= mob;
+ pr("%3d conquered civilians converted in %s (%d)\n",
+ newuw, xyas(sect.sct_x, sect.sct_y, player->cnum), uw + newuw);
+ if (civ == 0) {
+ sect.sct_oldown = sect.sct_own;
+ pr("%s is now completely yours.\n",
+ xyas(sect.sct_x, sect.sct_y, player->cnum));
}
- if (!for_real)
- return cost;
- pr("Total civilians converted: %d\n", totaluw);
- pr("Paperwork at conversion places ... %d\n", player->btused);
- return RET_OK;
+ putsect(§);
+ totaluw += newuw;
+ }
+ pr("Total civilians converted: %d\n", totaluw);
+ pr("Paperwork at conversion places ... %d\n", player->btused);
+ return RET_OK;
}