#include <stdio.h> #include <string.h> #include "structs.h" #include "awake.h" #include "interpreter.h" #include "comm.h" #include "constants.h" #include "utils.h" #include "db.h" #include <stdlib.h> #include "screen.h" #include "olc.h" #include "newmatrix.h" #include "memory.h" #define HOST d->edit_host #define NUM_OF_HOST_TYPES 6 extern int from_ip_zone(int vnum); extern char *cleanup(char *dest, const char *src); #define HT matrix[realcounter] void write_host_to_disk(int vnum) { long realcounter, counter; int zone = real_zone(vnum); FILE *fl; struct exit_data *exit; struct trigger_step *step; int i = 0; sprintf(buf, "%s/%d.host", MTX_PREFIX, vnum); fl = fopen(buf, "w+"); for (counter = zone_table[zone].number * 100; counter <= zone_table[zone].top; counter++) { realcounter = real_host(counter); if (realcounter >= 0) { if (!strcmp("An unfinished host", HT.name)) continue; fprintf(fl, "#%ld\n", HT.vnum); fprintf(fl, "Name:\t%s\n", HT.name); fprintf(fl, "Keywords:\t%s\n", HT.keywords); fprintf(fl, "Description:$\n%s~\n", cleanup(buf2, HT.desc)); fprintf(fl, "ShutdownStart:\t%s\n", HT.shutdown_start); fprintf(fl, "ShutdownStop:\t%s\n", HT.shutdown_stop); fprintf(fl, "Parent:\t%ld\n", HT.parent); fprintf(fl, "Colour:\t%d\n", HT.colour); fprintf(fl, "Security:\t%d\n", HT.security); fprintf(fl, "Difficulty:\t%d\n", HT.intrusion); fprintf(fl, "Access:\t%d\n", HT.stats[ACCESS][0]); fprintf(fl, "AccessScramble:\t%d\n", HT.stats[ACCESS][2]); fprintf(fl, "AccessTrapdoor:\t%ld\n", HT.stats[ACCESS][5]); fprintf(fl, "Control:\t%d\n", HT.stats[CONTROL][0]); fprintf(fl, "ControlTrapdoor:\t%ld\n", HT.stats[CONTROL][5]); fprintf(fl, "Index:\t%d\n", HT.stats[INDEX][0]); fprintf(fl, "IndexTrapdoor:\t%ld\n", HT.stats[INDEX][5]); fprintf(fl, "Files:\t%d\n", HT.stats[FILES][0]); fprintf(fl, "FilesScramble:\t%d\n", HT.stats[FILES][2]); fprintf(fl, "FilesTrapdoor:\t%ld\n", HT.stats[FILES][5]); fprintf(fl, "Slave:\t%d\n", HT.stats[SLAVE][0]); fprintf(fl, "SlaveScramble:\t%d\n", HT.stats[SLAVE][2]); fprintf(fl, "SlaveTrapdoor:\t%ld\n", HT.stats[SLAVE][5]); fprintf(fl, "Type:\t%s\n", host_type[HT.type]); if (HT.exit) { fprintf(fl, "[EXITS]\n"); for (exit = HT.exit; exit; exit = exit->next, i++) { fprintf(fl, "\t[EXIT %d]\n", i); fprintf(fl, "\t\tExit:\t%ld\n", exit->host); fprintf(fl, "\t\tNumber:\t%s\n", exit->number); } } if (HT.trigger) { fprintf(fl, "[TRIGGERS]\n"); for (step = HT.trigger, i = 0; step; step = step->next, i++) { fprintf(fl, "\t[TRIGGER %d]\n", i); fprintf(fl, "\t\tStep:\t%d\n", step->step); fprintf(fl, "\t\tAlert:\t%s\n", alerts[step->alert]); fprintf(fl, "\t\tIC:\t%ld\n", step->ic); } } fprintf(fl, "BREAK\n"); } } fprintf(fl, "END\n"); fclose(fl); write_index_file("host"); } void hedit_disp_data_menu(struct descriptor_data *d) { CLS(CH); send_to_char(CH, "^WHost: ^c%d^n\r\n", HOST->vnum); send_to_char(CH, "^G1^Y) ^WHost: ^c%s^n\r\n", HOST->name); if (real_host(HOST->parent) > 0) send_to_char(CH, "^G2^Y) ^WParent Host: ^c%s(%ld)^n\r\n", matrix[real_host(HOST->parent)].name, HOST->parent); else send_to_char(CH, "^G2^Y) ^WParent Host: ^cNowhere(0)^n\r\n"); send_to_char(CH, "^G3^Y) ^WKeywords: ^c%s^n\r\n", HOST->keywords); send_to_char(CH, "^G4^Y) ^WDescription: ^c%s^n\r\n", HOST->desc); send_to_char(CH, "^G5^Y) ^WSecurity: ^c%s-%d^c(%s)^n\r\n", host_sec[HOST->colour], HOST->security, intrusion[HOST->intrusion]); send_to_char(CH, "^G6^Y) ^WType: ^c%s^n\r\n", host_type[HOST->type]); send_to_char(CH, "^G7^Y) ^WRatings: A(^c%d^N) C(^c%d^N) I(^c%d^N) F(^c%d^N) S(^c%d^N)\r\n", HOST->stats[ACCESS][0], HOST->stats[CONTROL][0], HOST->stats[INDEX][0], HOST->stats[FILES][0], HOST->stats[SLAVE][0]); send_to_char(CH, "^G8^Y) ^WSubsystem Extras\r\n"); send_to_char(CH, "^G9^Y) ^WTrigger Steps^n\r\n"); send_to_char(CH, "^G0^Y) ^WExits^n\r\n"); send_to_char(CH, "^GA^Y) ^WShutdown Start Text: ^c%s^n\r\n", HOST->shutdown_start); send_to_char(CH, "^GB^Y) ^WShutdown Stop Text: ^c%s^n\r\n", HOST->shutdown_stop); send_to_char("^Gq^Y) ^WQuit\r\n^Gx^Y) ^WQuit without saving\r\n^wEnter selection: ", CH); d->edit_mode = HEDIT_MAIN_MENU; } void hedit_disp_subsystem_extras(struct descriptor_data *d) { send_to_char(CH, "^G1^Y) ^WAccess Scramble Rating: %2ld Access Trapdoor: %ld\r\n", HOST->stats[ACCESS][2], HOST->stats[ACCESS][5]); send_to_char(CH, "^G2^Y) ^WControl Trapdoor: %ld\r\n", HOST->stats[CONTROL][5]); send_to_char(CH, "^G3^Y) ^WIndex Trapdoor: %ld\r\n", HOST->stats[INDEX][5]); send_to_char(CH, "^G4^Y) ^WFiles Scramble Rating: %2ld Files Trapdoor: %ld\r\n", HOST->stats[FILES][2], HOST->stats[FILES][5]); send_to_char(CH, "^G5^Y) ^WSlave Scramble Rating: %2ld Slave Trapdoor: %ld\r\n", HOST->stats[SLAVE][2], HOST->stats[SLAVE][5]); send_to_char(CH, "^Gq^Y) ^WQuit\r\n^wEnter selection: "); d->edit_mode = HEDIT_EXTRA_MENU; } void hedit_disp_trigger_menu(struct descriptor_data *d) { struct trigger_step *trigger; int i = 1; CLS(CH); for (trigger = HOST->trigger; trigger; trigger = trigger->next) { send_to_char(CH, "^G%d^Y) ^WStep ^c%d^n Go to alert ^c%s^n Load IC ^c%s(%ld)^n\r\n", i, trigger->step, alerts[trigger->alert], trigger->ic ? ic_proto[real_ic(trigger->ic)].name : "None", trigger->ic); i++; } send_to_char("\r\n^Ga^Y) ^WAdd new trigger\r\n^Gd^Y) ^WDelete a trigger\r\n^Gq^Y) ^WQuit\r\n^wEnter selection: ", CH); d->edit_mode = HEDIT_TRIGGER; } void hedit_disp_exit_menu(struct descriptor_data *d) { struct exit_data *exit; int i = 0; CLS(CH); for (exit = HOST->exit; exit; exit = exit->next) { send_to_char(CH, "^G%d^Y) ^c%s^N(^c%ld^N) ^c%s^N\r\n", i, exit->number ? matrix[real_host(exit->host)].name : "Nowhere", exit->host, exit->number); i++; } send_to_char("\r\n^Ga^Y) ^WAdd new exit\r\n^Gd^Y) ^WDelete an exit\r\n^Gq^Y) ^WQuit\r\n^wEnter selection: ", CH); d->edit_mode = HEDIT_EXIT; } void hedit_disp_rating_menu(struct descriptor_data *d) { CLS(CH); send_to_char(CH, "^G1^Y) ^WAccess: ^c%d^n\r\n" "^G2^Y) ^WControl: ^c%d^n\r\n" "^G3^Y) ^WIndex: ^c%d^n\r\n" "^G4^Y) ^WFiles: ^c%d^n\r\n" "^G5^Y) ^WSlave: ^c%d^n\r\n" "^Gq^Y) ^WReturn to main^n\r\n" "^wEnter selection: ", HOST->stats[ACCESS][0], HOST->stats[CONTROL][0], HOST->stats[INDEX][0], HOST->stats[FILES][0], HOST->stats[SLAVE][0]); d->edit_mode = HEDIT_RATINGS; } void hedit_parse(struct descriptor_data *d, char *arg) { long number, host_num; int i = 0; switch (d->edit_mode) { case HEDIT_CONFIRM_EDIT: switch (*arg) { case 'y': case 'Y': hedit_disp_data_menu(d); break; case 'n': case 'N': STATE(d) = CON_PLAYING; if (d->edit_host) Mem->DeleteHost(d->edit_host); d->edit_host = NULL; PLR_FLAGS(d->character).RemoveBit(PLR_EDITING); break; default: send_to_char("That's not a valid choice!\r\n", d->character); send_to_char("Do you wish to edit it?\r\n", d->character); break; } break; case HEDIT_CONFIRM_SAVESTRING: switch (*arg) { case 'y': case 'Y': { if (!from_ip_zone(d->edit_number)) { sprintf(buf,"%s wrote new host #%ld", GET_CHAR_NAME(d->character), d->edit_number); mudlog(buf, d->character, LOG_WIZLOG, TRUE); } host_num = real_host(d->edit_number); if (host_num > 0) { d->edit_host->icons = matrix[host_num].icons; d->edit_host->alert = matrix[host_num].alert; d->edit_host->file = matrix[host_num].file; free_host(matrix + host_num); matrix[host_num] = *d->edit_host; } else { int counter; int counter2; int found = 0; for (counter = 0; counter < top_of_matrix + 1; counter++) { if (!found) { /* check if current virtual is bigger than our virtual */ if (matrix[counter].vnum > d->edit_number) { // now, zoom backwards through the list copying over for (counter2 = top_of_matrix + 1; counter2 > counter; counter2--) { matrix[counter2] = matrix[counter2 - 1]; } matrix[counter] = *(d->edit_host); matrix[counter].vnum = d->edit_number; found = TRUE; } } else { struct matrix_icon *temp_icon; for (temp_icon = matrix[counter].icons; temp_icon; temp_icon = temp_icon->next) if (temp_icon->in_host != NOWHERE) temp_icon->in_host++; } } /* if place not found, insert at end */ if (!found) { matrix[top_of_matrix + 1] = *d->edit_host; matrix[top_of_matrix + 1].vnum = d->edit_number; } top_of_matrix++; host_num = real_host(d->edit_number); } send_to_char("Writing host to disk.\r\n", d->character); write_host_to_disk(d->character->player_specials->saved.zonenum); send_to_char("Saved.\r\n", CH); Mem->ClearHost(d->edit_host); d->edit_host = NULL; PLR_FLAGS(d->character).RemoveBit(PLR_EDITING); STATE(d) = CON_PLAYING; send_to_char("Done.\r\n", d->character); break; } case 'n': case 'N': send_to_char("Host not saved, aborting.\r\n", d->character); STATE(d) = CON_PLAYING; PLR_FLAGS(d->character).RemoveBit(PLR_EDITING); if (d->edit_host) Mem->DeleteHost(d->edit_host); d->edit_host = NULL; d->edit_number = 0; break; default: send_to_char("Invalid choice!\r\n", d->character); send_to_char("Do you wish to save this host internally?", d->character); break; } break; case HEDIT_MAIN_MENU: switch (LOWER(*arg)) { case 'q': d->edit_mode = HEDIT_CONFIRM_SAVESTRING; hedit_parse(d, "y"); break; case 'x': d->edit_mode = HEDIT_CONFIRM_SAVESTRING; hedit_parse(d, "n"); break; case '1': send_to_char("Enter host name:", d->character); d->edit_mode = HEDIT_NAME; break; case '2': send_to_char("Enter Parent PLTG/LTG/RTG:", d->character); d->edit_mode = HEDIT_PARENT; break; case '3': send_to_char("Enter Keywords:", d->character); d->edit_mode = HEDIT_KEYWORDS; break; case '4': send_to_char("Enter Host description:\r\n", d->character); d->edit_mode = HEDIT_DESC; d->str = new (char *); if (!d->str) { mudlog("Malloc failed!", NULL, LOG_SYSLOG, TRUE); shutdown(); } *(d->str) = NULL; d->max_str = MAX_MESSAGE_LENGTH; d->mail_to = 0; break; case '5': CLS(CH); send_to_char(CH, "1) Blue\r\n" "2) Green\r\n" "3) Orange\r\n" "4) Red\r\n" "5) Black\r\n" "Enter security level: "); d->edit_mode = HEDIT_SECURITY_COLOUR; break; case '6': CLS(CH); for (i = 0; i < NUM_OF_HOST_TYPES; i++) send_to_char(CH, "%d) %s\r\n", i + 1, host_type[i]); send_to_char(CH, "Enter host type: "); d->edit_mode = HEDIT_TYPE; break; case '7': hedit_disp_rating_menu(d); break; case '8': hedit_disp_subsystem_extras(d); break; case '9': hedit_disp_trigger_menu(d); break; case '0': hedit_disp_exit_menu(d); break; case 'a': send_to_char(CH, "Enter Shutdown Start Message: "); d->edit_mode = HEDIT_SSTART; break; case 'b': send_to_char(CH, "Enter Shutdown Stop Message: "); d->edit_mode = HEDIT_SSTOP; break; default: send_to_char("Invalid choice!", d->character); hedit_disp_data_menu(d); break; } break; case HEDIT_RATINGS: switch (LOWER(*arg)) { case 'q': case 'Q': hedit_disp_data_menu(d); break; case '1': send_to_char(CH, "Enter hosts Access rating: \r\n"); d->edit_mode = HEDIT_RATINGS_ACCESS; break; case '2': send_to_char(CH, "Enter hosts Control rating: \r\n"); d->edit_mode = HEDIT_RATINGS_CONTROL; break; case '3': send_to_char(CH, "Enter hosts Index rating: \r\n"); d->edit_mode = HEDIT_RATINGS_INDEX; break; case '4': send_to_char(CH, "Enter hosts Files rating: \r\n"); d->edit_mode = HEDIT_RATINGS_FILES; break; case '5': send_to_char(CH, "Enter hosts Slave rating: \r\n"); d->edit_mode = HEDIT_RATINGS_SLAVE; break; default: send_to_char("Invalid choice!", d->character); hedit_disp_rating_menu(d); break; } break; case HEDIT_EXTRA_MENU: switch (LOWER(*arg)) { case '1': send_to_char(CH, "Enter Access Scramble Rating (0 For None): "); d->edit_mode = HEDIT_EXTRA_ACCESS; break; case '2': send_to_char(CH, "Trapdoor to which Host (0 For None): "); d->edit_mode = HEDIT_EXTRA_CONTROL; break; case '3': send_to_char(CH, "Trapdoor to which Host (0 For None): "); d->edit_mode = HEDIT_EXTRA_INDEX; break; case '4': send_to_char(CH, "Enter Files Scramble Rating (0 For None): "); d->edit_mode = HEDIT_EXTRA_FILES; break; case '5': send_to_char(CH, "Enter Slave Scramble Rating (0 For None): "); d->edit_mode = HEDIT_EXTRA_SLAVE; break; case 'q': case 'Q': hedit_disp_data_menu(d); break; default: send_to_char("Invalid choice!", d->character); hedit_disp_subsystem_extras(d); break; } break; case HEDIT_TRIGGER: switch (LOWER(*arg)) { case 'q': case 'Q': hedit_disp_data_menu(d); break; case 'a': case 'A': send_to_char(CH, "Enter trigger step: "); d->edit_mode = HEDIT_TRIGGER_ADD; break; case 'd': case 'D': send_to_char(CH, "Enter trigger to delete: "); d->edit_mode = HEDIT_TRIGGER_DEL; break; } break; case HEDIT_EXIT: switch (LOWER(*arg)) { case 'q': case 'Q': hedit_disp_data_menu(d); break; case 'a': case 'A': send_to_char(CH, "Enter target host: "); d->edit_mode = HEDIT_EXIT_ADD; break; case 'd': case 'D': send_to_char(CH, "Enter exit to delete: "); d->edit_mode = HEDIT_EXIT_DEL; break; } break; case HEDIT_EXTRA_ACCESS: HOST->stats[ACCESS][2] = atoi(arg); send_to_char(CH, "Trapdoor to which host (0 for none): "); d->edit_mode = HEDIT_EXTRA_ACCESS2; break; case HEDIT_EXTRA_ACCESS2: HOST->stats[ACCESS][5] = atoi(arg); hedit_disp_subsystem_extras(d); break; case HEDIT_EXTRA_CONTROL: HOST->stats[CONTROL][5] = atoi(arg); hedit_disp_subsystem_extras(d); break; case HEDIT_EXTRA_INDEX: HOST->stats[INDEX][5] = atoi(arg); hedit_disp_subsystem_extras(d); break; case HEDIT_EXTRA_FILES: HOST->stats[FILES][2] = atoi(arg); send_to_char(CH, "Trapdoor to which host (0 for none): "); d->edit_mode = HEDIT_EXTRA_FILES2; break; case HEDIT_EXTRA_FILES2: HOST->stats[FILES][5] = atoi(arg); hedit_disp_subsystem_extras(d); break; case HEDIT_EXTRA_SLAVE: HOST->stats[SLAVE][2] = atoi(arg); send_to_char(CH, "Trapdoor to which host (0 for none): "); d->edit_mode = HEDIT_EXTRA_SLAVE2; break; case HEDIT_EXTRA_SLAVE2: HOST->stats[SLAVE][5] = atoi(arg); hedit_disp_subsystem_extras(d); break; case HEDIT_PARENT: number = atoi(arg); if (real_host(number) < 0) { send_to_char(CH, "Invalid Choice!\r\n"); } else { d->edit_host->parent = number; hedit_disp_data_menu(d); } break; case HEDIT_NAME: if (d->edit_host->name) delete [] d->edit_host->name; d->edit_host->name = str_dup(arg); hedit_disp_data_menu(d); break; case HEDIT_KEYWORDS: if (d->edit_host->keywords) delete [] d->edit_host->keywords; d->edit_host->keywords = str_dup(arg); hedit_disp_data_menu(d); break; case HEDIT_SSTOP: if (d->edit_host->shutdown_stop) delete [] d->edit_host->shutdown_stop; d->edit_host->shutdown_stop = str_dup(arg); hedit_disp_data_menu(d); break; case HEDIT_SSTART: if (d->edit_host->shutdown_start) delete [] d->edit_host->shutdown_start; d->edit_host->shutdown_start = str_dup(arg); hedit_disp_data_menu(d); break; case HEDIT_TYPE: number = atoi(arg); if (number <= 0 || number > NUM_OF_HOST_TYPES) { send_to_char("Invalid choice!\r\n", d->character); } else { d->edit_host->type = --number; hedit_disp_data_menu(d); } break; case HEDIT_SECURITY_COLOUR: number = atoi(arg); if (number <= 0 || number > 5) { send_to_char("Invalid choice!\r\n", d->character); send_to_char("Enter security level: ", CH); } else { d->edit_host->colour = --number; send_to_char(CH, "Enter security rating: "); d->edit_mode = HEDIT_SECURITY_RATING; } break; case HEDIT_SECURITY_RATING: number = atoi(arg); if (number <= 0) { send_to_char("Invalid choice!\r\n", d->character); send_to_char(CH, "Enter security rating: "); } else { d->edit_host->security = number; CLS(CH); send_to_char(CH, "^G1^Y) ^WEasy^n\r\n" "^G2^Y) ^WModerate^n\r\n" "^G3^Y) ^WHard^n\r\n" "Enter intrusion difficulty: "); d->edit_mode = HEDIT_SECURITY_DIFF; } break; case HEDIT_SECURITY_DIFF: number = atoi(arg); if (number <= 0 || number > 3) { send_to_char("Invalid choice!\r\n", d->character); send_to_char(CH, "Enter intrusion difficulty: "); } else { d->edit_host->intrusion = --number; hedit_disp_data_menu(d); } break; case HEDIT_RATINGS_ACCESS: number = atoi(arg); if (number <= 0) { send_to_char("Invalid choice!\r\n", d->character); send_to_char(CH, "Enter Access rating: "); } else { d->edit_host->stats[ACCESS][0] = number; hedit_disp_rating_menu(d); } break; case HEDIT_RATINGS_CONTROL: number = atoi(arg); if (number <= 0) { send_to_char("Invalid choice!\r\n", d->character); send_to_char(CH, "Enter Control rating: "); } else { d->edit_host->stats[CONTROL][0] = number; hedit_disp_rating_menu(d); } break; case HEDIT_RATINGS_INDEX: number = atoi(arg); if (number <= 0) { send_to_char("Invalid choice!\r\n", d->character); send_to_char(CH, "Enter Index rating: "); } else { d->edit_host->stats[INDEX][0] = number; hedit_disp_rating_menu(d); } break; case HEDIT_RATINGS_FILES: number = atoi(arg); if (number <= 0) { send_to_char("Invalid choice!\r\n", d->character); send_to_char(CH, "Enter Files rating: "); } else { d->edit_host->stats[FILES][0] = number; hedit_disp_rating_menu(d); } break; case HEDIT_RATINGS_SLAVE: number = atoi(arg); if (number <= 0) { send_to_char("Invalid choice!\r\n", d->character); send_to_char(CH, "Enter slave rating: "); } else { d->edit_host->stats[SLAVE][0] = number; hedit_disp_rating_menu(d); } break; case HEDIT_TRIGGER_DEL: number = atoi(arg); if (number < 0) { send_to_char(CH, "Invalid choice!\r\n"); hedit_disp_trigger_menu(d); } else { struct trigger_step *trigger, *temp; for (trigger = HOST->trigger; trigger && number; trigger = trigger->next, number--) break; if (!trigger) { send_to_char(CH, "Invalid choice!\r\n"); hedit_disp_trigger_menu(d); } else { REMOVE_FROM_LIST(trigger, HOST->trigger, next); delete trigger; hedit_disp_trigger_menu(d); } } break; case HEDIT_TRIGGER_ADD: number = atoi(arg); if (number <= 0) { send_to_char(CH, "Invalid choice!\r\n"); hedit_disp_trigger_menu(d); } else { struct trigger_step *trigger; trigger = new trigger_step; trigger->step = number; if (HOST->trigger) trigger->next = HOST->trigger; HOST->trigger = trigger; send_to_char(CH, "Go to Alert (0 - No Change, 1 - Passive, 2 - Active): "); d->edit_mode = HEDIT_TRIGGER_ADD2; } break; case HEDIT_TRIGGER_ADD2: number = atoi(arg); if (number < 0 || number > 2) send_to_char(CH, "Invalid choice!\r\nGo to Alert (0 - No Change, 1 - Passive, 2 - Active): "); else { HOST->trigger->alert = number; send_to_char(CH, "Load IC (0 for none): "); d->edit_mode = HEDIT_TRIGGER_ADD3; } break; case HEDIT_TRIGGER_ADD3: number = atoi(arg); if (real_ic(number) < 0) send_to_char(CH, "Invalid choice!\r\nLoad IC (0 for none): "); else { HOST->trigger->ic = number; hedit_disp_trigger_menu(d); } break; case HEDIT_EXIT_DEL: number = atoi(arg); if (number < 1) { send_to_char(CH, "Invalid choice!\r\n"); hedit_disp_exit_menu(d); } else { struct exit_data *exit, *temp; for (exit = HOST->exit; exit && number; exit = exit->next, number--) break; if (!exit) { send_to_char(CH, "Invalid choice!\r\n"); hedit_disp_exit_menu(d); } else { REMOVE_FROM_LIST(exit, HOST->exit, next); delete [] exit->number; delete [] exit; hedit_disp_exit_menu(d); } } break; case HEDIT_EXIT_ADD: number = atoi(arg); if (real_host(number) < 0) { send_to_char(CH, "Invalid choice!\r\n"); hedit_disp_exit_menu(d); } else { struct exit_data *exit; exit = new exit_data; exit->host = number; if (HOST->exit) exit->next = HOST->exit; HOST->exit = exit; send_to_char(CH, "Enter address to access host: "); d->edit_mode = HEDIT_EXIT_ADD2; } break; case HEDIT_EXIT_ADD2: if (d->edit_host->exit->number) delete [] d->edit_host->exit->number; d->edit_host->exit->number = str_dup(arg); hedit_disp_exit_menu(d); break; } }