Skip to content

Commit 7a53a55

Browse files
committed
[dr][drdefs.rb] Simplify npc detection and add ordinals to them
We now parse room_objects once and detect live and dead NPCs in one place, adding ordinals to all NPCs. Works well for me, but should wait till the next release is out, so don't merge it yet, please.
1 parent e05b2fc commit 7a53a55

File tree

1 file changed

+24
-17
lines changed

1 file changed

+24
-17
lines changed

lib/dragonrealms/drinfomon/drdefs.rb

+24-17
Original file line numberDiff line numberDiff line change
@@ -57,26 +57,33 @@ def find_pcs_sitting(room_players)
5757
.map { |obj| obj.strip.scan(/\w+$/).first }
5858
end
5959

60-
def find_npcs(room_objs)
60+
def find_all_npcs(room_objs)
6161
room_objs.sub(/You also see/, '').sub(/ with a [\w\s]+ sitting astride its back/, '').strip
62-
.scan(%r{<pushBold/>[^<>]*<popBold/> which appears dead|<pushBold/>[^<>]*<popBold/> \(dead\)|<pushBold/>[^<>]*<popBold/>})
63-
.reject { |obj| obj =~ /which appears dead|\(dead\)/ }
64-
.map { |obj| obj.sub(/.*alfar warrior.*/, 'alfar warrior') }
65-
.map { |obj| obj.sub(/.*sinewy leopard.*/, 'sinewy leopard') }
66-
.map { |obj| obj.sub(/.*lesser naga.*/, 'lesser naga') }
67-
.map { |obj| obj.sub(/.*Shadow Servant.*/, 'Shadow Servant') }
68-
.map { |obj| obj.sub('<pushBold/>', '').sub(%r{<popBold/>.*}, '') }
69-
.map { |obj| obj.split(/\sand\s/).last.sub(/(?:\sglowing)?\swith\s.*/, '') }
70-
.map { |obj| obj.strip.scan(/[A-z'-]+$/).first }
62+
.scan(%r{<pushBold/>[^<>]*<popBold/> which appears dead|<pushBold/>[^<>]*<popBold/> \(dead\)|<pushBold/>[^<>]*<popBold/>})
63+
7164
end
72-
65+
66+
def clean_npc_string(npc_string)
67+
tmp_npc_string = npc_string.map { |obj| obj.sub(/.*alfar warrior.*/, 'alfar warrior') }
68+
.map { |obj| obj.sub(/.*sinewy leopard.*/, 'sinewy leopard') }
69+
.map { |obj| obj.sub(/.*lesser naga.*/, 'lesser naga') }
70+
.map { |obj| obj.sub('<pushBold/>', '').sub(%r{<popBold/>.*}, '') }
71+
.map { |obj| obj.split(/\sand\s/).last.sub(/(?:\sglowing)?\swith\s.*/, '') }
72+
.map { |obj| obj.strip.scan(/[A-z'-]+$/).first }
73+
.sort
74+
flat_npcs = []
75+
tmp_npc_string.uniq.each { |npc| flat_npcs << tmp_npc_string.size.times.select {|i| tmp_npc_string[i] == npc}.size.times.map { |number| number.zero? ? tmp_npc_string[0] : tmp_npc_string[number].sub(npc, "#{$ORDINALS[number]} #{npc}") } }
76+
flat_npcs.flatten
77+
end
78+
79+
def find_npcs(room_objs)
80+
npcs = find_all_npcs(room_objs).reject { |obj| obj =~ /which appears dead|\(dead\)/ }
81+
clean_npc_string(npcs)
82+
end
83+
7384
def find_dead_npcs(room_objs)
74-
room_objs.sub(/You also see/, '').sub(/ with a [\w\s]+ sitting astride its back/, '')
75-
.strip.scan(%r{<pushBold/>[^<>]*<popBold/> which appears dead|<pushBold/>[^<>]*<popBold/> \(dead\)|<pushBold/>[^<>]*<popBold/>})
76-
.select { |obj| obj =~ /which appears dead|\(dead\)/ }
77-
.map { |obj| obj.sub('<pushBold/>', '').sub(%r{<popBold/>.*}, '') }
78-
.map { |obj| obj.split(/\sand\s/).last.sub(/(?:\sglowing)?\swith\s.*/, '') }
79-
.map { |obj| obj.strip.scan(/[A-z'-]+$/).first }
85+
dead_npcs = find_all_npcs(room_objs).select { |obj| obj =~ /which appears dead|\(dead\)/ }
86+
clean_npc_string(dead_npcs)
8087
end
8188

8289
def find_objects(room_objs)

0 commit comments

Comments
 (0)