Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Вниз

Save/Load   Найти похожие ветки 

 
Creative   (2006-02-08 12:16) [0]

1. Хочется услышать базовые советы по сабжу (советы "почитай то-то и то-то" приветствуются)
2. Кто нибудь может посоветовать как записать файл который нельзя было бы сломать ни руками, ни ArtMoney, ничем вообще?


 
Don Nikola   (2006-02-08 12:32) [1]

Запрещать что-то игроку это дурной тон. Особенно запрет на читы. Игрок покупает игру не для того чтобы достичь совершенства в игре, а чтобы отдохнуть. Но это вопрос философии разработчика.

Для того чтобы кто-либо не мог редактировать сейвы прямо из far/hiew можно добавить простенькое шифрование и проверку контрольной суммы.
Если самому/самой делать лень, то можно выдрать функции Code/Decode/Adler32 из NArc http://www.gamedev.ru/download/?id=2950


 
Creative   (2006-02-08 12:34) [2]

С учетом того, что я делаю игрушки не на прожажу - я буду придерживаться такой философии, какой сочту нужным.

А за стовет спасибо.


 
Don Nikola   (2006-02-08 12:47) [3]

От memory-читеров(ArtMoney,WinHack2,etc) можно использовать следующий трюк:
основные параметры хранить в шифрованом виде, например поксореными, а при необходимости изменить вызывать соответствующие функции.
Для эстетов можно это засунуть в property, тогда можно будет работать с параметрами как с обычными переменными.
Например:
TPlayer=class
 private
   ....
   fHealth: integer;
   procedure SetHealth(NewHealth: integer);
   function GetHealth: integer;
   ....
 public
   ....
   property Health: integer read GetHealth write SetHealth;
   ....
 end;

procedure TPlayer.SetHealth(NewHealth: integer);
begin
 fHealth:=NewHealth xor $12345678;
end;

function TPlayer.GetHealth: integer;
begin
 Result:=fHealth xor $12345678;
end;


 
Creative   (2006-02-08 13:01) [4]

Да но кто мешает вычислить и сломать контрольную сумму? Так случилось с Dark Heart of Uukrul, если кто помнит.
Кстати - а не знаете, как в свое время делалась игрушка DungeonMaster? Там невозможно было _считать_, настолько быстро они менялись во времени.


 
Don Nikola   (2006-02-08 13:18) [5]

Ну если так ставить вопрос, то можно считать самосодержащую контрольную сумму. Где-то я такую статью видел, то ли на wasm.ru, то ли еще где-то на асмовом сайте. Там использовали CRC32.

Для _больших_ извращенцев есть такой вариант:

procedure TPlayer.SetHealth(NewHealth: integer);
begin
fOldHealth:=fHealth;
inc(fHealthChangeCounter);
fHealth:=NewHealth xor fOldHealth xor fHealthChangeCounter;
end;

function TPlayer.GetHealth: integer;
begin
Result:=fHealth xor fOldHealth xor fHealthChangeCounter;
end;

Значение fHealth будет шифроваться по-разному при каждом присвоении, то есть отследить эти изменения можно, но чтобы их переписать нужно будет лезть в дебаггер и смотреть что там твориться, что делеко не всякому читеру под силу.


 
Creative   (2006-02-08 13:27) [6]

Вот это то, что нужно. Мне нужно именно для БООООЛЬШИХ извращенцев :-)

кстати: а на мой первый вопрос у вас не возникло жедания высказаться?


 
Don Nikola   (2006-02-08 13:38) [7]

Маленькое добавление, теперь значение перешифровывается и при чтении тоже, то есть вообще работает как рендом для внешнего наблюдателя.
Естественно, изначально fOldHealth и fHealthCounter должны быть равны random($FFFFFFFF).

function TPlayer.GetHealth: integer;
begin
Result:=fHealth xor fOldHealth xor fHealthChangeCounter;
fOldHealth:=fHealth;
inc(fHealthChangeCounter);
fHealth:=NewHealth xor fOldHealth xor fHealthChangeCounter;
end;

По первому вопросу тяжело высказываться, так как это зависит от самой игры.
Есть смысл хранить все игровые параметры в record, которую затем просто хранить в файле. Если же есть динамические объекты(враги/пули/etc), то можно хранить список, но тогда нужно будет пересоздавать объекты заново или править указатели. Вообще это вопрос конкретной игры, на мой взгляд.
Что относиться ко всем играм, так это то, что вся информаци которая может повлиять на игрока должна сохраняться. А то иногда можно встретить вопросы "а нужно и сохранять летящие пули?".


 
Don Nikola   (2006-02-08 13:48) [8]

Так, насчет последнего кода, похоже я малость "пардон, фигню спорол". Сейчас потестю.


 
Don Nikola   (2006-02-08 13:55) [9]

Да...
Вообщем так надо:

function TPlayer.GetHealth: integer;
begin
 Result:=fHealth xor fOldHealth xor fHealthChangeCounter;
 fOldHealth:=fHealth;
 inc(fHealthChangeCounter);
 fHealth:=Result xor fOldHealth xor fHealthChangeCounter;
end;


 
Creative   (2006-02-08 14:25) [10]

Очень здорово, обязательно воспользуюсь.

Насчет характера игры - очень простая и я бы сказала не динамическая, по типажу напоминает Eye of Beholder или Wizardry 7. То есть хранить надо: параметры игрока и персонажей, координаты их положения, количество вещей и денег и так далее. Мне очень нужен базовый совет, потому что с записью в файл я не то что на ВЫ, а еще хуже.

Кстати, если вы так любезно отвечаете не эти вопросы, может быть вы заглянете и в раздел "Компоненты"? Там я тоже надоедаю людям :-)


 
Don Nikola   (2006-02-08 14:53) [11]

В чем именно совет? Как записать record в файл или что записать в record?
Например, если в игре может быть всего три предмета у игрока, то можно просто хранить как поля в record"е, если же предметов может быть много, то возможно есть смысл использовать TList. Если же и героев может быть много, и у каждого из них может быть много предметов, то это уже список списков получается. В этом случае просто так сохранить/загрузить не получится, нужно будет при загрузке пересоздавать все объекты, присваивать им новые значения, пересчитывать ссылки.
Этот вопрос из разряда "как мне сделать игровую логику?", программеру должно быть виднее.

В "Компонентах" мне вообщем-то делать нечего, я на VCL уже года три не программил, так что все выветрилось и ценный совет я там вряд ли дам. Единственное, что можно посоветовать это для начала как следует поиграться с объектной моделью delphi, без привязки к компонентам, то есть понасоздавать классы, понаследовать. Довольно сильно может потом помочь с VCL, да и не только.


 
Creative   (2006-02-08 15:12) [12]

Спасибо и на том. :-)


 
XProger ©   (2006-02-08 15:46) [13]

Creative,
1) http://mirgames.ru/article/gamedev/anticheat
2) Абсолютно любая защита может быть взломана (теоретически ;)


 
Don Nikola   (2006-02-08 15:59) [14]

2XProger:
в ссылке методы не очень хороши или тем что программа "гадит" читеру или тем что сломать все равно довольно легко(особенно 1-й способ).

Я тут этим делам заинтересовался и вот что у меня получилось.

---
program a;
{$APPTYPE CONSOLE}
uses
 sysutils;
var
 fOldHealth,fHealth,fHealthChangeCounter,Delta: integer;

procedure SetHealth(NewHealth: integer);
begin
 fOldHealth:=fHealth;
 inc(fHealthChangeCounter,Delta);
 fHealth:=NewHealth xor fOldHealth xor fHealthChangeCounter;
end;

function GetHealth: integer;
begin
 Result:=fHealth xor fOldHealth xor fHealthChangeCounter;
 fOldHealth:=fHealth;
 inc(fHealthChangeCounter,Delta);
 fHealth:=Result xor fOldHealth xor fHealthChangeCounter;
end;

begin
 Randomize;
 Delta:=Random($FFFFFFFF);
 fOldHealth:=Random($FFFFFFFF);
 fHealthChangeCounter:=Random($FFFFFFFF);
 SetHealth(100);
 writeln(GetHealth," - ",inttohex(fHealth,8));
 writeln(GetHealth," - ",inttohex(fHealth,8));
 writeln(GetHealth," - ",inttohex(fHealth,8));
 writeln(GetHealth," - ",inttohex(fHealth,8));
 SetHealth(75);
 writeln(GetHealth," - ",inttohex(fHealth,8));
 writeln(GetHealth," - ",inttohex(fHealth,8));
 writeln(GetHealth," - ",inttohex(fHealth,8));
 writeln(GetHealth," - ",inttohex(fHealth,8));
 SetHealth(120);
 writeln(GetHealth," - ",inttohex(fHealth,8));
 writeln(GetHealth," - ",inttohex(fHealth,8));
 writeln(GetHealth," - ",inttohex(fHealth,8));
 writeln(GetHealth," - ",inttohex(fHealth,8));
end.
---

Перешифровка при кадом чтении/записи, следующее значение визуально вообще никак не связано со старым. Обойти такую защиту без дебаггера практически нереально. А если все это оформить как пять раз перенаследованные классы, а затем зажать каким-нибудь aspack"ом, то и с дебаггером радости будет не очень много. Но в целом это скорее из области извращений и фалометрии.


 
XProger ©   (2006-02-08 16:20) [15]

Тогда http://www.pascalgamedevelopment.com/viewtopic.php?t=2922


 
Don Nikola   (2006-02-08 16:52) [16]

2XProger:
я бегло просмотрел, там три вопроса поднимаються:
1) борьба с savefile-читерами
2) борьба с memory-читерами
3) борьба с кракерами

Первые два вопроса, на мой взгляд, должны вообще быть переложены на совесть игрока.
А вот адекватно решить третий вопрос довольно тяжело. Можно использовать самосодержащееся crc, можно понатыкать проверки на целостность кода во все процедуры, но вызывать одни при запуске, другие через день, третьи через пару недель. Можно понатыкать anti-debug tricks, натравить aspack/asprotect. Для ввода serial-key, можно использовать что-то вроде www.ibsensoftware.com/products_aKEY.html
Делать привязку к диску, тоже можно, но есть тот же Daemon Tools.
Но там правильно сказали, главное чтобы варез начал появлятся, не раньше чем будет отоварена основная масса клиентов.


 
Creative   (2006-02-08 17:20) [17]

XProger
2) Абсолютно любая защита может быть взломана (теоретически ;)

Не родился еще человек который сломал Dungeon Master 2 ;-Р
И между прочим я спрашиваю не о защите от читеров, а о защите от людей, очень хорошо знающих произвольный Hex editor. Сама этим занималась :-)

Уточняю - я не собираюсь ставить Serial Number или привязывать игру к диску, я просто хочу чтобы по игрушке не ходили монстры 20-20-20-20-20-20 с миллионом в кармане


 
Домовенок ©   (2006-02-09 01:55) [18]

> Creative   (08.02.06 17:20) [17]
> Уточняю - я не собираюсь ставить Serial Number или привязывать игру к
> диску, я просто хочу чтобы по игрушке не ходили монстры 20-20-20-20-20-20
> с миллионом в кармане


А смысл? Если игроку интересно так играть, зачем ему в этом отказывать? :) Главное же чтобы игроку нравилось играть, и он получал от этого удовольствие. Тут я поддержу Don Nikola. Другое дело, если идет речь об ОнЛайн игре, где от читерства могут пострадать другие игроки. Но тут мне кажется, было бы правильнее написать изначально интересную игру, а потом думать о защите от читеров. А то может вся эта защита и не будет стоить того!? :)


 
MeF Dei Corvi ©   (2006-02-09 09:55) [19]

Помогал вчера одному знакомому взламывать игру... Настроение у него такое было, захотел побыть богом... Взломал, поиграл полчаса, бросил, т.к взламывать эту игру оказалось намного интереснее, чем в неё играть :)



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.042 c
2-1163146600
maxistent
2006-11-10 11:16
2006.12.03
Ресурсы


3-1159773144
Megabyte
2006-10-02 11:12
2006.12.03
Выборка списка пользователей из rdb$user_privileges


2-1163532574
Ruffian
2006-11-14 22:29
2006.12.03
Всё таже работа с файлами...


1-1160324072
flaxe
2006-10-08 20:14
2006.12.03
Несколько вопросов по компоненту TWebBrowser.


15-1163507354
Юрий Зотов
2006-11-14 15:29
2006.12.03
В Base64 и обратно





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский