CMUD

Forum techniczne Arkadii.
Zurwen
Posty: 756
Rejestracja: 13 lut 2009 09:37

Re: CMUD

Post autor: Zurwen »

Jakoś nie dostrzegam w czym regexp jest lepszy od pattern matchingu CMUDa.
Do kontaktów z czarodziejami służy komenda ‚zglos’ (błąd/pomysl/mg).
Dogid
Posty: 135
Rejestracja: 26 lis 2010 17:48

Re: CMUD

Post autor: Dogid »

No dobrze a jak zrobić coś takiego:

[maly ukryty elf]
[bardzo stary bialowlosy mezczyzna]

I chciałbym złapać sam opis, bez [].

Typowy sposób jaki stosowałem na łapanie opisu było stosowanie
@rasy{.|,| }
Rennz
Posty: 546
Rejestracja: 12 sty 2010 17:09
Lokalizacja: Kraków
Kontakt:

Re: CMUD

Post autor: Rennz »

~[(*)~] najprościej (-: (~ nie wiem czy konieczna, ale dla pewności można dać)
Zurwen
Posty: 756
Rejestracja: 13 lut 2009 09:37

Re: CMUD

Post autor: Zurwen »

~[(*)~] czy tam zamiast (*) wklepujesz to co ustaliliśmy parę postów wyżej:
~[(%w %w {@rasa})~]


CMUD posiada takie wygodne narzędzie, które się nazywa 'pattern' (w oknie tworzenia triggera). Można tam sprawdzać czy dany tekst pasuje/nie pasuje do naszego patternu, jakie wartości przyjmą odpowiednie zmienne pobrane z tego tekstu i parę innych użytecznych rzeczy. M.in można wpisać tekst:

[maly ukryty elf]

a potem strzałeczką 'set pattern' przesłać go do góry, otrzymując

~[maly ukryty elf~]

Teraz tylko kwestia zastąpienia 'maly ukryty elf' przez odpowiedni pattern.
Do kontaktów z czarodziejami służy komenda ‚zglos’ (błąd/pomysl/mg).
Rennz
Posty: 546
Rejestracja: 12 sty 2010 17:09
Lokalizacja: Kraków
Kontakt:

Re: CMUD

Post autor: Rennz »

Zurwen: z testerem jest jednak problem - dostałem nawet informację oficjalnie od Zuggsoftu, że często ten tester nie działa tak jak powinien (najczęściej kiedy używa się w patternie funkcji, ale nie tylko). Jest on przydatnym dodatkiem, ale też nie ma co ślepo się nim sugerować.
Fruef
Posty: 7
Rejestracja: 03 paź 2011 20:44

Re: CMUD

Post autor: Fruef »

Witam,

Mam pytanie odnośnie mapera, a właściwie podążania mapera jak się chodzi w drużynie.

Na nie których lokacjach są nietypowe opisy, jak np.
"Wraz z Xxx podazasz za Yyy przez kladke." - taki sam opjs jest w obie strony.

Na lokacji nie moge zrobić triga w "room script" bo jak przechodzę to zanim tekst z gry dotrze do Cmuda to trig przestaje działać.

Macie jakiś pomysł na podążanie mapera w takich niestandardowych sytuacjach?
Zurwen
Posty: 756
Rejestracja: 13 lut 2009 09:37

Re: CMUD

Post autor: Zurwen »

#temp w roomscripcie działał

Inna możliwość to triggery multistate, teleportujące do lokacji na mapie po wyswietleniu shorta nowej lokacji.
Czyli
Trigger: "Podazasz blabla..."
Within 2: Short lokacji. -> teleport do odpowiedniego miejsca na mapie.

Ale ja bym obstawał przy #tempach.
Do kontaktów z czarodziejami służy komenda ‚zglos’ (błąd/pomysl/mg).
Suvi
Posty: 45
Rejestracja: 07 mar 2011 00:03

Re: CMUD

Post autor: Suvi »

Fruef pisze:Na nie których lokacjach są nietypowe opisy, jak np.
"Wraz z Xxx podazasz za Yyy przez kladke." - taki sam opjs jest w obie strony.
Room script powinien być w lokacji, w której jest to wyjście, nie w docelowej.
Można też rozwiązać to inaczej, w bardziej złożony sposób, też używając room script. Triggera lepiej upakować w jedną linię, wklejam tak dla przejrzystości. Oczywiście w zmiennej @lider musisz mieć imię (może być w mianowniku) lub short prowadzącego (w narzędniku).

Kod: Zaznacz cały

#VAR nonstd_exit_desc "" "" {Wyjscia}
#VAR nonstd_exit_cmd "" "" {Wyjscia}
#ALIAS nonstd_exit {nonstd_exit_desc = %1; nonstd_exit_cmd = %2; #SH Wyjscie '%1' prowadzi na '%2'}

#TRIGGER podazasz_za {^(?:> |)(?:Wraz z.*|)[Pp]odazasz za (?:@lider\a+|kims|@lider) (.*)\.}
{
  $dir = %1;
  
  #IF ( $dir = @nonstd_exit_desc)
  {
    $dir = @nonstd_exit_cmd;
  }

  $dir = %replace( $dir, "na ", "");
  $dir = %replace( $dir, "gore", "gora");
} {Druzyna} regex
Trigger w jednej linii wygląda mało przejrzyście:

Kod: Zaznacz cały

#TRIGGER podazasz_za {^(?:> |)(?:Wraz z.*|)[Pp]odazasz za (?:@lider\a+|kims|@lider) (.*)\.} {$dir = %1;#IF ( $dir = @nonstd_exit_desc) {$dir = @nonstd_exit_cmd} $dir = %replace( $dir, "na ", "");  $dir = %replace( $dir, "gore", "gora"); } {Druzyna} regex
Jako room script w lokacji, Z KTÓREJ wychodzisz, wrzucasz tylko

Kod: Zaznacz cały

nonstd_exit "przez kladke" "polnoc"
albo

Kod: Zaznacz cały

nonstd_exit "przez kladke" "n"
albo

Kod: Zaznacz cały

nonstd_exit "na dno rozpadliny" "d"
----------------------------------
Jeszcze wersja z wykorzystaniem sqlite, bez room scriptów. Praktycznie gotowy kod, w którym wystarczy zmienić ścieżkę do mapy i ewentualnie dodać własną funkcjonalność.

Kod: Zaznacz cały

#CLASS Exits

#VAR map_db "D:\Soft\Cmud333\Arkadia\Mapa.mdb"
#VAR nonstd_exits "" {}

#TEMPVAR sql_map_check_table "SELECT name FROM sqlite_master WHERE type='table' AND name='NonStdTbl'"


#TEMPVAR sql_map_create_table "CREATE TABLE NonStdTbl ([ExitId] INTEGER PRIMARY KEY AUTOINCREMENT,[RoomId] INTEGER,[DirDesc] VARCHAR(40),[DirCmd] VARCHAR(10))"


#FUNCTION sql_map_query($query)
{ #SQLDB @map_db; #RETURN %sql( @map_db, $query) }


#ALIAS create_tables {
#IF (@sql_map_query(@sql_map_check_table).RecordCount = 0) {
#CALL @sql_map_query(@sql_map_create_table) } }


#FUNCTION sql_mapq( $cond) {
#RETURN @sql_map_query( %format( "SELECT * FROM NonStdTbl WHERE (%s)", $cond))}


#FUNCTION sql_map_select( $room, $cmd) {
$cond = %format( "RoomId=%d",$room)
#IF ($cmd) {
  $cond = %format( "%s AND DirDesc='%s'", $cond, $cmd)
} 
#RETURN @sql_mapq($cond)}


#FUNCTION sql_map_exists( $room, $cmd) {
#RETURN @sql_map_select( $room, $cmd).RecordCount}


#FUNCTION sql_map_insert($room, $desc, $dir) {
$query = "";
#IF (@sql_map_exists( $room, $desc))
{
  $query = %format( "UPDATE NonStdTbl SET DirCmd='%s' WHERE (RoomId=%d AND DirDesc='%s')", $dir, $room, $desc)
} {
  $query = %format( "INSERT INTO NonStdTbl (RoomId,DirDesc,DirCmd) VALUES (%d,'%s','%s')",$room,$desc,$dir)
}
#RETURN @sql_map_query( $query) }

#ALIAS nonstd_exit_local {
$r = %1
$desc = %2
$cmd = %3
$roomnstd = %db( @nonstd_exits, $r)
$roomnstd = %addkey( $roomnstd, $desc, $cmd)
#ADDKEY nonstd_exits $r $roomnstd
#IF (!%4) {#SH Dodaje wyjscie do lokacji nr $r. Idac '$desc' pojdziesz na '$cmd'} }


#ALIAS nonstd_exit {
$r = %1
$dir = %2
$move = %3
#IF (!$r) {$r = %roomnum}
#SH Num=$r, Dir=$dir, Move=$move
#CALL @sql_map_insert( $r, $dir, $move)
nonstd_exit_local {$r} {$dir} {$move} {%4}}


#ALIAS populate_nonstd_exits {
nonstd_exits = ""
$res = @sql_mapq( "RoomId > 0")
#WHILE ( !$res.Eof) {
  $tmp = %json($res.Item)
  $r = $tmp.RoomId
  $desc = $tmp.DirDesc
  $cmd = $tmp.DirCmd
  nonstd_exit_local {$r} {$desc} {$cmd} %1
  #CALL $res.Next
} }


#VAR exits_long_to_short "dol=d|wschod=e|poludniowy-wschod=se|zachod=w|poludniowy-zachod=sw|polnocny-wschod=ne|poludnie=s|polnoc=n|polnocny-zachod=nw|gore=u|gora=u" {} {Exits}


#TRIGGER podazasz_za_liderem {^(?:> |)(?:Wraz z.*|)[Pp]odazasz za (?:@lider\a+|kims|@lider) (.*)\.} {
$nonstd = @nonstd_exits.%roomnum
$cmd = %db( $nonstd, %1)
#IF ($cmd) {#MOVE $cmd} {
$tmp = %replace( %1, "na ", "")
#IF ($tmp = "gore") {$tmp = "gora"}
$tmp = @exits_long_to_short.$tmp
#IF (!$tmp) {$tmp = %1}
#move $tmp } } {Exits} regex

#CLASS 0
Aby dodać do lokacji niestandardowe wyjście, używa się po prostu aliasa

Kod: Zaznacz cały

nonstd_exit %roomnum "na dno rozpadliny" "d"
nonstd_exit %roomnum "przez kladke" "n"
Przy logowaniu zaś należy uruchomić alias

Kod: Zaznacz cały

populate_nonstd_exits
Fruef
Posty: 7
Rejestracja: 03 paź 2011 20:44

Re: CMUD

Post autor: Fruef »

Dzięki, potestuje ;-)
Elltharion
Posty: 20
Rejestracja: 10 lis 2011 14:46

Re: CMUD

Post autor: Elltharion »

Dzięki za poprzednią pomoc, myślałem, że nic z tego nie wyjdzie, ale chyba samo się naprawiło i działa.

Kod: Zaznacz cały

<trigger priority="2001" id="1224">
  <pattern>(%w) (%w) {@rasy}{%p|%s}</pattern>
  <value>#cw peru,black</value>
</trigger>
<var name="rasy" Autotype="A" id="1223">kobieta|polelfem|polelf|elfka|halflingiem|halfling|krasnoludem|krasnolud|niziolka|mutantka|halflinka|gnomem|gnom|krasnoludka|elfem|elfa|elf|gnomke|gnomka|niziolkiem|niziolek|mezczyzne|mezczyzna|polelfka|mutantem|mutanta|mutant|mutantke|mutantka|ogrem|ogra|ogr|ogrzyca</var>




Teraz mam kilka innych problemów:

a)
co zrobić jak: mam tak zeby jesli:
znajduje zzz yyy cos

to zamienialo zzz yyy cos (uu+)

Chodzi o ogólna zasadę robienia trigów do takich var
to sobie kolegów podepnę
zioła i co tam sobie zechcę

b)
Jak zrobić, żeby mi kolorowało to co chcę w subie?
Pomijam te dopasowanie do @rasy i jakieś nie wiadomo jakie "if" czy nawet wyciąganie kolegów z drużyny poprzez @var, ale jak zrobić w samym subie zwykły trig na kolorowanie? Coś jak to

zzzz zaslania yyy przed ddd

Kod: Zaznacz cały

(*) zrecznie zaslania (*) przed ciosami (*).$
#SUB {--->> > %1 < - !!ZASLANIA!! - >> %2 << PRZED >> %3 <<}
c) Możliwe żeby Cmud lagował przez skrypty, bo coś przestał chodzić tak płynnie, a mam chyba wystarczającego lapka... skoto 7 na nim chodzi płynnie.
ODPOWIEDZ