253 lines
8.6 KiB
PHP
253 lines
8.6 KiB
PHP
; ==============================================================================
|
|
; EBLAN ENGINE - Constants and Definitions
|
|
; ==============================================================================
|
|
|
|
; Screen & Render Dimensions
|
|
SCREEN_W equ 320
|
|
SCREEN_H equ 240
|
|
SCREEN_HALF_W equ 160
|
|
SCREEN_HALF_H equ 120
|
|
SCREEN_PITCH equ 1280 ; 320 * 4 bytes (BGRA)
|
|
FRAME_BUFFER_SIZE equ 307200 ; 320 * 240 * 4 bytes
|
|
|
|
WINDOW_W equ 1280
|
|
WINDOW_H equ 960
|
|
|
|
; Fixed Point Math (16.16)
|
|
FIXED_SHIFT equ 16
|
|
FIXED_ONE equ 65536
|
|
FIXED_HALF equ 32768
|
|
|
|
; Angles & Field of View
|
|
ANGLE_512 equ 512
|
|
ANGLE_MASK equ 511
|
|
ANGLE_360 equ 512
|
|
ANGLE_180 equ 256
|
|
ANGLE_90 equ 128
|
|
ANGLE_45 equ 64
|
|
FOV_ANGLES equ 96 ; ~67.5 degrees FOV
|
|
FOV_HALF equ 48
|
|
|
|
; Map Dimensions & Units
|
|
MAP_W equ 32
|
|
MAP_H equ 32
|
|
MAP_SIZE equ 1024
|
|
CELL_SIZE equ 64 ; 64x64 units per cell
|
|
CELL_SHIFT equ 6 ; 2^6 = 64
|
|
|
|
; Projection Constants
|
|
PROJ_DIST equ 239 ; (SCREEN_W / 2) / tan(FOV / 2), FOV = 67.5 deg
|
|
|
|
; Texture Sizes (128x128 pixels, 4 bytes BGRA = 65536 bytes per texture)
|
|
TEX_W equ 128
|
|
TEX_H equ 128
|
|
TEX_SHIFT equ 7 ; 2^7 = 128
|
|
TEX_MASK equ 127
|
|
TEX_SIZE_BYTES equ 65536
|
|
MAX_TEXTURES equ 16
|
|
|
|
; Virtual Keys
|
|
VK_KEY_W equ 57h
|
|
VK_KEY_A equ 41h
|
|
VK_KEY_S equ 53h
|
|
VK_KEY_D equ 44h
|
|
VK_KEY_E equ 45h
|
|
VK_KEY_Q equ 51h
|
|
VK_KEY_M equ 4Dh
|
|
VK_KEY_SPACE equ 20h
|
|
VK_KEY_SHIFT equ 10h
|
|
VK_KEY_ESCAPE equ 1Bh
|
|
VK_KEY_LEFT equ 25h
|
|
VK_KEY_UP equ 26h
|
|
VK_KEY_RIGHT equ 27h
|
|
VK_KEY_DOWN equ 28h
|
|
VK_KEY_F12 equ 7Bh
|
|
VK_KEY_C equ 43h
|
|
VK_KEY_TAB equ 9
|
|
VK_KEY_R equ 52h
|
|
VK_KEY_CONTROL equ 11h
|
|
VK_LBUTTON equ 01h
|
|
VK_KEY_1 equ 31h
|
|
VK_KEY_2 equ 32h
|
|
VK_KEY_3 equ 33h
|
|
VK_KEY_4 equ 34h
|
|
VK_KEY_5 equ 35h
|
|
VK_KEY_F1 equ 70h
|
|
VK_KEY_H equ 48h
|
|
VK_KEY_F equ 46h ; Flashlight toggle
|
|
VK_KEY_L equ 4Ch ; Lighting mode cycle
|
|
|
|
; Lighting Modes
|
|
LIGHTING_MODE_NONE equ 0 ; Fullbright (classic retro Wolf3D flat lighting)
|
|
LIGHTING_MODE_BAKED equ 1 ; Static Baked Lightmap (raytraced shadow-casting)
|
|
LIGHTING_MODE_DYNAMIC equ 2 ; Dynamic Point Lights + Realtime Physics + Flashlight
|
|
|
|
; Light Source Archetypes & Flags
|
|
LIGHT_TYPE_STATIC equ 0 ; Static baked light
|
|
LIGHT_TYPE_POINT equ 1 ; Realtime dynamic point light (torch, lamp)
|
|
LIGHT_TYPE_FLASHLIGHT equ 2 ; Player spotlight cone
|
|
LIGHT_TYPE_BURST equ 3 ; Decaying light flare (muzzle flash, explosion)
|
|
LIGHT_TYPE_PULSE equ 4 ; Flickering / pulsing light
|
|
|
|
LIGHT_FLAG_INACTIVE equ 0
|
|
LIGHT_FLAG_ACTIVE equ 1
|
|
LIGHT_FLAG_SHADOWS equ 2 ; Raycast wall occlusion (shadow casting)
|
|
LIGHT_FLAG_FLICKER equ 4 ; Organic torch flicker
|
|
|
|
MAX_LIGHTS equ 16
|
|
|
|
; Game Modes
|
|
GAME_MODE_ADVENTURE equ 0 ; Exploration / Quest / Horror / Puzzle (No weapons, clean view)
|
|
GAME_MODE_ACTION equ 1 ; Combat Action (Weapons, Crosshair, Ammo, Health bar)
|
|
|
|
; HUD Styles
|
|
HUD_STYLE_CLEAN equ 0 ; Clean / Immersive (No debug watermark, no bottom bar)
|
|
HUD_STYLE_DEBUG equ 1 ; Debug Mode (FPS counter, Engine watermark, Minimap)
|
|
|
|
; Weapon Archetypes
|
|
WEAPON_NONE equ -1 ; No weapon (Unarmed / Peaceful / Quest)
|
|
WEAPON_KNIFE equ 0 ; Melee blade (no ammo, fast, 30 damage)
|
|
WEAPON_PISTOL equ 1 ; Handgun (1 ammo, accurate, 35 damage)
|
|
WEAPON_SHOTGUN equ 2 ; Pump Shotgun (2 ammo, 3-ray spread, 70 damage)
|
|
WEAPON_COUNT equ 3
|
|
|
|
; Entity Archetypes & States
|
|
ENTITY_TYPE_PROP equ 0
|
|
ENTITY_TYPE_GUARD equ 1 ; Enemy Guard AI (Patrol, Chase, Attack)
|
|
ENTITY_TYPE_MEDKIT equ 2 ; Health pickup (+25 HP)
|
|
ENTITY_TYPE_AMMO equ 3 ; Ammo pickup (+20 Ammo)
|
|
ENTITY_TYPE_KEY equ 4 ; Door Key pickup
|
|
ENTITY_TYPE_SWITCH equ 5 ; Interactive switch trigger
|
|
ENTITY_TYPE_BARREL equ 6 ; Explosive barrel (AOE damage)
|
|
|
|
ENTITY_STATE_IDLE equ 0
|
|
ENTITY_STATE_CHASE equ 1
|
|
ENTITY_STATE_ATTACK equ 2
|
|
ENTITY_STATE_DEAD equ 3
|
|
|
|
; Colors (32-bit 00RRGGBBh; in memory a DIB stores bytes B,G,R,0 little-endian)
|
|
COLOR_BLACK equ 00000000h
|
|
COLOR_WHITE equ 00FFFFFFh
|
|
COLOR_RED equ 00FF0000h
|
|
COLOR_GREEN equ 0000FF00h
|
|
COLOR_BLUE equ 000000FFh
|
|
COLOR_YELLOW equ 00FFFF00h
|
|
COLOR_CYAN equ 0000FFFFh
|
|
COLOR_MAGENTA equ 00FF00FFh
|
|
COLOR_GRAY equ 00808080h
|
|
COLOR_DARK_GRAY equ 00303030h
|
|
COLOR_FLOOR equ 00222222h
|
|
COLOR_CEILING equ 00383838h
|
|
COLOR_CHROMA_KEY equ 00FF00FFh ; transparent sprite texel (magenta)
|
|
|
|
; Wall Cell Types (value = texture slot index)
|
|
CELL_EMPTY equ 0
|
|
CELL_BRICK equ 1
|
|
CELL_WOOD equ 2
|
|
CELL_STONE equ 3
|
|
CELL_METAL equ 4
|
|
CELL_DOOR equ 5
|
|
CELL_DOOR_OPEN equ 6
|
|
CELL_PILLAR equ 7
|
|
CELL_GLASS equ 8
|
|
CELL_MARBLE equ 9
|
|
CELL_PORTAL equ 10 ; Sector transition portal
|
|
CELL_COUNT equ 11
|
|
|
|
; Sector Transition Portals
|
|
MAX_TRANSITIONS equ 16
|
|
MAX_PATH_BYTES equ 260
|
|
MAP_FORMAT_VERSION equ 5
|
|
|
|
LevelTransition STRUCT ; sizeof = 42 bytes (packed)
|
|
triggerCellX db 0 ; 1 byte
|
|
triggerCellY db 0 ; 1 byte
|
|
targetMap db 32 dup(0); 32 bytes ASCII
|
|
targetSpawnX dw 0 ; 2 bytes
|
|
targetSpawnY dw 0 ; 2 bytes
|
|
targetAngle dw 0 ; 2 bytes
|
|
fadeEffect db 0 ; 1 byte (0=instant, 1=fade to black)
|
|
reserved db 0 ; 1 byte padding
|
|
LevelTransition ENDS
|
|
|
|
; Sprite Types & Struct
|
|
MAX_SPRITES equ 32
|
|
|
|
SpriteStruct STRUCT
|
|
x dd 0 ; raw world units (1 cell = 64 units)
|
|
y dd 0 ; raw world units
|
|
textureId dd 0 ; texture slot 1..15 (0 = solid marker color)
|
|
scale dd 0 ; fixed-point 16.16 (65536 = 1.0)
|
|
dist dd 0 ; runtime: squared distance to player (for sorting)
|
|
flags dd 0
|
|
SpriteStruct ENDS
|
|
|
|
; Light Source Struct (sizeof = 40 bytes)
|
|
LightSource STRUCT
|
|
x dd 0 ; raw world units (0..2047)
|
|
y dd 0 ; raw world units (0..2047)
|
|
radius dd 0 ; radius in raw world units
|
|
intensity dd 0 ; 0..255 base intensity
|
|
curIntensity dd 0 ; 0..255 current intensity (after flicker/decay)
|
|
lightType dd 0 ; LIGHT_TYPE_*
|
|
flags dd 0 ; LIGHT_FLAG_*
|
|
color dd 0 ; 00RRGGBBh tint (0 = neutral white/ambient)
|
|
decaySpeed dd 0 ; decay per tick for BURST lights
|
|
flickerPhase dd 0 ; flicker oscillation phase
|
|
LightSource ENDS
|
|
|
|
; Texture Pack (assets/textures/texturepack.bin):
|
|
; dd magic 'EBTX', dw version (1), dw slotCount, then slotCount * 65536 bytes
|
|
TEXPACK_MAGIC equ 58544245h ; 'EBTX'
|
|
|
|
; File I/O Constants
|
|
GENERIC_READ equ 80000000h
|
|
GENERIC_WRITE equ 40000000h
|
|
FILE_SHARE_READ equ 1
|
|
OPEN_EXISTING equ 3
|
|
CREATE_ALWAYS equ 2
|
|
FILE_ATTRIBUTE_NORMAL equ 80h
|
|
INVALID_HANDLE_VALUE equ -1
|
|
MAP_MAGIC equ 4E4C4245h ; 'EBLN'
|
|
|
|
MapHeader STRUCT ; sizeof = 38 bytes (packed)
|
|
magic dd 0 ; 'EBLN'
|
|
version dw 0 ; 1 = fixed coords, 2/3 = transitions, 4 = cutscenes, 5 = lighting
|
|
mapWidth dw 0 ; 32
|
|
mapHeight dw 0 ; 32
|
|
playerStartX dw 0 ; cell X
|
|
playerStartY dw 0 ; cell Y
|
|
playerStartAngle dw 0 ; 0..511
|
|
spriteCount dw 0 ; number of sprites
|
|
ceilingColor dd 0 ; 00RRGGBBh
|
|
floorColor dd 0 ; 00RRGGBBh
|
|
transitionCount dw 0 ; number of transitions in file
|
|
cutsceneCount dw 0
|
|
cutsceneStringCount dw 0
|
|
cutsceneFlags dw 0
|
|
lightCount dw 0
|
|
lightingReserved dw 0
|
|
MapHeader ENDS
|
|
|
|
MAX_CUTSCENE_EVENTS equ 128
|
|
MAX_CUTSCENE_STRINGS equ 32
|
|
CUTSCENE_STRING_BYTES equ 96
|
|
CUTSCENE_MAX_DURATION equ 3600
|
|
CUTSCENE_AUTOPLAY equ 1
|
|
OP_END equ 0
|
|
OP_WAIT equ 1
|
|
OP_MOVE_CAM_TO equ 2
|
|
OP_PAN_CAM_TO equ 3
|
|
OP_SHOW_SUBTITLE equ 4
|
|
OP_HIDE_SUBTITLE equ 5
|
|
OP_PLAY_SOUND equ 6
|
|
OP_FADE_SCREEN equ 7
|
|
OP_CHANGE_SUBLEVEL equ 8
|
|
CutsceneEvent STRUCT
|
|
tickTimestamp dw 0
|
|
opCode db 0
|
|
param8 db 0
|
|
paramA dd 0
|
|
paramB dd 0
|
|
dataId dd 0
|
|
CutsceneEvent ENDS
|