836 lines
36 KiB
Python
836 lines
36 KiB
Python
#!/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 copy
|
|
import csv
|
|
import random
|
|
import time
|
|
import operator
|
|
import shelve
|
|
import os
|
|
import sys
|
|
from os.path import expanduser
|
|
|
|
import pyglet
|
|
from GLclass import *
|
|
from pyglet.gl import *
|
|
from pyglet.window import mouse
|
|
from pyglet.window import key
|
|
from pyglet import clock
|
|
from pyglet import image
|
|
|
|
|
|
''' *********************************************************************************************** '''
|
|
''' Fonctions de chargement
|
|
|
|
'''
|
|
class io(object):
|
|
|
|
# Enregistre les données utilisateurs
|
|
def sync(self):
|
|
global Uworlds, finished
|
|
self.write(self.gethome() + "/dbdata", ["Uworlds", "finished"])
|
|
|
|
# Enregistre les données système
|
|
def rebase(self):
|
|
global worlds
|
|
self.write("dbdata", ["worlds"])
|
|
|
|
|
|
#Vérifie l'existence de la base de donnée utilisateur
|
|
def verifyhome(self):
|
|
global Uworlds, finished
|
|
if not os.path.exists(self.gethome()):
|
|
os.makedirs(self.gethome())
|
|
if not os.path.exists(self.gethome() + "/dbdata"):
|
|
Uworlds = [[{0: 0}]]
|
|
finished = [(0, 0)]
|
|
self.sync()
|
|
|
|
|
|
#Trouve le chemin vers le repertoire utilisateur
|
|
def gethome(self):
|
|
home = expanduser("~") + "/.wirechem"
|
|
return home
|
|
|
|
|
|
#Ecrit les variables spécifiés dans la base selectionnée (utilisateur ou système)
|
|
def write(self, 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(self, 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(self, 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(self, d):
|
|
for k in d.keys():
|
|
d[d[k]['nom']] = d[k]
|
|
|
|
def readlevel(self, w, l, user):
|
|
global tuto, worlds, cout, selected, sizex, sizey, stat, tech
|
|
tuto = ''
|
|
if user:
|
|
if w < len(Uworlds) and l < len(Uworlds[w]) and Uworlds[w][l].has_key("element"):
|
|
self.load(Uworlds[w][l])
|
|
else:
|
|
self.load(worlds[w][l])
|
|
else:
|
|
self.load(worlds[w][l])
|
|
sizex = len(world_new)
|
|
sizey = len(world_new[0])
|
|
resize();
|
|
stat = [0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
over = 0
|
|
infos()
|
|
|
|
|
|
def savelevel(self, w, l):
|
|
global tuto, users, worlds, Uworlds, nom, descriptif, video, link, tech, cout, victory, current, cycle, nrj, rayon, temp, maxcycle, maxnrj, maxrayon, maxtemp, world_new, world_art
|
|
while len(Uworlds) <= w:
|
|
Uworlds.append(0)
|
|
Uworlds[w] = []
|
|
while len(Uworlds[w]) <= l:
|
|
Uworlds[w].append({})
|
|
Uworlds[w][l] = {'nom': nom,
|
|
'element': element,
|
|
'users': users,
|
|
'tuto': tuto,
|
|
'description': descriptif,
|
|
'_xx': worlds[world][level]['_xx'],
|
|
'_yy': worlds[world][level]['_yy'],
|
|
'video': video,
|
|
'link': link,
|
|
'level': level,
|
|
'world': world,
|
|
'tech': tech,
|
|
'cout': cout,
|
|
'victory': victory,
|
|
'current': worlds[world][level]['current'],
|
|
'cycle': cycle,
|
|
'nrj': nrj,
|
|
'rayon': rayon,
|
|
'temp': temp,
|
|
'maxcycle': maxcycle,
|
|
'maxnrj': maxnrj,
|
|
'maxrayon': maxrayon,
|
|
'maxtemp': maxtemp,
|
|
'world_new': world_new,
|
|
'world_art': world_art}
|
|
|
|
|
|
''' *********************************************************************************************** '''
|
|
''' initialisation '''
|
|
global worlds, debug, level,inc
|
|
debug = 0
|
|
worlds = {}
|
|
world = level = 0
|
|
inout=io()
|
|
inout.verifyhome()
|
|
inout.read("dbdata")
|
|
inout.read(inout.gethome() + "/dbdata")
|
|
inout.reference(worlds, ['world', 'level'])
|
|
inout.reference(Uworlds, ['world', 'level'])
|
|
if len(sys.argv) > 1 and sys.argv[1] == 'debug':
|
|
debug = 1
|
|
else:
|
|
debug = 0
|
|
inc=1
|
|
|
|
|
|
''' *********************************************************************************************** '''
|
|
''' Gestion du plateau de jeu '''
|
|
|
|
#Classe du plateau de jeu
|
|
class game(pyglet.window.Window):
|
|
def __init__(self, *args, **kwargs):
|
|
super(game, self).__init__(resizable=True, fullscreen=False, visible=True,
|
|
caption="Wirechem: The new chemistry game")
|
|
self.batch = pyglet.graphics.Batch()
|
|
self.clocks = [clock.schedule(self.draw)]
|
|
self.labels = []
|
|
|
|
def draw(self, dt):
|
|
glClearColor(0, 0, 0, 255)
|
|
self.clear()
|
|
|
|
''' *********************************************************************************************** '''
|
|
''' Gestion lancement de la video '''
|
|
|
|
#Classe du menu principal
|
|
class video(pyglet.window.Window):
|
|
def __init__(self, *args, **kwargs):
|
|
super(video, self).__init__(width=1024, height=768, resizable=True, fullscreen=False, visible=True,
|
|
caption="Wirechem: The new chemistry game")
|
|
self.player = pyglet.media.Player()
|
|
self.player.queue(pyglet.resource.media("movie/intro.mp4"))
|
|
self.player.play()
|
|
self.clocks = clock.schedule(self.draw)
|
|
|
|
def draw(self,dt):
|
|
if self.player.source and self.player.source.video_format:
|
|
glColor3ub(255,255,255)
|
|
self.player.get_texture().blit(0,0,width=self.width,height=self.height)
|
|
|
|
def on_key_press(self, symbol, modifiers):
|
|
self.player.next()
|
|
super(video, self).close()
|
|
|
|
def on_mouse_press(self, x, y, button, modifiers):
|
|
self.player.next()
|
|
super(video, self).close()
|
|
|
|
''' *********************************************************************************************** '''
|
|
''' Gestion du menu principal '''
|
|
|
|
#Classe du menu principal
|
|
class menu(pyglet.window.Window):
|
|
def __init__(self, *args, **kwargs):
|
|
global debug, worlds, world
|
|
super(menu, self).__init__(width=1024, height=768, resizable=True, fullscreen=False, visible=True,
|
|
caption="Wirechem: The new chemistry game")
|
|
self.focus = None
|
|
self.set_mouse_cursor(cursors['pointer'])
|
|
self.batch = pyglet.graphics.Batch()
|
|
self.p0 = pyglet.graphics.OrderedGroup(0)
|
|
self.p1 = pyglet.graphics.OrderedGroup(1)
|
|
self.p2 = pyglet.graphics.OrderedGroup(2)
|
|
self.p3 = pyglet.graphics.OrderedGroup(3)
|
|
self.p4 = pyglet.graphics.OrderedGroup(4)
|
|
self.clocks = [clock.schedule(self.draw), clock.schedule_interval(self.movefond, 0.03)]
|
|
self.loc = [0, 0, 1, 1]
|
|
self.selected = -1
|
|
self.icons=[abutton(self, 740, 110, 120, 0, 'icon_0', active=True, hilite=False, visible=False, selected=False, content=pyglet.image.load('picture/cout.png'), text='test', typeof='icon',align='right', hint=' '),
|
|
abutton(self, 740, 65, 120, 0, 'icon_1', active=True, hilite=False, visible=False, selected=False, content=pyglet.image.load('picture/cycle.png'), text='test', typeof='icon',align='right', hint=' '),
|
|
abutton(self, 940, 110, 70, 0, 'icon_2', active=True, hilite=False,visible=False, selected=False, content=pyglet.image.load('picture/tech.png'), text='test', typeof='icon',align='right', hint=' '),
|
|
abutton(self, 940, 65, 70, 0, 'icon_3', active=True, hilite=False, visible=False, selected=False, content=pyglet.image.load('picture/rayon.png'), text='test', typeof='icon',align='right', hint=' '),
|
|
abutton(self, 850, 110, 70, 0, 'icon_4', active=True, hilite=False, visible=False, selected=False, content=pyglet.image.load('picture/temp.png'), text='test', typeof='icon',align='right', hint=' '),
|
|
abutton(self, 850, 65, 70, 0, 'icon_5', active=True, hilite=False, visible=False, selected=False, content=pyglet.image.load('picture/nrj.png'), text='test', typeof='icon',align='right', hint=' ')]
|
|
self.images = [pyglet.image.load('picture/leveler0.png'), pyglet.image.load('picture/leveler1.png'),
|
|
pyglet.image.load('picture/leveler2.png'), pyglet.image.load('picture/leveler3.png'),
|
|
pyglet.image.load('picture/leveler4.png')]
|
|
self.colors = [[0, 192, 244], [235, 118, 118], [5, 157, 60], [215, 33, 255], [201, 209, 98]]
|
|
self.sizes = [(50, 70), (50, 50), (30, 70), (50, 60), (28, 68)]
|
|
self.names=["e","e","q","e","e","e","e","K","L","M","N","n","p"]
|
|
self.thecolors=[[0, 0, 255],[50, 50, 200],[44, 120, 44],[60, 60, 60],[40, 40, 40],[200, 50, 50],[150, 50, 50],[50, 50, 200],[50, 50, 200],[50, 50, 200],[50, 50, 200],[122, 49, 25],[75, 119, 157]]
|
|
|
|
#self.fond=pyglet.image.TileableTexture.create_for_image(image.load("picture/fond.png"))
|
|
self.labels = [pyglet.text.Label("", font_name='vademecum', font_size=380, x=0, y=0, bold=False, italic=False,
|
|
batch=self.batch, group=self.p0, color=(255, 80, 80, 230))]
|
|
self.fond = image.load("picture/fond.png")
|
|
self.rects = [arect(self,740,148,1016,8,1,[40,40,40,255],self.p1),
|
|
arect(self,8,8,1017,149,2,[90,90,90,170],self.p0)]
|
|
self.buttons = [
|
|
abutton(self, 185, 'self.window.height-200', 0, 0, 'logo', active=True, hilite=False, visible=True, selected=False, content=pyglet.image.load('picture/logo.png'), text='', typeof='icon', hint=''),
|
|
abutton(self, 45, 'self.window.height-150', 0, 0, 'logo2', active=True, hilite=False, visible=True, selected=False, content=pyglet.image.load('picture/logo2.png'), text='', typeof='icon', hint=''),
|
|
abutton(self, 840, 150, 0, 0, 'menu_0', active=True, hilite=False, visible=True, selected=False, content=pyglet.image.load('picture/arrows.png'),text='', typeof='icon', hint=''),
|
|
abutton(self, 920, 150, 0, 0, 'menu_1', active=True, hilite=False, visible=True, selected=False, content=pyglet.image.load('picture/arrows2.png'),text='', typeof='icon', hint=''),
|
|
abutton(self, 940, 'self.window.height-100', 0, 0, 'menu_2', active=True, hilite=False, visible=True, selected=False, content=pyglet.image.load('picture/exit2.png'), text='', typeof='icon', hint='')
|
|
]
|
|
self.infos = [atext(self, 12, 8, 730, 140, text="c un test", font='OpenDyslexicAlta', size=15)]
|
|
self.infos[0].layout.begin_update()
|
|
self.infos[0].color=(255,255,255,255)
|
|
self.infos[0].layout.document.set_style(0, len(self.infos[0].layout.document.text), dict(align="left"))
|
|
self.infos[0].layout.end_update()
|
|
self.infos[0].text=" "
|
|
self.infos[0].update(0)
|
|
self.victorys = [abutton(self, 740+21*i, 12, 21, 38, 'victory_'+str(i), active=True, hilite=False, visible=True, selected=False, content=self.thecolors[i], text='test', typeof='color', hint=self.names[i]+"\n0") for i in range(len(self.names))]
|
|
for i in range(len(self.names)):
|
|
self.victorys[i].layout.document.set_style(0,2,dict(font_name="Mechanihan", font_size=10, color=(180,180,180,255), align="left"))
|
|
self.victorys[i].layout.document.set_style(1,1,dict(font_name="Mechanihan", font_size=14, bold=True ,color=(180,180,180,255), align="left"))
|
|
self.victorys[i].layout.content_valign="top"
|
|
self.levels = [abutton(self, -250, 0, 0, 0, 'level_'+str(i), active=True, hilite=False, visible=True, selected=False, content=self.images[level], text='test', typeof='icon', hint='') for i in range(10)]
|
|
self.untitled2 = [atext(self, -300, -300, 300, 0, text="", font='Fluoxetine', size=18) for i in range(10)]
|
|
self.untitled = [atext(self, -300, -300, 60, 0, text="", font='Vademecum', size=23) for i in range(10)]
|
|
self.special = pyglet.sprite.Sprite(pyglet.image.load('picture/boss.png'), batch=self.batch, group=self.p4,x=-300, y=-300)
|
|
self.lock = [pyglet.sprite.Sprite(pyglet.image.load('picture/locked.png'), batch=self.batch, group=self.p4, x=-300, y=-300) for i in range(10)]
|
|
self.update(0)
|
|
|
|
def on_resize(self, width, height):
|
|
super(menu, self).on_resize(width, height)
|
|
try:
|
|
self.update(0)
|
|
except:
|
|
dummy=0
|
|
|
|
def movefond(self, dt):
|
|
global loc
|
|
self.loc[0] += self.loc[2]
|
|
self.loc[1] += self.loc[3]
|
|
if self.loc[0] > 1024:
|
|
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
|
|
|
|
def update(self,alevel):
|
|
global world, worlds, finished
|
|
for obj in worlds[world]:
|
|
if obj.has_key('special'):
|
|
break
|
|
if 'obj' in locals(): self.labels[0].text = obj['element']
|
|
self.labels[0].color = (self.colors[world][0], self.colors[world][1], self.colors[world][2], 100)
|
|
self.labels[0].x = (1024 - self.labels[0].content_width) / 2 - 50
|
|
self.labels[0].y = 75 * self.height / 768
|
|
if 'obj' in locals():
|
|
self.labels[0].text = obj['element']
|
|
else:
|
|
self.labels[0].text = ''
|
|
for l in range(len(self.buttons)):
|
|
if alevel!=0 and alevel!=l: continue
|
|
self.buttons[l].update(0)
|
|
for l in range(10):
|
|
if alevel!=0 and alevel!=l: continue
|
|
if l >= len(worlds[world]):
|
|
self.levels[l].x = -300
|
|
self.untitled[l].x = -300
|
|
self.untitled2[l].x = -300
|
|
self.lock[l].x = -300
|
|
self.levels[l].update(0)
|
|
self.untitled2[l].update(0)
|
|
self.untitled[l].update(0)
|
|
continue
|
|
ele = worlds[world][l]
|
|
self.levels[l].active = (world, l) in finished or debug == 2
|
|
self.levels[l].x = ele['_xx']
|
|
self.levels[l].y = ele['_yy'] / 768.0 * self.height
|
|
self.levels[l].setselected(
|
|
[255, 120 + int(ele['_xx'] / 1024.0 * 135), 155 + int(ele['_xx'] / 1024.0 * 100)])
|
|
self.levels[l].content = self.images[world]
|
|
self.levels[l].update(0)
|
|
self.untitled[l].text = ele['element']
|
|
self.untitled[l].x = ele['_xx'] + (self.images[world].width - 60) / 2
|
|
self.untitled[l].y = ele['_yy'] / 768.0 * self.height + 18
|
|
self.untitled[l].loaded = 'worlds[' + str(world) + '][' + str(l) + ']["element"]'
|
|
self.untitled[l].color = (
|
|
int(ele['_xx'] / 1024.0 * 150), int(ele['_xx'] / 1024.0 * 150), int(ele['_xx'] / 1024.0 * 150), 255)
|
|
self.untitled[l].update(0)
|
|
self.untitled2[l].text = ele['nom'].decode('utf-8')
|
|
self.untitled2[l].x = ele['_xx'] + (self.images[world].width - 300) / 2
|
|
self.untitled2[l].y = ele['_yy'] / 768.0 * self.height - 25
|
|
self.untitled2[l].loaded = 'worlds[' + str(world) + '][' + str(l) + ']["nom"]'
|
|
if (world, l) in finished or debug == 2:
|
|
self.untitled2[l].color = (255, 255, 255, 255)
|
|
else:
|
|
self.untitled2[l].color = (90, 90, 90, 255)
|
|
self.untitled2[l].update(0)
|
|
self.lock[l].visible = (world, l) not in finished and not debug == 2
|
|
self.lock[l].x = ele['_xx'] + 10
|
|
self.lock[l].y = ele['_yy'] / 768.0 * self.height + 50
|
|
if 'obj' in locals() and ele['description'] == obj['description']:
|
|
self.special.x = ele['_xx']
|
|
self.special.y = ele['_yy'] / 768.0 * self.height
|
|
if 'obj' not in locals():
|
|
self.special.x = -300
|
|
|
|
def drawLaser(self, x1, y1, x2, y2, width, power, color, randomize):
|
|
while (width > 0):
|
|
if randomize != 0: glLineStipple(random.randint(0, randomize), random.randint(0, 65535))
|
|
glLineWidth(width)
|
|
glBegin(GL_LINES)
|
|
glColor3ub(min(color[0] + power * width, 255), min(color[1] + power * width, 255),
|
|
min(color[2] + power * width, 255))
|
|
glVertex2i(x1, y1)
|
|
glVertex2i(x2, y2)
|
|
width = width - 1
|
|
glEnd()
|
|
glLineStipple(1, 65535)
|
|
|
|
def draw(self, dt):
|
|
global loc, world, worlds, thex, they, debug
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
#self.fond.anchor_x=self.loc[0]
|
|
#self.fond.anchor_y=self.loc[1]
|
|
if debug < 2:
|
|
glColor4ub(255, 255, 255, 160)
|
|
self.fond.blit(self.loc[0], self.loc[1])
|
|
self.fond.blit(self.loc[0] - 1024, self.loc[1])
|
|
self.fond.blit(self.loc[0] - 1024, self.loc[1] - 768)
|
|
self.fond.blit(self.loc[0], self.loc[1] - 768)
|
|
#self.fond.blit_tiled(0, 0, 0, self.width, self.height)
|
|
for ele in worlds[world]:
|
|
for n in ele['link']:
|
|
if world == n[0]:
|
|
src = (int(ele['_xx'] + self.images[0].width / 2),
|
|
int(ele['_yy'] / 768.0 * self.height + self.images[0].height / 2))
|
|
dest = (int(worlds[n[0]][n[1]]['_xx'] + self.images[0].width / 2),
|
|
int(worlds[n[0]][n[1]]['_yy'] / 768.0 * self.height + self.images[0].height / 2))
|
|
else:
|
|
src = (int(ele['_xx'] + self.images[0].width / 2),
|
|
int(ele['_yy'] / 768.0 * self.height + self.images[0].height / 2))
|
|
dest = (int(1024), int(worlds[n[0]][n[1]]['_yy'] / 768.0 * self.height + 50))
|
|
if dest[0] - src[0] != 0:
|
|
angle = math.atan(float(dest[1] - src[1]) / float(dest[0] - src[0]))
|
|
else:
|
|
angle = 270 * 3.14 / 180.0
|
|
if dest[0] - src[0] < 0:
|
|
angle = angle + 180 * 3.14 / 180.0
|
|
src = (src[0] + int(self.sizes[world][0] * math.cos(angle)),
|
|
src[1] + int(self.sizes[world][1] * math.sin(angle)))
|
|
if world == n[0]:
|
|
dest = (dest[0] - int(self.sizes[world][0] * math.cos(angle)),
|
|
dest[1] - int(self.sizes[world][1] * math.sin(angle)))
|
|
if n in finished or debug == 2:
|
|
params = (random.randint(0, 8), 20, self.colors[world], 12)
|
|
else:
|
|
params = (2, 20, [40, 40, 40], 0)
|
|
self.drawLaser(src[0], src[1], dest[0], dest[1], params[0], params[1], params[2], params[3])
|
|
if debug == 2 and world == n[0]:
|
|
if dest[0] - src[0] != 0:
|
|
angle = math.atan(float(dest[1] - src[1]) / float(dest[0] - src[0]))
|
|
else:
|
|
angle = 270 * 3.14 / 180.0
|
|
if dest[0] - src[0] < 0:
|
|
angle = angle + 180 * 3.14 / 180.0
|
|
self.drawLaser(dest[0], dest[1], dest[0] - int(20 * math.cos(angle + 30 * 3.14 / 180)),
|
|
dest[1] - int(20 * math.sin(angle + 30 * 3.14 / 180)), params[0], params[1],
|
|
params[2], params[3])
|
|
self.drawLaser(dest[0], dest[1], dest[0] - int(20 * math.cos(angle - 30 * 3.14 / 180)),
|
|
dest[1] - int(20 * math.sin(angle - 30 * 3.14 / 180)), params[0], params[1],
|
|
params[2], params[3])
|
|
if world > 0:
|
|
for ele in worlds[world - 1]:
|
|
for n in ele['link']:
|
|
if n[0] == world:
|
|
src = (int(0), int(worlds[n[0]][n[1]]['_yy'] / 768.0 * self.height + self.images[0].height / 2))
|
|
dest = (int(worlds[n[0]][n[1]]['_xx'] + self.images[0].width / 2),
|
|
int(worlds[n[0]][n[1]]['_yy'] / 768.0 * self.height + self.images[0].height / 2))
|
|
if dest[0] - src[0] != 0:
|
|
angle = math.atan(float(dest[1] - src[1]) / float(dest[0] - src[0]))
|
|
else:
|
|
angle = 270 * 3.14 / 180.0
|
|
if dest[0] - src[0] < 0:
|
|
angle = angle + 180 * 3.14 / 180.0
|
|
dest = (dest[0] - int(self.sizes[world][0] * math.cos(angle)),
|
|
dest[1] - int(self.sizes[world][1] * math.sin(angle)))
|
|
if n in finished or debug == 2:
|
|
params = (random.randint(0, 8), 20, self.colors[world], 12)
|
|
else:
|
|
params = (2, 20, [40, 40, 40], 0)
|
|
self.drawLaser(src[0], src[1], dest[0], dest[1], params[0], params[1], params[2], params[3])
|
|
|
|
if type(self.selected) is tuple:
|
|
if self.selected[0] == world:
|
|
self.drawLaser(int(worlds[self.selected[0]][self.selected[1]]['_xx'] + self.images[0].width / 2), int(
|
|
worlds[self.selected[0]][self.selected[1]]['_yy'] / 768.0 * self.height + self.images[
|
|
0].height / 2), int(thex), int(they), random.randint(0, 8), 20, self.colors[world], 12)
|
|
else:
|
|
self.drawLaser(int(0), int(
|
|
worlds[self.selected[0]][self.selected[1]]['_yy'] / 768.0 * self.height + self.images[
|
|
0].height / 2), int(thex), int(they), random.randint(0, 8), 20, self.colors[world], 12)
|
|
self.batch.draw()
|
|
|
|
### Evenement générer par classe abutton ###
|
|
|
|
def on_mouse_press_logo(self, state):
|
|
global debug
|
|
if debug == 1:
|
|
debug = 2
|
|
ambiance.pause()
|
|
self.buttons[0].setselected([255, 0, 0])
|
|
elif debug == 2:
|
|
self.infos[0].loaded=""
|
|
self.infos[0].text=" "
|
|
self.infos[0].update()
|
|
debug = 1
|
|
self.buttons[0].setselected(False)
|
|
ambiance.play()
|
|
self.update(0)
|
|
|
|
def on_mouse_double_logo2(self, state):
|
|
global debug
|
|
if debug == 2:
|
|
inout.rebase()
|
|
self.on_mouse_press_logo(self)
|
|
|
|
def on_mouse_press_menu_2(self, state):
|
|
pyglet.app.exit()
|
|
|
|
def on_mouse_press_menu_1(self, state):
|
|
global world
|
|
if world > 0:
|
|
world -= 1
|
|
self.update(0)
|
|
sounds.next()
|
|
sounds.queue(pyglet.resource.media("sound/lightning3.wav"))
|
|
sounds.play()
|
|
|
|
def on_mouse_press_menu_0(self, state):
|
|
global world
|
|
if world < len(worlds) - 1:
|
|
world += 1
|
|
self.update(0)
|
|
sounds.next()
|
|
sounds.queue(pyglet.resource.media("sound/lightning1.wav"))
|
|
sounds.play()
|
|
|
|
def on_mouse_enter_menu(self, n, state):
|
|
self.buttons[2 + n].setselected([255, 0, 0])
|
|
|
|
def on_mouse_double_level(self, n, state):
|
|
if debug < 2:
|
|
return
|
|
for ele in worlds[world]:
|
|
try:
|
|
del ele['special']
|
|
except:
|
|
dummy = 0
|
|
worlds[world][n]["special"] = True
|
|
self.update(n)
|
|
|
|
def on_mouse_drag_level(self, n, state):
|
|
global worlds, world
|
|
if debug < 2:
|
|
return
|
|
if state['buttons'] == 2:
|
|
worlds[world][n]["_xx"] += state['dx']
|
|
worlds[world][n]["_yy"] += state['dy']
|
|
self.set_mouse_cursor(cursors['move'])
|
|
self.update(n)
|
|
elif (state['buttons'] == 1 or state['buttons'] == 4) and type(self.selected) is int:
|
|
self.selected = (world, n)
|
|
self.set_mouse_cursor(cursors['create'])
|
|
|
|
def on_mouse_release_level(self, n, state):
|
|
global worlds, world
|
|
if debug < 2:
|
|
return
|
|
if state['buttons'] == 1 and type(self.selected) is tuple and n != self.selected[1]:
|
|
try:
|
|
worlds[world][n]["link"].index(self.selected) == -1
|
|
except:
|
|
try:
|
|
worlds[world][self.selected]["link"].index((self.selected[0], n)) == -1
|
|
except:
|
|
worlds[self.selected[0]][self.selected[1]]["link"].append((world, n))
|
|
self.selected = -1
|
|
elif state['buttons'] == 4 and type(self.selected) is tuple and n != self.selected:
|
|
try:
|
|
worlds[world][n]["link"].remove(self.selected)
|
|
except:
|
|
dummy = 0
|
|
try:
|
|
worlds[self.selected[0]][self.selected[1]]["link"].remove((world, n))
|
|
except:
|
|
dummy = 0
|
|
else:
|
|
self.selected = -1
|
|
self.set_mouse_cursor(cursors['pointer'])
|
|
|
|
def on_mouse_leave_menu(self, n, state):
|
|
self.buttons[2 + n].setselected(False)
|
|
|
|
def on_mouse_enter_level(self, n, state):
|
|
global world,worlds,level
|
|
sounds.next()
|
|
sounds.queue(pyglet.resource.media("sound/pickup1.wav"))
|
|
sounds.play()
|
|
level=n
|
|
if debug == 2:
|
|
for theicon in self.icons: theicon.hide()
|
|
for theicon in self.untitled2:
|
|
theicon.color = (255, 255, 255, 255)
|
|
theicon.update()
|
|
for i in range(len(self.levels)):
|
|
self.levels[i].setselected([255, 120 + int(self.levels[i].x / 1024.0 * 135), 155 + int(self.levels[i].x / 1024.0 * 100)])
|
|
self.levels[n].setselected([255, 0, 0])
|
|
self.untitled2[n].color = (255, 0, 0, 255)
|
|
self.untitled2[n].update()
|
|
self.infos[0].text=worlds[world][n]['description'].decode('utf-8')
|
|
self.infos[0].loaded='worlds[' + str(world) + '][' + str(n) + ']["description"]'
|
|
self.infos[0].update()
|
|
var=['cout','maxcycle','tech','maxrayon','maxtemp','maxnrj']
|
|
condition=[worlds[world][n]['cout']>0,worlds[world][n]['maxcycle']<90000,worlds[world][n]['tech']>0,worlds[world][n]['maxrayon']<90000,worlds[world][n]['maxtemp']<90000,worlds[world][n]['maxnrj']<90000]
|
|
for i in range(len(condition)):
|
|
if debug==2 or condition[i]:
|
|
if worlds[world][n][var[i]]<90000:
|
|
self.icons[i].text=str(worlds[world][n][var[i]])
|
|
else:
|
|
self.icons[i].text="illimite"
|
|
self.icons[i].show()
|
|
else:
|
|
self.icons[i].hide()
|
|
|
|
def on_mouse_double_icon(self, n, state):
|
|
global world,worlds,level,inc
|
|
var=['cout','maxcycle','tech','maxrayon','maxtemp','maxnrj']
|
|
if var[n]=='tech':
|
|
return
|
|
if worlds[world][level][var[n]]<90000:
|
|
worlds[world][level][var[n]]=90001
|
|
self.icons[n].text="illimite"
|
|
else:
|
|
worlds[world][level][var[n]]=0
|
|
self.icons[n].text=str(0)
|
|
self.icons[n].update(0)
|
|
|
|
|
|
def on_mouse_press_icon(self, n, state):
|
|
global inc
|
|
if inc==1:
|
|
inc=10
|
|
elif inc==10:
|
|
inc=100
|
|
elif inc==100:
|
|
inc=1000
|
|
else:
|
|
inc=1
|
|
|
|
def on_mouse_scroll_icon(self, n, state):
|
|
global world,worlds,level,inc
|
|
var=['cout','maxcycle','tech','maxrayon','maxtemp','maxnrj']
|
|
add=state['dy']*inc
|
|
if worlds[world][level][var[n]]<90000:
|
|
print add
|
|
worlds[world][level][var[n]]=worlds[world][level][var[n]]+add
|
|
if var[n]=='tech':
|
|
if worlds[world][level]['tech']<-1: worlds[world][level]['tech']=-1
|
|
if worlds[world][level]['tech']>9: worlds[world][level]['tech']=9
|
|
else:
|
|
if worlds[world][level][var[n]]<0: worlds[world][level][var[n]]=0
|
|
self.icons[n].text=str(worlds[world][level][var[n]])
|
|
self.icons[n].update(0)
|
|
|
|
def on_mouse_leave_level(self, n, state):
|
|
if debug == 2:
|
|
return
|
|
self.levels[n].setselected(
|
|
[255, 120 + int(self.levels[n].x / 1024.0 * 135), 155 + int(self.levels[n].x / 1024.0 * 100)])
|
|
self.untitled2[n].color = (255, 255, 255, 255)
|
|
self.untitled2[n].update()
|
|
self.infos[0].loaded=""
|
|
self.infos[0].text=" "
|
|
self.infos[0].update()
|
|
for theicon in self.icons: theicon.hide()
|
|
|
|
def on_mouse_press_level(self, n, state):
|
|
global level
|
|
if debug == 2:
|
|
self.selected = -1
|
|
if state['modifiers'] & key.MOD_CTRL:
|
|
del worlds[world][n]
|
|
self.update(0)
|
|
for ele in worlds[world]:
|
|
l = 0
|
|
while l < len(ele['link']):
|
|
element = ele['link'][l][1]
|
|
if ele['link'][l][0] == world:
|
|
if element > n: element -= 1
|
|
if element != n:
|
|
ele['link'][l] = (ele['link'][l][0], element)
|
|
l += 1
|
|
else:
|
|
del ele['link'][l]
|
|
else:
|
|
l += 1
|
|
return
|
|
else:
|
|
level=n
|
|
super(menu,self).close()
|
|
thegame=game()
|
|
thegame.set_minimum_size(1024, 768)
|
|
pyglet.app.run()
|
|
|
|
|
|
### Evenement de la fenetre ###
|
|
|
|
def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
|
|
global thex, they, world, worlds
|
|
if debug < 2:
|
|
return
|
|
if type(self.selected) is tuple:
|
|
thex = x
|
|
they = y
|
|
if x > 1024 - 20 and world + 1 < len(worlds) and abs(self.selected[0] - world) < 1:
|
|
world += 1
|
|
self.update(0)
|
|
return
|
|
if self.focus:
|
|
self.focus.caret.on_mouse_drag(x, y, dx, dy, buttons, modifiers)
|
|
|
|
def on_mouse_release(self, x, y, button, modifiers):
|
|
if debug < 2:
|
|
return
|
|
self.selected = -1
|
|
|
|
def on_mouse_press(self, x, y, button, modifiers):
|
|
if debug < 2:
|
|
return
|
|
if modifiers & key.MOD_SHIFT and len(worlds[world]) < 10:
|
|
worlds[world].append({'nom': 'nouveau',
|
|
'description': "niveau tout neuf. " + str(random.randint(0, 255)),
|
|
'element': 'x',
|
|
'current': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
'victory': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
'cout': 0,
|
|
'tech': 0,
|
|
'cycle': 0,
|
|
'maxcycle': 99999,
|
|
'nrj': 0,
|
|
'maxnrj': 99999,
|
|
'rayon': 0,
|
|
'maxrayon': 99999,
|
|
'temp': 0,
|
|
'maxtemp': 99999,
|
|
'_xx': x - self.images[0].width / 2,
|
|
'_yy': y * 768 / self.height - self.images[0].height / 2,
|
|
'link': [],
|
|
'video': False,
|
|
'world_art': [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
|
|
'world_new': [[0, 0, 0], [0, 0, 0], [0, 0, 0]]})
|
|
self.update(len(worlds[world])-1)
|
|
return
|
|
for widget in self.untitled2 + self.untitled + self.infos:
|
|
if widget.hit_test(x, y):
|
|
self.setfocus(widget)
|
|
break
|
|
else:
|
|
self.setfocus(None)
|
|
if self.focus:
|
|
self.focus.caret.on_mouse_press(x, y, button, modifiers)
|
|
|
|
def on_mouse_motion(self, x, y, dx, dy):
|
|
if debug < 2:
|
|
return
|
|
for widget in self.untitled2 + self.untitled + self.infos:
|
|
if widget.hit_test(x, y):
|
|
self.set_mouse_cursor(cursors['text'])
|
|
break
|
|
else:
|
|
self.set_mouse_cursor(cursors['pointer'])
|
|
|
|
def on_text(self, text):
|
|
if debug < 2:
|
|
return
|
|
if self.focus:
|
|
self.focus.caret.on_text(text)
|
|
|
|
def on_text_motion(self, motion):
|
|
if debug < 2:
|
|
return
|
|
if self.focus:
|
|
self.focus.caret.on_text_motion(motion)
|
|
|
|
def on_text_motion_select(self, motion):
|
|
if debug < 2:
|
|
return
|
|
if self.focus:
|
|
self.focus.caret.on_text_motion_select(motion)
|
|
|
|
def on_key_press(self, symbol, modifiers):
|
|
if debug < 2:
|
|
return
|
|
if modifiers & key.MOD_SHIFT:
|
|
self.set_mouse_cursor(cursors['cross'])
|
|
elif modifiers & key.MOD_CTRL:
|
|
self.set_mouse_cursor(cursors['delete'])
|
|
if symbol == pyglet.window.key.TAB:
|
|
if modifiers & pyglet.window.key.MOD_SHIFT:
|
|
dir = -1
|
|
else:
|
|
dir = 1
|
|
all=(self.untitled2 + self.untitled + self.infos)
|
|
if self.focus in all:
|
|
i = all.index(self.focus)
|
|
else:
|
|
i = 0
|
|
dir = 0
|
|
self.setfocus(all[(i + dir) % len(all)])
|
|
elif symbol == pyglet.window.key.ESCAPE:
|
|
pyglet.app.exit()
|
|
|
|
def setfocus(self, focus):
|
|
if self.focus:
|
|
self.focus.caret.visible = False
|
|
self.focus.caret.mark = self.focus.caret.position = 0
|
|
self.focus = focus
|
|
if self.focus:
|
|
self.focus.caret.visible = True
|
|
self.focus.caret.mark = 0
|
|
self.focus.caret.position = len(self.focus.document.text)
|
|
|
|
|
|
''' *********************************************************************************************** '''
|
|
''' Lancement du menu principal '''
|
|
|
|
cursors = {'pointer':pyglet.window.ImageMouseCursor(pyglet.resource.image('cursor/pointer.png'), 15, 46),
|
|
'text':pyglet.window.ImageMouseCursor(pyglet.resource.image('cursor/text.png'), 24, 30),
|
|
'move':pyglet.window.ImageMouseCursor(pyglet.resource.image('cursor/move.png'), 24, 24),
|
|
'create':pyglet.window.ImageMouseCursor(pyglet.resource.image('cursor/create.png'), 12, 17),
|
|
'cross':pyglet.window.ImageMouseCursor(pyglet.resource.image('cursor/cross.png'), 24, 33),
|
|
'delete':pyglet.window.ImageMouseCursor(pyglet.resource.image('cursor/delete.png'), 24, 32)}
|
|
pyglet.font.add_file('font/Fluoxetine.ttf')
|
|
pyglet.font.add_file('font/OpenDyslexicAlta.otf')
|
|
pyglet.font.add_file('font/Mecanihan.ttf')
|
|
pyglet.font.add_file('font/Vademecum.ttf')
|
|
pyglet.font.add_file('font/LiberationMono-Regular.ttf')
|
|
ambiance = pyglet.media.Player()
|
|
ambiance.queue(pyglet.resource.media("music/ambiance1.mp3"))
|
|
ambiance.volume = 0.1
|
|
ambiance.eos_action = 'loop'
|
|
ambiance.play()
|
|
sounds = pyglet.media.Player()
|
|
sounds.volume = 0.6
|
|
video_intro=video()
|
|
pyglet.app.run()
|
|
menu_principal = menu()
|
|
menu_principal.set_minimum_size(1024, 768)
|
|
glEnable(GL_BLEND);
|
|
#glEnable(GL_STENCIL_TEST);
|
|
#glEnable(GL_LINE_SMOOTH);
|
|
#glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST);
|
|
glEnable(GL_LINE_STIPPLE)
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
pyglet.app.run()
|
|
|
|
|
|
|
|
|
|
|
|
|