]> git.pond.sub.org Git - empserver/blobdiff - src/lib/update/produce.c
Update copyright notice
[empserver] / src / lib / update / produce.c
index 4c4c8dcace3384e1d720e6e2416c21af3cf7773c..4c777bfd0fcaeee2b985bd131ba53d55158e91e0 100644 (file)
@@ -1,11 +1,11 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2008, Dave Pare, Jeff Bailey, Thomas Ruschak,
- *                           Ken Stevens, Steve McClure
+ *  Copyright (C) 1986-2013, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *                Ken Stevens, Steve McClure, Markus Armbruster
  *
- *  This program is free software; you can redistribute it and/or modify
+ *  Empire is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
+ *  the Free Software Foundation, either version 3 of the License, or
  *  (at your option) any later version.
  *
  *  This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
  *  GNU General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  *  ---
  *
@@ -28,7 +27,7 @@
  *  produce.c: Produce goodies
  *
  *  Known contributors to this file:
- *
+ *     Markus Armbruster, 2004-2010
  */
 
 #include <config.h>
@@ -66,6 +65,10 @@ produce(struct natstr *np, struct sctstr *sp, short *vec, int work,
        return 0;
     product = &pchr[dchr[desig].d_prd];
     item = product->p_type;
+    if (product->p_nrndx)
+       resource = (unsigned char *)sp + product->p_nrndx;
+    else
+       resource = NULL;
     *amount = 0;
     *cost = 0;
 
@@ -75,10 +78,9 @@ produce(struct natstr *np, struct sctstr *sp, short *vec, int work,
      * calculate production efficiency.
      */
     p_e = neweff / 100.0;
-    if (product->p_nrndx != 0) {
+    if (resource) {
        unit_work++;
-       resource = (unsigned char *)sp + product->p_nrndx;
-       p_e = (*resource * p_e) / 100.0;
+       p_e *= *resource / 100.0;
     }
     /*
      * determine number that can be made with
@@ -90,6 +92,10 @@ produce(struct natstr *np, struct sctstr *sp, short *vec, int work,
     worker_limit = roundavg(work * p_e / unit_work);
     if (material_consume > worker_limit)
        material_consume = worker_limit;
+    if (resource && product->p_nrdep != 0) {
+       if (*resource * 100 < product->p_nrdep * material_consume)
+           material_consume = *resource * 100 / product->p_nrdep;
+    }
     if (material_consume == 0)
        return 0;
     prodeff = prod_eff(desig, np->nat_level[product->p_nlndx]);
@@ -107,17 +113,13 @@ produce(struct natstr *np, struct sctstr *sp, short *vec, int work,
        actual = ldround(output, 1);
        if (!player->simulation) {
            levels[sp->sct_own][product->p_level] += output;
-           wu((natid)0, sp->sct_own, "%s (%.2f) produced in %s\n",
+           wu(0, sp->sct_own, "%s (%.2f) produced in %s\n",
               product->p_name, output, ownxy(sp));
        }
     } else {
        actual = roundavg(output);
        if (actual <= 0)
            return 0;
-       if (product->p_nrdep != 0) {
-           if (*resource * 100 < product->p_nrdep * actual)
-               actual = *resource * 100 / product->p_nrdep;
-       }
        if (actual > 999) {
            material_consume = roundavg(999.0 * material_consume / actual);
            actual = 999;
@@ -140,7 +142,7 @@ produce(struct natstr *np, struct sctstr *sp, short *vec, int work,
      */
     if (!player->simulation) {
        materials_charge(product, vec, material_consume);
-       if (product->p_nrdep != 0) {
+       if (resource && product->p_nrdep != 0) {
            /*
             * lower natural resource in sector depending on
             * amount produced