Merge pull request #153 from lhearachel/trainer-ai

Rebuild trainer AI byte-code script from ASM macros
This commit is contained in:
Rachel
2024-02-22 09:49:32 -08:00
committed by GitHub
12 changed files with 7148 additions and 51 deletions

Binary file not shown.

638
asm/macros/aicmd.inc Normal file
View File

@@ -0,0 +1,638 @@
.equ FALSE, 0
.equ TRUE, 1
.macro IfRandomLessThan i, jump
.long 0
.long \i
.long (\jump-.) / 4 - 1
.endm
.macro IfRandomGreaterThan i, jump
.long 1
.long \i
.long (\jump-.) / 4 - 1
.endm
.macro IfRandomEqualTo i, jump
.long 2
.long \i
.long (\jump-.) / 4 - 1
.endm
.macro IfRandomNotEqualTo i, jump
.long 3
.long \i
.long (\jump-.) / 4 - 1
.endm
.macro AddToMoveScore i
.long 4
.long \i
.endm
.macro IfHPPercentLessThan battler, i, jump
.long 5
.long \battler
.long \i
.long (\jump-.) / 4 - 1
.endm
.macro IfHPPercentGreaterThan battler, i, jump
.long 6
.long \battler
.long \i
.long (\jump-.) / 4 - 1
.endm
.macro IfHPPercentEqualTo battler, i, jump
.long 7
.long \battler
.long \i
.long (\jump-.) / 4 - 1
.endm
.macro IfHPPercentNotEqualTo battler, i, jump
.long 8
.long \battler
.long \i
.long (\jump-.) / 4 - 1
.endm
.macro IfStatus battler, status, jump
.long 9
.long \battler
.long \status
.long (\jump-.) / 4 - 1
.endm
.macro IfNotStatus battler, status, jump
.long 10
.long \battler
.long \status
.long (\jump-.) / 4 - 1
.endm
.macro IfVolatileStatus battler, volatile_status, jump
.long 11
.long \battler
.long \volatile_status
.long (\jump-.) / 4 - 1
.endm
.macro IfNotVolatileStatus battler, volatile_status, jump
.long 12
.long \battler
.long \volatile_status
.long (\jump-.) / 4 - 1
.endm
.macro IfMoveEffect battler, move_effects, jump
.long 13
.long \battler
.long \move_effects
.long (\jump-.) / 4 - 1
.endm
.macro IfNotMoveEffect battler, move_effects, jump
.long 14
.long \battler
.long \move_effects
.long (\jump-.) / 4 - 1
.endm
.macro IfSideCondition battler, side_conditions, jump
.long 15
.long \battler
.long \side_conditions
.long (\jump-.) / 4 - 1
.endm
.macro IfNotSideCondition battler, side_conditions, jump
.long 16
.long \battler
.long \side_conditions
.long (\jump-.) / 4 - 1
.endm
.macro IfLoadedLessThan loaded_val, jump
.long 17
.long \loaded_val
.long (\jump-.) / 4 - 1
.endm
.macro IfLoadedGreaterThan loaded_val, jump
.long 18
.long \loaded_val
.long (\jump-.) / 4 - 1
.endm
.macro IfLoadedEqualTo loaded_val, jump
.long 19
.long \loaded_val
.long (\jump-.) / 4 - 1
.endm
.macro IfLoadedNotEqualTo loaded_val, jump
.long 20
.long \loaded_val
.long (\jump-.) / 4 - 1
.endm
.macro IfLoadedMask loaded_val, jump
.long 21
.long \loaded_val
.long (\jump-.) / 4 - 1
.endm
.macro IfLoadedNotMask loaded_val, jump
.long 22
.long \loaded_val
.long (\jump-.) / 4 - 1
.endm
.macro IfMoveEqualTo move, jump
.long 23
.long \move
.long (\jump-.) / 4 - 1
.endm
.macro IfMoveNotEqualTo move, jump
.long 24
.long \move
.long (\jump-.) / 4 - 1
.endm
.macro IfLoadedinTable table, jump
.long 25
.long (\table-.) / 4 - 2
.long (\jump-.) / 4 - 1
.endm
.macro IfLoadedNotinTable table, jump
.long 26
.long (\table-.) / 4 - 2
.long (\jump-.) / 4 - 1
.endm
.macro IfAttackerHasDamagingMoves jump
.long 27
.long (\jump-.) / 4 - 1
.endm
.macro IfAttackerHasNoDamagingMoves jump
.long 28
.long (\jump-.) / 4 - 1
.endm
.macro LoadTurnCount
.long 29
.endm
.macro LoadTypeFrom load_type_target
.long 30
.long \load_type_target
.endm
.macro LoadMovePower
.long 31
.endm
.macro FlagMoveDamageScore bool
.long 32
.long \bool
.endm
.macro LoadBattlerPreviousMove battler
.long 33
.long \battler
.endm
.macro IfTempEqualTo loaded_val, jump
.long 34
.long \loaded_val
.long (\jump-.) / 4 - 1
.endm
.macro IfTempNotEqualTo loaded_val, jump
.long 35
.long \loaded_val
.long (\jump-.) / 4 - 1
.endm
.macro IfSpeedCompareEqualTo cmp, jump
.long 36
.long \cmp
.long (\jump-.) / 4 - 1
.endm
.macro IfSpeedCompareNotEqualTo cmp, jump
.long 37
.long \cmp
.long (\jump-.) / 4 - 1
.endm
.macro CountAlivePartyBattlers battler
.long 38
.long \battler
.endm
.macro LoadCurrentMove
.long 39
.endm
.macro LoadCurrentMoveEffect
.long 40
.endm
.macro LoadBattlerAbility battler
.long 41
.long \battler
.endm
.macro CalcMaxEffectiveness
.long 42
.endm
.macro IfMoveEffectivenessEquals modifier, jump
.long 43
.long \modifier
.long (\jump-.) / 4 - 1
.endm
.macro IfPartyMemberStatus battler, pokemon_status, jump
.long 44
.long \battler
.long \pokemon_status
.long (\jump-.) / 4 - 1
.endm
.macro IfPartyMemberNotStatus battler, pokemon_status, jump
.long 45
.long \battler
.long \pokemon_status
.long (\jump-.) / 4 - 1
.endm
.macro LoadCurrentWeather
.long 46
.endm
.macro IfCurrentMoveEffectEqualTo battle_effect, jump
.long 47
.long \battle_effect
.long (\jump-.) / 4 - 1
.endm
.macro IfCurrentMoveEffectNotEqualTo battle_effect, jump
.long 48
.long \battle_effect
.long (\jump-.) / 4 - 1
.endm
.macro IfStatStageLessThan battler, stat, i, jump
.long 49
.long \battler
.long \stat
.long \i
.long (\jump-.) / 4 - 1
.endm
.macro IfStatStageGreaterThan battler, stat, i, jump
.long 50
.long \battler
.long \stat
.long \i
.long (\jump-.) / 4 - 1
.endm
.macro IfStatStageEqualTo battler, stat, i, jump
.long 51
.long \battler
.long \stat
.long \i
.long (\jump-.) / 4 - 1
.endm
.macro IfStatStageNotEqualTo battler, stat, i, jump
.long 52
.long \battler
.long \stat
.long \i
.long (\jump-.) / 4 - 1
.endm
.macro IfCurrentMoveKills roll_damage, jump
.long 53
.long \roll_damage
.long (\jump-.) / 4 - 1
.endm
.macro IfCurrentMoveDoesNotKill roll_damage, jump
.long 54
.long \roll_damage
.long (\jump-.) / 4 - 1
.endm
.macro IfMoveKnown battler, move, jump
.long 55
.long \battler
.long \move
.long (\jump-.) / 4 - 1
.endm
.macro IfMoveNotKnown battler, move, jump
.long 56
.long \battler
.long \move
.long (\jump-.) / 4 - 1
.endm
.macro IfMoveEffectKnown battler, battle_effect, jump
.long 57
.long \battler
.long \battle_effect
.long (\jump-.) / 4 - 1
.endm
.macro IfMoveEffectNotKnown battler, battle_effect, jump
.long 58
.long \battler
.long \battle_effect
.long (\jump-.) / 4 - 1
.endm
.macro IfBattlerUnderEffect battler, check_effect, jump
.long 59
.long \battler
.long \check_effect
.long (\jump-.) / 4 - 1
.endm
.macro IfCurrentMoveMatchesEffect check_effect, jump
.long 60
.long \check_effect
.long (\jump-.) / 4 - 1
.endm
.macro Escape
.long 61
.endm
.macro Dummy3E i
.long 62
.long \i
.endm
.macro Dummy3F
.long 63
.endm
.macro LoadHeldItem battler
.long 64
.long \battler
.endm
.macro LoadHeldItemEffect battler
.long 65
.long \battler
.endm
.macro LoadGender battler
.long 66
.long \battler
.endm
.macro LoadIsFirstTurnInBattle battler
.long 67
.long \battler
.endm
.macro LoadStockpileCount battler
.long 68
.long \battler
.endm
.macro LoadBattleType
.long 69
.endm
.macro LoadRecycleItem battler
.long 70
.long \battler
.endm
.macro LoadTypeOfLoadedMove
.long 71
.endm
.macro LoadPowerOfLoadedMove
.long 72
.endm
.macro LoadEffectOfLoadedMove
.long 73
.endm
.macro LoadProtectChain battler
.long 74
.long \battler
.endm
.macro PushAndGoTo jump
.long 75
.long (\jump-.) / 4 - 1
.endm
.macro GoTo jump
.long 76
.long (\jump-.) / 4 - 1
.endm
.macro PopOrEnd
.long 77
.endm
.macro IfLevel check_level, jump
.long 78
.long \check_level
.long (\jump-.) / 4 - 1
.endm
.macro IfTargetIsTaunted jump
.long 79
.long (\jump-.) / 4 - 1
.endm
.macro IfTargetIsNotTaunted jump
.long 80
.long (\jump-.) / 4 - 1
.endm
.macro IfTargetIsPartner jump
.long 81
.long (\jump-.) / 4 - 1
.endm
.macro FlagBattlerIsType battler, type
.long 82
.long \battler
.long \type
.endm
.macro CheckBattlerAbility battler, ability
.long 83
.long \battler
.long \ability
.endm
.macro IfActivatedFlashFire battler, jump
.long 84
.long \battler
.long (\jump-.) / 4 - 1
.endm
.macro IfHeldItemEqualTo battler, item, jump
.long 85
.long \battler
.long \item
.long (\jump-.) / 4 - 1
.endm
.macro IfFieldConditionsMask field_conditions, jump
.long 86
.long \field_conditions
.long (\jump-.) / 4 - 1
.endm
.macro LoadSpikesLayers battler, side_conditions
.long 87
.long \battler
.long \side_conditions
.endm
.macro IfAnyPartyMemberIsWounded battler, jump
.long 88
.long \battler
.long (\jump-.) / 4 - 1
.endm
.macro IfAnyPartyMemberUsedPP battler, jump
.long 89
.long \battler
.long (\jump-.) / 4 - 1
.endm
.macro LoadFlingPower battler
.long 90
.long \battler
.endm
.macro LoadCurrentMovePP
.long 91
.endm
.macro IfCanUseLastResort battler, jump
.long 92
.long \battler
.long (\jump-.) / 4 - 1
.endm
.macro LoadCurrentMoveClass
.long 93
.endm
.macro LoadDefenderLastUsedMoveClass
.long 94
.endm
.macro LoadBattlerSpeedRank battler
.long 95
.long \battler
.endm
.macro LoadBattlerTurnCount battler
.long 96
.long \battler
.endm
.macro IfPartyMemberDealsMoreDamage roll_damage, jump
.long 97
.long \roll_damage
.long (\jump-.) / 4 - 1
.endm
.macro IfHasSuperEffectiveMove jump
.long 98
.long (\jump-.) / 4 - 1
.endm
.macro IfBattlerDealsMoreDamage battler, roll_damage, jump
.long 99
.long \battler
.long \roll_damage
.long (\jump-.) / 4 - 1
.endm
.macro SumPositiveStatStages battler
.long 100
.long \battler
.endm
.macro DiffStatStages battler, battle_stat
.long 101
.long \battler
.long \battle_stat
.endm
.macro IfBattlerHasHigherStat battler, battle_stat, jump
.long 102
.long \battler
.long \battle_stat
.long (\jump-.) / 4 - 1
.endm
.macro IfBattlerHasLowerStat battler, battle_stat, jump
.long 103
.long \battler
.long \battle_stat
.long (\jump-.) / 4 - 1
.endm
.macro IfBattlerHasEqualStat battler, battle_stat, jump
.long 104
.long \battler
.long \battle_stat
.long (\jump-.) / 4 - 1
.endm
.macro CheckIfHighestDamageWithPartner roll_damage
.long 105
.long \roll_damage
.endm
.macro IfBattlerFainted battler, jump
.long 106
.long \battler
.long (\jump-.) / 4 - 1
.endm
.macro IfBattlerNotFainted battler, jump
.long 107
.long \battler
.long (\jump-.) / 4 - 1
.endm
.macro LoadAbility battler
.long 108
.long \battler
.endm
.equ TABLE_END, 0xFFFFFFFF
.macro TableEntry entry
.long \entry
.endm
.macro LabelDistance dst, src
.long (\dst-\src) / 4
.endm

View File

@@ -1,3 +1,3 @@
pokeplatinum_asm = files(
'overlay014/ov14_022248A4.s'
'trainer_ai/trainer_ai_script.s'
)

View File

@@ -1,6 +0,0 @@
.text
.global gTrainerAITable
gTrainerAITable: ; 0x022248A4
.incbin "incbin/ov14_022248A4.bin", 0x0, 0xA5BC

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,9 @@
"@Terrain",
"@BattleAnimation",
"@MoveRange",
"@MoveFlags"
"@MoveFlags",
"@BattleStat",
"@CompareSpeedResult"
],
"btlcmd": [
"@BattleScriptVar",
@@ -1000,6 +1002,28 @@
"MOVE_FLAG_HIDES_HP_GAUGES",
"MOVE_FLAG_HIDES_SHADOWS"
]
},
"@BattleStat": {
"type": "enum",
"values": [
"BATTLE_STAT_HP",
"BATTLE_STAT_ATTACK",
"BATTLE_STAT_DEFENSE",
"BATTLE_STAT_SPEED",
"BATTLE_STAT_SP_ATTACK",
"BATTLE_STAT_SP_DEFENSE",
"BATTLE_STAT_ACCURACY",
"BATTLE_STAT_EVASION",
"BATTLE_STAT_MAX"
]
},
"@CompareSpeedResult": {
"type": "enum",
"values": [
"COMPARE_SPEED_FASTER",
"COMPARE_SPEED_SLOWER",
"COMPARE_SPEED_TIE"
]
}
}
}

View File

@@ -191,8 +191,8 @@ void BattleMon_AddVal(BattleMon *mon, enum BattleMonParam paramID, int val);
* @param ignoreQuickClaw If set to TRUE, the Quick Claw and Custap Berry
* flags will NOT be set after determining if they
* should activate.
* @return 0 if battler 1 should move first, 1 if battler 2 should move first,
* 2 if battler 2 should move first and won a speed tie.
* @return A value representing the speed-ordering of the two battlers,
* relative to the first of the two. See enum CompareSpeedResult.
*/
u8 BattleSystem_CompareBattlerSpeed(BattleSystem *battleSys, BattleContext *battleCtx, int battler1, int battler2, BOOL ignoreQuickClaw);

View File

@@ -75,17 +75,4 @@
#define FLAG_NEGATE(flag) ((flag) ^ 0xFFFFFFFF)
enum {
BATTLE_STAT_HP,
BATTLE_STAT_ATTACK,
BATTLE_STAT_DEFENSE,
BATTLE_STAT_SPEED,
BATTLE_STAT_SP_ATTACK,
BATTLE_STAT_SP_DEFENSE,
BATTLE_STAT_ACCURACY,
BATTLE_STAT_EVASION,
BATTLE_STAT_MAX
};
#endif // POKEPLATINUM_BATTLE_COMMON_H

View File

@@ -82,6 +82,7 @@
#define VOLATILE_CONDITION_BIND_SHIFT 13
#define VOLATILE_CONDITION_ATTRACT_SHIFT 16
#define SIDE_CONDITION_NONE 0
#define SIDE_CONDITION_REFLECT (1 << 0)
#define SIDE_CONDITION_LIGHT_SCREEN (1 << 1)
#define SIDE_CONDITION_SPIKES (1 << 2)

View File

@@ -678,7 +678,7 @@ Overlay overlay14
{
After overlay11
Object main.nef.p/src_overlay014_trainer_ai.c.o
Object main.nef.p/overlay014/asm_overlay014_ov14_022248A4.s.o
Object main.nef.p/asm_trainer_ai_trainer_ai_script.s.o
}
Overlay overlay15

View File

@@ -162,7 +162,7 @@ static void AICmd_IfCanUseLastResort(BattleSystem *battleSys, BattleContext *bat
static void AICmd_LoadCurrentMoveClass(BattleSystem *battleSys, BattleContext *battleCtx);
static void AICmd_LoadDefenderLastUsedMoveClass(BattleSystem *battleSys, BattleContext *battleCtx);
static void AICmd_LoadBattlerSpeedRank(BattleSystem *battleSys, BattleContext *battleCtx);
static void AICmd_LoadIsBattlerFirstTurn(BattleSystem *battleSys, BattleContext *battleCtx);
static void AICmd_LoadBattlerTurnCount(BattleSystem *battleSys, BattleContext *battleCtx);
static void AICmd_IfPartyMemberDealsMoreDamage(BattleSystem *battleSys, BattleContext *battleCtx);
static void AICmd_IfHasSuperEffectiveMove(BattleSystem *battleSys, BattleContext *battleCtx);
static void AICmd_IfBattlerDealsMoreDamage(BattleSystem *battleSys, BattleContext *battleCtx);
@@ -299,7 +299,7 @@ static const AICommandFunc sAICommandTable[] = {
AICmd_LoadCurrentMoveClass,
AICmd_LoadDefenderLastUsedMoveClass,
AICmd_LoadBattlerSpeedRank,
AICmd_LoadIsBattlerFirstTurn,
AICmd_LoadBattlerTurnCount,
AICmd_IfPartyMemberDealsMoreDamage,
AICmd_IfHasSuperEffectiveMove,
AICmd_IfBattlerDealsMoreDamage,
@@ -2199,7 +2199,7 @@ static void AICmd_LoadBattlerSpeedRank(BattleSystem *battleSys, BattleContext *b
}
}
static void AICmd_LoadIsBattlerFirstTurn(BattleSystem *battleSys, BattleContext *battleCtx)
static void AICmd_LoadBattlerTurnCount(BattleSystem *battleSys, BattleContext *battleCtx)
{
AIScript_Iter(battleCtx, 1);

View File

@@ -1184,15 +1184,9 @@ static inline int CompareSpeed_ApplySimple(BattleContext *battleCtx, int battler
return stage;
}
enum {
BATTLER_1_GOES_FIRST = 0,
BATTLER_2_GOES_FIRST,
BATTLER_2_WINS_SPEED_TIE,
};
u8 BattleSystem_CompareBattlerSpeed(BattleSystem *battleSys, BattleContext *battleCtx, int battler1, int battler2, BOOL ignoreQuickClaw)
{
u8 result = BATTLER_1_GOES_FIRST;
u8 result = COMPARE_SPEED_FASTER;
u32 battler1Speed, battler2Speed;
u16 battler1Move = 0, battler2Move = 0;
u8 battler1ItemEffect, battler1ItemParam;
@@ -1406,53 +1400,53 @@ u8 BattleSystem_CompareBattlerSpeed(BattleSystem *battleSys, BattleContext *batt
if (battler1Priority == battler2Priority) {
if (battler1QuickClaw && battler2QuickClaw) {
if (battler1Speed < battler2Speed) {
result = BATTLER_2_GOES_FIRST;
result = COMPARE_SPEED_SLOWER;
} else if (battler1Speed == battler2Speed && (BattleSystem_RandNext(battleSys) & 1)) {
result = BATTLER_2_WINS_SPEED_TIE;
result = COMPARE_SPEED_TIE;
}
} else if (battler1QuickClaw == FALSE && battler2QuickClaw) {
result = BATTLER_2_GOES_FIRST;
result = COMPARE_SPEED_SLOWER;
} else if (battler1QuickClaw && battler2QuickClaw == FALSE) {
result = BATTLER_1_GOES_FIRST;
result = COMPARE_SPEED_FASTER;
} else if (battler1LaggingTail && battler2LaggingTail) {
if (battler1Speed > battler2Speed) {
result = BATTLER_2_GOES_FIRST;
result = COMPARE_SPEED_SLOWER;
} else if (battler1Speed == battler2Speed && (BattleSystem_RandNext(battleSys) & 1)) {
result = BATTLER_2_WINS_SPEED_TIE;
result = COMPARE_SPEED_TIE;
}
} else if (battler1LaggingTail && battler2LaggingTail == FALSE) {
result = BATTLER_2_GOES_FIRST;
result = COMPARE_SPEED_SLOWER;
} else if (battler1LaggingTail == FALSE && battler2LaggingTail) {
result = BATTLER_1_GOES_FIRST;
result = COMPARE_SPEED_FASTER;
} else if (battler1Ability == ABILITY_STALL && battler2Ability == ABILITY_STALL) {
if (battler1Speed > battler2Speed) {
result = BATTLER_2_GOES_FIRST;
result = COMPARE_SPEED_SLOWER;
} else if (battler1Speed == battler2Speed && (BattleSystem_RandNext(battleSys) & 1)) {
result = BATTLER_2_WINS_SPEED_TIE;
result = COMPARE_SPEED_TIE;
}
} else if (battler1Ability == ABILITY_STALL && battler2Ability != ABILITY_STALL) {
result = BATTLER_2_GOES_FIRST;
result = COMPARE_SPEED_SLOWER;
} else if (battler1Ability != ABILITY_STALL && battler2Ability == ABILITY_STALL) {
result = BATTLER_1_GOES_FIRST;
result = COMPARE_SPEED_FASTER;
} else if (battleCtx->fieldConditionsMask & FIELD_CONDITION_TRICK_ROOM) {
if (battler1Speed > battler2Speed) {
result = BATTLER_2_GOES_FIRST;
result = COMPARE_SPEED_SLOWER;
}
if (battler1Speed == battler2Speed && (BattleSystem_RandNext(battleSys) & 1)) {
result = BATTLER_2_WINS_SPEED_TIE;
result = COMPARE_SPEED_TIE;
}
} else {
if (battler1Speed < battler2Speed) {
result = BATTLER_2_GOES_FIRST;
result = COMPARE_SPEED_SLOWER;
}
if (battler1Speed == battler2Speed && (BattleSystem_RandNext(battleSys) & 1)) {
result = BATTLER_2_WINS_SPEED_TIE;
result = COMPARE_SPEED_TIE;
}
}
} else if (battler1Priority < battler2Priority) {
result = BATTLER_2_GOES_FIRST;
result = COMPARE_SPEED_SLOWER;
}
return result;