From 3fb83583c3a029ec631bd3ba09a3310af833bbc3 Mon Sep 17 00:00:00 2001 From: pkali Date: Sun, 3 Jul 2022 13:22:44 -0400 Subject: [PATCH] AI fix and optimization --- ai.asm | 73 ++++++++++++++++++++------------------------------- grafproc.asm | 8 +++--- scorch.asm | 14 +++------- scorch.xex | Bin 40479 -> 40432 bytes 4 files changed, 36 insertions(+), 59 deletions(-) diff --git a/ai.asm b/ai.asm index 1c0cdba..883e3d4 100644 --- a/ai.asm +++ b/ai.asm @@ -42,6 +42,13 @@ loop pha lda AIRoutines,x pha + + ldx TankNr ; common values used in AI routines + ; address of weapons table (for future use) + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 rts .endp ;---------------- @@ -57,7 +64,6 @@ AIRoutines ;---------------------------------------------- .proc Moron - ldx TankNr jsr RandomizeAngle sta NewAngle mwa #80 RandBoundaryLow @@ -68,7 +74,6 @@ AIRoutines ;---------------------------------------------- .proc Shooter - ldx TankNr lda PreviousAngle,x ora PreviousEnergyL,x ora PreviousEnergyH,x @@ -94,36 +99,30 @@ AIRoutines firstShoot ; compare the x position with the middle of the screen + lda xTanksTableH,x + cmp #>(screenwidth/2) + bne @+ lda xTanksTableL,x - sta temp - lda xTanksTableH,x - sta temp+1 - cpw temp #(screenwidth/2) - bcs tankIsOnTheRight - - lda RANDOM - and #$1F - clc - adc #5 + cmp #<(screenwidth/2) +@ bcc tankIsOnTheRight + ; enemy tank is on the left + randomize 95 125 sta NewAngle - jmp forceNow + bne forceNow + tankIsOnTheRight - lda RANDOM - and #$1F - clc - adc #(-85) - ;lda #-45 - sta NewAngle + randomize 55 85 + sta NewAngle forceNow mwa #100 RandBoundaryLow mwa #800 RandBoundaryHigh - ldx TankNr ;this is possibly not necessary + ;ldx TankNr ;this is possibly not necessary jsr RandomizeForce endo - ldx TankNr ;this is possibly not necessary + ;ldx TankNr ;this is possibly not necessary jsr RandomizeForce.LimitForce lda NewAngle sta PreviousAngle,x @@ -134,14 +133,10 @@ endo ; choose the best weapon - lda TanksWeaponsTableL,x - sta temp - lda TanksWeaponsTableH,x - sta temp+1 ldy #32 ;the last weapon loop dey - lda (temp),y + lda (temp),y ; this is set up before calling the routine, has address of TanksWeaponsTable beq loop tya sta ActiveWeapon,x @@ -150,19 +145,13 @@ loop ;---------------------------------------------- .proc Poolshark ; defensives - ldx TankNr - ; address of weapons table (for future use) - lda TanksWeaponsTableL,x - sta temp - lda TanksWeaponsTableH,x - sta temp+1 ; if low energy ten use battery lda Energy,x cmp #30 bcs EnoughEnergy ; lower than 30 units - check battery ldy #ind_Battery________ - lda (temp),y + lda (temp),y ; has address of TanksWeaponsTable beq NoBatteries ; we have batteries - use one clc @@ -180,12 +169,12 @@ EnoughEnergy ; first check check if any is in use lda ActiveDefenceWeapon,x bne DefensiveInUse - ldy #64 ;the last defensive weapon + ldy #ind_Nuclear_Winter_+1 ;the last defensive weapon @ dey cpy #ind_Battery________ ;first defensive weapon (White Flag nad Battery - never use) beq NoUseDefensive - lda (temp),y + lda (temp),y ; has address of TanksWeaponsTable beq @- tya ; activate defensive weapon @@ -195,7 +184,7 @@ EnoughEnergy ; decrease in inventory clc sbc #1 - sta (temp),y + sta (temp),y ; has address of TanksWeaponsTable NoUseDefensive DefensiveInUse firstShoot @@ -203,7 +192,7 @@ firstShoot jsr MakeLowResDistances mva #$ff temp2 ; min possible distance - ldx TankNr + ;ldx TankNr ldy NumberOfPlayers dey @@ -264,7 +253,7 @@ forceNow jsr RandomizeForce endo - ldx TankNr ;this is possibly not necessary + ;ldx TankNr ;this is possibly not necessary ; choose the best weapon @@ -288,12 +277,6 @@ AngleTable ; 16 bytes ;ba w $348b L$3350 .endp ;---------------------------------------------- .proc Toosser - ldx TankNr - ; address of weapons table - lda TanksWeaponsTableL,x - sta temp - lda TanksWeaponsTableH,x - sta temp+1 ; use best defensive :) ; allways ; first check check if any is in use @@ -304,7 +287,7 @@ AngleTable ; 16 bytes ;ba w $348b L$3350 dey cpy #ind_Battery________ ;first defensive weapon (White Flag nad Battery - never use) beq NoUseDefensive - lda (temp),y + lda (temp),y ; has address of TanksWeaponsTable beq @- tya ; activate defensive weapon diff --git a/grafproc.asm b/grafproc.asm index 1a55c8b..e974b02 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -609,13 +609,13 @@ DrawNextTank ldx tankNr ; let's check the energy lda eXistenZ,x - bne SkipRemovigPM ; if energy=0 then no tank + bne SkipHidingPM ; if energy=0 then no tank ; hide P/M lda #0 sta hposp0,x jmp DoNotDrawTankNr -SkipRemovigPM +SkipHidingPM lda AngleTable,x @@ -731,11 +731,11 @@ tankflash_loop sne:mva #1 fs ; finish it mva #1 Erase ldx TankNr - jsr DrawTankNr.SkipRemovigPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! + jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! PAUSE 2 mva #0 Erase ldx TankNr - jsr DrawTankNr.SkipRemovigPM + jsr DrawTankNr.SkipHidingPM PAUSE 2 dec fs jne tankflash_loop diff --git a/scorch.asm b/scorch.asm index 8a2807f..3715f18 100644 --- a/scorch.asm +++ b/scorch.asm @@ -380,6 +380,7 @@ DoNotFinishTheRound mva #0 noDeathCounter mva #sfx_seppuku sfx_effect + jsr DisplaySeppuku jmp Seppuku @@ -751,6 +752,9 @@ NotNegativeShieldEnergy sta ydraw+1 ; get position of the tank ldx TankNr + lda #0 ; turn off defense weapons when hara-kiring + sta ActiveDefenceWeapon,x + sta ShieldEnergy,x lda xtankstableL,x sta xdraw lda xtankstableH,x @@ -1148,20 +1152,10 @@ LimitForce bcc rotateLeft ; older is bigger rotateRight;older is lower inc angleTable,x - bne MoveBarrelToNewPosition - - mva #$30 CharCode ; if angle goes through 0 we clear the barrel - jsr DrawTankNr.drawtankNrX - jmp MoveBarrelToNewPosition rotateLeft dec angleTable,x - bpl MoveBarrelToNewPosition - mva #$2e CharCode - jsr DrawTankNr.drawtankNrX - jmp MoveBarrelToNewPosition - BarrelPositionIsFine rts diff --git a/scorch.xex b/scorch.xex index 0f017cc42fe1f356952ff10fa9f5d3c7ed0b09da..d23d26735133e27cf864fdbb6925bbfe846b2f72 100644 GIT binary patch delta 14059 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 delta 14080 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