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.
- checksums.yaml +4 -4
- data/LICENSE +17 -0
- data/README.md +65 -4
- data/bin/doom +138 -25
- data/lib/doom/benchmark.rb +282 -0
- data/lib/doom/game/animations.rb +9 -2
- data/lib/doom/game/combat.rb +377 -105
- data/lib/doom/game/framebuffer_blitter.rb +38 -0
- data/lib/doom/game/geometry.rb +68 -0
- data/lib/doom/game/intermission.rb +231 -0
- data/lib/doom/game/item_pickup.rb +108 -60
- data/lib/doom/game/menu.rb +347 -0
- data/lib/doom/game/monster_ai.rb +304 -91
- data/lib/doom/game/player.rb +105 -0
- data/lib/doom/game/player_physics.rb +384 -0
- data/lib/doom/game/player_state.rb +47 -64
- data/lib/doom/game/random.rb +82 -0
- data/lib/doom/game/sector_actions.rb +466 -29
- data/lib/doom/game/sector_effects.rb +25 -18
- data/lib/doom/game/snapshot.rb +584 -0
- data/lib/doom/game/sound_engine.rb +176 -0
- 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 +820 -640
- data/lib/doom/platform/sdl.rb +74 -0
- data/lib/doom/platform/window_logic.rb +61 -0
- data/lib/doom/render/font.rb +80 -0
- 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 +684 -330
- data/lib/doom/render/renderer_factory.rb +50 -0
- data/lib/doom/render/screen_melt.rb +71 -0
- 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 +15 -17
- 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 +59 -10
- data/lib/doom/wad/sound.rb +93 -0
- data/lib/doom/wad/sprite.rb +60 -34
- data/lib/doom/wad/texture.rb +5 -5
- data/lib/doom/wad_downloader.rb +38 -56
- data/lib/doom.rb +235 -12
- 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
|