ifmapper 0.9 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/HISTORY.txt +132 -5
  2. data/IFMapper.gemspec +2 -2
  3. data/TODO.txt +0 -5
  4. data/lib/IFMapper/AStar.rb +15 -8
  5. data/lib/IFMapper/Connection.rb +137 -25
  6. data/lib/IFMapper/FXConnection.rb +54 -40
  7. data/lib/IFMapper/FXConnectionDialogBox.rb +12 -4
  8. data/lib/IFMapper/FXMap.rb +161 -60
  9. data/lib/IFMapper/FXMapperWindow.rb +205 -70
  10. data/lib/IFMapper/FXRoom.rb +7 -2
  11. data/lib/IFMapper/FXRoomDialogBox.rb +2 -1
  12. data/lib/IFMapper/FXRoomList.rb +95 -0
  13. data/lib/IFMapper/PDFMapExporter.rb +10 -1
  14. data/lib/IFMapper/Room.rb +22 -0
  15. data/lib/IFMapper/TranscriptDialogBox.rb +117 -0
  16. data/lib/IFMapper/TranscriptReader.rb +320 -96
  17. data/maps/AllRoads.map +0 -0
  18. data/maps/Bureaucracy.map +0 -0
  19. data/maps/CityOfSecrets.map +0 -0
  20. data/maps/DDIV.map +0 -0
  21. data/maps/Heroine.map +0 -0
  22. data/maps/SavoirFare.map +0 -0
  23. data/maps/Tangle.map +0 -0
  24. data/maps/anchor.map +0 -0
  25. data/maps/ballerina.map +0 -0
  26. data/maps/bluechairs.map +0 -0
  27. data/maps/break_in.map +0 -0
  28. data/maps/christminster.map +0 -0
  29. data/maps/deadline.map +0 -0
  30. data/maps/delusions.map +0 -0
  31. data/maps/dreamhold.map +0 -0
  32. data/maps/eas.map +0 -0
  33. data/maps/eas2.map +0 -0
  34. data/maps/eas3.map +0 -0
  35. data/maps/inhumane.map +0 -0
  36. data/maps/lurkinghorror.map +0 -0
  37. data/maps/metamorphoses.map +0 -0
  38. data/maps/moonmist.map +0 -0
  39. data/maps/muldoon_legacy.map +0 -0
  40. data/maps/pawn.map +0 -0
  41. data/maps/pytho.map +0 -0
  42. data/maps/risorgimento.map +0 -0
  43. data/maps/sherbet.map +0 -0
  44. data/maps/slouch.map +0 -0
  45. data/maps/spring.map +0 -0
  46. data/maps/trinity.map +0 -0
  47. data/maps/worlds.map +0 -0
  48. data/maps/zdungeon.map +0 -0
  49. metadata +42 -8
@@ -20,8 +20,7 @@ class FXConnectionDialogBox < FXDialogBox
20
20
 
21
21
  DIR_TEXT = [
22
22
  'Both',
23
- 'A to B',
24
- 'B to A',
23
+ 'One Way',
25
24
  ]
26
25
 
27
26
  EXIT_TEXT = [
@@ -65,6 +64,11 @@ class FXConnectionDialogBox < FXDialogBox
65
64
  @exitA.enable
66
65
  @exitB.enable
67
66
  end
67
+ if conn.loop? or conn.stub?
68
+ @type.disable
69
+ @dir.disable
70
+ @exitB.disable
71
+ end
68
72
  end
69
73
 
70
74
  def initialize(map, conn, event = nil)
@@ -122,8 +126,12 @@ class FXConnectionDialogBox < FXDialogBox
122
126
  JUSTIFY_HZ_APART|ICON_AFTER_TEXT|
123
127
  LAYOUT_CENTER_X|LAYOUT_CENTER_Y)
124
128
 
125
- @dir.connect(SEL_COMMAND) { copy_to() }
126
- @type.connect(SEL_COMMAND) { copy_to()}
129
+ @dir.connect(SEL_COMMAND) {
130
+ copy_to()
131
+ title = @conn.to_s
132
+ self.title = title
133
+ }
134
+ @type.connect(SEL_COMMAND) { copy_to() }
127
135
  @exitA.connect(SEL_COMMAND) { copy_to() }
128
136
  @exitB.connect(SEL_COMMAND) { copy_to() }
129
137
  @map = map
@@ -6,6 +6,7 @@ require 'IFMapper/FXSection'
6
6
  require 'IFMapper/FXMapDialogBox'
7
7
  require 'IFMapper/FXSectionDialogBox'
8
8
  require 'IFMapper/AStar'
9
+ require 'thread'
9
10
 
10
11
 
11
12
  class FXMap < Map
@@ -21,6 +22,9 @@ class FXMap < Map
21
22
  attr_accessor :options # Map options
22
23
  attr_reader :window # Fox Window for this map
23
24
  attr :version # file format version
25
+ attr_reader :mutex # Mutex to avoid racing conditions while
26
+ # automapping
27
+ attr_reader :automap # automapping transcript
24
28
 
25
29
  # pmap is a path map (a matrix or grid used for path finding).
26
30
  # Rooms and paths are recorded there. Path finding is needed
@@ -28,7 +32,8 @@ class FXMap < Map
28
32
  # We now also use this for selecting of stuff, particularly complex paths.
29
33
  attr :pmap
30
34
 
31
- @@win = nil
35
+ @@win = nil # Map Info window
36
+ @@roomlist = nil # Room List Window
32
37
 
33
38
  @@tooltip = nil
34
39
  @@cursor_arrow = nil
@@ -58,6 +63,7 @@ class FXMap < Map
58
63
  # Jump to a certain section #
59
64
  #
60
65
  def section=(x)
66
+ clear_selection
61
67
  super
62
68
  @complexConnection = false
63
69
  _changed
@@ -127,9 +133,9 @@ class FXMap < Map
127
133
  (0...@height).each { |y|
128
134
  m[y * (@width+2)] = (y % 10).to_s
129
135
  loc = y * (@width+2) + x + 1
130
- if @pmap[x][y].kind_of?(Connection)
136
+ if @pmap.at(x).at(y).kind_of?(Connection)
131
137
  m[loc] = '-'
132
- elsif @pmap[x][y].kind_of?(Room)
138
+ elsif @pmap.at(x).at(y).kind_of?(Room)
133
139
  m[loc] = 'R'
134
140
  end
135
141
  }
@@ -145,7 +151,7 @@ class FXMap < Map
145
151
  def _free_area?(x, y, w, h)
146
152
  x.upto(x+w) { |xx|
147
153
  y.upto(x+h) { |yy|
148
- return false if @pmap[xx][yy].kind_of?(Room)
154
+ return false if @pmap.at(xx).at(yy).kind_of?(Room)
149
155
  }
150
156
  }
151
157
  return true
@@ -230,13 +236,9 @@ class FXMap < Map
230
236
  end
231
237
 
232
238
  # Complex path... Generate points.
233
- a = c.roomA
234
- b = c.roomB
235
-
236
- dirA = a.exits.index(c)
239
+ a, b = c.room
240
+ dirA, dirB = c.dirs
237
241
  raise "A connection not found #{c} at #{a}" unless dirA
238
-
239
- dirB = b.exits.rindex(c)
240
242
  raise "B connection not found #{c} at #{b}" unless dirB
241
243
 
242
244
  vA = FXRoom::DIR_TO_VECTOR[dirA]
@@ -271,8 +273,8 @@ class FXMap < Map
271
273
  pB[0] < 0 or pB[0] >= @width or
272
274
  pA[1] < 0 or pA[1] >= @height or
273
275
  pB[1] < 0 or pB[1] >= @height or
274
- @pmap[pA[0]][pA[1]].kind_of?(Room) or
275
- @pmap[pB[0]][pB[1]].kind_of?(Room)
276
+ @pmap.at(pA[0]).at(pA[1]).kind_of?(Room) or
277
+ @pmap.at(pB[0]).at(pB[1]).kind_of?(Room)
276
278
  remove_connection(c)
277
279
  return false
278
280
  end
@@ -387,6 +389,7 @@ class FXMap < Map
387
389
  return nil
388
390
  end
389
391
  end
392
+ update_roomlist
390
393
  return r
391
394
  end
392
395
 
@@ -413,7 +416,7 @@ class FXMap < Map
413
416
  def to_room(x,y)
414
417
  xx = x / WW
415
418
  yy = y / HH
416
- return @pmap[xx][yy]
419
+ return @pmap.at(xx).at(yy)
417
420
  end
418
421
 
419
422
  # Given a mouse click x/y position, return object(s) if any or nil
@@ -426,7 +429,7 @@ class FXMap < Map
426
429
  xx = x / WW
427
430
  yy = y / HH
428
431
  return nil if xx >= @width or yy >= @height
429
- return @pmap[xx][yy]
432
+ return @pmap.at(xx).at(yy)
430
433
  else
431
434
  # Possible arrow
432
435
  @sections[@section].connections.each { |c|
@@ -536,8 +539,10 @@ class FXMap < Map
536
539
 
537
540
  # Then, create an off-screen image with that same size for double
538
541
  # buffering
542
+ @image.release
539
543
  @image.destroy
540
544
  GC.start
545
+
541
546
  @image = FXBMPImage.new(@window.getApp, nil, IMAGE_SHMI|IMAGE_SHMP,
542
547
  width, height)
543
548
  @image.create
@@ -794,7 +799,7 @@ class FXMap < Map
794
799
  # Based on mouse position on canvas, create a tooltip
795
800
  #
796
801
  def tooltip_cb(sender, id, ptr)
797
- if @tooltip_msg != ''
802
+ if @zoom < 0.6 and @tooltip_msg != ''
798
803
  sender.text = @tooltip_msg.to_s
799
804
  sender.show
800
805
  else
@@ -821,7 +826,7 @@ class FXMap < Map
821
826
  @canvas.defaultCursor = @@cursor_arrow
822
827
  if sel.kind_of?(Room)
823
828
  @tooltip_msg = sel.name
824
- status "Click to select and move. Double click to edit room."
829
+ status "\"#{sel.name}\": Click to select and move. Double click to edit."
825
830
  elsif sel.kind_of?(Connection)
826
831
  status "Click to change direction of connection."
827
832
  end
@@ -1043,19 +1048,26 @@ class FXMap < Map
1043
1048
  a = c.roomA
1044
1049
  b = c.roomB
1045
1050
  menu = FXMenuPane.new(@window)
1051
+ if c.dir == Connection::AtoB
1052
+ cmd = FXMenuCommand.new(menu, "Flip Direction")
1053
+ cmd.connect(SEL_COMMAND) { c.flip; draw }
1054
+ FXMenuSeparator.new(menu)
1055
+ end
1056
+
1046
1057
  submenu = FXMenuPane.new(@window)
1047
1058
  old_idx = a.exits.index(c)
1048
1059
  0.upto(7) { |idx|
1049
1060
  rmb_link_menu( submenu, c, a, idx, old_idx )
1050
1061
  }
1051
1062
  FXMenuCascade.new(menu, a.name, nil, submenu)
1052
- next if not b
1053
- submenu = FXMenuPane.new(@window)
1054
- old_idx = b.exits.rindex(c)
1055
- 0.upto(7) { |idx|
1056
- rmb_link_menu( submenu, c, b, idx, old_idx )
1057
- }
1058
- FXMenuCascade.new(menu, b.name, nil, submenu)
1063
+ if b
1064
+ submenu = FXMenuPane.new(@window)
1065
+ old_idx = b.exits.rindex(c)
1066
+ 0.upto(7) { |idx|
1067
+ rmb_link_menu( submenu, c, b, idx, old_idx )
1068
+ }
1069
+ FXMenuCascade.new(menu, b.name, nil, submenu)
1070
+ end
1059
1071
  end
1060
1072
  if menu
1061
1073
  menu.create
@@ -1227,7 +1239,6 @@ class FXMap < Map
1227
1239
  @automap.destroy if @automap
1228
1240
  @automap = nil
1229
1241
  @window.close
1230
- GC.start
1231
1242
  return true
1232
1243
  end
1233
1244
 
@@ -1285,9 +1296,6 @@ class FXMap < Map
1285
1296
  0, 0, width, height)
1286
1297
  @dirty = true
1287
1298
  # @canvas.connect(SEL_UPDATE, method(:update_cb))
1288
- if fxversion =~ /^1.4/
1289
- @canvas.connect(SEL_QUERY_TIP, method(:tooltip_cb))
1290
- end
1291
1299
 
1292
1300
  @canvas.connect(SEL_PAINT, method(:draw))
1293
1301
  @canvas.backColor = @options['BG Color']
@@ -1301,8 +1309,10 @@ class FXMap < Map
1301
1309
  @canvas.connect(SEL_RIGHTBUTTONPRESS, method(:rmb_click_cb))
1302
1310
  @canvas.connect(SEL_KEYPRESS, method(:keypress_cb))
1303
1311
 
1304
- if not @@tooltip
1312
+ if fxversion !~ /^1.2/
1305
1313
  @@tooltip = FXToolTip.new(@canvas.app, FXToolTip::TOOLTIP_PERMANENT)
1314
+ # Tooltip is too buggy and annoying. Turning it off for now.
1315
+ # @canvas.connect(SEL_QUERY_TIP, method(:tooltip_cb))
1306
1316
  end
1307
1317
  end
1308
1318
 
@@ -1314,6 +1324,7 @@ class FXMap < Map
1314
1324
  icon = nil, menu = nil, mode = nil,
1315
1325
  x = 0, y = 0, w = 0, h = 0)
1316
1326
  super(name)
1327
+ @mutex = Mutex.new
1317
1328
  @automap = nil
1318
1329
  @navigation = false
1319
1330
  if parent
@@ -1381,6 +1392,7 @@ class FXMap < Map
1381
1392
  }
1382
1393
 
1383
1394
  modified = true
1395
+ create_pathmap
1384
1396
  draw
1385
1397
  end
1386
1398
 
@@ -1423,6 +1435,29 @@ class FXMap < Map
1423
1435
  }
1424
1436
  end
1425
1437
 
1438
+ def show_roomlist
1439
+ if @@roomlist
1440
+ @@roomlist.copy_from(self)
1441
+ else
1442
+ @@roomlist = FXRoomList.new(self)
1443
+ end
1444
+ @@roomlist.show
1445
+ end
1446
+
1447
+ def self.no_maps
1448
+ @@roomlist.hide if @@roomlist
1449
+ @@win.hide if @@win
1450
+ FXRoom::no_maps
1451
+ FXConnection::no_maps
1452
+ end
1453
+
1454
+ #
1455
+ # If roomlist window is present, update it
1456
+ #
1457
+ def update_roomlist
1458
+ @@roomlist.copy_from(self) if @@roomlist
1459
+ @@win.copy_from(self) if @@win
1460
+ end
1426
1461
 
1427
1462
  #
1428
1463
  # Find and update all paths in path map for a room
@@ -1443,8 +1478,10 @@ class FXMap < Map
1443
1478
  end
1444
1479
 
1445
1480
  def cannot_automap(why)
1481
+ p '----CANNOT AUTOMAP'
1446
1482
  w = FXWarningBox.new(@window, "Cannot automap.\n#{why}")
1447
1483
  w.execute
1484
+ p '----CANNOT AUTOMAP AFTER EXECUTE'
1448
1485
  end
1449
1486
 
1450
1487
 
@@ -1474,7 +1511,7 @@ class FXMap < Map
1474
1511
  x = r.x + dx
1475
1512
  y = r.y + dy
1476
1513
  if x < 0 or y < 0 or x >= @width or y >= @height or
1477
- @pmap[x][y].kind_of?(Room)
1514
+ @pmap.at(x).at(y).kind_of?(Room)
1478
1515
  store_room_selection(selection)
1479
1516
  dir = Room::DIRECTIONS[idx]
1480
1517
  status "Cannot move selection #{dir}."
@@ -1516,7 +1553,7 @@ class FXMap < Map
1516
1553
  y = 0 if y < 0
1517
1554
  x = @width-1 if x > @width-1
1518
1555
  y = @height-1 if y > @height-1
1519
- if not @pmap[x][y].kind_of?(Room)
1556
+ if not @pmap.at(x).at(y).kind_of?(Room)
1520
1557
  room.selected = false
1521
1558
  roomB = new_xy_room(x * WW, y * HH)
1522
1559
  exitB = roomB.next_to?(room)
@@ -1621,7 +1658,7 @@ class FXMap < Map
1621
1658
 
1622
1659
  (0...@height).each { |yy|
1623
1660
  (0...@width).each { |xx|
1624
- next if @pmap[xx][yy].kind_of?(Connection)
1661
+ next if @pmap.at(xx).at(yy).kind_of?(Connection)
1625
1662
  x = xx * ww
1626
1663
  y = yy * hh
1627
1664
 
@@ -1663,15 +1700,13 @@ class FXMap < Map
1663
1700
  hs_2 = HS_2 * @zoom
1664
1701
 
1665
1702
  #---- dummy check to catch an ugly bug that I cannot track...
1666
- if @pmap.size != @width or @pmap[0].size != @height
1667
- puts "**********ERROR: pmap sizes not != #{@width}x#{@height}"
1668
- end
1703
+ create_pathmap if @pmap.size < @width or @pmap[0].size < @height
1669
1704
 
1670
1705
  # First, draw horizontal lines
1671
1706
  (0...@height).each { |yy|
1672
1707
  (0..@width-2).each { |xx|
1673
- next if @pmap[xx][yy].kind_of?(Connection) or
1674
- @pmap[xx+1][yy].kind_of?(Connection)
1708
+ next if @pmap.at(xx).at(yy).kind_of?(Connection) or
1709
+ @pmap.at(xx+1).at(yy).kind_of?(Connection)
1675
1710
  x1 = xx * ww + w + ws_2
1676
1711
  x2 = (xx + 1) * ww + ws_2
1677
1712
  y1 = yy * hh + h / 2 + hs_2
@@ -1683,8 +1718,8 @@ class FXMap < Map
1683
1718
  # Then, draw vertical lines
1684
1719
  (0...@width).each { |xx|
1685
1720
  (0..@height-2).each { |yy|
1686
- next if @pmap[xx][yy].kind_of?(Connection) or
1687
- @pmap[xx][yy+1].kind_of?(Connection)
1721
+ next if @pmap.at(xx).at(yy).kind_of?(Connection) or
1722
+ @pmap.at(xx).at(yy+1).kind_of?(Connection)
1688
1723
  x1 = xx * ww + w / 2 + ws_2
1689
1724
  y1 = yy * hh + h + hs_2
1690
1725
  y2 = (yy + 1) * hh + hs_2
@@ -1716,7 +1751,7 @@ class FXMap < Map
1716
1751
 
1717
1752
  (0...@width).each { |xx|
1718
1753
  (0...@height).each { |yy|
1719
- next if @pmap[xx][yy]
1754
+ next if @pmap.at(xx).at(yy)
1720
1755
  x = xx * ww + ws_2
1721
1756
  y = yy * hh + hs_2
1722
1757
  dc.drawRectangle( x, y, w, h )
@@ -1743,7 +1778,23 @@ class FXMap < Map
1743
1778
  end
1744
1779
 
1745
1780
  #
1746
- # Draw rooms
1781
+ # Draw a single room (callback used when editing room dialog box)
1782
+ #
1783
+ def draw_room(room)
1784
+ idx = @sections[@section].rooms.index(room)
1785
+ return unless idx
1786
+
1787
+ dc = FXDCWindow.new(@canvas)
1788
+ dc.font = @font
1789
+ data = { }
1790
+ data['font'] = @font
1791
+ data['objfont'] = @objfont
1792
+ room.draw(dc, @zoom, idx, @options, data)
1793
+ dc.end
1794
+ end
1795
+
1796
+ #
1797
+ # Draw all rooms in current section
1747
1798
  #
1748
1799
  def draw_rooms(dc)
1749
1800
  data = { }
@@ -1778,7 +1829,6 @@ class FXMap < Map
1778
1829
  self.zoom = 1.0
1779
1830
 
1780
1831
  num = pack_sections( @width, @height )
1781
- puts "Would pack #{@sections.size} into #{num} pages."
1782
1832
  begin
1783
1833
  dc = FXDCPostscript.new(@window.getApp)
1784
1834
  xmax = @width * WW
@@ -1813,29 +1863,23 @@ class FXMap < Map
1813
1863
  draw
1814
1864
  end
1815
1865
 
1816
- #
1817
- # Draw a single room (callback used when editing room dialog box)
1818
- #
1819
- def draw_room(room)
1820
- idx = @sections[@section].rooms.index(room)
1821
- return unless idx
1822
-
1823
- dc = FXDCWindow.new(@canvas)
1824
- dc.font = @font
1825
- data = { }
1826
- data['font'] = @font
1827
- data['objfont'] = @objfont
1828
- room.draw(dc, @zoom, idx, @options, data)
1829
- dc.end
1830
- end
1831
1866
 
1832
1867
  #
1833
1868
  # Draw map
1834
1869
  #
1835
1870
  def draw(sender = nil, sel = nil, event = nil)
1871
+ return if @mutex.locked?
1872
+
1873
+ if not @image.created?
1874
+ puts "Image was not created. Try again"
1875
+ self.zoom = @zoom
1876
+ end
1877
+
1836
1878
  pos = @scrollwindow.position
1837
1879
  w = @scrollwindow.getViewportWidth
1838
1880
  h = @scrollwindow.getViewportHeight
1881
+
1882
+ # The -5 seems to be a bug in fox. don't ask me.
1839
1883
  cx = -pos[0]-5
1840
1884
  cx = 0 if cx < 0
1841
1885
  cy = -pos[1]-5
@@ -1864,6 +1908,7 @@ class FXMap < Map
1864
1908
  dc.setClipRectangle( cx, cy, w, h)
1865
1909
  dc.drawImage(@image,0,0)
1866
1910
  dc.end
1911
+
1867
1912
  end
1868
1913
 
1869
1914
 
@@ -1913,14 +1958,57 @@ class FXMap < Map
1913
1958
  end
1914
1959
  end
1915
1960
 
1961
+
1962
+ #
1963
+ # Export map as an IFM map file
1964
+ #
1965
+ def export_ifm(file)
1966
+ require 'IFMapper/IFMWriter'
1967
+ file += '.ifm' if file !~ /\.ifm$/
1968
+ IFMWriter.new(map, file)
1969
+ end
1970
+
1971
+
1972
+ #
1973
+ # Export map as a set of TADS3 source code files
1974
+ #
1975
+ def export_tads(file)
1976
+ require 'IFMapper/TADSWriter'
1977
+ file.sub!(/(-\d+)?\.t/, '')
1978
+ TADSWriter.new(self, file)
1979
+ end
1980
+
1981
+ #
1982
+ # Export map as a set of Inform source code files
1983
+ #
1984
+ def export_inform(file)
1985
+ require 'IFMapper/InformWriter'
1986
+ file.sub!(/(-\d+)?\.inf/, '')
1987
+ InformWriter.new(self, file)
1988
+ end
1989
+
1916
1990
  #
1917
1991
  # Save the map under a new filename, bringing up a filerequester
1918
1992
  #
1919
1993
  def save_as
1920
1994
  file = FXMapFileDialog.new(@window, "Save Map #{@name}").filename
1921
1995
  if file != ''
1922
- @filename = file
1923
- return _save
1996
+ if File.exists?(file)
1997
+ dlg = FXWarningBox.new(@window, "#{file}\nalready exists. Are you sure you want to overwrite it?")
1998
+ return if dlg.execute == 0
1999
+ end
2000
+
2001
+ case file
2002
+ when /\.inf$/
2003
+ export_inform(file)
2004
+ when /\.ifm$/
2005
+ export_ifm(file)
2006
+ when /\.t$/
2007
+ export_tads(file)
2008
+ else
2009
+ @filename = file
2010
+ return _save
2011
+ end
1924
2012
  end
1925
2013
  return false
1926
2014
  end
@@ -1951,12 +2039,25 @@ class FXMap < Map
1951
2039
 
1952
2040
  file = FXMapFileDialog.new(@window, "Load Transcript",
1953
2041
  [
1954
- "Transcript File (*.log)",
2042
+ "Transcript File (*.log,*.scr,*.txt)",
1955
2043
  "All Files (*)"
1956
2044
  ]).filename
1957
2045
  return if file == ''
1958
2046
  require 'IFMapper/TranscriptReader'
1959
- @automap = TranscriptReader.new(self, file)
2047
+
2048
+ begin
2049
+ @automap = TranscriptReader.new(self, file)
2050
+ @automap.properties(true)
2051
+ rescue Errno::EACCES, Errno::ENOENT => e
2052
+ dlg = FXWarningBox.new(@window, "Cannot open transcript\n#{e}")
2053
+ dlg.execute
2054
+ return
2055
+ rescue => e
2056
+ puts e.backtrace
2057
+ dlg = FXWarningBox.new(@window, "Internal error parsing transcript\nPlease report as a bug\n#{e}\n#{e.backtrace}")
2058
+ dlg.execute
2059
+ raise
2060
+ end
1960
2061
  @automap.start
1961
2062
  create_pathmap
1962
2063
  draw