Witaj Wesnothańczyku
Zobacz temat
 Drukuj temat
WML- pytania i odpowiedzi
Sylar
Czyli coś w stylu FAQ, ale mniej profesjonalnie. Umówmy się może tak: Jedna osoba zadaje pytanie w jednym poście i czeka na odpowiedź. Odpowiedź znajdować się będzie zaraz pod postem napisana przez któregoś admina albo kogoś, kto zna rozwiązanie (chyba, że wolicie edytować post z pytaniem, tylko wtedy nie będziemy wiedzieli, że jest coś nowego w tym temacie). Jeśli się to wam nie spodoba, to po prostu usuniecie ten temat, jednak wtedy liczę na to, że w zamian za jakiś czas przygotujecie coś lepszego. No to zacznę z pytaniami:

a) Dokładny opis funkcji attack i defense weight. Jak to dokładnie działa, czy jeśli ustawię to np. na 4 attack to jednostka w ataku zamiast normalnej ilości ciosów wymieni równe 4? I czy można to ustawić (i jak) jako widoczną zdolność?
b) Czy mogę ustawić oryginalny zestaw imion dla danej jednostki, a nie rasy? Czy mogę usunąć w ogóle funkcję imion dla pojedynczej, żywej jednostki?
Edytowane przez Sylar dnia 12-06-2011 17:54
 
Kanapka
a ) attack_weight i defense_weight są brane pod uwagę, kiedy AI wybiera który z ataku użyć. Wieksza wartość parametru powoduje, że atak będzie cześciej używany (odpowiedni w ataku i podczas obrony), (pamiętaj, że podczas obrony to zawsze AI wybiera typ ataku, jeżeli jednostka ma atak A o wadze 100 i obrażeniach 1 oraz atak B o wadze 1 i obrażeniach 50, zostanie wybrany ten pierwszy). O ile dobrze pamiętam, wybierany jest ten atak, dla którego [potencjalne obrażenia] * [attack/defense_weight] są największe. Ten parametr nie jest widoczny, można go ustawić podczas tworzenia typu jednostki w tagu [attack] attack/defense_weight = foo ... [/attack] lub można modyfikować daną jednostkę przez [modify_unit].

b ) Nie widzę żadnego sposobu, aby ustalić unikalny zestaw imion dla jednostki. Możesz spróbować stworzyć rasę o innym id i takiej samej nazwie, (ta jednostka będzie tej rasy - dzięki temu może mieć inny zestaw imion), jednak może to prowadzić do problemów w sytuacji, kiedy chcesz wybrać wszystkie jednostki rasy X, a dany typ jednostki tak naprawdę jest rasy Y (mimo że nie widać tego na ekranie jednostki, nie wiem, czy będzie to widoczne w pomocy).
Edytowane przez Kanapka dnia 12-06-2011 23:54
 
Sylar
Kolejny problem: Przy tworzeniu pewnej mapki w edytorze bardzo zależy mi na tym, żeby gracz trzeci przebywający na środku mapy, zostawał automatycznie wybierany jako komputerowy gracz, a najlepiej żeby okna gracza trzeciego nie było w ogóle przy wyborze stron.
Wiadomo, wpisuję controller=ai. I nadal można wybierać między graczem a komputerem w oknie wyboru stron.
Z 3 misji kampanii o Dwóch Braciach podpatrzyłem pewną strukturę zastosowaną przy grupie statycznych orków.
Wygląda to tak:

[side]
no_leader=yes
side=3
team_name=evil
user_team_name=_"Enemies"
... (i tu są wymieniane jednostki z id, name, położeniem i ai-guardian
Oczywiście wiem, że do jednostki musi być podłączone ai_special=guardian
żeby aktywowała tryb "strażnika", ale nie w tym rzecz. Używam tamtego kodu, zmieniam nazwę drużyny i... nadal można wybrać stanowisko trzecie. Dopisuję controller=ai i to samo. Co powinienem dopisać, żeby poskutkowało?
PS: resztę pliku mam na ~99,9% sprawną.

Dziękuję wam obu za rady. Oczywiście pamiętajcie, że nie jest to jakiś mój osobisty temat, tylko zbiór pytań i odpowiedzi Dla Każdego (puki nie ma jeszcze prawdziwego FAQ). Jak widzicie, doświadczeni gracze znający odp. na wasze pytanie odpiszą, więc nie wahajcie się pisać pytań (oczywiście mówimy konkretnie o wml'u).
Edytowane przez Sylar dnia 14-06-2011 17:25
 
Poliuks
Spróbuj dodać linijkę allow_player=no. Nie jestem pewien, czy kolejność ma tu znaczenie, sam nie robię scenariuszy, w każdym razie umieść to pod linijką side.
 
medalikarz
2 - Atak zawsze musi kończyć turę dla jednostki? Nie da się tego jakoś zmienić?


Są skrypty które pozwalają odejść jednostce(umiejętność) oraz atakować raz jeszcze(umiejętność). Oba znajdziesz w erze inferno8 i Age.
Age:http://www.wesnot...orum_id=31
TeamSpeak3:Qfer.net (szukaj: Medalikarz)
 
Filar
ad. 1 http://wiki.wesno...5Blabel.5D Czyli w skórcie. Stawiasz znacznikiem [label] x,y to współrzędne text, to tekst etykiety, colour (od 1.9 color), to kolor visible_in_fog / visible_in_shroud - czy widać we mgle i całunie. Immutable - czy da się zmienić.
ad. 2 Po prostu stawiasz je znacznikiem [unit]. Nie widziałem możliwości automatycznego ustawianie. Nie bój się - ich poziom itp. nie zmieni się.

PS
Czytajcie trochę RefferenceWML, tam jest na prawdę dużo odpowiedzi na pytania związane z WML.

Edit:
Oto działający, sprawdzony kod.
Pobierz kod źródłowy  Kod źródłowy
[event]
  name=moveto
  first_time_only=no
   [store_unit]
      [filter]
      id=silva
      [/filter]
   variable=silva
   [/store_unit]

  ###########Tu następuje chwalebne rozpoznanie współrzędnych wokół dowódcy wroga. Przepraszam za brak zwięzłości kodu, inaczej nie potrafiłem. Zahaszowane poniżej linijki nie działają. Mają na celu przedstawienie działanie operacji na zmiennych.

   {VARIABLE coord1x $silva.x}
   {VARIABLE coord1y $silva.y}

   ########(VARIABLE coord2y $($silva.y+1)}
   [set_variable]
      name=coord2y
      value=$silva.y
   [/set_variable]
   {VARIABLE_OP coord2y add 1}


        #########{VARIABLE coord3y $($silva.y - 1)}
   [set_variable]
      name=coord3y
      value=$silva.y
   [/set_variable]
   {VARIABLE_OP coord3y sub 1}


   ######{VARIABLE coord2x $($silva.x + 1)}
   [set_variable]
      name=coord2x
      value=$silva.x
   [/set_variable]
   {VARIABLE_OP coord2x add 1}


   ########{VARIABLE coord3x ($silva.x - 1)}
   [set_variable]
      name=coord3x
      value=$silva.x
   [/set_variable]
   {VARIABLE_OP coord3x sub 1}
[/event]

######Seria eventów mających na celu ustawienie silvy jako sojusznika po podejściu przez którąś z Twoich jednostek
#define PRZEJSCIE
   [message]
      speaker=silva
      message="Wiesz, jestes tak piekny, ze sie do ciebie przylacze."
   [/message]
      [modify_side]
      side=3
      team_name=bat
   [/modify_side]
#enddef

[event]
   name=moveto
   [filter]
      side=1
      x=$coord1x
      y=$coord2y
   [/filter]
   {PRZEJSCIE}
[/event]

[event]
   name=moveto
   [filter]
      side=1
      x=$coord1x
      y=$coord3y
   [/filter]
   {PRZEJSCIE}
[/event]
[event]
   name=moveto
   [filter]
      side=1
      x=$coord2x
      y=$coord1y
   [/filter]
   {PRZEJSCIE}
[/event]
[event]
   name=moveto
   [filter]
      side=1
      x=$coord2x
      y=$coord3y
   [/filter]
   {PRZEJSCIE}
[/event]
[event]
   name=moveto
   [filter]
      side=1
      x=$coord3x
      y=$coord2y
   [/filter]
   {PRZEJSCIE}
[/event]
[event]
   name=moveto
   [filter]
      side=1
      x=$coord3x
      y=$coord1y
   [/filter]
   {PRZEJSCIE}
[/event]



Jedyny haczyk: silva nie może się ruszyć (jeśli się ruszy, to nie przejdzie na twoją stronę), ale postaram się to naprawić.
Legenda:
silva - ID bohatera,k tóry ma się przyłączyć
bat - nazwa drużyny, do której ma się przyłączyć silva

Moje pytanie brzmi: Dlaczego przy użyciu tego makra: "{VARIABLE coord2x $($silva.x + 1)}" wesnoth wywala mi błąd o zbyt dużej liczbie argumentów w makrze?

EDIT: Haczyk naprawiony
Edytowane przez AxeFighter dnia 27-11-2014 16:11
 
Kanapka
Domyślny poziom trudności oznacza sie gwiazdką: (kod z Dziedzica Tronu:)
Pobierz kod źródłowy  Kod źródłowy
    difficulty_descriptions={MENU_IMG_TXT2 "units/elves-wood/fighter.png~RC(magenta>red)" _"Fighter" _"(Beginner)"} +
    ";*" + {MENU_IMG_TXT2 "units/elves-wood/hero.png~RC(magenta>red)" _"Hero" _"(Normal)"} +
    ";" + {MENU_IMG_TXT2 "units/elves-wood/champion.png~RC(magenta>red)" _"Champion" _"(Challenging)"}




Filar:
Mam wrażenie, że zastosowanie tego makra powinno wyglądać tak:
Pobierz kod źródłowy  Kod źródłowy
{VARIABLE coord2x ($silva.x + 1)}



Chodzi o to, że przedtem jako wartość zmiennej dawales zawartość ((zawartość silva.x) + 1), czyli zawartość (wspolrzedna numeryczna), co w sumie wygląda jak odwoływanie się do przypadkowego miejsca w pamięci.
Edytowane przez Kanapka dnia 21-06-2011 20:31
 
Filar
Dzięki, byłem pewien, że próbowałem tego zapisu, jednak teraz chciałem się upewnić i okazało się, że jest w porządku Smile

EDIT: Jednak miałem rację. Wartość tej tej sumy wynosi 4 1, przy czym 4 to wartość $silva.x

Edit:
Żeby dużo nie tłumaczyć: dadaj w pierwszym z moich eventów po name=moveto w nowej linijce "first_time_only=no", a następnie usuń tag "unstore_unit" wraz z jego zawartością. To wszystko jest już naprawione w kodzie u góry, tylko w Twoim scenariuszu nie. Smile

Typ jednostki powinieneś wpisywać taki, jaki miałeś w pierwszym scenariuszu, nawet jeśli jednostka awansowała. Nie bój się, nie zmniejszysz w ten sposób jej poziomu, pozostanie ten sam.
Edytowane przez AxeFighter dnia 27-11-2014 16:12
 
bs_grom
mam pytanie.
chciałbym by jednostka mogła zaatakować inną dwa razy ale różnymi atakami. najpierw na odległość a potem wręcz (ważna jest kolejność)
np.
12-1 odległość
a potem 6-3 wręcz.

dałem jej attacks=2 by mogła atakować 2 razy
ale nie moge sprawić by jesli najpierw zaatakowal 12-1 wręcz stracił wszystkie punkty ataku.
komenda attacks_left=0 tu nie zadziałała.
bs_grom
 
Kanapka
Możesz do ery dodać [event] name = attack_end, filtrować po typie jednostki i ataku meele, i w tym evencie ustawiać jednostce [attack] name = jakkolwiek_sie_on_nazywa attack_weight = 0 i następnie oddać jej punkty ruchu (jeżeli maja byc oddane) i możliwość atakowana - w ten sposób nie będzie mogła użyć ataku meele w tej turze. Następnie w [event] name = side_turn musisz wybrać wszystkie jednostki danego typu (prawdopodobnie trzeba je będzie zapakować do tablicy) i każdej ustawić z powrotem attack_weight taki, jak miał być.

Podobnie działa umiejętność Retreat któregoś goblina z EoMa (bez 'naprawiania' jednostki na początku rundy - połowę kodu znajdziesz tam.

Możliwe, że jest prostszy sposób na uzyskanie tego samego efektu (nie wiem, jak skomplikowane będzie 'naprawianie'Wink, ale w tym momencie nie mam lepszego pomysłu.
 
bs_grom
dzięki zobaczę.
może dokładnie wytłumacze o co mi chodzi.
chce zrobić na użytek włany jednoskę kirasjera z atakami
12 - 3 wręcz (sieczna)
15 - 1 odleg (kłująca)
15 - 2 odleg (kłująca)
kirasjer powinien móc w ofensywie zaatakować najpierw 15 -1 a potem walka wręcz
atak 15 - 2 powinien zabierac 2 pkt ataku.
15 - 1 będzie działać tylko w ofensywie i raczej wogole dwa razy nie bedzie sie go opłacało stosować skoro jest 15 -2
Notka historyczna
kirasjerzy pózniejsi(po odrzuceniu karakolu tj walki ogniowej) przed atakiem oddawali pojedyńczą salwę z pistoletu następnie szarżowali na broń biała dlatego wolałbym gdyby atak 15 -1 był pierwszy.
nie chciałbym by kirasjer mogl zaatakowac 2x wrecz. sorry za brak polskich znakow korzystam z klawiatury ekranowej.
bs_grom
 
Kanapka
a)
[event] name = moveto [filter] (nasza jednostka) (miejsce na mapie)[/filter] [unit] (to co ma się pojawić)[/unit] [message] [message] [modify_unit] [filter] (jednostka pojawiona) [/filter] side = nasza_strona [/modify_unit]

b)
Nie wiesz, czy zadziała? To sprawdź. Usuń recruit =, wpisz null, nie pisz nic. Zajmie Ci to pięć minut, a my nie będziemy musieli szukać po WMLReference.
 
Sylar
Czy zdolność zapisana w ten sposób:
Pobierz kod źródłowy  Kod źródłowy
#define ABILITY_FENCING
   [defense]
     id=Sylar_fencing
     multiply=2
     max_value=70
     name= _ "fencing"
     female_name= _ "female^fencing"
     description= _ "Fencing:
This unit is trained in fencing, so he have more chances to avoid enemy hits during the attack
     affect_self=yes
     active_on=offense
   [/defense]
#enddef



Jest poprawna i będzie działać?
Chodzi w niej o to, że podczas ataku ta jednostka ma większe szanse na uniknięcie ciosu wroga (covery mnożą się razy dwa do max 70, czyli prawie wszystkie wzrosną do 70% podczas ataku, jeśli dobrze rozumiem)
Przy okazji: czy ten opis jest dobrze napisany?
Edytowane przez Sylar dnia 14-07-2011 13:04
 
Kanapka
"... so it has a greater chance to avoid enemy hits while attacking" myślę że byłoby lepiej.

Wygląda, jakby miało zadziałać - przestestuj.
 
Sylar
Zmodernizowałem to jeszcze tak:
Pobierz kod źródłowy  Kod źródłowy
#define ABILITY_FENCING
    # Canned definition of the fencing ability to be included in an
    # [abilities] clause.
   [defense]
     id=Sylar_fencing
     multiply=2
     max_value=70
        # applies to any type if we leave it out
        #apply_to=shallow_water,reef,swamp_water,flat,sand,hills,mountains,village,castle,cave,frozen,fungus
   [filter_base_value]
     greater_than=0
     less_than=70
   [/filter_base_value]
     name= _ "fencing"
     female_name= _ "female^fencing"
     description= _ "Fencing:
This unit is trained in fencing, so it has a greater chance to avoid enemy hits while attacking"
     affect_self=yes
     active_on=offense
   [/defense]
#enddef



Ale nadal zdolność ta nie pojawia się u jednostki, jakbym w ogóle kodu nie wpisał. Sprawdzałem kilka razy, czy na pewno dobrze wszystko wpisałem.
 
Kanapka
Przeglądnąłem ReferenceWML i ta umiejetność przestała wyglądać poprawnie: nie ma umiejętności takiej jak [defense] (chyba że znalazłeś w jakiejś jednostce) - mimo to powinna się wyświetlać i nic poza tym nie robić. Lista wszystkich umiejętności rozpoznawanych przez Wesnoth jest tutaj.

Tag [defense] występuje w [special]ach broni - możesz spróbować napisać specjale do wszystkich broni używanych przez tą jednostkę. Możesz też poczarować coś z dummy ability, [event] name = attack (poczatek ataku) oraz name = attack end (koniec ataku), filtrować po posiadaniu tej umiejetności i modyfikowaniu obrony jednostki w odpowiedni sposób - dzieki temu masz umiejetność zamiast weapon speciala, ale kalkulacje szans trafienia będą błędne. Moim zdaniem weapon special lepszy.

Wrzuć erę, albo przynajmniej config jednostki i plik z umiejetnościami - łatwiej szukać błędów jeżeli można załadować ere u siebie i pogrzebać w plikach, błędy czasami są spowodowane czymś dziwnym w dziwnym miejscu.
 
Kanapka
Pobierz kod źródłowy  Kod źródłowy
[filter_opponent]
  [filter_weapon]
     [special]
        [not]
           id=nocounter
        [/not]
     [/special]
  [/filter_weapon]
[/filter_opponent]




ReferenceWml pomaga rozwiązać większość problemów tego typu.
 
Heedal
Pobierz kod źródłowy  Kod źródłowy
    #   terrain_liked=Ds,Ff,Hh,Uu,Rd



Po co ta linijka kodu?
Edytowane przez Heedal dnia 23-07-2011 16:36
www.wesnoth.com.pl/img/syg3.jpg
Twórca Ery Po Upadku (Prace wstrzymane)
Twórca linii nanokombinezonu

Saurians forever!
Nick na Steam/Uplay/Origin: Heedal
 
Kuki1537
Dla bota, żeby wchodził na bardziej korzystne dla niego tereny a nie atakował np. z bagna, a nie z wioski.


EDIT: Tak mi się przynajmniej wydaje.

EDIT2: Te literki to skróty dla każdego terenu.
Edytowane przez Kuki1537 dnia 23-07-2011 16:48
 
Filar
Ta linijka jest zahaszowana (#). Nie ma ona więc wpływu na grę. Mogła powstać np. dlatego, że autor rzeczywiście chciał wprowadzić ustawienia dla bota, ale potem zdecydował, że tymczasowo jej nie potrzebuje, ale w przyszłości może mu się przydać, dlatego nie usunął jej całkowicie.
 
Przejdź do forum:
Wygenerowano w sekund: 0.36
10,819,845 unikalne wizyty