mirror of
				https://github.com/unanmed/HumanBreak.git
				synced 2025-11-01 04:42:58 +08:00 
			
		
		
		
	feat: 赏金属性 & 鼠标移动到怪物上显示光环
This commit is contained in:
		
							parent
							
								
									4189f80866
								
							
						
					
					
						commit
						3ea0ab07f0
					
				| @ -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; | ||||||
|  | |||||||
| @ -280,5 +280,11 @@ export const specials: SpecialDeclaration[] = [ | |||||||
|             return str; |             return str; | ||||||
|         }, |         }, | ||||||
|         color: '#fff866' |         color: '#fff866' | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         code: 34, | ||||||
|  |         name: '赏金', | ||||||
|  |         desc: `怪物没有任何能力,也没有任何战利品,也无法让勇士恢复生命值,战斗伤害恒为0`, | ||||||
|  |         color: '#faff33' | ||||||
|     } |     } | ||||||
| ]; | ]; | ||||||
|  | |||||||
| @ -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 => { | ||||||
|  | |||||||
| @ -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
									
									
								
							
							
						
						
									
										5
									
								
								src/source/cls.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -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
									
									
								
							
							
						
						
									
										10
									
								
								src/source/maps.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -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'; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user