//***************************************************************************** // // protedit.c // // protedit (prototype edit) handles the OLC editing of prototypes. // //***************************************************************************** #include "../mud.h" #include "../utils.h" #include "../prototype.h" #include "../socket.h" #include "../character.h" #include "../room.h" #include "../world.h" #include "olc.h" //***************************************************************************** // mandatory modules //***************************************************************************** #include "../editor/editor.h" #include "../scripts/scripts.h" #include "../scripts/script_editor.h" //***************************************************************************** // olc functions //***************************************************************************** #define PROTEDIT_PARENTS 1 void protedit_menu(SOCKET_DATA *sock, PROTO_DATA *data) { send_to_socket(sock, "{y[{c%s{y]\r\n" "{g1) parents : {c%s\r\n" "{g2) abstract: {c%s\r\n" "{g3) prototype code\r\n", protoGetKey(data), protoGetParents(data), (protoIsAbstract(data) ? "yes" : "no")); script_display(sock, protoGetScript(data), FALSE); } int protedit_chooser(SOCKET_DATA *sock, PROTO_DATA *data, const char *option) { switch(toupper(*option)) { case '1': send_to_socket(sock, "Enter a comma-separated list of the parent prototypes: "); return PROTEDIT_PARENTS; case '2': protoSetAbstract(data, (protoIsAbstract(data) + 1) % 2); return MENU_NOCHOICE; case '3': socketStartEditor(sock, script_editor, protoGetScriptBuffer(data)); return MENU_NOCHOICE; default: return MENU_CHOICE_INVALID; } } bool protedit_parser(SOCKET_DATA *sock, PROTO_DATA *data, int choice, const char *arg) { switch(choice) { case PROTEDIT_PARENTS: protoSetParents(data, arg); return TRUE; default: return FALSE; } } void save_mproto(PROTO_DATA *mproto) { worldSaveType(gameworld, "mproto", protoGetKey(mproto)); } void save_oproto(PROTO_DATA *oproto) { worldSaveType(gameworld, "oproto", protoGetKey(oproto)); } void save_rproto(PROTO_DATA *rproto) { worldSaveType(gameworld, "rproto", protoGetKey(rproto)); } void gen_cmd_protoedit(CHAR_DATA *ch, const char *type, const char *arg, void (* saver)(PROTO_DATA *)) { ZONE_DATA *zone = NULL; PROTO_DATA *proto = NULL; // we need a key if(!arg || !*arg) send_to_char(ch, "What is the name of the %s you want to edit?\r\n", type); else { char locale[SMALL_BUFFER]; char name[SMALL_BUFFER]; if(!parse_worldkey_relative(ch, arg, name, locale)) send_to_char(ch, "Which %s are you trying to edit?\r\n", type); // make sure we can edit the zone else if((zone = worldGetZone(gameworld, locale)) == NULL) send_to_char(ch, "No such zone exists.\r\n"); else if(!canEditZone(zone, ch)) send_to_char(ch, "You are not authorized to edit that zone.\r\n"); else { // try to pull up the prototype proto = worldGetType(gameworld, type, get_fullkey(name, locale)); if(proto == NULL) { proto = newProto(); protoSetAbstract(proto, TRUE); protoSetScript(proto, "# prototype code goes here\n" "# make sure to comment it with pounds (#)\n"); worldPutType(gameworld, type, get_fullkey(name, locale), proto); } do_olc(charGetSocket(ch), protedit_menu, protedit_chooser,protedit_parser, protoCopy, protoCopyTo, deleteProto, saver, proto); } } } COMMAND(cmd_mpedit) { gen_cmd_protoedit(ch, "mproto", arg, save_mproto); } COMMAND(cmd_opedit) { gen_cmd_protoedit(ch, "oproto", arg, save_oproto); } COMMAND(cmd_rpedit) { gen_cmd_protoedit(ch, "rproto", (arg && *arg ? arg : roomGetClass(charGetRoom(ch))), save_rproto); }