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