mirror of
https://github.com/pret/pmd-red.git
synced 2026-08-14 21:16:20 -05:00
Decomped CanMoveForward()
This commit is contained in:
@@ -1,311 +0,0 @@
|
||||
#include "asm/constants/gba_constants.inc"
|
||||
#include "asm/macros.inc"
|
||||
|
||||
.syntax unified
|
||||
|
||||
.text
|
||||
|
||||
thumb_func_start CanMoveForward
|
||||
CanMoveForward:
|
||||
push {r4-r7,lr}
|
||||
mov r7, r8
|
||||
push {r7}
|
||||
adds r4, r0, 0
|
||||
adds r7, r1, 0
|
||||
mov r8, r2
|
||||
ldr r0, [r4, 0x70]
|
||||
movs r1, 0x2
|
||||
ldrsh r0, [r0, r1]
|
||||
bl GetCrossableTerrain
|
||||
lsls r0, 24
|
||||
lsrs r6, r0, 24
|
||||
movs r0, 0
|
||||
mov r2, r8
|
||||
strb r0, [r2]
|
||||
movs r3, 0x4
|
||||
ldrsh r0, [r4, r3]
|
||||
ldr r1, _0807130C
|
||||
lsls r2, r7, 2
|
||||
adds r2, r1
|
||||
movs r3, 0
|
||||
ldrsh r1, [r2, r3]
|
||||
adds r0, r1
|
||||
movs r3, 0x6
|
||||
ldrsh r1, [r4, r3]
|
||||
movs r3, 0x2
|
||||
ldrsh r2, [r2, r3]
|
||||
adds r1, r2
|
||||
bl GetMapTile_1
|
||||
adds r5, r0, 0
|
||||
ldrh r1, [r5]
|
||||
movs r0, 0x10
|
||||
ands r0, r1
|
||||
cmp r0, 0
|
||||
beq _08071260
|
||||
b _0807137E
|
||||
_08071260:
|
||||
movs r0, 0x40
|
||||
ands r0, r1
|
||||
cmp r0, 0
|
||||
beq _08071286
|
||||
ldr r0, _08071310
|
||||
ldr r0, [r0]
|
||||
ldr r1, _08071314
|
||||
adds r0, r1
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0
|
||||
bne _08071286
|
||||
adds r0, r4, 0
|
||||
movs r1, 0xF
|
||||
bl HasIQSkill
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _08071286
|
||||
b _0807137E
|
||||
_08071286:
|
||||
ldr r0, [r5, 0x14]
|
||||
cmp r0, 0
|
||||
beq _080712B8
|
||||
adds r0, r4, 0
|
||||
movs r1, 0xE
|
||||
bl HasIQSkill
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _080712B8
|
||||
ldr r0, [r5, 0x14]
|
||||
bl GetEntityType
|
||||
cmp r0, 0x2
|
||||
bne _080712B8
|
||||
ldr r0, [r5, 0x14]
|
||||
adds r0, 0x20
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0
|
||||
bne _0807137E
|
||||
ldr r0, [r4, 0x70]
|
||||
adds r0, 0xE8
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0x3
|
||||
beq _0807137E
|
||||
_080712B8:
|
||||
ldrh r1, [r5]
|
||||
movs r0, 0x3
|
||||
ands r0, r1
|
||||
cmp r0, 0x2
|
||||
bne _080712E6
|
||||
ldr r1, _08071318
|
||||
ldr r0, _08071310
|
||||
ldr r0, [r0]
|
||||
ldr r2, _0807131C
|
||||
adds r0, r2
|
||||
movs r3, 0
|
||||
ldrsh r0, [r0, r3]
|
||||
adds r0, r1
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0x1
|
||||
bne _080712E6
|
||||
adds r0, r4, 0
|
||||
movs r1, 0x14
|
||||
bl HasIQSkill
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
bne _0807137E
|
||||
_080712E6:
|
||||
bl IsFixedDungeon
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
bne _08071348
|
||||
ldr r0, [r4, 0x70]
|
||||
adds r0, 0xE4
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0x3
|
||||
beq _08071308
|
||||
adds r0, r4, 0
|
||||
movs r1, 0x9
|
||||
bl HasItem
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _08071320
|
||||
_08071308:
|
||||
movs r6, 0x3
|
||||
b _08071348
|
||||
.align 2, 0
|
||||
_0807130C: .4byte gAdjacentTileOffsets
|
||||
_08071310: .4byte gDungeonGlobalData
|
||||
_08071314: .4byte 0x00000671
|
||||
_08071318: .4byte gDungeonWaterType
|
||||
_0807131C: .4byte 0x00003a0e
|
||||
_08071320:
|
||||
adds r0, r4, 0
|
||||
movs r1, 0xC
|
||||
bl HasIQSkill
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
bne _08071346
|
||||
adds r0, r4, 0
|
||||
movs r1, 0xD
|
||||
bl HasIQSkill
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _08071348
|
||||
movs r0, 0x1
|
||||
ands r0, r7
|
||||
movs r6, 0x3
|
||||
cmp r0, 0
|
||||
beq _08071348
|
||||
_08071346:
|
||||
movs r6, 0x2
|
||||
_08071348:
|
||||
movs r1, 0x4
|
||||
ldrsh r0, [r4, r1]
|
||||
movs r2, 0x6
|
||||
ldrsh r1, [r4, r2]
|
||||
bl GetMapTile_1
|
||||
adds r0, 0xA
|
||||
adds r0, r6
|
||||
ldr r2, _08071374
|
||||
movs r1, 0x7
|
||||
ands r1, r7
|
||||
adds r1, r2
|
||||
ldrb r2, [r0]
|
||||
ldrb r0, [r1]
|
||||
ands r0, r2
|
||||
cmp r0, 0
|
||||
beq _0807137E
|
||||
ldr r0, [r5, 0x10]
|
||||
cmp r0, 0
|
||||
bne _08071378
|
||||
movs r0, 0x1
|
||||
b _08071380
|
||||
.align 2, 0
|
||||
_08071374: .4byte gDirectionBitMasks_3
|
||||
_08071378:
|
||||
movs r0, 0x1
|
||||
mov r3, r8
|
||||
strb r0, [r3]
|
||||
_0807137E:
|
||||
movs r0, 0
|
||||
_08071380:
|
||||
pop {r3}
|
||||
mov r8, r3
|
||||
pop {r4-r7}
|
||||
pop {r1}
|
||||
bx r1
|
||||
thumb_func_end CanMoveForward
|
||||
|
||||
thumb_func_start IsAtJunction
|
||||
IsAtJunction:
|
||||
push {r4,r5,lr}
|
||||
adds r4, r0, 0
|
||||
ldr r0, [r4, 0x70]
|
||||
movs r1, 0x2
|
||||
ldrsh r0, [r0, r1]
|
||||
bl GetCrossableTerrain
|
||||
lsls r0, 24
|
||||
lsrs r5, r0, 24
|
||||
bl IsFixedDungeon
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
bne _080713E2
|
||||
ldr r0, [r4, 0x70]
|
||||
adds r0, 0xE4
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0x3
|
||||
beq _080713E0
|
||||
adds r0, r4, 0
|
||||
movs r1, 0x9
|
||||
bl HasItem
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
bne _080713E0
|
||||
adds r0, r4, 0
|
||||
movs r1, 0xC
|
||||
bl HasIQSkill
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _080713D2
|
||||
movs r5, 0x2
|
||||
b _080713E2
|
||||
_080713D2:
|
||||
adds r0, r4, 0
|
||||
movs r1, 0xD
|
||||
bl HasIQSkill
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _080713E2
|
||||
_080713E0:
|
||||
movs r5, 0x3
|
||||
_080713E2:
|
||||
cmp r5, 0x3
|
||||
bne _08071408
|
||||
ldr r4, [r4, 0x70]
|
||||
movs r0, 0x64
|
||||
bl DungeonRandomCapped
|
||||
movs r1, 0xFD
|
||||
lsls r1, 1
|
||||
adds r2, r4, r1
|
||||
ldrh r1, [r2]
|
||||
adds r1, r0
|
||||
strh r1, [r2]
|
||||
lsls r1, 16
|
||||
asrs r1, 16
|
||||
cmp r1, 0xC7
|
||||
ble _08071458
|
||||
movs r0, 0
|
||||
strh r0, [r2]
|
||||
b _08071468
|
||||
_08071408:
|
||||
ldr r1, _0807145C
|
||||
ldr r0, _08071460
|
||||
ldr r0, [r0]
|
||||
ldr r2, _08071464
|
||||
adds r0, r2
|
||||
movs r2, 0
|
||||
ldrsh r0, [r0, r2]
|
||||
adds r0, r1
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0x1
|
||||
bne _08071432
|
||||
cmp r5, 0x1
|
||||
bne _08071432
|
||||
adds r0, r4, 0
|
||||
movs r1, 0x14
|
||||
bl HasIQSkill
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _08071432
|
||||
movs r5, 0
|
||||
_08071432:
|
||||
movs r1, 0x4
|
||||
ldrsh r0, [r4, r1]
|
||||
movs r2, 0x6
|
||||
ldrsh r1, [r4, r2]
|
||||
bl GetMapTile_1
|
||||
adds r0, 0xA
|
||||
adds r0, r5
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0x54
|
||||
beq _08071468
|
||||
cmp r0, 0x51
|
||||
beq _08071468
|
||||
cmp r0, 0x45
|
||||
beq _08071468
|
||||
cmp r0, 0x15
|
||||
beq _08071468
|
||||
cmp r0, 0x55
|
||||
beq _08071468
|
||||
_08071458:
|
||||
movs r0, 0
|
||||
b _0807146A
|
||||
.align 2, 0
|
||||
_0807145C: .4byte gDungeonWaterType
|
||||
_08071460: .4byte gDungeonGlobalData
|
||||
_08071464: .4byte 0x00003a0e
|
||||
_08071468:
|
||||
movs r0, 0x1
|
||||
_0807146A:
|
||||
pop {r4,r5}
|
||||
pop {r1}
|
||||
bx r1
|
||||
thumb_func_end IsAtJunction
|
||||
|
||||
.align 2, 0
|
||||
124
asm/code_807138C.s
Normal file
124
asm/code_807138C.s
Normal file
@@ -0,0 +1,124 @@
|
||||
#include "asm/constants/gba_constants.inc"
|
||||
#include "asm/macros.inc"
|
||||
|
||||
.syntax unified
|
||||
|
||||
.text
|
||||
|
||||
thumb_func_start IsAtJunction
|
||||
IsAtJunction:
|
||||
push {r4,r5,lr}
|
||||
adds r4, r0, 0
|
||||
ldr r0, [r4, 0x70]
|
||||
movs r1, 0x2
|
||||
ldrsh r0, [r0, r1]
|
||||
bl GetCrossableTerrain
|
||||
lsls r0, 24
|
||||
lsrs r5, r0, 24
|
||||
bl IsFixedDungeon
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
bne _080713E2
|
||||
ldr r0, [r4, 0x70]
|
||||
adds r0, 0xE4
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0x3
|
||||
beq _080713E0
|
||||
adds r0, r4, 0
|
||||
movs r1, 0x9
|
||||
bl HasItem
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
bne _080713E0
|
||||
adds r0, r4, 0
|
||||
movs r1, 0xC
|
||||
bl HasIQSkill
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _080713D2
|
||||
movs r5, 0x2
|
||||
b _080713E2
|
||||
_080713D2:
|
||||
adds r0, r4, 0
|
||||
movs r1, 0xD
|
||||
bl HasIQSkill
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _080713E2
|
||||
_080713E0:
|
||||
movs r5, 0x3
|
||||
_080713E2:
|
||||
cmp r5, 0x3
|
||||
bne _08071408
|
||||
ldr r4, [r4, 0x70]
|
||||
movs r0, 0x64
|
||||
bl DungeonRandomCapped
|
||||
movs r1, 0xFD
|
||||
lsls r1, 1
|
||||
adds r2, r4, r1
|
||||
ldrh r1, [r2]
|
||||
adds r1, r0
|
||||
strh r1, [r2]
|
||||
lsls r1, 16
|
||||
asrs r1, 16
|
||||
cmp r1, 0xC7
|
||||
ble _08071458
|
||||
movs r0, 0
|
||||
strh r0, [r2]
|
||||
b _08071468
|
||||
_08071408:
|
||||
ldr r1, _0807145C
|
||||
ldr r0, _08071460
|
||||
ldr r0, [r0]
|
||||
ldr r2, _08071464
|
||||
adds r0, r2
|
||||
movs r2, 0
|
||||
ldrsh r0, [r0, r2]
|
||||
adds r0, r1
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0x1
|
||||
bne _08071432
|
||||
cmp r5, 0x1
|
||||
bne _08071432
|
||||
adds r0, r4, 0
|
||||
movs r1, 0x14
|
||||
bl HasIQSkill
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _08071432
|
||||
movs r5, 0
|
||||
_08071432:
|
||||
movs r1, 0x4
|
||||
ldrsh r0, [r4, r1]
|
||||
movs r2, 0x6
|
||||
ldrsh r1, [r4, r2]
|
||||
bl GetMapTile_1
|
||||
adds r0, 0xA
|
||||
adds r0, r5
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0x54
|
||||
beq _08071468
|
||||
cmp r0, 0x51
|
||||
beq _08071468
|
||||
cmp r0, 0x45
|
||||
beq _08071468
|
||||
cmp r0, 0x15
|
||||
beq _08071468
|
||||
cmp r0, 0x55
|
||||
beq _08071468
|
||||
_08071458:
|
||||
movs r0, 0
|
||||
b _0807146A
|
||||
.align 2, 0
|
||||
_0807145C: .4byte gDungeonWaterType
|
||||
_08071460: .4byte gDungeonGlobalData
|
||||
_08071464: .4byte 0x00003a0e
|
||||
_08071468:
|
||||
movs r0, 0x1
|
||||
_0807146A:
|
||||
pop {r4,r5}
|
||||
pop {r1}
|
||||
bx r1
|
||||
thumb_func_end IsAtJunction
|
||||
|
||||
.align 2, 0
|
||||
@@ -719,7 +719,7 @@ _080ADEFC:
|
||||
bge _080ADF52
|
||||
_080ADF04:
|
||||
mov r0, r8
|
||||
bl sub_8097F40
|
||||
bl IsWaterDungeon
|
||||
lsls r0, 24
|
||||
movs r7, 0
|
||||
cmp r0, 0
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
.section .rodata
|
||||
|
||||
.global gDirectionBitMasks_3
|
||||
gDirectionBitMasks_3: @ 8106FDD
|
||||
@ replacing .incbin "baserom.gba", 0x00106fdd, 0x8
|
||||
.byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
|
||||
@@ -4,5 +4,6 @@
|
||||
#include "dungeon_entity.h"
|
||||
|
||||
bool8 CanAttackInFront(struct DungeonEntity *pokemon, s32 direction);
|
||||
bool8 CanMoveForward(struct DungeonEntity *pokemon, s32 facingDir, bool8 *pokemonInFront);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
#define DUNGEON_WATER_TYPE_LAVA 1
|
||||
#define DUNGEON_WATER_TYPE_WATER 2
|
||||
|
||||
extern const u8 gDungeonWaterType[];
|
||||
|
||||
bool8 IsTileGround(struct MapTile* tile);
|
||||
bool8 IsWaterTileset();
|
||||
|
||||
|
||||
@@ -230,7 +230,7 @@ SECTIONS {
|
||||
src/dungeon_capabilities_1.o(.text);
|
||||
asm/code_8070E3C.o(.text);
|
||||
src/dungeon_ai_targeting.o(.text);
|
||||
asm/code_8071214.o(.text);
|
||||
asm/code_807138C.o(.text);
|
||||
src/dungeon_ai_targeting_1.o(.text);
|
||||
asm/code_8071518.o(.text);
|
||||
src/dungeon_ai_targeting_2.o(.text);
|
||||
@@ -451,7 +451,6 @@ SECTIONS {
|
||||
src/dungeon_capabilities_1.o(.rodata);
|
||||
data/data_8106FB5.o(.rodata);
|
||||
src/dungeon_ai_targeting.o(.rodata);
|
||||
data/data_8106FDD.o(.rodata);
|
||||
src/dungeon_ai_targeting_2.o(.rodata);
|
||||
data/data_8107010.o(.rodata);
|
||||
src/friend_area.o(.rodata);
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#include "global.h"
|
||||
|
||||
extern u8 gDungeonWaterType[];
|
||||
#include "tile_types.h"
|
||||
|
||||
bool8 sub_8097F40(u32 r0)
|
||||
bool8 IsWaterDungeon(u32 r0)
|
||||
{
|
||||
return gDungeonWaterType[r0] == 2;
|
||||
return gDungeonWaterType[r0] == DUNGEON_WATER_TYPE_WATER;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "dungeon_ai_movement_1.h"
|
||||
|
||||
#include "constants/targeting.h"
|
||||
#include "dungeon_ai_targeting.h"
|
||||
#include "dungeon_ai_targeting_2.h"
|
||||
#include "dungeon_global_data.h"
|
||||
#include "dungeon_map_access.h"
|
||||
@@ -12,7 +13,6 @@
|
||||
|
||||
#define INFINITY 999999
|
||||
|
||||
extern bool8 CanMoveForward(struct DungeonEntity *pokemon, s32 facingDir, bool8 *pokemonInFront);
|
||||
extern bool8 Explore(struct DungeonEntity *pokemon);
|
||||
|
||||
bool8 AvoidEnemies(struct DungeonEntity *pokemon)
|
||||
|
||||
@@ -5,14 +5,17 @@
|
||||
#include "constants/item.h"
|
||||
#include "constants/status.h"
|
||||
#include "dungeon_engine.h"
|
||||
#include "dungeon_global_data.h"
|
||||
#include "dungeon_items.h"
|
||||
#include "dungeon_map_access.h"
|
||||
#include "dungeon_movement.h"
|
||||
#include "dungeon_pokemon_attributes.h"
|
||||
#include "dungeon_util.h"
|
||||
#include "map.h"
|
||||
#include "tile_types.h"
|
||||
|
||||
const u8 gDirectionBitMasks_2[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
|
||||
const u8 gDirectionBitMasks_3[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
|
||||
|
||||
bool8 CanAttackInFront(struct DungeonEntity *pokemon, s32 direction)
|
||||
{
|
||||
@@ -60,3 +63,73 @@ bool8 CanAttackInFront(struct DungeonEntity *pokemon, s32 direction)
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 CanMoveForward(struct DungeonEntity *pokemon, s32 direction, bool8 *pokemonInFront)
|
||||
{
|
||||
u8 crossableTerrain = GetCrossableTerrain(pokemon->entityData->entityID);
|
||||
struct MapTile *frontTile, *currentTile;
|
||||
*pokemonInFront = FALSE;
|
||||
frontTile = GetMapTile_1(pokemon->posWorld.x + gAdjacentTileOffsets[direction].x,
|
||||
pokemon->posWorld.y + gAdjacentTileOffsets[direction].y);
|
||||
if (frontTile->tileType & TILE_TYPE_MAP_EDGE)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if (frontTile->tileType & TILE_TYPE_MONSTER_HOUSE &&
|
||||
!gDungeonGlobalData->monsterHouseActive &&
|
||||
HasIQSkill(pokemon, IQ_SKILL_HOUSE_AVOIDER))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if (frontTile->mapObject != NULL &&
|
||||
HasIQSkill(pokemon, IQ_SKILL_TRAP_AVOIDER) &&
|
||||
GetEntityType(frontTile->mapObject) == ENTITY_TRAP &&
|
||||
(frontTile->mapObject->visible || pokemon->entityData->eyesightStatus == EYESIGHT_STATUS_EYEDROPS))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if ((frontTile->tileType & (TILE_TYPE_FLOOR | TILE_TYPE_LIQUID)) == TILE_TYPE_LIQUID &&
|
||||
gDungeonWaterType[gDungeonGlobalData->tileset] == DUNGEON_WATER_TYPE_LAVA &&
|
||||
HasIQSkill(pokemon, IQ_SKILL_LAVA_EVADER))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if (!IsFixedDungeon())
|
||||
{
|
||||
if (pokemon->entityData->transformStatus == TRANSFORM_STATUS_MOBILE ||
|
||||
HasItem(pokemon, ITEM_ID_MOBILE_SCARF))
|
||||
{
|
||||
crossableTerrain = CROSSABLE_TERRAIN_WALL;
|
||||
}
|
||||
else if (HasIQSkill(pokemon, IQ_SKILL_ALL_TERRAIN_HIKER))
|
||||
{
|
||||
// BUG: If the Pokémon is a Ghost type that can normally move through walls,
|
||||
// All-Terrain Hiker/Super Mobile may make the AI think it can't move through walls.
|
||||
crossableTerrain = CROSSABLE_TERRAIN_CREVICE;
|
||||
}
|
||||
else if (HasIQSkill(pokemon, IQ_SKILL_SUPER_MOBILE))
|
||||
{
|
||||
if ((direction & 1) != 0)
|
||||
{
|
||||
crossableTerrain = CROSSABLE_TERRAIN_CREVICE;
|
||||
}
|
||||
else
|
||||
{
|
||||
crossableTerrain = CROSSABLE_TERRAIN_WALL;
|
||||
}
|
||||
}
|
||||
}
|
||||
currentTile = GetMapTile_1(pokemon->posWorld.x, pokemon->posWorld.y);
|
||||
if (currentTile->canMoveAdjacent[crossableTerrain] & gDirectionBitMasks_3[direction & DIRECTION_MASK])
|
||||
{
|
||||
if (frontTile->pokemon == NULL)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
*pokemonInFront = TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user