EmberMUD/
EmberMUD/clan/
EmberMUD/classes/
EmberMUD/doc/design/
EmberMUD/gods/
EmberMUD/log/
EmberMUD/notes/
EmberMUD/player/
EmberMUD/player/temp/
EmberMUD/src/MSVC/
EmberMUD/src/Sleep/
EmberMUD/src/StartMUD/
EmberMUD/src/Win32Common/
/* Header for no real reason */
#if defined(WIN32)
#include <time.h>
#else
#include <sys/time.h>
#endif
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "merc.h"
#include "olc.h"

TODO_DATA *todo_first = NULL;
TODO_DATA *todo_last = NULL;

const struct olc_cmd_type todoedit_table[] = {
    {"show", todoedit_show},
    {"create", todoedit_create},
    {"keyword", todoedit_keyword},
    {"level", todoedit_level},
    {"text", todoedit_text},
    {"?", show_help},
    {"version", show_version},
    {"commands", show_commands},
    {"", 0,}
};

TODO_DATA *new_todo( void )
{
    TODO_DATA *pTodo;

    pTodo = alloc_perm( sizeof( TODO_DATA ) );

    if ( !pTodo )
    {
        bug( "new todo: Call to alloc_perm failed!", 0 );
#if defined(cbuilder)
        return -1;
#else
        exit( 1 );
#endif
    }

    pTodo->next = NULL;
    pTodo->keyword = str_dup( "CHANGE_ME!" );
    pTodo->level = 0;
    pTodo->text =
        str_dup( "Someone didnt change the text for this todo, the bonheads." );

    return pTodo;
}

TODO_DATA *get_todo( char *argument )
{
    TODO_DATA *pTodo;
    char arg[MAX_INPUT_LENGTH];
    argument = one_argument( argument, arg );
    for ( pTodo = todo_first; pTodo != NULL; pTodo = pTodo->next )

        if ( str_cmp( arg, pTodo->keyword ) )
        {
            break;
        }

    return pTodo;
}

void do_todoedit( CHAR_DATA * ch, char *argument )
{
    TODO_DATA *pTodo;
    char argall[MAX_INPUT_LENGTH], argone[MAX_INPUT_LENGTH];

    /* this parts handles todo a b so that it returns todo 'a b' */
    argall[0] = '\0';
    while ( argument[0] != '\0' )
    {
        argument = one_argument( argument, argone );
        if ( argall[0] != '\0' )
            strcat( argall, " " );
        strcat( argall, argone );
    }

    if ( IS_NPC( ch ) )
    {
        send_to_char( "Why does an NPC need to write todo?!\n\r", ch );
        return;
    }

    if ( get_trust( ch ) < TODO_EDIT_LEVEL )
    {
        send_to_char( "Your not powerful enough to do this.\n\r", ch );
        return;
    }

    if ( argall[0] == '\0' )
    {
        send_to_char
            ( "Syntax: edit todo createtodo\nSyntax: edit todo <keyword>\n\r",
              ch );
        return;
    }

    for ( pTodo = todo_first; pTodo != NULL; pTodo = pTodo->next )

        if ( is_name( argall, pTodo->keyword ) )
        {
            ch->desc->pEdit = ( void * ) pTodo;
            ch->desc->editor = ED_TODOOLC;
            SET_BIT( ch->act, PLR_BUILDING );
            act( "$n has entered the Todo Editor.", ch, NULL, NULL, TO_ROOM );
            return;
        }
    if ( is_name( argall, "createtodo" ) )
    {
        if ( todoedit_create( ch, argument ) )
        {
            ch->desc->editor = ED_TODOOLC;
            SET_BIT( ch->act, PLR_BUILDING );
            act( "$n has entered the Todo Editor.", ch, NULL, NULL, TO_ROOM );
        }

        return;
    }
    else
    {
        send_to_char( "There is no default todo to edit.\n\r", ch );
        return;
    }
}

void todoedit( CHAR_DATA * ch, char *argument )
{
    TODO_DATA *pTodo;
    char command[MAX_INPUT_LENGTH];
    char arg[MAX_INPUT_LENGTH];
    int cmd;

    smash_tilde( argument );
    strncpy( arg, argument, sizeof( arg ) - 1 );
    arg[sizeof( arg )] = '\0';
    argument = one_argument( argument, command );

    pTodo = ( TODO_DATA * ) ch->desc->pEdit;

    if ( !str_cmp( command, "done" ) )
    {
        edit_done( ch );
        do_asave( ch, "todo" );
        return;
    }

    if ( get_trust( ch ) < TODO_EDIT_LEVEL )
    {
        send_to_char( "Insufficient security to modify todo.\n\r", ch );
        interpret( ch, arg );
        return;
    }

    if ( command[0] == '\0' )
    {
        todoedit_show( ch, argument );
        return;
    }

    if ( !pTodo )
    {
        send_to_char( "You are not currently editing a todo.\n\r", ch );
        interpret( ch, arg );
        return;
    }

    /* Search table and dispatch command */
    for ( cmd = 0; todoedit_table[cmd].name[0] != '\0'; cmd++ )
    {
        if ( !str_prefix( command, todoedit_table[cmd].name ) )
        {
            if ( ( *todoedit_table[cmd].olc_fun ) ( ch, argument ) )
            {
                return;
            }
            else
            {
                return;
            }
        }
    }

    /* If command not found, default to the standard interpreter. */
    interpret( ch, arg );
    return;
}

bool todoedit_show( CHAR_DATA * ch, char *argument )
{
    TODO_DATA *pTodo;

    pTodo = ( TODO_DATA * ) ch->desc->pEdit;

    if ( !pTodo )
    {
        send_to_char( "You are not currently editing a todo.\n\r", ch );
    }
    else
    {
        printf_to_char( ch, "Keywords:             %s\n\r", pTodo->keyword );
        printf_to_char( ch, "Level: %d\n\r", pTodo->level );
        printf_to_char( ch,
                        "Text: Type text to see the text (Some are VERY long, so they are not shown here.)" );
    }

    return FALSE;
}

bool todoedit_create( CHAR_DATA * ch, char *argument )
{
    TODO_DATA *pTodo = new_todo(  );

    if ( !pTodo )
    {
        send_to_char( "ERROR!  Could not create a new todo!\n\r", ch );
        return FALSE;
    }

    if ( todo_first == NULL )
    {
        todo_first = pTodo;
        todo_last = pTodo;
    }
    else
    {
        todo_last->next = pTodo;
        todo_last = pTodo;
    }

    send_to_char( "Todo created.\n\r", ch );

    ch->desc->pEdit = ( void * ) pTodo;

    return TRUE;
}

bool todoedit_keyword( CHAR_DATA * ch, char *argument )
{
    TODO_DATA *pTodo;

    pTodo = ( TODO_DATA * ) ch->desc->pEdit;

    if ( !pTodo )
    {
        send_to_char( "You are not currently editing a todo.\n\r", ch );
        return FALSE;
    }

    if ( argument[0] == '\0' )
    {
        send_to_char( "Syntax:  keyword <keywords for this todo>\n\r", ch );
        return FALSE;
    }

    if ( strlen( argument ) != str_len( argument ) )
    {
        send_to_char( "ERROR!  Color codes are not allowed in keywords.\n\r",
                      ch );
        return FALSE;
    }

    if ( strlen( argument ) > 60 )
    {
        send_to_char( "ERROR! Keywords must be 60 characters or less.\n\r",
                      ch );
        return FALSE;
    }

    free_string( &pTodo->keyword );
    pTodo->keyword = str_dup( argument );

    send_to_char( "Todo keywords set.\n\r", ch );

    return TRUE;
}

bool todoedit_level( CHAR_DATA * ch, char *argument )
{
    TODO_DATA *pTodo;

    pTodo = ( TODO_DATA * ) ch->desc->pEdit;

    if ( !pTodo )
    {
        send_to_char( "You are not currently editing a todo.\n\r", ch );
        return FALSE;
    }

    if ( argument[0] == '\0' || !is_number( argument ) )
    {
        send_to_char( "Syntax:  level [number]\n\r", ch );
        return FALSE;
    }

    pTodo->level = atoi( argument );

    send_to_char( "Level set.\n\r", ch );
    return TRUE;

}

bool todoedit_text( CHAR_DATA * ch, char *argument )
{
    TODO_DATA *pTodo;

    pTodo = ( TODO_DATA * ) ch->desc->pEdit;

    if ( !pTodo )
    {
        send_to_char( "You are not currently editing a Todo.\n\r", ch );
        return FALSE;
    }
    if ( argument[0] == '\0' )
    {
        string_append( ch, &pTodo->text );
        return TRUE;
    }

    send_to_char( "Syntax:  text    (No arguments allowed)\n\r", ch );
    return FALSE;
}