+ if (CANT_HAPPEN(item <= I_NONE || I_MAX < item))
+ continue;
+ n = vec[item] - pp->p_camt[i] * count;
+ if (CANT_HAPPEN(n < 0.0))
+ n = 0.0;
+ vec[item] = roundavg(n);
+ }
+}
+
+/*
+ * Return how much of product @pp can be made from its resource.
+ * If @pp depletes a resource, @resource must point to its value.
+ */
+double
+prod_resource_limit(struct pchrstr *pp, unsigned char *resource)
+{
+ if (CANT_HAPPEN(pp->p_nrndx && !resource))
+ return 0;
+ if (resource && pp->p_nrdep != 0)
+ return *resource * 100.0 / pp->p_nrdep;
+ return ITEM_MAX;
+}
+
+/*
+ * Return p.e. for sector type @type.
+ * Zero means level is too low for production.
+ * @level is the level affecting production.
+ */
+double
+prod_eff(int type, float level)
+{
+ double level_p_e;
+ struct dchrstr *dp = &dchr[type];
+ struct pchrstr *pp = &pchr[dp->d_prd];
+
+ if (CANT_HAPPEN(dp->d_prd < 0))
+ return 0.0;
+
+ if (pp->p_nlndx < 0)
+ level_p_e = 1.0;
+ else {
+ double delta = (double)level - (double)pp->p_nlmin;
+
+ if (delta < 0.0)
+ return 0.0;
+ if (CANT_HAPPEN(delta + pp->p_nllag <= 0))
+ return 0.0;
+ level_p_e = delta / (delta + pp->p_nllag);