summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnonymousRandomPerson <chenghanngan.us@gmail.com>2022-01-04 00:00:31 -0600
committerAnonymousRandomPerson <chenghanngan.us@gmail.com>2022-01-04 00:00:31 -0600
commitc30cf5c6da8283330bc352d58acc037739cd8b72 (patch)
tree5111fdbfe6da65738816bfb8fd7c3b1a11f3ca29
parenta61f7ea2a1913df28ea4f3ecd71c57fa4e5bbf5c (diff)
Decomped EvaluateItem()
-rw-r--r--asm/code_8048480.s634
-rw-r--r--asm/code_80494EC.s59
-rw-r--r--include/constants/item.h14
-rw-r--r--include/dungeon_ai_item_weight.h9
-rw-r--r--include/dungeon_entity.h3
-rw-r--r--include/moves.h8
-rwxr-xr-xld_script.txt2
-rw-r--r--src/dungeon_ai_item_weight.c442
-rw-r--r--src/dungeon_ai_items.c2
-rw-r--r--src/dungeon_items.c8
-rw-r--r--src/items.c4
-rw-r--r--src/moves.c4
12 files changed, 537 insertions, 652 deletions
diff --git a/asm/code_8048480.s b/asm/code_8048480.s
index 37e3310..5f533e2 100644
--- a/asm/code_8048480.s
+++ b/asm/code_8048480.s
@@ -1310,638 +1310,4 @@ sub_8048F00:
_08048F24: .4byte gPtrMusicBoxPlayedCrumbledMessage
thumb_func_end sub_8048F00
- thumb_func_start EvaluateItem
-EvaluateItem:
- push {r4-r7,lr}
- sub sp, 0x4
- adds r4, r0, 0
- ldr r3, [r4, 0x70]
- movs r6, 0
- movs r0, 0x1
- adds r5, r2, 0
- ands r5, r0
- lsrs r2, 1
- movs r0, 0x1
- ands r2, r0
- ldrb r0, [r1, 0x2]
- subs r0, 0x1
- cmp r0, 0xCC
- bls _08048F48
- b _080494E0
-_08048F48:
- lsls r0, 2
- ldr r1, _08048F54
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08048F54: .4byte _08048F58
- .align 2, 0
-_08048F58:
- .4byte _0804928C
- .4byte _0804928C
- .4byte _0804928C
- .4byte _0804928C
- .4byte _0804928C
- .4byte _0804928C
- .4byte _0804928C
- .4byte _0804928C
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _08049408
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _08049296
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080492B0
- .4byte _080492B0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _08049320
- .4byte _080494E0
- .4byte _080492B8
- .4byte _080492B8
- .4byte _0804935E
- .4byte _080494E0
- .4byte _080493E0
- .4byte _0804948E
- .4byte _08049394
- .4byte _08049344
- .4byte _0804946E
- .4byte _0804947A
- .4byte _08049378
- .4byte _080493CE
- .4byte _080493AC
- .4byte _080493B8
- .4byte _08049436
- .4byte _080494E0
- .4byte _080493F6
- .4byte _080494B2
- .4byte _0804946A
- .4byte _08049462
- .4byte _08049454
- .4byte _08049498
- .4byte _080492DC
- .4byte _0804932C
- .4byte _08049338
- .4byte _0804933C
- .4byte _08049340
- .4byte _080494C2
- .4byte _080494C2
- .4byte _080494D6
- .4byte _080494C2
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494E0
- .4byte _080494DA
-_0804928C:
- cmp r5, 0
- bne _08049292
- b _080494E2
-_08049292:
- movs r6, 0x46
- b _080494E2
-_08049296:
- cmp r5, 0
- bne _0804929C
- b _080494E0
-_0804929C:
- movs r1, 0x9E
- lsls r1, 1
- adds r0, r3, r1
- ldr r0, [r0]
- bl GetBellyRoundedUp
- cmp r0, 0
- ble _080492AE
- b _0804948A
-_080492AE:
- b _080494E0
-_080492B0:
- cmp r5, 0
- beq _080492B6
- b _0804948A
-_080492B6:
- b _080494E0
-_080492B8:
- movs r2, 0xE
- ldrsh r1, [r3, r2]
- movs r2, 0x10
- ldrsh r0, [r3, r2]
- cmp r1, r0
- blt _080492C6
- b _080494E2
-_080492C6:
- cmp r0, 0
- bge _080492CC
- adds r0, 0x3
-_080492CC:
- asrs r0, 2
- cmp r1, r0
- ble _080492D4
- b _080494E2
-_080492D4:
- cmp r5, 0
- bne _080492DA
- b _08049420
-_080492DA:
- b _08049432
-_080492DC:
- movs r6, 0
- movs r0, 0x8C
- lsls r0, 1
- adds r5, r3, r0
- adds r7, r5, 0
- movs r2, 0x3
-_080492E8:
- ldrb r1, [r5]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- beq _0804930C
- ldrb r0, [r5, 0x4]
- cmp r0, 0
- bne _080492FA
- adds r6, 0x1E
-_080492FA:
- ldrb r4, [r5, 0x4]
- adds r0, r7, 0
- str r2, [sp]
- bl GetMoveMaxPP
- ldr r2, [sp]
- cmp r4, r0
- beq _0804930C
- adds r6, 0x6
-_0804930C:
- adds r5, 0x8
- adds r7, 0x8
- subs r2, 0x1
- cmp r2, 0
- bge _080492E8
- cmp r6, 0x62
- bgt _0804931C
- b _080494E2
-_0804931C:
- movs r6, 0x63
- b _080494E2
-_08049320:
- adds r0, r4, 0
- bl HasNegativeStatus
- lsls r0, 24
- movs r6, 0
- b _080494BC
-_0804932C:
- ldrb r0, [r3, 0x14]
-_0804932E:
- movs r6, 0x64
- cmp r0, 0xF9
- bhi _08049336
- b _080494E2
-_08049336:
- b _080494E0
-_08049338:
- ldrb r0, [r3, 0x15]
- b _0804932E
-_0804933C:
- ldrb r0, [r3, 0x16]
- b _0804932E
-_08049340:
- ldrb r0, [r3, 0x17]
- b _0804932E
-_08049344:
- cmp r5, 0
- beq _0804934A
- b _080494E0
-_0804934A:
- adds r0, r4, 0
- bl CanTargetAdjacentPokemon
- lsls r0, 24
- movs r6, 0x64
- cmp r0, 0
- bne _0804935A
- b _080494E2
-_0804935A:
- movs r6, 0xA
- b _080494E2
-_0804935E:
- adds r0, r4, 0
- bl CanSeeInvisible
- lsls r0, 24
- cmp r0, 0
- beq _0804936C
- b _080494A2
-_0804936C:
- adds r0, r4, 0
- bl CanTargetAdjacentPokemon
- lsls r0, 24
- movs r6, 0x5
- b _080494BC
-_08049378:
- ldr r0, [r4, 0x70]
- movs r1, 0x82
- lsls r1, 1
- adds r0, r1
- ldr r0, [r0]
- cmp r0, 0x3
- ble _08049388
- b _080494A2
-_08049388:
- adds r0, r4, 0
- bl CanTargetAdjacentPokemon
- lsls r0, 24
- movs r6, 0x5
- b _080494BC
-_08049394:
- adds r0, r3, 0
- adds r0, 0xE8
- ldrb r0, [r0]
- cmp r0, 0x2
- bne _080493A0
- b _080494A2
-_080493A0:
- adds r0, r4, 0
- bl CanTargetAdjacentPokemon
- lsls r0, 24
- movs r6, 0x5
- b _080494BC
-_080493AC:
- adds r0, r3, 0
- adds r0, 0xAC
- ldrb r0, [r0]
- cmp r0, 0x4
- bne _080494A2
- b _080494B2
-_080493B8:
- adds r0, r3, 0
- adds r0, 0xBC
- ldrb r0, [r0]
- cmp r0, 0x2
- beq _080494A2
- adds r0, r4, 0
- bl CanTargetAdjacentPokemon
- lsls r0, 24
- movs r6, 0xF
- b _080494BC
-_080493CE:
- adds r0, r3, 0
- adds r0, 0xAC
- ldrb r0, [r0]
- subs r0, 0x2
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bhi _080494A2
- b _08049420
-_080493E0:
- adds r0, r3, 0
- adds r0, 0xE8
- ldrb r0, [r0]
- cmp r0, 0x1
- beq _080494A2
- adds r0, r4, 0
- bl CanTargetAdjacentPokemon
- lsls r0, 24
- movs r6, 0x5
- b _080494BC
-_080493F6:
- cmp r2, 0
- bne _0804940C
- adds r0, r4, 0
- bl CanTargetAdjacentPokemon
- lsls r0, 24
- movs r6, 0x5
- cmp r0, 0
- beq _080494E2
-_08049408:
- movs r6, 0x28
- b _080494E2
-_0804940C:
- movs r2, 0xE
- ldrsh r1, [r3, r2]
- movs r2, 0x10
- ldrsh r0, [r3, r2]
- cmp r1, r0
- bge _080494E2
- cmp r1, 0x13
- bgt _080494E2
- cmp r5, 0
- bne _08049432
-_08049420:
- adds r0, r4, 0
- bl CanTargetAdjacentPokemon
- lsls r0, 24
- movs r6, 0x32
- cmp r0, 0
- beq _080494E2
- movs r6, 0x64
- b _080494E2
-_08049432:
- movs r6, 0x32
- b _080494E2
-_08049436:
- adds r0, r3, 0
- adds r0, 0xA8
- ldrb r0, [r0]
- cmp r0, 0x1
- beq _080494A2
- cmp r0, 0x5
- beq _080494A2
- cmp r0, 0x3
- beq _080494A2
- adds r0, r4, 0
- bl CanTargetAdjacentPokemon
- lsls r0, 24
- movs r6, 0x5
- b _080494BC
-_08049454:
- adds r0, r3, 0
- adds r0, 0xA8
- ldrb r0, [r0]
- cmp r0, 0x2
- beq _080494A2
- movs r6, 0x5
- b _080494E2
-_08049462:
- ldrb r0, [r3, 0x9]
- movs r6, 0
- cmp r0, 0x62
- bhi _080494E2
-_0804946A:
- movs r6, 0x50
- b _080494E2
-_0804946E:
- adds r0, r3, 0
- adds r0, 0xAC
- ldrb r0, [r0]
- cmp r0, 0x1
- beq _0804948A
- b _080494E0
-_0804947A:
- movs r1, 0x9E
- lsls r1, 1
- adds r0, r3, r1
- ldr r0, [r0]
- bl GetBellyRoundedUp
- cmp r0, 0
- ble _080494E0
-_0804948A:
- movs r0, 0x32
- b _080494E4
-_0804948E:
- ldrb r0, [r3, 0x9]
- movs r6, 0
- cmp r0, 0x1
- bls _080494E2
- b _0804946A
-_08049498:
- adds r0, r3, 0
- adds r0, 0xB0
- ldrb r0, [r0]
- cmp r0, 0x6
- bne _080494A6
-_080494A2:
- movs r0, 0
- b _080494E4
-_080494A6:
- adds r0, r4, 0
- bl CanTargetAdjacentPokemon
- lsls r0, 24
- movs r6, 0x5
- b _080494BC
-_080494B2:
- adds r0, r4, 0
- bl CanTargetAdjacentPokemon
- lsls r0, 24
- movs r6, 0x1E
-_080494BC:
- cmp r0, 0
- beq _080494E2
- b _0804946A
-_080494C2:
- movs r2, 0x9E
- lsls r2, 1
- adds r0, r3, r2
- ldr r0, [r0]
- bl GetBellyRoundedUp
- cmp r0, 0x9
- bgt _080494E0
- movs r0, 0x64
- b _080494E4
-_080494D6:
- movs r6, 0x1E
- b _080494E2
-_080494DA:
- movs r6, 0x14
- cmp r5, 0
- beq _080494E2
-_080494E0:
- movs r6, 0
-_080494E2:
- adds r0, r6, 0
-_080494E4:
- add sp, 0x4
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end EvaluateItem
-
- thumb_func_start CanTargetAdjacentPokemon
-CanTargetAdjacentPokemon:
- push {r4-r6,lr}
- adds r5, r0, 0
- movs r6, 0
-_080494F2:
- movs r1, 0x4
- ldrsh r0, [r5, r1]
- ldr r1, _08049538
- lsls r2, r6, 2
- adds r2, r1
- movs r3, 0
- ldrsh r1, [r2, r3]
- adds r0, r1
- movs r3, 0x6
- ldrsh r1, [r5, r3]
- movs r3, 0x2
- ldrsh r2, [r2, r3]
- adds r1, r2
- bl GetMapTileAtPosition
- ldr r4, [r0, 0x10]
- cmp r4, 0
- beq _0804953C
- adds r0, r4, 0
- bl GetEntityType
- cmp r0, 0
- beq _0804953C
- adds r0, r5, 0
- adds r1, r4, 0
- movs r2, 0
- movs r3, 0x1
- bl CanTarget
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _0804953C
- movs r0, 0x1
- b _08049544
- .align 2, 0
-_08049538: .4byte gAdjacentTileOffsets
-_0804953C:
- adds r6, 0x1
- cmp r6, 0x7
- ble _080494F2
- movs r0, 0
-_08049544:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end CanTargetAdjacentPokemon
-
.align 2, 0 \ No newline at end of file
diff --git a/asm/code_80494EC.s b/asm/code_80494EC.s
new file mode 100644
index 0000000..a38b22b
--- /dev/null
+++ b/asm/code_80494EC.s
@@ -0,0 +1,59 @@
+ #include "asm/constants/gba_constants.inc"
+ #include "asm/macros.inc"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start CanTargetAdjacentPokemon
+CanTargetAdjacentPokemon:
+ push {r4-r6,lr}
+ adds r5, r0, 0
+ movs r6, 0
+_080494F2:
+ movs r1, 0x4
+ ldrsh r0, [r5, r1]
+ ldr r1, _08049538
+ lsls r2, r6, 2
+ adds r2, r1
+ movs r3, 0
+ ldrsh r1, [r2, r3]
+ adds r0, r1
+ movs r3, 0x6
+ ldrsh r1, [r5, r3]
+ movs r3, 0x2
+ ldrsh r2, [r2, r3]
+ adds r1, r2
+ bl GetMapTileAtPosition
+ ldr r4, [r0, 0x10]
+ cmp r4, 0
+ beq _0804953C
+ adds r0, r4, 0
+ bl GetEntityType
+ cmp r0, 0
+ beq _0804953C
+ adds r0, r5, 0
+ adds r1, r4, 0
+ movs r2, 0
+ movs r3, 0x1
+ bl CanTarget
+ lsls r0, 24
+ lsrs r0, 24
+ cmp r0, 0x1
+ bne _0804953C
+ movs r0, 0x1
+ b _08049544
+ .align 2, 0
+_08049538: .4byte gAdjacentTileOffsets
+_0804953C:
+ adds r6, 0x1
+ cmp r6, 0x7
+ ble _080494F2
+ movs r0, 0
+_08049544:
+ pop {r4-r6}
+ pop {r1}
+ bx r1
+ thumb_func_end CanTargetAdjacentPokemon
+
+ .align 2, 0 \ No newline at end of file
diff --git a/include/constants/item.h b/include/constants/item.h
index 1268bd8..2f79b4d 100644
--- a/include/constants/item.h
+++ b/include/constants/item.h
@@ -162,18 +162,18 @@
#define ITEM_ID_CALM_MIND 0x80
#define ITEM_ID_ROAR 0x81
#define ITEM_ID_TOXIC 0x82
-#define ITEM_ID_HAIL_ORB 0x83
+#define ITEM_ID_HAIL 0x83
#define ITEM_ID_BULK_UP 0x84
#define ITEM_ID_BULLET_SEED 0x85
#define ITEM_ID_HIDDEN_POWER 0x86
-#define ITEM_ID_SUNNY_ORB 0x87
+#define ITEM_ID_SUNNY_DAY 0x87
#define ITEM_ID_TAUNT 0x88
#define ITEM_ID_ICE_BEAM 0x89
#define ITEM_ID_BLIZZARD 0x8A
#define ITEM_ID_HYPER_BEAM 0x8B
#define ITEM_ID_LIGHT_SCREEN 0x8C
#define ITEM_ID_PROTECT 0x8D
-#define ITEM_ID_RAINY_ORB 0x8E
+#define ITEM_ID_RAIN_DANCE 0x8E
#define ITEM_ID_GIGA_DRAIN 0x8F
#define ITEM_ID_SAFEGUARD 0x90
#define ITEM_ID_FRUSTRATION 0x91
@@ -187,14 +187,14 @@
#define ITEM_ID_PSYCHIC 0x99
#define ITEM_ID_SHADOW_BALL 0x9A
#define ITEM_ID_BRICK_BREAK 0x9B
-#define ITEM_ID_EVASION_ORB 0x9C
+#define ITEM_ID_DOUBLE_TEAM 0x9C
#define ITEM_ID_REFLECT 0x9D
#define ITEM_ID_SHOCK_WAVE 0x9E
#define ITEM_ID_FLAMETHROWER 0x9F
#define ITEM_ID_SLUDGE_BOMB 0xA0
-#define ITEM_ID_SANDY_ORB 0xA1
+#define ITEM_ID_SANDSTORM 0xA1
#define ITEM_ID_FIRE_BLAST 0xA2
-#define ITEM_ID_ROCKY_ORB 0xA3
+#define ITEM_ID_ROCK_TOMB 0xA3
#define ITEM_ID_AERIAL_ACE 0xA4
#define ITEM_ID_TORMENT 0xA5
#define ITEM_ID_FACADE 0xA6
@@ -204,7 +204,7 @@
#define ITEM_ID_THIEF 0xAA
#define ITEM_ID_STEEL_WING 0xAB
#define ITEM_ID_SKILL_SWAP 0xAC
-#define ITEM_ID_SNATCH_ORB 0xAD
+#define ITEM_ID_SNATCH 0xAD
#define ITEM_ID_OVERHEAT 0xAE
#define ITEM_ID_WIDE_SLASH 0xAF
#define ITEM_ID_EXCAVATE 0xB0
diff --git a/include/dungeon_ai_item_weight.h b/include/dungeon_ai_item_weight.h
new file mode 100644
index 0000000..705c0ca
--- /dev/null
+++ b/include/dungeon_ai_item_weight.h
@@ -0,0 +1,9 @@
+#ifndef GUARD_DUNGEON_AI_ITEM_WEIGHT_H
+#define GUARD_DUNGEON_AI_ITEM_WEIGHT_H
+
+#include "dungeon_entity.h"
+
+// 0x48F28
+u32 EvaluateItem(struct DungeonEntity *targetPokemon, struct ItemSlot *item, u32 itemTargetFlags);
+
+#endif
diff --git a/include/dungeon_entity.h b/include/dungeon_entity.h
index 233ef8e..d5c2871 100644
--- a/include/dungeon_entity.h
+++ b/include/dungeon_entity.h
@@ -164,8 +164,7 @@ struct DungeonEntityData
u8 fillFE[0x100 - 0xFE];
/* 0x100 */ u8 targetingDecoy; // If the Pokémon is targeting a decoy, this indicates whether the decoy target is a team or wild Pokémon.
u8 fill101[0x104 - 0x101];
- /* 0x104 */ u8 movementSpeed;
- u8 fill105[0x108 - 0x105];
+ /* 0x104 */ s32 movementSpeed;
// The turn counter for movement speed up/down is split into five timers each. Multiple timers are used if the Pokémon is affected by multiple
// speed-up/slow effects at once, like using Agility twice.
/* 0x108 */ u8 speedUpTurnsLeft[5];
diff --git a/include/moves.h b/include/moves.h
new file mode 100644
index 0000000..bba50b3
--- /dev/null
+++ b/include/moves.h
@@ -0,0 +1,8 @@
+#ifndef GUARD_MOVES_H
+#define GUARD_MOVES_H
+
+#include "constants/move.h"
+
+u32 GetMoveMaxPP(struct PokemonMove *move);
+
+#endif
diff --git a/ld_script.txt b/ld_script.txt
index 3e9309b..570f487 100755
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -196,6 +196,8 @@ SECTIONS {
asm/code_8046CE4.o(.text);
src/code_8048480.o(.text);
asm/code_8048480.o(.text);
+ src/dungeon_ai_item_weight.o(.text);
+ asm/code_80494EC.o(.text);
src/dungeon_map_access.o(.text);
asm/code_8049590.o(.text);
src/code_80521D0.o(.text);
diff --git a/src/dungeon_ai_item_weight.c b/src/dungeon_ai_item_weight.c
new file mode 100644
index 0000000..438c064
--- /dev/null
+++ b/src/dungeon_ai_item_weight.c
@@ -0,0 +1,442 @@
+#include "global.h"
+#include "dungeon_ai_item_weight.h"
+
+#include "constants/status.h"
+#include "dungeon_pokemon_attributes_1.h"
+#include "moves.h"
+
+extern s32 GetBellyRoundedUp(u32);
+extern bool8 CanTargetAdjacentPokemon(struct DungeonEntity*);
+extern bool8 HasNegativeStatus(struct DungeonEntity*);
+
+u32 EvaluateItem(struct DungeonEntity *targetPokemon, struct ItemSlot *item, u32 itemTargetFlags)
+{
+ struct DungeonEntityData *pokemonData = targetPokemon->entityData;
+ s32 itemWeight = 0;
+ bool8 targetOther = itemTargetFlags & 1;
+ u16 targetAlly = (itemTargetFlags >> 1) & 1;
+ s32 i;
+ struct PokemonMove *move;
+ struct PokemonMove *move2;
+ switch (item->itemIndex)
+ {
+ case ITEM_ID_STICK:
+ case ITEM_ID_IRON_THORN:
+ case ITEM_ID_SILVER_SPIKE:
+ case ITEM_ID_GOLD_FANG:
+ case ITEM_ID_CACNEA_SPIKE:
+ case ITEM_ID_CORSOLA_TWIG:
+ case ITEM_ID_GRAVELEROCK:
+ case ITEM_ID_GEO_PEBBLE:
+ if (targetOther)
+ {
+ itemWeight = 70;
+ }
+ break;
+ case ITEM_ID_DIET_RIBBON:
+ if (targetOther && GetBellyRoundedUp(pokemonData->belly) > 0)
+ {
+ return 50;
+ }
+ else
+ {
+ itemWeight = 0;
+ }
+ break;
+ case ITEM_ID_WHIFF_SPECS:
+ case ITEM_ID_NO_AIM_SCOPE:
+ if (targetOther)
+ {
+ return 50;
+ }
+ else
+ {
+ itemWeight = 0;
+ }
+ break;
+ case ITEM_ID_ORAN_BERRY:
+ case ITEM_ID_SITRUS_BERRY:
+ if (pokemonData->HP < pokemonData->maxHP && pokemonData->HP <= pokemonData->maxHP / 4)
+ {
+ if (!targetOther)
+ {
+ if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 100;
+ }
+ else
+ {
+ itemWeight = 50;
+ }
+ }
+ else
+ {
+ itemWeight = 50;
+ }
+ }
+ break;
+ case ITEM_ID_MAX_ELIXIR:
+ itemWeight = 0;
+ move = pokemonData->moves;
+ move2 = move;
+ for (i = 0; i < MAX_MON_MOVES; move++, move2++, i++)
+ {
+ if (move->moveFlags & MOVE_FLAG_EXISTS)
+ {
+ if (move->pp == 0)
+ {
+ itemWeight += 30;
+ }
+ if (move->pp != GetMoveMaxPP(move2))
+ {
+ itemWeight += 6;
+ }
+ }
+ }
+ if (itemWeight > 98)
+ {
+ itemWeight = 99;
+ }
+ break;
+ case ITEM_ID_HEAL_SEED:
+ if (HasNegativeStatus(targetPokemon))
+ {
+ itemWeight = 80;
+ }
+ else
+ {
+ itemWeight = 0;
+ }
+ break;
+ case ITEM_ID_PROTEIN:
+ if (pokemonData->attack > 249)
+ {
+ itemWeight = 0;
+ }
+ else
+ {
+ itemWeight = 100;
+ }
+ break;
+ case ITEM_ID_CALCIUM:
+ if (pokemonData->specialAttack > 249)
+ {
+ itemWeight = 0;
+ }
+ else
+ {
+ itemWeight = 100;
+ }
+ break;
+ case ITEM_ID_IRON:
+ if (pokemonData->defense > 249)
+ {
+ itemWeight = 0;
+ }
+ else
+ {
+ itemWeight = 100;
+ }
+ break;
+ case ITEM_ID_ZINC:
+ if (pokemonData->specialDefense > 249)
+ {
+ itemWeight = 0;
+ }
+ else
+ {
+ itemWeight = 100;
+ }
+ break;
+ case ITEM_ID_LIFE_SEED:
+ if (!targetOther)
+ {
+ if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 10;
+ }
+ else
+ {
+ itemWeight = 100;
+ }
+ }
+ else
+ {
+ itemWeight = 0;
+ }
+ break;
+ case ITEM_ID_EYEDROP_SEED:
+ if (!CanSeeInvisible(targetPokemon))
+ {
+ if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 80;
+ }
+ else
+ {
+ itemWeight = 5;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+ break;
+ case ITEM_ID_QUICK_SEED:
+ if (targetPokemon->entityData->movementSpeed <= 3)
+ {
+ if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 80;
+ }
+ else
+ {
+ itemWeight = 5;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+ break;
+ case ITEM_ID_ALLURE_SEED:
+ if (pokemonData->eyesightStatus != EYESIGHT_STATUS_CROSS_EYED)
+ {
+ if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 80;
+ }
+ else
+ {
+ itemWeight = 5;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+ break;
+ case ITEM_ID_CHERI_BERRY:
+ if (pokemonData->nonVolatileStatus != NON_VOLATILE_STATUS_PARALYZED)
+ {
+ return 0;
+ }
+ else if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 80;
+ }
+ else
+ {
+ itemWeight = 30;
+ }
+ break;
+ case ITEM_ID_TOTTER_SEED:
+ if (pokemonData->volatileStatus != VOLATILE_STATUS_CONFUSED)
+ {
+ if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 80;
+ }
+ else
+ {
+ itemWeight = 15;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+ break;
+ case ITEM_ID_PECHA_BERRY:
+ if (pokemonData->nonVolatileStatus != NON_VOLATILE_STATUS_POISONED &&
+ pokemonData->nonVolatileStatus != NON_VOLATILE_STATUS_BADLY_POISONED)
+ {
+ return 0;
+ }
+ else if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 100;
+ }
+ else
+ {
+ itemWeight = 50;
+ }
+ break;
+ case ITEM_ID_BLINKER_SEED:
+ if (pokemonData->eyesightStatus != EYESIGHT_STATUS_BLINKER)
+ {
+ if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 80;
+ }
+ else
+ {
+ itemWeight = 5;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+ break;
+ case ITEM_ID_WARP_SEED:
+ if (!targetAlly)
+ {
+ if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 40;
+ }
+ else
+ {
+ itemWeight = 5;
+ }
+ }
+ else if (pokemonData->HP < pokemonData->maxHP && pokemonData->HP < 20)
+ {
+ if (!targetOther)
+ {
+ if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 100;
+ }
+ else
+ {
+ itemWeight = 50;
+ }
+ }
+ else
+ {
+ itemWeight = 50;
+ }
+ }
+ break;
+ case ITEM_ID_PATSY_BAND:
+ itemWeight = 40;
+ break;
+ case ITEM_ID_SLEEP_SEED:
+ if (pokemonData->sleepStatus != SLEEP_STATUS_SLEEP &&
+ pokemonData->sleepStatus != SLEEP_STATUS_NAPPING &&
+ pokemonData->sleepStatus != SLEEP_STATUS_NIGHTMARE)
+ {
+ if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 80;
+ }
+ else
+ {
+ itemWeight = 5;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+ break;
+ case ITEM_ID_CHESTO_BERRY:
+ if (pokemonData->sleepStatus != SLEEP_STATUS_SLEEPLESS)
+ {
+ itemWeight = 5;
+ }
+ else
+ {
+ return 0;
+ }
+ break;
+ case ITEM_ID_JOY_SEED:
+ if (pokemonData->level < 99)
+ {
+ itemWeight = 80;
+ }
+ else
+ {
+ itemWeight = 0;
+ }
+ break;
+ case ITEM_ID_GINSENG:
+ itemWeight = 80;
+ break;
+ case ITEM_ID_RAWST_BERRY:
+ if (pokemonData->nonVolatileStatus == NON_VOLATILE_STATUS_BURNED)
+ {
+ return 50;
+ }
+ else
+ {
+ itemWeight = 0;
+ }
+ break;
+ case ITEM_ID_HUNGER_SEED:
+ if (GetBellyRoundedUp(pokemonData->belly) > 0)
+ {
+ return 50;
+ }
+ else
+ {
+ itemWeight = 0;
+ }
+ break;
+ case ITEM_ID_DOOM_SEED:
+ if (pokemonData->level > 1)
+ {
+ itemWeight = 80;
+ }
+ else
+ {
+ itemWeight = 0;
+ }
+ break;
+ case ITEM_ID_STUN_SEED:
+ if (pokemonData->immobilizeStatus == IMMOBILIZE_STATUS_PETRIFIED)
+ {
+ return 0;
+ }
+ else if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 80;
+ }
+ else
+ {
+ itemWeight = 5;
+ }
+ break;
+ case ITEM_ID_BLAST_SEED:
+ if (CanTargetAdjacentPokemon(targetPokemon))
+ {
+ itemWeight = 80;
+ }
+ else
+ {
+ itemWeight = 30;
+ }
+ break;
+ case ITEM_ID_APPLE:
+ case ITEM_ID_BIG_APPLE:
+ case ITEM_ID_HUGE_APPLE:
+ if (GetBellyRoundedUp(pokemonData->belly) < 10)
+ {
+ return 100;
+ }
+ else
+ {
+ itemWeight = 0;
+ }
+ break;
+ case ITEM_ID_GRIMY_FOOD:
+ itemWeight = 30;
+ break;
+ case ITEM_ID_ROLLCALL_ORB:
+ move = pokemonData->moves; // Fixes a regswap.
+ if (targetOther)
+ {
+ itemWeight = 0;
+ }
+ else
+ {
+ itemWeight = 20;
+ }
+ break;
+ default:
+ itemWeight = 0;
+ }
+ return itemWeight;
+}
diff --git a/src/dungeon_ai_items.c b/src/dungeon_ai_items.c
index 56e4447..8751eb1 100644
--- a/src/dungeon_ai_items.c
+++ b/src/dungeon_ai_items.c
@@ -8,6 +8,7 @@
#include "dungeon_action.h"
#include "dungeon_ai_1.h"
#include "dungeon_ai_attack.h"
+#include "dungeon_ai_item_weight.h"
#include "dungeon_ai_items.h"
#include "dungeon_capabilities.h"
#include "dungeon_capabilities_1.h"
@@ -35,7 +36,6 @@ enum ItemTargetFlag
};
extern s32 CalculateFacingDir(struct Position*, struct Position*);
-extern u32 EvaluateItem(struct DungeonEntity*, struct ItemSlot*, u32);
extern void sub_8077274(struct DungeonEntity *, struct DungeonEntity *);
extern s32 gNumPotentialTargets;
diff --git a/src/dungeon_items.c b/src/dungeon_items.c
index 5614e9b..bfaab53 100644
--- a/src/dungeon_items.c
+++ b/src/dungeon_items.c
@@ -4,16 +4,16 @@
bool8 HasItem(struct DungeonEntity *pokemon, u8 itemIndex)
{
// Weird assignment to fix a regswap.
- struct DungeonEntityData *entityData = entityData = pokemon->entityData;
- if (!(entityData->heldItem.itemFlags & ITEM_FLAG_EXISTS))
+ struct DungeonEntityData *pokemonData = pokemonData = pokemon->entityData;
+ if (!(pokemonData->heldItem.itemFlags & ITEM_FLAG_EXISTS))
{
return FALSE;
}
- if (entityData->heldItem.itemFlags & ITEM_FLAG_STICKY)
+ if (pokemonData->heldItem.itemFlags & ITEM_FLAG_STICKY)
{
return FALSE;
}
- if (entityData->heldItem.itemIndex != itemIndex)
+ if (pokemonData->heldItem.itemIndex != itemIndex)
{
return FALSE;
}
diff --git a/src/items.c b/src/items.c
index ff79822..a19b71b 100644
--- a/src/items.c
+++ b/src/items.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "file_system.h"
#include "item.h"
+#include "moves.h"
#include "team_inventory.h"
#include "random.h"
#include "pokemon.h"
@@ -42,7 +43,6 @@ extern void InitPokemonMove(void*, u16); // first arg is some struct
extern void sub_80078A4(u32, u32, u32, u32, u32);
extern u32 GetMoveType(void*);
extern u8* GetUnformattedTypeString(s16);
-extern u32 GetMoveMaxPP(void*);
extern void sub_80073E0(u32);
extern void xxx_format_and_draw(u32, u32, u8 *, u32, u32);
extern s32 sub_8091E94(s32 a1, s32 a2, s32 a3);
@@ -698,7 +698,7 @@ u32 sub_80913E0(struct ItemSlot* slot, u32 a2, struct subStruct_203B240 ** a3)
xxx_format_and_draw(8, 24, GetItemDescription(slot->itemIndex), a2, 0);
if (GetItemType(slot->itemIndex) == ITEM_TYPE_TM) {
- u8* buffer8 = buffer88 + 0x50; // field in struct
+ struct PokemonMove *buffer8 = (struct PokemonMove*) (buffer88 + 0x50); // field in struct
u16 move = GetItemMove(slot->itemIndex);
u8 moves_data;
u8* typestring;
diff --git a/src/moves.c b/src/moves.c
index e5998db..f2e334c 100644
--- a/src/moves.c
+++ b/src/moves.c
@@ -1,6 +1,7 @@
#include "global.h"
+#include "moves.h"
+
#include "file_system.h"
-#include "constants/move.h"
#include "constants/move_id.h"
struct MoveDataFile
@@ -36,7 +37,6 @@ extern u8 gUnknown_810992C[];
extern void sub_8093F10(struct PokemonMove *, struct PokemonMove *);
extern void sub_80928C0(u8 *, struct PokemonMove *, struct unkStruct_80928C0 *);
-extern u32 GetMoveMaxPP(struct PokemonMove*);
bool8 DoesMoveCharge(u16 move);
extern void ExpandPlaceholdersBuffer(u8 *, u8 *, ...);