LINUX.ORG.RU
ФорумGames

Civ III под линукс.


0

1

Я некоторое время занимался своей курсовой по моделированию боя и решил попробовать повторить движок из третьей Цивилизации.

Когда я показал это в #qt на conference.jabber.ru меня спросили: не собираюсь ли я реинкарнировать Цивилизацию? Тут я задумался. Я честно скажу, что сам не вытяну это, в лучшем случае я вначале напишу байндинги OCaml к Qt, а только потом займусь серьёзной разработкой. Но если кто-то из вас вдохновится моей поделкой на разработку цивилизации подобной третьей, то я буду рад.

P.S. Прошу не кидать камнями - я знаю что есть freeciv. Но моё имхо, она не торт. Всё-таки в ней вторая цивилизация заложена, а не 3я.


На мое имхо вторая цивилизация лучше третьей. Делай.

radg ★★★★ ()

Четвертая лучше третьей. А пятая еще круче.

Делай на Common Lisp. Биндинги уже есть http://password-taxi.at/EQL

anonymous ()

К сожалению, занят над другим проектом, но ваше желание радует, думаю, что найдётся много поклонников цивилизации, желающих помочь. Инициатива похвальная :)

gavlig ★★★ ()

Мне кажется, что ты плохо себе представляешь объём работы. Игровая механика там настолько сложная, что занимает толстенький такой том. И трудность именно в ней.

karbofos ()
Ответ на: комментарий от KblCb

Сейчас есть представление карты в программе. Разобрался как подгружать спрайты. На каждую клетку можно складывать юниты (пока танки и пушки), можно сказать юниту пойти в одно из 8 направлений. Модно сказать юниту проиграть определенную анимацию (но это скорее минус чем плюс).

Сейчас код чисто на С++, а OCaml.... я его люблю) К тому же достаточно высокоуровневы язык, который незаслуженно мало использвуется. Вот биндинги - это проблема. Я пробовал писать - не самое приятно занятие. Если интересно, то можно отдельно про это поговорить.

Kakadu ()

Я очень хочу принять участие !

Мне нравится OCaml / F# , кстати в сети уже есть наработки и по F# to Qt и по OCalm to Qt , так же Qt-Haskell можно использовать, разбавляя питоном, но сложно сказать ))

nCdy ()
Ответ на: комментарий от nCdy

Я только что осмыслил, что не выложил свой курсач. https://github.com/Kakadu/proelium

Не знаю про F# to Qt, но OCaml to qt - нерабочее. Qthaskell вполне рабочий, но тут уже встает вопрос идеалогии - ка х-е кодить, или на камле. Мне кажется камло практичнее, но qt - да, проблема.

В идеале конечно же стоит начинать с байндингов камля к qt. Задно, возможно поможем рябятам, которые хотели писать замену konqueror на каком-нибудь функциональном языке. Кажется проект назывался minno.

Kakadu ()
Ответ на: комментарий от Kakadu

Haskell я уважаю больше, чем OCaml :) Ocaml люблю за простоту и за F#

nCdy ()

А собственно описание механики третьей цивилизации где-то есть или будете с нуля восстанавливать «чтобы похоже было»?

gizzka ★★ ()
Ответ на: комментарий от gizzka

> А собственно описание механики третьей цивилизации где-то есть или будете с нуля восстанавливать «чтобы похоже было»?

Какой там. Ребята просто поковыряются пару месяцев да забросят. Видно же, что ТС еще новобранец. Как практика сойдет.

Причем тут именно третья Цива вообще не ясно.

anonymous ()

>Я некоторое время занимался своей курсовой по моделированию боя

решил попробовать повторить движок из третьей Цивилизации.


Т.е. у вас тоже парень с топором за просто мочит танки и сбивает ядерные ракеты? :}

Evil_Wizard ★★★ ()
Ответ на: комментарий от Kakadu

Ну, например, как определить уровень коррупции в данном городе. Формула определения победителей в битве. Когда AI соглашается на сделки, по какой цене (хотя тут, конечно, простор для творчества). Какие бонусы давала сложность игры для AI. Вероятность загрязнения. И т.д.

Мб это все где-то и есть, я просто уже давно-давно не играл и подзабыл. Возможно, вам виднее :)

gizzka ★★ ()
Ответ на: комментарий от gizzka

> Мб это все где-то и есть, я просто уже давно-давно не играл и подзабыл. Возможно, вам виднее :)

Это всё есть на рабочем компе дяди Сида. Попросите выслать исходники.

anonymous ()
Ответ на: комментарий от anonymous

Ну это не ко мне, это к ТС :) Хотя часть механики сверх встроенной «справки» в свое время на профильных игровых ресурсах скорее всего описывалась.

gizzka ★★ ()
Ответ на: комментарий от gizzka

2gizzka: На память помню только схему со сложностью. С ростом сложности жители становятся всё менее счастливыми (так на максимальной сложности житель в только что построенном городе сразу же несчастен).

Остальные вопросы думаю можно нарыть на специализированных порталах.

2Evil_Wizard: у мена парня с топором нет, есть только танку, пушки и ПТУРы.

Kakadu ()

Цивилизация III, если сравнивать с новыми версиями - никому ненужный скучный отстой. А клон скучного отстоя никому не нужен вдвойне.

То что ты сделал движущиеся фигурки на доске - к Цивилизации отношения не имеет. Цивилизация - это математические модели, искусственный интеллект, генерация ландшафта, формулы, много формул. Формулы эти тестируются и шлифуются уже много лет профессионалами и армией игроков по всему свету.

А интерфейс ты можешь хоть в ASCII сделать.

Поэтому надо по-лучше разобраться с целями проекта.

anonymous ()
Ответ на: комментарий от anonymous

То, что цивилизация 3 хуже чем 4 и 5 - спорно точно также как и то, что цивилизация 2 хуже, чем 3. Но спасибо за ваше ИМХО.

Kakadu ()
Ответ на: комментарий от Evil_Wizard

> Т.е. у вас тоже парень с топором за просто мочит танки и сбивает ядерные ракеты? :}

:3

nCdy ()
Ответ на: комментарий от Kakadu

А, ну понял. Там есть крутые биндинги к .NET. А уже оттуда к F#.

Нет, такой радости для камля пока нет... А ты не знаешь, там код вызовов функций qt автогенерился или набирался руками?

Kakadu ()
Ответ на: комментарий от Kakadu

> Сейчас код чисто на С++, а OCaml.... я его люблю) К тому же достаточно высокоуровневы язык, который незаслуженно мало использвуется. Вот биндинги - это проблема. Я пробовал писать - не самое приятно занятие.

собери Qt с помощью LLVM clang, и посмотри HLVM в бложике ffconsultancy — HLVM это такой Ocaml с биндингами к LLVM (чтобы собрать HLVM надо собрать предварительно libsigsegv-2.6)

anonymous ()

У меня давно сложилось впечатление, что Сид выходом каждой новой версии желает составить конкуренцию предыдущей. Я могу это аргументировать, если потребуется. Что-то хорошо в одной, что-то в другой. 3-я хороша тем, что она на современном железе латает, и да, пожалуй, она лучшая из существующих.

Начинание хорошее, но ИМХО нереальное, т.к. AI компьютерных игроков слишком сложно будет реализовать. Все остальное - более или менее реально.

Kostafey ()
Ответ на: комментарий от anonymous

>Понабижали ностальгирующие фанаты

А за ними тянулись троллирующие анонимусы ;)

с синдромом утёнка.

Доказать сможем? ;) С Civilization знаком с 94-го. Причем со всеми версиями, как с и другими продуктами от Сида.

Kostafey ()

> в лучшем случае я вначале напишу байндинги OCaml к Qt, а только потом займусь серьёзной разработкой

https://github.com/Kakadu/proelium.git


так.. не нашел тут ничего на Ocaml, это пока только в планах, после допиливания lablqt?

собрал lablqt. У меня test сегфолтится, но общая идея понятна. Врапперы надо, на мой взгляд, писать не руками, а приспосабливать готовые инструменты вроде QtJambi — иначе ты их писать будешь вечность, а за это время уже появится Qt5.
Вот посмотри как это в QtD сделали: http://www.dsource.org/projects/qtd — допилили QtJambi, см. http://www.dsource.org/projects/qtd/browser/generator/ , в #d на c.j.r в жаббере тусуется автор (Эльдар).

anonymous ()
Ответ на: комментарий от anonymous

да, с Ocaml FFI всё не так просто

пропиарю HLVM

ставим:

mkdir -p ~/src/hlvm;cd ~/src/hlvm

wget ftp://ftp.gnu.org/gnu/libsigsegv/libsigsegv-2.6.tar.gz tar zxf libsigsegv-2.6.tar.gz && pushd libsigsegv-2.6 && ./configure --enable-static --enable-shared && make && sudo make install && popd svn checkout svn://svn.forge.ocamlcore.org/var/lib/gforge/chroot/scmrepos/svn/hlvm cp -R hlvm hlvm-build && pushd hlvm-build ./compile.sh /usr/bin/time -v ./hlvm #не работает vim compile.sh # дописываем -I/usr/local/include -L/usr/local/lib ./clean.sh && ./compile.sh LD_PRELOAD=/usr/local/lib/libsigsegv.so /usr/bin/time -v ./hlvm # вот так точно запускается #vim compile.sh /usr/bin/time -v ./hlvm #у меня вываливается с Stack overflow после первого теста

cd examples #аналогично правим compile.sh — эти тесты работают

теперь, смотрим в hlvm/examples/compiler3/repl.ml. Сравниваем это с вот этой писаниной external и primitives в Ocaml, и офигеваем, как всё в HLVM просто получается.

(** Bootstrap some built-in functions before allowing the user to define
    new functions. *)
let () =
  List.iter Hlvm.eval
    [
      `Extern("putchar", [`Int], `Unit);
      `Extern("sin", [`Float], `Float);
      `Extern("cos", [`Float], `Float);
      `Function("sin$1", ["x", `Float], `Float,
		Expr.Apply(Expr.Var "sin", [Expr.Var "x"]));
      `Function("cos$1", ["x", `Float], `Float,
		Expr.Apply(Expr.Var "cos", [Expr.Var "x"]));
      `Function("print_char$1", ["c", `Int], `Unit,
		Expr.Apply(Expr.Var "putchar", [Expr.Var "c"]));
      `Function("float_of_int$1", ["n", `Int], `Float,
		Expr.FloatOfInt(`Float, Expr.Var "n"));
      `Function("int_of_float$1", ["x", `Float], `Int,
		Expr.IntOfFloat(`Int, Expr.Var "x"));
      `Function("float_array$1", ["nx", `Struct[`Int; `Float]], `Array `Float,
		Expr.Alloc(Expr.GetValue(Expr.Var "nx", 0),
			   Expr.GetValue(Expr.Var "nx", 1)))
    ];
  (*
    Hlvm.debug := true;
  *)
  try
    repl ({ defs = [] }, fun _ -> 1)
  with End_of_file ->
    Hlvm.save();
    printf "\n"

То есть: HLVM это такой ML, написанный на Ocaml под LLVM. Сборщик мусора написан на самом HLVM, в итоге сильно упрощается. Внешние С прототипы вставляются в рантайм как LLVM intrinsincs, `Unit — это LLVM Block кода, sin/cos взяты из libc, int_of_float$1 и float_of_int$1 — из HLVM runtime (см. исходники HLVM).

Теперь приходит в готову следующая мысль. А зачем, собсно, для вызова из Qt C++ кода из HLVM нужны врапперы? Если C++ прототипы можно вставить точно таким же образом. В случае Ocaml, он у нас понимает только external C, к С++ коду нужно писать extern «C» {..} обёртки, потому что понимает только C код. В случае HLVM, мы можем отконпелировать C++ код clang-ом в тот же llvm биткод

anonymous ()
Ответ на: комментарий от anonymous

В случае HLVM, мы можем отконпелировать C++ код clang-ом в тот же llvm биткод

например, cat > hello.cpp <EOF

#include <iostream>
using namespace std;
int main () {
 cout<<"Hello, World!\n";
 return 0;
}
EOF

clang hello.cpp -lstdc++ -emit-llvm -c -o hello.bc llvm-dis hello.bc cat hello.ll

; ModuleID = 'hello.bc' target datalayout = «e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64» target triple = «x86_64-unknown-linux-gnu»

%0 = type { i32, void ()* } %«class.std::basic_ostream» = type { i32 (...)**, [264 x i8] } %«class.std::ios_base::Init» = type { i8 }

@_ZStL8__ioinit = internal global %«class.std::ios_base::Init» zeroinitializer, align 1 @__dso_handle = external global i8* @_ZSt4cout = external global %«class.std::basic_ostream» @.str = private constant [15 x i8] c"Hello, World!\0A\00" @llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, void ()* @_GLOBAL__I_a }]

define internal void @__cxx_global_var_init() { call void @_ZNSt8ios_base4InitC1Ev(%«class.std::ios_base::Init»* @_ZStL8__ioinit) %1 = call i32 @__cxa_atexit(void (i8*)* bitcast (void (%«class.std::ios_base::Init»*)* @_ZNSt8ios_base4InitD1Ev to void (i8*)*), i8* getelementptr inbounds (%«class.std::ios_base::Init»* @_ZStL8__ioinit, i32 0, i32 0), i8* bitcast (i8** @__dso_handle to i8*)) ret void }

declare void @_ZNSt8ios_base4InitC1Ev(%«class.std::ios_base::Init»*)

declare void @_ZNSt8ios_base4InitD1Ev(%«class.std::ios_base::Init»*)

declare i32 @__cxa_atexit(void (i8*)*, i8*, i8*)

define i32 @main() { %1 = alloca i32, align 4 store i32 0, i32* %1 %2 = call %«class.std::basic_ostream»* @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(%«class.std::basic_ostream»* @_ZSt4cout, i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0)) ret i32 0 }

declare %«class.std::basic_ostream»* @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(%«class.std::basic_ostream»*, i8*)

define internal void @_GLOBAL__I_a() { call void @__cxx_global_var_init() ret void }

теперь, в HLVM надо вот такие же прототипы, аналогичные этим C++ прототипам и воткнуть.

anonymous ()
Ответ на: комментарий от anonymous

в итоге в идеале можно получить код без всяких обёрток в рантайме. Чтобы все обёртки разворачивались во время конпеляции.

anonymous ()
Ответ на: комментарий от anonymous

Ой, спасибо вам, что так подробно пишете. Меня посещали мысли о использовании llvm и связанных с ним вещей, но я наткнулся на некоторые сложности в освоении. ЖЖка какая-то была унылая, а просмотр документации, нагенеренной doxygen меня несколько удручало. Но сейчас я уже почти готов накомпилять llvm заново и начать тащить, ибо идея, которую они пытаются воплотить в жизнь мне очень нравится.

Kakadu ()
Ответ на: комментарий от Kakadu

> Меня посещали мысли о использовании llvm и связанных с ним вещей, но я наткнулся на некоторые сложности в освоении

непременно посмотри две вещи: LLVM Ocaml tutorial про написание компилятора своего языка Kaleidoscope вроде питона — есть варианты туториалов на С++ и на Ocaml, сравни и почувствуй разницу :) и во, вторых, HLVM — ссылка на идеологию и описание выше, плюс в бложике автора есть бенчмарки и сравнения его HLVM-а с Ocaml-ом и F#. Он ещё продаёт Ocaml Journal, где пишет подробно про HLVM, правда журнал стоит дороговато, около 50 фунтов; но что-то можно понять и из SVN и примеров.

anonymous ()
Ответ на: комментарий от Kakadu

в общем, идея с HLVM Qt bingings мне кажется вот такой:
1. clang-ом собираем Qt и само конечное приложение на Qt. Например, простой хелловорд с кнопкой и MessageBox для начала. Собираем в 2 вариантах: а) исполняемый запускаемый бинарник б) llvm IR ассемблер, helloworld.ll
2. затем, надо распарсить helloworld.ll и как-то отделить вызовы С++ методов (если в hello.cpp cout<<«Helloworld!\n»; это ostream::cout, operator <<, в Qt С++ хелловорде тут будут все реально вызываемые в программе методы, то есть не учитывая инициализацию C++ рантайма и т.п.). Вытаскиваем и храним имена методов с манглингом в каком-то удобном виде (дерево).
3. по распарсенному генерировать код обёрток для HLVM автоматически.
4. линковка программы на HLVM с HLVM runtime, C++ runtime (libstdc++ или libc++ из clang), libQt ... .a, собранных llvm обеспечит запускаемость C++ кода из HLVM кода.

То есть, пишем код на С++ и собираем С++ модуль clang-ом; пишем ML модуль а HLVM и собираем как ./comple.sh; линкуем это всё вместе и работают вызовы туда-сюда в обе стороны, без промежуточных С-обёрток в extern «C» {...} и с заинлайненными во время компиляции врапперами ocaml->C, C->Ocaml (там в примере sin, sin$1 и putchar, putchar$1 это примерно оно и есть.

anonymous ()

кстати, на моей уютненькой Генте не собирается последний ocaml 3.12. GCC 4.6.0, 4.5.2, lto USE=graphite включён (из-за него не собирается?)

не собирается random.ml когда дело идёт к ocamplopt

кто-нибудь это победил?



cave resolve -xn dev-lang/ocaml #emerge или сборка руками тоже не помогают

make[3]: Entering directory `/var/tmp/portage/paludis/dev-lang-ocaml-3.12.0/work/ocaml-3.12.0/otherlibs/labltk/camltk'
cd ..; ../../boot/ocamlrun compiler/tkcompiler -camltk -outdir camltk
(echo '##define CAMLTK'; \
echo 'include Camltkwrap'; \
echo 'open Widget'; \
echo 'open Protocol'; \
echo 'open Textvariable'; \
echo ; \
cat ../builtin/report.ml; \
echo ; \
cat ../builtin/builtin_*.ml; \
echo ; \
cat _tkgen.ml; \
echo ; \
echo ; \
echo 'module Tkintf = struct'; \
cat ../builtin/builtini_*.ml; \
cat _tkigen.ml; \
echo 'end (* module Tkintf *)'; \
echo ; \
echo ; \
echo 'open Tkintf' ;\
echo ; \
echo ; \
cat ../builtin/builtinf_*.ml; \
cat _tkfgen.ml; \
...skipping...
buffer.cmx` -c buffer.ml
../boot/ocamlrun ../ocamlopt -warn-error A -nostdlib -g `./Compflags printf.cmx` -c printf.ml
../boot/ocamlrun ../ocamlopt -warn-error A -nostdlib -g `./Compflags format.cmx` -c format.ml
../boot/ocamlrun ../ocamlopt -warn-error A -nostdlib -g `./Compflags scanf.cmx` -c scanf.ml
../boot/ocamlrun ../ocamlopt -warn-error A -nostdlib -g `./Compflags arg.cmx` -c arg.ml
../boot/ocamlrun ../ocamlopt -warn-error A -nostdlib -g `./Compflags printexc.cmx` -c printexc.ml
../boot/ocamlrun ../ocamlopt -warn-error A -nostdlib -g `./Compflags gc.cmx` -c gc.ml
../boot/ocamlrun ../ocamlopt -warn-error A -nostdlib -g `./Compflags digest.cmx` -c digest.ml
../boot/ocamlrun ../ocamlopt -warn-error A -nostdlib -g `./Compflags random.cmx` -c random.ml
/var/tmp/portage/paludis/dev-lang-ocaml-3.12.0/temp/camlasmfc17ce.s: Assembler messages:
/var/tmp/portage/paludis/dev-lang-ocaml-3.12.0/temp/camlasmfc17ce.s: Error: .size expression for camlRandom__rawfloat_1099 does not evaluate to a constant
File «random.ml», line 1, characters 0-1:
Error: Assembler error, input left in file /var/tmp/portage/paludis/dev-lang-ocaml-3.12.0/temp/camlasmfc17ce.s
make[2]: Leaving directory `/var/tmp/portage/paludis/dev-lang-ocaml-3.12.0/work/ocaml-3.12.0/stdlib'
make[1]: Leaving directory `/var/tmp/portage/paludis/dev-lang-ocaml-3.12.0/work/ocaml-3.12.0'
make[2]: *** [random.cmx] Error 2
make[1]: *** [libraryopt] Error 2
make: *** [opt] Error 2
/usr/libexec/paludis/utils/emake: emake returned error 2

!!! ERROR in dev-lang/ocaml-3.12.0::gentoo:
!!! In src_compile at line 4280
!!! make opt failed!

!!! Call stack:
!!! * src_compile (/var/tmp/portage/paludis/dev-lang-ocaml-3.12.0/temp/loadsaveenv:4280)
!!! * ebuild_f_compile (/usr/libexec/paludis/1/src_compile.bash:49)
!!! * ebuild_main (/usr/libexec/paludis/ebuild.bash:646)
!!! * main (/usr/libexec/paludis/ebuild.bash:672)


anonymous ()
Ответ на: комментарий от Kakadu

LLVM вообще надо по publications изучать — там есть 2-3 хороших презентации, в самом конце и в самом начале, где приводят общий обзор и сравнение clang/dragonegg/gcc; ну и по LLVM Projects, смотреть как практически компиляторы написаны. LLVM Ocaml tutorial в составе официальной доки тоже годный.

anonymous ()
Ответ на: комментарий от anonymous

Есть мнение что HLVM прекратил свое развитие, после того как Джон Харроп стал во всю заниматься фэшарп. Как -нибудь можете прокомментировать это?

Kakadu ()
Ответ на: комментарий от Evil_Wizard

Т.е. у вас тоже парень с топором за просто мочит танки и сбивает ядерные ракеты? :}


Очень правильно парень с топором мочит ядерные ракеты, кто этого не понимает - ну ты понел :D.

Ракеты в цивилизации очень специфические. Вот например каверзный вопрос «знатокам» - когда ракета ходит по карте, она летит своим ходом или едет на пусковой платформе? :)

kernel ★★☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.