http://robots.chat.ru
Качайте, кому интересно - там даже регистрационный ключ есть (типа варез)

Moderator: Shaos
О - нашёл упоминание про "Robot Warfare 1" в википедииShaos wrote:Народ продолжает спрашивать по почте про RW1, поэтому я сегодня собрал всё что надо и выложил по старому адресу проекта:
http://robots.chat.ru
Качайте, кому интересно - там даже регистрационный ключ есть (типа варез)
Исходники замечательно собираются борландовским фришным компилятором из под Wine (эмулятор винды в Linux), но у программ есть проблемы в Wine, которых нет в живой винде:Shaos wrote:Так как 3D версия у меня застопорилась, решил вернуться к первоисточнику - появилась мысль сделать реал-тайм стратегию Robot Warfare 2D с возможностью программировать юнитов
P.S. За основу можно взять исходники виндовой версии RW1, выкинув оттуда весь WinAPI код, заменив вывод графики на SDL спрятанный под одним уровнем абстракции, чтобы в будущем к примеру можно было на iPad переписать. Можно также графику сделать более похожей на первую версию, а также звуки из первой версии надо вернуть обратно.
P.P.S. В коде есть ряд известных ошибок, которые надо исправить:
- проверить имплементацию регистра S (глубина стека);
- заимплементить COPYP, SENDP, RECVP;
- поправить код зарядки у реактора (должна быть единица энергии за 5 тактов);
- если стрелять навстречу идущему роботу, то снаряд не должен теряться;
- иногда при движении робота сквозь снаряд или взрывы на экране остаётся висеть половинка робота.
Проблему с камнями исправил - файл ресурсов STONE.BMP почему-то являлся валидной картинокй только в винде - пересоздал его заново и пересобрал - черные квадраты исчезлиShaos wrote: Как видно в редакторе съезжает подсветка синтаксиса, а в визуализаторе боёв не рисуются камни...
Правила были установлены в 1999 и слегка подправлены в 2000 году - с тех пор не меняются. Соревнования проходят на одной карте, которая генерируется из даты проведения соревнований и числа участвующих роботов (способ генерации карты последний раз менялся в июне 2001 года - вместе с переходом на версию 2.0). Роботы воюют по двое - каждый с каждым по два раза (второй раз роботы меняются местами на карте) в пределах своего класса (о классах см.далее). Каждая битва ведется в течении 10000 тактов боевого времени. Выигрывает робот, убивший соперника и оставшийся в живых. В случае, если во время боя никто не погибнет, результатом игры считается НИЧЬЯ. То же самое относится к случаю, когда выжил никого не убивший робот (например, погибший робот просто упал в яму или выполнил некорректную инструкцию).
Все роботы разделены на классы. Самым лучшим считается класс А. По результатам боев в классе А высчитывается десятка лучших роботов (с учетом всех предыдущих соревнований). Каждый класс содержит 21 робот (кроме последнего класса - там может быть от 10 до 29 роботов). В одном бою участвуют только два робота из одного класса. Если в классе представлены N роботов (обычно 21), то проводится N*(N-1) боев. Каждый робот участвует в 2*(N-1) боях. Например, если в одном классе 21 робот, то проводится 21*20=420 боев (каждый с каждым по два раза) и каждый робот участвует в 40 боях. После каждого боя 2 очка приписывается роботу-победителю, а проигравший получает 0 очков. При ничье оба робота получают по 1 очку. В случае 21 робота, максимальное количество очков, которое может набрать робот - 80. Первый робот в каждом классе по итогам боев в этом классе называется "сквозной робот" ( или просто "сквозняк" : ) - он переходит в верхний класс и воюет там в этих же соревнованиях.
Вообще процесс игры можно представить так - существует большой список роботов, расположенных на своих местах по итогам последних соревнований. Новые роботы помещаются в конец списка по мере поступления. Алгоритм проведения соревнований:
1. Удаление роботов, которые были удалены игроками
2. Разбиение всего списка роботов на группы по 20 (в последнем классе допускается наличие от 10 до 29 роботов)
3. Назначение последнего класса текущим
4. Проведение соревнования в текущем классе
5. Если текущий класс не является последним, то пометка последних ТРЕХ роботов, как переходящих в нижний класс
6. Если текущий класс является последним, то удаление последних ТРЕХ роботов и роботов, набравших 0 очков
7. Если текущий класс не является первым, то переход робота занявшего ПЕРВОЕ место в верхний класс (сквозной робот) и пометка роботов, занявших ВТОРОЕ и ТРЕТЬЕ место, как переходящих в верхний класс
8. Если текущий класс является первым, то назначение робота, занявшего ПЕРВОЕ место, победителем соревнований. Переход к 10
9. Назначение верхнего класса текущим. Переход к 4
10. Перемещение роботов, помеченных как переходящих в верхние или нижние классы.
11. Объединение всех роботов в один большой список для следующих соревнований
Всё - код переведён на голимый СиShaos wrote:P.S. Сейчас у меня задача перевести код на голимый Си (там C++ очень немного и он не страшный) и абстрагировать уровень вывода графики и звука, чтобы можно было переставить c WinAPI на SDL или на что угодно.
Старые C/C++ исходники досовской "Robot Warfare 1 Open Game" опубликованные ещё в 2001 году (5.6K строк кода):Shaos wrote:Всё - код переведён на голимый СиShaos wrote:P.S. Сейчас у меня задача перевести код на голимый Си (там C++ очень немного и он не страшный) и абстрагировать уровень вывода графики и звука, чтобы можно было переставить c WinAPI на SDL или на что угодно.
Code: Select all
robot "Follower"
author "Shaos"
left eye
right eye
back gun
start:
bb = 0
recv bb
if N>=0 : start
received:
% received code from mouse
oo=bb
% say "received coordinates:"
% print X
% print Y
% print oo
xx=X
yy=Y
go_loop:
if yy>0 : go_straight
if yy==0 : go_left_right
left
left
yy=-yy
xx=-xx
goto go_straight
go_left_right:
if xx==0 : go_finish
if xx<0 : go_left
% go right
right
tt=yy
yy=xx
xx=-tt
goto go_straight
go_left:
left
tt=xx
xx=yy
yy=-tt
go_straight:
if xx!=0 : go_step
if oo==2 : do_kill
if oo==6 : do_kill
go_step:
% say "step"
step
if N>0 : go_check
yy=yy-1
% print xx
% print yy
recv bb
if N<0 : received
goto go_loop
go_check:
recv bb
if N<0 : received
goto go_straight
do_kill:
left
left
act back
act back
act back
act back
act back
% left
% left
% oo = 0
goto start
go_finish:
say "I'm here"
goto start
end
Еще вариант - графику выводить через OpenGL, а звук - через libmikmodShaos wrote:... и абстрагировать уровень вывода графики и звука, чтобы можно было переставить c WinAPI на SDL или на что угодно.
Эти исходники были мной зарелизены в 2001 году под очень странной самопальной лицензией:Shaos wrote:Старые C/C++ исходники досовской "Robot Warfare 1 Open Game" опубликованные ещё в 2001 году (5.6K строк кода):
https://gitlab.com/shaos/rw1o
Code: Select all
This is "Robot Warfare 1 Open Game"
version 1.99.2
Robot Warfare 1 Version 1.99 compatible
Copyright (c) 1998-2002 Alexander Shabarshin (shaos@mail.ru)
http://robots.ural.net
This program is a free software; You can use it,
redistribute it and modify it under the terms:
1. You must keep name of author (A.Shabarshin)
and his e-mail (shaos@mail.ru) in heads
of these source files and documentation
2. You can develop free, shareware or commerce
projects based on this software, but you
need to send copy of your distributive to
Alexander Shabarshin (shaos@mail.ru) with
license for one person
This program is distributed in the hope that it
will be useful, but WITHOUT ANY WARRANTY!
т.е. лицензия будет выглядеть так:Shaos wrote:Новые чисто сишные исходники виндовой версии - прототипа "Robot Warfare 2D" (7.6К строк кода):
https://gitlab.com/shaos/rw2d
Чтобы собрать запускаем make.bat (надо иметь борландовский виндовый компилятор - пути править в make.bat и makefile)
P.S. Исходники редактора rw1_edit (являющегося ещё и средой разработки) не выкладываю т.к. автор большей его части не я...
перелицензировал:Shaos wrote: Вот думаю перелицензировать под MIT-лицензией