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.
@@ -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
@@ -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: []