LalkaKaro4 / Bot for SalientGame 2018

// ==UserScript==
// @name         Bot for SalientGame 2018
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  try to take over the world!
// @author       You
// @match        https://steamcommunity.com/saliengame/play/
// @grant        none
// @license     MIT
// ==/UserScript==

window.onload = function () {

  CBattleSelectionState.prototype.OnLoadComplete = function (loader, resources) {
    //сonsole.log("CBattleSelectionState::OnLoadComplete()");

    if (null == gSalien) {
      gSalien = new CSalien(resources);
    }

    var instance = this;
    this.m_Background = new PIXI.Sprite.fromImage('planet_select_bg');
    this.m_Background.width = gApp.screen.width;
    this.m_Background.height = gApp.screen.height;

    this.m_GridContainer = new PIXI.Container();
    this.m_GridContainer.x = 408;
    this.m_GridContainer.y = 102;

    const gridBgHeight = 648;
    this.m_GridBox = new CUIBox(854, gridBgHeight);
    this.m_GridBox.SetTitleHeight(44);
    var titleStyle = jQuery.extend({}, k_TextStyleBold);
    titleStyle.fontSize = 20;
    this.m_GridBox.SetTitleStyle(titleStyle);
    this.m_GridBox.SetTitleText(this.m_PlanetData.state.name.toUpperCase());
    this.m_GridBox.x = -24;
    this.m_GridBox.y = -64;
    this.m_GridContainer.addChild(this.m_GridBox);

    this.m_MapImage = new PIXI.Sprite.fromImage('map_bg_' + instance.m_PlanetData.id);
    this.m_GridContainer.addChild(this.m_MapImage);

    // initialize a grid the user can click on
    this.m_Grid = new CBattleSelect(resources, this.m_GridContainer);
    this.m_Grid.click = function (tileX, tileY) {
      var unPlanetID = instance.m_unPlanetID;
      var zoneIdx = _GetTileIdx(tileX, tileY);

      if (instance.m_PlanetData.zones[zoneIdx].captured) {
        return;
      }

      gServer.JoinZone(
        zoneIdx,
        function (results) {
          gGame.ChangeState(new CBattleState(instance.m_PlanetData, zoneIdx));
        },
        GameLoadError
      );
    };

    this.m_RewardsContainer = new PIXI.Container();
    this.m_RewardsContainer.x = 256;
    this.m_RewardsContainer.y = this.m_GridBox.y + gridBgHeight - 55;

    this.m_PossibleRewardsLabel = new PIXI.Text('Возможные награды:'.toUpperCase());
    this.m_PossibleRewardsLabel.style = {
      fontFamily: k_FontType,
      fontSize: 12,
      fill: "white",
      fontWeight: 'bold',
      align: 'center',
    };
    this.m_PossibleRewardsLabel.anchor.set(0.5, 0.5);
    this.m_RewardsContainer.addChild(this.m_PossibleRewardsLabel);

    // show our game rewards
    for (var idx = 0; idx < this.m_PlanetData.giveaway_apps.length; idx++) {
      const boxScale = 0.80;

      var appId = this.m_PlanetData.giveaway_apps[idx];
      var sprite = new PIXI.Sprite.fromImage('app_' + appId);
      sprite.x = idx * (k_GameBoxW * boxScale + k_GameBoxPadding);
      sprite.y = 12;
      sprite.width = k_GameBoxW * boxScale;
      sprite.height = k_GameBoxH * boxScale;
      sprite.interactive = true;
      sprite.buttonMode = true;
      sprite.appid = appId;
      sprite.click = function () {
        window.open('https://store.steampowered.com/app/' + this.appid, '_blank');
      };
      this.m_RewardsContainer.addChild(sprite);
    }

    this.m_GridContainer.addChild(this.m_RewardsContainer);

    this.m_PossibleRewardsLabel.x = (this.m_RewardsContainer.width / 2) - 40;

    this.m_RewardCountdown = new PIXI.Text('');
    this.m_RewardCountdown.style = {
      fontFamily: k_FontType,
      fontSize: 14,
      fill: "white",
      fontWeight: 'bolder',
      align: 'center',
    };
    this.m_RewardCountdown.anchor.set(0.5, 0.5);
    this.m_RewardCountdown.x = this.m_PossibleRewardsLabel.x;
    this.m_RewardCountdown.y = this.m_PossibleRewardsLabel.y - 18;
    this.m_RewardsContainer.addChild(this.m_RewardCountdown);

    this.m_rtPlanetCountUp = 0;
    gServer.GetPlayerInfo(function (results) {
        gPlayerInfo = results.response;
        instance.m_rtPlanetCountUp = Date.now();
        var nSecondsOnPlanet = gPlayerInfo.time_on_planet;
        var strTime = PadZerosLeft(Math.floor(nSecondsOnPlanet / 3600), 2) + ':' + PadZerosLeft(Math.floor((nSecondsOnPlanet % 3600) / 60), 2) + ':' + PadZerosLeft(nSecondsOnPlanet % 60, 2);
        instance.m_RewardCountdown.text = 'Проведённое на планете время: '.toUpperCase() + strTime;
      },
      function () {}
    );

    // add button
    this.m_LeaveButton = new CUIButton(134, 34, 'Покинуть планету'.toUpperCase());
    this.m_LeaveButton.x = 0;
    this.m_LeaveButton.y = this.m_GridBox.y + gridBgHeight - 55;
    this.m_LeaveButton.click = function (btn) {
      gAudioManager.PlaySound('ui_select_backwards');
      gServer.LeaveGameInstance(
        instance.m_PlanetData.id,
        function () {
          gGame.ChangeState(new CPlanetSelectionState());
        }
      );
    };
    this.m_GridContainer.addChild(this.m_LeaveButton);

    var nEasy = 0;
    var nMedium = 0;
    var nHard = 0;
    //var nBoss = 0;
    this.m_PlanetData.zones.forEach(function (zone) {
      if (zone.captured)
        return;

      if (zone.difficulty == 1)
        ++nEasy;
      else if (zone.difficulty == 2)
        ++nMedium;
      else if (zone.difficulty == 3)
        ++nHard;
    });

    this.m_ZonesRemainingBox = new PIXI.Container();
    this.m_ZonesRemainingBox.x = 660;
    this.m_ZonesRemainingBox.y = 524;
    this.m_GridContainer.addChild(this.m_ZonesRemainingBox);

    this.m_EnemiesRemainingText = new PIXI.Text('Вражеских участков:'.toUpperCase());
    this.m_EnemiesRemainingText.style = {
      fontFamily: k_FontType,
      fontSize: 10,
      fill: "white",
      fontWeight: 'bold',
      align: 'left',
    };
    this.m_EnemiesRemainingText.y = -16;
    this.m_EnemiesRemainingText.x = -20;
    this.m_ZonesRemainingBox.addChild(this.m_EnemiesRemainingText);

    this.m_EasySprite = new PIXI.Sprite.fromImage('easy_difficulty');
    this.m_EasySprite.scale.set(0.1, 0.1);
    this.m_EasyText = new PIXI.Text('x' + nEasy);
    this.m_EasyText.x = this.m_EasySprite.x + this.m_EasySprite.width / 2;
    this.m_EasyText.y = this.m_EasySprite.height;
    this.m_EasyText.style = k_TextStyleZoneRemaining;
    this.m_ZonesRemainingBox.addChild(this.m_EasyText);
    this.m_ZonesRemainingBox.addChild(this.m_EasySprite);

    this.m_MediumSprite = new PIXI.Sprite.fromImage('medium_difficulty');
    this.m_MediumSprite.scale.set(0.1, 0.1);
    this.m_MediumSprite.x = this.m_EasySprite.x + this.m_EasySprite.width + k_GameBoxPadding;
    this.m_MediumText = new PIXI.Text('x' + nMedium);
    this.m_MediumText.x = this.m_MediumSprite.x + this.m_MediumSprite.width / 2;
    this.m_MediumText.y = this.m_MediumSprite.height;
    this.m_MediumText.style = k_TextStyleZoneRemaining;
    this.m_ZonesRemainingBox.addChild(this.m_MediumText);
    this.m_ZonesRemainingBox.addChild(this.m_MediumSprite);

    this.m_HardSprite = new PIXI.Sprite.fromImage('hard_difficulty');
    this.m_HardSprite.scale.set(0.1, 0.1);
    this.m_HardSprite.x = this.m_MediumSprite.x + this.m_MediumSprite.width + k_GameBoxPadding;
    this.m_HardText = new PIXI.Text('x' + nHard);
    this.m_HardText.x = this.m_HardSprite.x + this.m_HardSprite.width / 2;
    this.m_HardText.y = this.m_HardSprite.height;
    this.m_HardText.style = k_TextStyleZoneRemaining;
    this.m_ZonesRemainingBox.addChild(this.m_HardText);
    this.m_ZonesRemainingBox.addChild(this.m_HardSprite);

    for (var i = 0; i < k_NumMapTilesW; ++i) {
      for (var j = 0; j < k_NumMapTilesH; ++j) {
        var idx = _GetTileIdx(i, j);
        var zone = this.m_PlanetData.zones[idx];

        var bBoss = false;
        if (zone.type == 4) {
          bBoss = true;
        }
        var bCaptured = false;
        if (zone.captured !== undefined && zone.captured == true) {
          bCaptured = true;
        }

        var difficulty = zone.difficulty;

        var clanavatar = null;
        var clanurl = null;
        if (zone.leader !== undefined) {
          clanurl = zone.leader.url;
          clanavatar = 'clanavatar_' + zone.leader.accountid;
        }

        var progress = 0.0;
        if (zone.capture_progress !== undefined) {
          progress = zone.capture_progress;
        }

        var clans = [];
        if (zone.top_clans !== undefined) {
          clans = zone.top_clans;
        }

        var params = {
          boss: bBoss,
          captured: bCaptured,
          difficulty: difficulty,
          clanurl: clanurl,
          clanavatar: clanavatar,
          progress: progress,
          clans: clans
        };

        this.m_Grid.SetTile(i, j, params);
      }
    }

    this.m_MapImage.width = this.m_Grid.width;
    this.m_MapImage.height = this.m_Grid.height;

    gApp.stage.addChild(this.m_Background);

    this.m_LogoBG = new PIXI.Sprite.fromImage('logo_bg');
    gApp.stage.addChild(this.m_LogoBG);
    this.m_Logo = new PIXI.Sprite.fromImage('logo');
    this.m_Logo.x = 33;
    this.m_Logo.y = 17;
    gApp.stage.addChild(this.m_Logo);

    this.m_Elapsed = 0;
    this.m_Ship = new PIXI.Sprite.fromImage('ship');
    this.m_Ship.x = -8;
    this.m_Ship.y = k_ScreenHeight - this.m_Ship.height + 20;
    gApp.stage.addChild(this.m_Ship);
    this.m_ShipFlag = new PIXI.Sprite.fromImage('ship_flag');
    this.m_ShipFlag.x = 84;
    this.m_ShipFlag.y = 2;
    this.m_ShipFlag.interactive = true;
    this.m_ShipFlag.buttonMode = true;
    this.m_ShipFlag.click = function () {
      ShowRepresentGroupDialog(function (groupid, strAvatarHash) {
        gPlayerInfo.clan_info = {};
        gPlayerInfo.clan_info.accountid = groupid;
        gPlayerInfo.clan_info.avatar = strAvatarHash;
        gGame.ChangeState(new CBattleSelectionState(instance.m_unPlanetID));
      });
    };
    this.m_Ship.addChild(this.m_ShipFlag);

    if (gPlayerInfo.clan_info !== undefined) {
      this.m_ShipFlagClan = new PIXI.Sprite.fromImage('clanavatar_' + gPlayerInfo.clan_info.accountid);
      this.m_ShipFlagClan.x = this.m_ShipFlag.x + 32;
      this.m_ShipFlagClan.y = this.m_ShipFlag.y + 12;
      this.m_Ship.addChild(this.m_ShipFlagClan);
    }

    // add the salien to the top
    gSalien.position.set(98, 386);
    gSalien.scale.set(0.13, 0.13);
    this.m_Ship.addChild(gSalien);

    // our info!
    this.m_SalienInfoBox = new CSalienInfoBox();
    this.m_SalienInfoBox.x = 12;
    this.m_SalienInfoBox.y = k_ScreenHeight - 72;
    gApp.stage.addChild(this.m_SalienInfoBox);

    gApp.stage.addChild(this.m_GridContainer);

    // button to customize the salien
    this.m_CustomizeButton = CreateCustomizeButton(220, 300);
    this.m_CustomizeButton.y = k_ScreenHeight - 320;
    gApp.stage.addChild(this.m_CustomizeButton);

    gAudioManager.PlayMusic('galaxy_music', true);

    this.m_AudioIndicator = new PIXI.Sprite.fromImage('sound_toggle');
    this.m_AudioIndicator.x = k_ScreenWidth - this.m_AudioIndicator.width - 10;
    this.m_AudioIndicator.y = k_ScreenHeight - this.m_AudioIndicator.height - 10;
    this.m_AudioIndicator.alpha = gAudioManager.m_Muted ? 0.3 : 1.0;
    this.m_AudioIndicator.interactive = true;
    this.m_AudioIndicator.buttonMode = true;
    this.m_AudioIndicator.click = function () {
      gAudioManager.ToggleMute();
      this.alpha = gAudioManager.m_Muted ? 0.3 : 1.0;
    };
    gApp.stage.addChild(this.m_AudioIndicator);

    var tiles = this.m_Grid.m_Tiles;
	
	tiles = tiles.sort((a, b) => a.Info.difficulty < b.Info.difficulty ? 1 : a.Info.difficulty > b.Info.difficulty ? -1 : 0);
	
	for (var a in tiles) {

		var tile = tiles[a];

		if (!tile.Info || tile.Info.captured)
			continue;

		var posX = parseInt(tile.x / this.m_Grid.m_TileSizeX);
		var posY = parseInt(tile.y / this.m_Grid.m_TileSizeY);

		this.m_Grid.click(posX, posY);
		break;
	}
  };

  CBattleState.prototype.RenderVictoryScreen = function (result) {
    gApp.renderer.plugins.interaction.cursorStyles.default = 'inherit';
    gApp.renderer.plugins.interaction.cursorStyles.pointer = 'pointer';

    var instance = this;
    this.m_VictoryScreen = new PIXI.Container();
    this.m_VictoryScreen.x = 375;
    this.m_VictoryScreen.y = 140;

    var victoryBackground = new PIXI.Graphics();
    victoryBackground.beginFill(0x000000, 1.0);
    victoryBackground.drawRect(0, 0, 545, 405);
    victoryBackground.endFill();
    this.m_VictoryScreen.addChild(victoryBackground);

    var continueButton = new PIXI.Graphics();
    continueButton.beginFill(k_UIWhite, 1.0);
    continueButton.drawRect(0, 0, 230, 40);
    continueButton.endFill();
    this.m_VictoryScreen.addChild(continueButton);
    continueButton.x = 155;
    continueButton.y = 300;
    continueButton.interactive = true;
    continueButton.buttonMode = true;
    continueButton.click = function () {
      instance.m_VictoryScreen.visible = false;
      if (continueButton.result.new_level > continueButton.result.old_level) {
        instance.RenderLevelUpScreen(continueButton.result);
      }
      else {
        gGame.ChangeState(new CBattleSelectionState(instance.m_PlanetData.id));
      }
    };

    var continueText = new PIXI.Text('Продолжить'.toUpperCase());
    continueText.style = {
      fontFamily: k_FontType,
      fontSize: 18,
      fontWeight: 'bold',
      fill: 'black',
      align: 'center',
    };
    continueButton.addChild(continueText);
    continueText.anchor.set(0.5, 0.5);
    continueText.x = 115;
    continueText.y = 20;

    var reportingScoreText = new PIXI.Text('Отправляем ваш счёт командованию стимопланетян...'.toUpperCase());
    reportingScoreText.style = {
      fontFamily: k_FontType,
      fontSize: 18,
      fontWeight: 'bold',
      fill: 'white',
      align: 'center',
    };
    reportingScoreText.anchor.set(0.5, 0.5);
    reportingScoreText.x = victoryBackground.width / 2;
    reportingScoreText.y = 300;
    this.m_VictoryScreen.addChild(reportingScoreText);

    continueButton.visible = false;

    var victoryText = new PIXI.Text('Битва завершена!'.toUpperCase());
    victoryText.style = {
      fontFamily: k_FontType,
      fontSize: 48,
      fontWeight: 'bold',
      fill: 'white',
      align: 'center',
    };
    victoryText.anchor.set(0.5, 0.5);
    victoryText.x = victoryBackground.width / 2;
    victoryText.y = 100;
    this.m_VictoryScreen.addChild(victoryText);

    var planetVictoryText = new PIXI.Text('  '.toUpperCase() + this.m_PlanetData.state.name);
    planetVictoryText.style = {
      fontFamily: k_FontType,
      fontSize: 16,
      fontWeight: 'bold',
      fill: 'white',
      align: 'center',
    };
    planetVictoryText.anchor.set(0.5, 0.5);
    planetVictoryText.x = victoryText.x;
    planetVictoryText.y = victoryText.y + (victoryText.height / 2) + 5;
    this.m_VictoryScreen.addChild(planetVictoryText);

    var enemiesVanquishedText = new PIXI.Text('Врагов повержено: ' + this.m_EnemyManager.m_nDefeatedEnemies + '  ');
    enemiesVanquishedText.style = {
      fontFamily: k_FontType,
      fontSize: 24,
      fill: 'white',
      align: 'center',
    };
    enemiesVanquishedText.anchor.set(0.5, 0.5);
    enemiesVanquishedText.x = victoryText.x;
    enemiesVanquishedText.y = planetVictoryText.y + (planetVictoryText.height / 2) + 40;
    this.m_VictoryScreen.addChild(enemiesVanquishedText);

    var victoryScoreText = new PIXI.Text('Итоговый счёт: ' + this.m_Score);
    victoryScoreText.style = {
      fontFamily: k_FontType,
      fontSize: 24,
      fill: 'white',
      align: 'center',
    };
    victoryScoreText.anchor.set(0.5, 0.5);
    victoryScoreText.x = victoryText.x;
    victoryScoreText.y = enemiesVanquishedText.y + (enemiesVanquishedText.height / 2) + 20;
    this.m_VictoryScreen.addChild(victoryScoreText);

    //victoryBackground
    var gameFadeOut = new PIXI.Graphics();
    gameFadeOut.beginFill(0x000000, 0.8);
    gameFadeOut.drawRect(0, 0, 545, 135);
    gameFadeOut.endFill();
    gameFadeOut.x = victoryBackground.x;
    gameFadeOut.y = victoryBackground.height;
    this.m_VictoryScreen.addChild(gameFadeOut);

    var enteredText = new PIXI.Text('Вы можете выиграть одну из четырёх игр:');
    enteredText.style = {
      fontFamily: k_FontType,
      fontSize: 14,
      fill: 'white',
      align: 'center',
    };
    enteredText.anchor.set(0.5, 0.5);
    enteredText.x = gameFadeOut.width / 2;
    enteredText.y = 20;
    gameFadeOut.addChild(enteredText);

    // loop over all the apps
    for (var idx = 0; idx < this.m_PlanetData.giveaway_apps.length; idx++) {
      var appid = this.m_PlanetData.giveaway_apps[idx];

      // retrieve our image
      var sprite = new PIXI.Sprite.fromImage('app_' + appid);
      sprite.width = k_GameBoxW;
      sprite.height = k_GameBoxH;
      sprite.interactive = true;
      sprite.buttonMode = true;
      sprite.appid = appid;
      sprite.click = function () {
        window.open('https://store.steampowered.com/app/' + this.appid, '_blank');
      };
      gameFadeOut.addChild(sprite);

      sprite.x = 80 + (idx * (k_GameBoxW + k_GameBoxPadding));
      sprite.y = enteredText.y + 20;
    }

    this.button = new CUIButton(300, 40, 'Похожие игры со скидками'.toUpperCase());
    this.button.x = 122;
    this.button.y = enteredText.y + enteredText.height / 2 + 60;
    this.button.click = function (btn) {
      gAudioManager.PlaySound('ui_select');
      if (instance.m_PlanetData.state.tag_ids !== undefined) {
        window.open('https://store.steampowered.com/search/?tags=' + instance.m_PlanetData.state.tag_ids, '_blank');
      }
      else {
        window.open('https://store.steampowered.com/', '_blank');
      }
    };

    gameFadeOut.addChild(this.button);

    gApp.stage.addChild(this.m_VictoryScreen);

    gServer.ReportScore(
		this.m_Score,
		function ( results ) {
			reportingScoreText.visible = false;
			continueButton.visible = true;
			continueButton.result = results.response;
			//attempt to refresh player info
			gServer.GetPlayerInfo( function( results ) { 
				
				gPlayerInfo = results.response; 
			
				setTimeout(() => gGame.ChangeState(new CBattleSelectionState(instance.m_PlanetData.id)), 1);
				
			}, function(){} );
		},
		GameLoadError
	);
  };

  setInterval(function () {

    if (!gGame || !gGame.m_State || !gGame.m_State.m_EnemyManager ||
      !gGame.m_State.m_EnemyManager.m_EnemyData || !gGame.m_State.m_EnemyManager.m_rgEnemies)
      return;

    gGame.m_State.m_EnemyManager.m_EnemyData.slime.base_health = gGame.m_State.m_EnemyManager.m_EnemyData.volvoian.base_health = gGame.m_State.m_EnemyManager.m_EnemyData.neomorph.base_health = 1;

    gGame.m_State.m_EnemyManager.m_EnemyData.slime.base_damage = gGame.m_State.m_EnemyManager.m_EnemyData.volvoian.base_damage = gGame.m_State.m_EnemyManager.m_EnemyData.neomorph.base_damage = 0;

    gGame.m_State.m_EnemyManager.m_rgEnemies.forEach(enemy => enemy.m_Sprite.click());

  }, 50);

}