From d7501b5c7c5b25dbe641725d76017a2d33ae49da Mon Sep 17 00:00:00 2001 From: Pecusx Date: Sun, 31 Jul 2022 18:35:51 +0200 Subject: [PATCH] All AI tanks works but... --- ai.asm | 183 ++++++++++++++++++++++++++++++++++++++++++++++++--- scorch.asm | 10 +-- scorch.xex | Bin 41208 -> 41490 bytes textproc.asm | 2 +- 4 files changed, 181 insertions(+), 14 deletions(-) diff --git a/ai.asm b/ai.asm index b5333bf..e10c23f 100644 --- a/ai.asm +++ b/ai.asm @@ -57,11 +57,23 @@ AIRoutines .word Shooter-1 ;Shooter .word Poolshark-1 ;Poolshark .word Tosser-1 ;Tosser - .word Tosser-1 ;Chooser - .word Tosser-1 ;Spoiler + .word Chooser-1 ;Chooser + .word Spoiler-1 ;Spoiler .word Cyborg-1 ;Cyborg - .word Tosser-1 ;Unknown + .word Unknown-1 ;Unknown +;---------------------------------------------- +.proc Unknown + ; random robotank (from Poolshark to Cyborg) + randomize 4 13 + and #%11111110 + tay + lda AIRoutines+1,y + pha + lda AIRoutines,y + pha + rts +.endp ;---------------------------------------------- .proc Moron jsr RandomizeAngle @@ -154,6 +166,7 @@ loop .endp ;---------------------------------------------- .proc Poolshark + jsr UseBatteryOrFlag ; defensives jsr PoolsharkDefensives firstShoot @@ -213,8 +226,7 @@ AngleTable ; 16 bytes ;ba w $348b L$3350 .by 18,26,34,43,50,58,66,74 .endp ;---------------------------------------------- -.proc PoolsharkDefensives - ; defensives +.proc UseBatteryOrFlag ; if low energy ten use battery lda Energy,x cmp #30 @@ -238,6 +250,10 @@ NoBatteries lda #ind_White_Flag_____ sta ActiveDefenceWeapon,x EnoughEnergy + rts +.endp +;---------------------------------------------- +.proc PoolsharkDefensives ; use best defensive :) ; but not allways randomize 1 3 @@ -268,6 +284,7 @@ DefensiveInUse .endp ;---------------------------------------------- .proc Tosser + jsr UseBatteryOrFlag ; use best defensive :) jsr TosserDefensives ; Toosser is like Poolshark but allways uses defensives @@ -301,23 +318,173 @@ NoUseDefensive rts .endp ;---------------------------------------------- -.proc Cyborg +.proc Chooser + ; like cyborg but more randomizing force + jsr UseBatteryOrFlag ; use defensives like Tosser jsr TosserDefensives ; now select best target - jsr FindBestTarget1 + jsr FindBestTarget3 sty TargetTankNr ; aiming jsr TakeAim ; direction still in A (0 - left, >0 - right) - lda #0 + + ; choose the best weapon + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 + ldy #ind_LeapFrog_______ ;the last offensive weapon to use +loop + dey + lda (temp),y + beq loop + tya sta ActiveWeapon,x + + ; randomizing force +-100 + sbw Force #100 RandBoundaryLow + bpl NotNegativeEnergy + mwa #1 RandBoundaryLow +NotNegativeEnergy + adw Force #100 RandBoundaryHigh + jsr RandomizeForce + lda ForceTableH,x + bne HighForce + ; if Force lower than 256 - set weapon to Baby Missile (for security :) ) + lda #ind_Baby_Missile___ + sta ActiveWeapon,x +HighForce + rts +.endp +;---------------------------------------------- +.proc Spoiler + ; like cyborg but little randomizing force + jsr UseBatteryOrFlag + ; use defensives like Tosser + jsr TosserDefensives + ; now select best target + jsr FindBestTarget3 + sty TargetTankNr + ; aiming + jsr TakeAim ; direction still in A (0 - left, >0 - right) + + ; choose the best weapon + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 + ldy #ind_LeapFrog_______ ;the last offensive weapon to use +loop + dey + lda (temp),y + beq loop + tya + sta ActiveWeapon,x + + ; randomizing force +-50 + sbw Force #50 RandBoundaryLow + bpl NotNegativeEnergy + mwa #1 RandBoundaryLow +NotNegativeEnergy + adw Force #50 RandBoundaryHigh + jsr RandomizeForce + lda ForceTableH,x + bne HighForce + ; if Force lower than 256 - set weapon to Baby Missile (for security :) ) + lda #ind_Baby_Missile___ + sta ActiveWeapon,x +HighForce + rts +.endp +;---------------------------------------------- +.proc Cyborg + jsr UseBatteryOrFlag + ; use defensives like Tosser + jsr TosserDefensives + ; now select best target + jsr FindBestTarget3 + sty TargetTankNr + ; aiming + jsr TakeAim ; direction still in A (0 - left, >0 - right) + + ; choose the best weapon + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 + ldy #ind_LeapFrog_______ ;the last offensive weapon to use +loop + dey + lda (temp),y + beq loop + tya + sta ActiveWeapon,x + lda Force sta ForceTableL,x lda Force+1 sta ForceTableH,x + bne HighForce + ; if Force lower than 256 - set weapon to Baby Missile (for security :) ) + lda #ind_Baby_Missile___ + sta ActiveWeapon,x +HighForce rts .endp +;---------------------------------------------- +.proc FindBestTarget3 +; find target with lowest energy +; X - shooting tank number +; returns target tank number in Y and +; direcion of shoot in A (0 - left, >0 - right) +;---------------------------------------------- + jsr MakeLowResDistances + lda #$ff + sta temp2 ; max possible energy + sta 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 + lda Energy,y + cmp temp2 ; lowest + bcs lowestIsLower + sta temp2 + sty temp2+1 ; number of the closest tank + inc tempor2 ; set direction to right + bne lowestIsLower + +EnemyOnTheLeft + lda Energy,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 farthest tank in temp2+1 + ; and direction (0 - left, >0 - right) in tempor2 + ; let's move them to registers + ; in temp2 we have energy of target + ldy temp2+1 + lda tempor2 + rts +.endp ;---------------------------------------------- .proc FindBestTarget2 ; find farthest tank neighbour diff --git a/scorch.asm b/scorch.asm index ad82fa5..641ec00 100644 --- a/scorch.asm +++ b/scorch.asm @@ -420,6 +420,8 @@ DoNotFinishTheRound ldx tankNr lda TankStatusColoursTable,x sta colpf2s ; set color of status line + jsr PutTankNameOnScreen + jsr DisplayStatus lda SkillTable,x beq ManualShooting @@ -428,9 +430,7 @@ RoboTanks ; robotanks shoot here ; TankNr still in X jsr ArtificialIntelligence - jsr PutTankNameOnScreen - jsr DisplayStatus - pause 30 + ;pause 30 ldx TankNr jsr MoveBarrelToNewPosition lda kbcode @@ -476,7 +476,7 @@ StandardShoot jsr DecreaseWeaponBeforeShoot jsr DisplayStatus - ldx TankNr +; ldx TankNr dec Energy,x ; lower energy to eventually let tanks commit suicide ShootNow @@ -1221,7 +1221,7 @@ MoveBarrel mva #sfx_set_power_2 sfx_effect jsr DrawTankNr jsr DisplayStatus.displayAngle - ldx TankNr +; ldx TankNr mva #1 Erase PAUSE 1 jsr DrawTankNr.BarrelChange diff --git a/scorch.xex b/scorch.xex index 83648bab7a7106445781cf73fac7c54e4c72baa7..6a3daca426beac128443fa0fb65220e1f7fd93a7 100644 GIT binary patch delta 16834 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 delta 16608 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

Pegkt*)x!^7&$ddsiH~3iuLw7ikCl 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