Pros:
Less messy/problematic to add/remove/change stuff in area files now.
Can easily parse area files with outside scripts for analysis.
Cons:
Less performant (bigger filesize, slower save/load)
Confusing to use new save/load code?
fprintf( fp, "#VER %d\n", CURR_AREA_VERSION ); for ( i = 0; i <MAX_AREA_CLONE; i++ ) if ( pArea->clones[i]> 0 ) fprintf( fp, "#CLONE %d\n", pArea->clones[i] ); fprintf( fp, "\n#AREADATA\n" ); rfprintf( fp, "Name %s~\n", pArea->name ); rfprintf( fp, "Builders %s~\n", fix_string( pArea->builders ) ); rfprintf( fp, "Comments %s~\n", fix_string( pArea->comments ) ); fprintf( fp, "VNUMs %d %d\n", pArea->min_vnum, pArea->max_vnum ); rfprintf( fp, "Credits %s~\n", pArea->credits ); /* Added minlevel, maxlevel, and miniquests for new areas command -Astark Dec 2012 */ fprintf( fp, "Minlevel %d\n", pArea->minlevel ); fprintf( fp, "Maxlevel %d\n", pArea->maxlevel ); fprintf( fp, "Miniquests %d\n", pArea->miniquests ); fprintf( fp, "Security %d\n", pArea->security ); fprintf( fp, "Time %d\n", pArea->reset_time ); if (IS_SET(pArea->area_flags,AREA_REMORT)) fprintf( fp, "Remort\n"); if (IS_SET(pArea->area_flags,AREA_NOQUEST)) fprintf( fp, "NoQuest\n"); if (IS_SET(pArea->area_flags,AREA_NOHIDE)) fprintf( fp, "NoHide\n"); if ( IS_SET(pArea->area_flags, AREA_SOLO) ) fprintf(fp, "Solo\n"); /* save aprogs if any */ if (pArea->aprogs != NULL) { PROG_LIST *pAprog; reverse_aprog_order(pArea); for (pAprog = pArea->aprogs; pAprog; pAprog = pAprog->next) { rfprintf(fp, "AProg %s %d %s~\n", name_lookup(pAprog->trig_type, a prog_flags), pAprog->vnum, pAprog->trig_phrase); } reverse_aprog_order(pArea); }
LStbl area; LStbl_create( LS, &area ); LStbl_kv_int( LS, &area, "Version", CURR_AREA_VERSION); LSarr clones; LSarr_create( LS, &clones); LStbl_kv_arr( LS, &area, "Clones", &clones); for ( i = 0; i <MAX_AREA_CLONE; i++ ) if ( pArea->clones[i]> 0 ) LSarr_add_int( LS, &clones, pArea->clones[i]); LSarr_release( LS, &clones); LStbl_kv_str( LS, &area, "Name", pArea->name ); LStbl_kv_str( LS, &area, "Builders", fix_string( pArea->builders ) ); LStbl_kv_str( LS, &area, "Comments", fix_string( pArea->comments ) ); LStbl_kv_int( LS, &area, "MinVnum", pArea->min_vnum); LStbl_kv_int( LS, &area, "MaxVnum", pArea->max_vnum); LStbl_kv_str( LS, &area, "Credits", pArea->credits); /* Added minlevel, maxlevel, and miniquests for new areas command -Astark Dec 2012 */ LStbl_kv_int( LS, &area, "MinLevel", pArea->minlevel); LStbl_kv_int( LS, &area, "MaxLevel", pArea->maxlevel); LStbl_kv_int( LS, &area, "Miniquests", pArea->miniquests); LStbl_kv_int( LS, &area, "Security", pArea->security); LStbl_kv_int( LS, &area, "Time", pArea->reset_time); LSarr aflags; LSarr_create( LS, &aflags); LStbl_kv_arr( LS, &area, "Flags", &aflags); if (IS_SET(pArea->area_flags,AREA_REMORT)) LSarr_add_str( LS, &aflags, flag_bit_name(area_flags, AREA_REMORT)); if (IS_SET(pArea->area_flags,AREA_NOQUEST)) LSarr_add_str( LS, &aflags, flag_bit_name(area_flags, AREA_NOQUEST)); if (IS_SET(pArea->area_flags,AREA_NOHIDE)) LSarr_add_str( LS, &aflags, flag_bit_name(area_flags, AREA_NOHIDE)); if ( IS_SET(pArea->area_flags, AREA_SOLO) ) LSarr_add_str( LS, &aflags, flag_bit_name(area_flags, AREA_SOLO)); LSarr_release( LS, &aflags); ​LSarr atrigs; LSarr_create( LS, &atrigs ); LStbl_kv_arr( LS, &area, "ATrigs", &atrigs); if (pArea->aprogs != NULL) { PROG_LIST *pAprog; reverse_aprog_order(pArea); for (pAprog = pArea->aprogs; pAprog; pAprog = pAprog->next) { LStbl atrig; LStbl_create( LS, &atrig); LSarr_add_tbl( LS, &atrigs, &atrig); LStbl_kv_str( LS, &atrig, "Type", name_lookup(pAprog->trig_type, a prog_flags)); LStbl_kv_int( LS, &atrig, "Vnum", pAprog->vnum); LStbl_kv_str( LS, &atrig, "Phrase", pAprog->trig_phrase); LStbl_release( LS, &atrig); } reverse_aprog_order(pArea); } LSarr_release( LS, &atrigs); LStbl_save( LS, &area, "Test1.lua"); LStbl_release( LS, &area );
#VER 3 #AREADATA Name Bastion~ Builders Parademia Rynor~ Notes ~ VNUMs 10200 10599 Credits Siva~ Minlevel 1 Maxlevel 100 Miniquests 9 Security 8 Time 15 AProg enter 10200 100~ End
return { Version = 6, Clones = { }, Name = "Bastion", Builders = "Parademia Rynor", Comments = "", MinVnum = 10200, MaxVnum = 10599, Credits = "Siva", MinLevel = 1, MaxLevel = 100, Miniquests = 9, Security = 8, Time = 15, Flags = { }, ATrigs = { { Type = "enter", Vnum = 10200, Phrase = "100", }, }, }
#VER 3 #CLONE 24451 #CLONE 16700 #AREADATA Name Lost Library~ Builders Xyzlvador Churel~ Notes ~ VNUMs 101 299 Credits Remort 6, Xzylvador~ Minlevel 0 Maxlevel 0 Miniquests 0 Security 9 Time 15 Remort End
return { Version = 6, Clones = { 24451, 16700, }, Name = "Lost Library", Builders = "Xyzlvador Churel", Comments = "", MinVnum = 101, MaxVnum = 299, Credits = "Remort 6, Xzylvador", MinLevel = 0, MaxLevel = 0, Miniquests = 0, Security = 9, Time = 15, Flags = { "remort", }, ATrigs = { }, }
for ( ; ; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER(word[0]) ) { /* Added for the new areas command - Astark Dec 2012 */ case 'A': if (!str_cmp(word, "AProg") ) { PROG_LIST *pAprog; const char *word; int trigger = 0; pAprog = alloc_ATRIG(); word = fread_word( fp ); if ( (trigger = flag_lookup( word, aprog_flags )) == NO_FLAG ) { bugf("load_area.AProg: invalid trigger '%s' for area %s.", word, pArea->name); exit(1); } SET_BIT(pArea->aprog_flags, trigger ); pAprog->trig_type = trigger; pAprog->vnum = fread_number( fp ); pAprog->trig_phrase = fread_string( fp ); pAprog->next = pArea->aprogs; pArea->aprogs = pAprog; } break; case 'M': KEY("Minlevel", pArea->minlevel, fread_number( fp )); KEY("Maxlevel", pArea->maxlevel, fread_number( fp )); KEY("Miniquests", pArea->miniquests, fread_number( fp )); case 'N': SKEY( "Name", pArea->name ); if ( !str_cmp(word, "NoQuest")) { SET_BIT(pArea->area_flags,AREA_NOQUEST); break; } if ( !str_cmp(word, "NoHide")) { SET_BIT(pArea->area_flags,AREA_NOHIDE); break; } SKEY( "Comments", pArea->comments ); break; case 'R': if ( !str_cmp(word, "Remort")) SET_BIT(pArea->area_flags,AREA_REMORT); break; case 'S': KEY( "Security", pArea->security, fread_number( fp ) ); if ( !str_cmp(word, "Solo") ) { SET_BIT(pArea->area_flags, AREA_SOLO); break; } break; case 'T': KEY("Time", pArea->reset_time, fread_number( fp )); case 'V': if ( !str_cmp( word, "VNUMs" ) ) { pArea->min_vnum = fread_number( fp ); pArea->max_vnum = fread_number( fp ); } break; case 'E': if ( !str_cmp( word, "End" ) ) { fMatch = TRUE; if ( area_first == NULL ) area_first = pArea; if ( area_last != NULL ) area_last->next = pArea; area_last = pArea; pArea->next = NULL; current_area = pArea; top_area++; return; } break; case 'B': SKEY( "Builders", pArea->builders ); break; case 'C': SKEY( "Credits", pArea->credits ); break; } if ( !fMatch ) { // no nothing but avoid warning } }
LLtbl area; LLtbl_load( LS, &area, "Test1.lua"); int file_version = LLtbl_get_kv_int( LS, &area, "Version"); LLtbl clones; LLtbl_get_kv_tbl( LS, &area, "Clones", &clones); ind=0; while ( LLtbl_i_exists( LS, &clones, ++ind ) ) { pArea->clones[ind-1] = LLtbl_get_iv_int( LS, &clones, ind); } LLtbl_release( LS, &clones); pArea->name=LLtbl_get_kv_str( LS, &area, "Name"); pArea->builders=LLtbl_get_kv_str( LS, &area, "Builders"); pArea->comments=LLtbl_get_kv_str( LS, &area, "Comments"); pArea->min_vnum=LLtbl_get_kv_int( LS, &area, "MinVnum"); pArea->max_vnum=LLtbl_get_kv_int( LS, &area, "MaxVnum"); pArea->credits=LLtbl_get_kv_str( LS, &area, "Credits"); pArea->minlevel=LLtbl_get_kv_int( LS, &area, "MinLevel"); pArea->maxlevel=LLtbl_get_kv_int( LS, &area, "MaxLevel"); pArea->miniquests=LLtbl_get_kv_int( LS, &area, "Miniquests"); pArea->security=LLtbl_get_kv_int( LS, &area, "Security"); pArea->reset_time=LLtbl_get_kv_int( LS, &area, "Time" ); LLtbl aflag; LLtbl_get_kv_tbl( LS, &area, "Flags", &aflag); ind=0; while ( LLtbl_i_exists( LS, &aflag, ++ind) ) { const char *flag=LLtbl_get_iv_str( LS, &aflag, ind); int bit=flag_lookup( flag, area_flags); if ( bit == NO_FLAG ) { bugf("No such area_flag: %s", flag); exit(1); } SET_BIT( pArea->area_flags, bit); free_string(flag); } LLtbl_release( LS, &aflag); LLtbl atrigs; LLtbl_get_kv_tbl( LS, &area, "ATrigs", &atrigs); ind=0; while ( LLtbl_i_exists( LS, &atrigs, ++ind) ) { LLtbl atrig; LLtbl_get_iv_tbl( LS, &atrigs, ind, &atrig); PROG_LIST *pAprog = alloc_ATRIG(); const char *trigtype=LLtbl_get_kv_str( LS, &atrig, "Type"); int trigger; if ( (trigger = flag_lookup( trigtype, aprog_flags)) == NO_FLAG ) { bugf("invalid aprog_flag: '%s'", trigtype); exit(1); } free_string(trigtype); SET_BIT(pArea->aprog_flags, trigger); pAprog->trig_type = trigger; pAprog->vnum = LLtbl_get_kv_int( LS, &atrig, "Vnum"); pAprog->trig_phrase=LLtbl_get_kv_str(LS, &atrig, "Phrase"); LLtbl_release(LS, &atrig); } LLtbl_release( LS, &atrigs); LLtbl_release( LS, &area);