Вопросы по JBF

 

BLaS

новичок
Бал
вот так вот можно отправить из html переменную в слово:
bypass -h jbf_Auction_start: $id_item" >
и она оказывается на вершине стека

но как отправить сразу 2?

так у меня не получается: (
bypass -h jbf_Auction_start: $id_item1  $id_item2" >
 

BLaS

новичок
ладно бог с ними с 2мя параметрами
помоги плзз вот с этим кодом:

code text
  1.  добавляем диалог акционеру в Дионе
  2. : npc-7767-dialog-append
  3. '
  4. <a action="bypass -h jbf_Auction">Auction</a>
  5. ' .
  6. ;
  7.  получаем ID item
  8. : bypass_Auction_temp:
  9.         DUP show  показываем id_item
  10.         player@ inventory? 0 > if "OK" show проверяем наличие id_item в инвентаре
  11.         then
  12. ;
  13.  начало разговора с аукционером
  14. : bypass_Auction
  15.         auc_run? if "Auction running, please wait" show exit then
  16.         "jbforth/auction/change.htm" show
  17. ;


html (change.htm):
code text
  1. <html><body>Auctioner
  2.  
  3.  
  4. Wow thanks!
  5.  
  6. Please make your rate
  7. <table width=250><tr>
  8. <td><font color="LEVEL">Enter rate:</font></td>
  9. <td><edit var="change" width=80 height=15></td>
  10. <td><button value="OK" action="bypass -h jbf_Auction_temp: $change" width=40 height=15 back="sek.cbui94" fore="sek.cbui92"></td>
  11. </tr></table>
  12. </body></html>

почему слово bypass_Auction_temp начинает ругатся?
DUP show - вот здесь я вывожу то что попало в стек - все правильно
но дальше inventory? начинает ругатся
когда я непосредственно пишу:
24 player@ inventory? 0 > if "OK" show
все работает
но ведь item_id должно быть в стеке сверху и указывать его не надо
то есть достаточно
player@ inventory? 0 > if "OK" show
в чем ошибка?
 
+
-
edit
 

Balancer

администратор
★★★★★
BLaS:
но как отправить сразу 2?

так у меня не получается: (
bypass -h jbf_Auction_start: $id_item1  $id_item2" >
 


Оба параметра придут на стек как строка. Можно извлекать, например, разбив на части по пробелу, преобразовав параметры в список по слову explode. Но тебе, думаю, удобнее сразу вытащить N аргументов. Для двух: 2 args. Со стека снимется строка и положатся две её первых отделённых пробелами составляющих.
 
+
-
edit
 

Balancer

администратор
★★★★★
BLaS:
почему слово bypass_Auction_temp начинает ругатся?
 


Ты не написал на что начинает ругаться.

Первое предположение, что у тебя не стоит пробел после обратного слеша в комментарии "проверяем наличие", т.к. обратный слэш - полноценное Форт-слово и должно отделяться пробелами от других слов. Единственные исключения в моей сборке в этом смысле - это восприятие кусков текста, начинающихся с кавычки как строк.
 

BLaS

новичок
спасибо за N args
комментарии я добавил непосредственно при посте на форум в коде их нет
в попытке найти ошибку с inventory? я упростил код и вот какие странные вещи:

простой код, я сообщаю слову номер item а оно говорит есть у меня в инвентаре такой или нет.

: test2 @player inventory? 0 > if "find item" announce drop exit then "not find item" announce drop;

создаем в инвентарь к примеру item 23
пишем в консоли //test2 23
пишет find item -> inventory? срабатывает правильно
снова пишем в консоли //test2 23
пишет find item -> inventory? срабатывает правильно
пишем //test2 24
пишет find item --- ? нету у меня item 24!
пишем //test2 23
пишет not find item --- а 23 меня то есть
пишем //test2 23
пишет find item -> inventory? срабатывает правильно

такое чуство что inventory? работает с прошлым введенным значением, почему тогда 1 раз все правильно срабатывает, такое поведение остается для меня загадкой :(
 
+
-
edit
 

Balancer

администратор
★★★★★
Погоди. Для GM есть два способа вызова Форт-слов. Если ты пишешь
//test2, то система сперва ищет слово gm_test2. Если находит - то передаёт ему остаток строки параметром.

Иначе - она выполняет введённую строку как выражение Форта. Естественно, не делая никаких попыток парсинга остатка строки самостоятельно.

Так что ты чётко различай, что вызываешь :) Слова gm_* были сделаны специально для GM'ов с уровнем доступа ниже, чем GM_USE_FORTH. Отсюда и "подбор" остатка строки и т.п. Слово само должно заботится о безопасности и т.д.

Если ты хочешь, чтобы обычное Форт-слово забрало за собой остаток входной строки, то ты должен об этом позаботиться явно. Например, слово TAIL возвращает остаток командной строки на стек.
 

BLaS

новичок
> Погоди. Для GM есть два способа вызова Форт-слов. Если ты пишешь
> //test2, то система сперва ищет слово gm_test2. Если находит - то передаёт ему остаток строки параметром.
> Иначе - она выполняет введённую строку как выражение Форта. Естественно, не делая никаких попыток
> парсинга остатка строки самостоятельно.
> Так что ты чётко различай, что вызываешь Слова gm_* были сделаны специально для GM'ов с уровнем
> доступа ниже, чем GM_USE_FORTH. Отсюда и "подбор" остатка строки и т.п. Слово само должно заботится о
> безопасности и т.д.
> Если ты хочешь, чтобы обычное Форт-слово забрало за собой остаток входной строки, то ты должен об этом
> позаботиться явно. Например, слово TAIL возвращает остаток командной строки на стек.

чтото у меня все перемешалось 8) - этот текст я еще 2 дня буду переваривать %)
я пишу //test2 23 слова gm_test2 у меня точно нету, значит остаток строки 23 не парсится, но до слова test2 то он доходит тем неменее хотя и непонятно по какому принципу

ладно отойдем от ввода команд с остаткими строк :) я создал код следующего вида
code text
  1. : test2   слово проверяет есть ли в инвентаре игрока вещь
  2. player@ inventory? 0 > if "find item" announce drop exit  выводится find item если вещь есть
  3. then "no find item" announce drop  выводится no find item если вещи нету
  4. ;
  5.  
  6. : test3
  7.         '23' announce test2 23   вызов с ID 23
  8.         '23' announce test2 23   вызов с ID 23
  9.         '24' announce test2 24   вызов с ID 24
  10.         '23' announce test2 23   вызов с ID 23
  11.         '24' announce test2 24   вызов с ID 24
  12.         '23' announce test2 23   вызов с ID 23
  13. ;


в инвентарь кладется вещь с ID 23
вводим //test3 (без всяких остатков командной строки)
Announcements: 23
Announcements: find item
Announcements: 23
Announcements: find item
Announcements: 24
Announcements: find item
Announcements: 23
Announcements: no find item
Announcements: 24
Announcements: find item
Announcements: 23
Announcements: no find item

но почему?
 

BLaS

новичок
уж очень хочется написать аукцион :)
 
+
-
edit
 

Balancer

администратор
★★★★★
>я пишу //test2 23 слова gm_test2 у меня точно нету, значит остаток строки 23 не парсится, но до слова test2 то он доходит тем неменее хотя и непонятно по какому принципу

Всё просто. Если gm_test2 нет, то у тебя получается вот что. Сперва вызывается слово test2. которое что-то снимает со стека. Потом - обрабатывается 23 и помещается на стек. Это число и использует следующая команда. Между админскими вызовами стек сохраняется. Его всегда можно посмотреть по .s (точка-S)

Если тебе нужно передать число слову, то пиши //23 test2. Поместить в стек 23, вызвать test2, которое им воспользуется.

Есть ещё вариант. Если нужно передать одно число, то слово может его само взять из входного потока. Например, по TAIL будет захвачено всё до конца строки. Или по NextWord - возмётся из входного потока один параметр.

: test2 слово проверяет есть ли в инвентаре игрока вещь
player@ inventory? 0 > if "find item" announce drop exit выводится find item если вещь есть
then "no find item" announce drop выводится no find item если вещи нету
;

> '23' announce test2 23 вызов с ID 23
> '23' announce test2 23 вызов с ID 23

Надо так:
'23' announce 23 test2 23 вызов с ID 23
'24' announce 24 test2 24 вызов с ID 24

или даже так:
23 dup announce test2
24 dup announce test2

(announce любой аргумент со стека сам снимет как строку, так что можно прямо число подавать).

Кстати, для простой отладки announce не обязательно. Слово "точка" (.) печатает параметр со стека в обычное меню чата (через SendMessage).
 
+
-
edit
 

Balancer

администратор
★★★★★
Вообще, во избежание путаницы лучше, чтобы слово вперёд по потоку никогда не заглядывало. В этом и прелесть обратной польской записи - всегда однозначность. Без всяких скобок и т.п. Если одно слово вызывается раньше второго, то можно на второе вообще не обращать внимания.

test 23 - рассматривая "test", на "23" можно не смотреть вообще :) Всё выполняется строго последовательно. И поэтому заглядывания вперёд по тексту - это моветон. Пусть и полезный, например, при создании переменных, новых слов и т.п.
 

BLaS

новичок
ага вот значит как! Надо было догадаться :) картина проясняется, жаль сейчас проверить негде, завтра потестю, пасиб
 

BLaS

новичок
вот вопросы подвалились:

1. вроде как слово NextWord jbf неизвестно, также как и N args вызвало у него сомнения
2. все таки не работает простой код:

code text
  1. <td><font color="LEVEL">Enter rate:</font></td>
  2. <td><edit var="change" width=80 height=15></td>
  3. <td><button value="OK" action="bypass -h jbf_Auction_temp: $change" width=40 height=15 back="sek.cbui94" fore="sek.cbui92"></td>


code text
  1. : bypass_Auction_temp: s. player@ inventory? 0 > if "OK" show then ;


и вот когда я ввожу число пр.54 и щелкая по кнопочке ОК, какая штука выскакивает в консоли:


54 Exception while execute word 'INVENTORY?' in word 'bypass_Auction_temp:'.
: bypass_Auction_temp: .S PLAYER@ `INVENTORY?~ LIT 0 > ?BRANCH 9 LIT OK show ;
java.lang.ClassCastException: java.lang.String
Exception while execute word '>' in word
'bypass_Auction_temp:'.
: bypass_Auction_temp: .S PLAYER@ INVENTORY? LIT 0 ~>~ ?BRANCH 9 LIT OK show ;
java.lang.ArrayIndexOutOfBoundsException: -1

видно что в стеке лежит чтото очень похожее на 54
вот первая догадка что inventory? работает только с числами, а хтмл ка отдает параметры как строку
тоесть надо сделат преобразование типа мб?
конечно хорошо когда известно какой ID итема надо проверить в инвентаре тогда непосредственно написать его в коде, но когда надо проверить любой item, что же делать?
 

BLaS

новичок
ап!
у меня все застопорилось на вводе ID итема через html и проверки наличия его в инвентаре :(
 
+
-
edit
 

Balancer

администратор
★★★★★
>1. вроде как слово NextWord jbf неизвестно,

Значит, next-word :) Это у меня с SPF4 в голове путаница.

>также как и N args вызвало у него сомнения

Оно появилось не так давно, дня три назад. М.б. у тебя сборка постарше. Описано в датапаке. data/jbforth/jbf/L2j.f

>java.lang.ClassCastException: java.lang.String
>видно что в стеке лежит чтото очень похожее на 54
>вот первая догадка что inventory? работает только с числами, а хтмл ка отдает параметры как строку

Да, автоматически отпарсенные параметры приходят на вход слова всегда как строки. Прибавь к строке хоть ноль, что ли, должна в число преобразоваться :D Слово + при снятии параметров со стека делает попытки их преобразования в число.

>конечно хорошо когда известно какой ID итема надо проверить в инвентаре тогда непосредственно написать его в коде, но когда надо проверить любой item, что же делать?

Не совсем понял задачу но, например, переменные можешь задействовать :)
 

BLaS

новичок
улетел в Дион, мучать акционера :)

УРА! Великой нолик - помог мне! Алилуйя!!! пасиб!
 

BLaS

новичок
Бал включишь себе слово item_pay ? на самом деле удобно, только надо бы сделать чтобы item? проверяло также и кол-во вещей, но я не знаю как .

code forth
  1. : item? ( id -- id f )
  2.          Have current player item with id or not?
  3.         DUP player@ inventory? 0 >
  4. ;
  5.  
  6. : item_pay ( id --  )  remove item from player if exists. Exit from called word if not have.
  7.         item? not if    drop "You have not this item" show rdrop exit
  8.         then 1 player@ inventory-! drop
  9. ;
 
+
-
edit
 

Balancer

администратор
★★★★★
У меня так:

code forth
  1. : items_remove  ( count_to_remove item_id -- )
  2.      remove count items from inventory. Exit from calling word if not have.
  3.     2dup items# (  count_to_remove  item_id  count_to_remove have_count  )
  4.     > if  not enough items
  5.         "Not enough items. Need " .
  6.         over .                       print count
  7.         .                            print item name
  8.         1 > if "s" . then            print "s" if multiple items
  9.         rdrop exit                   exit from calling word
  10.     then
  11.     swap player@ inventory-! drop
  12. ;
 

BLaS

новичок
в данном коде на 2dup у меня жалуется, ты его недавно добавил?
 
+
-
edit
 

Balancer

администратор
★★★★★
BLaS:
в данном коде на 2dup у меня жалуется, ты его недавно добавил?
 


2dup выложен на SVN 27-го числа - 404 Not Found

Если влом обновляться, можешь его описать сам через
code forth
  1. : 2dup   over over ;
 

BLaS

новичок
с items# такая же история?
сегодня ночью обновлюсь
 
+
-
edit
 

Balancer

администратор
★★★★★
items# описан уже в датапаке. А вот его я пока не обновлял из-за потенциальных проблем нестыковок C3 и C4. Придётся Форт-скрипты из датапака в сервер переносить :)
 
+
-
edit
 

Balancer

администратор
★★★★★
code forth
  1. : items#  ( item_id -- count )
  2.      Return count of items for curent player
  3.     player@ inventory?
  4. ;
 

BLaS

новичок
Balancer:
Придётся Форт-скрипты из датапака в сервер переносить :)
 


не хотелось бы если честно, в них подглядывать можно :), хотя если необходимо то конечно
 
+
-
edit
 

Balancer

администратор
★★★★★
Дык, они так и так доступны будут :D В каждой серверной сборке, ведь, папка data/ присутствует :D
 

BLaS

новичок
я уже почти сделал тестовый аукцион, принимают вещь, ставку, аукцион идет в три цикла (раз, два, три - продано) когда ставку перебивают цикл повторяется снова пока не продастся, ну вообщем как нормальный аукцион
каждый игрок может вызвать команду .auc где в окошке ему дадут инфу по текущему аукциону, вещь , кто продает, текущая ставка и сделать (перебить) свою ставку.
ессно идут все проверки на наличие вещей аден работы аукциона и тд и тп.

нехватает следующих вещей:
- вывода сообщений в Trade канал, сейчас объявления аукциона выкидываются в announce
- как зная ID вещи вывести окошечко с инфой которое выпрыгивает например когда на вещь щелкаешь в инвентаре или в магазине.
- как зная ID вещи получить ее название.
- ну и для полного счастья сейчас аукционер спрашивает ID вещи которую ты выставляешь на аукцион, игрокам это будет неудобно, чтобы выставить на аукцион надо будет знать ID вещи, как организовать окошко как при обмене или торговле,складе например.

вот очень бы хотелось иметь решения этих пунктов на jbf :) мб как нибудь сделаешь, поддучу яву буду пытатся разбиратся с такими проблемами лично, честна честна :)
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru