~alaxa27/ultimate-smash-friends/mirror_trunk

« back to all changes in this revision

Viewing changes to code/viewer.py

  • Committer: Alaxa27
  • Date: 2009-12-01 16:54:24 UTC
  • Revision ID: alaxa27@gmail.com-20091201165424-ary5j8xlregaj1nm
CLEAN..

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
################################################################################
 
3
# copyright 2008 Gabriel Pettier <gabriel.pettier@gmail.com>
 
4
#
 
5
# This file is part of ultimate-smash-friends
 
6
#
 
7
# ultimate-smash-friends is free software: you can redistribute it and/or modify
 
8
# it under the terms of the GNU General Public License as published by
 
9
# the Free Software Foundation, either version 3 of the License, or
 
10
# (at your option) any later version.
 
11
#
 
12
# ultimate-smash-friends is distributed in the hope that it will be useful,
 
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
# GNU General Public License for more details.
 
16
#
 
17
# You should have received a copy of the GNU General Public License
 
18
# along with ultimate-smash-friends.  If not, see <http://www.gnu.org/licenses/>.
 
19
################################################################################
 
20
 
 
21
#from pygame.locals import *
 
22
import pygame
 
23
import os, sys
 
24
import getopt
 
25
import time
 
26
from xml.parsers.expat import ExpatError
 
27
 
 
28
try:
 
29
    import pygtk
 
30
    pygtk.require("2.0")
 
31
except:
 
32
    pass
 
33
try:
 
34
    import gtk
 
35
    import gtksourceview2
 
36
    import gtk.glade
 
37
    import gobject
 
38
except:
 
39
    sys.exit(1)
 
40
 
 
41
# our modules
 
42
sys.path.append('modules') # our modules are here
 
43
from config import config
 
44
 
 
45
from animations import EmptyAnimationException
 
46
from game import Game, NetworkServerGame, NetworkClientGame
 
47
from menu import Menu
 
48
from entity import Entity
 
49
from debug_utils import draw_rect, LOG
 
50
import entity_skin
 
51
import loaders
 
52
 
 
53
# thanks to Samuel Abels
 
54
# http://csourcesearch.net/python/fidC15F2CB91333517E23E41191CFCDA6155BDC8B7B.aspx?s=cdef%3Atree+mdef%3Ainsert
 
55
def add_filters(filechooser):
 
56
    filter = gtk.FileFilter()
 
57
    filter.set_name("All XML files")
 
58
    filter.add_mime_type("text/xml")
 
59
    filechooser.add_filter(filter)
 
60
 
 
61
def create_filechooser_open():
 
62
    buttons     = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
 
63
                   gtk.STOCK_OPEN,   gtk.RESPONSE_OK)
 
64
    filechooser = gtk.FileChooserDialog(
 
65
            "Open...",
 
66
            None,
 
67
            gtk.FILE_CHOOSER_ACTION_OPEN,
 
68
            buttons
 
69
            )
 
70
    add_filters(filechooser)
 
71
    return filechooser
 
72
 
 
73
 
 
74
def create_filechooser_save():
 
75
    buttons = (
 
76
            gtk.STOCK_CANCEL,
 
77
            gtk.RESPONSE_CANCEL,
 
78
            gtk.STOCK_SAVE,
 
79
            gtk.RESPONSE_OK
 
80
            )
 
81
    filechooser = gtk.FileChooserDialog(
 
82
            "Save...",
 
83
            None,
 
84
            gtk.FILE_CHOOSER_ACTION_SAVE,
 
85
            buttons
 
86
            )
 
87
    filechooser.set_do_overwrite_confirmation(True)
 
88
    add_filters(filechooser)
 
89
    return filechooser
 
90
 
 
91
 
 
92
# thanks to Seo Sanghyeon
 
93
# http://sparcs.kaist.ac.kr/~tinuviel/devel/gtksdl.py
 
94
def pygame_hack(widget):
 
95
    def callback(widget, *args):
 
96
        handle = widget.window.xid
 
97
        size = widget.size_request()
 
98
        os.environ['SDL_WINDOWID'] = str(handle)
 
99
        pygame.mixer.init()
 
100
        pygame.display.init()
 
101
        pygame.display.set_mode(size)
 
102
    widget.connect('map-event', callback)
 
103
 
 
104
def update_pygame_widget(widget, game=None):
 
105
    screen = pygame.display.get_surface()
 
106
    # TODO
 
107
    screen.fill(pygame.Color("#CCCCFF"))
 
108
    if game.entity == None:
 
109
        screen.blit(
 
110
                loaders.image('media/items/trunk/trunk.png')[0],
 
111
                (time.time()*100%200,0)
 
112
                )
 
113
    else:
 
114
        #LOG().log((game.entity.place, game.entity.entity_skin.animation.rect))
 
115
        screen.blit(
 
116
            loaders.image(game.entity.entity_skin.animation.image)[0], (
 
117
                game.entity.place[0] - game.entity.entity_skin.animation.rect[2]/2,
 
118
                game.entity.place[1] - game.entity.entity_skin.animation.rect[3],
 
119
                )
 
120
            )
 
121
        draw_rect(screen, game.level)
 
122
    pygame.display.flip()
 
123
 
 
124
class NotGame(Game):
 
125
    """
 
126
    This object has the purpose of just containing informations to simulate a
 
127
    game for the character preview.
 
128
 
 
129
    """
 
130
    def __init__(self, gametime):
 
131
        self.gametime = 0
 
132
        self.events = []
 
133
        self.level = pygame.Rect(0,250, 250, 50)
 
134
        #self.level.moving_blocs = []
 
135
        self.entity = None
 
136
 
 
137
    def update(self, dt):
 
138
        for event in self.events:
 
139
            if not event.update(dt, self.gametime):
 
140
                self.events.remove(event)
 
141
 
 
142
        if self.entity is not None:
 
143
            #LOG().log(dt)
 
144
            self.entity.entity_skin.update(time.time(), self.entity.reversed)
 
145
 
 
146
            self.entity.move(
 
147
                    (
 
148
                     self.entity.vector[0] * dt,
 
149
                     self.entity.vector[1] * dt
 
150
                    ), 'vector'
 
151
                    )
 
152
            #self.entity.place[0] += self.entity.vector[0] * dt
 
153
            #self.entity.place[1] += self.entity.vector[1] * dt
 
154
            self.entity.vector[0] -= (
 
155
                    config['AIR_FRICTION'] * self.entity.vector[0] * dt
 
156
                    )
 
157
            self.entity.vector[1] -= (
 
158
                    config['AIR_FRICTION'] * self.entity.vector[1] * dt
 
159
                    )
 
160
            self.entity.place[0] %= 250
 
161
            self.entity.place[1] = max(
 
162
                    self.entity.entity_skin.animation.rect[3],
 
163
                    self.entity.place[1]
 
164
                    )
 
165
            if self.entity.place[1] > 250:
 
166
                self.entity.place[1] = 250
 
167
                self.entity.vector[1] *= -.5
 
168
            else:
 
169
                self.entity.vector[1] += config['GRAVITY']
 
170
 
 
171
class usf_character_creator(object):
 
172
    """
 
173
    This is a gtk application to create and edit characters for
 
174
    ultimate-smash-friends, because designers are to weak for plain XML.
 
175
 
 
176
    """
 
177
    def __init__(self):
 
178
        self.gladefile = "usf_character_creator.glade"
 
179
        self.wTree = gtk.glade.XML(self.gladefile,'window1')
 
180
 
 
181
        self.window = self.wTree.get_widget("window1")
 
182
        if self.window:
 
183
            dic = {
 
184
                "on_open1_activate": self.open_character_loader,
 
185
                "on_quit1_activate": gtk.main_quit,
 
186
                "on_save1_activate": self.save,
 
187
                "on_window1_destroy": gtk.main_quit,
 
188
                "on_button_play_clicked": self.play_pygame,
 
189
                "on_button_pause_clicked": self.pause_pygame,
 
190
                "refresh_pygame_widget": self.pygame_load_character_from_buffer,
 
191
                "on_combobox_animations_changed": self.pygame_update_animation,
 
192
            }
 
193
 
 
194
            self.wTree.signal_autoconnect(dic)
 
195
 
 
196
        self.pygame_widget = self.wTree.get_widget('pygame_widget')
 
197
        self.pygame_widget.set_size_request(300,300)
 
198
        pygame_hack(self.pygame_widget)
 
199
        self.pygame_update = None
 
200
        self.play_pygame()
 
201
 
 
202
        self.language_manager = gtksourceview2.LanguageManager()
 
203
        lang = self.language_manager.get_language('xml')
 
204
        buffer = gtksourceview2.Buffer(language=lang)
 
205
        buffer.set_max_undo_levels(1000)
 
206
        self.buffer = buffer
 
207
 
 
208
        view = gtksourceview2.View()
 
209
        view.set_buffer(buffer)
 
210
        view.set_show_line_numbers(True)
 
211
        view.set_indent_on_tab(True)
 
212
 
 
213
        self.game = NotGame(time.time())
 
214
 
 
215
        self.character_dir = None
 
216
 
 
217
        self.wTree.get_widget("scrolledwindow_source").add(view)
 
218
        view.show()
 
219
        #self.wTree.get_widget("xml_text").set_auto_indent(True)
 
220
 
 
221
        self.last_refresh = time.time()
 
222
 
 
223
    def save(self, *args, **kwargs):
 
224
        try:
 
225
            file = open(self.character_filename)
 
226
            file.write(
 
227
                    self.buffer.get_text(
 
228
                        self.buffer.get_start_iter(),self.buffer.get_end_iter()
 
229
                        )
 
230
                    )
 
231
            file.close()
 
232
            self.wTree.get_widget('label_source').set_text('OK')
 
233
 
 
234
        except Exception, e:
 
235
            self.wTree.get_widget('label_source').set_text(e.message)
 
236
 
 
237
    def pygame_update_animation(self, *args, **kwargs):
 
238
        LOG().log('change animation '+self.wTree.get_widget(
 
239
                'combobox_animations').get_active_text())
 
240
        self.game.entity.entity_skin.change_animation(
 
241
                self.wTree.get_widget('combobox_animations').get_active_text(),
 
242
                self.game,
 
243
                params={
 
244
                'entity': self.game.entity,
 
245
                'world': self.game
 
246
                }
 
247
                )
 
248
 
 
249
    def pygame_load_character_from_buffer(self, *args, **kwargs):
 
250
        if self.character_dir is not None:
 
251
            self.game.entity = Entity( 0,
 
252
                    self,
 
253
                    entity_skinname=None,
 
254
                    place=[100, 100]
 
255
                    )
 
256
            try:
 
257
                self.game.entity.entity_skin = entity_skin.Entity_skin(
 
258
                    dir_name=self.character_dir,
 
259
                    xml_from_str = self.buffer.get_text(
 
260
                        self.buffer.get_start_iter(),self.buffer.get_end_iter()
 
261
                        )
 
262
                    )
 
263
                self.wTree.get_widget('label_source').set_text('OK')
 
264
                self.game.entity.entity_skin.current_animation =\
 
265
                self.game.entity.entity_skin.animations.keys()[0]
 
266
                self.wTree.get_widget('combobox_animations').get_model().clear()
 
267
                for i in self.game.entity.entity_skin.animations.keys():
 
268
                    self.wTree.get_widget(
 
269
                            'combobox_animations'
 
270
                            ).get_model().append([i])
 
271
                for i in os.listdir(
 
272
                        os.path.join(
 
273
                            self.character_filename.split(os.sep)[:-1]
 
274
                            )
 
275
                        ):
 
276
                        if '.png' in i:
 
277
                            self.wTree.get_widget(
 
278
                                    'comboboxentry_images'
 
279
                                    ).get_model().append([i])
 
280
 
 
281
            except (pygame.error, ExpatError, EmptyAnimationException), e:
 
282
                self.wTree.get_widget('label_source').set_text(e.message)
 
283
                #raise
 
284
 
 
285
    def play_pygame(self, *args, **kwargs):
 
286
        if self.pygame_update is None:
 
287
            self.pygame_update = gobject.idle_add(self.refresh)
 
288
 
 
289
    def pause_pygame(self, *args, **kwargs):
 
290
        if self.pygame_update is not None:
 
291
            gobject.source_remove(self.pygame_update)
 
292
            self.pygame_update = None
 
293
 
 
294
    def open_character_loader(self, *args, **kwargs):
 
295
        self.pause_pygame()
 
296
        file_loader = create_filechooser_open()
 
297
        if file_loader.run() == gtk.RESPONSE_OK:
 
298
            file = open(file_loader.get_filename())
 
299
            self.character_dir = os.sep.join(
 
300
                    file_loader.get_filename().split( os.sep)[:-1]
 
301
                    )
 
302
            self.character_filename = file_loader.get_filename()
 
303
            self.buffer.set_text(file.read())
 
304
            file.close()
 
305
            self.pygame_load_character_from_buffer()
 
306
        file_loader.destroy()
 
307
        self.play_pygame()
 
308
 
 
309
    def refresh(self):
 
310
        if time.time() - self.last_refresh < .03:
 
311
            pass
 
312
        else:
 
313
            self.last_refresh = self.game.gametime
 
314
            self.game.gametime = time.time()
 
315
            self.game.update(self.game.gametime - self.last_refresh)
 
316
            update_pygame_widget(self.pygame_widget, self.game)
 
317
        return True
 
318
 
 
319
    def create_frame(self):
 
320
        pass
 
321
 
 
322
    def delete_frame(self):
 
323
        pass
 
324
 
 
325
    def update_frame_time(self):
 
326
        pass
 
327
 
 
328
    def update_frame_skin(self):
 
329
        pass
 
330
 
 
331
    def add_vector(self):
 
332
        pass
 
333
 
 
334
    def update_vector(self):
 
335
        pass
 
336
 
 
337
    def del_vector(self):
 
338
        pass
 
339
 
 
340
    def add_aggressiv_point(self):
 
341
        pass
 
342
 
 
343
    def del_aggressive_point(self):
 
344
        pass
 
345
 
 
346
    def update_aggressiv_point(self):
 
347
        pass
 
348
 
 
349
    def add_event(self):
 
350
        pass
 
351
 
 
352
    def update_event(self):
 
353
        pass
 
354
 
 
355
    def del_event(self):
 
356
        pass
 
357
 
 
358
    def move_event_up(self):
 
359
        pass
 
360
 
 
361
    def move_event_down(self):
 
362
        pass
 
363
 
 
364
if __name__ == '__main__':
 
365
    ucc = usf_character_creator()
 
366
    gtk.main()
 
367