1. Описание подпрограммы должно быть в корне потока, в котором она будет вызываться. То есть, само описание не должно находиться ни в каких циклах, подпрограммах, или условиях. Короче,)) никаких оберток вокруг SUB ... END_SUB быть не должно. Единственной оберткой может быть поток.
2. Вызов подпрограммы делается ниже (по ходу сценария), чем её описание.
Как смог сформулировал.))
THREAD(Атака, 1)
SUB(Хит)
LOGWRITE ("Сообщение")
END_SUB
Хит() // вызов подпрограммы - в любом месте ТОГО ЖЕ ПОТОКА, в котором эта подпрограмма описана, но после её описания
END_THREAD
Вот так можно сделать.
THREAD(Атака, 1)
SUB(Хит)
LOGWRITE ("Сообщение")
END_SUB
IF_PICTURE_IN(0,0, $_xmax, $_ymax,"mob.bmp",-1,100)
LDOWN($_return1,$_return2)
Хит()
ELSE
Хит()
KEYDOWN(#A)
WAITMS(50)
KEYUP(#A)
END_IF
Хит()
END_THREAD
HALT