Forces of War utilities

Useful utilities for the Facebook game Forces of War

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name          Forces of War utilities
// @namespace     Danielv123
// @version       1.0
// @description   Useful utilities for the Facebook game Forces of War
// @match         https://fb-forces.uken.com/*
// @match         https://forces.uken.com/*
// @copyright     2013 Johan / Asbra.net
// @grant         GM_getValue
// @grant         GM_setValue
// ==/UserScript==

/*
This script was written by Johan aka Asbra in 2014.
Due to undocumented changes in browsers february 2017 the script broke and the
3rd march 2017 I recieved a request to update the script as it is no longer
maintained.
*/

var version = 0.1;

var authenticity_token = document.querySelectorAll("input[name='authenticity_token']")[0].value;

var mission_bot = 0;
var mission_id = 0;
var mission_cost = 0;
var battle_bot = 0;
var min_stamina = 0;
var invasion_bot = 0;
var invasion_health = 0;
var invasion_time = 0;
var heal_bot = 0;
var min_health = 0;
var collect_bot = 0;

var fighting_boss = false;

function conlog(text) {
    if(console && console.log) {
        console.log(text);
    }

    var d = new Date();
    var newlog = '['+(d.getHours()<10?'0':'')+d.getHours()+':'+(d.getMinutes()<10?'0':'')+d.getMinutes()+':'+(d.getSeconds()<10?'0':'')+d.getSeconds()+'] '+text;
    var el_conlog = $('#conlog');

    if(el_conlog.length == 1) {
        if(el_conlog.html() && el_conlog.html().length > 0) {
            var curlog = el_conlog.html().split('<br>');
            if(curlog.length > 0) {
                newlog = curlog[1] + '<br />' + newlog;
            } else {
                newlog = el_conlog.html() + '<br />' + newlog;
            }
        }

        $('#conlog').html(newlog);
    }
}

function condeb(text) {
    if(console && console.debug) {
        console.debug(text);
    }

    var d = new Date();
    var newlog = '['+(d.getHours()<10?'0':'')+d.getHours()+':'+(d.getMinutes()<10?'0':'')+d.getMinutes()+':'+(d.getSeconds()<10?'0':'')+d.getSeconds()+'] '+text;
    var el_deblog = $('#deblog');

    if(el_deblog.length == 1) {
        if(el_deblog.html() && el_deblog.html().length > 0) {
            var curlog = el_deblog.html().split('<br>');
            if(curlog.length > 0) {
                newlog = curlog[1] + '<br />' + newlog;
            } else {
                newlog = el_deblog.html() + '<br />' + newlog;
            }
        }

        $('#deblog').html(newlog);
    }
}

function do_action(action) {
    $(document.body).append('<form id="secretForm" action="'+action+'" method="post">'+
                            '<input name="authenticity_token" value="'+authenticity_token+'">'+
                            '</form>');
    $("#secretForm").submit();
}

function do_mission(mission_id) {
    conlog('Doing mission '+mission_id+'..');
    do_action('/missions/attempt?mission='+mission_id);
}

function npc_attack() {
    if(fighting_boss == true && $('input[name=npc_id]').length > 0 && $('#npc_current_health').length > 0) {
        var npc_id = parseInt($('input[name=npc_id]').val());
        // condeb('npc_id '+npc_id);

        var boss_health = parseInt($('#npc_current_health').attr('style').match(/(\d+).*\%/)[1]);
        condeb('boss_health '+boss_health);

        $('#npc_current_health div').html(boss_health+'%');

        if(boss_health == 0) {
            fighting_boss = false;
            conlog('Boss died!');
            conlog($('#log_contents .log_entries')[0]);
            conlog($('#log_contents .log_entries')[1]);
            window.location.href = '/home';
            return;
        } else if(boss_health <= invasion_health) {
            // Check if the villains health is <= set health %, if so attack him!
            conlog('Attacking boss!');
            $('#npc_attack_btn form').submit();
        }

        // We need to keep polling
        setTimeout(function(){npc_attack();}, 100);
    } else {
        fighting_boss = false;
    }
}

function repeated_checks() {
    condeb('repeated_checks');

    if(fighting_boss == true) {
        if($('#npc_middle').length == 0) {
            fighting_boss = false;
        } else {
            setTimeout(function(){repeated_checks();}, 1000);
            return;
        }
    } else if($('#npc_middle').length == 1 && fighting_boss == false) {
        // We are on a boss fight page
        var boss_health = parseInt($('#npc_current_health').attr('style').match(/(\d+).*\%/)[1]);

        if(boss_health > 0) {
            fighting_boss = true;
            npc_attack();
        }
    }

    if(collect_bot) {
        var money_bar = $('#money_bar > div > a.loader');
        if(money_bar.length == 1 && money_bar.attr('href') == '/empire') {
            // There is money to collect!
            conlog('There is money to collect!');
            window.location.href = money_bar.attr('href');
            return;
        }
    }

    if(heal_bot && U_HEALTH < min_health) {
        conlog('health '+U_HEALTH+' < '+min_health);
        do_action('/regeneration_chamber/regenerate?type=full');
        return;
    }

    if(mission_bot && U_ENERGY >= mission_cost) {
        // Do mission
        do_mission(mission_id);
        return;
    }

    if(battle_bot && U_STAMINA > min_stamina) {
        if($('div#battle_list_container table#battle_list').length == 0) {
            conlog('Time for PvP!');
            window.location.href = '/battles';
            return;
        } else if($('div#battle_list_container table#battle_list').length == 1) {
            conlog('Looking for an opponent..');
            var found = false;

            $.each($('#battle_list tr'),function(index,value){
                if(found == false) {
                    var player = $('.profile',value).html();
                    var level = $('p',value).html().split(' ')[1];
                    var winloss = $('b',value).html().split(' ');
                    var wins = winloss[0].substr(0,winloss[0].length-1);
                    var loss = winloss[2].substr(0,winloss[2].length-1);

                    if(level <= (U_LEVEL+1)) {
                        if(loss < (wins-1)) {
                            // If opponent is lower level, has a smaller alliance, and has lost alot..
                            // Attack him!
                            conlog('Attacking '+player);
                            $('form',value).submit();
                            found = true;
                        }
                    }
                }
            });
        }
    }

    if(invasion_bot) {
        if($('table#npc_list').length > 0) {
            // Check if there's an active invasion
            conlog('Looking for an invasion..');
            var found = false;

            $.each($('#npc_list tr'),function(index,value){
                if(found == false) {
                    if($('.main_button',value).length > 0) {
                        conlog('Found an ongoing invasion!');
                        $('.npc_listing',value).submit();
                    }
                }
            });
        } else if($('div#npc_container').length == 0) {
            // If we're not on a boss fight already, go to invasion page
            var invasion_timer = GM_getValue('fow_invasion_timer',60);
            condeb('invasion_timer '+invasion_timer);
            var invasion_timer_max = GM_getValue('fow_invasion_timer_max',60);

            if(invasion_timer < invasion_timer_max) {
                // To only check every X seconds
                invasion_timer++;
                $('#invasion_timer').html(', checking in <strong>'+(invasion_timer_max-invasion_timer)+'</strong> seconds');
                GM_setValue('fow_invasion_timer',invasion_timer);
            } else {
                invasion_timer = 0;
                GM_setValue('fow_invasion_timer',invasion_timer);
                conlog('Check for invasion..');
                window.location.href = '/bounties';
                return;
            }
        }
    }

    setTimeout(function(){repeated_checks();}, 1000);
}

$(document).ready( function() {
    conlog('-[ FOW Utils v'+version+' initializing ]-');

    $('#body .fb-like').hide();

    // Load settings
    collect_bot = GM_getValue('fow_collect_bot',0);
    mission_bot = GM_getValue('fow_mission_bot',0);
    mission_id = GM_getValue('fow_mission_id','');
    mission_cost = GM_getValue('fow_mission_cost',0);
    battle_bot = GM_getValue('fow_pvp_bot',0);
    min_stamina = GM_getValue('fow_min_stamina',0);
    invasion_bot = GM_getValue('fow_invasion_bot',0);
    invasion_health = GM_getValue('fow_invasion_health',0);
    invasion_timer_max = GM_getValue('fow_invasion_timer_max',60);
    heal_bot = GM_getValue('fow_heal_bot',0);
    min_health = GM_getValue('fow_min_health',0);

    conlog('collect_bot '+collect_bot);
    conlog('mission_bot '+mission_bot);
    conlog('mission_id '+mission_id);
    conlog('mission_cost '+mission_cost);
    conlog('battle_bot '+battle_bot);
    conlog('min_stamina '+min_stamina);
    conlog('invasion_bot '+invasion_bot);
    conlog('invasion_health '+invasion_health);
    conlog('invasion_timer_max '+invasion_timer_max);
    conlog('heal_bot '+heal_bot);
    conlog('min_health '+min_health);

    // Initialize data
    authenticity_token = $('meta[name=csrf-token]').attr('content');

    if($('#npc_middle').length > 0) {
        fighting_boss = true;
        // We are on a boss fight page
        npc_attack();
    }

    if(collect_bot && $('form[action=/empire/collect_income]').length > 0) {
        // There's money to collect!
        conlog('Collecting money..');
        do_action('/empire/collect_income');
        return;
    }

    // Run main loop
    repeated_checks();

    // Inject controls
    var el = document.createElement( 'div' );
    el.id = 'fow_bot_settings';
    el.style.zIndex = 99;
    el.style.position = 'fixed';
    el.style.top = 0;
    el.style.left = 0;
    el.style.padding = '5px';
    el.style.width = '100%';
    el.style.height = '110px';
    el.style.backgroundColor = 'rgba(0,0,0,0.75)';
    el.style.color = 'white';
    el.innerHTML = '';

    el_left = document.createElement( 'div' );
    el_left.id = 'fow_bot_settings_left';
    el_left.style.verticalAlign = 'top';
    el_left.style.display = 'inline-block';
    el_left.style.width = '49%';
    el_left.innerHTML = '';
    el_left.innerHTML += '<input id="collect_bot" type="checkbox"'+(collect_bot?' checked':'')+' /> Automatically collect income<br />';
    el_left.innerHTML += '<input id="mission_bot" type="checkbox"'+(mission_bot?' checked':'')+' /> Mission bot &nbsp; ID <input id="mission_id" type="text" value="'+mission_id+'" placeholder="ID" size="4" /> &nbsp; Cost <input id="mission_cost" type="text" value="'+mission_cost+'" placeholder="Cost" size="3" /> energy<br />';
    el_left.innerHTML += '<input id="battle_bot" type="checkbox"'+(battle_bot?' checked':'')+' /> PvP bot &nbsp; When above <input id="min_stamina" type="text" value="'+min_stamina+'" placeholder="" size="4" /> stamina<br />';
    el_left.innerHTML += '<input id="invasion_bot" type="checkbox"'+(invasion_bot?' checked':'')+' /> Invasion bot &nbsp; Attack at <input id="invasion_health" type="text" value="'+invasion_health+'" placeholder="" size="3" />% health or below<br />';
    el_left.innerHTML += '<input id="heal_bot" type="checkbox"'+(heal_bot?' checked':'')+' /> Heal me if below <input id="min_health" type="text" value="'+min_health+'" placeholder="0" size="6" /> health<br />';
    el_left.innerHTML += 'Check for invasion every <input id="invasion_timer_max" type="text" value="'+invasion_timer_max+'" size="3" /> seconds<span id="invasion_timer"></span><br />';

    el_right = document.createElement( 'div' );
    el_right.id = 'fow_bot_settings_right';
    el_left.style.verticalAlign = 'top';
    el_right.style.display = 'inline-block';
    el_right.style.width = '49%';
    el_right.innerHTML = '';
    el_right.innerHTML += 'Status:<br /><span id="conlog"></span><br />';
    el_right.innerHTML += '<br />';
    el_right.innerHTML += 'Debug:<br /><span id="deblog"></span><br />';

    el.appendChild(el_left);
    el.appendChild(el_right);
    document.body.appendChild(el);

    $('#fow_bot_settings #collect_bot').bind('change',function(){
        collect_bot = !collect_bot;GM_setValue('fow_collect_bot',collect_bot);
        condeb('collect_bot '+collect_bot);
    });
    $('#fow_bot_settings #mission_bot').bind('change',function(){
        mission_bot = !mission_bot;GM_setValue('fow_mission_bot',mission_bot);
        condeb('mission_bot '+mission_bot);
    });
    $('#fow_bot_settings #mission_id').bind('change',function(){
        mission_id = $('#fow_bot_settings #mission_id').val();
        GM_setValue('fow_mission_id',mission_id);
        condeb('mission_id '+mission_id);
    });
    $('#fow_bot_settings #mission_cost').bind('change',function(){
        mission_cost = $('#fow_bot_settings #mission_cost').val();
        GM_setValue('fow_mission_cost',mission_cost);
        condeb('mission_cost '+mission_cost);
    });
    $('#fow_bot_settings #battle_bot').bind('change',function(){
        battle_bot = !battle_bot;GM_setValue('fow_pvp_bot',battle_bot);
        condeb('battle_bot '+battle_bot);
    });
    $('#fow_bot_settings #min_stamina').bind('change',function(){
        min_stamina = $('#fow_bot_settings #min_stamina').val();
        GM_setValue('fow_min_stamina',min_stamina);
        condeb('min_stamina '+min_stamina);
    });
    $('#fow_bot_settings #invasion_bot').bind('change',function(){
        invasion_bot = !invasion_bot;GM_setValue('fow_invasion_bot',invasion_bot);
        condeb('invasion_bot '+invasion_bot);
    });
    $('#fow_bot_settings #invasion_health').bind('change',function(){
        invasion_health = $('#fow_bot_settings #invasion_health').val();
        GM_setValue('fow_invasion_health',invasion_health);
        condeb('invasion_health '+invasion_health);
    });
    $('#fow_bot_settings #invasion_timer_max').bind('change',function(){
        invasion_timer_max = $('#fow_bot_settings #invasion_timer_max').val();
        GM_setValue('fow_invasion_timer_max',invasion_timer_max);
        condeb('invasion_timer_max '+invasion_timer_max);
    });
    $('#fow_bot_settings #heal_bot').bind('change',function(){
        heal_bot = !heal_bot;GM_setValue('fow_heal_bot',heal_bot);
        condeb('heal_bot '+heal_bot);
    });
    $('#fow_bot_settings #min_health').bind('change',function(){
        min_health = $('#fow_bot_settings #min_health').val();
        GM_setValue('fow_min_health',min_health);
        condeb('min_health '+min_health);
    });
});