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.
- checksums.yaml +4 -4
- data/LICENSE +17 -0
- data/README.md +65 -4
- data/bin/doom +134 -24
- data/lib/doom/benchmark.rb +282 -0
- data/lib/doom/game/animations.rb +9 -2
- data/lib/doom/game/combat.rb +239 -153
- data/lib/doom/game/framebuffer_blitter.rb +38 -0
- data/lib/doom/game/geometry.rb +68 -0
- data/lib/doom/game/intermission.rb +22 -39
- data/lib/doom/game/item_pickup.rb +87 -75
- data/lib/doom/game/menu.rb +90 -85
- data/lib/doom/game/monster_ai.rb +150 -136
- data/lib/doom/game/player.rb +105 -0
- data/lib/doom/game/player_physics.rb +384 -0
- data/lib/doom/game/player_state.rb +38 -64
- data/lib/doom/game/random.rb +82 -0
- data/lib/doom/game/sector_actions.rb +169 -93
- data/lib/doom/game/sector_effects.rb +25 -18
- data/lib/doom/game/snapshot.rb +584 -0
- data/lib/doom/game/sound_engine.rb +33 -58
- data/lib/doom/game/state_hash.rb +125 -0
- data/lib/doom/game/ticcmd.rb +61 -0
- data/lib/doom/game/world.rb +420 -0
- data/lib/doom/map/data.rb +95 -0
- data/lib/doom/net/client.rb +204 -0
- data/lib/doom/net/desync_monitor.rb +101 -0
- data/lib/doom/net/game_server.rb +232 -0
- data/lib/doom/net/lockstep.rb +170 -0
- data/lib/doom/net/protocol.rb +350 -0
- data/lib/doom/net/session.rb +282 -0
- data/lib/doom/net/transport.rb +110 -0
- data/lib/doom/platform/gosu_window.rb +604 -832
- data/lib/doom/platform/sdl.rb +74 -0
- data/lib/doom/platform/window_logic.rb +61 -0
- data/lib/doom/render/font.rb +5 -3
- data/lib/doom/render/hardware_renderer.rb +547 -0
- data/lib/doom/render/ray_tracing/bvh.rb +103 -0
- data/lib/doom/render/ray_tracing/material_state.rb +66 -0
- data/lib/doom/render/ray_tracing/texture_atlas.rb +78 -0
- data/lib/doom/render/ray_tracing_renderer.rb +940 -0
- data/lib/doom/render/renderer.rb +466 -440
- data/lib/doom/render/renderer_factory.rb +50 -0
- data/lib/doom/render/screen_melt.rb +7 -7
- data/lib/doom/render/spinel_native/kernel.rb +780 -0
- data/lib/doom/render/spinel_native_renderer.rb +162 -0
- data/lib/doom/render/status_bar.rb +14 -10
- data/lib/doom/render/weapon_renderer.rb +9 -10
- data/lib/doom/render/world_mesh.rb +270 -0
- data/lib/doom/render/zbuffer_renderer.rb +151 -0
- data/lib/doom/version.rb +1 -1
- data/lib/doom/wad/flat.rb +1 -1
- data/lib/doom/wad/hud_graphics.rb +7 -3
- data/lib/doom/wad/palette.rb +3 -3
- data/lib/doom/wad/patch.rb +1 -1
- data/lib/doom/wad/reader.rb +12 -15
- data/lib/doom/wad/sound.rb +14 -6
- data/lib/doom/wad/sprite.rb +36 -35
- data/lib/doom/wad/texture.rb +5 -5
- data/lib/doom/wad_downloader.rb +38 -56
- data/lib/doom.rb +197 -16
- 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
|
|
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] = -
|
|
23
|
+
@y[0] = -rand(16)
|
|
24
24
|
(1...WIDTH).each do |i|
|
|
25
|
-
@y[i] = @y[i - 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
|
|