void trigedit_disp_types(struct descriptor_data *d) { int i, columns = 0; const char **types; char bitbuf[MAX_STRING_LENGTH]; switch(OLC_TRIG(d)->attach_type) { case WLD_TRIGGER: types = wtrig_types; break; case OBJ_TRIGGER: types = otrig_types; break; case MOB_TRIGGER: default: types = trig_types; break; } get_char_colors(d->character); clear_screen(d); for (i = 0; i < NUM_TRIG_TYPE_FLAGS; i++) { write_to_output(d, "%s%2d%s) %-20.20s %s", grn, i + 1, nrm, types[i], !(++columns % 2) ? "\r\n" : ""); } sprintbit(GET_TRIG_TYPE(OLC_TRIG(d)), types, bitbuf, sizeof(bitbuf)); write_to_output(d, "\r\nCurrent types : %s%s%s\r\nEnter type (0 to quit) : ", cyn, bitbuf, nrm); }
void trigedit_disp_types(struct descriptor_data *d) { int i, columns = 0; const char **types; switch(OLC_TRIG(d)->attach_type) { case WLD_TRIGGER: types = wtrig_types; break; case OBJ_TRIGGER: types = otrig_types; break; case MOB_TRIGGER: default: types = trig_types; break; } get_char_cols(d->character); #if defined(CLEAR_SCREEN) send_to_char("[H[J", d->character); #endif for (i = 0; i < NUM_TRIG_TYPE_FLAGS; i++) { sprintf(buf, "%s%2d%s) %-20.20s %s", grn, i + 1, nrm, types[i], !(++columns % 2) ? "\r\n" : ""); send_to_char(buf, d->character); } sprintbit(GET_TRIG_TYPE(OLC_TRIG(d)), types, buf1); sprintf(buf, "\r\nCurrent types : %s%s%s\r\nEnter type (0 to quit) : ", cyn, buf1, nrm); send_to_char(buf, d->character); }
void trigedit_setup_existing(struct descriptor_data *d, int rtrg_num) { struct trig_data *trig; struct cmdlist_element *c; /* * Allocate a scratch trigger structure */ CREATE(trig, struct trig_data, 1); trig_data_copy(trig, trig_index[rtrg_num]->proto); /* convert cmdlist to a char string */ c = trig->cmdlist; CREATE(OLC_STORAGE(d), char, MAX_CMD_LENGTH); strcpy(OLC_STORAGE(d), ""); while (c) { strcat(OLC_STORAGE(d), c->cmd); strcat(OLC_STORAGE(d), "\r\n"); c = c->next; } /* now trig->cmdlist is something to pass to the text editor */ /* it will be converted back to a real cmdlist_element list later */ OLC_TRIG(d) = trig; OLC_VAL(d) = 0; /* Has changed flag. (It hasn't so far, we just made it.) */ trigedit_disp_menu(d); }
void trigedit_setup_new(struct descriptor_data *d) { struct trig_data *trig; /* * Allocate a scratch trigger structure */ CREATE(trig, struct trig_data, 1); trig->nr = NOWHERE; /* * Set up some defaults */ trig->name = strdup("new trigger"); trig->trigger_type = MTRIG_GREET; /* cmdlist will be a large char string until the trigger is saved */ CREATE(OLC_STORAGE(d), char, MAX_CMD_LENGTH); strncpy(OLC_STORAGE(d), "%echo% This trigger commandlist is not complete!\r\n", MAX_CMD_LENGTH-1); trig->narg = 100; OLC_TRIG(d) = trig; OLC_VAL(d) = 0; /* Has changed flag. (It hasn't so far, we just made it.) */ trigedit_disp_menu(d); }
void trigedit_disp_menu(struct descriptor_data *d) { struct trig_data *trig = OLC_TRIG(d); char *attach_type; char trgtypes[256]; get_char_colors(d->character); clear_screen(d); if (trig->attach_type==OBJ_TRIGGER) { attach_type = "Objects"; sprintbit(GET_TRIG_TYPE(trig), otrig_types, trgtypes, sizeof(trgtypes)); } else if (trig->attach_type==WLD_TRIGGER) { attach_type = "Rooms"; sprintbit(GET_TRIG_TYPE(trig), wtrig_types, trgtypes, sizeof(trgtypes)); } else { attach_type = "Mobiles"; sprintbit(GET_TRIG_TYPE(trig), trig_types, trgtypes, sizeof(trgtypes)); } write_to_output(d, TRUE, #if defined(CLEAR_SCREEN) "^[[H^[[J" #endif "Trigger Editor [%s%d%s]\r\n\r\n" "%s1)%s Name : %s%s\r\n" "%s2)%s Intended for : %s%s\r\n" "%s3)%s Trigger types: %s%s\r\n" "%s4)%s Numberic Arg : %s%d\r\n" "%s5)%s Arguments : %s%s\r\n" "%s6)%s Commands:\r\n%s", grn, OLC_NUM(d), nrm, /* vnum on the title line */ grn, nrm, yel, GET_TRIG_NAME(trig), /* name */ grn, nrm, yel, attach_type, /* attach type */ grn, nrm, yel, trgtypes, /* greet/drop/etc */ grn, nrm, yel, trig->narg, /* numeric arg */ grn, nrm, yel, trig->arglist?trig->arglist:"", /* strict arg */ grn, nrm, cyn ); write_to_output(d, FALSE, "%s\r\n", OLC_STORAGE(d) /* the command list */ ); write_to_output(d, TRUE, "%sQ)%s Quit\r\n" "Enter Choice :", grn, nrm /* quit colors */ ); OLC_MODE(d) = TRIGEDIT_MAIN_MENU; }
/* save the zone's triggers to internal memory and to disk */ void trigedit_save(struct descriptor_data *d) { int i; trig_rnum rnum; int found = 0; char *s; trig_data *proto; trig_data *trig = OLC_TRIG(d); trig_data *live_trig; struct cmdlist_element *cmd, *next_cmd; struct index_data **new_index; struct descriptor_data *dsc; FILE *trig_file; int zone, top; char buf[MAX_CMD_LENGTH]; char bitBuf[MAX_INPUT_LENGTH]; char fname[MAX_INPUT_LENGTH]; if ((rnum = real_trigger(OLC_NUM(d))) != NOTHING) { proto = trig_index[rnum]->proto; for (cmd = proto->cmdlist; cmd; cmd = next_cmd) { next_cmd = cmd->next; if (cmd->cmd) free(cmd->cmd); free(cmd); } free(proto->arglist); free(proto->name); /* Recompile the command list from the new script */ s = OLC_STORAGE(d); CREATE(trig->cmdlist, struct cmdlist_element, 1); if (s) { char *t = strtok(s, "\n\r"); /* strtok returns NULL if s is "\r\n" */ if (t) trig->cmdlist->cmd = strdup(t); else trig->cmdlist->cmd = strdup("* No script"); cmd = trig->cmdlist; while ((s = strtok(NULL, "\n\r"))) { CREATE(cmd->next, struct cmdlist_element, 1); cmd = cmd->next; cmd->cmd = strdup(s); } } else
void trigedit_parse(struct descriptor_data *d, char *arg) { int i = 0; switch (OLC_MODE(d)) { case TRIGEDIT_MAIN_MENU: switch (tolower(*arg)) { case 'q': if (OLC_VAL(d)) { /* Anything been changed? */ if (!GET_TRIG_TYPE(OLC_TRIG(d))) { write_to_output(d, "Invalid Trigger Type! Answer a to abort quit!\r\n"); } write_to_output(d, "Do you wish to save your changes? : "); OLC_MODE(d) = TRIGEDIT_CONFIRM_SAVESTRING; } else cleanup_olc(d, CLEANUP_ALL); return; case '1': OLC_MODE(d) = TRIGEDIT_NAME; write_to_output(d, "Name: "); break; case '2': OLC_MODE(d) = TRIGEDIT_INTENDED; write_to_output(d, "0: Mobiles, 1: Objects, 2: Rooms: "); break; case '3': OLC_MODE(d) = TRIGEDIT_TYPES; trigedit_disp_types(d); break; case '4': OLC_MODE(d) = TRIGEDIT_NARG; write_to_output(d, "Numeric argument: "); break; case '5': OLC_MODE(d) = TRIGEDIT_ARGUMENT; write_to_output(d, "Argument: "); break; case '6': OLC_MODE(d) = TRIGEDIT_COMMANDS; write_to_output(d, "Enter trigger commands: (/s saves /h for help)\r\n\r\n"); d->backstr = NULL; if (OLC_STORAGE(d)) { write_to_output(d, "%s", OLC_STORAGE(d)); d->backstr = strdup(OLC_STORAGE(d)); } d->str = &OLC_STORAGE(d); d->max_str = MAX_CMD_LENGTH; d->mail_to = 0; OLC_VAL(d) = 1; break; default: trigedit_disp_menu(d); return; } return; case TRIGEDIT_CONFIRM_SAVESTRING: switch(tolower(*arg)) { case 'y': trigedit_save(d); mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits trigger %d", GET_NAME(d->character), OLC_NUM(d)); /* fall through */ case 'n': cleanup_olc(d, CLEANUP_ALL); return; case 'a': /* abort quitting */ break; default: write_to_output(d, "Invalid choice!\r\n"); write_to_output(d, "Do you wish to save the trigger? : "); return; } break; case TRIGEDIT_NAME: smash_tilde(arg); if (OLC_TRIG(d)->name) free(OLC_TRIG(d)->name); OLC_TRIG(d)->name = strdup((arg && *arg) ? arg : "undefined"); OLC_VAL(d)++; break; case TRIGEDIT_INTENDED: if ((atoi(arg)>=MOB_TRIGGER) || (atoi(arg)<=WLD_TRIGGER)) OLC_TRIG(d)->attach_type = atoi(arg); OLC_VAL(d)++; break; case TRIGEDIT_NARG: OLC_TRIG(d)->narg = LIMIT(atoi(arg), 0, 100); OLC_VAL(d)++; break; case TRIGEDIT_ARGUMENT: smash_tilde(arg); OLC_TRIG(d)->arglist = (*arg?strdup(arg):NULL); OLC_VAL(d)++; break; case TRIGEDIT_TYPES: if ((i = atoi(arg)) == 0) break; else if (!((i < 0) || (i > NUM_TRIG_TYPE_FLAGS))) TOGGLE_BIT((GET_TRIG_TYPE(OLC_TRIG(d))), 1 << (i - 1)); OLC_VAL(d)++; trigedit_disp_types(d); return; case TRIGEDIT_COMMANDS: break; } OLC_MODE(d) = TRIGEDIT_MAIN_MENU; trigedit_disp_menu(d); }
/* This procedure frees up the strings and/or the structures attatched to a * descriptor, sets all flags back to how they should be. */ void cleanup_olc(struct descriptor_data *d, byte cleanup_type) { /* Clean up WHAT? */ if (d->olc == NULL) return; /* Check for a room. free_room doesn't perform sanity checks, we must be * careful here. */ if (OLC_ROOM(d)) { switch (cleanup_type) { case CLEANUP_ALL: /* free(OLC_SCRIPT(d)) equivalent */ free_proto_script(OLC_ROOM(d), WLD_TRIGGER); free_room(OLC_ROOM(d)); break; case CLEANUP_STRUCTS: free(OLC_ROOM(d)); break; case CLEANUP_CONFIG: free_config(OLC_CONFIG(d)); break; default: /* The caller has screwed up. */ log("SYSERR: cleanup_olc: Unknown type!"); break; } } /* Check for an existing object in the OLC. The strings aren't part of the * prototype any longer. They get added with strdup(). */ if (OLC_OBJ(d)) { free_object_strings(OLC_OBJ(d)); free(OLC_OBJ(d)); } /* Check for a mob. free_mobile() makes sure strings are not in the * prototype. */ if (OLC_MOB(d)) free_mobile(OLC_MOB(d)); /* Check for a zone. cleanup_type is irrelevant here, free() everything. */ if (OLC_ZONE(d)) { if (OLC_ZONE(d)->builders) free(OLC_ZONE(d)->builders); if (OLC_ZONE(d)->name) free(OLC_ZONE(d)->name); if (OLC_ZONE(d)->cmd) free(OLC_ZONE(d)->cmd); free(OLC_ZONE(d)); } /* Check for a shop. free_shop doesn't perform sanity checks, we must be * careful here. OLC_SHOP(d) is a _copy_ - no pointers to the original. Just * go ahead and free it all. */ if (OLC_SHOP(d)) free_shop(OLC_SHOP(d)); /* Check for a quest. */ if (OLC_QUEST(d)) { switch (cleanup_type) { case CLEANUP_ALL: free_quest(OLC_QUEST(d)); break; case CLEANUP_STRUCTS: free(OLC_QUEST(d)); break; default: break; } } /*. Check for aedit stuff -- M. Scott */ if (OLC_ACTION(d)) { switch(cleanup_type) { case CLEANUP_ALL: free_action(OLC_ACTION(d)); break; case CLEANUP_STRUCTS: free(OLC_ACTION(d)); break; default: /* Caller has screwed up */ break; } } /* Used for cleanup of Hedit */ if (OLC_HELP(d)) { switch(cleanup_type) { case CLEANUP_ALL: free_help(OLC_HELP(d)); break; case CLEANUP_STRUCTS: free(OLC_HELP(d)); break; default: break; } } if (OLC_IBT(d)) { free_olc_ibt(OLC_IBT(d)); OLC_IBT(d) = NULL; } if (OLC_MSG_LIST(d)) { free_message_list(OLC_MSG_LIST(d)); OLC_MSG_LIST(d) = NULL; OLC_MSG(d) = NULL; } /* Free storage if allocated (tedit, aedit, and trigedit). This is the command * list - it's been copied to disk already, so just free it -Welcor. */ if (OLC_STORAGE(d)) { free(OLC_STORAGE(d)); OLC_STORAGE(d) = NULL; } /* Free this one regardless. If we've left olc, we've either made a fresh * copy of it in the trig index, or we lost connection. Either way, we need * to get rid of this. */ if (OLC_TRIG(d)) { free_trigger(OLC_TRIG(d)); OLC_TRIG(d) = NULL; } /* Free this one regardless. If we've left olc, we've either copied the * * preferences to the player, or we lost connection. Either way, we need * * to get rid of this. */ if(OLC_PREFS(d)) { /*. There is nothing else really to free, except this... .*/ free(OLC_PREFS(d)); OLC_PREFS(d) = NULL; } /* OLC_SCRIPT is always set as trig_proto of OLC_OBJ/MOB/ROOM. Therefore it * should not be free'd here. */ /* Restore descriptor playing status. */ if (d->character) { REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_WRITING); act("$n stops using OLC.", TRUE, d->character, NULL, NULL, TO_ROOM); if (cleanup_type == CLEANUP_CONFIG) mudlog(BRF, ADMLVL_IMMORT, TRUE, "OLC: %s stops editing the game configuration", GET_NAME(d->character)); else if (STATE(d) == CON_TEDIT) mudlog(BRF, ADMLVL_IMMORT, TRUE, "OLC: %s stops editing text files.", GET_NAME(d->character)); else if (STATE(d) == CON_HEDIT) mudlog(CMP, ADMLVL_IMMORT, TRUE, "OLC: %s stops editing help files.", GET_NAME(d->character)); else mudlog(CMP, ADMLVL_IMMORT, TRUE, "OLC: %s stops editing zone %d allowed zone %d", GET_NAME(d->character), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(d->character)); STATE(d) = CON_PLAYING; } free(d->olc); d->olc = NULL; }
/* save the zone's triggers to internal memory and to disk */ void trigedit_save(struct descriptor_data *d) { char *name=NULL; char *trgarglist=NULL; char *code=NULL; int trig_rnum, i; int found = 0; char *s; trig_data *proto; trig_data *trig = OLC_TRIG(d); trig_data *live_trig; struct cmdlist_element *cmd, *next_cmd; struct index_data **new_index; struct descriptor_data *dsc; int zone, top; char buf[MAX_CMD_LENGTH]; char bitBuf[MAX_INPUT_LENGTH]; char *trg_replace = "REPLACE INTO %s (" "znum, " "vnum, " "name, " "attach_type, " "flags, " "numarg, " "arglist, " "code) " "VALUES (%d, %d, '%s', %d, '%s', %d, '%s', '%s');"; if ((trig_rnum = real_trigger(OLC_NUM(d))) != -1) { proto = trig_index[trig_rnum]->proto; for (cmd = proto->cmdlist; cmd; cmd = next_cmd) { next_cmd = cmd->next; if (cmd->cmd) free(cmd->cmd); free(cmd); } if (proto->arglist) free(proto->arglist); if (proto->name) free(proto->name); /* Recompile the command list from the new script */ s = OLC_STORAGE(d); CREATE(trig->cmdlist, struct cmdlist_element, 1); trig->cmdlist->cmd = str_dup(strtok(s, "\n\r")); cmd = trig->cmdlist; while ((s = strtok(NULL, "\n\r"))) { CREATE(cmd->next, struct cmdlist_element, 1); cmd = cmd->next; cmd->cmd = str_dup(s); } /* make the prorotype look like what we have */ trig_data_copy(proto, trig); /* go through the mud and replace existing triggers */ live_trig = trigger_list; while (live_trig) { if (GET_TRIG_RNUM(live_trig) == trig_rnum) { if (live_trig->arglist) { free(live_trig->arglist); live_trig->arglist = NULL; } if (live_trig->name) { free(live_trig->name); live_trig->name = NULL; } if (proto->arglist) live_trig->arglist = str_dup(proto->arglist); if (proto->name) live_trig->name = str_dup(proto->name); live_trig->cmdlist = proto->cmdlist; live_trig->curr_state = live_trig->cmdlist; live_trig->trigger_type = proto->trigger_type; live_trig->attach_type = proto->attach_type; live_trig->narg = proto->narg; live_trig->data_type = proto->data_type; live_trig->depth = 0; live_trig->wait_event = NULL; if (GET_TRIG_WAIT(live_trig)) event_cancel(GET_TRIG_WAIT(live_trig)); free_varlist(live_trig->var_list); } live_trig = live_trig->next_in_world; } } else {
void trigedit_parse(struct descriptor_data *d, char *arg) { int i = 0; char *backstr = NULL; switch (OLC_MODE(d)) { case TRIGEDIT_MAIN_MENU: switch (tolower(*arg)) { case 'q': if (OLC_VAL(d)) { /* Anything been changed? */ if (!GET_TRIG_TYPE(OLC_TRIG(d))) { send_to_char("Invalid Trigger Type! Answer a to abort quit!\r\n", d->character); } send_to_char("Do you wish to save the changes to the trigger? (y/n): ", d->character); OLC_MODE(d) = TRIGEDIT_CONFIRM_SAVESTRING; } else cleanup_olc(d, CLEANUP_ALL); return; case '1': OLC_MODE(d) = TRIGEDIT_NAME; send_to_char("Name: ", d->character); break; case '2': OLC_MODE(d) = TRIGEDIT_INTENDED; send_to_char("0: Mobiles, 1: Objects, 2: Rooms: ", d->character); break; case '3': OLC_MODE(d) = TRIGEDIT_TYPES; trigedit_disp_types(d); break; case '4': OLC_MODE(d) = TRIGEDIT_NARG; send_to_char("Numeric argument: ", d->character); break; case '5': OLC_MODE(d) = TRIGEDIT_ARGUMENT; send_to_char("Argument: ", d->character); break; case '6': OLC_MODE(d) = TRIGEDIT_COMMANDS; clear_screen(d); if (OLC_STORAGE(d)) { write_to_output(d, FALSE, "%s", OLC_STORAGE(d)); backstr = str_dup(OLC_STORAGE(d)); } string_write(d, &OLC_STORAGE(d), MAX_CMD_LENGTH, 0, STATE(d)); OLC_VAL(d) = 1; break; default: trigedit_disp_menu(d); return; } return; case TRIGEDIT_CONFIRM_SAVESTRING: switch(tolower(*arg)) { case 'y': trigedit_save(d); sprintf(buf, "OLC: %s edits trigger %d", GET_NAME(d->character), OLC_NUM(d)); mudlog(buf, CMP, MAX(RIGHTS_TRIGGERS, GET_INVIS_LEV(d->character)), TRUE); /* fall through */ case 'n': cleanup_olc(d, CLEANUP_ALL); return; case 'a': /* abort quitting */ break; default: send_to_char("Invalid choice!\r\n", d->character); send_to_char("Do you wish to save the trigger? : ", d->character); return; } break; case TRIGEDIT_NAME: if (OLC_TRIG(d)->name) free(OLC_TRIG(d)->name); OLC_TRIG(d)->name = str_dup((arg && *arg) ? arg : "undefined"); OLC_VAL(d)++; break; case TRIGEDIT_INTENDED: if ((atoi(arg)>=MOB_TRIGGER) || (atoi(arg)<=WLD_TRIGGER)) OLC_TRIG(d)->attach_type = atoi(arg); OLC_VAL(d)++; break; case TRIGEDIT_NARG: OLC_TRIG(d)->narg = atoi(arg); OLC_VAL(d)++; break; case TRIGEDIT_ARGUMENT: OLC_TRIG(d)->arglist = (*arg?str_dup(arg):NULL); OLC_VAL(d)++; break; case TRIGEDIT_TYPES: if ((i = atoi(arg)) == 0) break; else if (!((i < 0) || (i > NUM_TRIG_TYPE_FLAGS))) TOGGLE_BIT((GET_TRIG_TYPE(OLC_TRIG(d))), 1ULL << (i - 1)); OLC_VAL(d)++; trigedit_disp_types(d); return; case TRIGEDIT_COMMANDS: break; } OLC_MODE(d) = TRIGEDIT_MAIN_MENU; trigedit_disp_menu(d); }
/* * This procedure frees up the strings and/or the structures * attatched to a descriptor, sets all flags back to how they * should be. */ void cleanup_olc(struct descriptor_data *d, byte cleanup_type) { /* * Clean up WHAT? */ if (d->olc == NULL) return; /* * Check for a room. free_room doesn't perform * sanity checks, we must be careful here. */ if (OLC_ROOM(d)) { switch (cleanup_type) { case CLEANUP_ALL: free_room(OLC_ROOM(d)); break; case CLEANUP_STRUCTS: free(OLC_ROOM(d)); break; default: /* The caller has screwed up. */ log("SYSERR: cleanup_olc: Unknown type!"); break; } } /* * Check for an existing object in the OLC. The strings * aren't part of the prototype any longer. They get added * with strdup(). */ if (OLC_OBJ(d)) { free_object_strings(OLC_OBJ(d)); free(OLC_OBJ(d)); } /* * Check for a mob. free_mobile() makes sure strings are not in * the prototype. */ if (OLC_MOB(d)) free_mobile(OLC_MOB(d)); /* * Check for a zone. cleanup_type is irrelevant here, free() everything. */ if (OLC_ZONE(d)) { free(OLC_ZONE(d)->name); free(OLC_ZONE(d)->cmd); free(OLC_ZONE(d)); } /* * Check for a shop. free_shop doesn't perform sanity checks, we must * be careful here. */ if (OLC_SHOP(d)) { switch (cleanup_type) { case CLEANUP_ALL: free_shop(OLC_SHOP(d)); break; case CLEANUP_STRUCTS: free(OLC_SHOP(d)); break; default: /* The caller has screwed up but we already griped above. */ break; } } /* Triggers */ #if 0 /* * this is the command list - it's been copied to disk already, * so just free it -- Welcor */ if (OLC_STORAGE(d)) { free(OLC_STORAGE(d)); OLC_STORAGE(d) = NULL; } /* * Free this one regardless. If we've left olc, we've either made * a fresh copy of it in the trig index, or we lost connection. * Either way, we need to get rid of this. */ if (OLC_TRIG(d)) { free_trigger(OLC_TRIG(d)); OLC_STORAGE(d) = NULL; } #endif /* * Restore descriptor playing status. */ if (d->character) { REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_WRITING); STATE(d) = CON_PLAYING; act("$n stops using OLC.", TRUE, d->character, NULL, NULL, TO_ROOM); mudlog(CMP, LVL_IMMORT, TRUE, "OLC: %s stops editing zone %d allowed zone %d", GET_NAME(d->character), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(d->character)); } free(d->olc); d->olc = NULL; }
/* * This procdure frees up the strings and/or the structures * attatched to a descriptor, sets all flags back to how they * should be. */ void cleanup_olc(DESCRIPTOR_DATA * d, byte cleanup_type) { if (d->olc) { // Освободить редактируемый триггер if (OLC_TRIG(d)) { if (OLC_TRIG(d)->name) free(OLC_TRIG(d)->name); if (OLC_TRIG(d)->arglist) free(OLC_TRIG(d)->arglist); free(OLC_TRIG(d)); } // Освободить массив данных (похоже, только для триггеров) if (OLC_STORAGE(d)) { free(OLC_STORAGE(d)); } // Освободить прототип if (OLC_SCRIPT(d)) { dg_olc_script_free(d); } // Освободить комнату if (OLC_ROOM(d)) { switch (cleanup_type) { case CLEANUP_ALL: room_free(OLC_ROOM(d)); // удаляет все содержимое // break; - не нужен case CLEANUP_STRUCTS: delete OLC_ROOM(d); // удаляет только оболочку break; default: // The caller has screwed up. break; } } // Освободить mob if (OLC_MOB(d)) { switch (cleanup_type) { case CLEANUP_ALL: medit_mobile_free(OLC_MOB(d)); // удаляет все содержимое delete OLC_MOB(d); // удаляет только оболочку break; default: // The caller has screwed up. break; } } // Освободить объект if (OLC_OBJ(d)) { switch (cleanup_type) { case CLEANUP_ALL: oedit_object_free(OLC_OBJ(d)); // удаляет все содержимое delete OLC_OBJ(d); // удаляет только оболочку break; default: // The caller has screwed up. break; } } // Освободить зону if (OLC_ZONE(d)) { free(OLC_ZONE(d)->name); zedit_delete_cmdlist((pzcmd) OLC_ZONE(d)->cmd); free(OLC_ZONE(d)); } // Restore descriptor playing status. if (d->character) { REMOVE_BIT(PLR_FLAGS(d->character, PLR_WRITING), PLR_WRITING); STATE(d) = CON_PLAYING; act("$n закончил$g работу и удовлетворенно посмотрел$g в развороченные недра Мироздания.", TRUE, d->character, 0, 0, TO_ROOM); } delete d->olc; } }