version 1.21 | | version 1.22 |
---|
| | |
/* | | /* |
* static char *rcsid_shop_c = | | * static char *rcsid_shop_c = |
* "$Id: shop.c,v 1.21 2003/01/28 23:43:46 garbled Exp $"; | | * "$Id: shop.c,v 1.22 2003/02/09 07:30:50 garbled Exp $"; |
*/ | | */ |
| | |
/* | | /* |
| | |
#include <skills.h> | | #include <skills.h> |
#include <living.h> | | #include <living.h> |
#include <newclient.h> | | #include <newclient.h> |
#include <shop.h> | | |
#ifndef __CEXTRACT__ | | #ifndef __CEXTRACT__ |
#include <sproto.h> | | #include <sproto.h> |
#endif | | #endif |
| | |
#define NUM_COINS 3 /* number of coin types */ | | #define NUM_COINS 3 /* number of coin types */ |
static char *coins[] = {"platinacoin", "goldcoin", "silvercoin", NULL}; | | static char *coins[] = {"platinacoin", "goldcoin", "silvercoin", NULL}; |
| | |
supplydemand_t *supplydemand; | | |
| | |
| | |
/* Added F_TRUE flag to define.h to mean that the price should not | | /* Added F_TRUE flag to define.h to mean that the price should not |
* be adjusted by players charisma. With F_TRUE, it returns the amount | | * be adjusted by players charisma. With F_TRUE, it returns the amount |
* that the item is worth, if it was sold, but unadjusted by charisma. | | * that the item is worth, if it was sold, but unadjusted by charisma. |
| | |
CLEAR_FLAG(op, FLAG_UNPAID); | | CLEAR_FLAG(op, FLAG_UNPAID); |
new_draw_info_format(NDI_UNIQUE, 0, op, | | new_draw_info_format(NDI_UNIQUE, 0, op, |
"You paid %s for %s.",buf,query_name(op)); | | "You paid %s for %s.",buf,query_name(op)); |
update_sd(op, op->nrof, F_BUY); | | |
tmp=merge_ob(op,NULL); | | tmp=merge_ob(op,NULL); |
if (pl->type == PLAYER) { | | if (pl->type == PLAYER) { |
if (tmp) { /* it was merged */ | | if (tmp) { /* it was merged */ |
| | |
query_name(op)); | | query_name(op)); |
SET_FLAG(op, FLAG_UNPAID); | | SET_FLAG(op, FLAG_UNPAID); |
identify(op); | | identify(op); |
update_sd(op, op->nrof, F_SELL); | | |
} | | } |
| | |
| | |
| | |
} | | } |
free(items); | | free(items); |
} | | } |
| | |
static supplydemand_t *get_empty_sd() { | | |
supplydemand_t *sd; | | |
| | |
sd = (supplydemand_t *)malloc(sizeof(supplydemand_t)); | | |
if (sd == NULL) | | |
fatal(OUT_OF_MEMORY); | | |
sd->name = NULL; | | |
sd->title = NULL; | | |
sd->value = 0; | | |
sd->bought = 0; | | |
sd->sold = 0; | | |
sd->next = NULL; | | |
return sd; | | |
} | | |
| | |
void write_supplydb() | | |
{ | | |
char filename[MAX_BUF]; | | |
FILE *fp; | | |
supplydemand_t *spd;; | | |
| | |
sprintf(filename, "%s/supplydb", settings.localdir); | | |
if ((fp = fopen(filename, "w")) == NULL) { | | |
LOG(llevError, "Cannot open %s for writing\n", filename); | | |
return; | | |
} | | |
for (spd=supplydemand; spd != NULL && spd->next != NULL; spd=spd->next) { | | |
fprintf(fp, "name %s\n", spd->name); | | |
if (spd->title == NULL) | | |
fprintf(fp, "title NULL\n"); | | |
else | | |
fprintf(fp, "title %s\n", spd->title); | | |
fprintf(fp, "values %u %u %d\n", spd->bought, spd->sold, spd->value); | | |
} | | |
fclose(fp); | | |
} | | |
| | |
void read_supplydb() | | |
{ | | |
char filename[MAX_BUF]; | | |
char buf[MAX_BUF]; | | |
char *cp; | | |
FILE *fp; | | |
supplydemand_t *spd; | | |
| | |
sprintf(filename, "%s/supplydb", settings.localdir); | | |
LOG(llevDebug, "Reading supply and demand data from %s...", filename); | | |
if ((fp = fopen(filename, "r")) == NULL) { | | |
LOG(llevError, "Cannot open %s for reading\n", filename); | | |
spd = get_empty_sd(); | | |
spd->next = NULL; | | |
supplydemand = spd; | | |
return; | | |
} | | |
spd = get_empty_sd(); | | |
supplydemand = spd; | | |
while (fscanf(fp, "name %s\n", buf) != EOF) { | | |
spd->name = add_string(buf); | | |
fgets(buf, MAX_BUF, fp); | | |
if ((cp=strrchr(buf, '\n'))!=NULL) | | |
*cp='\0'; | | |
cp = buf; | | |
cp += 6; | | |
if (strcmp(cp, "NULL") == 0) | | |
spd->title = NULL; | | |
else | | |
spd->title = add_string(cp); | | |
fscanf(fp, "values %u %u %d\n", &spd->bought, &spd->sold, &spd->value); | | |
spd->next = get_empty_sd(); | | |
spd = spd->next; | | |
} | | |
spd->next = NULL; | | |
LOG(llevDebug, "Done.\n"); | | |
fclose(fp); | | |
} | | |
| | |
void update_sd(object *op, int nrof, int flag) | | |
{ | | |
supplydemand_t *spd, *npd; | | |
int found; | | |
| | |
found = 0; | | |
for (spd=supplydemand; spd != NULL && spd->name != NULL; spd=spd->next) { | | |
if (op->title == NULL || spd->title == NULL) { | | |
if (strcmp(spd->name, op->name) == 0) { | | |
found++; | | |
break; | | |
} | | |
} else if (strcmp(spd->name, op->name) == 0 && | | |
strcmp(spd->title, op->title) == 0) { | | |
found++; | | |
break; | | |
} | | |
} | | |
if (!found) { | | |
spd = get_empty_sd(); | | |
for (npd=supplydemand; npd->next != NULL; npd=npd->next); | | |
npd->next = spd; | | |
spd=npd; | | |
spd->value = 0; | | |
spd->bought = 0; | | |
spd->sold = 0; | | |
spd->name = add_string(op->name); | | |
if (op->title != NULL) | | |
spd->title = add_string(op->title); | | |
else | | |
spd->title = NULL; | | |
} | | |
if (nrof == 0) | | |
nrof++; | | |
if (flag == F_SELL) | | |
spd->sold += nrof; | | |
else | | |
spd->bought += nrof; | | |
spd->value = (int)(op->value*((float)(spd->bought+1)/(float)(spd->sold+1))); | | |
if (spd->value < 1) | | |
spd->value = 1; | | |
} | | |