Game Maker: INI-bestanden zonder foutmeldingen

Bij het lezen en schrijven van bestanden kunnen verschillende fouten optreden, bijvoorbeeld doordat het bestand om een of andere reden niet toegankelijk is. In Game Maker kunnen in de Global Game Settings de foutmeldingen uiteraard worden uitgeschakeld, maar dan worden andere foutmeldingen van het spel ook niet meer weergegeven, wat soms ingewikkeld kan zijn.

Vanwege dit probleem heeft NGMC-lid Matrebatre een DLL geproduceerd om bestanden langs een alternatieve weg te lezen, waarbij fouten op een eigen manier kunnen worden afgehandeld. [Download deze File DLL van Matrebatre]

Nu bevat dit pakket echter geen ingebouwde ondersteuning voor INI-bestanden. Ik heb zelf echter een scriptpakket geschreven, de INI-datastructuurextensie, om INI-bestanden te lezen en bewerken op een geavanceerdere manier dan Game Maker normaliter ondersteunt. Dit pakket kan worden opgehaald bij Blijbol. [Download mijn INI-datastructuurextensie]

Door deze twee pakketten te combineren, kunnen INI-bestanden worden gelezen en alle eventuele hierbij optredende fouten intern worden verwerkt. Om te beginnen moet u beide pakketten afzonderlijk downloaden en vervolgens aan uw spel toevoegen. Daarna moeten onderstaande twee scripts worden toegevoegd aan het spel. Deze scripts zijn alternatieve laad- en opslagprocessen voor mijn INI-systeem die gebruik maken van de genoemde DLL:

// Copyright (C) 2007-2008 Jeroen van der Gun
// Deze code valt onder de licentie van de INI-datastructuurextensie.

// ds_ini_load_matrebatre(ini,fname)

// Alternatieve laadprocedure voor de INI-datastructuurextensie
// m.b.v. de File DLL van Matrebatre.

if((ds_ini_sign_left == '' && ds_ini_sign_right == '')
   || ds_ini_sign_equal == '' || ds_ini_sign_comment == '') return -1;
var length_left, length_right, length_equal, length_comment,
    file, errors, neof, sec, line, pos, length, name;
file = f_text_open(argument1, 1);
if(file <= 0)
 return -1;
ds_ini_clear(argument0);
length_left = string_length(ds_ini_sign_left);
length_right = string_length(ds_ini_sign_right);
length_equal = string_length(ds_ini_sign_equal);
length_comment = string_length(ds_ini_sign_comment);
errors = 0;
neof = true;
sec = -1;
while(neof)
{
 neof = f_text_readline(file);
 if(neof == -1)
 {
  errors += 1;
  neof = true;
  continue;
 }
 if(f_text_memoryerror(file))
 {
  errors += 1;
  continue;
 }
 line = f_text_read_string(file);
 if(line == '') continue;
 if(string_copy(line, 1, length_comment) == ds_ini_sign_comment) continue;
 length = string_length(line);
 pos = string_pos(ds_ini_sign_equal, line);
 if(pos == 0)
 {
  if(string_copy(line, 1, length_left) == ds_ini_sign_left
     && string_copy(line, length - length_right + 1, length_right)
     == ds_ini_sign_right)
  {
   name = string_copy(line, length_left + 1,
                      length - length_left - length_right);
   if(name == '' || ds_map_exists(argument0, name))
   {
    errors += 1;
    sec = -1;
    continue;
   }
   sec = ds_map_create();
   ds_map_add(argument0, name, sec);
  }
  else errors += 1;
  continue;
 }
 if(sec == -1)
 {
  errors += 1;
  continue;
 }
 name = string_copy(line, 1, pos - 1);
 if(name == '' || ds_map_exists(sec, name)) errors += 1;
 else ds_map_add(sec, name, string_copy(line, pos + length_equal,
                                        length - length_equal + 1));
}
f_text_close(file);
return errors;
// Copyright (C) 2007-2008 Jeroen van der Gun
// Deze code valt onder de licentie van de INI-datastructuurextensie.

// ds_ini_save_matrebatre(ini,fname)

// Alternatieve opslagprocedure voor de INI-datastructuurextensie
// m.b.v. de File DLL van Matrebatre.

var file, sec, map, key;
file = f_text_open(argument1, 2);
if(file <= 0)
 return false;
if(ds_ini_head != '')
{
 f_text_write_string(file, ds_ini_sign_comment + ds_ini_head);
 f_text_writeline(file, true);
}
for(sec = ds_map_find_first(argument0);
    is_string(sec); sec = ds_map_find_next(argument0, sec))
{
 if(ds_ini_empty_lines) f_text_writeline(file, true);
 f_text_write_string(file, ds_ini_sign_left + sec + ds_ini_sign_right);
 f_text_writeline(file, true);
 map = ds_map_find_value(argument0, sec);
 for(key = ds_map_find_first(map);
     is_string(key); key = ds_map_find_next(map, key))
 {
  f_text_write_string(file, key + ds_ini_sign_equal
                            + ds_map_find_value(map, key));
  f_text_writeline(file, true);
 }
}
f_text_close(file);
return true;

U gebruikt deze scripts hetzelfde als de normale functies voor laden en opslaan uit mijn INI-pakket, met als uitzondering dat het opslagscript nu retourneert of het doelbestand kon worden geopend. Daarnaast geven beide scripts geen foutmeldingen als een bestand niet kon worden geopend en worden bij het lezen regels genegeerd (en als regels met INI-syntaxfouten geteld) waarvoor niet genoeg geheugen beschikbaar is.

0 reacties

Voeg een reactie toe