/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2013, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2021, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure, Markus Armbruster
*
* Empire is free software: you can redistribute it and/or modify
* work.c: Implementation of the work command
*
* Known contributors to this file:
- * Markus Armbruster, 2009-2010
+ * Markus Armbruster, 2009-2016
*/
#include <config.h>
+#include "chance.h"
#include "commands.h"
#include "land.h"
#include "optlist.h"
-
-static int buildeff(struct sctstr *, int, double *);
+#include "update.h"
int
-work(void)
+c_work(void)
{
int nunits;
struct nstr_item ni;
struct sctstr sect;
struct lndstr land;
- int work_amt, eff_amt, w;
+ int work_amt, eff_amt, w, sect_avail;
char *p;
char buf[1024];
double cost;
continue;
if (!(lchr[(int)land.lnd_type].l_flags & L_ENGINEER))
continue;
+ if (land.lnd_ship >= 0 || land.lnd_land >= 0) {
+ pr("%s is on a %s\n",
+ prland(&land), land.lnd_ship >= 0 ? "ship" : "land unit");
+ continue;
+ }
if (land.lnd_mobil <= 0) {
pr("%s has no mobility!\n", prland(&land));
continue;
prland(&land));
continue;
}
- cost = 0.0;
- w = buildeff(§, w, &cost);
+ sect_avail = sect.sct_avail;
+ sect.sct_avail = w;
+ cost = buildeff(§);
+ w = sect.sct_avail - sect_avail;
+ sect.sct_avail = sect_avail;
if (w == 0) {
pr("%s can't change efficiency in %s\n",
prland(&land), xyas(land.lnd_x, land.lnd_y, player->cnum));
pr("%d unit%s\n", nunits, splur(nunits));
return RET_OK;
}
-
-static int
-buildeff(struct sctstr *sp, int work, double *money)
-{
- int work_cost;
- int n, hcms, lcms;
- int effdone = 0;
-
- if (sp->sct_type != sp->sct_newtype) {
- /*
- * Tear down existing sector.
- * Easier to destroy than to build.
- */
- work_cost = (sp->sct_effic + 3) / 4;
- if (work_cost > work)
- work_cost = work;
- n = sp->sct_effic - work_cost * 4;
- if (n <= 0) {
- n = 0;
- sp->sct_type = sp->sct_newtype;
- }
- sp->sct_effic = n;
- work -= work_cost;
- *money += work_cost;
- effdone += work_cost;
- }
- if (sp->sct_type == sp->sct_newtype) {
- work_cost = 100 - sp->sct_effic;
- if (work_cost > work)
- work_cost = work;
-
- if (dchr[sp->sct_type].d_lcms > 0) {
- lcms = sp->sct_item[I_LCM];
- lcms /= dchr[sp->sct_type].d_lcms;
- if (work_cost > lcms)
- work_cost = lcms;
- }
- if (dchr[sp->sct_type].d_hcms > 0) {
- hcms = sp->sct_item[I_HCM];
- hcms /= dchr[sp->sct_type].d_hcms;
- if (work_cost > hcms)
- work_cost = hcms;
- }
-
- sp->sct_effic += work_cost;
- *money += work_cost * dchr[sp->sct_type].d_build;
-
- if ((dchr[sp->sct_type].d_lcms > 0) ||
- (dchr[sp->sct_type].d_hcms > 0)) {
- sp->sct_item[I_LCM] -= work_cost * dchr[sp->sct_type].d_lcms;
- sp->sct_item[I_HCM] -= work_cost * dchr[sp->sct_type].d_hcms;
- }
- effdone += work_cost;
- }
- return effdone;
-}