#!/usr/bin/env python # -*- coding: utf-8 -*- import pyglet import copy import csv import random import time import operator from pyglet.gl import * from pyglet.window import mouse from pyglet.window import key from pyglet import clock from pyglet import image ''' ************************************************************************************************ ''' ''' Initialisation ''' def loaditems(n,file): global items with open(file, 'rb') as f: liste=list(csv.reader(f,delimiter=';')) for i in range(1,len(liste)): items[liste[i][0]]={} for j in range(1,len(liste[i])): if liste[i][j][:1]=="#": items[liste[i][0]][liste[0][j]]=int(liste[i][j][1:]) elif liste[i][j][:1]=="[": atemp=liste[i][j][1:-1].split(",") items[liste[i][0]][liste[0][j]]=[int(atemp[k]) for k in range(len(atemp))] elif liste[i][j][:1]=="{": atemp=items[liste[i][0]][liste[0][j]]=liste[i][j][1:-1].split(",") items[liste[i][0]][liste[0][j]]=[atemp[k] for k in range(len(atemp))] elif liste[i][j][:2]=="0x": items[liste[i][0]][liste[0][j]]=int(liste[i][j][2:],16) elif liste[i][j][:1]=="&": items[liste[i][0]][liste[0][j]]=float(liste[i][j][1:]) elif liste[i][j][:1]=="@": items[liste[i][0]][liste[0][j]]=items[liste[i][j][1:]] elif liste[i][j][:1]=="%": items[liste[i][0]][liste[0][j]]=image.load(liste[i][j][1:]) else: items[liste[i][0]][liste[0][j]]=liste[i][j] if n!=0: items[liste[i][0]]['value']=n+i-1 items[items[liste[i][0]]['value']]=liste[i][0] f.close() return len(liste)-1 def initgrid(x,y): global adirection,sizeworld,finished,allcout,selected,world,level,over,mousel,mouser,mousem,sizex,sizey,world_old,world_new,world_art,items,direction,zoom,play,stat,cycle,cout,thecout,rayon,unroll,debug,temp,decx,decy,nrj,tech,victory,current,names,thecolors,maxnrj,maxrayon,maxcycle,maxtemp,nom,descriptif,element ''' Directions des electrons en fonction de la position de la queue ''' direction = {} direction[(-1,-1)]=[(+1,+1),(+1,+0),(+0,+1),(+1,-1),(-1,+1),(+0,-1),(-1,+0),(-1,-1)] direction[(-1,+0)]=[(+1,+0),(+1,-1),(+1,+1),(+0,-1),(+0,+1),(-1,-1),(-1,+1),(-1,+0)] direction[(-1,+1)]=[(+1,-1),(+0,-1),(+1,+0),(-1,-1),(+1,+1),(-1,+0),(+0,+1),(-1,+1)] direction[(+0,+1)]=[(+0,-1),(-1,-1),(+1,-1),(-1,+0),(+1,+0),(-1,+1),(+1,+1),(+0,+1)] direction[(+0,-1)]=[(+0,+1),(+1,+1),(-1,+1),(+1,+0),(-1,+0),(+1,-1),(-1,-1),(+0,-1)] direction[(+1,-1)]=[(-1,+1),(+0,+1),(-1,+0),(+1,+1),(-1,-1),(+1,+0),(+0,-1),(+1,-1)] direction[(+1,+0)]=[(-1,+0),(-1,+1),(-1,-1),(+0,+1),(+0,-1),(+1,+1),(+1,-1),(+1,+0)] direction[(+1,+1)]=[(-1,-1),(-1,+0),(+0,-1),(-1,+1),(+1,-1),(+0,+1),(+1,+0),(+1,+1)] adirection=[(-1,-1),(-1,+0),(-1,+1),(+0,-1),(+0,+1),(+1,-1),(+1,+0),(+1,+1)] items = {} sizeworld=loaditems(int("0x40000", 16),"data/worlds.dat") loaditems(int("0x30000", 16),"data/elements2.dat") loaditems(int("0x10000", 16),"data/menus2.dat") loaditems(int("0x20000", 16),"data/menus.dat") loaditems(0,"data/elements.dat") ''' Variables globales ''' sizex=x sizey=y zoom=25 stat=[0,0,0,0,0,0,0,0] nom=descriptif=element='H' names=["e","e","q","e","e","e","e","K","L","M","N","n","p"] thecolors=[items['headb2']['color'],items['headb']['color'],items['headp']['color'],items['head']['color'],items['head2']['color'],items['headr']['color'],items['headr2']['color'],items['headb']['color'],items['headb']['color'],items['headb']['color'],items['headb']['color'],items['neut']['color'],items['prot']['color']] victory=[0,0,0,0,0,0,0,1,0,0,0,1,1] current=[0,0,0,0,0,0,0,0,0,0,0,0,0] finished=[] mousel=4 mouser=0 mousem=3 maxnrj=maxrayon=maxcycle=maxtemp=99999 allcout=thecout=world=over=play=cycle=rayon=temp=cout=decx=decy=unroll=nrj=debug=0 selected=level=-1 tech=9 world_art = [[items['nothing']['value'] for y in range(sizey)] for x in range(sizex)] world_new = [[items['nothing']['value'] for y in range(sizey)] for x in range(sizex)] ''' *********************************************************************************************** ''' ''' Sauvegarde/Restauration ''' '''format nom,element,descriptif,debug,zoom,decx,decy,tech,victory ''' def readpref(file): global finished with open(file, 'a+') as f: try: finished=list(csv.reader(f,delimiter=';'))[0] f.close() except: print "no" def writepref(file): global finished with open(file, 'wb+') as f: writer = csv.writer(f, delimiter=';', quotechar='', quoting=csv.QUOTE_NONE) writer.writerow(finished) f.close() def readlittlegrid(file,key): with open(file, 'rb') as f: liste=list(csv.reader(f,delimiter=';')) items[key]['nom']=liste[0][0] items[key]['element']=liste[0][1] items[key]['description']=liste[0][2] items[key]['tech']=int(liste[0][7]) items[key]['cout']=int(liste[0][8]) victemp=liste[0][9][1:len(liste[0][9])-1].split(",") items[key]['victory']=[int(victemp[k]) for k in range(len(victemp))] items[key]['maxcycle']=int(liste[0][15]) items[key]['maxnrj']=int(liste[0][16]) items[key]['maxrayon']=int(liste[0][17]) items[key]['maxtemp']=int(liste[0][18]) f.close() def readcondgrid(file): global current,cycle,nrj,rayon,temp with open(file, 'rb') as f: liste=list(csv.reader(f,delimiter=';')) curtemp=liste[0][10][1:len(liste[0][10])-1].split(",") current=[int(curtemp[k]) for k in range(len(curtemp))] cycle=int(liste[0][11]) nrj=int(liste[0][12]) rayon=int(liste[0][13]) temp=int(liste[0][14]) f.close() def readgrid(file): global unroll,mousel,mousem,mouser,cout,selected,sizex,sizey,world_old,world_new,world_art,items,zoom,play,stat,cycle,nrj,rayon,tech,decx,decy,unroll,stat,victory,current,temp,debug,nom,descriptif,element,maxnrj,maxrayon,maxcycle,maxtemp try: with open(file, 'rb') as f: liste=list(csv.reader(f,delimiter=';')) sizey=(len(liste)-1)/2 sizex=len(liste[1]) nom=liste[0][0] element=liste[0][1] descriptif=liste[0][2] debug=int(liste[0][3]) zoom=int(liste[0][4]) if zoom==99: if sizex0: glBegin(GL_QUADS) else: glBegin(GL_LINE_LOOP) glVertex2i(x,y) glVertex2i(x2,y) glVertex2i(x2,y2) glVertex2i(x,y2) glEnd() if full==2: glColor3ub(color[0],color[1],color[2]) glBegin(GL_LINE_LOOP) glVertex2i(x,y) glVertex2i(x2,y) glVertex2i(x2,y2) glVertex2i(x,y2) glEnd() def drawsemisquare(x,y,x2,y2,color): if len(color)==4: glColor4ub(color[0],color[1],color[2],color[3]) else: glColor3ub(color[0],color[1],color[2]) glBegin(GL_LINES) thezoom=y2-y glVertex2i(x,y) glVertex2i(x,y+thezoom/4) glVertex2i(x,y) glVertex2i(x+thezoom/4,y) glVertex2i(x2,y2) glVertex2i(x2,y2-thezoom/4) glVertex2i(x2,y2) glVertex2i(x2-thezoom/4,y2) glVertex2i(x,y2) glVertex2i(x,y2-thezoom/4) glVertex2i(x,y2) glVertex2i(x+thezoom/4,y2) glVertex2i(x2,y) glVertex2i(x2,y+thezoom/4) glVertex2i(x2,y) glVertex2i(x2-thezoom/4,y) glEnd() def drawtriangles(x,y,x2,y2,color): if len(color)==4: glColor4ub(color[0],color[1],color[2],color[3]) else: glColor3ub(color[0],color[1],color[2]) glBegin(GL_TRIANGLES) thezoom=y2-y glVertex2i(x,y) glVertex2i(x,y+thezoom/4) glVertex2i(x+thezoom/4,y) glVertex2i(x2,y2) glVertex2i(x2,y2-thezoom/4) glVertex2i(x2-thezoom/4,y2) glVertex2i(x,y2) glVertex2i(x,y2-thezoom/4) glVertex2i(x+thezoom/4,y2) glVertex2i(x2,y) glVertex2i(x2,y+thezoom/4) glVertex2i(x2-thezoom/4,y) glEnd() def drawitdem(x,y,art,thezoom,activation): if 'text' in art: txt_item.text=art['text'].decode('utf-8') txt_item.font_size=thezoom txt_item.x=x+thezoom/10 txt_item.y=y+thezoom/10 if art['activable']==0: txt_item.color=(art['color'][0],art['color'][1],art['color'][2],255) else: if activation!=0: drawtriangles(x+1,y+1,x+thezoom-1,y+thezoom-1,[art['color'][0],art['color'][1],art['color'][2],55+200*activation/10]) txt_item.color=(art['color'][0],art['color'][1],art['color'][2],55+200*activation/10) else: drawtriangles(x+1,y+1,x+thezoom-1,y+thezoom-1,[255,255,255]) txt_item.color=(255,255,255,255) txt_item.draw() def drawstat(x,y,x2,y2,color): global thecolors,stat drawsquare(x,y,x2,y2,0,color) oldx=x for i in range(7): if stat[7]>0: newx=oldx+float(stat[i])*(x2-x)/stat[7] else: newx=oldx drawsquare(int(oldx),y,int(newx),y2,1,thecolors[i]) oldx=newx txt_stat.text=str(stat[7]) txt_stat.x=x+(x2-x)/2-(len(str(stat[7])))*12 txt_stat.y=y-(y-24)/2 txt_stat.draw() def drawvictory(x,y,x2,y2,color): global thecolors,victory,current,names '''size=(x2-x)/sum(victory[i] for i in range(len(victory)))''' size=21 for i in range(len(victory)): if victory[i]>0: drawsquare(x+size*i,y,x+size*(i+1),y2,1,thecolors[i]) drawsquare(x+size*i,y,x+size*(i+1),y2,0,[90,90,90]) drawsquare(x+size*i,y,x+size*(i+1),int(y+float(current[i])/victory[i]*(y2-y)),1,[0,0,0]) if victory[i]-current[i]>=0: txt_victory1.text=str(victory[i]-current[i]) txt_victory1.x=x+size*i+1 txt_victory1.y=y+1 txt_victory1.draw() txt_victory2.text=names[i] txt_victory2.x=x+size*i txt_victory2.y=y2-10 txt_victory2.draw() def drawworld(): global selected,victory,finished drawsquare(740,148,1016,8,1,[40,40,40]) drawsquare(8,148,1016,8,0,[90,90,90]) glColor3ub(255,255,255) pic_logo.blit(185,win.height-200) pic_logo2.blit(45,win.height-160) if selected==-2: glColor3ub(255,0,0) else: glColor3ub(255,255,255) pic_exit2.blit(940,win.height-100) if selected==-3: glColor3ub(255,0,0) else: glColor3ub(255,255,255) pic_arrows.blit(840,150) if selected==-4: glColor3ub(255,0,0) else: glColor3ub(255,255,255) pic_arrows2.blit(920,150) glColor3ub(255,255,255) for i in range(sizeworld): ele=items[items[int("0x40000",16)+i]] if ele['world']==world: glBegin(GL_LINES) for n in ele['validate']: if n!="" and items[n]['world']==world: glVertex2i(ele['coordx']+50,int(ele['coordy']/768.0*win.height+50)) glVertex2i(items[n]['coordx']+50,int(items[n]['coordy']/768.0*win.height+50)) glVertex2i(ele['coordx']+51,int(ele['coordy']/768.0*win.height+50)) glVertex2i(items[n]['coordx']+51,int(items[n]['coordy']/768.0*win.height+50)) glVertex2i(ele['coordx']+50,int(ele['coordy']/768.0*win.height+51)) glVertex2i(items[n]['coordx']+50,int(items[n]['coordy']/768.0*win.height+51)) glVertex2i(ele['coordx']+51,int(ele['coordy']/768.0*win.height+51)) glVertex2i(items[n]['coordx']+51,int(items[n]['coordy']/768.0*win.height+51)) glEnd() for i in range(sizeworld): ele=items[items[int("0x40000",16)+i]] if ele['world']==world: if 'cout' not in ele: readlittlegrid(ele['file'],items[int("0x40000",16)+i]) if items[int("0x40000",16)+i] not in finished and not (ele['world']==0 and ele['grid']==0): glColor3ub(60,60,60) acolor=(90,90,90,255) elif selected!=ele: glColor3ub(255,120+int(ele['coordx']/1024.0*135),155+int(ele['coordx']/1024.0*100)) acolor=(255,255,255,255) else: acolor=(255,0,0,255) document=pyglet.text.decode_attributed("{font_name 'OpenDyslexicAlta'}{font_size 18}{color (255, 255, 255, 255)}"+ele['description'].decode('utf-8')+"}".encode('utf8')) txt_description.document=document txt_description.draw() document=None glColor3ub(255,255,255) if ele['cout']>0: items['cout']['icon'].blit(740,110) txt_cout2.text=str(ele['cout']) txt_cout2.draw() if ele['maxcycle']<90000: items['cycle']['icon'].blit(740,65) txt_maxcycle2.text=str(ele['maxcycle']) txt_maxcycle2.draw() if ele['tech']>0: items['tech']['icon'].blit(940,110) txt_tech2.text=str(ele['tech']) txt_tech2.draw() if ele['maxrayon']<90000: items['rayon']['icon'].blit(940,65) txt_maxrayon2.text=str(ele['maxrayon']) txt_maxrayon2.draw() if ele['maxtemp']<90000: items['temp']['icon'].blit(850,110) txt_maxtemp2.text=str(ele['maxtemp']) txt_maxtemp2.draw() if ele['maxnrj']<90000: items['nrj']['icon'].blit(850,65) txt_maxnrj2.text=str(ele['maxnrj']) txt_maxnrj2.draw() victory=ele['victory'] drawvictory(742,12,1016,50,[40,40,40]) glColor3ub(255,0,0) pic_levels2.blit(ele['coordx'],ele['coordy']/768.0*win.height) txt_element2.text=ele['element'] txt_element2.x=ele['coordx']+50 txt_element2.y=ele['coordy']/768.0*win.height+67 txt_element2.color=(int(ele['coordx']/1024.0*150), int(ele['coordx']/1024.0*150), int(ele['coordx']/1024.0*150),255) txt_element2.draw() calc=(len(ele['nom'])*17-52)/2 drawsquare(ele['coordx']+35-calc,int(ele['coordy']/768.0*win.height+2),ele['coordx']+42-calc+len(ele['nom'])*17,int(ele['coordy']/768.0*win.height-18),1,[40,int(ele['coordx']/1024.0*135),int(ele['coordx']/1024.0*100)]) txt_nom2.text=ele['nom'].decode('utf-8') txt_nom2.x=ele['coordx']+38-calc txt_nom2.y=ele['coordy']/768.0*win.height-15 txt_nom2.color=acolor txt_nom2.draw() def drawgrid(zoom): global temp,debug,over,allcout,play,element drawsquare(decx-1+zoom,decy-1+zoom,decx+zoom*(sizex-1)+1,decy+zoom*(sizey-1)+2,0,[255,255,255]) if play>0: drawsquare(decx-1+zoom,decy-1+zoom,decx+zoom*(sizex-1)+1,decy+zoom*(sizey-1)+2,0,[255,0,0]) drawsquare(decx-2+zoom,decy-2+zoom,decx+zoom*(sizex-1)+2,decy+zoom*(sizey-1)+3,0,[255,0,0]) for x in range(1,sizex-1): if x*zoom+decx>win.width: break for y in range(1,sizey-1): if y*zoom+decy>win.height: break '''drawsquare(x*zoom+decx,y*zoom+decy,(x+1)*zoom+decx,(y+1)*zoom+decy,1,items[items[world_new[x][y]]]['color'])''' glBegin(GL_QUADS) if world_new[x-1][y-1]>0 or (world_new[x-1][y]>0 and world_new[x][y-1]>0): glColor4ub(items[items[world_new[x][y]]]['color'][0],items[items[world_new[x][y]]]['color'][1],items[items[world_new[x][y]]]['color'][2],255) else: glColor4ub(items[items[world_new[x][y]]]['color'][0],items[items[world_new[x][y]]]['color'][1],items[items[world_new[x][y]]]['color'][2],130) glVertex2i(x*zoom+decx,y*zoom+decy) if world_new[x+1][y-1]>0 or (world_new[x+1][y]>0 and world_new[x][y-1]>0): glColor4ub(items[items[world_new[x][y]]]['color'][0],items[items[world_new[x][y]]]['color'][1],items[items[world_new[x][y]]]['color'][2],255) else: glColor4ub(items[items[world_new[x][y]]]['color'][0],items[items[world_new[x][y]]]['color'][1],items[items[world_new[x][y]]]['color'][2],130) glVertex2i((x+1)*zoom+decx,y*zoom+decy) if world_new[x+1][y+1]>0 or (world_new[x][y+1]>0 and world_new[x+1][y]>0): glColor4ub(items[items[world_new[x][y]]]['color'][0],items[items[world_new[x][y]]]['color'][1],items[items[world_new[x][y]]]['color'][2],255) else: glColor4ub(items[items[world_new[x][y]]]['color'][0],items[items[world_new[x][y]]]['color'][1],items[items[world_new[x][y]]]['color'][2],130) glVertex2i((x+1)*zoom+decx,(y+1)*zoom+decy) if world_new[x-1][y+1]>0 or (world_new[x][y+1]>0 and world_new[x-1][y]>0): glColor4ub(items[items[world_new[x][y]]]['color'][0],items[items[world_new[x][y]]]['color'][1],items[items[world_new[x][y]]]['color'][2],255) else: glColor4ub(items[items[world_new[x][y]]]['color'][0],items[items[world_new[x][y]]]['color'][1],items[items[world_new[x][y]]]['color'][2],130) glVertex2i(x*zoom+decx,(y+1)*zoom+decy) glEnd() drawitdem(x*zoom+decx,y*zoom+decy,items[items[wart(x,y)]],zoom,getactive(x,y)) drawsquare(0,win.height,win.width,win.height-50,1,[40,40,40]) drawsquare(0,50,win.width,0,1,[40,40,40]) if unroll!=0: if debug==1: nbelements=44 else: nbelements=29 size=win.width/nbelements drawsquare(0,57+size,win.width,0,1,[40,40,40]) cat=65555 for i in range(nbelements): art=items[items[int("0x30000",16)+i]] if art['tech']<=tech: drawitdem(10+i*size,55,items[items[int("0x30000",16)+i]],size-6,10) if art['cat']!=cat: drawsquare(7+i*size,55,8+i*size,55+size,0,[90,90,90]) cat=art['cat'] drawsquare(615,win.height-45,655,win.height-5,1,[240, int(items[items[int("0x40000",16)+level]]['coordx']/1024.0*120+100), int(items[items[int("0x40000",16)+level]]['coordx']/1024.0*120+100)]) txt_element.text=element txt_element.color=(int(items[items[int("0x40000",16)+level]]['coordx']/1024.0*150), int(items[items[int("0x40000",16)+level]]['coordx']/1024.0*150), int(items[items[int("0x40000",16)+level]]['coordx']/1024.0*150),255) txt_element.x=636-len(element)*10 txt_element.y=win.height-38 txt_element.draw() for i in range(4): if (i==0 and tech>0): glColor3ub(255,255,255) items[items[int("0x10000",16)+i]]['icon'].blit(10+i*150,win.height-45) if (tech>5): txt_temp.text=str(eval(items[int("0x10000",16)+i])) txt_temp.x=50+i*150 txt_temp.y=win.height-29 txt_temp.color=(180, 180, 180,255) txt_temp.font_size=24 txt_temp.draw() txt_temp.text=str(eval("max"+items[int("0x10000",16)+i])) txt_temp.x=50+i*150 txt_temp.y=win.height-47 txt_temp.color=(110, 110, 110,255) txt_temp.font_size=12 txt_temp.draw() else: txt_temp.text=str(eval(items[int("0x10000",16)+i])) txt_temp.x=50+i*150 txt_temp.y=y=win.height-38 txt_temp.color=(180, 180, 180,255) txt_temp.font_size=24 txt_temp.draw() drawvictory(660,win.height-45,1020,win.height-5,[90,90,90]) for i in range(15): glColor3ub(255,255,255) if items[items[int("0x20000",16)+i]]['icon']=="/": drawitdem(10+i*45,8,items[items[int("0x20000",16)+i]]['ref'],36,10) elif items[items[int("0x20000",16)+i]]['icon']!="": items[items[int("0x20000",16)+i]]['icon'].blit(10+i*45,8) else: drawsquare(10+i*45,8,46+i*45,44,1,items[items[int("0x20000",16)+i]]['color']) if i==11 or i==6: drawsquare(5+i*45,8,6+i*45,44,0,[90,90,90]) if i==1: drawsquare(45+i*45,8,49+i*45,44,1,[0,0,0]) drawsquare(45+i*45,8,49+i*45,44*10*len(str(play))/100,1,[255,0,0]) if (mousel==i): selectcolor=[255,0,0,40] elif (mouser==i): selectcolor=[0,255,0,40] elif (mousem==i): selectcolor=[0,0,255,40] else: selectcolor=[40,40,40,0] drawsquare(10+i*45,8,46+i*45,44,2,selectcolor) drawsquare(9+i*45,7,47+i*45,45,2,selectcolor) drawsquare(5+15*45,8,6+15*45,44,0,[90,90,90]) drawstat(10+15*45,8,46+(18)*45,44,[90,90,90]) if tech>=0: glColor3ub(255,255,255) items['cout']['icon'].blit(10+19*45,7) txt_cout.text=str(cout-thecout) if (cout-thecout)>0: txt_cout.color=(180, 180, 180,255) else: txt_cout.color=(255, 0, 0,255) txt_cout.draw() if tech>0: glColor3ub(255,255,255) items['tech']['icon'].blit(25+21*45,7) txt_tech.text=str(tech) txt_tech.draw() if over>0: txt_over.text="GAME OVER" txt_over.x=win.width/2-350 txt_over.y=win.height/2-200 txt_over.draw() msg=["Trop de matière reçue dans les senseurs","Les photons sont sortis du cadre de jeu","Colision de protons et de neutrons","Le canon a provoqué une collision","Vous avez généré trop de rayonements","Le nombre de cycle maximum a été atteint","La température est a un niveau inacceptable","Il n'y a plus d'energie disponible !"] txt_over2.text=msg[over-1].decode('utf-8') txt_over2.y=win.height/2-100 txt_over2.draw() if over<0: txt_over.text="VICTOIRE !" txt_over.x=win.width/2-350 txt_over.y=win.height/2-200 txt_over.draw() txt_over2.text="Vous débloquez le/les niveaux suivant.".decode('utf-8') txt_over2.y=win.height/2-100 txt_over2.draw() if allcout>0: txt_drag.text="cout:"+str(allcout['cout']) txt_drag.draw() txt_drag2.text="tech:"+str(allcout['tech']) txt_drag2.draw() ''' *********************************************************************************************** ''' ''' Fonctions liees aux menus ''' def raz(dummy1,dummy2,dummy3,dummy4): for i in range(sizeworld): ele=items[items[int("0x40000",16)+i]] if ele['world']==world and ele['grid']==level: readgrid(ele['file']) def speed(x,y,dummy1,dummy2): global play,zoom if x==1980 and y==2: play=float(play)*2 else: play=float(play)/2 if play>=5: play=0.01953125 if play<0.01953125: play=2.5 clock.unschedule(calculate) clock.schedule_interval(calculate,play) def others(x,y,dummy1,dummy2): global tech if x>=1 and y>=1 and x= 0: world_art[x][y] = value infos() def setnothinga(x,y,dummy1,dummy2): infos() def setnothing(x,y,dummy1,dummy2): global tech if x>=1 and y>=1 and x=1 and y>=1 and x= 0: world_new[x][y] = items['copper']['value'] infos() def setfiber(x,y,dummy1,dummy2): if x>=1 and y>=1 and x= 0: world_new[x][y]=items['fiber']['value'] infos() def levels(dummy1,dummy2,dummy3,dummy4): global level,sizeworld reallystop() for i in range(sizeworld): ele=items[items[int("0x40000",16)+i]] if ele['world']==world and ele['grid']==level: writegrid("user/"+ele['file']) level=-1 def exits(dummy1,dummy2,dummy3,dummy4): pyglet.app.exit() def stop(dummy1,dummy2,dummy3,dummy4): global play if play>0: reallystop() else: reallyrun() def run(dummy1,dummy2,dummy3,dummy4): global play if play>0: reallystop() else: reallyrun() def move(dummy1,dummy2,dx,dy): global decx,decy decx=decx+dx decy=decy+dy def screen(dummy1,dummy2,dummy3,dummy4): if win.fullscreen: win.set_fullscreen(fullscreen=False) else: win.set_fullscreen(fullscreen=True) def zoomm(x,y,dummy1,dummy2): global zoom,decx,decy if zoom>2: decx=decx+2*x decy=decy+2*y zoom=zoom-2 def zoomp(x,y,dummy1,dummy2): global zoom,decx,decy decx=decx-2*x decy=decy-2*y zoom=zoom+2 ''' *********************************************************************************************** ''' ''' Fonctions gestion du monde ''' def reallystop(): global play,sizeworld,level,stat items[items['run']['value']]='stop' play=0 clock.unschedule(calculate) for i in range(sizeworld): ele=items[items[int("0x40000",16)+i]] if ele['world']==world and ele['grid']==level: readcondgrid(ele['file']) erase() retriern() stat=[0,0,0,0,0,0,0,0] def reallyrun(): global play,sizeworld play=0.15625 items[items['run']['value']]='run' clock.schedule_interval(calculate,play) def retriern(): for x in range(1,sizex-1): for y in range(1,sizey-1): art=wart(x,y) typetri=items[art][:6] if typetri=="triern": acttri="" idtri=items[art][8] if len(items[art])==10: acttri=items[art][9] world_art[x][y]=items['triern'+idtri+"-"+idtri+acttri]['value'] def swap(): global adirection for dx,dy in direction: if random.randint(0,100)>50: temps=direction[(dx,dy)][1] direction[(dx,dy)][1]=direction[(dx,dy)][2] direction[(dx,dy)][2]=temps if random.randint(0,100)>50: temps=direction[(dx,dy)][3] direction[(dx,dy)][3]=direction[(dx,dy)][4] direction[(dx,dy)][4]=temps if random.randint(0,100)>50: temps=direction[(dx,dy)][5] direction[(dx,dy)][5]=direction[(dx,dy)][6] direction[(dx,dy)][6]=temps bdirection=copy.deepcopy(adirection) adirection[0]=bdirection[1] adirection[1]=bdirection[2] adirection[2]=bdirection[3] adirection[3]=bdirection[4] adirection[4]=bdirection[5] adirection[5]=bdirection[6] adirection[6]=bdirection[7] adirection[7]=bdirection[0] def gameover_ok(): global over,level,sizeworld reallystop() for i in range(sizeworld): ele=items[items[int("0x40000",16)+i]] if ele['world']==world and ele['grid']==level: readcondgrid(ele['file']) erase() writegrid("user/"+ele['file']) clock.schedule_once(menu,2,level) def itsvictory_ok(): global over,level,finished,sizeworld reallystop() for i in range(sizeworld): ele=items[items[int("0x40000",16)+i]] if ele['world']==world and ele['grid']==level: readcondgrid(ele['file']) erase() writegrid("user/"+ele['file']) finished.extend(ele['validate']) writepref('user/pref.dat') clock.schedule_once(menu,2,-1) def gameover(x): global over over=x sound.queue(pyglet.resource.media("sound/gameover.mp3")) sound.play() clock.unschedule(calculate) def itsvictory(): global over over=-1 sound.queue(pyglet.resource.media("sound/victoire.mp3")) sound.play() clock.unschedule(calculate) def infos(): global stat,sizex,sizey,cycle,thecout,victory,current stat=[0,0,0,0,0,0,0,0] thecout=0 for x in range(1,sizex-1): for y in range(1,sizey-1): if world_new[x][y]==items['headb2']['value']: stat[0]=stat[0]+1 if world_new[x][y]==items['headb']['value']: stat[1]=stat[1]+1 if world_new[x][y]==items['headp']['value']: stat[2]=stat[2]+1 if world_new[x][y]==items['head']['value']: stat[3]=stat[3]+1 if world_new[x][y]==items['head2']['value']: stat[4]=stat[4]+1 if world_new[x][y]==items['headr']['value']: stat[5]=stat[5]+1 if world_new[x][y]==items['headr2']['value']: stat[6]=stat[6]+1 if world_new[x][y]>=items['head']['value']: stat[7]=stat[7]+1 if cycle!=0: desactive(x,y) thecout=items[items[world_new[x][y]]]['cout']+items[items[wart(x,y)]]['cout']+thecout tempvictoire=0 for i in range(len(victory)): if victory[i]-current[i]<0: gameover(1) break tempvictoire=(victory[i]-current[i])|tempvictoire if tempvictoire==0: itsvictory() if rayon>maxrayon: gameover(5) if cycle>maxcycle: gameover(6) if temp>maxtemp: gameover(7) if nrj>maxnrj: gameover(8) def erase(): for x in range(1,sizex-1): for y in range(1,sizey-1): unactive(x,y) if world_new[x][y]==items['headp']['value'] or world_new[x][y]==items['tailp']['value']: world_new[x][y]=items['fiber']['value'] elif world_new[x][y]>=items['tail']['value']: world_new[x][y]=items['copper']['value'] elif world_new[x][y]>=items['prot']['value']: world_new[x][y]=items['nothing']['value'] def wart(x,y): return world_art[x][y] & int("0xFFFFFF",16) def getactive(x,y): return (world_art[x][y] & int("0xFF000000",16))>>24 def isactive(x,y): return world_art[x][y]>int("0xFFFFFF",16) def desactive(x,y): if world_art[x][y]>int("0x1000000",16): world_art[x][y]=world_art[x][y]-int("0x1000000",16) def unactive(x,y): world_art[x][y]=world_art[x][y] & int("0x00FFFFFF",16) def active(x,y): world_art[x][y]=world_art[x][y] | int("0x0A000000",16) def unsigned(x): if x>int("0xFFF",16): return x & int("0xF000",16) else: return x & int("0xF0",16) def ispositive(x): if x>int("0xFFF",16): return x & int("0xF00",16)==int("0x100",16) else: return x & int("0xF",16)==int("0x1",16) def isnegative(x): if x>int("0xFFF",16): return x & int("0xF00",16)==int("0x200",16) else: return x & int("0xF",16)==int("0x2",16) def positive(x): if x>int("0xFFF",16): return (x & int("0xF000",16))+int("0x100",16) else: return (x & int("0xF0",16))+int("0x1",16) def negative(x): if x>int("0xFFF",16): return (x & int("0xF000",16))+int("0x200",16) else: return (x & int("0xF0",16))+int("0x2",16) def invert(x): if ispositive(x): return negative(x) else: return positive(x) def isbig(x): return (x & int("0xF000",16))==int("0x2000",16) def isgauche(n): return n[0]==1 and n[1]==0 def isdroite(n): return n[0]==-1 and n[1]==0 def nextgrid(): global play,cycle,temp,rayon,nrj,current,adirection world_old=copy.deepcopy(world_new) swap() for x in range(1,sizex-1): for y in range(1,sizey-1): value=world_old[x][y] flag=0 if (wart(x,y)==items['canonh']['value'] or wart(x,y)==items['canonh2']['value']) and ((cycle%40==0 and isactive(x,y)==False) or (cycle%10==0 and isactive(x,y))): if world_new[x][y]>=items['head']['value']: gameover(4) elif world_new[x][y]==items['nothing']['value']: temp=temp+5 else: world_new[x][y]=items['head']['value'] nrj=nrj+1 if wart(x,y)==items['canont']['value'] and ((cycle%40==0 and isactive(x,y)==False) or (cycle%10==0 and isactive(x,y))): world_new[x][y]=items['tail']['value'] if world_old[x][y] == items['headp']['value']: world_new[x][y]=items['tailp']['value'] elif world_old[x][y] >= items['head']['value']: for dx,dy in adirection: if world_old[x+dx][y+dy]>=value>>8: break for ex,ey in direction[(dx,dy)]: if world_new[x+ex][y+ey]==items['headr']['value'] and world_new[x][y]==items['headr']['value']: world_old[x+ex][y+ey]=items['headr2']['value'] world_new[x+ex][y+ey]=items['headr2']['value'] world_new[x][y]=items['copper']['value'] break if world_new[x+ex][y+ey]==items['headb']['value'] and world_new[x][y]==items['headb']['value']: world_old[x+ex][y+ey]=items['headb2']['value'] world_new[x+ex][y+ey]=items['headb2']['value'] world_new[x][y]=items['copper']['value'] break if (world_new[x+ex][y+ey]==items['headb']['value'] and world_new[x][y]==items['headr']['value']) or (world_new[x+ex][y+ey]==items['headr']['value'] and world_new[x][y]==items['headb']['value']): world_old[x+ex][y+ey]=items['copper']['value'] world_new[x+ex][y+ey]=items['copper']['value'] world_new[x][y]=items['copper']['value'] break if (world_new[x+ex][y+ey]==items['headb2']['value'] and world_new[x][y]==items['headr2']['value']) or (world_new[x+ex][y+ey]==items['headr2']['value'] and world_new[x][y]==items['headb2']['value']): world_old[x+ex][y+ey]=items['nothing']['value'] world_new[x+ex][y+ey]=items['nothing']['value'] world_new[x][y]=items['nothing']['value'] rayon=rayon+5 break if world_new[x+ex][y+ey]==items['headr2']['value'] and world_new[x][y]==items['headb']['value']: world_old[x+ex][y+ey]=items['headr']['value'] world_new[x+ex][y+ey]=items['headr']['value'] world_new[x][y]=items['copper']['value'] rayon=rayon+1 break if world_new[x+ex][y+ey]==items['headb2']['value'] and world_new[x][y]==items['headr']['value']: world_old[x+ex][y+ey]=items['copper']['value'] world_new[x+ex][y+ey]=items['copper']['value'] world_new[x][y]=items['headr']['value'] rayon=rayon+1 break art=wart(x+ex,y+ey) if flag==0 and world_old[x+ex][y+ey]==items['copper']['value'] and world_new[x+ex][y+ey]0: numtri=numtri-1 else: if numtri>0: numtri=numtri-1 world_art[x+ex][y+ey]=items['triern'+str(numtri)+"-"+idtri+acttri]['value'] if art!=items['nothing']['value'] and world_new[x][y]>=items['head']['value']: temp=items[items[art]]['temp']+temp world_new[x][y] = value>>8 break elif value == items['tailp']['value']: world_new[x][y]=items['fiber']['value'] elif value >= items['tail']['value'] and world_new[x][y] < items['head']['value']: newvalue=value-int("0x10", 16) if newvalueworld: world=items[items[int("0x40000",16)+i]]['world'] ''' *********************************************************************************************** ''' ''' Fonctions evenementielles liees a la fenetre ''' @win.event def on_key_press(symbol, modifiers): global play,over,level if player.source and player.source.video_format: player.next() ambiance.play() return if over>0: gameover_ok() return if over<0: itsvictory_ok() return if level<0: return if symbol==key.SPACE: nextgrid() if symbol==key.BACKSPACE: erase() elif symbol==key.RETURN: run(0,0,0,0) elif symbol==key.NUM_SUBTRACT: speed(1980,2,0,0) elif symbol==key.NUM_ADD: speed(1980,1,0,0) @win.event def on_mouse_motion(x, y, dx, dy): global world,selected,allcout,over,level,sizeworld,finished if level>=0: realx=(x-decx)/zoom realy=(y-decy)/zoom if unroll==1: if debug==1: nbelements=44 else: nbelements=29 size=win.width/nbelements allcout=0 for i in range(nbelements): if x>=5+i*size and x<=5+i*size+size and y>=55 and y<55+size: if items[items[int("0x30000",16)+i]]['tech']<=tech: allcout=items[items[int("0x30000",16)+i]] return selected=-1 for i in range(sizeworld): ele=items[items[int("0x40000",16)+i]] if ele['world']==world: if x>ele['coordx']+20 and xele['coordy']/768.0*win.height+0 and y940 and y>win.height-100 and x<1024 and y840 and y>150 and x<920 and y<240: selected=-3 if x>920 and y>150 and x<1024 and y<240: selected=-4 @win.event def on_mouse_drag(x, y, dx, dy, buttons, modifiers): global zoom,mousel,mouser,mousem,over,level,unroll if player.source and player.source.video_format: player.next() ambiance.play() return if over>0: gameover_ok() return if over<0: itsvictory_ok() return if level<0: return realx=(x-decx)/zoom realy=(y-decy)/zoom mouses=23 if buttons == mouse.LEFT: mouses=mousel if buttons == mouse.RIGHT: mouses=mouser if buttons == mouse.MIDDLE: mouses=mousem if mouses!=23 and items[items[int("0x20000",16)+mouses]]['drag']==1 and (unroll==0 or y>100) and (y>50): eval(items[int("0x20000",16)+mouses]+"("+str(realx)+","+str(realy)+","+str(dx)+","+str(dy)+")") @win.event def on_mouse_press(x, y, button, modifiers): global zoom,mousel,mouser,mousem,unroll,over,level,selected,world if player.source and player.source.video_format: player.next() ambiance.play() return if over>0: gameover_ok() return if over<0: itsvictory_ok() return if level<0: if selected==-2: pyglet.app.exit() elif selected==-4 and world>0: world=world-1 elif selected==-3 and world<2: world=world+1 elif selected>-1: level=selected['grid'] if readgrid("user/"+selected['file'])==False : readgrid(selected['file']) if selected['tuto']!="": player.queue(pyglet.resource.media(selected['tuto'])) player.play() ambiance.pause() selected=-1 return realx=(x-decx)/zoom realy=(y-decy)/zoom for i in range(15): if x>=10+i*45 and x<=49+i*45 and y>=8 and y<44: if 'color' in items[items[int("0x20000",16)+i]] and items[items[int("0x20000",16)+i]]['color']!=[40,40,40]: if button == mouse.LEFT: mousel=i if button == mouse.RIGHT: mouser=i if button == mouse.MIDDLE: mousem=i if button!="" and i==14: if unroll==1: unroll=0 else: unroll=1 return if unroll==1: if debug==1: nbelements=44 else: nbelements=29 size=win.width/nbelements for i in range(nbelements): if x>=5+i*size and x<=5+i*size+size and y>=55 and y<55+size: if items[items[int("0x30000",16)+i]]['tech']<=tech: items['others']['ref']=items[items[int("0x30000",16)+i]] if button == mouse.LEFT: mousel=14 if button == mouse.RIGHT: mouser=14 if button == mouse.MIDDLE: mousem=14 return mouses=23 if button == mouse.LEFT: mouses=mousel if button == mouse.RIGHT: mouses=mouser if button == mouse.MIDDLE: mouses=mousem if mouses!=23: eval(items[int("0x20000",16)+mouses]+"("+str(realx)+","+str(realy)+","+str(0)+","+str(0)+")") if __name__ == '__main__': main()