尝试修复一个模拟长按的问题:

条件:互换L/R的映射 + 模拟长按绑定游戏内L,启用后,按L会激发而不是R,但是L和R互换了,应该是R激发
This commit is contained in:
anod 2023-05-04 14:23:51 +08:00
parent 29d74ba72c
commit 72fdff8858

View File

@ -7,7 +7,8 @@
key_remix_t g_keyremixConfig[KEY_REMIX_LIMIT]; key_remix_t g_keyremixConfig[KEY_REMIX_LIMIT];
static key_remix_t *frozen_start, *frozen_end; static key_remix_t *frozen_start, *frozen_end;
static phykey_t prev_status = 0; static phykey_t prev_phykey = 0;
static conkey_t prev_conkey = 0;
static conkey_t blind_conkey; static conkey_t blind_conkey;
static u16 flags_holding = 0; static u16 flags_holding = 0;
@ -29,9 +30,11 @@ uint16_t keyremix_cheatkey()
void keyremix_freeze() void keyremix_freeze()
{ {
// 空白选项忽略填充blind_conkey金手指放首位 // 空白选项忽略填充blind_conkey金手指放首位REMAP紧跟金手指HOLD在后面
key_remix_t temp[KEY_REMIX_LIMIT+1]; key_remix_t temp[KEY_REMIX_LIMIT+1];
int j=1, has_cheat=0;
// 第一次循环扫描得到各remix_type数量用于定位在数组的位置
int has_cheat=0, rem_count=0, valid_count=0;
blind_conkey = 0; blind_conkey = 0;
for( int i=0; i < KEY_REMIX_LIMIT; ++i ) for( int i=0; i < KEY_REMIX_LIMIT; ++i )
{ {
@ -44,42 +47,62 @@ void keyremix_freeze()
has_cheat = 1; has_cheat = 1;
} }
else if( p->remix_type != REMIX_TYPE_NONE else if( p->remix_type != REMIX_TYPE_NONE
&& p->device_keys != 0
&& p->game_keys != 0 )
{
valid_count++;
if( p->remix_type == REMIX_TYPE_REMAP ) rem_count++;
if( p->device_keys & CON_KEY_MASK )
blind_conkey |= p->device_keys;
}
}
// 第二次循环根据remix_type放置到数组特定位置
int j=has_cheat;
int k=j+rem_count;
for( int i=0; i < KEY_REMIX_LIMIT; ++i )
{
key_remix_t *p = &g_keyremixConfig[i];
if( p->remix_type == REMIX_TYPE_CHEAT )
{
continue;
}
else if( p->remix_type == REMIX_TYPE_REMAP
&& p->device_keys != 0 && p->device_keys != 0
&& p->game_keys != 0 ) && p->game_keys != 0 )
{ {
temp[j].remix_type = p->remix_type; temp[j].remix_type = p->remix_type;
temp[j].device_keys = p->device_keys; temp[j].device_keys = p->device_keys;
temp[j].game_keys = p->game_keys; temp[j].game_keys = p->game_keys;
if( p->device_keys & CON_KEY_MASK )
blind_conkey |= p->device_keys;
++j; ++j;
} }
else if( p->remix_type == REMIX_TYPE_HOLD
&& p->device_keys != 0
&& p->game_keys != 0 )
{
temp[k].remix_type = p->remix_type;
temp[k].device_keys = p->device_keys;
temp[k].game_keys = p->game_keys;
++k;
}
} }
memset( g_keyremixConfig, 0, sizeof(g_keyremixConfig) ); memcpy( g_keyremixConfig, temp, sizeof(g_keyremixConfig) );
if( has_cheat ) frozen_start = &g_keyremixConfig[has_cheat];
{ frozen_end = &g_keyremixConfig[has_cheat+valid_count];
memcpy( g_keyremixConfig, temp, sizeof(key_remix_t)*j );
frozen_start = &g_keyremixConfig[1];
frozen_end = &g_keyremixConfig[j];
}
else
{
memcpy( g_keyremixConfig, &temp[1], sizeof(key_remix_t)*(j-1) );
frozen_start = &g_keyremixConfig[0];
frozen_end = &g_keyremixConfig[j-1];
}
} }
void keyremix_update( uint16_t active_cheatkey ) void keyremix_update( uint16_t active_cheatkey )
{ {
phykey_t now = hidKeysHeld(); phykey_t now = hidKeysHeld();
conkey_t cur = 0;
u8 init_cur = 0;
vu16 *hid_set = (vu16*)0x10141112; vu16 *hid_set = (vu16*)0x10141112;
vu16 *hid_mode = (vu16*)0x10141110; vu16 *hid_mode = (vu16*)0x10141110;
if( hidGetExtraKeys(0) & KEY_HOME ) if( hidGetExtraKeys(0) & KEY_HOME )
now |= VKEY_HOME; now |= VKEY_HOME;
if( active_cheatkey && now_release(now, prev_status, VKEY_HOME) ) if( active_cheatkey && now_release(now, prev_phykey, VKEY_HOME) )
{ {
*hid_mode = active_cheatkey; *hid_mode = active_cheatkey;
*hid_set = ~active_cheatkey; *hid_set = ~active_cheatkey;
@ -111,15 +134,20 @@ void keyremix_update( uint16_t active_cheatkey )
} }
else if( p->remix_type == REMIX_TYPE_HOLD ) else if( p->remix_type == REMIX_TYPE_HOLD )
{ {
if( init_cur == 0 )
{
init_cur = 1;
cur = res;
}
uint16_t flag = 1<<holding_pos++; uint16_t flag = 1<<holding_pos++;
uint16_t oldf = flags_holding; uint16_t oldf = flags_holding;
if( now_release(now, prev_status, p->device_keys) ) if( now_release(now, prev_phykey, p->device_keys) )
flags_holding ^= flag; flags_holding ^= flag;
if( flags_holding & flag ) if( flags_holding & flag )
{ {
// exclude console keys is up // exclude console keys is up
res |= now_release(now, prev_status, p->game_keys) ^ p->game_keys; res |= now_release(cur, prev_conkey, p->game_keys) ^ p->game_keys;
} }
else if( oldf != flags_holding )// release else if( oldf != flags_holding )// release
{ {
@ -130,7 +158,8 @@ void keyremix_update( uint16_t active_cheatkey )
*hid_mode = CON_KEY_MASK; *hid_mode = CON_KEY_MASK;
*hid_set = ~res; *hid_set = ~res;
} }
prev_status = now; prev_phykey = now;
prev_conkey = cur;
} }
const char* keyremix_load( const char *file ) const char* keyremix_load( const char *file )