System dialogów z warbanda jest dość specyficzny(i miejscami prawie tak zagmatwany jak bardziej skomplikowane game_menus). Składa się z czterech zasadniczych elementów:
[trp_vori_mage, "start", [(eq,"$vori_quest_state", 0)], "I see you look better now. ", "vori_mage_start2",[]],Pierwszym elementem jest trp_vori_mage, czyli rodzaj jednostki której dotyczy(po dodaniu |plyr oznacza odpowiedź gracza w stosunku do danej jednostki), drugim aktualny stan dialogu(dialog zaczyna się od "start" a następnie jest zmieniany przez poszczególne dialogi). Dalej znajduje się kod sprawdzający czy dany dialog może zostać wybrany, czyli ciąg operacji kończący się operacją warunkową , w tym wypadku sprawdzającą stan globalnej zmiennej. Potem widać napis wyświetlany w grze i stan w jaki wchodzi dialog po wypowiedzeniu zdania(patrz drugie pole). Na samym końcu są operacje wykonywane po wybraniu dialogu ale przed jego wyświetleniem(Ważne!).
Jak widać jest to dość skomplikowane i aby uniknąć powtarzania kodu i nadmiernego zamieszania twórcy wprowadzili operator trenarny i jego uproszczoną wersje jak w:
"As you wish, {sire/my lady}. {reg6?I:{reg7?You:{s11}}} will be the new {reg3?lady:lord} of {s1}."Operator trenarny {reg3?lady:lord} zwróci lady gdy reg3 wynosi 1(lub dowolną liczbę większą od zera*) lub lord dla 0.
Po zejściu do kodu w ostatniej sekcji możemy zauważyć operacje (troop_get_type, reg3, ":new_owner"), zapisuje ona do reg3 typ jednostki z którą rozmawiamy, czyli tf_male, tf_female jak i różne inne dodane w modzie rasy. Najłatwiej byłoby napisać nowy skrypt:
# script_get_sex_of_troop
# Input: troop_no
# Output: reg0 sex (0 male, 1 female)
("get_sex_of_troop",
[
(store_script_param, ":troop_no", 1),
(troop_get_type, ":race", ":troop_no"),
(assign,":sex",0),
(try_begin),
(this_or_next|eq,":race",tf_female),
(this_or_next|eq,":race",tf_orc_female),
(eq,":race",tf_goblin_female),#jakas inna rasa kobieca, pamiętaj o this_or_next przy dodawaniu kolejnych
(assign,":sex",1),
(try_end),
(assign, reg0, ":sex"),
]),i wywoływać go w odpowiednich dialogach poprzez zamianę
(troop_get_type, reg3, ":new_owner"),
#na
(call_script, "script_get_sex_of_troop",":new_owner"),
(assign, reg3, reg0),
Bardziej skomplikowana sprawa jest z wersją skróconą {sire/my lady}. Działa ona w podobny sposób lecz niejawnie pobiera płeć jednostki gracza. Trzeba będzie ją zamienić na jawną wersje opartą o wybrany rejestr i wywołać wspomniany wcześniej skrypt dla "trp_player". I taki zabieg należy wykonać dla WSZYSTKICH dialogów, prezentacji itd w których występuje podział na płcie. W takim razie miłej zabawy.
*Do weryfikacji, ale tak działa w c++ i wygląda na to że tak samo działa w WB.
PS. Jak widać w podanym wyżej przykładzie wyrażenia trójargumentowe można umieszczać w innych wyrażeniach trójargumentowych, jednak radziłbym się z tym wstrzymać. Gdybyś chciał robić różne wersje tego samego dialogu o wiele lepiej zrobić to przy użyciu złożonych warunków w trzecim polu dialogowym i wielu alternatywnym dialogom(pamiętaj że przeszukiwane są od góry pliku i wybierany jest pierwszy pasujący) jak w przykładzie z CoMM.
[trp_vori_mage, "vori_mage_start2", [
(troop_get_type, ":race", "trp_player"),
(this_or_next|eq, ":race", tf_male),
(this_or_next|eq, ":race", tf_female),
(this_or_next|eq, ":race", tf_dwarf),
(eq, ":race", tf_elf),],
"I have feeling that you should stay as long as you want. Every human, elf or dwarf is welcome in Volee.", "vori_mage_start2_response",[]],
[trp_vori_mage, "vori_mage_start2", [], "I have feeling that you should stay as long as you want. Even when we don't look kindly to your kind here.", "vori_mage_start2_response",[]],
UWAGA: W przypadku wystąpienia błędów kompilacji dodaj "from header_troops import *"na początku module_dialogs.py.
PPS(h). Polecam nie rozpędzać się z rasami, Warband wspiera maksymalnie 16 rożnych ras, więcej nie będzie się dało przydzielić do jednostki.