UoKit.com Форумы > Кликер > UO Pilot
Страницы: 1, 2
fabbeg
Доброго дня!
Есть текстовая игра, где результат выводится в форме сообщения каждый раз при вводе команды.
пишу такой скрипт

Код
log mode compact
showwindow
wait 1000
left 837, 794 abs
sendex ^{A}
sendex ^{C}
send esc
get clipboard %a string
for #i 1 size(%a)                
   set $regexp "fab has \d*/\d*,\d{2,3}"
   set #n regexp (#position $hitstring %a[#i] $regexp)
   if #n = 1
       log $hitstring
   end_if
end_for


выдается 1 результат (собственно и должен быть один).
После этого пытаюсь забрать результат в переменную командой
Код
set $a $hitstring

и выдать уже
Код
log $a

лог выдает -1
что не так делаю?
Вверх
DarkMaster
Для воспроизведения проблемы предоставьте, пожалуйста:
1) Входной текст.
2) Промежуточый вывод $hitstring
3) Собственно присвоение переменной.
Т.е. код одним куском, чтобы его можно было запустить и увидеть ошибку без редактирования.

Предварительный вариант: в распарсенной строке содержется текст идентичный именам функций пилота, что приводит к попыткам преобразования.

В зависимости от того, что именно вам нужно можно:
1) Попросить кнайта сделать неформатируемый вывод в лог (я уже упрашиваю, например, сейчас )
2) Использовать луа для форматирования строк и вывода результата в файл.
3) Разбивать текст на куски и присваивать его массиву:
set %a[1 1] мам
set %a[1 2] а мы
set %a[1 3] ла р
set %a[1 4] аму
log %a[1]
Обратите внимание на индексы. Присвоение идет двумерному массиву, а вывод, как одномерного.
Вверх
cirus
Цитата
left 837, 794 abs
sendex ^{A}
sendex ^{C}

Неплохо быть ставить паузы хотя бы 100-200 мсек, текст может не успеть выделиться и скопироваться.
Вверх
fabbeg
Код
 log mode compact
showwindow
left 837, 794 abs
sendex ^{A}
sendex ^{C}
send esc
get clipboard %a string
for #i 1 size(%a)              
   set $regexp "Афанасий Фет has \d*/\d*,\d{2,3}"
   set #n regexp (#position $hitstring %a[#i] $regexp)
   if #n = 1
       log $hitstring
   end_if
end_for
  set $b $hitstring
log $b
end_script

такой скрипт
Код
!========[ Афанасий Фет's Adventure ]========!
% Rolled a 3
- Lost 79 HP.
+ Dealt 50 HP Damage
+ Killka dealt 41 HP damage.
- Killka took 40 HP Damage.
+ Killka has 373/712 HP left
+ Афанасий Фет has 843/1,150 HP left.
+ The enemy Rectex has 768/950 HP left.
!=============================================!

это копируется в буфер

Код
Афанасий Фет has 843/1,150
-1

это выдает в лог

Вверх
DarkMaster
Цитата
843/1,150

Проблема тут. Пытается математику провернуть. Рекомендую разбить строку на несколько кусков, как самый простой варимант.
Вверх
fabbeg
DarkMaster, а как ее разбить если он ее в переменную даже не загоняет?
Вверх
DarkMaster
Я бы регекспом бил.
Вверх
fabbeg
Код

log mode compact
showwindow
wait 2000
left 392, 980
wait 100
send !clear 100
wait 100
send enter
wait 3000
left 392, 980
wait 100
send #!adv
wait 100
send enter
wait 3000


left 837, 794 abs
wait 100
sendex ^{A}
wait 100
sendex ^{C}
wait 100
   send esc
   wait 100
  get clipboard %a string
  //анализ игрока начало//
   for #i 1 size(%a)
   set $regexp "Фет has \d*"
   set #n regexp (#position $hitstring %a[#i] $regexp)
   if #n = 1
           set $hp $hitstring
         end_if
end_for

get word $myhp 3 $hp
log у тебя $myhp жизней
wait 1000
//анализ игрока кончало//


//анализ пэта начало//
  for #i 1 size(%a)
   set $regexp "Killka has \d*"
   set #n regexp (#position $hitstring %a[#i] $regexp)
   if #n = 1
           set $hp $hitstring
         end_if
end_for

get word $pethp 3 $hp
log у пэта $pethp жизней
wait 1000
//анализ пэта кончало//

//исполнение хила начало//
if ($myhp > 800) or ($myhp = 1)
log у тебя все норм
wait 1000
else
log хиляюсь
left 392, 980
    wait 100
send #!heal auto
wait 100
send enter
wait 100
end_if
end_if
//исполнение хила конец//

//исполнение хила пэта начало//
if ($pethp > 600) or ($pethp = 1)
log у пэта все норм
wait 1000
else
log хиляю пэта
wait 100
left 392, 980
wait 100
send #!pheal auto
wait 100
send enter
wait 100
end_if
end_if
//исполнение хила конец//


вот так получилось в итоге

анализирует вот это:
Код
!========[ Афанасий Фет's Adventure ]========!
% Rolled a 4
- Lost 29 HP.
+ Dealt 50 HP Damage
+ Killka dealt 37 HP damage.
- Killka took 15 HP Damage.
+ Killka has 649/712 HP left
+ Афанасий Фет has 1,028/1,150 HP left.
+ The enemy Deldu has 446/625 HP left.
!=============================================!


теперь интересует как упростить при анализе массива он получал оба значения в регэкспе и присваивал им переменные, чтобы не гонять массив 2 раза для поиска разных значений
Вверх
cirus
код
Код
log clear
log mode compact

// то что в буфере
set %a [1] "Killka has 373/712 HP left"
set %a [2] "Афанасий Фет has 1,028/1,150 HP left."
set %a [3] "The enemy Deldu has 446/625 HP left."
//////////////
//get clipboard %a string

set $regexp1 "(?<=has\s).+(?=\s*HP)"   // ищем всё что находится между 'has ' и ' HP'
set $regexp2 "\d+"    // число
set $regexp3 "(?<=\/)\d+"   // число после /

set #my indexOf (%a noabs (Фет has))   // номер строки с Фет
set #pet indexOf (%a noabs (Killka has))  // номер строки с петом

/// хп Фет
set #n regexp (#position $hitstring %a[#my] $regexp1)
if  #n > 0
    set $hitstring string_replace($hitstring "," "" "all")   // удаляем из строки запятые
    log $hitstring

    set #n regexp (#pos $hp1 $hitstring $regexp2)
    if  #n > 0
        log $hp1
    end_if

    set #n regexp (#pos $hp2 $hitstring $regexp3)
    if  #n > 0
        log $hp2
    end_if
end_if
log

// хп Killka
set #n regexp (#position $hitstring %a[#pet] $regexp1)
if  #n > 0
    set $hitstring string_replace($hitstring "," "" "all")   // удаляем из строки запятые
    log $hitstring

    set #n regexp (#pos $pet_hp1 $hitstring $regexp2)
    if  #n > 0
        log $pet_hp1
    end_if

    set #n regexp (#pos $pet_hp2 $hitstring $regexp3)
    if  #n > 0
        log $pet_hp2
    end_if
end_if
log
log $hp1   $hp2          $pet_hp1   $pet_hp2
end_script

Вверх
fabbeg
cirus, это гениально!
Вверх
Invision Power Board © 2001-2024 Invision Power Services, Inc.
Version for Pocket PC © 2006-2024, IPBest Studio.