Come bilanciare le risorse per Meraviglie da App

argo7777777

Utente
Sarà una guida un po' particolare, ma mi sono imbattuto in questa funzionalità stamattina e non posso non condividerla.
Questo è solo un esempio di quello che è possibile fare e penso che sarà particolarmente utile.

Ma partiamo dall'ovvio, mandare risorse sui vari livelli delle meraviglie deve essere fatto in modo bilanciato. Questo risulta facile da pc in quanto ci sono vari tools (approvati) che permettono di bilanciare le materie in modo automatico. Da app è un incubo bilanciare le materie, nonché selezionarle...quanto sarebbe comodo avere lo stesso script per l'app?

La parte di codice the permette di bilanciare le materie è la seguente (presa da FLASK-TOOL) e semplificata
JavaScript:
(function() {
    'use strict';
    const uw = window

    /* Ascoltiamo tutti gli eventi del gioco e controlliamo se di tratta della finestra delle meraviglie */
    uw.$(document).ajaxComplete(function (event, xhr, options) {
        const urlParams = options.url.split("?");
        const queryParams = urlParams[1] ? urlParams[1].split("&") : [];
        const actionParam = queryParams[1] ? queryParams[1].split("=")[1] : "";
        const action = `${urlParams[0].substr(5)}/${actionParam.substr(7)}`;

        /* se l'evento è associato alla finestra delle meraviglie */
        if (action === "/wonders/" && uw.Game.features.end_game_type === "end_game_type_world_wonder") {
            /* prendiamo la città attutale, la capacità di mercato disponibile e le risorse */
            const town = uw.ITowns.getCurrentTown()
            const trade = town.getAvailableTradeCapacity()
            const resources = town.getCurrentResources()
            const wonderWindows = uw.GPWindowMgr.getOpen(uw.GPWindowMgr.TYPE_WONDERS)

           /* aggiorniamo tutte le finestre delle meraviglie con le materie bilanciare */
            for (const window of wonderWindows) {
                const windowID = `#gpwnd_${window.getID()} `;
                for (const key in resources) {
                    const count = (resources[key] > trade / 3) ? trade / 3 : resources[key]
                    uw.$(`${windowID}#ww_trade_type_${key} [type="text"]`).select().val(count).blur()
                }
            }
        };
    });
})();
Dobbiamo quindi trovare il modo di aggiungere questo codice all'App ed il gioco è fatto.
E qua ci viene in aiuto una vecchissima funzione ma dimenticata dal tempo: la barra rapida


Cliccando sul pulsante modifica è possibile cambiare i punti del menù


1683654539208.png
Nota: La barra rapida è visibile solo con amministratore attivo

Dato che sono massimo 6 punti, selezioniamo uno che non viene utilizzato, io ho scelto il tempio


1683654723061.png

Cambiamo quindi il nome per esempio a "Meraviglie" e nella parte link, invece di mettere il link che apre una finestra, metteremo il codice che ci serve per avere il commercio a percentuale. Ovviamente il codice è stato compresso qua ed è diventato il seguente:

JavaScript:
javascript:!function(){"use strict";let e=window;e.$(document).ajaxComplete(function(t,r,l){let n=l.url.split("?"),s=n[1]?n[1].split("&"):[],o=s[1]?s[1].split("=")[1]:"",a=`${n[0].substr(5)}/${o.substr(7)}`;if("/wonders/"===a&&"end_game_type_world_wonder"===e.Game.features.end_game_type){let i=e.ITowns.getCurrentTown(),p=i.getAvailableTradeCapacity(),u=i.getCurrentResources(),d=e.GPWindowMgr.getOpen(e.GPWindowMgr.TYPE_WONDERS);for(let g of d){let w=`#gpwnd_${g.getID()} `;for(let f in u){let c=u[f]>p/3?p/3:u[f];e.$(`${w}#ww_trade_type_${f} [type="text"]`).select().val(c).blur()}}}})}();

Nota: Il codice compresso è esattamente lo stesso di quello non compresso ma occupa meno spazio e può essere eseguito in un linea singola
Nota: Al codice va aggiunto "javascript:" davanti, nel codice indicato sopra è già stato aggiunto

Clicchiamo infine su salva registrazione per salvare.
Possiamo ora notare che la barra rapida al posto del punto "Tempio" ha il punto "Meraviglie". Quando cliccheremo il sottopunto verrà eseguito il codice che abbiamo aggiunto. Per provare basta andare sul commercio delle meraviglie e si potrà notare che le materie saranno bilanciate automaticamente:

1683655142339.png
Alcuni punti finali:
- la funzionalità è stata approvata su numerosi script quindi è legale utilizzarla
- sarà necessario cliccare sul punto "Meraviglie" ogni volta che si entra nel gioco dall'app dato che il codice non parte in automatico

Fatemi sapere cosa ne pensate
 
Ultima modifica:

argo7777777

Utente
Sotto richiesta ho ricreato anche la parte dello script per girare le materie
JavaScript:
(function() {
    'use strict';
    const uw = window;
    var active = null;
    const ratio = {
        attack_ship: {w: 1, s: 0.2308, i: 0.6154},
        bireme: {w: 1, s: 0.8750, i: 0.2250},
        trireme: {w: 1, s: 0.65, i: 0.65},
        slinger: {w: 0.55, s: 1, i: 0.4},
        rider: {w: 0.6666, s: 0.3333, i: 1},
        sword: {w: 1, s: 0, i: 0.8947},
        hoplite: {w: 0, s: 0.5, i: 1},
        archer: {w: 1, s: 0, i: 0.6250},
        chariot: {w: 0.4545, s: 1, i: 0.7273},
        wall_level: {w: 0, s: 1, i: 0.70}
    };


    function addResources() {
        if (!active) return
        const town = uw.ITowns.getCurrentTown()
        let wood, stone, iron;

        const getCountWithTrade = () => {
            let resources = town.resources();
            let d_wood = resources.wood / ratio[active].w ;
            let d_stone = resources.stone / ratio[active].s;
            let d_iron = resources.iron / ratio[active].i;
            let min_resouces = Math.min(d_wood, d_stone, d_iron); // min ammount

            let trade = town.getAvailableTradeCapacity();
            let max_trade = trade / (ratio[active].w + ratio[active].s + ratio[active].i) // max tradable

            if (max_trade < min_resouces) return max_trade;
            else return min_resouces;
        }

        const trade = town.getAvailableTradeCapacity()
        const resources = town.getCurrentResources()
        const min = getCountWithTrade()

        wood = ratio[active].w * min;
        stone = ratio[active].s * min;
        iron = ratio[active].i * min;


        const windowOpened = uw.GPWindowMgr.getOpen(uw.GPWindowMgr.TYPE_TOWN)
        /* aggiorniamo tutte le finestre delle meraviglie con le materie bilanciare */
        for (const window of windowOpened) {
            const windowID = `#gpwnd_${window.getID()} `;
            requestAnimationFrame(() => uw.$(`${windowID} #trade_type_wood [type="text"]`).select().val(wood).blur())
            requestAnimationFrame(() => uw.$(`${windowID} #trade_type_stone [type="text"]`).select().val(stone).blur())
            requestAnimationFrame(() => uw.$(`${windowID} #trade_type_iron [type="text"]`).select().val(iron).blur())
        }
    }

    function activate(name) {
        uw.$("#app_trade div").css("box-shadow", "")

        if (name !== active) {
            uw.$(`#app_trade .${name}`).css("box-shadow", "0px 0px 10px 5px rgb(34 255 0)")
            active = name
            addResources()
        } else {
            active = null
            const windowOpened = uw.GPWindowMgr.getOpen(uw.GPWindowMgr.TYPE_TOWN)
            /* aggiorniamo tutte le finestre delle meraviglie con le materie bilanciare */
            for (const window of windowOpened) {
                const windowID = `#gpwnd_${window.getID()} `;

                requestAnimationFrame(() => uw.$(`${windowID} #trade_type_wood [type="text"]`).select().val(0).blur())
                requestAnimationFrame(() => uw.$(`${windowID} #trade_type_stone [type="text"]`).select().val(0).blur())
                requestAnimationFrame(() => uw.$(`${windowID} #trade_type_iron [type="text"]`).select().val(0).blur())
            }
        }

    }

    uw.$(document).ajaxComplete(function (event, xhr, options) {
        const urlParams = options.url.split("?");
        const queryParams = urlParams[1] ? urlParams[1].split("&") : [];
        const actionParam = queryParams[1] ? queryParams[1].split("=")[1] : "";
        const action = `${urlParams[0].substr(5)}/${actionParam.substr(7)}`;

        if (action === "/town_info/") {
            /* Get the current town */
            addResources()

            if (uw.$("#app_trade").length) return
            uw.$("#trade .content").append("<div id='app_trade' style='width:56%; margin:20px auto; grid-template-columns: repeat(5, 20%); display:grid'></div>")

            var troops = ["attack_ship", "bireme", "trireme", "sword", "slinger", "archer", "hoplite", "rider", "chariot"];

            troops.forEach(e => {
                uw.$("#app_trade").append(uw.$("<div>", {
                    class: "option_s unit index_unit unit_icon40x40 " + e,
                    click: () => activate(e),
                    style: e === active ? "box-shadow: 0px 0px 10px 5px rgb(34 255 0)": ""
                }))
            })


            uw.$("#app_trade").append(uw.$("<div>", {
                class: "option_s unit index_unit place_image wall_level",
                click: () => activate("wall_level"),
                style: "wall_level" === active ? "box-shadow: 0px 0px 10px 5px rgb(34 255 0)": ""
            }))
        }

    })
})();

Che compresso, assieme all'altro diventano:
JavaScript:
javascript:!function(){"use strict";let e=window;var t=null;let r={attack_ship:{w:1,s:.2308,i:.6154},bireme:{w:1,s:.875,i:.225},trireme:{w:1,s:.65,i:.65},slinger:{w:.55,s:1,i:.4},rider:{w:.6666,s:.3333,i:1},sword:{w:1,s:0,i:.8947},hoplite:{w:0,s:.5,i:1},archer:{w:1,s:0,i:.625},chariot:{w:.4545,s:1,i:.7273},wall_level:{w:0,s:1,i:.7}};function l(){if(!t)return;let l=e.ITowns.getCurrentTown(),i,a,s;l.getAvailableTradeCapacity(),l.getCurrentResources();let p,n,o,d,w,$=(n=(p=l.resources()).wood/r[t].w,d=Math.min(n,o=p.stone/r[t].s,p.iron/r[t].i),(w=l.getAvailableTradeCapacity()/(r[t].w+r[t].s+r[t].i))<d?w:d);i=r[t].w*$,a=r[t].s*$,s=r[t].i*$;let c=e.GPWindowMgr.getOpen(e.GPWindowMgr.TYPE_TOWN);for(let u of c){let g=`#gpwnd_${u.getID()} `;requestAnimationFrame(()=>e.$(`${g} #trade_type_wood [type="text"]`).select().val(i).blur()),requestAnimationFrame(()=>e.$(`${g} #trade_type_stone [type="text"]`).select().val(a).blur()),requestAnimationFrame(()=>e.$(`${g} #trade_type_iron [type="text"]`).select().val(s).blur())}}function i(r){if(e.$("#app_trade div").css("box-shadow",""),r!==t)e.$(`#app_trade .${r}`).css("box-shadow","0px 0px 10px 5px rgb(34 255 0)"),t=r,l();else{t=null;let i=e.GPWindowMgr.getOpen(e.GPWindowMgr.TYPE_TOWN);for(let a of i){let s=`#gpwnd_${a.getID()} `;requestAnimationFrame(()=>e.$(`${s} #trade_type_wood [type="text"]`).select().val(0).blur()),requestAnimationFrame(()=>e.$(`${s} #trade_type_stone [type="text"]`).select().val(0).blur()),requestAnimationFrame(()=>e.$(`${s} #trade_type_iron [type="text"]`).select().val(0).blur())}}}e.$(document).ajaxComplete(function(r,a,s){let p=s.url.split("?"),n=p[1]?p[1].split("&"):[],o=n[1]?n[1].split("=")[1]:"",d=`${p[0].substr(5)}/${o.substr(7)}`;if("/town_info/"===d){if(l(),e.$("#app_trade").length)return;e.$("#trade .content").append("<div id='app_trade' style='width:56%; margin:20px auto; grid-template-columns: repeat(5, 20%); display:grid'></div>"),["attack_ship","bireme","trireme","sword","slinger","archer","hoplite","rider","chariot"].forEach(r=>{e.$("#app_trade").append(e.$("<div>",{class:"option_s unit index_unit unit_icon40x40 "+r,click:()=>i(r),style:r===t?"box-shadow: 0px 0px 10px 5px rgb(34 255 0)":""}))}),e.$("#app_trade").append(e.$("<div>",{class:"option_s unit index_unit place_image wall_level",click:()=>i("wall_level"),style:"wall_level"===t?"box-shadow: 0px 0px 10px 5px rgb(34 255 0)":""}))}})}(),function(){"use strict";let e=window;e.$(document).ajaxComplete(function(t,r,l){let i=l.url.split("?"),a=i[1]?i[1].split("&"):[],s=a[1]?a[1].split("=")[1]:"",p=`${i[0].substr(5)}/${s.substr(7)}`;if("/wonders/"===p&&"end_game_type_world_wonder"===e.Game.features.end_game_type){let n=e.ITowns.getCurrentTown(),o=n.getAvailableTradeCapacity(),d=n.getCurrentResources(),w=e.GPWindowMgr.getOpen(e.GPWindowMgr.TYPE_WONDERS);for(let $ of w){let c=`#gpwnd_${$.getID()} `;for(let u in d){let g=d[u]>o/3?o/3:d[u];e.$(`${c}#ww_trade_type_${u} [type="text"]`).select().val(g).blur()}}}})}();
Nota: come nel caso precedente ho già aggiunto "javascript:" davanti al codice
Nota: questo codice compresso è la combinazione del commercio per le meraviglie ed per il commercio bilanciato

1685555868712.png

Le materie vengono così bilanciate automaticamente come nei vari tools, le percentuali sono prese dal FLASK-TOOLS di @moonlight900
Fatemi sapere se ci sono problemi o eventuali altre richieste da aggiungere in futuro
 

argo7777777

Utente
Questo codice aggiornato fa uscire una notifica "Script installato con successo", se la notifica non appare, bhe c'è un problema.

Ricordo di cliccare 1 volta sola sul bottone ogni volta che di entra da app, cliccando numerose volte potrebbe riscontrare dei problemi

JavaScript:
javascript:!function(){"use strict";let e=window;var t=null;let i={attack_ship:{w:1,s:.2308,i:.6154},bireme:{w:1,s:.875,i:.225},trireme:{w:1,s:.65,i:.65},slinger:{w:.55,s:1,i:.4},rider:{w:.6666,s:.3333,i:1},sword:{w:1,s:0,i:.8947},hoplite:{w:0,s:.5,i:1},archer:{w:1,s:0,i:.625},chariot:{w:.4545,s:1,i:.7273},wall_level:{w:0,s:1,i:.7}};function l(){if(!t)return;let l=e.ITowns.getCurrentTown(),r,a,s;l.getAvailableTradeCapacity(),l.getCurrentResources();let p,o,n,d,$,c=(o=(p=l.resources()).wood/i[t].w,d=Math.min(o,n=p.stone/i[t].s,p.iron/i[t].i),($=l.getAvailableTradeCapacity()/(i[t].w+i[t].s+i[t].i))<d?$:d);r=i[t].w*c,a=i[t].s*c,s=i[t].i*c;let w=e.GPWindowMgr.getOpen(e.GPWindowMgr.TYPE_TOWN);for(let u of w){let x=`#gpwnd_${u.getID()} `;requestAnimationFrame(()=>e.$(`${x} #trade_type_wood [type="text"]`).select().val(r).blur()),requestAnimationFrame(()=>e.$(`${x} #trade_type_stone [type="text"]`).select().val(a).blur()),requestAnimationFrame(()=>e.$(`${x} #trade_type_iron [type="text"]`).select().val(s).blur())}}function r(i){if(e.$("#app_trade div").css("box-shadow",""),i!==t)e.$(`#app_trade .${i}`).css("box-shadow","0px 0px 10px 5px rgb(34 255 0)"),t=i,l();else{t=null;let r=e.GPWindowMgr.getOpen(e.GPWindowMgr.TYPE_TOWN);for(let a of r){let s=`#gpwnd_${a.getID()} `;requestAnimationFrame(()=>e.$(`${s} #trade_type_wood [type="text"]`).select().val(0).blur()),requestAnimationFrame(()=>e.$(`${s} #trade_type_stone [type="text"]`).select().val(0).blur()),requestAnimationFrame(()=>e.$(`${s} #trade_type_iron [type="text"]`).select().val(0).blur())}}}e.$(document).ajaxComplete(function(i,a,s){let p=s.url.split("?"),o=p[1]?p[1].split("&"):[],n=o[1]?o[1].split("=")[1]:"",d=`${p[0].substr(5)}/${n.substr(7)}`;if("/town_info/"===d){if(l(),e.$("#app_trade").length)return;e.$("#trade .content").append("<div id='app_trade' style='width:56%; margin:20px auto; grid-template-columns: repeat(5, 20%); display:grid'></div>"),["attack_ship","bireme","trireme","sword","slinger","archer","hoplite","rider","chariot"].forEach(i=>{e.$("#app_trade").append(e.$("<div>",{class:"option_s unit index_unit unit_icon40x40 "+i,click:()=>r(i),style:i===t?"box-shadow: 0px 0px 10px 5px rgb(34 255 0)":""}))}),e.$("#app_trade").append(e.$("<div>",{class:"option_s unit index_unit place_image wall_level",click:()=>r("wall_level"),style:"wall_level"===t?"box-shadow: 0px 0px 10px 5px rgb(34 255 0)":""}))}}),HumanMessage.success("Script installato con successo")}();
 
In cima