HumanBreak/src/plugin/utils.ts

136 lines
3.6 KiB
TypeScript
Raw Normal View History

2022-12-29 12:02:48 +08:00
import { message } from 'ant-design-vue';
import { MessageApi } from 'ant-design-vue/lib/message';
2022-11-16 23:01:23 +08:00
import { isNil } from 'lodash';
2022-11-21 20:00:34 +08:00
import { Animation, TimingFn } from 'mutate-animate';
import { ComputedRef, ref } from 'vue';
2022-11-19 18:15:42 +08:00
import { EVENT_KEY_CODE_MAP } from './keyCodes';
2022-11-16 23:01:23 +08:00
2022-11-21 20:00:34 +08:00
type CanParseCss = keyof {
[P in keyof CSSStyleDeclaration as CSSStyleDeclaration[P] extends string
? P extends string
? P
: never
: never]: CSSStyleDeclaration[P];
};
2022-11-16 23:01:23 +08:00
export default function init() {
2022-11-21 20:00:34 +08:00
return { has, getDamageColor, parseCss };
2022-11-16 23:01:23 +08:00
}
/**
* undefined或null
* @param value
*/
export function has<T>(value: T): value is NonNullable<T> {
return !isNil(value);
}
/**
*
* @param damage
*/
export function getDamageColor(damage: number): Color {
2022-11-16 23:01:23 +08:00
if (typeof damage !== 'number') return '#f00';
if (damage === 0) return '#2f2';
if (damage < 0) return '#7f7';
if (damage < core.status.hero.hp / 3) return '#fff';
if (damage < (core.status.hero.hp * 2) / 3) return '#ff4';
if (damage < core.status.hero.hp) return '#f22';
return '#f00';
}
2022-11-19 11:30:14 +08:00
/**
*
* @param canvas
* @param w
* @param h
*/
export function setCanvasSize(
canvas: HTMLCanvasElement,
w: number,
h: number
): void {
canvas.width = w;
canvas.height = h;
canvas.style.width = `${w}px`;
canvas.style.height = `${h}px`;
}
2022-11-19 18:15:42 +08:00
/**
* keycode对应的键
* @param key
*/
export function keycode(key: number) {
return EVENT_KEY_CODE_MAP[key];
}
2022-11-21 20:00:34 +08:00
/**
* css字符串为CSSStyleDeclaration对象
* @param css css字符串
*/
export function parseCss(css: string): Partial<Record<CanParseCss, string>> {
const str = css.replace(/[\n\s\t]*/g, '').replace(/[;,]*/g, ';');
const styles = str.split(';');
const res: Partial<Record<CanParseCss, string>> = {};
for (const one of styles) {
const [key, data] = one.split(':');
2022-11-30 16:42:44 +08:00
const cssKey = key.replace(/\-([a-z])/g, (str, $1) =>
2022-11-21 20:00:34 +08:00
$1.toUpperCase()
) as CanParseCss;
res[cssKey] = data;
}
return res;
}
/**
* 使
* @param str
2022-11-30 16:42:44 +08:00
* @param time 1true时
2022-11-21 20:00:34 +08:00
* @param timing 线线
2022-11-30 16:42:44 +08:00
* @param avr
2022-11-21 20:00:34 +08:00
* @returns
*/
export function type(
str: string,
time: number = 1000,
2022-11-30 16:42:44 +08:00
timing: TimingFn = n => n,
avr: boolean = false
2022-11-21 20:00:34 +08:00
): Ref<string> {
const toShow = eval('`' + str + '`') as string;
2022-11-30 16:42:44 +08:00
if (typeof toShow !== 'string') {
throw new TypeError('Error str type in typing!');
}
2022-12-29 00:26:12 +08:00
if (toShow.startsWith('!!html')) return ref(toShow);
2022-11-30 16:42:44 +08:00
if (avr) time *= toShow.length;
2022-11-21 20:00:34 +08:00
const ani = new Animation();
const content = ref('');
const all = toShow.length;
const fn = (time: number) => {
if (!has(time)) return;
const now = ani.x;
content.value = toShow.slice(0, Math.floor(now));
if (Math.floor(now) === all) {
ani.ticker.destroy();
2022-11-30 16:42:44 +08:00
content.value = toShow;
2022-11-21 20:00:34 +08:00
}
};
ani.ticker.add(fn);
ani.mode(timing).time(time).move(all, 0);
return content;
}
2022-12-29 12:02:48 +08:00
export function tip(
type: Exclude<keyof MessageApi, 'open' | 'config' | 'destroy'>,
text: string
) {
message[type]({
content: text,
class: 'antdv-message'
});
}