コード例 #1
0
TbBool parse_lenses_data_blocks(char *buf, long len, const char *config_textname, unsigned short flags)
{
    long pos;
    int i,k,n;
    int cmd_num;
    char *fname;
    struct LensConfig *lenscfg;
    // Block name and parameter word store variables
    char block_buf[COMMAND_WORD_LEN];
    char word_buf[COMMAND_WORD_LEN];
    // Initialize the array
    int arr_size;
    if ((flags & CnfLd_AcceptPartial) == 0)
    {
        arr_size = sizeof(lenses_conf.lenses)/sizeof(lenses_conf.lenses[0]);
        for (i=0; i < arr_size; i++)
        {
            lenscfg = &lenses_conf.lenses[i];
            LbMemorySet(lenscfg->code_name, 0, COMMAND_WORD_LEN);
            LbMemorySet(lenscfg->mist_file, 0, DISKPATH_SIZE);
            lenscfg->mist_lightness = 0;
            lenscfg->mist_ghost = 0;
            lenscfg->displace_kind = 0;
            lenscfg->displace_magnitude = 0;
            lenscfg->displace_period = 1;
            LbMemorySet(lenscfg->palette, 0, PALETTE_SIZE*sizeof(TbPixel));
            lenscfg->flags = 0;
            if (i < lenses_conf.lenses_count)
            {
                lenses_desc[i].name = lenscfg->code_name;
                lenses_desc[i].num = i;
            } else
            {
                lenses_desc[i].name = NULL;
                lenses_desc[i].num = 0;
            }
        }
    }
    // Load the file
    arr_size = lenses_conf.lenses_count;
    for (i=0; i < arr_size; i++)
    {
        sprintf(block_buf,"lens%d",i);
        pos = 0;
        k = find_conf_block(buf,&pos,len,block_buf);
        if (k < 0)
        {
            if ((flags & CnfLd_AcceptPartial) == 0) {
                WARNMSG("Block [%s] not found in %s file.",block_buf,config_textname);
                return false;
            }
            continue;
        }
        lenscfg = &lenses_conf.lenses[i];
#define COMMAND_TEXT(cmd_num) get_conf_parameter_text(lenses_data_commands,cmd_num)
        while (pos<len)
        {
            // Finding command number in this line
            cmd_num = recognize_conf_command(buf,&pos,len,lenses_data_commands);
            // Now store the config item in correct place
            if (cmd_num == -3) break; // if next block starts
            if ((flags & CnfLd_ListOnly) != 0) {
                // In "List only" mode, accept only name command
                if (cmd_num > 1) {
                    cmd_num = 0;
                }
            }
            n = 0;
            switch (cmd_num)
            {
            case 1: // NAME
                if (get_conf_parameter_single(buf,&pos,len,lenscfg->code_name,COMMAND_WORD_LEN) <= 0)
                {
                    CONFWRNLOG("Couldn't read \"%s\" parameter in [%s] block of %s file.",
                               COMMAND_TEXT(cmd_num),block_buf,config_textname);
                    break;
                }
                n++;
                break;
            case 2: // MIST
                if (get_conf_parameter_single(buf,&pos,len,lenscfg->mist_file,DISKPATH_SIZE) > 0)
                {
                    n++;
                }
                if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
                {
                    k = atoi(word_buf);
                    if ((k >= 0) && (k < 64))
                    {
                        lenscfg->mist_lightness = k;
                        n++;
                    }
                }
                if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
                {
                    k = atoi(word_buf);
                    if ((k >= 0) && (k < 256))
                    {
                        lenscfg->mist_ghost = k;
                        n++;
                    }
                }
                if (n < 3)
                {
                    CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                               COMMAND_TEXT(cmd_num),block_buf,config_textname);
                } else
                {
                    lenscfg->flags |= LCF_HasMist;
                }
                break;
            case 3: // DISPLACEMENT
                if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
                {
                    k = atoi(word_buf);
                    if ((k > 0) && (k < 256))
                    {
                        lenscfg->displace_kind = k;
                        n++;
                    }
                }
                if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
                {
                    k = atoi(word_buf);
                    if ((k >= 0) && (k < 512))
                    {
                        lenscfg->displace_magnitude = k;
                        n++;
                    }
                }
                if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
                {
                    k = atoi(word_buf);
                    if ((k > 0) && (k < 512))
                    {
                        lenscfg->displace_period = k;
                        n++;
                    }
                }
                if (n < 3)
                {
                    CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                               COMMAND_TEXT(cmd_num),block_buf,config_textname);
                } else
                {
                    lenscfg->flags |= LCF_HasDisplace;
                }
                break;
            case 4: // PALETTE
                if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
                {
                    fname = prepare_file_path(FGrp_StdData,word_buf);
                    if ( LbFileLoadAt(fname, lenscfg->palette) == PALETTE_SIZE)
                    {
                        n++;
                    }
                }
                if (n < 1)
                {
                    CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                               COMMAND_TEXT(cmd_num),block_buf,config_textname);
                } else
                {
                    lenscfg->flags |= LCF_HasPalette;
                }
                break;
            case 0: // comment
                break;
            case -1: // end of buffer
                break;
            default:
                CONFWRNLOG("Unrecognized command (%d) in [%s] block of %s file.",
                           cmd_num,block_buf,config_textname);
                break;
            }
            skip_conf_to_next_line(buf,&pos,len);
        }
#undef COMMAND_TEXT
    }
    return true;
}
コード例 #2
0
TbBool parse_lenses_common_blocks(char *buf, long len, const char *config_textname, unsigned short flags)
{
    long pos;
    int k,n;
    int cmd_num;
    // Block name and parameter word store variables
    char block_buf[COMMAND_WORD_LEN];
    char word_buf[COMMAND_WORD_LEN];
    // Initialize block data
    if ((flags & CnfLd_AcceptPartial) == 0)
    {
        lenses_conf.lenses_count = 1;
    }
    // Find the block
    sprintf(block_buf,"common");
    pos = 0;
    k = find_conf_block(buf,&pos,len,block_buf);
    if (k < 0)
    {
        if ((flags & CnfLd_AcceptPartial) == 0)
            WARNMSG("Block [%s] not found in %s file.",block_buf,config_textname);
        return false;
    }
#define COMMAND_TEXT(cmd_num) get_conf_parameter_text(lenses_common_commands,cmd_num)
    while (pos<len)
    {
        // Finding command number in this line
        cmd_num = recognize_conf_command(buf,&pos,len,lenses_common_commands);
        // Now store the config item in correct place
        if (cmd_num == -3) break; // if next block starts
        n = 0;
        switch (cmd_num)
        {
        case 1: // EYELENSESCOUNT
            if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
            {
                k = atoi(word_buf);
                if ((k > 0) && (k <= LENS_ITEMS_MAX))
                {
                    lenses_conf.lenses_count = k;
                    n++;
                }
            }
            if (n < 1)
            {
                CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                           COMMAND_TEXT(cmd_num),block_buf,config_textname);
            }
            break;
        case 0: // comment
            break;
        case -1: // end of buffer
            break;
        default:
            CONFWRNLOG("Unrecognized command (%d) in [%s] block of %s file.",
                       cmd_num,block_buf,config_textname);
            break;
        }
        skip_conf_to_next_line(buf,&pos,len);
    }
#undef COMMAND_TEXT
    return true;
}
コード例 #3
0
ファイル: config_objects.c プロジェクト: dsserega/keeperfx
TbBool parse_objects_object_blocks(char *buf, long len, const char *config_textname, unsigned short flags)
{
    struct ObjectConfigStats *objst;
    struct Objects *objdat;
    long pos;
    int i,k,n;
    int cmd_num;
    // Block name and parameter word store variables
    char block_buf[COMMAND_WORD_LEN];
    char word_buf[COMMAND_WORD_LEN];
    // Initialize the objects array
    int arr_size;
    if ((flags & CnfLd_AcceptPartial) == 0)
    {
        arr_size = sizeof(object_conf.object_cfgstats)/sizeof(object_conf.object_cfgstats[0]);
        for (i=0; i < arr_size; i++)
        {
            objst = &object_conf.object_cfgstats[i];
            LbMemorySet(objst->code_name, 0, COMMAND_WORD_LEN);
            objst->name_stridx = 201;
            objst->genre = 0;
            if (i < object_conf.object_types_count)
            {
                object_desc[i].name = objst->code_name;
                object_desc[i].num = i;
            } else
            {
                object_desc[i].name = NULL;
                object_desc[i].num = 0;
            }
        }
    }
    // Load the file
    arr_size = object_conf.object_types_count;
    for (i=0; i < arr_size; i++)
    {
        sprintf(block_buf,"object%d",i);
        pos = 0;
        k = find_conf_block(buf,&pos,len,block_buf);
        if (k < 0)
        {
            if ((flags & CnfLd_AcceptPartial) == 0) {
                WARNMSG("Block [%s] not found in %s file.",block_buf,config_textname);
                return false;
            }
            continue;
        }
        objst = &object_conf.object_cfgstats[i];
        objdat = get_objects_data(i);
#define COMMAND_TEXT(cmd_num) get_conf_parameter_text(objects_object_commands,cmd_num)
        while (pos<len)
        {
            // Finding command number in this line
            cmd_num = recognize_conf_command(buf,&pos,len,objects_object_commands);
            // Now store the config item in correct place
            if (cmd_num == -3) break; // if next block starts
            if ((flags & CnfLd_ListOnly) != 0) {
                // In "List only" mode, accept only name command
                if (cmd_num > 1) {
                    cmd_num = 0;
                }
            }
            n = 0;
            switch (cmd_num)
            {
            case 1: // NAME
                if (get_conf_parameter_single(buf,&pos,len,objst->code_name,COMMAND_WORD_LEN) <= 0)
                {
                    CONFWRNLOG("Couldn't read \"%s\" parameter in [%s] block of %s file.",
                        COMMAND_TEXT(cmd_num),block_buf,config_textname);
                    break;
                }
                break;
            case 2: // GENRE
                if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
                {
                    n = get_id(objects_genres_desc, word_buf);
                }
                if (n <= 0)
                {
                    CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                        COMMAND_TEXT(cmd_num),block_buf,config_textname);
                    break;
                }
                objst->genre = n;
                break;
            case 3: // RELATEDCREATURE
                if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
                {
                    n = get_id(creature_desc, word_buf);
                }
                if (n < 0)
                {
                    CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                        COMMAND_TEXT(cmd_num),block_buf,config_textname);
                    break;
                }
                objdat->related_creatr_model = n;
                break;
            case 4: // PROPERTIES
                while (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
                {
                  k = get_id(objects_properties_commands, word_buf);
                  switch (k)
                  {
                  case 1: // EXISTS_ONLY_IN_ROOM
                      objst->model_flags |= OMF_ExistsOnlyInRoom;
                      n++;
                      break;
                  case 2: // DESTROYED_ON_ROOM_CLAIM
                      objst->model_flags |= OMF_DestroyedOnRoomClaim;
                      n++;
                      break;
                  case 3: // CHOWNED_ON_ROOM_CLAIM
                      objst->model_flags |= OMF_ChOwnedOnRoomClaim;
                      n++;
                      break;
                  case 4: // DESTROYED_ON_ROOM_PLACE
                      objst->model_flags |= OMF_DestroyedOnRoomPlace;
                      n++;
                      break;
                  default:
                      CONFWRNLOG("Incorrect value of \"%s\" parameter \"%s\" in [%s] block of %s file.",
                          COMMAND_TEXT(cmd_num),word_buf,block_buf,config_textname);
                      break;
                  }
                }
                break;
            case 0: // comment
                break;
            case -1: // end of buffer
                break;
            default:
                CONFWRNLOG("Unrecognized command (%d) in [%s] block of %s file.",
                    cmd_num,block_buf,config_textname);
                break;
            }
            skip_conf_to_next_line(buf,&pos,len);
        }
#undef COMMAND_TEXT
    }
    return true;
}
コード例 #4
0
ファイル: config_trapdoor.c プロジェクト: dsserega/keeperfx
TbBool parse_trapdoor_door_blocks(char *buf, long len, const char *config_textname, unsigned short flags)
{
  struct ManfctrConfig *mconf;
  struct DoorConfigStats *doorst;
  long pos;
  int i,k,n;
  int cmd_num;
  // Block name and parameter word store variables
  char block_buf[COMMAND_WORD_LEN];
  char word_buf[COMMAND_WORD_LEN];
  SYNCDBG(19,"Starting");
  // Initialize the doors array
  int arr_size;
  if ((flags & CnfLd_AcceptPartial) == 0)
  {
      arr_size = sizeof(trapdoor_conf.door_cfgstats)/sizeof(trapdoor_conf.door_cfgstats[0]);
      for (i=0; i < arr_size; i++)
      {
          doorst = &trapdoor_conf.door_cfgstats[i];
          LbMemorySet(doorst->code_name, 0, COMMAND_WORD_LEN);
          doorst->name_stridx = GUIStr_Empty;
          doorst->tooltip_stridx = GUIStr_Empty;
          doorst->bigsym_sprite_idx = 0;
          doorst->medsym_sprite_idx = 0;
          doorst->pointer_sprite_idx = 0;
          doorst->panel_tab_idx = 0;
          if (i < trapdoor_conf.door_types_count)
          {
              door_desc[i].name = doorst->code_name;
              door_desc[i].num = i;
          } else
          {
              door_desc[i].name = NULL;
              door_desc[i].num = 0;
          }
      }
  }
  // Parse every numbered block within range
  arr_size = trapdoor_conf.door_types_count;
  for (i=0; i < arr_size; i++)
  {
    sprintf(block_buf,"door%d",i);
    pos = 0;
    k = find_conf_block(buf,&pos,len,block_buf);
    if (k < 0)
    {
        if ((flags & CnfLd_AcceptPartial) == 0) {
            WARNMSG("Block [%s] not found in %s file.",block_buf,config_textname);
            return false;
        }
        continue;
    }
    mconf = &game.doors_config[i];
    doorst = &trapdoor_conf.door_cfgstats[i];
#define COMMAND_TEXT(cmd_num) get_conf_parameter_text(trapdoor_door_commands,cmd_num)
    while (pos<len)
    {
      // Finding command number in this line
      cmd_num = recognize_conf_command(buf,&pos,len,trapdoor_door_commands);
      // Now store the config item in correct place
      if (cmd_num == -3) break; // if next block starts
      if ((flags & CnfLd_ListOnly) != 0) {
          // In "List only" mode, accept only name command
          if (cmd_num > 1) {
              cmd_num = 0;
          }
      }
      n = 0;
      switch (cmd_num)
      {
      case 1: // NAME
          if (get_conf_parameter_single(buf,&pos,len,doorst->code_name,COMMAND_WORD_LEN) <= 0)
          {
            CONFWRNLOG("Couldn't read \"%s\" parameter in [%s] block of %s file.",
                COMMAND_TEXT(cmd_num),block_buf,config_textname);
            break;
          }
          break;
      case 2: // MANUFACTURELEVEL
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
            k = atoi(word_buf);
            mconf->manufct_level = k;
            n++;
          }
          if (n < 1)
          {
            CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                COMMAND_TEXT(cmd_num),block_buf,config_textname);
          }
          break;

      case 3: // MANUFACTUREREQUIRED
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
            k = atoi(word_buf);
            mconf->manufct_required = k;
            n++;
          }
          if (n < 1)
          {
            CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                COMMAND_TEXT(cmd_num),block_buf,config_textname);
          }
          break;
      case 5: // HEALTH
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
            k = atoi(word_buf);
            door_stats[i][0].health = k;
            door_stats[i][1].health = k;
            n++;
          }
          if (n < 1)
          {
            CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                COMMAND_TEXT(cmd_num),block_buf,config_textname);
          }
          break;
      case 6: // SELLINGVALUE
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
            k = atoi(word_buf);
            mconf->selling_value = k;
            n++;
          }
          if (n < 1)
          {
            CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                COMMAND_TEXT(cmd_num),block_buf,config_textname);
          }
          break;
      case 7: // NAMETEXTID
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
            k = atoi(word_buf);
            if (k > 0)
            {
                doorst->name_stridx = k;
                n++;
            }
          }
          if (n < 1)
          {
            CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                COMMAND_TEXT(cmd_num),block_buf,config_textname);
          }
          break;
      case 8: // TOOLTIPTEXTID
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
            k = atoi(word_buf);
            if (k > 0)
            {
                doorst->tooltip_stridx = k;
                n++;
            }
          }
          if (n < 1)
          {
            CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                COMMAND_TEXT(cmd_num),block_buf,config_textname);
          }
          break;
      case 9: // CRATE
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
              n = get_id(object_desc, word_buf);
          }
          if (n < 0)
          {
              CONFWRNLOG("Incorrect crate object \"%s\" in [%s] block of %s file.",
                  word_buf,block_buf,config_textname);
              break;
          }
          object_conf.object_to_door_or_trap[n] = i;
          object_conf.workshop_object_class[n] = TCls_Door;
          trapdoor_conf.door_to_object[i] = n;
          break;
      case 10: // SYMBOLSPRITES
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
              k = atoi(word_buf);
              if (k >= 0)
              {
                  doorst->bigsym_sprite_idx = k;
                  n++;
              }
          }
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
              k = atoi(word_buf);
              if (k >= 0)
              {
                  doorst->medsym_sprite_idx = k;
                  n++;
              }
          }
          if (n < 2)
          {
              CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                  COMMAND_TEXT(cmd_num),block_buf,config_textname);
          }
          break;
      case 11: // POINTERSPRITES
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
              k = atoi(word_buf);
              if (k >= 0)
              {
                  doorst->pointer_sprite_idx = k;
                  n++;
              }
          }
          if (n < 1)
          {
            CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                COMMAND_TEXT(cmd_num),block_buf,config_textname);
          }
          break;
      case 12: // PANELTABINDEX
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
            k = atoi(word_buf);
            if (k >= 0)
            {
                doorst->panel_tab_idx = k;
                n++;
            }
          }
          if (n < 1)
          {
            CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                COMMAND_TEXT(cmd_num),block_buf,config_textname);
          }
          break;
      case 0: // comment
          break;
      case -1: // end of buffer
          break;
      default:
          CONFWRNLOG("Unrecognized command (%d) in [%s] block of %s file.",
              cmd_num,block_buf,config_textname);
          break;
      }
      skip_conf_to_next_line(buf,&pos,len);
    }
#undef COMMAND_TEXT
  }
  return true;
}
コード例 #5
0
/**
 * Analyzes given LOF file buffer. The buffer must be null-terminated.
 */
TbBool level_lof_file_parse(char *fname, char *buf, long len)
{
    struct LevelInformation *lvinfo;
    long pos;
    char word_buf[32];
    long lvnum;
    int cmd_num;
    int k,n;
    SYNCDBG(8,"Starting for \"%s\"",fname);
    if (buf == NULL)
        return false;
    lvnum = get_level_number_from_file_name(fname);
    if (lvnum < 1)
    {
        WARNLOG("Incorrect .LOF file name \"%s\", skipped.",fname);
        return false;
    }
    lvinfo = get_or_create_level_info(lvnum, LvOp_None);
    if (lvinfo == NULL)
    {
        WARNMSG("Can't get LevelInformation item to store level %ld data from LOF file.",lvnum);
        return 0;
    }
    lvinfo->location = LvLc_Custom;
    pos = 0;
#define COMMAND_TEXT(cmd_num) get_conf_parameter_text(cmpgn_map_commands,cmd_num)
    while (pos<len)
    {
        // Finding command number in this line
        cmd_num = recognize_conf_command(buf,&pos,len,cmpgn_map_commands);
        // Now store the config item in correct place
        if (cmd_num == -3) break; // if next block starts
        n = 0;
        switch (cmd_num)
        {
        case 1: // NAME_TEXT
            if (get_conf_parameter_whole(buf,&pos,len,lvinfo->name,LINEMSG_SIZE) <= 0)
            {
              WARNMSG("Couldn't read \"%s\" parameter in LOF file '%s'.",
                  COMMAND_TEXT(cmd_num),fname);
              break;
            }
            break;
        case 2: // NAME_ID
            if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
            {
              k = atoi(word_buf);
              if (k > 0)
              {
                lvinfo->name_stridx = k;
                n++;
              }
            }
            if (n < 1)
            {
              WARNMSG("Couldn't recognize \"%s\" number in LOF file '%s'.",
                  COMMAND_TEXT(cmd_num),fname);
            }
            break;
        case 3: // ENSIGN_POS
            if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
            {
                k = atoi(word_buf);
                if (k > 0)
                {
                  lvinfo->ensign_x = k;
                  n++;
                }
            }
            if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
            {
                k = atoi(word_buf);
                if (k > 0)
                {
                  lvinfo->ensign_y = k;
                  n++;
                }
            }
            if (n < 2)
            {
              WARNMSG("Couldn't recognize \"%s\" coordinates in LOF file '%s'.",
                  COMMAND_TEXT(cmd_num),fname);
            }
            break;
        case 4: // ENSIGN_ZOOM
            if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
            {
                k = atoi(word_buf);
                if (k > 0)
                {
                  lvinfo->ensign_zoom_x = k;
                  n++;
                }
            }
            if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
            {
                k = atoi(word_buf);
                if (k > 0)
                {
                  lvinfo->ensign_zoom_y = k;
                  n++;
                }
            }
            if (n < 2)
            {
              WARNMSG("Couldn't recognize \"%s\" coordinates in LOF file '%s'.",
                  COMMAND_TEXT(cmd_num),fname);
            }
            break;
        case 5: // PLAYERS
            if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
            {
              k = atoi(word_buf);
              if (k > 0)
              {
                lvinfo->players = k;
                n++;
              }
            }
            if (n < 1)
            {
              WARNMSG("Couldn't recognize \"%s\" number in LOF file '%s'.",
                  COMMAND_TEXT(cmd_num),fname);
            }
            break;
        case 6: // OPTIONS
            while ((k = recognize_conf_parameter(buf,&pos,len,cmpgn_map_cmnds_options)) > 0)
            {
              switch (k)
              {
              case LvOp_Tutorial:
                lvinfo->options |= k;
                break;
              }
              n++;
            }
            break;
        case 7: // SPEECH
            if (get_conf_parameter_single(buf,&pos,len,lvinfo->speech_before,DISKPATH_SIZE) > 0)
            {
              n++;
            }
            if (get_conf_parameter_single(buf,&pos,len,lvinfo->speech_after,DISKPATH_SIZE) > 0)
            {
              n++;
            }
            if (n < 2)
            {
              WARNMSG("Couldn't recognize \"%s\" file names in LOF file '%s'.",
                  COMMAND_TEXT(cmd_num),fname);
            }
            break;
        case 8: // LAND_VIEW
            if (get_conf_parameter_single(buf,&pos,len,lvinfo->land_view,DISKPATH_SIZE) > 0)
            {
              n++;
            }
            if (get_conf_parameter_single(buf,&pos,len,lvinfo->land_window,DISKPATH_SIZE) > 0)
            {
              n++;
            }
            if (n < 2)
            {
              WARNMSG("Couldn't recognize \"%s\" file names in LOF file '%s'.",
                  COMMAND_TEXT(cmd_num),fname);
            }
            break;
        case 9: // KIND
            while ((k = recognize_conf_parameter(buf,&pos,len,cmpgn_map_cmnds_kind)) > 0)
            {
              switch (k)
              {
              case LvOp_IsSingle:
                if ((lvinfo->options & LvOp_IsSingle) == 0)
                {
                    if (add_single_level_to_campaign(&campaign,lvinfo->lvnum) >= 0)
                        n++;
                    lvinfo->options |= LvOp_IsSingle;
                } else
                    n++;
                break;
              case LvOp_IsMulti:
                if ((lvinfo->options & LvOp_IsMulti) == 0)
                {
                    if (add_multi_level_to_campaign(&campaign,lvinfo->lvnum) >= 0)
                        n++;
                    lvinfo->options |= LvOp_IsMulti;
                } else
                    n++;
                break;
              case LvOp_IsBonus:
                if ((lvinfo->options & LvOp_IsBonus) == 0)
                {
                    if (add_bonus_level_to_campaign(&campaign,lvinfo->lvnum) >= 0)
                        n++;
                    lvinfo->options |= LvOp_IsBonus;
                } else
                    n++;
                break;
              case LvOp_IsExtra:
                if ((lvinfo->options & LvOp_IsExtra) == 0)
                {
                    if (add_extra_level_to_campaign(&campaign,lvinfo->lvnum) >= 0)
                        n++;
                    lvinfo->options |= LvOp_IsExtra;
                } else
                    n++;
                break;
              case LvOp_IsFree:
                if ((lvinfo->options & LvOp_IsFree) == 0)
                {
                    if (add_freeplay_level_to_campaign(&campaign,lvinfo->lvnum) >= 0)
                        n++;
                    lvinfo->options |= LvOp_IsFree;
                } else
                    n++;
                break;
              }
              if (n < 1)
              {
                  WARNMSG("Level %ld defined in '%s' wasn't added to any list; "
                      "kind is wrong or there's no space.",(long)lvinfo->lvnum,fname);
              }
            }
            break;
        case 10: // AUTHOR
        case 11: // DESCRIPTION
        case 12: // DATE
            // As for now, ignore these
            break;
        case 0: // comment
            break;
        case -1: // end of buffer
            break;
        default:
            WARNMSG("Unrecognized command (%d) in LOF file '%s', starting on byte %d.",cmd_num,fname,pos);
            break;
        }
        skip_conf_to_next_line(buf,&pos,len);
    }
    SYNCDBG(18,"Level %ld ensign (%d,%d) zoom (%d,%d)",(long)lvinfo->lvnum,(int)lvinfo->ensign_x,(int)lvinfo->ensign_y,(int)lvinfo->ensign_zoom_x,(int)lvinfo->ensign_zoom_y);
#undef COMMAND_TEXT
    return true;
}
コード例 #6
0
TbBool parse_effects_effect_blocks(char *buf, long len, const char *config_textname, unsigned short flags)
{
  struct EffectConfigStats *effcst;
  long pos;
  int i,k,n;
  int cmd_num;
  // Block name and parameter word store variables
  char block_buf[COMMAND_WORD_LEN];
  char word_buf[COMMAND_WORD_LEN];
  SYNCDBG(19,"Starting");
  // Initialize the effects array
  int arr_size;
  if ((flags & CnfLd_AcceptPartial) == 0)
  {
      arr_size = sizeof(effects_conf.effect_cfgstats)/sizeof(effects_conf.effect_cfgstats[0]);
      for (i=0; i < arr_size; i++)
      {
          effcst = &effects_conf.effect_cfgstats[i];
          LbMemorySet(effcst->code_name, 0, COMMAND_WORD_LEN);
          if (i < 69)
              effcst->old = &effect_info[i];
          else
              effcst->old = &effect_info[0];
          if (i < effects_conf.effect_types_count)
          {
              effect_desc[i].name = effcst->code_name;
              effect_desc[i].num = i;
          } else
          {
              effect_desc[i].name = NULL;
              effect_desc[i].num = 0;
          }
      }
  }
  // Parse every numbered block within range
  arr_size = effects_conf.effect_types_count;
  for (i=0; i < arr_size; i++)
  {
    sprintf(block_buf,"effect%d",i);
    SYNCDBG(19,"Block [%s]",block_buf);
    pos = 0;
    k = find_conf_block(buf,&pos,len,block_buf);
    if (k < 0)
    {
        if ((flags & CnfLd_AcceptPartial) == 0) {
            WARNMSG("Block [%s] not found in %s file.",block_buf,config_textname);
            return false;
        }
        continue;
    }
    effcst = &effects_conf.effect_cfgstats[i];
#define COMMAND_TEXT(cmd_num) get_conf_parameter_text(effects_effect_commands,cmd_num)
    while (pos<len)
    {
      // Finding command number in this line
      cmd_num = recognize_conf_command(buf,&pos,len,effects_effect_commands);
      SYNCDBG(19,"Command %s",COMMAND_TEXT(cmd_num));
      // Now store the config item in correct place
      if (cmd_num == -3) break; // if next block starts
      if ((flags & CnfLd_ListOnly) != 0) {
          // In "List only" mode, accept only name command
          if (cmd_num > 1) {
              cmd_num = 0;
          }
      }
      n = 0;
      switch (cmd_num)
      {
      case 1: // NAME
          if (get_conf_parameter_single(buf,&pos,len,effcst->code_name,COMMAND_WORD_LEN) <= 0)
          {
              CONFWRNLOG("Couldn't read \"%s\" parameter in [%s] block of %s file.",
                  COMMAND_TEXT(cmd_num),block_buf,config_textname);
              break;
          }
          break;
      case 2: // HEALTH
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
              k = atoi(word_buf);
              effcst->old->start_health = k;
              n++;
          }
          if (n < 1)
          {
              CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                  COMMAND_TEXT(cmd_num),block_buf,config_textname);
          }
          break;
      case 3: // GENERATIONTYPE
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
              k = atoi(word_buf);
              effcst->old->generation_type = k;
              n++;
          }
          if (n < 1)
          {
              CONFWRNLOG("Incorrect value of \"%s\" parameter in [%s] block of %s file.",
                  COMMAND_TEXT(cmd_num),block_buf,config_textname);
          }
          break;
      case 4: // GENERATIONACCELXYRANGE
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
              k = atoi(word_buf);
              effcst->old->accel_xy_min = k;
              n++;
          }
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
              k = atoi(word_buf);
              effcst->old->accel_xy_max = k;
              n++;
          }
          if (n < 2)
          {
              CONFWRNLOG("Couldn't read all values of \"%s\" parameter in [%s] block of %s file.",
                  COMMAND_TEXT(cmd_num),block_buf,config_textname);
          }
          break;
      case 5: // GENERATIONACCELZRANGE
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
              k = atoi(word_buf);
              effcst->old->accel_z_min = k;
              n++;
          }
          if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
          {
              k = atoi(word_buf);
              effcst->old->accel_z_max = k;
              n++;
          }
          if (n < 2)
          {
              CONFWRNLOG("Couldn't read all values of \"%s\" parameter in [%s] block of %s file.",
                  COMMAND_TEXT(cmd_num),block_buf,config_textname);
          }
          break;
      case 6: // GENERATIONKINDRANGE
          //TODO CONFIG Add effect parameter reading
          break;
      case 7: // AREAAFFECTTYPE
          //TODO CONFIG Add effect parameter reading
          break;
      case 0: // comment
          break;
      case -1: // end of buffer
          break;
      default:
          CONFWRNLOG("Unrecognized command (%d) in [%s] block of %s file.",
              cmd_num,block_buf,config_textname);
          break;
      }
      skip_conf_to_next_line(buf,&pos,len);
      //write_effects_effect_to_log(effcst, i);
    }
#undef COMMAND_TEXT
  }
  return true;
}
コード例 #7
0
ファイル: config_cubes.c プロジェクト: joaocc/keeperfx-git
TbBool parse_cubes_cube_blocks(char *buf, long len, const char *config_textname, unsigned short flags)
{
    struct CubeConfigStats *objst;
    struct CubeAttribs * cubed;
    long pos;
    int i,k,n;
    int cmd_num;
    // Block name and parameter word store variables
    char block_buf[COMMAND_WORD_LEN];
    char word_buf[COMMAND_WORD_LEN];
    // Initialize the cubes array
    int arr_size;
    if ((flags & CnfLd_AcceptPartial) == 0)
    {
        arr_size = sizeof(cube_conf.cube_cfgstats)/sizeof(cube_conf.cube_cfgstats[0]);
        for (i=0; i < arr_size; i++)
        {
            objst = &cube_conf.cube_cfgstats[i];
            LbMemorySet(objst->code_name, 0, COMMAND_WORD_LEN);
            if (i < cube_conf.cube_types_count)
            {
                cube_desc[i].name = objst->code_name;
                cube_desc[i].num = i;
            } else
            {
                cube_desc[i].name = NULL;
                cube_desc[i].num = 0;
            }
        }
    }
    // Load the file
    arr_size = cube_conf.cube_types_count;
    for (i=0; i < arr_size; i++)
    {
        sprintf(block_buf,"cube%d",i);
        pos = 0;
        k = find_conf_block(buf,&pos,len,block_buf);
        if (k < 0)
        {
            if ((flags & CnfLd_AcceptPartial) == 0) {
                WARNMSG("Block [%s] not found in %s file.",block_buf,config_textname);
                return false;
            }
            continue;
        }
        objst = &cube_conf.cube_cfgstats[i];
        cubed = &game.cubes_data[i];
#define COMMAND_TEXT(cmd_num) get_conf_parameter_text(cubes_cube_commands,cmd_num)
        while (pos<len)
        {
            // Finding command number in this line
            cmd_num = recognize_conf_command(buf,&pos,len,cubes_cube_commands);
            // Now store the config item in correct place
            if (cmd_num == -3) break; // if next block starts
            if ((flags & CnfLd_ListOnly) != 0) {
                // In "List only" mode, accept only name command
                if (cmd_num > 1) {
                    cmd_num = 0;
                }
            }
            n = 0;
            switch (cmd_num)
            {
            case 1: // NAME
                if (get_conf_parameter_single(buf,&pos,len,objst->code_name,COMMAND_WORD_LEN) <= 0)
                {
                    CONFWRNLOG("Couldn't read \"%s\" parameter in [%s] block of %s file.",
                        COMMAND_TEXT(cmd_num),block_buf,config_textname);
                    break;
                }
                break;
            case 2: // TEXTURES
                while (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
                {
                    k = atoi(word_buf);
                    if (n >= CUBE_TEXTURES)
                    {
                      CONFWRNLOG("Too many \"%s\" parameters in [%s] block of %s file.",
                          COMMAND_TEXT(cmd_num),block_buf,config_textname);
                      break;
                    }
                    cubed->texture_id[n] = k;
                    n++;
                }
                if (n < CUBE_TEXTURES)
                {
                    CONFWRNLOG("Couldn't read all \"%s\" parameters in [%s] block of %s file.",
                        COMMAND_TEXT(cmd_num),block_buf,config_textname);
                }
                break;
            case 3: // FLAGS
                while (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0)
                {
                    k = atoi(word_buf);
                    if (n >= CUBE_TEXTURES)
                    {
                      CONFWRNLOG("Too many \"%s\" parameters in [%s] block of %s file.",
                          COMMAND_TEXT(cmd_num),block_buf,config_textname);
                      break;
                    }
                    cubed->field_C[n] = k;
                    n++;
                }
                if (n < CUBE_TEXTURES)
                {
                    CONFWRNLOG("Couldn't read all \"%s\" parameters in [%s] block of %s file.",
                        COMMAND_TEXT(cmd_num),block_buf,config_textname);
                }
                break;
            case 0: // comment
                break;
            case -1: // end of buffer
                break;
            default:
                CONFWRNLOG("Unrecognized command (%d) in [%s] block of %s file.",
                    cmd_num,block_buf,config_textname);
                break;
            }
            skip_conf_to_next_line(buf,&pos,len);
        }
#undef COMMAND_TEXT
    }
    return true;
}