update: Make ships produce after eating and building

People in sectors first eat, then build the sector, then produce.
People in ships produce, eat, then build.

The starvation command can be off for fishing vessels, because it
doesn't consider the food they produce.

Change ships to match sectors.  "Fixes" starvation.  Fishing boats and
oil derricks being repaired at sea become a bit more productive.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
This commit is contained in:
Markus Armbruster 2016-06-21 22:25:20 +02:00
parent da14a03231
commit 391778e09c
7 changed files with 88 additions and 77 deletions

View file

@ -53,6 +53,7 @@
static void upd_ship(struct shpstr *, int, struct bp *, int);
static void shiprepair(struct shpstr *, struct natstr *, struct bp *,
int, struct budget *);
static void ship_produce(struct shpstr *, int, struct budget *);
static int feed_ship(struct shpstr *, int);
void
@ -85,20 +86,14 @@ upd_ship(struct shpstr *sp, int etus, struct bp *bp, int build)
struct budget *budget = &nat_budget[sp->shp_own];
struct mchrstr *mp = &mchr[sp->shp_type];
struct natstr *np = getnatp(sp->shp_own);
struct sctstr *sectp;
int pstage, ptime;
int oil_gained;
int max_oil;
int max_food;
struct pchrstr *product;
unsigned char *resource;
int dep;
int n, mult, eff_lost;
double cost;
if (build == 1) {
if (!sp->shp_off && budget->money >= 0)
shiprepair(sp, np, bp, etus, budget);
ship_produce(sp, etus, budget);
if (!player->simulation)
sp->shp_off = 0;
} else {
@ -123,56 +118,12 @@ upd_ship(struct shpstr *sp, int etus, struct bp *bp, int build)
}
if (!player->simulation) {
sectp = getsectp(sp->shp_x, sp->shp_y);
/* produce oil */
if (!sp->shp_off && budget->money >= 0
&& (mp->m_flags & M_OIL) && sectp->sct_type == SCT_WATER) {
product = &pchr[dchr[SCT_OIL].d_prd];
oil_gained = roundavg(total_work(100, etus,
sp->shp_item[I_CIVIL],
sp->shp_item[I_MILIT],
sp->shp_item[I_UW],
ITEM_MAX)
* sp->shp_effic / 100.0
* sectp->sct_oil / 100.0
* prod_eff(SCT_OIL, sp->shp_tech));
max_oil = mp->m_item[I_OIL];
if (sp->shp_item[I_OIL] + oil_gained > max_oil)
oil_gained = max_oil - sp->shp_item[I_OIL];
if (product->p_nrdep != 0 && oil_gained > 0) {
resource = (unsigned char *)sectp + product->p_nrndx;
if (*resource * 100 < product->p_nrdep * oil_gained)
oil_gained = *resource * 100 / product->p_nrdep;
dep = roundavg(oil_gained * product->p_nrdep / 100.0);
if (CANT_HAPPEN(dep > *resource))
dep = *resource;
*resource -= dep;
}
sp->shp_item[I_OIL] += oil_gained;
}
/* produce fish */
if (!sp->shp_off && budget->money >= 0
&& (mp->m_flags & M_FOOD) && sectp->sct_type == SCT_WATER) {
sp->shp_item[I_FOOD]
+= roundavg(total_work(100, etus,
sp->shp_item[I_CIVIL],
sp->shp_item[I_MILIT],
sp->shp_item[I_UW],
ITEM_MAX)
* sp->shp_effic / 100.0
* sectp->sct_fertil / 100.0
* prod_eff(SCT_AGRI, sp->shp_tech));
}
/* feed */
if ((n = feed_ship(sp, etus)) > 0) {
wu(0, sp->shp_own, "%d starved on %s\n", n, prship(sp));
if (n > 10)
nreport(sp->shp_own, N_DIE_FAMINE, 0, 1);
}
max_food = mp->m_item[I_FOOD];
if (sp->shp_item[I_FOOD] > max_food)
sp->shp_item[I_FOOD] = max_food;
/*
* do plague stuff. plague can't break out on ships,
* but it can still kill people.
@ -316,6 +267,65 @@ shiprepair(struct shpstr *ship, struct natstr *np, struct bp *bp, int etus,
ship->shp_effic += (signed char)build;
}
static void
ship_produce(struct shpstr *sp, int etus, struct budget *budget)
{
struct mchrstr *mp = &mchr[sp->shp_type];
struct sctstr *sectp = getsectp(sp->shp_x, sp->shp_y);
int oil_gained;
int max_oil;
int max_food;
struct pchrstr *product;
unsigned char *resource;
int dep;
if (player->simulation)
return;
/* produce oil */
if (!sp->shp_off && budget->money >= 0
&& (mp->m_flags & M_OIL) && sectp->sct_type == SCT_WATER) {
product = &pchr[dchr[SCT_OIL].d_prd];
oil_gained = roundavg(total_work(100, etus,
sp->shp_item[I_CIVIL],
sp->shp_item[I_MILIT],
sp->shp_item[I_UW],
ITEM_MAX)
* sp->shp_effic / 100.0
* sectp->sct_oil / 100.0
* prod_eff(SCT_OIL, sp->shp_tech));
max_oil = mp->m_item[I_OIL];
if (sp->shp_item[I_OIL] + oil_gained > max_oil)
oil_gained = max_oil - sp->shp_item[I_OIL];
if (product->p_nrdep != 0 && oil_gained > 0) {
resource = (unsigned char *)sectp + product->p_nrndx;
if (*resource * 100 < product->p_nrdep * oil_gained)
oil_gained = *resource * 100 / product->p_nrdep;
dep = roundavg(oil_gained * product->p_nrdep / 100.0);
if (CANT_HAPPEN(dep > *resource))
dep = *resource;
*resource -= dep;
}
sp->shp_item[I_OIL] += oil_gained;
}
/* produce fish */
if (!sp->shp_off && budget->money >= 0
&& (mp->m_flags & M_FOOD) && sectp->sct_type == SCT_WATER) {
sp->shp_item[I_FOOD]
+= roundavg(total_work(100, etus,
sp->shp_item[I_CIVIL],
sp->shp_item[I_MILIT],
sp->shp_item[I_UW],
ITEM_MAX)
* sp->shp_effic / 100.0
* sectp->sct_fertil / 100.0
* prod_eff(SCT_AGRI, sp->shp_tech));
}
max_food = mp->m_item[I_FOOD];
if (sp->shp_item[I_FOOD] > max_food)
sp->shp_item[I_FOOD] = max_food;
}
/*
* returns the number who starved, if any.
*/