Переключатель модов в игре

Awalder

Новичок
Приветствую уважаемые форумчане! Возникла необходимость в игре переключать два (или в будующем даже три) мода. По сути это перезапись нескольких файлов в двух папках. Инсталлятор-деинсталлятор с бэкапом - как мне показалось не совсем удобно. Хотелось бы попроще - закрыл игру, нажал одну кнопку без лишних "чаво" и заново запустил игру с другим модом.
Буду благодарен за любую помощь! Желательно подробнее, т.к я нуб, хотя сделать вариант с бэкапом мне по силам ))
 

Avengerz13

Участник
1. Как вариант использовать xdelta и приципить какой нибудь GUI к нему.
2. В самой inno setup прописать какие файлы должны перезаписываться по клику.
 
Последнее редактирование:

SBalykov

Старожил
Мне кажется, проще в самой инно сделать мини инсталлер с одной страничкой выбора нужного мода и устанавливать ее и ярлык к ней в любом месте устанавливаемой программы, например создать папку Support, либо через *.cmd ...
 
Последнее редактирование:

Avengerz13

Участник
Написал пример на Inno Setup.
Скрипт использует простую команду копировать, ставить и удалить.
Код:
function FileCopy(const ExistingFile, NewFile: String; const FailIfExists: Boolean): Boolean;
function DeleteFile(const FileName: string): Boolean;
 

Вложения

Awalder

Новичок
А сами моды то большие?
Относительно нет, один мод 23 мб ( но файлов десятка 2 в двух папках). И вот переключаться на данный момент между оригинальными файлами и этим модом. Сами файлы оригинала и мода частично не совпадают по именам, мод добавляет новых файлов. В идеале я вижу это типа как лаунчер с кнопками запуска игры, соответственно одна для мода одна для оригинала.
А сами моды то большие?
 
Последнее редактирование:

Awalder

Новичок
Написал пример на Inno Setup.
Скрипт использует простую команду копировать, ставить и удалить.
Код:
function FileCopy(const ExistingFile, NewFile: String; const FailIfExists: Boolean): Boolean;
function DeleteFile(const FileName: string): Boolean;
Спасибо! примерно так я это и представлял. А получится к этим кнопкам "привязать" ехе игры? И сам переключатель получается должен находиться возле заменяемых папок с файлами мода или можно задать ему путь с помощью реестра?
 

Avengerz13

Участник
А получится к этим кнопкам "привязать" ехе игры?
Код:
var
  Res:integer;
begin
  Exec(ExpandConstant('{src}\game.exe'),'','',SW_SHOW,ewNoWait,Res)
И сам переключатель получается должен находиться возле заменяемых папок
В моем примере да.

можно задать ему путь с помощью реестра?
Можно, но бессмысленно так делать.
 

Awalder

Новичок
Код:
var
  Res:integer;
begin
  Exec(ExpandConstant('{src}\game.exe'),'','',SW_SHOW,ewNoWait,Res)
Присланный вами пример общего заработал, так как мне и было нужно. Патч 23 мб переключает на ура. запуск ехе так же работает, вроде бы разобрался.
Большое спасибо за помощь, респект!
 
Последнее редактирование:

Awalder

Новичок
Написал пример на Inno Setup.
Скрипт использует простую команду копировать, ставить и удалить.
Код:
function FileCopy(const ExistingFile, NewFile: String; const FailIfExists: Boolean): Boolean;
function DeleteFile(const FileName: string): Boolean;
Добрый день! Возможно ли сделать определение файла по дате и привязать это определение к какой то индикации? То есть к примеру запустил переключатель и он анализирует файл по дате 01.01.2010 и к примеру чебокс показывается не отмеченным, а если файл новее то чебокс уже отмечен, отменил галочку - опять " старый " файл. Скрипт прикрепляю. заранее благодарен
 

Вложения

Avengerz13

Участник
Awalder, на delphi есть такая функция
Код:
 function FileAge ( const FileName : string ) : Integer;
но inno setup не поддерживает эту функцию. Подумаю над решением позже, как так в данный момент не имею постоянного доступа к интернету. Возможно кто-то придумает альтернативный вариант.
 

Awalder

Новичок
Подумаю над решением позже
мне подсказали, что можно через crc проверку сделать
if FileCRC32(путь) = '7F32365F' then // если файл оригинальный
CheckBox1.Checked := True;

Позже прочитал в справке, вроде бы функция CRC тоже не поддерживается...
 
Последнее редактирование:

Avengerz13

Участник
мне подсказали, что можно через crc проверку сделать
if FileCRC32(путь) = '7F32365F' then // если файл оригинальный
CheckBox1.Checked := True;

Позже прочитал в справке, вроде бы функция CRC тоже не поддерживается...
зато есть MD5 и SHA-1.
Код:
function GetMD5OfFile(const Filename: String): String;
function GetSHA1OfFile(const Filename: String): String;

Поискал немного про то что просили изначально и нашел следующее:
http://www.jrsoftware.org/ishelp/index.php?topic=isxfunc_findfirst
можно попробовать сделать так, использовать функцию FindFirst то есть найти нужный нам файл
Код:
function FindFirst(const FileName: String; var FindRec: TFindRec): Boolean;
потом попробовать получить дату
Код:
TFileTime = record
  dwLowDateTime: DWORD;
  dwHighDateTime: DWORD;
end;

LastAccessTime: TFileTime;  // time file was last accessed
Точного примера сейчас не напишу, под рукой нету компилятора. Если все-таки решитесь попробовать сделать через хэш то примерно должно быт вот так
Код:
MD5_Example: String;
Код:
MD5_Example:= 'd7b94e7f30f80848d56d16637f18bf16';
Код:
if not (MD5_Example = GetMD5OfFile(ExpandConstant('{src}\file.zip'))) then
 begin
    CheckBox.Checked := False;
    MsgBox('This file is corrupted', mbInformation, MB_OK);
 end;
Поправьте если где-то я ошибся.
 
Сверху