1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from OpenGL.GL import *
24 import math
25 import socket
26
27 from View import BackgroundLayer
28 from Menu import Menu
29 from Editor import Editor, Importer, GHImporter
30 from Credits import Credits
31 from Lobby import Lobby
32 from Svg import SvgDrawing
33 from Language import _
34 import Dialogs
35 import Config
36 import Audio
37 import Settings
38
39 -class MainMenu(BackgroundLayer):
40 - def __init__(self, engine, songName = None):
41 self.engine = engine
42 self.time = 0.0
43 self.nextLayer = None
44 self.visibility = 0.0
45 self.songName = songName
46
47 self.engine.loadSvgDrawing(self, "background", "keyboard.svg")
48 self.engine.loadSvgDrawing(self, "guy", "pose.svg")
49 self.engine.loadSvgDrawing(self, "logo", "logo.svg")
50 self.song = Audio.Sound(self.engine.resource.fileName("menu.ogg"))
51 self.song.setVolume(self.engine.config.get("audio", "songvol"))
52 self.song.play(-1)
53
54 newMultiplayerMenu = [
55 (_("Host Multiplayer Game"), self.hostMultiplayerGame),
56 (_("Join Multiplayer Game"), self.joinMultiplayerGame),
57 ]
58
59 editorMenu = Menu(self.engine, [
60 (_("Edit Existing Song"), self.startEditor),
61 (_("Import New Song"), self.startImporter),
62 (_("Import Guitar Hero(tm) Songs"), self.startGHImporter),
63 ])
64
65 settingsMenu = Settings.SettingsMenu(self.engine)
66
67 mainMenu = [
68 (_("Play Game"), self.newSinglePlayerGame),
69 (_("Tutorial"), self.showTutorial),
70 (_("Song Editor"), editorMenu),
71 (_("Settings >"), settingsMenu),
72 (_("Credits"), self.showCredits),
73 (_("Quit"), self.quit),
74 ]
75 self.menu = Menu(self.engine, mainMenu, onClose = lambda: self.engine.view.popLayer(self))
76
78 self.engine.view.pushLayer(self.menu)
79 self.engine.stopServer()
80
81 if self.songName:
82 self.newSinglePlayerGame(self.songName)
83
85 self.engine.view.popLayer(self.menu)
86
87 if self.song:
88 self.song.fadeout(1000)
89
90 if self.nextLayer:
91 self.engine.view.pushLayer(self.nextLayer())
92 self.nextLayer = None
93 else:
94 self.engine.quit()
95
97 self.engine.view.popLayer(self.menu)
98
99 - def catchErrors(function):
100 def harness(self, *args, **kwargs):
101 try:
102 try:
103 function(self, *args, **kwargs)
104 except:
105 import traceback
106 traceback.print_exc()
107 raise
108 except socket.error, e:
109 Dialogs.showMessage(self.engine, unicode(e[1]))
110 except KeyboardInterrupt:
111 pass
112 except Exception, e:
113 if e:
114 Dialogs.showMessage(self.engine, unicode(e))
115 return harness
116
117 - def launchLayer(self, layerFunc):
118 if not self.nextLayer:
119 self.nextLayer = layerFunc
120 self.engine.view.popAllLayers()
121
122 - def showTutorial(self):
123 if self.engine.isServerRunning():
124 return
125 self.engine.startServer()
126 self.engine.resource.load(self, "session", lambda: self.engine.connect("127.0.0.1"), synch = True)
127
128 if Dialogs.showLoadingScreen(self.engine, lambda: self.session and self.session.isConnected):
129 self.launchLayer(lambda: Lobby(self.engine, self.session, singlePlayer = True, songName = "tutorial"))
130 showTutorial = catchErrors(showTutorial)
131
132 - def newSinglePlayerGame(self, songName = None):
133 if self.engine.isServerRunning():
134 return
135 self.engine.startServer()
136 self.engine.resource.load(self, "session", lambda: self.engine.connect("127.0.0.1"), synch = True)
137
138 if Dialogs.showLoadingScreen(self.engine, lambda: self.session and self.session.isConnected):
139 self.launchLayer(lambda: Lobby(self.engine, self.session, singlePlayer = True, songName = songName))
140 newSinglePlayerGame = catchErrors(newSinglePlayerGame)
141
143 self.engine.startServer()
144 self.engine.resource.load(self, "session", lambda: self.engine.connect("127.0.0.1"))
145
146 if Dialogs.showLoadingScreen(self.engine, lambda: self.session and self.session.isConnected):
147 self.launchLayer(lambda: Lobby(self.engine, self.session))
148 hostMultiplayerGame = catchErrors(hostMultiplayerGame)
149
150 - def joinMultiplayerGame(self, address = None):
151 if not address:
152 address = Dialogs.getText(self.engine, _("Enter the server address:"), "127.0.0.1")
153
154 if not address:
155 return
156
157 self.engine.resource.load(self, "session", lambda: self.engine.connect(address))
158
159 if Dialogs.showLoadingScreen(self.engine, lambda: self.session and self.session.isConnected, text = _("Connecting...")):
160 self.launchLayer(lambda: Lobby(self.engine, self.session))
161 joinMultiplayerGame = catchErrors(joinMultiplayerGame)
162
163 - def startEditor(self):
164 self.launchLayer(lambda: Editor(self.engine))
165 startEditor = catchErrors(startEditor)
166
167 - def startImporter(self):
168 self.launchLayer(lambda: Importer(self.engine))
169 startImporter = catchErrors(startImporter)
170
171 - def startGHImporter(self):
172 self.launchLayer(lambda: GHImporter(self.engine))
173 startGHImporter = catchErrors(startGHImporter)
174
175 - def showCredits(self):
176 self.launchLayer(lambda: Credits(self.engine))
177 showCredits = catchErrors(showCredits)
178
179 - def run(self, ticks):
180 self.time += ticks / 50.0
181
182 - def render(self, visibility, topMost):
183 self.visibility = visibility
184 v = 1.0 - ((1 - visibility) ** 2)
185
186 t = self.time / 100
187 w, h, = self.engine.view.geometry[2:4]
188 r = .5
189 self.background.transform.reset()
190 self.background.transform.translate((1 - v) * 2 * w + w / 2 + math.cos(t / 2) * w / 2 * r, h / 2 + math.sin(t) * h / 2 * r)
191 self.background.transform.rotate(-t)
192 self.background.transform.scale(math.sin(t / 8) + 2, math.sin(t / 8) + 2)
193 self.background.draw()
194
195 self.logo.transform.reset()
196 self.logo.transform.translate(.5 * w, .8 * h + (1 - v) * h * 2 * 0)
197 f1 = math.sin(t * 16) * .025
198 f2 = math.cos(t * 17) * .025
199 self.logo.transform.scale(1 + f1 + (1 - v) ** 3, -1 + f2 + (1 - v) ** 3)
200 self.logo.draw()
201
202 self.guy.transform.reset()
203 self.guy.transform.translate(.75 * w + (1 - v) * 2 * w, .35 * h)
204 self.guy.transform.scale(-.9, .9)
205 self.guy.transform.rotate(math.pi)
206 self.guy.draw()
207