2020-02-16 19:49:36 +01:00
|
|
|
#include "global.h"
|
|
|
|
#include "malloc.h"
|
|
|
|
#include "decompress.h"
|
|
|
|
#include "link_rfu.h"
|
|
|
|
#include "string_util.h"
|
|
|
|
#include "random.h"
|
|
|
|
#include "text.h"
|
|
|
|
#include "event_data.h"
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
enum {
|
|
|
|
WIRELESS_STATUS_ANIM_3_BARS,
|
|
|
|
WIRELESS_STATUS_ANIM_2_BARS,
|
|
|
|
WIRELESS_STATUS_ANIM_1_BAR,
|
|
|
|
WIRELESS_STATUS_ANIM_SEARCHING,
|
|
|
|
WIRELESS_STATUS_ANIM_ERROR,
|
|
|
|
};
|
|
|
|
|
|
|
|
#define UNUSED_QUEUE_NUM_SLOTS 2
|
|
|
|
#define UNUSED_QUEUE_SLOT_LENGTH 256
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
struct RfuUnusedQueue
|
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
u8 slots[UNUSED_QUEUE_NUM_SLOTS][UNUSED_QUEUE_SLOT_LENGTH];
|
2020-06-07 23:37:09 +02:00
|
|
|
vu8 recvSlot;
|
|
|
|
vu8 sendSlot;
|
|
|
|
vu8 count;
|
|
|
|
vu8 full;
|
|
|
|
};
|
|
|
|
|
2020-02-16 19:49:36 +01:00
|
|
|
EWRAM_DATA u8 gWirelessStatusIndicatorSpriteId = 0;
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static u8 sUnknown_03000D74;
|
2020-02-16 19:49:36 +01:00
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static const u16 sWirelessLinkIconPalette[] = INCBIN_U16("graphics/interface/wireless_link_icon.gbapal");
|
|
|
|
static const u32 sWirelessLinkIconPic[] = INCBIN_U32("graphics/interface/wireless_link_icon.4bpp.lz");
|
2020-02-16 19:49:36 +01:00
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
// Most of the below two tables won't make sense with ASCII encoding.
|
|
|
|
static const u8 sWireless_ASCIItoRSETable[256] = {
|
|
|
|
EOS,
|
|
|
|
0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x37,
|
2020-02-16 19:49:36 +01:00
|
|
|
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
|
|
|
|
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
|
|
|
|
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
|
2020-06-07 23:37:09 +02:00
|
|
|
[' '] = CHAR_SPACE,
|
|
|
|
['!'] = CHAR_EXCL_MARK,
|
|
|
|
0xb5, 0xb6, 0xb1, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0xb2, 0xf1, 0x00,
|
|
|
|
['-'] = CHAR_HYPHEN,
|
|
|
|
['.'] = CHAR_PERIOD,
|
|
|
|
['/'] = CHAR_SLASH,
|
|
|
|
['0'] = CHAR_0,
|
|
|
|
['1'] = CHAR_1,
|
|
|
|
['2'] = CHAR_2,
|
|
|
|
['3'] = CHAR_3,
|
|
|
|
['4'] = CHAR_4,
|
|
|
|
['5'] = CHAR_5,
|
|
|
|
['6'] = CHAR_6,
|
|
|
|
['7'] = CHAR_7,
|
|
|
|
['8'] = CHAR_8,
|
|
|
|
['9'] = CHAR_9,
|
|
|
|
0x00, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x00,
|
|
|
|
['A'] = CHAR_A,
|
|
|
|
['B'] = CHAR_B,
|
|
|
|
['C'] = CHAR_C,
|
|
|
|
['D'] = CHAR_D,
|
|
|
|
['E'] = CHAR_E,
|
|
|
|
['F'] = CHAR_F,
|
|
|
|
['G'] = CHAR_G,
|
|
|
|
['H'] = CHAR_H,
|
|
|
|
['I'] = CHAR_I,
|
|
|
|
['J'] = CHAR_J,
|
|
|
|
['K'] = CHAR_K,
|
|
|
|
['L'] = CHAR_L,
|
|
|
|
['M'] = CHAR_M,
|
|
|
|
['N'] = CHAR_N,
|
|
|
|
['O'] = CHAR_O,
|
|
|
|
['P'] = CHAR_P,
|
|
|
|
['Q'] = CHAR_Q,
|
|
|
|
['R'] = CHAR_R,
|
|
|
|
['S'] = CHAR_S,
|
|
|
|
['T'] = CHAR_T,
|
|
|
|
['U'] = CHAR_U,
|
|
|
|
['V'] = CHAR_V,
|
|
|
|
['W'] = CHAR_W,
|
|
|
|
['X'] = CHAR_X,
|
|
|
|
['Y'] = CHAR_Y,
|
|
|
|
['Z'] = CHAR_Z,
|
|
|
|
0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x00,
|
|
|
|
['a'] = CHAR_a,
|
|
|
|
['b'] = CHAR_b,
|
|
|
|
['c'] = CHAR_c,
|
|
|
|
['d'] = CHAR_d,
|
|
|
|
['e'] = CHAR_e,
|
|
|
|
['f'] = CHAR_f,
|
|
|
|
['g'] = CHAR_g,
|
|
|
|
['h'] = CHAR_h,
|
|
|
|
['i'] = CHAR_i,
|
|
|
|
['j'] = CHAR_j,
|
|
|
|
['k'] = CHAR_k,
|
|
|
|
['l'] = CHAR_l,
|
|
|
|
['m'] = CHAR_m,
|
|
|
|
['n'] = CHAR_n,
|
|
|
|
['o'] = CHAR_o,
|
|
|
|
['p'] = CHAR_p,
|
|
|
|
['q'] = CHAR_q,
|
|
|
|
['r'] = CHAR_r,
|
|
|
|
['s'] = CHAR_s,
|
|
|
|
['t'] = CHAR_t,
|
|
|
|
['u'] = CHAR_u,
|
|
|
|
['v'] = CHAR_v,
|
|
|
|
['w'] = CHAR_w,
|
|
|
|
['x'] = CHAR_x,
|
|
|
|
['y'] = CHAR_y,
|
|
|
|
['z'] = CHAR_z,
|
|
|
|
0x2d, 0x2f, 0x30, 0x31, 0x32,
|
2020-02-16 19:49:36 +01:00
|
|
|
0x33, 0x34, 0x35, 0x36, 0x50, 0x00, 0x01, 0x02,
|
|
|
|
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
|
|
|
|
0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
|
|
|
|
0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
|
|
|
|
0x1b, 0xad, 0xb3, 0xb4, 0x00, 0xaf, 0x7d, 0x7f,
|
|
|
|
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0xa0,
|
|
|
|
0xae, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
|
|
|
|
0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
|
|
|
|
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
|
|
|
|
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
|
|
|
|
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
|
|
|
|
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7e, 0xb0, 0xac,
|
|
|
|
0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
|
|
|
|
0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
|
|
|
|
0x2c, 0x2e, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c,
|
|
|
|
0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94
|
|
|
|
};
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static const u8 sWireless_RSEtoASCIITable[256] = {
|
|
|
|
[CHAR_SPACE] = ' ',
|
|
|
|
0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d,
|
|
|
|
0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
|
|
|
|
0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d,
|
|
|
|
0x9e, 0x9f, 0xa0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4,
|
|
|
|
0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec,
|
|
|
|
0xed, 0xee, 0xef, 0xf0, 0x7b, 0xf1, 0x7c, 0x7d,
|
|
|
|
0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x07, 0x08,
|
|
|
|
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
|
|
|
|
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
|
|
|
|
0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x84,
|
|
|
|
0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8,
|
|
|
|
0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
|
|
|
|
0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8,
|
|
|
|
0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
|
|
|
|
0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
|
|
|
|
0xd9, 0xda, 0xdb, 0xdc, 0xa6, 0xdd, 0xa7, 0xa8,
|
|
|
|
0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xf2, 0xf3,
|
|
|
|
0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
|
|
|
|
0xfc, 0xfd, 0xfe, 0xff, 0x01, 0x02, 0x03, 0x04,
|
|
|
|
0x05, 0x06, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0xaf,
|
|
|
|
[CHAR_0] = '0',
|
|
|
|
[CHAR_1] = '1',
|
|
|
|
[CHAR_2] = '2',
|
|
|
|
[CHAR_3] = '3',
|
|
|
|
[CHAR_4] = '4',
|
|
|
|
[CHAR_5] = '5',
|
|
|
|
[CHAR_6] = '6',
|
|
|
|
[CHAR_7] = '7',
|
|
|
|
[CHAR_8] = '8',
|
|
|
|
[CHAR_9] = '9',
|
|
|
|
[CHAR_EXCL_MARK] = '!',
|
|
|
|
0xdf, 0xa1, 0xb0, 0xa5, 0xde, 0x24, 0x2a,
|
|
|
|
0xa2, 0xa3, 0x22, 0x23, 0x20, 0xa4, 0x20,
|
|
|
|
[CHAR_SLASH] = '/',
|
|
|
|
[CHAR_A] = 'A',
|
|
|
|
[CHAR_B] = 'B',
|
|
|
|
[CHAR_C] = 'C',
|
|
|
|
[CHAR_D] = 'D',
|
|
|
|
[CHAR_E] = 'E',
|
|
|
|
[CHAR_F] = 'F',
|
|
|
|
[CHAR_G] = 'G',
|
|
|
|
[CHAR_H] = 'H',
|
|
|
|
[CHAR_I] = 'I',
|
|
|
|
[CHAR_J] = 'J',
|
|
|
|
[CHAR_K] = 'K',
|
|
|
|
[CHAR_L] = 'L',
|
|
|
|
[CHAR_M] = 'M',
|
|
|
|
[CHAR_N] = 'N',
|
|
|
|
[CHAR_O] = 'O',
|
|
|
|
[CHAR_P] = 'P',
|
|
|
|
[CHAR_Q] = 'Q',
|
|
|
|
[CHAR_R] = 'R',
|
|
|
|
[CHAR_S] = 'S',
|
|
|
|
[CHAR_T] = 'T',
|
|
|
|
[CHAR_U] = 'U',
|
|
|
|
[CHAR_V] = 'V',
|
|
|
|
[CHAR_W] = 'W',
|
|
|
|
[CHAR_X] = 'X',
|
|
|
|
[CHAR_Y] = 'Y',
|
|
|
|
[CHAR_Z] = 'Z',
|
|
|
|
[CHAR_a] = 'a',
|
|
|
|
[CHAR_b] = 'b',
|
|
|
|
[CHAR_c] = 'c',
|
|
|
|
[CHAR_d] = 'd',
|
|
|
|
[CHAR_e] = 'e',
|
|
|
|
[CHAR_f] = 'f',
|
|
|
|
[CHAR_g] = 'g',
|
|
|
|
[CHAR_h] = 'h',
|
|
|
|
[CHAR_i] = 'i',
|
|
|
|
[CHAR_j] = 'j',
|
|
|
|
[CHAR_k] = 'k',
|
|
|
|
[CHAR_l] = 'l',
|
|
|
|
[CHAR_m] = 'm',
|
|
|
|
[CHAR_n] = 'n',
|
|
|
|
[CHAR_o] = 'o',
|
|
|
|
[CHAR_p] = 'p',
|
|
|
|
[CHAR_q] = 'q',
|
|
|
|
[CHAR_r] = 'r',
|
|
|
|
[CHAR_s] = 's',
|
|
|
|
[CHAR_t] = 't',
|
|
|
|
[CHAR_u] = 'u',
|
|
|
|
[CHAR_v] = 'v',
|
|
|
|
[CHAR_w] = 'w',
|
|
|
|
[CHAR_x] = 'x',
|
|
|
|
[CHAR_y] = 'y',
|
|
|
|
[CHAR_z] = 'z',
|
|
|
|
0x20, 0x20, 0x2b, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
|
2020-08-11 05:50:49 +02:00
|
|
|
[CHAR_DYNAMIC] = ' ',
|
|
|
|
[CHAR_KEYPAD_ICON] = ' ',
|
|
|
|
[CHAR_EXTRA_SYMBOL] = ' ',
|
2020-06-07 23:37:09 +02:00
|
|
|
[CHAR_PROMPT_SCROLL] = ' ',
|
|
|
|
[CHAR_PROMPT_CLEAR] = ' ',
|
|
|
|
[EXT_CTRL_CODE_BEGIN] = ' ',
|
|
|
|
[PLACEHOLDER_BEGIN] = ' ',
|
|
|
|
[CHAR_NEWLINE] = ' ',
|
|
|
|
[EOS] = 0
|
2020-02-16 19:49:36 +01:00
|
|
|
};
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static const struct OamData sWirelessStatusIndicatorOamData =
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
.y = 0,
|
|
|
|
.affineMode = ST_OAM_AFFINE_OFF,
|
|
|
|
.objMode = ST_OAM_OBJ_NORMAL,
|
|
|
|
.bpp = ST_OAM_4BPP,
|
|
|
|
.shape = SPRITE_SHAPE(16x16),
|
|
|
|
.x = 0,
|
|
|
|
.size = SPRITE_SIZE(16x16),
|
|
|
|
.tileNum = 0,
|
|
|
|
.priority = 0,
|
|
|
|
.paletteNum = 0,
|
|
|
|
};
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
static const union AnimCmd sWirelessStatusIndicator_3Bars[] = {
|
2020-02-16 19:49:36 +01:00
|
|
|
ANIMCMD_FRAME( 4, 5),
|
|
|
|
ANIMCMD_FRAME( 8, 5),
|
|
|
|
ANIMCMD_FRAME(12, 5),
|
|
|
|
ANIMCMD_FRAME(16, 10),
|
|
|
|
ANIMCMD_FRAME(12, 5),
|
|
|
|
ANIMCMD_FRAME( 8, 5),
|
|
|
|
ANIMCMD_JUMP(0)
|
|
|
|
};
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
static const union AnimCmd sWirelessStatusIndicator_2Bars[] = {
|
2020-02-16 19:49:36 +01:00
|
|
|
ANIMCMD_FRAME( 4, 5),
|
|
|
|
ANIMCMD_FRAME( 8, 5),
|
|
|
|
ANIMCMD_FRAME(12, 10),
|
|
|
|
ANIMCMD_FRAME( 8, 5),
|
|
|
|
ANIMCMD_JUMP(0)
|
|
|
|
};
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
static const union AnimCmd sWirelessStatusIndicator_1Bar[] = {
|
2020-02-16 19:49:36 +01:00
|
|
|
ANIMCMD_FRAME(4, 5),
|
|
|
|
ANIMCMD_FRAME(8, 5),
|
|
|
|
ANIMCMD_JUMP(0)
|
|
|
|
};
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
static const union AnimCmd sWirelessStatusIndicator_Searching[] = {
|
2020-02-16 19:49:36 +01:00
|
|
|
ANIMCMD_FRAME( 4, 10),
|
|
|
|
ANIMCMD_FRAME(20, 10),
|
|
|
|
ANIMCMD_JUMP(0)
|
|
|
|
};
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
static const union AnimCmd sWirelessStatusIndicator_Error[] = {
|
2020-02-16 19:49:36 +01:00
|
|
|
ANIMCMD_FRAME(24, 10),
|
|
|
|
ANIMCMD_FRAME( 4, 10),
|
|
|
|
ANIMCMD_JUMP(0)
|
|
|
|
};
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static const union AnimCmd *const sWirelessStatusIndicatorAnims[] = {
|
2020-06-08 06:45:06 +02:00
|
|
|
[WIRELESS_STATUS_ANIM_3_BARS] = sWirelessStatusIndicator_3Bars,
|
|
|
|
[WIRELESS_STATUS_ANIM_2_BARS] = sWirelessStatusIndicator_2Bars,
|
|
|
|
[WIRELESS_STATUS_ANIM_1_BAR] = sWirelessStatusIndicator_1Bar,
|
|
|
|
[WIRELESS_STATUS_ANIM_SEARCHING] = sWirelessStatusIndicator_Searching,
|
|
|
|
[WIRELESS_STATUS_ANIM_ERROR] = sWirelessStatusIndicator_Error
|
2020-02-16 19:49:36 +01:00
|
|
|
};
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static const struct CompressedSpriteSheet sWirelessStatusIndicatorSpriteSheet = {
|
|
|
|
sWirelessLinkIconPic, 0x0380, 0xD431
|
2020-02-16 19:49:36 +01:00
|
|
|
};
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static const struct SpritePalette sWirelessStatusIndicatorSpritePalette = {
|
|
|
|
sWirelessLinkIconPalette, 0xD432
|
2020-02-16 19:49:36 +01:00
|
|
|
};
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = {
|
2020-06-08 06:45:06 +02:00
|
|
|
.tileTag = 0xD431,
|
|
|
|
.paletteTag = 0xD432,
|
|
|
|
.oam = &sWirelessStatusIndicatorOamData,
|
|
|
|
.anims = sWirelessStatusIndicatorAnims,
|
|
|
|
.images = NULL,
|
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
|
|
.callback = SpriteCallbackDummy
|
2020-02-16 19:49:36 +01:00
|
|
|
};
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
void RfuRecvQueue_Reset(struct RfuRecvQueue *queue)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
s32 i;
|
|
|
|
s32 j;
|
2020-02-16 19:49:36 +01:00
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < RECV_QUEUE_NUM_SLOTS; i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
for (j = 0; j < RECV_QUEUE_SLOT_LENGTH; j++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->slots[i][j] = 0;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->sendSlot = 0;
|
|
|
|
queue->recvSlot = 0;
|
|
|
|
queue->count = 0;
|
|
|
|
queue->full = FALSE;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
void RfuSendQueue_Reset(struct RfuSendQueue *queue)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
s32 i;
|
|
|
|
s32 j;
|
2020-02-16 19:49:36 +01:00
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < SEND_QUEUE_NUM_SLOTS; i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
for (j = 0; j < SEND_QUEUE_SLOT_LENGTH; j++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->slots[i][j] = 0;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->sendSlot = 0;
|
|
|
|
queue->recvSlot = 0;
|
|
|
|
queue->count = 0;
|
|
|
|
queue->full = FALSE;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static void RfuUnusedQueue_Reset(struct RfuUnusedQueue *queue)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
s32 i;
|
|
|
|
s32 j;
|
2020-02-16 19:49:36 +01:00
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < UNUSED_QUEUE_NUM_SLOTS; i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
for (j = 0; j < UNUSED_QUEUE_SLOT_LENGTH; j++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->slots[i][j] = 0;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->sendSlot = 0;
|
|
|
|
queue->recvSlot = 0;
|
|
|
|
queue->count = 0;
|
|
|
|
queue->full = FALSE;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
void RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *data)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
u16 imeBak;
|
|
|
|
u8 count;
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
if (queue->count < RECV_QUEUE_NUM_SLOTS)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
imeBak = REG_IME;
|
|
|
|
REG_IME = 0;
|
|
|
|
count = 0;
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i += RECV_QUEUE_SLOT_LENGTH / MAX_RFU_PLAYERS)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
if (data[i] == 0 && data[i + 1] == 0)
|
2020-02-16 19:49:36 +01:00
|
|
|
count++;
|
|
|
|
}
|
2020-06-08 06:45:06 +02:00
|
|
|
if (count != MAX_RFU_PLAYERS)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++)
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->slots[queue->recvSlot][i] = data[i];
|
2020-06-08 06:45:06 +02:00
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->recvSlot++;
|
2020-06-08 06:45:06 +02:00
|
|
|
queue->recvSlot %= RECV_QUEUE_NUM_SLOTS;
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->count++;
|
2020-06-08 06:45:06 +02:00
|
|
|
|
|
|
|
for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++)
|
2020-06-07 23:37:09 +02:00
|
|
|
data[i] = 0;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
REG_IME = imeBak;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->full = TRUE;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
void RfuSendQueue_Enqueue(struct RfuSendQueue *queue, u8 *data)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
u16 imeBak;
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
if (queue->count < SEND_QUEUE_NUM_SLOTS)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
imeBak = REG_IME;
|
|
|
|
REG_IME = 0;
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
if (data[i] != 0)
|
2020-02-16 19:49:36 +01:00
|
|
|
break;
|
|
|
|
}
|
2020-06-08 06:45:06 +02:00
|
|
|
if (i != SEND_QUEUE_SLOT_LENGTH)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->slots[queue->recvSlot][i] = data[i];
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->recvSlot++;
|
2020-06-08 06:45:06 +02:00
|
|
|
queue->recvSlot %= SEND_QUEUE_NUM_SLOTS;
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->count++;
|
2020-06-08 06:45:06 +02:00
|
|
|
|
|
|
|
for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++)
|
2020-06-07 23:37:09 +02:00
|
|
|
data[i] = 0;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
REG_IME = imeBak;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->full = TRUE;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
bool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue *queue, u8 *src)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
u16 imeBak;
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
imeBak = REG_IME;
|
|
|
|
REG_IME = 0;
|
2020-06-07 23:37:09 +02:00
|
|
|
if (queue->recvSlot == queue->sendSlot || queue->full)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++)
|
2020-06-07 23:37:09 +02:00
|
|
|
src[i] = 0;
|
2020-06-08 06:45:06 +02:00
|
|
|
|
2020-02-16 19:49:36 +01:00
|
|
|
REG_IME = imeBak;
|
|
|
|
return FALSE;
|
|
|
|
}
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
src[i] = queue->slots[queue->sendSlot][i];
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->sendSlot++;
|
2020-06-08 06:45:06 +02:00
|
|
|
queue->sendSlot %= RECV_QUEUE_NUM_SLOTS;
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->count--;
|
2020-02-16 19:49:36 +01:00
|
|
|
REG_IME = imeBak;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
bool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *src)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
u16 imeBak;
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
if (queue->recvSlot == queue->sendSlot || queue->full)
|
2020-02-16 19:49:36 +01:00
|
|
|
return FALSE;
|
2020-06-07 23:37:09 +02:00
|
|
|
|
2020-02-16 19:49:36 +01:00
|
|
|
imeBak = REG_IME;
|
|
|
|
REG_IME = 0;
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++)
|
2020-06-07 23:37:09 +02:00
|
|
|
src[i] = queue->slots[queue->sendSlot][i];
|
2020-06-08 06:45:06 +02:00
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->sendSlot++;
|
2020-06-08 06:45:06 +02:00
|
|
|
queue->sendSlot %= SEND_QUEUE_NUM_SLOTS;
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->count--;
|
2020-02-16 19:49:36 +01:00
|
|
|
REG_IME = imeBak;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
void RfuBackupQueue_Enqueue(struct RfuBackupQueue *queue, const u8 *data)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
if (data[1] == 0)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
RfuBackupQueue_Dequeue(queue, NULL);
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < BACKUP_QUEUE_SLOT_LENGTH; i++)
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->slots[queue->recvSlot][i] = data[i];
|
2020-06-08 06:45:06 +02:00
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->recvSlot++;
|
2020-06-08 06:45:06 +02:00
|
|
|
queue->recvSlot %= BACKUP_QUEUE_NUM_SLOTS;
|
|
|
|
|
|
|
|
if (queue->count < BACKUP_QUEUE_NUM_SLOTS)
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->count++;
|
2020-02-16 19:49:36 +01:00
|
|
|
else
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->sendSlot = queue->recvSlot;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
bool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *src)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
if (queue->count == 0)
|
2020-02-16 19:49:36 +01:00
|
|
|
return FALSE;
|
2020-06-07 23:37:09 +02:00
|
|
|
|
|
|
|
if (src != NULL)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < BACKUP_QUEUE_SLOT_LENGTH; i++)
|
2020-06-07 23:37:09 +02:00
|
|
|
src[i] = queue->slots[queue->sendSlot][i];
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->sendSlot++;
|
2020-06-08 06:45:06 +02:00
|
|
|
queue->sendSlot %= BACKUP_QUEUE_NUM_SLOTS;
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->count--;
|
2020-02-16 19:49:36 +01:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static void RfuUnusedQueue_Enqueue(struct RfuUnusedQueue *queue, u8 *data)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
if (queue->count < UNUSED_QUEUE_NUM_SLOTS)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < UNUSED_QUEUE_SLOT_LENGTH; i++)
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->slots[queue->recvSlot][i] = data[i];
|
2020-06-08 06:45:06 +02:00
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->recvSlot++;
|
2020-06-08 06:45:06 +02:00
|
|
|
queue->recvSlot %= UNUSED_QUEUE_NUM_SLOTS;
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->count++;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->full = TRUE;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static bool8 RfuUnusedQueue_Dequeue(struct RfuUnusedQueue *queue, u8 *dest)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
if (queue->recvSlot == queue->sendSlot || queue->full)
|
2020-02-16 19:49:36 +01:00
|
|
|
return FALSE;
|
2020-06-07 23:37:09 +02:00
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
for (i = 0; i < UNUSED_QUEUE_SLOT_LENGTH; i++)
|
2020-06-07 23:37:09 +02:00
|
|
|
dest[i] = queue->slots[queue->sendSlot][i];
|
2020-06-08 06:45:06 +02:00
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->sendSlot++;
|
2020-06-08 06:45:06 +02:00
|
|
|
queue->sendSlot %= UNUSED_QUEUE_NUM_SLOTS;
|
2020-06-07 23:37:09 +02:00
|
|
|
queue->count--;
|
2020-02-16 19:49:36 +01:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
// Unused
|
|
|
|
static void sub_800DBF8(u8 *q1, u8 mode)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
u8 rval;
|
|
|
|
u16 r5 = 0;
|
|
|
|
switch (mode)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
for (i = 0; i < 200; i++)
|
|
|
|
{
|
|
|
|
q1[i] = i + 1;
|
|
|
|
r5 += i + 1;
|
|
|
|
}
|
|
|
|
*((u16 *)(q1 + i)) = r5;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
for (i = 0; i < 100; i++)
|
|
|
|
{
|
|
|
|
q1[i] = i + 1;
|
|
|
|
r5 += i + 1;
|
|
|
|
}
|
|
|
|
*((u16 *)(q1 + 200)) = r5;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
for (i = 0; i < 200; i++)
|
|
|
|
{
|
|
|
|
rval = Random();
|
|
|
|
q1[i] = rval;
|
|
|
|
r5 += rval;
|
|
|
|
}
|
|
|
|
*((u16 *)(q1 + i)) = r5;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
for (i = 0; i < 200; i++)
|
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
q1[i] = i + 1 + sUnknown_03000D74;
|
|
|
|
r5 += (i + 1 + sUnknown_03000D74) & 0xFF;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
*((u16 *)(q1 + i)) = r5;
|
2020-06-07 23:37:09 +02:00
|
|
|
sUnknown_03000D74++;
|
2020-02-16 19:49:36 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// File boundary here maybe?
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static void PkmnStrToASCII(u8 *asciiStr, const u8 *pkmnStr)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
for (i = 0; pkmnStr[i] != EOS; i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
asciiStr[i] = sWireless_RSEtoASCIITable[pkmnStr[i]];
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
asciiStr[i] = 0;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static void ASCIIToPkmnStr(u8 *pkmnStr, const u8 *asciiStr)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
for (i = 0; asciiStr[i] != 0; i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
pkmnStr[i] = sWireless_ASCIItoRSETable[asciiStr[i]];
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
pkmnStr[i] = EOS;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static u8 GetConnectedChildStrength(u8 maxFlags)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
u8 flagCount = 0;
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
u32 flags = gRfuLinkStatus->connSlotFlag;
|
2020-02-16 19:49:36 +01:00
|
|
|
u8 i;
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
if (gRfuLinkStatus->parentChild == MODE_PARENT)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
for (i = 0; i < 4; flags >>= 1, i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
if (flags & 1)
|
|
|
|
{
|
|
|
|
if (maxFlags == flagCount + 1)
|
2020-10-22 11:03:16 +02:00
|
|
|
{
|
2020-02-16 19:49:36 +01:00
|
|
|
return gRfuLinkStatus->strength[i];
|
2020-10-22 11:03:16 +02:00
|
|
|
break;
|
|
|
|
}
|
2020-02-16 19:49:36 +01:00
|
|
|
flagCount++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
for (i = 0; i < 4; flags >>= 1, i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
if (flags & 1)
|
|
|
|
return gRfuLinkStatus->strength[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 started, s32 child_sprite_genders)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
|
|
|
data->unk_00.playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
|
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
for (i = 0; i < RFU_CHILD_MAX; i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
data->child_sprite_gender[i] = child_sprite_genders;
|
|
|
|
child_sprite_genders >>= 8;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
data->playerGender = gSaveBlock2Ptr->playerGender;
|
2020-06-07 23:37:09 +02:00
|
|
|
data->activity = activity;
|
|
|
|
data->started = started;
|
2020-02-16 19:49:36 +01:00
|
|
|
data->unk_00.language = GAME_LANGUAGE;
|
|
|
|
data->unk_00.version = GAME_VERSION;
|
2020-06-07 23:37:09 +02:00
|
|
|
data->unk_00.hasNews = FALSE;
|
|
|
|
data->unk_00.hasCard = FALSE;
|
|
|
|
data->unk_00.unknown = FALSE;
|
2020-02-16 19:49:36 +01:00
|
|
|
data->unk_00.isChampion = FlagGet(FLAG_IS_CHAMPION);
|
|
|
|
data->unk_00.hasNationalDex = IsNationalPokedexEnabled();
|
|
|
|
data->unk_00.gameClear = FlagGet(FLAG_SYS_GAME_CLEAR);
|
|
|
|
}
|
|
|
|
|
2020-05-30 10:09:21 +02:00
|
|
|
bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *buff1, u8 *buff2, u8 idx)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
bool8 retVal;
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
if (lman.parent_child == MODE_PARENT)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
retVal = TRUE;
|
2020-06-07 23:37:09 +02:00
|
|
|
if (IsRfuSerialNumberValid(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1))
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
memcpy(buff1, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
|
2020-02-16 19:49:36 +01:00
|
|
|
memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
memset(buff1, 0, RFU_GAME_NAME_LENGTH);
|
2020-02-16 19:49:36 +01:00
|
|
|
memset(buff2, 0, PLAYER_NAME_LENGTH + 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
retVal = FALSE;
|
2020-06-07 23:37:09 +02:00
|
|
|
if (IsRfuSerialNumberValid(gRfuLinkStatus->partner[idx].serialNo))
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
memcpy(buff1, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
|
2020-02-16 19:49:36 +01:00
|
|
|
memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
memset(buff1, 0, RFU_GAME_NAME_LENGTH);
|
2020-02-16 19:49:36 +01:00
|
|
|
memset(buff2, 0, PLAYER_NAME_LENGTH + 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return retVal;
|
|
|
|
}
|
|
|
|
|
2020-05-30 10:09:21 +02:00
|
|
|
bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
bool8 retVal = FALSE;
|
2020-06-08 06:45:06 +02:00
|
|
|
if (gRfuLinkStatus->partner[idx].serialNo == RFU_SERIAL_7F7D)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
memcpy(buff1, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
|
|
|
|
memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1);
|
2020-02-16 19:49:36 +01:00
|
|
|
retVal = TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
memset(buff1, 0, RFU_GAME_NAME_LENGTH);
|
|
|
|
memset(buff2, 0, PLAYER_NAME_LENGTH + 1);
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
return retVal;
|
|
|
|
}
|
|
|
|
|
2020-05-30 10:09:21 +02:00
|
|
|
void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *buff1, u8 *buff2)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
memcpy(buff1, &gHostRFUtgtGnameBuffer, RFU_GAME_NAME_LENGTH);
|
|
|
|
memcpy(buff2, gHostRFUtgtUnameBuffer, PLAYER_NAME_LENGTH + 1);
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
#define sNextAnimNum data[0]
|
|
|
|
#define sSavedAnimNum data[1]
|
|
|
|
#define sCurrAnimNum data[2]
|
|
|
|
#define sFrameDelay data[3]
|
|
|
|
#define sFrameIdx data[4]
|
|
|
|
#define sTileStart data[6]
|
|
|
|
#define sValidator data[7]
|
|
|
|
#define STATUS_INDICATOR_ACTIVE 0x1234 // Used to validate active indicator
|
|
|
|
|
2020-02-16 19:49:36 +01:00
|
|
|
void CreateWirelessStatusIndicatorSprite(u8 x, u8 y)
|
|
|
|
{
|
|
|
|
u8 sprId;
|
|
|
|
|
|
|
|
if (x == 0 && y == 0)
|
|
|
|
{
|
|
|
|
x = 0xE7;
|
|
|
|
y = 0x08;
|
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
if (gRfuLinkStatus->parentChild == MODE_PARENT)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
sprId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0);
|
2020-06-08 06:45:06 +02:00
|
|
|
gSprites[sprId].sValidator = STATUS_INDICATOR_ACTIVE;
|
|
|
|
gSprites[sprId].sTileStart = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag);
|
2020-02-16 19:49:36 +01:00
|
|
|
gSprites[sprId].invisible = TRUE;
|
|
|
|
gWirelessStatusIndicatorSpriteId = sprId;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gWirelessStatusIndicatorSpriteId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0);
|
2020-06-08 06:45:06 +02:00
|
|
|
gSprites[gWirelessStatusIndicatorSpriteId].sValidator = STATUS_INDICATOR_ACTIVE;
|
|
|
|
gSprites[gWirelessStatusIndicatorSpriteId].sTileStart = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag);
|
2020-02-16 19:49:36 +01:00
|
|
|
gSprites[gWirelessStatusIndicatorSpriteId].invisible = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DestroyWirelessStatusIndicatorSprite(void)
|
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
if (gSprites[gWirelessStatusIndicatorSpriteId].sValidator == STATUS_INDICATOR_ACTIVE)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
gSprites[gWirelessStatusIndicatorSpriteId].sValidator = 0;
|
2020-02-16 19:49:36 +01:00
|
|
|
DestroySprite(&gSprites[gWirelessStatusIndicatorSpriteId]);
|
|
|
|
gMain.oamBuffer[125] = gDummyOamData;
|
|
|
|
CpuCopy16(&gDummyOamData, (struct OamData *)OAM + 125, sizeof(struct OamData));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void LoadWirelessStatusIndicatorSpriteGfx(void)
|
|
|
|
{
|
|
|
|
if (GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag) == 0xFFFF)
|
|
|
|
{
|
|
|
|
LoadCompressedSpriteSheet(&sWirelessStatusIndicatorSpriteSheet);
|
|
|
|
}
|
|
|
|
LoadSpritePalette(&sWirelessStatusIndicatorSpritePalette);
|
|
|
|
gWirelessStatusIndicatorSpriteId = 0xFF;
|
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static u8 GetParentSignalStrength(void)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
u8 flags = gRfuLinkStatus->connSlotFlag;
|
2020-06-07 23:37:09 +02:00
|
|
|
for (i = 0; i < RFU_CHILD_MAX; i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
if (flags & 1)
|
|
|
|
{
|
|
|
|
return gRfuLinkStatus->strength[i];
|
|
|
|
}
|
|
|
|
flags >>= 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
static void SetWirelessStatusIndicatorAnim(struct Sprite *sprite, s32 animNum)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
if (sprite->sCurrAnimNum != animNum)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
sprite->sCurrAnimNum = animNum;
|
|
|
|
sprite->sFrameDelay = 0;
|
|
|
|
sprite->sFrameIdx = 0;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
void UpdateWirelessStatusIndicatorSprite(void)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
if (gWirelessStatusIndicatorSpriteId != 0xFF && gSprites[gWirelessStatusIndicatorSpriteId].sValidator == STATUS_INDICATOR_ACTIVE)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
struct Sprite *sprite = &gSprites[gWirelessStatusIndicatorSpriteId];
|
2020-06-07 23:37:09 +02:00
|
|
|
u8 signalStrength = RFU_LINK_ICON_LEVEL4_MAX;
|
2020-02-16 19:49:36 +01:00
|
|
|
u8 i = 0;
|
2020-06-07 23:37:09 +02:00
|
|
|
if (gRfuLinkStatus->parentChild == MODE_PARENT)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
for (i = 0; i < GetLinkPlayerCount() - 1; i++)
|
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
if (signalStrength >= GetConnectedChildStrength(i + 1))
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
signalStrength = GetConnectedChildStrength(i + 1);
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-06-07 23:37:09 +02:00
|
|
|
signalStrength = GetParentSignalStrength();
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
if (IsRfuRecoveringFromLinkLoss() == TRUE)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_ERROR;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
else if (signalStrength <= RFU_LINK_ICON_LEVEL1_MAX)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_SEARCHING;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
else if (signalStrength >= RFU_LINK_ICON_LEVEL2_MIN && signalStrength <= RFU_LINK_ICON_LEVEL2_MAX)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_1_BAR;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
else if (signalStrength >= RFU_LINK_ICON_LEVEL3_MIN && signalStrength <= RFU_LINK_ICON_LEVEL3_MAX)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_2_BARS;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
2020-06-07 23:37:09 +02:00
|
|
|
else if (signalStrength >= RFU_LINK_ICON_LEVEL4_MIN)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_3_BARS;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
2020-06-08 06:45:06 +02:00
|
|
|
if (sprite->sNextAnimNum != sprite->sSavedAnimNum)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
SetWirelessStatusIndicatorAnim(sprite, sprite->sNextAnimNum);
|
|
|
|
sprite->sSavedAnimNum = sprite->sNextAnimNum;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
2020-06-08 06:45:06 +02:00
|
|
|
if (sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].frame.duration < sprite->sFrameDelay)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
sprite->sFrameIdx++;
|
|
|
|
sprite->sFrameDelay = 0;
|
|
|
|
if (sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].type == -2)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
sprite->sFrameIdx = 0;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
sprite->sFrameDelay++;
|
2020-02-16 19:49:36 +01:00
|
|
|
}
|
|
|
|
gMain.oamBuffer[125] = sWirelessStatusIndicatorOamData;
|
|
|
|
gMain.oamBuffer[125].x = sprite->pos1.x + sprite->centerToCornerVecX;
|
|
|
|
gMain.oamBuffer[125].y = sprite->pos1.y + sprite->centerToCornerVecY;
|
|
|
|
gMain.oamBuffer[125].paletteNum = sprite->oam.paletteNum;
|
2020-06-08 06:45:06 +02:00
|
|
|
gMain.oamBuffer[125].tileNum = sprite->sTileStart + sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].frame.imageValue;
|
2020-02-16 19:49:36 +01:00
|
|
|
CpuCopy16(gMain.oamBuffer + 125, (struct OamData *)OAM + 125, sizeof(struct OamData));
|
2020-06-09 00:16:57 +02:00
|
|
|
if (RfuGetStatus() == RFU_STATUS_FATAL_ERROR)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
DestroyWirelessStatusIndicatorSprite();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
#undef sNextAnimNum
|
|
|
|
#undef sSavedAnimNum
|
|
|
|
#undef sCurrAnimNum
|
|
|
|
#undef sFrameDelay
|
|
|
|
#undef sFrameIdx
|
|
|
|
#undef sTileStart
|
|
|
|
#undef sValidator
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static void CopyTrainerRecord(struct TrainerNameRecord *dest, u32 trainerId, const u8 *name)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
dest->trainerId = trainerId;
|
|
|
|
StringCopy(dest->trainerName, name);
|
|
|
|
}
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
static bool32 NameIsNotEmpty(const u8 *name)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)
|
|
|
|
{
|
|
|
|
if (name[i] != 0)
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Save the currently connected players into the trainer records, shifting all previous records down.
|
|
|
|
void RecordMixTrainerNames(void)
|
|
|
|
{
|
|
|
|
if (gWirelessCommType != 0)
|
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
s32 i;
|
|
|
|
s32 j;
|
2020-02-16 19:49:36 +01:00
|
|
|
s32 nextSpace;
|
|
|
|
s32 connectedTrainerRecordIndices[5];
|
2020-06-08 06:45:06 +02:00
|
|
|
struct TrainerNameRecord *newRecords = calloc(ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords), sizeof(struct TrainerNameRecord));
|
2020-02-16 19:49:36 +01:00
|
|
|
|
|
|
|
// Check if we already have a record saved for connected trainers.
|
|
|
|
for (i = 0; i < GetLinkPlayerCount(); i++)
|
|
|
|
{
|
|
|
|
connectedTrainerRecordIndices[i] = -1;
|
2020-06-07 23:37:09 +02:00
|
|
|
for (j = 0; j < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); j++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
if ((u16)gLinkPlayers[i].trainerId == gSaveBlock1Ptr->trainerNameRecords[j].trainerId && StringCompare(gLinkPlayers[i].name, gSaveBlock1Ptr->trainerNameRecords[j].trainerName) == 0)
|
|
|
|
{
|
|
|
|
connectedTrainerRecordIndices[i] = j;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Save the connected trainers first, at the top of the list.
|
|
|
|
nextSpace = 0;
|
|
|
|
for (i = 0; i < GetLinkPlayerCount(); i++)
|
|
|
|
{
|
|
|
|
if (i != GetMultiplayerId() && gLinkPlayers[i].language != LANGUAGE_JAPANESE)
|
|
|
|
{
|
|
|
|
CopyTrainerRecord(&newRecords[nextSpace], (u16)gLinkPlayers[i].trainerId, gLinkPlayers[i].name);
|
|
|
|
|
|
|
|
// If we already had a record for this trainer, wipe it so that the next step doesn't duplicate it.
|
|
|
|
if (connectedTrainerRecordIndices[i] >= 0)
|
|
|
|
{
|
|
|
|
memset(gSaveBlock1Ptr->trainerNameRecords[connectedTrainerRecordIndices[i]].trainerName, 0, 8);
|
|
|
|
}
|
|
|
|
nextSpace++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Copy all non-empty records to the new list, in the order they appear on the old list. If the list is full,
|
|
|
|
// the last (oldest) records will be dropped.
|
2020-06-07 23:37:09 +02:00
|
|
|
for (i = 0; i < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
if (NameIsNotEmpty(gSaveBlock1Ptr->trainerNameRecords[i].trainerName))
|
|
|
|
{
|
|
|
|
CopyTrainerRecord(&newRecords[nextSpace], gSaveBlock1Ptr->trainerNameRecords[i].trainerId, gSaveBlock1Ptr->trainerNameRecords[i].trainerName);
|
2020-06-07 23:37:09 +02:00
|
|
|
if (++nextSpace >= (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords))
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Finalize the new list, and clean up.
|
2020-06-07 23:37:09 +02:00
|
|
|
memcpy(gSaveBlock1Ptr->trainerNameRecords, newRecords, sizeof(gSaveBlock1Ptr->trainerNameRecords));
|
2020-02-16 19:49:36 +01:00
|
|
|
free(newRecords);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-30 10:09:21 +02:00
|
|
|
bool32 PlayerHasMetTrainerBefore(u16 id, u8 *name)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
for (i = 0; i < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
if (StringCompare(gSaveBlock1Ptr->trainerNameRecords[i].trainerName, name) == 0 && gSaveBlock1Ptr->trainerNameRecords[i].trainerId == id)
|
|
|
|
return TRUE;
|
2020-06-07 23:37:09 +02:00
|
|
|
|
2020-02-16 19:49:36 +01:00
|
|
|
if (!NameIsNotEmpty(gSaveBlock1Ptr->trainerNameRecords[i].trainerName))
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void WipeTrainerNameRecords(void)
|
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
2020-06-07 23:37:09 +02:00
|
|
|
for (i = 0; i < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); i++)
|
2020-02-16 19:49:36 +01:00
|
|
|
{
|
|
|
|
gSaveBlock1Ptr->trainerNameRecords[i].trainerId = 0;
|
|
|
|
CpuFill16(0, gSaveBlock1Ptr->trainerNameRecords[i].trainerName, 8);
|
|
|
|
}
|
|
|
|
}
|