Разработка и ромхакинг > Разработка игр
Civgen - Цивилизация 1 на Sega Mega Drive
<< < (4/5) > >>
sadhedg:

--- Цитата: grooomy от 12 Январь 2020, 20:00:24 ---Понятно. Ну в принципе тоже верно.
От себя пожелания можно озвучить? (Их не обязательно реализовывать:)  )  Они связаны с адаптацией под консольное управление с джойстика в первую очередь.
1) Нужно залочивать курсор в пределах всплывающих менюшек юнитов/городов  до момента выбора или выхода из них.
2) Нужно залочивать курсор в пределах полей меню/карты  внутри города с возможностью переключения между ними.
3) Нужны экраны с анимацией (например основание города)
4) Нужно сгладить границы "тумана войны".
5) Не хватает "лестницы открытий"
6)  Нужно залочивать курсор в пределах мира/карты мира/игровых меню. Переключение между которыми осуществляеться кнопкой С.
7) Ну и вид города, адекватный ИИ и музыка конечно :)

--- Конец цитаты ---

Спасибо, про лок курсора интересный совет. С другой стороны, как сейчас - можно продолжать туда-сюда бегать по карте, чтобы лучше оценить ситуацию. Я подумаю.
Экраны с анимацией города - это и есть то, что я называю "вид города". На плане A планируется показ жителей/беспорядков/входящей армии/парада/поселенцев. Соответственно, план A будет скроллиться, если надо. На плане Б будет сам город. Сначала матрицу зданий надо просто создать, а потом уже нарисовать - а это-то самое трудное. Многослойность будет чисто софтварная. Ну и все здания, а также травка и небо будут в 16 цветов.
Дерева открытий в наглядном виде и в оригинале не было. Оно в мануале шло. А на СНЕС даже нельзя заранее посмотреть, что даст та или иная технология. Но цивилопедия как в оригинале будет - не деревом, но просто списком всех тех, зданий и т.п.. Это не в приоритете просто. Криво нарисованная книжка в меню - это оно и будет.

С туманом войны сложно. Всё-таки Сега не СНЕС, слоя всего 2. А запас спрайтов я бездарно потратил на цифры населения - без этого можно было обойтись, но так красивее (или надо было делать тайлы с пополам разрезанными цифрами). На стороне "черноты" закруглить ещё можно без особых проблем, а вот на стороне известной земли - только стирая дороги и т.п..

В 1.10.1:
1) исправлен баг - при спавне первого поселенца размер континента считался неправильно, и поселенцы спавнились в том числе на микро-островах. Теперь спавнятся как в оригинале.
2) изменены правила уплывания на другие континенты - теперь оно идёт более активно, даже если на текущем континенте у ИИ есть враги.
3) предположительно исправлен редкий баг при сохранении игры, который приводил к записи за границы массива юнитов (внешне могло проявляться в коррапте графики и исчезновении юнитов)
4) проценты для Civilization Rating теперь точно такие, как в оригинале

А ведь даже если бы у нас был полный дизассембл Civ, я бы не смог им полноценно воспользоваться - многих вещей у меня ради экономии памяти просто нет.
grooomy:

--- Цитата ---   На стороне "черноты" закруглить ещё можно без особых проблем, а вот на стороне известной земли - только стирая дороги и т.п..
--- Конец цитаты ---
А если отрисовывать известную землю на одну клетку дальше, но со стертыми дорогами и т.п. без отображения на них юнитов и городов. Так, что бы эти "крайние" клетки были наполовину (или другую часть) скрыты "темнотой"? Интересно было бы поэкспериментировать с обхождением этого ограничения с целью улучшить визуальную составляющую.
--- Цитата ---     А ведь даже если бы у нас был полный дизассембл Civ, я бы не смог им полноценно воспользоваться - многих вещей у меня ради экономии памяти просто нет.
--- Конец цитаты ---
Наверно и из за этого в том числе Civ не появилась на сежке, увы :(   А ведь если бы у нас была civ на мегадрайве в девяностых, то дети 90х  вспоминали бы ее с таким же трепетом как и dune 2 (фантазирует)  :)
SeregaZ:
наврядли бы дети осилили. далеко ходить не надо - всякие пополюс 2 не дадут соврать. что-то я не припоминаю чтоб мы в школе о ней трындели. сложноватая :) посему там в 90 в играх должна была быть казуальность, чтобы было интересно и понятно как играть даже без знания буржуйского. сейчас то со своей колокольни уже понятно как играть и чо делать в цивилизации и её клонах, но если представить себя в 90е, когда в буржуйском нивзубногой... хотя я даже маленько поиграл на 486 в первую цивилизацию, но мне больше понравилась F29 и про вертолет там какой-то симулятор. цивилизация не зашла. в то время :)
ALKOSHA:
sadhedg, cлушой. А как ты сделал проявление картинки из рандом пикселей?
Это получается поверх плейна с уже готовой пикчей рисуется массив точек в векторном виде (put-pixel) ?
sadhedg:

--- Цитата: ALKOSHA от 22 Январь 2020, 21:53:23 ---sadhedg, cлушой. А как ты сделал проявление картинки из рандом пикселей?
Это получается поверх плейна с уже готовой пикчей рисуется массив точек в векторном виде (put-pixel) ?

--- Конец цитаты ---
Если вы имеете в виду рисование заставки, то просто в оперативной памяти хранится, какие пиксели уже нарисованы, и с учётом этого формируется текущий тайл из того тайла, который в РОМе. При каждом добавлении пикселя весь тайл в видеопамяти обновляется. Скажу ещё более страшную вещь - в ROMе хранится последовательность рисования этих пикселей. Рандома нет, точки всегда в одних и тех же местах, не считая смещения. Сначала я запустил рандомное рисование и результат сохранил в sram. Затем добавил содержимое sram-файла в ROM. Быдлокод же. Уж очень мне хотелось сделать такое рисование, т.к. на snes оно есть (но там картинка поменьше). Как такой эффект был реализован на досе (а ведь там весь экран, а не какая-то часть) - для меня вообще загадка. Я попытался посмотреть исходники Вульфенштайна, где вроде тоже такое есть, да плюнул.

Вот рисуется эта загогулина почти 7 секунд (и у меня вряд ли может быть быстрее), но уж очень мне хочется, чтобы она была.

Сейчас мне пришло в голову, что правильней НЕ хранить в ОЗУ матрицу "где уже нарисовано", а вместо этого хранить всю картинку целиком. Тогда при рисовании каждого нового пикселя нужно будет добавить в тайл только его. Так и сделаю. UPD: Готово. Время рисования сократилось до ~5 секунд.
Sharpnull:

--- Цитата: sadhedg от 27 Январь 2020, 23:14:24 ---Я попытался посмотреть исходники Вульфенштайна, где вроде тоже такое есть, да плюнул.

--- Конец цитаты ---
В книге Game Engine Black Book: Wolfenstein 3D написано. Используется Регистр сдвига с линейной обратной связью. Классная штука, в NES шум генерируется также. Прелесть в том, что все значения обходятся, как раз подходит для заполнения экрана, только нужно подобрать значения под размер экрана.
--------
Вот книга, страница 239.
--------
Конечно, нужен не обычный LFSR, а maximal-length Galois LFSR. Релизация в Wolf4SDL для больших разрешений.
Готовый пример на основе англ. википедии с заполнением массива 320x200:

--- Код: ---#include <stdio.h>
#include <stdint.h>

int test[320 * 200];

unsigned lfsr2(void)
{
    uint16_t start_state = 0xACE1u;  /* Any nonzero start state will work. */
    uint16_t lfsr = start_state;
    unsigned period = 0;

    do
    {
        unsigned lsb = lfsr & 1u;  /* Get LSB (i.e., the output bit). */
        lfsr >>= 1;                /* Shift register */
        if (lsb)                   /* If the output bit is 1, */
            lfsr ^= 0xB400u;       /*  apply toggle mask. */

        ++period;
        if (lfsr < 320 * 200)     /* Вычисляем X, Y и отображаем пиксель */
            test[lfsr] = 1;
    }
    while (lfsr != start_state);

    return period;
}

int main()
{
    printf("Period: %u\n", lfsr2());
    for (int i = 0; i < 320 * 200; i++)
        printf("%d", test[i]);

    return 0;
}
--- Конец кода ---
Ноль там не заполнился, кажется его нужно специально обрабатывать.
sadhedg:

--- Цитата: Sharpnull от 27 Январь 2020, 23:30:25 ---В книге Game Engine Black Book: Wolfenstein 3D написано. Используется Регистр сдвига с линейной обратной связью. Классная штука, в NES шум генерируется также. Прелесть в том, что все значения обходятся, как раз подходит для заполнения экрана, только нужно подобрать значения под размер экрана.
--------
Вот книга, страница 239.
--------
Конечно, нужен не обычный LFSR, а maximal-length Galois LFSR. Релизация в Wolf4SDL для больших разрешений.
Готовый пример на основе англ. википедии с заполнением массива 320x200:

--- Код: ---#include <stdio.h>
#include <stdint.h>

int test[320 * 200];

unsigned lfsr2(void)
{
    uint16_t start_state = 0xACE1u;  /* Any nonzero start state will work. */
    uint16_t lfsr = start_state;
    unsigned period = 0;

    do
    {
        unsigned lsb = lfsr & 1u;  /* Get LSB (i.e., the output bit). */
        lfsr >>= 1;                /* Shift register */
        if (lsb)                   /* If the output bit is 1, */
            lfsr ^= 0xB400u;       /*  apply toggle mask. */

        ++period;
        if (lfsr < 320 * 200)     /* Вычисляем X, Y и отображаем пиксель */
            test[lfsr] = 1;
    }
    while (lfsr != start_state);

    return period;
}

int main()
{
    printf("Period: %u\n", lfsr2());
    for (int i = 0; i < 320 * 200; i++)
        printf("%d", test[i]);

    return 0;
}
--- Конец кода ---
Ноль там не заполнился, кажется его нужно специально обрабатывать.

--- Конец цитаты ---
Вах, ну это царский подгон. Надеюсь, когда-нибудь я с этим разберусь.
Sharpnull:
sadhedg, у вас картинка 296x80, как я понял. Тогда там хватит 15 битов: многочлен x^15 + x^14 + 1, что равносильно маске 0x6000. Другой пример на C с вынесенным циклом:

--- Код: ---#include <stdio.h>
#include <stdint.h>

#define IMG_SIZE (296 * 80)
int test[IMG_SIZE];

uint16_t start_state = 0x10DE; /* Любое != 0, но <= период */
uint16_t lfsr;

uint16_t lfsr2(void)
{
    uint16_t lsb = lfsr & 1u;  /* Get LSB (i.e., the output bit). */
    lfsr >>= 1;                /* Shift register */
    if (lsb)                   /* If the output bit is 1, */
        lfsr ^= 0x6000u;       /*  apply toggle mask. */
    return lfsr;
}

int main()
{
    lfsr = start_state;

    uint16_t x = 0;
    uint16_t y = 0;
    uint16_t next = lfsr2();
    while (next != start_state) {
        next = lfsr2();
        if (next < IMG_SIZE) {
            x = next % 296;
            y = next / 296;
            //printf("%u,%u ", x, y);
            test[next] = 1;
        }
    }
    x = 0;
    y = 0;
    test[0] = 1;

    for (int i = 0; i < IMG_SIZE; i++)
        printf("%d", test[i]);

    return 0;
}
--- Конец кода ---
Также попробовал на JS для наглядности: https://jsfiddle.net/infval/pmqnwfb2/. Нажать Run для повтора. В обоих случаях я начинаю не с начального состояния, а им заканчиваю, но это не важно. В JS точку (0, 0) не закрашивал.
--------
И сделайте "появление заставки" пропускаемой по кнопке. Заставлять ждать заставки - одна из худших особенностей, что может сделать разработчик игр.
--------
Обновил код на JS, чтобы (0, 0) тоже закрашивался, нужно от возвращаемого значения функции отнять 1, тогда все пиксели сместятся. Их можно брать из любого места, период всё равно больше картинки, лишние отбрасываются.
А в коде на C я даже два числа пропускаю от начального, но так как всё идёт по кругу, все заполняются всё равно. Можно было использовать break или do {} while (condition), который мне не нравится. Разберётесь.
sadhedg:
Всякие мелкие изменения.
1) Поправил диагональное перемещение курсора - больше не нужно строго одновременное нажатие для перемещения по диагонали, и больше нет бага с перемещением "ходом коня" вместо перемещения по диагонали.
2) При перемещении курсор больше не мигает. Мигает только если неподвижен.
3) ИИ при строительстве чего-либо в городе теперь не "сжигает" излишки щитов. Это читерское поведение из оригинала, я всё же добавил его, чтобы хоть как-то помочь моему ущербному ИИ.
4) поселенцы ИИ могут строить крепости (теоретически...) - играет роль кол-во защитных юнитов в клетке, защита местности и особенно что это перешеек (2 выхода к океану и более). При окончании строительства создаётся точка защиты.
5) Атомная бомба ИИ теперь гораздо менее склонна атаковать вражеский город на пути полёта, если этот город - не её цель.
6) юниты ИИ с бОльшим шансом идут в стратегические точки. Кроме того, если раньше некоторые юниты также могли идти к ближайшей вражеской столице на континенте - то теперь в половине этих случаев они пойдут к любому ближайшему вражескому городу, а не столице.
7) Багфиксы, мелкие оптимизации.
Kosvor:
Команда "Go To" больше не работает?
sadhedg:

--- Цитата: Kosvor от 08 Февраль 2020, 19:56:11 ---Команда "Go To" больше не работает?

--- Конец цитаты ---
Сломал, починил.
sadhedg:
Выложил новую версию. Изменения:

1) Декомпилировал алгоритм спавна наземных варваров из оригинала, спавн наземных варваров добавлен в игру. Также по мелочи исправлены некоторые другие правила, если они расходились с оригиналом.

2) военные юниты ИИ снова более активно отплывают к другим континентам

3) некоторые другие правки поведения ИИ

4) багфиксы, оптимизации

EDIT: также по декомпилированному оригиналу исправлен алгоритм выбора города-цели для кораблей варваров. В дальнейшем предполагается разобрать всю рутину поведения варварских юнитов из оригинала и заменить самописное поведение варваров на оригинальное.

EDIT 2: 1) исправил сломанную в 1.10.0.0 из-за опечатки в коде анимацию лампочек на экране космич. победы. 2) декомпилировал логику юнитов варваров из оригинала (ссылку на пастебин найти можно на civfanatics). Когда будет возможность, перепишу самописную рутину варваров на близкую к оригинальному поведению.  Кроме того, теперь мне гораздо легче будет заняться оригинальной логикой юнитов полноценных цивилилизаций - имея перед глазами и оригинал, и разбор от darkpanda, я буду лучше понимать, что к чему. Мне почему-то казалось, что darkpanda многие вещи не идентифицировал, поэтому раньше не хотелось связываться с оригинальной логикой юнитов. Но теперь будет легче.

Надеюсь, что можно будет разобрать и правила строительства в городах/выбора формы правления/распределения налогов. Но тут оригинал годится в качестве подсказки, в целом эти аспекты в civgen меня устраивают. Меня не устраивает очень вялое перемещение юнитов. В оригинале комп интересен, постоянно держит в напряжении, высаживает войска в самые незащищённые участки и т.п..
Kosvor:
Про версию 1.10.6.3: не надо было менять fission на fusion. Это не опечатка.
sadhedg:

--- Цитата: Kosvor от 06 Апрель 2020, 18:04:01 ---Про версию 1.10.6.3: не надо было менять fission на fusion. Это не опечатка.

--- Конец цитаты ---
Да это мной же придуманное из головы правило, так что скорее я хотел написать fusion, но уж не помню. Смысл такой - если ИИ знает термояд, он может купить АЭС, если у него много денег, т.к. в Civilizaiton 1 после исследования термояда  аварий на АЭС больше не бывает. Иметь АЭС без термояда чревато - может рвануть, поэтому ИИ покупать их в этом случае запрещено. Впрочем, в оригинале АЭС взрывается вообще только у человека.

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

Что касается новостей - экран военной победы технически готов, т.е. через него можно пройти и получить реплей/рейтинг/Зал Славы. Сегодня выложу новую версию. Однако на этом экране пока нет фона ("галереи") и портретов на ней, а также выражения лиц многих лидеров не готовы.

EDIT: 10 апреля выкладываю версию 1.11. Изменения:
1) логика наземных варваров приближена к оригинальной
2) максимальное число городов увеличено с 99 до 110
3) багфиксы и оптимизации, незначительные изменения правил

EDIT 2: 30 апреля наконец-то добавлен поиск города. 5-7 мая добавлен функционал Цивилопедии в меню (кроме пункта "Разное")
sadhedg:
К настоящему моменту (если я ничего не забыл) я могу сказать, что вся логика ИИ из оригинала разобрана. Поэтому я принял принципиальное решение в будущем отказаться от всего самописного кода для ИИ и заменить его на оригинальную логику. Причины:
1) чтобы это чувствовалось как настоящая оригинальная игра, а не что-то по мотивам
2) чтобы челлендж был выше

Хотя в моей логике ИИ вёл себя гораздо ближе к правилам игрока-человека (и отличия были в основном количественные, а не качественные) - например, по-настоящему строил чудеса, мог пользоваться авианосцами и т.д. и т.п., а также во многом вёл себя разумнее оригинала (распределение налогов) - но его развитие и опасность сильно не дотягивали до оригинала, поэтому я прекращаю попытки написать свой ИИ. Ведь я и делал это только потому, что тогда считал, что у меня не хватит ума декомпилировать недостающие части.

Кроме того, если заменять на оригинал только некоторые части поведения ИИ, они не стыкуются с остальными, поэтому надо заменять либо всё, либо ничего. Например, при оригинальной логике смены гос. строя ИИ у меня практически никогда не слезает с деспотизма, т.к. штампует слишком много юнитов по сравнению с оригиналом.

Так что скоро со строящимися в городах ИИ чудесами света, свободно разгуливающими  по карте караванами ИИ и прочими прелестями придётся распрощаться.

Приятным бонусом будет оригинальная логика GoTo, которая хоть и не очень умная, но всё-таки куда лучше, чем моя.
Guyver(X.B.M.):
Не планируется ли сделать две версии? Не обидно, что много наработок пропадёт?
SPOT:
Можно сделать в опциях выбор варианта ИИ, оригинал и авторский.
Правда придётся доработать "свой" вариант, если он не доделан.
TiberiyLTim:
Летсплей от Майка:

SeregaZ:
мелодия в конце колбаса! знать бы что это и где скачать :)
ndivision:
Супер проект.

Давно слежу. Сега просто совсем не приоритет как консоль.
В свое время под DOS я очень плотно реверсил версию под DOS.
Найты бы наработки года 98-99 :((
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии