===== Pros/Cons for new method: =====
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?
===== Example old saving code: =====
fprintf( fp, "#VER %d\n", CURR_AREA_VERSION );
for ( i = 0; i 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);
}
===== Example new saving code: =====
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 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 );
===== Example old format (Bastion) =====
#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
===== Example new format (Bastion) =====
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",
},
},
}
===== Example old format (Remort 6) =====
#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
===== Example new format (Remort 6) =====
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 =
{
},
}
===== Example old loading code: =====
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
}
}
===== Example new loading code: =====
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);