mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-22 10:42:36 +01:00
sys_usbd: Better Dimensions Move Handling
This commit is contained in:
parent
6d766ccbb5
commit
73cee9a43d
@ -259,9 +259,9 @@ dimensions_figure& dimensions_toypad::get_figure_by_index(u8 index)
|
|||||||
void dimensions_toypad::random_uid(u8* uid_buffer)
|
void dimensions_toypad::random_uid(u8* uid_buffer)
|
||||||
{
|
{
|
||||||
uid_buffer[0] = 0x04;
|
uid_buffer[0] = 0x04;
|
||||||
uid_buffer[6] = 0x80;
|
uid_buffer[7] = 0x80;
|
||||||
|
|
||||||
for (u8 i = 1; i < 6; i++)
|
for (u8 i = 1; i < 7; i++)
|
||||||
{
|
{
|
||||||
u8 random = rand() % 255;
|
u8 random = rand() % 255;
|
||||||
uid_buffer[i] = random;
|
uid_buffer[i] = random;
|
||||||
@ -384,10 +384,10 @@ u32 dimensions_toypad::load_figure(const std::array<u8, 0x2D * 0x04>& buf, fs::f
|
|||||||
std::memcpy(figure.data.data(), buf.data(), buf.size());
|
std::memcpy(figure.data.data(), buf.data(), buf.size());
|
||||||
// When a figure is added to the toypad, respond to the game with the pad they were added to, their index,
|
// When a figure is added to the toypad, respond to the game with the pad they were added to, their index,
|
||||||
// the direction (0x00 in byte 6 for added) and their UID
|
// the direction (0x00 in byte 6 for added) and their UID
|
||||||
std::array<u8, 32> figure_change_response = {0x56, 0x0b, figure.pad, 0x00, figure.index, 0x00};
|
std::array<u8, 32> figure_change_response = {0x56, 0x0b, figure.pad, 0x00, figure.index, 0x00,
|
||||||
std::memcpy(&figure_change_response[6], buf.data(), 7);
|
buf[0], buf[1], buf[2], buf[4], buf[5], buf[6], buf[7]};
|
||||||
figure_change_response[13] = generate_checksum(figure_change_response, 13);
|
figure_change_response[13] = generate_checksum(figure_change_response, 13);
|
||||||
m_figure_added_removed_responses.push(figure_change_response);
|
m_figure_added_removed_responses.push(std::move(figure_change_response));
|
||||||
|
|
||||||
if (lock)
|
if (lock)
|
||||||
{
|
{
|
||||||
@ -396,7 +396,7 @@ u32 dimensions_toypad::load_figure(const std::array<u8, 0x2D * 0x04>& buf, fs::f
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dimensions_toypad::remove_figure(u8 pad, u8 index, bool save, bool lock)
|
bool dimensions_toypad::remove_figure(u8 pad, u8 index, bool full_remove, bool lock)
|
||||||
{
|
{
|
||||||
dimensions_figure& figure = get_figure_by_index(index);
|
dimensions_figure& figure = get_figure_by_index(index);
|
||||||
if (figure.index == 255)
|
if (figure.index == 255)
|
||||||
@ -411,17 +411,20 @@ bool dimensions_toypad::remove_figure(u8 pad, u8 index, bool save, bool lock)
|
|||||||
|
|
||||||
// When a figure is removed from the toypad, respond to the game with the pad they were removed from, their index,
|
// When a figure is removed from the toypad, respond to the game with the pad they were removed from, their index,
|
||||||
// the direction (0x01 in byte 6 for removed) and their UID
|
// the direction (0x01 in byte 6 for removed) and their UID
|
||||||
std::array<u8, 32> figure_change_response = {0x56, 0x0b, pad, 0x00, figure.index, 0x01};
|
if (full_remove)
|
||||||
std::memcpy(&figure_change_response[6], figure.data.data(), 7);
|
|
||||||
if (save)
|
|
||||||
{
|
{
|
||||||
|
std::array<u8, 32> figure_change_response = {0x56, 0x0b, pad, 0x00, figure.index, 0x01,
|
||||||
|
figure.data[0], figure.data[1], figure.data[2],
|
||||||
|
figure.data[4], figure.data[5], figure.data[6], figure.data[7]};
|
||||||
|
figure_change_response[13] = generate_checksum(figure_change_response, 13);
|
||||||
|
m_figure_added_removed_responses.push(std::move(figure_change_response));
|
||||||
figure.save();
|
figure.save();
|
||||||
figure.dim_file.close();
|
figure.dim_file.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
figure.index = 255;
|
figure.index = 255;
|
||||||
figure.pad = 255;
|
figure.pad = 255;
|
||||||
figure_change_response[13] = generate_checksum(figure_change_response, 13);
|
figure.id = 0;
|
||||||
m_figure_added_removed_responses.push(figure_change_response);
|
|
||||||
|
|
||||||
if (lock)
|
if (lock)
|
||||||
{
|
{
|
||||||
@ -430,23 +433,56 @@ bool dimensions_toypad::remove_figure(u8 pad, u8 index, bool save, bool lock)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dimensions_toypad::move_figure(u8 pad, u8 index, u8 old_pad, u8 old_index)
|
bool dimensions_toypad::temp_remove(u8 index)
|
||||||
{
|
{
|
||||||
std::lock_guard lock(m_dimensions_mutex);
|
std::lock_guard lock(m_dimensions_mutex);
|
||||||
|
|
||||||
|
const dimensions_figure& figure = get_figure_by_index(index);
|
||||||
|
if (figure.index == 255)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Send a response to the game that the figure has been "Picked up" from existing slot,
|
||||||
|
// until either the movement is cancelled, or user chooses a space to move to
|
||||||
|
std::array<u8, 32> figure_change_response = {0x56, 0x0b, figure.pad, 0x00, figure.index, 0x01,
|
||||||
|
figure.data[0], figure.data[1], figure.data[2],
|
||||||
|
figure.data[4], figure.data[5], figure.data[6], figure.data[7]};
|
||||||
|
|
||||||
|
figure_change_response[13] = generate_checksum(figure_change_response, 13);
|
||||||
|
m_figure_added_removed_responses.push(std::move(figure_change_response));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dimensions_toypad::cancel_remove(u8 index)
|
||||||
|
{
|
||||||
|
std::lock_guard lock(m_dimensions_mutex);
|
||||||
|
|
||||||
|
dimensions_figure& figure = get_figure_by_index(index);
|
||||||
|
if (figure.index == 255)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Cancel the previous movement of the figure
|
||||||
|
std::array<u8, 32> figure_change_response = {0x56, 0x0b, figure.pad, 0x00, figure.index, 0x00,
|
||||||
|
figure.data[0], figure.data[1], figure.data[2],
|
||||||
|
figure.data[4], figure.data[5], figure.data[6], figure.data[7]};
|
||||||
|
|
||||||
|
figure_change_response[13] = generate_checksum(figure_change_response, 13);
|
||||||
|
m_figure_added_removed_responses.push(std::move(figure_change_response));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dimensions_toypad::move_figure(u8 pad, u8 index, u8 old_pad, u8 old_index)
|
||||||
|
{
|
||||||
if (old_index == index)
|
if (old_index == index)
|
||||||
{
|
{
|
||||||
// Don't bother removing and loading again, just send response to the game
|
// Don't bother removing and loading again, just send response to the game
|
||||||
const dimensions_figure& figure = get_figure_by_index(old_index);
|
cancel_remove(index);
|
||||||
std::array<u8, 32> figure_remove_response = {0x56, 0x0b, pad, 0x00, figure.index, 0x01};
|
|
||||||
figure_remove_response[13] = generate_checksum(figure_remove_response, 13);
|
|
||||||
std::array<u8, 32> figure_add_response = {0x56, 0x0b, pad, 0x00, figure.index, 0x00};
|
|
||||||
figure_add_response[13] = generate_checksum(figure_add_response, 13);
|
|
||||||
m_figure_added_removed_responses.push(std::move(figure_remove_response));
|
|
||||||
m_figure_added_removed_responses.push(std::move(figure_add_response));
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::lock_guard lock(m_dimensions_mutex);
|
||||||
|
|
||||||
// When moving figures between spaces on the toypad, remove any figure from the space they are moving to,
|
// When moving figures between spaces on the toypad, remove any figure from the space they are moving to,
|
||||||
// then remove them from their current space, then load them to the space they are moving to
|
// then remove them from their current space, then load them to the space they are moving to
|
||||||
remove_figure(pad, index, true, false);
|
remove_figure(pad, index, true, false);
|
||||||
@ -465,14 +501,16 @@ bool dimensions_toypad::move_figure(u8 pad, u8 index, u8 old_pad, u8 old_index)
|
|||||||
bool dimensions_toypad::create_blank_character(std::array<u8, 0x2D * 0x04>& buf, u16 id)
|
bool dimensions_toypad::create_blank_character(std::array<u8, 0x2D * 0x04>& buf, u16 id)
|
||||||
{
|
{
|
||||||
random_uid(buf.data());
|
random_uid(buf.data());
|
||||||
buf[7] = id & 0xFF;
|
buf[3] = id & 0xFF;
|
||||||
std::array<u8, 7> uid = {buf[0], buf[1], buf[2], buf[4], buf[5], buf[6], buf[7]};
|
|
||||||
|
|
||||||
// Only characters are created with their ID encrypted and stored in pages 36 and 37,
|
// Only characters are created with their ID encrypted and stored in pages 36 and 37,
|
||||||
// as well as a password stored in page 43. Blank tags have their information populated
|
// as well as a password stored in page 43. Blank tags have their information populated
|
||||||
// by the game when it calls the write_block command.
|
// by the game when it calls the write_block command.
|
||||||
if (id != 0)
|
if (id != 0)
|
||||||
{
|
{
|
||||||
|
// LEGO Dimensions figures use NTAG213 tag types, and the UID for these is stored in
|
||||||
|
// bytes 0, 1, 2, 4, 5, 6 and 7 (out of 180 bytes)
|
||||||
|
std::array<u8, 7> uid = {buf[0], buf[1], buf[2], buf[4], buf[5], buf[6], buf[7]};
|
||||||
const std::array<u8, 16> figure_key = generate_figure_key(buf);
|
const std::array<u8, 16> figure_key = generate_figure_key(buf);
|
||||||
|
|
||||||
std::array<u8, 8> value_to_encrypt = {};
|
std::array<u8, 8> value_to_encrypt = {};
|
||||||
|
@ -30,7 +30,9 @@ public:
|
|||||||
void get_model(const u8* buf, u8 sequence, std::array<u8, 32>& reply_buf);
|
void get_model(const u8* buf, u8 sequence, std::array<u8, 32>& reply_buf);
|
||||||
std::optional<std::array<u8, 32>> pop_added_removed_response();
|
std::optional<std::array<u8, 32>> pop_added_removed_response();
|
||||||
|
|
||||||
bool remove_figure(u8 pad, u8 index, bool save, bool lock);
|
bool remove_figure(u8 pad, u8 index, bool full_remove, bool lock);
|
||||||
|
bool temp_remove(u8 index);
|
||||||
|
bool cancel_remove(u8 index);
|
||||||
u32 load_figure(const std::array<u8, 0x2D * 0x04>& buf, fs::file in_file, u8 pad, u8 index, bool lock);
|
u32 load_figure(const std::array<u8, 0x2D * 0x04>& buf, fs::file in_file, u8 pad, u8 index, bool lock);
|
||||||
bool move_figure(u8 pad, u8 index, u8 old_pad, u8 old_index);
|
bool move_figure(u8 pad, u8 index, u8 old_pad, u8 old_index);
|
||||||
static bool create_blank_character(std::array<u8, 0x2D * 0x04>& buf, u16 id);
|
static bool create_blank_character(std::array<u8, 0x2D * 0x04>& buf, u16 id);
|
||||||
|
@ -724,6 +724,7 @@ void dimensions_dialog::move_figure(u8 pad, u8 index)
|
|||||||
{
|
{
|
||||||
ensure(index < figure_slots.size());
|
ensure(index < figure_slots.size());
|
||||||
minifig_move_dialog move_dlg(this, index);
|
minifig_move_dialog move_dlg(this, index);
|
||||||
|
g_dimensionstoypad.temp_remove(index);
|
||||||
if (move_dlg.exec() == Accepted)
|
if (move_dlg.exec() == Accepted)
|
||||||
{
|
{
|
||||||
g_dimensionstoypad.move_figure(move_dlg.get_new_pad(), move_dlg.get_new_index(), pad, index);
|
g_dimensionstoypad.move_figure(move_dlg.get_new_pad(), move_dlg.get_new_index(), pad, index);
|
||||||
@ -735,6 +736,10 @@ void dimensions_dialog::move_figure(u8 pad, u8 index)
|
|||||||
m_edit_figures[index]->setText(tr("None"));
|
m_edit_figures[index]->setText(tr("None"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_dimensionstoypad.cancel_remove(index);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dimensions_dialog::load_figure_path(u8 pad, u8 index, const QString& path)
|
void dimensions_dialog::load_figure_path(u8 pad, u8 index, const QString& path)
|
||||||
|
Loading…
Reference in New Issue
Block a user