From e16e38dfabcc9d474d88a0bdbe3fbe0a5a7a4884 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 28 Aug 2004 15:22:50 +0000 Subject: [PATCH] (trad, set): Treat trade file slots with zero owner as unused, so that freshly extended trade file makes sense. When set() removes a lot, simply zero the slot. (set): Initialize trd_uid. (trade_check_ok): Use check_land_ok() & friends instead of doing it by hand, but wrong. This fixes bying planes and land units loaded on ships that moved after loading. (check_trade_ok): New. (trade_check_ok): Use it. Remove unused argument lot. Callers changed. --- include/prototypes.h | 1 + include/trade.h | 2 +- src/lib/commands/set.c | 39 ++++++++++++++++++--------------------- src/lib/commands/trad.c | 8 ++++---- src/lib/common/check.c | 13 +++++++++++++ src/lib/subs/trdsub.c | 34 ++++++++++++++-------------------- 6 files changed, 51 insertions(+), 46 deletions(-) diff --git a/include/prototypes.h b/include/prototypes.h index a20fc5a3f..f0624b553 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -111,6 +111,7 @@ extern int check_nuke_ok(struct nukstr *); extern int check_plane_ok(struct plnstr *); extern int check_comm_ok(struct comstr *); extern int check_loan_ok(struct lonstr *); +extern int check_trade_ok(struct trdstr *); /* fsize.c */ extern int fsize(int); extern int blksize(int); diff --git a/include/trade.h b/include/trade.h index 1e56d605a..430b96117 100644 --- a/include/trade.h +++ b/include/trade.h @@ -73,7 +73,7 @@ union trdgenstr { struct shpstr shp; }; -extern int trade_check_ok(int, struct trdstr *, union trdgenstr *); +extern int trade_check_ok(struct trdstr *, union trdgenstr *); extern s_char *trade_nameof(struct trdstr *, union trdgenstr *); extern int trade_desc(struct trdstr *, union trdgenstr *); extern int trade_getitem(struct trdstr *, union trdgenstr *); diff --git a/src/lib/commands/set.c b/src/lib/commands/set.c index 09660601d..a05f3dc8d 100644 --- a/src/lib/commands/set.c +++ b/src/lib/commands/set.c @@ -116,42 +116,39 @@ set(void) freeslot = -1; snxtitem_all(&ni_trade, EF_TRADE); while (nxtitem(&ni_trade, (char *)&trade)) { - if (trade.trd_unitid < 0) + if (trade.trd_owner == 0) freeslot = ni_trade.cur; if (trade.trd_unitid == ni.cur && trade.trd_type == type) { foundslot = ni_trade.cur; break; } } - if (price == 0 && foundslot >= 0) { - pr("%s #%d (lot #%d) removed from trading\n", - trade_nameof(&trade, &item), ni.cur, foundslot); - trade.trd_type = 0; - trade.trd_owner = 0; - trade.trd_unitid = -1; - trade.trd_price = 0; - (void)time(&now); - trade.trd_markettime = now; - trade.trd_maxbidder = player->cnum; - puttrade(ni_trade.cur, &trade); - } else if (price > 0) { + if (price <= 0) { + if (foundslot >= 0) { + pr("%s #%d (lot #%d) removed from trading\n", + trade_nameof(&trade, &item), ni.cur, foundslot); + memset(&trade, 0, sizeof(trade)); + puttrade(ni_trade.cur, &trade); + } + } else { + if (foundslot >= 0) + id = foundslot; + else if (freeslot >= 0) + id = freeslot; + else { + ef_extend(EF_TRADE, 1); + id = ni_trade.cur; + } trade.trd_x = item.gen.trg_x; trade.trd_y = item.gen.trg_x; trade.trd_type = type; trade.trd_owner = player->cnum; + trade.trd_uid = id; trade.trd_unitid = ni.cur; trade.trd_price = price; (void)time(&now); trade.trd_markettime = now; trade.trd_maxbidder = player->cnum; - if (foundslot >= 0) - id = foundslot; - else if (freeslot >= 0) - id = freeslot; - else { - ef_extend(EF_TRADE, 1); - id = ni_trade.cur; - } puttrade(id, &trade); pr("%s #%d (lot #%d) price %s to $%d\n", trade_nameof(&trade, &item), ni.cur, diff --git a/src/lib/commands/trad.c b/src/lib/commands/trad.c index cb3cf0433..97ae6e5d4 100644 --- a/src/lib/commands/trad.c +++ b/src/lib/commands/trad.c @@ -98,7 +98,7 @@ trad(void) snxtitem_all(&ni, EF_TRADE); while (nxtitem(&ni, (char *)&trade)) { - if (trade.trd_unitid < 0) + if (trade.trd_owner == 0) continue; if (!trade_getitem(&trade, &tg)) { continue; @@ -205,7 +205,7 @@ trad(void) plflags = plchr[(int)tg.pln.pln_type].pl_flags; while (1) { p = getstring("Destination sector: ", buf); - if (!trade_check_ok(lotno, &trade, &tg)) + if (!trade_check_ok(&trade, &tg)) return RET_FAIL; if (p == 0) { return RET_FAIL; @@ -234,7 +234,7 @@ trad(void) if (trade.trd_type == EF_LAND) { while (1) { p = getstring("Destination sector: ", buf); - if (!trade_check_ok(lotno, &trade, &tg)) + if (!trade_check_ok(&trade, &tg)) return RET_FAIL; if (p == 0) { return RET_FAIL; @@ -266,7 +266,7 @@ trad(void) if ((p = getstring("How much do you bid: ", buf)) == 0 || *p == 0) return RET_OK; - if (!trade_check_ok(lotno, &trade, &tg)) + if (!trade_check_ok(&trade, &tg)) return RET_FAIL; bid = atoi(p); if (bid < price) diff --git a/src/lib/common/check.c b/src/lib/common/check.c index 4894091d5..35a9a2d39 100644 --- a/src/lib/common/check.c +++ b/src/lib/common/check.c @@ -161,3 +161,16 @@ check_comm_ok(struct comstr *commp) } return 1; } + +int +check_trade_ok(struct trdstr *tp) +{ + struct trdstr chktrade; + + gettrade(tp->trd_uid, &chktrade); + if (memcmp(tp, &chktrade, sizeof(struct trdstr))) { + pr("Trade lot #%d has changed!\n", tp->trd_uid); + return 0; + } + return 1; +} diff --git a/src/lib/subs/trdsub.c b/src/lib/subs/trdsub.c index d865efefb..b509cfcac 100644 --- a/src/lib/subs/trdsub.c +++ b/src/lib/subs/trdsub.c @@ -52,31 +52,25 @@ #include "optlist.h" int -trade_check_ok(int lot, struct trdstr *tp, union trdgenstr *tgp) +trade_check_ok(struct trdstr *tp, union trdgenstr *tgp) { union trdgenstr check; - struct trdstr trade; - int result = 0; + + if (!check_trade_ok(tp)) + return 0; trade_getitem(tp, &check); if (tp->trd_type == EF_LAND) - result = memcmp(&(check.lnd), &(tgp->lnd), sizeof(struct lndstr)); - else if (tp->trd_type == EF_PLANE) - result = memcmp(&(check.pln), &(tgp->pln), sizeof(struct plnstr)); - else if (tp->trd_type == EF_SHIP) - result = memcmp(&(check.shp), &(tgp->shp), sizeof(struct shpstr)); - else - result = memcmp(&(check.nuk), &(tgp->nuk), sizeof(struct nukstr)); - if (result) { - pr("That item has changed!\n"); - return 0; - } - gettrade(lot, &trade); - if (memcmp((s_char *)&trade, (s_char *)tp, sizeof(struct trdstr))) { - pr("That item has changed!\n"); - return 0; - } - return 1; + return check_land_ok(&tgp->lnd); + if (tp->trd_type == EF_PLANE) + return check_plane_ok(&tgp->pln); + if (tp->trd_type == EF_SHIP) + return check_ship_ok(&tgp->shp); + if (tp->trd_type == EF_NUKE) + return check_nuke_ok(&tgp->nuk); + CANT_HAPPEN("Bad TRD_TYPE"); + pr("Trade lot #%d went bad!\n", tp->trd_uid); + return 0; } s_char * -- 2.43.0