void read_line(FILE * shop_f, char *string, void *data) { if (!get_line(shop_f, buf) || !sscanf(buf, string, data)) { fprintf(stderr, "Error in shop #%d\n", SHOP_NUM(top_shop)); exit(1); } }
/* * Ew, linear search, O(n) */ int real_shop(int vshop_num) { int rshop_num; for (rshop_num = 0; rshop_num <= top_shop; rshop_num++) if (SHOP_NUM(rshop_num) == vshop_num) return rshop_num; return NOWHERE; }
/* List all shops in a zone. */ static void list_shops(struct char_data *ch, zone_rnum rnum, shop_vnum vmin, shop_vnum vmax) { shop_rnum i; shop_vnum bottom, top; int j, counter = 0; if (rnum != NOWHERE) { bottom = zone_table[rnum].bot; top = zone_table[rnum].top; } else { bottom = vmin; top = vmax; } send_to_char (ch, "Index VNum RNum Shop Room(s)\r\n" "----- ------- ------- -----------------------------------------\r\n"); for (i = 0; i <= top_shop; i++) { if (SHOP_NUM(i) >= bottom && SHOP_NUM(i) <= top) { counter++; /* the +1 is strange but fits the rest of the shop code */ send_to_char(ch, "%s%4d%s) [%s%-5d%s] [%s%-5d%s]", QGRN, counter, QNRM, QGRN, SHOP_NUM(i), QNRM, QGRN, i + 1, QNRM); /* Thanks to Ken Ray for this display fix. -Welcor */ for (j = 0; SHOP_ROOM(i, j) != NOWHERE; j++) send_to_char(ch, "%s%s[%s%-5d%s]%s", ((j > 0) && (j % 6 == 0)) ? "\r\n " : " ", QCYN, QYEL, SHOP_ROOM(i, j), QCYN, QNRM); if (j == 0) send_to_char(ch, "%sNone.%s", QCYN, QNRM); send_to_char(ch, "\r\n"); } } if (counter == 0) send_to_char(ch, "None found.\r\n"); }
int add_shop(struct shop_data *nshp) { shop_rnum rshop; int found = 0; zone_rnum rznum = real_zone_by_thing(S_NUM(nshp)); /* * The shop already exists, just update it. */ if ((rshop = real_shop(S_NUM(nshp))) != NOWHERE) { free_shop_strings(&shop_index[rshop]); copy_shop(&shop_index[rshop], nshp); if (rznum != NOWHERE) add_to_save_list(zone_table[rznum].number, SL_SHP); else mudlog("SYSERR: GenOLC: Cannot determine shop zone.", BRF, LVL_BUILDER, TRUE); return rshop; } top_shop++; RECREATE(shop_index, struct shop_data, top_shop + 1); for (rshop = top_shop; rshop > 0; rshop--) { if (nshp->vnum > SHOP_NUM(rshop - 1)) { found = rshop; /* Make a "nofree" variant and remove these later. */ shop_index[rshop].in_room = NULL; shop_index[rshop].producing = NULL; shop_index[rshop].type = NULL; copy_shop(&shop_index[rshop], nshp); break; } shop_index[rshop] = shop_index[rshop - 1]; } if (!found) { /* Make a "nofree" variant and remove these later. */ shop_index[rshop].in_room = NULL; shop_index[rshop].producing = NULL; shop_index[rshop].type = NULL; copy_shop(&shop_index[0], nshp); } if (rznum != NOWHERE) add_to_save_list(zone_table[rznum].number, SL_SHP); else mudlog("SYSERR: GenOLC: Cannot determine shop zone.", BRF, LVL_BUILDER, TRUE); return rshop; }
void boot_the_shops(FILE * shop_f, char *filename, int rec_count) { char *buf, buf2[150]; int temp, count, new_format = 0; struct shop_buy_data list[MAX_SHOP_OBJ + 1]; int done = 0; sprintf(buf2, "beginning of shop file %s", filename); while (!done) { buf = fread_string(shop_f, buf2); if (*buf == '#') { /* New shop */ sscanf(buf, "#%d\n", &temp); sprintf(buf2, "shop #%d in shop file %s", temp, filename); FREE(buf); /* Plug memory leak! */ if (!top_shop) CREATE(shop_index, struct shop_data, rec_count); SHOP_NUM(top_shop) = temp; temp = read_list(shop_f, list, new_format, MAX_PROD, LIST_PRODUCE); CREATE(shop_index[top_shop].producing, int, temp); for (count = 0; count < temp; count++) SHOP_PRODUCT(top_shop, count) = BUY_TYPE(list[count]); read_line(shop_f, "%f", &SHOP_BUYPROFIT(top_shop)); read_line(shop_f, "%f", &SHOP_SELLPROFIT(top_shop)); temp = read_type_list(shop_f, list, new_format, MAX_TRADE); CREATE(shop_index[top_shop].type, struct shop_buy_data, temp); for (count = 0; count < temp; count++) { SHOP_BUYTYPE(top_shop, count) = (byte) BUY_TYPE(list[count]); SHOP_BUYWORD(top_shop, count) = BUY_WORD(list[count]); } shop_index[top_shop].no_such_item1 = fread_string(shop_f, buf2); shop_index[top_shop].no_such_item2 = fread_string(shop_f, buf2); shop_index[top_shop].do_not_buy = fread_string(shop_f, buf2); shop_index[top_shop].missing_cash1 = fread_string(shop_f, buf2); shop_index[top_shop].missing_cash2 = fread_string(shop_f, buf2); shop_index[top_shop].message_buy = fread_string(shop_f, buf2); shop_index[top_shop].message_sell = fread_string(shop_f, buf2); read_line(shop_f, "%d", &SHOP_BROKE_TEMPER(top_shop)); read_line(shop_f, "%d", &SHOP_BITVECTOR(top_shop)); read_line(shop_f, "%d", &SHOP_KEEPER(top_shop)); SHOP_KEEPER(top_shop) = real_mobile(SHOP_KEEPER(top_shop)); read_line(shop_f, "%d", &SHOP_TRADE_WITH(top_shop)); temp = read_list(shop_f, list, new_format, 1, LIST_ROOM); CREATE(shop_index[top_shop].in_room, int, temp); for (count = 0; count < temp; count++) SHOP_ROOM(top_shop, count) = BUY_TYPE(list[count]); read_line(shop_f, "%d", &SHOP_OPEN1(top_shop)); read_line(shop_f, "%d", &SHOP_CLOSE1(top_shop)); read_line(shop_f, "%d", &SHOP_OPEN2(top_shop)); read_line(shop_f, "%d", &SHOP_CLOSE2(top_shop)); SHOP_BANK(top_shop) = 0; SHOP_SORT(top_shop) = 0; SHOP_FUNC(top_shop) = 0; top_shop++; } else { if (*buf == '$') /* EOF */
/* Prints all of the zone information for the selected zone. */ void print_zone(struct char_data *ch, zone_vnum vnum) { zone_rnum rnum; int size_rooms, size_objects, size_mobiles, size_quests, size_shops, size_trigs, i, largest_table; room_vnum top, bottom; char buf[MAX_STRING_LENGTH]; if ((rnum = real_zone(vnum)) == NOWHERE) { send_to_char(ch, "Zone #%d does not exist in the database.\r\n", vnum); return; } /* Locate the largest of the three, top_of_world, top_of_mobt, or top_of_objt. */ if (top_of_world >= top_of_objt && top_of_world >= top_of_mobt) largest_table = top_of_world; else if (top_of_objt >= top_of_mobt && top_of_objt >= top_of_world) largest_table = top_of_objt; else largest_table = top_of_mobt; /* Initialize some of the variables. */ size_rooms = 0; size_objects = 0; size_mobiles = 0; size_shops = 0; size_trigs = 0; size_quests = 0; top = zone_table[rnum].top; bottom = zone_table[rnum].bot; for (i = 0; i <= largest_table; i++) { if (i <= top_of_world) if (world[i].zone == rnum) size_rooms++; if (i <= top_of_objt) if (obj_index[i].vnum >= bottom && obj_index[i].vnum <= top) size_objects++; if (i <= top_of_mobt) if (mob_index[i].vnum >= bottom && mob_index[i].vnum <= top) size_mobiles++; } for (i = 0; i<= top_shop; i++) if (SHOP_NUM(i) >= bottom && SHOP_NUM(i) <= top) size_shops++; for (i = 0; i < top_of_trigt; i++) if (trig_index[i]->vnum >= bottom && trig_index[i]->vnum <= top) size_trigs++; size_quests = count_quests(bottom, top); sprintbitarray(zone_table[rnum].zone_flags, zone_bits, ZN_ARRAY_MAX, buf); /* Display all of the zone information at once. */ send_to_char(ch, "%sVirtual Number = %s%d\r\n" "%sName of zone = %s%s\r\n" "%sBuilders = %s%s\r\n" "%sLifespan = %s%d\r\n" "%sAge = %s%d\r\n" "%sBottom of Zone = %s%d\r\n" "%sTop of Zone = %s%d\r\n" "%sReset Mode = %s%s\r\n" "%sZone Flags = %s%s\r\n" "%sMin Level = %s%d\r\n" "%sMax Level = %s%d\r\n" "%sSize\r\n" "%s Rooms = %s%d\r\n" "%s Objects = %s%d\r\n" "%s Mobiles = %s%d\r\n" "%s Shops = %s%d\r\n" "%s Triggers = %s%d\r\n" "%s Quests = %s%d%s\r\n", QGRN, QCYN, zone_table[rnum].number, QGRN, QCYN, zone_table[rnum].name, QGRN, QCYN, zone_table[rnum].builders, QGRN, QCYN, zone_table[rnum].lifespan, QGRN, QCYN, zone_table[rnum].age, QGRN, QCYN, zone_table[rnum].bot, QGRN, QCYN, zone_table[rnum].top, QGRN, QCYN, zone_table[rnum].reset_mode ? ((zone_table[rnum].reset_mode == 1) ? "Reset when no players are in zone." : "Normal reset.") : "Never reset", QGRN, QCYN, buf, QGRN, QCYN, zone_table[rnum].min_level, QGRN, QCYN, zone_table[rnum].max_level, QGRN, QGRN, QCYN, size_rooms, QGRN, QCYN, size_objects, QGRN, QCYN, size_mobiles, QGRN, QCYN, size_shops, QGRN, QCYN, size_trigs, QGRN, QCYN, size_quests, QNRM); }