3
3
# made by yorickvanpelt {AT} gmail {DOT} com
4
4
from struct_zerostrings import unpackFromExt , packExt
5
5
from ottd_constants import saveload_chunk_types
6
+ import array
6
7
7
8
class LoadException (Exception ):
8
9
"""
@@ -109,7 +110,11 @@ def read_OTTDSimpleGamma(self):
109
110
i = (i << 8 ) | self .read_byte ()
110
111
return i
111
112
def read_array (self , format , number ):
112
- return self .read_something ('>' + format * number )
113
+ a = array .array (format )
114
+ end_offs = self .offset + number
115
+ a .fromstring (self .data [self .offset :end_offs ])
116
+ self .offset = end_offset
117
+ return a .tolist ()
113
118
114
119
class OTTDSaveGameParser :
115
120
"""
@@ -239,7 +244,7 @@ def compressZLIB(data):
239
244
except ImportError :
240
245
raise LoadException ("can't save ZLIB saves, no ZLIB" )
241
246
else :
242
- return zlib .compress (data )
247
+ return zlib .compress (data )
243
248
formats = (
244
249
("LZO" , "OTTD" , uncompressLZO , compressLZO ),
245
250
("uncompressed" , "OTTN" , uncompressNone , compressNone ),
@@ -432,7 +437,7 @@ def readMAPT(self, dp, chunksize):
432
437
size = self .mapsize ['total' ]
433
438
i = 0
434
439
while i < size :
435
- type_height .extend (dp .read_bytes ( 4096 ))
440
+ type_height .extend (dp .read_array ( 'B' , 4096 ))
436
441
i += 4096
437
442
self .map_array = {}
438
443
self .map_array ['t' ] = type_height
@@ -450,7 +455,7 @@ def readMAP2(self, dp, chunksize):
450
455
if self .saveload_version > 5 :
451
456
i = 0
452
457
while i < size :
453
- data = dp .read_bytes ( 4096 * 2 )
458
+ data = dp .read_array ( 'B' , 4096 * 2 )
454
459
j = 0
455
460
while j < 4096 :
456
461
y = j * 2
@@ -460,15 +465,15 @@ def readMAP2(self, dp, chunksize):
460
465
else :
461
466
i = 0
462
467
while i < size :
463
- m2 .extend (dp .read_bytes ( 4096 ))
468
+ m2 .extend (dp .read_array ( 'B' , 4096 ))
464
469
i += 4096
465
470
self .map_array [2 ] = m2
466
471
def readMAP3 (self , dp , chunksize ):
467
472
m3 = []
468
473
size = self .mapsize ['total' ]
469
474
i = 0
470
475
while i < size :
471
- m3 .extend (dp .read_bytes ( 4096 ))
476
+ m3 .extend (dp .read_array ( 'B' , 4096 ))
472
477
i += 4096
473
478
self .map_array [3 ] = m3
474
479
@@ -477,7 +482,7 @@ def readMAP4(self, dp, chunksize):
477
482
size = self .mapsize ['total' ]
478
483
i = 0
479
484
while i < size :
480
- m4 .extend (dp .read_bytes ( 4096 ))
485
+ m4 .extend (dp .read_array ( 'B' , 4096 ))
481
486
i += 4096
482
487
self .map_array [4 ] = m4
483
488
@@ -486,7 +491,7 @@ def readMAP5(self, dp, chunksize):
486
491
size = self .mapsize ['total' ]
487
492
i = 0
488
493
while i < size :
489
- m5 .extend (dp .read_bytes ( 4096 ))
494
+ m5 .extend (dp .read_array ( 'B' , 4096 ))
490
495
i += 4096
491
496
self .map_array [5 ] = m5
492
497
def readMAP6 (self , dp , chunksize ):
@@ -508,15 +513,15 @@ def readMAP6(self, dp, chunksize):
508
513
else :
509
514
i = 0
510
515
while i < size :
511
- m6 .extend (dp .read_bytes ( 4096 ))
516
+ m6 .extend (dp .read_array ( 'B' , 4096 ))
512
517
i += 4096
513
518
self .map_array [6 ] = m6
514
519
def readMAP7 (self , dp , chunksize ):
515
520
m7 = []
516
521
size = self .mapsize ['total' ]
517
522
i = 0
518
523
while i < size :
519
- m7 .extend (dp .read_bytes ( 4096 ))
524
+ m7 .extend (dp .read_array ( 'B' , 4096 ))
520
525
i += 4096
521
526
self .map_array [7 ] = m7
522
527
def readVIEW (self , dp , chunksize ):
@@ -630,7 +635,7 @@ def readCHTS(self, dp, chunksize):
630
635
def parseArgs ():
631
636
import optparse
632
637
# parse the arguments
633
- usage = "usage: %prog [ip[:port]] [ options]"
638
+ usage = "usage: %prog [options]"
634
639
description = """This script will will parse an openttd savegame (http://www.openttd.org)
635
640
For more information, see the homepage: http://openttd-python.googlecode.com/."""
636
641
argparser = optparse .OptionParser (usage = usage , description = description )
0 commit comments