doom 0.6.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 +138 -25
  5. data/lib/doom/benchmark.rb +282 -0
  6. data/lib/doom/game/animations.rb +9 -2
  7. data/lib/doom/game/combat.rb +377 -105
  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 +231 -0
  11. data/lib/doom/game/item_pickup.rb +108 -60
  12. data/lib/doom/game/menu.rb +347 -0
  13. data/lib/doom/game/monster_ai.rb +304 -91
  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 +47 -64
  17. data/lib/doom/game/random.rb +82 -0
  18. data/lib/doom/game/sector_actions.rb +466 -29
  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 +176 -0
  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 +820 -640
  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 +80 -0
  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 +684 -330
  43. data/lib/doom/render/renderer_factory.rb +50 -0
  44. data/lib/doom/render/screen_melt.rb +71 -0
  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 +15 -17
  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 +59 -10
  57. data/lib/doom/wad/sound.rb +93 -0
  58. data/lib/doom/wad/sprite.rb +60 -34
  59. data/lib/doom/wad/texture.rb +5 -5
  60. data/lib/doom/wad_downloader.rb +38 -56
  61. data/lib/doom.rb +235 -12
  62. metadata +100 -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
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doom
4
+ module Render
5
+ # DOOM's screen melt/wipe effect from wipe.c.
6
+ # Each column slides down at a slightly different speed,
7
+ # revealing the new screen underneath.
8
+ class ScreenMelt
9
+ WIDTH = SCREEN_WIDTH
10
+ HEIGHT = SCREEN_HEIGHT
11
+ MELT_SPEED = HEIGHT / 30 # ~8 pixels per frame (Chocolate Doom does HEIGHT/15 at 35fps)
12
+
13
+ def initialize(old_screen, new_screen)
14
+ # Snapshot both screens (arrays of palette indices, 320x240)
15
+ @old = old_screen.dup
16
+ @new = new_screen.dup
17
+ @done = false
18
+
19
+ # Initialize column offsets (from wipe_initMelt in wipe.c)
20
+ # Column 0 gets random negative offset, each subsequent column
21
+ # varies by -1/0/+1 from previous, creating a jagged melt line
22
+ @y = Array.new(WIDTH)
23
+ @y[0] = -rand(16)
24
+ (1...WIDTH).each do |i|
25
+ @y[i] = @y[i - 1] + rand(-1..1)
26
+ @y[i] = -15 if @y[i] < -15
27
+ @y[i] = 0 if @y[i] > 0
28
+ end
29
+ end
30
+
31
+ def done?
32
+ @done
33
+ end
34
+
35
+ # Advance one tic. Returns the composited framebuffer.
36
+ def update(framebuffer)
37
+ all_done = true
38
+
39
+ WIDTH.times do |x|
40
+ if @y[x] < 0
41
+ @y[x] += 1
42
+ all_done = false
43
+ # Column hasn't started melting yet - show old screen
44
+ HEIGHT.times { |row| framebuffer[(row * WIDTH) + x] = @old[(row * WIDTH) + x] }
45
+ elsif @y[x] < HEIGHT
46
+ all_done = false
47
+ dy = @y[x]
48
+
49
+ # Top part: new screen revealed
50
+ dy.times do |row|
51
+ framebuffer[(row * WIDTH) + x] = @new[(row * WIDTH) + x]
52
+ end
53
+
54
+ # Bottom part: old screen shifted down
55
+ (dy...HEIGHT).each do |row|
56
+ src_row = row - dy
57
+ framebuffer[(row * WIDTH) + x] = @old[(src_row * WIDTH) + x]
58
+ end
59
+
60
+ @y[x] += MELT_SPEED
61
+ else
62
+ # Column fully melted - show new screen
63
+ HEIGHT.times { |row| framebuffer[(row * WIDTH) + x] = @new[(row * WIDTH) + x] }
64
+ end
65
+ end
66
+
67
+ @done = all_done
68
+ end
69
+ end
70
+ end
71
+ end