User Tools

Site Tools


vodur:luaafile

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 <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);
      }

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 <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 );

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);
vodur/luaafile.txt · Last modified: 2015/11/11 04:40 by vodur