doom 0.2.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 +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +159 -0
- data/bin/console +15 -0
- data/bin/doom +70 -0
- data/bin/setup +8 -0
- data/bin/wad +152 -0
- data/lib/doom/bsp_renderer.rb +90 -0
- data/lib/doom/game.rb +84 -0
- data/lib/doom/hud.rb +80 -0
- data/lib/doom/map_loader.rb +255 -0
- data/lib/doom/renderer.rb +32 -0
- data/lib/doom/sprite_loader.rb +88 -0
- data/lib/doom/sprite_renderer.rb +56 -0
- data/lib/doom/texture_loader.rb +138 -0
- data/lib/doom/texture_mapper.rb +57 -0
- data/lib/doom/version.rb +5 -0
- data/lib/doom/wad_loader.rb +106 -0
- data/lib/doom/window.rb +41 -0
- data/lib/doom.rb +46 -0
- metadata +105 -0
@@ -0,0 +1,106 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Doom
|
4
|
+
# WADLoader is responsible for loading and parsing WAD files
|
5
|
+
class WADLoader
|
6
|
+
# WAD file header structure:
|
7
|
+
# - 4 bytes: WAD type (IWAD or PWAD)
|
8
|
+
# - 4 bytes: number of lumps
|
9
|
+
# - 4 bytes: directory offset
|
10
|
+
HEADER_SIZE = 12
|
11
|
+
|
12
|
+
# Directory entry structure:
|
13
|
+
# - 4 bytes: lump offset
|
14
|
+
# - 4 bytes: lump size
|
15
|
+
# - 8 bytes: lump name (null-terminated)
|
16
|
+
DIRECTORY_ENTRY_SIZE = 16
|
17
|
+
|
18
|
+
attr_reader :wad_type, :lumps, :directory, :filename, :num_lumps
|
19
|
+
|
20
|
+
# Initialize a new WADLoader with the given WAD file
|
21
|
+
# @param filename [String] path to the WAD file
|
22
|
+
def initialize(filename)
|
23
|
+
@filename = filename
|
24
|
+
@lumps = {}
|
25
|
+
@directory = []
|
26
|
+
load_wad
|
27
|
+
end
|
28
|
+
|
29
|
+
# Load and parse the WAD file
|
30
|
+
def load_wad
|
31
|
+
File.open(@filename, "rb") do |file|
|
32
|
+
read_header(file)
|
33
|
+
read_directory(file)
|
34
|
+
load_lumps(file)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Read the WAD file header
|
39
|
+
# @param file [File] the WAD file
|
40
|
+
def read_header(file)
|
41
|
+
header = file.read(HEADER_SIZE)
|
42
|
+
@wad_type = header[0..3]
|
43
|
+
@num_lumps = header[4..7].unpack("V")[0]
|
44
|
+
directory_offset = header[8..11].unpack("V")[0]
|
45
|
+
|
46
|
+
# Validate WAD type
|
47
|
+
unless ["IWAD", "PWAD"].include?(@wad_type)
|
48
|
+
raise Error, "Invalid WAD type: #{@wad_type}"
|
49
|
+
end
|
50
|
+
|
51
|
+
# Seek to the directory
|
52
|
+
file.seek(directory_offset)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Read the WAD directory
|
56
|
+
# @param file [File] the WAD file
|
57
|
+
def read_directory(file)
|
58
|
+
# The file position should already be at the directory after read_header
|
59
|
+
# We'll use the number of lumps from the instance variable
|
60
|
+
|
61
|
+
@num_lumps.times do
|
62
|
+
entry = file.read(DIRECTORY_ENTRY_SIZE)
|
63
|
+
lump_offset = entry[0..3].unpack("V")[0]
|
64
|
+
lump_size = entry[4..7].unpack("V")[0]
|
65
|
+
lump_name = entry[8..15].unpack("Z*")[0]
|
66
|
+
|
67
|
+
@directory << {
|
68
|
+
name: lump_name,
|
69
|
+
offset: lump_offset,
|
70
|
+
size: lump_size
|
71
|
+
}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Load all lumps from the WAD file
|
76
|
+
# @param file [File] the WAD file
|
77
|
+
def load_lumps(file)
|
78
|
+
@directory.each do |entry|
|
79
|
+
next if entry[:size] == 0 # Skip markers
|
80
|
+
|
81
|
+
file.seek(entry[:offset])
|
82
|
+
@lumps[entry[:name]] = file.read(entry[:size])
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Get a specific lump by name
|
87
|
+
# @param name [String] the name of the lump
|
88
|
+
# @return [String, nil] the lump data or nil if not found
|
89
|
+
def get_lump(name)
|
90
|
+
@lumps[name]
|
91
|
+
end
|
92
|
+
|
93
|
+
# List all lump names
|
94
|
+
# @return [Array<String>] array of lump names
|
95
|
+
def lump_names
|
96
|
+
@lumps.keys
|
97
|
+
end
|
98
|
+
|
99
|
+
# Check if a lump exists
|
100
|
+
# @param name [String] the name of the lump
|
101
|
+
# @return [Boolean] true if the lump exists
|
102
|
+
def lump_exists?(name)
|
103
|
+
@lumps.key?(name)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
data/lib/doom/window.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "gosu"
|
4
|
+
|
5
|
+
module Doom
|
6
|
+
# Window class for managing the game window
|
7
|
+
class Window < Gosu::Window
|
8
|
+
attr_reader :width, :height
|
9
|
+
attr_accessor :game
|
10
|
+
|
11
|
+
# Initialize a new Window with the given width and height
|
12
|
+
# @param width [Integer] the width of the window
|
13
|
+
# @param height [Integer] the height of the window
|
14
|
+
# @param fullscreen [Boolean] whether the window should be fullscreen
|
15
|
+
def initialize(width = 640, height = 480, fullscreen = false)
|
16
|
+
super(width, height, fullscreen)
|
17
|
+
@width = width
|
18
|
+
@height = height
|
19
|
+
self.caption = "Ruby Doom"
|
20
|
+
end
|
21
|
+
|
22
|
+
# Update the game state
|
23
|
+
def update
|
24
|
+
@game.update if @game
|
25
|
+
end
|
26
|
+
|
27
|
+
# Draw the game
|
28
|
+
def draw
|
29
|
+
@game.draw if @game
|
30
|
+
end
|
31
|
+
|
32
|
+
# Handle button press events
|
33
|
+
def button_down(id)
|
34
|
+
if @game
|
35
|
+
@game.button_down(id)
|
36
|
+
else
|
37
|
+
close if id == Gosu::KB_ESCAPE
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/doom.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "doom/version"
|
4
|
+
require_relative "doom/wad_loader"
|
5
|
+
require_relative "doom/map_loader"
|
6
|
+
require_relative "doom/texture_loader"
|
7
|
+
require_relative "doom/sprite_loader"
|
8
|
+
require_relative "doom/window"
|
9
|
+
require_relative "doom/renderer"
|
10
|
+
require_relative "doom/bsp_renderer"
|
11
|
+
require_relative "doom/texture_mapper"
|
12
|
+
require_relative "doom/sprite_renderer"
|
13
|
+
require_relative "doom/hud"
|
14
|
+
require_relative "doom/game"
|
15
|
+
|
16
|
+
module Doom
|
17
|
+
class Error < StandardError; end
|
18
|
+
|
19
|
+
# Load a WAD file and return loaders for its components
|
20
|
+
# @param filename [String] path to the WAD file
|
21
|
+
# @return [Hash] hash containing the various loaders
|
22
|
+
def self.load_wad(filename)
|
23
|
+
wad_loader = WADLoader.new(filename)
|
24
|
+
map_loader = MapLoader.new(wad_loader)
|
25
|
+
texture_loader = TextureLoader.new(wad_loader)
|
26
|
+
sprite_loader = SpriteLoader.new(wad_loader)
|
27
|
+
|
28
|
+
{
|
29
|
+
wad: wad_loader,
|
30
|
+
maps: map_loader,
|
31
|
+
textures: texture_loader,
|
32
|
+
sprites: sprite_loader
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
# Start the game with the given WAD file
|
37
|
+
# @param wad_file [String] path to the WAD file
|
38
|
+
# @param map_name [String] name of the map to start on (optional)
|
39
|
+
# @param width [Integer] width of the window (default: 640)
|
40
|
+
# @param height [Integer] height of the window (default: 480)
|
41
|
+
# @param fullscreen [Boolean] whether to start in fullscreen mode (default: false)
|
42
|
+
def self.start_game(wad_file, map_name = nil, width = 640, height = 480, fullscreen = false)
|
43
|
+
game = Game.new(wad_file, width, height, fullscreen)
|
44
|
+
game.start(map_name)
|
45
|
+
end
|
46
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: doom
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris Hasinski
|
8
|
+
bindir: bin
|
9
|
+
cert_chain: []
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
11
|
+
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: rake
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - "~>"
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '13.0'
|
19
|
+
type: :development
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - "~>"
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: '13.0'
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: minitest
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - "~>"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '5.0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '5.0'
|
40
|
+
- !ruby/object:Gem::Dependency
|
41
|
+
name: gosu
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '1.4'
|
47
|
+
type: :runtime
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1.4'
|
54
|
+
description: Ruby Doom is a Ruby gem that ports the classic Doom game to Ruby
|
55
|
+
email:
|
56
|
+
- krzysztof.hasinski@gmail.com
|
57
|
+
executables:
|
58
|
+
- doom
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- LICENSE.txt
|
63
|
+
- README.md
|
64
|
+
- bin/console
|
65
|
+
- bin/doom
|
66
|
+
- bin/setup
|
67
|
+
- bin/wad
|
68
|
+
- lib/doom.rb
|
69
|
+
- lib/doom/bsp_renderer.rb
|
70
|
+
- lib/doom/game.rb
|
71
|
+
- lib/doom/hud.rb
|
72
|
+
- lib/doom/map_loader.rb
|
73
|
+
- lib/doom/renderer.rb
|
74
|
+
- lib/doom/sprite_loader.rb
|
75
|
+
- lib/doom/sprite_renderer.rb
|
76
|
+
- lib/doom/texture_loader.rb
|
77
|
+
- lib/doom/texture_mapper.rb
|
78
|
+
- lib/doom/version.rb
|
79
|
+
- lib/doom/wad_loader.rb
|
80
|
+
- lib/doom/window.rb
|
81
|
+
homepage: https://github.com/khasinski/doom-rb
|
82
|
+
licenses:
|
83
|
+
- MIT
|
84
|
+
metadata:
|
85
|
+
homepage_uri: https://github.com/khasinski/doom-rb
|
86
|
+
source_code_uri: https://github.com/khasinski/doom-rb
|
87
|
+
changelog_uri: https://github.com/khasinski/doom-rb/blob/master/CHANGELOG.md
|
88
|
+
rdoc_options: []
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 2.6.0
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
requirements: []
|
102
|
+
rubygems_version: 3.6.8
|
103
|
+
specification_version: 4
|
104
|
+
summary: A Ruby port of the classic Doom game
|
105
|
+
test_files: []
|