Forum Tawerny Four Ways

Mount&Blade - Modyfikacje => Modding => Poradniki i tutoriale => Wątek zaczęty przez: Kolba w Sierpnia 15, 2007, 15:08:39

Tytuł: [MS] Wprowadzenie do skryptów by Manitas
Wiadomość wysłana przez: Kolba w Sierpnia 15, 2007, 15:08:39
Tutorial by Manitas



"Skrypt jest to ciąg operacji rozdzielonych przecinkami, wykonywanych po kolei.

Kazda operacja wyglada nastepujaco:

(nazwa_operacji, argument1, arg2, arg3)
Przy czym kazda operacja ma wlasciwa dla niej liczbe adgumentow, od 0 do 3.

Wszystkie dostepne operacje mozna obejrzec w pliku header_operations.py
Na szczescie w wiekszosci wypadkow z nazwy operacji mozna wywnioskowac co dana operacja robi.

przykład:
(troop_add_gold, "trp_player", 100)
i stówka ląduje w kieszeni naszego bohatera.

Jako argumenty operacji mozna podawac liczby calkowite, lub zmienne.
Glupio mi pisac o zmiennych, ale napisze na wszelki wypadek gdyby ktos nie wiedzial.
Otoz zmienna jest jakby pojemnikiem ktory jest opatrzony nazwą, ktory moze przechowywac jakąs wartosc liczbową.

Są 2 głowne rodzaje zmiennych:
- zwykłe, np "$nazwa_zmiennej" (cudzyslowy i znak $ sa obowiazkowe)
- rejestry, np reg(numer), gdzie numer moze przybierac wartosci od 0 do 40.
Roznia sie one tym, ze jezeli ustawimy wartosc zmiennej zwyklej w jednym skrypcie, mozemy miec pewnosc ze jej wartosc bedzie taka sama w innym, co do rejestrow takiej pewnosci miec nie mozna.


Przy okazji zmiennych trzeba wymienic operacje assign, ktora przypisuje wartosc zmiennej.

Przyklad:
(assign, "$ile_kasy", 100),
(val_add, "$ile_kasy, 1),
(troop_add_gold, "trp_player", "$ile_kasy"),

Tym razem w kieszeni naszego hero wyląduje 101 dukatów.


Rodzaje operacji.


1. Jeden rodzaj juz poznalismy - troop_add_gold jest to tzw. konsekwencja, czyli operacja ktora zmienia stan rzeczy w grze (w tym wypadku stan posiadania bohatera).

2. Zapytania - operacje ktore nie zmieniaja stanu rzeczy w grze ale pozwalaja uzyskac pewne informacje np:
Założmy że nasz hero ma przy sobie 101 dukatów.
operacja (store_troop_gold, "$ile_on_ma", "trp_player") spowoduje ze od tej chwili w zmiennej "$ile_on_ma" pojawi sie wartosc 101. Jakakolwiek wartosc ktora mogla tam byc przed wykonaniem operacji zostanie stracona.

3. Warunki np:
eq - equal - równy
gt - greater than - wiekszy
lt - less than - mniejszy
ge - greater or equal - wiekszy lub rowny
le - zgadnijcie
(main_hero_fallen) - sprawdza czy hero poległ w boju

Warunki dzialaja w ten sposob, ze jezeli ktorys z nich jest falszywy dzialanie skryptu zostaje przerwane.

przyklad:
Zalozmy ze nasz hero ma 100 gold
(store_troop_gold, "$ile_on_ma", "trp_player"),
(gt, "$ile_on_ma", 100),
(troop_deduce_gold, "trp_player", 100),

Ostatnia operacja zabiera graczowi 100 gold.
Na szczescie w tym przypadku sie nie wykona, gdyz warunek (100 > 100) jest rzecz jasna falszywy i skrypt zakonczy dzialanie zaraz po operacji 'gt'.

4. Operacje grupujace
Sa to operacje blokowe. Blok zaczynaja sie od jednej z operacji (try_...) a konczy operacją (end_try)

Najprostszą operacja tego typu jest (try_begin). Sluzy ona do wydzielenia ciagu operacji w skrypcie, glownie do stosowania z operacjami warunkowymi.
przyklad:
Kod:
(try_begin),
  (store_troop_gold, "$ile_on_ma", "trp_player"),
  (gt, "$ile_on_ma", 100),
  (troop_deduce_gold, "trp_player", 100),
(end_try),
(jakas_inna_operacja),W tym przypadku, jezeli warunek gt bedzie falszywy, nie spowoduje to zakonczenia dzialania calego skryptu, ale tylko jego czesci znajdujacej sie w bloku (try. Czyli w tym przykladzie operacja troop_deduce_gold sie nie wykona, ale jakas_inna_operacja zostanie wykonana bez przeszkod. Dla wtajemniczonych, dzialanie tej konstrukcji jest podobne do bloku 'if' z normalnych językow.
Kod:
(try_begin),
  (store_troop_gold, "$ile_on_ma", "trp_player"),
  (gt, "$ile_on_ma", 100),
  (troop_deduce_gold, "trp_player", 100),
(else_try),
  (jakas_inna_operacja),
(end_try),przyklad podobny, z tym ze dodatkowo zawiera operacje (else_try). W tym przypadku jakas_inna_operacja wykona sie tylko wtedy jezeli warunek gt jest falszywy. W przeciwnym wypadku wykona sie tylko deduce_gold.

Pozostale operacje grupujace to:

(try_for_range, "$zmienna", start, end) operacje zamkniete w takim bloku wykonaja sie start - end + 1 razy, za kazdym razem zmieniajac zawartosc zmiennej "$zmienna" od wartosci start do end co 1.

(try_for_agents, "$numer_agenta") - agent jest to kazda istota ozywiona ktora moze pojawic sie w bitwie, czyli agentem jest player, agentami sa jego zolnierze, wrogowie i konie.
Operacje zamkniete w takim bloku wykonaja sie tyle razy ile agentow jest obecnych na placu boju, za kazdym razem podstawiajac pod zmienna "$numer_agenta" numer kolejnego agenta na polu bitwy"
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: Kuczix w Marca 28, 2010, 12:04:54
Wiem że teraz znoobie ale gdzie sie skrypty wkleja ??
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: ShadowBlade w Marca 28, 2010, 12:17:32
MS - MODULE SYSTEM.
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: Kuczix w Marca 28, 2010, 12:26:56
MS - MODULE SYSTEM.

Co ty nie powiesz ale w JAKIM PLIKU ??

W różnych, w zależności od skryptu. Wystarczy pokombinować.

EDIT: Ten skrypt
Cytuj
    ("exp",[],"Exp...",
       [(add_xp_to_troop, 1000000, "trp_player"),
        ]),
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: PissInPeace w Marca 28, 2010, 20:54:07
MS - MODULE SYSTEM.

Co ty nie powiesz ale w JAKIM PLIKU ??

W różnych, w zależności od skryptu. Wystarczy pokombinować.

EDIT: Ten skrypt
Cytuj
    ("exp",[],"Exp...",
       [(add_xp_to_troop, 1000000, "trp_player"),
        ]),


Ten akurat w module_game_menus w "menu" village. Ponieważ chciałeś, aby ta opcja była w każdej wiosce...

@DOWN: Pogrzeb w tym pliku i sam dojdź gdzie to wkleić... Nikt za Ciebie nie będzie wszystkiego robił.
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: Kuczix w Marca 28, 2010, 21:45:46
To może jakiś mini tutorial :) Ja jestem amatorem :)

MS - MODULE SYSTEM.

Co ty nie powiesz ale w JAKIM PLIKU ??

W różnych, w zależności od skryptu. Wystarczy pokombinować.

EDIT: Ten skrypt
Cytuj
    ("exp",[],"Exp...",
       [(add_xp_to_troop, 1000000, "trp_player"),
        ]),


Ten akurat w module_game_menus w "menu" village. Ponieważ chciałeś, aby ta opcja była w każdej wiosce...

Bo to mi bardzo dużo pomogło :)(sarkazm)
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: woyo-sensei w Marca 28, 2010, 22:17:43
To potrzebujesz tutoriala czy tego, zeby ktos cie za reke prowadzil? Koledzy pokazali sposob, napisali gdzie i jak to wprowadzic. Czego jeszcze chcesz? Troche samodzielnego myslenia nie zaszkodzi...
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: Kuczix w Marca 29, 2010, 19:59:02
Spoko już mam wszystko na 63 i po 10 skill - Nie można mieć więcej ?
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: woyo-sensei w Sierpnia 16, 2010, 14:36:25
Panowie skrypterzy, a jak np wysłać po przegranej bitwie naszego herosa do lochu?
Mam skrypt, w którym toczymy jakąś tam walkę. Po wygraniu tej walki pokazuje się komunikat z wygraną nagrodą, itd. Tu wszystko gra. A jak wysłać naszego dzielnego herosa do lochu, np Sarranidów po przegranej walce? Jest tego trochę w module_mission_templates, ale potrzebuję tylko fragmentu samego wysyłania do lochów, a nie mam pojęcia jak to ugryźć. Coś na wzór send_hero_to_prison (fac_faction_6) :P Nasz hero po wysłaniu odsiedzi jakąś tam karę z losową szansą na ucieczkę. Jego żołnierze przepadają.
Wie ktoś jak rozwiązać mój problem?
Jeśli komuś przyda się kod to http://www.wklej.org/id/341953/
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: Leinnan w Września 26, 2010, 19:45:15
Chciałbym sam przydzielać który lord ma mieć jaki banner.
Znalazłem ten skrypt w module_scripts
Cytuj
#normal_banner_begin
          (gt, ":banner", 0),
#custom_banner_begin
#          (ge, ":banner", 0),
          (assign, ":comment", "str_comment_intro_noble_liege"),
          (val_add, ":comment", ":reputation"),
       (else_try),
          (assign, ":comment", "str_comment_intro_common_liege"),
          (val_add, ":comment", ":reputation"),
       (try_end),
Czy to tu trzeba zmienić jakoś lub rozbudować czy gdzie indziej.
Tak czy inaczej proszę o pomoc.
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: PissInPeace w Września 26, 2010, 20:09:17
Spróbuj dodać takie coś w skrypcie game_start

(troop_set_slot, "trp_", slot_troop_banner_scene_prop, "spr_"),

Tam gdzie "trp_" to id lorda, a tam gdzie "spr_" scene prop banneru, np. spr_banner_a (id scene propu możesz zobaczyć w edit mode)
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: Leinnan w Września 26, 2010, 22:35:16
Wielkie dzięki.
Czy wie ktoś jak zrobić, że gdy podczas bitwy bohater omdleje nasi ludzie dalej walczyli?

Edit:A można by zrobić ze gdy lord A ma banner B i gdy bohater na początku gry wybierze banner B żeby lordowi A nie zmieniał się banner na jakiś inny? Oczywiście z tym skryptem
(troop_set_slot, "trp_", slot_troop_banner_scene_prop, "spr_"),
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: PissInPeace w Września 27, 2010, 23:25:04
Da się, ale musisz ingerować w kod "prezentacji" wybierania banneru.

W prezentacji banner_selection "zakomentuj" (wstaw przed linijką znak #) to:

            (troop_set_slot, ":cur_troop", slot_troop_banner_scene_prop, banner_scene_props_end_minus_one),

i to:

            (party_set_banner_icon, ":cur_party", banner_map_icons_end_minus_one),

Powinno pomóc.
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: Leinnan w Września 28, 2010, 00:01:45
Niestety nie działa.
Znalazłem takie coś w Europe 1200:
Cytuj
("assign_banners",
    [    
     (try_for_range, ":center_no", walled_centers_begin, walled_centers_end),
     (try_begin),
        (party_get_slot, ":lord_troop_id", ":center_no", slot_town_lord),
        (troop_get_slot, ":cur_banner", ":lord_troop_id", slot_troop_banner_scene_prop),
        (gt, ":cur_banner", 0),
        (val_sub, ":cur_banner", banner_scene_props_begin),
        (val_add, ":cur_banner", banner_map_icons_begin),
        (party_set_banner_icon, ":center_no", ":cur_banner"),
      (try_end),
      (try_end),]),
Kurde, sam bym chciał umieć tworzyć skrypty ale dla mnie to czarna magia,jednak staram się nie poddawać.
Jak na razie moje skrypty = kompletna porażka.
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: Daedalus w Września 28, 2010, 11:43:19
Cytuj
A można by zrobić ze gdy lord A ma banner B i gdy bohater na początku gry wybierze banner B żeby lordowi A nie zmieniał się banner na jakiś inny?

W prezentacji "banner_selection" wykomentuj ten fragment:

Cytuj
           (assign, ":end_cond", kingdom_heroes_end),
           (try_for_range, ":cur_troop", kingdom_heroes_begin, ":end_cond"),
             (troop_slot_eq, ":cur_troop", slot_troop_banner_scene_prop, ":selected_banner_spr"),
             (assign, ":troop_to_change", ":cur_troop"),
             (assign, ":end_cond", 0),
             (troop_set_slot, ":cur_troop", slot_troop_banner_scene_prop, banner_scene_props_end_minus_one),
             (troop_get_slot, ":cur_party", ":cur_troop", slot_troop_leaded_party),
             (gt, ":cur_party", 0),
             (party_set_banner_icon, ":cur_party", banner_map_icons_end_minus_one),
           (try_end),
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: Leinnan w Września 28, 2010, 19:58:36
Wielkie dzięki Daedalus.
Na razie próbuje swoich sił tworząc własnego mini-moda zmieniającego państwo Nordów a później przerabianiem wszystkich frakcji.
Na razie na użytek własny.

PS. Wole na razie nie straszyć ludzi moimi zmianami
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: Yokizo w Lipca 31, 2011, 14:46:37
Witam!
Możliwe, że piszę w niewłaściwym miejscu, ale nie mam pojęcia gdzie indziej to wpisać XD

Otóż jestem początkującym modderem i mam pytanie- gdzie i w jaki sposób muszę wpisać polecenie by drzwi w Warbandzie otwierały się po naciśnięciu F??

Prosibym o szybką odpowiedź.
Tytuł: Odp: SKRYPTY - wprowadzenie.
Wiadomość wysłana przez: Szyder w Lipca 31, 2011, 15:00:50
Witam! W niektórych krajach archeologia jest karana śmiercią! Proponowałbym poszukać, ewentualnie założyć nowy wątek w dziale modding. Pozdrawiam!