Pull to refresh

Comments 23

Если вам это поможет в вашей деятельности, то могу предоставить исходные коды игры
Конечно! Хоть конкретно эту проблему я и решил, в будущем исходники могут очень пригодиться. Буду очень признателен, если скинете в личку ссылку.
Может на github их залить, а?
Жаль что этого не будет. Хотя древняя версия игры на продажи новой версии вряд ли повлияет.
Исходники xRay :) движка же выложили, а он поновее «Казаков»
К моему сожалению не видел ссылочку. Поделитесь ;)
Исходники X-Ray Engine официально на гитхабе, и даже Григорович дал «добро» использовать некоммерчески.
Ссылку выше дал.
Смотря какой источник )
Спасибо вам большое!
Какой ад… Простите, не удержался. Снимаю шляпу перед отчаянными людьми, которые поддерживали этот код.
Да, по всему проекту около 250 ассемблерных вставок. Суровая оптимизация из 2000-ых. А ещё некоторые статические библиотеки ссылаются на канувшие в лету функции стандартных библиотек. Так, например, пришлось переписать отрывок в IChat/Chat/chatSocket.c и заменить в Peer.lib объект chatSocket.obj, чтобы убрать из линковки ссылку на устаревшую vsprintf() и хотя бы собрать этого динозавра в VS2015 :)
Вообще, с асм-вставки в реализации понятно. В 2000-ом году не было восьмиядерных компов. Но, с другой стороны, интерфейс-то тут тоже жутковат. Или это код, полученные реверс-инжениренгом?
UFO just landed and posted this here
C исходными кодами это ведь уже совсей другой род деятельности! Другие позы, так сказать.
Т.е. проблема в том что в многопоточном приложении пренебрегли синхроназиацией при доступе к общим данным?
Всё указывает на это. Сложно сказать, где собака зарыта, т.к. DirectPlay сам по себе многопоточен, а помимо него используется и свой протокол на основе UDP. Может, мне просто «повезло» наткнуться на эту ошибку, т.к. в сети описание именно такого поведения я не нашёл.
Описанная в конце статьи функция определена в Mplayer.cpp:3106.

Тело функции
int PingSumm::CheckPlayer(DWORD DPID){
	for(int i=0;i<NPL;i++){
		if(PSET[i].DPID==DPID)return PSET[i].NPings;
	};
	return 0;
};

При этом, например, grep PSET | grep free показывает, что кроме деструктора этот регион памяти освобождается и в функции ClearPingInfo() в Mplayer.cpp:3124. Также есть и несколько вызовов realloc(). А какой-либо синхронизации я нигде не увидел…
Да, там много интересного можно увидеть. Вот, например, совершенно фантастическое:
		DWORD lp[6];
		lp[0]='PING';
Год-полтора назад я попытался поиграть с моим другом по интернету, но мы никак не могли соединиться. Выбирали прямое соединение по IP, но зачастую игру друга просто не было видно. А если видно, то не удается соединиться. Порты точно были открыты, поэтому все подозрения пали на то, что игра делалась еще для Win98 / Win2000, а у нас был Windows 7.
Сейчас еще подумал, что проблема могла быть в пиратской версии казаков.
Может, есть еще возможные причины?
Через Hamachi без проблем игралась на Win7 пару лет назад.
Sign up to leave a comment.

Articles