Stronghold kingdoms купить коды. Stronghold Kingdoms - промокоды и купоны. Что привлекает пользователей в игре Stronghold Kingdoms

Сразу после оплаты Вы получаете цифровую копию лицензионного ключа из коробки с игрой Stronghold Kingdoms от официального поставщика - компании "Акелла", который необходимо ввести в личном кабинете игры для получения бонусов на сумму 750 крон:
2 жетона на месяц
10 Производственных колод
10 Продовольственных колод
5 Защитных колод (10 за колоду)
4 Военные колоды (10 за колоду)
30 Колод случайных карт (10 за колоду)

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

Хотите стать бароном, герцогом или королем? Погрузитесь в мир враждующих феодалов, в мир, где создаются и рушатся союзы и целые государства. Примерьте на себя роль средневекового правителя. Трон ждет вас, Государь!

Особенности игры:
- Присоединитесь к тысячам игроков в реалистичном средневековом мире.
- Возведите великие крепости, которые простоят века!
- Вооружите свои армии и покорите земли соседей!
- Следите, как оживают и растут ваши деревни, города и замки.
- Исследуйте сотни достоверных технологий.
- Играйте на карте Древней Руси!

Данный код не имеет территориальных ограничений (Region Free)
Языки (language): Русский, English
Издатель: Акелла

Дополнительная информация

Игра Stronghold Kingdoms бесплатна (Free to Play), Вы можете скачать ее через Steam - http://store.steampowered.com/app/47410/

Для активации стартового набора бонусов на 750 крон (750 crowns) Вам необходимо проследовать несложной инструкции:
1. Войти в существующую учетную запись либо зарегистрировать новую на официальном сайте игры http://login.strongholdkingdoms.com/kingdoms/account.php
2. Ввести полученный после оплаты код активации в поле "Активировать код", нажать на появившуюся кнопку-подтверждение
3. Бонусы на 750 крон (750 crowns) уже на Вашем аккаунте!

Будьте внимательны! Активировать данный код на учетной записи можно лишь один раз!

Также предлагаем обратить внимание на похожие товары:
STRONGHOLD KINGDOMS - БОНУСЫ НА 350 КРОН CROWNS -

Возможно Вас заинтересуют и другие игры, распространяемые нами. Полный список доступен по ссылке:

Отзывы

54

Отзывов от покупателей не поступало.

За положительный отзыв о купленном товаре продавец предоставит вам подарочную карту на сумму 5,99 руб. .

В целях противодействия нарушению авторских прав и права собственности, а также исключения необоснованных обвинений в адрес администрации сайта о пособничестве такому нарушению, администрация торговой площадки Plati (http://www.сайт) обращается к Вам с просьбой - в случае обнаружения нарушений на торговой площадке Plati, незамедлительно информировать нас по адресу о факте такого нарушения и предоставить нам достоверную информацию, подтверждающую Ваши авторские права или права собственности. В письме обязательно укажите ваши контактные реквизиты (Ф.И.О., телефон).

В целях исключения необоснованных и заведомо ложных сообщений о фактах нарушения указанных прав, администрация будет отказывать в предоставлении услуг на торговой площадке Plati, только после получения от Вас письменных заявлений о нарушении с приложением копий документов, подтверждающих ваши авторские права или права собственности, по адресу: 123007, г. Москва, Малый Калужский пер. д.4, стр.3, Адвокатский кабинет «АКАР №380».

В целях оперативного реагирования на нарушения Ваших прав и необходимости блокировки действий недобросовестных продавцов, Plati просит Вас направить заверенную телеграмму, которая будет являться основанием для блокировки действий продавца, указанная телеграмма должна содержать указание: вида нарушенных прав, подтверждения ваших прав и ваши контактные данные (организиционно-правовую форму лица, Ф.И.О.). Блокировка будет снята по истечение 15 дней, в случае непредставления Вами в Адвокатский кабинет письменных документов подтверждающих ваши авторские права или права собственности.

Подождите, промокоды загружаются

Актуальные бонус коды Stronghold Kingdoms (Стронгхолд Кингдомс) и промокоды появились на нашем сайте сайт прямо на этой странице. Stronghold Kingdoms – новейшая браузерная стратегия от создателей популярной игры Stronghold.

Игра отлично подходит для любителей которые не хотят скачивать клиент на свой компьютер. Всем любителем старой версии игры, будет в удовольствие от геймплея, так как вы теперь находитесь в режиме Online. Теперь ваши враги это люди, а не боты. Нужно проявить свои стратегические и экономические навыки, чтобы ваш город не разрушили. Для людей которые впервые услышали об игре, нужно знать несколько вещей. Во первых вы сразу оказываетесь в средневековье, во времена крестовых походов и различных исторических событиях. Вам нужно построить свой город, оградить его высокой стеной, наладить систему продовольствия, развлечений и конечно же формированию собственного войска. Игра объединила множество различных игр, потому что вам нужно следить за настроением населения и развития города, а тем временем на другом конце карты управлять сражениями. Есть множество рас и категорий войск. От могущественных рыцарей до обычных разбойников. Решать вам как вы собираетесь вести свою политику игры. Но игра точно оставит след в вашей памяти, потому что столь запоминающегося и яркого с такой системой развития, практически нигде нет. Все события происходят в реальном времени, так что принимать решения нужно будет быстро и обдуманно.
Мы предоставляем промокоды к игре Stronghold Kingdoms, которые дают получить большие скидки и бонусы. Благодаря им вы можете нанять большое количество армии и захватить ближайшие поселения игроков или развить город который будет достоин называться столицей карты. На нашем сайте постоянно обновляются акции к данной игре, будь в курсе всех событий.

Что привлекает пользователей в игре Stronghold Kingdoms:

  • Возможность взаимодействовать с множеством игроков со всего мира: торговля, сражения, захват замков, шпионаж и многое другое;
  • Присутствует возможность изучать дисциплины и развивать их. (Например: земледелие, промышленность, торговля, военное дело);
  • Глобальная карта провинций, где всё поделено на районы (округи). Каждый такой район будет являться своеобразной родиной игрока;
  • Игра против живых игроков и компьютерных противников (Лагерь бандитов, волчье логово, вражеский осадный лагерь и замки Крысы, Змеи, Кабана и Волка). ИИ могут совершать набеги на владения игрока, поэтому стоит позаботиться о защите!

Студия Firefly Studios выпустили новый амбициозный русскоязычный мир для своей замковой ММО Stronghold Kingdoms . «Мир 6» открыл свои врата 15 июня, и тысячи игроков хлынули туда, чтобы опробовать свежий игровой сервер с новой механикой, которая была представлена в игре в последнем обновлении. Новый мир доступен как новым игрокам, так и ветеранам Kingdoms . Он основан на географической карте западной части России, а также окружающих её регионов и стран, включая Прибалтику, Украину, Беларусь, Казахстан и другие государства.

Игроки могут сражаться за контроль над этими территориями, объединившись в могущественные Дома со своими правилами и особенностями. Этот мир отличается от предыдущих обновлённой игровой механикой, ограничивающей использование религии, и дающей больше возможностей для новичков. Это второй мир в Stronghold Kingdoms, использующий новые правила, и первый «локальный» мир, где эти правила были установлены.

Помимо русскоязычных, в Kingdoms также есть британские, немецкие, французские, испанские миры, и миры, основанные на глобальной карте. Прямо сейчас все присоединившиеся к новому миру игроки могут активировать специальный промо-код, который добавит на их учётную запись набор игровых предметов, с помощью которых игроки смогут значительно ускорить своё развитие в новом мире и установить порядок в своём королевстве.

Код: D1F9-33BA-0C7F-BAF5

Данный промо-код можно активировать в игре, пройдя процесс регистрации. Он будет действителен до 1 июля, использовать его можно только один раз на каждой учётной записи.

Долгое время я подходил к вопросу написания бота для этой игры, но то опыта не хватало, то лень, то не с той стороны заходить пытался.
В итоге, набравшись опыта написания и обратной разработки кода на C# я решил добиться своего.

Да, как Вы могли заметить, C# не спроста – игра написана именно на нем, с использованием.net 2.0, что в последствии вставило мне некоторые палки в колеса.

Изначально я думал написать сокетного бота, который бы лишь эмулировал сетевой протокол (который никак не шифруется), а имея «исходные коды» (результат декомпиляции il-кода) легко восстанавливается в стороннем приложении.

Но мне это показалось нудным и муторным, ведь зачем городить велосипед, если имеются те самые «исходные коды».

Вооружившись Reflector’ом я начал разбираться с точкой входа игры (код которой вообще никак не обфусцирован более трех лет, диву даюсь разработчикам) – ничего особенного.

Анализ и отчасти неверное решение
Очевидно, что проект игры изначально создавался как консольное приложение:

Private static void Main(string args) как точка входа и ее класс Program на это намекают, класс, к слову, тоже приватный.

В первую очередь, кинулся делать класс и метод публичными, опять же силами Reflector’а с дополнением к нему Reflexil, сам не зная чего ожидать.

Но внезапно я столкнулся с лаунчером, который перекачивал измененный файл.
Недолго повоевав с ним тем же Reflector"ом и проведя вскрытие выдернул оттуда код установки аргументов передающихся исполняемому файлу игры:

If (DDText.getText(0x17) == "XX") parameters = new string { "-InstallerVersion", "", "", "st" }; // st == steam else parameters = new string { "-InstallerVersion", "", "" }; parameters = SelfUpdater.CurrentBuildVersion.ToString(); parameters = DDText.getText(0); // Покопавшись, узнал что это язык игры, в формате “ru”, “de”, “en” и т.д. Подгружается из файла local.txt рядом с лаунчером. UpdateManager.SetCommandLineParameters(parameters); // А это их обертка для самого обычного System.Diagnostics.Process UpdateManager.StartApplication();

Разбираем:

If (DDText.getText(0x17) == "XX") - Строка из файла local.txt рядом с лаунчером.
Такая у них странная проверка на steam/no-steam версии: X – не стим, XX – стим. :\
parameters = SelfUpdater.CurrentBuildVersion - Версия лаунчера, спокойно дергается из него же, хотя проверка в клиенте странная, как я узнал позже, и можно просто указать число гораздо более большее текущей, «про запас», т.к. проверка идет только на устаревшесть, так скзаать, версии через сравнение чисел «меньше-больше».
parameters = DDText.getText(0) - Поковавшись версия, узнал что это язык игры, в формате “ru”, “de”, “en” и т.д.
Подгружается так же из файла local.txt.

К слову, версия лаунчера выглядит как-то так:

Static SelfUpdater() { currentBuildVersion = 0x75; // 117, т.е. 1.17 на самом деле. }

И сделал волшебный батник:

StrongholdKingdoms.exe -InstallerVersion 117 ru

Хотя можно и так:

StrongholdKingdoms.exe -InstallerVersion 100500 ru

О чем я и говорил чуть выше.

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

После этого попробовал подключить исполняемый файл игры к проекту в качестве библиотеки классов и подключить пространство имен игры – Kingdoms.

Затем я городил много кода: пытался и вызывать Main, и эмулировать класс Programm, но игра почему-то падала с рантайм крашем не дотнет-фреймворкоского при любой попытке заставить это работать.
Сослался на то, что игра использует много не C# библиотек и много unsafe-кода. Реальных причин так и не нашел.

Решение верное
Долго промучавшись и не найдя решения, я уже было плюнул. Но почему-то мне вспомнился форк сервера Terraria - TShock (ага, форк, как же – тоже ребята забавлялись с декомпилятором) и его загрузку модулей (модов\плагинов) из DLL.

Эта идея мне показалось интересной. Погуглив нашел и способ, и код.
Слегка вникнув в него и проверив в собственном проекте, с ужасом обнаружил, что он работает (внезапно!).
Собственно, код:

System.Reflection.Assembly A = System.Reflection.Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll"); Type ClassType = A.GetType("BotDLL.Main", true); object Obj = Activator.CreateInstance(ClassType); System.Reflection.MethodInfo MI = ClassType.GetMethod("Inject"); MI.Invoke(Obj, null);

Разберем код:
System.Reflection.Assembly – Это та штука, которая отвечает за создание ссылок на файлы при подключении их к проекту, только из кода. А еще она хранит информацию о версиях вашего проекта и копирайтах (да, тот самый AssemblyInfo.cs во всех ваших проектах).
Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll") - Загружаем нашу библиотеку.
Затем вызываем функцию внутри этого класса Inject(), которая и является уже по сути началом бота. =)
Опробовал в стороннем приложении код который набросал – инжект сработал.

Патчинг клиента
Теперь переходим к самому интересному – внедряем код вызова в игру.
Попытавшись в наглую его всунуть в Main через замену кода с помощью Reflexil успешно был послан патчить не патчимое в результате декомпиляции. Ну или мне просто было лень, не важно.
Пошел искать в этом самом Main гарантированный вызов сторонних функций (вне основных ветвей if и т.д.) довольно быстро нашел вызов функции MySettings.load(), который загружал настройки игры при ее запуске.
Но там опять же оказалась гора кода который не захотел компилироваться без бубнов.
Зато по счастливой случайности рядом с ним находится булева функция hasLoggedIn() которая возвращает единственное bool значение как раз при запуске игры:
return (this.HasLoggedIn || (this.Username.Length > 0));
Меня это сразу обрадовало и тут же эта функция была преобразована в такую:

If (!IsStarted) { System.Reflection.Assembly A = System.Reflection.Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll"); Type ClassType = A.GetType("BotDLL.Main", true); object Obj = Activator.CreateInstance(ClassType); System.Reflection.MethodInfo MI = ClassType.GetMethod("Inject"); MI.Invoke(Obj, null); IsStarted = true; } return (this.HasLoggedIn || (this.Username.Length > 0));

Разберемся с ним.
if (!IsStarted) – пришлось добавить эту проверку, а для этого ввести дополнительное поле в класс MySettings, поскольку наша функция вызывается не один раз, а несколько потоков бота нам не очень-то и нужны. Делается это все тем же Reflexil"ом.
Ну основной код мы уже разобрали чуть выше.
И в конце возвращаем то что тут и должно было быть. =)

Итак – сам бот
Функция Inject:

Public void Inject() { AllocConsole(); Console.Title = "SHKBot"; Console.WriteLine("DLL загружена!"); Thread Th = new Thread(SHK); Th.Start(); BotForm FBot = new BotForm(); FBot.Show(); } … static extern bool AllocConsole();

Сперва мы вызываем функцию открытия окна консоли – так будет проще для отладки.
После запускаем поток с нашим основным циклом бота – SHK();
И заодно открываем форму управления бота для удобства.

Дальше дело за малым – реализовывать нужный вам функционал.
Вот остальной мой код – здесь я реализовал систему автоматической торговли.
Чтобы она работала сперва надо «закэшировать» деревни в каждой сессии – открыть каждую из деревень, которыми собираетесь торговать.
Этот код помогает сомнительно, а до других способов автоматической прогрузки деревень я пока не докопался:

InterfaceMgr.Instance.selectVillage(VillageID); GameEngine.Instance.downloadCurrentVillage();

Вот код функции SHK:

Скрытый текст

public void SHK() { Console.WriteLine("Инжект выполнен!"); while (!GameEngine.Instance.World.isDownloadComplete()) { Console.WriteLine("Мир еще не загружен!"); Thread.Sleep(5000); // 5 sec Console.Clear(); } Console.WriteLine("Мир загружен! Начало выполнения операций ядра."); Console.WriteLine("\n======| DEBUG INFO |======"); Console.WriteLine(RemoteServices.Instance.UserID); Console.WriteLine(RemoteServices.Instance.UserName); List VillageIDs = GameEngine.Instance.World.getListOfUserVillages(); foreach (int VillageID in VillageIDs) { WorldMap.VillageData Village = GameEngine.Instance.World.getVillageData(VillageID); Console.WriteLine("[Инициализация] " + Village.m_villageName + " - " + VillageID); InterfaceMgr.Instance.selectVillage(VillageID); GameEngine.Instance.downloadCurrentVillage(); } Console.WriteLine("======| ========== |======\n"); while (true) { try { // Тут можно что-нибудь свое воткнуть } catch (Exception ex) { Console.WriteLine("\n======| EX INFO |======"); Console.WriteLine(ex); Console.WriteLine("======| ======= |======\n"); } } }


Код формы контроля:

Скрытый текст

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using Kingdoms; using System.CodeDom.Compiler; using Microsoft.CSharp; using System.Reflection; namespace BotDLL { public partial class BotForm: Form { Thread TradeThread; bool IsTrading = false; public void Log(string Text) { Console.WriteLine(Text); richTextBox_Log.Text = Text + "\r\n" + richTextBox_Log.Text; } public BotForm() { CheckForIllegalCrossThreadCalls = false; InitializeComponent(); this.Show(); Log("Форма бота отображена."); listBox_ResList.SelectedIndex = 0; Log("Запуск потока торговли..."); TradeThread = new Thread(Trade); TradeThread.Start(); } private void button_Trade_Click(object sender, EventArgs e) { // Если мир уже загружен и поле цели заполнено if (GameEngine.Instance.World.isDownloadComplete() && textBox_TradeTargetID.Text.Length > 0) { try { if (!IsTrading) // Если не торгуем { button_Trade.Text = "Стоп"; IsTrading = true; // То торгуем } else // И наоборот { button_Trade.Text = "Торговать"; IsTrading = false; } } catch (Exception ex) { Console.WriteLine("\n======| EX INFO |======"); Log(ex.ToString()); Console.WriteLine("======| ======= |======\n"); } } } public void Trade() { Log("Торговый поток создан!"); int Sleep = 0; while (true) // Если торгуем { Sleep = 60 + new Random().Next(-5, 60); if (IsTrading) { Log("[" + DateTime.Now + "] Заход с \"" + listBox_ResList.SelectedItem.ToString() + "\""); // Получаем ID товара из списка int ResID = int.Parse(listBox_ResList.SelectedItem.ToString().Replace(" ", "").Split("-")); int TargetID = int.Parse(textBox_TradeTargetID.Text); // Получаем ID деревни-цели List VillageIDs = GameEngine.Instance.World.getListOfUserVillages(); // Получаем список наших деревень foreach (int VillageID in VillageIDs) // Перебираем их { // Если деревня прогружена (открывалась ее карта в текущей сессии хоть раз) if (GameEngine.Instance.getVillage(VillageID) != null) { // Получаем базовую информацию о нашей деревни WorldMap.VillageData Village = GameEngine.Instance.World.getVillageData(VillageID); VillageMap Map = GameEngine.Instance.getVillage(VillageID); // Получаем полную информацию int ResAmount = (int)Map.getResourceLevel(ResID); // Кол-во ресурса на складе int MerchantsCount = Map.calcTotalTradersAtHome(); // Кол-во торговцев в ней Log("В деревне " + VillageID + " есть " + MerchantsCount + " торговцев"); // Дебаг int SendWithOne = int.Parse(textBox_ResCount.Text); // Кол-во ресурса на торговца int MaxAmount = MerchantsCount * SendWithOne; // Кол-во ресурсов отправим if (ResAmount < MaxAmount) // Если торговцы могут увезти больше чем есть MerchantsCount = (int)(ResAmount / SendWithOne); // Считаем сколько смогут увезти реально if (MerchantsCount > 0) // Если трейдеры дома есть { TargetID = GameEngine.Instance.World.getRegionCapitalVillage(Village.regionID); // Торгуем с регионом, временно textBox_TradeTargetID.Text = TargetID.ToString(); // Вызываем высокоуровневую функцию торговли с рядом каллбеков GameEngine.Instance.getVillage(VillageID).stockExchangeTrade(TargetID, ResID, MerchantsCount * SendWithOne, false); AllVillagesPanel.travellersChanged(); // Подтверждаем изменения (ушли трейдеры) в GUI-клиента } } } Log("Повтор цикла торговли через " + Sleep + " секунд в " + DateTime.Now.AddSeconds(Sleep).ToString("HH:mm:ss")); Console.WriteLine(); } Thread.Sleep(Sleep * 1000); // Спим, чтобы не спамить. Так меньше палева. } } private void BotForm_FormClosing(object sender, FormClosingEventArgs e) { try { TradeThread.Abort(); } catch {} } private void button_MapEditing_Click(object sender, EventArgs e) { button_MapEditing.Text = (!GameEngine.Instance.World.MapEditing).ToString(); GameEngine.Instance.World.MapEditing = !GameEngine.Instance.World.MapEditing; } private void button_Exec_Click(object sender, EventArgs e) { if (richTextBox_In.Text.Length == 0 || !GameEngine.Instance.World.isDownloadComplete()) return; richTextBox_Out.Text = ""; // *** Example form input has code in a text box string lcCode = richTextBox_In.Text; ICodeCompiler loCompiler = new CSharpCodeProvider().CreateCompiler(); CompilerParameters loParameters = new CompilerParameters(); // *** Start by adding any referenced assemblies loParameters.ReferencedAssemblies.Add("System.dll"); loParameters.ReferencedAssemblies.Add("System.Data.dll"); loParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll"); loParameters.ReferencedAssemblies.Add("StrongholdKingdoms.exe"); // *** Must create a fully functional assembly as a string lcCode = @"using System; using System.IO; using System.Windows.Forms; using System.Collections.Generic; using System.Text; using Kingdoms; namespace NSpace { public class NClass { public object DynamicCode(params object Parameters) { " + lcCode + @" return null; } } }"; // *** Load the resulting assembly into memory loParameters.GenerateInMemory = false; // *** Now compile the whole thing CompilerResults loCompiled = loCompiler.CompileAssemblyFromSource(loParameters, lcCode); if (loCompiled.Errors.HasErrors) { string lcErrorMsg = ""; lcErrorMsg = loCompiled.Errors.Count.ToString() + " Errors:"; for (int x = 0; x < loCompiled.Errors.Count; x++) lcErrorMsg = lcErrorMsg + "\r\nLine: " + loCompiled.Errors[x].Line.ToString() + " - " + loCompiled.Errors[x].ErrorText; richTextBox_Out.Text = lcErrorMsg + "\r\n\r\n" + lcCode; return; } Assembly loAssembly = loCompiled.CompiledAssembly; // *** Retrieve an obj ref – generic type only object loObject = loAssembly.CreateInstance("NSpace.NClass"); if (loObject == null) { richTextBox_Out.Text = "Couldn"t load class."; return; } object loCodeParms = new object; loCodeParms = "SHKBot"; try { object loResult = loObject.GetType().InvokeMember("DynamicCode", BindingFlags.InvokeMethod, null, loObject, loCodeParms); //DateTime ltNow = (DateTime)loResult; if (loResult != null) richTextBox_Out.Text = "Method Call Result:\r\n\r\n" + loResult.ToString(); } catch (Exception ex) { Console.WriteLine("\n======| EX INFO |======"); Console.WriteLine(ex); Console.WriteLine("======| ======= |======\n"); } } } }

Изначально я хотел воткнуть в бота NLua (библиотека Lua для C#), но поскольку он поддерживает только 3.5+ фреймворки, а использовать старые версии мне почему-то не захотелось я сделал так:
Для удобства ввел экзекуцию кода в реальном времени на самом шарпе - утомился я перезапускать игру после перекомпиляций раз за разом.
Пользовался .

Итог
Плюсы такого решения:
  1. Доступ ко всему игровому коду, будто вы имеете ее исходные коды.
  2. Можете сделать собственную систему премиум-карт с очередью построек, изучением исследований без ограничений и даже больше:
    • Алгоритм перепродажи товаров среди окружающих вас регионов.
    • Автопостройка деревни «по макету» снятому с уже имеющейся, как пример.
    • Автонайм различных юнитов.
    • Автопочинка замка пока вас нет.
    • Атоматический сбор гарантированной карты за время.
  3. Ну и конечно динамическое исполнение кода.
  4. Смешная защита от обнаружения. Ну и еще пара условий для того чтобы не слать подозрительные запросы-пустышки.
Минусы:
  1. Придется патчить клиент с каждой версией ручками. Либо можно написать патчер с использованием Mono.Cecil или аналогом во фреймворке.
  2. В отличие от премиум-карт придется держать клиент всегда включенным и онлайн.
  3. Игра немаленькая, так что изучать «API» придется точно не час. Хотя при желании и инструментах разбирается в лет – было бы желание. Да и в любом случае лучше чем с пакетами возиться.

Вот так выглядит все это дело:

Список классов

  • GameEngine
  • GameEngine.Instance
  • GameEngine.Instance.World
  • WorldMap
  • WorldMap.VillageData
  • RemoteServices
  • RemoteServices.Instance
  • AllVillagesPanel
  • VillageMap

На момент написания статьи версия игры была 2.0.18.6.
Скачать именно эту версию с исполняемым файлом игры и ботом можно .
Не волнуйтесь, личных данных не ворую. =) Устал от игры, поэтому делюсь с сообществом опытом.

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

Вы хотите перенестись в другую эпоху, чтобы отправиться в настоящее приключение? Запускайте на вашем компьютере бесплатную онлайн-игру «Stronghold Kingdoms» и попробуйте свои силы в жестоких средневековых войнах. Почувствуйте, что такое кровь, которая стынет в жилах, узнайте, сколько в вас адреналина. Эффект глубокого погружения в игру гарантирован. Stronghold Kingdoms сентябрь-октябрь 2019 – почувствуйте себя настоящим героем!

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

Особенности игры:

  • игроки строят и расширяют средневековые крепости, которым предстоит пройти испытание временем;
  • участники управляют деревнями, верно размещая в них здания для повышения эффективности;
  • с помощью торговой карты игроки смогут торговать, исследовать, разведывать и др.;
  • прохождение пути к высоким титулам для получения власти;
  • создавайте и разыгрывайте свои стратегические карты, чтобы получить жизненно важное преимущество.

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

Как применить купон игры Stronghold Kingdoms сентябрь-октябрь 2019?

Для получения заветного «секретного слова» достаточно выбрать один из пунктов на нашем сайте, по которому работает скидка, и щёлкнуть мышкой, затем система автоматически выдаёт уникальный символьный номер. Применить промокод игры Stronghold Kingdoms может каждый: скопируйте полученный номер, перейдите по ссылке и вставьте сочетание букв и цифр в специальное поле при оформлении платных услуг. Купоны на скидку действительны лишь некоторое время, поэтому всегда обращайте внимание на сроки проведения акции. Как правило, скидки по купонам не суммируются со скидками на платные аккаунты и другие игровые услуги с пометкой «Специальное предложение».

Игра распространяется бесплатно, путём скачивания клиента игры с официального сайта компании Firefly Studios.