定点查看

This commit is contained in:
unanmed 2023-01-06 22:18:33 +08:00
parent ac55517d57
commit 36cf6150e4
10 changed files with 118 additions and 17 deletions

View File

@ -1247,6 +1247,14 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = {
case 72: // H打开帮助页面
core.useItem('I560', true);
break;
case 75: // J定点查看
if (
core.getBlockCls(...flags.mouseLoc)?.startsWith('enemy')
) {
core.plugin.showFixed.value = false;
core.plugin.fixedDetailOpened.value = true;
}
break;
case 77: // M快速标记
const [x, y] = flags.mouseLoc;
const mx = Math.round(x + core.bigmap.offsetX / 32);

View File

@ -92,6 +92,10 @@ import { has, setCanvasSize } from '../plugin/utils';
import { debounce } from 'lodash';
import { isMobile } from '../plugin/use';
const props = defineProps<{
fromBook?: boolean;
}>();
const critical = ref<HTMLCanvasElement>();
const def = ref<HTMLCanvasElement>();
@ -173,15 +177,20 @@ function generateData(data: [number, number][]): ChartConfiguration['data'] {
}
const update = debounce((atk: Chart, def: Chart) => {
const [x, y] = props.fromBook ? [void 0, void 0] : flags.mouseLoc;
allCri.value = getCriticalDamage(
enemy,
addAtk.value * ratio,
addDef.value * ratio
addDef.value * ratio,
x,
y
);
allDef.value = getDefDamage(
enemy,
addDef.value * ratio,
addAtk.value * ratio
addAtk.value * ratio,
x,
y
);
if (allCri.value.length > originCri.length) originCri = allCri.value;
if (allDef.value.length > originDef.length) originDef = allDef.value;

View File

@ -48,7 +48,10 @@ export function getSpecialHint(enemy: Enemy & DetailedEnemy) {
export function getDefDamage(
enemy: DetailedEnemy,
addDef: number = 0,
addAtk: number = 0
addAtk: number = 0,
x?: number,
y?: number,
floorId?: FloorIds
) {
const ratio = core.status.thisMap.ratio;
const res: [number, number][] = [];
@ -59,10 +62,16 @@ export function getDefDamage(
const max = 100 - Math.floor(addDef / ratio);
for (let i = 0; i <= max; i++) {
const dam = core.getDamageInfo(enemy.id, {
def: core.getStatus('def') + ratio * i + addDef,
atk: core.getStatus('atk') + addAtk
});
const dam = core.getDamageInfo(
enemy.id,
{
def: core.getStatus('def') + ratio * i + addDef,
atk: core.getStatus('atk') + addAtk
},
x,
y,
floorId
);
if (res.length === 0) {
origin = dam?.damage;
@ -88,7 +97,10 @@ export function getDefDamage(
export function getCriticalDamage(
enemy: DetailedEnemy,
addAtk: number = 0,
addDef: number = 0
addDef: number = 0,
x?: number,
y?: number,
floorId?: FloorIds
): [number, number][] {
const ratio = core.status.thisMap.ratio;
const res: [number, number][] = [];
@ -99,10 +111,16 @@ export function getCriticalDamage(
const max = 100 - Math.floor(addAtk / ratio);
for (let i = 0; i <= max; i++) {
const dam = core.getDamageInfo(enemy.id, {
atk: core.getStatus('atk') + ratio * i + addAtk,
def: core.getStatus('def') + addDef
});
const dam = core.getDamageInfo(
enemy.id,
{
atk: core.getStatus('atk') + ratio * i + addAtk,
def: core.getStatus('def') + addDef
},
x,
y,
floorId
);
if (res.length === 0) {
origin = dam?.damage;

View File

@ -23,6 +23,10 @@ export default function init() {
showFixed.value = false;
show(ev);
});
return {
showFixed
};
}
export function getDetailedEnemy<I extends EnemyIds>(

View File

@ -8,6 +8,7 @@ import Desc from '../ui/desc.vue';
import Skill from '../ui/skill.vue';
import SkillTree from '../ui/skillTree.vue';
import Fly from '../ui/fly.vue';
import FixedDetail from '../ui/fixedDetail.vue';
export const bookOpened = ref(false);
export const toolOpened = ref(false);
@ -19,6 +20,7 @@ export const skillOpened = ref(false);
export const skillTreeOpened = ref(false);
export const flyOpened = ref(false);
export const showStudiedSkill = ref(false);
export const fixedDetailOpened = ref(false);
export const transition = ref(true);
export const noClosePanel = ref(false);
@ -34,7 +36,8 @@ const UI_LIST: [Ref<boolean>, Component][] = [
[descOpened, Desc],
[skillOpened, Skill],
[skillTreeOpened, SkillTree],
[flyOpened, Fly]
[flyOpened, Fly],
[fixedDetailOpened, FixedDetail]
];
/** ui栈 */
@ -69,7 +72,8 @@ export default function init() {
skillOpened,
skillTreeOpened,
flyOpened,
showStudiedSkill
showStudiedSkill,
fixedDetailOpened
};
}

View File

@ -178,6 +178,12 @@ interface PluginUis {
/** 是否展示已学习的技能 */
readonly showStudiedSkill: Ref<boolean>;
/** 定点查看是否打开 */
readonly fixedDetailOpened: Ref<boolean>;
/** 是否展示移动鼠标显示怪物信息的盒子 */
readonly showFixed: Ref<boolean>;
/** ui栈 */
readonly uiStack: Ref<Component[]>;

View File

@ -30,7 +30,11 @@
</div>
</Scroll>
</div>
<BookDetail v-if="detail" @close="closeDetail()"></BookDetail>
<BookDetail
v-if="detail"
:from-book="true"
@close="closeDetail()"
></BookDetail>
</template>
<script setup lang="tsx">

View File

@ -10,7 +10,10 @@
</div>
<Transition name="detail">
<EnemySpecial v-if="panel === 'special'"></EnemySpecial>
<EnemyCritical v-else-if="panel === 'critical'"></EnemyCritical>
<EnemyCritical
:from-book="fromBook"
v-else-if="panel === 'critical'"
></EnemyCritical>
<EnemyTarget v-else-if="panel === 'target'"></EnemyTarget>
</Transition>
<div id="detail-more">
@ -81,6 +84,10 @@ const panel = ref('special');
let detail: HTMLDivElement;
const props = defineProps<{
fromBook?: boolean;
}>();
const emits = defineEmits<{
(e: 'close'): void;
}>();
@ -97,9 +104,15 @@ function close() {
}
function key(e: KeyboardEvent) {
if (keycode(e.keyCode) === KeyCode.Enter) {
const c = keycode(e.keyCode);
if (c === KeyCode.Enter || c === KeyCode.Space || c === KeyCode.KeyC) {
close();
}
if (!props.fromBook) {
if (c === KeyCode.KeyX || c === KeyCode.Escape) {
close();
}
}
}
onMounted(async () => {

View File

@ -80,6 +80,7 @@ async function calHeight() {
vw = window.innerWidth;
width.value = vh * 0.28;
await new Promise(res => requestAnimationFrame(res));
if (!main) return;
main = document.getElementById('enemy-fixed') as HTMLDivElement;
const style = getComputedStyle(main);
const h = parseFloat(style.height);

34
src/ui/fixedDetail.vue Normal file
View File

@ -0,0 +1,34 @@
<template>
<div id="fixed-detail">
<BookDetail :from-book="false" @close="close"></BookDetail>
</div>
</template>
<script lang="ts" setup>
import { onMounted, ref } from 'vue';
import { getDetailedEnemy } from '../plugin/ui/fixed';
import BookDetail from './bookDetail.vue';
core.plugin.bookDetailPos = 0;
function close() {
core.plugin.fixedDetailOpened.value = false;
}
onMounted(() => {
const [x, y] = flags.mouseLoc;
const e = core.getBlockId(x, y);
if (!e || !core.getClsFromId(e)?.startsWith('enemy')) return;
const enemy = core.material.enemys[e as EnemyIds];
const detail = getDetailedEnemy(enemy, x, y);
core.plugin.bookDetailEnemy = detail;
core.plugin.bookDetailEnemy = getDetailedEnemy(enemy, x, y);
});
</script>
<style lang="less" scoped>
#fixed-detail {
width: 80%;
height: 100%;
}
</style>