Entrar
Todos os segredos de informática para iniciantes e profissionais
  • Para um usuário iniciante: diferenças entre produtos de software do sistema do programa 1C:Enterprise
  • Versão demo do programa 1s 8.3. Aplicativo móvel "UNF" NOVO
  • Configurando o gerenciamento 1C da nossa empresa do zero
  • Registro gratuito do Warface
  • Cadastro no jogo World Of Tanks – o que você precisa saber?
  • Estratégia e táticas de Starcraft II
  • Escrevendo um bot para Stronghold Kingdoms. Escrevendo um bot para Stronghold Kingdoms Códigos de trabalho para o jogo Stronghold Kingdoms

    Escrevendo um bot para Stronghold Kingdoms.  Escrevendo um bot para Stronghold Kingdoms Códigos de trabalho para o jogo Stronghold Kingdoms

    Você quer ser transportado para outra época para uma verdadeira aventura? Execute um jogo online gratuito no seu computador "Reinos Fortaleza" e experimente guerras medievais brutais. Sinta como é o sangue que corre frio em suas veias, descubra quanta adrenalina você tem. O efeito de imersão profunda no jogo é garantido. Stronghold Kingdoms setembro-outubro de 2019 – sinta-se um verdadeiro herói!

    Os jogadores se encontram em um mundo medieval cheio de perigos, aos quais terão que se acostumar e se estabelecer, desde construir uma casa e defender uma fortaleza até participar de uma guerra.

    Funcionalidades do jogo:

    • os jogadores constroem e expandem fortalezas medievais que resistirão ao teste do tempo;
    • os participantes administram aldeias, colocando edifícios nelas corretamente para aumentar a eficiência;
    • Com a ajuda de um cartão colecionável, os jogadores poderão negociar, explorar, explorar, etc.;
    • trilhando o caminho de altos títulos para ganhar poder;
    • crie e jogue suas cartas estratégicas para obter uma vantagem vital.

    A tensão neste jogo atingirá níveis altíssimos e a vitória permitirá que você sinta uma verdadeira euforia. Os criadores desenvolvem regularmente novas versões do jogo. A cada atualização, algo novo é adicionado, as oportunidades são ampliadas e o jogo fica ainda mais brilhante, mais multifacetado e mais interessante.

    Como aplicar um cupom para o jogo Stronghold Kingdoms de setembro a outubro de 2019?

    Para obter a cobiçada “palavra secreta”, basta selecionar um dos itens do nosso site para o qual o desconto funciona e clicar com o mouse, em seguida o sistema emite automaticamente um número simbólico único. Qualquer pessoa pode aplicar um código promocional para o jogo Stronghold Kingdoms: copie o número recebido, siga o link e cole a combinação de letras e números no campo especial ao se cadastrar em serviços pagos. Os cupons de desconto são válidos apenas por tempo limitado, por isso fique sempre atento ao momento da promoção. Via de regra, os descontos em cupons não podem ser combinados com descontos em contas pagas e outros serviços de jogo marcados como “Oferta especial”.

    O jogo é distribuído gratuitamente baixando o cliente do jogo no site oficial da Firefly Studios.

    Aguarde, os códigos promocionais estão sendo carregados

    Os códigos de bônus e códigos promocionais atuais do Stronghold Kingdoms apareceram em nosso site diretamente nesta página. Stronghold Kingdoms é a estratégia de navegador mais recente dos criadores do popular jogo Stronghold.

    O jogo é ótimo para fãs que não desejam baixar o cliente para o computador. Todos os fãs da versão antiga do jogo vão gostar da jogabilidade, já que agora você está no modo Online. Agora seus inimigos são pessoas, não bots. Você precisa mostrar suas habilidades estratégicas e econômicas para que sua cidade não seja destruída. Para quem ouviu falar do jogo pela primeira vez, há algumas coisas que você precisa saber. Em primeiro lugar, você se encontra imediatamente na Idade Média, durante as Cruzadas e vários acontecimentos históricos. Você precisa construir sua cidade, cercá-la com um muro alto, estabelecer um sistema de alimentação, entretenimento e, claro, formar seu próprio exército. O jogo reúne muitos jogos diferentes porque você precisa monitorar o humor da população e o desenvolvimento da cidade, enquanto na outra ponta do mapa você gerencia as batalhas. Existem muitas raças e categorias de tropas. De cavaleiros poderosos a ladrões comuns. Cabe a você decidir como conduzirá sua política de jogo. Mas o jogo com certeza vai deixar uma marca na sua memória, pois praticamente não há nada tão memorável e vívido com tal sistema de desenvolvimento. Todos os eventos ocorrem em tempo real, portanto as decisões deverão ser tomadas de forma rápida e ponderada.
    Fornecemos códigos promocionais para o jogo Stronghold Kingdoms, que oferecem grandes descontos e bônus. Graças a eles, você pode contratar um grande exército e capturar os assentamentos de jogadores mais próximos ou desenvolver uma cidade que seja digna de ser chamada de capital do mapa. As promoções deste jogo são constantemente atualizadas em nosso site, fique por dentro de todos os acontecimentos.

    O que atrai os usuários para o jogo Stronghold Kingdoms:

    • A capacidade de interagir com vários jogadores de todo o mundo: comércio, batalhas, captura de castelos, espionagem e muito mais;
    • Existe a oportunidade de estudar disciplinas e desenvolvê-las. (Por exemplo: agricultura, indústria, comércio, assuntos militares);
    • Mapa global das províncias, onde tudo está dividido em regiões (distritos). Cada uma dessas áreas será uma espécie de pátria para o jogador;
    • Jogue contra jogadores ao vivo e oponentes controlados pelo computador (acampamento de bandidos, covil do lobo, acampamento de cerco inimigo e castelos do Rato, Cobra, Javali e Lobo). A IA pode invadir as propriedades do jogador, então vale a pena cuidar da proteção!
    Por muito tempo abordei a questão de escrever um bot para este jogo, mas ou não tinha experiência, era preguiçoso ou tentei abordá-lo pela direção errada.
    Como resultado, tendo adquirido experiência em escrita e engenharia reversa de código em C#, decidi atingir meu objetivo.

    Sim, como você deve ter notado, C# não é fácil - o jogo é escrito nele, usando .net 2.0, que mais tarde colocou alguns raios nas minhas rodas.

    Inicialmente, pensei em escrever um bot de soquete que apenas emulasse um protocolo de rede (que não é criptografado de forma alguma) e que os “códigos-fonte” (resultado da descompilação do código-il) pudessem ser facilmente restaurados em um terceiro -aplicativo de festa.

    Mas me pareceu tedioso e enfadonho, porque por que se preocupar com uma bicicleta se você tem esses mesmos “códigos-fonte”.

    Armado com o Reflector, comecei a descobrir o ponto de entrada do jogo (cujo código não foi ofuscado por mais de três anos, estou impressionado com os desenvolvedores) - nada de especial.

    Análise e decisão parcialmente errada
    Obviamente, o projeto do jogo foi originalmente criado como um aplicativo de console:

    Private static void Main(string args) como um ponto de entrada e sua classe Program sugerem isso; a classe, aliás, também é privada.

    Em primeiro lugar, corri para tornar a classe e o método públicos, novamente usando o Reflector com a adição do Reflexil, sem saber o que esperar.

    Mas de repente encontrei um inicializador que estava baixando um arquivo modificado.
    Depois de lutar brevemente com ele com o mesmo Refletor e realizar uma autópsia, retirei o código para definir os argumentos passados ​​para o arquivo executável do jogo:

    If (DDText.getText(0x17) == "XX") parâmetros = nova string ( "-InstallerVersion", "", "", "st" ); // st == steam else parâmetros = nova string ( "-InstallerVersion", "", "" ); parâmetros = SelfUpdater.CurrentBuildVersion.ToString(); parâmetros = DDText.getText(0); // Depois de pesquisar, descobri que esse é o idioma do jogo, no formato “ru”, “de”, “en”, etc. Carregado do arquivo local.txt próximo ao inicializador. UpdateManager.SetCommandLineParameters(parâmetros); // E este é o wrapper para o System.Diagnostics.Process UpdateManager.StartApplication() mais comum;

    Vamos olhar para:

    If (DDText.getText(0x17) == "XX") - Uma linha do arquivo local.txt próximo ao inicializador.
    Eles têm uma verificação tão estranha para versões com vapor/sem vapor: X – sem vapor, XX – vapor. :\
    parâmetros = SelfUpdater.CurrentBuildVersion - Versão do Launcher, salta calmamente dela, embora a verificação no cliente seja estranha, como descobri mais tarde, e você pode simplesmente especificar um número muito maior que o atual, “na reserva”, porque a verificação é apenas para a desatualização, por assim dizer, de uma versão através da comparação de números “menores que maiores”.
    parâmetros = DDText.getText(0) - Falsificada a versão, descobri que esta é a linguagem do jogo, no formato “ru”, “de”, “en”, etc.
    Ele também é carregado do arquivo local.txt.

    A propósito, a versão do launcher é mais ou menos assim:

    Static SelfUpdater() ( currentBuildVersion = 0x75; // 117, ou seja, 1,17 na verdade. )

    E fiz um arquivo em lote mágico:

    StrongholdKingdoms.exe -InstallerVersion 117 pt

    Embora você possa fazer isso:

    StrongholdKingdoms.exe -InstallerVersion 100500 ru

    Que é o que falei um pouco mais acima.

    Então, o que temos: um cliente ligeiramente modificado e um sistema de desvio do iniciador, se você pode chamar assim.
    Depois de tentar rodar tudo isso, vejo que o jogo funciona e meus patches não o prejudicaram (embora por que o prejudicariam).

    Depois disso, tentei conectar o arquivo executável do jogo ao projeto como uma biblioteca de classes e conectar o namespace do jogo – Kingdoms.

    Então eu coloquei muito código: tentei chamar Main e emular a classe Programm, mas por algum motivo o jogo travou com uma falha de tempo de execução do framework não-dotnet sempre que tentei fazê-lo funcionar.
    Ele se referiu ao fato de que o jogo usa muitas bibliotecas não-C# e muito código inseguro. Não encontrei nenhum motivo real.

    A decisão está correta
    Depois de sofrer muito e não encontrar solução, desisti. Mas por algum motivo me lembrei do fork do servidor Terraria - TShock (sim, um fork, claro - a galera também se divertiu com o descompilador) e seu carregamento de módulos (mods/plugins) de DLLs.

    Achei essa ideia interessante. Depois de pesquisar no Google, encontrei um método e um código.
    Depois de me aprofundar um pouco e testar em meu próprio projeto, fiquei horrorizado ao descobrir que funciona (de repente!).
    Na verdade, o código:

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

    Vejamos o código:
    System.Reflection.Assembly - É o responsável por criar links para arquivos ao conectá-los a um projeto, apenas a partir do código. Ele também armazena informações sobre as versões e direitos autorais do seu projeto (sim, o mesmo AssemblyInfo.cs em todos os seus projetos).
    Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll") - Carregue nossa biblioteca.
    Então chamamos a função dentro desta classe Inject(), que é essencialmente o início do bot. =)
    Tentei o código que esbocei em um aplicativo de terceiros - a injeção funcionou.

    Corrigindo o cliente
    Agora vamos para a parte divertida: implementar o código do desafio no jogo.
    Tendo descaradamente tentado inseri-lo no Main substituindo o código usando Reflexil, ele foi enviado com sucesso para corrigir o que não era corrigível como resultado da descompilação. Ou talvez eu fosse apenas preguiçoso, não importa.
    Procurei neste mesmo Main por uma chamada garantida para funções de terceiros (fora das ramificações if principais, etc.) e rapidamente encontrei uma chamada para a função MySettings.load(), que carregou as configurações do jogo quando ele foi iniciado.
    Mas novamente havia uma montanha de código que não queria compilar sem diamantes.
    Mas, por sorte, próximo a ela existe uma função booleana hasLoggedIn() que retorna um único valor bool apenas quando o jogo começa:
    return (this.HasLoggedIn || (this.Username.Length > 0));
    Fiquei imediatamente satisfeito com isso e imediatamente esta função foi transformada nisto:

    If (!IsStarted) ( System.Reflection.Assembly A = System.Reflection.Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll"); Digite 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));

    Vamos lidar com ele.
    if (!IsStarted) – tivemos que adicionar esta verificação e, para fazer isso, introduzir um campo adicional na classe MySettings, já que nossa função é chamada mais de uma vez e realmente não precisamos de vários threads de bot. Isso é feito pelo mesmo Reflexil.
    Bem, já discutimos o código principal um pouco mais acima.
    E no final devolvemos o que deveria estar aqui. =)

    Então - o próprio bot
    Função de injeção:

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

    Primeiro chamamos a função para abrir a janela do console - isso será mais fácil para depuração.
    Então iniciamos o fluxo com nosso bot loop principal – SHK();
    E ao mesmo tempo abrimos o formulário de controle do bot por conveniência.

    Então só falta implementar a funcionalidade que você precisa.
    Aqui está o resto do meu código - aqui implementei um sistema de negociação automático.
    Para que funcione, primeiro você precisa “armazenar em cache” as aldeias em cada sessão – abrir cada uma das aldeias que você vai negociar.
    Este código é de ajuda duvidosa e ainda não descobri outras maneiras de carregar aldeias automaticamente:

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

    Aqui está o código da função SHK:

    Texto oculto

    public void SHK() ( Console.WriteLine("Injeção concluída!"); while (!GameEngine.Instance.World.isDownloadComplete()) ( Console.WriteLine("O mundo ainda não foi baixado!"); Thread.Sleep (5000) ; // 5 seg Console.Clear(); ) Console.WriteLine("O mundo está carregado! Iniciando operações do kernel."); Console.WriteLine("\n======| DEBUG INFO |= ==== ="); Console.WriteLine(RemoteServices.Instance.UserID); Console.WriteLine(RemoteServices.Instance.UserName); Lista VillageIDs = GameEngine.Instance.World.getListOfUserVillages(); foreach (int VillageID em VillageIDs) ( WorldMap.VillageData Village = GameEngine.Instance.World.getVillageData(VillageID); Console.WriteLine("[Inicialização] " + Village.m_villageName + " - " + VillageID); InterfaceMgr.Instance.selectVillage (VillageID); GameEngine.Instance.downloadCurrentVillage(); ) Console.WriteLine("======| ========== |======\n"); while (true) ( ​​try ( // Você pode inserir algo de sua preferência aqui ) catch (Exception ex) ( Console.WriteLine("\n======| EX INFO |======" ); Console .WriteLine(ex); Console.WriteLine("======| ======= |======\n"); ) ) )


    Código do formulário de controle:

    Texto oculto

    usando o sistema; usando System.Collections.Generic; usando System.ComponentModel; usando System.Data; usando System.Drawing; usando System.Text; usando System.Windows.Forms; usando System.Threading; usando Reinos; usando System.CodeDom.Compiler; usando Microsoft.CSharp; usando System.Reflection; namespace BotDLL ( classe parcial pública 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("O formulário do bot é exibido."); listBox_ResList.SelectedIndex = 0; Log("Iniciar thread de negociação..."); TradeThread = new Thread(Trade); TradeThread.Start(); ) private void button_Trade_Click(object sender, EventArgs e) ( // Se o mundo já estiver carregado e o campo de destino estiver preenchido if (GameEngine.Instance.World.isDownloadComplete( ) && textBox_TradeTargetID.Text. Length > 0) ( try ( if (!IsTrading) // Se não negociarmos ( button_Trade.Text = "Stop"; IsTrading = true; // Então negociaremos ) else // E vice-versa ( button_Trade.Text = "Trade"; IsTrading = false; ) ) catch (Exceção ex) ( Console.WriteLine("\n======| EX INFO |======"); Log(ex .ToString()); Console.WriteLine( "======| ======= |======\n"); ) ) ) public void Trade() ( Log("Fluxo de negociação criado!"); int Sleep = 0; while (true) // If negociação ( Sleep = 60 + new Random().Next(-5, 60); if (IsTrading) ( Log("[" + DateTime.Now + "] Entrando com \"" + listBox_ResList.SelectedItem.ToString() + "\""); // Obtenha o ID do produto da lista int ResID = int.Parse(listBox_ResList.SelectedItem.ToString().Replace(" ", "").Split("-")); int TargetID = int.Parse(textBox_TradeTargetID.Text); // Obtém o ID da aldeia alvo List VillageIDs = GameEngine.Instance.World.getListOfUserVillages(); // Obtemos uma lista de nossas aldeias foreach (int VillageID em VillageIDs) // Nós as examinamos ( // Se a aldeia estiver carregada (seu mapa foi aberto pelo menos uma vez na sessão atual) if (GameEngine.Instance.getVillage( VillageID) != null) ( // Obtenha informações básicas sobre nossa vila WorldMap.VillageData Village = GameEngine.Instance.World.getVillageData(VillageID); VillageMap Map = GameEngine.Instance.getVillage(VillageID); // Obtenha informações completas int ResAmount = (int)Map.getResourceLevel(ResID ); // Número de recursos no armazém int MerchantsCount = Map.calcTotalTradersAtHome(); // Número de comerciantes nele Log("Existem " + MerchantsCount + " comerciantes na vila " + VillageID + "); // Depurar int SendWithOne = int.Parse(textBox_ResCount.Text); // Número de recursos por comerciante int MaxAmount = MerchantsCount * SendWithOne; // Número de recursos serão enviados if (ResAmount< MaxAmount) // Если торговцы могут увезти больше чем есть MerchantsCount = (int)(ResAmount / SendWithOne); // Считаем сколько смогут увезти реально if (MerchantsCount >0) // Se houver traders em casa ( TargetID = GameEngine.Instance.World.getRegionCapitalVillage(Village.regionID); // Negocie com a região, temporariamente textBox_TradeTargetID.Text = TargetID.ToString(); // Chame um high- função de negociação de nível com vários retornos de chamada GameEngine.Instance.getVillage(VillageID).stockExchangeTrade(TargetID, ResID, MerchantsCount * SendWithOne, false); AllVillagesPanel.travellersChanged(); // Confirme as alterações (os comerciantes saíram) no cliente GUI ) ) ) Log("Repita o ciclo de negociação através de " + Sleep + " segundos em " + DateTime.Now.AddSeconds(Sleep).ToString("HH:mm:ss")); Console.WriteLine(); ) Thread.Sleep(Sleep * 1000); // Dormimos para não enviar spam. Então, menos fulvo. ) ) private void BotForm_FormClosing(remetente do objeto, FormClosingEventArgs e) ( try ( TradeThread.Abort(); ) catch () ) private void button_MapEditing_Click(remetente do objeto, EventArgs e) ( button_MapEditing.Text = (!GameEngine.Instance.World.MapEditing ).ToString(); GameEngine.Instance.World.MapEditing = !GameEngine.Instance.World.MapEditing; ) private void button_Exec_Click(objeto remetente, EventArgs e) ( if (richTextBox_In.Text.Length == 0 || !GameEngine. Instance.World.isDownloadComplete()) return; richTextBox_Out.Text = ""; // *** A entrada do formulário de exemplo possui código em uma string de caixa de texto lcCode = richTextBox_In.Text; ICodeCompiler loCompiler = new CSharpCodeProvider().CreateCompiler(); CompilerParameters loParameters = new CompilerParameters(); // *** Comece adicionando quaisquer assemblies referenciados loParameters.ReferencedAssemblies.Add("System.dll"); loParameters.ReferencedAssemblies.Add("System.Data.dll"); loParameters.ReferencedAssemblies .Add("System.Windows.Forms.dll"); loParameters.ReferencedAssemblies.Add("StrongholdKingdoms.exe"); // *** Deve criar um assembly totalmente funcional como uma string lcCode = @"using System; using System.IO; using System.Windows.Forms; using System.Collections.Generic; using System.Text; using Kingdoms; namespace NSpace (classe pública NClass (objeto público DynamicCode (parâmetros do objeto params) ( " + lcCode + @" return null; ) ) )"; // *** Carrega o assembly resultante na memória loParameters.GenerateInMemory = false; // *** Agora compile tudo CompilerResults loCompiled = loCompiler.CompileAssemblyFromSource(loParameters, lcCode); if (loCompiled.Errors.HasErrors) ( string lcErrorMsg = ""; lcErrorMsg = loCompiled.Errors.Count.ToString() + " Erros:"; 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"); } } } }

    Inicialmente, eu queria conectar NLua (biblioteca Lua para C#) ao bot, mas como ele suporta apenas estruturas 3.5+ e, por algum motivo, não queria usar versões mais antigas, fiz o seguinte:
    Por conveniência, introduzi a execução de código em tempo real no próprio Sharp - estava cansado de reiniciar o jogo após recompilações repetidas vezes.
    Eu usei.

    Resultado final
    As vantagens desta solução:
    1. Acesse todo o código do jogo como se você tivesse o código-fonte.
    2. Você pode criar seu próprio sistema de mapas premium com uma fila de edifícios, pesquisas ilimitadas e ainda mais:
      • Algoritmo para revenda de mercadorias entre as regiões ao seu redor.
      • Construção automática de uma aldeia “baseada num modelo” retirado de uma já existente, por exemplo.
      • Auto-contratação de diversas unidades.
      • Reparo automático da fechadura enquanto você estiver ausente.
      • Coleta automática de um cartão garantido ao longo do tempo.
    3. E, claro, execução dinâmica de código.
    4. Proteção de detecção ridícula. Bem, mais algumas condições para não enviar solicitações falsas suspeitas.
    Desvantagens:
    1. Você terá que corrigir o cliente manualmente com cada versão. Ou você pode escrever um patcher usando Mono.Cecil ou equivalente no framework.
    2. Ao contrário dos cartões premium, você terá que manter o cliente sempre ligado e online.
    3. O jogo é bastante grande, então você definitivamente levará uma hora para estudar a API. Embora, se ele tivesse o desejo e as ferramentas, ele seria bem versado em anos - se tivesse o desejo. E de qualquer forma, é melhor do que mexer em pacotes.

    É assim que tudo se parece:

    Lista de aulas

    • Motor do jogo
    • GameEngine.Instância
    • GameEngine.Instance.World
    • Mapa mundial
    • WorldMap.VillageData
    • Serviços remotos
    • RemoteServices.Instância
    • Painel Todas as Aldeias
    • AldeiaMapa

    No momento em que este artigo foi escrito, a versão do jogo era 2.0.18.6.
    Você pode baixar esta versão específica com o arquivo executável do jogo e do bot.
    Não se preocupe, não roubo informações pessoais. =) Estou cansado do jogo, então estou compartilhando minha experiência com a comunidade.

    Os códigos-fonte estão disponíveis.
    Se você for usar os códigos-fonte, use um arquivo executável limpo (não corrigido por você) como biblioteca de classes e também desative a cópia deste link para o diretório de destino, para não substituir acidentalmente o corrigido.
    bot de jogo Adicionar tags

    Imediatamente após o pagamento, você recebe uma cópia digital da chave de licença da caixa do jogo Stronghold Kingdoms do fornecedor oficial - a empresa Akella, que deve ser cadastrada em sua conta pessoal do jogo para receber bônus no valor de 750 CZK:
    2 fichas por mês
    10 decks de produção
    10 plataformas de comida
    5 decks de defesa (10 por deck)
    4 decks de guerra (10 por deck)
    30 baralhos de cartas aleatórias (10 por baralho)

    O Starter Set é ideal para novos jogadores que desejam começar rapidamente com a dominação medieval em Stronghold Kingdoms. Se você deseja cultivar pacificamente, envolver-se em jogos políticos ou vingar-se de seus inimigos jurados, este conjunto inicial lhe dará um impulso poderoso em seu caminho para a coroa.

    Você quer se tornar um barão, duque ou rei? Mergulhe no mundo dos senhores feudais em guerra, num mundo onde alianças e estados inteiros são criados e destruídos. Experimente o papel de um governante medieval. O trono espera por você, Soberano!

    Funcionalidades do jogo:
    - Junte-se a milhares de jogadores num mundo medieval realista.
    - Construa grandes fortalezas que durarão séculos!
    - Arme os seus exércitos e conquiste as terras dos seus vizinhos!
    - Veja as suas aldeias, cidades e castelos ganharem vida e crescerem.
    - Explore centenas de tecnologias confiáveis.
    - Jogue no mapa da Antiga Rus'!

    Este código não tem restrições territoriais (Região Livre)
    Idiomas: Russo, Inglês
    Editora: Akella

    Informações adicionais

    O jogo Stronghold Kingdoms é gratuito (Free to Play), você pode baixá-lo via Steam - http://store.steampowered.com/app/47410/

    Para ativar o conjunto inicial de bônus de 750 coroas, você precisa seguir as instruções simples:
    1. Faça login em sua conta existente ou registre uma nova no site oficial do jogo http://login.strongholdkingdoms.com/kingdoms/account.php
    2. Digite o código de ativação recebido após o pagamento no campo “Código de ativação”, clique no botão de confirmação que aparece
    3. Bônus no valor de 750 coroas já estão na sua conta!

    Tome cuidado! Você pode ativar este código na sua conta apenas uma vez!

    Sugerimos também que você preste atenção a produtos similares:
    REINOS FORTES - BÔNUS DE 350 COROAS -

    Você também pode estar interessado em outros jogos distribuídos por nós. A lista completa está disponível no link:

    Avaliações

    54

    Nenhum feedback recebido dos clientes.

    Para uma avaliação positiva do produto adquirido, o vendedor fornecerá a você um vale-presente no valor de 5,99 rublos. .

    A fim de combater a violação de direitos autorais e de propriedade, bem como para excluir acusações infundadas contra a administração do site de cumplicidade em tal violação, a administração da plataforma de negociação Plati (http://www.site) apela a você com um pedido - em caso de detecção de violações na plataforma de negociação Plati, informe-nos imediatamente no endereço do fato de tal violação e forneça-nos informações confiáveis ​​​​que confirmem seus direitos autorais ou direitos de propriedade. Na carta, certifique-se de indicar seus dados de contato (nome completo, telefone).

    A fim de excluir relatos infundados e deliberadamente falsos de violações desses direitos, a administração se recusará a fornecer serviços na plataforma de negociação Plati somente após receber de você declarações escritas de violação acompanhadas de cópias de documentos que confirmem seus direitos autorais ou direitos de propriedade, no endereço: 123007, Moscou, pista Maly Kaluzhsky. 4, edifício 3, escritório de advocacia “AKAR nº 380”.

    Para responder prontamente às violações de seus direitos e à necessidade de bloquear as ações de vendedores inescrupulosos, Plati solicita que você envie um telegrama certificado, que servirá de base para bloquear as ações do vendedor, este telegrama deve conter uma indicação de : o tipo de direitos violados, a confirmação dos seus direitos e os seus dados de contacto (organizacionalmente - forma jurídica da pessoa, nome completo). O bloqueio será suspenso após 15 dias se você não fornecer ao escritório de advocacia documentos escritos confirmando seus direitos autorais ou direitos de propriedade.

    Firefly Studios lançou um ambicioso novo mundo em russo para seu MMO de castelo Reinos Fortaleza. O Mundo 6 abriu suas portas em 15 de junho e milhares de jogadores se reuniram para experimentar o novo servidor de jogo com novas mecânicas que foram introduzidas no jogo na atualização mais recente. O novo mundo está disponível para novos jogadores e veteranos Reinos. Baseia-se num mapa geográfico da parte ocidental da Rússia, bem como das regiões e países vizinhos, incluindo os Estados Bálticos, Ucrânia, Bielorrússia, Cazaquistão e outros estados.

    Os jogadores podem lutar pelo controle desses territórios, unindo-se em Casas poderosas com regras e características próprias. Este mundo difere dos anteriores pela mecânica de jogo atualizada que limita o uso da religião e oferece mais oportunidades para iniciantes. Este é o segundo mundo em Stronghold Kingdoms a usar as novas regras, e o primeiro mundo “local” onde essas regras foram estabelecidas.

    Além dos falantes de russo, Reinos Existem também mundos britânicos, alemães, franceses, espanhóis e mundos baseados em um mapa global. Neste momento, todos os jogadores que aderiram ao novo mundo podem ativar um código promocional especial que adicionará um conjunto de itens do jogo à sua conta, com os quais os jogadores poderão acelerar significativamente o seu desenvolvimento no novo mundo e estabelecer a ordem no seu reino. .

    Código: D1F9-33BA-0C7F-BAF5

    Este código promocional pode ser ativado no jogo através do processo de registro. Será válido até 1º de julho e só poderá ser usado uma vez por conta.