Kitten Food Tracker

make sure yr kittens don't starve

// ==UserScript==
// @name         Kitten Food Tracker
// @namespace    http://tampermonkey.net/nkc/kitten-food-tracker
// @version      0.1
// @description  make sure yr kittens don't starve
// @author       nkc
// @match        http://bloodrizer.ru/games/kittens/*
// @grant        none
// ==/UserScript==

function catnipPerTick (seasonStr) {
    var season = null;
    switch (seasonStr) {
        case 'spring':
            season = game.calendar.seasons[0];
            break;
        case 'summer':
            season = game.calendar.seasons[1];
            break;
        case 'fall':
            season = game.calendar.seasons[2];
            break;
        case 'winter':
            season = game.calendar.seasons[3];
            break;
        default:
            console.log('season should be one of spring/summer/fall/winter');
    }
    var catnip = game.calcResourcePerTick('catnip', season);

    return catnip;
}

function catnipPerDayMap () {
    var ticksPerDay = 1 / game.calendar.dayPerTick;
    var oldPause = game.isPaused;
    var oldWeather = game.calendar.weather;

    game.calendar.weather = 'warm';
    var warmMap = {
        'spring': catnipPerTick('spring') * ticksPerDay,
        'summer': catnipPerTick('summer') * ticksPerDay,
        'fall':   catnipPerTick('fall') * ticksPerDay,
        'winter': catnipPerTick('winter') * ticksPerDay
    };

    game.calendar.weather = null;
    var avgMap = {
        'spring': catnipPerTick('spring') * ticksPerDay,
        'summer': catnipPerTick('summer') * ticksPerDay,
        'fall':   catnipPerTick('fall') * ticksPerDay,
        'winter': catnipPerTick('winter') * ticksPerDay
    };

    game.calendar.weather = 'cold';
    var coldMap = {
        'spring': catnipPerTick('spring') * ticksPerDay,
        'summer': catnipPerTick('summer') * ticksPerDay,
        'fall':   catnipPerTick('fall') * ticksPerDay,
        'winter': catnipPerTick('winter') * ticksPerDay
    };

    game.calendar.weather = oldWeather;
    game.isPaused = oldPause;

    return {'warm': warmMap, 'avg': avgMap, 'cold': coldMap};
}
function getTempRow (map, temp) {
    var row = '<tr><td>' + temp + '</td>' +
        '<td>' + game.getDisplayValueExt(map[temp].spring * game.calendar.daysPerSeason, true) + '</td>' +
        '<td>' + game.getDisplayValueExt(map[temp].summer * game.calendar.daysPerSeason, true) + '</td>' +
        '<td>' + game.getDisplayValueExt(map[temp].fall * game.calendar.daysPerSeason, true) + '</td>' +
        '<td>' + game.getDisplayValueExt(map[temp].winter * game.calendar.daysPerSeason, true) + '</td>' +
        '</tr>';
    return row;
}

function createSeasonTable (map) {
    var table = '<table><colgroup><col width="40"><col width="60">' +
        '<col width="60"><col width="60"><col width="60"></colgroup>' +
        '<tr><th></th><th>Spring</th><th>Summer</th><th>Fall</th><th>Winter</th></tr>' +
        getTempRow(map, 'warm') + getTempRow(map, 'avg') + getTempRow(map, 'cold') +
        '</table>';
    return table;
}

function createInfoList (map) {
    var ticksPerDay = 1 / game.calendar.dayPerTick;
    var demandPerDay = game.getResourcePerTickStack('catnip')[12].value * ticksPerDay;

    var production = (map.avg.spring + map.avg.summer + map.avg.fall + map.avg.winter - 4 * demandPerDay) * game.calendar.daysPerSeason;
    var demand = demandPerDay * game.calendar.daysPerSeason * 4;

    var daysLeft = game.calendar.daysPerSeason - game.calendar.day;
    var winterDaysLeft = (game.calendar.season == 3) ? daysLeft : game.calendar.daysPerSeason;

    var coldWinter = (((map.cold.winter * winterDaysLeft) + game.resPool.get('catnip').value) > 0) ? 'yes' : 'no';
    var productionLeft = 0;
    switch (game.calendar.season) {
        case 0:     //spring
            productionLeft += map.cold.spring * daysLeft;
            productionLeft += map.cold.summer * game.calendar.daysPerSeason;
            productionLeft += map.cold.fall * game.calendar.daysPerSeason;
            productionLeft += map.cold.winter * game.calendar.daysPerSeason;
            break;
        case 1:     //summer
            productionLeft += map.cold.summer * daysLeft;
            productionLeft += map.cold.fall * game.calendar.daysPerSeason;
            productionLeft += map.cold.winter * game.calendar.daysPerSeason;
            break;
        case 2:     //fall
            productionLeft += map.cold.fall * daysLeft;
            productionLeft += map.cold.winter * game.calendar.daysPerSeason;
            break;
        case 3:     //winter
            productionLeft += map.cold.winter * daysLeft;
            break;
    }

    var coldYear = ((productionLeft + game.resPool.get('catnip').value) > 0) ? 'yes' : 'no';

    var list = '<p>' +
        'Yearly Production (Avg):<span style="float:right">' + game.getDisplayValueExt(production, true) + '</span><br>' +
        'Yearly Demand (Avg):<span style="float:right">' + game.getDisplayValueExt(demand, true) + '</span><br>' +
        'Yearly Delta (Avg):<span style="float:right">' + game.getDisplayValueExt(production + demand, true) + '</span><br>' +
        'Survive cold winter?:<span style="float:right">' + coldWinter + '</span><br>' +
        'Survive cold year?:<span style="float:right">' + coldYear + '</span>' +
        '</p>';

    return list;
}

var updateKittenFood = function () {
    var catnipMap = catnipPerDayMap();
    var table = createSeasonTable(catnipMap);
    var list = createInfoList(catnipMap);

    var advDiv = dojo.byId("advisorsContainer");
    dojo.empty(advDiv);

    advDiv.innerHTML = '<div style="position:relative;left:5px">' + table + list + '</div>';
};

game.updateAdvisors = function () {};
game.timer.addEvent(updateKittenFood, 10);