btmux-0.6-rc4/doc/
btmux-0.6-rc4/event/
btmux-0.6-rc4/game/
btmux-0.6-rc4/game/maps/
btmux-0.6-rc4/game/mechs/
btmux-0.6-rc4/game/text/help/
btmux-0.6-rc4/game/text/help/cat_faction/
btmux-0.6-rc4/game/text/help/cat_inform/
btmux-0.6-rc4/game/text/help/cat_misc/
btmux-0.6-rc4/game/text/help/cat_mux/
btmux-0.6-rc4/game/text/help/cat_mux/cat_commands/
btmux-0.6-rc4/game/text/help/cat_mux/cat_functions/
btmux-0.6-rc4/game/text/help/cat_templates/
btmux-0.6-rc4/game/text/wizhelp/
btmux-0.6-rc4/include/
btmux-0.6-rc4/misc/
btmux-0.6-rc4/python/
btmux-0.6-rc4/src/hcode/btech/
btmux-0.6-rc4/tree/
/*
 * $Id: econ.c,v 1.1.1.1 2005/01/11 21:18:06 kstevens Exp $
 *
 * Author: Markus Stenberg <fingon@iki.fi>
 *
 *  Copyright (c) 1996 Markus Stenberg
 *  Copyright (c) 1998-2002 Thomas Wouters
 *  Copyright (c) 2000-2002 Cord Awtry
 *       All rights reserved
 *
 * Created: Sat Oct  5 14:06:02 1996 fingon
 * Last modified: Sat Apr 19 13:54:56 1997 fingon
 *
 */

/* Idea:
   Store the parts in an attribute on object

   Format:
   [id,brand,count]{,[id,brand,count],..}
 */

#include "mech.h"

extern char *silly_atr_get(int id, int flag);
extern void silly_atr_set(int id, int flag, char *dat);

/* entry = pointer to [ */
static void remove_entry(char *alku, char *entry)
{
	char *j;

	if(!(j = strstr(entry, "]")))
		return;
	j++;
	if(*j) {
		/* Move the remainder of the string, including the terminating NUL,
		   but not including the separating comma */
		j++;
		memmove(entry, j, strlen(j) + 1);
	} else {
		if(entry == alku)
			*alku = '\0';
		else
			*(entry - 1) = '\0';
	}
}

static void add_entry(char *to, char *data)
{
	if(*to)
		sprintf(to + strlen(to), ",[%s]", data);
	else
		sprintf(to, "[%s]", data);
}

static char *find_entry(char *s, int i, int b)
{
	char buf[MBUF_SIZE];

	sprintf(buf, "[%d,%d,", i, b);
	return strstr(s, buf);
}

extern char *get_parts_short_name(int, int);

void econ_change_items(dbref d, int id, int brand, int num)
{
	char *t, *u;
	int base = 0, i1, i2, i3;

	if(!Good_obj(d))
		return;
	if(brand)
		if(get_parts_short_name(id, brand) == get_parts_short_name(id, 0))
			brand = 0;
	t = silly_atr_get(d, A_ECONPARTS);
	if((u = find_entry(t, id, brand))) {
		if(sscanf(u, "[%d,%d,%d]", &i1, &i2, &i3) == 3)
			base += i3;
		remove_entry(t, u);
	}
	base += num;
	if(base <= 0) {
		if(u)
			silly_atr_set(d, A_ECONPARTS, t);
		return;
	}
	if(!(IsActuator(id)))
		add_entry(t, tprintf("%d,%d,%d", id, brand, base));
	silly_atr_set(d, A_ECONPARTS, t);
	if(IsActuator(id))
		econ_change_items(d, Cargo(S_ACTUATOR), brand, base);
	/* Successfully changed */
}

int econ_find_items(dbref d, int id, int brand)
{
	char *t, *u;
	int i1, i2, i3;

	if(!Good_obj(d))
		return 0;
	if(brand)
		if(get_parts_short_name(id, brand) == get_parts_short_name(id, 0))
			brand = 0;
	t = silly_atr_get(d, A_ECONPARTS);
	if((u = find_entry(t, id, brand)))
		if(sscanf(u, "[%d,%d,%d]", &i1, &i2, &i3) == 3)
			return i3;
	return 0;
}

void econ_set_items(dbref d, int id, int brand, int num)
{
	int i;

	if(!Good_obj(d))
		return;
	i = econ_find_items(d, id, brand);
	if(i != num)
		econ_change_items(d, id, brand, num - i);
}