Javascript i zdarzenia własne (ang. Custom Event), źródła zdarzeń oraz ich wyzwalanie (ang. Event Dispatching).

Wrzesień 8th, 2011 Jakub Synowiec Brak komentarzy

Przy okazji ostatnich kilku projektów stanąłem przed koniecznością stworzenia w języku Javascript własnego źródła zdarzeń (Event Dispatcher), które pozwalałoby na rejestrowanie słuchaczy i wysyłanie do nich obiektów zdarzenia, gdy tylko takowe wystąpi. Oczywiście mowa tutaj o w pełni własnych zdarzeniach, które wcześniej byłyby rejestrowane lub definiowane w obiekcie źródła.

Klasa takiego źródła stanowiłaby prototyp dla innych klas, a więc mechanizm musiałby być dość przemyślany.

Ostatecznie otrzymałem dwie klasy: jsHelper.EventDispatcher oraz jsHelper.CustomEvent, które przy okazji porządków w moim kodzie wrzuciłem na Github`a do rozwijanej tam biblioteki jsHelper (https://github.com/jakubsynowiec/jsHelpers).

Klasa Zdarzenia Własnego, zdefiniowana została następująco:

   /*
        Class: CustomEvent
    */
    jsHelpers.CustomEvent = function() {
        this.name = arguments[0];
        this.listeners = [];

        /*
            Function: subscribe
                Subscribe an listener to event.

            Parameters:
                fn - Function, event listener
        */
        this.subscribe = function(fn) {
            this.listeners[fn] = fn;
        };

        /*
            Function: subscribe
                Unsubscribe an listener.

            Parameters:
                fn - Function, event listener
        */
        this.unsubscribe = function(fn) {
            if (this.listeners[fn]) {
                delete this.listeners[fn];
            }
        };

        /*
            Function: fire
                Triggers all subscribed listeners
                and passes eventData object to them.
        */
        this.fire = function(eventData) {
            for (var fn in this.listeners) {
                if (fn != null) {
                    this.listeners[fn](this, eventData);
                }
            }
        };
    };

Źródło zdarzeń, wygląda tak:

   /*
        Class: EventDispatcher
            The EventDispatcher class allows to create custom
            events and manage their listeners. Use mostly
            as a prototype for other classes.
    */
    jsHelpers.EventDispatcher = function() {
        this.events = {};

        /*
            Function: addCustomEvent
                Registers a custom event.

            Parameters:
                eventName - String, unique name of a custom event
        */
        this.addCustomEvent = function(eventName) {
            if (this.events[eventName] == undefined) {
                this.events[eventName] = new jsHelpers.CustomEvent(eventName);
            }
        };

        /*
            Function: dispatch
                Dispatches a previously registered
                custom event.

            Parameters:
                eventName - String, unique name of a custom event
                eventArgs - Object, will be passed to event listener
        */
        this.dispatch = function(eventName, eventArgs) {
            var event = this.events[eventName];
            if (event) {
                event.fire(eventArgs);
            }
        };

        /*
            Function: addCustomEventListener
                Registers an listener to previously
                registered custom event.

            Parameters:
                eventName - String, unique name of a custom event,
                fn - Function, custom event listener
        */
        this.addCustomEventListener = function(eventName, fn) {
            var event = this.events[eventName];
            if (event) {
                event.subscribe(fn);
            }
        };

        /*
            Function: removeCustomEventListener
                Unregister an listener from a custom event.

            Parameters:
                eventName - String, unique name of a custom event
                fn - Function, custom event listener
        */
        this.removeCustomEventListener = function(eventName, fn) {
            var event = this.events[eventName];
            if (event) {
                event.unsubscribe(fn);
            }
        };
    };

Użycie k źródła zdarzeń jest bardzo proste. Wszystko co trzeba zrobić, to zarejestrować własne zdarzenie:

myDispatcher.addCustomEvent("onCustomEvent");

A następnie dodać słuchacza zdarzenia:

myDispatcher.addCustomEventListener("onCustomEvent", function onFireListener(event, eventData) {
    alert(event.name + " dispatched, " + eventData.message);
});

Od tego momentu, po wyzwoleniu zdarzenia, zarejestrowani słuchacze danego zdarzenia zostaną powiadomieni o wystąpieniu zdarzenia i obiekty słuchaczy będą mogły wykorzystać przekazane informacje o zdarzeniu.

myDispatcher.dispatch("onHelloWorld", {'length': input.value.length });

I tyle. W obiekcie źródła zdarzeń można rejestrować wirtualnie nieograniczoną ilość zdarzeń własnych (o unikatowych nazwach) oraz słuchaczy dla tych zdarzeń. Po wyzwoleniu zdarzenia, każdy zarejestrowany obiekt słuchacza zostanie powiadomiony o wystąpieniu danego zdarzenia.

Oczywiście zachęcam do klonowania repozytorium, forków, komentarzy, itd…

Sama biblioteka jsHelpers (https://github.com/jakubsynowiec/jsHelpers) będzie rozwijana o różne inne klasy i funkcje, które powstały przez ostatnie miesiące (i pewnie jeszcze powstaną).

Opowiadania z dna szuflady: Łowca demonów cz.1

Wrzesień 8th, 2011 Jakub Synowiec 1 komentarz

Przeglądając pliki datowane na czasy liceum, trafiłem na kilka swoich starych opowiadań i felietonów. Kilka z nich nawet zdziwiło mnie pomysłem ;) Zamieszczam więc „work in progress” jednego opowiadania, może kiedyś je dokończę, kto wie…

 

Ciemność…. Zewsząd otaczała go nieprzenikniona czerń. Przysunąwszy się bliżej ściany wyjął z pochwy jeden z khadaninów. Otwierając wrota, spodziewał się, iż mogą być zabezpieczone którymś z zaklęć Kręgów. Nie przypuszczał jednak, że przywołaną istotą będzie któryś z Wyższych Władców.  Skupiwszy całą swą wolę, łowca spróbował wyczuć aurę przeciwnika. Wystarczył krótki kontakt. Krasnolud potknąwszy się, upuścił broń i złapał obiema rękami za głowę. Takiej potęgi nie spotkał jeszcze chyba żaden z łowców Zakonu Czarnego Młota. W tym momencie demon zaatakował. Znikła zasłona ciemności, a przerażonemu krasnoludowi ukazał się ogromny, uskrzydlony potwór. Sparaliżowany łowca nie zdążył nawet pomyśleć o stawieniu jakiegokolwiek oporu. Wszystkie jego bariery ochronne pękły pod naporem demona. Krasnoludowi nie pomogły nawet potężne artefakty Zakonu. Uświadomił sobie, iż był już martwy w momencie, gdy otwierał portal. Nic nie było w stanie przeciwstawić się potędze tej istoty. Ostatnią rzeczą, jaką usłyszał, był odgłos miażdżonego mithrylu, gdy demon rozrywał jego kolczugę. Później była już tylko ciemność. Stojący pośrodku komnaty demon uśmiechnął się szyderczo. Wiedział, że nie był to ostatni, który będzie próbował otworzyć wrota Thamanu. Za jakieś tysiąc lat pojawi się kolejny śmiałek. Jednak Legenda mówiła, iż będzie to ostatni pojedynek o władzę nad Kręgami.

I – Pierwszy hołd

— …Każdy krasnolud, po osiągnięciu wieku męskiego, staje przed wyborem dalszej drogi dla siebie. Po to właśnie jesteśmy MY. Rada klanu, u początków istnienia naszego rodu, powołała Kastę Mistrzów. Zrzeszeni są w niej przedstawiciele każdego ugrupowania, każdej kasty i każdego zrzeszenia…

Sędziwy krasnolud stojący na podium, sam był znudzony powtarzaniem po raz kolejny tego samego monologu. Spod jego pieczy wyrosło już kilka pokoleń krasnoludzkich mężów. Zastanawiał się, jak długo jeszcze będzie musiał przekazywać tym nieokrzesanym młodzikom tajniki wiedzy Klanu. Z każdym pokoleniem, krasnoludy były jakby bardziej pewne siebie, niezależne. Może się niedługo okazać, iż Kasta Mędrców nie będzie już potrzebna. Wykład krasnoluda został przerwany nieudolną próbą wmieszania się w audytorium nowo przybyłego młodziana.

— Thorn! — Zagrzmiał członek Kasty Mistrzów. — Czy ty nigdy nie potrafisz zjawić się na czas? Gdzie byłeś? Albo lepiej nie mów, pewnie znów siedziałeś u starego Firebreatha i słuchałeś tych nic nie wartych bajek o demonach i Zakonie.

Młody krasnolud zawstydzony spuścił głowę. Wiedział, że to co mówią Mistrzowie, jest ważne, że tylko dzięki wykładom i treningom zapewnionym przez Kastę Mistrzów, może w przyszłości starać się o przynależność do któregoś ugrupowania. Ale opowieści Firebratha były takie ciekawe. Opowiadały o czasach, gdy krasnoludy władały jeszcze magią, istniał legendarny Zakon Czarnego Młota, a krasnoludy były najwspanialszą spośród wszystkich ras Mervenu.

— Tak więc, każdy z was przejdzie pod naszym nadzorem szereg szkoleń, treningów i prelekcji, które pozwolą na określenie jego talentów i predyspozycji. Po dwuletnim okresie nowicjatu, większość z was, zdecyduje się na wybór któregoś z precyzyjnych programów szkolenia, przygotowujących do pełnienia wybranej przez siebie funkcji w Klanie. Tak więc, proszę każdą z grup o udanie się na wyznaczone im zajęcia.

Jaskinia powoli pustoszała, młodzi krasnoludowie wychodzili w grupach po trzech, czterech rozmawiając przyciszonymi głosami. Mistrz zszedłszy z podium, zamierzał udać się do północnego wyjścia, gdy nagle zobaczył stojącego pod ścianą Firebreatha. Gdyby nie obfita broda okalająca jego twarz, zobaczyłby, że krasnolud się uśmiechał.

— Cóż to przyjacielu? Kolejna niesforna grupa młodzianów stara się zrozumieć coś z tych twoich nauk? Pamiętam jakby to było wczoraj, gdy Ja stałem na tym podium, jako jeden z pierwszych Mistrzów, a ty byłeś pośród słuchaczy. Ot kolejny niesforny młodzieniec… — Powiedziawszy to, Firebreath ruszył powoli w stronę drugiego Krasnoluda.

— Witaj stary przyjacielu. Zaiste dawne, czasy wspominasz. Jednakże musisz przyznać, byliśmy pilniejszymi studentami od dzisiejszej młodzieży. Nam nie przyszłoby nawet na myśl spóźnić się na wykład.

— Czyżbyś mówił o Thornie? Ten młody krasnolud przypomina mi mnie w młodości. Mam dziwne przeczucia co do niego.

— Przeczucia przeczuciami, ale szkolenie skończyć musi na równi z innymi. Prosiłbym cię więc, abyś nie zatrzymywał go swoimi historyjkami.

— Jak chcesz Ironstormie. Ale zważ na me słowa: ten młody krasnolud jest inny. Skończy wasz trening, ale nie będzie pasował do żadnego zrzeszenia. — Z tymi słowy, były Mistrz opuścił Ironstorma i wyszedł z sali.

Krasnolud przez chwilę stał jeszcze samotnie wewnątrz monumentalnego dowodu dawnej potęgi krasnoludzkich rzemieślników i zastanawiał się nad słowami przyjaciela. Przecież każdy krasnolud po szkoleniu wybierał jakieś ugrupowanie, a jeśli się wahał, był kierowany przez swego opiekuna na szkolenie najbardziej odpowiednie jego predyspozycjom. Każdy krasnolud miał do czegoś talent. Jedni zostawali inżynierami, inni kupcami lub wojownikami. Zawsze znajdywali dla siebie miejsce, profesję, która im odpowiadała. Jeszcze dwa lata. Jeszcze dwa. Ironstorm wychodząc z jaskini, zamknął za sobą potężne kamienne drzwi i zanurzył się w  korytarzach kopalni. Pusta sala jeszcze przez kilka chwil powtarzała jego ostatnie słowa: Jeszcze dwa lata…. dwa lata…

Komando elfów prawie niezauważalnie przemierzało las. Wprawny obserwator zauważyłby tylko nienaturalnie padające cienie, ale określenie zjawiska je wywołującego było procesem na tyle długim, iż zanim doszedłby do jakichkolwiek wniosków, padłby ze strzałą o zielonych lotkach tkwiącą w tchawicy. Lasy należały do elfów. Nikt bez zgody Rady nie mógł bezpiecznie podróżować pomiędzy drzewami. Zresztą i tak, bez przewodnika, nikt nie był w stanie wejść głębiej na terytorium jakiegokolwiek elfiego rodu, niż pierwsze młodniki. Co odważniejsi służyli za ostrzeżenie dla innych, przypominając humanoidalne jeże leżące pośród drzew. Elfy nie znały litości dla obcych.

Pięciu Tancerzy Wiatru bezszelestnie patrolowało swój obszar granicy. Mieli polecenie natychmiastowego zabicia jakiegokolwiek obcego stworzenia, które zbliżyłoby się do granicy lasu. Elf dowodzący komandem stał na wzniesieniu, obserwując swych podwładnych. Był zadowolony. Jego podwładni byli wspaniale wyszkoleni, znali las, świetnie przystosowywali się do nowych sytuacji. Byli dumni z tego, iż są elfami i bronią swych ziem. Zapewne także trzech z tej czwórki zginie z powodu tej dumy. Zbliżały się niepewne czasy, możliwe, że elfy znów będą musiały otwarcie uczestniczyć w walce. Legenda mówiła o zbliżającym się czasie jako o ostatecznej walce ze złem. Elf osobiście nie wierzył w opowieści starszyzny, ale świat zdawał się potwierdzać ich słowa.

— Sliverze! — Jeden ze zwiadowców wołał do niego z granicy lasu. — Jacyś ludzie zbliżają się do naszych lasów, zdaje się, że należą do któregoś z równinnych plemion. Prowadzeni są przez drova.

— Przygotujcie się do walki. Niech każdy z was wybierze sobie jednego z nich jako cel i będzie gotowy. Wyjdę naprzeciw temu czarnoskóremu elfowi. — Mówiąc to, dowódca komanda schował trzymany w rękach łuk do kołczanu i wyszedł przed ścianę drzew. Zbliżająca się grupa była złożona z sześciu lekkozbrojnych jeźdźców. Wprawne oczy elfa wypatrzyły z pozoru niedbale przymocowaną broń do siodeł, ale postawa jeźdźców sugerowała, że gotowi są natychmiast jej użyć, użyć skutecznie. Oczekując na przybyszów, zastanawiał się, czegóż to ci ludzie mogą chcieć od ich lasów, i czym przekupili elfa mroku? Ciemny elf w środku dnia, do tego będący przewodnikiem równinnych ludzi.

— Bądź pozdrowiony bracie, elfie lasów. — Podchodzący drov nie przypominał przeciętnego przedstawiciela tej rasy. Był nieco niższy i poruszał się z mniejszą gracją. Jednak był lepiej zbudowany i o wiele bardziej ostrożniejszy. Odziany był w skórzaną zbroję z narzuconą na górę kolczugą, na plecach podwójny elfi miecz i łuk kompozytowy. Był myśliwym, który przystosował się do warunków powierzchni. Dowódca komanda uśmiechnął się. Jego ludzie zdążą przebić go strzałami, zanim sięgnie po swoją broń.

— Witaj elfie podziemia. Co cię sprowadza do mych lasów?

— Zwą mnie Arkhan i jestem tropicielem Czarnej Pani. Przybywam do was jako posłaniec Królowej. Mam wiadomość dla waszej rady. Ci ludzie zapewniają mi ochronę na lądach słońca. Prosiłbym więc o doprowadzenie mnie przed oblicze przewodniczącego i opiekę nad mą eskortą. To mówiąc drov odpiął pendent podtrzymujący pochwę miecza oraz łuk. Jego broń ze szczękiem spadła na ziemię. Jakby tego oczekujący jeźdźcy zsiedli z koni i złapawszy je za uzdy, podprowadzili do dwójki elfów.

— Nie często się zdarza spotkać podróżującego po powierzchni, pod eskortą ludzi drova. Zaiste takoż dziwne rzeczy mówisz. Jednakże pakt elfów nadal obowiązuje, las was nie skrzywdzi, masz na to moje słowo. Co do twojej pierwszej prośby – muszę ją rozważyć. — Mówiąc to, Sliver odwołał swoją drużynę z posterunków. Elfy sprawnie rozbiły obozowisko na pograniczu drzew i zajęły się przygotowywaniem posiłku. Noc minęła spokojnie. Tancerze Wiatru pełnili wartę, pozwalając wypocząć podopiecznym. Dowódca komanda nie odpoczywał tej nocy. Rozmyślał nad naukami kapłanów. Nad przepowiednią o ostatecznej walce i towarzyszącej jej Legendzie. Czyżby elfy rzeczywiście miały walczyć na równi z innymi rasami Mervenu o przetrwanie? Zaciskając dłonie, patrzył na śpiącego posłańca i jego ludzi.

Krasnolud zręcznie uniknął ataku. Topór przeciwnika precyzyjnie trafił w miejsce, gdzie przed chwilą znajdowała się jego noga. Przeturlawszy się przez lewe ramię, stanął pewnie na nogach gotowy do przyjęcia kolejnego ciosu. Walka trwała już kilka minut, dwa krasnoludy walczyły wewnątrz placu treningowego. Pochodnie umieszczone na ścianach oświetlały pomieszczenie mętnym, drgającym światłem, powodując mylącą grę cieni. Oprócz dwójki walczących w pomieszczeniu znajdował się jeszcze krasnolud kapłan i wojownik Kasty Mistrzów. Obaj ćwiczący byli odziani jednakowo – ciężkie skórzane kaftany, naramienniki, nagolenniki, rękawice. Całe odzienie było wykonane z grubych płatów wyprawionej skóry, wzmocnionych gdzieniegdzie metalowymi ćwiekami dla dodatkowej ochrony. Jedyną różnicą było uzbrojenie. Jeden z krasnoludów wyposażony był w ciężki stalowy topór bojowy, a w drugiej ręce trzymał małą drewnianą tarczę. Drugi z walczących uzbrojony był w dwa krótkie krasnoludzkie miecze – broń pogardzaną przez większość wojowników, ale bardzo precyzyjną i śmiertelną we wprawnych rękach. Pomimo toczonego pojedynku, obydwa tkwiły nadal w pochwach przerzuconych przez ramiona krasnoluda. Dwa pendanty ściśle opasały klatkę wojownika, zezwalając na błyskawiczne dobycie broni.

Topór prowadzony był nisko, krasnolud odskoczył w tył, markując pad na plecy, w ostatniej chwili miękko odbił się rękami od podłoża i wykonując salto w tył, znów stanął w pewnej odległości od przeciwnika. Drugi z wojowników starając się unieść topór do natychmiastowego kontrataku, o mało nie stracił równowagi. Ten moment wykorzystał drugi z walczących. Rzuciwszy się do przodu, wyjął jeden z mieczy. Wykorzystując pęd nadany mu przez skok, pchnął z całej siły mieczem w ramię przeciwnika. Krasnolud zdążył jedynie zasłonić się tarczą. Cios był tak silny, iż miecz przebił tarczę i zagłębił się w niej prawie po jelec. Atakujący krasnolud nie wypuszczając głowiny broni, wykonał przewrót w przód i wyrwał tarczę przeciwnikowi. Odrzuciwszy bezużyteczną broń, wydobył drugi z mieczy i zaatakował towarzysza. Wprawnie prowadzony miecz przeszedł nad zastawą topora i trafił krasnoluda płazem w hełm. Oszołomiony przeciwnik zatoczył się w tył. Kontynuując natarcie, błyskawicznym ciosem wybił topór z ręki zdezorientowanego przeciwnika, a następnie kopnięciem przewróciwszy przeciwnika na ziemię, przyłożył mu ostrze do piersi. Kapłan z aprobatą pokiwał głową. Krasnolud schował miecz do pochwy i pomógł pokonanemu wstać. W tym momencie podszedł do nich Mistrz.

— Po pierwsze Stormbringerze, atakując toporem, należy wykonywać szybkie ciosy, a nie machać nim jak rzeźnik. — Popatrzył z naganą na drugiego krasnoluda. — Nie ciesz się tak Thornie. Z tobą porozmawiam za chwilę. Idź, pozbieraj rozrzucony ekwipunek.

Młody krasnolud ze spuszczoną głową, tłumiąc w sobie złość, odszedł w kierunku tarczy Stormbringera.

— Wykonując zasłonę tarczą, należy odbić broń przeciwnika lub pozwolić jej zsunąć się swobodnie po powierzchni, zmuszając w ten sposób przeciwnika do rozproszenia energii ataku… — Kontynuował swój wykład krasnoludzki wojownik.

Krasnoludzki kapłan obserwował trójkę opuszczającą salę ćwiczeń. Mistrz przez cały czas lekceważył drugiego krasnoluda, udzielając rad i tłumacząc tajniki walki tylko topornikowi. Kamienne wrota zamknęły się za krasnoludami. Wewnątrz pozostał zamyślony kapłan i otaczająca go cisza. Długa chwila minęła, zanim się poruszył.

— Czy oni naprawdę nie zdają sobie sprawy z jego prawdziwego potencjału? — Wyszeptał w pustkę i zgasiwszy pochodnie, opuścił jaskinię.

Komnatę wypełniało zatęchłe powietrze przesycone zapachem różnych odczynników chemicznych. Grupka krasnoludów otaczała zwartym kręgiem umieszczony centralnie stół, przy którym stał siwobrody wykładowca.

— Jak już zapewne wiecie, najważniejszym osiągnięciem krasnoludzkiej inżynierii było wynalezienie maszyny parowej i prochu. Dzisiaj zajmiemy się tym drugim odkryciem. — Przerwał i zaczerpnął powietrza. Była to już ósma grupa dzisiaj, której musiał wbijać w te durne łby to samo. Odczuwał już znużenie niekompetencją i ignorancją słuchaczy.

— Tak więc, odkrycie prochu było wynikiem przypadku. Jeden z pierwszych inżynierów poszukiwał jakiejś metody na przyśpieszenie prac wydobywczych w jednej z kopalń naszego klanu… — Krasnolud rozpoczął długi monolog na temat samej historii jak i metody powstania prochu. Kilkakrotnie udało mu się całkowicie zmienić temat, ale nikomu to nie przeszkadzało. Większa część słuchaczy dawno już zasnęła lub zajmowała się rzeczami całkowicie nie związanymi z analizą faktów podawanych przez wykładowcę. Większość. Jeden z krasnoludów w skupieniu chłonął każde słowo starego inżyniera. Nie wyróżniał się niczym szczególnym, poza palcami umazanymi inkaustem i lekko zakurzoną brodą.

— … i tak właśnie dokonano pierwszej próbnej detonacji. — Zadowolony z siebie krasnolud popatrzył po zgromadzonych. Zamyślony nie zauważył, jak ciekawska grupka słuchaczy odpaliła lont ładunku próbnego. Uświadomił go dopiero nagły huk i obłok dymu. Przerażony rozejrzał się po sali, w miejscu gdzie jeszcze przed chwilą stał stół z odczynnikami, teraz znajdowała się tylko osmolona plama na posadzce i kilka dopalających się kawałków drewna. Całość dopełniało czterech ogłuszonych krasnoludów z nadpalonymi brodami. Inżynier ze smutkiem pokręcił głową. Oni nigdy nie zrozumieją wspaniałości krasnoludzkiej inżynierii. Popatrzył na zgromadzonych.

—      Nie, tego na trzeźwo się nie da… — Westchnął i oddelegował krasnoludy na następne zajęcia.

Czy po to spędziłem swoją młodość jako inżynier Zakonu, a później dowodziłem oddziałami strzelców, aby teraz bezskutecznie starać się wpoić tym idiotom, jak ważna dla nas jest inżynieria? Dostrzegł go dopiero, gdy usłyszał nieśmiałe pokasływanie. Strapiony podniósł wzrok i dostrzegłszy źródło dźwięku, jakby nadal nie umiejąc zrozumieć, czego się od niego wymaga, zapytał:

— Słucham? W czym ci mogę pomóc drogi studencie?

Młody krasnolud, starając się jak najbardziej schować własną osobę, niepewnie popatrzył na starego inżyniera.

— Mistrzu inżynierze. Chciałbym poświęcić się technice. Chciałbym zostać inżynierem tak jak ty mistrzu. — Mówiąc to, wyprostował się i hardo popatrzył na swojego rozmówcę.

— Czy jesteś pewny swojego wyboru? Nie minął jeszcze wasz dwuletni okres inicjacji. Rozpoczynając naukę inżynierii, nie będziesz miał już możliwości zmiany decyzji.

— Tak, Mistrzu Inżynierze. Jestem pewny

— Udaj się więc do Mistrza Ironstorma i powiedz mu, że Firebreath daje ci swoją promocję. Mistrz Ironstom się tobą zajmie, a teraz odejdź. Muszę pomyśleć. — Mówiąc to powrócił do zbierania szczątków byłego stołu.

— Przynajmniej jeden… — Wymruczał spojrzawszy na kupkę niedopalonego prochu, jakby od niechcenia zgarnął ją na szuflę i wrzucił do wiadra. W oczekiwaniu na kolejną grupę uczniów, rozpoczął układanie porozrzucanych odczynników.

 

To be continued… maybe..someday….