Class: Doom::Render::StatusBar

Inherits:
Object
  • Object
show all
Defined in:
lib/doom/render/status_bar.rb

Overview

Renders the classic DOOM status bar at the bottom of the screen

Constant Summary collapse

STATUS_BAR_HEIGHT =
32
STATUS_BAR_Y =
SCREEN_HEIGHT - STATUS_BAR_HEIGHT
AMMO_RIGHT_X =

DOOM status bar layout (from st_stuff.c) Positions from Chocolate Doom st_stuff.c (relative to status bar top)

44
HEALTH_RIGHT_X =

ST_AMMOX - right edge of 3-digit ammo

90
ARMOR_RIGHT_X =

ST_HEALTHX

221
ARMS_BG_X =

ST_ARMORX

104
ARMS_BG_Y =

ST_ARMSBGX

0
ARMS_X =

ST_ARMSBGY (relative to status bar)

111
ARMS_Y =

ST_ARMSX

4
ARMS_XSPACE =

ST_ARMSY (relative to status bar)

12
ARMS_YSPACE =
10
FACE_X =

Centered in face background area

149
FACE_Y =

Vertically centered in status bar

2
KEYS_X =

ST_KEY0X

239
SMALL_AMMO_X =

Small ammo counts (right side of status bar)

288
SMALL_MAX_X =

Current ammo X

314
SMALL_AMMO_Y =

Max ammo X

[5, 11, 23, 17]
NUM_WIDTH =

Width of large digit

14
SMALL_NUM_WIDTH =

Width of small digit

4

Instance Method Summary collapse

Constructor Details

#initialize(hud_graphics, player_state) ⇒ StatusBar

Returns a new instance of StatusBar.



36
37
38
39
40
41
# File 'lib/doom/render/status_bar.rb', line 36

def initialize(hud_graphics, player_state)
  @gfx = hud_graphics
  @player = player_state
  @face_timer = 0
  @face_index = 0
end

Instance Method Details

#render(framebuffer) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/doom/render/status_bar.rb', line 43

def render(framebuffer)
  # Draw status bar background
  draw_sprite(framebuffer, @gfx.status_bar, 0, STATUS_BAR_Y) if @gfx.status_bar

  # Draw arms background (single-player only, replaces FRAG area)
  draw_sprite(framebuffer, @gfx.arms_background, ARMS_BG_X, STATUS_BAR_Y + ARMS_BG_Y) if @gfx.arms_background

  # Y position for numbers (3 pixels from top of status bar)
  num_y = STATUS_BAR_Y + 3

  # Draw ammo count (right-aligned ending at AMMO_RIGHT_X)
  draw_number_right(framebuffer, @player.current_ammo, AMMO_RIGHT_X, num_y) if @player.current_ammo

  # Draw health with percent
  draw_number_right(framebuffer, @player.health, HEALTH_RIGHT_X, num_y)
  draw_percent(framebuffer, HEALTH_RIGHT_X, num_y)

  # Draw weapon selector (2-7)
  draw_arms(framebuffer)

  # Draw face
  draw_face(framebuffer)

  # Draw armor with percent
  draw_number_right(framebuffer, @player.armor, ARMOR_RIGHT_X, num_y)
  draw_percent(framebuffer, ARMOR_RIGHT_X, num_y)

  # Draw keys
  draw_keys(framebuffer)

  # Draw small ammo counts (right side)
  draw_ammo_counts(framebuffer)
end

#updateObject



77
78
79
80
81
82
83
84
# File 'lib/doom/render/status_bar.rb', line 77

def update
  # Cycle face animation
  @face_timer += 1
  if @face_timer > 15  # Change face every ~0.5 seconds
    @face_timer = 0
    @face_index = (@face_index + 1) % 3
  end
end