forked from Matt-Esch/anaconda
-
Notifications
You must be signed in to change notification settings - Fork 0
/
runtime.py
151 lines (123 loc) · 4.82 KB
/
runtime.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
if __name__ == '__main__':
import sys
import os
import platform
frozen = hasattr(sys, 'frozen')
PROFILE = 0
DELAYED_LOAD = 0
LOAD_IMAGES = 1
CONSOLE_ONLY = 0
DEBUG = os.getenv('ANACONDA_DEBUG', 0)
if CONSOLE_ONLY:
import dummy_pyglet
if frozen and sys.platform == 'darwin':
# stupid PyInstaller!
binary_dir = os.path.dirname(sys.argv[0])
sys.path.append(binary_dir)
resources_dir = os.path.join(os.path.split(binary_dir)[0],
'Resources')
os.chdir(resources_dir)
sys.argv = sys.argv[:1] # psn argument?
import pyglet
pyglet.options['shadow_window'] = False
if DEBUG:
pyglet.options['debug_gl'] = True
DATA_DIRECTORY = 'data'
class Logger(object):
def __init__(self, src, dst):
self.src = src
self.dst = dst
def write(self, msg):
self.src.write(msg)
self.dst.write(msg)
self.dst.flush()
def start_logging():
try:
f = open('anaconda.log', 'wb')
except IOError:
print '(anaconda.log in use, not logging)'
return
stderr = Logger(sys.stderr, f)
stdout = Logger(sys.stdout, f)
sys.stderr = stderr
sys.stdout = stdout
start_logging()
global old_time
old_time = None
try:
print 'Starting up player...'
import time
old_time = time.time()
def get_dt():
global old_time
value = time.time() - old_time
old_time = time.time()
return value
from mmfparser.bytereader import ByteReader
from mmfparser.data.exe import ExecutableData, findAppendedOffset
from mmfparser.data.gamedata import GameData
from mmfparser.player.main import GamePlayer
from mmfparser.player.common import convert_path
print '(mmfparser took %s)' % get_dt()
if __name__ == '__main__':
if len(sys.argv) > 1:
filename = sys.argv[1]
reader = ByteReader(open(filename, 'rb'))
extension = filename.split('.')[-1]
if extension == 'exe':
gameData = ExecutableData(reader, loadImages = LOAD_IMAGES,
delayedLoad = DELAYED_LOAD).gameData
elif extension in ('ccn', 'ccp'):
gameData = GameData(reader, loadImages = LOAD_IMAGES,
delayedLoad = DELAYED_LOAD)
elif extension in ('ccj', 'cci'):
gameData = GameData(reader, loadImages = LOAD_IMAGES,
delayedLoad = DELAYED_LOAD, java = True)
elif extension == 'ccf':
gameData = GameData(reader, loadImages = LOAD_IMAGES,
delayedLoad = DELAYED_LOAD, java = True, flash = True)
elif frozen:
application_path = 'Application.ccp'
reader = ByteReader(open(application_path, 'rb'))
gameData = GameData(reader, loadImages = LOAD_IMAGES,
delayedLoad = DELAYED_LOAD)
else:
print 'Exiting.'
raise SystemExit()
if not frozen:
path = sys.argv[1]
if extension != 'exe' and os.path.isfile(gameData.editorFilename):
path = gameData.editorFilename
if path is not None:
newDirectory = os.path.dirname(path)
if newDirectory:
sys.path.append(newDirectory)
try:
os.chdir(newDirectory)
except OSError:
pass
newPlayer = GamePlayer(gameData)
if PROFILE:
import cProfile
cProfile.run('newPlayer.start()', 'mmfplayer.prof')
import pstats
p = pstats.Stats('mmfplayer.prof')
p.sort_stats('time')
p.print_stats(40)
import code
code.interact(local = locals())
else:
if False:
import sys
f_trace = open('ftrace', 'wb')
def trace(frame, event, arg):
f_trace.write(
"%s, %s:%d" % (event, frame.f_code.co_filename,
frame.f_lineno))
f_trace.flush()
return trace
sys.settrace(trace)
newPlayer.start()
except:
import traceback
traceback.print_exc()