Here is my test case:
- PC : 1 attack per round
- monster : 1 attack per round
=> No other party member to distract my monster
In feedback, I checked to hit rolls.
PC and monster attack each other, they should attack once each round, equally.
Test case 1 : AttackOneRound
Many rounds, I simply see : <monster> attacks <PC> but no hit rolls
It is quite random but sometimes, it can attacks 6 rounds without any hit rolls.
On other hand, my PC makes a hit roll every round.
Test case 2 and 3 : Attack and AttackReevaluate
They are grouped because they produce the same result
Each round, I can see a hit roll for both of them.
Conclusion:
AttackOneRound is not reliable, monster will be a lot weaker than he really is because he won't attack every time he should.
I did the same tests with 2 APR, I still saw no hit rolls with AttackOneRound, but I saw at least one attack per round most of the times (instead of 2).
I guess that, maybe, a creature needs a full round to make its attack or it can be lost depending on how the script is made.
Now, there are other things to consider : cast & attack, or any action that can be done between attacks. AttackOneRound is good for these ones but there is a cost...
Here my test script:
IF
Global("JA#INIT","LOCALS",0)
THEN
RESPONSE #100
SetGlobal("JA#INIT","LOCALS",1)
SetGlobalTimer("JA#REST","LOCALS",2400)
SetGlobal("JA#COMBAT","LOCALS",0)
SetGlobal("JA#DISABLE_SPELLCASTING","LOCALS",0)
END
IF
Global("JA#INIT","LOCALS",1)
GlobalTimerExpired("JA#REST","LOCALS")
!Detect([GOODCUTOFF])
THEN
RESPONSE #100
SetGlobal("JA#INIT","LOCALS",0)
Rest()
ApplySpellRES("JA#HEAL",Myself) // No such index
END
IF
!Allegiance(Myself,ENEMY)
AttackedBy([GOODCUTOFF],DEFAULT)
THEN
RESPONSE #100
Enemy()
END
IF
Global("JA#COMBAT","LOCALS",0)
Allegiance(Myself,ENEMY)
See([GOODCUTOFF])
THEN
RESPONSE #100
SetGlobal("JA#COMBAT","LOCALS",1)
Shout(95)
END
IF
Global("JA#COMBAT","LOCALS",0)
Heard([EVILCUTOFF.0.SPECTRE],95)
THEN
RESPONSE #100
SetGlobal("JA#COMBAT","LOCALS",1)
Enemy()
END
IF
Global("JA#COMBAT","LOCALS",0)
ActionListEmpty()
THEN
RESPONSE #100
RandomWalk()
END
IF
Global("JA#COMBAT","LOCALS",0)
THEN
RESPONSE #100
NoAction()
END
IF
!StateCheck(Myself,STATE_BLIND)
!See([GOODCUTOFF])
!CheckStatGT(Player6,0,SANCTUARY)
!StateCheck(Player6,STATE_NOT_VISIBLE)
HPGT(Player6,0)
Range(Player6,150)
RandomNumGT(1000,167)
THEN
RESPONSE #100
MoveToObject(Player6)
END
IF
!StateCheck(Myself,STATE_BLIND)
!See([GOODCUTOFF])
!CheckStatGT(Player5,0,SANCTUARY)
!StateCheck(Player5,STATE_NOT_VISIBLE)
HPGT(Player5,0)
Range(Player5,150)
RandomNumGT(1000,200)
THEN
RESPONSE #100
MoveToObject(Player5)
END
IF
!StateCheck(Myself,STATE_BLIND)
!See([GOODCUTOFF])
!CheckStatGT(Player4,0,SANCTUARY)
!StateCheck(Player4,STATE_NOT_VISIBLE)
HPGT(Player4,0)
Range(Player4,150)
RandomNumGT(1000,250)
THEN
RESPONSE #100
MoveToObject(Player4)
END
IF
!StateCheck(Myself,STATE_BLIND)
!See([GOODCUTOFF])
!CheckStatGT(Player3,0,SANCTUARY)
!StateCheck(Player3,STATE_NOT_VISIBLE)
HPGT(Player3,0)
Range(Player3,150)
RandomNumGT(1000,333)
THEN
RESPONSE #100
MoveToObject(Player3)
END
IF
!StateCheck(Myself,STATE_BLIND)
!See([GOODCUTOFF])
!CheckStatGT(Player2,0,SANCTUARY)
!StateCheck(Player2,STATE_NOT_VISIBLE)
HPGT(Player2,0)
Range(Player2,150)
RandomNumGT(1000,500)
THEN
RESPONSE #100
MoveToObject(Player2)
END
IF
!StateCheck(Myself,STATE_BLIND)
!See([GOODCUTOFF])
!CheckStatGT(Player1,0,SANCTUARY)
!StateCheck(Player1,STATE_NOT_VISIBLE)
HPGT(Player1,0)
Range(Player1,150)
THEN
RESPONSE #100
MoveToObject(Player1)
END
IF
ActionListEmpty()
!See([GOODCUTOFF])
THEN
RESPONSE #100
RandomWalk()
END
IF
ActionListEmpty()
OR(3)
General(NearestEnemyOf(Myself),WEAPON)
CheckStatGT(NearestEnemyOf(Myself),0,SANCTUARY)
!See(NearestEnemyOf(Myself))
OR(3)
General(SecondNearestEnemyOf(Myself),WEAPON)
CheckStatGT(SecondNearestEnemyOf(Myself),0,SANCTUARY)
!See(SecondNearestEnemyOf(Myself))
OR(3)
General(ThirdNearestEnemyOf(Myself),WEAPON)
CheckStatGT(ThirdNearestEnemyOf(Myself),0,SANCTUARY)
!See(ThirdNearestEnemyOf(Myself))
OR(3)
General(FourthNearestEnemyOf(Myself),WEAPON)
CheckStatGT(FourthNearestEnemyOf(Myself),0,SANCTUARY)
!See(FourthNearestEnemyOf(Myself))
OR(3)
General(FifthNearestEnemyOf(Myself),WEAPON)
CheckStatGT(FifthNearestEnemyOf(Myself),0,SANCTUARY)
!See(FifthNearestEnemyOf(Myself))
OR(3)
General(SixthNearestEnemyOf(Myself),WEAPON)
CheckStatGT(SixthNearestEnemyOf(Myself),0,SANCTUARY)
!See(SixthNearestEnemyOf(Myself))
THEN
RESPONSE #100
Continue()
END
IF
!General(LastSeenBy(Myself),WEAPON)
!CheckStatGT(LastSeenBy(Myself),0,SANCTUARY)
See(LastSeenBy(Myself))
THEN
RESPONSE #100
Attack(LastSeenBy(Myself))
END






