Coder Social home page Coder Social logo

kreghek / zilon_roguelike Goto Github PK

View Code? Open in Web Editor NEW
27.0 4.0 14.0 47.9 MB

Survival roguelike game with huge world generation.

License: MIT License

C# 98.43% PowerShell 0.05% Gherkin 1.46% Batchfile 0.01% Vim Snippet 0.06%
codacy-badge unity3d-games netcore game-dev survival-game roguelike-game roguelikedev code-quality roguelike-dungeons game-development

zilon_roguelike's Introduction

Hi there 👋

🔭 I’m currently working on

TESTAMENT is a RPG about heroes from ancient ages in a sci-fi future fighting monsters attacking from forgotten myths and scary tales.

Add it to wishlist on Steam

Join us on Reddit

image

Screenshots: image image image

Stats

kreghek's github stats

Top Langs

zilon_roguelike's People

Contributors

dcorriveau avatar dcparga avatar dependabot-preview[bot] avatar dependabot[bot] avatar dobryakk555 avatar epresi avatar flor3sc0 avatar gregoryghost avatar imgbotapp avatar irumba avatar kreghek avatar luisvita avatar nardin avatar shockthunder avatar tgspn avatar valentk777 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

zilon_roguelike's Issues

[Core] Добавить использование брони

Если удар прошёл через оборону, то нужно проверять пробитие брони.

Механика:

  1. Проверятся ранг брони и действия (ArmorRank и ApRank).
  2. Если у действия ранг равен или меньше, чем ранг брони, то пробрасывается спас-бросок за броню.
  3. Если спас-бросок прошёл, то броня снижает урон на Absorbtion (не меньше 1).
  4. Если спас-бросок не прошёл, то урон не модифицируется.

Добавить название сектора

Где-нибудь на экране выводить название сектора. Сейчас название сектора генерировать как "Подземелье N", где N - просто порядковый номер.

Найти корректное исправление замечания анализатора Co-variant array conversion

Selected: Co-variant array conversion (8)
Zilon.Core.Tests/Schemes
SchemeServiceTests.cs (1)
79: Co-variant array conversion from string[] to object[] can cause run-time exception on write operation
Zilon.Core.Tests/Tactics
DropTableChestStoreTests.cs (2)
30: Co-variant array conversion from Resource[] to IProp[] can cause run-time exception on write operation
59: Co-variant array conversion from Resource[] to IProp[] can cause run-time exception on write operation
Zilon.Core.Tests/Tactics/Spatial
HexNodeHelperTests.cs (1)
57: Co-variant array conversion from HexNode[] to object[] can cause run-time exception on write operation
Zilon.Core/MapGenerators
SectorProceduralGenerator.cs (2)
87: Co-variant array conversion from HexNode[] to IMapNode[] can cause run-time exception on write operation
107: Co-variant array conversion from HexNode[] to IMapNode[] can cause run-time exception on write operation
Zilon.Core/Persons
EvolutionData.cs (1)
75: Co-variant array conversion from PerkJob[] to IJob[] can cause run-time exception on write operation
Zilon.Core/Tactics/Spatial/PathFinding
AStar.cs (1)
234: Co-variant array conversion from HexNode[] to IMapNode[] can cause run-time exception on write operation

Ключевые механики v0.1

Целевой игровой процесс:

  1. Игрок управляет одним юнитом.
  2. Карта - процедурно сгенерирована. Квадратные комнаты, соединённые прямыми коридорами. Шестигранная сетка.
  3. В каждой комнате - монстр с произвольными характеристиками (ХП, атака, ближний/дальний). Монстры патрулируют комнаты.
  4. В произвольной комнате есть ячейка выхода. Если игрок встал на выход, то генерируется новый лабиринт.
  5. Есть ХП, сытость и патроны. Все три ресурса пополняются, если встать на специальную ячейку.
  6. ХП уменьшается при получении урона. Если ХП == 0, экран конца игры с номером лабиринта.
  7. Если кончается сытость - начинают отниматься ХП.
  8. Если кончаются патроны - нельзя стрелять (дальняя атака).
  9. У игрока 2 действия - ближняя и дальняя атака. По умолчанию - ближняя.
    10 Текущий прогресс сохраняется в локальную БД.
  10. Убитые монстры генерируют ячейки ресурсов.
  11. Стрелять можно, если можно построить прямую линию до противника и нет стен.

Добавить запрет на выполнение задачи OpenContainerTask сквозь стены

см. //TODO Сделать проверку, чтобы нельзя было открывать сундуки через стены аналогично команде на открытие.

В случае попытки открыть сундук через стены - выбрасывать исключение.

Добавить тест на проверку открытия без стен и выброс исключения в случае наличия стен.

[Core] Характеристики выживания должны сниматься на 4+

см. Базовые механики.

Добавить источник рандома для модуля Выживания. Сам модуль выживания должен увеличивать голод и жажду на 4+. Предусмотреть, что бросок будет зависеть от схемы персонажа и модифицироваться перками, окружением, эффектами.

Выводить маршрут, по которому будет перемещаться персонаж игрока

За курсором игрока должен быть трекер маршрута, как будет перемещаться персонаж игрока. Отображать маршрут мигающими точками (как в Stoneshard). Отображать выбранный узел. Пока видится, как анимированные углы гекса.

Сделать оповещение о результатах бросков на эффективность и попадания

Сделать события актёра для выброса результатов бросков:

  1. Эффективность применения действия.
  2. ToHit.

Событие должно содержать:

  1. Цель броска (tohit, efficient).
  2. Цель действия (другой персонаж).
  3. объект броска.
  4. использование перебросов
  5. штрафов
  6. итоговое значение бросков.
  7. успех или нет

Для текущих схем необходимо ввести интерфейсы с геттерами

Мероприятие в рамках повышения безопасности кода. Схемы должны быть строго только для чтения.
Для этого необходимо ввести интерфейсы со свойствами-геттерами. В корке и в клиенте должны использоваться только интерфейсы.
Если схема используется в тестах, то нужно создать класс с сеттером и использовать его только в тестах.

Реализовать генерацию сектора по схеме

Схема должна содержать:

  1. Количество комнат.
  2. Ссылки на схемы монстров, которые могут генерироваться в секторе.
  3. Таблицы дропа для монстров. (2 и 3 должны быть подсхемой).
  4. Таблицы дропа для сундуков.

Результат игры

Если игрок помер, то после небольшой задержки выводить экран You dead. Выводить количество пройденных секторов. Добавить кнопку рестарта.

Создать тесты для PropStoreBase

Покрыть методы:

  1. Add
  2. Remove
  3. Проверить выстрел событий на добавление предмета в хранилище, удаление предмета из хранилища, изменение предмета (актуально для стаков ресурсов).

Все тесты должны содержать комментарии, начинающиеся "Тест проверяет, что...". Тело теста должно состоять и 3 блоков, отделённых тремя строками: ARRANGE, ACT, ASSERT.

Выводить ХП монстров

Пересекается с задачей #50
ХП выводить в 2 режимах:

  1. При наведении просто показывать полоску. Без цифр.
  2. В панели, которая будет сделана в #50, выводить конкретное значение ХП.

Соответственно, задачу нужно будет сделать в 2 МР.

Исправить замечание Type or member is never used: Non-private accessibility (Steps)

  1. Проверить, могут ли спецификации выполняться, если их отметить как internal или private.
  2. Если нет, то отметить классы со спецификациями атрибутом JetBrains - Внешнее API.

Zilon.Core.Spec/Steps
CommonSteps.cs (20)
19: Class 'CommonSteps' is never used
26: Method 'GivenЕстьКартаРазмером' is never used
32: Method 'GivenМеждуЯчейкамиИЕстьСтена' is never used
38: Method 'GivenЕстьАктёрИгрокаКлассаCaptainВЯчейке' is never used
44: Method 'GivenАктёрИмеетHp' is never used
51: Method 'GivenЕстьМонстрКлассаRatВЯчейке' is never used
57: Method 'GivenМонстрIdИмеетHp' is never used
65: Method 'GivenЕстьСундукВЯчейке' is never used
72: Method 'GivenСундукСодержитIdЭкипировкуPistol' is never used
87: Method 'GivenСундукСодержитIdРусурсPistol' is never used
103: Method 'WhenЯВыбираюЯчейку' is never used
109: Method 'WhenЯВыбираюСундукId' is never used
125: Method 'WhenЯЗабираюИзСундукаЭкипировкуPistol' is never used
144: Method 'WhenЯЗабираюИзСундукаРерурсWaterВКоличестве' is never used
178: Method 'ThenУАктёраВИнвентареЕстьPistol' is never used
189: Method 'ThenВСундукеIdНетЭкипировкиPistol' is never used
200: Method 'ThenВСундукеIdНетПредметаWater' is never used
217: Method 'ThenЕдаСырОтсутствуетВИнвентареПерсонажа' is never used
228: Method 'ThenАктёрИмеетЗадасHp' is never used
235: Method 'ThenМонстрIdИмеетHp' is never used
EquipmentSteps.cs (5)
16: Class 'EquipmentSteps' is never used
24: Method 'GivenВИнвентареУАктёраИгрокаЕстьПредметPropSid' is never used
34: Method 'WhenЭкипируюПредметPropSidВСлотIndexSlotIndex' is never used
56: Method 'ThenВСлотеIndexSlotIndexАктёраИгрокаЕстьPropSid' is never used
64: Method 'ThenПараметрParamStatTypeРавенParamStatValue' is never used
FightSteps.cs (3)
14: Class 'FightSteps' is never used
21: Method 'WhenАктёрИгрокаАтакуетМонстраId' is never used
38: Method 'ThenАктёрИгрокаМертв' is never used
MoveSteps.cs (6)
15: Class 'MoveSteps' is never used
22: Method 'ThenКомандаНаПеремещениеМожетВыполняться' is never used
31: Method 'ThenКомандаНаПеремещениеНеМожетВыполняться' is never used
39: Method 'WhenВыполняетсяКомандаНаПеремещение' is never used
46: Method 'WhenВыполняетсяКомандаНаПеремещениеСОшибкой' is never used
61: Method 'ThenАктёрНаходитсяВЯчейке' is never used
PerkSteps.cs (3)
12: Class 'PerkSteps' is never used
20: Method 'GivenУАктёраИгрокаПрогрессПеркаНаУбийствоИз' is never used
32: Method 'ThenПеркНаУбийствоДолженБытьПрокачен' is never used
SurvivalSteps.cs (13)
18: Class 'SurvivalSteps' is never used
25: Method 'GivenВИнвентареУАктёраЕстьЕдаСыр' is never used
32: Method 'GivenВИнвентареУАктёраЕстьФейковыйПровиантFake_FoodНаХарактеристикуЭффективностью' is never used
73: Method 'GivenАктёрЗначениеСытостьРавное' is never used
102: Method 'GivenАктёрИмеетЭффектStartEffect' is never used
117: Method 'WhenЯПеремещаюПерсонажаНаОднуКлетку' is never used
131: Method 'WhenАктёрСъедаетЕду' is never used
137: Method 'ThenЗначениеStatУменьшилосьНаRate' is never used
157: Method 'ThenЗначениеСытостиПовысилосьНаЕдиниц' is never used
177: Method 'ThenЗначениеStatСтало' is never used
196: Method 'ThenАктёрПолучаетЭффектСлабыйГолод' is never used
221: Method 'ThenАктёрИмеетХарактристикуМодуляСраженияMeleeРавную' is never used
247: Method 'ThenТактическоеУмениеИмеетЭффективностьMinMax' is never used

При смене сектора для эффектов угроз выживания начинают выбрасываться ошибки

Вероятно, потому что сохраняется подписка на событие и какой-то из объектов уничтожен.

MissingReferenceException: The object of type 'RectTransform' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
UnityEngine.Transform+Enumerator.MoveNext () (at C:/buildslave/unity/build/Runtime/Transform/ScriptBindings/Transform.bindings.cs:343)
PersonEffectHandler.UpdateEffects () (at Assets/Zilon/Scripts/Models/SectorScene/PersonEffectHandler.cs:23)

Подтверждение выхода из игры

Добавить модал выхода (по сути, подтверждение выхода).
При нажатии выводить модал в стиле дума:
Произвольно выводить надписи "Сдаться и выйти?" и т.д.

Покрыть тестами DefeatActorJobProgress

Написать тесты на основной метод ApplyToJobs:

  1. Прогресс увеличивается на 1 для всех работ типа Defeat.
  2. Прогресс не изменяется для работ других типов.
  3. Метод возвращает работы, которые были изменены.

Доделать логику произвольного брожения для монстров

Нужно доработать класс RoamingLogic. Должен работать по следующему принципу:

  1. Выбирается произвольная доступная ячейка на константном расстоянии.
  2. Монстр идёт в выбранную ячейку.
  3. Когда ячейка достигнута, монстр простаивает произвольное время.
  4. Если был обнаружен противник (intruder), то начинается преследование и атака противника.

Визуализировать удар

Если удар успешен, то:

  1. Персонаж должен резко дёргаться в сторону удара (см Stoneshard, Idle Sword).
  2. При успешной рукопашной атаке кратковременно выводить сплеш.
  3. При успешной стрелковой атаке выводить эффект попадания снаряда (нужно выбрать).

Восстановить эффекты от угроз выживания

Эффекты должны работать по следующей механике:

  1. Слабая угроза должна давать -1 к эффективности действия.
  2. Сильная угроза должна давать -1 к эффективности и -1 к попаданию.
  3. Максимальная угроза навешивает эффект, который наносит 1 рану на 5+.

На все текущие угрозы (голод, жажда) должен быть один эффект. При этом должно быть видно, какой из показателей вызвал угрозу.

Восстановить тесты спецификации.

Вывод результатов бросков на эффективность и попадания

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

Задача AttackTask должна выполнятся только если не мешают стены

см. //TODO Сделать проверку, чтобы нельзя было атаковать через стены, аналогично команде на открытие/атаку.

В случае попытки выполнить задачу сквозь стену нужно выбрасывать исключение. Добавить тест, проверяющий выброс исключения.

Экипировка двух оружий

Если у персонажа два одноручных оружия, то на 5+ наносить удар вторым оружием, если действие по умолчанию доступно.

Выводить информацию о монстре при наведении

  1. В углу должна быть панель.
  2. Выводить наименование монстра.
  3. Выводить уровень монстра.
  4. Выводить количество ХП.
  5. Выводить способности к обороне.
  6. Панель должна появляться при наведении курсора на монстра.

Добавить отображение смерти игрока

Главная проблема в том, что если игрок умирает, игра начинает сыпаться из-за ошибок. Потому что происходит обращение к модели, которая уже удалена (Destroy).
Обращение происходит в камере при попытке центрировать камера на персонажа игрока и при попытке выполнить команды.

Чек-лист:

  1. Добавлена анимация смерти. Персонаж падает на бок.
  2. Камера начинает центрировать труп. Скорее всего нужно будет перебить ссылку на другой gameObject.
  3. При попытке выполнить команду происходит проверка, что персонаж игрока ещё жив.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.