Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
6a393ae
feat(GameObj-data.xml): new type jarable
mrhoribu Nov 10, 2025
0b8af7d
Update 66_jarable.rb
mrhoribu Nov 10, 2025
a4b7438
Update gem_spec.rb
mrhoribu Nov 10, 2025
9a3683a
Update core_spec.rb
mrhoribu Nov 10, 2025
c025a49
Update table.rb
mrhoribu Nov 10, 2025
62db218
Update migrator.rb
mrhoribu Nov 10, 2025
74e5700
Update 66_jarable.rb
mrhoribu Nov 10, 2025
38d8bb3
fix: rubocop
mrhoribu Nov 10, 2025
c543757
fix: rubocop
mrhoribu Nov 10, 2025
73988f4
Update change-set.rb
mrhoribu Nov 10, 2025
b60b5e8
Update migrator.rb
mrhoribu Nov 10, 2025
785d618
Update 66_jarable.rb
mrhoribu Nov 10, 2025
ae3d11e
Update change-set.rb
mrhoribu Nov 10, 2025
66cd4fb
Update convert.rb
mrhoribu Nov 10, 2025
3734ca6
Update migration.rb
mrhoribu Nov 10, 2025
27382fd
Update migrator.rb
mrhoribu Nov 10, 2025
5fc2119
Update table.rb
mrhoribu Nov 10, 2025
821f5ae
Update validate.rb
mrhoribu Nov 10, 2025
caec664
Update migration.rb
mrhoribu Nov 10, 2025
42860ee
Update gameobj.rb
mrhoribu Nov 10, 2025
86d857f
Update factories.rb
mrhoribu Nov 10, 2025
620604b
Update color.rb
mrhoribu Nov 10, 2025
56ba9da
Update gem_spec.rb
mrhoribu Nov 10, 2025
43f8c73
Update gem_spec.rb
mrhoribu Nov 10, 2025
683ff0c
Update rspec_tests.yml
mrhoribu Nov 10, 2025
1f6e4f7
Update rspec_tests.yml
mrhoribu Nov 10, 2025
61cc530
Update rspec_tests.yml
mrhoribu Nov 10, 2025
791806a
Merge pull request #9 from mrhoribu/feat/gameobj-jarable-type
mrhoribu Nov 10, 2025
adbc6ff
Merge branch 'elanthia-online:master' into feat/gameobj-data-jarable
mrhoribu Dec 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/rspec_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,12 @@ jobs:
version: 1.0
- name: Run type data migrations to create gameobj-data.xml
run: bin/migrate
- name: Upload gameobj-data.xml artifact
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4
with:
name: gameobj-data-ruby-${{ matrix.ruby }}
path: dist/gameobj-data.xml
retention-days: 1
overwrite: true
- name: Run RSpec tests
run: bundle exec rspec
73 changes: 61 additions & 12 deletions lib/lich/gameobj.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ class GameObj

attr_reader :id
attr_accessor :noun, :name, :before_name, :after_name
def initialize(id, noun, name, before=nil, after=nil)

def initialize(id, noun, name, before = nil, after = nil)
@id = id
@noun = noun
@noun = 'lapis' if @noun == 'lapis lazuli'
Expand All @@ -46,6 +47,7 @@ def initialize(id, noun, name, before=nil, after=nil)
@before_name = before
@after_name = after
end

def type
GameObj.load_data if @@type_data.empty?
list = @@type_data.keys.find_all { |t| (@name =~ @@type_data[t][:name] or @noun =~ @@type_data[t][:noun]) and (@@type_data[t][:exclude].nil? or @name !~ @@type_data[t][:exclude]) }
Expand All @@ -55,6 +57,7 @@ def type
list.join(',')
end
end

def sellable
GameObj.load_data if @@sellable_data.empty?
list = @@sellable_data.keys.find_all { |t| (@name =~ @@sellable_data[t][:name] or @noun =~ @@sellable_data[t][:noun]) and (@@sellable_data[t][:exclude].nil? or @name !~ @@sellable_data[t][:exclude]) }
Expand All @@ -64,17 +67,19 @@ def sellable
list.join(',')
end
end

def status
if @@npc_status.keys.include?(@id)
@@npc_status[@id]
elsif @@pc_status.keys.include?(@id)
@@pc_status[@id]
elsif @@loot.find { |obj| obj.id == @id } or @@inv.find { |obj| obj.id == @id } or @@room_desc.find { |obj| obj.id == @id } or @@fam_loot.find { |obj| obj.id == @id } or @@fam_npcs.find { |obj| obj.id == @id } or @@fam_pcs.find { |obj| obj.id == @id } or @@fam_room_desc.find { |obj| obj.id == @id } or (@@right_hand.id == @id) or (@@left_hand.id == @id) or @@contents.values.find { |list| list.find { |obj| obj.id == @id } }
elsif @@loot.find { |obj| obj.id == @id } or @@inv.find { |obj| obj.id == @id } or @@room_desc.find { |obj| obj.id == @id } or @@fam_loot.find { |obj| obj.id == @id } or @@fam_npcs.find { |obj| obj.id == @id } or @@fam_pcs.find { |obj| obj.id == @id } or @@fam_room_desc.find { |obj| obj.id == @id } or (@@right_hand.id == @id) or (@@left_hand.id == @id) or @@contents.values.find { |list| list.find { |obj| obj.id == @id } }
nil
else
'gone'
end
end

def status=(val)
if @@npcs.any? { |npc| npc.id == @id }
@@npc_status[@id] = val
Expand All @@ -84,52 +89,62 @@ def status=(val)
nil
end
end

def to_s
@noun
end

def empty?
false
end

def contents
@@contents[@id].dup
end

def GameObj.[](val)
if val.class == String
if val =~ /^\-?[0-9]+$/
obj = @@inv.find { |o| o.id == val } || @@loot.find { |o| o.id == val } || @@npcs.find { |o| o.id == val } || @@pcs.find { |o| o.id == val } || [ @@right_hand, @@left_hand ].find { |o| o.id == val } || @@room_desc.find { |o| o.id == val }
@@inv.find { |o| o.id == val } || @@loot.find { |o| o.id == val } || @@npcs.find { |o| o.id == val } || @@pcs.find { |o| o.id == val } || [@@right_hand, @@left_hand].find { |o| o.id == val } || @@room_desc.find { |o| o.id == val }
elsif val.split(' ').length == 1
obj = @@inv.find { |o| o.noun == val } || @@loot.find { |o| o.noun == val } || @@npcs.find { |o| o.noun == val } || @@pcs.find { |o| o.noun == val } || [ @@right_hand, @@left_hand ].find { |o| o.noun == val } || @@room_desc.find { |o| o.noun == val }
@@inv.find { |o| o.noun == val } || @@loot.find { |o| o.noun == val } || @@npcs.find { |o| o.noun == val } || @@pcs.find { |o| o.noun == val } || [@@right_hand, @@left_hand].find { |o| o.noun == val } || @@room_desc.find { |o| o.noun == val }
else
obj = @@inv.find { |o| o.name == val } || @@loot.find { |o| o.name == val } || @@npcs.find { |o| o.name == val } || @@pcs.find { |o| o.name == val } || [ @@right_hand, @@left_hand ].find { |o| o.name == val } || @@room_desc.find { |o| o.name == val } || @@inv.find { |o| o.name =~ /\b#{Regexp.escape(val.strip)}$/i } || @@loot.find { |o| o.name =~ /\b#{Regexp.escape(val.strip)}$/i } || @@npcs.find { |o| o.name =~ /\b#{Regexp.escape(val.strip)}$/i } || @@pcs.find { |o| o.name =~ /\b#{Regexp.escape(val.strip)}$/i } || [ @@right_hand, @@left_hand ].find { |o| o.name =~ /\b#{Regexp.escape(val.strip)}$/i } || @@room_desc.find { |o| o.name =~ /\b#{Regexp.escape(val.strip)}$/i } || @@inv.find { |o| o.name =~ /\b#{Regexp.escape(val).sub(' ', ' .*')}$/i } || @@loot.find { |o| o.name =~ /\b#{Regexp.escape(val).sub(' ', ' .*')}$/i } || @@npcs.find { |o| o.name =~ /\b#{Regexp.escape(val).sub(' ', ' .*')}$/i } || @@pcs.find { |o| o.name =~ /\b#{Regexp.escape(val).sub(' ', ' .*')}$/i } || [ @@right_hand, @@left_hand ].find { |o| o.name =~ /\b#{Regexp.escape(val).sub(' ', ' .*')}$/i } || @@room_desc.find { |o| o.name =~ /\b#{Regexp.escape(val).sub(' ', ' .*')}$/i }
@@inv.find { |o| o.name == val } || @@loot.find { |o| o.name == val } || @@npcs.find { |o| o.name == val } || @@pcs.find { |o| o.name == val } || [@@right_hand, @@left_hand].find { |o| o.name == val } || @@room_desc.find { |o| o.name == val } || @@inv.find { |o| o.name =~ /\b#{Regexp.escape(val.strip)}$/i } || @@loot.find { |o| o.name =~ /\b#{Regexp.escape(val.strip)}$/i } || @@npcs.find { |o| o.name =~ /\b#{Regexp.escape(val.strip)}$/i } || @@pcs.find { |o| o.name =~ /\b#{Regexp.escape(val.strip)}$/i } || [@@right_hand, @@left_hand].find { |o| o.name =~ /\b#{Regexp.escape(val.strip)}$/i } || @@room_desc.find { |o| o.name =~ /\b#{Regexp.escape(val.strip)}$/i } || @@inv.find { |o| o.name =~ /\b#{Regexp.escape(val).sub(' ', ' .*')}$/i } || @@loot.find { |o| o.name =~ /\b#{Regexp.escape(val).sub(' ', ' .*')}$/i } || @@npcs.find { |o| o.name =~ /\b#{Regexp.escape(val).sub(' ', ' .*')}$/i } || @@pcs.find { |o| o.name =~ /\b#{Regexp.escape(val).sub(' ', ' .*')}$/i } || [@@right_hand, @@left_hand].find { |o| o.name =~ /\b#{Regexp.escape(val).sub(' ', ' .*')}$/i } || @@room_desc.find { |o| o.name =~ /\b#{Regexp.escape(val).sub(' ', ' .*')}$/i }
end
elsif val.class == Regexp
obj = @@inv.find { |o| o.name =~ val } || @@loot.find { |o| o.name =~ val } || @@npcs.find { |o| o.name =~ val } || @@pcs.find { |o| o.name =~ val } || [ @@right_hand, @@left_hand ].find { |o| o.name =~ val } || @@room_desc.find { |o| o.name =~ val }
@@inv.find { |o| o.name =~ val } || @@loot.find { |o| o.name =~ val } || @@npcs.find { |o| o.name =~ val } || @@pcs.find { |o| o.name =~ val } || [@@right_hand, @@left_hand].find { |o| o.name =~ val } || @@room_desc.find { |o| o.name =~ val }
end
end

def GameObj
@noun
end

def full_name
"#{@before_name}#{' ' unless @before_name.nil? or @before_name.empty?}#{name}#{' ' unless @after_name.nil? or @after_name.empty?}#{@after_name}"
end
def GameObj.new_npc(id, noun, name, status=nil)

def GameObj.new_npc(id, noun, name, status = nil)
obj = GameObj.new(id, noun, name)
@@npcs.push(obj)
@@npc_status[id] = status
obj
end

def GameObj.new_loot(id, noun, name)
obj = GameObj.new(id, noun, name)
@@loot.push(obj)
obj
end
def GameObj.new_pc(id, noun, name, status=nil)

def GameObj.new_pc(id, noun, name, status = nil)
obj = GameObj.new(id, noun, name)
@@pcs.push(obj)
@@pc_status[id] = status
obj
end
def GameObj.new_inv(id, noun, name, container=nil, before=nil, after=nil)

def GameObj.new_inv(id, noun, name, container = nil, before = nil, after = nil)
obj = GameObj.new(id, noun, name, before, after)
if container
@@contents[container].push(obj)
Expand All @@ -138,141 +153,171 @@ def GameObj.new_inv(id, noun, name, container=nil, before=nil, after=nil)
end
obj
end

def GameObj.new_room_desc(id, noun, name)
obj = GameObj.new(id, noun, name)
@@room_desc.push(obj)
obj
end

def GameObj.new_fam_room_desc(id, noun, name)
obj = GameObj.new(id, noun, name)
@@fam_room_desc.push(obj)
obj
end

def GameObj.new_fam_loot(id, noun, name)
obj = GameObj.new(id, noun, name)
@@fam_loot.push(obj)
obj
end

def GameObj.new_fam_npc(id, noun, name)
obj = GameObj.new(id, noun, name)
@@fam_npcs.push(obj)
obj
end

def GameObj.new_fam_pc(id, noun, name)
obj = GameObj.new(id, noun, name)
@@fam_pcs.push(obj)
obj
end

def GameObj.new_right_hand(id, noun, name)
@@right_hand = GameObj.new(id, noun, name)
end

def GameObj.right_hand
@@right_hand.dup
end

def GameObj.new_left_hand(id, noun, name)
@@left_hand = GameObj.new(id, noun, name)
end

def GameObj.left_hand
@@left_hand.dup
end

def GameObj.clear_loot
@@loot.clear
end

def GameObj.clear_npcs
@@npcs.clear
@@npc_status.clear
end

def GameObj.clear_pcs
@@pcs.clear
@@pc_status.clear
end

def GameObj.clear_inv
@@inv.clear
end

def GameObj.clear_room_desc
@@room_desc.clear
end

def GameObj.clear_fam_room_desc
@@fam_room_desc.clear
end

def GameObj.clear_fam_loot
@@fam_loot.clear
end

def GameObj.clear_fam_npcs
@@fam_npcs.clear
end

def GameObj.clear_fam_pcs
@@fam_pcs.clear
end

def GameObj.npcs
if @@npcs.empty?
nil
else
@@npcs.dup
end
end

def GameObj.loot
if @@loot.empty?
nil
else
@@loot.dup
end
end

def GameObj.pcs
if @@pcs.empty?
nil
else
@@pcs.dup
end
end

def GameObj.inv
if @@inv.empty?
nil
else
@@inv.dup
end
end

def GameObj.room_desc
if @@room_desc.empty?
nil
else
@@room_desc.dup
end
end

def GameObj.fam_room_desc
if @@fam_room_desc.empty?
nil
else
@@fam_room_desc.dup
end
end

def GameObj.fam_loot
if @@fam_loot.empty?
nil
else
@@fam_loot.dup
end
end

def GameObj.fam_npcs
if @@fam_npcs.empty?
nil
else
@@fam_npcs.dup
end
end

def GameObj.fam_pcs
if @@fam_pcs.empty?
nil
else
@@fam_pcs.dup
end
end

def GameObj.clear_container(container_id)
@@contents[container_id] = Array.new
end

def GameObj.delete_container(container_id)
@@contents.delete(container_id)
end

def GameObj.dead
dead_list = Array.new
for obj in @@npcs
Expand All @@ -281,10 +326,12 @@ def GameObj.dead
return nil if dead_list.empty?
return dead_list
end

def GameObj.containers
@@contents.dup
end
def GameObj.load_data(filename=nil)

def GameObj.load_data(filename = nil)
if $SAFE == 0
if filename.nil?
if File.exist?("#{DATA_DIR}/gameobj-data.xml")
Expand All @@ -302,15 +349,15 @@ def GameObj.load_data(filename=nil)
File.open(filename) { |file|
doc = REXML::Document.new(file.read)
doc.elements.each('data/type') { |e|
if type = e.attributes['name']
if (type = e.attributes['name'])
@@type_data[type] = Hash.new
@@type_data[type][:name] = Regexp.new(e.elements['name'].text) unless e.elements['name'].text.nil? or e.elements['name'].text.empty?
@@type_data[type][:noun] = Regexp.new(e.elements['noun'].text) unless e.elements['noun'].text.nil? or e.elements['noun'].text.empty?
@@type_data[type][:exclude] = Regexp.new(e.elements['exclude'].text) unless e.elements['exclude'].text.nil? or e.elements['exclude'].text.empty?
end
}
doc.elements.each('data/sellable') { |e|
if sellable = e.attributes['name']
if (sellable = e.attributes['name'])
@@sellable_data[sellable] = Hash.new
@@sellable_data[sellable][:name] = Regexp.new(e.elements['name'].text) unless e.elements['name'].text.nil? or e.elements['name'].text.empty?
@@sellable_data[sellable][:noun] = Regexp.new(e.elements['noun'].text) unless e.elements['noun'].text.nil? or e.elements['noun'].text.empty?
Expand All @@ -336,9 +383,11 @@ def GameObj.load_data(filename=nil)
@@elevated_load.call
end
end

def GameObj.type_data
@@type_data
end

def GameObj.sellable_data
@@sellable_data
end
Expand Down
2 changes: 1 addition & 1 deletion lib/migration.rb
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Dir[File.join(__dir__, "migration", "**", "*.rb")].each do |file| require(file) end
Dir[File.join(__dir__, "migration", "**", "*.rb")].each do |file| require(file) end
Loading