#ifndef lint
static char *RCSid = "$Header: /usr/brule/guest/empire/empire/emprcs/lib/commands/set.c,v 2.1 1995/08/02 03:38:35 empire Exp $";
#endif

/*
 * set.c
 *
 * Place units on-sale.
 *
 * Dave Pare, 1986
 */

#include "misc.h"
#include "player.h"
#include "var.h"
#include "sect.h"
#include "ship.h"
#include "land.h"
#include "nuke.h"
#include "plane.h"
#include "xy.h"
#include "nsc.h"
#include "nat.h"
#include "trade.h"
#include "file.h"

/*
 * format: set <type> <SHIP/NUKE> <PRICE>
 */
set()
{
	s_char   *p;
	int	type;
	int	price;
	s_char	prompt[128];
	struct	trdstr trade;
	struct	nstr_item ni;
	struct	nstr_item ni_trade;
	union	trdgenstr item;
	struct	sctstr sect;
	int	freeslot;
	int	foundslot;
	int	id;
	s_char	buf[1024];

	if ((p = getstarg(player->argp[1], "Item type? ", buf)) == 0 || *p == 0)
		return RET_SYN;
	if ((type = ef_byname(p)) < 0) {
		pr("%s: not an item type\n", p);
		return RET_SYN;
	}
	if (type == EF_SECTOR)
		type = EF_SHIP;
	if (!snxtitem(&ni, type, player->argp[2]))
		return RET_SYN;
	while (nxtitem(&ni, (s_char *)&item)) {
		if (!player->owner)
			continue;
		getsect(item.gen.trg_x, item.gen.trg_y, &sect);
		/*
		 * military control necessary to sell
		 * goodies in occupied territory.
		 */
		if (sect.sct_oldown != player->cnum) {
			int     tot_mil=0;
			struct  nstr_item ni;
			struct  lndstr land;
			snxtitem_xy(&ni, EF_LAND, sect.sct_x, sect.sct_y);
			while (nxtitem(&ni, (s_char *)&land)){
				if (land.lnd_own == player->cnum)
					tot_mil  += total_mil(&land);
			}
			if ((getvar(V_MILIT,(s_char *)&sect,EF_SECTOR)+tot_mil)
				*10 <getvar(V_CIVIL,(s_char *)&sect,EF_SECTOR)){
			      pr("Military control required to sell goods.\n");
				return RET_FAIL;
			}
		}
		trade.trd_type = type;
		sprintf(prompt, "%s #%d; Price? ",
			trade_nameof(&trade, &item), ni.cur);
		if ((p = getstarg(player->argp[3], prompt, buf)) == 0 || *p == 0)
			break;
		if ((price = atoi(p)) < 0)
			continue;
		if (!ef_lock(EF_TRADE)) {
			logerror("can't lock trdae file");
			return RET_SYS;
		}
		foundslot = -1;
		freeslot = -1;
		snxtitem_all(&ni_trade, EF_TRADE);
		while (nxtitem(&ni_trade, (s_char *)&trade)) {
			if (trade.trd_unitid < 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;
			puttrade(ni_trade.cur, &trade);
		} else if (price > 0) {
			trade.trd_type = type;
			trade.trd_owner = player->cnum;
			trade.trd_unitid = ni.cur;
			trade.trd_price = price;
			if (foundslot >= 0)
				id = foundslot;
			else if (freeslot >= 0)
				id = freeslot;
			else
				id = ni_trade.cur;
			puttrade(id, &trade);
			pr("%s #%d (lot #%d) price %s to $%d\n",
				trade_nameof(&trade, &item), ni.cur,
				id, foundslot >= 0 ? "reset" : "set", price);
		}
		ef_unlock(EF_TRADE);
	}
	return RET_OK;
}
