//*****************************************************************************
//
// dedit.c
//
// functions for allowing players to edit dialogs in OLC.
//
//*****************************************************************************
#include "../mud.h"
#include "../utils.h"
#include "../zone.h"
#include "../world.h"
#include "../socket.h"
#include "../character.h"
#include "../room.h"
#include "dialog.h"
//*****************************************************************************
// mandatory modules
//*****************************************************************************
#include "../olc2/olc.h"
#include "../editor/editor.h"
#include "../scripts/scripts.h"
#include "../scripts/script_editor.h"
//*****************************************************************************
// dialog question olc functions
//*****************************************************************************
#define DQEDIT_QUERY 1
#define DQEDIT_CHECK 2
#define DQEDIT_PANELS 3
#define DQEDIT_TO_PANEL 4
void dqedit_menu(SOCKET_DATA *sock, DIALOG_QUESTION *data) {
send_to_socket(sock,
"{g1) Question message : {c%s\r\n"
"{g2) Panels : {c%s\r\n"
"{g3) Destination panel: {c%s\r\n"
"{g4) Python check : ",
dialogQuestionGetQuery(data),
dialogQuestionGetPanels(data),
dialogQuestionGetDestPanel(data));
script_display(sock, dialogQuestionGetCheck(data), FALSE);
send_to_socket(sock,
"%s"
"{g5) Response\r\n"
"{c%s\r\n"
"{g6) Script\r\n",
(*dialogQuestionGetCheck(data) ? "" : "\r\n"),
dialogQuestionGetResponse(data));
script_display(sock, dialogQuestionGetScript(data), FALSE);
}
int dqedit_chooser(SOCKET_DATA *sock, DIALOG_QUESTION *data,const char *option){
switch(toupper(*option)) {
case '1':
send_to_socket(sock, "Enter a new question to ask: ");
return DQEDIT_QUERY;
case '2':
send_to_socket(sock, "Enter the panels this question belongs to: ");
return DQEDIT_PANELS;
case '3':
send_to_socket(sock, "Enter the panel this question leads to: ");
return DQEDIT_TO_PANEL;
case '4':
send_to_socket(sock, "Enter check to ensure char can ask the question: ");
return DQEDIT_CHECK;
case '5':
socketStartEditor(sock, text_editor, dialogQuestionGetResponseBuf(data));
return MENU_NOCHOICE;
case '6':
socketStartEditor(sock, script_editor, dialogQuestionGetScriptBuf(data));
return MENU_NOCHOICE;
default:
return MENU_CHOICE_INVALID;
}
}
bool dqedit_parser(SOCKET_DATA *sock, DIALOG_QUESTION *data, int choice,
const char *arg) {
switch(choice) {
case DQEDIT_QUERY:
dialogQuestionSetQuery(data, arg);
return TRUE;
case DQEDIT_PANELS:
dialogQuestionSetPanels(data, arg);
return TRUE;
case DQEDIT_TO_PANEL:
dialogQuestionSetDestPanel(data, arg);
return TRUE;
case DQEDIT_CHECK:
dialogQuestionSetCheck(data, arg);
return TRUE;
default:
return FALSE;
}
}
//*****************************************************************************
// dialog olc functions
//*****************************************************************************
#define DEDIT_NAME 1
#define DEDIT_EDIT_QUESTION 2
#define DEDIT_DELETE_QUESTION 3
void dedit_menu(SOCKET_DATA *sock, DIALOG_DATA *data) {
send_to_socket(sock,
"{y[{c%s{y]\r\n"
"{g1) Name\r\n"
"{c%s\r\n"
"{g2) Greeting\r\n"
"{c%s\r\n"
"{g3) Ending script\r\n",
dialogGetKey(data), dialogGetName(data), dialogGetGreet(data));
script_display(sock, dialogGetEndScript(data), FALSE);
send_to_socket(sock, "\r\n{wResponses:{n\r\n");
LIST_ITERATOR *q_i = newListIterator(dialogGetQuestions(data));
DIALOG_QUESTION *q = NULL;
int count = 0;
ITERATE_LIST(q, q_i) {
send_to_socket(sock,
" {g%2d) {c%s\r\n"
" {c%s {y[{cleads to %s{y]\r\n", count,
dialogQuestionGetQuery(q),
dialogQuestionGetPanels(q),
(*dialogQuestionGetDestPanel(q) ?
dialogQuestionGetDestPanel(q) : "the same panel"));
count++;
} deleteListIterator(q_i);
send_to_socket(sock,
" {gE) Edit question\r\n"
" N) New question\r\n"
" D) Delete question\r\n");
}
int dedit_chooser(SOCKET_DATA *sock, DIALOG_DATA *data, const char *option) {
switch(toupper(*option)) {
case '1':
send_to_socket(sock, "Enter a new name: ");
return DEDIT_NAME;
case '2':
socketStartEditor(sock, text_editor, dialogGetGreetBuf(data));
return MENU_NOCHOICE;
case '3':
socketStartEditor(sock, script_editor, dialogGetEndScriptBuf(data));
return MENU_NOCHOICE;
case 'E':
if(listSize(dialogGetQuestions(data)) == 0)
return MENU_CHOICE_INVALID;
send_to_socket(sock, "Enter question number to edit: ");
return DEDIT_EDIT_QUESTION;
case 'N': {
DIALOG_QUESTION *qst = newDialogQuestion();
dialogAddQuestion(data, qst);
do_olc(sock, dqedit_menu, dqedit_chooser, dqedit_parser,
NULL, NULL, NULL, NULL, qst);
return MENU_NOCHOICE;
}
case 'D':
if(listSize(dialogGetQuestions(data)) == 0)
return MENU_CHOICE_INVALID;
send_to_socket(sock, "Enter question number to delete: ");
return DEDIT_DELETE_QUESTION;
default:
return MENU_CHOICE_INVALID;
}
}
bool dedit_parser(SOCKET_DATA *sock, DIALOG_DATA *data, int choice,
const char *arg) {
switch(choice) {
case DEDIT_NAME:
dialogSetName(data, arg);
return TRUE;
case DEDIT_EDIT_QUESTION:
if(!isdigit(*arg))
return FALSE;
else {
int val = atoi(arg);
if(val < 0)
return TRUE;
else if(listSize(dialogGetQuestions(data)) <= val)
return FALSE;
else {
do_olc(sock, dqedit_menu, dqedit_chooser, dqedit_parser,
NULL, NULL, NULL, NULL, listGet(dialogGetQuestions(data), val));
return TRUE;
}
}
case DEDIT_DELETE_QUESTION:
if(!*arg)
return TRUE;
else {
DIALOG_QUESTION *qst = listRemoveNum(dialogGetQuestions(data), atoi(arg));
if(qst != NULL)
deleteDialogQuestion(qst);
return TRUE;
}
default:
return FALSE;
}
}
//*****************************************************************************
// player commands
//*****************************************************************************
void olc_save_dialog(DIALOG_DATA *dialog) {
worldSaveType(gameworld, "dialog", dialogGetKey(dialog));
}
COMMAND(cmd_dedit) {
ZONE_DATA *zone = NULL;
DIALOG_DATA *dialog = NULL;
// we need a key
if(!arg || !*arg)
send_to_char(ch, "What is the name of the dialog you want to edit?\r\n");
else {
char locale[SMALL_BUFFER];
char name[SMALL_BUFFER];
if(!parse_worldkey_relative(ch, arg, name, locale))
send_to_char(ch, "Which dialog are you trying to edit?\r\n");
// 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
dialog = worldGetType(gameworld, "dialog", get_fullkey(name, locale));
if(dialog == NULL) {
dialog = newDialog();
dialogSetName(dialog, "An unfinished dialog");
dialogSetGreet(dialog,
"Hello, $n. What I have to say is not yet finished.\r\n");
worldPutType(gameworld, "dialog", get_fullkey(name, locale), dialog);
}
do_olc(charGetSocket(ch), dedit_menu, dedit_chooser, dedit_parser,
dialogCopy, dialogCopyTo, deleteDialog, olc_save_dialog, dialog);
}
}
}
// this is used for the header when printing out zone proto info
#define DIALOG_LIST_HEADER \
"Name "
const char *dlist_list_name(DIALOG_DATA *dialog) {
static char buf[SMALL_BUFFER];
sprintf(buf, "%-54s", dialogGetName(dialog));
return buf;
}
COMMAND(cmd_dlist) {
do_list(ch, (arg&&*arg?arg:get_key_locale(roomGetClass(charGetRoom(ch)))),
"dialog", DIALOG_LIST_HEADER, dlist_list_name);
}
COMMAND(cmd_drename) {
char *from = NULL, *to = NULL;
if(!parse_args(ch, TRUE, cmd, arg, "word word", &from, &to))
return;
do_rename(ch, "dialog", from, to);
}
COMMAND(cmd_ddelete) {
char *name = NULL;
if(!parse_args(ch, TRUE, cmd, arg, "word", &name))
return;
do_delete(ch, "dialog", deleteDialog, name);
}
//*****************************************************************************
// initialization
//*****************************************************************************
void init_dedit(void) {
add_cmd("dedit", NULL, cmd_dedit, "builder", TRUE);
add_cmd("dlist", NULL, cmd_dlist, "builder", TRUE);
add_cmd("drename", NULL, cmd_drename, "builder", TRUE);
add_cmd("ddelete", NULL, cmd_ddelete, "builder", TRUE);
}