X-Git-Url: http://git.pond.sub.org/?p=empserver;a=blobdiff_plain;f=src%2Flib%2Fsubs%2Flndsub.c;h=2dd7f388252e58b0917d4d5006f7f6b91b19b7bc;hp=2f344594003607d5c62192ae236a67a595f2f704;hb=beedf8dce;hpb=74a71aa007eb75c6adfec4cefca52a8aebf5e634 diff --git a/src/lib/subs/lndsub.c b/src/lib/subs/lndsub.c index 2f3445940..2dd7f3882 100644 --- a/src/lib/subs/lndsub.c +++ b/src/lib/subs/lndsub.c @@ -54,7 +54,6 @@ static void lnd_mar_put_one(struct ulist *); static int lnd_check_one_mines(struct ulist *, int); -static void lnd_stays(natid, char *, struct ulist *); static int lnd_hit_mine(struct lndstr *); static int has_helpful_engineer(coord, coord, natid); @@ -574,7 +573,7 @@ lnd_mar_put_one(struct ulist *llp) lnd_put_one(llp); } -static void +void lnd_mar_put(struct emp_qelem *list, natid actor) { struct emp_qelem *qp, *next; @@ -691,11 +690,7 @@ lnd_sweep(struct emp_qelem *land_list, int explicit, int takemob, sect.sct_item[I_SHELL] = sshells; putland(llp->unit.land.lnd_uid, &llp->unit.land); putsect(§); - if (lnd_check_one_mines(llp, 1)) { - stopping = 1; - emp_remque(qp); - free(qp); - } + stopping |= lnd_check_one_mines(llp, 1); } return stopping; } @@ -715,8 +710,11 @@ lnd_check_one_mines(struct ulist *llp, int with_eng) sect.sct_mines--; putsect(§); putland(llp->unit.land.lnd_uid, &llp->unit.land); - if (!llp->unit.land.lnd_own) - return 1; + if (!llp->unit.land.lnd_own) { + emp_remque(&llp->queue); + free(llp); + } + return 1; } return 0; } @@ -726,31 +724,16 @@ lnd_check_mines(struct emp_qelem *land_list) { struct emp_qelem *qp; struct emp_qelem *next; - struct ulist *llp; int stopping = 0; int with_eng = !!lnd_find_capable(land_list, L_ENGINEER); for (qp = land_list->q_back; qp != land_list; qp = next) { next = qp->q_back; - llp = (struct ulist *)qp; - if (lnd_check_one_mines(llp, with_eng)) { - stopping = 1; - emp_remque(qp); - free(qp); - } + stopping |= lnd_check_one_mines((struct ulist *)qp, with_eng); } return stopping; } -static void -lnd_stays(natid actor, char *str, struct ulist *llp) -{ - mpr(actor, "%s %s & stays in %s\n", - prland(&llp->unit.land), str, - xyas(llp->unit.land.lnd_x, llp->unit.land.lnd_y, actor)); - lnd_mar_put_one(llp); -} - /* Return whether and why SP would be stuck in SECTP. */ enum lnd_stuck lnd_check_mar(struct lndstr *lp, struct sctstr *sectp) @@ -1021,7 +1004,7 @@ int lnd_abandon_askyn(struct emp_qelem *list) } int -lnd_mar_one_sector(struct emp_qelem *list, int dir, natid actor) +lnd_mar_dir(struct emp_qelem *list, int dir, natid actor) { struct sctstr sect, osect; struct emp_qelem *qp; @@ -1032,9 +1015,6 @@ lnd_mar_one_sector(struct emp_qelem *list, int dir, natid actor) coord newx; coord newy; int move; - int stopping = 0; - int visible; - char dp[80]; int rel; int oldown; @@ -1092,12 +1072,17 @@ lnd_mar_one_sector(struct emp_qelem *list, int dir, natid actor) llp = (struct ulist *)qp; if (rel != ALLIED && !(lchr[llp->unit.land.lnd_type].l_flags & L_SPY)) { - sprintf(dp, "can't go to %s", xyas(newx, newy, actor)); - lnd_stays(actor, dp, llp); + mpr(actor, "%s can't go to %s & stays in %s\n", + prland(&llp->unit.land), xyas(newx, newy, actor), + xyas(llp->unit.land.lnd_x, llp->unit.land.lnd_y, actor)); + lnd_mar_put_one(llp); continue; } if (llp->mobil <= 0.0) { - lnd_stays(actor, "is out of mobility", llp); + mpr(actor, "%s is out of mobility & stays in %s\n", + prland(&llp->unit.land), + xyas(llp->unit.land.lnd_x, llp->unit.land.lnd_y, actor)); + lnd_mar_put_one(llp); continue; } llp->unit.land.lnd_x = newx; @@ -1135,9 +1120,21 @@ lnd_mar_one_sector(struct emp_qelem *list, int dir, natid actor) } } } - if (QEMPTY(list)) - return stopping; - stopping |= lnd_sweep(list, 0, 1, actor); + + return 0; +} + +int +lnd_mar_gauntlet(struct emp_qelem *list, int interdict, natid actor) +{ + struct ulist *mlp = (struct ulist *)list->q_back; + coord newx = mlp->unit.land.lnd_x; + coord newy = mlp->unit.land.lnd_y; + int stopping, visible; + struct emp_qelem *qp, *next; + struct ulist *llp; + + stopping = lnd_sweep(list, 0, 1, actor); if (QEMPTY(list)) return stopping; stopping |= lnd_check_mines(list); @@ -1151,7 +1148,7 @@ lnd_mar_one_sector(struct emp_qelem *list, int dir, natid actor) if (!(lchr[(int)llp->unit.land.lnd_type].l_flags & L_SPY)) visible = 1; } - if (visible) + if (visible && interdict) stopping |= lnd_interdict(list, newx, newy, actor); return stopping;