feat(hotkey+KeyBoard): add TriggerWhenDoublePressedSkill

This commit is contained in:
AkiChase 2024-05-05 19:24:50 +08:00
parent 23c6593d44
commit 1385477bfe
4 changed files with 163 additions and 4 deletions

View File

@ -292,7 +292,9 @@ onBeforeRouteLeave(() => {
v-else-if="
store.editKeyMappingList[index].type === 'DirectionalSkill' ||
store.editKeyMappingList[index].type === 'DirectionlessSkill' ||
store.editKeyMappingList[index].type === 'TriggerWhenPressedSkill'
store.editKeyMappingList[index].type === 'TriggerWhenPressedSkill' ||
store.editKeyMappingList[index].type ===
'TriggerWhenDoublePressedSkill'
"
:index="index"
/>

View File

@ -85,21 +85,32 @@ const isTriggerWhenPressed = computed(
() => keyMapping.value.type === "TriggerWhenPressedSkill"
);
const isTriggerWhenDoublePressed = computed(
() => keyMapping.value.type === "TriggerWhenDoublePressedSkill"
);
function changeSkillType(flag: string) {
// the design of skill keymapping type is not good
const t = keyMapping.value.type;
if (flag === "direction") {
keyboardStore.edited = true;
if (t === "DirectionalSkill") {
// to DirectionlessSkill
delete (keyMapping.value as any).range;
keyMapping.value.type = "DirectionlessSkill";
} else if (t === "DirectionlessSkill") {
// to DirectionalSkill
(keyMapping.value as any).range = 0;
keyMapping.value.type = "DirectionalSkill";
} else {
} else if (t === "TriggerWhenPressedSkill") {
// change directional flag
const k = keyMapping.value as KeyTriggerWhenPressedSkill;
k.directional = !k.directional;
k.rangeOrTime = k.directional ? 0 : 80;
} else if (t === "TriggerWhenDoublePressedSkill") {
// to DirectionlessSkill
delete (keyMapping.value as any).range;
keyMapping.value.type = "DirectionlessSkill";
}
} else if (flag === "trigger") {
keyboardStore.edited = true;
@ -114,7 +125,8 @@ function changeSkillType(flag: string) {
k.directional = false;
k.rangeOrTime = 80; // touch time
k.type = "TriggerWhenPressedSkill";
} else {
} else if (t === "TriggerWhenPressedSkill") {
// to DirectionalSkill or DirectionlessSkill
const k = keyMapping.value as any;
if (k.directional) {
k.range = k.rangeOrTime;
@ -125,6 +137,35 @@ function changeSkillType(flag: string) {
k.type = "DirectionlessSkill";
}
delete k.directional;
} else if (t === "TriggerWhenDoublePressedSkill") {
// to TriggerWhenPressedSkill && directional
const k = keyMapping.value as any;
k.directional = true;
k.rangeOrTime = k.range;
delete k.range;
k.type = "TriggerWhenPressedSkill";
}
} else if (flag === "trigger-double") {
keyboardStore.edited = true;
if (t === "DirectionalSkill") {
// to TriggerWhenDoublePressedSkill
const k = keyMapping.value as any;
k.type = "TriggerWhenDoublePressedSkill";
} else if (t === "DirectionlessSkill") {
// to TriggerWhenDoublePressedSkill
const k = keyMapping.value as any;
k.range = 0;
k.type = "TriggerWhenDoublePressedSkill";
} else if (t === "TriggerWhenPressedSkill") {
// to TriggerWhenDoublePressedSkill
const k = keyMapping.value as any;
k.range = k.directional ? k.rangeOrTime : 0;
delete k.rangeOrTime;
k.type = "TriggerWhenDoublePressedSkill";
} else if (t === "TriggerWhenDoublePressedSkill") {
// to DirectionalSkill
const k = keyMapping.value as any;
k.type = "DirectionalSkill";
}
}
}
@ -216,6 +257,11 @@ function updateRangeIndicator(element?: HTMLElement) {
<NH4 prefix="bar">技能</NH4>
<NFormItem label="选项">
<NFlex vertical>
<NCheckbox
@click="changeSkillType('trigger-double')"
:checked="isTriggerWhenDoublePressed"
>双击施放</NCheckbox
>
<NCheckbox
@click="changeSkillType('direction')"
:checked="isDirectionless"
@ -230,7 +276,10 @@ function updateRangeIndicator(element?: HTMLElement) {
</NFormItem>
<NFormItem v-if="!isDirectionless" label="范围">
<NInputNumber
v-if="keyMapping.type === 'DirectionalSkill'"
v-if="
keyMapping.type === 'DirectionalSkill' ||
'TriggerWhenDoublePressedSkill'
"
v-model:value="(keyMapping as KeyDirectionalSkill).range"
placeholder="请输入技能范围"
:min="0"

View File

@ -15,6 +15,7 @@ import {
KeyObservation,
KeySteeringWheel,
KeyTap,
KeyTriggerWhenDoublePressedSkill,
KeyTriggerWhenPressedSkill,
} from "./keyMappingConfig";
@ -336,6 +337,94 @@ function addTriggerWhenPressedSkillShortcuts(
}
}
function addTriggerWhenDoublePressedSkillShortcuts(
key: string,
relativeSize: { w: number; h: number },
// pos relative to the device
posX: number,
posY: number,
range: number,
pointerId: number
) {
posX = Math.round((posX / relativeSize.w) * screenSizeW);
posY = Math.round((posY / relativeSize.h) * screenSizeH);
let curKeyDownFlag = false;
addShortcut(
key,
// down
async () => {
if (curKeyDownFlag === false) {
// first press: touch down
const skillOffset = clientPosToSkillOffset(
{ x: mouseX, y: mouseY },
range
);
await swipe({
action: SwipeAction.NoUp,
pointerId,
screen: {
w: screenSizeW,
h: screenSizeH,
},
pos: [
{ x: posX, y: posY },
{
x: posX + skillOffset.offsetX,
y: posY + skillOffset.offsetY,
},
],
intervalBetweenPos: 0,
});
// set the flag to true
curKeyDownFlag = true;
// add loop CB
loopDownKeyCBMap.set(key, async () => {
const loopSkillOffset = clientPosToSkillOffset(
{ x: mouseX, y: mouseY },
range
);
await touch({
action: TouchAction.Move,
pointerId,
screen: {
w: screenSizeW,
h: screenSizeH,
},
pos: {
x: posX + loopSkillOffset.offsetX,
y: posY + loopSkillOffset.offsetY,
},
});
});
} else {
// second press: touch up
// delete the loop CB
loopDownKeyCBMap.delete(key);
const skillOffset = clientPosToSkillOffset(
{ x: mouseX, y: mouseY },
range
);
await touch({
action: TouchAction.Up,
pointerId,
screen: {
w: screenSizeW,
h: screenSizeH,
},
pos: {
x: posX + skillOffset.offsetX,
y: posY + skillOffset.offsetY,
},
});
// set the flag to false
curKeyDownFlag = false;
}
},
undefined,
undefined
);
}
// add shortcuts for directionless skill (cancelable)
function addDirectionlessSkillShortcuts(
key: string,
@ -1018,6 +1107,17 @@ function applyKeyMappingConfigShortcuts(
item.pointerId
);
break;
case "TriggerWhenDoublePressedSkill":
asType<KeyTriggerWhenDoublePressedSkill>(item);
addTriggerWhenDoublePressedSkillShortcuts(
item.key,
relativeSize,
item.posX,
item.posY,
item.range,
item.pointerId
);
break;
case "Observation":
asType<KeyObservation>(item);
addObservationShortcuts(

View File

@ -6,6 +6,7 @@ interface Key {
| "CancelSkill"
| "Tap"
| "TriggerWhenPressedSkill"
| "TriggerWhenDoublePressedSkill"
| "Observation"
| "Macro";
note: string;
@ -43,6 +44,11 @@ interface KeyTriggerWhenPressedSkill extends Key {
rangeOrTime: number;
}
interface KeyTriggerWhenDoublePressedSkill extends Key {
key: string;
range: number;
}
interface KeyObservation extends Key {
key: string;
scale: number;
@ -74,6 +80,7 @@ type KeyMapping =
| KeyDirectionalSkill
| KeyDirectionlessSkill
| KeyTriggerWhenPressedSkill
| KeyTriggerWhenDoublePressedSkill
| KeyObservation
| KeyMacro
| KeyCancelSkill
@ -93,6 +100,7 @@ export type {
KeyCancelSkill,
KeyTap,
KeyTriggerWhenPressedSkill,
KeyTriggerWhenDoublePressedSkill,
KeyObservation,
KeyMacro,
KeyMapping,