-
Публикации
369 -
Зарегистрирован
-
Посещение
Тип публикации
Профили
Статьи
Форум
Файлы
Все публикации пользователя Omich
-
@Клерри, ILSpy подойдёт, а HxD тут довольно бесполезен.
-
@Клерри, Microsoft Visual Studio Express или Microsoft Visual C# Express Edition, любая новее 2008, доступна для скачивания бесплатно с MSDN/MSDC. У линуксойдов/яблочников есть альтернатива - MonoDevelop. Редактируются, собственно, файлы с исходным кодом C# .cs (иногда .ccs), а из них компилируется dll. Хотя можно и декомпилировать какую-нибудь готовую dll назад в исходный код с помощью программ типа Reflector.
-
@X-18, да, с очередным апдейтом игры патчер опять сломался, починю когда-нибудь (мне сейчас уже, просто, не очень интересна данная игра). Как вариант: запустить игру с нужными параметрами в последней версии, где всё работает, сохраниться и перенести сейв в текущую.
-
@X-18, должно работать, но особого смысла в этом, обычно, нету.
-
Мне тут, внезапно, пришла в голову идея. В общем, суть такова: в подобной транспортной игре заторы и неразбериха в движении поездов будут всегда возникать рано или поздно, если в основе регулирования движения транспорта лежит только сигналка. В любой, сколько-нибудь приближенной к реальности, подобной игре в основе движения поездов должен лежать график движения (скрещений). Примерно вот такой: По вертикали наносятся станции, а по горизонтали время. Ломаные линии - перемещения поездов между станций. Смысл в том, что там, где линии пересекаются (происходит скрещение поездов), должно быть достаточное число путей перегона или станции. Если провести кривую, удовлетворяющую данному условию нельзя, то маршрут нельзя сформировать в этот момент времени и некоторые поезда (по приоритету, например) надо будет задержать для формирования свободного пути. Я считаю, что если положить в основу движения поездов что-то вроде этого, то у нас не будет заторов и сбоев в движении поездов (при достаточном числе путей, но всё же гораздо меньшем, чем число поездов), поезда прибывают на свободный путь предусмотренный графиком, а сигналка, кроме как для разграничения блок-участков, не нужна (по крайней мере, в магистральном движении) и вообще всё будет хорошо, да. К несчастью, текущие возможности скриптинга в Train Fever совершенно недостаточны, чтобы реализовать подобный концепт. Так что пока это просто мысли вслух, вот.
-
-
Думаю, возможно реализовать мод, который проверял бы модель здания и заданным образом изменял его параметры, вроде населения, например. Но у меня сейчас особо времени нету ковыряться с этим, может быть на днях.
-
@MrIgr, https://translate.google.com/translate?hl=ru&sl=zh-CN&tl=ru&u=http%3A%2F%2Fwww.trainfevercn.com%2Fcategory%2Fmod&sandbox=1 Как-то у них всё очень печально там.
-
@Kapusta, есть мод, включающий отключенные модами ачивки... Только есть мнение, что он с последним патчем не работает. Но я вот не спешу разрешать игре обновляться и всё нормально. Кстати, школы, вроде, по крайней мере, в краткосрочной перспективе, преступность очень даже повышают.
-
@strong, попробуйте другие версии драйверов, другую ОС (если есть возможность), другую видеокарту (также, если есть такая возможность). Говорить о том, что видеокарта отдаёт концы, можно, пожалуй, если драйвер стабильно отваливается в различных хорошо нагружающих видеокарту программах.
-
@Alex, если быть точным, если задать уровень насильно выше текущего, то на этом месте строится здание на уровень выше текущего, оно тут же сносится и возникает здание ещё уровнем выше и т.д. Если задать уровень ниже текущего, то ничего не происходит, если только тут же не вызвать снос здания... и оно опять начнёт левелиться с нуля. Вообще, по поводу всех этих "возможно" - т.к. игра чуть менее чем полностью написана на C# поверх Unity и никак не обфусцирована, её скрипты очень легко декомпилируется и заменяются. Возможно всё, в теории. На практике, без какой-либо документации (кроме минималистичного "моддинг апи") в этих скриптах чёрт ногу сломит и разбираться, что и откуда берётся требует довольно много времени.
-
Возможно. Воу-воу, да тут сурцы на гитхабе под GPLv2. Стиль кода ужасает, но тут гораздо лучший способ получать ид здания и панельку гуя, чем до которого докопался я. Схороню.
-
А ещё можно попробовать сократить число перекрёстков, пустив улицу зигзагом, например.
-
@Hitzu, насчёт кистей изменения рельефа, думаю, возможно. На счёт мостов хз. Завтра гляну, можно ли с этим что-то сделать.
-
@Alex, https://yadi.sk/d/P6YidqSQfNWkQ, в окне зональных зданий появляется кнопка рядом с уровнем, позволяющая запретить левелинг. Основная проблема сейчас: если не закрывая окно кликнуть по другому зданию, кнопки остаются связаны с предыдущим зданием. А ещё я пока толком не тестировал, будет ли оно правильно сохраняться/загружаться и не похерит ли сейв, так что к имеющимся городам это не стоит сразу применять. Ну или бекапы наше всё. На счёт расширения полей под зональные здания пока ничего не знаю, но боюсь, что подобное захардкожено.
-
10 лет разработки и 4 миллиарда долларов, чтобы узнать, по какому домику кликнул игрок Подвижки есть, кликнутый дом я научился получать рейкастингом. Но пока остаются некоторые не решённые проблемы, например: нельзя просто кликнуть по другому дому - окно информации надо обязательно закрыть и открыть снова, чтобы кнопки в нём обновились. Если кому интересно и не отпугивают подобные косяки, могу скинуть текущую версию. И да, принимаю идеи для модов.
-
@Alex, в общем я пока не нашёл, как: Получить идентификатор выделенного здания; Получить объект этой самой панели, чтобы добавить в неё кнопку. Просто пришпандорить кнопку на экране не представляет проблемы, но выглядеть это будет не очень. Upd. Способ найден. У меня есть ряд предположений, как это можно сделать, но тестирование этого происходит крайне медленно, так как: Если я запущу одновременно VS и игру, ноут впадает в полный транс, так что игру я перезапускаю; Каждый перезапуск CS занимает минут 15. Пляски с бубном сократили время загрузки игры до 3-5 минут, что вполне приемлемо. Такие дела.
-
@Alex, так как в метод передаётся идентификатор здания, можно просто хранить идентификаторы "замороженных" зданий и проверять, не входит ли идентификатор здания в их число. Самое сложное тут - сделать кнопку
-
@Alex, а вот с этим всё достаточно просто, поскольку разработчики удосужились создать отвечающий за это интерфейс ILevelUpExtension и соответствующий класс LevelUpExtensionBase. Он содержит четыре метода: ResidentialLevelUp OnCalculateResidentialLevelUp(ResidentialLevelUp levelUp, int averageEducation, int landValue, ushort buildingID, Service service, SubService subService, Level currentLevel); CommercialLevelUp OnCalculateCommercialLevelUp(CommercialLevelUp levelUp, int averageWealth, int landValue, ushort buildingID, Service service, SubService subService, Level currentLevel); IndustrialLevelUp OnCalculateIndustrialLevelUp(IndustrialLevelUp levelUp, int averageEducation, int serviceScore, ushort buildingID, Service service, SubService subService, Level currentLevel); OfficeLevelUp OnCalculateOfficeLevelUp(OfficeLevelUp levelUp, int averageEducation, int serviceScore, ushort buildingID, Service service, SubService subService, Level currentLevel); Если я правильно понимаю, один из данных методов вызывается в зависимости от типа здания, когда изменяются окружающие его условия. Через параметры передаётся: текущий уровень здания (currentLevel); уровень, к которому оно стремится (поле targetLevel структур *LevelUp); идентификатор здания, по которому можно получить дополнительную информацию о нём через менеджеры; некоторые условия окружающей среды, вроде цены земли; service - судя по всему, условие, из-за которого был вызван метод. Возвращает метод структуру аналогичную *LevelUp, в которой может изменить уровень, к которому здание стремится. Можно, к примеру, переопределить метод OnCalculateResidentialLevelUp так: public override ResidentialLevelUp OnCalculateResidentialLevelUp(ResidentialLevelUp levelUp, int averageEducation, int landValue, ushort buildingID, Service service, SubService subService, Level currentLevel) { levelUp.targetLevel = Level.Level1; return levelUp; } Тогда жилые здания совсем не будут левелиться. Если же, например, изменить в третьей строке Level1 на Level5, то здания сразу после постройки будут начинать левелиться до максимума. А вот так можно ограничить рост зданий 3 уровнем: public override ResidentialLevelUp OnCalculateResidentialLevelUp(ResidentialLevelUp levelUp, int averageEducation, int landValue, ushort buildingID, Service service, SubService subService, Level currentLevel) { if (levelUp.targetLevel > Level.Level3) levelUp.targetLevel = Level.Level3; return levelUp; } Полный скрипт, запрещающий жилым зданиям левелиться выше 3 уровня (у них всего 5 уровней) и другим зданиям выше 2 (у них, вроде, всего 3): http://pastebin.com/b2p49eJG. Поскольку, кроме ICities там ничего не используется, должно заработать, если просто скопировать код в файл %AppData%\Local\Colossal Order\Cities_Skylines\Addons\Mods\LevelingLimit\Source\LevelingLimit.cs Думаю, можно попробовать переделать это в виде районной политики или т.п., только тут уже придётся привлекать ColossalFramework и делать dll.
-
@Bochkarev, пока не знаю, буду копать. По крайней мере, можно получить подробную информацию о каждой машине в игре: её тип, состояние, а главное - путь, по которому она следует. А в пути, вроде, можно и вносить изменения.
-
Немного потыкался в API, имеющиеся опенсорсные моды и реддит. В общем, на сколько я понял: каждый мод должен лежать в своей подпапке в %AppData%\Local\Colossal Order\Cities_Skylines\Addons\Mods; мод может состоять из файлов исходного кода в подпапке Source, тогда игра сама его откомпилирует (главный файл должен быть одноимённым с папкой и содержать одноимённый главный класс), либо из откомпилированной dll (также одноимённой с папкой); в случае компиляции самой игрой можно использовать библиотеки ICities и UnityEngine из игры, в случае же самостоятельной сборки dll возможности гораздо шире; мод должен содержать одноимённый класс, наследующий IUserMod и может переопределять классы или интерфейсы из библиотеки ICities игры, в них то можно повесить свою логику на различные события игры. На основе пары примеров я набросал вот такой код для теста (работает только как dll из-за использования библиотеки ColossalFramework): using ColossalFramework.Plugins; using ColossalFramework.UI; using ICities; using UnityEngine; namespace TestMod { public class TestMod : IUserMod { public string Name { get { return "Test mod"; } } public string Description { get { return "Test mod"; } } } public class LoadingExtension : LoadingExtensionBase { public override void OnLevelLoaded(LoadMode mode) { var uiView = UIView.GetAView(); var button = (UIButton)uiView.AddUIComponent(typeof(UIButton)); button.text = "Test"; button.width = 100; button.height = 30; button.normalBgSprite = "ButtonMenu"; button.disabledBgSprite = "ButtonMenuDisabled"; button.hoveredBgSprite = "ButtonMenuHovered"; button.focusedBgSprite = "ButtonMenuFocused"; button.pressedBgSprite = "ButtonMenuPressed"; button.textColor = new Color32(255, 255, 255, 255); button.disabledTextColor = new Color32(7, 7, 7, 255); button.hoveredTextColor = new Color32(7, 132, 255, 255); button.focusedTextColor = new Color32(255, 255, 255, 255); button.pressedTextColor = new Color32(30, 30, 44, 255); button.playAudioEvents = true; button.transformPosition = new Vector3(-1.5f, 0.9f); button.eventClick += delegate { DebugOutputPanel.AddMessage(PluginManager.MessageType.Warning, "Button clicked!"); }; } } } Скомпилированная dll. При запуске игры оно создаёт в левом верхнем углу экрана кнопку в стиле стандартных кнопок меню, а при её нажатие выводит сообщение в консоль отладки (F7 в игре). Так то, вроде, всё работает. И, похоже, тут нам разработчики дали гораздо большие возможности моддинга, чем в том же Train Fever.
-
Я пока особо не вникал, но http://www.skylineswiki.com/Modding_API
-
@Demigod12345, могу, но... пока не знаю, когда у меня до этого руки дойдут.
-
А мне продолжает везти на баги... Он тихонько сполз в нормальное положение сквозь порт. Это вообще законно?