# Summon Action Manager
> czyli jak ja bym to zrobił. Nie wiem czy to najlepszy pomysł i czy nie będzie w związku z tym jakichś problemów. Na ten moment ja bym spróbował coś takiego po prostu.
### Definicje
1. Akcja (np. Summon) - scriptable object z klasy ActionDefinition
2. Action Manager - gameobject z glownym mono behaviourem dziedziczacym po ActionBehaviour, ktory decyduje o tym jak wykonywana jest dana Akcja.
3. Playable - gameobject, który zawiera PlayableDirectora, timeline, vfx'y i inne komponenty wspierające dla summona konkretnego yokaia. Playable zawiera główny komponent "ActionPlayable"
4. Signal - event, który można wywołać z poziomu timeline
### Założenia
1. Robimy nowy Action Manager na wzór obecnego. Z tą jednak różnicą, że ograniczamy jego działanie do minimum i wystawiamy w nim publiczne metody (np. make room dla nowego pawna), które wywoływane będą z timeline.
2. To, jakie efekt będzie towarzyszyl summonowi przesuwamy z definicji pawna do danych zawartych w Action Managerze dla summona (tak jak w moim przypadku jest zrobiona tablica playables).
3. Podpinamy nowy Action Manager do Akcji summona + zmieniamy driver akcji na "Code Only"
4. Timeline kontroluje momenty, w którym np. Aktywujemy obiekt yokaia i Dezaktywujemy obiekt targetu Akcji (track `ActivationTrack`), kiedy startuje się VFX (`VisualEffectActivationTrack`), kiedy oraz jakie animacje są odpalane (`Animationtrack`), kiedy i jak pracują kamery (`CinemachineTrack`). Teoretycznie mozna by było jednym Timeline'm kontrolować inny, np. zagnieżdzony, ale chyba na ten moment nie ma takiej potrzeby.
### Action Flow
1. Gracz wybiera akcje summon u toshiro, podświetlają sie dostępne postaci, z których można przywołać jokaja.
2. Klikamy w dostępną postać. Odpala się metoda `Run` z ActionManagera. W tej metodzie powinniśmy
2.1. utworzyć ukryty obiekt yokaia.
2.2. utworzyć Playable, odpowiedni dla tego yokaia, którego spawnujemy
2.3. ogarnąć wszystkie powiązania naszych obiektów na Playable (ownera akcji, targetu akcji, yokaia itp.) do timeline. Częśc z tego (najbardziej podstawowa, czyli kamery i owner/target akcji robione jest w ActionPlayable, ale większe mozliwosci sa w komponencie TimelineBinder.). TimelineBinder komponent trzeba by było jednak rozszerzyć po to, żeby można było wiązać jeden obiekt (np. yokaia) z kilkoma trackami w timeline (np. z trakiem aktywacji, trakiem animacji itp.). Mozna do tego wykorzystac system, w ktorym nazywamy odpowiednio tracki na timelinie i pozniej robimy podmianki na tej podstawie. Tak to działa w `TimelineBinder`, ale trzeba rozbudować żeby można było bindować jeden do wielu.
2.4. aby z poziomu playable (a w zasadzie timeline) mozna było kontrolować rzeczy w ActionManagerze trzeba by było wykorzystać tracka z signalami. Na tym GameObject'cie w Playable, który zawiera `PlayableDirector` dodałbym SignalReceiver i potworzył odpowiednie assety Signal'i do eventów, np. jak MakeRoom. Działać to powinno tak, że Timeline wywołuje Signal w danym momencie. Signal odbierany jest przez `SignalReceiver` i przekazywany do `ActionPlayable`. ActionPlayable powinno mieć ustawioną referencje do ActionManagera i wywołać odpowiednią metodę już w managerze.
3. ActionPlayable powinien nasłuchiwać na event zakończenia odtwarzania timeline'u i poinformować o tym `ActionManager` lub wywołać na nim metodę `ActionComplete`, żeby zakończyć proces.