Correcciones de los textos en ingles
[tajundrathegame.git] / stage.py
blob17add880f7256ba92bb0580a5f78c34e18eb9a42
1 # encoding: UTF-8
2 import pygame
3 import re
4 import qwesprites
6 class Stage_Texture:
7 char=''
8 filename=''
9 texture=None
10 def __repr__(self):
11 return "(char:%s, filename:%s, texture:%s)" % (self.char, self.filename,repr(self.texture))
13 class Stage:
14 BlockSize=(32,32)
15 StageData=[""]
16 StageTitle=""
17 Texture={}
18 Scroll=[0,0]
19 simbolos={}
20 listasimbolos="!·$%&/()=|@#~"
21 Surface=None
22 background=None
23 Tajundra=None
24 Tajundra_life=120
25 sprites=[]
26 background_sprites=[]
27 NextStage=""
28 frame=0
29 rect_changed=[]
30 check_stage_ms=0
32 def __init__(self,fichero):
33 self.BlockSize=(32,32)
34 self.StageData=[""]
35 self.StageTitle=""
36 self.Texture={}
37 self.Scroll=[0,0]
38 self.simbolos={}
39 self.listasimbolos="!·$%&/()=|@#~"
40 self.Surface=None
41 self.background=None
42 self.Tajundra=None
43 self.Tajundra_life=120
44 self.sprites=[]
45 self.background_sprites=[]
46 self.frame=0
47 self.rect_changed=[]
48 self.load(fichero)
50 def getCh(self,x,y):
51 if (x<0): return 't'
52 if len(self.StageData)<=y: return 't'
53 if y>=0 and len(self.StageData[y])<=x: return 't'
54 if (y<0): return ' '
55 return self.StageData[y][x]
56 def setCh(self,x,y,ch):
57 if (x<0): return
58 if len(self.StageData)<=y: return
59 if (y<0): return
60 if len(self.StageData[y])<=x: return
61 if self.StageData[y][x]==ch: return
62 self.StageData[y][x]=ch
63 rect=pygame.Rect((
64 x*self.BlockSize[0],y*self.BlockSize[1],
65 self.BlockSize[0],self.BlockSize[1]))
66 self.rect_changed+=[rect]
69 def checkPortal(self):
70 x=0
71 y=0
72 pch='P'
73 for line in self.StageData:
74 x=0
75 for ch in line:
76 if (ch=='p' or ch=='P'):
77 px=x
78 py=y
81 if (ch=='Z'):
82 if (self.StageData[y-1][x]!='z'):
83 pch='p'
85 x+=1
86 y+=1
87 self.setCh(px,py,pch)
89 def checkMovingBlocks(self):
90 x=0
91 y=0
92 blocks=[]
93 for line in self.StageData:
94 x=0
95 for ch in line:
96 if (ch=='B'):
97 blocks+=[(x,y)]
99 x+=1
100 y+=1
101 for x,y in blocks:
102 if self.getCh(x,y+1)==' ':
103 testrect=pygame.Rect((x)*32,(y+1)*32,32,32)
104 put_in_place=True
105 for sprite in self.sprites:
106 if sprite.FSOLID and sprite.rect.colliderect(testrect):
107 put_in_place=False
108 sprite.ShowLife=sprite.Life
109 sprite.Life-=40
111 if put_in_place:
112 self.setCh(x,y,' ')
113 self.setCh(x,y+1,'B')
115 def do_stageChecks(self):
116 self.checkPortal()
117 self.checkMovingBlocks()
120 def fulldraw(self,screen,msec):
121 self.frame+=1
122 self.check_stage_ms+=msec
123 if self.check_stage_ms>200:
124 self.check_stage_ms=0
125 self.do_stageChecks()
126 for rect in self.rect_changed:
127 self.draw(screen,rect,True)
129 v_rect=self.rect_changed
130 self.rect_changed=[]
133 for sprite in self.sprites:
134 v_rect+=sprite.tickms(msec,self)
136 collision=False
137 while collision:
138 collision=False
139 delete_list=set([])
140 for index,rect in enumerate(v_rect):
141 if index in delete_list:
142 continue
143 l=rect.collidelistall(v_rect)
144 del l[0]
145 l=set(l)
146 l-=delete_list
147 if len(l)>0:
148 t=[]
149 collision=True
150 for lindex in l:
151 t+=[v_rect[lindex]]
153 delete_list|=l
154 rect.unionall_ip(t)
156 delete_list=list(delete_list)
157 delete_list.sort()
159 for index in reversed(delete_list):
160 if index<len(v_rect):
161 del v_rect[index]
163 for rect in v_rect:
164 self.draw(screen,rect)
166 keys=[]
167 lensp=len(self.sprites)-1
168 for key,sprite in enumerate(reversed(self.sprites)):
169 if sprite.alive:
170 sprite.draw(screen,v_rect)
171 else:
172 del self.sprites[lensp-key]
174 for rect in v_rect:
175 pygame.display.update(rect)
180 def draw(self,screen,rect=None,redraw=False):
182 if not self.Surface:
183 self.Surface=screen.copy()
184 redraw=True
185 self.rect_changed=[]
187 if not rect:
188 rect=self.Surface.get_rect()
190 if redraw:
191 if not self.background:
192 self.background = pygame.image.load("fondo1.png")
193 #self.Surface.fill((60,16,16))
194 #self.Surface.blit(self.background,(0,0))
196 rect_seq=[rect]
197 for sprite in self.background_sprites:
198 rect_seq+=sprite.tickms(10,self)
200 for rect_1 in rect_seq:
201 self.Surface.fill((60,16,16),rect_1)
202 self.Surface.blit(self.background,rect_1,rect_1)
207 for line in self.StageData:
209 for ch in line:
210 rect_1=pygame.Rect(self.Scroll[0]+x*self.BlockSize[0],
211 self.Scroll[1]+y*self.BlockSize[1]
212 ,self.BlockSize[0],self.BlockSize[1])
213 if rect_1.colliderect(rect):
214 if ((ord(ch)>=ord('A') and ord(ch)<=ord('Z')) or
215 (ord(ch)>=ord('a') and ord(ch)<=ord('z'))):
216 tex=self.Texture[ch].texture
217 if tex:
218 self.Surface.blit(tex,rect_1)
219 else:
220 self.Surface.fill((60,16,16),rect_1)
221 self.Surface.blit(self.background,rect_1,rect_1)
223 #screen.blit(self.Surface,rect_1,rect_1)
224 x+=1
225 y+=1
227 for sprite in self.background_sprites:
228 sprite.draw(self.Surface,[rect])
230 screen.blit(self.Surface,rect,rect)
232 else:
233 screen.blit(self.Surface,rect,rect)
236 def load(self,fichero):
237 print "Cargando pantalla %s ...." % fichero
238 self.NextStage=fichero
240 comando=""
241 argumentos=[]
242 datos=[]
243 for s in self.listasimbolos:
244 self.simbolos[s]=[]
246 whitespace=Stage_Texture();
247 whitespace.char=' '
248 self.Texture[' ']=whitespace
250 f1=open(fichero,"r")
251 nlinea=0
252 for line in f1:
253 nlinea+=1
254 line=line[:-1]
255 ex=re.search("%([\w]{4,64}) ([\S ]*)",line)
257 if len(line)>3:
258 if ex:
259 if comando:
260 self.exec_stcommand(comando,argumentos,datos)
261 argumentos=[]
262 datos=[]
263 ex1=ex.groups()
264 comando=ex1[0]
265 if len(ex1)>1:
266 argumentos=ex1[1].split(" ")
268 elif line[0]=='[' and line[-1]==']':
269 datos+=[list(line[1:-1])]
270 else:
271 print "Error: Linea %d no se reconoce la secuencia '%s'" % (nlinea,line)
273 if comando:
274 self.exec_stcommand(comando,argumentos,datos)
276 ################# VER POSICION SPRITES ##########
277 x=y=0
278 for line in self.StageData:
280 for ch in line:
281 if ((ord(ch)>=ord('A') and ord(ch)<=ord('Z')) or
282 (ord(ch)>=ord('a') and ord(ch)<=ord('z'))):
283 pass
284 elif ord(ch)>=ord('0') and ord(ch)<=ord('9'):
285 pass
286 elif ch in self.listasimbolos:
287 self.simbolos[ch] += [(x*self.BlockSize[0],y*self.BlockSize[1])]
288 self.StageData[y][x]=' '
289 x+=1
290 y+=1
292 qwesprites.qweTextBasic(self,2,2,self.StageTitle)
293 self.Tajundra=qwesprites.Tajundra(self)
294 self.Tajundra.MaxLife=self.Tajundra.Life=self.Tajundra.ShowLife=self.Tajundra_life
296 for c in self.Texture:
297 tex=self.Texture[c]
298 print tex
299 if tex.filename:
300 tex.texture = pygame.image.load(tex.filename)
302 self.checkPortal()
304 def exec_stcommand(self,cmd,arg,data):
305 if cmd=='BlockSize':
306 self.BlockSize=(int(arg[0]),int(arg[1]))
307 elif cmd=='Texture':
308 tex=Stage_Texture();
309 tex.char=arg[0]
310 tex.filename=arg[1]
311 self.Texture[arg[0]]=tex
313 elif cmd=='StageTitle':
314 self.StageTitle=" ".join(arg)
315 elif cmd=='StageData':
316 if len(data)!=int(arg[1]):
317 print "Error: No coincide el tamaño de datos Y (%d -> %d) en StageData" % (len(data),int(arg[1]))
318 else:
319 for line in data:
320 if len(line)!=int(arg[0]):
321 print "Error: No coincide el tamaño de datos X (%d -> %d) en StageData" % (len(line),int(arg[0]))
322 data=[""]
323 break
324 self.StageData=data
325 elif cmd=='PlaceText':
326 tx,ty=self.BlockSize
327 x=int(arg[0])*tx+2
328 y=int(arg[1])*ty+2
329 for line in data:
330 qwesprites.qweTextBasic(self,x,y,"".join(line))
331 y+=10
332 elif cmd=='CreateTajundraWithLife':
333 self.Tajundra_life=int(arg[0])
334 elif cmd=='NextStage':
335 self.NextStage=arg[0]
337 else:
338 print "Error: Comando '%s' desconocido." % cmd