btmux/autom4te.cache/
btmux/doc/.svn/
btmux/event/.svn/
btmux/game/.svn/
btmux/game/bin/.svn/
btmux/game/data/.svn/
btmux/game/logs/.svn/
btmux/game/maps/
btmux/game/maps/.svn/
btmux/game/maps/.svn/prop-base/
btmux/game/maps/.svn/props/
btmux/game/maps/.svn/text-base/
btmux/game/maps/.svn/wcprops/
btmux/game/mechs/
btmux/game/mechs/.svn/
btmux/game/mechs/.svn/prop-base/
btmux/game/mechs/.svn/props/
btmux/game/mechs/.svn/text-base/
btmux/game/mechs/.svn/wcprops/
btmux/game/text/.svn/
btmux/include/.svn/
btmux/misc/
btmux/misc/.svn/
btmux/misc/.svn/prop-base/
btmux/misc/.svn/props/
btmux/misc/.svn/text-base/
btmux/misc/.svn/wcprops/
btmux/python/
btmux/python/.svn/
btmux/python/.svn/prop-base/
btmux/python/.svn/props/
btmux/python/.svn/text-base/
btmux/python/.svn/wcprops/
btmux/src/.svn/prop-base/
btmux/src/.svn/props/
btmux/src/.svn/text-base/
btmux/src/.svn/wcprops/
btmux/src/hcode/.svn/
btmux/src/hcode/btech/
btmux/src/hcode/btech/.svn/
btmux/src/hcode/btech/.svn/prop-base/
btmux/src/hcode/btech/.svn/props/
btmux/src/hcode/btech/.svn/text-base/
btmux/src/hcode/btech/.svn/wcprops/
btmux/src/hcode/include/.svn/
/*
 * $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);
}