/* -*- LPC -*- */ /* * $Locker: $ * $Id: quests.c,v 1.6 2000/07/29 15:40:43 laurana Exp $ * $Log: quests.c,v $ * Revision 1.6 2000/07/29 15:40:43 laurana * fixed my help * * Revision 1.4 2000/07/24 13:29:54 taffyd * Tightened use of protected/private. * * Revision 1.3 2000/07/24 13:27:41 taffyd * Fixed up the quests command so you can't get info unless you're allowed(tm). * * Revision 1.2 1999/05/20 01:07:54 ceres * Added support for active/inactive flag * * Revision 1.1 1998/01/06 05:29:21 ceres * Initial revision * */ #include <quest_handler.h> #define TEXTS_DIR "/save/quests/" inherit "/cmds/base"; private string *names; private mapping makers; protected void create() { makers = ([ ]); } /* create() */ private void print_info( int i ) { string text; text = read_file( TEXTS_DIR + replace( names[ i ], " ", "_" ) +".txt" ); if ( !text ) text = "There is no text file for this quest.\n"; printf( "\nQuest %d of %d \"%s\", level %d\n" " title: %s\n story: %s\n" " Active: %s\n" " completed %d times, last by %s\n\n" "%s\n", i + 1, sizeof( names ), names[ i ], (int)QUEST_HANDLER->query_quest_level( names[ i ] ), (string)QUEST_HANDLER->query_quest_title( names[ i ] ), (string)QUEST_HANDLER->query_quest_story( names[ i ] ), (int)QUEST_HANDLER->query_quest_status(names[i]) ? "Yes" : "No", (int)QUEST_HANDLER->query_quest_times( names[ i ] ), capitalize( (string)QUEST_HANDLER->query_quest_done( names[ i ] ) ), text ); } /* print_info() */ private void change_status( int i ) { switch(QUEST_HANDLER->change_quest_status(names[i])) { case 1: printf("Quest %s set to active.\n", names[i]); break; case 0: printf("Quest %s set to inactive.\n", names[i]); break; case -1: printf("No such quest: %s.\n", names[i]); break; } } void main_menu( string word ) { int number, which; string name; mixed *args; which = makers[ this_player() ][ 0 ]; args = makers[ this_player() ][ 1 ]; if ( !word || ( word == "" ) ) word = " "; switch ( word[ 0 ] ) { case 'Q' : case 'q' : return; case 'N' : case 'n' : if ( which > sizeof( names ) - 2 ) { printf( "No more quests.\n" ); which = sizeof( names ) - 1; break; } which++; print_info( which ); break; case 'A': case 'a': change_status(which); break; case 'P' : case 'p' : if ( which < 1 ) { printf( "No previous quests.\n" ); which = 0; break; } which--; print_info( which ); break; case 'G' : case 'g' : if ( strlen( word ) < 3 ) { printf( "Syntax: G <number>\n" ); break; } if ( sscanf( word[ 2 .. ], "%d", number ) != 1 ) { printf( "Syntax: G <number>\n" ); break; } if ( ( number < 1 ) || ( number > sizeof( names ) ) ) { printf( "Number must be between 1 and %d.\n", sizeof( names ) ); break; } which = number - 1; print_info( which ); break; case 'C' : case 'c' : if ( strlen( word ) < 3 ) { printf( "Syntax: C <quest>\n" ); break; } if ( args[ 0 ] < 1 ) { printf( "No quest level set.\n" ); break; } if ( !stringp( args[ 1 ] ) ) { printf( "No quest title set.\n" ); break; } if ( !stringp( args[ 2 ] ) ) { printf( "No quest story set.\n" ); break; } word = word[ 2 .. ]; if ( member_array( word, names ) != -1 ) { printf( "There is already a quest \""+ word +"\".\n" ); break; } QUEST_HANDLER->add_quest( word, args[ 0 ], args[ 1 ], args[ 2 ] ); names += ({ word }); args = allocate( 3 ); printf( "Quest \""+ word +"\" added.\n" ); which = sizeof( names ) - 1; print_info( which ); break; case 'L' : case 'l' : if ( strlen( word ) < 3 ) { printf( "Syntax: L <level>\n" ); break; } if ( sscanf( word[ 2 .. ], "%d", number ) != 1 ) { printf( "Syntax: L <level>\n" ); break; } if ( number < 1 ) { printf( "Level must be at least 1.\n" ); break; } args[ 0 ] = number; printf( "Quest level set to "+ number +".\n" ); break; case 'T' : case 't' : if ( strlen( word ) < 3 ) { printf( "Syntax: T <title>\n" ); break; } word = word[ 2 .. ]; if ( member_array( word, (string)QUEST_HANDLER->query_quest_titles() ) != -1 ) { printf( "There is already a quest that gives the title \""+ word +"\".\n" ); break; } args[ 1 ] = word; printf( "Quest title set to \""+ word +"\".\n" ); break; case 'S' : case 's' : if ( strlen( word ) < 3 ) { printf( "Syntax: S <story>\n" ); break; } word = word[ 2 .. ]; if ( member_array( word, (string)QUEST_HANDLER->query_quest_stories() ) != -1 ) { printf( "There is already a quest that has the story \""+ word +"\".\n" ); break; } args[ 2 ] = word; printf( "Quest story set to \""+ word +"\".\n" ); break; case 'R' : case 'r' : printf( "\nQuest data so far:\n" ); if ( args[ 0 ] < 1 ) word = "not set"; else word = sprintf( "%d", args[ 0 ] ); printf( " level: %s\n", word ); if ( !stringp( args[ 1 ] ) ) word = "not set"; else word = args[ 1 ]; printf( " title: %s\n", word ); if ( !stringp( args[ 2 ] ) ) word = "not set"; else word = args[ 2 ]; printf( " story: %s\n\n", word ); break; case 'E' : case 'e' : printf( "Editing the text file...\n" "The log will show that you edited this file; if you " "ruin it,\nyou will be hunted down and eviscerated.\n" ); this_player()->do_edit( read_file( TEXTS_DIR + replace( names[ which ], " ", "_" ) +".txt" ), "end_edit" ); return; case 'F' : case 'f' : if ( strlen( word ) < 3 ) { printf( "Syntax: F <word>\n" ); break; } word = word[ 2 .. ]; number = 0; foreach ( name in ( names[ which + 1 .. ] + names[ 0 .. which ] ) ) { which = ( which + 1 ) % sizeof( names ); if ( strsrch( name, word ) != -1 ) { print_info( which ); number = 1; break; } if ( strsrch( lower_case( (string)QUEST_HANDLER-> query_quest_title( name ) ), word ) != -1 ) { print_info( which ); number = 1; break; } if ( strsrch( lower_case( (string)QUEST_HANDLER-> query_quest_story( name ) ), word ) != -1 ) { print_info( which ); number = 1; break; } } if ( !number ) printf( "\""+ word +"\" not found.\n" ); break; case 'H' : case 'h' : printf( "\nQuest editor commands:\n\n" "Q : quit the quest editor\n" "N : go to the next quest\n" "P : go to the previous quest\n" "G <number> : go to a particular quest by number\n" "A : toggle a quests active/inactive flag\n" "C <quest> : create a new quest\n" "L <level> : set a new quest's level\n" "T <title> : set a new quest's title\n" "S <story> : set a new quest's story\n" "R : review the new quest's data\n" "E : edit the quest's text file\n" "F <word> : find the next quest using that word\n" "H : get this list of commands\n\n" "To create a new quest, set the level, title and \n" "story first, then use C to create the quest with \n" "the title that creators will see.\n\n" "No command will reprint the current quest.\n\n" ); break; default : print_info( which ); } makers[ this_player() ] = ({ which, args }); printf( "Choose one of Q, N, P, G, C, L, T, S, R, E, F or H (for help) : " ); input_to( "main_menu" ); } /* main_menu() */ void end_edit( string text ) { string name; if ( !text || ( text == "" ) ) { printf( "Aborted.\n" ); main_menu( "Z" ); return; } if ( text[ <1 ] != '\n' ) text += "\n"; name = names[ makers[ this_player() ][ 0 ] ]; log_file( "QUESTS", ctime( time() ) +" "+ (string)this_player()->query_name() + " changed text file for "+ name +"\n" ); printf( "Writing file...\n" ); unguarded( (: write_file, TEXTS_DIR + replace( name, " ", "_" ) + ".txt", text, 1 :) ); main_menu( "Z" ); } /* end_edit() */ private int cmd() { names = (string *)QUEST_HANDLER->query_quest_names(); makers[ this_player() ] = ({ 0, allocate( 3 ) }); main_menu( "G 1" ); return 1; } /* cmd() */ /** * @ignore yes */ public mixed *query_patterns() { return ({ "", (: cmd() :) }); } /* query_patterns() */