tjurczyk / arkadia

Skrypty mudletowe dla Arkadii
18 stars 17 forks source link

Automatyczne uzupełnienie brakujących Gag-ów #318

Open pprraavv opened 6 years ago

pprraavv commented 6 years ago

Wiele broni ma unikalne opisy, które umykają skryptom przypisującym im liczbowe obrażenia [0/6], [3/6], itp. Wynika to głównie z tego, że często takie opisy nie zawierają zwrotów typu "lekko ranisz", przez co nie wiadomo jaką wartość [X/6] im przypisać. Inna sprawa, że takich broni jest dość dużo, i ciężko opisać wszystkie.

Furtkę do takiego uzupełniania bez indywidualnego wyciągania triggerów otwiera GMCP_msg. Można z stamtąd wyciągnąć linijki z tagami:

combat.avatar - komunikaty walki postaci gracza
combat.team - komunikaty walki druzyny postaci gracza
combat.others - komunikaty walki innych osob

I jeżeli dla nich nie istnieją Triggery w katalogu gag, to zamiast pomijania opisów można: a) wersja uproszczona: przypisać im wartość [X/X] - gracz "wie ze coś sie dzieje", choć nie wie jak bardzo. b) wersja zaawansowana: można w uniwersalny sposób wyciągnąć przybliżoną siłę ciosu korzystając z... kolorowania(!)

Podejście b) jest bardziej skomplikowane, ponieważ wymaga:

  1. Gracz musi ustawić sobie dla każdego z typu ciosów inny (i najlepiej niepowtarzalny) kolor - dla estetów dbających o kolorystykę nie musi to być duży problem, bo kolory mogą różnić się nieznacznie odcieniami (oko może nawet nie wychwycić różnicy, a skrypt rozpozna kategorie)
  2. Skrypt przy inicjacji musi np. przez GMCP: Char.Colors wyciągnąć (i przekonwertować na RGB) kolory przypisane obrażeniom: high_inflicted_damage, high_received_damage, medium_inflicted_damage, medium_received_damage, low_inflicted_damage, low_received_damage, no_inflicted_damage, no_received_damage
  3. Skrypt podczas gry jeżeli wykryje, że linijka dotyczy walki (combat.avatar, combat.team, combat.others) i nie dostała żadnego gagu ze standardowych triggerów, może przypisać mu gag na podstawie koloru ostatniego znaku z linijki:
    selectSection(string.len(line)-1,1)
    r,g,b = getFgColor()

Tym sposobem każdy nie opisany wcześniej cios można skategoryzować w trójstopniowej skali:

to samo można zrobić dla obrażeń zadanych:

Podsumowując:

pprraavv commented 6 years ago

Uzupełnię jeszcze opis o obejście małego problemu, na który natrafiłem rzeźbiąc w kolorach samodzielnie. Zauważyłem, że przy tej samej konfiguracji klient Webowy wyświetla inne kolory, Mudlet nieco inne. Dodatkowo dochodzi problem konwersji koloró ANSI (tu akurat jest komenda) i XTERM (???) na RGB.

Przy inicjacji można to ominąć stosując zamiast GMCP skrypt, który jednorazowo zmapuje ustawione kolory tak, jak widzi je Mudlet. Skrypt musi wysłać komendę kolory i wyłapać jak (w skali RGB) są widziane kolory przypisane potrzebnym linijkom (np.: jaki kolor ma zwrot "niskie zadane obrazenia")

Taką inicjację trzeba uruchamić po każdych modyfikacjach kolorów

tjurczyk commented 6 years ago

Z tego co widze to feedTriggers(text) nie dostarcza informacji, czy jakikolwiek z grupy triggerow odpalil. Nie widze prostego sposobu aby wykrywac, ktore teksty przychodzace w gmcp.msgs sa rozpoznawalne, a ktore nie. Jakies pomysly?

pprraavv commented 6 years ago

Jeśli można po feedTriggers(text) sprawdzić pierwszy znak tego co triggery zwróciły, to pierwszy znak przemielonej przez triggery linijki mówi o tym, czy zastosowano gagi: jeśli linijka dotyczy walki (z gmcp) i a po feedTriggers jej pierwszy znak <>"[", to standardowe gagi nie zadziałały.

Jeśli nie można sprawdzać jak wygląda linijka po triggerach, to hm... może obejściem jest dopisanie do każdego triggera zerowanej przed feedTriggers(text) flagi (zagagowano=true)

tjurczyk commented 6 years ago

Triggery to postprocessing, nie mozesz miec triggerow po triggerach... :)

Drugie rozwiazanie byc moze jest teoretycznym rozwiazaniem, ale obawiam sie wydajnosci tego. Niestety, tutaj chyba jedynym rozwiazaniem bedzie all or nothing. Czyli opcja, dzieki ktorej bedzie mozna wybierac czy gagowanie robic z tekstow, czy automatycznie z gmcp na podstawie wyluskiwanych kolorow.

pprraavv commented 6 years ago

Nie wiedziałem, że nie można mieć triggerów po triggerach. Ale zazwyczaj rzeczy niemożliwe są rozwiązywane przez osoby, które nie wiedzą że jest to niemożliwe, więc warto próbować. Skoro triggery są uruchamiane na końcu przetwarzania, to może odwrócić kolejność gagowania i:

  1. Każdą linijkę z walką oznaczyć skryptami na podstawie kolorów w skali [0/3]-[3/3]
  2. Później triggerami (tam gdzie zadziałają) nadpisać oznaczenie dokładniejszym gagiem ([0/6] lub [0/8]).