void sedit_parse(struct descriptor_data *d, char *arg) { int i; if (OLC_MODE(d) > SEDIT_NUMERICAL_RESPONSE) { if (!isdigit(arg[0]) && ((*arg == '-') && (!isdigit(arg[1])))) { write_to_output(d, "Field must be numerical, try again : "); return; } } switch (OLC_MODE(d)) { /*-------------------------------------------------------------------*/ case SEDIT_CONFIRM_SAVESTRING: switch (*arg) { case 'y': case 'Y': sedit_save_internally(d); mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits shop %d", GET_NAME(d->character), OLC_NUM(d)); if (CONFIG_OLC_SAVE) { sedit_save_to_disk(real_zone_by_thing(OLC_NUM(d))); write_to_output(d, "Shop saved to disk.\r\n"); } else write_to_output(d, "Shop saved to memory.\r\n"); cleanup_olc(d, CLEANUP_STRUCTS); return; case 'n': case 'N': cleanup_olc(d, CLEANUP_ALL); return; default: write_to_output(d, "Invalid choice!\r\nDo you wish to save your changes? : "); return; } break; /*-------------------------------------------------------------------*/ case SEDIT_MAIN_MENU: i = 0; switch (*arg) { case 'q': case 'Q': if (OLC_VAL(d)) { /* Anything been changed? */ write_to_output(d, "Do you wish to save your changes? : "); OLC_MODE(d) = SEDIT_CONFIRM_SAVESTRING; } else cleanup_olc(d, CLEANUP_ALL); return; case '0': OLC_MODE(d) = SEDIT_KEEPER; write_to_output(d, "Enter vnum number of shop keeper : "); return; case '1': OLC_MODE(d) = SEDIT_OPEN1; i++; break; case '2': OLC_MODE(d) = SEDIT_CLOSE1; i++; break; case '3': OLC_MODE(d) = SEDIT_OPEN2; i++; break; case '4': OLC_MODE(d) = SEDIT_CLOSE2; i++; break; case '5': OLC_MODE(d) = SEDIT_BUY_PROFIT; i++; break; case '6': OLC_MODE(d) = SEDIT_SELL_PROFIT; i++; break; case '7': OLC_MODE(d) = SEDIT_NOITEM1; i--; break; case '8': OLC_MODE(d) = SEDIT_NOITEM2; i--; break; case '9': OLC_MODE(d) = SEDIT_NOCASH1; i--; break; case 'a': case 'A': OLC_MODE(d) = SEDIT_NOCASH2; i--; break; case 'b': case 'B': OLC_MODE(d) = SEDIT_NOBUY; i--; break; case 'c': case 'C': OLC_MODE(d) = SEDIT_BUY; i--; break; case 'd': case 'D': OLC_MODE(d) = SEDIT_SELL; i--; break; case 'e': case 'E': sedit_no_trade_menu(d); return; case 'f': case 'F': sedit_shop_flags_menu(d); return; case 'r': case 'R': sedit_rooms_menu(d); return; case 'p': case 'P': sedit_products_menu(d); return; case 't': case 'T': sedit_namelist_menu(d); return; default: sedit_disp_menu(d); return; } if (i == 0) break; else if (i == 1) write_to_output(d, "\r\nEnter new value : "); else if (i == -1) write_to_output(d, "\r\nEnter new text :\r\n] "); else write_to_output(d, "Oops...\r\n"); return; /*-------------------------------------------------------------------*/ case SEDIT_NAMELIST_MENU: switch (*arg) { case 'a': case 'A': sedit_types_menu(d); return; case 'd': case 'D': write_to_output(d, "\r\nDelete which entry? : "); OLC_MODE(d) = SEDIT_DELETE_TYPE; return; case 'q': case 'Q': break; } break; /*-------------------------------------------------------------------*/ case SEDIT_PRODUCTS_MENU: switch (*arg) { case 'a': case 'A': write_to_output(d, "\r\nEnter new product vnum number : "); OLC_MODE(d) = SEDIT_NEW_PRODUCT; return; case 'd': case 'D': write_to_output(d, "\r\nDelete which product? : "); OLC_MODE(d) = SEDIT_DELETE_PRODUCT; return; case 'q': case 'Q': break; } break; /*-------------------------------------------------------------------*/ case SEDIT_ROOMS_MENU: switch (*arg) { case 'a': case 'A': write_to_output(d, "\r\nEnter new room vnum number : "); OLC_MODE(d) = SEDIT_NEW_ROOM; return; case 'c': case 'C': sedit_compact_rooms_menu(d); return; case 'l': case 'L': sedit_rooms_menu(d); return; case 'd': case 'D': write_to_output(d, "\r\nDelete which room? : "); OLC_MODE(d) = SEDIT_DELETE_ROOM; return; case 'q': case 'Q': break; } break; /*-------------------------------------------------------------------*/ /* * String edits. */ case SEDIT_NOITEM1: if (genolc_checkstring(d, arg)) modify_string(&S_NOITEM1(OLC_SHOP(d)), arg); break; case SEDIT_NOITEM2: if (genolc_checkstring(d, arg)) modify_string(&S_NOITEM2(OLC_SHOP(d)), arg); break; case SEDIT_NOCASH1: if (genolc_checkstring(d, arg)) modify_string(&S_NOCASH1(OLC_SHOP(d)), arg); break; case SEDIT_NOCASH2: if (genolc_checkstring(d, arg)) modify_string(&S_NOCASH2(OLC_SHOP(d)), arg); break; case SEDIT_NOBUY: if (genolc_checkstring(d, arg)) modify_string(&S_NOBUY(OLC_SHOP(d)), arg); break; case SEDIT_BUY: if (genolc_checkstring(d, arg)) modify_string(&S_BUY(OLC_SHOP(d)), arg); break; case SEDIT_SELL: if (genolc_checkstring(d, arg)) modify_string(&S_SELL(OLC_SHOP(d)), arg); break; case SEDIT_NAMELIST: if (genolc_checkstring(d, arg)) { struct shop_buy_data new_entry; BUY_TYPE(new_entry) = OLC_VAL(d); BUY_WORD(new_entry) = strdup(arg); add_to_type_list(&(S_NAMELISTS(OLC_SHOP(d))), &new_entry); } sedit_namelist_menu(d); return; /*-------------------------------------------------------------------*/ /* * Numerical responses. */ case SEDIT_KEEPER: i = atoi(arg); if ((i = atoi(arg)) != -1) if ((i = real_mobile(i)) == NOBODY) { write_to_output(d, "That mobile does not exist, try again : "); return; } S_KEEPER(OLC_SHOP(d)) = i; if (i == -1) break; /* * Fiddle with special procs. */ S_FUNC(OLC_SHOP(d)) = mob_index[i].func != shop_keeper ? mob_index[i].func : NULL; mob_index[i].func = shop_keeper; break; case SEDIT_OPEN1: S_OPEN1(OLC_SHOP(d)) = LIMIT(atoi(arg), 0, 28); break; case SEDIT_OPEN2: S_OPEN2(OLC_SHOP(d)) = LIMIT(atoi(arg), 0, 28); break; case SEDIT_CLOSE1: S_CLOSE1(OLC_SHOP(d)) = LIMIT(atoi(arg), 0, 28); break; case SEDIT_CLOSE2: S_CLOSE2(OLC_SHOP(d)) = LIMIT(atoi(arg), 0, 28); break; case SEDIT_BUY_PROFIT: sscanf(arg, "%f", &S_BUYPROFIT(OLC_SHOP(d))); break; case SEDIT_SELL_PROFIT: sscanf(arg, "%f", &S_SELLPROFIT(OLC_SHOP(d))); break; case SEDIT_TYPE_MENU: OLC_VAL(d) = LIMIT(atoi(arg), 0, NUM_ITEM_TYPES - 1); write_to_output(d, "Enter namelist (return for none) :-\r\n] "); OLC_MODE(d) = SEDIT_NAMELIST; return; case SEDIT_DELETE_TYPE: remove_from_type_list(&(S_NAMELISTS(OLC_SHOP(d))), atoi(arg)); sedit_namelist_menu(d); return; case SEDIT_NEW_PRODUCT: if ((i = atoi(arg)) != -1) if ((i = real_object(i)) == NOTHING) { write_to_output(d, "That object does not exist, try again : "); return; } if (i > 0) add_to_int_list(&(S_PRODUCTS(OLC_SHOP(d))), i); sedit_products_menu(d); return; case SEDIT_DELETE_PRODUCT: remove_from_int_list(&(S_PRODUCTS(OLC_SHOP(d))), atoi(arg)); sedit_products_menu(d); return; case SEDIT_NEW_ROOM: if ((i = atoi(arg)) != -1) if ((i = real_room(i)) == NOWHERE) { write_to_output(d, "That room does not exist, try again : "); return; } if (i >= 0) add_to_int_list(&(S_ROOMS(OLC_SHOP(d))), atoi(arg)); sedit_rooms_menu(d); return; case SEDIT_DELETE_ROOM: remove_from_int_list(&(S_ROOMS(OLC_SHOP(d))), atoi(arg)); sedit_rooms_menu(d); return; case SEDIT_SHOP_FLAGS: if ((i = LIMIT(atoi(arg), 0, NUM_SHOP_FLAGS)) > 0) { TOGGLE_BIT(S_BITVECTOR(OLC_SHOP(d)), 1 << (i - 1)); sedit_shop_flags_menu(d); return; } break; case SEDIT_NOTRADE: if ((i = LIMIT(atoi(arg), 0, NUM_TRADERS)) > 0) { TOGGLE_BIT(S_NOTRADE(OLC_SHOP(d)), 1 << (i - 1)); sedit_no_trade_menu(d); return; } break; /*-------------------------------------------------------------------*/ default: /* * We should never get here. */ cleanup_olc(d, CLEANUP_ALL); mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: sedit_parse(): Reached default case!"); write_to_output(d, "Oops...\r\n"); break; } /*-------------------------------------------------------------------*/ /* * END OF CASE * If we get here, we have probably changed something, and now want to * return to main menu. Use OLC_VAL as a 'has changed' flag. */ OLC_VAL(d) = 1; sedit_disp_menu(d); }
void acorn_trees() { int r, obj_num, znum = world[real_room(201)].zone, DROP = 0; struct obj_data *acorn; for (r = 200; r < 297; r++) { if (!number(0, 200) && real_room(r) && SECT(real_room(r)) == SECT_FOREST) { obj_num = real_object(200); acorn = read_object(obj_num, REAL); obj_to_room(acorn, real_room(r)); DROP = 1; } } if (DROP) { send_to_zone_outdoor(znum, "In the distance, you hear an acorn fall to the ground with a rustle of leaves.\r\n"); } DROP = 0; for (r = 700; r < 799; r++) { if (!number(0, 400) && real_room(r) && SECT(real_room(r)) == SECT_FOREST) { obj_num = real_object(200); acorn = read_object(obj_num, REAL); obj_to_room(acorn, real_room(r)); DROP = 1; znum = world[real_room(700)].zone; } } if (DROP) { send_to_zone_outdoor(znum, "In the distance, you hear an acorn fall to the ground with a rustle of leaves.\r\n"); } DROP = 0; for (r = 800; r < 811; r++) { if (!number(0, 400) && real_room(r) && SECT(real_room(r)) == SECT_FOREST) { obj_num = real_object(200); acorn = read_object(obj_num, REAL); obj_to_room(acorn, real_room(r)); DROP = 1; znum = world[real_room(800)].zone; } } if (DROP) { send_to_zone_outdoor(znum, "In the distance, you hear an acorn fall to the ground with a rustle of leaves.\r\n"); } for (r = 530; r < 586; r++) { if (!number(0, 300) && real_room(r)) { obj_num = real_object(599); acorn = read_object(obj_num, REAL); obj_to_room(acorn, real_room(r)); } } }
/* assign special procedures to objects */ void assign_objects(void) { int board(struct char_data *ch, int cmd, char *arg); obj_index[real_object(3099)].func = board; }
int chalice(struct char_data *ch, int cmd, char *arg) { /* 222 is the normal chalice, 223 is chalice-on-altar */ struct obj_data *chalice; char buf1[MAX_INPUT_LENGTH], buf2[MAX_INPUT_LENGTH]; static int chl = -1, achl = -1; if (chl < 1) { chl = real_object(222); achl = real_object(223); } switch(cmd) { case 10: /* get */ if (!(chalice = get_obj_in_list_num(chl, world[ch->in_room].contents)) && CAN_SEE_OBJ(ch, chalice)) if (!(chalice = get_obj_in_list_num(achl, world[ch->in_room].contents)) && CAN_SEE_OBJ(ch, chalice)) return(0); /* we found a chalice.. now try to get us */ do_get(ch, arg, cmd); /* if got the altar one, switch her */ if (chalice == get_obj_in_list_num(achl, ch->carrying)) { extract_obj(chalice); chalice = read_object(chl, VIRTUAL); obj_to_char(chalice, ch); } return(1); break; case 67: /* put */ if (!(chalice = get_obj_in_list_num(chl, ch->carrying))) return(0); argument_interpreter(arg, buf1, buf2); if (!str_cmp(buf1, "chalice") && !str_cmp(buf2, "altar")) { extract_obj(chalice); chalice = read_object(achl, VIRTUAL); obj_to_room(chalice, ch->in_room); send_to_char("Ok.\n\r", ch); } return(1); break; case 176: /* pray */ if (!(chalice = get_obj_in_list_num(achl, world[ch->in_room].contents))) return(0); do_action(ch, arg, cmd); /* pray */ send_to_char(CHAL_ACT, ch); extract_obj(chalice); act("$n is torn out of existence!", TRUE, ch, 0, 0, TO_ROOM); char_from_room(ch); char_to_room(ch, real_room(2500)); /* before the fiery gates */ do_look(ch, "", 15); return(1); break; default: return(0); break; } }
void oedit_save_internally(struct descriptor_data *d) { int i; obj_rnum robj_num; struct descriptor_data *dsc; struct obj_data *obj; i = (real_object(OLC_NUM(d)) == NOTHING); if ((robj_num = add_object(OLC_OBJ(d), OLC_NUM(d))) == NOTHING) { log("oedit_save_internally: add_object failed."); return; } /* Update triggers : */ /* Free old proto list */ if (obj_proto[robj_num].proto_script && obj_proto[robj_num].proto_script != OLC_SCRIPT(d)) free_proto_script(&obj_proto[robj_num], OBJ_TRIGGER); /* this will handle new instances of the object: */ obj_proto[robj_num].proto_script = OLC_SCRIPT(d); /* this takes care of the objects currently in-game */ for (obj = object_list; obj; obj = obj->next) { if (obj->item_number != robj_num) continue; /* remove any old scripts */ if (SCRIPT(obj)) extract_script(obj, OBJ_TRIGGER); free_proto_script(obj, OBJ_TRIGGER); copy_proto_script(&obj_proto[robj_num], obj, OBJ_TRIGGER); assign_triggers(obj, OBJ_TRIGGER); } /* end trigger update */ if (!i) /* If it's not a new object, don't renumber. */ return; /* * Renumber produce in shops being edited. */ for (dsc = descriptor_list; dsc; dsc = dsc->next) if (STATE(dsc) == CON_SEDIT) for (i = 0; S_PRODUCT(OLC_SHOP(dsc), i) != NOTHING; i++) if (S_PRODUCT(OLC_SHOP(dsc), i) >= robj_num) S_PRODUCT(OLC_SHOP(dsc), i)++; /* Update other people in zedit too. From: C.Raehl 4/27/99 */ for (dsc = descriptor_list; dsc; dsc = dsc->next) if (STATE(dsc) == CON_ZEDIT) for (i = 0; OLC_ZONE(dsc)->cmd[i].command != 'S'; i++) switch (OLC_ZONE(dsc)->cmd[i].command) { case 'P': OLC_ZONE(dsc)->cmd[i].arg3 += (OLC_ZONE(dsc)->cmd[i].arg3 >= robj_num); /* Fall through. */ case 'E': case 'G': case 'O': OLC_ZONE(dsc)->cmd[i].arg1 += (OLC_ZONE(dsc)->cmd[i].arg1 >= robj_num); break; case 'R': OLC_ZONE(dsc)->cmd[i].arg2 += (OLC_ZONE(dsc)->cmd[i].arg2 >= robj_num); break; default: break; } }
/* assign special procedures to objects */ void assign_objects() { obj_index[real_object(15)].func = SlotMachine; obj_index[real_object(29)].func = warpstone; obj_index[real_object(30)].func = scraps; obj_index[real_object(23)].func = jive_box; obj_index[real_object(31)].func = portal; obj_index[real_object(3092)].func = board; obj_index[real_object(3093)].func = board; obj_index[real_object(3094)].func = board; obj_index[real_object(3095)].func = board; obj_index[real_object(3096)].func = board; obj_index[real_object(3097)].func = board; obj_index[real_object(3098)].func = board; obj_index[real_object(3099)].func = board; obj_index[real_object(25102)].func = board; obj_index[real_object(21122)].func = nodrop; obj_index[real_object(21130)].func = soap; obj_index[real_object(22698)].func = YouthPotion; #if EGO obj_index[real_object(40000)].func = BitterBlade; #endif }
void perform_obj_aff_list(struct char_data * ch, char *arg) { int num, i, apply, v1 = 0, found = 0, len = 0, tmp_len = 0; struct obj_list_item lst[MAX_OBJ_LIST]; obj_rnum r_num; obj_vnum ov; char buf[MAX_STRING_LENGTH]; for(i=0;i<MAX_OBJ_LIST;i++){ lst[i].vobj = NOTHING; lst[i].val = 0; } apply = atoi(arg); if (!(apply>0 && apply<NUM_APPLIES) ){ send_to_char(ch, "Not a valid affect"); return; } /* Special cases below */ else if ((apply == APPLY_CLASS) || /* olist affect 7 is Weapon Damage */ (apply == APPLY_LEVEL) ) { /* olist affect 8 is AC-Apply for Armor */ for (num=0;num<=top_of_objt;num++) { if ((apply == APPLY_CLASS && obj_proto[num].obj_flags.type_flag == ITEM_WEAPON) || (apply == APPLY_LEVEL && obj_proto[num].obj_flags.type_flag == ITEM_ARMOR) ) { ov = obj_index[num].vnum; if (apply == APPLY_CLASS) v1 = ((obj_proto[num].obj_flags.value[2]+1)*(obj_proto[num].obj_flags.value[1])/2); else v1 = (obj_proto[num].obj_flags.value[0]); if ((r_num = real_object(ov)) != NOTHING) add_to_obj_list(lst, MAX_OBJ_LIST, ov, v1); } } if (apply == APPLY_CLASS) len = snprintf(buf, sizeof(buf), "Highest average damage per hit for Weapons\r\n"); else if (apply == APPLY_LEVEL) len = snprintf(buf, sizeof(buf), "Highest AC Apply for Armor\r\n"); for(i=0;i<MAX_OBJ_LIST;i++){ if ((r_num = real_object(lst[i].vobj)) != NOTHING) { tmp_len = snprintf(buf+len, sizeof(buf)-len, "%s%3d%s) %s[%s%5d%s] %s%3d %s%-*s %s[%s]%s%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, lst[i].vobj, QCYN, QYEL, lst[i].val, QCYN, 42+count_color_chars(obj_proto[num].short_description), obj_proto[r_num].short_description, QYEL, item_types[obj_proto[num].obj_flags.type_flag], QNRM, obj_proto[num].proto_script ? " [TRIG]" : ""); len += tmp_len; } } page_string(ch->desc, buf, TRUE); return; /* End of special-case handling */ } /* Non-special cases, list objects by affect */ for (num = 0; num <= top_of_objt; num++){ for (i = 0; i < MAX_OBJ_AFFECT; i++){ if (obj_proto[num].affected[i].modifier) { if (obj_proto[num].affected[i].location == apply){ ov = obj_index[num].vnum; v1 = obj_proto[num].affected[i].modifier; if ((r_num = real_object(ov)) != NOTHING) add_to_obj_list(lst, MAX_OBJ_LIST, ov, v1); } } } } len = snprintf(buf, sizeof(buf), "Objects with highest %s affect\r\n", apply_types[(apply)]); for(i=0;i<MAX_OBJ_LIST;i++){ if ((r_num = real_object(lst[i].vobj)) != NOTHING) { tmp_len = snprintf(buf+len, sizeof(buf)-len, "%s%3d%s) %s[%s%8d%s] %s%3d %s%-*s %s[%s]%s%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, lst[i].vobj, QCYN, QYEL, lst[i].val, QCYN, 42+count_color_chars(obj_proto[num].short_description), obj_proto[r_num].short_description, QYEL, item_types[obj_proto[r_num].obj_flags.type_flag], QNRM, obj_proto[r_num].proto_script ? " [TRIG]" : ""); len += tmp_len; } } page_string(ch->desc, buf, TRUE); }
void Crash_listrent(struct char_data * ch, char *name) { FILE *fl; char fname[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; char input[MAX_INPUT_LENGTH + 1]; char tag[MAX_INPUT_LENGTH + 1]; char tag_arguments[MAX_INPUT_LENGTH + 1]; char *p; struct obj_data *obj; int val = 0; time_t rent_time; int d; int h; int m; if (!get_filename(name, fname, CRASH_FILE)) { return; } if (!(fl = fopen(fname, "r"))) { sprintf(buf, "%s has no rent file.\r\n", name); send_to_char(buf, ch); return; } sprintf(buf, "%s\r\n", fname); while (get_line(fl, input)) { parse_pline(input, tag, tag_arguments); while ((p = strrchr(tag_arguments, '\n')) != NULL) { *p = '\0'; } val = atoi(tag_arguments); switch (tag[0]) { case 'o': case 'O': if (strcasecmp(tag, "obj_number") == 0) { if (real_object(val) > -1) { obj = read_object_q(val, VIRTUAL); sprintf(buf, "%s [%5d] %-20s\r\n", buf, val, obj->short_description); extract_obj_q(obj); } } break; case 'r': case 'R': if (strcasecmp(tag, "rent_version") == 0) { sprintf(buf, "%sVersion: %d\r\n", buf, val); } else if (strcasecmp(tag, "rent_time") == 0) { rent_time = time(0) - val; d = rent_time / 86400; h = (rent_time / 3600) % 24; m = (rent_time / 60) % 60; sprintf(buf, "%sRented %d day%s, %d hour%s, %d minute%s ago.\r\n", buf, d, ((d == 1) ? "" : "s"), h, ((h == 1) ? "" : "s"), m, ((m == 1) ? "" : "s")); } else if (strcasecmp(tag, "rent_type") == 0) switch (val) { case RENT_RENTED: sprintf(buf, "%sType: Rent\r\n", buf); break; case RENT_CRASH: sprintf(buf, "%sType: Crash\r\n", buf); break; case RENT_CRYO: sprintf(buf, "%sType: Cryo\r\n", buf); break; case RENT_TIMEDOUT: case RENT_FORCED: sprintf(buf, "%sType: TimedOut\r\n", buf); break; case RENT_CAMPED: sprintf(buf, "%sType: Camped\r\n", buf); break; default: sprintf(buf, "%sType: Undef\r\n", buf); break; } break; } } page_string(ch->desc, buf, 1); fclose(fl); }
void oedit_parse(struct descriptor_data *d, char *arg) { int number, max_val, min_val; char *oldtext = NULL; struct board_info *tmp; struct obj_data *obj; obj_rnum robj; switch (OLC_MODE(d)) { case OEDIT_CONFIRM_SAVESTRING: switch (*arg) { case 'y': case 'Y': oedit_save_internally(d); mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits obj %d", GET_NAME(d->character), OLC_NUM(d)); if (CONFIG_OLC_SAVE) { oedit_save_to_disk(real_zone_by_thing(OLC_NUM(d))); write_to_output(d, "Object saved to disk.\r\n"); } else write_to_output(d, "Object saved to memory.\r\n"); if (GET_OBJ_TYPE(OLC_OBJ(d)) == ITEM_BOARD) { if ((tmp=locate_board(GET_OBJ_VNUM(OLC_OBJ(d)))) != NULL) { save_board(tmp); } else { tmp = create_new_board(GET_OBJ_VNUM(OLC_OBJ(d))); BOARD_NEXT(tmp) = bboards; bboards = tmp; } } /* Fall through. */ case 'n': case 'N': cleanup_olc(d, CLEANUP_ALL); return; case 'a': /* abort quit */ case 'A': oedit_disp_menu(d); return; default: write_to_output(d, "Invalid choice!\r\n"); write_to_output(d, "Do you wish to save your changes? : \r\n"); return; } case OEDIT_MAIN_MENU: /* * Throw us out to whichever edit mode based on user input. */ switch (*arg) { case 'q': case 'Q': if (STATE(d) != CON_IEDIT) { if (OLC_VAL(d)) { /* Something has been modified. */ write_to_output(d, "Do you wish to save your changes? : "); OLC_MODE(d) = OEDIT_CONFIRM_SAVESTRING; } else cleanup_olc(d, CLEANUP_ALL); } else { send_to_char(d->character, "\r\nCommitting iedit changes.\r\n"); obj = OLC_IOBJ(d); *obj = *(OLC_OBJ(d)); GET_ID(obj) = max_obj_id++; /* find_obj helper */ add_to_lookup_table(GET_ID(obj), (void *)obj); if (GET_OBJ_VNUM(obj) != NOTHING) { /* remove any old scripts */ if (SCRIPT(obj)) { extract_script(obj, OBJ_TRIGGER); SCRIPT(obj) = NULL; } free_proto_script(obj, OBJ_TRIGGER); robj = real_object(GET_OBJ_VNUM(obj)); copy_proto_script(&obj_proto[robj], obj, OBJ_TRIGGER); assign_triggers(obj, OBJ_TRIGGER); } SET_BIT_AR(GET_OBJ_EXTRA(obj), ITEM_UNIQUE_SAVE); /* Xap - ought to save the old pointer, free after assignment I suppose */ mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s iedit a unique #%d", GET_NAME(d->character), GET_OBJ_VNUM(obj)); if (d->character) { REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_WRITING); STATE(d) = CON_PLAYING; act("$n stops using OLC.", TRUE, d->character, 0, 0, TO_ROOM); } free(d->olc); d->olc = NULL; } return; case '1': write_to_output(d, "Enter namelist : "); OLC_MODE(d) = OEDIT_EDIT_NAMELIST; break; case '2': write_to_output(d, "Enter short desc : "); OLC_MODE(d) = OEDIT_SHORTDESC; break; case '3': write_to_output(d, "Enter long desc :-\r\n| "); OLC_MODE(d) = OEDIT_LONGDESC; break; case '4': OLC_MODE(d) = OEDIT_ACTDESC; send_editor_help(d); write_to_output(d, "Enter action description:\r\n\r\n"); if (OLC_OBJ(d)->action_description) { write_to_output(d, "%s", OLC_OBJ(d)->action_description); oldtext = strdup(OLC_OBJ(d)->action_description); } string_write(d, &OLC_OBJ(d)->action_description, MAX_MESSAGE_LENGTH, 0, oldtext); OLC_VAL(d) = 1; break; case '5': oedit_disp_type_menu(d); OLC_MODE(d) = OEDIT_TYPE; break; case '6': oedit_disp_extra_menu(d); OLC_MODE(d) = OEDIT_EXTRAS; break; case '7': oedit_disp_wear_menu(d); OLC_MODE(d) = OEDIT_WEAR; break; case '8': write_to_output(d, "Enter weight : "); OLC_MODE(d) = OEDIT_WEIGHT; break; case '9': write_to_output(d, "Enter cost : "); OLC_MODE(d) = OEDIT_COST; break; case 'a': case 'A': write_to_output(d, "Enter cost per day : "); OLC_MODE(d) = OEDIT_COSTPERDAY; break; case 'b': case 'B': write_to_output(d, "Enter timer : "); OLC_MODE(d) = OEDIT_TIMER; break; case 'c': case 'C': /* * Clear any old values */ GET_OBJ_VAL(OLC_OBJ(d), 0) = 0; GET_OBJ_VAL(OLC_OBJ(d), 1) = 0; GET_OBJ_VAL(OLC_OBJ(d), 2) = 0; GET_OBJ_VAL(OLC_OBJ(d), 3) = 0; OLC_VAL(d) = 1; oedit_disp_val1_menu(d); break; case 'd': case 'D': oedit_disp_prompt_apply_menu(d); break; case 'e': case 'E': /* * If extra descriptions don't exist. */ if (OLC_OBJ(d)->ex_description == NULL) { CREATE(OLC_OBJ(d)->ex_description, struct extra_descr_data, 1); OLC_OBJ(d)->ex_description->next = NULL; } OLC_DESC(d) = OLC_OBJ(d)->ex_description; oedit_disp_extradesc_menu(d); break; case 'm': case 'M': write_to_output(d, "Enter new minimum level: "); OLC_MODE(d) = OEDIT_LEVEL; break; case 'p': case 'P': oedit_disp_perm_menu(d); OLC_MODE(d) = OEDIT_PERM; break; case 's': case 'S': if (STATE(d) != CON_IEDIT) { OLC_SCRIPT_EDIT_MODE(d) = SCRIPT_MAIN_MENU; dg_script_menu(d); } else { write_to_output(d, "\r\nScripts cannot be modified on individual objects.\r\nEnter choice : "); } return; default: oedit_disp_menu(d); break; } return; /* * end of OEDIT_MAIN_MENU */ case OLC_SCRIPT_EDIT: if (dg_script_edit_parse(d, arg)) return; break; case OEDIT_EDIT_NAMELIST: if (!genolc_checkstring(d, arg)) break; if (OLC_OBJ(d)->name) free(OLC_OBJ(d)->name); OLC_OBJ(d)->name = str_udup(arg); break; case OEDIT_SHORTDESC: if (!genolc_checkstring(d, arg)) break; if (OLC_OBJ(d)->short_description) free(OLC_OBJ(d)->short_description); OLC_OBJ(d)->short_description = str_udup(arg); break; case OEDIT_LONGDESC: if (!genolc_checkstring(d, arg)) break; if (OLC_OBJ(d)->description) free(OLC_OBJ(d)->description); OLC_OBJ(d)->description = str_udup(arg); break; case OEDIT_TYPE: number = atoi(arg); if ((number < 1) || (number >= NUM_ITEM_TYPES)) { write_to_output(d, "Invalid choice, try again : "); return; } else GET_OBJ_TYPE(OLC_OBJ(d)) = number; /* what's the boundschecking worth if we don't do this ? -- Welcor */ GET_OBJ_VAL(OLC_OBJ(d), 0) = GET_OBJ_VAL(OLC_OBJ(d), 1) = GET_OBJ_VAL(OLC_OBJ(d), 2) = GET_OBJ_VAL(OLC_OBJ(d), 3) = 0; break; case OEDIT_EXTRAS: number = atoi(arg); if ((number < 0) || (number > NUM_ITEM_FLAGS)) { oedit_disp_extra_menu(d); return; } else if (number == 0) break; else { TOGGLE_BIT_AR(GET_OBJ_EXTRA(OLC_OBJ(d)), number - 1); oedit_disp_extra_menu(d); return; } case OEDIT_WEAR: number = atoi(arg); if ((number < 0) || (number > NUM_ITEM_WEARS)) { write_to_output(d, "That's not a valid choice!\r\n"); oedit_disp_wear_menu(d); return; } else if (number == 0) /* Quit. */ break; else { TOGGLE_BIT_AR(GET_OBJ_WEAR(OLC_OBJ(d)), (number - 1)); oedit_disp_wear_menu(d); return; } case OEDIT_WEIGHT: GET_OBJ_WEIGHT(OLC_OBJ(d)) = LIMIT(atoi(arg), 0, MAX_OBJ_WEIGHT); break; case OEDIT_COST: GET_OBJ_COST(OLC_OBJ(d)) = LIMIT(atoi(arg), 0, MAX_OBJ_COST); break; case OEDIT_COSTPERDAY: GET_OBJ_RENT(OLC_OBJ(d)) = LIMIT(atoi(arg), 0, MAX_OBJ_RENT); break; case OEDIT_TIMER: switch (GET_OBJ_TYPE(OLC_OBJ(d))) { case ITEM_PORTAL: GET_OBJ_TIMER(OLC_OBJ(d)) = LIMIT(atoi(arg), -1, MAX_OBJ_TIMER); break; default: GET_OBJ_TIMER(OLC_OBJ(d)) = LIMIT(atoi(arg), 0, MAX_OBJ_TIMER); break; } break; case OEDIT_LEVEL: GET_OBJ_LEVEL(OLC_OBJ(d)) = LIMIT(atoi(arg), 0, LVL_IMPL); break; case OEDIT_PERM: if ((number = atoi(arg)) == 0) break; if (number > 0 && number <= NUM_AFF_FLAGS) { /* Setting AFF_CHARM on objects like this is dangerous. */ if (number != AFF_CHARM) { TOGGLE_BIT_AR(GET_OBJ_PERM(OLC_OBJ(d)), number); } } oedit_disp_perm_menu(d); return; case OEDIT_VALUE_1: /* * Lucky, I don't need to check any of these for out of range values. * Hmm, I'm not so sure - Rv */ switch (GET_OBJ_TYPE(OLC_OBJ(d))) { case ITEM_WEAPON: GET_OBJ_VAL(OLC_OBJ(d), 0) = MIN(MAX(atoi(arg), -50), 50); break; case ITEM_CONTAINER: GET_OBJ_VAL(OLC_OBJ(d), 0) = LIMIT(atoi(arg), -1, MAX_CONTAINER_SIZE); break; default: GET_OBJ_VAL(OLC_OBJ(d), 0) = atoi(arg); } /* * proceed to menu 2 */ oedit_disp_val2_menu(d); return; case OEDIT_VALUE_2: /* * Here, I do need to check for out of range values. */ number = atoi(arg); switch (GET_OBJ_TYPE(OLC_OBJ(d))) { case ITEM_SCROLL: case ITEM_POTION: if (number == 0 || number == -1) GET_OBJ_VAL(OLC_OBJ(d), 1) = -1; else GET_OBJ_VAL(OLC_OBJ(d), 1) = LIMIT(number, 1, NUM_SPELLS-1); oedit_disp_val3_menu(d); break; case ITEM_CONTAINER: case ITEM_VEHICLE: case ITEM_HATCH: case ITEM_WINDOW: case ITEM_PORTAL: /* * Needs some special handling since we are dealing with flag values * here. */ if (number < 0 || number > 4) oedit_disp_container_flags_menu(d); else if (number != 0) { TOGGLE_BIT(GET_OBJ_VAL(OLC_OBJ(d), 1), 1 << (number - 1)); OLC_VAL(d) = 1; oedit_disp_val2_menu(d); } else oedit_disp_val3_menu(d); break; case ITEM_WEAPON: GET_OBJ_VAL(OLC_OBJ(d), 1) = LIMIT(number, 1, MAX_WEAPON_NDICE); oedit_disp_val3_menu(d); break; default: GET_OBJ_VAL(OLC_OBJ(d), 1) = number; oedit_disp_val3_menu(d); } return; case OEDIT_VALUE_3: number = atoi(arg); /* * Quick'n'easy error checking. */ switch (GET_OBJ_TYPE(OLC_OBJ(d))) { case ITEM_SCROLL: case ITEM_POTION: if (number == 0 || number == -1) { GET_OBJ_VAL(OLC_OBJ(d), 2) = -1; oedit_disp_val4_menu(d); return; } min_val = 1; max_val = NUM_SPELLS - 1; break; case ITEM_WEAPON: min_val = 1; max_val = MAX_WEAPON_SDICE; break; case ITEM_WAND: case ITEM_STAFF: min_val = 0; max_val = 20; break; case ITEM_DRINKCON: case ITEM_FOUNTAIN: min_val = 0; max_val = NUM_LIQ_TYPES - 1; break; case ITEM_KEY: min_val = 0; max_val = 32099; break; default: min_val = -32000; max_val = 32000; } GET_OBJ_VAL(OLC_OBJ(d), 2) = LIMIT(number, min_val, max_val); oedit_disp_val4_menu(d); return; case OEDIT_VALUE_4: number = atoi(arg); switch (GET_OBJ_TYPE(OLC_OBJ(d))) { case ITEM_SCROLL: case ITEM_POTION: if (number == 0 || number == -1) { GET_OBJ_VAL(OLC_OBJ(d), 3) = -1; oedit_disp_menu(d); return; } min_val = 1; max_val = NUM_SPELLS - 1; break; case ITEM_WAND: case ITEM_STAFF: min_val = 1; max_val = NUM_SPELLS - 1; break; case ITEM_WEAPON: min_val = 0; max_val = NUM_ATTACK_TYPES - 1; break; default: min_val = -32000; max_val = 32000; break; } GET_OBJ_VAL(OLC_OBJ(d), 3) = LIMIT(number, min_val, max_val); break; case OEDIT_PROMPT_APPLY: if ((number = atoi(arg)) == 0) break; else if (number < 0 || number > MAX_OBJ_AFFECT) { oedit_disp_prompt_apply_menu(d); return; } OLC_VAL(d) = number - 1; OLC_MODE(d) = OEDIT_APPLY; oedit_disp_apply_menu(d); return; case OEDIT_APPLY: if ((number = atoi(arg)) == 0) { OLC_OBJ(d)->affected[OLC_VAL(d)].location = 0; OLC_OBJ(d)->affected[OLC_VAL(d)].modifier = 0; oedit_disp_prompt_apply_menu(d); } else if (number < 0 || number >= NUM_APPLIES) oedit_disp_apply_menu(d); else { int counter; /* add in check here if already applied.. deny builders another */ if (GET_LEVEL(d->character) < LVL_IMPL) { for (counter = 0; counter < MAX_OBJ_AFFECT; counter++) { if (OLC_OBJ(d)->affected[counter].location == number) { write_to_output(d, "Object already has that apply."); return; } } } OLC_OBJ(d)->affected[OLC_VAL(d)].location = number; write_to_output(d, "Modifier : "); OLC_MODE(d) = OEDIT_APPLYMOD; } return; case OEDIT_APPLYMOD: OLC_OBJ(d)->affected[OLC_VAL(d)].modifier = atoi(arg); oedit_disp_prompt_apply_menu(d); return; case OEDIT_EXTRADESC_KEY: if (genolc_checkstring(d, arg)) { if (OLC_DESC(d)->keyword) free(OLC_DESC(d)->keyword); OLC_DESC(d)->keyword = str_udup(arg); } oedit_disp_extradesc_menu(d); return; case OEDIT_EXTRADESC_MENU: switch ((number = atoi(arg))) { case 0: if (!OLC_DESC(d)->keyword || !OLC_DESC(d)->description) { struct extra_descr_data *temp; if (OLC_DESC(d)->keyword) free(OLC_DESC(d)->keyword); if (OLC_DESC(d)->description) free(OLC_DESC(d)->description); /* * Clean up pointers */ REMOVE_FROM_LIST(OLC_DESC(d), OLC_OBJ(d)->ex_description, next); free(OLC_DESC(d)); OLC_DESC(d) = NULL; } break; case 1: OLC_MODE(d) = OEDIT_EXTRADESC_KEY; write_to_output(d, "Enter keywords, separated by spaces :-\r\n| "); return; case 2: OLC_MODE(d) = OEDIT_EXTRADESC_DESCRIPTION; send_editor_help(d); write_to_output(d, "Enter the extra description:\r\n\r\n"); if (OLC_DESC(d)->description) { write_to_output(d, "%s", OLC_DESC(d)->description); oldtext = strdup(OLC_DESC(d)->description); } string_write(d, &OLC_DESC(d)->description, MAX_MESSAGE_LENGTH, 0, oldtext); OLC_VAL(d) = 1; return; case 3: /* * Only go to the next description if this one is finished. */ if (OLC_DESC(d)->keyword && OLC_DESC(d)->description) { struct extra_descr_data *new_extra; if (OLC_DESC(d)->next) OLC_DESC(d) = OLC_DESC(d)->next; else { /* Make new extra description and attach at end. */ CREATE(new_extra, struct extra_descr_data, 1); OLC_DESC(d)->next = new_extra; OLC_DESC(d) = OLC_DESC(d)->next; } } /* * No break - drop into default case. */ default: oedit_disp_extradesc_menu(d); return; } break; default: mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: Reached default case in oedit_parse()!"); write_to_output(d, "Oops...\r\n"); break; }
int save_objects(zone_rnum zone_num) { char fname[128], buf[MAX_STRING_LENGTH]; char ebuf1[MAX_STRING_LENGTH], ebuf2[MAX_STRING_LENGTH]; char ebuf3[MAX_STRING_LENGTH], ebuf4[MAX_STRING_LENGTH]; char wbuf1[MAX_STRING_LENGTH], wbuf2[MAX_STRING_LENGTH]; char wbuf3[MAX_STRING_LENGTH], wbuf4[MAX_STRING_LENGTH]; char pbuf1[MAX_STRING_LENGTH], pbuf2[MAX_STRING_LENGTH]; char pbuf3[MAX_STRING_LENGTH], pbuf4[MAX_STRING_LENGTH]; int counter, counter2, realcounter; FILE *fp; struct obj_data *obj; struct extra_descr_data *ex_desc; #if CIRCLE_UNSIGNED_INDEX if (zone_num == NOWHERE || zone_num > top_of_zone_table) { #else if (zone_num < 0 || zone_num > top_of_zone_table) { #endif log("SYSERR: GenOLC: save_objects: Invalid real zone number %d. (0-%d)", zone_num, top_of_zone_table); return FALSE; } snprintf(fname, sizeof(fname), "%s%d.new", OBJ_PREFIX, zone_table[zone_num].number); if (!(fp = fopen(fname, "w+"))) { mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: OLC: Cannot open objects file %s!", fname); return FALSE; } /* * Start running through all objects in this zone. */ for (counter = genolc_zone_bottom(zone_num); counter <= zone_table[zone_num].top; counter++) { if ((realcounter = real_object(counter)) != NOTHING) { if ((obj = &obj_proto[realcounter])->action_description) { strncpy(buf, obj->action_description, sizeof(buf) - 1); strip_cr(buf); } else *buf = '\0'; fprintf(fp, "#%d\n" "%s~\n" "%s~\n" "%s~\n" "%s~\n", GET_OBJ_VNUM(obj), (obj->name && *obj->name) ? obj->name : "undefined", (obj->short_description && *obj->short_description) ? obj->short_description : "undefined", (obj->description && *obj->description) ? obj->description : "undefined", buf); sprintascii(ebuf1, GET_OBJ_EXTRA(obj)[0]); sprintascii(ebuf2, GET_OBJ_EXTRA(obj)[1]); sprintascii(ebuf3, GET_OBJ_EXTRA(obj)[2]); sprintascii(ebuf4, GET_OBJ_EXTRA(obj)[3]); sprintascii(wbuf1, GET_OBJ_WEAR(obj)[0]); sprintascii(wbuf2, GET_OBJ_WEAR(obj)[1]); sprintascii(wbuf3, GET_OBJ_WEAR(obj)[2]); sprintascii(wbuf4, GET_OBJ_WEAR(obj)[3]); sprintascii(pbuf1, GET_OBJ_PERM(obj)[0]); sprintascii(pbuf2, GET_OBJ_PERM(obj)[1]); sprintascii(pbuf3, GET_OBJ_PERM(obj)[2]); sprintascii(pbuf4, GET_OBJ_PERM(obj)[3]); fprintf(fp, "%d %s %s %s %s %s %s %s %s %s %s %s %s\n" "%d %d %d %d\n" "%d %d %d %d\n", GET_OBJ_TYPE(obj), ebuf1, ebuf2, ebuf3, ebuf4, wbuf1, wbuf2, wbuf3, wbuf4, pbuf1, pbuf2, pbuf3, pbuf4, GET_OBJ_VAL(obj, 0), GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 2), GET_OBJ_VAL(obj, 3), GET_OBJ_WEIGHT(obj), GET_OBJ_COST(obj), GET_OBJ_RENT(obj), GET_OBJ_LEVEL(obj) ); /* * Do we have script(s) attached ? */ script_save_to_disk(fp, obj, OBJ_TRIGGER); /* * Do we have extra descriptions? */ if (obj->ex_description) { /* Yes, save them too. */ for (ex_desc = obj->ex_description; ex_desc; ex_desc = ex_desc->next) { /* * Sanity check to prevent nasty protection faults. */ if (!ex_desc->keyword || !ex_desc->description || !*ex_desc->keyword || !*ex_desc->description) { mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: OLC: oedit_save_to_disk: Corrupt ex_desc!"); continue; } strncpy(buf, ex_desc->description, sizeof(buf) - 1); strip_cr(buf); fprintf(fp, "E\n" "%s~\n" "%s~\n", ex_desc->keyword, buf); } } /* * Do we have affects? */ for (counter2 = 0; counter2 < MAX_OBJ_AFFECT; counter2++) if (obj->affected[counter2].modifier) fprintf(fp, "A\n" "%d %d\n", obj->affected[counter2].location, obj->affected[counter2].modifier); } } /* * Write the final line, close the file. */ fprintf(fp, "$~\n"); fclose(fp); snprintf(buf, sizeof(buf), "%s%d.obj", OBJ_PREFIX, zone_table[zone_num].number); remove(buf); rename(fname, buf); if (in_save_list(zone_table[zone_num].number, SL_OBJ)) { remove_from_save_list(zone_table[zone_num].number, SL_OBJ); create_world_index(zone_table[zone_num].number, "obj"); log("GenOLC: save_objects: Saving objects '%s'", buf); } return TRUE; } /* * Free all, unconditionally. */ void free_object_strings(struct obj_data *obj) { #if 0 /* Debugging, do not enable. */ extern struct obj_data *object_list; struct obj_data *t; int i = 0; for (t = object_list; t; t = t->next) { if (t == obj) { i++; continue; } assert(obj->name != t->name); assert(obj->description != t->description); assert(obj->short_description != t->short_description); assert(obj->action_description != t->action_description); assert(obj->ex_description != t->ex_description); } assert(i <= 1); #endif if (obj->name) free(obj->name); if (obj->description) free(obj->description); if (obj->short_description) free(obj->short_description); if (obj->action_description) free(obj->action_description); if (obj->ex_description) free_ex_descriptions(obj->ex_description); } /* * For object instances that are not the prototype. */ void free_object_strings_proto(struct obj_data *obj) { int robj_num = GET_OBJ_RNUM(obj); if (obj->name && obj->name != obj_proto[robj_num].name) free(obj->name); if (obj->description && obj->description != obj_proto[robj_num].description) free(obj->description); if (obj->short_description && obj->short_description != obj_proto[robj_num].short_description) free(obj->short_description); if (obj->action_description && obj->action_description != obj_proto[robj_num].action_description) free(obj->action_description); if (obj->ex_description) { struct extra_descr_data *thised, *plist, *next_one; /* O(horrible) */ int ok_key, ok_desc, ok_item; for (thised = obj->ex_description; thised; thised = next_one) { next_one = thised->next; for (ok_item = ok_key = ok_desc = 1, plist = obj_proto[robj_num].ex_description; plist; plist = plist->next) { if (plist->keyword == thised->keyword) ok_key = 0; if (plist->description == thised->description) ok_desc = 0; if (plist == thised) ok_item = 0; } if (thised->keyword && ok_key) free(thised->keyword); if (thised->description && ok_desc) free(thised->description); if (ok_item) free(thised); } } }
int save_objects(zone_rnum zone_num) { int counter, counter2, realcounter; FILE *fp; struct obj_data *obj; struct extra_descr_data *ex_desc; if (zone_num < 0 || zone_num > top_of_zone_table) { log("SYSERR: GenOLC: save_objects: Invalid real zone number %d. (0-%d)", zone_num, top_of_zone_table); return FALSE; } sprintf(buf, "%s/%d.new", OBJ_PREFIX, zone_table[zone_num].number); if (!(fp = fopen(buf, "w+"))) { mudlog("SYSERR: OLC: Cannot open objects file!", BRF, LVL_IMMORT, TRUE); return FALSE; } /* * Start running through all objects in this zone. */ for (counter = zone_table[zone_num].number * 100; counter <= zone_table[zone_num].top; counter++) { if ((realcounter = real_object(counter)) >= 0) { if ((obj = &obj_proto[realcounter])->action_description) { buf1[MAX_STRING_LENGTH - 1] = '\0'; strncpy(buf1, obj->action_description, MAX_STRING_LENGTH - 1); strip_cr(buf1); } else *buf1 = '\0'; fprintf(fp, "#%d\n" "%s~\n" "%s~\n" "%s~\n" "%s~\n" "%d %d %d %ld\n" "%d %d %d %d\n" "%d %d %d %d\n", GET_OBJ_VNUM(obj), (obj->name && *obj->name) ? obj->name : "undefined", (obj->short_description && *obj->short_description) ? obj->short_description : "undefined", (obj->description && *obj->description) ? obj->description : "undefined", buf1, GET_OBJ_TYPE(obj), GET_OBJ_EXTRA(obj), GET_OBJ_WEAR(obj), GET_OBJ_PERM(obj), GET_OBJ_VAL(obj, 0), GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 2), GET_OBJ_VAL(obj, 3), GET_OBJ_WEIGHT(obj), GET_OBJ_COST(obj), GET_OBJ_RENT(obj), GET_OBJ_LEVEL(obj)); script_save_to_disk(fp, obj, OBJ_TRIGGER); /* * Do we have extra descriptions? */ if (obj->ex_description) { /* Yes, save them too. */ for (ex_desc = obj->ex_description; ex_desc; ex_desc = ex_desc->next) { /* * Sanity check to prevent nasty protection faults. */ if (!ex_desc->keyword || !ex_desc->description || !*ex_desc->keyword || !*ex_desc->description) { mudlog("SYSERR: OLC: oedit_save_to_disk: Corrupt ex_desc!", BRF, LVL_IMMORT, TRUE); continue; } buf1[MAX_STRING_LENGTH - 1] = '\0'; strncpy(buf1, ex_desc->description, MAX_STRING_LENGTH - 1); strip_cr(buf1); fprintf(fp, "E\n" "%s~\n" "%s~\n", ex_desc->keyword, buf1); } } /* * Do we have affects? */ for (counter2 = 0; counter2 < MAX_OBJ_AFFECT; counter2++) if (obj->affected[counter2].modifier) fprintf(fp, "A\n" "%d %d\n", obj->affected[counter2].location, obj->affected[counter2].modifier); /* And now the spec-proc */ if (obj_index[realcounter].func != NULL) fprintf(fp, "S\n%s\n", obj_procs[get_spec_name(obj_procs, obj_index[realcounter].func)].name); } } /* * Write the final line, close the file. */ fprintf(fp, "$~\n"); fclose(fp); sprintf(buf2, "%s/%d.obj", OBJ_PREFIX, zone_table[zone_num].number); remove(buf2); rename(buf, buf2); remove_from_save_list(zone_table[zone_num].number, SL_OBJ); return TRUE; }
bool assemblyCheckComponents( long lVnum, struct char_data *pCharacter ) { bool bOk = TRUE; long i = 0; long lRnum = 0; struct obj_data **ppComponentObjects = NULL; ASSEMBLY *pAssembly = NULL; if( pCharacter == NULL ) { log( "SYSERR: NULL assemblyCheckComponents(): 'pCharacter'." ); return (FALSE); } else if( (pAssembly = assemblyGetAssemblyPtr( lVnum )) == NULL ) { log( "SYSERR: NULL assemblyCheckComponents(): Invalid 'lVnum' #%ld.", lVnum ); return (FALSE); } if( pAssembly->pComponents == NULL ) return (FALSE); else if( pAssembly->lNumComponents <= 0 ) return (FALSE); CREATE( ppComponentObjects, struct obj_data*, pAssembly->lNumComponents ); for( i = 0; i < pAssembly->lNumComponents && bOk; i++ ) { if( (lRnum = real_object( pAssembly->pComponents[ i ].lVnum )) < 0 ) bOk = FALSE; else { if( pAssembly->pComponents[ i ].bInRoom ) { if( (ppComponentObjects[ i ] = get_obj_in_list_num( lRnum, world[ IN_ROOM( pCharacter ) ].contents )) == NULL ) bOk = FALSE; else obj_from_room( ppComponentObjects[ i ] ); } else { if( (ppComponentObjects[ i ] = get_obj_in_list_num( lRnum, pCharacter->carrying )) == NULL ) bOk = FALSE; else obj_from_char( ppComponentObjects[ i ] ); } } } for( i = 0; i < pAssembly->lNumComponents; i++ ) { if( ppComponentObjects[ i ] == NULL ) continue; if( pAssembly->pComponents[ i ].bExtract && bOk ) extract_obj( ppComponentObjects[ i ] ); else if( pAssembly->pComponents[ i ].bInRoom ) obj_to_room( ppComponentObjects[ i ], IN_ROOM( pCharacter ) ); else obj_to_char( ppComponentObjects[ i ], pCharacter ); } free( ppComponentObjects ); return (bOk); }
/* main loop (of sorts).. basically interpreter throws all input to here. */ void oedit_parse(struct descriptor_data *d, char *arg) { int number, max_val, min_val; char *oldtext = NULL; switch (OLC_MODE(d)) { case OEDIT_CONFIRM_SAVESTRING: switch (*arg) { case 'y': case 'Y': oedit_save_internally(d); mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits obj %d", GET_NAME(d->character), OLC_NUM(d)); if (CONFIG_OLC_SAVE) { oedit_save_to_disk(real_zone_by_thing(OLC_NUM(d))); write_to_output(d, "Object saved to disk.\r\n"); } else write_to_output(d, "Object saved to memory.\r\n"); cleanup_olc(d, CLEANUP_ALL); return; case 'n': case 'N': /* If not saving, we must free the script_proto list. */ OLC_OBJ(d)->proto_script = OLC_SCRIPT(d); free_proto_script(OLC_OBJ(d), OBJ_TRIGGER); cleanup_olc(d, CLEANUP_ALL); return; case 'a': /* abort quit */ case 'A': oedit_disp_menu(d); return; default: write_to_output(d, "Invalid choice!\r\n"); write_to_output(d, "Do you wish to save your changes? : \r\n"); return; } case OEDIT_MAIN_MENU: /* Throw us out to whichever edit mode based on user input. */ switch (*arg) { case 'q': case 'Q': if (OLC_VAL(d)) { /* Something has been modified. */ write_to_output(d, "Do you wish to save your changes? : "); OLC_MODE(d) = OEDIT_CONFIRM_SAVESTRING; } else cleanup_olc(d, CLEANUP_ALL); return; case '1': write_to_output(d, "Enter keywords : "); OLC_MODE(d) = OEDIT_KEYWORD; break; case '2': write_to_output(d, "Enter short desc : "); OLC_MODE(d) = OEDIT_SHORTDESC; break; case '3': write_to_output(d, "Enter long desc :-\r\n| "); OLC_MODE(d) = OEDIT_LONGDESC; break; case '4': OLC_MODE(d) = OEDIT_ACTDESC; send_editor_help(d); write_to_output(d, "Enter action description:\r\n\r\n"); if (OLC_OBJ(d)->action_description) { write_to_output(d, "%s", OLC_OBJ(d)->action_description); oldtext = strdup(OLC_OBJ(d)->action_description); } string_write(d, &OLC_OBJ(d)->action_description, MAX_MESSAGE_LENGTH, 0, oldtext); OLC_VAL(d) = 1; break; case '5': oedit_disp_type_menu(d); OLC_MODE(d) = OEDIT_TYPE; break; case '6': oedit_disp_extra_menu(d); OLC_MODE(d) = OEDIT_EXTRAS; break; case '7': oedit_disp_wear_menu(d); OLC_MODE(d) = OEDIT_WEAR; break; case '8': write_to_output(d, "Enter weight : "); OLC_MODE(d) = OEDIT_WEIGHT; break; case '9': write_to_output(d, "Enter cost : "); OLC_MODE(d) = OEDIT_COST; break; case 'a': case 'A': write_to_output(d, "Enter cost per day : "); OLC_MODE(d) = OEDIT_COSTPERDAY; break; case 'b': case 'B': write_to_output(d, "Enter timer : "); OLC_MODE(d) = OEDIT_TIMER; break; case 'c': case 'C': /* Clear any old values */ GET_OBJ_VAL(OLC_OBJ(d), 0) = 0; GET_OBJ_VAL(OLC_OBJ(d), 1) = 0; GET_OBJ_VAL(OLC_OBJ(d), 2) = 0; GET_OBJ_VAL(OLC_OBJ(d), 3) = 0; OLC_VAL(d) = 1; oedit_disp_val1_menu(d); break; case 'd': case 'D': oedit_disp_prompt_apply_menu(d); break; case 'e': case 'E': /* If extra descriptions don't exist. */ if (OLC_OBJ(d)->ex_description == NULL) { CREATE(OLC_OBJ(d)->ex_description, struct extra_descr_data, 1); OLC_OBJ(d)->ex_description->next = NULL; } OLC_DESC(d) = OLC_OBJ(d)->ex_description; oedit_disp_extradesc_menu(d); break; case 'm': case 'M': write_to_output(d, "Enter new minimum level: "); OLC_MODE(d) = OEDIT_LEVEL; break; case 'p': case 'P': oedit_disp_perm_menu(d); OLC_MODE(d) = OEDIT_PERM; break; case 's': case 'S': OLC_SCRIPT_EDIT_MODE(d) = SCRIPT_MAIN_MENU; dg_script_menu(d); return; case 'w': case 'W': write_to_output(d, "Copy what object? "); OLC_MODE(d) = OEDIT_COPY; break; case 'x': case 'X': write_to_output(d, "Are you sure you want to delete this object? "); OLC_MODE(d) = OEDIT_DELETE; break; default: oedit_disp_menu(d); break; } return; /* end of OEDIT_MAIN_MENU */ case OLC_SCRIPT_EDIT: if (dg_script_edit_parse(d, arg)) return; break; case OEDIT_KEYWORD: if (!genolc_checkstring(d, arg)) break; if (OLC_OBJ(d)->name) free(OLC_OBJ(d)->name); OLC_OBJ(d)->name = str_udup(arg); break; case OEDIT_SHORTDESC: if (!genolc_checkstring(d, arg)) break; if (OLC_OBJ(d)->short_description) free(OLC_OBJ(d)->short_description); OLC_OBJ(d)->short_description = str_udup(arg); break; case OEDIT_LONGDESC: if (!genolc_checkstring(d, arg)) break; if (OLC_OBJ(d)->description) free(OLC_OBJ(d)->description); OLC_OBJ(d)->description = str_udup(arg); break; case OEDIT_TYPE: number = atoi(arg); if ((number < 0) || (number >= NUM_ITEM_TYPES)) { write_to_output(d, "Invalid choice, try again : "); return; } else GET_OBJ_TYPE(OLC_OBJ(d)) = number; /* what's the boundschecking worth if we don't do this ? -- Welcor */ GET_OBJ_VAL(OLC_OBJ(d), 0) = GET_OBJ_VAL(OLC_OBJ(d), 1) = GET_OBJ_VAL(OLC_OBJ(d), 2) = GET_OBJ_VAL(OLC_OBJ(d), 3) = 0; break; case OEDIT_EXTRAS: number = atoi(arg); if ((number < 0) || (number > NUM_ITEM_FLAGS)) { oedit_disp_extra_menu(d); return; } else if (number == 0) break; else { TOGGLE_BIT_AR(GET_OBJ_EXTRA(OLC_OBJ(d)), (number - 1)); oedit_disp_extra_menu(d); return; } case OEDIT_WEAR: number = atoi(arg); if ((number < 0) || (number > NUM_ITEM_WEARS)) { write_to_output(d, "That's not a valid choice!\r\n"); oedit_disp_wear_menu(d); return; } else if (number == 0) /* Quit. */ break; else { TOGGLE_BIT_AR(GET_OBJ_WEAR(OLC_OBJ(d)), (number - 1)); oedit_disp_wear_menu(d); return; } case OEDIT_WEIGHT: GET_OBJ_WEIGHT(OLC_OBJ(d)) = LIMIT(atoi(arg), 0, MAX_OBJ_WEIGHT); break; case OEDIT_COST: GET_OBJ_COST(OLC_OBJ(d)) = LIMIT(atoi(arg), 0, MAX_OBJ_COST); break; case OEDIT_COSTPERDAY: GET_OBJ_RENT(OLC_OBJ(d)) = LIMIT(atoi(arg), 0, MAX_OBJ_RENT); break; case OEDIT_TIMER: GET_OBJ_TIMER(OLC_OBJ(d)) = LIMIT(atoi(arg), 0, MAX_OBJ_TIMER); break; case OEDIT_LEVEL: GET_OBJ_LEVEL(OLC_OBJ(d)) = LIMIT(atoi(arg), 0, LVL_IMPL); break; case OEDIT_PERM: if ((number = atoi(arg)) == 0) break; if (number > 0 && number <= NUM_AFF_FLAGS) { /* Setting AFF_CHARM on objects like this is dangerous. */ if (number != AFF_CHARM) { TOGGLE_BIT_AR(GET_OBJ_AFFECT(OLC_OBJ(d)), number); } } oedit_disp_perm_menu(d); return; case OEDIT_VALUE_1: number = atoi(arg); switch (GET_OBJ_TYPE(OLC_OBJ(d))) { case ITEM_FURNITURE: if (number < 0 || number > MAX_PEOPLE) oedit_disp_val1_menu(d); else { GET_OBJ_VAL(OLC_OBJ(d), 0) = number; oedit_disp_val2_menu(d); } break; case ITEM_WEAPON: GET_OBJ_VAL(OLC_OBJ(d), 0) = MIN(MAX(atoi(arg), -50), 50); break; case ITEM_CONTAINER: GET_OBJ_VAL(OLC_OBJ(d), 0) = LIMIT(atoi(arg), -1, MAX_CONTAINER_SIZE); break; default: GET_OBJ_VAL(OLC_OBJ(d), 0) = atoi(arg); } /* proceed to menu 2 */ oedit_disp_val2_menu(d); return; case OEDIT_VALUE_2: /* Here, I do need to check for out of range values. */ number = atoi(arg); switch (GET_OBJ_TYPE(OLC_OBJ(d))) { case ITEM_SCROLL: case ITEM_POTION: if (number == 0 || number == -1) GET_OBJ_VAL(OLC_OBJ(d), 1) = -1; else GET_OBJ_VAL(OLC_OBJ(d), 1) = LIMIT(number, 1, NUM_SPELLS); oedit_disp_val3_menu(d); break; case ITEM_CONTAINER: /* Needs some special handling since we are dealing with flag values here. */ if (number < 0 || number > 4) oedit_disp_container_flags_menu(d); else if (number != 0) { TOGGLE_BIT(GET_OBJ_VAL(OLC_OBJ(d), 1), 1 << (number - 1)); OLC_VAL(d) = 1; oedit_disp_val2_menu(d); } else oedit_disp_val3_menu(d); break; case ITEM_WEAPON: GET_OBJ_VAL(OLC_OBJ(d), 1) = LIMIT(number, 1, MAX_WEAPON_NDICE); oedit_disp_val3_menu(d); break; default: GET_OBJ_VAL(OLC_OBJ(d), 1) = number; oedit_disp_val3_menu(d); } return; case OEDIT_VALUE_3: number = atoi(arg); /* Quick'n'easy error checking. */ switch (GET_OBJ_TYPE(OLC_OBJ(d))) { case ITEM_SCROLL: case ITEM_POTION: if (number == 0 || number == -1) { GET_OBJ_VAL(OLC_OBJ(d), 2) = -1; oedit_disp_val4_menu(d); return; } min_val = 1; max_val = NUM_SPELLS; break; case ITEM_WEAPON: min_val = 1; max_val = MAX_WEAPON_SDICE; break; case ITEM_WAND: case ITEM_STAFF: min_val = 0; max_val = 20; break; case ITEM_DRINKCON: case ITEM_FOUNTAIN: min_val = 0; max_val = NUM_LIQ_TYPES - 1; number--; break; case ITEM_KEY: min_val = 0; max_val = 65099; break; default: min_val = -65000; max_val = 65000; } GET_OBJ_VAL(OLC_OBJ(d), 2) = LIMIT(number, min_val, max_val); oedit_disp_val4_menu(d); return; case OEDIT_VALUE_4: number = atoi(arg); switch (GET_OBJ_TYPE(OLC_OBJ(d))) { case ITEM_SCROLL: case ITEM_POTION: if (number == 0 || number == -1) { GET_OBJ_VAL(OLC_OBJ(d), 3) = -1; oedit_disp_menu(d); return; } min_val = 1; max_val = NUM_SPELLS; break; case ITEM_WAND: case ITEM_STAFF: min_val = 1; max_val = NUM_SPELLS; break; case ITEM_WEAPON: min_val = 0; max_val = NUM_ATTACK_TYPES - 1; break; default: min_val = -65000; max_val = 65000; break; } GET_OBJ_VAL(OLC_OBJ(d), 3) = LIMIT(number, min_val, max_val); break; case OEDIT_PROMPT_APPLY: if ((number = atoi(arg)) == 0) break; else if (number < 0 || number > MAX_OBJ_AFFECT) { oedit_disp_prompt_apply_menu(d); return; } OLC_VAL(d) = number - 1; OLC_MODE(d) = OEDIT_APPLY; oedit_disp_apply_menu(d); return; case OEDIT_APPLY: if (((number = atoi(arg)) == 0) || ((number = atoi(arg)) == 1)) { OLC_OBJ(d)->affected[OLC_VAL(d)].location = 0; OLC_OBJ(d)->affected[OLC_VAL(d)].modifier = 0; oedit_disp_prompt_apply_menu(d); } else if (number < 0 || number > NUM_APPLIES) oedit_disp_apply_menu(d); else { int counter; /* add in check here if already applied.. deny builders another */ if (GET_LEVEL(d->character) < LVL_IMPL) { for (counter = 0; counter < MAX_OBJ_AFFECT; counter++) { if (OLC_OBJ(d)->affected[counter].location == number) { write_to_output(d, "Object already has that apply."); return; } } } OLC_OBJ(d)->affected[OLC_VAL(d)].location = number - 1; write_to_output(d, "Modifier : "); OLC_MODE(d) = OEDIT_APPLYMOD; } return; case OEDIT_APPLYMOD: OLC_OBJ(d)->affected[OLC_VAL(d)].modifier = atoi(arg); oedit_disp_prompt_apply_menu(d); return; case OEDIT_EXTRADESC_KEY: if (genolc_checkstring(d, arg)) { if (OLC_DESC(d)->keyword) free(OLC_DESC(d)->keyword); OLC_DESC(d)->keyword = str_udup(arg); } oedit_disp_extradesc_menu(d); return; case OEDIT_EXTRADESC_MENU: switch ((number = atoi(arg))) { case 0: if (!OLC_DESC(d)->keyword || !OLC_DESC(d)->description) { struct extra_descr_data *temp; if (OLC_DESC(d)->keyword) free(OLC_DESC(d)->keyword); if (OLC_DESC(d)->description) free(OLC_DESC(d)->description); /* Clean up pointers */ REMOVE_FROM_LIST(OLC_DESC(d), OLC_OBJ(d)->ex_description, next); free(OLC_DESC(d)); OLC_DESC(d) = NULL; } break; case 1: OLC_MODE(d) = OEDIT_EXTRADESC_KEY; write_to_output(d, "Enter keywords, separated by spaces :-\r\n| "); return; case 2: OLC_MODE(d) = OEDIT_EXTRADESC_DESCRIPTION; send_editor_help(d); write_to_output(d, "Enter the extra description:\r\n\r\n"); if (OLC_DESC(d)->description) { write_to_output(d, "%s", OLC_DESC(d)->description); oldtext = strdup(OLC_DESC(d)->description); } string_write(d, &OLC_DESC(d)->description, MAX_MESSAGE_LENGTH, 0, oldtext); OLC_VAL(d) = 1; return; case 3: /* Only go to the next description if this one is finished. */ if (OLC_DESC(d)->keyword && OLC_DESC(d)->description) { struct extra_descr_data *new_extra; if (OLC_DESC(d)->next) OLC_DESC(d) = OLC_DESC(d)->next; else { /* Make new extra description and attach at end. */ CREATE(new_extra, struct extra_descr_data, 1); OLC_DESC(d)->next = new_extra; OLC_DESC(d) = OLC_DESC(d)->next; } } /* No break - drop into default case. */ default: oedit_disp_extradesc_menu(d); return; } break; case OEDIT_COPY: if ((number = real_object(atoi(arg))) != NOTHING) { oedit_setup_existing(d, number); } else write_to_output(d, "That object does not exist.\r\n"); break; case OEDIT_DELETE: if (*arg == 'y' || *arg == 'Y') { if (delete_object(GET_OBJ_RNUM(OLC_OBJ(d))) != NOTHING) write_to_output(d, "Object deleted.\r\n"); else write_to_output(d, "Couldn't delete the object!\r\n"); cleanup_olc(d, CLEANUP_ALL); } else if (*arg == 'n' || *arg == 'N') { oedit_disp_menu(d); OLC_MODE(d) = OEDIT_MAIN_MENU; } else write_to_output(d, "Please answer 'Y' or 'N': "); return; default: mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: Reached default case in oedit_parse()!"); write_to_output(d, "Oops...\r\n"); break; }
/* * NOTE: This clobbers all of the global variable strings. Do not * save anything in them around calls to this function. * * buf, buf1, buf2, arg */ int save_objects(zone_rnum zone_num) { char buf[MAX_STRING_LENGTH]; char buf1[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char buf3[MAX_STRING_LENGTH]; char arg[MAX_STRING_LENGTH]; int counter, counter2, realcounter, i; FILE *fp; struct obj_data *obj; struct extra_descr_data *ex_desc; if (zone_num == NOTHING || zone_num > top_of_zone_table) { log("SYSERR: GenOLC: save_objects: Invalid real zone number %d. (0-%d)", zone_num, top_of_zone_table); return FALSE; } sprintf(buf, "%s/%d.new", OBJ_PREFIX, zone_table[zone_num].number); if (!(fp = fopen(buf, "w+"))) { mudlog(BRF, LVL_SAINT, TRUE, "SYSERR: OLC: Cannot open objects file!"); return FALSE; } /* * Start running through all objects in this zone. */ for (counter = genolc_zone_bottom(zone_num); counter <= zone_table[zone_num].top; counter++) { if ((realcounter = real_object(counter)) != NOTHING) { if ((obj = &obj_proto[realcounter])->action_description) { buf1[MAX_STRING_LENGTH - 1] = '\0'; strncpy(buf1, obj->action_description, MAX_STRING_LENGTH - 1); strip_cr(buf1); } else *buf1 = '\0'; fprintf(fp, "#%d\n" "%s~\n" "%s~\n" "%s~\n" "%s~\n", GET_OBJ_VNUM(obj), (obj->name && *obj->name) ? obj->name : STRING_UNDEFINED, (obj->short_description && *obj->short_description) ? obj->short_description : STRING_UNDEFINED, (obj->description && *obj->description) ? obj->description : STRING_UNDEFINED, buf1); sprintasciilong(buf1, GET_OBJ_EXTRA(obj)); sprintasciilong(buf3, GET_OBJ_CLASS(obj)); sprintascii(buf2, GET_OBJ_WEAR(obj)); sprintasciilong(arg, GET_OBJ_PERM(obj)); fprintf(fp, "%d %s %s %s %s\n" "%d %d %d %d %d\n" "%d %d %d %d %d\n", GET_OBJ_TYPE(obj), buf1, buf2, arg, buf3, GET_OBJ_VAL(obj, 0), GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 2), GET_OBJ_VAL(obj, 3), GET_OBJ_SIZE(obj), GET_OBJ_WEIGHT(obj), GET_OBJ_COST(obj), GET_OBJ_RENT(obj), GET_OBJ_LEVEL(obj), GET_OBJ_MAX_LEVEL(obj) ); /* * Do we have script(s) attached ? */ script_save_to_disk(fp, obj, OBJ_TRIGGER); /* save resists */ for (i = 0; i < MAX_ATTACK_TYPES; i++) { if(obj->resist[i] == 1) fprintf(fp, "R\n%d %d\n",i, obj->resist[i]); } for (i = 0; i < MAX_ATTACK_TYPES; i++) { if(obj->vulnerable[i] == 1) fprintf(fp, "V\n%d %d\n",i, obj->vulnerable[i]); } for (i = 0; i < MAX_ATTACK_TYPES; i++) { if(obj->immune[i] == 1) fprintf(fp, "I\n%d %d\n",i, obj->immune[i]); } /* * Do we have extra descriptions? */ if (obj->ex_description) { /* Yes, save them too. */ for (ex_desc = obj->ex_description; ex_desc; ex_desc = ex_desc->next) { /* * Sanity check to prevent nasty protection faults. */ if (!ex_desc->keyword || !ex_desc->description || !*ex_desc->keyword || !*ex_desc->description) { mudlog(BRF, LVL_SAINT, TRUE, "SYSERR: OLC: oedit_save_to_disk: Corrupt ex_desc!"); continue; } buf1[MAX_STRING_LENGTH - 1] = '\0'; strncpy(buf1, ex_desc->description, MAX_STRING_LENGTH - 1); strip_cr(buf1); fprintf(fp, "E\n" "%s~\n" "%s~\n", ex_desc->keyword, buf1); } } /* * Do we have affects? */ for (counter2 = 0; counter2 < MAX_OBJ_AFFECT; counter2++) if (obj->affected[counter2].modifier) fprintf(fp, "A\n" "%d %d\n", obj->affected[counter2].location, obj->affected[counter2].modifier); } } /* * Write the final line, close the file. */ fprintf(fp, "$~\n"); fclose(fp); sprintf(buf2, "%s/%d.obj", OBJ_PREFIX, zone_table[zone_num].number); remove(buf2); rename(buf, buf2); remove_from_save_list(zone_table[zone_num].number, SL_OBJ); return TRUE; }
void generic_complete_quest(struct char_data *ch) { qst_rnum rnum; qst_vnum vnum = GET_QUEST(ch); struct obj_data *new_obj; int happy_qp, happy_gold, happy_exp; if (--GET_QUEST_COUNTER(ch) <= 0) { rnum = real_quest(vnum); if (IS_HAPPYHOUR && IS_HAPPYQP) { happy_qp = (int)(QST_POINTS(rnum) * (((float)(100+HAPPY_QP))/(float)100)); happy_qp = MAX(happy_qp, 0); GET_QUESTPOINTS(ch) += happy_qp; send_to_char(ch, "%s\r\nYou have been awarded %d quest points for your service.\r\n", QST_DONE(rnum), happy_qp); } else { GET_QUESTPOINTS(ch) += QST_POINTS(rnum); send_to_char(ch, "%s\r\nYou have been awarded %d quest points for your service.\r\n", QST_DONE(rnum), QST_POINTS(rnum)); } if (QST_GOLD(rnum)) { if ((IS_HAPPYHOUR) && (IS_HAPPYGOLD)) { happy_gold = (int)(QST_GOLD(rnum) * (((float)(100+HAPPY_GOLD))/(float)100)); happy_gold = MAX(happy_gold, 0); increase_gold(ch, happy_gold); send_to_char(ch, "You have been awarded %d gold coins for your service.\r\n", happy_gold); } else { increase_gold(ch, QST_GOLD(rnum)); send_to_char(ch, "You have been awarded %d gold coins for your service.\r\n", QST_GOLD(rnum)); } } if (QST_EXP(rnum)) { gain_exp(ch, QST_EXP(rnum)); if ((IS_HAPPYHOUR) && (IS_HAPPYEXP)) { happy_exp = (int)(QST_EXP(rnum) * (((float)(100+HAPPY_EXP))/(float)100)); happy_exp = MAX(happy_exp, 0); send_to_char(ch, "You have been awarded %d experience for your service.\r\n", happy_exp); } else { send_to_char(ch, "You have been awarded %d experience points for your service.\r\n", QST_EXP(rnum)); } } if (QST_OBJ(rnum) && QST_OBJ(rnum) != NOTHING) { if (real_object(QST_OBJ(rnum)) != NOTHING) { if ((new_obj = read_object((QST_OBJ(rnum)),VIRTUAL)) != NULL) { obj_to_char(new_obj, ch); send_to_char(ch, "You have been presented with %s%s for your service.\r\n", GET_OBJ_SHORT(new_obj), CCNRM(ch, C_NRM)); } } } if (!IS_SET(QST_FLAGS(rnum), AQ_REPEATABLE)) add_completed_quest(ch, vnum); clear_quest(ch); if ((real_quest(QST_NEXT(rnum)) != NOTHING) && (QST_NEXT(rnum) != vnum) && !is_complete(ch, QST_NEXT(rnum))) { rnum = real_quest(QST_NEXT(rnum)); set_quest(ch, rnum); send_to_char(ch, "The next stage of your quest awaits:\r\n%s", QST_INFO(rnum)); } } save_char(ch); }
void zedit_parse(struct descriptor_data *d, char *arg) { int pos, i = 0; switch (OLC_MODE(d)) { /*-------------------------------------------------------------------*/ case ZEDIT_CONFIRM_SAVESTRING: switch (*arg) { case 'y': case 'Y': /* * Save the zone in memory, hiding invisible people. */ //SEND_TO_Q("Saving zone info in memory.\r\n", d); zedit_save_internally(d); SEND_TO_Q("Saving zone info to disk.\r\n", d); zedit_save_to_disk(OLC_ZNUM(d)); sprintf(buf, "OLC: %s edits zone info for room %d.", GET_NAME(d->character), OLC_NUM(d)); mudlog(buf, CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE); /* FALL THROUGH */ case 'n': case 'N': cleanup_olc(d, CLEANUP_ALL); break; default: SEND_TO_Q("Invalid choice!\r\nDo you wish to save your changes? : ", d); break; } break; /* End of ZEDIT_CONFIRM_SAVESTRING */ /*-------------------------------------------------------------------*/ case ZEDIT_MAIN_MENU: switch (*arg) { case 'q': case 'Q': if (OLC_ZONE(d)->age || OLC_ZONE(d)->number) { SEND_TO_Q("Do you wish to save your changes? : ", d); OLC_MODE(d) = ZEDIT_CONFIRM_SAVESTRING; } else { SEND_TO_Q("No changes made.\r\n", d); cleanup_olc(d, CLEANUP_ALL); } break; case 'n': case 'N': /* * New entry. */ SEND_TO_Q("What number in the list should the new command be? : ", d); OLC_MODE(d) = ZEDIT_NEW_ENTRY; break; case 'e': case 'E': /* * Change an entry. */ SEND_TO_Q("Which command do you wish to change? : ", d); OLC_MODE(d) = ZEDIT_CHANGE_ENTRY; break; case 'd': case 'D': /* * Delete an entry. */ SEND_TO_Q("Which command do you wish to delete? : ", d); OLC_MODE(d) = ZEDIT_DELETE_ENTRY; break; case 'z': case 'Z': /* * Edit zone name. */ SEND_TO_Q("Enter new zone name : ", d); OLC_MODE(d) = ZEDIT_ZONE_NAME; break; case 't': case 'T': /* * Edit top of zone. */ if (GET_LEVEL(d->character) < LVL_DEITY) zedit_disp_menu(d); else { SEND_TO_Q("Enter new top of zone : ", d); OLC_MODE(d) = ZEDIT_ZONE_TOP; } break; case 'l': case 'L': /* * Edit zone lifespan. */ SEND_TO_Q("Enter new zone lifespan : ", d); OLC_MODE(d) = ZEDIT_ZONE_LIFE; break; case 'r': case 'R': /* * Edit zone reset mode. */ SEND_TO_Q("\r\n" "0) Never reset\r\n" "1) Reset only when no players in zone\r\n" "2) Normal reset\r\n" "Enter new zone reset type : ", d); OLC_MODE(d) = ZEDIT_ZONE_RESET; break; case 'c': case 'C': /* * Change loadchance (percentages) */ send_to_char(" \r\nWhich command? ", d->character); OLC_MODE(d) = ZEDIT_PROB; break; case 'b': case 'B': if (GET_LEVEL(d->character) < LVL_DEITY) { send_to_char("Only Implementors can modify the builder list.\r\n", d->character); zedit_disp_menu(d); } else { /* * Edit zone builder list. */ send_to_char("Enter new zone builders : ", d->character); OLC_MODE(d) = ZEDIT_ZONE_BUILDERS; } break; default: zedit_disp_menu(d); break; } break; /* End of ZEDIT_MAIN_MENU */ /*-------------------------------------------------------------------*/ case ZEDIT_NEW_ENTRY: /* * Get the line number and insert the new line. */ pos = atoi(arg); if (isdigit(*arg) && new_command(OLC_ZONE(d), pos)) { if (start_change_command(d, pos)) { zedit_disp_comtype(d); OLC_ZONE(d)->age = 1; } } else zedit_disp_menu(d); break; /*-------------------------------------------------------------------*/ case ZEDIT_DELETE_ENTRY: /* * Get the line number and delete the line. */ pos = atoi(arg); if (isdigit(*arg)) { delete_command(OLC_ZONE(d), pos); OLC_ZONE(d)->age = 1; } zedit_disp_menu(d); break; /*-------------------------------------------------------------------*/ case ZEDIT_CHANGE_ENTRY: /* * Parse the input for which line to edit, and goto next quiz. */ pos = atoi(arg); if (isdigit(*arg) && start_change_command(d, pos)) { zedit_disp_comtype(d); OLC_ZONE(d)->age = 1; } else zedit_disp_menu(d); break; /*-------------------------------------------------------------------*/ case ZEDIT_COMMAND_TYPE: /* * Parse the input for which type of command this is, and goto next * quiz. */ OLC_CMD(d).command = toupper(*arg); if (!OLC_CMD(d).command || (strchr("MOPEDGR", OLC_CMD(d).command) == NULL)) { SEND_TO_Q("Invalid choice, try again : ", d); } else { if (OLC_VAL(d)) { /* If there was a previous command. */ SEND_TO_Q("Is this command dependent on the success of the previous one? (y/n)\r\n", d); OLC_MODE(d) = ZEDIT_IF_FLAG; } else { /* 'if-flag' not appropriate. */ OLC_CMD(d).if_flag = 0; zedit_disp_arg1(d); } } break; /*-------------------------------------------------------------------*/ case ZEDIT_IF_FLAG: /* * Parse the input for the if flag, and goto next quiz. */ switch (*arg) { case 'y': case 'Y': OLC_CMD(d).if_flag = 1; break; case 'n': case 'N': OLC_CMD(d).if_flag = 0; break; default: SEND_TO_Q("Try again : ", d); return; } zedit_disp_arg1(d); break; /*-------------------------------------------------------------------*/ case ZEDIT_ARG1: /* * Parse the input for arg1, and goto next quiz. */ if (!isdigit(*arg)) { SEND_TO_Q("Must be a numeric value, try again : ", d); return; } switch (OLC_CMD(d).command) { case 'M': if ((pos = real_mobile(atoi(arg))) >= 0) { OLC_CMD(d).arg1 = pos; zedit_disp_arg2(d); } else SEND_TO_Q("That mobile does not exist, try again : ", d); break; case 'O': case 'P': case 'E': case 'G': if ((pos = real_object(atoi(arg))) >= 0) { OLC_CMD(d).arg1 = pos; zedit_disp_arg2(d); } else SEND_TO_Q("That object does not exist, try again : ", d); break; case 'D': case 'R': case 'T': case 'V': if (atoi(arg)<MOB_TRIGGER || atoi(arg)>WLD_TRIGGER) send_to_char("Invalid input.", d->character); else { OLC_CMD(d).arg1 = atoi(arg); zedit_disp_arg2(d); } break; default: /* * We should never get here. */ cleanup_olc(d, CLEANUP_ALL); mudlog("SYSERR: OLC: zedit_parse(): case ARG1: Ack!", BRF, LVL_BUILDER, TRUE); SEND_TO_Q("Oops...\r\n", d); break; } break; /*-------------------------------------------------------------------*/ case ZEDIT_ARG2: /* * Parse the input for arg2, and goto next quiz. */ if (!isdigit(*arg)) { SEND_TO_Q("Must be a numeric value, try again : ", d); return; } switch (OLC_CMD(d).command) { case 'M': case 'O': OLC_CMD(d).arg2 = atoi(arg); OLC_CMD(d).arg3 = real_room(OLC_NUM(d)); OLC_CMD(d).arg4 = 0; zedit_disp_menu(d); break; case 'G': OLC_CMD(d).arg2 = atoi(arg); OLC_CMD(d).arg4 = 0; zedit_disp_menu(d); break; case 'P': case 'E': OLC_CMD(d).arg2 = atoi(arg); OLC_CMD(d).arg4 = 0; zedit_disp_arg3(d); break; case 'V': OLC_CMD(d).arg2 = atoi(arg); if (OLC_CMD(d).arg1 == WLD_TRIGGER) OLC_CMD(d).arg3 = OLC_NUM(d); send_to_char("Enter the global name : ", d->character); OLC_MODE(d) = ZEDIT_SARG1; break; case 'T': if (real_trigger(atoi(arg)) >= 0) { OLC_CMD(d).arg2 = atoi(arg); zedit_disp_menu(d); } else send_to_char("That trigger does not exist, try again : ", d->character); break; case 'D': pos = atoi(arg); /* * Count directions. */ if (pos < 0 || pos > NUM_OF_DIRS) SEND_TO_Q("Try again : ", d); else { OLC_CMD(d).arg2 = pos; zedit_disp_arg3(d); } break; case 'R': if ((pos = real_object(atoi(arg))) >= 0) { OLC_CMD(d).arg2 = pos; zedit_disp_menu(d); } else SEND_TO_Q("That object does not exist, try again : ", d); break; default: /* * We should never get here, but just in case... */ cleanup_olc(d, CLEANUP_ALL); mudlog("SYSERR: OLC: zedit_parse(): case ARG2: Ack!", BRF, LVL_BUILDER, TRUE); SEND_TO_Q("Oops...\r\n", d); break; } break; /*-------------------------------------------------------------------*/ case ZEDIT_ARG3: /* * Parse the input for arg3, and go back to main menu. */ if (!isdigit(*arg)) { SEND_TO_Q("Must be a numeric value, try again : ", d); return; } switch (OLC_CMD(d).command) { case 'E': pos = atoi(arg); /* * Count number of wear positions. We could use NUM_WEARS, this is * more reliable. */ while (*equipment_types[i] != '\n') i++; if (pos < 0 || pos > i) SEND_TO_Q("Try again : ", d); else { OLC_CMD(d).arg3 = pos; zedit_disp_menu(d); } break; case 'P': if ((pos = real_object(atoi(arg))) >= 0) { OLC_CMD(d).arg3 = pos; zedit_disp_menu(d); } else SEND_TO_Q("That object does not exist, try again : ", d); break; case 'D': pos = atoi(arg); if (pos < 0 || pos > 2) SEND_TO_Q("Try again : ", d); else { OLC_CMD(d).arg3 = pos; zedit_disp_menu(d); } break; case 'M': case 'O': case 'G': case 'R': case 'T': case 'V': default: /* * We should never get here, but just in case... */ cleanup_olc(d, CLEANUP_ALL); mudlog("SYSERR: OLC: zedit_parse(): case ARG3: Ack!", BRF, LVL_BUILDER, TRUE); SEND_TO_Q("Oops...\r\n", d); break; } break; /*-------------------------------------------------------------------*/ case ZEDIT_SARG1: if (strlen(arg)) { OLC_CMD(d).sarg1 = str_dup(arg); OLC_MODE(d) = ZEDIT_SARG2; send_to_char("Enter the global value : ", d->character); } else send_to_char("Must have some name to assign : ", d->character); break; /*-------------------------------------------------------------------*/ case ZEDIT_SARG2: if (strlen(arg)) { OLC_CMD(d).sarg2 = str_dup(arg); zedit_disp_menu(d); } else send_to_char("Must have some value to set it to :", d->character); break; /*-------------------------------------------------------------------*/ case ZEDIT_ZONE_NAME: /* * Add new name and return to main menu. */ if (genolc_checkstring(d, arg)) { if (OLC_ZONE(d)->name) free(OLC_ZONE(d)->name); else log("SYSERR: OLC: ZEDIT_ZONE_NAME: no name to free!"); OLC_ZONE(d)->name = str_dup(arg); OLC_ZONE(d)->number = 1; zedit_disp_menu(d); break; /*-------------------------------------------------------------------*/ case ZEDIT_ZONE_BUILDERS: /* * Add new builders and return to main menu. */ if (OLC_ZONE(d)->builders) free(OLC_ZONE(d)->builders); OLC_ZONE(d)->builders = str_dup(arg); OLC_ZONE(d)->number = 1; } zedit_disp_menu(d); break; /*-------------------------------------------------------------------*/ case ZEDIT_ZONE_RESET: /* * Parse and add new reset_mode and return to main menu. */ pos = atoi(arg); if (!isdigit(*arg) || pos < 0 || pos > 2) SEND_TO_Q("Try again (0-2) : ", d); else { OLC_ZONE(d)->reset_mode = pos; OLC_ZONE(d)->number = 1; zedit_disp_menu(d); } break; /*-------------------------------------------------------------------*/ case ZEDIT_ZONE_LIFE: /* * Parse and add new lifespan and return to main menu. */ pos = atoi(arg); if (!isdigit(*arg) || pos < 0 || pos > 240) SEND_TO_Q("Try again (0-240) : ", d); else { OLC_ZONE(d)->lifespan = pos; OLC_ZONE(d)->number = 1; zedit_disp_menu(d); } break; /*-------------------------------------------------------------------*/ case ZEDIT_ZONE_TOP: /* * Parse and add new top room in zone and return to main menu. */ if (OLC_ZNUM(d) == top_of_zone_table) OLC_ZONE(d)->top = LIMIT(atoi(arg), OLC_ZNUM(d) * 100, 32000); else OLC_ZONE(d)->top = LIMIT(atoi(arg), OLC_ZNUM(d) * 100, zone_table[OLC_ZNUM(d) + 1].number * 100); zedit_disp_menu(d); break; /*-------------------------------------------------------------------*/ case ZEDIT_PROB: /* * Which command to change loadchance for? :/ */ pos = atoi(arg); if (isdigit(*arg) && start_change_command(d, pos)) { OLC_MODE(d) = ZEDIT_PROB2; OLC_ZONE(d)->age = 1; send_to_char("\r\nChance of NOT loading (0-100) (input 0 for 'always load'): ", d->character); break; } else send_to_char("\r\nInvalid choice.\r\n\r\n", d->character); zedit_disp_menu(d); break; /*-------------------------------------------------------------------*/ case ZEDIT_PROB2: /* * Change the loadchance */ OLC_CMD(d).arg4 = atoi(arg); OLC_MODE(d) = ZEDIT_MAIN_MENU; zedit_disp_menu(d); break; /*-------------------------------------------------------------------*/ default: /* * We should never get here, but just in case... */ cleanup_olc(d, CLEANUP_ALL); mudlog("SYSERR: OLC: zedit_parse(): Reached default case!", BRF, LVL_BUILDER, TRUE); SEND_TO_Q("Oops...\r\n", d); break; } }
void quest_stat(struct char_data *ch, char argument[MAX_STRING_LENGTH]) { qst_rnum rnum; mob_rnum qmrnum; char buf[MAX_STRING_LENGTH]; char targetname[MAX_STRING_LENGTH]; if (GET_ADMLEVEL(ch) < ADMLVL_IMMORT) send_to_char(ch, "Huh!?!\r\n"); else if (!*argument) send_to_char(ch, "%s\r\n", quest_imm_usage); else if ((rnum = real_quest(atoi(argument))) == NOTHING ) send_to_char(ch, "That quest does not exist.\r\n"); else { sprintbit(QST_FLAGS(rnum), aq_flags, buf, sizeof(buf)); switch (QST_TYPE(rnum)) { case AQ_OBJ_FIND: case AQ_OBJ_RETURN: snprintf(targetname, sizeof(targetname), "%s", real_object(QST_TARGET(rnum)) == NOTHING ? "An unknown object" : obj_proto[real_object(QST_TARGET(rnum))].short_description); break; case AQ_ROOM_FIND: case AQ_ROOM_CLEAR: snprintf(targetname, sizeof(targetname), "%s", real_room(QST_TARGET(rnum)) == NOWHERE ? "An unknown room" : world[real_room(QST_TARGET(rnum))].name); break; case AQ_MOB_FIND: case AQ_MOB_KILL: case AQ_MOB_SAVE: snprintf(targetname, sizeof(targetname), "%s", real_mobile(QST_TARGET(rnum)) == NOBODY ? "An unknown mobile" : GET_NAME(&mob_proto[real_mobile(QST_TARGET(rnum))])); break; default: snprintf(targetname, sizeof(targetname), "Unknown"); break; } qmrnum = real_mobile(QST_MASTER(rnum)); send_to_char(ch, "VNum : [\ty%5d\tn], RNum: [\ty%5d\tn] -- Questmaster: [\ty%5d\tn] \ty%s\tn\r\n" "Name : \ty%s\tn\r\n" "Desc : \ty%s\tn\r\n" "Accept Message:\r\n\tc%s\tn" "Completion Message:\r\n\tc%s\tn" "Quit Message:\r\n\tc%s\tn" "Type : \ty%s\tn\r\n" "Target: \ty%d\tn \ty%s\tn, Quantity: \ty%d\tn\r\n" "Value : \ty%d\tn, Penalty: \ty%d\tn, Min Level: \ty%2d\tn, Max Level: \ty%2d\tn\r\n" "Flags : \tc%s\tn\r\n", QST_NUM(rnum), rnum, QST_MASTER(rnum) == NOBODY ? -1 : QST_MASTER(rnum), (qmrnum == NOBODY) ? "(Invalid vnum)" : GET_NAME(&mob_proto[(qmrnum)]), QST_NAME(rnum), QST_DESC(rnum), QST_INFO(rnum), QST_DONE(rnum), (QST_QUIT(rnum) && (str_cmp(QST_QUIT(rnum), "undefined") != 0) ? QST_QUIT(rnum) : "Nothing\r\n"), quest_types[QST_TYPE(rnum)], QST_TARGET(rnum) == NOBODY ? -1 : QST_TARGET(rnum), targetname, QST_QUANTITY(rnum), QST_POINTS(rnum), QST_PENALTY(rnum), QST_MINLEVEL(rnum), QST_MAXLEVEL(rnum), buf); if (QST_PREREQ(rnum) != NOTHING) send_to_char(ch, "Preq : [\ty%5d\tn] \ty%s\tn\r\n", QST_PREREQ(rnum) == NOTHING ? -1 : QST_PREREQ(rnum), QST_PREREQ(rnum) == NOTHING ? "" : real_object(QST_PREREQ(rnum)) == NOTHING ? "an unknown object" : obj_proto[real_object(QST_PREREQ(rnum))].short_description); if (QST_TYPE(rnum) == AQ_OBJ_RETURN) send_to_char(ch, "Mob : [\ty%5d\tn] \ty%s\tn\r\n", QST_RETURNMOB(rnum), real_mobile(QST_RETURNMOB(rnum)) == NOBODY ? "an unknown mob" : mob_proto[real_mobile(QST_RETURNMOB(rnum))].player.short_descr); if (QST_TIME(rnum) != -1) send_to_char(ch, "Limit : There is a time limit of %d turn%s to complete.\r\n", QST_TIME(rnum), QST_TIME(rnum) == 1 ? "" : "s"); else send_to_char(ch, "Limit : There is no time limit on this quest.\r\n"); send_to_char(ch, "Prior :"); if (QST_PREV(rnum) == NOTHING) send_to_char(ch, " \tyNone.\tn\r\n"); else send_to_char(ch, " [\ty%5d\tn] \tc%s\tn\r\n", QST_PREV(rnum), QST_DESC(real_quest(QST_PREV(rnum)))); send_to_char(ch, "Next :"); if (QST_NEXT(rnum) == NOTHING) send_to_char(ch, " \tyNone.\tn\r\n"); else send_to_char(ch, " [\ty%5d\tn] \tc%s\tn\r\n", QST_NEXT(rnum), QST_DESC(real_quest(QST_NEXT(rnum)))); } }
void convert_objs_to_disk(int zone_num) { int counter, counter2, realcounter; FILE *fp; struct obj_data *obj; struct extra_descr_data *ex_desc; int tmpmod; sprintf(buf, "%s/%d.obj", OBJ_PREFIX, zone_table[zone_num].number); if (!(fp = fopen(buf, "w+"))) { return; } /* start running through all objects in this zone */ for (counter = zone_table[zone_num].number * 100; counter <= zone_table[zone_num].top; counter++) { /* write object to disk */ realcounter = real_object(counter); if (realcounter >= 0) { obj = (obj_proto + realcounter); if (obj->action_description) { strcpy(buf1, obj->action_description); strip_string(buf1); } else *buf1 = 0; fprintf(fp, "#%d\n" "%s~\n" "%s~\n" "%s~\n" "%s~\n" "%d %d %d\n" "%d %d %d %d %d\n" "%d %d %d\n", GET_OBJ_VNUM(obj), obj->name, obj->short_description, obj->description, buf1, GET_OBJ_TYPE(obj), GET_OBJ_EXTRA(obj), GET_OBJ_WEAR(obj), GET_OBJ_VAL(obj, 0), GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 2), GET_OBJ_VAL(obj, 3), GET_OBJ_VAL(obj, 4), GET_OBJ_WEIGHT(obj), GET_OBJ_COST(obj), GET_OBJ_RENT(obj) /*. GET_OBJ_LEVEL(obj) -- Level flags for objects .*/ ); /* Do we have extra descriptions? */ if (obj->ex_description) { /*. Yep, save them too .*/ for (ex_desc = obj->ex_description; ex_desc; ex_desc = ex_desc->next) { /*. Sanity check to prevent nasty protection faults .*/ if (!*ex_desc->keyword || !*ex_desc->description) { mudlog("SYSERR: OLC: oedit_save_to_disk: Corrupt ex_desc!", 'G', COM_BUILDER, TRUE); continue; } strcpy(buf1, ex_desc->description); strip_string(buf1); fprintf(fp, "E\n" "%s~\n" "%s~\n", ex_desc->keyword, buf1); } } /* Do we have affects? */ for (counter2 = 0; counter2 < MAX_OBJ_AFFECT; counter2++) if (obj->affected[counter2].modifier) { if ((obj->affected[counter2].location > 0) && (obj->affected[counter2].location < 7)) tmpmod = obj->affected[counter2].modifier * 5; else tmpmod = obj->affected[counter2].modifier; fprintf(fp, "A\n" "%d %d\n", obj->affected[counter2].location, tmpmod); } } } /* write final line, close */ fprintf(fp, "$~\n"); fclose(fp); }
void perform_obj_type_list(struct char_data * ch, char *arg) { int num, itemtype, v1, v2, found = 0, len = 0, tmp_len = 0; obj_vnum ov; obj_rnum r_num; char buf[MAX_STRING_LENGTH]; itemtype = atoi(arg); len = snprintf(buf, sizeof(buf), "Listing all objects of type %s[%s]%s\r\n", QYEL, item_types[itemtype], QNRM); for(num=0;num<=top_of_objt;num++) { if(obj_proto[num].obj_flags.type_flag == itemtype) { if ((r_num = real_object(obj_index[num].vnum)) != NOTHING) { /* Seems silly? */ /* Set default vals, which may be changed below */ ov = obj_index[num].vnum; v1 = (obj_proto[num].obj_flags.value[0]); switch (itemtype) { case ITEM_LIGHT: v1 = (obj_proto[num].obj_flags.value[2]); if (v1 == -1) tmp_len = snprintf(buf+len, sizeof(buf)-len, "%s%3d%s) %s[%s%5d%s]%s INFINITE%s %s%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, ov, QCYN, QBRED, QCYN, obj_proto[r_num].short_description, QNRM); else tmp_len = snprintf(buf+len, sizeof(buf)-len,"%s%3d%s) %s[%s%5d%s]%s (%-3dhrs) %s%s%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, ov, QCYN, QNRM, v1, QCYN, obj_proto[r_num].short_description, QNRM); break; case ITEM_SCROLL: case ITEM_POTION: tmp_len = snprintf(buf+len, sizeof(buf)-len,"%s%3d%s) %s[%s%8d%s] %s%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, ov, QCYN, obj_proto[r_num].short_description, QNRM); break; case ITEM_WAND: case ITEM_STAFF: v1 = (obj_proto[num].obj_flags.value[1]); v2 = (obj_proto[num].obj_flags.value[3]); tmp_len = snprintf(buf+len, sizeof(buf)-len,"%s%3d%s) %s[%s%8d%s]%s (%dx%s) %s%s%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, ov, QCYN, QNRM, v1, skill_name(v2), QCYN, obj_proto[r_num].short_description, QNRM); break; case ITEM_WEAPON: v1 = ((obj_proto[num].obj_flags.value[2]+1)*(obj_proto[r_num].obj_flags.value[1])) / 2; tmp_len = snprintf(buf+len, sizeof(buf)-len,"%s%3d%s) %s[%s%8d%s]%s (%d Avg Dam) %s%s%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, ov, QCYN, QNRM, v1, QCYN, obj_proto[r_num].short_description, QNRM); break; case ITEM_ARMOR: tmp_len = snprintf(buf+len, sizeof(buf)-len,"%s%3d%s) %s[%s%8d%s]%s (%dAC) %s%s%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, ov, QCYN, QNRM, v1, QCYN, obj_proto[r_num].short_description, QNRM); break; case ITEM_CONTAINER: tmp_len = snprintf(buf+len, sizeof(buf)-len,"%s%3d%s) %s[%s%8d%s]%s (Max: %d) %s%s%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, ov, QCYN, QNRM, v1, QCYN, obj_proto[r_num].short_description, QNRM); break; case ITEM_DRINKCON: case ITEM_FOUNTAIN: if (v1 != -1) tmp_len = snprintf(buf+len, sizeof(buf)-len,"%s%3d%s) %s[%s%8d%s]%s (Max: %d) %s%s%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, ov, QCYN, QNRM, v1, QCYN, obj_proto[r_num].short_description, QNRM); else tmp_len = snprintf(buf+len, sizeof(buf)-len,"%s%3d%s) %s[%s%8d%s] %sINFINITE%s %s%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, ov, QCYN, QBRED, QCYN, obj_proto[r_num].short_description, QNRM); break; case ITEM_FOOD: v2 = (obj_proto[num].obj_flags.value[3]); if (v2 != 0) tmp_len = snprintf(buf+len, sizeof(buf)-len,"%s%3d%s) %s[%s%8d%s]%s (%dhrs) %s%s %sPoisoned!%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, ov, QCYN, QNRM, v1, QCYN, obj_proto[r_num].short_description, QBGRN, QNRM); else tmp_len = snprintf(buf+len, sizeof(buf)-len,"%s%3d%s) %s[%s%8d%s]%s (%dhrs) %s%s%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, ov, QCYN, QNRM, v1, QCYN, obj_proto[r_num].short_description, QNRM); break; case ITEM_MONEY: tmp_len = snprintf(buf+len, sizeof(buf)-len,"%s%3d%s) %s[%s%8d%s] %s%s (%s%d coins%s)\r\n", QGRN, ++found, QNRM, QCYN, QYEL, ov, QCYN, obj_proto[r_num].short_description, QNRM, QYEL, v1, QNRM); break; /* The 'normal' items - don't provide extra info */ case ITEM_TREASURE: case ITEM_TRASH: case ITEM_OTHER: case ITEM_WORN: case ITEM_NOTE: case ITEM_PEN: case ITEM_BOAT: case ITEM_KEY: tmp_len = snprintf(buf+len, sizeof(buf)-len,"%s%3d%s) %s[%s%8d%s] %s%s\r\n", QGRN, ++found, QNRM, QCYN, QYEL, ov, QCYN, obj_proto[r_num].short_description, QNRM); break; default: send_to_char(ch, "Not a valid item type"); return; } if (len + tmp_len < sizeof(buf) - 1) len += tmp_len; else { buf[sizeof(buf) -1] = '\0'; break; } } } } page_string(ch->desc, buf, TRUE); }
int Crash_load_objs(struct char_data *ch) { FILE *fl; char fname[MAX_STRING_LENGTH]; char line[256]; int t[10],i,num_of_days; int orig_rent_code; struct obj_data *temp; int locate=0, nr,cost,num_objs=0; struct obj_data *cont_row[MAX_BAG_ROWS]; int rentcode,timed,netcost,gold,account,nitems; if (!get_filename(fname, sizeof(fname), CRASH_FILE, GET_NAME(ch))) return 1; for (i = 0; i < MAX_BAG_ROWS; i++) cont_row[i] = NULL; if (!(fl = fopen(fname, "r"))) { if (errno != ENOENT) { /* if it fails, NOT because of no file */ char buf[MAX_STRING_LENGTH]; sprintf(buf, "SYSERR: READING OBJECT FILE %s (5)", fname); perror(buf); send_to_char(ch, "\r\n********************* NOTICE *********************\r\n" "There was a problem loading your objects from disk.\r\n" "Contact a God for assistance.\r\n"); } mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s entering game with no equipment.", GET_NAME(ch)); return 1; } if (get_line(fl, line)) sscanf(line,"%d %d %d %d %d %d",&rentcode, &timed, &netcost,&gold,&account,&nitems); if (rentcode == RENT_RENTED || rentcode == RENT_TIMEDOUT) { char str[64]; sprintf(str, "%d", SECS_PER_REAL_DAY); num_of_days = (int)((float) (time(0) - timed) / (float)atoi(str)); cost = (int) (netcost * num_of_days); if (cost > GET_GOLD(ch) + GET_BANK_GOLD(ch)) { fclose(fl); mudlog(BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s entering game, rented equipment lost (no $).", GET_NAME(ch)); Crash_crashsave(ch); return 2; } else { GET_BANK_GOLD(ch) -= MAX(cost - GET_GOLD(ch), 0); GET_GOLD(ch) = MAX(GET_GOLD(ch) - cost, 0); save_char(ch); } } switch (orig_rent_code = rentcode) { case RENT_RENTED: mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s un-renting and entering game.", GET_NAME(ch)); break; case RENT_CRASH: mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s retrieving crash-saved items and entering game.", GET_NAME(ch)); break; case RENT_CRYO: mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s un-cryo'ing and entering game.", GET_NAME(ch)); break; case RENT_FORCED: case RENT_TIMEDOUT: mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s retrieving force-saved items and entering game.", GET_NAME(ch)); break; default: mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "WARNING: %s entering game with undefined rent code.", GET_NAME(ch)); break; } temp = NULL; while (get_line(fl, line)) { char tag[6]; int num; /* first, we get the number. Not too hard. */ if(*line == '$' && line[1] == '~') { if (temp) num_objs += handle_obj(temp, ch, locate, cont_row); break; } if (*line == '#') { if (sscanf(line, "#%d", &nr) != 1) { continue; } else { if (temp) num_objs += handle_obj(temp, ch, locate, cont_row); temp = NULL; locate = 0; } /* we have the number, check it, load obj. */ if (nr == NOTHING) { /* then it is unique */ temp = create_obj(); temp->item_number=NOTHING; } else if (nr < 0) { continue; } else { if(nr >= 999999) continue; if(real_object(nr) != NOTHING) { temp=read_object(nr,VIRTUAL); if (!temp) { continue; } } else { log("Nonexistent object %d found in rent file.", nr); continue; } } } tag_argument(line, tag); num = atoi(line); switch(*tag) { case 'A': if (!strcmp(tag, "ADes")) { char error[40]; snprintf(error, sizeof(error)-1, "rent(Ades):%s", temp->name); temp->action_description = fread_string(fl, error); } else if (!strcmp(tag, "Aff ")) { sscanf(line, "%d %d %d", &t[0], &t[1], &t[2]); if (t[0] < MAX_OBJ_AFFECT) { temp->affected[t[0]].location = t[1]; temp->affected[t[0]].modifier = t[2]; } } break; case 'C': if (!strcmp(tag, "Cost")) GET_OBJ_COST(temp) = num; break; case 'D': if (!strcmp(tag, "Desc")) temp->description = strdup(line); break; case 'E': if(!strcmp(tag, "EDes")) { struct extra_descr_data *new_desc; char error[40]; snprintf(error, sizeof(error)-1, "rent(Edes): %s", temp->name); if (temp->item_number != NOTHING && /* Regular object */ temp->ex_description && /* with ex_desc == prototype */ (temp->ex_description == obj_proto[real_object(temp->item_number)].ex_description)) temp->ex_description = NULL; CREATE(new_desc, struct extra_descr_data, 1); new_desc->keyword = fread_string(fl, error); new_desc->description = fread_string(fl, error); new_desc->next = temp->ex_description; temp->ex_description = new_desc; } break; case 'F': if (!strcmp(tag, "Flag")) GET_OBJ_EXTRA(temp) = asciiflag_conv(line); break; case 'L': if(!strcmp(tag, "Loc ")) locate = num; break; case 'N': if (!strcmp(tag, "Name")) temp->name = strdup(line); break; case 'P': if (!strcmp(tag, "Perm")) temp->obj_flags.bitvector = asciiflag_conv(line); break; case 'R': if (!strcmp(tag, "Rent")) GET_OBJ_RENT(temp) = num; break; case 'S': if (!strcmp(tag, "Shrt")) temp->short_description = strdup(line); break; case 'T': if (!strcmp(tag, "Type")) GET_OBJ_TYPE(temp) = num; break; case 'W': if (!strcmp(tag, "Wear")) GET_OBJ_WEAR(temp) = asciiflag_conv(line); else if (!strcmp(tag, "Wght")) GET_OBJ_WEIGHT(temp) = num; break; case 'V': if (!strcmp(tag, "Vals")) { sscanf(line, "%d %d %d %d", &t[0], &t[1], &t[2], &t[3]); for (i = 0; i < 4; i++) GET_OBJ_VAL(temp, i) = t[i]; } break; } } /* Little hoarding check. -gg 3/1/98 */ mudlog(NRM, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "%s (level %d) has %d objects (max %d).", GET_NAME(ch), GET_LEVEL(ch), num_objs, max_obj_save); fclose(fl); if ((orig_rent_code == RENT_RENTED) || (orig_rent_code == RENT_CRYO)) return 0; else return 1; }
void boot_the_shops() { char *buf; int temp; int count; FILE *shop_f; if (!(shop_f = fopen(SHOP_FILE, "r"))) { perror("Error in boot shop\n"); exit(0); } number_of_shops = 0; for(;;) { buf = fread_string(shop_f); if(*buf == '#') /* a new shop */ { if(!number_of_shops) /* first shop */ CREATE(shop_index, struct shop_data, 1); else if(!(shop_index= (struct shop_data*) realloc( shop_index,(number_of_shops + 1)* sizeof(struct shop_data)))) { perror("Error in boot shop\n"); exit(0); } for(count=0;count<MAX_PROD;count++) { fscanf(shop_f,"%d \n", &temp); if (temp >= 0) shop_index[number_of_shops].producing[count]= real_object(temp); else shop_index[number_of_shops].producing[count]= temp; } fscanf(shop_f,"%f \n", &shop_index[number_of_shops].profit_buy); fscanf(shop_f,"%f \n", &shop_index[number_of_shops].profit_sell); for(count=0;count<MAX_TRADE;count++) { fscanf(shop_f,"%d \n", &temp); shop_index[number_of_shops].type[count] = (byte) temp; } shop_index[number_of_shops].no_such_item1 = fread_string(shop_f); shop_index[number_of_shops].no_such_item2 = fread_string(shop_f); shop_index[number_of_shops].do_not_buy = fread_string(shop_f); shop_index[number_of_shops].missing_cash1 = fread_string(shop_f); shop_index[number_of_shops].missing_cash2 = fread_string(shop_f); shop_index[number_of_shops].message_buy = fread_string(shop_f); shop_index[number_of_shops].message_sell = fread_string(shop_f); fscanf(shop_f,"%d \n", &shop_index[number_of_shops].temper1); fscanf(shop_f,"%d \n", &shop_index[number_of_shops].temper2); fscanf(shop_f,"%d \n", &shop_index[number_of_shops].keeper); shop_index[number_of_shops].keeper = real_mobile(shop_index[number_of_shops].keeper); fscanf(shop_f,"%d \n", &shop_index[number_of_shops].with_who); fscanf(shop_f,"%d \n", &shop_index[number_of_shops].in_room); fscanf(shop_f,"%d \n", &shop_index[number_of_shops].open1); fscanf(shop_f,"%d \n", &shop_index[number_of_shops].close1); fscanf(shop_f,"%d \n", &shop_index[number_of_shops].open2); fscanf(shop_f,"%d \n", &shop_index[number_of_shops].close2); number_of_shops++; } else if(*buf == '$') /* EOF */
int worm_ritual(struct char_data *ch, int cmd, char *arg) { struct obj_data *scroll, *herbs, *blood; struct char_data *tmpch; char buf[MAX_INPUT_LENGTH]; bool found, equipped = FALSE; int room; static int scroll_nr = -1, herbs_nr = -1, blood_nr = -1, to_room = -1; if (scroll_nr < 1) { scroll_nr = real_object(5012); herbs_nr = real_object(5002); blood_nr = real_object(5003); to_room = real_room(5040); } if (cmd != 207) return FALSE; arg = one_argument(arg,buf); if (!(scroll = get_obj_in_list_vis(ch,buf,ch->carrying))) { scroll = ch->equipment[HOLD]; equipped = TRUE; } /* which scroll */ found = (scroll && (scroll->item_number == scroll_nr)); if (!found) return FALSE; act("$n recites $p.", TRUE, ch, scroll, 0, TO_ROOM); act("You recite $p which dissolves.",FALSE,ch,scroll,0,TO_CHAR); room = ch->in_room; blood = get_obj_in_list_num(blood_nr,world[room].contents); herbs = get_obj_in_list_num(herbs_nr,world[room].contents); if (!blood || !herbs || (blood->obj_flags.value[1] < 2)) return TRUE; act("$p dissolves into thin air.", TRUE, ch, herbs, 0, TO_ROOM); act("$p dissolves into thin air.", TRUE, ch, herbs, 0, TO_CHAR); act("$p is emptied from blood.", FALSE, ch, blood, 0, TO_ROOM); act("$p is emptied from blood.", FALSE, ch, blood, 0, TO_CHAR); obj_from_room(herbs); extract_obj(herbs); /* herbs dissapear */ blood->obj_flags.value[1] = 0; /* empty for blood */ blood->obj_flags.weight -= 2; /* correct weight */ if (equipped) unequip_char(ch, HOLD); extract_obj(scroll); act("You feel yanked downwards.....", FALSE, ch, 0, 0, TO_ROOM); act("You feel yanked downwards.....", FALSE, ch, 0, 0, TO_CHAR); /* Move'em */ tmpch = world[room].people; while (world[room].people){ char_from_room(tmpch); char_to_room(tmpch,to_room); tmpch = world[room].people; } return TRUE; }