Trimps tools

Trimps tools (visual)

目前為 2017-03-30 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Trimps tools
// @namespace    trimps.github.io
// @version      1.066
// @description  Trimps tools (visual)
// @author       Anton
// @match        https://trimps.github.io
// @require      http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// ==/UserScript==

(function() {
    'use strict';

    var tAutoBuy, tStyleFix, tPassiveWatcher, $ = jQuery, isStarted = false,
        version = typeof GM_info == 'function' ? GM_info().script.version : 
            (typeof GM_info == 'object' ? GM_info.script.version : '?');

    var _isPortal = function() {
        return ($('#portalWrapper:visible').length > 0);
    }

    var _getBarWidthPercent = function(barSelector) {
        return jQuery(barSelector).width() / jQuery(barSelector).parent().width() * 100;
    }

    var _log = function(mes, type) {
        if (typeof type === 'undefined') type = "Story";
        message("BOT: " + mes, type);
    }

    var _getBreedingBaseSpeed = function() {
        var trimps = game.resources.trimps;
        var base = 0.0085;
        var breeding = trimps.owned - trimps.employed;
	    var currentCalc = breeding * base;
	    return currentCalc;
    }

    var _start = function() {
        clearInterval(tPassiveWatcher);
        
        tAutoBuy = setInterval(function() {
            if (_isPortal()) return;
            _autoUpgrade();
            _autoBuy();
            _autoJobs();
        }, 1000);
        $('#botStart').text('Bot stop');
    }

    var _buyStorage = function() {
        var barnThreshold = 0.9;  /*percentage at which minimum*/
        var shedThreshold = 0.9;  /*to buy storage*/
        var forgeThreshold = 0.9; /*from 0 (min) to 1 (max)*/
        
        if(game.resources.food.owned / (game.resources.food.max * (1 + game.portal.Packrat.level * (game.portal.Packrat.modifier * 100) / 100)) >= barnThreshold)
            buyBuilding("Barn", true, true);
        if(game.resources.wood.owned / (game.resources.wood.max * (1 + game.portal.Packrat.level * (game.portal.Packrat.modifier * 100) / 100)) >= shedThreshold)
            buyBuilding("Shed", true, true);
        if(game.resources.metal.owned / (game.resources.metal.max * (1 + game.portal.Packrat.level * (game.portal.Packrat.modifier * 100) / 100)) >= forgeThreshold)
            buyBuilding("Forge", true, true);
    }

    var _passiveWatcher = function() {
        if (_isPortal()) return;

        _buyStorage();
        
        if (game.global.buildingsQueue.length > 0 && game.global.autoCraftModifier < 1) {
            setGather('buildings');
            return;
        }

        if (getPsString('food', true) < 3 && game.resources.food.owned < 30) {
            setGather('food');
            return;
        }
        
        if (getPsString('wood', true) < 3 && game.resources.wood.owned < 30) {
            setGather('wood');
            return;
        }
        
        if (getPsString('science', true) < 3 && game.resources.science.owned < 10) {
            setGather('science');
            return;
        }
        
        if (game.buildings.Trap.owned < 1 && game.resources.food.owned >= 10 && game.resources.wood.owned >= 10) {
            buyBuilding('Trap', true, true);
            return;
        }
        
        if (game.resources.trimps.owned < game.resources.trimps.realMax() && _getBreedingBaseSpeed() < 1) {
            setGather('trimps');
            return;
        }
        
        if (getPsString('science', true) < 3 && game.resources.science.owned < 100) {
            setGather('science');
            return;
        }

        if (getPsString('metal', true) < 3 && game.resources.metal.owned < 100) {
            setGather('metal');
            return;
        }
        
        _autoUpgrade();
        _autoJobs();
    }

    var _stop = function() {
        clearInterval(tAutoBuy);
        $('#botStart').text('Bot start');
        
        tPassiveWatcher = setInterval(_passiveWatcher, 1000);
        _log('Passive watcher started version ' + version);
    }
    
    var _onStartButton = function() {
        if (isStarted) {
            _stop();
            _log('Stop.');
            isStarted = false;
        } else {
            _start();
            _log('Started!');
            isStarted = true;
        }
    }

    var _styleUpdate = function() {
        // remove counts
        $('head').append('<style type="text/css">.queueItem,.btn{padding:0}.thingColorCanNotAfford.upgradeThing{background-color:#530053;}</style>');
        // remove tabs
        $('#buyTabs').hide();
        filterTabs('all');
        // remove captions
        $('#buildingsTitleDiv,#upgradesTitleDiv,#equipmentTitleDiv').hide();
        // fix height
        $('#topRow,#queueContainer').css('margin-bottom', '0');
        $('#jobsTitleDiv').css('padding', '0').css('font-size', 'smaller');
        $('#buyHere').css('margin', '0').css('padding', '0').css('overflow-x', 'hidden');
        $('#queueContainer').css('height', '70px');
        $('#numTabs').css('margin', '0');
        $('#buyContainer').css('height', 'calc(99vh - 20vw - 96px)');
        // add button
        $('#settingsTable tr').append('<td class="btn btn-info" id="botStart">Bot start</td>');
        $('#botStart').click(_onStartButton);
    }

    var _autoUpgrade = function() {
        var $item = $('#upgradesHere').find('.thingColorCanAfford').first();
        if ($item.length > 0) {
            buyUpgrade($item.attr('id'), true, true);
            _log('Upgrading ' + $item.attr('id'));
            return 1;
        } else {
            return 0;
        }
    }

    var _autoBuy = function() {
        _buyStorage();
        
        var nursery = '';
        if (game.buildings.Nursery.owned >= game.buildings.Tribute.owned) {
            nursery = ':not([id=Nursery])';
        }
        var notStorage = ':not([id=Barn]):not([id=Shed]):not([id=Forge])';
        var $item = $('#buildingsHere').find('.thingColorCanAfford:not([id=Wormhole])' + nursery + notStorage).last();
        if ($item.length > 0 && $item.attr('id') != 'Trap') {
            buyBuilding($item.attr('id'), true, true);
            _log('Building ' + $item.attr('id'));
            return 1;
        } else {
            return 0;
        }
    }

    var needFarmer = 20, needLumber = 20, needMiner = 20, needScientist = 1;
    var needAllMax = needFarmer + needLumber + needMiner + needScientist;

    var _buyJobs = function($obj, unemployed, objName, jobId) {
        if ($obj.length > 0) {
            var cnt = 1;
            if (unemployed > needAllMax * 10) {numTab(4);cnt=100;}
            else if (unemployed > needAllMax * 2.5) {numTab(3);cnt=25;}
            else if (unemployed > needAllMax) {numTab(2);cnt=10;}
            buyJob(jobId, true, true); // confirmed, noTip
            numTab(1); // +1
            _log('New ' + objName + (cnt > 1 ? " x" + cnt : ''), 'Combat');
            return cnt;
        } else {
            return 0;
        }
    }

    var _autoJobs = function() {
        var cnt = 0;
        var $trainer = $('#jobsHere').find('.thingColorCanAfford[id=Trainer]');
        if ($trainer.length > 0) {
            buyJob('Trainer', true, true);
            _log('New trainer');
            return ++cnt;
        }
        var $explorer = $('#jobsHere').find('.thingColorCanAfford[id=Explorer]');
        if ($explorer.length > 0) {
            buyJob('Explorer', true, true);
            _log('New explorer');
            return ++cnt;
        }
        
        var farmer = parseInt($('#jobsHere').find('#FarmerOwned').text());
        var lumber = parseInt($('#jobsHere').find('#LumberjackOwned').text());
        var miner = parseInt($('#jobsHere').find('#MinerOwned').text());
        var science = parseInt($('#jobsHere').find('#ScientistOwned').text());
        var jobsTotal = farmer + lumber + miner + science;
        
        var unemployed = parseInt($('#jobsTitleUnemployed').text());

        var hasFarmer = $('#jobsHere').find('#FarmerOwned:visible').length > 0;
        var hasLumber = $('#jobsHere').find('#LumberjackOwned:visible').length > 0;
        var hasMiner = $('#jobsHere').find('#MinerOwned:visible').length > 0;
        var hasScientist = $('#jobsHere').find('#ScientistOwned:visible').length > 0;
        var needAll =
            (hasFarmer ? needFarmer : 0) +
            (hasLumber ? needLumber : 0) +
            (hasMiner ? needMiner : 0) +
            (hasScientist ? needScientist : 0);
        if (needAll < 1) needAll = 1;
        
        if (hasFarmer && farmer < (jobsTotal * needFarmer / needAll)) {
            var $farmer = $('#jobsHere').find('.thingColorCanAfford[id=Farmer]');
            cnt += _buyJobs($farmer, unemployed, 'farmer', 'Farmer');
        } else if (hasLumber && lumber < (jobsTotal * needLumber / needAll)) {
            var $lumber = $('#jobsHere').find('.thingColorCanAfford[id=Lumberjack]');
            cnt += _buyJobs($lumber, unemployed, 'lumberjack', 'Lumberjack');
        } else if (hasMiner && miner < (jobsTotal * needMiner / needAll)) {
            var $miner = $('#jobsHere').find('.thingColorCanAfford[id=Miner]');
            cnt += _buyJobs($miner, unemployed, 'miner', 'Miner');
        } else if (hasScientist && science < (jobsTotal * needScientist / needAll)) {
            var $science = $('#jobsHere').find('.thingColorCanAfford[id=Scientist]');
            cnt += _buyJobs($science, unemployed, 'scientist', 'Scientist');
        }
        
        if (unemployed > 0 && cnt === 0) {
            $farmer = $('#jobsHere').find('.thingColorCanAfford[id=Farmer]');
            cnt += _buyJobs($farmer, unemployed, 'farmer', 'Farmer');
        }

        return cnt;
    }

    var _styleFix = function() {
        $('.buyBox').find('.thing').find('br').remove();
        $('.buyBox').find('.thing').find('.thingOwned').css('margin-left','4px');
        $('#upgradesHere').find('.alert.badge').text('');
    }

    setTimeout(function() {
        tStyleFix = setInterval(_styleFix, 2000);
        
        _styleUpdate();
        _styleFix();
        
        _stop(); // start passive watcher
        
    }, 1000);

})();