import type { ComposedUnit, PlaceRejectReason } from '../types/MergeTypes'; import { MergeEventType } from './MergeEventType'; export type MergeEvent = | { type: MergeEventType.BagRefreshed; playEntrance?: boolean } | { type: MergeEventType.BagSlotMoved; fromSlot: number; toSlot: number } | { type: MergeEventType.TilePlaced; gridIndex: number; weapon2Id: number } | { type: MergeEventType.TileMoved; fromGrid: number; toGrid: number } | { type: MergeEventType.TileReturned; gridIndex: number; bagSlot: number } | { type: MergeEventType.ComposeChanged; compositions: ComposedUnit[] } | { type: MergeEventType.BagMerged; slotIndex: number; weapon1Id: number; level: number } | { type: MergeEventType.MapUpgraded; gridIndex: number; weapon1Id: number; level: number } | { type: MergeEventType.GlyphRewritten; target: { kind: 'map'; gridIndex: number } | { kind: 'bag'; slotIndex: number }; weapon2Id: number; level: number; } | { type: MergeEventType.PlaceRejected; reason: PlaceRejectReason }; export type MergeEventListener = (event: MergeEvent) => void; export const MergeEventFactory = { bagRefreshed(playEntrance = true): MergeEvent { return { type: MergeEventType.BagRefreshed, playEntrance }; }, bagSlotMoved(fromSlot: number, toSlot: number): MergeEvent { return { type: MergeEventType.BagSlotMoved, fromSlot, toSlot }; }, tilePlaced(gridIndex: number, weapon2Id: number): MergeEvent { return { type: MergeEventType.TilePlaced, gridIndex, weapon2Id }; }, tileMoved(fromGrid: number, toGrid: number): MergeEvent { return { type: MergeEventType.TileMoved, fromGrid, toGrid }; }, tileReturned(gridIndex: number, bagSlot: number): MergeEvent { return { type: MergeEventType.TileReturned, gridIndex, bagSlot }; }, composeChanged(compositions: ComposedUnit[]): MergeEvent { return { type: MergeEventType.ComposeChanged, compositions }; }, bagMerged(slotIndex: number, weapon1Id: number, level: number): MergeEvent { return { type: MergeEventType.BagMerged, slotIndex, weapon1Id, level }; }, mapUpgraded(gridIndex: number, weapon1Id: number, level: number): MergeEvent { return { type: MergeEventType.MapUpgraded, gridIndex, weapon1Id, level }; }, glyphRewritten( target: { kind: 'map'; gridIndex: number } | { kind: 'bag'; slotIndex: number }, weapon2Id: number, level: number, ): MergeEvent { return { type: MergeEventType.GlyphRewritten, target, weapon2Id, level }; }, placeRejected(reason: PlaceRejectReason): MergeEvent { return { type: MergeEventType.PlaceRejected, reason }; }, };