mirror of
https://github.com/pret/pokeplatinum.git
synced 2026-09-30 21:40:45 -05:00
save_data: document OverworldMapHistory (#578)
Some checks failed
build / build (push) Has been cancelled
Some checks failed
build / build (push) Has been cancelled
This commit is contained in:
@@ -3,12 +3,12 @@
|
||||
|
||||
#include "struct_decls/struct_0203A790_decl.h"
|
||||
#include "struct_decls/struct_0203A79C_decl.h"
|
||||
#include "struct_defs/struct_020556C4.h"
|
||||
#include "struct_defs/struct_0205EC34.h"
|
||||
|
||||
#include "field/field_system_decl.h"
|
||||
|
||||
#include "location.h"
|
||||
#include "overworld_map_history.h"
|
||||
#include "savedata.h"
|
||||
|
||||
int FieldOverworldState_Size(void);
|
||||
@@ -26,7 +26,7 @@ u16 FieldOverworldState_GetWeather(const FieldOverworldState *fieldState);
|
||||
void FieldOverworldState_SetWeather(FieldOverworldState *fieldState, u16 weather);
|
||||
u16 FieldOverworldState_GetWarpId(const FieldOverworldState *fieldState);
|
||||
void FieldOverworldState_SetWarpId(FieldOverworldState *fieldState, u16 warpId);
|
||||
UnkStruct_020556C4 *sub_0203A76C(FieldOverworldState *fieldState);
|
||||
OverworldMapHistory *FieldOverworldState_GetMapHistory(FieldOverworldState *fieldState);
|
||||
int FieldOverworldState_GetCameraType(const FieldOverworldState *fieldState);
|
||||
void FieldOverworldState_SetCameraType(FieldOverworldState *fieldState, int type);
|
||||
PlayerData *FieldOverworldState_GetPlayerData(FieldOverworldState *fieldState);
|
||||
|
||||
22
include/overworld_map_history.h
Normal file
22
include/overworld_map_history.h
Normal file
@@ -0,0 +1,22 @@
|
||||
#ifndef POKEPLATINUM_OVERWORLD_MAP_HISTORY_H
|
||||
#define POKEPLATINUM_OVERWORLD_MAP_HISTORY_H
|
||||
|
||||
typedef struct OverworldMapHistoryItem {
|
||||
u8 mapX;
|
||||
u8 mapZ;
|
||||
u8 faceDirection;
|
||||
u8 dummy_03; // this is always set to 1
|
||||
} OverworldMapHistoryItem;
|
||||
|
||||
typedef struct OverworldMapHistory {
|
||||
int historyPointer;
|
||||
u8 currentMapX;
|
||||
u8 currentMapZ;
|
||||
OverworldMapHistoryItem items[6];
|
||||
} OverworldMapHistory;
|
||||
|
||||
void OverworldMapHistory_Clear(OverworldMapHistory *mapHistory);
|
||||
void OverworldMapHistory_PushViaWarp(OverworldMapHistory *mapHistory, int x, int z);
|
||||
void OverworldMapHistory_Push(OverworldMapHistory *mapHistory, int x, int z, int faceDirection);
|
||||
|
||||
#endif // POKEPLATINUM_OVERWORLD_MAP_HISTORY_H
|
||||
@@ -1,13 +0,0 @@
|
||||
#ifndef POKEPLATINUM_STRUCT_020556C4_H
|
||||
#define POKEPLATINUM_STRUCT_020556C4_H
|
||||
|
||||
#include "struct_defs/struct_020556C4_sub1.h"
|
||||
|
||||
typedef struct {
|
||||
int unk_00;
|
||||
u8 unk_04;
|
||||
u8 unk_05;
|
||||
UnkStruct_020556C4_sub1 unk_06[6];
|
||||
} UnkStruct_020556C4;
|
||||
|
||||
#endif // POKEPLATINUM_STRUCT_020556C4_H
|
||||
@@ -1,11 +0,0 @@
|
||||
#ifndef POKEPLATINUM_STRUCT_020556C4_SUB1_H
|
||||
#define POKEPLATINUM_STRUCT_020556C4_SUB1_H
|
||||
|
||||
typedef struct {
|
||||
u8 unk_00;
|
||||
u8 unk_01;
|
||||
u8 unk_02;
|
||||
u8 unk_03;
|
||||
} UnkStruct_020556C4_sub1;
|
||||
|
||||
#endif // POKEPLATINUM_STRUCT_020556C4_SUB1_H
|
||||
@@ -2,7 +2,7 @@
|
||||
#define POKEPLATINUM_STRUCT_0205EC34_H
|
||||
|
||||
typedef struct {
|
||||
u16 unk_00;
|
||||
u16 cyclingGear;
|
||||
u16 runningShoes;
|
||||
u32 form;
|
||||
} PlayerData;
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
#ifndef POKEPLATINUM_UNK_020556C4_H
|
||||
#define POKEPLATINUM_UNK_020556C4_H
|
||||
|
||||
#include "struct_defs/struct_020556C4.h"
|
||||
|
||||
void sub_020556C4(UnkStruct_020556C4 *param0);
|
||||
void sub_020556E8(UnkStruct_020556C4 *param0, int param1, int param2);
|
||||
void sub_02055740(UnkStruct_020556C4 *param0, int param1, int param2, int param3);
|
||||
|
||||
#endif // POKEPLATINUM_UNK_020556C4_H
|
||||
@@ -230,7 +230,7 @@ Static main
|
||||
Object main.nef.p/src_terrain_attributes.c.o
|
||||
Object main.nef.p/src_terrain_collision_manager.c.o
|
||||
Object main.nef.p/src_unk_020553DC.c.o
|
||||
Object main.nef.p/src_unk_020556C4.c.o
|
||||
Object main.nef.p/src_overworld_map_history.c.o
|
||||
Object main.nef.p/src_field_transition.c.o
|
||||
Object main.nef.p/src_unk_020559DC.c.o
|
||||
Object main.nef.p/src_unk_02055C50.c.o
|
||||
|
||||
@@ -3,17 +3,16 @@
|
||||
#include <nitro.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "struct_defs/struct_020556C4.h"
|
||||
#include "struct_defs/struct_0205EC34.h"
|
||||
|
||||
#include "field/field_system.h"
|
||||
|
||||
#include "location.h"
|
||||
#include "map_object.h"
|
||||
#include "overworld_map_history.h"
|
||||
#include "player_avatar.h"
|
||||
#include "savedata.h"
|
||||
#include "unk_0203A7D8.h"
|
||||
#include "unk_020556C4.h"
|
||||
|
||||
typedef struct FieldOverworldState {
|
||||
Location player;
|
||||
@@ -25,13 +24,12 @@ typedef struct FieldOverworldState {
|
||||
u16 weather;
|
||||
u16 warpId;
|
||||
u8 cameraType;
|
||||
UnkStruct_020556C4 unk_6C;
|
||||
OverworldMapHistory mapHistory;
|
||||
PlayerData playerData;
|
||||
u16 poisonSteps;
|
||||
u16 safariSteps;
|
||||
u16 safariBalls;
|
||||
u16 padding_9A; // unused
|
||||
u16 padding_9C; // unused
|
||||
u8 padding_9A[6];
|
||||
} FieldOverworldState;
|
||||
|
||||
typedef struct UnkStruct_0203A79C_t {
|
||||
@@ -57,7 +55,7 @@ void FieldOverworldState_Init(FieldOverworldState *fieldState)
|
||||
{
|
||||
memset(fieldState, 0, sizeof(FieldOverworldState));
|
||||
|
||||
sub_020556C4(&fieldState->unk_6C);
|
||||
OverworldMapHistory_Clear(&fieldState->mapHistory);
|
||||
PlayerData_Init(&fieldState->playerData);
|
||||
|
||||
fieldState->warpId = sub_0203A7EC();
|
||||
@@ -119,9 +117,9 @@ void FieldOverworldState_SetWarpId(FieldOverworldState *fieldState, u16 warpId)
|
||||
fieldState->warpId = warpId;
|
||||
}
|
||||
|
||||
UnkStruct_020556C4 *sub_0203A76C(FieldOverworldState *fieldState)
|
||||
OverworldMapHistory *FieldOverworldState_GetMapHistory(FieldOverworldState *fieldState)
|
||||
{
|
||||
return &fieldState->unk_6C;
|
||||
return &fieldState->mapHistory;
|
||||
}
|
||||
|
||||
int FieldOverworldState_GetCameraType(const FieldOverworldState *fieldState)
|
||||
|
||||
@@ -217,7 +217,7 @@ pokeplatinum_c = files(
|
||||
'terrain_attributes.c',
|
||||
'terrain_collision_manager.c',
|
||||
'unk_020553DC.c',
|
||||
'unk_020556C4.c',
|
||||
'overworld_map_history.c',
|
||||
'field_transition.c',
|
||||
'unk_020559DC.c',
|
||||
'unk_02055C50.c',
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
|
||||
#include "struct_decls/struct_02020C44_decl.h"
|
||||
#include "struct_decls/struct_0203A790_decl.h"
|
||||
#include "struct_defs/struct_020556C4.h"
|
||||
#include "struct_defs/struct_02099F80.h"
|
||||
|
||||
#include "field/field_system.h"
|
||||
@@ -70,6 +69,7 @@
|
||||
#include "map_object.h"
|
||||
#include "narc.h"
|
||||
#include "overlay_manager.h"
|
||||
#include "overworld_map_history.h"
|
||||
#include "persisted_map_features.h"
|
||||
#include "player_avatar.h"
|
||||
#include "pltt_transfer.h"
|
||||
@@ -82,7 +82,6 @@
|
||||
#include "unk_02020AEC.h"
|
||||
#include "unk_0202419C.h"
|
||||
#include "unk_020553DC.h"
|
||||
#include "unk_020556C4.h"
|
||||
#include "unk_020559DC.h"
|
||||
#include "unk_02055C50.h"
|
||||
#include "vram_transfer.h"
|
||||
@@ -512,19 +511,16 @@ static void ov5_021D134C(FieldSystem *fieldSystem, u8 param1)
|
||||
|
||||
static void ov5_021D13B4(FieldSystem *fieldSystem)
|
||||
{
|
||||
UnkStruct_020556C4 *v0;
|
||||
int v1, v2, v3;
|
||||
|
||||
if (MapHeader_IsOnMainMatrix(fieldSystem->location->mapId) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
v0 = sub_0203A76C(SaveData_GetFieldOverworldState(fieldSystem->saveData));
|
||||
v1 = (Player_GetXPos(fieldSystem->playerAvatar) - LandDataManager_GetOffsetTileX(fieldSystem->landDataMan)) / MAP_TILES_COUNT_X;
|
||||
v2 = (Player_GetZPos(fieldSystem->playerAvatar) - LandDataManager_GetOffsetTileZ(fieldSystem->landDataMan)) / MAP_TILES_COUNT_Z;
|
||||
v3 = PlayerAvatar_GetDir(fieldSystem->playerAvatar);
|
||||
OverworldMapHistory *mapHistory = FieldOverworldState_GetMapHistory(SaveData_GetFieldOverworldState(fieldSystem->saveData));
|
||||
int mapX = (Player_GetXPos(fieldSystem->playerAvatar) - LandDataManager_GetOffsetTileX(fieldSystem->landDataMan)) / MAP_TILES_COUNT_X;
|
||||
int mapZ = (Player_GetZPos(fieldSystem->playerAvatar) - LandDataManager_GetOffsetTileZ(fieldSystem->landDataMan)) / MAP_TILES_COUNT_Z;
|
||||
int faceDirection = PlayerAvatar_GetDir(fieldSystem->playerAvatar);
|
||||
|
||||
sub_02055740(v0, v1, v2, v3);
|
||||
OverworldMapHistory_Push(mapHistory, mapX, mapZ, faceDirection);
|
||||
}
|
||||
|
||||
static void ov5_021D1414(void)
|
||||
|
||||
51
src/overworld_map_history.c
Normal file
51
src/overworld_map_history.c
Normal file
@@ -0,0 +1,51 @@
|
||||
#include "overworld_map_history.h"
|
||||
|
||||
#include <nitro.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "constants/field/map.h"
|
||||
|
||||
void OverworldMapHistory_Clear(OverworldMapHistory *mapHistory)
|
||||
{
|
||||
for (u8 i = 0; i < 6; i++) {
|
||||
mapHistory->items[i].mapX = 0;
|
||||
mapHistory->items[i].mapZ = 0;
|
||||
mapHistory->items[i].faceDirection = 0;
|
||||
mapHistory->items[i].dummy_03 = 0;
|
||||
}
|
||||
|
||||
mapHistory->historyPointer = 0;
|
||||
mapHistory->currentMapX = 0;
|
||||
mapHistory->currentMapZ = 0;
|
||||
}
|
||||
|
||||
void OverworldMapHistory_PushViaWarp(OverworldMapHistory *mapHistory, int x, int z)
|
||||
{
|
||||
u8 mapX = x / MAP_TILES_COUNT_X;
|
||||
u8 mapZ = z / MAP_TILES_COUNT_Z;
|
||||
|
||||
if (mapX != mapHistory->currentMapX || mapZ != mapHistory->currentMapZ) {
|
||||
mapHistory->items[mapHistory->historyPointer].mapX = mapX;
|
||||
mapHistory->items[mapHistory->historyPointer].mapZ = mapZ;
|
||||
mapHistory->items[mapHistory->historyPointer].faceDirection = -1;
|
||||
mapHistory->items[mapHistory->historyPointer].dummy_03 = 1;
|
||||
mapHistory->historyPointer = (mapHistory->historyPointer + 1) % 6;
|
||||
}
|
||||
}
|
||||
|
||||
void OverworldMapHistory_Push(OverworldMapHistory *mapHistory, int x, int z, int faceDirection)
|
||||
{
|
||||
u8 mapX = x;
|
||||
u8 mapZ = z;
|
||||
|
||||
if (mapX != mapHistory->currentMapX || mapZ != mapHistory->currentMapZ) {
|
||||
mapHistory->items[mapHistory->historyPointer].mapX = mapX;
|
||||
mapHistory->items[mapHistory->historyPointer].mapZ = mapZ;
|
||||
mapHistory->items[mapHistory->historyPointer].faceDirection = faceDirection;
|
||||
mapHistory->items[mapHistory->historyPointer].dummy_03 = 1;
|
||||
|
||||
mapHistory->currentMapX = mapX;
|
||||
mapHistory->currentMapZ = mapZ;
|
||||
mapHistory->historyPointer = (mapHistory->historyPointer + 1) % 6;
|
||||
}
|
||||
}
|
||||
@@ -453,7 +453,7 @@ void sub_0205EC20(PlayerAvatar *playerAvatar, u32 param1, int param2)
|
||||
|
||||
void PlayerData_Init(PlayerData *playerData)
|
||||
{
|
||||
playerData->unk_00 = 0;
|
||||
playerData->cyclingGear = 0;
|
||||
playerData->runningShoes = FALSE;
|
||||
playerData->form = 0x0;
|
||||
}
|
||||
@@ -484,13 +484,13 @@ int PlayerData_CyclingGear(PlayerData *playerData)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return playerData->unk_00;
|
||||
return playerData->cyclingGear;
|
||||
}
|
||||
|
||||
void PlayerData_SetCyclingGear(PlayerData *playerData, int gear)
|
||||
{
|
||||
if (playerData != NULL) {
|
||||
playerData->unk_00 = gear;
|
||||
playerData->cyclingGear = gear;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#include "struct_defs/struct_0203E608.h"
|
||||
#include "struct_defs/struct_0203E6C0.h"
|
||||
#include "struct_defs/struct_02042434.h"
|
||||
#include "struct_defs/struct_020556C4.h"
|
||||
#include "struct_defs/struct_020684D0.h"
|
||||
#include "struct_defs/struct_0206BC70.h"
|
||||
#include "struct_defs/struct_02072014.h"
|
||||
@@ -98,6 +97,7 @@
|
||||
#include "mail.h"
|
||||
#include "math_util.h"
|
||||
#include "overlay_manager.h"
|
||||
#include "overworld_map_history.h"
|
||||
#include "party.h"
|
||||
#include "player_avatar.h"
|
||||
#include "pokedex.h"
|
||||
@@ -737,7 +737,7 @@ void *sub_0203D8AC(FieldSystem *fieldSystem)
|
||||
UnkStruct_0203D8AC *v0;
|
||||
TrainerInfo *v1;
|
||||
int v2 = 0, v3 = 0;
|
||||
sub_0203A76C(SaveData_GetFieldOverworldState(fieldSystem->saveData));
|
||||
FieldOverworldState_GetMapHistory(SaveData_GetFieldOverworldState(fieldSystem->saveData));
|
||||
|
||||
v0 = Heap_AllocFromHeapAtEnd(HEAP_ID_FIELDMAP, sizeof(UnkStruct_0203D8AC));
|
||||
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
#include "unk_020556C4.h"
|
||||
|
||||
#include <nitro.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "struct_defs/struct_020556C4.h"
|
||||
|
||||
void sub_020556C4(UnkStruct_020556C4 *param0)
|
||||
{
|
||||
u8 v0;
|
||||
|
||||
for (v0 = 0; v0 < 6; v0++) {
|
||||
param0->unk_06[v0].unk_00 = 0;
|
||||
param0->unk_06[v0].unk_01 = 0;
|
||||
param0->unk_06[v0].unk_02 = 0;
|
||||
param0->unk_06[v0].unk_03 = 0;
|
||||
}
|
||||
|
||||
param0->unk_00 = 0;
|
||||
param0->unk_04 = 0;
|
||||
param0->unk_05 = 0;
|
||||
}
|
||||
|
||||
void sub_020556E8(UnkStruct_020556C4 *param0, int param1, int param2)
|
||||
{
|
||||
u8 v0 = param1 / 32;
|
||||
u8 v1 = param2 / 32;
|
||||
|
||||
if ((v0 != param0->unk_04) || (v1 != param0->unk_05)) {
|
||||
param0->unk_06[param0->unk_00].unk_00 = v0;
|
||||
param0->unk_06[param0->unk_00].unk_01 = v1;
|
||||
param0->unk_06[param0->unk_00].unk_02 = -1;
|
||||
param0->unk_06[param0->unk_00].unk_03 = 1;
|
||||
param0->unk_00 = (param0->unk_00 + 1) % 6;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_02055740(UnkStruct_020556C4 *param0, int param1, int param2, int param3)
|
||||
{
|
||||
u8 v0 = param1, v1;
|
||||
v1 = param2;
|
||||
|
||||
if ((v0 != param0->unk_04) || (v1 != param0->unk_05)) {
|
||||
param0->unk_06[param0->unk_00].unk_00 = v0;
|
||||
param0->unk_06[param0->unk_00].unk_01 = v1;
|
||||
param0->unk_06[param0->unk_00].unk_02 = param3;
|
||||
param0->unk_06[param0->unk_00].unk_03 = 1;
|
||||
|
||||
param0->unk_04 = v0;
|
||||
param0->unk_05 = v1;
|
||||
param0->unk_00 = (param0->unk_00 + 1) % 6;
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,6 @@
|
||||
|
||||
#include "struct_decls/struct_0203A790_decl.h"
|
||||
#include "struct_defs/struct_0203D8AC.h"
|
||||
#include "struct_defs/struct_020556C4.h"
|
||||
#include "struct_defs/union_0206B878.h"
|
||||
|
||||
#include "field/field_system.h"
|
||||
@@ -19,6 +18,7 @@
|
||||
#include "location.h"
|
||||
#include "map_header.h"
|
||||
#include "map_matrix.h"
|
||||
#include "overworld_map_history.h"
|
||||
#include "player_avatar.h"
|
||||
#include "save_player.h"
|
||||
#include "script_manager.h"
|
||||
@@ -77,7 +77,7 @@ void sub_0206B70C(FieldSystem *fieldSystem, UnkStruct_0203D8AC *param1, int para
|
||||
TrainerInfo *v0;
|
||||
int v1 = 0, v2 = 0, v3 = 0;
|
||||
int x, z, v6;
|
||||
UnkStruct_020556C4 *v7;
|
||||
OverworldMapHistory *v7;
|
||||
VarsFlags *v8 = SaveData_GetVarsFlags(fieldSystem->saveData);
|
||||
FieldOverworldState *fieldState = SaveData_GetFieldOverworldState(fieldSystem->saveData);
|
||||
Location *v10 = FieldOverworldState_GetExitLocation(fieldState);
|
||||
@@ -114,18 +114,18 @@ void sub_0206B70C(FieldSystem *fieldSystem, UnkStruct_0203D8AC *param1, int para
|
||||
|
||||
v0 = SaveData_GetTrainerInfo(FieldSystem_GetSaveData(fieldSystem));
|
||||
param1->unk_0C = TrainerInfo_Gender(v0);
|
||||
v7 = sub_0203A76C(SaveData_GetFieldOverworldState(fieldSystem->saveData));
|
||||
v2 = (v7->unk_00 - 2 + 6) % 6;
|
||||
v7 = FieldOverworldState_GetMapHistory(SaveData_GetFieldOverworldState(fieldSystem->saveData));
|
||||
v2 = (v7->historyPointer - 2 + 6) % 6;
|
||||
|
||||
for (v1 = 0; v1 < 5; v1++) {
|
||||
param1->unk_20[v1].unk_00 = v7->unk_06[v2].unk_00;
|
||||
param1->unk_20[v1].unk_04 = v7->unk_06[v2].unk_01;
|
||||
param1->unk_20[v1].unk_0A = v7->unk_06[v2].unk_03;
|
||||
param1->unk_20[v1].unk_00 = v7->items[v2].mapX;
|
||||
param1->unk_20[v1].unk_04 = v7->items[v2].mapZ;
|
||||
param1->unk_20[v1].unk_0A = v7->items[v2].dummy_03;
|
||||
|
||||
if (v7->unk_06[v2].unk_02 > 3) {
|
||||
if (v7->items[v2].faceDirection > 3) {
|
||||
param1->unk_20[v1].unk_08 = 3 + 1;
|
||||
} else {
|
||||
param1->unk_20[v1].unk_08 = v7->unk_06[v2].unk_02;
|
||||
param1->unk_20[v1].unk_08 = v7->items[v2].faceDirection;
|
||||
}
|
||||
|
||||
v2 = (v2 - 1 + 6) % 6;
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "struct_defs/special_encounter.h"
|
||||
#include "struct_defs/struct_020556C4.h"
|
||||
#include "struct_defs/struct_0205EC34.h"
|
||||
|
||||
#include "field/field_system.h"
|
||||
@@ -14,6 +13,7 @@
|
||||
#include "journal.h"
|
||||
#include "location.h"
|
||||
#include "map_header.h"
|
||||
#include "overworld_map_history.h"
|
||||
#include "player_avatar.h"
|
||||
#include "roaming_pokemon.h"
|
||||
#include "save_player.h"
|
||||
@@ -21,7 +21,6 @@
|
||||
#include "system_flags.h"
|
||||
#include "system_vars.h"
|
||||
#include "unk_0203A7D8.h"
|
||||
#include "unk_020556C4.h"
|
||||
#include "vars_flags.h"
|
||||
|
||||
static BOOL sub_020705DC(FieldSystem *fieldSystem);
|
||||
@@ -98,10 +97,8 @@ void FieldSystem_InitFlagsWarp(FieldSystem *fieldSystem)
|
||||
}
|
||||
|
||||
if (MapHeader_IsOnMainMatrix(fieldSystem->location->mapId)) {
|
||||
UnkStruct_020556C4 *v3;
|
||||
|
||||
v3 = sub_0203A76C(SaveData_GetFieldOverworldState(fieldSystem->saveData));
|
||||
sub_020556E8(v3, fieldSystem->location->x, fieldSystem->location->z);
|
||||
OverworldMapHistory *mapHistory = FieldOverworldState_GetMapHistory(SaveData_GetFieldOverworldState(fieldSystem->saveData));
|
||||
OverworldMapHistory_PushViaWarp(mapHistory, fieldSystem->location->x, fieldSystem->location->z);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user