Как спросить у пользователя переменную?

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Как спросить у пользователя переменную?

Post by 1a2a3a4a5a6a »

Криво тему назвал, ну да ладно.
Суть в том, что мне нужно спросить у пользователя переменную.
Чтобы к переменной 'x' присваивалось то значение, что пользователь укажет. Укажет, естественно в самой игре, а не в скрипте.
Если такое вообще возможно, конечно. :)
Kynep
Expert!
Posts: 1348
Joined: 2006-02-07 08:51:40
Location: г. Старый Оскол
Contact:

Re: Как спросить у пользователя переменную?

Post by Kynep »

1a2a3a4a5a6a wrote:Криво тему назвал, ну да ладно.
Суть в том, что мне нужно спросить у пользователя переменную.
Чтобы к переменной 'x' присваивалось то значение, что пользователь укажет. Укажет, естественно в самой игре, а не в скрипте.
Если такое вообще возможно, конечно. :)


Вполне возможно, только нужен АСМ, а функция такая:

Code: Select all

string asmInputString(string Request[, string PreValue])
Функция выводит на экран диалоговое окно ввода строки. Параметр Request это тот вопрос, на который пользователь должен ответить. Результатом функции является ответ пользователя. Функция вернет пустую строку если пользователь уклонился от ответа.
Если задан необязательный параметр PreValue, то его значение окажется в поле ввода строки. В противном случае поле ввода строки будет пустым и пользователю придется самостоятельно его заполнить.
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

А без АСМ вообще никак?
flake
Expert!
Posts: 746
Joined: 2004-08-11 23:56:17
Location: The Citadel
Contact:

Post by flake »

Если у тебя несколько вариантов ответа, то можно. Если много, то впринципе тоже можно, но муторно.
Kynep
Expert!
Posts: 1348
Joined: 2006-02-07 08:51:40
Location: г. Старый Оскол
Contact:

Post by Kynep »

1a2a3a4a5a6a wrote:А без АСМ вообще никак?


Только по журналу читать, сам понимаешь что это ненадежно и без смысленно...
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

Cooper wrote:
1a2a3a4a5a6a wrote:А без АСМ вообще никак?


Только по журналу читать, сам понимаешь что это ненадежно и без смысленно...

Смысл есть. А набросочек можно?
Kynep
Expert!
Posts: 1348
Joined: 2006-02-07 08:51:40
Location: г. Старый Оскол
Contact:

Post by Kynep »

1a2a3a4a5a6a wrote:
Cooper wrote:
1a2a3a4a5a6a wrote:А без АСМ вообще никак?


Только по журналу читать, сам понимаешь что это ненадежно и без смысленно...

Смысл есть. А набросочек можно?


Лучше ASM поставь, на пару килобайт меньше будет, да и голову ломать не надо
flake
Expert!
Posts: 746
Joined: 2004-08-11 23:56:17
Location: The Citadel
Contact:

Post by flake »

mess - массив с вариантами ответа
ch - соответствующий массив с выбором.

Code: Select all

for a = 1 to num
  if uo.injournal(mess[a]) then
    choise = ch[a]
  endif
next
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post 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
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post 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) потом то что нам нужно и жмём ентер:

Code: Select all

asd 10
чкрипт сам схватит это число, только не забываем про числа/строки =)
Удачи...
DerMeister сейчас на нейрале!
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

Окей. Вчера не получилось, возможности не было, а сегодня попробую.
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

Der, а что значит "тут с учётом вашего ника и т.д. написать номер" ?
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

1a2a3a4a5a6a wrote:Der, а что значит "тут с учётом вашего ника и т.д. написать номер" ?

Там же для Sub GetWord( st, nom ) Edred оставил свои комментарии.
Тебе нужно брать последнее слово из строчки. Слова разделены пробелами; если у тебя ник чара состоит из двух слов, а не из одного, то и номер num нужно будет другой передавать.
Если бы я делал под себя, то я бы поставил num=3. Всё зависит от шарда и ника чара. Вобщем, я думаю, тебе по силам разобратся... Поэкспериментируй.
DerMeister сейчас на нейрале!
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

С этим числом все равно ничего не понял. Пробовал достаточно большой промежуток. Никаких результатов. Даже сама функция запускается и сразу пропадает.
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

Я так понял, что это он второй раз не хочет запускаться. Приходится перезапускать инжект, а с ним и игру.
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

А в какую переменную он сохраняет число при удачной попытке?
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Неужели тебе

Code: Select all

...return string
...

ни о чём не говорит? :lol:

Пишешь в своём главном скрипте и всё ок:

Code: Select all

...
x=waitingforvalue()
...


Вобщем для тебя выкладываю 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 ) , она возвращала слово, но БЕЗ последней буквы (видимо это происходит только когда берешь последнее слово из строки (я там подправил чтоб всё норм было для случая, когда посленее слово берём)).
DerMeister сейчас на нейрале!
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Был в каких-то версиях GetWord этот глюк, я обычно, чтобы не заморачиваться, просто во все строки, которые потом гетвордом пилил, в конец пробел добавлял.
Ни один скрипт не работает? Пора обновить Инжект...
Все работает, но хочется большего? Пора переходить на стелс...
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Edred wrote:Был в каких-то версиях GetWord этот глюк, я обычно, чтобы не заморачиваться, просто во все строки, которые потом гетвордом пилил, в конец пробел добавлял.
Ну я так и понял :wink: ... просто неудобно ему будит пробел добавлять, тем более ему же последнее слово надо, так что я там +1 селал и всё ок -)
ЗЫ: Сам разберётся если ему это надо -)
DerMeister сейчас на нейрале!
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

DerMeister =) wrote:просто неудобно ему будит пробел добавлять, тем более ему же последнее слово надо, так что я там +1 селал и всё ок -)


Плюс 1 катит только если тебе последнее слово надо, иначе он будет возвращать слово плюс пробел. А это некорректно. Проще прямо в функции перед считыванием длины добавить в строку в конец пробел.
Ни один скрипт не работает? Пора обновить Инжект...
Все работает, но хочется большего? Пора переходить на стелс...
Post Reply