diablo2-web/src/netproto/domain/server-event.ts

242 lines
6.3 KiB
TypeScript

/**
* Protocol-neutral `ServerEvent` discriminated union (PROJECT.md § Interface Contracts).
*/
import type {
Hand,
ItemContainer,
ItemData,
ItemStat,
Pt,
SkillLevel,
UnitRef,
UnitSnapshot,
UnitType,
} from './ids.ts'
export type ServerEvent =
| { readonly type: 'GameLoading' }
| {
readonly type: 'GameFlags'
readonly difficulty: 0 | 1 | 2
readonly hardcore: boolean
readonly expansion: boolean
readonly ladder: boolean
}
| {
readonly type: 'LoadAct'
readonly act: number
readonly mapSeed: number
readonly areaId: number
readonly objectSeed?: number | undefined
}
| { readonly type: 'LoadComplete' }
| { readonly type: 'UnloadComplete' }
| { readonly type: 'GameLogout' }
| {
readonly type: 'RoomReveal'
readonly areaId: number
readonly tileX: number
readonly tileY: number
}
| {
readonly type: 'RoomHide'
readonly areaId: number
readonly tileX: number
readonly tileY: number
}
| {
readonly type: 'UnitAssign'
readonly unit: UnitSnapshot
readonly isSelf?: boolean | undefined
}
| {
readonly type: 'UnitRemove'
readonly unitType: UnitType
readonly id: number
}
| {
readonly type: 'UnitMove'
readonly unitType: UnitType
readonly id: number
readonly mode: 'walk' | 'run' | 'knockback' | 'stop'
readonly from?: Pt | undefined
readonly to: Pt
readonly target?: UnitRef | undefined
}
| {
readonly type: 'UnitReassign'
readonly unitType: UnitType
readonly id: number
readonly at: Pt
readonly snap: boolean
}
| {
readonly type: 'UnitMode'
readonly unitType: UnitType
readonly id: number
readonly mode: number
readonly at?: Pt | undefined
readonly lifePct?: number | undefined
}
| {
readonly type: 'SkillCast'
readonly caster: UnitRef
readonly skill: number
readonly level: number
readonly target: UnitRef | Pt
}
| {
readonly type: 'StatSet'
readonly stat: number
readonly value: number
readonly param?: number | undefined
readonly unit?: UnitRef | undefined
}
| {
readonly type: 'LifeMana'
readonly life: number
readonly mana: number
readonly stamina: number
readonly lifeRegen?: number | undefined
readonly manaRegen?: number | undefined
readonly at?: Pt | undefined
readonly vx?: number | undefined
readonly vy?: number | undefined
}
| {
readonly type: 'Experience'
readonly value: number
readonly isDelta?: boolean | undefined
}
| {
readonly type: 'StateSet'
readonly unit: UnitRef
readonly state: number
readonly stats?: readonly ItemStat[] | undefined
}
| {
readonly type: 'StateEnd'
readonly unit: UnitRef
readonly state: number
}
| {
readonly type: 'ItemEvent'
readonly action: number
readonly item: ItemData
readonly container: ItemContainer
readonly at?: Pt | undefined
}
| {
readonly type: 'SkillList'
readonly unitId: number
readonly skills: readonly SkillLevel[]
}
| {
readonly type: 'ActiveSkill'
readonly unitId: number
readonly hand: Hand
readonly skill: number
readonly itemId?: number | undefined
}
| {
readonly type: 'Npc'
readonly kind: 'info' | 'menu' | 'heal'
readonly npcId: number
readonly result?: number | undefined
readonly raw?: Uint8Array | undefined
}
| {
/** 0x2A NPCTransaction result (D2Game 0x6fcaac90). `itemId` 0xFFFFFFFF = none. */
readonly type: 'NpcTransaction'
readonly result: number
readonly flag: number
readonly itemId: number
/** Server's stat 14 at send time; informational only (the client uses stat 14 updates). */
readonly gold: number
}
| {
readonly type: 'WaypointMenu'
readonly unitId: number
readonly open: readonly number[]
}
| {
readonly type: 'QuestState'
readonly kind?: 'log' | 'update' | 'item' | undefined
readonly quests: Uint16Array
}
| {
readonly type: 'Party'
readonly kind: 'roster' | 'relation' | 'memberState' | 'memberPos'
readonly unitId?: number | undefined
readonly otherId?: number | undefined
readonly partyId?: number | undefined
readonly relation?: number | undefined
readonly lifePct?: number | undefined
readonly areaId?: number | undefined
readonly at?: Pt | undefined
readonly charName?: string | undefined
readonly charClass?: number | undefined
readonly charLevel?: number | undefined
}
| {
readonly type: 'Trade'
readonly action: number
readonly partnerId?: number | undefined
readonly gold?: number | undefined
}
| {
readonly type: 'Chat'
readonly kind: 'say' | 'whisper' | 'overhead' | 'system' | 'event'
readonly from?: string | undefined
readonly unit?: UnitRef | undefined
readonly text: string
readonly color?: number | undefined
readonly eventType?: number | undefined
}
| {
readonly type: 'PlaySound'
readonly unit?: UnitRef | undefined
readonly sound: number
}
| {
readonly type: 'Merc'
readonly kind: 'assign' | 'hireList' | 'stat' | 'exp'
readonly ownerId?: number | undefined
readonly mercId?: number | undefined
readonly classId?: number | undefined
readonly nameId?: number | undefined
readonly stat?: number | undefined
readonly value?: number | undefined
}
| {
readonly type: 'Portal'
readonly ownerName?: string | undefined
readonly ownerId?: number | undefined
readonly areaId: number
readonly localId: number
readonly remoteId?: number | undefined
readonly flags?: number | undefined
}
| {
readonly type: 'Pong'
readonly rttMs: number
readonly tickCount: number
}
| {
readonly type: 'Warden'
readonly payload: Uint8Array
}
| {
readonly type: 'SaveChunk'
readonly isFirst: boolean
readonly totalSize: number
readonly chunk: Uint8Array
}
| {
readonly type: 'Opaque'
readonly proto: string
readonly id: number
readonly raw: Uint8Array
}