Zacznę od końca, bo tak chyba najłatwiej będzie wytłumaczyć zamysł skryptu.
> Obstawa: 3z
> xxx|xxx 18000 pik 18000 łucznik 4000 ck
1. Czemu konkretnie ta ilość jednostek?
Znaczenie podczas walki mają statystyki obrony zapewniane przez jednostki oraz stosunek siły piechoty do siły kawalerii w ataku. Oczywiście, prawdziwego stosunku nigdy nie znamy, ale możemy go estymować, np:
- patrząc na stosunek wojsk na świecie (
https://pl164.plemiona.pl/page/stats)
- ściągając z szablonów wojsk z forum plemiennych
- na podstawie historycznych raportów atakującego
Koniec końców mając już jakąś estymatę stosunku, można wyliczyć jakie wojsko defensywne (w sensie zapewnianych statystyk obronnych) będzie najlepsze do obrony i wówczas doskalować do oczekiwanych zagród offa (ile wioska ma offów ustać). Znając już mechanikę gry, wychodzi, że obstawy powinno się podawać nie w jednostkach, ale w siłach defensywnych przeciwko piechocie/kawalerii/łuczników. Wybieranie siły (statystyk) jednostek jest trudniejsze niż wybór jednostek (trzeba rozwiązać pewień układ równań liniowych), a komu się chce takie rzeczy robić podczas grania.
W rzeczywistości jesteśmy leniwi i zamiast podawać konkretnie, podajemy w przybliżeniu korzystając z dziwnej miary ludności/jednostek, jak podałeś w przykładzie 3z, czy na język skryptu 60k jednostek deffa. Tym samym zamieniliśmy problem wyboru jednostek do obrony (na podstawie siły obrony) do wyboru jednostek na podstawie tego, ile jednostka zapewnia 'deffa'.
2. Co robi skrypt
Skrypt rozwiązuje drugi problem, starając się wybrać tak jednostki, aby spełnić zadane warunki oraz zminimalizować sumaryczny czas jaki zajmuje wyrekrutowanie jednostek. Aczkolwiek minimalizacja czasu jest zrobiona w sposób bardzo naiwny - jest wielkie założenie, że ten 'czas' zależy tylko od jednostek deffa**. Ale zamiast brać pod uwagę jeszcze poziomy koszar, stajni i komplikować problem, uznałem, że takie przybliżenie będzie w moim przypadku ok.
** co nie jest prawdą, przy domyślnych wartościach przeliczników; 500 pików robi się szybciej niż 500 mieczy, a obie kombinacje zapewniają tyle samo jednostek deffa.
Dane wejściowe:
* listę twoich jednostek w wioskach
* docelowa liczba jednostek (ilość deffa)
* przeliczniki (konwersja jednostki na jakąś umowną ilość 'deffa'
* rezerwa jednostek
Wynik:
Wybranie wojsk, tak z każdej wioski wybrać około tyle samo jednostek deffa.
Skrypt nie bawi się w estymację stosunku siły piechoty/siły kawalerii (to jest jeden z elementów strategii gry - i zostawiam to dla gracza, przy tworzeniu swoich szablonów deffa), stąd też wybór proporcji jednostek zależy od proporcji wojsk gracza, od którego skrypt milcząco oczekuje, że gracz ma sensowną proporcję wojsk w wioskach i tym samym wybór obstawy w jednostkach deffa rozwiązuje w przybliżeniu problem, który opisałem na samym początku.
Ogólnie pisząc skrypty w plemiona, pisałem je z myślą o mnie, abym mógł uniknąć klikania powtarzalnych akcji.
Nie miały one na celu rozwiązywania/naprawiania tego czy sposób w jaki ktoś gra, jest sensowny.
3. Pytania
> ...w której gracze wyślą na obstawę samą ciężką kawalerię, bo są i tacy delikwenci w tej grze i nic na to nie poradzimy...
Ogólnie skrypt nie służy do rozwiązywania problemu czy taka kombinacja wsparcia ma sens.
> Z jakiegoś powodu ustawienia skryptu nie zapisują im się i co jakiś czas muszą na nowo je wprowadzać - przyczyny nie znam, ale szukam rozwiązania.
Zapis i trwałość ustawień korzysta pod spodem z localStorage - czyszczenie danych przeglądarki może powodować, że zapisane dane będą znikać.
> Czy to jest fizycznie możliwe? Ratio: 1
Powinno to zadziałać tak jak mówisz, aczkolwiek skrypt nie był stworzony w tym celu, co nie znaczy, że nie można go użyć tak jak mówisz i uzyskać to co chcesz, aczkolwiek trzeba się trochę naklikać.
> I przynajmniej będzie pewność, że delikwent wyśle to co trzeba i ile trzeba, w odpowiednich proporcjach ^^
Przy twoich ustawieniach piechoty nie jest to zagwarantowane, jeżeli gracz ma ogólnie 30k pików, 10k łuków, skrypt by wybrał (przy ustawieniu jednostek na 36k): 27k pików, 9k łuków.
Aby mieć to zagwarantowane oraz dla przykładu: 20k pików, 15k mieczy, 10k łuków, 5k ck
Potrzebowałbyś 4 instancje skryptu w pasku, z kolejnymi ustawieniami ratio oraz deff_count
ratio: { spear: 1, sword: 0, archer: 0, heavy: 0 }, deff_count: 20000
ratio: { spear: 0, sword: 1, archer: 0, heavy: 0 }, deff_count: 15000
ratio: { spear: 0, sword: 0, archer: 1, heavy: 0 }, deff_count: 10000
ratio: { spear: 0, sword: 0, archer: 0, heavy: 1 }, deff_count: 5000
oraz 4 razy wysłać wsparcia.
Obecnie nie ma możliwości podmiany wartości ratio wrzucając ustawienia w pasek jak to jest w przypadku skryptu na fejki,
więc potrzebna byłaby zmiana w kodzie.
Aczkolwiek zamiast robić workaround wokół problemu, lepsze byłoby rozszerzenie skryptu, aby wspierał dwa scenariusze wyboru wojsk:
- na podstawie jednostek deffa (oraz ustawieniu 'ratio')
- na podstawie jawnie ustalonych jednostek (wówczas opcja ratio nie ma znaczenia)
Tutaj pytanie czy faktycznie ta druga opcja jest potrzebna; niby fajna, ale w moim odczuciu pierwsza opcja przy sensownych proporcjach w wybranych wioskach jest w zupełności wystarczająca. Przy drugiej opcji wyboru, trzeba też więcej wypełnić.
Na pierwsze pytanie bardziej do community, czy chcecie takie ulepszenie (np. możecie głosować za pomocą reakcji)
Kolejne pytanie jest do
@jarq czy pozwoliłby ewentualnie wprowadzić zmiany opisane wyżej, bo przy ostatniej aktualizacji, był już trochę zgrzyt; "fajne rozszerzenie, ale nie rób więcej"