From 1945dd5e88805ec033ca1dc43636bf367193a15a Mon Sep 17 00:00:00 2001 From: Pecusx Date: Sun, 31 Jul 2022 16:44:18 +0200 Subject: [PATCH] AI optimisations --- ai.asm | 110 +++++++++++++++++++++++++++++++++-------------------- scorch.xex | Bin 41187 -> 41208 bytes 2 files changed, 68 insertions(+), 42 deletions(-) diff --git a/ai.asm b/ai.asm index 7496005..b5333bf 100644 --- a/ai.asm +++ b/ai.asm @@ -158,56 +158,24 @@ loop jsr PoolsharkDefensives firstShoot ;find nearest tank neighbour - jsr MakeLowResDistances - mva #$ff temp2 ; min possible distance - - ;ldx TankNr - ldy NumberOfPlayers - dey - -loop01 - cpy TankNr - beq skipThisPlayer - lda eXistenZ,y - beq skipThisPlayer - - lda LowResDistances,x - cmp LowResDistances,y - bcs EnemyOnTheLeft - ;enemy on the right - sec - lda LowResDistances,y - sbc LowResDistances,x - cmp temp2 ; lowest - bcs lowestIsLower - sta temp2 - sty temp2+1 ; number of the closest tank + jsr FindBestTarget2 + beq EnemyOnLeft ; calculate index to shotangle table + ; in temp2 we have x distance divided by 8 + lda temp2 :3 lsr @ and #%00000111 clc adc #8 - sta AngleTablePointer - jmp lowestIsLower - -EnemyOnTheLeft - sec - lda LowResDistances,x - sbc LowResDistances,y - cmp temp2 ; lowest - bcs lowestIsLower - sta temp2 - sty temp2+1 ; number of the closest tank - ; calculate index to shotangle table + sta AngleTablePointer + bne AngleIsSet +EnemyOnLeft + lda temp2 :3 lsr @ and #%00000111 eor #%00000111 - sta AngleTablePointer - -lowestIsLower -skipThisPlayer - dey - bpl loop01 + sta AngleTablePointer +AngleIsSet randomize 0 8 ldy AngleTablePointer @@ -349,6 +317,63 @@ NoUseDefensive sta ForceTableH,x rts .endp + +;---------------------------------------------- +.proc FindBestTarget2 +; find farthest tank neighbour +; X - shooting tank number +; returns target tank number in Y and +; direcion of shoot in A (0 - left, >0 - right) +;---------------------------------------------- + jsr MakeLowResDistances + mva #$ff temp2 ; min possible distance + mva #0 tempor2 ; direction of shoot + + ;ldx TankNr + ldy NumberOfPlayers + dey + +loop01 + cpy TankNr + beq skipThisPlayer + lda eXistenZ,y + beq skipThisPlayer + + lda LowResDistances,x + cmp LowResDistances,y + bcs EnemyOnTheLeft + ;enemy on the right + sec + lda LowResDistances,y + sbc LowResDistances,x + cmp temp2 ; lowest + bcs lowestIsLower + sta temp2 + sty temp2+1 ; number of the closest tank + inc tempor2 ; set direction to right + bne lowestIsLower + +EnemyOnTheLeft + sec + lda LowResDistances,x + sbc LowResDistances,y + cmp temp2 ; lowest + bcs lowestIsLower + sta temp2 + sty temp2+1 ; number of the closest tank + +lowestIsLower +skipThisPlayer + dey + bpl loop01 + ; now we have number of the closest tank in temp2+1 + ; and direction (0 - left, >0 - right) in tempor2 + ; let's move them to registers + ; in temp2 we have x distance divided by 8 + ldy temp2+1 + lda tempor2 + rts +.endp ;---------------------------------------------- .proc FindBestTarget1 ; find farthest tank neighbour @@ -400,6 +425,7 @@ skipThisPlayer ; now we have number of the farthest tank in temp2+1 ; and direction (0 - left, >0 - right) in tempor2 ; let's move them to registers + ; in temp2 we have x distance divided by 8 ldy temp2+1 lda tempor2 rts diff --git a/scorch.xex b/scorch.xex index 1d3e3c5f0d17e40c37ba6d5fe2eba4f0d93f8a38..83648bab7a7106445781cf73fac7c54e4c72baa7 100644 GIT binary patch delta 13843 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 Kf8qHy`Tqb8R&zK2 delta 13786 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 KL9^#l%Krl92PR?w