ifmapper 0.9.5 → 0.9.6
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.
- data/HISTORY.txt +66 -0
- data/IFMapper.gemspec +2 -2
- data/lib/IFMapper/FXConnection.rb +1 -0
- data/lib/IFMapper/FXMap.rb +9 -10
- data/lib/IFMapper/FXMapFileDialog.rb +1 -1
- data/lib/IFMapper/FXMapperWindow.rb +49 -8
- data/lib/IFMapper/FXRoomDialogBox.rb +1 -1
- data/lib/IFMapper/InformReader.rb +39 -25
- data/lib/IFMapper/Room.rb +1 -3
- data/lib/IFMapper/TADSReader.rb +170 -103
- data/lib/IFMapper/TranscriptDialogBox.rb +74 -16
- data/lib/IFMapper/TranscriptReader.rb +73 -34
- data/maps/AMFV.map +0 -0
- data/maps/AllRoads.map +0 -0
- data/maps/CityOfSecrets.map +0 -0
- data/maps/Janitor.map +0 -0
- data/maps/Tangle.map +0 -0
- data/maps/balances.map +0 -0
- data/maps/bear.map +0 -0
- data/maps/break_in.map +0 -0
- data/maps/deadline.map +0 -0
- data/maps/delusions.map +0 -0
- data/maps/dreamhold.map +0 -0
- data/maps/drift3.map +0 -0
- data/maps/eas.map +0 -0
- data/maps/eas2.map +0 -0
- data/maps/eas3.map +0 -0
- data/maps/fallacy.map +0 -0
- data/maps/heist.map +0 -0
- data/maps/heroes.map +0 -0
- data/maps/lurkinghorror.map +0 -0
- data/maps/moonmist.map +0 -0
- data/maps/photograph.map +0 -0
- data/maps/pkgirl.map +0 -0
- data/maps/risorgimento.map +0 -0
- data/maps/sherbet.map +0 -0
- data/maps/slouch.map +0 -0
- data/maps/wasp.map +0 -0
- data/maps/zerosum.map +0 -0
- metadata +21 -9
@@ -14,7 +14,7 @@ class TranscriptReader
|
|
14
14
|
|
15
15
|
TRANSCRIPT = /^(?:Start of a transcript of|Here begins a transcript of interation with (.*)|Here begins a transcript of interation with)/
|
16
16
|
|
17
|
-
PROMPT = /^>\s*/
|
17
|
+
# PROMPT = /^>\s*/
|
18
18
|
LOOK = /^l(ook)?/i
|
19
19
|
UNDO = /^undo$/i
|
20
20
|
RESTART = /^restart$/i
|
@@ -52,6 +52,7 @@ class TranscriptReader
|
|
52
52
|
# No exit replies
|
53
53
|
NO_EXIT = [
|
54
54
|
/\byou\scan't\sgo\sthat\sway\b/i,
|
55
|
+
/\byou\scan't\sgo\sin\sthat\sdirection\b/i,
|
55
56
|
/\bdoorways\slead\s/i,
|
56
57
|
/\bthat's\sa\swall\b/i,
|
57
58
|
/\bno\sexit\b/i,
|
@@ -68,35 +69,38 @@ class TranscriptReader
|
|
68
69
|
|
69
70
|
# remove things like (on the bed)
|
70
71
|
NAME_REMOVE = /(\s+\(.+\)|,\s+[io]n\s+[^\,\.]+)/
|
71
|
-
NAME_INVALID =
|
72
|
-
|
72
|
+
NAME_INVALID = /--|[:;\*\[\]\|\+\=!\.\?\000]/
|
73
|
+
SALUT = '(Mr|Mr?s|Miss|Jr|Sr|St|Dr|Ave|Inc)'
|
74
|
+
SALUTATIONS = /\b#{SALUT}\./
|
73
75
|
NAME_MAXWORDS = 20
|
74
76
|
NAME_MAXUNCAP = 4 # so that lowercase "room" "end" "of" will be accepted
|
75
77
|
|
76
78
|
# Default room description recognition parameters.
|
77
|
-
DESC_MINWORDS =
|
79
|
+
DESC_MINWORDS = 20
|
78
80
|
|
79
81
|
# Ignore these words when matching words in description
|
80
82
|
# To avoid cases, like: An open gate vs. A closed gate
|
81
83
|
DESC_IGNORE = /(?:an|a|open(ed)?|closed?)/i
|
82
84
|
|
83
85
|
|
84
|
-
RESTORE_OK = /\b(Ok|completed?|
|
86
|
+
RESTORE_OK = /\b(Okay|Ok|completed?|Restored)\b/
|
85
87
|
|
86
88
|
##
|
87
|
-
THE = '(?:the|a|your|some of the|some)\s+'
|
89
|
+
THE = '(?:the|an|a|your|some of the|some)\s+'
|
88
90
|
|
89
91
|
## Regex to eliminate articles from get/take replies.
|
90
92
|
ARTICLE = /^#{THE}/i
|
91
93
|
|
92
94
|
## Possible nessages indicating get/take succeeded
|
93
95
|
TAKE_OBJ = '([\w\d\-\'\s]+)'
|
94
|
-
TAKE_FROM = '(?:\s+(up|from|out)\s+.*)
|
96
|
+
TAKE_FROM = '(?:\s+(?:up|from|out)\s+.*)$'
|
95
97
|
TAKE_ALIAS = '(?:grab|pick\s+up|pick|pilfer|take(?:\s+up)?)'
|
96
98
|
TAKE_OK = [
|
97
99
|
/\btaken\b/i,
|
98
100
|
/you\s+have\s+now\s+(?:got\s+)?(?:#{THE})?#{TAKE_OBJ}#{TAKE_FROM}/i,
|
101
|
+
/you\s+have\s+now\s+(?:got\s+)?(?:#{THE})?#{TAKE_OBJ}/i,
|
99
102
|
/you\s+#{TAKE_ALIAS}\s+(?:#{THE})?#{TAKE_OBJ}#{TAKE_FROM}/i,
|
103
|
+
/you\s+#{TAKE_ALIAS}\s+(?:#{THE})?#{TAKE_OBJ}/i,
|
100
104
|
/you\s+now\s+have\s+(?:got\s+)?(?:#{THE})?#{TAKE_OBJ}/i,
|
101
105
|
/you\s+pick\s+up\s+(?:#{THE})?#{TAKE_OBJ}/i,
|
102
106
|
/you\s+are\s+now\s+holding\s+(?:#{THE})?#{TAKE_OBJ}/i,
|
@@ -119,11 +123,21 @@ class TranscriptReader
|
|
119
123
|
IDENTIFY_BY_SHORTNAME = 1
|
120
124
|
|
121
125
|
SHORTNAME_CLASSIC = 0
|
122
|
-
|
123
|
-
|
126
|
+
SHORTNAME_CAPITALIZED = 1
|
127
|
+
SHORTNAME_MOONMIST = 2
|
128
|
+
SHORTNAME_WITNESS = 3
|
129
|
+
SHORTNAME_ADRIFT = 4
|
124
130
|
|
125
131
|
attr_accessor :identify, :shortName, :map
|
126
132
|
|
133
|
+
def shortName=(x)
|
134
|
+
@shortName = x
|
135
|
+
if x == SHORTNAME_ADRIFT
|
136
|
+
@prompt = /^[a-z]/
|
137
|
+
else
|
138
|
+
@prompt = /^>\s*/
|
139
|
+
end
|
140
|
+
end
|
127
141
|
|
128
142
|
|
129
143
|
#
|
@@ -244,7 +258,7 @@ class TranscriptReader
|
|
244
258
|
# Directly north
|
245
259
|
/\bDirectly\s+#{DIR}/i,
|
246
260
|
# continues|lies|etc... east
|
247
|
-
/(runs|bears|leads|heads|opens|winds|continues|branches|lies|wanders|bends|curves)\s+#{DIR}\b/i,
|
261
|
+
/(runs|bears|leads|heads|opens|winds|continues\s+on|continues|branches|lies|wanders|bends|curves)\s+#{DIR}\b/i,
|
248
262
|
/(running|leading|heading|opening|branching|lying|wandering|looking|bending)\s+#{DIR}\b/i,
|
249
263
|
]
|
250
264
|
|
@@ -312,7 +326,6 @@ class TranscriptReader
|
|
312
326
|
@here.selected = true if @here
|
313
327
|
@map.create_pathmap
|
314
328
|
@map.zoom = @map.zoom
|
315
|
-
puts 'transcript zoom done'
|
316
329
|
@map.center_view_on_room(@here) if @here
|
317
330
|
@map.draw
|
318
331
|
end
|
@@ -325,7 +338,7 @@ class TranscriptReader
|
|
325
338
|
# Read all commands
|
326
339
|
#
|
327
340
|
loop do
|
328
|
-
line.sub!(
|
341
|
+
line.sub!(@prompt, '') if @prompt.to_s =~ />/
|
329
342
|
line.chop!
|
330
343
|
line.sub!(/\s+$/, '')
|
331
344
|
cmd = line
|
@@ -333,14 +346,12 @@ class TranscriptReader
|
|
333
346
|
# Read reply
|
334
347
|
reply = []
|
335
348
|
while line = @f.gets
|
336
|
-
break if line =~
|
349
|
+
break if line =~ @prompt
|
337
350
|
line.chop!
|
338
351
|
line.sub!(/\s+$/,'')
|
339
352
|
reply << line
|
340
353
|
end
|
341
354
|
|
342
|
-
break if not line
|
343
|
-
|
344
355
|
if cmd =~ UNDO
|
345
356
|
@moves.pop
|
346
357
|
else
|
@@ -358,6 +369,8 @@ class TranscriptReader
|
|
358
369
|
@moves << move
|
359
370
|
end
|
360
371
|
|
372
|
+
break if not line
|
373
|
+
|
361
374
|
end
|
362
375
|
|
363
376
|
|
@@ -677,10 +690,10 @@ class TranscriptReader
|
|
677
690
|
if score == 1 and desc and room.desc
|
678
691
|
# We have a description...
|
679
692
|
# Try exact description match first
|
680
|
-
score +=
|
693
|
+
score += 100 if room.desc == desc
|
681
694
|
|
682
695
|
# Try substring match
|
683
|
-
score +=
|
696
|
+
score += 50 if room.desc.index(desc)
|
684
697
|
|
685
698
|
# If we have a room where both name and desc match,
|
686
699
|
# we get a better score than just description only.
|
@@ -693,18 +706,24 @@ class TranscriptReader
|
|
693
706
|
dwords = room.desc.split(' ')
|
694
707
|
words = desc.split(' ')
|
695
708
|
match = true
|
696
|
-
0
|
709
|
+
count = 0
|
710
|
+
0.upto(desc.size) { |i|
|
697
711
|
# Ignore some words (like open/close, which may just mean
|
698
712
|
# some doors changed state)
|
699
713
|
next if words[i] =~ DESC_IGNORE
|
700
714
|
|
701
715
|
if words[i] != dwords[i]
|
702
|
-
|
703
|
-
|
716
|
+
if count < DESC_MINWORDS
|
717
|
+
match = false
|
718
|
+
break
|
719
|
+
else
|
720
|
+
next
|
721
|
+
end
|
704
722
|
end
|
723
|
+
count += 1
|
705
724
|
}
|
706
725
|
|
707
|
-
score +=
|
726
|
+
score += count if match
|
708
727
|
end
|
709
728
|
end
|
710
729
|
next if score <= bestscore
|
@@ -737,10 +756,10 @@ class TranscriptReader
|
|
737
756
|
if desc and room.desc
|
738
757
|
# We have a description...
|
739
758
|
# Try exact description match first
|
740
|
-
score +=
|
759
|
+
score += 100 if room.desc == desc
|
741
760
|
|
742
761
|
# Try substring match
|
743
|
-
score +=
|
762
|
+
score += 50 if room.desc.index(desc)
|
744
763
|
|
745
764
|
# If we have a room where both name and desc match,
|
746
765
|
# we get a better score than just description only.
|
@@ -753,18 +772,24 @@ class TranscriptReader
|
|
753
772
|
dwords = room.desc.split(' ')
|
754
773
|
words = desc.split(' ')
|
755
774
|
match = true
|
756
|
-
0
|
775
|
+
count = 0
|
776
|
+
0.upto(desc.size) { |i|
|
757
777
|
# Ignore some words (like open/close, which may just mean
|
758
778
|
# some doors changed state)
|
759
779
|
next if words[i] =~ DESC_IGNORE
|
760
780
|
|
761
781
|
if words[i] != dwords[i]
|
762
|
-
|
763
|
-
|
782
|
+
if count < DESC_MINWORDS
|
783
|
+
match = false
|
784
|
+
break
|
785
|
+
else
|
786
|
+
next
|
787
|
+
end
|
764
788
|
end
|
789
|
+
count += 1
|
765
790
|
}
|
766
791
|
|
767
|
-
score +=
|
792
|
+
score += count if match and room.name == name
|
768
793
|
end
|
769
794
|
else
|
770
795
|
# Just the name, not so good
|
@@ -791,12 +816,14 @@ class TranscriptReader
|
|
791
816
|
|
792
817
|
def room_name(line)
|
793
818
|
case @shortName
|
794
|
-
when
|
795
|
-
return room_name_classic(line)
|
819
|
+
when SHORTNAME_CAPITALIZED
|
820
|
+
return room_name_classic(line, false)
|
796
821
|
when SHORTNAME_MOONMIST
|
797
822
|
return room_name_moonmist(line)
|
798
823
|
when SHORTNAME_WITNESS
|
799
824
|
return room_name_witness(line)
|
825
|
+
else
|
826
|
+
return room_name_classic(line, true)
|
800
827
|
end
|
801
828
|
end
|
802
829
|
|
@@ -812,6 +839,12 @@ class TranscriptReader
|
|
812
839
|
return words.join(' ')
|
813
840
|
end
|
814
841
|
|
842
|
+
def room_name_alan(line)
|
843
|
+
return false if line !~ /^[^.]+\.$/
|
844
|
+
line.sub!(/\.$/, '')
|
845
|
+
return room_name_classic(line, true)
|
846
|
+
end
|
847
|
+
|
815
848
|
def room_name_witness(line)
|
816
849
|
if line =~ /^You\sare\s(?:now\s)?(?:[io]n\s)?(?:#{THE})?([\w'\d\s\-_]+)\.$/
|
817
850
|
return false if $1 =~ /own feet/
|
@@ -835,7 +868,7 @@ class TranscriptReader
|
|
835
868
|
#
|
836
869
|
# Determine if line corresponds to a room name
|
837
870
|
#
|
838
|
-
def room_name_classic(line)
|
871
|
+
def room_name_classic(line, all_capitals = true)
|
839
872
|
# Check if user/game has created a room with that name already
|
840
873
|
return line if find_room(line, nil)
|
841
874
|
|
@@ -869,12 +902,14 @@ class TranscriptReader
|
|
869
902
|
return false if line =~ /^[A-Z\d,\.\/\-"'\s]+$/ or line =~ /\s\s/ or
|
870
903
|
line =~ /^".*"$/ or line =~ /^"[^"]+$/ or line =~ /^\d+\)/
|
871
904
|
|
905
|
+
return false if not all_capitals and words.size > 6
|
906
|
+
|
872
907
|
# If not, check all words of 4 chars or more are capitalized
|
873
908
|
# and that there are no 3 or more short letter words together
|
874
909
|
# (which means a diagram)
|
875
910
|
num = 0
|
876
911
|
words.each { |w|
|
877
|
-
return false if w =~ /^[a-z]/ and w.size > NAME_MAXUNCAP
|
912
|
+
return false if all_capitals and w =~ /^[a-z]/ and w.size > NAME_MAXUNCAP
|
878
913
|
if w.size <= 2
|
879
914
|
num += 1
|
880
915
|
return false if num > 2
|
@@ -883,6 +918,9 @@ class TranscriptReader
|
|
883
918
|
end
|
884
919
|
}
|
885
920
|
|
921
|
+
# Restore period to salutations
|
922
|
+
line.sub!(/\b#{SALUT}\b/, '\1.')
|
923
|
+
|
886
924
|
# Okay, it is a room.
|
887
925
|
return line
|
888
926
|
end
|
@@ -1212,7 +1250,7 @@ class TranscriptReader
|
|
1212
1250
|
|
1213
1251
|
def destroy
|
1214
1252
|
@t.kill if @t
|
1215
|
-
@f.close
|
1253
|
+
@f.close if @f
|
1216
1254
|
GC.start
|
1217
1255
|
end
|
1218
1256
|
|
@@ -1230,7 +1268,8 @@ class TranscriptReader
|
|
1230
1268
|
end
|
1231
1269
|
|
1232
1270
|
def initialize(map, file)
|
1233
|
-
@shortName = 0
|
1271
|
+
@shortName = 0
|
1272
|
+
@prompt = /^>\s*/
|
1234
1273
|
@identify = 0
|
1235
1274
|
|
1236
1275
|
@file = file
|
@@ -1264,7 +1303,7 @@ class TranscriptReader
|
|
1264
1303
|
end
|
1265
1304
|
@map.name = capitalize_room(@map.name)
|
1266
1305
|
end
|
1267
|
-
break if
|
1306
|
+
break if @prompt =~ line
|
1268
1307
|
end
|
1269
1308
|
parse_line(line)
|
1270
1309
|
end
|
data/maps/AMFV.map
ADDED
Binary file
|
data/maps/AllRoads.map
CHANGED
Binary file
|
data/maps/CityOfSecrets.map
CHANGED
Binary file
|
data/maps/Janitor.map
ADDED
Binary file
|
data/maps/Tangle.map
CHANGED
Binary file
|
data/maps/balances.map
ADDED
Binary file
|
data/maps/bear.map
ADDED
Binary file
|
data/maps/break_in.map
CHANGED
Binary file
|
data/maps/deadline.map
CHANGED
Binary file
|
data/maps/delusions.map
CHANGED
Binary file
|
data/maps/dreamhold.map
CHANGED
Binary file
|
data/maps/drift3.map
ADDED
Binary file
|
data/maps/eas.map
CHANGED
Binary file
|
data/maps/eas2.map
CHANGED
Binary file
|
data/maps/eas3.map
CHANGED
Binary file
|
data/maps/fallacy.map
ADDED
Binary file
|
data/maps/heist.map
ADDED
Binary file
|
data/maps/heroes.map
ADDED
Binary file
|
data/maps/lurkinghorror.map
CHANGED
Binary file
|
data/maps/moonmist.map
CHANGED
Binary file
|
data/maps/photograph.map
ADDED
Binary file
|
data/maps/pkgirl.map
ADDED
Binary file
|
data/maps/risorgimento.map
CHANGED
Binary file
|
data/maps/sherbet.map
CHANGED
Binary file
|
data/maps/slouch.map
CHANGED
Binary file
|
data/maps/wasp.map
ADDED
Binary file
|
data/maps/zerosum.map
ADDED
Binary file
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ifmapper
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.9.
|
7
|
-
date: 2005-09-
|
6
|
+
version: 0.9.6
|
7
|
+
date: 2005-09-19
|
8
8
|
summary: Interactive Fiction Mapping Tool.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -21,42 +21,42 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
21
21
|
-
|
22
22
|
- ">="
|
23
23
|
- !ruby/object:Gem::Version
|
24
|
-
version: 1.
|
24
|
+
version: 1.8.0
|
25
25
|
version:
|
26
26
|
platform: ruby
|
27
27
|
authors:
|
28
28
|
- Gonzalo Garramuno
|
29
29
|
files:
|
30
30
|
- IFMapper.rbw
|
31
|
+
- lib/IFMapper/FXMap.rb
|
31
32
|
- lib/IFMapper/Map.rb
|
32
33
|
- lib/IFMapper/FXRoom.rb
|
33
34
|
- lib/IFMapper/FXSectionDialogBox.rb
|
34
|
-
- lib/IFMapper/
|
35
|
+
- lib/IFMapper/FXMapperWindow.rb
|
35
36
|
- lib/IFMapper/Section.rb
|
37
|
+
- lib/IFMapper/FXConnection.rb
|
36
38
|
- lib/IFMapper/FXMapColorBox.rb
|
37
39
|
- lib/IFMapper/IFMReader.rb
|
38
40
|
- lib/IFMapper/IFMWriter.rb
|
39
41
|
- lib/IFMapper/FXWarningBox.rb
|
40
|
-
- lib/IFMapper/FXMap.rb
|
41
42
|
- lib/IFMapper/FXMapperSettings.rb
|
42
|
-
- lib/IFMapper/FXConnection.rb
|
43
|
-
- lib/IFMapper/FXMapperWindow.rb
|
44
43
|
- lib/IFMapper/Connection.rb
|
45
44
|
- lib/IFMapper/MapPrinting.rb
|
46
45
|
- lib/IFMapper/FXDCPostscript.rb
|
47
46
|
- lib/IFMapper/FXDCPrint.rb
|
47
|
+
- lib/IFMapper/Room.rb
|
48
48
|
- lib/IFMapper/PDFMapExporter.rb
|
49
49
|
- lib/IFMapper/TranscriptReader.rb
|
50
50
|
- lib/IFMapper/FXMapDialogBox.rb
|
51
51
|
- lib/IFMapper/FXSpline.rb
|
52
52
|
- lib/IFMapper/InformReader.rb
|
53
|
-
- lib/IFMapper/
|
53
|
+
- lib/IFMapper/FXMapFileDialog.rb
|
54
54
|
- lib/IFMapper/InformWriter.rb
|
55
55
|
- lib/IFMapper/FXSection.rb
|
56
56
|
- lib/IFMapper/TADSReader.rb
|
57
57
|
- lib/IFMapper/InformReaderOld.rb
|
58
|
-
- lib/IFMapper/FXMapFileDialog.rb
|
59
58
|
- lib/IFMapper/TADSWriter.rb
|
59
|
+
- lib/IFMapper/FXRoomDialogBox.rb
|
60
60
|
- lib/IFMapper/FXConnectionDialogBox.rb
|
61
61
|
- lib/IFMapper/AStar.rb
|
62
62
|
- lib/IFMapper/TranscriptDialogBox.rb
|
@@ -140,6 +140,18 @@ files:
|
|
140
140
|
- maps/break_in.map
|
141
141
|
- maps/moonmist.map
|
142
142
|
- maps/dreamhold.map
|
143
|
+
- maps/AMFV.map
|
144
|
+
- maps/wasp.map
|
145
|
+
- maps/Janitor.map
|
146
|
+
- maps/bear.map
|
147
|
+
- maps/zerosum.map
|
148
|
+
- maps/balances.map
|
149
|
+
- maps/fallacy.map
|
150
|
+
- maps/heist.map
|
151
|
+
- maps/pkgirl.map
|
152
|
+
- maps/heroes.map
|
153
|
+
- maps/photograph.map
|
154
|
+
- maps/drift3.map
|
143
155
|
- icons/filenew.png
|
144
156
|
- icons/fileopen.png
|
145
157
|
- icons/filesave.png
|