//*****************************************************************************
//
// trigedit.c
//
// contains the functions neccessary for using OLC on triggers.
//
//*****************************************************************************
#include "../mud.h"
#include "../socket.h"
#include "../character.h"
#include "../utils.h"
#include "../world.h"
#include "scripts.h"
#include "trighooks.h"
//*****************************************************************************
// mandatory modules
//*****************************************************************************
#include "../editor/editor.h"
#include "script_editor.h"
#ifdef MODULE_OLC2
#include "../olc2/olc.h"
//*****************************************************************************
// trigger lists
//*****************************************************************************
#define TRIGLIST_NEW 1
#define TRIGLIST_DELETE 2
void trigger_list_menu(SOCKET_DATA *sock, LIST *triggers) {
if(listSize(triggers) > 0) {
send_to_socket(sock, "{wCurrent triggers:\r\n");
LIST_ITERATOR *trig_i = newListIterator(triggers);
char *trig = NULL;
ITERATE_LIST(trig, trig_i) {
send_to_socket(sock, " {g%s\r\n", trig);
} deleteListIterator(trig_i);
}
send_to_socket(sock,
"\r\n"
" {gN) Add new trigger\r\n"
" {gD) Delete trigger\r\n");
}
int trigger_list_chooser(SOCKET_DATA *sock, LIST *triggers, const char *option){
switch(toupper(*option)) {
case 'N':
send_to_socket(sock, "Enter key for trigger to attach: ");
return TRIGLIST_NEW;
case 'D':
send_to_socket(sock, "Enter key for trigger to delete: ");
return TRIGLIST_DELETE;
default:
return MENU_CHOICE_INVALID;
}
}
bool trigger_list_parser(SOCKET_DATA *sock, LIST *triggers, int choice,
const char *arg) {
switch(choice) {
case TRIGLIST_NEW:
if(!listGetWith(triggers, arg, strcasecmp))
listPutWith(triggers, strdup(arg), strcasecmp);
return TRUE;
case TRIGLIST_DELETE: {
char *found = listRemoveWith(triggers, arg, strcasecmp);
if(found) free(found);
return TRUE;
}
default: return FALSE;
}
}
//*****************************************************************************
// triggers
//*****************************************************************************
#define TEDIT_NAME 1
#define TEDIT_TYPE 2
//*****************************************************************************
// tedit OLC functions
//*****************************************************************************
void tedit_menu(SOCKET_DATA *sock, TRIGGER_DATA *trigger) {
// the display line for our trigger type
BUFFER *ttype_line = newBuffer(1);
if(!*triggerGetType(trigger))
bufferCat(ttype_line, "<NONE>");
else {
bufferCat(ttype_line, triggerGetType(trigger));
// is it a valid type?
if(hashIn(get_tedit_opts(), triggerGetType(trigger)))
bprintf(ttype_line, " (%s)", (char *)hashGet(get_tedit_opts(),
triggerGetType(trigger)));
else
bprintf(ttype_line, " {r* unknown trigger type");
}
send_to_socket(sock,
"{g[{c%s{g]\r\n"
"{g1) Name : {c%s\r\n"
"{g2) Trigger type: {c%s\r\n"
"{g3) Script Code\r\n",
triggerGetKey(trigger),
triggerGetName(trigger),
bufferString(ttype_line));
script_display(sock, triggerGetCode(trigger), FALSE);
// garbage collection
deleteBuffer(ttype_line);
}
int tedit_chooser(SOCKET_DATA *sock, TRIGGER_DATA *trigger, const char *option){
switch(toupper(*option)) {
case '1':
send_to_socket(sock, "Enter trigger name: ");
return TEDIT_NAME;
case '2':
send_to_socket(sock,
"{w%-18s %-20s%-18s %-22s\r\n",
"Type", "Usable By", "Type", "Usable By");
send_to_socket(sock, "{y------------------------------------------------------------------------------{g\r\n");
// get our keys, sort them alphabetically, and then list them all
HASHTABLE *opts = get_tedit_opts();
LIST *keys = hashCollect(opts);
listSortWith(keys, strcasecmp);
LIST_ITERATOR *key_i = newListIterator(keys);
const char *key = NULL;
int parity = 0;
// display our keys, one at a time
ITERATE_LIST(key, key_i) {
send_to_socket(sock, "%-18s %-20s", key, (char *)hashGet(opts, key));
parity = (parity + 1) % 2;
if(parity == 0)
send_to_socket(sock, "\r\n");
} deleteListIterator(key_i);
// need a newline
if(parity == 1)
send_to_socket(sock, "\r\n");
send_to_socket(sock, "\r\nEnter trigger type: ");
// garbage collection
deleteListWith(keys, free);
return TEDIT_TYPE;
case '3':
socketStartEditor(sock, script_editor, triggerGetCodeBuffer(trigger));
return MENU_NOCHOICE;
default:
return MENU_CHOICE_INVALID;
}
}
bool tedit_parser(SOCKET_DATA *sock, TRIGGER_DATA *trigger, int choice,
const char *arg) {
switch(choice) {
case TEDIT_NAME:
triggerSetName(trigger, arg);
return TRUE;
case TEDIT_TYPE: {
triggerSetType(trigger, arg);
/*
int num = atoi(arg);
if(num < 0 || num >= num_trig_types())
return FALSE;
else {
triggerSetType(trigger, triggerTypeGetName(num));
return TRUE;
}
*/
return TRUE;
}
default:
return FALSE;
}
}
void save_trigger(TRIGGER_DATA *trigger) {
format_script_buffer(triggerGetCodeBuffer(trigger));
worldSaveType(gameworld, "trigger", triggerGetKey(trigger));
}
COMMAND(cmd_tedit) {
ZONE_DATA *zone = NULL;
TRIGGER_DATA *trigger = NULL;
// we need a key
if(!arg || !*arg)
send_to_char(ch,"Please supply the key of a trigger you wish to edit.\r\n");
else if(key_malformed(arg))
send_to_char(ch, "You entered a malformed trigger key.\r\n");
else {
char name[SMALL_BUFFER], locale[SMALL_BUFFER];
if(!parse_worldkey_relative(ch, arg, name, locale))
send_to_char(ch, "Which trigger are you trying to edit?\r\n");
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 {
// pull up the script
trigger = worldGetType(gameworld, "trigger", get_fullkey(name, locale));
if(trigger == NULL) {
trigger = newTrigger();
triggerSetName(trigger, "An Unfinished Trigger");
triggerSetCode(trigger, "# trigger code goes here\n"
"# make sure to comment it with pounds (#)\n");
worldPutType(gameworld, "trigger", get_fullkey(name, locale), trigger);
}
do_olc(charGetSocket(ch), tedit_menu, tedit_chooser, tedit_parser,
triggerCopy, triggerCopyTo, deleteTrigger, save_trigger, trigger);
}
}
}
#endif // MODULE_OLC2