Skocz do zawartości

Zadania | Zabicie mutanta "Press F To Win" [CoP]


Gość Diegtiariow

Rekomendowane odpowiedzi

Gość Diegtiariow

701a2f45b7b652b72.jpg

NAZWA: Zadania | Zabicie mutanta "Press F To Win" [CoP]
TWÓRCA: FantomICW, użyto prac z NPŚ
POZIOM TRUDNOŚCI: ŚREDNI

 

Stosunkowo niedawno użytkownik ap-pro Telnov1996 zadał jedno pytanie:

Cytat

Czy możliwe jest zorganizowanie oskryptowanych scen walki z mutantami 'Press "F" to win'?

Do dyskusji włączył się drogi Dorian23Grey, i właściwie ja. Sytuacja wygląda następująco:
1. Po pierwsze, na X-Ray sceny z animacjami w stylu CoD, Metro itp. nie są zbyt wygodne do zrobienia.
2. Wymagana jest doskonała umiejętność animacji obiektów.
3. Musisz ustawić interakcję logiki z timerami i animacjami.
W tej chwili bardzo mało kto to zrobił. Jednak wariant, gdy GG zbliża się do mutanta i zostaje uruchamiony samouczek, po którym następuje wykonanie zabójstwa, jest całkowicie wykonalną funkcją.
Załóżmy, że na Zatonie w obrębie Północnego jeziora osiedlił się wyjątkowy bagienny pseudo-olbrzym, którego nie biorą kule stalkerów. Jedynym szybkim sposobem na pozbycie się go, jest aktywacja artefaktu grawitacyjnego. Gdy GG podejdzie do mutanta z artefaktem, rozpocznie się samouczek z napisem "Aktywuj artefakt". Po wciśnięciu F, uruchomi się funkcja, która stworzy na miejscu mutanta cząsteczkę rozerwania od anomalii grawitacyjnej.

 

PRZYGOTOWANIE DO DZIAŁANIA:

Spoiler

NARZĘDZIA:

Spoiler

- Notepad++

- Paint.NET, Adobe Photoshop lub inny edytor tekstur (jeśli ktoś zechce tworzyć unikalną teksturę)

 

TEKSTURA:

Spoiler

Jeszcze raz, jeśli chcesz stworzyć unikalną teksturę dla swojego mutanta to proszę. Warto zrobić nowy model lub teksturę, bo super fajny pseudo-gigant powinien się jakoś wyróżniać na tle swoich krewnych. Twórca lekcji zrobił słowną "reteksturę" (w cudzysłowie, bo żeby wymazać trochę krwi i "zazielenieć" teksturę - nie można tego nazwać reteksturą) potwora do bagna:

9e02cdbcb63faa35.png

Jeśli ktoś potrzebuje tekstury, to bierzcie (dołączony jest standardowy bump).

 

CZĄSTECZKI/PARTICLES:

Spoiler

Dla dobrego efektu rozerwania ciała w anomalię, warto użyć cząsteczek od AMK:

amk\\blow_body
amk\\zomb_explode

Kto je ma (lub ma zamiennik) - super, dobrze. Dla tych, którzy ich nie mają, nie martwcie się, trochę później zostaną wrzucone gotowe particles.xr, ale na razie zostaną dołączone dwie wersje tabeli cząsteczek dla obu przypadków.

 

KOORDYNATY/WSPÓŁRZĘDNE:

Spoiler

Jeśli pracujecie nie w SDK, ale z ACDC, to będziecie musieli wziąć współrzędne miejsca, w którym będzie znajdował się mutant. Miejsce akcji (w przybliżeniu) zaznaczono na mapie:

1.jpg

Twórca pochodził trochę do przodu do wody i odczytał współrzędne:

d7f5e24623.jpg

-19.00901222229,-7.0012526512146,526.37811279297,907875,47

 

 

 

PRAKTYKA:

Spoiler

CZĘŚĆ I - KONFIGI DIALOGÓW:

Spoiler

1. W configs/gameplay/dialogs_zaton.xml dodajemy dwa nowe dialogi:

<dialog id="zat_super_psevdogig_take_task_dialog"> <!--Wzięcie zadania-->
                <dont_has_info>psevdogig_task_dialog_done</dont_has_info>
                <phrase_list>
                    <phrase id="0">
                        <text>zat_super_psevdogig_take_task_dialog_0</text>
                        <next>1</next>
                    </phrase>
                    <phrase id="1">
                        <text>zat_super_psevdogig_take_task_dialog_1</text>
            <next>2</next>
                    </phrase>
           <phrase id="2">
                        <text>zat_super_psevdogig_take_task_dialog_2</text>
            <next>3</next>
                    </phrase>
           <phrase id="3">
                        <text>zat_super_psevdogig_take_task_dialog_3</text>
            <next>4</next>
                    </phrase>
           <phrase id="4">
                        <text>zat_super_psevdogig_take_task_dialog_4</text>
            <next>5</next>
                    </phrase>
           <phrase id="5">
                        <text>zat_super_psevdogig_take_task_dialog_5</text>
            <give_info>psevdogig_task_dialog_done</give_info>
            <action>dialogs_zaton.give_super_psevdogig_task</action> <!--Wydajemy GG zadanie i artefakt-->
                    </phrase>
                </phrase_list>
            </dialog>
         <dialog id="zat_super_psevdogig_task_end_dialog">
             <has_info>zat_super_psevdogig_af_activation</has_info>
                <dont_has_info>psevdogig_task_finished</dont_has_info>
                <phrase_list>
                    <phrase id="0">
                        <text>zat_super_psevdogig_task_end_dialog_0</text>
                        <next>1</next>
                    </phrase>
           <phrase id="1">
                        <text>zat_super_psevdogig_task_end_dialog_1</text>
            <give_info>psevdogig_task_finished</give_info>
            <action>dialogs_zaton.give_super_psevdogig_task_reward</action> <!--Wydajemy nagrodę-->
                    </phrase>
                </phrase_list>
            </dialog>

2. Dopisujemy je Brodaczowi (sekcja zat_a2_stalker_barmen, plik character_desc_zaton.xml)

<actor_dialog>zat_super_psevdogig_take_task_dialog</actor_dialog>
          <actor_dialog>zat_super_psevdogig_task_end_dialog</actor_dialog>

3. W configs/text/rus/st_dialogs_zaton.xml umieszczamy tekst dialogów:

<string id="zat_super_psevdogig_take_task_dialog_0">
          <text>Co słychać, Broda? Jest coś nowego?</text>
         </string>
         <string id="zat_super_psevdogig_take_task_dialog_1">
          <text>Cześć. Nic ciekawego nie ma z wyjątkiem tego, że na Północnym jeziorze pojawił się uber-pseudogigant, który nie daje stalkerom (i pseudomięsaczom też, co tu dużo mówić) spokoju... Stwór jest nie do zabicia.. Po naradzie z Gontą, postanowiliśmy spróbować usunąć go za pomocą artefaktu (mówię o pseudogigancie). Odpowiedni artefakt mam, brakuje tylko ochotnika dla tego zadania...</text>
         </string>
         <string id="zat_super_psevdogig_take_task_dialog_2">
          <text>Wiesz.. mógłbym wam pomóc.</text>
         </string>
         <string id="zat_super_psevdogig_take_task_dialog_3">
          <text>Spadłeś z Cementowni? Ta cholera może ciebie w trymiga położyć... Kto później będzie mi arty przynosił? Na kim Pilot będzie zarabiał? Krótko mówiąc, jesteś pewien, że chcesz pomóc?</text>
         </string>
         <string id="zat_super_psevdogig_take_task_dialog_4">
          <text>Tak. Nudzę się, po prostu)00)).</text>
         </string>
         <string id="zat_super_psevdogig_take_task_dialog_5">
          <text>A, okej, powodzenia. Trzymaj "Grawi" dla aktywacji. Bądź ostrożnyБудь аккуратен.</text>
         </string>
         <string id="zat_super_psevdogig_task_end_dialog_0">
          <text>Możesz spać spokojnie, staruszku. Nie ma więcej twojego uber-pseudogigabajta.</text>
         </string>
         <string id="zat_super_psevdogig_task_end_dialog_1">
          <text>Wow, słuchaj, co za spoko gość! Weź sobie ciastko.</text>
         </string>

I to wszystko, jeśli chodzi o dialogi. Tutaj wszystko jest proste, więc twórca uznał, aby się szczegółowo o nich nie rozpisywać. Jeśli ta część wydawała ci się trudna, sorry, ale ta lekcja nie jest dla twojego poziomu wiedzy.

 

CZĘŚĆ II - KONFIG ZADANIA:

Spoiler

1. W configs/misc/tm_zaton.ltx dodajemy sekcję zadania:

[zat_super_psevdogig_task]
icon = ui_inGame2_Logovo_krovososov
prior = 10
storyline = false
title = {+zat_super_psevdogig_af_activation} zat_super_psevdogig_task_2, zat_super_psevdogig_task_1
descr = {+zat_super_psevdogig_af_activation} zat_super_psevdogig_task_2_text, at_super_psevdogig_task_1_text
target = {+zat_super_psevdogig_af_activation} zat_a2_stalker_barmen, zat_super_psevdogig_squad
condlist_0 = {+psevdogig_task_finished} complete

Trochę analizy:
- ikonka jest z zadania na usunięcie legowiska pijawek
- zadanie ma dwie fazy: część na likwidację mutanta i część, która wymaga rozmowy z Brodaczem (na tą część, aktualizacja następuje po otrzymaniu infoportion zat_super_psevdogig_af_activation, wrócimy do niej później)
- w pierwszej części, znaczek zadania pada na oddział/squad/obóz mutanta (jego story_id - zat_super_psevdogig_squad), w drugiej - na Brodacza
- zadanie kończy się po otrzymaniu informacji psevdogig_task_finished, która jest wydawana w już stworzonym przez nas dialogu
Jak widzicie, struktura zadania jest bardzo prosta.

2. Dopisujemy do configs/text/rus/st_quests_zaton.xml jego tekstową część:

 <string id="zat_super_psevdogig_task_1">
        <text>Pomoc leworękim: zlikwidować uber-pseudogiganta</text>
       </string>
       <string id="zat_super_psevdogig_task_1_text">
        <text>Miałem rację: wszyscy stalkerzy na Zatonie to krzyworękie bałwany. Muszę za nich usunąć bardzo silnego mutanta na Północnym jeziorze na Zatonie.</text>
       </string>
       <string id="zat_super_psevdogig_task_2">
        <text>Pomoc leworękim: złamać Brodzie nos</text>
       </string>
       <string id="zat_super_psevdogig_task_2_text">
        <text>Chcę powiedzieć kilka słów Brodaczowi. Czemu do jasnej cholery, ten grubas w egzoszkielecie nie powiedział, że na jeziorze czeka na mnie nie uber-pseudogigant, a Zatonowska Hydra?</text>
       </string>

Przechodzimy do konfigów mutanta.

 

CZĘŚĆ III - KONFIGI MUTANTA:

Spoiler

1. Plik configs/creatures/m_giant.ltx. Robimy sekcję naszego unikalnego pseudogiganta. Będzie ona praktycznie podobna do zwykłego pseudogiganta:

[super_psevdogig]:m_gigant_e
$spawn    = "monsters\gigants\super_psevdogig"
visual    = monsters\psevdogigant\psevdogigant_uber   ;To nowy model
corpse_visual      = monsters\psevdogigant\psevdogigant_uber_dead   ;To też
rank    = 50  ;Zwiększamy rangę
spec_rank   = strong   ;Pseudogigant Strong!
radiation_pp_effector_name    =  postprocess_acidic   ;Dodajemy kwaśny/chemiczny postprocess
attack_params   = super_psevdogig_attack_params  ;Nowa sekcja parametrów ataku

[super_psevdogig_attack_params]  ;Zwiększony impuls
;--------------------------------------------------------------------------------------------------------------------------------------------    -
;    anim   | time[0..1] | hit_power | impulse | impulse_dir (x,y,z)   |    Field of hit_test  (left,right, top, bottom) |    Test Dist
;--------------------------------------------------------------------------------------------------------------------------------------------    -
;Bite
stand_attack_0 =    0.25,  0.9,     200,        0.5, 1.0, 0.5,   -0.8, 0.8, -1.8, 1.8,       2.6
;Left leg Strike
stand_attack_1 =    0.40,  0.9,     150,        5.0, 2.5, 4.0,   -0.6, 0.6, -1.8, 1.8,       3.2
;Bite2
stand_attack_2 =    0.25,  0.9,     200,        0.5, 1.0, 5.0,   -0.8, 0.8, -1.8, 1.8,       2.6
stand_attack_run_0=     0.5,  0.9,     600,        0.5, 1.0, 5.0,   -0.6, 1.3, -1.8, 1.8,       3.3
jump_attack_1    =  0.1,  2.00,  1600,       0.5, 1.0, 5.0,   -1.0, 1.3, -1.6, 1.6,       5.5

2. Następnie trzeba stworzyć oddział/obóz mutantowi w configs/misc/squad_descr_zaton.xml:

[zat_super_psevdogig_squad]:online_offline_group
faction = monster_special     
npc = super_psevdogig  ;NPC w oddziale - nasz pseudogigant
target_smart = zat_sim_2  ;Docelowy smart - wysepka na Północnym jeziorze
spawn_point = zat_sim_2_giant_home  ;Spawn point - punkt "legowiska" dla mutanta
story_id = zat_super_psevdogig_squad  ;Sid zbiega się z nazwą sekcji (wasz Кэп)

 

 

CZĘŚĆ IV - LOGIKA MUTANTA:

Spoiler

1. Przede wszystkim otwórz plik logiki smartu wysepki - configs/scripts/zaton/smart/zat_sim_2.ltx, a na dole dodaj sekcję exclusive z linkiem do ekskluzywnej logiki giganta:

[exclusive]
giant = zaton\zat_sim_2_super_psevdogig.ltx

W związku z tym, logika naszego mutanta nazywa się giant.

2. Przechodzimy do samej logiki. Tworzymy plik zaton\zat_sim_2_super_psevdogig.ltx. Dopełniamy go:

[logic@giant] ;Nazwa logiki - giant (patrzymy wyżej)
suitable = {=target_squad_name(zat_super_psevdogig_squad)} true ;Logika jest dostępna tylko dla potwora z naszego squada/obozu/oddziału
monster_job = true
prior = 200
active = mob_home@giant

[mob_home@giant]
on_info = %=restore_health% ;Zdrowie mutanta ciągle się zwiększa
;Jeśli dystans do GG jest mniejszy niż 7 metrów i GG ma kwestowy artefakt, a aktywnego tutorialu nie ma, to uruchamia się tutorial rozwalenia pseudogiganta:
on_info2 = {=dist_to_actor_le(7) =actor_has_item(super_psevdogig_af_gravi) !has_active_tutorial} %=run_tutorial(zat_super_psevdogig_af_tutor)%    
;Jeśli dystans do GG jest większy niż 7 metrów i GG ma kwestowy artefakt, a tutorial został uruchomiony, to włącza się tutorial likwidacji pseudogiganta:
on_info3 = {=dist_to_actor_ge(7) =actor_has_item(super_psevdogig_af_gravi) =has_active_tutorial} %=stop_tutorial%    
;Po otrzymaniu informacji "zat_super_psevdogig_af_activation", zabijamy NPC funkcji "kill_npc" z xr_effects.script:
on_info4 = {+zat_super_psevdogig_af_activation} %=kill_npc%
;Po otrzymaniu informacji "zat_super_psevdogig_af_activation_begin", usuwamy NPC wogóle i uruchamiamy cząsteczki anomalii/rozerwania za pomocą nowej funkcji   
on_info5 = {+zat_super_psevdogig_af_activation_begin} %=zat_super_psevdogig_explode_2%
path_home = giant_home ;W way_zaton.ltx to - zat_sim_2_giant_home ("legowisko")
;Ustawienia ochrony "legowiska":
home_min_radius = 20
home_max_radius = 50
aggressive = true

3. Nadszedł czas użycia wcześniej uzyskanych koordynatów/współrzędnych. Rozpakowujemy all.spawn z pomocą ACDC lub używamy SDK Level Editor, aby stworzyć punkt dla potwora w way_zaton.ltx:

[zat_sim_2_giant_home]
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = -19.00901222229,-7.0012526512146,526.37811279297
p0:game_vertex_id = 47
p0:level_vertex_id = 907875

Zbieramy do kupy spawn.

 

CZĘŚĆ V - KONFIG KWESTOWEGO ARTEFAKTU I TUTORIALU:

Spoiler

1. W logice wspomnieliśmy już o przedmiocie super_psevdogig_af_gravi. To jest sekcja kwestowego artefaktu, który będziemy aktywować. Otwieramy configs/misc/quest_items.ltx i dodaj go tam:

[super_psevdogig_af_gravi]:device_pda
visual    = dynamics\artefacts\af_gravi.ogf
description   = st_af_gravi_descr
inv_name   = st_af_gravi_name
inv_name_short  = st_af_gravi_name
inv_weight   = 0.5
inv_grid_x   = 15
inv_grid_y   = 0
cost    = 12000
can_trade   = false ;Nie wolno sprzedać
quest_item          = true ;Nie wolno wyrzucić
story_id            = super_psevdogig_af_gravi

Standardowa sekcja kwestowego przedmiotu z "rodzicem" device_pda.

2. Również w logice ogłosiliśmy uruchomienie tutorialu:

%=run_tutorial(zat_super_psevdogig_af_tutor)%

Wszystkie tutoriale gry znajdują się w pliku configs/ui/game_tutorials.xml. Jest całkiem możliwe, że poniższa sekcja może wydawać się dziwna. W rzeczywistości wszystko jest proste, ale warto lepiej przeanalizować to w osobnych lekcjach odnośnie HUD'a i GUI, więc teraz nie musisz się tym martwić. Najważniejsze parametry:

<zat_super_psevdogig_af_tutor> <!--Nazwa-->
          <global_wnd/>      
             <item>      
                 <disabled_key>quit</disabled_key>      
                 <length_sec/>      
             
        <!--Po naciśnięciu F, jest uruchamia się funkcja xr_effects.zat_super_psevdogig_explode_1-->
                 <action id="use" finalize="1">xr_effects.zat_super_psevdogig_explode_1</action>      
                 <guard_key>use</guard_key>
        <!----Niżej są już inne parametry-->
                 <grab_input>0</grab_input>      
                     <main_wnd>
                     <!--Różne parametry tekstu. Ustawiono czcionkę na 32 i czerwony kolor (RGB). Sekcja tekstu - st_tutor_af_activation-->         
                     <auto_static start_time="0" length_sec="5000" x="512" y="660" width="300" height="60" alignment="c" stretch="1"la_cyclic="1" la_texture="1" la_alpha="1">      
                     <text font="graffiti32" r="225" g="36" b="36" a="255" align="c">st_tutor_af_activation</text>      
                     </auto_static>      
                     </main_wnd>      
             </item>      
         </zat_super_psevdogig_af_tutor> <!--Tutaj sekcja tutorialu kończy się-->

3. Następnie dodajemy sekcję tekstową st_tutor_af_activation, na przykład do pliku ui_st_screen.xml:

<string id="st_tutor_af_activation">        
       <text>Aktywować artefakt ($$ACTION_USE$$)</text>
      </string>

$$ACTION_USE$$ oznacza klawisz "Użyj". Jest to domyślnie klawisz F.

 

CZĘŚĆ VI - SKRYPTY WSZYSTKIEGO:

Spoiler

1. Zacznijmy od dialogów. W każdym z dwóch uruchamiamy po jednej funkcji. Obie funkcje są w dialogs_zaton.script. Pierwsza:

function give_super_psevdogig_task(first_speaker, second_speaker)
        dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, "super_psevdogig_af_gravi") --Wydajemy "Grawi"
        task_manager.get_task_manager():give_task("zat_super_psevdogig_task") --Wydajemy zadanie
     xr_effects.create_squad(nil, nil, {"zat_super_psevdogig_squad", "zat_sim_2"}) --Spawnujemy squad/obóz/oddział potwora na smart'cie "zat_sim_2"
end

W drugiej będziemy wydawać nagrodę:

function give_super_psevdogig_task_reward(first_speaker, second_speaker)
     local items_pack = {
         {item = "energy_drink", amount = 2},
         {item = "medkit_army",  amount = 3},
         {item = "antirad",      amount = 2},
         {item = "vodka",        amount = 1},
         {item = "conserva",     amount = 3},
     }
         
     for k,v in pairs(items_pack) do
         dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, v.item, v.amount)
     end
         
        dialogs.relocate_money_to_actor(first_speaker, second_speaker, 3000)
end

Używamy słownie złożonej tablicy items_pack. Każdy jej element składa się z dwóch punktów:
item - sekcja przedmiotu
amount - ilość, którą trzeba wydać
Później jest cykl w postaci standardowego
for k,v in pairs(nazwaTablicy) do
To oznacza, że funkcja niżej może zostać wykonana dla każdego elementu tablicy (v). U nas jest to:

dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, v.item, v.amount)

Zwróćcie uwagę na v.item i v.amount.
Cóż, nie widać nic skomplikowanego w wydawaniu pieniędzy dla GG.

2. Ostatnią rzeczą, którą musimy zrobić, są dwie funkcje: jedna jest wydawana podczas korzystania z tutoriala, a druga z logiki. Dodajemy pierwszą funkcję do xr_effects.script:

function zat_super_psevdogig_explode_1(actor, npc)
     db.actor:give_info_portion("zat_super_psevdogig_af_activation_begin")  --Wydajemy informację
     remove_item(actor, npc, {"super_psevdogig_af_gravi"})  --Zabieramy GG artefakt (zostaje aktywowany)
end

Znowu nic skomplikowanego. Dwie proste akcje. Warto zauważyć, że remove_item jest również funkcją z xr_effects.script. Teraz dodajemy drugą:

function zat_super_psevdogig_explode_2(actor, npc)
        local fx_table_1 = {
         [1] = {particle = particles_object("anomaly2\\gravity_blast_final00")},
      [2] = {particle = particles_object("anomaly2\\gravity_blast_03")},
      [3] = {particle = particles_object("anomaly2\\gravity_blast_05")},
     }     
             
        local npc_position = npc:position()
         
     for i = 1,3 do
            fx_table_1[i].particle:play_at_pos(npc_position)
     end     
         
     db.actor:give_info_portion("zat_super_psevdogig_af_activation")
     remove_squad(nil, nil, {"zat_super_psevdogig_squad"})
         
     local fx_table_2 = {
         [1] = {particle = particles_object("anomaly2\\body_tear_00")},
      [2] = {particle = particles_object("amk\\blow_body")},
      [3] = {particle = particles_object("amk\\zomb_explode")},
     }
         
     for i = 1,3 do
            fx_table_2[i].particle:play_at_pos(npc_position)
     end
end

Mamy dwie tablicy. Każda ma trzy cząsteczki (każda cząsteczka w poniższych funkcjach jest zadeklarowana jako: tablica.particle). Po co trzeba było dzielić ją na dwie tablice? Po prostu lepiej, żeby cząsteczki anomalii grawitacyjnej zostały odtworzone trochę wcześniej, niż cząsteczki ciała rozerwania ciała. Cykl tutaj jest zdefiniowany trochę inaczej:

for i = 1,3 do

Spójrz na ponumerowane elementy tablic, a wszystko stanie się jasne w tym cyklu.
Należy również zauważyć, że skoro funkcja jest wywoływana bezpośrednio z logiki NPC, możemy ustawić wygodną zmienną lokalną, aby zadeklarować pozycję tego NPC w czasie rzeczywistym:

local npc_position = npc:position()

To jest npc, po którym dwukropek to pseudo-gigant (w zasadzie pozycja pseudogiganta). Spójrzcie na argumenty funkcji:
(actor, npc)
Używamy więc zmiennej lokalnej do wykonania funkcji z pętlą/tablicą:

fx_table_1[i].particle:play_at_pos(npc_position)

Przypisano wykonanie silnikowej funkcji play_at_pos przeznaczonej konkretnie dla cząsteczek. Jeśli nie masz cząsteczek AMK, zmieniamy drugą tablicę:

local fx_table_2 = {
      [1] = {particle = particles_object("anomaly2\\body_tear_00")},
   [2] = {particle = particles_object("anomaly2\\body_tear_01")},
   [3] = {particle = particles_object("anomaly2\\body_tear_02")},
  }

Poradziliśmy sobie ze wszystkim. Zobaczmy efekty pracy.

 

EFEKT:

Spoiler

 

 

 

ŹRÓDŁO:

https://ap-pro.ru/forums/topic/1031-cop-kvesty-ubiystvo-mutanta-press-f-to-win/

Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.
Uwaga: Twój wpis zanim będzie widoczny, będzie wymagał zatwierdzenia moderatora.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Korzystając z tej strony, zgadzasz się na nasze Warunki użytkowania.