/**************************************************************************/ // herbedit.cpp - OLC based herb editor, Kerenos. /*************************************************************************** * The Dawn of Time v1.69r (c)1997-2004 Michael Garratt * * >> A number of people have contributed to the Dawn codebase, with the * * majority of code written by Michael Garratt - www.dawnoftime.org * * >> To use this source code, you must fully comply with the dawn license * * in licenses.txt... In particular, you may not remove this copyright * * notice. * **************************************************************************/ #include "include.h" #include "olc.h" #include "db.h" #include "security.h" #include "ictime.h" HERB_DATA *find_herb( char_data * ch, char *herb ); bool herb_create( char_data *ch, char * ); void list_herbs( char_data *ch ); HERB_DATA *herb_list; bool resave_continents; char * const month_name [] = { "Winter", "the Winter Storm", "the Frost Blight", "the Return","Blight","the Dragon", "Light", "the Sun", "the Heat", "the Great War", "the Shadows", "the Long Shadows", }; /**************************************************************************/ // write the continent name void herbdata_write_scontinent(gio_type *gio_table, int tableIndex, void *data, FILE *fp) { HERB_DATA * h; h= (HERB_DATA*) data; if(h->continent){ fprintf(fp, "%s %s~\n", gio_table[tableIndex].heading, h->continent->name); } } /**************************************************************************/ void save_continents(); /**************************************************************************/ // read the continent name void herbdata_read_continent(gio_type *, int, void *data, FILE *fp) { const char *continent_convert_table[]= { "none", "valarin", "endomar", "kerallyan", "rhynia", "ring_isle", "orcs", "elenarthya", "confederacy", "delenth", "markrist", "aarislan", "faerie_ring", "plane_air", "plane_water", "plane_earth", "plane_fire", NULL }; HERB_DATA * h; char *pstr; h= (HERB_DATA*) data; pstr=fread_string_eol(fp); // automatically convert continents that are in numeric form // to the text form prior to the dynamic continent systems. if(is_number(pstr)){ int i=atoi(pstr); free_string(pstr); pstr=str_dup(continent_convert_table[i]); } h->continent=continent_lookup(pstr); if ( !h->continent){ logf("Automatically added continent '%s' while reading in herb '%s'.", pstr, h->name); h->continent=new continent_type; // insert the new continent at the front of the list h->continent->name=str_dup(ltrim_string(rtrim_string(pstr))); h->continent->next=continent_list; continent_list=h->continent; resave_continents=true; } free_string(pstr); } /**************************************************************************/ // read the continent name void herbdata_read_scontinent(gio_type *, int, void *data, FILE *fp) { HERB_DATA * h; char *pstr; h= (HERB_DATA*) data; pstr=fread_string(fp); h->continent=continent_lookup(pstr); if ( !h->continent){ logf("Automatically added continent '%s' while reading in herb '%s'.", pstr, h->name); h->continent=new continent_type; // insert the new continent at the front of the list h->continent->name=str_dup(ltrim_string(rtrim_string(pstr))); h->continent->next=continent_list; continent_list=h->continent; resave_continents=true; } free_string(pstr); } /**************************************************************************/ // use GIO to save the herb data GIO_START( HERB_DATA ) GIO_STRH( name, "Name ") GIO_SHINTH( sector, "Sector ") GIO_SHINTH( timefield, "Timefield ") GIO_SHINTH( season, "Season ") GIO_CUSTOM_WRITEH(continent,"sContinent ", herbdata_write_scontinent) GIO_CUSTOM_READH(continent, "sContinent ", herbdata_read_scontinent) GIO_CUSTOM_READH(continent, "Continent ", herbdata_read_continent) GIO_SHINTH( month, "Month ") GIO_SHINTH( difficulty, "Difficulty ") GIO_INTH( vnum_result, "Vnum ") GIO_INTH( area, "Area ") GIO_FINISH /**************************************************************************/ void load_herb_db( void ) { resave_continents=false; logf( "===Loading herb database from %s...", HERB_FILE ); GIOLOAD_LIST( herb_list, HERB_DATA, HERB_FILE ); log_string( "load_herb_db(): finished" ); if(resave_continents){ save_continents(); } } /**************************************************************************/ void save_herb_db( void ) { logf( "===save_herb_db(): saving herb database to %s...", HERB_FILE ); GIOSAVE_LIST( herb_list, HERB_DATA, HERB_FILE, true ); } /**************************************************************************/ // do func so it can be used as a command void do_saveherbs( char_data *ch, char * ) { save_herb_db(); ch->println( "Herbs saved..." ); logf( "do_saveherbs(): manual save of herbs..." ); } /**************************************************************************/ // Entry Point for editing herbs void do_herbedit( char_data *ch, char *argument ) { HERB_DATA *herb; if ( IS_NPC( ch )){ ch->println("Players only."); return; } // do security checks if (!HAS_SECURITY(ch, HERBEDIT_MINSECURITY)) { ch->printlnf("You must have an olc security %d or higher to use this command.", HERBEDIT_MINSECURITY); return; } if ( !IS_TRUSTED(ch, HERBEDIT_MINTRUST)) { ch->printlnf("You must have a trust of %d or above to use this command.", HERBEDIT_MINTRUST); return; } if ( !IS_SET(TRUE_CH(ch)->pcdata->council, COUNCIL_REALM) && !IS_ADMIN(ch)) { ch->println( "Only realm council may use this command." ); return; } if (IS_NULLSTR(argument)) { ch->println( " Syntax: herbedit <herb> (edits an existing herb)"); ch->println( " Syntax: herbedit list (shows all available herbs)" ); ch->println( " Syntax: herbedit create (creates a new, null herb)" ); return; } char arg[MIL]; argument=one_argument(argument,arg); if(!str_cmp(arg,"create")) { herb_create( ch, "" ); return; } if ( !str_cmp( arg, "list" )) { list_herbs( ch ); return; } // find an existing herb herb = find_herb(ch, arg); if( !herb ) { ch->printlnf("There is no herb named '%s'", arg ); return; }; ch->desc->pEdit = (void*)herb; ch->desc->editor = ED_HERB; ch->printlnf("Editing '%s' herb.", herb->name); return; } /**************************************************************************/ bool herb_create( char_data *ch, char * ) { HERB_DATA *node; static HERB_DATA zero_node; node = new HERB_DATA; *node = zero_node; node->next = herb_list; herb_list = node; herb_list->name = str_dup( "New" ); herb_list->season = -1; herb_list->month = -1; herb_list->area = -1; herb_list->continent = NULL; ch->desc->pEdit = (void *)herb_list; ch->desc->editor = ED_HERB; ch->println( "Herb Created." ); return false; } /**************************************************************************/ // find an herb HERB_DATA *find_herb( char_data *, char *herb ) { HERB_DATA *h; for ( h = herb_list; h; h = h->next ) { if( !str_prefix( herb, h->name )) { return h; } } return NULL; }; /**************************************************************************/ void list_herbs( char_data *ch ) { HERB_DATA *h; int col = 0; ch->titlebar("Existing Herbs"); for( h=herb_list; h; h= h->next ) { ch->printf( " %-20s", h->name ); if ( ++col % 4 == 0 ) ch->print( "\r\n" ); } ch->print("`x\r\n" ); return; } /**************************************************************************/ bool herbedit_name( char_data *ch, char *argument ) { HERB_DATA *herb; EDIT_HERB( ch, herb ); if ( argument[0] == '\0' ) { ch->println( "Syntax: name [name]" ); return false; } replace_string( herb->name, argument ); ch->printlnf( "Herb is now known as '%s'.", herb->name ); return true; } /**************************************************************************/ bool herbedit_season( char_data *ch, char *argument ) { HERB_DATA *herb; EDIT_HERB( ch, herb ); if ( argument[0] == '\0' ) { ch->println( "Syntax: season [winter/spring/summer/autumn]" ); ch->println( " (anything else sets the season field to Any)." ); return false; } herb->season = season_lookup( argument ); ch->printlnf( "Season set to '%s'.", herb->season >= 0 ? season_table[herb->season].name : "Any" ); return true; } /**************************************************************************/ bool herbedit_month( char_data *ch, char *argument ) { HERB_DATA *herb; int month; EDIT_HERB( ch, herb ); if ( argument[0] == '\0' ) { ch->println( "Syntax: month [1-12]" ); ch->println( " (0 sets the month field to Any)." ); return false; } month = atoi( argument ); if ( month < 0 || month > 12 ) { herbedit_month( ch, "" ); return false; } herb->month = --month; ch->printlnf( "Month set to '%d' (%s).", month+1, herb->month >= 0 ? month_name[herb->month] : "Any" ); return true; } /**************************************************************************/ bool herbedit_sector( char_data *ch, char *argument ) { HERB_DATA * herb; int value; EDIT_HERB( ch, herb ); if ( !IS_NULLSTR(argument)) { if (( value = flag_value( sector_types, argument) ) != NO_FLAG ) { herb->sector = value; ch->println( "Sector set." ); return true; } ch->printlnf( "Unrecognized sector '%s'", argument ); return false; } ch->println( "Syntax: sector [sector]" ); ch->wraplnf( "Sectors available: [`=R%s`x]", flag_string( sectorbit_flags, -1 )); return false; } /**************************************************************************/ bool herbedit_continent( char_data *ch, char *argument ) { HERB_DATA *herb; continent_type *continent; EDIT_HERB( ch, herb ); if(IS_NULLSTR(argument)){ ch->printlnf("Herb continent currently set to '%s'", herb->continent? herb->continent->name:"any"); ch->println( "Syntax: continent any (set it so herb can be found on any continent)" ); ch->println( "Syntax: continent [name]"); ch->titlebar("Valid Continents:"); continents_show(ch); return false; } if( !str_cmp(argument,"any") ){ if(!herb->continent){ ch->println("The herb continent is already set to any."); return false; } ch->printlnf("Herb continent changed from '%s' to any.", herb->continent->name); herb->continent=NULL; return true; } // lookup the continent specified continent = continent_lookup( argument ); if(!continent){ ch->printlnf("No such continent '%s'", argument); herbedit_continent( ch, "" ); // redisplay syntax and continent list return false; } if(herb->continent == continent){ ch->printlnf("Herb continent is already set to '%s'.", continent->name); return false; } ch->printlnf("Herb continent changed from '%s' to '%s'.", herb->continent?herb->continent->name:"any", continent->name); herb->continent = continent; return true; } /**************************************************************************/ bool herbedit_timefield( char_data *ch, char *argument ) { HERB_DATA *herb; int time; EDIT_HERB( ch, herb ); if ( argument[0] == '\0' ) { int i, col = 0; ch->println( "Syntax: time [name]\r\nValid times are:" ); for ( i = 0; i < TIME_MAX; i++ ) { ch->printf( " %-20s %2d`c - `x%2d ", timefield_table[i].name, timefield_table[i].lowhour, timefield_table[i].highhour ); if ( ++col % 2 == 0 ) ch->print( "\r\n" ); } ch->print( "`x\r\n" ); return false; } time = time_lookup( argument ); if ( time < 0 ) time = 0; herb->timefield = time; ch->printlnf( "Time set to '%s'.", timefield_table[time].name ); return true; } /**************************************************************************/ bool herbedit_difficulty( char_data *ch, char *argument ) { HERB_DATA *herb; int mod; EDIT_HERB( ch, herb ); if ( argument[0] == '\0' ) { int i; ch->print( "Syntax: difficulty [type]\r\nValid ones are: [`c" ); for ( i = 0; i < DIFF_MAX; i++ ) ch->printf( " %s (%d) ", modifier_table[i].name, modifier_table[i].modifier ); ch->print( "`x ]\r\n" ); return false; } mod = difficulty_lookup( argument ); if ( mod < 0 ) { ch->println( "Invalid difficulty type." ); herbedit_difficulty( ch, "" ); return false; } herb->difficulty = mod; ch->println( "Ok." ); return true; } /**************************************************************************/ bool herbedit_area( char_data *ch, char *argument ) { HERB_DATA *herb; AREA_DATA *area; int num; EDIT_HERB( ch, herb ); if ( argument[0] == '\0' ) { ch->println( "Syntax: area [areanumber] use -1 for Any area." ); return false; } num = atoi(argument); if ( num == -1 ) { ch->println( "Area field cleared." ); return true; } if ( !( area = get_area_data( num ))) { ch->printlnf( "'%s' is not a valid area number (as per alist).", argument ); return false; } herb->area = area->vnum; ch->printlnf( "Area set to '%d (%s)'.", area->vnum, area->name ); return true; } /**************************************************************************/ bool herbedit_vnum( char_data *ch, char *argument ) { HERB_DATA *herb; vn_int vnum; EDIT_HERB( ch, herb ); if ( argument[0] == '\0' ) { ch->println( "Syntax: vnum [number]" ); ch->println( " (Indicates which VNUM this data refers to." ); return false; } vnum = atoi( argument ); if ( vnum < 1 || vnum > 65535 ) { ch->println( "VNUM must be greater than 0 and less than 65536" ); return false; } herb->vnum_result = vnum; ch->printlnf( "VNUM set to '%d'.", herb->vnum_result ); return true; } /**************************************************************************/ bool herbedit_show( char_data *ch, char * ) { HERB_DATA *herb; char buf[MIL]; EDIT_HERB( ch, herb ); sprintf( buf, "%d", herb->area ); ch->printlnf( "`=rName: `x%-20s", herb->name ); ch->printlnf( "`=rSector: `x%-20s `=rContinent: `x%-20s `=rArea: `x%-20s", sect_table[herb->sector].name, herb->continent ? herb->continent->name : "Any", herb->area >= 0 ? buf : "Any" ); ch->printlnf( "`=rMonth: `x%-20s `=rSeason: `x%-20s", herb->month >= 0 ? month_name[herb->month] : "Any", herb->season >= 0 ? season_table[herb->season].name : "Any" ); ch->printf( "`=rTime: `x%-20s", timefield_table[herb->timefield].name ); if ( timefield_table[herb->timefield].highhour >= 0 ) { ch->printlnf( " `=rHours `x%-2d `=r- `x%-2d", timefield_table[herb->timefield].lowhour, timefield_table[herb->timefield].highhour ); } else { ch->print( "\r\n" ); } ch->printlnf( "`=rDifficulty: `x%s", modifier_table[herb->difficulty].name ); OBJ_INDEX_DATA *o=get_obj_index(herb->vnum_result); if(o){ ch->printlnf( "`=rResulting VNUM: `=v%d (%s)`x", herb->vnum_result, o->short_descr); }else{ ch->printlnf( "`=rResulting VNUM: `=X%d (doesn't exist!)`x", herb->vnum_result); } return false; } /**************************************************************************/ /**************************************************************************/