Page 1 of 1
Как спросить у пользователя переменную?
Posted: 2006-05-14 11:46:25
by 1a2a3a4a5a6a
Криво тему назвал, ну да ладно.
Суть в том, что мне нужно спросить у пользователя переменную.
Чтобы к переменной 'x' присваивалось то значение, что пользователь укажет. Укажет, естественно в самой игре, а не в скрипте.
Если такое вообще возможно, конечно.

Re: Как спросить у пользователя переменную?
Posted: 2006-05-14 12:16:47
by Kynep
1a2a3a4a5a6a wrote:Криво тему назвал, ну да ладно.
Суть в том, что мне нужно спросить у пользователя переменную.
Чтобы к переменной 'x' присваивалось то значение, что пользователь укажет. Укажет, естественно в самой игре, а не в скрипте.
Если такое вообще возможно, конечно.

Вполне возможно, только нужен АСМ, а функция такая:
Code: Select all
string asmInputString(string Request[, string PreValue])
Функция выводит на экран диалоговое окно ввода строки. Параметр Request это тот вопрос, на который пользователь должен ответить. Результатом функции является ответ пользователя. Функция вернет пустую строку если пользователь уклонился от ответа.
Если задан необязательный параметр PreValue, то его значение окажется в поле ввода строки. В противном случае поле ввода строки будет пустым и пользователю придется самостоятельно его заполнить.
Posted: 2006-05-14 14:18:50
by 1a2a3a4a5a6a
А без АСМ вообще никак?
Posted: 2006-05-14 15:06:18
by flake
Если у тебя несколько вариантов ответа, то можно. Если много, то впринципе тоже можно, но муторно.
Posted: 2006-05-14 16:26:14
by Kynep
1a2a3a4a5a6a wrote:А без АСМ вообще никак?
Только по журналу читать, сам понимаешь что это ненадежно и без смысленно...
Posted: 2006-05-14 17:37:38
by 1a2a3a4a5a6a
Cooper wrote:1a2a3a4a5a6a wrote:А без АСМ вообще никак?
Только по журналу читать, сам понимаешь что это ненадежно и без смысленно...
Смысл есть. А набросочек можно?
Posted: 2006-05-14 19:59:01
by Kynep
1a2a3a4a5a6a wrote:Cooper wrote:1a2a3a4a5a6a wrote:А без АСМ вообще никак?
Только по журналу читать, сам понимаешь что это ненадежно и без смысленно...
Смысл есть. А набросочек можно?
Лучше ASM поставь, на пару килобайт меньше будет, да и голову ломать не надо
Posted: 2006-05-14 21:10:43
by flake
mess - массив с вариантами ответа
ch - соответствующий массив с выбором.
Code: Select all
for a = 1 to num
if uo.injournal(mess[a]) then
choise = ch[a]
endif
next
Posted: 2006-05-14 21:28:17
by 1a2a3a4a5a6a
Спасибо. Я правильно намолевал?
Code: Select all
sub vibor()
VAR a, choise
DIM mess[5]
mess[0]=10
mess[1]=20
mess[2]=30
mess[3]=40
mess[4]=50
DIM ch[5]
mess[0]=10
mess[1]=20
mess[2]=30
mess[3]=40
mess[4]=50
for a = 0 to 4
if uo.injournal(mess[a]) then
choise = ch[a]
endif
next
end sub
Posted: 2006-05-14 21:49:40
by DerMeister =)
Блин, парни, вы чего тут такое выдумываете?
А не проще тогда прям из журнала брать?
Например придумываешь кодовае слово, после которого должно идти то что ты хочешь спросить. Например так:
Code: Select all
sub waitingforvalue()
while not uo.injournal('секр слово')
wait(100)
wend
var string=uo.journal(uo.injournal('секр слово')-1)
string=GetWord(string,тут с учётом вашего ника и т.д. написать номер)
return string
end sub
#А тут превеед от Edred'a =)
Sub GetWord( st, nom )
; (c) Edred
; Возвращает слово из строки str за номером num
; если такого слова нет - возвращаем ''
;
; Разделителем слов считаем пробел. Несколько пробелов подряд считаются за один.
; Функция сделана без рекурсии специально для считывания слов из сверхдлинных строк!
;
VAR tmpst, i, dlin, kol = 0, start = 0
dlin = len( st )
For i=0 To dlin - 1
If mid( st, i, 1 ) == ' ' OR i == dlin - 1 Then
kol = kol + 1
If kol == nom Then
; это первый пробел после нужного нам слова
tmpst = mid( st, start, i - start )
return tmpst
Else
While mid( st, i, 1 ) == ' '
i = i + 1
Wend
If kol == nom - 1 Then
start = i
Endif
Endif
Endif
Next
tmpst = ''
return tmpst
endsub
Самое изящьное решение =)
Как пользоватся: пишем в консоли кодовое слово (например asd) потом то что нам нужно и жмём ентер:
чкрипт сам схватит это число, только не забываем про числа/строки =)
Удачи...
Posted: 2006-05-15 06:05:38
by 1a2a3a4a5a6a
Окей. Вчера не получилось, возможности не было, а сегодня попробую.
Posted: 2006-05-15 15:33:10
by 1a2a3a4a5a6a
Der, а что значит "тут с учётом вашего ника и т.д. написать номер" ?
Posted: 2006-05-15 16:12:51
by DerMeister =)
1a2a3a4a5a6a wrote:Der, а что значит "тут с учётом вашего ника и т.д. написать номер" ?
Там же для
Sub GetWord( st, nom ) Edred оставил свои комментарии.
Тебе нужно брать последнее слово из строчки. Слова разделены пробелами; если у тебя ник чара состоит из двух слов, а не из одного, то и номер num нужно будет другой передавать.
Если бы я делал под себя, то я бы поставил num=3. Всё зависит от шарда и ника чара. Вобщем, я думаю, тебе по силам разобратся... Поэкспериментируй.
Posted: 2006-05-20 16:17:03
by 1a2a3a4a5a6a
С этим числом все равно ничего не понял. Пробовал достаточно большой промежуток. Никаких результатов. Даже сама функция запускается и сразу пропадает.
Posted: 2006-05-20 16:21:52
by 1a2a3a4a5a6a
Я так понял, что это он второй раз не хочет запускаться. Приходится перезапускать инжект, а с ним и игру.
Posted: 2006-05-20 16:22:18
by 1a2a3a4a5a6a
А в какую переменную он сохраняет число при удачной попытке?
Posted: 2006-05-21 22:00:45
by DerMeister =)
Неужели тебе
ни о чём не говорит?
Пишешь в своём главном скрипте и всё ок:
Вобщем для тебя выкладываю 100% рабочий вариант с примером:
В моём случае кодовым словом было "asd", num=3 (Когда я произносил в клиенте строчку "
asd 1234", в журнале было написано: "
DerMeister: asd 1234", тоесть мне нужно было "схватить" третье по счёту слово из строки журнала [не забывай: разделители слов -
ПРОБЕЛЫ]...)
Code: Select all
sub main()
var x
wait(2000)
uo.print("Vvedite X")
x=waitingforvalue()
wait(2000)
uo.print(x)
end sub
sub waitingforvalue()
uo.deletejournal()
while not uo.injournal('asd')
wait(100)
wend
var string=uo.journal(uo.injournal('asd')-1)
string=GetWord(string,3)
return string
end sub
#А тут превеед от Edred'a =)
Sub GetWord( st, nom )
; (c) Edred
; Возвращает слово из строки str за номером num
; если такого слова нет - возвращаем ''
;
; Разделителем слов считаем пробел. Несколько пробелов подряд считаются за один.
; Функция сделана без рекурсии специально для считывания слов из сверхдлинных строк!
;
VAR tmpst, i, dlin, kol = 0, start = 0
dlin = len( st )
For i=0 To dlin - 1
If mid( st, i, 1 ) == ' ' OR i == dlin - 1 Then
kol = kol + 1
If kol == nom Then
; это первый пробел после нужного нам слова
tmpst = mid( st, start, i - start + 1 )
return tmpst
Else
While mid( st, i, 1 ) == ' '
i = i + 1
Wend
If kol == nom - 1 Then
start = i
Endif
Endif
Endif
Next
tmpst = ''
return tmpst
end sub
ЗЫ:Можно еще проверку на серийник сообщения приляпать, но это ты уж сам как нить...
ЗЗЫ: Я хз, но почему-то в оригинале процедуры GetWord( st, nom ) , она возвращала слово, но БЕЗ последней буквы (видимо это происходит только когда берешь последнее слово из строки (я там подправил чтоб всё норм было для случая, когда посленее слово берём)).
Posted: 2006-05-21 22:16:13
by Edred
Был в каких-то версиях GetWord этот глюк, я обычно, чтобы не заморачиваться, просто во все строки, которые потом гетвордом пилил, в конец пробел добавлял.
Posted: 2006-05-21 22:32:05
by DerMeister =)
Edred wrote:Был в каких-то версиях GetWord этот глюк, я обычно, чтобы не заморачиваться, просто во все строки, которые потом гетвордом пилил, в конец пробел добавлял.
Ну я так и понял

... просто неудобно ему будит пробел добавлять, тем более ему же последнее слово надо, так что я там +1 селал и всё ок -)
ЗЫ: Сам разберётся если ему это надо -)
Posted: 2006-05-22 01:47:39
by Edred
DerMeister =) wrote:просто неудобно ему будит пробел добавлять, тем более ему же последнее слово надо, так что я там +1 селал и всё ок -)
Плюс 1 катит только если тебе последнее слово надо, иначе он будет возвращать слово плюс пробел. А это некорректно. Проще прямо в функции перед считыванием длины добавить в строку в конец пробел.