Greasy Fork

Greasy Fork is available in English.

[Pokeclicker] Infinite Seasonal Events

Adds in toggable options to have seasonal events infinitely run. Events can also run simultaneously with one another. Includes custom events as well.

当前为 2022-06-18 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        [Pokeclicker] Infinite Seasonal Events
// @namespace   Pokeclicker Scripts
// @match       https://www.pokeclicker.com/
// @grant       none
// @version     1.0
// @author      Ephenia
// @description Adds in toggable options to have seasonal events infinitely run. Events can also run simultaneously with one another. Includes custom events as well.
// ==/UserScript==

var startDate = new Date(new Date().getFullYear(), -1);
var endDate = new Date(new Date().getFullYear(), 10000);
var getEvents = SpecialEvents.events;
var storedEvents = [];
var profileDrop = document.getElementById('startMenu').querySelectorAll('ul li')[0];
var profileModal = document.getElementById('profileModal');

//Removed setTimeout, opted to make it load like the other scrips, also helps with notifications
function initEvents() {
    SpecialEvents.newEvent('Ephenia\'s Gift', 'Encounter Ribombee that roams across all regions.<br/>A special thanks for using my scripts!',
        startDate, () => {
            GameHelper.enumNumbers(GameConstants.Region).filter(i => i != GameConstants.Region.none).forEach(region => {
                RoamingPokemonList.add(region, new RoamingPokemon('Ribombee'));
            });
        },
        endDate, () => {
            GameHelper.enumNumbers(GameConstants.Region).filter(i => i != GameConstants.Region.none).forEach(region => {
                RoamingPokemonList.remove(region, 'Ribombee');
            });
        }
    );

    //Testing loading events in init
    for (var i = 0; i < getEvents.length; i++) {
        if (localStorage.getItem(getEvents[i].title) == null) {
            localStorage.setItem(getEvents[i].title, 0);
        }
        /*
        Changed the storedEvents list to contain objects that have the name of the event and active status so we can search for them
        even with a different order
        */
        storedEvents.push({name: getEvents[i].title, active: localStorage.getItem(getEvents[i].title)})
    }

    for (var ii = 0; ii < getEvents.length; ii++) {
        getEvents[ii].startTime = startDate
        getEvents[ii].endTime = endDate
        if (getEvents[ii].hasStarted() == false && storedEvents[ii].active == 1) {
            getEvents[ii].start()
        }
    }

    if (getEvents.length != 9) {
        Notifier.notify({
            title: '[Outdated] Infinite Seasonal Events',
            message: `Please contact <a href="https://github.com/Ephenia/Pokeclicker-Scripts" target="_blank">Ephenia</a> so that this script can be updated!`,
            type: NotificationConstants.NotificationOption.danger,
            timeout: 10000
        });
    }
    
    var eventLi = document.createElement('li');
    eventLi.innerHTML = `<a class="dropdown-item" href="#eventModal" data-toggle="modal">Toggle Events</a>`
    profileDrop.before(eventLi);

    var eventMod = document.createElement('div');
    eventMod.setAttribute("class", "modal noselect fade show");
    eventMod.setAttribute("id", "eventModal");
    eventMod.setAttribute("tabindex", "-1");
    eventMod.setAttribute("aria-labelledby", "eventModal");
    eventMod.setAttribute("aria-labelledby", "eventModal");
    eventMod.setAttribute("aria-modal", "true");
    eventMod.setAttribute("role", "dialog");

    eventMod.innerHTML = `<div class="modal-dialog modal-dialog-scrollable modal-dialog-centered modal-lg" role="document">
    <div class="modal-content">
        <div class="modal-header" style="justify-content: space-around;">
            <h5 class="modal-title">Toggle Events</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                <span aria-hidden="true">×</span>
            </button>
        </div>
        <div class="modal-body">
        </div>
    </div>`

    profileModal.before(eventMod);

    var modalBody = document.querySelector('[id=eventModal] div div [class=modal-body]')
    //Event order seems to change on startup so this loads them independent of order, also loads any new events without images
    for (i = 0; i<getEvents.length;i++){
        switch(getEvents[i].title){
            case "Flying Pikachu":
                modalBody.innerHTML +=
                `<div id="event-`+i+`" class="event-select" data-value="`+i+`"><b>`+getEvents[i].title+`</b><br>`+getEvents[i].description+`<br>
                <img src="assets/images/pokemon/25.08.png">
                <img src="assets/images/pokemon/21.1.png">
                </div><hr>`
                break
            case "Mewtwo strikes back!":
                modalBody.innerHTML +=
                `<div id="event-`+i+`" class="event-select" data-value="`+i+`"><b>`+getEvents[i].title+`</b><br>`+getEvents[i].description+`<br>
                <img src="assets/images/pokemon/150.1.png">
                <img src="assets/images/pokemon/1.1.png">
                <img src="assets/images/pokemon/4.1.png">
                <img src="assets/images/pokemon/7.1.png">
                </div><hr>`
                break
            case "Halloween!":
                modalBody.innerHTML +=
                `<div id="event-`+i+`" class="event-select" data-value="`+i+`"><b>`+getEvents[i].title+`</b><br>`+getEvents[i].description+`<br>
                <img src="assets/images/pokemon/1.2.png">
                <img src="assets/images/pokemon/175.1.png">
                <img src="assets/images/pokemon/25.1.png"><br>
                <img src="assets/images/pokemon/92.png">
                <img src="assets/images/pokemon/200.png">
                <img src="assets/images/pokemon/353.png">
                <img src="assets/images/pokemon/355.png">
                </div><hr>`
                break
            case "Let's GO!":
                modalBody.innerHTML +=
                `<div id="event-`+i+`" class="event-select" data-value="`+i+`"><b>`+getEvents[i].title+`</b><br>`+getEvents[i].description+`<br>
                <img src="assets/images/pokemon/133.1.png">
                <img src="assets/images/pokemon/25.11.png">
                </div><hr>`
                break
            case "Merry Christmas!":
                modalBody.innerHTML +=
                `<div id="event-`+i+`" class="event-select" data-value="`+i+`"><b>`+getEvents[i].title+`</b><br>`+getEvents[i].description+`<br>
                <img src="assets/images/pokemon/143.1.png">
                <img src="assets/images/pokemon/251.1.png">
                <img src="assets/images/pokemon/446.1.png">
                </div><hr>`
                break
            case "Lunar New Year":
                modalBody.innerHTML +=
                `<div id="event-`+i+`" class="event-select" data-value="`+i+`"><b>`+getEvents[i].title+`</b><br>`+getEvents[i].description+`<br>
                <img src="assets/images/pokemon/666.19.png">
                </div><hr>`
                break
            case "Easter":
                modalBody.innerHTML +=
                `<div id="event-`+i+`" class="event-select" data-value="`+i+`"><b>`+getEvents[i].title+`</b><br>`+getEvents[i].description+`<br>
                <img src="assets/images/pokemon/175.2.png">
                </div><hr>`
                break
            case "Golden Week":
                modalBody.innerHTML +=
                `<div id="event-`+i+`" class="event-select" data-value="`+i+`"><b>`+getEvents[i].title+`</b><br>`+getEvents[i].description+`<br>
                <img src="assets/images/pokemon/1.3.png">
                </div><hr>`
                break
            case "Ephenia's Gift":
                modalBody.innerHTML +=
                `<div id="event-`+i+`" class="event-select" data-value="`+i+`"><b>`+getEvents[i].title+`</b><br>`+getEvents[i].description+`<br>
                <img src="assets/images/pokemon/743.png">
                </div><hr>`
                break
            default:
                modalBody.innerHTML +=
                `<div id="event-`+i+`" class="event-select" data-value="`+i+`"><b>`+getEvents[i].title+`</b><br>`+getEvents[i].description+`<br><br>New event, Pokemon images coming soon, if not open an issue on github
                </div><hr>`
        }
    }
    
    for (var add = 0; add < getEvents.length; add++) {
        if (storedEvents[add].active == 1) {
            document.getElementById('event-'+(add)).style = "background-color: rgba(93, 226, 60, 0.5)"
        }
        document.getElementById('event-'+(add)).addEventListener('click', toggleEvent, false)
    }

    addGlobalStyle('.event-select { cursor: pointer; }');
    addGlobalStyle('.event-select:hover { background-color: rgba(48, 197, 255, 0.5); }');
}

function toggleEvent() {
    var getVal = this.getAttribute('data-value');
    var getEvent = +localStorage.getItem(storedEvents[getVal].name)
    if (getEvent == 0) {
        this.style = "background-color: rgba(93, 226, 60, 0.5)"
        storedEvents[getVal].value = 1
        localStorage.setItem(storedEvents[getVal].name, 1)
        getEvents[getVal].start()
    } else {
        this.style = ""
        storedEvents[getVal].value = 0
        localStorage.setItem(storedEvents[getVal].name, 0)
        getEvents[getVal].end()
    }
    //console.log(getVal)
}

//Made this script load like the others for consistency
function loadScript(){
    var oldInit = Preload.hideSplashScreen

    Preload.hideSplashScreen = function(){
        var result = oldInit.apply(this, arguments)
        initEvents()
        return result
    }
}

var scriptName = 'infiniteseasonalevents'

if (document.getElementById('scriptHandler') != undefined){
    var scriptElement = document.createElement('div')
    scriptElement.id = scriptName
    document.getElementById('scriptHandler').appendChild(scriptElement)
    if (localStorage.getItem(scriptName) != null){
        if (localStorage.getItem(scriptName) == 'true'){
            loadScript()
        }
    }
    else{
        localStorage.setItem(scriptName, 'true')
        loadScript()
    }
}
else{
    loadScript();
}

function addGlobalStyle(css) {
    var head, style;
    head = document.getElementsByTagName('head')[0];
    if (!head) { return; }
    style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = css;
    head.appendChild(style);
}