]> git.pond.sub.org Git - empserver/blobdiff - src/lib/update/plane.c
Use relations_with() for US==THEM || getrel(getnatp(US), THEM)
[empserver] / src / lib / update / plane.c
index 14413a19eead04283741c8e3171b167dd1197fe9..f6a1c7900f335bbbcea3198da702d2b326cef760 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2006, 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
  *  ---
  *
  *  plane.c: Do production for planes
- * 
+ *
  *  Known contributors to this file:
  *     Dave Pare, 1986
  *     Steve McClure, 1998
+ *     Markus Armbruster, 2006-2009
  */
 
 #include <config.h>
 
-#include "misc.h"
-#include "sect.h"
-#include "plane.h"
-#include "ship.h"
-#include "nat.h"
-#include "file.h"
-#include "optlist.h"
 #include "budg.h"
+#include "lost.h"
+#include "plane.h"
 #include "player.h"
+#include "ship.h"
 #include "update.h"
-#include "lost.h"
-#include "subs.h"
-#include "common.h"
-#include "gen.h"
 
-static void planerepair(struct plnstr *, struct natstr *, int *, int);
-static void upd_plane(struct plnstr *, int, struct natstr *, int *, int);
+static void planerepair(struct plnstr *, struct natstr *, struct bp *, int);
+static void upd_plane(struct plnstr *, int, struct natstr *, struct bp *, int);
 
 int
-prod_plane(int etus, int natnum, int *bp, int buildem)
+prod_plane(int etus, int natnum, struct bp *bp, int buildem)
                 /* Build = 1, maintain =0 */
 {
     struct plnstr *pp;
@@ -73,7 +66,7 @@ prod_plane(int etus, int natnum, int *bp, int buildem)
            continue;
        }
 
-       if (pp->pln_flags & PLN_LAUNCHED) {
+       if (pln_is_in_orbit(pp)) {
            if (!player->simulation && buildem == 0
                && !(pp->pln_flags & PLN_SYNCHRONOUS))
                move_sat(pp);
@@ -95,28 +88,29 @@ prod_plane(int etus, int natnum, int *bp, int buildem)
 
 static void
 upd_plane(struct plnstr *pp, int etus,
-         struct natstr *np, int *bp, int build)
+         struct natstr *np, struct bp *bp, int build)
 {
     struct plchrstr *pcp = &plchr[(int)pp->pln_type];
     int mult, cost, eff;
 
     if (build == 1) {
-       if (np->nat_priorities[PRI_PBUILD] == 0 || np->nat_money < 0)
-           return;
-       planerepair(pp, np, bp, etus);
+       if (!pp->pln_off && np->nat_money >= 0)
+           planerepair(pp, np, bp, etus);
+       if (!player->simulation)
+           pp->pln_off = 0;
     } else {
        mult = 1;
        if (np->nat_level[NAT_TLEV] < pp->pln_tech * 0.85)
            mult = 2;
        cost = -(mult * etus * MIN(0.0, pcp->pl_cost * money_plane));
-       if ((np->nat_priorities[PRI_PMAINT] == 0 || np->nat_money < cost)
-           && !player->simulation) {
+       if (np->nat_money < cost && !player->simulation) {
            if ((eff = pp->pln_effic - etus / 5) < PLANE_MINEFF) {
                wu(0, pp->pln_own,
                   "%s lost to lack of maintenance\n", prplane(pp));
                makelost(EF_PLANE, pp->pln_own, pp->pln_uid,
                         pp->pln_x, pp->pln_y);
                pp->pln_own = 0;
+               pp->pln_ship = pp->pln_land = -1;
                return;
            }
            wu(0, pp->pln_own,
@@ -132,11 +126,9 @@ upd_plane(struct plnstr *pp, int etus,
 }
 
 static void
-planerepair(struct plnstr *pp, struct natstr *np, int *bp, int etus)
+planerepair(struct plnstr *pp, struct natstr *np, struct bp *bp, int etus)
 {
-    float leftp, buildp;
-    int left, build;
-    int mil_needed, lcm_needed, hcm_needed;
+    int build;
     int mvec[I_MAX + 1];
     struct shpstr *carrier;
     struct plchrstr *pcp = &plchr[(int)pp->pln_type];
@@ -152,7 +144,14 @@ planerepair(struct plnstr *pp, struct natstr *np, int *bp, int etus)
        if (pp->pln_effic >= 80)
            return;
        carrier = getshipp(pp->pln_ship);
-       if (CANT_HAPPEN(!carrier || carrier->shp_own != pp->pln_own))
+       if (CANT_HAPPEN(!carrier))
+           return;
+       if (carrier->shp_off)
+           return;
+       if (relations_with(carrier->shp_own, pp->pln_own) != ALLIED)
+           return;
+    } else {
+       if (relations_with(sp->sct_own, pp->pln_own) != ALLIED)
            return;
     }
 
@@ -168,7 +167,7 @@ planerepair(struct plnstr *pp, struct natstr *np, int *bp, int etus)
     if (!player->simulation)
        avail = sp->sct_avail * 100;
     else
-       avail = gt_bg_nmbr(bp, sp, I_MAX + 1) * 100;
+       avail = bp_get_avail(bp, sp) * 100;
     if (carrier)
        avail += etus * carrier->shp_item[I_MILIT] / 2;
 
@@ -178,34 +177,14 @@ planerepair(struct plnstr *pp, struct natstr *np, int *bp, int etus)
        return;
     if (delta > (int)((float)etus * plane_grow_scale))
        delta = (int)((float)etus * plane_grow_scale);
+    if (delta > 100 - pp->pln_effic)
+       delta = 100 - pp->pln_effic;
 
-    /* delta is the max amount we can grow */
-
-    left = 100 - pp->pln_effic;
-    if (left > delta)
-       left = delta;
-
-    leftp = left / 100.0;
-    memset(mvec, 0, sizeof(mvec));
-    mvec[I_MILIT] = mil_needed = ldround(pcp->pl_crew * leftp, 1);
-    mvec[I_LCM] = lcm_needed = ldround(pcp->pl_lcm * leftp, 1);
-    mvec[I_HCM] = hcm_needed = ldround(pcp->pl_hcm * leftp, 1);
-    get_materials(sp, bp, mvec, 0);
-
-    buildp = leftp;
-    if (mvec[I_MILIT] < mil_needed)
-       buildp = MIN(buildp, (float)mvec[I_MILIT] / (float)pcp->pl_crew);
-    if (mvec[I_LCM] < lcm_needed)
-       buildp = MIN(buildp, (float)mvec[I_LCM] / (float)pcp->pl_lcm);
-    if (mvec[I_HCM] < hcm_needed)
-       buildp = MIN(buildp, (float)mvec[I_HCM] / (float)pcp->pl_hcm);
-
-    build = ldround(buildp * 100.0, 1);
     memset(mvec, 0, sizeof(mvec));
-    mvec[I_MILIT] = roundavg(pcp->pl_crew * buildp);
-    mvec[I_LCM] = roundavg(pcp->pl_lcm * buildp);
-    mvec[I_HCM] = roundavg(pcp->pl_hcm * buildp);
-    get_materials(sp, bp, mvec, 1);
+    mvec[I_MILIT] = pcp->pl_crew;
+    mvec[I_LCM] = pcp->pl_lcm;
+    mvec[I_HCM] = pcp->pl_hcm;
+    build = get_materials(sp, bp, mvec, delta);
 
     if (carrier)
        build = delta;
@@ -218,14 +197,14 @@ planerepair(struct plnstr *pp, struct natstr *np, int *bp, int etus)
     if (!player->simulation)
        avail = (sp->sct_avail * 100 - used) / 100;
     else
-       avail = (gt_bg_nmbr(bp, sp, I_MAX + 1) * 100 - used) / 100;
+       avail = (bp_get_avail(bp, sp) * 100 - used) / 100;
 
     if (avail < 0)
        avail = 0;
     if (!player->simulation)
        sp->sct_avail = avail;
     else
-       pt_bg_nmbr(bp, sp, I_MAX + 1, avail);
+       bp_put_avail(bp, sp, avail);
 
     if (sp->sct_type != SCT_AIRPT)
        build /= 3;