#!/usr/bin/env python # -*- coding: utf-8 -*- ''' ------------------------------------------ WireChem - The new chemistry game Programme principal (C) Copyright 2013-2014 Nicolas Hordé Licence GPL V3.0 ------------------------------------------ ''' import datetime import math import pyglet import copy import csv import random import time import operator import shelve import os import sys from pyglet.gl import * from pyglet.window import mouse from pyglet.window import key from pyglet import clock from pyglet import image from os.path import expanduser ''' *********************************************************************************************** ''' ''' Fonctions de chargement ''' #Enregistre les données utilisateurs def sync(): global Uworlds,finished write(gethome()+"/dbdata",["Uworlds","finished"]) #Vérifie l'existence de la base de donnée utilisateur def verifyhome(): global Uworlds,finished if not os.path.exists(gethome()): os.makedirs(gethome()) if not os.path.exists(gethome()+"/dbdata"): Uworlds=[[{0:0}]] finished=[(0,0)] sync() #Trouve le chemin vers le repertoire utilisateur def gethome(): home = expanduser("~")+"/.wirechem" return home #Ecrit les variables spécifiés dans la base selectionnée (utilisateur ou système) def write(afile,var): d=shelve.open(afile,writeback=True) for k in var: d[k]=copy.deepcopy(globals()[k]) d.sync() d.close() #Lit une base de donnée def read(afile): d=shelve.open(afile,writeback=True) for k in d.keys(): globals()[k]=copy.deepcopy(d[k]) d.close() #Charge le dictionnaire sous forme de variables def load(d): for k in d.keys(): if k[0]!="_": globals()[k]=copy.deepcopy(d[k]) #Référence les variables def reference(var,noms): if len(noms)==2: for y in range(len(var)): for x in range(len(var[y])): var[y][x][noms[0]]=y var[y][x][noms[1]]=x else: for x in range(len(var[y])): var[x][y][noms[0]]=x #duplique les références def duplicateref(d): for k in d.keys(): d[d[k]['nom']]=d[k] ''' *********************************************************************************************** ''' ''' Sauvegarde/Restauration ''' def readlevel(w,l,user): global tuto,worlds,cout,selected,sizex,sizey,stat,tech tuto='' if user: if w1 and sys.argv[1]=='debug': debug=True else: debug=False ''' *********************************************************************************************** ''' ''' initialisation ''' debug=False worlds={} world=level=0 init() ''' *********************************************************************************************** ''' ''' Classes graphiques ''' #Bouton sensible a plusieurs évènements class abutton(object): def update(self,dt): try: self.vertex_list.delete() except: foo=0 try: self.vertex_list2.delete() except: foo=0 try: self.vertex_list3.delete() except: foo=0 try: self.sprite.delete() except: foo=0 if self.isvisible(): if not self.isactive(): color=127 else: color=255 if self.typeof=='color': color=(self.content[0],self.content[1],self.content[2],color) self.vertex_list = self.window.batch.add(4,pyglet.gl.GL_QUADS, self.window.p1, ('v2i', (self.x, self.y, self.x+self.width, self.y, self.x+self.width, self.y+self.height, self.x, self.y+self.height)), ('c4B', color * 4)) elif self.typeof=='function': self.vertex_list = eval(self.content) else: if self.typeof=='multicon': image = self.content[self.index] else: image = self.content if self.width==0 or self.height==0: self.width=image.width self.height=image.height self.sprite = pyglet.sprite.Sprite(image, x=self.x, y=self.y, batch=self.window.batch, group=self.window.p1) if self.width/float(self.height) < image.width/float(image.height): self.sprite.scale=float(self.width)/image.width else: self.sprite.scale=float(self.height)/image.height self.sprite.opacity=color if type(self.selected) is tuple: color=(self.selected[0],self.selected[1],self.selected[2],255) self.vertex_list2 = self.window.batch.add(4,pyglet.gl.GL_LINE_LOOP, self.window.p2, ('v2i', (self.x, self.y, self.x+self.width, self.y, self.x+self.width, self.y+self.height, self.x, self.y+self.height)), ('c4B', color * 4)) elif type(self.selected) is list: self.sprite.color=(self.selected[0],self.selected[1],self.selected[2]) if self.hilite and int(time.time())%2==0: color=(255,0,0,128) self.vertex_list3 = self.window.batch.add(4,pyglet.gl.GL_QUADS, self.window.p2, ('v2i', (self.x, self.y, self.x+self.width, self.y, self.x+self.width, self.y+self.height, self.x, self.y+self.height)), ('c4B', color * 4)) def __init__(self, window, name, x, y, width, height , active, hilite, visible, selected, content, hint, typeof, text, text2): self.name=name self.index=0 self.enter=0 self.x=x self.y=y self.width=width self.height=height self.active=active self.hilite=hilite self.visible=visible self.content=content self.typeof=typeof self.hint=hint self.selected=selected self.window=window self.window.push_handlers(self.on_mouse_press) self.window.push_handlers(self.on_mouse_motion) self.window.push_handlers(self.on_mouse_drag) self.window.push_handlers(self.on_mouse_release) self.window.push_handlers(self.on_mouse_scroll) self.updateclock=clock.schedule_interval(self.update,1) self.update(0) def delete(self): self.vertex_list.delete() del self self=None def launch(self,state): name=self.name.split('_') if len(name)>1 and hasattr(self.window, "on_mouse_"+state['event']+"_"+name[0]) and callable(eval("self.window.on_mouse_"+state['event']+"_"+name[0])): eval("self.window.on_mouse_"+state['event']+"_"+name[0]+"("+str(name[1])+","+str(state)+")") if hasattr(self.window, "on_mouse_"+state['event']+"_"+self.name) and callable(eval("self.window.on_mouse_"+state['event']+"_"+self.name)): if self.typeof=='multicon': self.index+=1 if self.index>=len(self.content): self.index=0 self.update(0) eval("self.window.on_mouse_"+state['event']+"_"+self.name+"("+str(state)+")") def on_mouse_press(self, x, y, button, modifiers): if x>self.x and y>self.y and xself.x and y>self.y and xself.x and y>self.y and xself.x and y>self.y and xself.x and y>self.y and x1024: self.loc[2]=-1 if self.loc[1]>768: self.loc[3]=-1 if self.loc[0]<0: self.loc[2]=1 if self.loc[1]<0: self.loc[3]=1 self.fond.anchor_x=self.loc[0] self.fond.anchor_y=self.loc[1] self.fond.blit_tiled(0, 0, 0, self.width, self.height) self.batch.draw() def on_mouse_press_menu_2(self, state): pyglet.app.exit() def on_mouse_enter_menu(self, n, state): self.buttons[2+n].setselected([255,0,0]) def on_mouse_leave_menu(self, n, state): self.buttons[2+n].setselected(False) def on_mouse_enter_level(self, n, state): global world self.levels[n].setselected(self.colors[world]) def on_mouse_leave_level(self, n, state): self.levels[n].setselected(False) def on_mouse_press_level(self, n, state): print "level "+str(n) ''' *********************************************************************************************** ''' ''' Lancement du menu principal ''' menu_principal = menu() menu_principal.set_minimum_size(1024, 768) glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glEnable(GL_LINE_STIPPLE) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); pyglet.app.run()