shithub: pokecrystal

Download patch

ref: ef6e77a5c3cd059fd0c75c8588d1bc2bbf95aa38
parent: 6b12741537a1423281fa2921655f52fab6df5733
author: yenatch <[email protected]>
date: Fri May 3 22:47:52 EDT 2013

AI move scoring

--- a/main.asm
+++ b/main.asm
@@ -8315,7 +8315,217 @@
 ; 440ce
 
 
-INCBIN "baserom.gbc", $440ce, $44378 - $440ce
+
+AIChooseMove: ; 440ce
+; Score each move in EnemyMonMoves starting from Buffer1. Lower is better.
+; Pick the move with the lowest score.
+
+; Wildmons attack at random.
+	ld a, [IsInBattle]
+	dec a
+	ret z
+
+	ld a, [InLinkBattle]
+	and a
+	ret nz
+
+; No use picking a move if there's no choice.
+	ld a, $f
+	ld hl, $68d1
+	rst FarCall ; CheckLockedEnemyMove
+	ret nz
+
+
+; The default score is 20. Unusable moves are given a score of 80.
+	ld a, 20
+	ld hl, Buffer1
+	ld [hli], a
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+
+; Don't pick disabled moves.
+	ld a, [EnemyDisabledMove]
+	and a
+	jr z, .CheckPP
+
+	ld hl, EnemyMonMove1
+	ld c, 0
+.CheckDisabledMove
+	cp [hl]
+	jr z, .ScoreDisabledMove
+	inc c
+	inc hl
+	jr .CheckDisabledMove
+.ScoreDisabledMove
+	ld hl, Buffer1
+	ld b, 0
+	add hl, bc
+	ld [hl], 80
+
+; Don't pick moves with 0 PP.
+.CheckPP
+	ld hl, Buffer1 - 1
+	ld de, EnemyMonPP
+	ld b, 0
+.CheckMovePP
+	inc b
+	ld a, b
+	cp EnemyMonMovesEnd - EnemyMonMoves + 1
+	jr z, .ApplyLayers
+	inc hl
+	ld a, [de]
+	inc de
+	and $3f
+	jr nz, .CheckMovePP
+	ld [hl], 80
+	jr .CheckMovePP
+
+
+; Apply AI scoring layers depending on the trainer class.
+.ApplyLayers
+	ld hl, $559f ; TrainerAI + 3 ; e:559c-5771
+
+	ld a, [$cfc0]
+	bit 0, a
+	jr nz, .asm_4412f
+
+	ld a, [TrainerClass]
+	dec a
+	ld bc, 7 ; Trainer2AI - Trainer1AI
+	call AddNTimes
+
+.asm_4412f
+	ld bc, (CHECK_FLAG << 8) | 0
+	push bc
+	push hl
+
+.CheckLayer
+	pop hl
+	pop bc
+
+	ld a, c
+	cp 16 ; up to 16 scoring layers
+	jr z, .asm_4415e
+
+	push bc
+	ld d, $e ; BANK(TrainerAI)
+	ld a, PREDEF_FLAG
+	call Predef
+	ld d, c
+	pop bc
+
+	inc c
+	push bc
+	push hl
+
+	ld a, d
+	and a
+	jr z, .CheckLayer
+
+	ld hl, AIScoringPointers
+	dec c
+	ld b, 0
+	add hl, bc
+	add hl, bc
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, $e ; bank
+	call FarJpHl
+
+	jr .CheckLayer
+
+.asm_4415e
+	ld hl, Buffer1
+	ld de, EnemyMonMoves
+	ld c, EnemyMonMovesEnd - EnemyMonMoves
+.asm_44166
+	ld a, [de]
+	inc de
+	and a
+	jr z, .asm_4415e
+
+	dec [hl]
+	jr z, .asm_44174
+
+	inc hl
+	dec c
+	jr z, .asm_4415e
+
+	jr .asm_44166
+
+.asm_44174
+	ld a, c
+.asm_44175
+	inc [hl]
+	dec hl
+	inc a
+	cp EnemyMonMovesEnd - EnemyMonMoves + 1
+	jr nz, .asm_44175
+
+	ld hl, Buffer1
+	ld de, EnemyMonMoves
+	ld c, EnemyMonMovesEnd - EnemyMonMoves
+.asm_44184
+	ld a, [de]
+	and a
+	jr nz, .asm_44189
+	ld [hl], a
+.asm_44189
+	ld a, [hl]
+	dec a
+	jr z, .asm_44191
+	xor a
+	ld [hli], a
+	jr .asm_44193
+.asm_44191
+	ld a, [de]
+	ld [hli], a
+.asm_44193
+	inc de
+	dec c
+	jr nz, .asm_44184
+
+.asm_44197
+	ld hl, Buffer1
+	call RNG
+	and 3
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .asm_44197
+
+	ld [CurEnemyMove], a
+	ld a, c
+	ld [CurEnemyMoveNum], a
+	ret
+; 441af
+
+
+AIScoringPointers: ; 441af
+	dw $4591
+	dw $45e0
+	dw $4635
+	dw $46a2
+	dw $46be
+	dw $5315
+	dw $5369
+	dw $5418
+	dw $5453
+	dw $54a9
+	dw $5502
+	dw $5502
+	dw $5502
+	dw $5502
+	dw $5502
+	dw $5502
+; 441cf
+
+
+INCBIN "baserom.gbc", $441cf, $44378 - $441cf
 
 
 PokedexDataPointerTable: ; 0x44378