# Interaction & Animation Editor — poradnik nietechniczny Ten poradnik opisuje, jak ustawiać drzwi, stany obiektów, animacje i kratki interakcji bez grzebania ręcznie w JSON-ie. ## Najważniejszy podział - **Map Builder** mówi, gdzie coś stoi. - **Scenario Editor** mówi, co obiekt robi. - **Interaction & Animation Editor** pomaga dopracować, jak obiekt zachowuje się w zależności od stanu. Przykład: - drzwi stoją na mapie, - gracz ma stan `locked`, `closed` albo `open`, - animacja pokazuje drzwi zamknięte albo otwarte, - kolizja decyduje, czy można przez nie przejść. ## Stany drzwi Najprostszy zestaw: ```text locked — zamknięte na warunek, gracz nie przejdzie closed — zamknięte, ale może da się otworzyć open — otwarte, gracz może przejść ``` Dla drzwi ustaw: ```text Typ: door Stan startowy: locked albo closed Blokuje domyślnie: tak Stany przechodnie: open Stany blokujące: locked,closed ``` To oznacza: drzwi blokują ruch, dopóki ich stan nie zmieni się na `open`. ## Animacje po stanie Jeżeli masz kilka grafik drzwi, dodaj je do `sprite-mapping.json` jako animacje, np.: ```json "animations": { "closed": [{ "tileX": 4, "tileY": 11 }], "opening": [ { "tileX": 4, "tileY": 11 }, { "tileX": 5, "tileY": 11 }, { "tileX": 6, "tileY": 11 } ], "open": [{ "tileX": 6, "tileY": 11 }] } ``` W edytorze ustaw mapowanie: ```text locked -> closed closed -> closed opening -> opening open -> open ``` Czyli stan obiektu wybiera animację. ## Efekty do akcji Żeby akcja otworzyła drzwi, w Scenario Editorze dodaj efekt: ```json { "setObjectState": { "objectId": "OBJ_SERVER_ROOM_DOOR", "state": "open" } } ``` Żeby zamknęła: ```json { "setObjectState": { "objectId": "OBJ_SERVER_ROOM_DOOR", "state": "closed" } } ``` Żeby zablokowała: ```json { "setObjectState": { "objectId": "OBJ_SERVER_ROOM_DOOR", "state": "locked" } } ``` Od v1.3.0 po zmianie stanu silnik przebudowuje kolizje, więc drzwi po stanie `open` faktycznie przestają blokować ruch. ## InteractionTile `interactionTile` to kratka, na której gracz ma stanąć, żeby użyć obiektu. Dla drzwi ustaw ją przed drzwiami, nie na drzwiach i nie za drzwiami. Dobrze: ```text [DRZWI] [GRACZ] <- interactionTile ``` Źle: ```text [DRZWI / interactionTile] <- gracz nie stanie na zamkniętych drzwiach ``` ## Postacie z różnymi kierunkami ruchu Jeżeli masz postać, która wygląda inaczej dla lewo/prawo/góra/dół, w `sprite-mapping.json` ustaw animacje: ```json "animations": { "idleDown": [{ "tileX": 1, "tileY": 0 }], "walkDown": [{ "tileX": 0, "tileY": 0 }, { "tileX": 1, "tileY": 0 }, { "tileX": 2, "tileY": 0 }], "walkLeft": [{ "tileX": 0, "tileY": 1 }, { "tileX": 1, "tileY": 1 }, { "tileX": 2, "tileY": 1 }], "walkRight": [{ "tileX": 0, "tileY": 2 }, { "tileX": 1, "tileY": 2 }, { "tileX": 2, "tileY": 2 }], "walkUp": [{ "tileX": 0, "tileY": 3 }, { "tileX": 1, "tileY": 3 }, { "tileX": 2, "tileY": 3 }] } ``` Silnik sam wybiera animację na podstawie kierunku ruchu gracza. ## Typowy workflow 1. Zbuduj mapę w Map Builderze. 2. Dodaj drzwi/obiekty/NPC. 3. Ustaw interactionTile. 4. Otwórz Interaction & Animation Editor. 5. Wczytaj scenariusz i mapę. 6. Wybierz drzwi. 7. Ustaw stan startowy i walkableStates. 8. Ustaw animacje po stanie. 9. Pobierz mapę JSON. 10. Wklej ją do `data/maps/...`. 11. W Scenario Editorze dodaj akcję otwierającą drzwi. 12. Uruchom Playtest QA. ## Najczęstsze błędy - Drzwi mają stan `open`, ale `open` nie jest w `walkableStates`. - Drzwi mają interactionTile na swojej kratce zamiast przed sobą. - Akcja zmienia stan obiektu, ale wpisano złe `objectId`. - Sprite ma animację `opened`, a obiekt wskazuje `open`. - Postać ma `walkLeft`, ale nie ma `walkRight` i wygląda jak moonwalk po korpo.