var a,b,c,d,e,f;
f=get_save_filename("Sokoban File|*.skb|Binary File|*.bin|All Files|*","")
if f!="" then
{
c=file_bin_open(f,1)
file_bin_rewrite(c)
file_bin_write_byte(c,global.blocktype)
for(a=0;a*32<15;a+=1){for(b=0;b*32<15;b+=1){
e=(instance_position(a*32,b*32,all))
if e!=-1 then
{
switch(e.object_index){
case obj_mkb:file_bin_write_byte(c,1);break;
case obj_mkbx:file_bin_write_byte(c,2);break;
case obj_mktg:file_bin_write_byte(c,3);break;
case obj_mkp:file_bin_write_byte(c,4);break;
}
}
else
{
file_bin_write_byte(c,0)
}
}}
file_bin_write_byte(c,string_length(global.sel) mod 256)
file_bin_write_byte(c,string_length(global.sel) div 256)
for(a=0;a<string_length(global.sel);a+=1)
{
file_bin_write_byte(c,ord(string_char_at(global.sel,a)))
}
file_bin_close(c)
}
Nosé lo que pasa, solo me genera un archivo de 4 bytes en ves de uno con más bytes. deberías ser algo alredero de 128 bytes el archivos, pero solo llega a los 4 bytes, ¿cual es el problema? :'(
Me parece que esto sucede porque se escribe un byte con:
file_bin_write_byte(c,global.blocktype); //(+1 byte)
Luego entra en los ciclos una sola vez, entra en el for de a y luego entra al for de b, como la siguiente instruccion:
e=(instance_position(a*32,b*32,all))
se evalúa como:
if e!=-1
lo cual es falso siempre, puesto que "instance_position(...)" devuelve Noone y no "-1", entonces entra por el lado del false y se ejecuta:
file_bin_write_byte(c,0) //(+1 byte)
Finalmente como la condicion de los ciclos salta a la primera porque a = 1 y la condicion es a*32<15 entonces 32 < 15 es falso, se salta. Asi pasan a ejecutarse:
file_bin_write_byte(c,string_length(global.sel) mod 256) //(+1 byte)
file_bin_write_byte(c,string_length(global.sel) div 256) // (+1 byte)
Entonces finaliza el programa y te quedan 4 bytes.
Esa es mi deducción, pero deberías debuggear a fondo para ver que está sucediendo a ciencia cierta XD
Cita de: Black_Cat en Noviembre 29, 2014, 01:50:13 AM
Me parece que esto sucede porque se escribe un byte con:
file_bin_write_byte(c,global.blocktype); //(+1 byte)
Luego entra en los ciclos una sola vez, entra en el for de a y luego entra al for de b, como la siguiente instruccion:
e=(instance_position(a*32,b*32,all))
se evalúa como:
if e!=-1
lo cual es falso siempre, puesto que "instance_position(...)" devuelve Noone y no "-1", entonces entra por el lado del false y se ejecuta:
file_bin_write_byte(c,0) //(+1 byte)
Finalmente como la condicion de los ciclos salta a la primera porque a = 1 y la condicion es a*32<15 entonces 32 < 15 es falso, se salta. Asi pasan a ejecutarse:
file_bin_write_byte(c,string_length(global.sel) mod 256) //(+1 byte)
file_bin_write_byte(c,string_length(global.sel) div 256) // (+1 byte)
Entonces finaliza el programa y te quedan 4 bytes.
Esa es mi deducción, pero deberías debuggear a fondo para ver que está sucediendo a ciencia cierta XD
gracias, revisé mi código y lo arreglé.