feat: 赏金属性 & 鼠标移动到怪物上显示光环

This commit is contained in:
unanmed 2024-10-02 10:34:03 +08:00
parent 4189f80866
commit 3ea0ab07f0
6 changed files with 80 additions and 22 deletions

View File

@ -997,6 +997,9 @@ export function calDamageWith(
let { atk, def, hpmax, mana, magicDef } = hero as HeroStatus; let { atk, def, hpmax, mana, magicDef } = hero as HeroStatus;
let { hp: monHp, atk: monAtk, def: monDef, special, enemy } = info; let { hp: monHp, atk: monAtk, def: monDef, special, enemy } = info;
// 赏金,优先级最高
if (special.has(34)) return 0;
hpmax = Math.min(hpmax, def / 10); hpmax = Math.min(hpmax, def / 10);
let damage = 0; let damage = 0;

View File

@ -280,5 +280,11 @@ export const specials: SpecialDeclaration[] = [
return str; return str;
}, },
color: '#fff866' color: '#fff866'
},
{
code: 34,
name: '赏金',
desc: `怪物没有任何能力也没有任何战利品也无法让勇士恢复生命值战斗伤害恒为0`,
color: '#faff33'
} }
]; ];

View File

@ -1,5 +1,5 @@
import { EventEmitter } from '../core/common/eventEmitter'; import { EventEmitter } from '../core/common/eventEmitter';
import type { DamageEnemy } from './enemy/damage'; import type { DamageEnemy, EnemyCollection } from './enemy/damage';
// ----- 加载事件 // ----- 加载事件
interface GameLoadEvent { interface GameLoadEvent {
@ -91,12 +91,6 @@ export interface GameEvent {
afterBattle: (enemy: DamageEnemy, x?: number, y?: number) => void; afterBattle: (enemy: DamageEnemy, x?: number, y?: number) => void;
/** Emitted in libs/events.js changingFloor */ /** Emitted in libs/events.js changingFloor */
changingFloor: (floorId: FloorIds, heroLoc: Loc) => void; changingFloor: (floorId: FloorIds, heroLoc: Loc) => void;
drawHero: (
status?: Exclude<keyof MaterialIcon['hero']['down'], 'loc'>,
offset?: number,
frame?: number
) => void;
/** Emitted in libs/maps.js setBlock */ /** Emitted in libs/maps.js setBlock */
setBlock: ( setBlock: (
x: number, x: number,
@ -105,6 +99,8 @@ export interface GameEvent {
newBlock: AllNumbers, newBlock: AllNumbers,
oldBlock: AllNumbers oldBlock: AllNumbers
) => void; ) => void;
/** Emitted in game/enemy/damage.ts */
enemyExtract: (col: EnemyCollection) => void;
} }
export const hook = new EventEmitter<GameEvent>(); export const hook = new EventEmitter<GameEvent>();
@ -123,6 +119,9 @@ class GameListener extends EventEmitter<ListenerEvent> {
num: number = GameListener.num++; num: number = GameListener.num++;
mouseX: number = -1;
mouseY: number = -1;
constructor() { constructor() {
super(); super();
if (main.replayChecking) return; if (main.replayChecking) return;
@ -137,8 +136,6 @@ class GameListener extends EventEmitter<ListenerEvent> {
private init() { private init() {
// ----- block // ----- block
let lastHoverX = -1;
let lastHoverY = -1;
const data = core.canvas.data.canvas; const data = core.canvas.data.canvas;
@ -165,19 +162,19 @@ class GameListener extends EventEmitter<ListenerEvent> {
} = core.actions._getClickLoc(e.clientX, e.clientY); } = core.actions._getClickLoc(e.clientX, e.clientY);
const [bx, by] = getBlockLoc(px, py, size); const [bx, by] = getBlockLoc(px, py, size);
const blocks = core.getMapBlocksObj(); const blocks = core.getMapBlocksObj();
if (lastHoverX !== bx || lastHoverY !== by) { if (this.mouseX !== bx || this.mouseY !== by) {
const lastBlock = blocks[`${lastHoverX},${lastHoverY}`]; const lastBlock = blocks[`${this.mouseX},${this.mouseY}`];
const block = blocks[`${bx},${by}`]; const block = blocks[`${bx},${by}`];
if (!!lastBlock) { if (!!lastBlock) {
this.emit('leaveBlock', lastBlock, e, false); this.emit('leaveBlock', lastBlock, e, false);
} }
if (!!block) { if (!!block) {
this.emit('hoverBlock', block, e); this.emit('hoverBlock', block, e);
lastHoverX = bx; this.mouseX = bx;
lastHoverY = by; this.mouseY = by;
} else { } else {
lastHoverX = -1; this.mouseX = -1;
lastHoverY = -1; this.mouseY = -1;
} }
} }
}); });
@ -189,12 +186,12 @@ class GameListener extends EventEmitter<ListenerEvent> {
) )
return; return;
const blocks = core.getMapBlocksObj(); const blocks = core.getMapBlocksObj();
const lastBlock = blocks[`${lastHoverX},${lastHoverY}`]; const lastBlock = blocks[`${this.mouseX},${this.mouseY}`];
if (!!lastBlock) { if (!!lastBlock) {
this.emit('leaveBlock', lastBlock, e, true); this.emit('leaveBlock', lastBlock, e, true);
} }
lastHoverX = -1; this.mouseX = -1;
lastHoverY = -1; this.mouseY = -1;
}); });
// click // click
data.addEventListener('click', e => { data.addEventListener('click', e => {

View File

@ -9,6 +9,8 @@ import {
import { Sprite } from '@/core/render/sprite'; import { Sprite } from '@/core/render/sprite';
import { Transform } from '@/core/render/transform'; import { Transform } from '@/core/render/transform';
const gameListener = Mota.require('var', 'gameListener');
export class LayerGroupHalo implements ILayerGroupRenderExtends { export class LayerGroupHalo implements ILayerGroupRenderExtends {
id: string = 'halo'; id: string = 'halo';
@ -16,6 +18,8 @@ export class LayerGroupHalo implements ILayerGroupRenderExtends {
binder!: LayerGroupFloorBinder; binder!: LayerGroupFloorBinder;
halo!: Halo; halo!: Halo;
static sprites: Set<Halo> = new Set();
awake(group: LayerGroup): void { awake(group: LayerGroup): void {
this.group = group; this.group = group;
const ex = group.getExtends('floor-binder'); const ex = group.getExtends('floor-binder');
@ -27,6 +31,7 @@ export class LayerGroupHalo implements ILayerGroupRenderExtends {
this.halo.setZIndex(75); this.halo.setZIndex(75);
this.halo.binder = ex; this.halo.binder = ex;
group.appendChild(this.halo); group.appendChild(this.halo);
LayerGroupHalo.sprites.add(this.halo);
} else { } else {
logger.error(1401); logger.error(1401);
group.removeExtends('halo'); group.removeExtends('halo');
@ -35,6 +40,7 @@ export class LayerGroupHalo implements ILayerGroupRenderExtends {
onDestroy(group: LayerGroup): void { onDestroy(group: LayerGroup): void {
this.halo?.destroy(); this.halo?.destroy();
LayerGroupHalo.sprites.delete(this.halo);
} }
} }
@ -55,7 +61,7 @@ class Halo extends Sprite {
binder!: LayerGroupFloorBinder; binder!: LayerGroupFloorBinder;
constructor() { constructor() {
super('static', false); super('static', true);
this.setRenderFn((canvas, transform) => { this.setRenderFn((canvas, transform) => {
this.drawHalo(canvas, transform); this.drawHalo(canvas, transform);
@ -89,17 +95,48 @@ class Halo extends Sprite {
for (const halo of list) { for (const halo of list) {
if (halo.type === 'square') { if (halo.type === 'square') {
const { x, y, d } = halo.data; const { x, y, d } = halo.data;
const [color, border] = haloColor[halo.special]; let [color, border] = haloColor[halo.special];
let alpha = 0.1;
let borderAlpha = 0.6;
const { mouseX, mouseY } = gameListener;
if (mouseX === halo.from?.x && mouseY === halo.from?.y) {
alpha = 0.3;
borderAlpha = 0.8;
color = '#ff0';
border = '#ff0';
}
const r = Math.floor(d / 2); const r = Math.floor(d / 2);
const left = x - r; const left = x - r;
const top = y - r; const top = y - r;
ctx.fillStyle = color; ctx.fillStyle = color;
ctx.strokeStyle = border ?? color; ctx.strokeStyle = border ?? color;
ctx.globalAlpha = 0.1; ctx.globalAlpha = alpha;
ctx.fillRect(left * cell, top * cell, d * cell, d * cell); ctx.fillRect(left * cell, top * cell, d * cell, d * cell);
ctx.globalAlpha = 0.6; ctx.globalAlpha = borderAlpha;
ctx.strokeRect(left * cell, top * cell, d * cell, d * cell); ctx.strokeRect(left * cell, top * cell, d * cell, d * cell);
} }
} }
} }
} }
function updateHalo(block: Block) {
if (block.event.cls === 'enemys' || block.event.cls === 'enemy48') {
LayerGroupHalo.sprites.forEach(v => {
const floor = v.binder.getFloor();
if (floor === core.status.floorId) {
v.update();
}
});
}
}
Mota.require('var', 'hook').on('enemyExtract', col => {
LayerGroupHalo.sprites.forEach(v => {
const floor = v.binder.getFloor();
if (col.floorId === floor) {
v.update();
}
});
});
gameListener.on('hoverBlock', updateHalo);
gameListener.on('leaveBlock', updateHalo);

5
src/source/cls.d.ts vendored
View File

@ -633,6 +633,11 @@ interface IdToCls {
E703: 'enemys'; E703: 'enemys';
E704: 'enemys'; E704: 'enemys';
E705: 'enemys'; E705: 'enemys';
T706: 'terrains';
E707: 'enemys';
E708: 'enemys';
E709: 'enemys';
E710: 'enemys';
X20032: 'tileset'; X20032: 'tileset';
X20033: 'tileset'; X20033: 'tileset';
X20034: 'tileset'; X20034: 'tileset';

10
src/source/maps.d.ts vendored
View File

@ -633,6 +633,11 @@ interface IdToNumber {
E703: 703; E703: 703;
E704: 704; E704: 704;
E705: 705; E705: 705;
T706: 706;
E707: 707;
E708: 708;
E709: 709;
E710: 710;
X20032: 20032; X20032: 20032;
X20033: 20033; X20033: 20033;
X20034: 20034; X20034: 20034;
@ -1351,6 +1356,11 @@ interface NumberToId {
703: 'E703'; 703: 'E703';
704: 'E704'; 704: 'E704';
705: 'E705'; 705: 'E705';
706: 'T706';
707: 'E707';
708: 'E708';
709: 'E709';
710: 'E710';
20032: 'X20032'; 20032: 'X20032';
20033: 'X20033'; 20033: 'X20033';
20034: 'X20034'; 20034: 'X20034';