Yurek Opublikowano 6 Lutego 2012 Zgłoś Udostępnij Opublikowano 6 Lutego 2012 Ponieważ temat zrobił się "gorący" postanowiłem rozebrać ten kwest Kostii dotyczący schowka w laboratorium X-10 i teleportów z nim związanych, na czynniki pierwsze ;) Przy okazji sprawdziłem poprawność plików najnowszej polonizacji z poprzednią i wersją oryginalna Solianki. Ale do rzeczy.... Ponieważ kwest na ostatni PDA w X-10 rozpoczyna się po przyniesieniu PDA ze schowka Kostii na Radarze (tego na drzewie), potraktowałem to jako punkt wyjścia do dalszej pracy. Rzeczony dialog z Kostią znajduje się w pliku stable_dialogs_escape.xml, który był ruszany w polonizacji, ale nie może być uszkodzony, bo by mod w ogóle nie ruszył :D. Oto interesujący nas fragment: <string id="kostya_radar_taynik_0"> <text>To wszystko, Kostia, ostatni PDA znaleziony!</text> </string> <string id="kostya_radar_taynik_1"> <text>Świetnie! Teraz mamy wszystkie części kodu. Ale...</text> </string> <string id="kostya_radar_taynik_2"> <text>Co znaczy to "ale"? Kod znaleziony, zostało iść do laboratorioum otwierać drzwi.</text> </string> <string id="kostya_radar_taynik_3"> <text>Poczekaj, to nie takie proste. Mamy części kodu, ale nie sam kod. Żeby złożyć kod potrzebna jest jeszcze jakaś wskazówka. Miałem nadzieję, że ona będzie w ostatnim PDA, ale jej tam nie ma. Wydaje się, żę wskazówkę można odnaleźć w samym laboratorium. Tak, że musisz tam iść, i na miejscu sie rozejrzeć. Tu masz liczby, które były zaszyfrowane w odnalezionych przez ciebie PDA. Znajdziesz wskazówkę i z jej pomocą złozysz kod z tych liczb. Liczby: 9, 7, 2, 54, 61. Tak, a przy okazji, chodzą słuchy, że po odłaczeniu mózgozwęglacza wzrosła aktywnośc pijawek na Radarze. Tak więc bądź ostrozny. Według moich założeń ich legowisko możę znajdować się akurat w samym laboratorium. Czyli przed wyruszeniem tam, przygotuj się na wszelki wypadek do spotkania z nimi.</text> </string> <string id="kostya_radar_taynik_4"> <text>Dobrze. Dziękuję ci, mam nadzieję, że przy następnym spotkaniu będę mógł czymś się odwdzięczyć.</text> </string> <string id="kostya_radar_taynik_5"> <text>Ano, zobaczymy.</text> Prowadzi on do kolejnego pliku (chyba najważniejszego dla tego kwestu) - dialogs_escape.xml, który w polonizacji nie był ruszany. Ten plik zawiera wszystkie instrukcje dla moda - jaką dać infoporcję i kiedy, oraz jakie skrypty mają się uruchomić. Tak na marginesie to podejrzewam, że problemy carlopapy wynikają z tego, że zawarte w końcówce instrukcje dla skrpytów, nie wiadomo dlaczego nie zadziałały . Oto interesujący nas fragment: <dialog id="kostya_radar_taynik"> <has_info>kostya_radar_taynik_have</has_info> <dont_has_info>kostya_radar_taynik_done</dont_has_info> <phrase_list> <phrase id="0"> <text>kostya_radar_taynik_0</text> <give_info>kostya_radar_taynik_done</give_info> <action>kostya_dialog.esc_pda7_done</action> <next>1</next> </phrase> <phrase id="1"> <text>kostya_radar_taynik_1</text> <next>2</next> </phrase> <phrase id="2"> <text>kostya_radar_taynik_2</text> <next>3</next> </phrase> <phrase id="3"> <text>kostya_radar_taynik_3</text> <next>4</next> </phrase> <phrase id="4"> <text>kostya_radar_taynik_4</text> <next>5</next> </phrase> <phrase id="5"> <text>kostya_radar_taynik_5</text> <give_info>kostya_x10_taynik_start</give_info> <action>kostya_dialog.esc_pda9_have</action> <action>spawn_restrictor.create_sr14</action> </phrase> </phrase_list> </dialog> Zapisane w nim instrukcje wiodą nas do plików skryptowych - kostya_dialog.script (ten był ruszany w najnowszej polonizacji, ale sprawdziłem go i jest identyczny w interesujacym nas fragmencie z poprzednią wersją polonizacji Solianki): function esc_pda7_done(first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "kostya_pda7", "out") end function esc_pda9_have(task, objective) if db.actor ~= nil then return db.actor:object("kostya_pda9") ~= nil end return false end I do pliku spawn_restrictor.script, który nie był ruszany w polonizacji: -- X-10 function create_sr14() local se_obj = alife():create("space_restrictor",vector():set(-40.398349761963,-21.837560653687,56.543983459473),1324,2737) local custom = "[logic]n".. "active = sr_idlen".. "[sr_idle]n".. "on_actor_inside = {+info_restriction} nil %=spawn_teleport35 =spawn_teleport36 =new_inventory11 =create_sr15%" rewrite_restrictor(se_obj, custom, 2.0) end Ten ostatni plik wiedzie nas dalej, do właściwego pliku skryptowego opisującego całą tą checę z teleportami w X-10, ich pojawianie się i znikanie oraz pojawienie się plecaka za siatką - xr_effects.script, który był ruszany w polonizacji, ale sprawdziłem całą sekcję dotycząca X10 i jest identyczna z plikiem oryginalnym i poprzedniej polonizacji. Oto cała sekcja dotycząca X-10: -- X-10 function play_zvuk6() local actor = db.actor local snd_obj = xr_sound.get_safe_sound_object([[ambientrandomrnd_ratchant]]) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) end function new_inventory11() local obj = alife():create("m_inventory_box11",vector():set(-30.228071212769,-21.02052116394,58.902126312256),2490,2748) end function spawn_teleport35() local se_obj = alife():create("m_teleport_35",vector():set(-40.398349761963,-21.837560653687,56.543983459473),1324,2737) xr_logic.pstor_store(db.actor, "m_teleport_35", se_obj.id) end function delete_teleport35(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_35", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport36() local se_obj = alife():create("m_teleport_36",vector():set(-30.385196685791,-21.020092010498,55.938106536865),1962,2738) xr_logic.pstor_store(db.actor, "m_teleport_36", se_obj.id) end function delete_teleport36(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_36", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function create_sr15() local se_obj = alife():create("space_restrictor",vector():set(-19.994720458984,-9.5514478683472,-35.59744644165),3400,2665) local custom = "[logic]n".. "active = sr_idlen".. "[sr_idle]n".. "on_actor_inside = {+info_restriction} nil %=delete_teleport36 =play_zvuk6 =spawn_teleport37 =spawn_teleport38 =spawn_teleport39 =spawn_teleport41 =spawn_teleport42 =create_sr16 =create_sr17%" spawn_restrictor.rewrite_restrictor(se_obj, custom, 2) end function spawn_teleport37() local se_obj = alife():create("m_teleport_37",vector():set(-19.987188339233,-9.5004644393921,-27.889524459839),3411,2665) xr_logic.pstor_store(db.actor, "m_teleport_37", se_obj.id) end function delete_teleport37(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_37", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport38() local se_obj = alife():create("m_teleport_38",vector():set(-20.023223876953,-9.5004854202271,-43.679775238037),3389,2665) xr_logic.pstor_store(db.actor, "m_teleport_38", se_obj.id) end function delete_teleport38(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_38", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport39() local se_obj = alife():create("m_teleport_39",vector():set(-20.102291107178,-9.391640663147,-6.6342015266418),3445,2666) xr_logic.pstor_store(db.actor, "m_teleport_39", se_obj.id) end function delete_teleport39(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_39", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport40() local se_obj = alife():create("m_teleport_40",vector():set(-6.7612886428833,-7.3805675506592,-56.52018737793),4518,2663) xr_logic.pstor_store(db.actor, "m_teleport_40", se_obj.id) end function delete_teleport40(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_40", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function create_sr16() local se_obj = alife():create("space_restrictor",vector():set(-1.298624753952,-7.4522504806519,-73.977745056152),5456,2661) local custom = "[logic]n".. "active = sr_idlen".. "[sr_idle]n".. "on_actor_inside = {+info_restriction} nil %=spawn_teleport40%" spawn_restrictor.rewrite_restrictor(se_obj, custom, 2) end function spawn_teleport41() local se_obj = alife():create("m_teleport_41",vector():set(-30.603868484497,-8.9784269332886,19.563804626465),2243,2780) xr_logic.pstor_store(db.actor, "m_teleport_41", se_obj.id) end function delete_teleport41(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_41", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport42() local se_obj = alife():create("m_teleport_42",vector():set(-32.942707061768,-9.4474973678589,1.0606206655502),2026,2669) xr_logic.pstor_store(db.actor, "m_teleport_42", se_obj.id) end function delete_teleport42(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_42", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function create_sr17() local se_obj = alife():create("space_restrictor",vector():set(-32.942707061768,-9.4474973678589,1.0606206655502),2026,2669) local custom = "[logic]n".. "active = sr_idlen".. "[sr_idle]n".. "on_actor_inside = {+info_restriction} nil %=create_sr18 =spawn_teleport54 =spawn_teleport53 =spawn_teleport52 =spawn_teleport51 =spawn_teleport50 =spawn_teleport49 =spawn_teleport48 =spawn_teleport43 =spawn_teleport44 =spawn_teleport45 =spawn_teleport46 =spawn_teleport47%" spawn_restrictor.rewrite_restrictor(se_obj, custom, 2) end function spawn_teleport43() local se_obj = alife():create("m_teleport_43",vector():set(-48.170837402344,-23.529655456543,0.87714487314224),1004,2787) xr_logic.pstor_store(db.actor, "m_teleport_43", se_obj.id) end function delete_teleport43(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_43", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport44() local se_obj = alife():create("m_teleport_44",vector():set(-52.187408447266,-23.582466125488,-7.2188229560852),772,2712) xr_logic.pstor_store(db.actor, "m_teleport_44", se_obj.id) end function delete_teleport44(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_44", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport45() local se_obj = alife():create("m_teleport_45",vector():set(-45.096000671387,-23.522695541382,-12.440341949463),1109,2789) xr_logic.pstor_store(db.actor, "m_teleport_45", se_obj.id) end function delete_teleport45(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_45", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport46() local se_obj = alife():create("m_teleport_46",vector():set(-18.216438293457,-21.836561203003,41.694786071777),3815,2785) xr_logic.pstor_store(db.actor, "m_teleport_46", se_obj.id) end function delete_teleport46(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_46", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport47() local se_obj = alife():create("m_teleport_47",vector():set(-57.305168151855,-21.859325408936,40.726039886475),454,2728) xr_logic.pstor_store(db.actor, "m_teleport_47", se_obj.id) end function delete_teleport47(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_47", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport48() local se_obj = alife():create("m_teleport_48",vector():set(-49.594337463379,-23.536252975464,56.616313934326),929,2735) xr_logic.pstor_store(db.actor, "m_teleport_48", se_obj.id) end function delete_teleport48(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_48", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport49() local se_obj = alife():create("m_teleport_49",vector():set(-17.414360046387,-21.840921401978,55.660831451416),3850,2751) xr_logic.pstor_store(db.actor, "m_teleport_49", se_obj.id) end function delete_teleport49(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_49", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport50() local se_obj = alife():create("m_teleport_50",vector():set(-64.259719848633,-21.895231246948,30.609943389893),113,2725) xr_logic.pstor_store(db.actor, "m_teleport_50", se_obj.id) end function delete_teleport50(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_50", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport51() local se_obj = alife():create("m_teleport_51",vector():set(-52.363986968994,-23.589921951294,-13.084785461426),765,2788) xr_logic.pstor_store(db.actor, "m_teleport_51", se_obj.id) end function delete_teleport51(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_51", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport52() local se_obj = alife():create("m_teleport_52",vector():set(-52.968780517578,-23.594024658203,-2.0381298065186),749,2715) xr_logic.pstor_store(db.actor, "m_teleport_52", se_obj.id) end function delete_teleport52(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_52", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport53() local se_obj = alife():create("m_teleport_53",vector():set(3.5164728164673,-21.845838546753,41.598541259766),6991,2755) xr_logic.pstor_store(db.actor, "m_teleport_53", se_obj.id) end function delete_teleport53(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_53", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function spawn_teleport54() local se_obj = alife():create("m_teleport_54",vector():set(-6.4082336425781,-21.823808670044,55.724376678467),4658,2752) xr_logic.pstor_store(db.actor, "m_teleport_54", se_obj.id) end function delete_teleport54(story_id) local obj_id = xr_logic.pstor_retrieve(db.actor, "m_teleport_54", -1) local se_obj = alife() : object(obj_id) if se_obj then alife():release(se_obj, true) end end function create_sr18() local se_obj = alife():create("space_restrictor",vector():set(-30.385196685791,-21.020092010498,55.938106536865),1962,2738) local custom = "[logic]n".. "active = sr_idlen".. "[sr_idle]n".. "on_actor_inside = {+info_restriction} nil %=play_zvuk6 =delete_teleport54 =delete_teleport53 =delete_teleport52 =delete_teleport51 =delete_teleport50 =delete_teleport49 =delete_teleport48 =delete_teleport47 =delete_teleport46 =delete_teleport45 =delete_teleport44 =delete_teleport43 =delete_teleport42 =delete_teleport41 =delete_teleport40 =delete_teleport39 =delete_teleport38 =delete_teleport37 =delete_teleport35%" spawn_restrictor.rewrite_restrictor(se_obj, custom, 2) end Jak się w niego wpatrzymy to dostrzeżemy, że za spawn plecaka i jego zawartość odpowiadają dwa pliki, które nie były ruszane w polonizacji - za spawn: spawn_sections.ltx [m_inventory_box11]:kostya_box visual = equipmentsitem_rukzak radius = 1 custom_data = scriptsm_inventory_box11.ltx ...i za zawartość plecaka: m_inventory_box11.ltx [spawn] kostya_pda9 = 1 mutant_krovosos_cocoon = 1 I to by było na tyle tego kwestu w zapisie... Pozostał jeszcze wpis w encyklopedii, który nie ma znaczenia dla samego przebiegu kwestu. Tak więc po sprawdzeniu i porównaniu plików zarówno z poprzednią polonizacją jak i z oryginałem Solianki stwierdzam, że błąd nie leży po stronie polonizacji. Mam pewien pomysł by sprawdzić moje domysły, które opisałem na początku, więc jeśli carlopapa ma chęć posprawdzać co nieco, to niech do mnie napisze na PW :D Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
carlopapa Opublikowano 6 Lutego 2012 Zgłoś Udostępnij Opublikowano 6 Lutego 2012 Witam nie wiem czy to istotne, ale trochę grzebałem plikach tzn. wyłączyłem deszcz, burzę, pioruny, mgłę, zwiększyłem udzwig postaci do 5 ton, brak limitu czasowego na kwesty. Pliki edytowałem samodzielnie, nie zastępowałem gotowymi. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
korn06 Opublikowano 6 Lutego 2012 Zgłoś Udostępnij Opublikowano 6 Lutego 2012 Czemu tak wyłączałeś efekty pogodowe? Oczywiście, że mogło mieć wpływ, brak limitu czasowego- niepotrzebny dodatek, limit 7 dni mamy tylko na cykliczne zlecenia od Barmana, Sidora itp. Udźwig sam zwiększam, ale maximum to 500 kg (5 ton to zdecydowanie za dużo) i jest to jedyna zmiana w plikach której dokonuję. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kobal Opublikowano 6 Lutego 2012 Zgłoś Udostępnij Opublikowano 6 Lutego 2012 Carlopapa - podczas opróżniania schowka Kostii na Radarze spotyka nas coś w rodzaju "uderzenia". Dość ciężko to przeżyć, miałeś to? Jeśli wyłączyłeś efekty pogodowe to może tu tkwi przyczyna kłopotów z następnym schowkiem w X10. Nie było "uderzenia" i skrypt nie uruchamia teleportów bo myśli że jeszcze nie zaliczyło się poprzednie zadanie. To tylko domysły, oczywiście. Z udźwigiem i spawnem nie przesadzaj, handlarze też mają swój bazowy udźwig i jak ich przeładujesz - umierają. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Yurek Opublikowano 6 Lutego 2012 Zgłoś Udostępnij Opublikowano 6 Lutego 2012 Niestety to "mieszanie" w plikach, które zafundował sobie carlopapa mogło właśnie zaowocować kłopotami z tymi teleportami w X-10... Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
carlopapa Opublikowano 6 Lutego 2012 Zgłoś Udostępnij Opublikowano 6 Lutego 2012 Efekty pogodowe powyłączałem ponieważ nie cierpię w grach deszczu i burz jestem fanem czystych FPS-ów, a że stalker mnie tak wciągnął to już inna sprawa. Na radzrze miałem to uderzenie i po kilku próbach wzięcie zawartości schowka kończyło się śmiercią dopiero pomogły arty. Pogodę wyłączam też aby poprawić FPS nie mam za dobrego kompa a sola całkowicie wykorzystuje moje zasoby systemowe. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Yurek Opublikowano 7 Lutego 2012 Zgłoś Udostępnij Opublikowano 7 Lutego 2012 Carlopapa wypróbował dwie opcje, które podesłałem mu do przetestowania w sprawie tych nieobecnych teleportów w X-10 w jego grze. Niestety obie zawiodły... Moja gruntowna analiza kwestu parę postów wyżej, nie wnosi nic nowego w kwestii poznania przyczyn takiego błędu, bo polonizacja nie tykała akurat tych fragmentów kodu. Jedynym innym elementem w tej całej układance jest miejsce spawnu schowka na Radarze w grze carlopapy. Dotychczas nikt z nas grajacych nie miał go w tym miejscu gdzie on (a u niego znajdował się on nie na drzewie, a na kamieniach nieopodal wagonika snajpera) i tak naprawdę nie wiemy, czy to nie powoduje jakiegoś błędu. My wszyscy mieliśmy do zawsze na drzewie (i tam go zawsze innym kazaliśmy szukać - i go znajdowali). Jak znajdę troche czasu, to spróbuję znaleźć w plikach czym te schowki oprócz lokalizacji się różnią - bo może w modzie jest błąd i akurat ten schowek jest jakiś felerny.... :confused: Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kobal Opublikowano 7 Lutego 2012 Zgłoś Udostępnij Opublikowano 7 Lutego 2012 Jedynym innym elementem w tej całej układance jest miejsce spawnu schowka na Radarze w grze carlopapy. Dotychczas nikt z nas grajacych nie miał go w tym miejscu gdzie on (a u niego znajdował się on nie na drzewie, a na kamieniach nieopodal wagonika snajpera) i tak naprawdę nie wiemy, czy to nie powoduje jakiegoś błędu. My wszyscy mieliśmy do zawsze na drzewie (i tam go zawsze innym kazaliśmy szukać - i go znajdowali). Akurat ja zawsze miałem schowek Kostii na rozbitym helikopterze w lesie na Radarze. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Yurek Opublikowano 7 Lutego 2012 Zgłoś Udostępnij Opublikowano 7 Lutego 2012 @ Kobal A widzisz, tego nie wiedziałem... Ale teleporty w X-10 normalnie Ci działały ? Ciekawe, czy jeszcze ktoś miał ten schowek na kamieniach... Bo można by wtedy sprawdzić zasadność mojej teorii. Chociaż Twój przypadek znacznie ją osłabia... :( Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kobal Opublikowano 7 Lutego 2012 Zgłoś Udostępnij Opublikowano 7 Lutego 2012 Tak, u mnie wszystko grało z teleportami. Zresztą Carlopapa ma mojego sejwa. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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.