Greasy Fork is available in English.

Assault Bots Config Overrider [ HACK CHEAT ]

Hopefully AssaultBots will improve!

// ==UserScript==
// @name         Assault Bots Config Overrider [ HACK CHEAT ]
// @version      0.1
// @description  Hopefully AssaultBots will improve!
// @author       nekocell
// @namespace    https://greasyfork.org/users/762895-nekocell
// @match        https://games.crazygames.com/en_US/bot-machines/index.html
// @icon         https://www.google.com/s2/favicons?domain=crazygames.com
// @run-at       document-start
// @grant        unsafeWindow
// ==/UserScript==

const rawdata2configs = function(rawData) {
    const data = (new TextDecoder).decode(rawData);

    const separators = data.match(/(@@!@@)+/g);

    const configs = data.split('@@!@@')
                        .filter(config => config !== '')
                        .map(raw => JSON.parse(raw));

    return {
        configs: configs,
        separators: separators
    };
};

const configs2rawdata = function(configs, separators) {
    const dataList = configs.map(config => JSON.stringify(config));

    const fixedDataList = [];

    for(let i = 0; i < dataList.length; ++i) {
        const data = dataList[i];
        const separator = separators[i];

        fixedDataList.push(data);
        fixedDataList.push(separator);
    }

    return (new TextEncoder()).encode(fixedDataList.join(''));
};

const editValues = function(configs, propName, value) {
    const editValue = function(obj, propName) {
        for(const prop in obj) {
            if(prop === propName) {
                obj[prop] = value;
            }
            else if(typeof obj[prop] === 'object') {
                editValue(obj[prop], propName);
            }
        }
    };

    configs.forEach(config => {
        editValue(config, propName);
    });
};

const oldFetch = unsafeWindow.fetch;

const newFetch = async function(url, options) {
    const response = await oldFetch(url, options);


    if(url.endsWith('download_scriptable.php')) {
        const data = await response.arrayBuffer();

        const { configs, separators } = rawdata2configs(data);

        configs[0].team0Name = 'AntiNeko';
        configs[0].team1Name = 'Neko';

        configs[33].aimAssistAllowed = true;
        configs[33].afkTime = 99999;
        configs[33].conquestCaptureSpeedPerPlayer = 0;
        configs[33].deathScreenTime = 0;
        configs[33].forcefieldTimeForBaseSpawn = 99999;
        configs[33].forcefieldTimeForPointSpawn = 99999;
        configs[33].forcefieldTimeToAllowShoot = 99999;
        configs[33].regularForcefieldTime = 99999;
        configs[33].gravity.y = -36;
        configs[33].showHitPoints = true;

        editValues(configs, 'human', true);
        editValues(configs, 'alien', true);
        editValues(configs, 'cost', 0);
        //editValues(configs, 'beam', true);
        //editValues(configs, 'shieldRegenMultiplier', 999);
        //editValues(configs, 'healthRegenMultiplier', 999);
        //editValues(configs, 'ammoMultiplier', 999);
        editValues(configs, 'minLevel', 0);
        editValues(configs, 'ungroundedSpeedMultiplier', 3);
        editValues(configs, 'movementSpeedMultiplier', 3);
        editValues(configs, 'enemyNametagShowOption', 0);
        //editValues(configs, 'shieldRegenDelay', 0);
        //editValues(configs, 'healthRegenDelay', 0);
        editValues(configs, 'explosiveDamageMultiplier', -1);
        editValues(configs, 'maxExplosiveDamage', -1);
        editValues(configs, 'minExplosiveDamage', -1);
        editValues(configs, 'maxSpread', 0);
        editValues(configs, 'minSpread', 0);
        //editValues(configs, 'guidedTowardsAirTargets', true);
        editValues(configs, 'guidedBulletMaxDistance', 9999);
        //editValues(configs, 'RPM', 9999);
        editValues(configs, 'explosive', true);
        editValues(configs, 'explosionRadius', 99999);

        const newData = configs2rawdata(configs, separators);

        response.body.getReader = () => undefined;

        response.arrayBuffer = async () => {
            console.log('%cConfig Overrided!!', 'color:red');

            return newData;
        };
    }

    return response;
};

Object.defineProperty(unsafeWindow, 'fetch', {
    get() {
        return newFetch;
    },

    set(newFetch) {
    }
});