X-Git-Url: http://git.pond.sub.org/?p=empserver;a=blobdiff_plain;f=src%2Flib%2Fcommands%2Fbuy.c;h=72afa28c20e10c86349a77d15dfadd1a31864f9d;hp=2188239b8879900d47c00e86ade93ddc562d9fe6;hb=a021a20e551f1f0ab05ad6da336dc28c83a10075;hpb=cd73a47dfa90dbca72d0d9e2561733e085aeb98a diff --git a/src/lib/commands/buy.c b/src/lib/commands/buy.c index 2188239b8..72afa28c2 100644 --- a/src/lib/commands/buy.c +++ b/src/lib/commands/buy.c @@ -1,11 +1,11 @@ /* * Empire - A multi-player, client/server Internet based war game. - * Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak, - * Ken Stevens, Steve McClure + * Copyright (C) 1986-2021, 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 . * * --- * @@ -26,32 +25,23 @@ * --- * * buy.c: Buy commodities from other nations - * + * * Known contributors to this file: * Dave Pare, 1986 * Pat Loney, 1992 * Steve McClure, 1996-2000 + * Markus Armbruster, 2004-2021 */ #include -#include "misc.h" -#include "xy.h" -#include "file.h" -#include "sect.h" -#include "nat.h" -#include "news.h" -#include "nsc.h" -#include "item.h" -#include "land.h" -#include "commodity.h" -#include "plane.h" -#include "ship.h" -#include "trade.h" -#include "player.h" -#include "loan.h" +#include "chance.h" #include "commands.h" +#include "commodity.h" +#include "item.h" +#include "news.h" #include "optlist.h" +#include "trade.h" /* * format: buy @@ -63,12 +53,11 @@ buy(void) struct sctstr sect; struct natstr *natp; struct comstr comm; - struct comstr ncomm; struct comstr comt; struct trdstr tmpt; struct ichrstr *ip; int qty; - int o, n, q; + int o, n; coord x, y; char *p; float bid; @@ -88,7 +77,7 @@ buy(void) display_mark(ip->i_uid, 0); pr("\n"); p = getstarg(player->argp[2], "Which lot are you bidding on: ", buf); - if (p == 0) + if (!p) return RET_SYN; if (*p == 0) return RET_SYN; @@ -107,11 +96,13 @@ buy(void) pr("You can't bid on your own lot.\n"); return RET_OK; } - if ((p = getstarg(player->argp[3], "How much per unit: ", buf)) == 0) + if (!(p = getstarg(player->argp[3], "How much per unit: ", buf))) return RET_SYN; bid = atof(p); if (bid <= 0) return RET_FAIL; + if (!check_comm_ok(&comm)) + return RET_FAIL; if (natp->nat_money < bid * comm.com_amount * buytax) { pr("This purchase would cost %.2f, %.2f more than you have.\n", bid * comm.com_amount * buytax, @@ -122,20 +113,21 @@ buy(void) would make him go broke. Ken, I ought to skin you alive for making me code this part up.*/ tally = 0.0; - for (q = 0; gettrade(q, &tmpt); q++) { + for (n = 0; gettrade(n, &tmpt); n++) { + if (!tmpt.trd_owner) + continue; if (tmpt.trd_maxbidder == player->cnum && - tmpt.trd_unitid >= 0 && tmpt.trd_owner != player->cnum) { + tmpt.trd_owner != player->cnum) { tally += tmpt.trd_price * tradetax; } } - for (q = 0; getcomm(q, &comt); q++) { + for (n = 0; getcomm(n, &comt); n++) { if (comt.com_maxbidder == player->cnum && comt.com_owner != 0 && comt.com_owner != player->cnum) { tally += comt.com_price * comt.com_amount * buytax; } } canspend = natp->nat_money - tally; - getcomm(o, &comm); if (bid * comm.com_amount * buytax > canspend) { pr("You have overextended yourself in the market\n"); pr("You can not bid on the current items at that price.\n"); @@ -149,6 +141,8 @@ buy(void) pr("Could not access sector"); return RET_FAIL; } + if (!check_comm_ok(&comm)) + return RET_FAIL; if ((sect.sct_type != SCT_WAREH && sect.sct_type != SCT_HARBR) || sect.sct_own != player->cnum) { pr("The destination sector is not one of your warehouses.\n"); @@ -169,23 +163,12 @@ buy(void) pr("You don't have that much to spend!\n"); return RET_FAIL; } - getcomm(o, &ncomm); - if (!ncomm.com_owner) { - pr("That lot has been taken off the market.\n"); - return RET_FAIL; - } if (bid > 0.04 + comm.com_price) { comm.com_price = bid; - /* Add five minutes to the time if less than 5 minutes */ time(&now); - if (((MARK_DELAY - (now - comm.com_markettime)) < 300) && - comm.com_maxbidder != player->cnum) { - comm.com_markettime += 300; - /* Special case - what if so much time has gone by? Well, - Just reset the markettime so that only 5 minutes are left */ - if ((MARK_DELAY - (now - comm.com_markettime)) < 0) - comm.com_markettime = (now - (MARK_DELAY - 300)); - } + if (comm.com_markettime + MARK_DELAY - now < minutes(5) && + comm.com_maxbidder != player->cnum) + comm.com_markettime = now + minutes(5) - MARK_DELAY; comm.com_maxbidder = player->cnum; comm.com_x = x; comm.com_y = y; @@ -211,53 +194,28 @@ check_market(void) int m; int n; time_t now; - double tmoney; - double tleft; - double subleft; - double monleft; double gain; double price; -/* logerror("Checking the market.\n");*/ for (n = 0; getcomm(n, &comm); n++) { if (comm.com_maxbidder == comm.com_owner || comm.com_owner == 0) continue; (void)time(&now); - tleft = MARK_DELAY / 3600.0 - (now - comm.com_markettime) / 3600.0; - if (tleft < 0) - tleft = 0; - if (tleft > 0.0) + if (comm.com_markettime + MARK_DELAY > now) continue; if (CANT_HAPPEN(comm.com_type <= I_NONE || comm.com_type > I_MAX)) continue; sect = getsectp(comm.com_x, comm.com_y); m = sect->sct_item[comm.com_type]; - monleft = 0; - price = comm.com_price * comm.com_amount * buytax; gain = comm.com_price * comm.com_amount; natp = getnatp(comm.com_maxbidder); - tmoney = natp->nat_money; - if (tmoney <= 0) - monleft = price; - if (tmoney < price && tmoney > 0) { - monleft = price - (tmoney - 1); - tmoney = 1; - price = price - monleft; - } else if (tmoney > 0) { - monleft = 0; - tmoney = tmoney - price; - } - - /* Subtract the amount of money that needs to come out in a loan. */ - subleft = monleft; - - if (monleft > 0) { + if (natp->nat_money < price) { nreport(comm.com_maxbidder, N_WELCH_DEAL, comm.com_owner, 1); wu(0, comm.com_maxbidder, - "You didn't have enough cash/credit to cover the cost.\n"); + "You didn't have enough cash to cover the cost.\n"); wu(0, comm.com_owner, "Sale #%d fell through. Goods remain on the market.\n", n); comm.com_maxbidder = comm.com_owner; @@ -284,17 +242,16 @@ check_market(void) wu(0, comm.com_maxbidder, "You just bought %d %s from %s for $%.2f\n", comm.com_amount, ichr[comm.com_type].i_name, - cname(comm.com_owner), gain * buytax); + cname(comm.com_owner), price); + natp->nat_money -= roundavg(price); + putnat(natp); natp = getnatp(comm.com_owner); - /* Make sure we subtract the amount that came out in a loan */ - natp->nat_money += (gain - subleft); - natp = getnatp(comm.com_maxbidder); - natp->nat_money = tmoney; + natp->nat_money += roundavg(gain); + putnat(natp); comm.com_owner = 0; } comm.com_owner = 0; putcomm(n, &comm); } -/* logerror("Done checking the market.\n");*/ return RET_OK; }