2
################################################################################
3
# copyright 2008 Gabriel Pettier <gabriel.pettier@gmail.com>
5
# This file is part of ultimate-smash-friends
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.
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.
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
################################################################################
21
#from pygame.locals import *
26
from xml.parsers.expat import ExpatError
42
sys.path.append('modules') # our modules are here
43
from config import config
45
from animations import EmptyAnimationException
46
from game import Game, NetworkServerGame, NetworkClientGame
48
from entity import Entity
49
from debug_utils import draw_rect, LOG
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)
61
def create_filechooser_open():
62
buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
63
gtk.STOCK_OPEN, gtk.RESPONSE_OK)
64
filechooser = gtk.FileChooserDialog(
67
gtk.FILE_CHOOSER_ACTION_OPEN,
70
add_filters(filechooser)
74
def create_filechooser_save():
81
filechooser = gtk.FileChooserDialog(
84
gtk.FILE_CHOOSER_ACTION_SAVE,
87
filechooser.set_do_overwrite_confirmation(True)
88
add_filters(filechooser)
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)
100
pygame.display.init()
101
pygame.display.set_mode(size)
102
widget.connect('map-event', callback)
104
def update_pygame_widget(widget, game=None):
105
screen = pygame.display.get_surface()
107
screen.fill(pygame.Color("#CCCCFF"))
108
if game.entity == None:
110
loaders.image('media/items/trunk/trunk.png')[0],
111
(time.time()*100%200,0)
114
#LOG().log((game.entity.place, game.entity.entity_skin.animation.rect))
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],
121
draw_rect(screen, game.level)
122
pygame.display.flip()
126
This object has the purpose of just containing informations to simulate a
127
game for the character preview.
130
def __init__(self, gametime):
133
self.level = pygame.Rect(0,250, 250, 50)
134
#self.level.moving_blocs = []
137
def update(self, dt):
138
for event in self.events:
139
if not event.update(dt, self.gametime):
140
self.events.remove(event)
142
if self.entity is not None:
144
self.entity.entity_skin.update(time.time(), self.entity.reversed)
148
self.entity.vector[0] * dt,
149
self.entity.vector[1] * dt
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
157
self.entity.vector[1] -= (
158
config['AIR_FRICTION'] * self.entity.vector[1] * dt
160
self.entity.place[0] %= 250
161
self.entity.place[1] = max(
162
self.entity.entity_skin.animation.rect[3],
165
if self.entity.place[1] > 250:
166
self.entity.place[1] = 250
167
self.entity.vector[1] *= -.5
169
self.entity.vector[1] += config['GRAVITY']
171
class usf_character_creator(object):
173
This is a gtk application to create and edit characters for
174
ultimate-smash-friends, because designers are to weak for plain XML.
178
self.gladefile = "usf_character_creator.glade"
179
self.wTree = gtk.glade.XML(self.gladefile,'window1')
181
self.window = self.wTree.get_widget("window1")
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,
194
self.wTree.signal_autoconnect(dic)
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
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)
208
view = gtksourceview2.View()
209
view.set_buffer(buffer)
210
view.set_show_line_numbers(True)
211
view.set_indent_on_tab(True)
213
self.game = NotGame(time.time())
215
self.character_dir = None
217
self.wTree.get_widget("scrolledwindow_source").add(view)
219
#self.wTree.get_widget("xml_text").set_auto_indent(True)
221
self.last_refresh = time.time()
223
def save(self, *args, **kwargs):
225
file = open(self.character_filename)
227
self.buffer.get_text(
228
self.buffer.get_start_iter(),self.buffer.get_end_iter()
232
self.wTree.get_widget('label_source').set_text('OK')
235
self.wTree.get_widget('label_source').set_text(e.message)
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(),
244
'entity': self.game.entity,
249
def pygame_load_character_from_buffer(self, *args, **kwargs):
250
if self.character_dir is not None:
251
self.game.entity = Entity( 0,
253
entity_skinname=None,
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()
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])
273
self.character_filename.split(os.sep)[:-1]
277
self.wTree.get_widget(
278
'comboboxentry_images'
279
).get_model().append([i])
281
except (pygame.error, ExpatError, EmptyAnimationException), e:
282
self.wTree.get_widget('label_source').set_text(e.message)
285
def play_pygame(self, *args, **kwargs):
286
if self.pygame_update is None:
287
self.pygame_update = gobject.idle_add(self.refresh)
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
294
def open_character_loader(self, *args, **kwargs):
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]
302
self.character_filename = file_loader.get_filename()
303
self.buffer.set_text(file.read())
305
self.pygame_load_character_from_buffer()
306
file_loader.destroy()
310
if time.time() - self.last_refresh < .03:
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)
319
def create_frame(self):
322
def delete_frame(self):
325
def update_frame_time(self):
328
def update_frame_skin(self):
331
def add_vector(self):
334
def update_vector(self):
337
def del_vector(self):
340
def add_aggressiv_point(self):
343
def del_aggressive_point(self):
346
def update_aggressiv_point(self):
352
def update_event(self):
358
def move_event_up(self):
361
def move_event_down(self):
364
if __name__ == '__main__':
365
ucc = usf_character_creator()