mirror of
https://github.com/pret/pmd-red.git
synced 2026-06-16 21:50:21 -05:00
1473 lines
38 KiB
C
1473 lines
38 KiB
C
#include "global.h"
|
|
#include "weather.h"
|
|
#include "code_804267C.h"
|
|
#include "code_803E46C.h"
|
|
#include "dungeon.h"
|
|
#include "dungeon_config.h"
|
|
#include "dungeon_leader.h"
|
|
#include "dungeon_music.h"
|
|
#include "dungeon_util.h"
|
|
#include "pokemon.h"
|
|
#include "structs/map.h"
|
|
#include "dungeon_message.h"
|
|
#include "dungeon_pokemon_attributes.h"
|
|
#include "string_format.h"
|
|
#include "dungeon_movement.h"
|
|
#include "dungeon_capabilities.h"
|
|
#include "dungeon_visibility.h"
|
|
#include "dungeon_map_access.h"
|
|
#include "dungeon_movement.h"
|
|
#include "dungeon_ai_targeting.h"
|
|
#include "position_util.h"
|
|
#include "dungeon_ai.h"
|
|
#include "code_806CD90.h"
|
|
#include "code_807CD9C.h"
|
|
#include "code_805D8C8.h"
|
|
#include "code_8045A00.h"
|
|
#include "code_80450F8.h"
|
|
#include "constants/ability.h"
|
|
#include "constants/monster.h"
|
|
#include "constants/type.h"
|
|
|
|
extern u8 gUnknown_203B40D;
|
|
extern OpenedFile *gUnknown_202ECA0;
|
|
|
|
extern void sub_804178C(u32);
|
|
extern bool8 sub_80461C8(DungeonPos *, u32);
|
|
extern void sub_80429D8(Entity *r0);
|
|
extern s32 GetMonsterApparentID(Entity *pokemon, s32 id);
|
|
extern void sub_803E874(bool8 r10, s32 r9);
|
|
extern void GetWeatherName(u8 *dst, u8 weatherId);
|
|
extern s32 CalculateStatusTurns(Entity *target, const s16 *turnRange, bool8 factorCurerSkills);
|
|
extern void sub_80838EC(u8 *a);
|
|
extern bool8 sub_8044B28(void);
|
|
extern void sub_80460F8(DungeonPos *, Item *, u32);
|
|
|
|
void sub_807E7FC(bool8 arg0);
|
|
void sub_807EFFC(bool8 arg0);
|
|
s32 sub_807F19C(bool8 arg0);
|
|
void sub_807E8F0(Entity *pokemon);
|
|
bool8 sub_807EF48(void);
|
|
void sub_807F33C(void);
|
|
|
|
extern const u8 *gWeatherNames[];
|
|
|
|
extern const u8 *const gUnknown_80FC5E0;
|
|
extern const u8 *const gUnknown_80FA778;
|
|
extern const u8 *const gUnknown_80FA758;
|
|
extern const u8 *const gUnknown_80FE674;
|
|
extern const u8 *const gUnknown_80FE65C;
|
|
extern const u8 *const gUnknown_80FE63C;
|
|
extern const u8 *const gUnknown_80FE5F0;
|
|
extern const u8 *const gUnknown_80FAD8C;
|
|
extern const u8 *const gUnknown_80FADB0;
|
|
extern const u8 *const gUnknown_80FE5C0;
|
|
extern const u8 *const gUnknown_80FE4F4;
|
|
extern const u8 *const gUnknown_80FE568;
|
|
extern const u8 *const gUnknown_80FE520;
|
|
extern const u8 *const gUnknown_80FE4D4;
|
|
extern const u8 *const gUnknown_80FE4B8;
|
|
|
|
|
|
// Note: gUnknown_202ECA0 file's 2d array is read as 1d array in functions below, be careful!
|
|
void sub_807E698(bool8 arg0)
|
|
{
|
|
s32 i, j;
|
|
s32 weatherArrId = GetApparentWeather(NULL) * COLOR_RAMP_COUNT;
|
|
RGB *fileData = (void *) gUnknown_202ECA0->data;
|
|
u8 savedByte;
|
|
|
|
sub_8042818(GetApparentWeather(NULL), arg0);
|
|
sub_803E46C(0x25);
|
|
sub_804178C(1);
|
|
savedByte = gUnknown_203B40D;
|
|
gUnknown_203B40D = 1;
|
|
|
|
for (i = 0; i < 64; i++) {
|
|
bool8 r7 = FALSE;
|
|
|
|
sub_803E46C(0x25);
|
|
for (j = 0; j < COLOR_RAMP_COUNT; j++) {
|
|
if (abs(gDungeon->colorRamp[j].r - fileData[weatherArrId + j].r) < 10) {
|
|
gDungeon->colorRamp[j].r = fileData[weatherArrId + j].r;
|
|
}
|
|
else {
|
|
r7 = TRUE;
|
|
if (gDungeon->colorRamp[j].r < fileData[weatherArrId + j].r) {
|
|
gDungeon->colorRamp[j].r += 10;
|
|
}
|
|
else if (gDungeon->colorRamp[j].r > fileData[weatherArrId + j].r) {
|
|
gDungeon->colorRamp[j].r -= 10;
|
|
}
|
|
}
|
|
|
|
if (abs(gDungeon->colorRamp[j].g - fileData[weatherArrId + j].g) < 10) {
|
|
gDungeon->colorRamp[j].g = fileData[weatherArrId + j].g;
|
|
}
|
|
else {
|
|
r7 = TRUE;
|
|
if (gDungeon->colorRamp[j].g < fileData[weatherArrId + j].g) {
|
|
gDungeon->colorRamp[j].g += 10;
|
|
}
|
|
else if (gDungeon->colorRamp[j].g > fileData[weatherArrId + j].g) {
|
|
gDungeon->colorRamp[j].g -= 10;
|
|
}
|
|
}
|
|
|
|
if (abs(gDungeon->colorRamp[j].b - fileData[weatherArrId + j].b) < 10) {
|
|
gDungeon->colorRamp[j].b = fileData[weatherArrId + j].b;
|
|
}
|
|
else {
|
|
r7 = TRUE;
|
|
if (gDungeon->colorRamp[j].b < fileData[weatherArrId + j].b) {
|
|
gDungeon->colorRamp[j].b += 10;
|
|
}
|
|
else if (gDungeon->colorRamp[j].b > fileData[weatherArrId + j].b) {
|
|
gDungeon->colorRamp[j].b -= 10;
|
|
}
|
|
}
|
|
}
|
|
|
|
sub_803E874(FALSE, 0);
|
|
if (!r7)
|
|
break;
|
|
}
|
|
|
|
gUnknown_203B40D = savedByte;
|
|
sub_807E7FC(arg0);
|
|
}
|
|
|
|
void sub_807E7FC(bool8 r0)
|
|
{
|
|
s32 i;
|
|
|
|
Entity *cameraTarget = gDungeon->unk181e8.cameraTarget;
|
|
if (cameraTarget == NULL) {
|
|
cameraTarget = GetLeader();
|
|
}
|
|
|
|
if (r0) {
|
|
if (gDungeon->unk1356C == 0) {
|
|
GetWeatherName(gFormatBuffer_Monsters[0], GetApparentWeather(NULL));
|
|
LogMessageByIdWithPopupCheckUser(cameraTarget, gUnknown_80FC5E0); // Weather: {ARG_POKEMON_0}
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < DUNGEON_MAX_POKEMON; i++) {
|
|
Entity *pokemon = gDungeon->activePokemon[i];
|
|
if (EntityIsValid(pokemon)) {
|
|
sub_807E8F0(pokemon);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_807E88C(void)
|
|
{
|
|
s32 i;
|
|
s32 weatherArrId = GetApparentWeather(0) * COLOR_RAMP_COUNT;
|
|
RGB *fileData = (void *) gUnknown_202ECA0->data;
|
|
|
|
for (i = 0; i < COLOR_RAMP_COUNT; i++) {
|
|
gDungeon->colorRamp[i].r = fileData[weatherArrId + i].r;
|
|
gDungeon->colorRamp[i].g = fileData[weatherArrId + i].g;
|
|
gDungeon->colorRamp[i].b = fileData[weatherArrId + i].b;
|
|
}
|
|
|
|
sub_803E874(0, 0);
|
|
}
|
|
|
|
void sub_807E8F0(Entity *pokemon)
|
|
{
|
|
u8 oldTypes[2];
|
|
bool8 flag = FALSE;
|
|
|
|
if (EntityIsValid(pokemon)) {
|
|
EntityInfo *info = GetEntInfo(pokemon);
|
|
s32 previousApparentId = info->apparentID;
|
|
oldTypes[0] = info->types[0];
|
|
oldTypes[1] = info->types[1];
|
|
CalcSpeedStage(pokemon);
|
|
if (AbilityIsActive(pokemon, ABILITY_FORECAST)) {
|
|
info->types[0] = gCastformByWeather[GetApparentWeather(pokemon)].type;
|
|
info->types[1] = TYPE_NONE;
|
|
}
|
|
else if ((info->reflectClassStatus.status != STATUS_CONVERSION2) && (info->isColorChanged == FALSE)){
|
|
info->types[0] = GetPokemonType(info->id, 0);
|
|
info->types[1] = GetPokemonType(info->id, 1);
|
|
}
|
|
|
|
if ((oldTypes[0] != info->types[0]) || (oldTypes[1] != info->types[1])) {
|
|
flag = TRUE;
|
|
}
|
|
|
|
if (IS_CASTFORM_FORM_MONSTER(info->id) || info->id == MONSTER_CASTFORM) {
|
|
if (AbilityIsActive(pokemon, ABILITY_FORECAST)) {
|
|
info->apparentID = GetMonsterApparentID(pokemon, info->id);
|
|
}
|
|
else {
|
|
info->apparentID = MONSTER_CASTFORM;
|
|
}
|
|
if (info->apparentID != previousApparentId) {
|
|
pokemon->axObj.spriteFile = GetSpriteData(info->apparentID);
|
|
sub_806CCB4(pokemon,sub_806CEBC(pokemon));
|
|
flag = TRUE;
|
|
}
|
|
}
|
|
if (flag) {
|
|
sub_80429D8(pokemon);
|
|
}
|
|
}
|
|
}
|
|
|
|
void GetWeatherName(u8 *buffer, u8 weather)
|
|
{
|
|
strcpy(buffer, gWeatherNames[weather]);
|
|
}
|
|
|
|
void MudWaterSportEffect(u8 which)
|
|
{
|
|
if (which == 0) {
|
|
gDungeon->weather.mudSportTurns = CalculateStatusTurns(0, gMudWaterSportTurnRange, FALSE);
|
|
LogMessageByIdWithPopupCheckUser(GetLeader(), gUnknown_80FAD8C);
|
|
}
|
|
else {
|
|
gDungeon->weather.waterSportTurns =CalculateStatusTurns(0, gMudWaterSportTurnRange, FALSE);
|
|
LogMessageByIdWithPopupCheckUser(GetLeader(), gUnknown_80FADB0);
|
|
}
|
|
}
|
|
|
|
bool8 sub_807EAA0(bool8 arg0, bool8 arg1)
|
|
{
|
|
s32 i;
|
|
s32 var = 0;
|
|
s32 index = -1;
|
|
bool8 ret = FALSE;
|
|
s32 weatherBefore = GetApparentWeather(NULL);
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
if (gDungeon->weather.unkE267[i] < gDungeon->weather.naturalWeather[i]) {
|
|
gDungeon->weather.unkE267[i] = gDungeon->weather.naturalWeather[i];
|
|
}
|
|
else if (gDungeon->weather.unkE267[i] > gDungeon->weather.naturalWeather[i]) {
|
|
sub_80838EC(&gDungeon->weather.unkE267[i]);
|
|
}
|
|
|
|
if (var < gDungeon->weather.unkE267[i]) {
|
|
var = gDungeon->weather.unkE267[i];
|
|
index = i;
|
|
}
|
|
}
|
|
|
|
if (index < 0) {
|
|
gDungeon->weather.weather = gDungeon->weather.unkE265;
|
|
}
|
|
else {
|
|
gDungeon->weather.weather = index;
|
|
}
|
|
|
|
if (gDungeon->weather.nullifyWeather) {
|
|
gDungeon->weather.weather = 0;
|
|
}
|
|
|
|
if (weatherBefore != GetApparentWeather(NULL) || arg1) {
|
|
ret = TRUE;
|
|
sub_807E698(arg0);
|
|
}
|
|
|
|
if (gDungeon->weather.weatherDamageCounter != 0) {
|
|
gDungeon->weather.weatherDamageCounter--;
|
|
}
|
|
else {
|
|
gDungeon->weather.weatherDamageCounter = 9;
|
|
}
|
|
|
|
if (gDungeon->weather.mudSportTurns != 0) {
|
|
sub_80838EC(&gDungeon->weather.mudSportTurns);
|
|
if (gDungeon->weather.mudSportTurns == 0) {
|
|
LogMessageByIdWithPopupCheckUser(GetLeader(), gUnknown_80FA778);
|
|
}
|
|
}
|
|
if (gDungeon->weather.waterSportTurns != 0) {
|
|
sub_80838EC(&gDungeon->weather.waterSportTurns);
|
|
if (gDungeon->weather.waterSportTurns == 0) {
|
|
LogMessageByIdWithPopupCheckUser(GetLeader(), gUnknown_80FA758);
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void sub_807EC28(bool8 arg0)
|
|
{
|
|
Entity *leader;
|
|
EntityInfo *leaderInfo;
|
|
bool32 prevTileWasShop;
|
|
bool32 isShopTile;
|
|
|
|
if (sub_8044B28())
|
|
return;
|
|
|
|
leader = GetLeader();
|
|
leaderInfo = GetEntInfo(leader);
|
|
prevTileWasShop = gDungeon->unk644.unk54;
|
|
isShopTile = (GetTileAtEntitySafe(leader)->terrainType & TERRAIN_TYPE_SHOP) != 0;
|
|
gDungeon->unk644.unk54 = isShopTile;
|
|
gDungeon->unk644.unk55 = isShopTile;
|
|
if (gDungeon->unk644.unk2A || gDungeon->unk644.unk50 == 0)
|
|
return;
|
|
|
|
if (leaderInfo->invisibleClassStatus.status == STATUS_INVISIBLE) {
|
|
gDungeon->unk644.unk54 = 0;
|
|
gDungeon->unk644.unk55 = 0;
|
|
}
|
|
else {
|
|
s32 i;
|
|
struct MonDialogueSpriteInfo dialogueInfo;
|
|
bool8 sameRoom = FALSE;
|
|
bool8 var_2C;
|
|
bool8 var_28;
|
|
|
|
for (i = 0; i < DUNGEON_MAX_WILD_POKEMON; i++) {
|
|
Entity *wildMon = gDungeon->wildPokemon[i];
|
|
if (EntityIsValid(wildMon)) {
|
|
EntityInfo *wildMonInfo = GetEntInfo(wildMon);
|
|
if (wildMonInfo->shopkeeper == SHOPKEEPER_MODE_SHOPKEEPER && sub_8070BC0(wildMon) && GetEntityRoom(leader) == GetEntityRoom(wildMon)) {
|
|
sameRoom = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
dialogueInfo.species = MONSTER_KECLEON;
|
|
dialogueInfo.spriteId = 0;
|
|
if (!prevTileWasShop) {
|
|
if (isShopTile == TRUE) {
|
|
if (sameRoom) {
|
|
DisplayDungeonMessage(&dialogueInfo, gUnknown_80FE674, TRUE); // Ah welcome!
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
else {
|
|
if (isShopTile == TRUE) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
if ((prevTileWasShop != TRUE || isShopTile) && !arg0) {
|
|
return;
|
|
}
|
|
|
|
var_2C = FALSE;
|
|
var_28 = FALSE;
|
|
if (sub_807EF48()) {
|
|
var_28 = TRUE;
|
|
for (i = 0; i < DUNGEON_MAX_WILD_POKEMON; i++) {
|
|
Entity *wildMon = gDungeon->wildPokemon[i];
|
|
if (EntityIsValid(wildMon)
|
|
&& GetEntInfo(wildMon)->shopkeeper == SHOPKEEPER_MODE_SHOPKEEPER
|
|
&& sub_8070BC0(wildMon)
|
|
&& GetEntityRoom(leader) == GetEntityRoom(wildMon))
|
|
{
|
|
var_2C = TRUE;
|
|
if (abs(leader->pos.x - wildMon->pos.x) >= 2 || abs(leader->pos.y - wildMon->pos.y) >= 2) {
|
|
s32 x, y;
|
|
DungeonPos pos;
|
|
|
|
for (x = -1; x < 2; x++) {
|
|
for (y = -1; y < 2; y++) {
|
|
pos.x = leader->pos.x + x;
|
|
pos.y = leader->pos.y + y;
|
|
if (GetTile(pos.x, pos.y)->room != CORRIDOR_ROOM) {
|
|
if (!sub_80703A0(wildMon, &pos)) {
|
|
WarpTarget(leader, wildMon, 3, &pos);
|
|
goto LOOP_BREAK; // Used to break out of the nested loops
|
|
}
|
|
}
|
|
}
|
|
}
|
|
LOOP_BREAK:
|
|
}
|
|
|
|
if (sub_8070BC0(leader)) {
|
|
sub_806CE34(leader, GetDirectionTowardsPosition(&leader->pos, &wildMon->pos));
|
|
}
|
|
else {
|
|
var_2C = FALSE;
|
|
}
|
|
|
|
sub_806CE68(wildMon, GetDirectionTowardsPosition(&wildMon->pos, &leader->pos));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (var_28 && !var_2C) {
|
|
if (gDungeon->unk644.unk50 > gDungeon->unk644.unk48) {
|
|
sub_807F33C();
|
|
}
|
|
}
|
|
else if (var_28 && !sameRoom) {
|
|
if (gDungeon->unk644.unk50 > gDungeon->unk644.unk48) {
|
|
sub_807F33C();
|
|
}
|
|
}
|
|
else {
|
|
sub_807EFFC(var_2C);
|
|
if (sub_807F19C(var_2C)) {
|
|
sub_807F33C();
|
|
}
|
|
else if (prevTileWasShop == TRUE && !isShopTile && sameRoom) {
|
|
DisplayDungeonMessage(&dialogueInfo, gUnknown_80FE65C, TRUE); // I await your next visit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bool8 sub_807EF48(void)
|
|
{
|
|
if ((gDungeon->unk644.unk50 - gDungeon->unk644.unk48) > 0) {
|
|
return TRUE;
|
|
}
|
|
if (gDungeon->unk644.unk4C != 0) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void sub_807EF84(void)
|
|
{
|
|
s32 val;
|
|
struct MonDialogueSpriteInfo dialogueInfo;
|
|
|
|
dialogueInfo.species = MONSTER_KECLEON;
|
|
dialogueInfo.spriteId = 0;
|
|
|
|
sub_807EFFC(1);
|
|
val = sub_807F19C(TRUE);
|
|
if (val != 0) {
|
|
Tile *tile = GetTileAtEntitySafe(GetLeader());
|
|
if (tile->terrainType & TERRAIN_TYPE_SHOP) {
|
|
if (val != 2) {
|
|
DisplayDungeonMessage(&dialogueInfo, gUnknown_80FE63C, 1); // This is very disappointing, please return any items before you leave.
|
|
}
|
|
}
|
|
else {
|
|
sub_807F33C();
|
|
}
|
|
}
|
|
else {
|
|
DisplayDungeonMessage(&dialogueInfo, gUnknown_80FE5F0, 1); // Looking forward to seeing you again!
|
|
}
|
|
}
|
|
|
|
void sub_807EFFC(bool8 arg0)
|
|
{
|
|
struct MonDialogueSpriteInfo dialogueInfo;
|
|
|
|
if (gDungeon->unk644.unk4C == 0)
|
|
return;
|
|
|
|
dialogueInfo.species = MONSTER_KECLEON;
|
|
dialogueInfo.spriteId = 0;
|
|
if (!arg0)
|
|
return;
|
|
|
|
gFormatArgs[0] = gDungeon->unk644.unk4C;
|
|
if (DisplayDungeonYesNoMessage(&dialogueInfo, gUnknown_80FE5C0, TRUE) == 1) { // For the merch you have left, I shall pay X. Is that acceptable?
|
|
s32 x, y;
|
|
DungeonPos pos;
|
|
s32 local_24;
|
|
|
|
PlaySoundEffect(0x14c);
|
|
AddToTeamMoney(gDungeon->unk644.unk4C);
|
|
local_24 = gDungeon->unk644.unk48;
|
|
for (x = gDungeon->kecleonShopPos.minX; x <= gDungeon->kecleonShopPos.maxX; x++) {
|
|
for (y = gDungeon->kecleonShopPos.minY; y <= gDungeon->kecleonShopPos.maxY; y++) {
|
|
const Tile *tile;
|
|
|
|
pos.y = y;
|
|
pos.x = x;
|
|
tile = GetTile(x,y);
|
|
if (tile->terrainType & TERRAIN_TYPE_SHOP && tile->object != NULL && GetEntityType(tile->object) == ENTITY_ITEM) {
|
|
Item *itemPtr = GetItemData(tile->object);
|
|
if (!ItemInShop(itemPtr)) {
|
|
Item item = *itemPtr;
|
|
sub_80461C8(&pos, 1);
|
|
if (CanSellItem(item.id)) {
|
|
item.flags |= ITEM_FLAG_IN_SHOP;
|
|
}
|
|
sub_80460F8(&pos, &item, 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
gDungeon->unk644.unk50 += (gDungeon->unk644.unk48 - local_24);
|
|
DisplayDungeonMessage(&dialogueInfo, gUnknown_80FE4F4, 1); // Your patronage is valued
|
|
}
|
|
}
|
|
|
|
s32 sub_807F19C(bool8 arg0)
|
|
{
|
|
s32 diff;
|
|
struct MonDialogueSpriteInfo dialogueInfo;
|
|
s32 i, x, y;
|
|
|
|
dialogueInfo.species = MONSTER_KECLEON;
|
|
dialogueInfo.spriteId = 0;
|
|
diff = gDungeon->unk644.unk50 - gDungeon->unk644.unk48;
|
|
if (diff > 0) {
|
|
if (!arg0) {
|
|
return 1;
|
|
}
|
|
|
|
gFormatArgs[0] = diff;
|
|
if (DisplayDungeonYesNoMessage(&dialogueInfo, gUnknown_80FE568, TRUE) != 1) { // The merchandise you have chosen costs X
|
|
return 1;
|
|
}
|
|
if (gTeamInventoryRef->teamMoney < diff) {
|
|
DisplayDungeonMessage(&dialogueInfo, gUnknown_80FE520, TRUE); // You don't have enough money.
|
|
return 2;
|
|
}
|
|
PlaySoundEffect(0x14c);
|
|
AddToTeamMoney(-diff);
|
|
|
|
for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) {
|
|
for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) {
|
|
const Tile *tile = GetTile(x, y);
|
|
if (!(tile->terrainType & TERRAIN_TYPE_SHOP) && tile->object != NULL && GetEntityType(tile->object) == ENTITY_ITEM) {
|
|
Item *itemPtr = GetItemData(tile->object);
|
|
if (CanSellItem(itemPtr->id)) {
|
|
itemPtr->flags &= ~(ITEM_FLAG_IN_SHOP);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < INVENTORY_SIZE; i++) {
|
|
Item *item = &gTeamInventoryRef->teamItems[i];
|
|
if (ItemExists(item) && CanSellItem(item->id)) {
|
|
item->flags &= ~(ITEM_FLAG_IN_SHOP);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < DUNGEON_MAX_POKEMON; i++) {
|
|
Entity *mon = gDungeon->activePokemon[i];
|
|
if (EntityIsValid(mon)) {
|
|
EntityInfo *monInfo = GetEntInfo(mon);
|
|
Item *item = &monInfo->heldItem;
|
|
if (ItemExists(item) && CanSellItem(item->id)) {
|
|
item->flags &= ~(ITEM_FLAG_IN_SHOP);
|
|
}
|
|
}
|
|
}
|
|
gDungeon->unk644.unk50 = gDungeon->unk644.unk48;
|
|
DisplayDungeonMessage(&dialogueInfo, gUnknown_80FE4D4, TRUE); // Thank you very much.
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void sub_807F33C(void)
|
|
{
|
|
s32 i, x, y;
|
|
|
|
gDungeon->unk644.unk2A = 1;
|
|
gDungeon->unk644.unk2B = 1;
|
|
LogMessageByIdWithPopupCheckUser(GetLeader(), gUnknown_80FE4B8); // Help! Thief! I've been robbed! Help me catch the thief.
|
|
for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) {
|
|
for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) {
|
|
const Tile *tile = GetTile(x,y);
|
|
if (tile->object != NULL && GetEntityType(tile->object) == ENTITY_ITEM) {
|
|
Item *item = GetItemData(tile->object);
|
|
item->flags &= ~(ITEM_FLAG_IN_SHOP);
|
|
}
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < INVENTORY_SIZE; i++) {
|
|
Item *item = &gTeamInventoryRef->teamItems[i];
|
|
if (ItemExists(item)) {
|
|
item->flags &= ~(ITEM_FLAG_IN_SHOP);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < DUNGEON_MAX_POKEMON; i++) {
|
|
Entity *entity = gDungeon->activePokemon[i];
|
|
if (EntityIsValid(entity)) {
|
|
Item *item;
|
|
EntityInfo *info = GetEntInfo(entity);
|
|
|
|
info->shopkeeper = FALSE;
|
|
CalcSpeedStage(entity);
|
|
item = &info->heldItem;
|
|
if (ItemExists(item)) {
|
|
item->flags &= ~(ITEM_FLAG_IN_SHOP);
|
|
}
|
|
}
|
|
}
|
|
|
|
gDungeon->unk644.unk50 = 0;
|
|
gDungeon->unk644.unk48 = 0;
|
|
gDungeon->unk644.unk4C = 0;
|
|
}
|
|
|
|
extern void sub_80833E8(DungeonPos *param_1, s32 *param_2);
|
|
extern void sub_806A5B8(Entity *);
|
|
|
|
void sub_807F9BC(Entity *entity);
|
|
|
|
/*
|
|
void sub_807F43C(Entity *target, Entity *attacker)
|
|
{
|
|
if (AbilityIsActive(attacker, ABILITY_SUCTION_CUPS)) {
|
|
SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], attacker, 0);
|
|
TryDisplayDungeonLoggableMessage3(attacker, target, gUnknown_80FCB40); // is anchored, cannot be moved
|
|
}
|
|
else if (attacker == target) {
|
|
SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], attacker, 0);
|
|
TryDisplayDungeonLoggableMessage3(attacker, attacker, gUnknown_80FCB70); // couldn't be thrown for some reason
|
|
}
|
|
else {
|
|
s32 var_74[4];
|
|
DungeonPos positions[40];
|
|
DungeonPos attackerPos = attacker->pos;
|
|
s32 var_3C = 0;
|
|
s32 monId;
|
|
|
|
while (1) {
|
|
s32 positionsCounter = 0;
|
|
for (monId = 0; monId < DUNGEON_MAX_POKEMON; monId++) {
|
|
Entity *mon = gDungeon->activePokemon[monId];
|
|
if (EntityIsValid(mon) && target != mon && attacker != mon && CanSeeTarget(target, mon)) {
|
|
if (var_3C == 0) {
|
|
if (GetTreatmentBetweenMonsters(target, mon, FALSE, TRUE) != 1)
|
|
continue;
|
|
}
|
|
else {
|
|
if (GetTreatmentBetweenMonsters(target, mon, FALSE, TRUE) != 0)
|
|
continue;
|
|
}
|
|
|
|
if (var_3C != 0) {
|
|
s32 directionId;
|
|
DungeonPos pos;
|
|
for (directionId = 0; directionId < NUM_DIRECTIONS; directionId++) {
|
|
pos.x = mon->pos.x + gAdjacentTileOffsets[directionId].x;
|
|
pos.y = mon->pos.y + gAdjacentTileOffsets[directionId].y;
|
|
if (!sub_80703A0(attacker, &pos))
|
|
break;
|
|
}
|
|
|
|
if (directionId == NUM_DIRECTIONS)
|
|
break;
|
|
if (positionsCounter > 39)
|
|
break;
|
|
positions[positionsCounter++] = mon->pos;
|
|
}
|
|
else {
|
|
s32 directionId;
|
|
DungeonPos pos;
|
|
for (directionId = 0; directionId < NUM_DIRECTIONS; directionId++) {
|
|
pos.x = mon->pos.x + gAdjacentTileOffsets[directionId].x;
|
|
pos.y = mon->pos.y + gAdjacentTileOffsets[directionId].y;
|
|
if (!sub_80703A0(attacker, &pos) && positionsCounter < 40) {
|
|
positions[positionsCounter++] = mon->pos;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (positionsCounter == 0) {
|
|
if (++var_3C < 2)
|
|
continue;
|
|
sub_80833E8(&target->pos, var_74);
|
|
}
|
|
else {
|
|
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
*/
|
|
|
|
NAKED void sub_807F43C(Entity *target, Entity *attacker)
|
|
{
|
|
asm_unified("push {r4-r7,lr}\n"
|
|
" mov r7, r10\n"
|
|
" mov r6, r9\n"
|
|
" mov r5, r8\n"
|
|
" push {r5-r7}\n"
|
|
" sub sp, 0x10C\n"
|
|
" str r0, [sp, 0xEC]\n"
|
|
" mov r8, r1\n"
|
|
" mov r0, r8\n"
|
|
" movs r1, 0xE\n"
|
|
" bl AbilityIsActive\n"
|
|
" lsls r0, 24\n"
|
|
" cmp r0, 0\n"
|
|
" beq _0807F470\n"
|
|
" ldr r0, _0807F468\n"
|
|
" mov r1, r8\n"
|
|
" movs r2, 0\n"
|
|
" bl SubstitutePlaceholderStringTags\n"
|
|
" ldr r0, _0807F46C\n"
|
|
" b _0807F694\n"
|
|
" .align 2, 0\n"
|
|
"_0807F468: .4byte gFormatBuffer_Monsters\n"
|
|
"_0807F46C: .4byte gUnknown_80FCB40\n"
|
|
"_0807F470:\n"
|
|
" ldr r0, [sp, 0xEC]\n"
|
|
" cmp r0, r8\n"
|
|
" bne _0807F490\n"
|
|
" ldr r0, _0807F488\n"
|
|
" mov r1, r8\n"
|
|
" movs r2, 0\n"
|
|
" bl SubstitutePlaceholderStringTags\n"
|
|
" ldr r0, _0807F48C\n"
|
|
" ldr r2, [r0]\n"
|
|
" mov r0, r8\n"
|
|
" b _0807F698\n"
|
|
" .align 2, 0\n"
|
|
"_0807F488: .4byte gFormatBuffer_Monsters\n"
|
|
"_0807F48C: .4byte gUnknown_80FCB70\n"
|
|
"_0807F490:\n"
|
|
" mov r1, r8\n"
|
|
" ldr r0, [r1, 0x4]\n"
|
|
" add r1, sp, 0xD4\n"
|
|
" str r0, [r1]\n"
|
|
" movs r2, 0\n"
|
|
" str r2, [sp, 0xF0]\n"
|
|
"_0807F49C:\n"
|
|
" movs r3, 0\n"
|
|
" mov r9, r3\n"
|
|
" movs r7, 0\n"
|
|
" mov r4, sp\n"
|
|
" adds r4, 0x18\n"
|
|
" str r4, [sp, 0x108]\n"
|
|
"_0807F4A8:\n"
|
|
" ldr r0, _0807F504\n"
|
|
" ldr r0, [r0]\n"
|
|
" lsls r1, r7, 2\n"
|
|
" ldr r2, _0807F508\n"
|
|
" adds r0, r2\n"
|
|
" adds r0, r1\n"
|
|
" ldr r4, [r0]\n"
|
|
" adds r0, r4, 0\n"
|
|
" bl EntityIsValid\n"
|
|
" lsls r0, 24\n"
|
|
" adds r3, r7, 0x1\n"
|
|
" str r3, [sp, 0x104]\n"
|
|
" cmp r0, 0\n"
|
|
" bne _0807F4C8\n"
|
|
" b _0807F602\n"
|
|
"_0807F4C8:\n"
|
|
" ldr r0, [sp, 0xEC]\n"
|
|
" cmp r0, r4\n"
|
|
" bne _0807F4D0\n"
|
|
" b _0807F602\n"
|
|
"_0807F4D0:\n"
|
|
" cmp r8, r4\n"
|
|
" bne _0807F4D6\n"
|
|
" b _0807F602\n"
|
|
"_0807F4D6:\n"
|
|
" adds r1, r4, 0\n"
|
|
" bl CanSeeTarget\n"
|
|
" lsls r0, 24\n"
|
|
" cmp r0, 0\n"
|
|
" bne _0807F4E4\n"
|
|
" b _0807F602\n"
|
|
"_0807F4E4:\n"
|
|
" ldr r1, [sp, 0xF0]\n"
|
|
" cmp r1, 0\n"
|
|
" bne _0807F50C\n"
|
|
" ldr r0, [sp, 0xEC]\n"
|
|
" adds r1, r4, 0\n"
|
|
" movs r2, 0\n"
|
|
" movs r3, 0x1\n"
|
|
" bl GetTreatmentBetweenMonsters\n"
|
|
" lsls r0, 24\n"
|
|
" lsrs r0, 24\n"
|
|
" cmp r0, 0x1\n"
|
|
" beq _0807F500\n"
|
|
" b _0807F602\n"
|
|
"_0807F500:\n"
|
|
" b _0807F51E\n"
|
|
" .align 2, 0\n"
|
|
"_0807F504: .4byte gDungeon\n"
|
|
"_0807F508: .4byte 0x000135cc\n"
|
|
"_0807F50C:\n"
|
|
" ldr r0, [sp, 0xEC]\n"
|
|
" adds r1, r4, 0\n"
|
|
" movs r2, 0\n"
|
|
" movs r3, 0x1\n"
|
|
" bl GetTreatmentBetweenMonsters\n"
|
|
" lsls r0, 24\n"
|
|
" cmp r0, 0\n"
|
|
" bne _0807F602\n"
|
|
"_0807F51E:\n"
|
|
" ldr r2, [sp, 0xF0]\n"
|
|
" cmp r2, 0\n"
|
|
" bne _0807F594\n"
|
|
" movs r5, 0\n"
|
|
" add r6, sp, 0xC8\n"
|
|
" adds r3, r7, 0x1\n"
|
|
" str r3, [sp, 0x104]\n"
|
|
" adds r7, r6, 0\n"
|
|
" ldr r0, _0807F588\n"
|
|
" mov r10, r0\n"
|
|
"_0807F532:\n"
|
|
" ldr r0, _0807F58C\n"
|
|
" lsls r3, r5, 2\n"
|
|
" adds r3, r0\n"
|
|
" ldrh r0, [r4, 0x4]\n"
|
|
" ldrh r1, [r3]\n"
|
|
" adds r0, r1\n"
|
|
" lsls r0, 16\n"
|
|
" lsrs r0, 16\n"
|
|
" ldr r1, [r6]\n"
|
|
" mov r2, r10\n"
|
|
" ands r1, r2\n"
|
|
" orrs r1, r0\n"
|
|
" str r1, [r7]\n"
|
|
" ldrh r2, [r4, 0x6]\n"
|
|
" ldrh r3, [r3, 0x2]\n"
|
|
" adds r2, r3\n"
|
|
" lsls r2, 16\n"
|
|
" ldr r0, _0807F590\n"
|
|
" ands r1, r0\n"
|
|
" orrs r1, r2\n"
|
|
" str r1, [r7]\n"
|
|
" mov r0, r8\n"
|
|
" add r1, sp, 0xC8\n"
|
|
" bl sub_80703A0\n"
|
|
" lsls r0, 24\n"
|
|
" cmp r0, 0\n"
|
|
" beq _0807F570\n"
|
|
" adds r5, 0x1\n"
|
|
" cmp r5, 0x7\n"
|
|
" ble _0807F532\n"
|
|
"_0807F570:\n"
|
|
" cmp r5, 0x8\n"
|
|
" beq _0807F602\n"
|
|
" mov r3, r9\n"
|
|
" cmp r3, 0x27\n"
|
|
" bgt _0807F602\n"
|
|
" ldr r0, [r4, 0x4]\n"
|
|
" ldr r4, [sp, 0x108]\n"
|
|
" stm r4!, {r0}\n"
|
|
" str r4, [sp, 0x108]\n"
|
|
" movs r0, 0x1\n"
|
|
" add r9, r0\n"
|
|
" b _0807F602\n"
|
|
" .align 2, 0\n"
|
|
"_0807F588: .4byte 0xffff0000\n"
|
|
"_0807F58C: .4byte gAdjacentTileOffsets\n"
|
|
"_0807F590: .4byte 0x0000ffff\n"
|
|
"_0807F594:\n"
|
|
" movs r5, 0\n"
|
|
" add r6, sp, 0xCC\n"
|
|
" adds r1, r7, 0x1\n"
|
|
" str r1, [sp, 0x104]\n"
|
|
" adds r7, r6, 0\n"
|
|
" mov r2, r9\n"
|
|
" lsls r0, r2, 2\n"
|
|
" add r0, sp\n"
|
|
" adds r0, 0x18\n"
|
|
" mov r10, r0\n"
|
|
"_0807F5A8:\n"
|
|
" ldr r0, _0807F630\n"
|
|
" lsls r3, r5, 2\n"
|
|
" adds r3, r0\n"
|
|
" ldrh r0, [r4, 0x4]\n"
|
|
" ldrh r1, [r3]\n"
|
|
" adds r0, r1\n"
|
|
" lsls r0, 16\n"
|
|
" lsrs r0, 16\n"
|
|
" ldr r2, _0807F634\n"
|
|
" ldr r1, [r6]\n"
|
|
" ands r1, r2\n"
|
|
" orrs r1, r0\n"
|
|
" str r1, [r7]\n"
|
|
" ldrh r2, [r4, 0x6]\n"
|
|
" ldrh r3, [r3, 0x2]\n"
|
|
" adds r2, r3\n"
|
|
" lsls r2, 16\n"
|
|
" ldr r0, _0807F638\n"
|
|
" ands r1, r0\n"
|
|
" orrs r1, r2\n"
|
|
" str r1, [r7]\n"
|
|
" mov r0, r8\n"
|
|
" add r1, sp, 0xCC\n"
|
|
" bl sub_80703A0\n"
|
|
" lsls r0, 24\n"
|
|
" cmp r0, 0\n"
|
|
" bne _0807F5FC\n"
|
|
" mov r2, r9\n"
|
|
" cmp r2, 0x27\n"
|
|
" bgt _0807F5FC\n"
|
|
" ldr r0, [r6]\n"
|
|
" mov r3, r10\n"
|
|
" adds r3, 0x4\n"
|
|
" mov r10, r3\n"
|
|
" subs r3, 0x4\n"
|
|
" stm r3!, {r0}\n"
|
|
" ldr r0, [sp, 0x108]\n"
|
|
" adds r0, 0x4\n"
|
|
" str r0, [sp, 0x108]\n"
|
|
" movs r1, 0x1\n"
|
|
" add r9, r1\n"
|
|
"_0807F5FC:\n"
|
|
" adds r5, 0x1\n"
|
|
" cmp r5, 0x7\n"
|
|
" ble _0807F5A8\n"
|
|
"_0807F602:\n"
|
|
" ldr r7, [sp, 0x104]\n"
|
|
" cmp r7, 0x13\n"
|
|
" bgt _0807F60A\n"
|
|
" b _0807F4A8\n"
|
|
"_0807F60A:\n"
|
|
" mov r2, r9\n"
|
|
" cmp r2, 0\n"
|
|
" bne _0807F63C\n"
|
|
" ldr r3, [sp, 0xF0]\n"
|
|
" adds r3, 0x1\n"
|
|
" str r3, [sp, 0xF0]\n"
|
|
" cmp r3, 0x1\n"
|
|
" bgt _0807F61C\n"
|
|
" b _0807F49C\n"
|
|
"_0807F61C:\n"
|
|
" ldr r0, [sp, 0xEC]\n"
|
|
" adds r0, 0x4\n"
|
|
" add r4, sp, 0xB8\n"
|
|
" adds r1, r4, 0\n"
|
|
" bl sub_80833E8\n"
|
|
" movs r7, 0\n"
|
|
" add r5, sp, 0xD0\n"
|
|
" adds r6, r5, 0\n"
|
|
" b _0807F654\n"
|
|
" .align 2, 0\n"
|
|
"_0807F630: .4byte gAdjacentTileOffsets\n"
|
|
"_0807F634: .4byte 0xffff0000\n"
|
|
"_0807F638: .4byte 0x0000ffff\n"
|
|
"_0807F63C:\n"
|
|
" mov r0, r9\n"
|
|
" bl DungeonRandInt\n"
|
|
" lsls r0, 2\n"
|
|
" add r0, sp\n"
|
|
" adds r0, 0x18\n"
|
|
" ldr r0, [r0]\n"
|
|
" str r0, [sp, 0xD4]\n"
|
|
" b _0807F6A8\n"
|
|
"_0807F64E:\n"
|
|
" ldr r0, [r5]\n"
|
|
" str r0, [sp, 0xD4]\n"
|
|
" b _0807F68E\n"
|
|
"_0807F654:\n"
|
|
" ldr r0, [r4]\n"
|
|
" ldr r1, [r4, 0x8]\n"
|
|
" bl DungeonRandRange\n"
|
|
" lsls r0, 16\n"
|
|
" lsrs r0, 16\n"
|
|
" ldr r2, _0807F6A0\n"
|
|
" ldr r1, [r5]\n"
|
|
" ands r1, r2\n"
|
|
" orrs r1, r0\n"
|
|
" str r1, [r6]\n"
|
|
" ldr r0, [r4, 0x4]\n"
|
|
" ldr r1, [r4, 0xC]\n"
|
|
" bl DungeonRandRange\n"
|
|
" lsls r0, 16\n"
|
|
" ldrh r1, [r6]\n"
|
|
" orrs r1, r0\n"
|
|
" str r1, [r6]\n"
|
|
" mov r0, r8\n"
|
|
" add r1, sp, 0xD0\n"
|
|
" bl sub_80703A0\n"
|
|
" lsls r0, 24\n"
|
|
" cmp r0, 0\n"
|
|
" beq _0807F64E\n"
|
|
" adds r7, 0x1\n"
|
|
" cmp r7, 0x63\n"
|
|
" ble _0807F654\n"
|
|
"_0807F68E:\n"
|
|
" cmp r7, 0x64\n"
|
|
" bne _0807F6A8\n"
|
|
" ldr r0, _0807F6A4\n"
|
|
"_0807F694:\n"
|
|
" ldr r2, [r0]\n"
|
|
" ldr r0, [sp, 0xEC]\n"
|
|
"_0807F698:\n"
|
|
" mov r1, r8\n"
|
|
" bl TryDisplayDungeonLoggableMessage3\n"
|
|
" b _0807F99C\n"
|
|
" .align 2, 0\n"
|
|
"_0807F6A0: .4byte 0xffff0000\n"
|
|
"_0807F6A4: .4byte gUnknown_80FE6B4\n"
|
|
"_0807F6A8:\n"
|
|
" ldr r0, _0807F860\n"
|
|
" mov r1, r8\n"
|
|
" movs r2, 0\n"
|
|
" bl SubstitutePlaceholderStringTags\n"
|
|
" ldr r0, _0807F864\n"
|
|
" ldr r2, [r0]\n"
|
|
" ldr r0, [sp, 0xEC]\n"
|
|
" mov r1, r8\n"
|
|
" bl TryDisplayDungeonLoggableMessage3\n"
|
|
" mov r0, r8\n"
|
|
" bl sub_8045888\n"
|
|
" lsls r0, 24\n"
|
|
" cmp r0, 0\n"
|
|
" beq _0807F6D0\n"
|
|
" ldr r0, _0807F868\n"
|
|
" bl PlaySoundEffect\n"
|
|
"_0807F6D0:\n"
|
|
" movs r4, 0\n"
|
|
" str r4, [sp, 0x100]\n"
|
|
" mov r1, r8\n"
|
|
" ldr r0, [r1, 0x70]\n"
|
|
" adds r0, 0x46\n"
|
|
" ldrb r0, [r0]\n"
|
|
" mov r9, r0\n"
|
|
" add r2, sp, 0xD4\n"
|
|
" movs r3, 0\n"
|
|
" ldrsh r1, [r2, r3]\n"
|
|
" mov r4, r8\n"
|
|
" movs r3, 0x4\n"
|
|
" ldrsh r0, [r4, r3]\n"
|
|
" subs r3, r1, r0\n"
|
|
" movs r4, 0x2\n"
|
|
" ldrsh r1, [r2, r4]\n"
|
|
" mov r2, r8\n"
|
|
" movs r4, 0x6\n"
|
|
" ldrsh r0, [r2, r4]\n"
|
|
" subs r1, r0\n"
|
|
" cmp r1, r3\n"
|
|
" bge _0807F6FE\n"
|
|
" adds r1, r3, 0\n"
|
|
"_0807F6FE:\n"
|
|
" lsls r6, r1, 4\n"
|
|
" cmp r6, 0x50\n"
|
|
" ble _0807F706\n"
|
|
" movs r6, 0x50\n"
|
|
"_0807F706:\n"
|
|
" cmp r6, 0x9\n"
|
|
" bgt _0807F70C\n"
|
|
" movs r6, 0xA\n"
|
|
"_0807F70C:\n"
|
|
" mov r1, r8\n"
|
|
" adds r1, 0x4\n"
|
|
" add r0, sp, 0xD4\n"
|
|
" bl GetDirectionTowardsPosition\n"
|
|
" adds r5, r0, 0\n"
|
|
" add r2, sp, 0xD4\n"
|
|
" movs r1, 0\n"
|
|
" ldrsh r0, [r2, r1]\n"
|
|
" lsls r4, r0, 1\n"
|
|
" adds r4, r0\n"
|
|
" lsls r4, 11\n"
|
|
" movs r3, 0xC0\n"
|
|
" lsls r3, 4\n"
|
|
" adds r4, r3\n"
|
|
" ldr r0, _0807F86C\n"
|
|
" lsls r5, 2\n"
|
|
" adds r5, r0\n"
|
|
" movs r1, 0\n"
|
|
" ldrsh r0, [r5, r1]\n"
|
|
" lsls r0, 8\n"
|
|
" movs r1, 0x3\n"
|
|
" bl __divsi3\n"
|
|
" adds r4, r0\n"
|
|
" str r4, [sp, 0xF4]\n"
|
|
" movs r3, 0xD6\n"
|
|
" add r3, sp\n"
|
|
" movs r2, 0\n"
|
|
" ldrsh r0, [r3, r2]\n"
|
|
" lsls r4, r0, 1\n"
|
|
" adds r4, r0\n"
|
|
" lsls r4, 11\n"
|
|
" movs r0, 0x80\n"
|
|
" lsls r0, 5\n"
|
|
" adds r4, r0\n"
|
|
" movs r1, 0x2\n"
|
|
" ldrsh r0, [r5, r1]\n"
|
|
" lsls r0, 8\n"
|
|
" movs r1, 0x3\n"
|
|
" bl __divsi3\n"
|
|
" adds r4, r0\n"
|
|
" str r4, [sp, 0xF8]\n"
|
|
" mov r2, r8\n"
|
|
" ldr r5, [r2, 0xC]\n"
|
|
" ldr r3, [sp, 0xF4]\n"
|
|
" subs r0, r3, r5\n"
|
|
" adds r1, r6, 0\n"
|
|
" bl __divsi3\n"
|
|
" str r0, [sp, 0xFC]\n"
|
|
" mov r0, r8\n"
|
|
" ldr r4, [r0, 0x10]\n"
|
|
" ldr r1, [sp, 0xF8]\n"
|
|
" subs r0, r1, r4\n"
|
|
" adds r1, r6, 0\n"
|
|
" bl __divsi3\n"
|
|
" mov r10, r0\n"
|
|
" add r0, sp, 0xD8\n"
|
|
" str r5, [r0]\n"
|
|
" str r4, [r0, 0x4]\n"
|
|
" movs r7, 0\n"
|
|
" adds r5, r0, 0\n"
|
|
" cmp r7, r6\n"
|
|
" bge _0807F7FC\n"
|
|
" adds r4, r5, 0\n"
|
|
"_0807F794:\n"
|
|
" ldr r0, [r5]\n"
|
|
" ldr r2, [sp, 0xFC]\n"
|
|
" adds r0, r2, r0\n"
|
|
" str r0, [r4]\n"
|
|
" ldr r0, [r4, 0x4]\n"
|
|
" add r0, r10\n"
|
|
" str r0, [r4, 0x4]\n"
|
|
" mov r0, r8\n"
|
|
" adds r1, r4, 0\n"
|
|
" bl sub_804535C\n"
|
|
" mov r0, r8\n"
|
|
" bl sub_8045888\n"
|
|
" lsls r0, 24\n"
|
|
" cmp r0, 0\n"
|
|
" beq _0807F7E6\n"
|
|
" ldr r0, [sp, 0x100]\n"
|
|
" bl sin_4096\n"
|
|
" lsls r0, 5\n"
|
|
" mov r3, r8\n"
|
|
" str r0, [r3, 0x1C]\n"
|
|
" movs r0, 0x3B\n"
|
|
" bl sub_803E46C\n"
|
|
" movs r0, 0x3\n"
|
|
" ands r0, r7\n"
|
|
" cmp r0, 0\n"
|
|
" bne _0807F7E6\n"
|
|
" movs r0, 0x7\n"
|
|
" mov r1, r9\n"
|
|
" ands r1, r0\n"
|
|
" mov r9, r1\n"
|
|
" mov r0, r8\n"
|
|
" movs r1, 0x6\n"
|
|
" mov r2, r9\n"
|
|
" bl sub_806CDD4\n"
|
|
" movs r2, 0x1\n"
|
|
" add r9, r2\n"
|
|
"_0807F7E6:\n"
|
|
" movs r0, 0x80\n"
|
|
" lsls r0, 4\n"
|
|
" adds r1, r6, 0\n"
|
|
" bl __divsi3\n"
|
|
" ldr r3, [sp, 0x100]\n"
|
|
" adds r3, r0\n"
|
|
" str r3, [sp, 0x100]\n"
|
|
" adds r7, 0x1\n"
|
|
" cmp r7, r6\n"
|
|
" blt _0807F794\n"
|
|
"_0807F7FC:\n"
|
|
" ldr r4, [sp, 0xF4]\n"
|
|
" str r4, [r5]\n"
|
|
" add r1, sp, 0xD8\n"
|
|
" ldr r0, [sp, 0xF8]\n"
|
|
" str r0, [r1, 0x4]\n"
|
|
" movs r0, 0\n"
|
|
" mov r2, r8\n"
|
|
" str r0, [r2, 0x1C]\n"
|
|
" mov r0, r8\n"
|
|
" bl sub_804535C\n"
|
|
" movs r0, 0x3B\n"
|
|
" bl sub_803E46C\n"
|
|
" mov r3, r8\n"
|
|
" ldr r0, [r3, 0x70]\n"
|
|
" movs r1, 0x7\n"
|
|
" mov r4, r9\n"
|
|
" ands r4, r1\n"
|
|
" adds r0, 0x46\n"
|
|
" strb r4, [r0]\n"
|
|
" add r2, sp, 0xD4\n"
|
|
" movs r1, 0\n"
|
|
" ldrsh r0, [r2, r1]\n"
|
|
" adds r4, r2, 0\n"
|
|
" movs r3, 0x2\n"
|
|
" ldrsh r1, [r4, r3]\n"
|
|
" bl GetTile\n"
|
|
" ldr r6, [r0, 0x10]\n"
|
|
" adds r0, r6, 0\n"
|
|
" bl EntityIsValid\n"
|
|
" lsls r0, 24\n"
|
|
" cmp r0, 0\n"
|
|
" bne _0807F876\n"
|
|
" add r2, sp, 0xD4\n"
|
|
" movs r0, 0\n"
|
|
" ldrsh r1, [r2, r0]\n"
|
|
" movs r3, 0x2\n"
|
|
" ldrsh r2, [r4, r3]\n"
|
|
" mov r0, r8\n"
|
|
" movs r3, 0x1\n"
|
|
" bl sub_80694C0\n"
|
|
" mov r0, r8\n"
|
|
" bl sub_807F9BC\n"
|
|
" b _0807F99C\n"
|
|
" .align 2, 0\n"
|
|
"_0807F860: .4byte gFormatBuffer_Monsters\n"
|
|
"_0807F864: .4byte gUnknown_80FE690\n"
|
|
"_0807F868: .4byte 0x000001a3\n"
|
|
"_0807F86C: .4byte gAdjacentTileOffsets\n"
|
|
"_0807F870:\n"
|
|
" ldr r0, [r7]\n"
|
|
" str r0, [sp, 0xD4]\n"
|
|
" b _0807F8BE\n"
|
|
"_0807F876:\n"
|
|
" movs r5, 0\n"
|
|
" add r4, sp, 0xE0\n"
|
|
" adds r7, r4, 0\n"
|
|
"_0807F87C:\n"
|
|
" ldr r0, _0807F8D0\n"
|
|
" lsls r3, r5, 2\n"
|
|
" adds r3, r0\n"
|
|
" add r1, sp, 0xD4\n"
|
|
" ldrh r0, [r1]\n"
|
|
" ldrh r2, [r3]\n"
|
|
" adds r0, r2\n"
|
|
" lsls r0, 16\n"
|
|
" lsrs r0, 16\n"
|
|
" ldr r2, _0807F8D4\n"
|
|
" ldr r1, [r7]\n"
|
|
" ands r1, r2\n"
|
|
" orrs r1, r0\n"
|
|
" str r1, [r4]\n"
|
|
" add r0, sp, 0xD4\n"
|
|
" ldrh r2, [r0, 0x2]\n"
|
|
" ldrh r3, [r3, 0x2]\n"
|
|
" adds r2, r3\n"
|
|
" lsls r2, 16\n"
|
|
" ldr r0, _0807F8D8\n"
|
|
" ands r1, r0\n"
|
|
" orrs r1, r2\n"
|
|
" str r1, [r4]\n"
|
|
" mov r0, r8\n"
|
|
" add r1, sp, 0xE0\n"
|
|
" bl sub_80703A0\n"
|
|
" lsls r0, 24\n"
|
|
" cmp r0, 0\n"
|
|
" beq _0807F870\n"
|
|
" adds r5, 0x1\n"
|
|
" cmp r5, 0x7\n"
|
|
" ble _0807F87C\n"
|
|
"_0807F8BE:\n"
|
|
" cmp r5, 0x8\n"
|
|
" bne _0807F8DC\n"
|
|
" ldr r0, [sp, 0xEC]\n"
|
|
" mov r1, r8\n"
|
|
" movs r2, 0\n"
|
|
" movs r3, 0\n"
|
|
" bl WarpTarget\n"
|
|
" b _0807F8FA\n"
|
|
" .align 2, 0\n"
|
|
"_0807F8D0: .4byte gAdjacentTileOffsets\n"
|
|
"_0807F8D4: .4byte 0xffff0000\n"
|
|
"_0807F8D8: .4byte 0x0000ffff\n"
|
|
"_0807F8DC:\n"
|
|
" mov r0, r8\n"
|
|
" add r1, sp, 0xD4\n"
|
|
" bl sub_807D068\n"
|
|
" add r0, sp, 0xD4\n"
|
|
" movs r3, 0\n"
|
|
" ldrsh r1, [r0, r3]\n"
|
|
" movs r0, 0xD6\n"
|
|
" add r0, sp\n"
|
|
" movs r4, 0\n"
|
|
" ldrsh r2, [r0, r4]\n"
|
|
" mov r0, r8\n"
|
|
" movs r3, 0x1\n"
|
|
" bl sub_80694C0\n"
|
|
"_0807F8FA:\n"
|
|
" adds r0, r6, 0\n"
|
|
" bl GetEntityType\n"
|
|
" cmp r0, 0x1\n"
|
|
" bne _0807F954\n"
|
|
" add r4, sp, 0xE4\n"
|
|
" ldr r1, _0807F9AC\n"
|
|
" adds r0, r4, 0\n"
|
|
" bl InitPokemonMove\n"
|
|
" adds r0, r6, 0\n"
|
|
" adds r1, r4, 0\n"
|
|
" bl sub_80571F0\n"
|
|
" lsls r0, 24\n"
|
|
" lsrs r1, r0, 24\n"
|
|
" cmp r1, 0\n"
|
|
" bne _0807F93C\n"
|
|
" ldr r0, _0807F9B0\n"
|
|
" movs r3, 0\n"
|
|
" ldrsh r2, [r0, r3]\n"
|
|
" str r1, [sp]\n"
|
|
" str r1, [sp, 0x4]\n"
|
|
" ldr r0, _0807F9B4\n"
|
|
" str r0, [sp, 0x8]\n"
|
|
" str r1, [sp, 0xC]\n"
|
|
" str r1, [sp, 0x10]\n"
|
|
" str r1, [sp, 0x14]\n"
|
|
" ldr r0, [sp, 0xEC]\n"
|
|
" adds r1, r6, 0\n"
|
|
" movs r3, 0\n"
|
|
" bl sub_806F370\n"
|
|
"_0807F93C:\n"
|
|
" adds r0, r6, 0\n"
|
|
" bl EntityIsValid\n"
|
|
" lsls r0, 24\n"
|
|
" cmp r0, 0\n"
|
|
" beq _0807F954\n"
|
|
" ldr r0, [r6, 0x70]\n"
|
|
" adds r0, 0x46\n"
|
|
" ldrb r1, [r0]\n"
|
|
" adds r0, r6, 0\n"
|
|
" bl sub_806CE68\n"
|
|
"_0807F954:\n"
|
|
" ldr r0, _0807F9B0\n"
|
|
" movs r4, 0\n"
|
|
" ldrsh r2, [r0, r4]\n"
|
|
" movs r1, 0\n"
|
|
" str r1, [sp]\n"
|
|
" str r1, [sp, 0x4]\n"
|
|
" ldr r0, _0807F9B8\n"
|
|
" str r0, [sp, 0x8]\n"
|
|
" str r1, [sp, 0xC]\n"
|
|
" str r1, [sp, 0x10]\n"
|
|
" str r1, [sp, 0x14]\n"
|
|
" ldr r0, [sp, 0xEC]\n"
|
|
" mov r1, r8\n"
|
|
" movs r3, 0\n"
|
|
" bl sub_806F370\n"
|
|
" mov r0, r8\n"
|
|
" bl EntityIsValid\n"
|
|
" lsls r0, 24\n"
|
|
" cmp r0, 0\n"
|
|
" beq _0807F98E\n"
|
|
" mov r1, r8\n"
|
|
" ldr r0, [r1, 0x70]\n"
|
|
" adds r0, 0x46\n"
|
|
" ldrb r1, [r0]\n"
|
|
" mov r0, r8\n"
|
|
" bl sub_806CE68\n"
|
|
"_0807F98E:\n"
|
|
" movs r0, 0x1E\n"
|
|
" movs r1, 0x3B\n"
|
|
" bl sub_803E708\n"
|
|
" mov r0, r8\n"
|
|
" bl sub_807F9BC\n"
|
|
"_0807F99C:\n"
|
|
" add sp, 0x10C\n"
|
|
" pop {r3-r5}\n"
|
|
" mov r8, r3\n"
|
|
" mov r9, r4\n"
|
|
" mov r10, r5\n"
|
|
" pop {r4-r7}\n"
|
|
" pop {r0}\n"
|
|
" bx r0\n"
|
|
" .align 2, 0\n"
|
|
"_0807F9AC: .4byte 0x00000163\n"
|
|
"_0807F9B0: .4byte gHurlOrbDmgValue\n"
|
|
"_0807F9B4: .4byte 0x0000021a\n"
|
|
"_0807F9B8: .4byte 0x00000219");
|
|
}
|
|
|
|
void sub_807F9BC(Entity *entity)
|
|
{
|
|
if (EntityIsValid(entity)) {
|
|
EntityInfo *entInfo = GetEntInfo(entity);
|
|
if (entInfo->isTeamLeader) {
|
|
gDungeon->unk1 = 0;
|
|
gDungeon->unk5C0 = -1;
|
|
sub_804AC20(&entity->pos);
|
|
sub_807EC28(FALSE);
|
|
}
|
|
sub_806A5B8(entity);
|
|
sub_8075900(entity, gDungeon->forceMonsterHouse);
|
|
}
|
|
}
|
|
|
|
extern u8 sub_803D6FC(void);
|
|
|
|
void sub_807FA18(void)
|
|
{
|
|
s32 x, y;
|
|
|
|
for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) {
|
|
for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) {
|
|
Tile *tile = GetTileMut(x, y);
|
|
|
|
if (tile->spawnOrVisibilityFlags & SPAWN_FLAG_TRAP) {
|
|
s32 trapId;
|
|
DungeonPos pos = {x, y};
|
|
|
|
if (tile->spawnOrVisibilityFlags & SPAWN_FLAG_UNK6) {
|
|
trapId = TRAP_WARP_TRAP;
|
|
}
|
|
else {
|
|
trapId = sub_803D6FC();
|
|
}
|
|
|
|
if (trapId == TRAP_WONDER_TILE) {
|
|
Entity *trap = SpawnTrap(trapId, &pos, 2);
|
|
if (trap != NULL) {
|
|
tile->object = trap;
|
|
trap->isVisible = TRUE;
|
|
}
|
|
}
|
|
else {
|
|
Entity *trap = SpawnTrap(trapId, &pos, 0);
|
|
if (trap != NULL) {
|
|
tile->object = trap;
|
|
trap->isVisible = FALSE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
extern SpriteOAM gUnknown_202EDC0;
|
|
|
|
void sub_807FA9C(void)
|
|
{
|
|
s32 x, y;
|
|
bool8 unkBool = gDungeon->unk181e8.unk1820F;
|
|
|
|
for (y = gDungeon->unk181e8.cameraPos.y - 5; y < gDungeon->unk181e8.cameraPos.y + 5; y++) {
|
|
for (x = gDungeon->unk181e8.cameraPos.x - 6; x < gDungeon->unk181e8.cameraPos.x + 6; x++) {
|
|
bool8 r6 = FALSE;
|
|
const Tile *tile = GetTile(x, y);
|
|
|
|
if (tile->object != NULL && GetEntityType(tile->object) == ENTITY_TRAP && (tile->object->isVisible || unkBool)) {
|
|
r6 = TRUE;
|
|
}
|
|
if (tile->terrainType & TERRAIN_TYPE_STAIRS) {
|
|
r6 = TRUE;
|
|
}
|
|
|
|
if (r6) {
|
|
s32 spriteX = (x * 24) - gDungeon->unk181e8.cameraPixelPos.x;
|
|
s32 spriteY = (y * 24) - gDungeon->unk181e8.cameraPixelPos.y;
|
|
if (spriteX >= -32 && spriteY >= -32 && spriteX <= 272 && spriteY <= 192) {
|
|
SpriteSetObjMode(&gUnknown_202EDC0, 0);
|
|
SpriteSetY(&gUnknown_202EDC0, spriteY);
|
|
SpriteSetX(&gUnknown_202EDC0, spriteX);
|
|
SpriteSetPriority(&gUnknown_202EDC0, 3);
|
|
SpriteSetPalNum(&gUnknown_202EDC0, 10);
|
|
SpriteSetTileNum(&gUnknown_202EDC0, 0x1FC);
|
|
|
|
AddSprite(&gUnknown_202EDC0, 0, NULL, NULL);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|