Форум TeamX
   Home   Members  
Pages: [1] 2 |   Go Down
 
Author Topic: Проблемы с патчилкой  (Read 3432 times)
Jordan
Пользователь
Posts: 416

476228895
Проблемы с патчилкой
« on: 28 April 2008, 03:27:30 »

Здраствуйте!

Я делаю патчилку и все получается, но есть одна проблемка которую я решить не могу.

В патчилке я задаю смещение и на какое смещение поменять, стартовые координаты на карте мира изменяю, но проблема в том что когда я в вожу координаты 823,72 в хексе 337,48 то координаты не те я не знаю почему, я уже все перепробывал, но что то не получается, помогите.

Вот часть кода

//Стартовое положение на карте мира (по X)
buf[0xAD008]=0x337;

//Стартовое положение на карте мира (по Y)
buf[0xAD00D]=0x48;

//World Highlight X
buf[0xACD90]=0x337;

//World Highlight Y
buf[0xACD95]=0x48;

//World Viewport X
buf[0x10C42C]=0x00;

//World Viewport Y
buf[0x10C430]=0x00;

А вот весь код патчилки

#include <windows.h>
#include <stdio.h>
#include <conio.h>

int main()
{
   HANDLE in=CreateFile("fallout2.exe",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
   if(in==INVALID_HANDLE_VALUE)
   {
      MessageBox(NULL,"Hello","",MB_OK);
      printf("fallout2.exe not found\n");
      getch();
      return 0;
   }
   printf("scaning file...\n");
   DWORD len=GetFileSize(in,NULL);
   BYTE *buf=new BYTE[len];
   DWORD br;
   ReadFile(in,buf,len,&br,NULL);
   CloseHandle(in);

   //patching



//buf[0x]=0x;

//Стартовая локация
buf[0x107ac8]=0x76;
buf[0x107ac9]=0x31;
buf[0x107aca]=0x33;
buf[0x107acb]=0x65;
buf[0x107acc]=0x6e;
buf[0x107acd]=0x74;
buf[0x107ace]=0x2e;
buf[0x107acf]=0x6d;
buf[0x107ad0]=0x61;
buf[0x107ad1]=0x70;
buf[0x107ad2]=0x00;
buf[0x107ad3]=0x00;

//Выключить неслучайную встречу с Френки
buf[0xB0AD8]=0xEB;

//Начальный вид персонажа (муж.)
buf[0xee8e8]=0x68;
buf[0xee8e9]=0x6d;
buf[0xee8ea]=0x6a;
buf[0xee8eb]=0x6d;
buf[0xee8ec]=0x70;
buf[0xee8ed]=0x73;

//Начальный вид персонажа (жен.)
buf[0xee8f0]=0x68;
buf[0xee8f1]=0x66;
buf[0xee8f2]=0x6a;
buf[0xee8f3]=0x6d;
buf[0xee8f4]=0x70;
buf[0xee8f5]=0x73;

//Нет снов
buf[0x93B0F]=0xE9;
buf[0x93B10]=0x95;
buf[0x93B11]=0x00;
buf[0x93B14]=0x90;
buf[0x93BB7]=0xEB;

//Пипбой в начале
buf[0x0087411]=0xEB;

//Стартовое положение на карте мира (по X)
buf[0xAD008]=0x337;

//Стартовое положение на карте мира (по Y)
buf[0xAD00D]=0x48;

//World Highlight X
buf[0xACD90]=0x337;

//World Highlight Y
buf[0xACD95]=0x48;

//World Viewport X
buf[0x10C42C]=0x00;

//World Viewport Y
buf[0x10C430]=0x00;

//Стартовый день
buf[0x93756]=0x04;

//Стартовый год
buf[0x9376C]=0x71;
 
//Стартовый месяц
buf[0x93782]=0x0b;

//Выкл фильмы
buf[0x3ea90]=0xc3;

// Убежище 13

// Кнопка 1
buf[0x2EFFc]=0x06;// Номер карты
buf[0x2F000]=0x00;// Номер уровня
buf[0x2F004]=0x18;// тайл последние смещения
buf[0x2F005]=0x37;// тайл первые смещения

// Кнопка 2
buf[0x2F008]=0x06;// Номер карты
buf[0x2F00C]=0x01;// Номер уровня
buf[0x2F010]=0xE8;// тайл последние смещения
buf[0x2F011]=0x57;// тайл первые смещения

// Кнопка 3
buf[0x2F014]=0x06;// Номер карты
buf[0x2F018]=0x02;// Номер уровня
buf[0x2F01C]=0xA0;// тайл последние смещения
buf[0x2F01D]=0x43;// тайл первые смещения

// Кнопка 4 - не используется
//buf[0x]=0x;// Номер карты
//buf[0x]=0x;// Номер уровня
//buf[0x]=0x;// тайл последние смещения
//buf[0x]=0x;// тайл первые смещения



   HANDLE out=CreateFile("fallout.exe",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
   if(in==INVALID_HANDLE_VALUE)
   {
      printf("cann't create result file\n");
   }
   else
   {
      WriteFile(out,buf,len,&br,NULL);
      CloseHandle(out);
      printf("fallout2.exe patch completed!\npatch result file: fallout.exe\n");
   }

   delete[] buf;

   getch();
   return 0;
}

И еще вопрос как сделать что бы он офсеты читал из файла например из patcher.txt

Вот так

buf[0x3ea90]=0xc3;

buf[0x3ea90]=читать строку из файла(patcher.txt, номер строки 1 любую строку указываешь);

Или что бы он читал страку но подругому

patcher.txt

movis=0xc3

Ну и последний вопрос как сделать так что бы строку переводил число как в atoi

Пример

// Кнопка 3
buf[0x2F014]=0x06;// Номер карты
buf[0x2F018]=0x02;// Номер уровня
buf[0x2F01C]=0xA0;// тайл последние смещения
buf[0x2F01D]=0x43;// тайл первые смещения

А в patcher.txt будет так

Elevation_id=8
Button=1
Map=6
Elev=0
Tile=14104

И так далее для всех 24 лифтов, как так сделать что бы он строку dec переводил в hex



« Last Edit: 28 April 2008, 03:43:46 by Jordan »

Воспрянет Россия, из праха отцов
Расправятся крылья, миллионов сердец
Поднимут все головы и грудью вздохнут
И громка скажут, что пришли
Мы пришли, со столетней войны
cvet
Пользователь
Posts: 6

282236920
Re: Проблемы с патчилкой
« Reply #1 on: 28 April 2008, 04:15:51 »

Quote
//Стартовое положение на карте мира (по X)
buf[0xAD008]=0x337;

//World Highlight X
buf[0xACD90]=0x337;

Для байта это многовато. Или присваивай отдельно каждому байту нужное значение
buf[0xAD008]=0x37;
buf[0xAD009]=0x3;
или кастуй в слово и присваивай ему
*(WORD*)&buf[0xAD008]=0x337;

Quote
И еще вопрос как сделать что бы он офсеты читал из файла например из patcher.txt

Пиши свой парсер, а если лень, то можешь делать например так:
buf[0x2F014]=GetPrivateProfileInt("MAP","MapNum",0x6,".\\patcher.txt");// Номер карты
buf[0x2F018]=GetPrivateProfileInt("MAP","MapLevel",0x2,".\\patcher.txt");// Номер уровня
buf[0x2F01C]=GetPrivateProfileInt("MAP","MapTileX",0xA0,".\\patcher.txt");// тайл последние смещения
buf[0x2F01D]=GetPrivateProfileInt("MAP","MapTileY",0x43,".\\patcher.txt");// тайл первые смещения

patcher.txt
[MAP]
MapNum=1
MapLevel=2
MapTileX=3
MapTileY=4

Quote
Ну и последний вопрос как сделать так что бы строку переводил число как в atoi
atoi
Anchorite
Пользователь
Posts: 23


Re: Проблемы с патчилкой
« Reply #2 on: 01 May 2008, 11:10:46 »

Quote
Ну и последний вопрос как сделать так что бы строку переводил число как в atoi

atoi не работает для числа представленного в недесятичной системе счисления.
Так что придется самому писать Улыбка
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Проблемы с патчилкой
« Reply #3 on: 01 May 2008, 11:17:42 »

А strtol и strtoul? Подмигивающий
Anchorite
Пользователь
Posts: 23


Re: Проблемы с патчилкой
« Reply #4 on: 01 May 2008, 11:38:17 »

Quote from: Wasteland Ghost on 01 May 2008, 11:17:42
А strtol и strtoul? Подмигивающий

Про эти функции не знал Улыбка
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Проблемы с патчилкой
« Reply #5 on: 01 May 2008, 12:10:36 »

Строго говоря, они могут не во всех компиляторах присутствовать. Та же atoi -- это на самом деле макрос, которого нет под интелом и gcc, например.
cvet
Пользователь
Posts: 6

282236920
Re: Проблемы с патчилкой
« Reply #6 on: 01 May 2008, 14:45:26 »

atoi входит в стандарт ANSI C. Дело не в компиляторе, а подключаемых библиотеках и, если они не держат стандарт, то это никак не проблема компилятора.
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Проблемы с патчилкой
« Reply #7 on: 01 May 2008, 17:16:53 »

Да, библиотеки. Но, как ни странно, в новом стандарте atoi нет. Я когда тоже первый раз наткнулась на проблему её отсутствия в некоторых компилерах, админ пошустрил по стандарту и atoi там не нашёл.
Anchorite
Пользователь
Posts: 23


Re: Проблемы с патчилкой
« Reply #8 on: 01 May 2008, 17:37:54 »

Quote from: Wasteland Ghost on 01 May 2008, 17:16:53
Да, библиотеки. Но, как ни странно, в новом стандарте atoi нет. Я когда тоже первый раз наткнулась на проблему её отсутствия в некоторых компилерах, админ пошустрил по стандарту и atoi там не нашёл.

Очень странно. Помоему atoi должен лежать в <cstdlib>
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Проблемы с патчилкой
« Reply #9 on: 01 May 2008, 17:43:36 »

cstdlib всё равно просто тянет за собой stdlib.h.

Всё, разобралась. Это я глючу. Улыбка С atoi всё в порядке, это itoa в стандарте нет. Улыбка
Jordan
Пользователь
Posts: 416

476228895
Re: Проблемы с патчилкой
« Reply #10 on: 04 May 2008, 10:20:03 »

Quote
А strtol и strtoul? Подмигивающий

А можете показать пример как их использовать.

Воспрянет Россия, из праха отцов
Расправятся крылья, миллионов сердец
Поднимут все головы и грудью вздохнут
И громка скажут, что пришли
Мы пришли, со столетней войны
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Проблемы с патчилкой
« Reply #11 on: 04 May 2008, 15:07:11 »

Гугль в помощь. Подмигивающий
http://www.cplusplus.com/reference/clibrary/cstdlib/strtol.html
А вот на русском:
http://www.codenet.ru/progr/cpp/spru/strtod-strtol.php
Jordan
Пользователь
Posts: 416

476228895
Re: Проблемы с патчилкой
« Reply #12 on: 08 May 2008, 15:46:44 »

А может кто нибудь показать пример патчилки на delphi 7, буду очень благодарен. Самой простой  что бы ничего не выводил, запустилась поменяла значение закрылась.

Воспрянет Россия, из праха отцов
Расправятся крылья, миллионов сердец
Поднимут все головы и грудью вздохнут
И громка скажут, что пришли
Мы пришли, со столетней войны
Freeman
Пользователь
Posts: 50


Re: Проблемы с патчилкой
« Reply #13 on: 09 May 2008, 08:46:17 »

Если переписать патчилку из первого поста, то получится примерно следующее:
Code:
uses
  Windows;

type
TBuf=array[0..$7FFFFFFE] of byte;
PBuf=^TBuf;

var
hin,hout:THandle;
buf:PBuf;
len,br:Dword;

begin
hin:=CreateFile('fallout2.exe',GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
   if hin=INVALID_HANDLE_VALUE then
   begin
      MessageBox(0,'fallout2.exe not found','',MB_OK);
      exit;
   end;
   len:=GetFileSize(hin,nil);
   buf:=GetMemory(len);
   ReadFile(hin,buf^,len,br,nil);
   CloseHandle(hin);

   //patching

//Пипбой в начале
buf[$0087411]:=$EB;

   hout:=CreateFile('fallout.exe',GENERIC_WRITE,0,nil,CREATE_ALWAYS,0,0);
   if hout=INVALID_HANDLE_VALUE then
   begin
      MessageBox(0,'cann''t create result file','',MB_OK);
      FreeMemory(buf);
      exit;
   end
   else
   begin
      WriteFile(hout,buf^,len,br,nil);
      CloseHandle(hout);
      MessageBox(0,'fallout2.exe patch completed!'#13#10'patch result file: fallout.exe','',MB_OK);
   end;

   FreeMemory(buf);
end.
« Last Edit: 09 May 2008, 08:52:26 by Freeman »
Jordan
Пользователь
Posts: 416

476228895
Re: Проблемы с патчилкой
« Reply #14 on: 11 May 2008, 19:33:29 »

Freeman

Отлично. Спасибо.

А не знаешь как бы сделать так что бы пример

buf[$107ac8]:=GetPrivateProfileInt('Starting_Map','',$00,'patcher.txt');

patcher.txt

Starting_Map=V13ENT.MAP

Я пишу полностью название карты, а в сама программа переводит её в хекс и патчит.

Обращаюсь ко всем.
Я задал стартовые координаты а координаты все равно не те, чуз появляется в других. Подскажите где ошибка.

//823 и 72
buf[$AD008]:=$33;
buf[$AD008]:=$7;
buf[$ACD90]:=$33;
buf[$ACD90]:=$7;

buf[$AD00D]:=$48;
buf[$ACD95]:=$48;

//600 и 0
buf[$10C42C]:=$25;
buf[$10C42D]:=$8;
buf[$10C430]:=$00;


« Last Edit: 11 May 2008, 22:31:46 by Jordan »

Воспрянет Россия, из праха отцов
Расправятся крылья, миллионов сердец
Поднимут все головы и грудью вздохнут
И громка скажут, что пришли
Мы пришли, со столетней войны
Pages: [1] 2 |   Go Up