doom 0.8.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +17 -0
  3. data/README.md +65 -4
  4. data/bin/doom +134 -24
  5. data/lib/doom/benchmark.rb +282 -0
  6. data/lib/doom/game/animations.rb +9 -2
  7. data/lib/doom/game/combat.rb +239 -153
  8. data/lib/doom/game/framebuffer_blitter.rb +38 -0
  9. data/lib/doom/game/geometry.rb +68 -0
  10. data/lib/doom/game/intermission.rb +22 -39
  11. data/lib/doom/game/item_pickup.rb +87 -75
  12. data/lib/doom/game/menu.rb +90 -85
  13. data/lib/doom/game/monster_ai.rb +150 -136
  14. data/lib/doom/game/player.rb +105 -0
  15. data/lib/doom/game/player_physics.rb +384 -0
  16. data/lib/doom/game/player_state.rb +38 -64
  17. data/lib/doom/game/random.rb +82 -0
  18. data/lib/doom/game/sector_actions.rb +169 -93
  19. data/lib/doom/game/sector_effects.rb +25 -18
  20. data/lib/doom/game/snapshot.rb +584 -0
  21. data/lib/doom/game/sound_engine.rb +33 -58
  22. data/lib/doom/game/state_hash.rb +125 -0
  23. data/lib/doom/game/ticcmd.rb +61 -0
  24. data/lib/doom/game/world.rb +420 -0
  25. data/lib/doom/map/data.rb +95 -0
  26. data/lib/doom/net/client.rb +204 -0
  27. data/lib/doom/net/desync_monitor.rb +101 -0
  28. data/lib/doom/net/game_server.rb +232 -0
  29. data/lib/doom/net/lockstep.rb +170 -0
  30. data/lib/doom/net/protocol.rb +350 -0
  31. data/lib/doom/net/session.rb +282 -0
  32. data/lib/doom/net/transport.rb +110 -0
  33. data/lib/doom/platform/gosu_window.rb +604 -832
  34. data/lib/doom/platform/sdl.rb +74 -0
  35. data/lib/doom/platform/window_logic.rb +61 -0
  36. data/lib/doom/render/font.rb +5 -3
  37. data/lib/doom/render/hardware_renderer.rb +547 -0
  38. data/lib/doom/render/ray_tracing/bvh.rb +103 -0
  39. data/lib/doom/render/ray_tracing/material_state.rb +66 -0
  40. data/lib/doom/render/ray_tracing/texture_atlas.rb +78 -0
  41. data/lib/doom/render/ray_tracing_renderer.rb +940 -0
  42. data/lib/doom/render/renderer.rb +466 -440
  43. data/lib/doom/render/renderer_factory.rb +50 -0
  44. data/lib/doom/render/screen_melt.rb +7 -7
  45. data/lib/doom/render/spinel_native/kernel.rb +780 -0
  46. data/lib/doom/render/spinel_native_renderer.rb +162 -0
  47. data/lib/doom/render/status_bar.rb +14 -10
  48. data/lib/doom/render/weapon_renderer.rb +9 -10
  49. data/lib/doom/render/world_mesh.rb +270 -0
  50. data/lib/doom/render/zbuffer_renderer.rb +151 -0
  51. data/lib/doom/version.rb +1 -1
  52. data/lib/doom/wad/flat.rb +1 -1
  53. data/lib/doom/wad/hud_graphics.rb +7 -3
  54. data/lib/doom/wad/palette.rb +3 -3
  55. data/lib/doom/wad/patch.rb +1 -1
  56. data/lib/doom/wad/reader.rb +12 -15
  57. data/lib/doom/wad/sound.rb +14 -6
  58. data/lib/doom/wad/sprite.rb +36 -35
  59. data/lib/doom/wad/texture.rb +5 -5
  60. data/lib/doom/wad_downloader.rb +38 -56
  61. data/lib/doom.rb +197 -16
  62. metadata +94 -7
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doom
4
+ module Render
5
+ module RendererFactory
6
+ TYPES = %i[classic zbuffer rasterizer raytracing].freeze
7
+ SWITCH_TYPES = %i[classic rasterizer raytracing].freeze
8
+
9
+ module_function
10
+
11
+ def build(type, wad, map, textures, palette, colormap, flats, sprites = nil, animations = nil)
12
+ klass = case normalize(type)
13
+ when :classic then Renderer
14
+ when :zbuffer then ZBufferRenderer
15
+ when :rasterizer then HardwareRenderer
16
+ when :raytracing then RayTracingRenderer
17
+ end
18
+ klass.new(wad, map, textures, palette, colormap, flats, sprites, animations)
19
+ end
20
+
21
+ def build_like(renderer, type)
22
+ build(type, renderer.wad, renderer.map, renderer.textures, renderer.palette,
23
+ renderer.colormap, renderer.flats.values, renderer.sprites, renderer.animations)
24
+ end
25
+
26
+ def normalize(type)
27
+ value = (type || :classic).to_sym
28
+ unless TYPES.include?(value)
29
+ raise ArgumentError,
30
+ "unknown renderer #{type.inspect}; expected #{TYPES.join(' or ')}"
31
+ end
32
+
33
+ value
34
+ end
35
+
36
+ def type_of(renderer)
37
+ return :raytracing if renderer.is_a?(RayTracingRenderer)
38
+ return :rasterizer if renderer.is_a?(HardwareRenderer)
39
+ return :zbuffer if renderer.is_a?(ZBufferRenderer)
40
+
41
+ :classic
42
+ end
43
+
44
+ def next_type(renderer)
45
+ current_index = SWITCH_TYPES.index(type_of(renderer)) || 0
46
+ SWITCH_TYPES[(current_index + 1) % SWITCH_TYPES.size]
47
+ end
48
+ end
49
+ end
50
+ end
@@ -8,7 +8,7 @@ module Doom
8
8
  class ScreenMelt
9
9
  WIDTH = SCREEN_WIDTH
10
10
  HEIGHT = SCREEN_HEIGHT
11
- MELT_SPEED = HEIGHT / 30 # ~8 pixels per frame (Chocolate Doom does HEIGHT/15 at 35fps)
11
+ MELT_SPEED = HEIGHT / 30 # ~8 pixels per frame (Chocolate Doom does HEIGHT/15 at 35fps)
12
12
 
13
13
  def initialize(old_screen, new_screen)
14
14
  # Snapshot both screens (arrays of palette indices, 320x240)
@@ -20,9 +20,9 @@ module Doom
20
20
  # Column 0 gets random negative offset, each subsequent column
21
21
  # varies by -1/0/+1 from previous, creating a jagged melt line
22
22
  @y = Array.new(WIDTH)
23
- @y[0] = -(rand(16))
23
+ @y[0] = -rand(16)
24
24
  (1...WIDTH).each do |i|
25
- @y[i] = @y[i - 1] + (rand(3) - 1)
25
+ @y[i] = @y[i - 1] + rand(-1..1)
26
26
  @y[i] = -15 if @y[i] < -15
27
27
  @y[i] = 0 if @y[i] > 0
28
28
  end
@@ -41,26 +41,26 @@ module Doom
41
41
  @y[x] += 1
42
42
  all_done = false
43
43
  # Column hasn't started melting yet - show old screen
44
- HEIGHT.times { |row| framebuffer[row * WIDTH + x] = @old[row * WIDTH + x] }
44
+ HEIGHT.times { |row| framebuffer[(row * WIDTH) + x] = @old[(row * WIDTH) + x] }
45
45
  elsif @y[x] < HEIGHT
46
46
  all_done = false
47
47
  dy = @y[x]
48
48
 
49
49
  # Top part: new screen revealed
50
50
  dy.times do |row|
51
- framebuffer[row * WIDTH + x] = @new[row * WIDTH + x]
51
+ framebuffer[(row * WIDTH) + x] = @new[(row * WIDTH) + x]
52
52
  end
53
53
 
54
54
  # Bottom part: old screen shifted down
55
55
  (dy...HEIGHT).each do |row|
56
56
  src_row = row - dy
57
- framebuffer[row * WIDTH + x] = @old[src_row * WIDTH + x]
57
+ framebuffer[(row * WIDTH) + x] = @old[(src_row * WIDTH) + x]
58
58
  end
59
59
 
60
60
  @y[x] += MELT_SPEED
61
61
  else
62
62
  # Column fully melted - show new screen
63
- HEIGHT.times { |row| framebuffer[row * WIDTH + x] = @new[row * WIDTH + x] }
63
+ HEIGHT.times { |row| framebuffer[(row * WIDTH) + x] = @new[(row * WIDTH) + x] }
64
64
  end
65
65
  end
66
66