Information about object: object0

Sprite: <no sprite>
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent: <no parent>
Mask: <same as sprite>

Create Event:
execute code:

draw_set_font(font0);
room_speed=60;
room_caption="WAD -- Xtractor v 1.2!   WAD - 1паковщик v 1.2!"
visible=true;
buff=10240
byte[buff]=0
x=0;y=0;image_speed=0;image_index=0;
str_null="0000000000"
b[1]=1;
b[2]=256;
b[3]=65536;
b[4]=16777216;
i=0;
addr=0;
volume=0;
part=0;
ar[2,2]=0;
status=0;
pusto=0
text="";
wad_is_open=false;
tit_is_open=false;
save_is_open=false;
load_is_open=false;
mess=""; has_prog=false;
/*prog='CONCATENATOR.EXE';
prog_txt='CONCATENATOR.TXT'

has_prog=false;
if file_exists (temp_directory+"\"+prog) {has_prog=true; prog_path=temp_directory+"\"+prog} else
if file_exists (program_directory+"\"+prog) {has_prog=true; prog_path=program_directory+"\"+prog};
if has_prog=false mess="Внимание! Модуль '"+prog+"' Не найден! Его нет в наличии этого архиватора и он не найден в папке с программой. Его функции будут недоступны."
*/
mode=show_question("WAD -- Xtractor v 1.2!#WAD - 1паковщик v 1.2!#"+mess+"#Вы хотите извлечь файлы из архива?##'Yes' = Извлечение WAD.#'No' = Создание WAD из файлов.")
if (mode) {
    show_message('Выберите WAD:');
    file=get_open_filename("*","");
    if file="" {show_message("Распаковка отменена!");game_end();exit}
    if not file_exists(file) {show_message("Файл не существует!");game_end();exit}
    filename=filename_change_ext(file,"");
    wad=file_bin_open(file,0);wad_is_open=true
    size=file_bin_size(wad)
    if size<10 {show_message("Файл слишком мал!");game_end();exit;}
    line=0;
    show_message("Файл '"+filename+"'#Принят, размер в байтах: "+string(size))
} else {
    show_message("Укажите ПЕРВЫЙ файл сборки (обычно это 'Файл_001', однако вы можете указать любой другой)#Важно, чтобы нумерация была последовательной, расширение не учитывается.");
    file_first=get_open_filename("*","");
    if file_first="" {show_message("Архивация отменена!");game_end();exit}
    if not file_exists(file_first) {show_message("Файл не существует!");game_end();exit}
    show_message('Укажите ПОСЛЕДНИЙ файл сборки.#В его имени (как и у других) должно быть столько же символов, сколько их у первого.#Он должен находиться в этой же папке.');
    file_last=get_open_filename("*","");
    if file_last="" {show_message("Архивация отменена!");game_end();exit}
    if not file_exists(file_last) {show_message("Файл не существует!");game_end();exit}
    folder=filename_path(file_first);
    if folder!=filename_path(file_last) {show_message("Файлы в разных каталогах!");game_end();exit}
    name1=filename_change_ext(filename_name(file_first),"");
    name2=filename_change_ext(filename_name(file_last),"");
    len=string_length(name1);
    if len!=string_length(name2){show_message("Длинна имени у этих файлов не одинакова!");game_end();exit}
    sub=0;
    for (n=len-1;n>=0;n-=1) { temp=string_copy(name1,n,len-n);
    if string_digits(temp)!=temp {sub=n;n=-1}
    }
    pref=string_copy(name1,0,sub);
    num1=string_copy(name1,sub+1,len-sub);
    num2=string_copy(name2,sub+1,len-sub)
    if string_digits(num2)!=num2 {show_message("Ошибка метода нумерации!");game_end();exit}
    nulls=string_length(num1)
    num1=real(num1);
    num2=real(num2);
    if num2<num1 {show_message("Ошибка! Обратная последовательность!");game_end();exit}
    number=num2-num1+1;
    show_message("Ожидается "+string(number)+" файлов.#Преффикс: '"+pref+"'#Номер от "+string(num1)+"' до '"+string(num2)+"'.")
    ar[2,2]=0;i=0;
    for (n=num1;n<=num2;n+=1){i+=1;
    mask=folder+pref+string_copy(str_null,0,nulls-string_length(string(n)))+string(n)+"*";
    name=file_find_first(mask,0)
    if not file_exists(folder+name) {show_message("Ошибка! Файл#"+mask+"#Не существует!");game_end();exit}
    ar[i,0]=folder+name;
    file_find_close()
    }
    show_message("Все файлы обнаружены!#Укажите выходной файл для сохранения архива. Требуется вдвое больше свободного места, чем общий размер всех файлов!")
    get_ok=0;
    while (get_ok=0) {wad_p=get_save_filename("*",pref+".WAD");
    if wad_p="" {show_message("Архивация отменена!");game_end();exit}
    if not file_exists(wad_p) get_ok=1 else {
    for (n=1;n<=number;n+=1) {
    if ar[n,0] = wad_p {show_message("Ошибка! Этот файл входит в последовательность для записи! Продолжение невозможно...");game_end();exit}
    } if show_question("Выбранный файл#"+wad_p+"#Уже существует. Хотите переписать его?#'Yes' = Пишем поверх,#'No' = Выберите другой.") get_ok=1
    }
    }
    wad=file_bin_open(wad_p,1);wad_is_open=true
    file_bin_rewrite(wad);
    if not file_exists(wad_p) {show_message("Ошибка! Нет доступа!");game_end();exit}
    file_bin_close(wad);wad_is_open=false
    capt=number*8
    req=show_question("Заглавие (шапка) для этого WAD требует "+string(capt)+
    " описательных байт.#Желательно отступить ещё немного, чтобы отделить таблицу размещения от самого содержимого.#"+
    "Вы хотите указать отступ явно?#'Yes' = Вы введёте число нулевых байт после шапки. #'No' = Вы укажите адрес начала данных.")
    if (req) {
    capt_offset=get_integer("Отступ от заглавия WAD в байтах. Данные будут отодвинуты пустой областью этого размера:",32)
    capt_offset=max(capt_offset,0);
    capt_offset=capt_offset+capt;
    } else {
    capt_offset=get_integer("Укажите байт начала данных. Он должен быть больше размера таблицы ("+string(capt-1)+"):",32+capt)
    capt_offset=max(capt_offset,capt);
    }
    wad=file_bin_open(wad_p,1);wad_is_open=true
    repeat(capt_offset) file_bin_write_byte(wad,0)
    show_message("Сведения таблицы размещения:#Длинна = "+string(capt-1)+"#Нулевая область = "+
    string(capt_offset-capt)+"#Начало данных (первый адрес) = "+string(capt_offset));
    status=10
    part=0;
    empt=get_integer("Укажите, сколько нулевых байт нужно вставлять после каждого упакованного файла?",16);
    empt=max(empt,0);
    modd=get_integer("Можно также добавлять ещё столько нулей, чтобы позиция очередного файла была кратна определённому числу? Введите 0, если это не важно.",16)
    modd=max(0,modd)
    text="Запуск..."
    metod=13;
    if has_prog {if show_question("Можно воспользоваться модулем '"+prog+
    "', который может значительно ускорить работу. Сделать это?#'Yes' = Он будет использован#'No' = Архиватор станет работать внитренними средствами.") metod=14} else
    if show_question("Есть два метода перекопирования заголовка.#Первый новый, ненадёжный но быстрый.#Второй медленнее и показывает количество % обработки.#Результат будет одинаков.#'Yes' = Воспользоваться первым, быстрым.#'No' = Использовать второй, надёжный.") metod=12;
if metod=14 {file_copy(prog_path,filename_path(wad_p)+prog)}
}


 Step Event:
execute code:

if status=0
{
    part+=1;
    addr=0
    for (n=1;n<5;n+=1){
    addr+=file_bin_read_byte(wad)*b[n]}
    volume=0
    for (n=1;n<5;n+=1){
    volume+=file_bin_read_byte(wad)*b[n]};
    
    ar[part,1]=addr;
    ar[part,2]=volume;
    if volume=0 pusto+=1 else pusto=0
    if (addr<=file_bin_position(wad))and(volume>0) 
    {show_message("Ошибка! Найдена ненулевая ссылка, указывающая на уже прошедшую область!");game_end();exit}
    text="Найдено вложенных файлов: "+string(part-pusto);
    if file_bin_position(wad)+7>=ar[1,1] {part-=pusto;show_message("Поиск завершён. Найдено "+string(part)+ " субфайлов!");status=1;exit;}
    if addr+volume>size {show_message("Ошибка! Субфайл '"+string(part)+"' ссылается на область "+
    string(addr)+"-"+string(addr+volume)+", что превосходит размер самого файла ("+string(size)+")!");game_end();exit;}
}
if status=1
{
    text="Выбор назначения...";screen_redraw();sleep(500);
    nulls=string_length(string(part));
    temp=string_copy(str_null,0,nulls-1); pref="Файл_"
    pref=get_string("Выберите преффикс имени файла:",pref);
    show_message("Укажите папку для сохранения всех "+string(part)+
    " субфайлов! Они будут извлечены как '"+pref+temp+"1', '"+pref+temp+"2' и.т.д.")
    folder=get_directory_alt("Укажите выходную папку. На диске должно быть достаточно места, по размеру архива!","");
    if folder="" {show_message("Распаковка отменена!");game_end();exit;}
    if not directory_exists(folder) {show_message("Ошибка! Папка не существует!");exit;}
    pref="\"+pref;
    save=file_bin_open(folder+pref+".tmp",1);save_is_open=true
    file_bin_rewrite(save);
    if not file_exists(folder+pref+".tmp") {show_message("Ошибка! Нет доступа!");exit;}
    file_bin_close(save);save_is_open=false
    file_delete(folder+pref+".tmp");
    status=2;fin=part;
    part=0;exit
}
if status=2
{
    part+=1;
    if part>fin {show_message("Распаковка полностью завершена!");game_end();exit;}
    name=folder+pref+string_copy(str_null,0,nulls-string_length(string(part)))+string(part);
    save=file_bin_open(name,1);save_is_open=true
    file_bin_rewrite(save)
    addr=ar[part,1];
    volume=ar[part,2];
    file_bin_seek(wad,addr);
    still=true; n=-1; bt=buff;
    while (still) {
    for (i=1;i<=buff;i+=1) {n+=1; 
    byte[i]=file_bin_read_byte(wad)
    if n=volume {bt=i;i=buff+1;still=false}
    }  
    if (still) {
    for (i=1;i<=buff;i+=1) file_bin_write_byte(save,byte[i])
    } else {
    for (i=1;i<bt;i+=1) file_bin_write_byte(save,byte[i])
    }}
    file_bin_close(save);save_is_open=false
    text="Данные в#'"+name+"'#Извлечены!";       
}
if status=10
{
    part+=1;
    if part>number {status=11;text="Создание заглавия...";exit}
    load=file_bin_open(ar[part,0],0);load_is_open=true
    ar[part,1]=file_bin_size(wad);
    ar[part,2]=file_bin_size(load);
    while (file_bin_position(load)<file_bin_size(load))
    {file_bin_write_byte(wad,file_bin_read_byte(load))};
    repeat(empt) file_bin_write_byte(wad,0);
    if modd>0 repeat (modd - (file_bin_position(wad) mod modd)) file_bin_write_byte(wad,0);
    file_bin_close(load);load_is_open=false
    text="Файл#'"+ar[part,0]+"'#Упакован!";
}
if status=11
{
    file_bin_close(wad);wad_is_open=false
    tit=file_bin_open(wad_p+".tmp",1);tit_is_open=true
    file_bin_rewrite(tit);
    for (i=1;i<=number;i+=1){
    addr=ar[i,1];
    volume=ar[i,2];
    for (n=4;n>0;n-=1) {
    a[n,i]=0;v[n,i]=0
    while (addr>=b[n]) {
    addr-=b[n];a[n,i]+=1}
    while (volume>=b[n]) {
    volume-=b[n];v[n,i]+=1}
    }}
    for (i=1;i<=number;i+=1){
    for (n=1;n<5;n+=1) 
    {file_bin_write_byte(tit,a[n,i])}
    for (n=1;n<5;n+=1) 
    {file_bin_write_byte(tit,v[n,i])}
    }
    wad=file_bin_open(wad_p,0);wad_is_open=true
    file_bin_seek(wad,file_bin_size(tit))
    rep=(file_bin_size(wad)-file_bin_size(tit)) div 100
    rep=max(rep,1);
    pos=0;
    status=metod;
    exit
}
if status=12
{   
    still=true; n=-1; bt=buff; ps=0;
    while (still) {ps+=1
    if ps=rep {pos+=1; draw_text(0,0,"Копирование тела архива...#Выполнено "+string(pos)+"%");
    screen_refresh();}
    for (i=1;i<=buff;i+=1) {n+=1; 
    byte[i]=file_bin_read_byte(wad)
    if file_bin_position(wad)=file_bin_size(wad)-1 {bt=i;i=buff+1;still=false}
    }  
    if (still) {
    for (i=1;i<=buff;i+=1) file_bin_write_byte(tit,byte[i])
    } else {
    for (i=1;i<=bt;i+=1) file_bin_write_byte(tit,byte[i])
    }}
    file_bin_close(wad);file_bin_close(tit); wad_is_open=false;tit_is_open=false
    file_delete(wad_p);
    file_rename(wad_p+".tmp",wad_p)
    show_message("Архивирование полностью завершено!");game_end();exit;
}
if status=13
{
    repeat(rep) {
    file_bin_write_byte(tit,file_bin_read_byte(wad))
    if file_bin_position(wad)=file_bin_size(wad)-1 {
    file_bin_close(wad);file_bin_close(tit); wad_is_open=false;tit_is_open=false
    file_delete(wad_p);
    file_rename(wad_p+".tmp",wad_p)
    show_message("Архивирование полностью завершено!");game_end();exit;}
    }
    pos+=1;
    text="Копирование тела архива...#Выполнено "+string(pos)+"%"
}
/*if status=14
{
    txt=file_text_open_write(filename_path(wad_p)+prog);
    file_text_write_string(txt,filename_name(wad_p))
    file_text_writeln(txt);
    file_text_write_string(txt,filename_name(wad_p))
    file_text_writeln(txt);
    file_bin_write_byte(tit,file_bin_read_byte(wad))
    if file_bin_position(wad)=file_bin_size(wad)-1 {
    file_bin_close(wad);file_bin_close(tit); wad_is_open=false;tit_is_open=false
    file_delete(wad_p);
    file_rename(wad_p+".tmp",wad_p)
    show_message("Архивирование полностью завершено!");game_end();exit;}
    }
    pos+=1;
    text="Копирование тела архива...#Выполнено "+string(pos)+"%"
}

Other Event: Game End:
execute code:

if wad_is_open=true then file_bin_close(wad)
if tit_is_open=true then file_bin_close(tit)
if save_is_open=true then file_bin_close(save)
if load_is_open=true then file_bin_close(load)


Draw Event:
execute code:

draw_text(0,0,text)

______________________________________________________


