ifmapper 0.9.9 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,6 +8,7 @@ class FXRoomDialogBox < FXDialogBox
8
8
  attr_writer :map
9
9
 
10
10
  def copy_to()
11
+
11
12
  @room.name = @name.text
12
13
  @room.objects = @objects.text
13
14
  @room.objects.gsub!(/[,\t]+/, "\n")
@@ -30,7 +31,7 @@ class FXRoomDialogBox < FXDialogBox
30
31
 
31
32
  # Select text for quick editing if it uses default location name
32
33
  @name.setCursorPos room.name.size
33
- if room.name == 'New Location'
34
+ if room.name == MSG_NEW_LOCATION
34
35
  self.setFocus
35
36
  @name.selectAll
36
37
  @name.setFocus
@@ -85,14 +86,14 @@ class FXRoomDialogBox < FXDialogBox
85
86
  decor = DECOR_TITLE|DECOR_BORDER|DECOR_CLOSE
86
87
  end
87
88
 
88
- super( map.window, "Room Information", decor, pos[0], pos[1], 0, 0 )
89
+ super( map.window, BOX_ROOM_INFORMATION, decor, pos[0], pos[1], 0, 0 )
89
90
  mainFrame = FXVerticalFrame.new(self,
90
91
  FRAME_SUNKEN|FRAME_THICK|
91
92
  LAYOUT_FILL_X|LAYOUT_FILL_Y)
92
93
 
93
94
  frame = FXHorizontalFrame.new(mainFrame, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
94
95
 
95
- FXLabel.new(frame, "Location: ", nil, 0, LAYOUT_FILL_X)
96
+ FXLabel.new(frame, BOX_LOCATION, nil, 0, LAYOUT_FILL_X)
96
97
  @name = FXTextField.new(frame, 40, nil, 0, LAYOUT_FILL_ROW)
97
98
 
98
99
 
@@ -104,8 +105,8 @@ class FXRoomDialogBox < FXDialogBox
104
105
  LAYOUT_FILL_X|LAYOUT_FILL_Y)
105
106
 
106
107
  frame2 = FXHorizontalFrame.new(leftFrame, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
107
- FXLabel.new(frame2, "Objects: ", nil, 0, LAYOUT_FILL_X)
108
- @darkness = FXCheckButton.new(frame2, "Darkness", nil, 0,
108
+ FXLabel.new(frame2, BOX_OBJECTS, nil, 0, LAYOUT_FILL_X)
109
+ @darkness = FXCheckButton.new(frame2, BOX_DARKNESS, nil, 0,
109
110
  ICON_BEFORE_TEXT|LAYOUT_CENTER_X|
110
111
  LAYOUT_SIDE_RIGHT)
111
112
 
@@ -115,7 +116,7 @@ class FXRoomDialogBox < FXDialogBox
115
116
 
116
117
  @tasksFrame = FXVerticalFrame.new(leftFrame, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|
117
118
  LAYOUT_FILL_Y)
118
- FXLabel.new(@tasksFrame, "Tasks: ", nil, 0, LAYOUT_FILL_X)
119
+ FXLabel.new(@tasksFrame, BOX_TASKS, nil, 0, LAYOUT_FILL_X)
119
120
  @tasks = FXText.new(@tasksFrame, nil, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y)
120
121
  @tasks.visibleRows = 8
121
122
  @tasks.visibleColumns = 40
@@ -123,7 +124,7 @@ class FXRoomDialogBox < FXDialogBox
123
124
  ######## Add description
124
125
  @descFrame = FXVerticalFrame.new(all, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|
125
126
  LAYOUT_SIDE_RIGHT|LAYOUT_FILL_Y)
126
- FXLabel.new(@descFrame, "Description: ", nil, 0, LAYOUT_FILL_X)
127
+ FXLabel.new(@descFrame, BOX_DESCRIPTION, nil, 0, LAYOUT_FILL_X)
127
128
  @desc = FXText.new(@descFrame, nil, 0,
128
129
  LAYOUT_FILL_X|LAYOUT_FILL_Y|TEXT_WORDWRAP)
129
130
  @desc.visibleColumns = 70
@@ -134,11 +135,13 @@ class FXRoomDialogBox < FXDialogBox
134
135
  LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|
135
136
  PACK_UNIFORM_WIDTH)
136
137
  # Accept
137
- @ok = FXButton.new(buttons, "&Accept", nil, self, FXDialogBox::ID_ACCEPT,
138
+ @ok = FXButton.new(buttons, BUTTON_ACCEPT, nil, self,
139
+ FXDialogBox::ID_ACCEPT,
138
140
  FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT|LAYOUT_CENTER_Y)
139
141
 
140
142
  # Cancel
141
- cmd = FXButton.new(buttons, "&Cancel", nil, self, FXDialogBox::ID_CANCEL,
143
+ cmd = FXButton.new(buttons, BUTTON_CANCEL, nil, self,
144
+ FXDialogBox::ID_CANCEL,
142
145
  FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT|LAYOUT_CENTER_Y)
143
146
  else
144
147
  @name.connect(SEL_CHANGED) { copy_to() }
@@ -66,13 +66,13 @@ class FXRoomList < FXDialogBox
66
66
  end
67
67
 
68
68
  def initialize(map)
69
- super(map.window.parent, "Locations", DECOR_ALL, 40, 40, 300, 400)
69
+ super(map.window.parent, BOX_LOCATIONS, DECOR_ALL, 40, 40, 300, 400)
70
70
 
71
71
  @box = FXIconList.new(self, nil, 0,
72
72
  ICONLIST_BROWSESELECT|
73
73
  LAYOUT_FILL_X|LAYOUT_FILL_Y)
74
- @box.appendHeader("Section", nil, 60)
75
- @box.appendHeader("Name", nil, 200)
74
+ @box.appendHeader(BOX_SECTION, nil, 60)
75
+ @box.appendHeader(BOX_NAME, nil, 200)
76
76
  @box.header.connect(SEL_COMMAND) { |sender, sel, which|
77
77
  if @box.header.arrowUp?(which)
78
78
  dir = MAYBE
@@ -19,7 +19,7 @@ class FXSection < Section
19
19
  end
20
20
 
21
21
  def new_room(x, y)
22
- r = FXRoom.new( x, y, 'New Location' )
22
+ r = FXRoom.new( x, y, MSG_NEW_LOCATION )
23
23
  return _new_room(r, x, y)
24
24
  end
25
25
 
@@ -23,7 +23,7 @@ class Inform7Writer
23
23
  ]
24
24
 
25
25
  IGNORE_WORDS = [
26
- 'a', 'the', 'and', 'of', 'your', 'to'
26
+ 'a', 'the', 'and', 'of', 'your', 'to', 'out', 'in'
27
27
  ]
28
28
 
29
29
  IGNORED_ARTICLES = /^(?:#{IGNORE_WORDS.join('|')})$/
@@ -36,8 +36,14 @@ class Inform7Writer
36
36
  'with',
37
37
  'is',
38
38
  'in',
39
- 'inside',
40
- ]
39
+ 'container',
40
+ 'to',
41
+ 'and',
42
+ 'side',
43
+ '\s*,\s*',
44
+ '\s*\(\s*',
45
+ ] + DIRECTIONS + OTHERDIRS[1..-1]
46
+
41
47
  INVALID_KEYWORD = /\b(?:#{KEYWORDS.join('|')})\b/i
42
48
 
43
49
 
@@ -89,15 +95,27 @@ class Inform7Writer
89
95
 
90
96
  IS_ANIMAL = /\b(?:#{ANIMALS.join('|')})\b/i
91
97
 
92
- PEOPLE = [
93
- 'child',
98
+ MALE_PEOPLE = [
99
+ 'boy',
100
+ 'man',
101
+ 'sir',
102
+ ]
103
+ IS_MALE_PERSON = /\b(?:#{MALE_PEOPLE.join('|')})\b/i
104
+
105
+ FEMALE_PEOPLE = [
94
106
  'girl',
95
107
  'woman',
96
108
  'lady',
97
- 'boy',
98
- 'man',
109
+ 'actress',
110
+ ]
111
+ IS_FEMALE_PERSON = /\b(?:#{FEMALE_PEOPLE.join('|')})\b/i
112
+
113
+ PEOPLE = MALE_PEOPLE + FEMALE_PEOPLE + [
114
+ 'child',
99
115
  'attendant',
100
116
  'doctor',
117
+ 'actor',
118
+ 'character',
101
119
  'engineer',
102
120
  'bum',
103
121
  'nerd',
@@ -117,14 +135,26 @@ class Inform7Writer
117
135
  'can',
118
136
  'chest',
119
137
  'wardrobe',
138
+ 'jacket',
139
+ 'suit',
120
140
  'trophy case',
121
141
  'coffin',
122
142
  'briefcase',
123
143
  'suitcase',
124
144
  'bag',
145
+ 'flask',
125
146
  ]
126
147
  IS_CONTAINER = /\b(?:#{CONTAINERS.join('|')})\b/i
127
148
 
149
+ #
150
+ # Some common lit types
151
+ #
152
+ UNLIT_TYPES = [
153
+ 'lantern',
154
+ 'torch',
155
+ ]
156
+ IS_LIGHT = /\b(?:#{UNLIT_TYPES.join('|')})\b/i
157
+
128
158
  #
129
159
  # Some common wearable types
130
160
  #
@@ -137,6 +167,8 @@ class Inform7Writer
137
167
  'gown',
138
168
  'backpack',
139
169
  'shirt',
170
+ 'jacket',
171
+ 'suit',
140
172
  'ring',
141
173
  'bracelet',
142
174
  'amulet',
@@ -178,6 +210,10 @@ class Inform7Writer
178
210
  def new_tag(elem, str)
179
211
  tag = str.dup
180
212
 
213
+ # Take text from Unicode utf-8 to iso-8859-1
214
+ utf = Iconv.new( 'iso-8859-1', 'utf-8' )
215
+ tag = utf.iconv( tag )
216
+
181
217
  # Remove redundant spaces
182
218
  tag.sub!(/^\s/, '')
183
219
  tag.sub!(/\s$/, '')
@@ -188,8 +224,6 @@ class Inform7Writer
188
224
 
189
225
  tag.gsub!(/__/, '_')
190
226
 
191
- tag.upcase! # All tags are uppercase
192
-
193
227
  # tag cannot be repeated and cannot be keyword (Doorway, Room, etc)
194
228
  # In those cases, we add a number to the tag name.
195
229
  idx = 0
@@ -217,9 +251,26 @@ class Inform7Writer
217
251
  return tag
218
252
  end
219
253
 
220
- def get_tag(elem, name = elem.name)
254
+ def get_tag(elem, name)
221
255
  return @tags[elem] if @tags[elem]
222
- return new_tag(elem, name)
256
+ tag = name
257
+ if tag =~ INVALID_KEYWORD or @tags.values.include?(tag)
258
+ return new_tag(elem, name)
259
+ else
260
+ @tags[elem] = tag
261
+ end
262
+ return tag
263
+ end
264
+
265
+ def get_room_tag(elem)
266
+ return @tags[elem] if @tags[elem]
267
+ tag = elem.name
268
+ if tag =~ INVALID_KEYWORD or @tags.values.include?(tag)
269
+ tag = new_tag(elem, elem.name)
270
+ else
271
+ @tags[elem] = tag
272
+ end
273
+ return tag
223
274
  end
224
275
 
225
276
  def get_door_name(e)
@@ -230,18 +281,24 @@ class Inform7Writer
230
281
  end
231
282
 
232
283
  def get_door_tag(e)
233
- get_tag(e, get_door_name(e))
284
+ name = get_door_name(e)
285
+ name.upcase
286
+ get_tag(e, name)
234
287
  end
235
288
 
236
289
  def wrap_text(text, width = 75, indent = 78 - width)
237
- return 'UNDER CONSTRUCTION' if not text or text == ''
238
- str = inform_quote( text.dup )
290
+ return 'UNDER CONSTRUCTION.' if not text or text == ''
291
+ str = inform_quote( text )
239
292
 
240
293
  if str.size > width
241
294
  r = ''
242
295
  while str
243
- idx = str.rindex(/[ -]/, width)
244
- idx = str.size unless idx
296
+ if str.size >= width
297
+ idx = str.rindex(/[ -]/, width)
298
+ idx = str.size unless idx
299
+ else
300
+ idx = str.size
301
+ end
245
302
  r << str[0..idx]
246
303
  str = str[idx+1..-1]
247
304
  r << "\n" << ' ' * indent if str
@@ -258,6 +315,11 @@ class Inform7Writer
258
315
  #
259
316
  def inform_quote(text)
260
317
  str = text.dup
318
+
319
+ # Take text from Unicode utf-8 to iso-8859-1
320
+ utf = Iconv.new( 'iso-8859-1', 'utf-8' )
321
+ str = utf.iconv( str )
322
+
261
323
  # Quote special characters
262
324
  # str.gsub!(/@/, '@@64')
263
325
  str.gsub!(/"/, '\'')
@@ -269,11 +331,11 @@ class Inform7Writer
269
331
 
270
332
 
271
333
  def objects(r)
272
- room = get_tag(r)
334
+ room = get_room_tag(r)
273
335
  objs = r.objects.split("\n")
274
336
  objs.each { |o|
275
337
 
276
- tag = new_tag(o, o)
338
+ tag = get_tag(o, o)
277
339
 
278
340
  names = o.dup
279
341
  names.gsub!(/"/, '') # remove any quotes
@@ -285,7 +347,7 @@ class Inform7Writer
285
347
  article = 'a '
286
348
  if name =~ /ves$/ or name =~ /s$/
287
349
  article = 'some '
288
- elsif name[0,1] == 'a'
350
+ elsif name =~ /^[aeiou]/
289
351
  article = 'an '
290
352
  end
291
353
 
@@ -295,7 +357,15 @@ class Inform7Writer
295
357
 
296
358
  if name =~ IS_ANIMAL
297
359
  type = 'an animal'
298
- elsif name =~ IS_PERSON or name =~ /[A-Z]/
360
+ elsif name =~ IS_PERSON
361
+ article = 'a '
362
+ type = 'a person'
363
+ if name =~ IS_MALE_PERSON
364
+ type = 'a male person'
365
+ elsif name =~ IS_FEMALE_PERSON
366
+ type = 'a female person'
367
+ end
368
+ elsif name =~ /[A-Z]/
299
369
  if name !~ /'/ # possesive, like Michael's wallet
300
370
  # if too many words, probably a book's title
301
371
  if names.size <= 3
@@ -314,6 +384,12 @@ class Inform7Writer
314
384
 
315
385
  if tag != name
316
386
  props << "\n The printed name of #{tag} is \"#{article}#{name}\"."
387
+ else
388
+ tag = article + tag
389
+ end
390
+
391
+ if name =~ IS_LIGHT
392
+ props << "\n It is not lit."
317
393
  end
318
394
 
319
395
  if name =~ IS_CONTAINER
@@ -349,10 +425,10 @@ EOF
349
425
  end
350
426
 
351
427
  def door(e)
352
- name = get_door_name(e)
353
- tag = get_tag(e, name)
354
- roomA = get_tag(e.roomA)
355
- roomB = get_tag(e.roomB)
428
+ name = get_door_name(e)
429
+ tag = get_tag(e, name)
430
+ roomA = get_room_tag(e.roomA)
431
+ roomB = get_room_tag(e.roomB)
356
432
  dirA = e.roomA.exits.index(e)
357
433
  dirB = e.roomB.exits.rindex(e)
358
434
  dirA = DIRECTIONS[dirA].downcase
@@ -378,6 +454,7 @@ EOF
378
454
 
379
455
  The #{tag} is a door. #{props}
380
456
  The printed name of #{tag} is "a #{name}".
457
+ Understand "#{name}" as #{tag}.
381
458
  Understand "door" as #{tag}.
382
459
  #{found_in}.
383
460
  EOF
@@ -386,7 +463,7 @@ EOF
386
463
 
387
464
 
388
465
  def room(r)
389
- tag = get_tag(r)
466
+ tag = get_room_tag(r)
390
467
  name = r.name
391
468
 
392
469
  prop = ''
@@ -426,7 +503,7 @@ EOF
426
503
  e.type == Connection::LOCKED_DOOR
427
504
  @f.print get_door_tag(e)
428
505
  else
429
- @f.print get_tag(b)
506
+ @f.print get_room_tag(b)
430
507
  end
431
508
  @f.puts '.'
432
509
  }
@@ -1,5 +1,6 @@
1
1
 
2
2
 
3
+
3
4
  class InformWriter
4
5
 
5
6
 
@@ -34,6 +35,8 @@ class InformWriter
34
35
 
35
36
  def new_tag(elem, str)
36
37
  tag = str.dup
38
+ utf = Iconv.new( 'iso-8859-1', 'utf-8' )
39
+ tag = utf.iconv( tag )
37
40
 
38
41
  # Invalid tag characters, replaced with _
39
42
  tag.gsub!(/[\s"'\/\\\-#\,.:;!\?\n\(\)]/,'_')
@@ -75,13 +78,17 @@ class InformWriter
75
78
 
76
79
  def wrap_text(text, width = 65, indent = 79 - width)
77
80
  return 'UNDER CONSTRUCTION' unless text
78
- str = inform_quote( text.dup )
81
+ str = inform_quote( text )
79
82
 
80
83
  if text.size > width
81
84
  r = ''
82
85
  while str
83
- idx = str.rindex(/[ -]/, width)
84
- idx = str.size unless idx
86
+ if str.size >= width
87
+ idx = str.rindex(/[ -]/, width)
88
+ idx = str.size unless idx
89
+ else
90
+ idx = str.size
91
+ end
85
92
  r << str[0..idx]
86
93
  str = str[idx+1..-1]
87
94
  r << "\n" << ' ' * indent if str
@@ -98,6 +105,11 @@ class InformWriter
98
105
  #
99
106
  def inform_quote(text)
100
107
  str = text.dup
108
+
109
+ # Take text from Unicode utf-8 to iso-8859-1
110
+ utf = Iconv.new( 'iso-8859-1', 'utf-8' )
111
+ str = utf.iconv( str )
112
+
101
113
  # Quote special characters
102
114
  str.gsub!(/@/, '@@64')
103
115
  str.gsub!(/"/, '@@34')
data/lib/IFMapper/Room.rb CHANGED
@@ -11,17 +11,6 @@ class Room
11
11
  attr_accessor :x, :y # Room location in grid
12
12
  attr_accessor :desc # Room description
13
13
 
14
- DIRECTIONS = [
15
- 'n',
16
- 'ne',
17
- 'e',
18
- 'se',
19
- 's',
20
- 'sw',
21
- 'w',
22
- 'nw',
23
- ]
24
-
25
14
  DIR_TO_VECTOR = {
26
15
  0 => [ 0, -1 ],
27
16
  1 => [ 1, -1 ],
@@ -37,6 +37,10 @@ class TADSWriter
37
37
  def new_tag(elem, str)
38
38
  tag = str.dup
39
39
 
40
+ # Take text from Unicode utf-8 to iso-8859-1
41
+ utf = Iconv.new( 'iso-8859-1', 'utf-8' )
42
+ tag = utf.iconv( tag )
43
+
40
44
  # Invalid tag characters, replaced with _
41
45
  tag.gsub!(/[\s"'\/\\\-#\,.:;!\?\n\(\)]/,'_')
42
46
 
@@ -87,8 +91,12 @@ class TADSWriter
87
91
  if text.size > width
88
92
  r = ''
89
93
  while str
90
- idx = str.rindex(/[ -]/, width)
91
- idx = str.size unless idx
94
+ if str.size >= width
95
+ idx = str.rindex(/[ -]/, width)
96
+ idx = str.size unless idx
97
+ else
98
+ idx = str.size
99
+ end
92
100
  r << str[0..idx]
93
101
  str = str[idx+1..-1]
94
102
  r << "\n" << ' ' * indent if str
@@ -105,6 +113,11 @@ class TADSWriter
105
113
  #
106
114
  def self.quote(text)
107
115
  str = text.dup
116
+
117
+ # Take text from Unicode utf-8 to iso-8859-1
118
+ utf = Iconv.new( 'iso-8859-1', 'utf-8' )
119
+ str = utf.iconv( str )
120
+
108
121
  # Quote special characters
109
122
  str.gsub!(/"/, '\"')
110
123
  str.gsub!(/'/, "\\\\'")