From 73db3edb453d2d7b09cee6fbb680ccc09d004f83 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Wed, 31 Aug 2022 21:09:26 +0200 Subject: [PATCH] More AI optimization (59b saved :) ) --- ai.asm | 78 +++++++++++++++++++++++------------------------------ scorch.xex | Bin 50527 -> 50468 bytes 2 files changed, 33 insertions(+), 45 deletions(-) diff --git a/ai.asm b/ai.asm index e65a98d..2006d6c 100644 --- a/ai.asm +++ b/ai.asm @@ -8,26 +8,6 @@ ; - shoots random direction and force ; greeeting to myself 10 years older in 2013-11-09... still no idea -;---------------------------------------------- -.proc MakeLowResDistances - ; create low precision table of positions - ; by dividing positions by 4 - - ldy #MaxPlayers-1 -loop - lda xtankstableL,y - sta temp - lda xtankstableH,y - sta temp+1 - - ;= /4 - :2 lsrw temp - lda temp - sta LowResDistances,y - dey - bpl loop - rts -.endp ;---------------------------------------------- .proc ArtificialIntelligence ; @@ -43,6 +23,25 @@ loop lda AIRoutines,y pha +;---------------------------------------------- +;.proc MakeLowResDistances + ; create low precision table of positions + ; by dividing positions by 4 + ldy #MaxPlayers-1 +loop + lda xtankstableL,y + sta temp + lda xtankstableH,y + sta temp+1 + ;= /4 + :2 lsrw temp + lda temp + sta LowResDistances,y + dey + bpl loop +; rts +;.endp + ; common values used in AI routines ; address of weapons table (for future use) lda TanksWeaponsTableL,x @@ -326,7 +325,7 @@ NotNegativeEnergy jsr RandomizeForce ; if target distance lower than 24 - set weapon to Baby Missile (for security :) jsr GetDistance - cpw temp2 #24 + cmp #6 ; 24/4 bcs HighForce lda #ind_Baby_Missile___ sta ActiveWeapon,x @@ -358,7 +357,7 @@ NotNegativeEnergy jsr RandomizeForce ; if target distance lower than 24 - set weapon to Baby Missile (for security :) jsr GetDistance - cpw temp2 #24 + cmp #6 ; 24/4 bcs HighForce lda #ind_Baby_Missile___ sta ActiveWeapon,x @@ -378,7 +377,7 @@ HighForce jsr TakeAim ; direction still in A (0 - left, >0 - right) ; choose the best weapon - ldy ind_Nuke___________+1 + ldy #ind_Nuke___________+1 jsr ChooseBestOffensive.NotFromAll lda Force @@ -387,7 +386,7 @@ HighForce sta ForceTableH,x ; if target distance lower than 32 - set weapon to Baby Missile (for security :) jsr GetDistance - cpw temp2 #32 + cmp #8 ;32/4 bcs HighForce lda #ind_Baby_Missile___ sta ActiveWeapon,x @@ -404,7 +403,7 @@ HighForce ; direcion of shoot in A (0 - left, >0 - right) ;---------------------------------------------- sta PreferHumansFlag - jsr MakeLowResDistances +; jsr MakeLowResDistances lda #202 sta temp2 ; max possible energy lda #0 @@ -456,7 +455,7 @@ skipThisPlayer ; returns target tank number in Y and ; direcion of shoot in A (0 - left, >0 - right) ;---------------------------------------------- - jsr MakeLowResDistances +; jsr MakeLowResDistances mva #$ff temp2 ; min possible distance mva #0 tempor2 ; direction of shoot @@ -1033,30 +1032,19 @@ loop .endp ;---------------------------------------------- .proc GetDistance -; calculates distance from tank X to TargetTankNr(Y) -; result in temp2 +; calculates lores ( /4 ) distance from tank X to TargetTankNr(Y) +; result in A ;---------------------------------------------- ldy TargetTankNr - lda xTanksTableH,x - cmp xTanksTableH,y - bne @+ - lda xTanksTableL,x - cmp xTanksTableL,y + lda LowResDistances,x + cmp LowResDistances,y @ bcs YisLower sec - lda xTanksTableL,y - sbc xTanksTableL,x - sta temp2 - lda xTanksTableH,y - sbc xTanksTableH,x - sta temp2+1 + lda LowResDistances,y + sbc LowResDistances,x rts YisLower - lda xTanksTableL,x - sbc xTanksTableL,y - sta temp2 - lda xTanksTableH,x - sbc xTanksTableH,y - sta temp2+1 + lda LowResDistances,x + sbc LowResDistances,y rts .endp \ No newline at end of file diff --git a/scorch.xex b/scorch.xex index a5cf2245350abaf9a2ea3a291ecbfea63f8d1bc5..f22a17ce5360e7a312b3159765785cb547bd65d2 100644 GIT binary patch delta 10434 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 delta 10521 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