Да вляза
Всички компютърни тайни за начинаещи и професионалисти
  • За начинаещ потребител: разлики между софтуерните продукти на програмната система 1C:Enterprise
  • Програма 1s 8.3 демо версия. Мобилно приложение "UNF" НОВО
  • Създаване на 1C управление на нашата компания от нулата
  • Warface безплатна регистрация
  • Регистрация в играта World Of Tanks – какво трябва да знаете?
  • Стратегия и тактика на Starcraft II
  • Писане на бот за Stronghold Kingdoms. Писане на бот за Stronghold Kingdoms Работещи кодове за играта Stronghold kingdoms

    Писане на бот за Stronghold Kingdoms.  Писане на бот за Stronghold Kingdoms Работещи кодове за играта Stronghold kingdoms

    Искате ли да се пренесете в друга епоха за истинско приключение? Стартирайте безплатна онлайн игра на вашия компютър "Укрепени кралства"и опитайте ръката си в брутални средновековни войни. Усетете каква е кръвта, която изстива във вените ви, разберете колко адреналин имате. Ефектът на дълбоко потапяне в играта е гарантиран. Stronghold Kingdoms септември-октомври 2019 г. – почувствайте се като истински герой!

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

    Характеристики на играта:

    • играчите изграждат и разширяват средновековни крепости, които ще издържат изпитанието на времето;
    • участниците управляват села, правилно поставяйки сгради в тях, за да повишат ефективността;
    • С помощта на търговска карта, играчите ще могат да търгуват, изследват, разузнават и т.н.;
    • извървяване на пътя към високи титли, за да спечелите власт;
    • създайте и изиграйте своите стратегически карти, за да спечелите жизненоважно предимство.

    Напрежението в тази игра ще достигне небесни нива, а победата ще ви позволи да изпитате истинска еуфория. Създателите редовно разработват нови версии на играта. С всяка актуализация се добавя нещо ново, възможностите се разширяват и играта става още по-ярка, по-многостранна и по-интересна.

    Как да кандидатствам за купон за играта Stronghold Kingdoms септември-октомври 2019 г.?

    За да получите заветната „тайна дума“, просто изберете един от артикулите на нашия уебсайт, за които работи отстъпката, и щракнете с мишката, след което системата автоматично издава уникален символен номер. Всеки може да приложи промоционален код за играта Stronghold Kingdoms: копирайте получения номер, следвайте връзката и поставете комбинацията от букви и цифри в специалното поле при регистрация за платени услуги. Купоните за отстъпка са валидни само за ограничен период от време, така че винаги обръщайте внимание на времето на промоцията. По правило отстъпките за купони не могат да се комбинират с отстъпки за платени акаунти и други игрални услуги, обозначени като „Специална оферта“.

    Играта се разпространява безплатно чрез изтегляне на клиента на играта от официалния сайт на Firefly Studios.

    Моля, изчакайте, промоционалните кодове се зареждат

    Текущите бонус кодове и промоционални кодове на Stronghold Kingdoms се появиха на нашия уебсайт директно на тази страница. Stronghold Kingdoms е най-новата браузър стратегия от създателите на популярната игра Stronghold.

    Играта е страхотна за феновете, които не искат да изтеглят клиента на своя компютър. Всички фенове на старата версия на играта ще се насладят на геймплея, тъй като вече сте в онлайн режим. Сега вашите врагове са хора, а не ботове. Трябва да покажете вашите стратегически и икономически умения, за да не бъде унищожен градът ви. За хората, които са чували за играта за първи път, има няколко неща, които трябва да знаете. Първо, веднага се озовавате в Средновековието, по време на кръстоносните походи и различни исторически събития. Трябва да построите своя град, да го оградите с висока стена, да създадете система за храна, забавления и, разбира се, да формирате своя собствена армия. Играта обединява много различни игри, защото трябва да наблюдавате настроението на населението и развитието на града, докато в другия край на картата управлявате битките. Има много раси и категории войски. От могъщи рицари до обикновени разбойници. От вас зависи да решите как ще провеждате правилата си за игра. Но играта определено ще остави отпечатък в паметта ви, защото на практика няма нищо толкова запомнящо се и ярко с такава система за развитие. Всички събития се случват в реално време, така че решенията ще трябва да се вземат бързо и обмислено.
    Предоставяме промоционални кодове за играта Stronghold Kingdoms, които ви дават големи отстъпки и бонуси. Благодарение на тях можете да наемете голяма армия и да превземете най-близките селища на играчите или да развиете град, който ще бъде достоен да бъде наречен столица на картата. Промоциите за тази игра се актуализират постоянно на нашия уебсайт, бъдете в крак с всички събития.

    Какво привлича потребителите в играта Stronghold Kingdoms:

    • Възможност за взаимодействие с много играчи от цял ​​свят: търговия, битки, превземане на замъци, шпионаж и много други;
    • Има възможност за изучаване на дисциплини и тяхното развитие. (Например: селско стопанство, индустрия, търговия, военно дело);
    • Глобална карта на провинциите, където всичко е разделено на региони (области). Всяка такава област ще бъде един вид родина за играча;
    • Игра срещу живи играчи и компютърни опоненти (бандитски лагер, вълча бърлога, вражески обсаден лагер и замъци на плъха, змията, глигана и вълка). AI може да атакува имотите на играча, така че си струва да се погрижите за защитата!
    Дълго време подхождах към въпроса да напиша бот за тази игра, но или ми липсваше опит, бях мързелив, или се опитах да подходя от грешна посока.
    В резултат на това, след като натрупах опит в писането и обратното инженерство на код в C#, реших да постигна целта си.

    Да, както може би сте забелязали, C# не е лесен - играта е написана на него, използвайки .net 2.0, което по-късно постави някои спици в колелата ми.

    Първоначално мислех да напиша сокет бот, който да емулира само мрежов протокол (който не е криптиран по никакъв начин) и да има „изходните кодове“ (резултатът от декомпилирането на il-кода) да могат лесно да бъдат възстановени на трета -партийно приложение.

    Но ми се стори досаден и досаден, защото защо да се занимавате с велосипед, ако имате тези много „изходни кодове“.

    Въоръжен с Reflector, започнах да разбера входната точка на играта (чийто код изобщо не е бил обфускиран повече от три години, изумен съм от разработчиците) - нищо особено.

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

    Private static void Main(string args) като входна точка и неговият клас Program намекват за това; класът, между другото, също е частен.

    Първо, побързах да направя класа и метода публични, като отново използвах Reflector с добавката Reflexil към него, без да знам какво да очаквам.

    Но изведнъж се натъкнах на стартер, който изтегля модифициран файл.
    След кратка битка с него със същия Reflector и извършване на аутопсия, извадих кода за настройка на аргументите, предадени на изпълнимия файл на играта:

    Ако (DDText.getText(0x17) == "XX") параметри = нов низ ( "-InstallerVersion", "", "", "st"); // st == steam else parameters = нов низ ( "-InstallerVersion", "", "" ); параметри = SelfUpdater.CurrentBuildVersion.ToString(); параметри = DDText.getText(0); // След като се разрових, разбрах, че това е езикът на играта, във формат „ru“, „de“, „en“ и т.н. Зарежда се от файла local.txt до стартовия панел. UpdateManager.SetCommandLineParameters(параметри); // И това е тяхната обвивка за най-често срещания System.Diagnostics.Process UpdateManager.StartApplication();

    Нека да разгледаме:

    If (DDText.getText(0x17) == "XX") - ред от файла local.txt до стартовия панел.
    Имат такава странна проверка за steam/no-steam версии: X – без пара, XX – пара. :\
    параметри = SelfUpdater.CurrentBuildVersion - версия на Launcher, спокойно скача от нея, въпреки че проверката в клиента е странна, както разбрах по-късно, и можете просто да посочите число, много по-голямо от текущото, „в резерв“, т.к. проверката е само за неактуалност, така да се каже, на версия чрез сравнение на числата „по-малко от по-голямо“.
    параметри = DDText.getText(0) - След като фалшифицирах версията, разбрах, че това е езикът на играта, във формат „ru“, „de“, „en“ и т.н.
    Зарежда се и от файла local.txt.

    Между другото, версията за стартиране изглежда така:

    Статичен SelfUpdater() ( currentBuildVersion = 0x75; // 117, т.е. 1.17 всъщност. )

    И направих вълшебен пакетен файл:

    StrongholdKingdoms.exe -InstallerVersion 117 en

    Въпреки че можете да направите това:

    StrongholdKingdoms.exe -InstallerVersion 100500 ru

    За което говорих малко по-нагоре.

    И така, това, което имаме: леко модифициран клиент и система за заобикаляне на стартера, ако можете да го наречете така.
    След като се опитах да стартирам всичко това, виждам, че играта работи и моите кръпки не й навредиха (въпреки че защо биха й навредили).

    След това се опитах да свържа изпълнимия файл на играта към проекта като библиотека от класове и да свържа пространството от имена на играта – Kingdoms.

    След това заградих много код: Опитах се да извикам Main и да емулирам класа Programm, но по някаква причина играта се срива със срив по време на изпълнение на not-dotnet-framework всеки път, когато се опитвах да я накарам да работи.
    Той се позова на факта, че играта използва много библиотеки, различни от C#, и много опасен код. Не намерих реални причини.

    Решението е правилно
    Страдайки дълго и не намирайки решение, се отказах. Но по някаква причина си спомних форка на сървъра на Terraria - TShock (да, форк, разбира се - момчетата също се забавляваха с декомпилатора) и неговото зареждане на модули (модове/плъгини) от DLL.

    Намерих тази идея интересна. След гугъл намерих както метод, така и код.
    След като се зарових малко в него и го тествах в моя собствен проект, с ужас открих, че работи (изведнъж!).
    Всъщност кодът:

    System.Reflection.Assembly A = System.Reflection.Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll"); Тип ClassType = A.GetType("BotDLL.Main", true); обект Obj = Activator.CreateInstance(ClassType); System.Reflection.MethodInfo MI = ClassType.GetMethod("Инжектиране"); 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 стойност точно когато играта започне:
    връщане (this.HasLoggedIn || (this.Username.Length > 0));
    Веднага бях доволен от това и веднага тази функция беше трансформирана в това:

    If (!IsStarted) ( System.Reflection.Assembly A = System.Reflection.Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll"); Тип 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.
    Е, вече обсъдихме основния код малко по-високо.
    И накрая връщаме това, което трябваше да бъде тук. =)

    И така - самият бот
    Функция за инжектиране:

    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 секунди Console.Clear(); ) Console.WriteLine("Светът е зареден! Стартиране на операции на ядрото."); Console.WriteLine("\n======| ИНФОРМАЦИЯ ЗА ОТСТРАНЯВАНЕ НА ГРЕШКИ |= ==== ="); Console.WriteLine(RemoteServices.Instance.UserID); Console.WriteLine(RemoteServices.Instance.UserName); Списък VillageIDs = GameEngine.Instance.World.getListOfUserVillages(); foreach (int VillageID в VillageIDs) ( WorldMap.VillageData Village = GameEngine.Instance.World.getVillageData(VillageID); Console.WriteLine("[Initialization] " + 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"); ) ) )


    Код на контролната форма:

    Скрит текст

    използване на системата; използване на System.Collections.Generic; използване на System.ComponentModel; използване на System.Data; използване на System.Drawing; използване на System.Text; използване на System.Windows.Forms; използване на System.Threading; използване на кралства; използване на System.CodeDom.Compiler; използвайки Microsoft.CSharp; използване на System.Reflection; пространство от имена BotDLL ( публичен частичен клас 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 = "Stop"; IsTrading = true; // Тогава търгуваме ) else // И обратно ( button_Trade.Text = "Търговия"; IsTrading = false; ) ) catch (Изключение ex) ( Console.WriteLine("\n======| EX INFO |======"); Log(ex .ToString()); Console.WriteLine( "======| ======= |======\n"); ) ) ) public void Trade() ( Log("Създаден търговски поток!"); int Sleep = 0; while (true) // If търговия ( Sleep = 60 + new Random().Next(-5, 60); if (IsTrading) ( Log("[" + DateTime.Now + "] Въвеждане с \"" + listBox_ResList.SelectedItem.ToString() + "\""); // Вземете идентификатора на продукта от списъка int ResID = int.Parse(listBox_ResList.SelectedItem.ToString().Replace(" ", "").Split("-")); int TargetID = int. Parse(textBox_TradeTargetID.Text); // Вземете ID на списъка на целевото село VillageIDs = GameEngine.Instance.World.getListOfUserVillages(); // Вземете списък с нашите села foreach (int VillageID в 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("Има " + MerchantsCount + " търговци в селото " + VillageID + "); // Отстраняване на грешки int SendWithOne = int.Parse(textBox_ResCount.Text); // Брой ресурси на търговец int MaxAmount = MerchantsCount * SendWithOne; // Брой ресурси ще бъдат изпратени, ако (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 = ""; // *** Примерен вход на формуляр има код в текстово поле string lcCode = richTextBox_In.Text; ICodeCompiler loCompiler = new CSharpCodeProvider().CreateCompiler(); CompilerParameters loParameters = new CompilerParameters(); // *** Започнете с добавяне на всички референтни сборки loParameters.ReferencedAssemblies.Add("System.dll"); loParameters.ReferencedAssemblies.Add("System.Data.dll"); loParameters.ReferencedAssemblies .Add("System.Windows.Forms.dll"); loParameters.ReferencedAssemblies.Add("StrongholdKingdoms.exe"); // *** Трябва да създадете напълно функционален асембли като низ lcCode = @"using System; using System.IO; using System.Windows.Forms; using System.Collections.Generic; using System.Text; using Kingdoms; namespace NSpace ( публичен клас NClass ( публичен обект DynamicCode(params обект Параметри) ( " + lcCode + @" return null; ) ) )"; // *** Заредете полученото събрание в паметта loParameters.GenerateInMemory = false; // *** Сега компилирайте всичко CompilerResults loCompiled = loCompiler.CompileAssemblyFromSource(loParameters, lcCode); if (loCompiled.Errors.HasErrors) ( низ lcErrorMsg = ""; lcErrorMsg = loCompiled.Errors.Count.ToString() + " Грешки:"; 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+ рамки и по някаква причина не исках да използвам по-стари версии, направих това:
    За удобство въведох изпълнение на код в реално време на самия Sharp - беше ми писнало да рестартирам играта след повторно компилиране отново и отново.
    използвах го.

    Долен ред
    Предимствата на това решение:
    1. Достъп до целия код на играта, сякаш имате изходния код.
    2. Можете да създадете своя собствена първокласна система за карти с опашка от сгради, неограничени изследвания и дори повече:
      • Алгоритъм за препродажба на стоки между регионите около вас.
      • Автоматично изграждане на село „въз основа на модел“, взет от съществуващо, като пример.
      • Автоматично наемане на различни единици.
      • Автоматичен ремонт на бравата, докато ви няма.
      • Автоматично събиране на гарантирана карта във времето.
    3. И разбира се, динамично изпълнение на код.
    4. Нелепа защита при откриване. Е, още няколко условия, за да не изпращате подозрителни фиктивни заявки.
    минуси:
    1. Ще трябва да заправите клиента ръчно с всяка версия. Или можете да напишете пачър, като използвате Mono.Cecil или еквивалент в рамката.
    2. За разлика от премиум картите, ще трябва да поддържате клиента винаги включен и онлайн.
    3. Играта е доста голяма, така че определено ще ви отнеме един час, за да проучите API. Въпреки че, ако имаше желание и инструменти, щеше да е добре ориентиран в годините - ако имаше желание. И във всеки случай е по-добре, отколкото да се забърквате с пакети.

    Ето как изглежда цялата работа:

    Списък на класовете

    • GameEngine
    • GameEngine.Instance
    • GameEngine.Instance.World
    • Карта на света
    • WorldMap.VillageData
    • RemoteServices
    • RemoteServices.Instance
    • AllVillagesPanel
    • VillageMap

    Към момента на писане версията на играта беше 2.0.18.6.
    Можете да изтеглите тази конкретна версия с изпълнимия файл на играта и бота.
    Не се притеснявайте, аз не крада лична информация. =) Уморен съм от играта, затова споделям опита си с общността.

    Изходните кодове са налични.
    Ако възнамерявате да използвате изходните кодове, използвайте чист изпълним файл (непоправен от вас) като библиотека с класове и също така забранете копирането на тази връзка към целевата директория, за да не замените случайно закърпения.
    игра бот Добавяне на тагове

    Веднага след плащането получавате цифрово копие на лицензния ключ от кутията с играта Stronghold Kingdoms от официалния доставчик - компанията Akella, който трябва да въведете в личния си акаунт на играта, за да получите бонуси на стойност 750 CZK:
    2 токена на месец
    10 производствени тестета
    10 палуби за храна
    5 защитни тестета (10 на тесте)
    4 бойни колоди (10 на колода)
    30 тестета произволни карти (10 на тесте)

    Стартовият комплект е идеален за нови играчи, които искат бързо да започнат със средновековното господство в Stronghold Kingdoms. Независимо дали искате да се занимавате със земеделие мирно, да се включите в политически игри или да отмъстите на заклетите си врагове, този стартов комплект ще ви даде мощен тласък по пътя ви към короната.

    Искате ли да станете барон, херцог или крал? Потопете се в света на воюващите феодали, в свят, в който се създават и унищожават съюзи и цели държави. Опитайте се в ролята на средновековен владетел. Тронът ви очаква, суверен!

    Характеристики на играта:
    - Присъединете се към хиляди играчи в реалистичен средновековен свят.
    - Изградете страхотни крепости, които ще просъществуват векове!
    - Въоръжете армиите си и завладете земите на съседите си!
    - Гледайте как вашите села, градове и замъци оживяват и растат.
    - Разгледайте стотици надеждни технологии.
    - Играйте на картата на Древна Рус!

    Този код няма териториални ограничения (без регион)
    Езици: руски, английски
    Издател: Акела

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

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

    За да активирате стартовия набор от бонуси за 750 крони, трябва да следвате простите инструкции:
    1. Влезте в съществуващия си акаунт или регистрирайте нов на официалния сайт на играта http://login.strongholdkingdoms.com/kingdoms/account.php
    2. Въведете кода за активиране, получен след плащането в полето „Код за активиране“, щракнете върху бутона за потвърждение, който се появява
    3. Бонуси на стойност 750 крони вече са във вашата сметка!

    Бъди внимателен! Можете да активирате този код в акаунта си само веднъж!

    Предлагаме ви също да обърнете внимание на подобни продукти:
    STRONGHOLD KINGDOMS - БОНУСИ ЗА 350 КОРОНИ -

    Може да се интересувате и от други игри, разпространявани от нас. Пълният списък е достъпен на линка:

    Отзиви

    54

    Няма обратна връзка от клиенти.

    За положителна оценка на закупения продукт, продавачът ще ви предостави карта за подарък в размер на 5,99 рубли .

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

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

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

    Firefly Studios пуснаха амбициозен нов свят на руски език за своя замък MMO Силни кралства. World 6 отвори вратите си на 15 юни и хиляди играчи се стекоха, за да изпробват свежия сървър за игри с нови механики, които бяха въведени в играта в последната актуализация. Новият свят е достъпен както за нови играчи, така и за ветерани Кралства. Тя се основава на географска карта на западната част на Русия, както и на околните региони и страни, включително балтийските държави, Украйна, Беларус, Казахстан и други държави.

    Играчите могат да се бият за контрол над тези територии, обединявайки се в мощни къщи със собствени правила и характеристики. Този свят се различава от предишните с актуализирана игрова механика, която ограничава използването на религията и предоставя повече възможности за начинаещи. Това е вторият свят в Stronghold Kingdoms, който използва новите правила, и първият „местен“ свят, където тези правила са установени.

    В допълнение към рускоговорящите, КралстваИма също британски, немски, френски, испански светове и светове, базирани на глобална карта. В момента всички играчи, които са се присъединили към новия свят, могат да активират специален промо код, който ще добави набор от елементи в играта към акаунта им, с които играчите могат значително да ускорят развитието си в новия свят и да установят ред в своето кралство .

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

    Този промо код може да бъде активиран в играта, като преминете през процеса на регистрация. Той ще бъде валиден до 1 юли и може да се използва само веднъж на акаунт.