To come in
All computer secrets for beginners and professionals
  • For a novice user: differences between software products of the 1C:Enterprise program system
  • Program 1s 8.3 demo version. Mobile application "UNF" NEW
  • Setting up 1C management of our company from scratch
  • Warface free registration
  • Registration in the game World Of Tanks – what do you need to know?
  • Starcraft II Strategy and Tactics
  • Writing a bot for Stronghold Kingdoms. Writing a bot for Stronghold Kingdoms Working codes for the game stronghold kingdoms

    Writing a bot for Stronghold Kingdoms.  Writing a bot for Stronghold Kingdoms Working codes for the game stronghold kingdoms

    Do you want to be transported to another era for a real adventure? Run a free online game on your computer "Stronghold Kingdoms" and try your hand at brutal medieval wars. Feel what the blood is like that runs cold in your veins, find out how much adrenaline you have. The effect of deep immersion in the game is guaranteed. Stronghold Kingdoms September-October 2019 – feel like a real hero!

    Players find themselves in a medieval world full of dangers, in which they will have to get used to and settle down, from building a home and defending a fortress to participating in a war.

    Game Features:

    • players build and expand medieval fortresses that will stand the test of time;
    • participants manage villages, correctly placing buildings in them to increase efficiency;
    • With the help of a trading card, players will be able to trade, explore, scout, etc.;
    • walking the path to high titles to gain power;
    • create and play your strategic cards to gain a vital advantage.

    The tension in this game will reach sky-high levels, and victory will allow you to feel real euphoria. The creators regularly develop new versions of the game. With each update, something new is added, opportunities are expanded, and the game becomes even brighter, more multifaceted and more interesting.

    How to apply a coupon for the game Stronghold Kingdoms September-October 2019?

    To get the coveted “secret word”, just select one of the items on our website for which the discount works and click the mouse, then the system automatically issues a unique symbolic number. Anyone can apply a promotional code for the Stronghold Kingdoms game: copy the received number, follow the link and paste the combination of letters and numbers into the special field when registering for paid services. Discount coupons are only valid for a limited time, so always pay attention to the timing of the promotion. As a rule, discounts on coupons cannot be combined with discounts on paid accounts and other gaming services marked “Special offer”.

    The game is distributed free of charge by downloading the game client from the official website of Firefly Studios.

    Please wait, promotional codes are loading

    Current Stronghold Kingdoms bonus codes and promotional codes have appeared on our website directly on this page. Stronghold Kingdoms is the latest browser strategy from the creators of the popular game Stronghold.

    The game is great for fans who do not want to download the client to their computer. All fans of the old version of the game will enjoy the gameplay, since you are now in Online mode. Now your enemies are people, not bots. You need to show your strategic and economic skills so that your city is not destroyed. For people who have heard about the game for the first time, there are a few things you need to know. Firstly, you immediately find yourself in the Middle Ages, during the Crusades and various historical events. You need to build your city, fence it with a high wall, establish a system of food, entertainment and, of course, form your own army. The game brings together many different games because you need to monitor the mood of the population and the development of the city, while at the other end of the map you manage the battles. There are many races and categories of troops. From powerful knights to ordinary robbers. It's up to you to decide how you are going to conduct your game policy. But the game will definitely leave a mark on your memory, because there is practically nothing so memorable and vivid with such a development system. All events take place in real time, so decisions will need to be made quickly and thoughtfully.
    We provide promotional codes for the game Stronghold Kingdoms, which give you big discounts and bonuses. Thanks to them, you can hire a large army and capture the nearest player settlements or develop a city that will be worthy of being called the capital of the map. Promotions for this game are constantly updated on our website, stay up to date with all the events.

    What attracts users to the game Stronghold Kingdoms:

    • The ability to interact with many players from all over the world: trade, battles, capturing castles, espionage and much more;
    • There is an opportunity to study disciplines and develop them. (For example: agriculture, industry, trade, military affairs);
    • Global map of provinces, where everything is divided into regions (districts). Each such area will be a kind of homeland for the player;
    • Game against live players and computer opponents (Bandit camp, wolf's lair, enemy siege camp and castles of the Rat, Snake, Boar and Wolf). AI can raid the player's properties, so it's worth taking care of protection!
    For a long time I approached the question of writing a bot for this game, but I either lacked experience, was lazy, or tried to approach it from the wrong direction.
    As a result, having gained experience in writing and reverse engineering code in C#, I decided to achieve my goal.

    Yes, as you may have noticed, C# is not easy - the game is written in it, using .net 2.0, which later put some spokes in my wheels.

    Initially, I thought of writing a socket bot that would only emulate a network protocol (which is not encrypted in any way), and having the “source codes” (the result of decompiling the il-code) can be easily restored in a third-party application.

    But it seemed to me tedious and dreary, because why bother with a bicycle if you have those very “source codes”.

    Armed with Reflector, I began to figure out the entry point of the game (the code of which has not been obfuscated at all for more than three years, I am amazed at the developers) - nothing special.

    Analysis and partly wrong decision
    Obviously, the game project was originally created as a console application:

    Private static void Main(string args) as an entry point and its Program class hint at this; the class, by the way, is also private.

    First of all, I rushed to make the class and method public, again using Reflector with the Reflexil addition to it, not knowing what to expect.

    But suddenly I encountered a launcher that was downloading a modified file.
    After briefly fighting with it with the same Reflector and performing an autopsy, I pulled out the code for setting the arguments passed to the game’s executable file:

    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); // After digging around, I found out that this is the language of the game, in the format “ru”, “de”, “en”, etc. Loaded from the local.txt file next to the launcher. UpdateManager.SetCommandLineParameters(parameters); // And this is their wrapper for the most common System.Diagnostics.Process UpdateManager.StartApplication();

    Let's look at:

    If (DDText.getText(0x17) == "XX") - A line from the local.txt file next to the launcher.
    They have such a strange check for steam/no-steam versions: X – no steam, XX – steam. :\
    parameters = SelfUpdater.CurrentBuildVersion - Launcher version, calmly jumps from it, although the check in the client is strange, as I found out later, and you can simply specify a number much larger than the current one, “in reserve”, because the check is only for outdatedness, so to speak, of a version through a comparison of numbers “less-than-greater”.
    parameters = DDText.getText(0) - Having forged the version, I found out that this is the language of the game, in the format “ru”, “de”, “en”, etc.
    It is also loaded from the local.txt file.

    By the way, the launcher version looks something like this:

    Static SelfUpdater() ( currentBuildVersion = 0x75; // 117, i.e. 1.17 in fact. )

    And I made a magical batch file:

    StrongholdKingdoms.exe -InstallerVersion 117 en

    Although you can do this:

    StrongholdKingdoms.exe -InstallerVersion 100500 ru

    Which is what I talked about a little higher.

    So, what we have: a slightly modified client and a launcher bypass system, if you can call it that.
    Having tried to run all this, I see that the game works and my patches did not harm it (although why would they harm it).

    After that, I tried to connect the game executable file to the project as a class library and connect the game namespace – Kingdoms.

    Then I fenced in a lot of code: I tried to call Main and emulate the Programm class, but for some reason the game crashed with a runtime crash of the not-dotnet-framework whenever I tried to make it work.
    He referred to the fact that the game uses a lot of non-C# libraries and a lot of unsafe code. I haven't found any real reasons.

    The decision is correct
    Having suffered for a long time and not finding a solution, I gave up. But for some reason I remembered the fork of the Terraria server - TShock (yeah, a fork, of course - the guys also had fun with the decompiler) and its loading of modules (mods/plugins) from DLLs.

    I found this idea interesting. After googling I found both a method and a code.
    Having delved into it a little and tested it in my own project, I was horrified to discover that it works (suddenly!).
    Actually, the code:

    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);

    Let's look at the code:
    System.Reflection.Assembly - This is the thing that is responsible for creating links to files when connecting them to a project, only from code. It also stores information about your project versions and copyrights (yes, the same AssemblyInfo.cs in all your projects).
    Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll") - Load our library.
    Then we call the function inside this class Inject(), which is essentially the beginning of the bot. =)
    I tried the code I sketched in a third-party application - the injection worked.

    Patching the client
    Now let's move on to the fun part - implementing the challenge code into the game.
    Having brazenly tried to stick it into Main by replacing the code using Reflexil, he was successfully sent to patch what was not patchable as a result of decompilation. Or maybe I was just lazy, it doesn’t matter.
    I went looking in this very Main for a guaranteed call to third-party functions (outside the main if branches, etc.) and quite quickly found a call to the MySettings.load() function, which loaded the game settings when it started.
    But there again turned out to be a mountain of code that did not want to compile without diamonds.
    But by luck, next to it there is a Boolean function hasLoggedIn() that returns a single bool value just when the game starts:
    return (this.HasLoggedIn || (this.Username.Length > 0));
    I was immediately pleased with this and immediately this function was transformed into this:

    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));

    Let's deal with him.
    if (!IsStarted) – we had to add this check, and to do this, introduce an additional field into the MySettings class, since our function is called more than once, and we don’t really need several bot threads. This is done by the same Reflexil.
    Well, we have already discussed the main code a little higher.
    And in the end we return what was supposed to be here. =)

    So - the bot itself
    Inject function:

    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(); !}

    First we call the function to open the console window - this will be easier for debugging.
    Then we start the flow with our main bot loop – SHK();
    And at the same time we open the bot control form for convenience.

    Then all that’s left is to implement the functionality you need.
    Here is the rest of my code - here I implemented an automatic trading system.
    For it to work, you first need to “cache” the villages in each session - open each of the villages that you are going to trade.
    This code is of doubtful help, and I have not yet figured out other ways to automatically load villages:

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

    Here is the SHK function code:

    Hidden text

    public void SHK() ( Console.WriteLine("Injection completed!"); while (!GameEngine.Instance.World.isDownloadComplete()) ( Console.WriteLine("The world has not yet been downloaded!"); Thread.Sleep(5000) ; // 5 sec Console.Clear(); ) Console.WriteLine("The world is loaded! Starting kernel operations."); 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("[Initialization] " + Village.m_villageName + " - " + VillageID); InterfaceMgr.Instance.selectVillage (VillageID); GameEngine.Instance.downloadCurrentVillage(); ) Console.WriteLine("======| ========== |======\n"); while (true) ( ​​try ( // You can insert something of your own here ) catch (Exception ex) ( Console.WriteLine("\n======| EX INFO |======"); Console .WriteLine(ex); Console.WriteLine("======| ======= |======\n"); ) ) )


    Control form code:

    Hidden text

    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("The bot form is displayed."); listBox_ResList.SelectedIndex = 0; Log("Start trading thread..."); TradeThread = new Thread(Trade); TradeThread.Start(); ) private void button_Trade_Click(object sender, EventArgs e) ( // If the world is already loaded and the target field is filled if (GameEngine.Instance.World.isDownloadComplete() && textBox_TradeTargetID.Text. Length > 0) ( try ( if (!IsTrading) // If we do not trade ( button_Trade.Text = "Stop"; IsTrading = true; // Then we trade ) else // And vice versa ( button_Trade.Text = "Trade"; IsTrading = false; ) ) catch (Exception ex) ( Console.WriteLine("\n======| EX INFO |======"); Log(ex.ToString()); Console.WriteLine( "======| ======= |======\n"); ) ) ) public void Trade() ( Log("Trade flow created!"); int Sleep = 0; while (true) // If trading ( Sleep = 60 + new Random().Next(-5, 60); if (IsTrading) ( Log("[" + DateTime.Now + "] Entering with \"" + listBox_ResList.SelectedItem.ToString() + "\""); // Get the product ID from the list int ResID = int.Parse(listBox_ResList.SelectedItem.ToString().Replace(" ", "").Split("-")); int TargetID = int. Parse(textBox_TradeTargetID.Text); // Get the ID of the target village List VillageIDs = GameEngine.Instance.World.getListOfUserVillages(); // Get a list of our villages foreach (int VillageID in VillageIDs) // We go through them ( // If the village is loaded (its map was opened at least once in the current session) if (GameEngine.Instance.getVillage(VillageID) != null) ( // Get basic information about our village WorldMap.VillageData Village = GameEngine.Instance.World.getVillageData(VillageID); VillageMap Map = GameEngine.Instance.getVillage(VillageID); // Get complete information int ResAmount = (int)Map.getResourceLevel(ResID ); // Number of resources in the warehouse int MerchantsCount = Map.calcTotalTradersAtHome(); // Number of merchants in it Log("There are " + MerchantsCount + " merchants in the village " + VillageID + "); // Debug int SendWithOne = int.Parse(textBox_ResCount.Text); // Number of resources per merchant int MaxAmount = MerchantsCount * SendWithOne; // Number of resources will be sent if (ResAmount< MaxAmount) // Если торговцы могут увезти больше чем есть MerchantsCount = (int)(ResAmount / SendWithOne); // Считаем сколько смогут увезти реально if (MerchantsCount >0) // If there are traders at home ( TargetID = GameEngine.Instance.World.getRegionCapitalVillage(Village.regionID); // Trade with the region, temporarily textBox_TradeTargetID.Text = TargetID.ToString(); // Call a high-level trading function with a number of callbacks GameEngine.Instance.getVillage(VillageID).stockExchangeTrade(TargetID, ResID, MerchantsCount * SendWithOne, false); AllVillagesPanel.travellersChanged(); // Confirm the changes (traders have left) in the GUI client ) ) ) Log("Repeat the trading cycle through " + Sleep + " seconds in " + DateTime.Now.AddSeconds(Sleep).ToString("HH:mm:ss")); Console.WriteLine(); ) Thread.Sleep(Sleep * 1000); // We sleep so as not to spam. So less fawn. ) ) 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"); } } } }

    Initially, I wanted to plug NLua (Lua library for C#) into the bot, but since it only supports 3.5+ frameworks, and for some reason I didn’t want to use older versions, I did this:
    For convenience, I introduced real-time code execution on the Sharp itself - I was tired of restarting the game after recompilations over and over again.
    I used it.

    Bottom line
    The advantages of this solution:
    1. Access all game code as if you had the source code.
    2. You can make your own premium map system with a queue of buildings, unlimited research, and even more:
      • Algorithm for reselling goods among the regions around you.
      • Automatic construction of a village “based on a model” taken from an existing one, as an example.
      • Auto-hiring of various units.
      • Automatic repair of the lock while you are away.
      • Automatic collection of a guaranteed card over time.
    3. And of course, dynamic code execution.
    4. Ridiculous detection protection. Well, a couple more conditions in order not to send suspicious dummy requests.
    Minuses:
    1. You will have to patch the client manually with each version. Or you can write a patcher using Mono.Cecil or an equivalent in the framework.
    2. Unlike premium cards, you will have to keep the client always on and online.
    3. The game is quite large, so it will definitely take you an hour to study the API. Although, if he had the desire and the tools, he would be well versed in years - if he had the desire. And in any case, it’s better than messing around with packages.

    This is what the whole thing looks like:

    List of classes

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

    At the time of writing, the game version was 2.0.18.6.
    You can download this particular version with the executable file of the game and the bot.
    Don't worry, I don't steal personal information. =) I'm tired of the game, so I'm sharing my experience with the community.

    Source codes are available.
    If you are going to use the source codes, use a clean executable file (not patched by you) as a class library, and also disable copying of this link to the destination directory, so as not to accidentally replace the patched one.
    game bot Add tags

    Immediately after payment, you receive a digital copy of the license key from the box with the game Stronghold Kingdoms from the official supplier - the Akella company, which must be entered in your personal account of the game to receive bonuses worth 750 CZK:
    2 tokens per month
    10 Production Decks
    10 Food Decks
    5 Defense Decks (10 per deck)
    4 War Decks (10 per deck)
    30 Decks of random cards (10 per deck)

    The Starter Set is ideal for new players who want to quickly get started with medieval domination in Stronghold Kingdoms. Whether you want to farm peacefully, get involved in political games, or take revenge on your sworn enemies, this starter set will give you a powerful boost on your path to the crown.

    Do you want to become a baron, duke or king? Immerse yourself in the world of warring feudal lords, in a world where alliances and entire states are created and destroyed. Try on the role of a medieval ruler. The throne awaits you, Sovereign!

    Game Features:
    - Join thousands of players in a realistic medieval world.
    - Build great fortresses that will last for centuries!
    - Arm your armies and conquer the lands of your neighbors!
    - Watch your villages, towns and castles come to life and grow.
    - Explore hundreds of trusted technologies.
    - Play on the map of Ancient Rus'!

    This code has no territorial restrictions (Region Free)
    Languages: Russian, English
    Publisher: Akella

    Additional Information

    The game Stronghold Kingdoms is free (Free to Play), you can download it via Steam - http://store.steampowered.com/app/47410/

    To activate the starter set of bonuses for 750 crowns, you need to follow the simple instructions:
    1. Log in to your existing account or register a new one on the official website of the game http://login.strongholdkingdoms.com/kingdoms/account.php
    2. Enter the activation code received after payment in the “Activate code” field, click on the confirmation button that appears
    3. Bonuses worth 750 crowns are already on your account!

    Be careful! You can activate this code on your account only once!

    We also suggest that you pay attention to similar products:
    STRONGHOLD KINGDOMS - BONUSES FOR 350 CROWNS -

    You may also be interested in other games distributed by us. The full list is available at the link:

    Reviews

    54

    No feedback received from customers.

    For a positive review of the purchased product, the seller will provide you with a gift card in the amount of RUB 5.99 .

    In order to counter the violation of copyright and property rights, as well as to exclude unfounded accusations against the site administration of complicity in such a violation, the administration of the Plati trading platform (http://www.site) appeals to you with a request - in case of detection of violations on the trading platform Plati, immediately inform us at the address of the fact of such a violation and provide us with reliable information confirming your copyright or ownership rights. In the letter, be sure to indicate your contact details (full name, telephone number).

    In order to exclude unfounded and deliberately false reports of violations of these rights, the administration will refuse to provide services on the Plati trading platform only after receiving from you written statements of violation accompanied by copies of documents confirming your copyright or ownership rights, at the address: 123007, Moscow, Maly Kaluzhsky lane. 4, building 3, Lawyer's office "AKAR No. 380".

    In order to promptly respond to violations of your rights and the need to block the actions of unscrupulous sellers, Plati asks you to send a certified telegram, which will be the basis for blocking the actions of the seller, this telegram must contain an indication of: the type of rights violated, confirmation of your rights and your contact details (organizationally - legal form of the person, full name). The blocking will be lifted after 15 days if you fail to provide the Law Office with written documents confirming your copyright or ownership rights.

    Firefly Studios have released an ambitious new Russian-language world for their castle MMO Stronghold Kingdoms. World 6 opened its gates on June 15 and thousands of players flocked to try out the fresh game server with new mechanics that were introduced to the game in the latest update. The new world is available to both new players and veterans Kingdoms. It is based on a geographical map of the western part of Russia, as well as its surrounding regions and countries, including the Baltic states, Ukraine, Belarus, Kazakhstan and other states.

    Players can fight for control of these territories, uniting into powerful Houses with their own rules and characteristics. This world differs from previous ones with updated game mechanics that limit the use of religion and provide more opportunities for beginners. This is the second world in Stronghold Kingdoms to use the new rules, and the first "local" world where these rules have been established.

    In addition to Russian speakers, Kingdoms There are also British, German, French, Spanish worlds, and worlds based on a global map. Right now, all players who have joined the new world can activate a special promo code that will add a set of in-game items to their account, with which players can significantly speed up their development in the new world and establish order in their kingdom.

    Code: D1F9-33BA-0C7F-BAF5

    This promo code can be activated in the game by going through the registration process. It will be valid until July 1st and can only be used once per account.