Доброго дня!
Есть текстовая игра, где результат выводится в форме сообщения каждый раз при вводе команды.
пишу такой скрипт
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
set $a $hitstring
log $a
Для воспроизведения проблемы предоставьте, пожалуйста:
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]
Обратите внимание на индексы. Присвоение идет двумерному массиву, а вывод, как одномерного.
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, а как ее разбить если он ее в переменную даже не загоняет?
Я бы регекспом бил.
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.
!=============================================!
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
cirus, это гениально!
Привет! Возвращаюсь к теме.
Очень редко, но бывает, что "Killka has" не выдается (бывает что моб не наносит повреждения)
тогда скрипт не находит этой строки и выдает ошибку "Проверьте правильность..."
Как можно этого избежать?
Надо добавить проверку что строка найдена.
// хп Killka
if #pet > 0 // проверка что нужная строка найдена
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
end_if // конец условия
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)