Example #1
0
	def update(self):
		""" Update bullet position"""
		#if varglob.pdb_debug: pdb.set_trace()

		# calculate next position
		newpos = self.calcnewpos(self.rect,self.vector)
		self.rect = newpos
		(angle,z) = self.vector

		# test if distance to center is bigger then rayon (perimeter trajectory's bats)
		self.center = self.rect.center
		bx = self.center[0]#+self.rect.x
		by = self.center[1]#+self.rect.y
		fx = varglob.fenetre_center[0]
		fy = varglob.fenetre_center[1]
		#calculate distance
		dbfx = bx - fx
		dbfy = by - fy
		rayonbullet = math.sqrt(dbfx*dbfx+dbfy*dbfy) #pythagore a²+b²=c²
		#calculate angle
		rads = math.atan2(-dbfy,dbfx)
		
		#print ("rads: %s\n" %(rads) )
		# g besoin du signe ?
		rads %= (math.pi*2) # en radians

		self.rads = rads

		#degs = math.degrees(rads) # en degres
		
		#print (varglob.rayon)
		#print (varglob.fenetre_center)
		#print (self.center)
		#print (rayonbullet)
		#print ("rads %s" %(rads))
		#print ("vector %s" %(self.vector[0]))
		
		has_changed = False

		if self.vector[1] != 0: #check collid only if bullet mouving and don't follow bat
			# poste isn't server, only movement is calculated
			# changes angle and collid will be check by broadcast server (idx,x,y,angle,speed)
			
			if self.th_E == 0:
				# update new rayon and vector
				self.rayon = rayonbullet
				angle %= (math.pi*2)
				angle = round(angle,5)
				self.vector = (angle,z)
			else: # if poste is server bullets communicate just on change events
				# test if touch side screen
				if not self.area.contains(newpos):
					tl = not self.area.collidepoint(newpos.topleft)
					tr = not self.area.collidepoint(newpos.topright)
					bl = not self.area.collidepoint(newpos.bottomleft)
					br = not self.area.collidepoint(newpos.bottomright)
					if tr and tl or (br and bl): # up/down
						print ("SIDE UP/DOWN")
						#angle = -angle
						#self.vector[1] = 0
						z = 0
						has_changed = True
					if tl and bl: # cotes
						print ("SIDE LEFT")
						#angle = math.pi - angle
						#self.vector[1] = 0
						z = 0
						has_changed = True
					if tr and br: # cotes
						print ("SIDE RIGHT")
						#angle = math.pi - angle
						#self.vector[1] = 0
						z = 0
						has_changed = True
				else: # we are within game screen
					# test if actual pos is greather than rayon
					#if (rayonbullet) > varglob.rayon:
					if (rayonbullet) > varglob.rayon - 10: #bat size
						#test we're yet within bat's trajectory
						#if (rayonbullet) > self.rayon: # and not self.hit:
						if (rayonbullet) < varglob.rayon + 10: # and not self.hit:
							#print ("!!!BULLET PERIMETRE: %s" %(rayonbullet) )
							#print (varglob.rayon)
							#print (varglob.fenetre_center)
							#print (self.center)
							#print ("rads %s" %(rads) )
							#print ("vector %s" %(self.vector[0]) )

							# CECI MARCHE ENFIN APRES 2 JOURS DE TESTS !!!
							#angle =  -rads -((angle+rads)/2)
							#self.vector[1] = 0
							
							# check if bat present
							
							# define angle distance limit bat according screen size (fenetre)
							limbat = 0.10
							if varglob.fenetre_size[0] >= 800:
								limbat = 0.09
							elif varglob.fenetre_size[0] >= 640:
								limbat = 0.14
							else:
								limbat = 0.17
							limbat2 = limbat
								
							for nb, player in enumerate(varglob.players):
								if player[2]!="free": #check all, for each players # and nb!=playerno:
									
									angleplayer = varglob.players[nb][2]
									distBallBat = (math.pi*2-rads - angleplayer)
										
									#V106 BONUS SIZE BAT
									#WARNING: should be change according screen size
									if varglob.BatDim[nb] == 1: #SHORT bat
										limbat2 = limbat-0.05
									if varglob.BatDim[nb] == 2: #LONG bat
										limbat2 = limbat+0.04

									if distBallBat < limbat2:
										#print ("angleplayer %s: %s" %(nb, angleplayer))
										#print ("distBallBat: %s" %(distBallBat))

										#if distBallBat > -limbat:
										if distBallBat > -limbat2:
											#print ("bullet %s touche player %s" %(self.porteur-1, nb))
											#self.vector[1] = 0
											z = 0
											has_changed = True
											#increase player score, update client will be later on update pos
											porteur = self.porteur #celui a qui appartien le tir, sauf 0

											#check if porteur isn't launcher
											if porteur != 0 and porteur != (nb+1) :
												varglob.players[porteur-1][3] += 10
												bats.load_batpng(porteur-1, 1) #flash light
												#decrease hitted player score
												varglob.players[nb][3] -= 10
												bats.load_batpng(nb, 2) #flash dark
												if S_glassbreak:
													S_glassbreak.play()
												#print ("bullet update bats %s and %s" %(porteur-1, nb) )
											
											if self.th_E != 0:
												# Warning: double emploi si on a deja touche, mais necessaire maj bullets
												#self.th_E.sendMsg("S%s:%s\n" %(porteur-1, varglob.players[porteur-1][3]))
												self.th_E.sendMsg("S%s:%s\n" %(nb, varglob.players[nb][3]))
												#update client will be later on update pos
												
											break
										else:
											#print ("MISSED LEFT")
											toto = 1
									else:
										#print ("MISSED RIGHT")
										toto = 1
										
									#time.sleep(1)

							self.hit = 1					
							# update new rayon
							self.rayon = rayonbullet
						else:
							self.hit = 0
							
					else:
						# test if brick touch
						for idx, brick in enumerate(varglob.bricks):
							
							if varglob.bricks[idx][0].getstatus()!=0:
								porteur = self.porteur # bullet owner
								#collision1 = we check for bullet, not for brick!
								collision = self.check_collision(varglob.bricks[idx][0].getrect())
								#0topleft, 1topright, 2bottomleft, 3bottomright, 4midleft, 5midright, 6midtop, 7midbottom, 8center)

								if collision[0] or collision[1] or collision[2] or collision[3] or collision[4] \
								or collision[5] or collision[6] or collision[7] or collision[8]:
									z = 0
									has_changed = True

									# black brick (7) doesn't count as indestruclibles
									if varglob.bricks[idx][0].getimg() != 7:
										
										print ("brick img: %s") %(varglob.bricks[idx][0].getimg())
										if varglob.bricks[idx][0].getimg() == 10: #LIVE brick
											#print ("bullet hit LIVES brick bonus")
											#ball+ player
											if porteur !=0:
												varglob.players[porteur-1][5] += 1
											
										elif varglob.bricks[idx][0].getimg() == 11: #BULLETS brick
											#print ("bullet hit BULLETS brick bonus")
											#bullet+10 player
											if porteur !=0:
												varglob.players[porteur-1][4] += 10
												
										elif varglob.bricks[idx][0].getimg() == 12: #SPEED brick
											print ("bullet hit SPEED brick bonus")
											#do nothink, bullet set speedfast no sense

										elif varglob.bricks[idx][0].getimg() == 13: #GLUE brick
											print ("bullet hit GLUE brick bonus")
											# warning: do not wait until ball return to bat
											# ask: logic to glue all porteur ball(s) to original porteur?
											varglob.bricks[idx][0].setimg(0)
											varglob.bricks[idx][0].setstatus(0)

											# exist if porteur exist
											if porteur !=0:
												# player got any balls?
												if (varglob.players[porteur-1][5] !=0 ) or True:
													for idx2, ball2 in enumerate(varglob.balls):
														#if varglob.balls[idx2][0].getporteur() == porteur:
														if varglob.balls[idx2][0].getporteurorigin() == porteur:
															# decrease ball old porteur
															varglob.players[idx2][5] -= 1
															# if is serveur, broadcast serveur change old porteur
															if self.th_E != 0:
																self.th_E.sendMsg("S%s:%s\n" %(idx2, varglob.players[idx2][3]))
															
															varglob.balls[idx2][0].setporteurorigin()
															varglob.balls[idx2][0].setimg(varglob.balls[idx2][0].getporteurorigin())

															#increase ball new porteur
															varglob.players[self.porteur-1][5] += 1
															# if is serveur, broadcast serveur change new porteur
															if self.th_E != 0:
																self.th_E.sendMsg("S%s:%s\n" %(self.porteur-1, varglob.players[self.porteur-1][3]))

															bx, by, bvector = varglob.balls[idx2][0].getposxyvect() #return (self.rect.x, self.rect.y, self.vector)
															bang = bvector[0]
															bspeed = 0 #bvector[1]
															bvector = (bang, bspeed)
															varglob.balls[idx2][0].setposxyvect((bx, by), bvector)

															# if is serveur, broadcast change old porteur
															if self.th_E != 0:
																#self.th_E.sendMsg("B:%s:%s:%s:%s:%s:%s\n" %(self.porteur, self.getimg(), bx, by, bang, 0))
																self.th_E.sendMsg("B:%s:%s:%s:%s:%s:%s\n" %(idx2, varglob.balls[idx2][0].getimg(), bx, by, bang, 0))

										elif varglob.bricks[idx][0].getimg() == 14: #BOMB brick
											print ("bullet hit BOMB brick bonus")
											if S_bomb:
												S_bomb.play()
											checkbombs=[idx]
											#check for all other bombs to explode
											while len(checkbombs)!=0:
												idxLast = checkbombs.pop()
												for idx2, brick2 in enumerate(varglob.bricks):
													#check only for existing bricks
													if (varglob.bricks[idx2][0].getstatus()!=0):
														collision2 = varglob.bricks[idxLast][0].check_collision(varglob.bricks[idx2][0].getrect())
														if collision2[0] or collision2[1] or collision2[2] or collision2[3] or collision2[4] \
														or collision2[5] or collision2[6] or collision2[7] or collision2[8]:
															#append other bombs to explode
															if (varglob.bricks[idx2][0].getimg() == 14) and (idxLast!=idx2) and (idx2 not in checkbombs):
																checkbombs.append(idx2)
															#increase score player for each brick destroyed
															if porteur != 0:
																if varglob.bricks[idx2][0].getimg() < 7: # only thoses have points scores
																	varglob.players[porteur-1][3] += varglob.bricks[idx2][0].getimg()
																	varglob.bricks[idx2][0].showBrickScore(varglob.bricks[idx2][0].getimg(), porteur)

															#warning: if bonus brick no bonus for player
															varglob.bricks[idx2][0].setimg(0)
															varglob.bricks[idx2][0].setstatus(0)
															# if is serveur, broadcast serveur (idx brick)
															if self.th_E != 0:
																self.th_E.sendMsg("H:%s:%s:%s:%s:%s\n" %(idx2, varglob.bricks[idx2][0].getimg(), varglob.bricks[idx2][0].getstatus(), \
																varglob.bricks[idx2][0].getBrickScore(), varglob.bricks[idx2][0].getBrickScorePlayer()))
	

										elif varglob.bricks[idx][0].getimg() == 15: #WALL brick
											varglob.WallTime = time.time() + 7
											varglob.anouncetexte.append("WALL")
											if self.th_E != 0:
												self.th_E.sendMsg("A%s:WALL\n" %(self.porteur-1))

										elif varglob.bricks[idx][0].getimg() == 16: #Random brick
											ylevel = random.randrange(0, 7)
											varglob.bricks[idx][0].setimg(ylevel)
											varglob.bricks[idx][0].setstatus(ylevel)
											if self.th_E != 0:
												self.th_E.sendMsg("H:%s:%s:%s:%s:%s\n" %(idx, varglob.bricks[idx][0].getimg(), varglob.bricks[idx][0].getstatus(), \
												varglob.bricks[idx][0].getBrickScore(), varglob.bricks[idx][0].getBrickScorePlayer()))
											break

										elif varglob.bricks[idx][0].getimg() == 17: #INVERT brick
											varglob.InvertTime[self.porteur-1] = time.time() + 5
											varglob.anouncetexte.append("INVERT")
											if self.th_E != 0:
												self.th_E.sendMsg("A%s:INVERT\n" %(self.porteur-1))

										elif varglob.bricks[idx][0].getimg() == 18: #SHORT brick
											varglob.BatDim[self.porteur-1] = 1
											varglob.BatDimTime[self.porteur-1] = time.time() + 10
											bats.load_batpng(self.porteur-1, 2) #flash dark
											varglob.anouncetexte.append("SHORT")
											if self.th_E != 0:
												self.th_E.sendMsg("A%s:SHORT\n" %(self.porteur-1))

										elif varglob.bricks[idx][0].getimg() == 19: #LONG brick
											varglob.BatDim[self.porteur-1] = 2
											varglob.BatDimTime[self.porteur-1] = time.time() + 10
											bats.load_batpng(self.porteur-1, 1) #flash light
											varglob.anouncetexte.append("LONG")
											if self.th_E != 0:
												self.th_E.sendMsg("A%s:LONG\n" %(self.porteur-1))

										else:
											#increase score player as brick value, update client with update pos
											if porteur != 0:
												varglob.players[porteur-1][3] += varglob.bricks[idx][0].getimg()
												varglob.bricks[idx][0].showBrickScore(varglob.bricks[idx][0].getimg(), porteur)
										
										#destruction by bullet
										varglob.bricks[idx][0].setimg(0)
										varglob.bricks[idx][0].setstatus(0)

									# if is serveur, broadcast serveur (idx brick)
									if self.th_E != 0:
										self.th_E.sendMsg("H:%s:%s:%s:%s:%s\n" %(idx, varglob.bricks[idx][0].getimg(), varglob.bricks[idx][0].getstatus(), \
										varglob.bricks[idx][0].getBrickScore(), varglob.bricks[idx][0].getBrickScorePlayer()))

										# Warning: double case if already hited, but nedeed update bullets
										#self.th_E.sendMsg("S%s:%s\n" %(porteur-1, varglob.players[porteur-1][3]))
									# explode one brick per time, then exit for
									break
								
		# if poste is server, broadcast only changes to server (idx,x,y,angle,speed,oriented)
		if self.th_E != 0:
			if has_changed == True: # test not nedeed as in else
				angle = round(angle, 5)
				self.vector = (angle,z)
				# decrease bullets when tarjectory ended in update
				porteur = self.porteur
				#varglob.players[porteur-1][4] = varglob.players[porteur-1][4] - 1
				varglob.players[porteur-1][4] -= 1
				#print ("UpdateBullet T:%s:%s:%s:%s:%s:%s\n" %(self.idx, self.img, self.rect.x, self.rect.y, angle, z))
				#self.th_E.sendMsg("T:%s:%s:%s:%s:%s:%s\n" %(self.idx, self.img, self.rect.x, self.rect.y, angle, z))
				self.th_E.sendMsg("T:%s:%s:%s:%s:%s:%s:%s\n" %(self.idx, self.img, self.rect.x, self.rect.y, angle, z, varglob.players[porteur-1][2]))
				# update porteur
				# Warning: double emploi si on a deja touche, but nedeed update bullets
				self.th_E.sendMsg("S%s:%s\n" %(porteur-1, varglob.players[porteur-1][3]))
Example #2
0
	def update(self):
		"""Update ball position"""
		#global ParBallSpeedSlow, ParBallSpeedFast
		#global ParDwngrdBrick, ParBallSpeedSlow, ParBallSpeedFast 
		
		# if rebond, start from old position
		oldrayon = self.rayon
		oldpos = self.rect
		oldvector = self.vector
		
		# calculate next position
		newpos = self.calcnewpos(self.rect,self.vector)
		self.rect = newpos
		(angle,z) = self.vector

		# test if distance to centre bigger than rayon (perimetre bat's trajectory)
		self.center = self.rect.center
		bx = self.center[0]
		by = self.center[1]
		fx = varglob.fenetre_center[0]
		fy = varglob.fenetre_center[1]
		#calculate distance to center
		dbfx = bx - fx
		dbfy = by - fy
		#rayon ball will be
		rayonball = math.sqrt(dbfx*dbfx+dbfy*dbfy) #pythagore a²+b²=c²
		#calculate angle
		rads = math.atan2(-dbfy,dbfx)
		
		#print ("rads: %s\n" %(rads) )
		# need signe ?
		rads %= (math.pi*2) # en radians

		self.rads = rads #angle rapport fenetre center

		#print (varglob.rayon)
		#print (varglob.fenetre_center)
		#print (self.center)
		#print (rayonbullet)
		#print ("rads %s" %(rads) )
		#print ("vector %s" %(self.vector[0]) )
		
		self.hit = 0
		has_changed = False

		#raise down Speed Ball Bonus
		if self.speedTime < time.time() and self.speedTime != 0:
			self.speedTime = 0
			if (z != 0) and (z != ParBallSpeedSlow): #only if ball is moving
				z = ParBallSpeedSlow
				self.setimg(self.img - 4)
				self.setspeed(ParBallSpeedSlow)
				print ("ball speed down")
				#has_changed = True # don't need, and got issues with laters check has_changed
		#raise down Nuclear Ball Bonus
		if self.nuclearTime < time.time() and self.nuclearTime != 0:
			self.nuclearTime = 0
			#Warning: may not need to send over network
			print ("ball nuclear down")
			if self.th_E != 0:
				self.th_E.sendMsg("A%s:NUCLEAROFF\n" %(self.porteur-1))
		#raise down Big Ball Bonus
		if self.bigBallTime < time.time() and self.bigBallTime != 0:
			self.bigBallTime = 0
			self.setimg(self.img)
			#Warning: may not need to send over network
			print ("big ball down")
			if self.th_E != 0:
				self.th_E.sendMsg("A%s:BIGBALLOFF\n" %(self.porteur-1))

		if self.vector[1] != 0: #check collid only if ball is mouving and doesn't follow bat
			# if poste isn't server, calculate only movement
			# angles changes and collide will be send by server broadcast (idx,x,y,angle,speed)
			if self.th_E == 0:
				# update new rayon and vector
				self.rayon = rayonball
				angle %= (math.pi*2)
				angle = round(angle,5)
				self.vector = (angle,z)
			else: # poste is serveur
				# test if touch side aera display game screen
				if not self.area.contains(newpos):
					tl = not self.area.collidepoint(newpos.topleft)
					tr = not self.area.collidepoint(newpos.topright)
					bl = not self.area.collidepoint(newpos.bottomleft)
					br = not self.area.collidepoint(newpos.bottomright)
					if tr and tl or (br and bl): # up/down
						print ("SIDE UP/DOWN")
						angle = -angle
						has_changed = True
					if tl and bl: # cotes
						print ("SIDE LEFT")
						angle = math.pi - angle
						has_changed = True
					if tr and br: # cotes
						print ("SIDE RIGHT")
						angle = math.pi - angle
						has_changed = True
						
					#player lose ball when he lose own ball (porteurOrigin)
					if has_changed: # before all tests, has_changed => ball out
						z=0
						if self.porteurOrigin !=0: # if ball is player's original ball
							if S_BallLose:
								S_BallLose.play()
							z = 0 # re-blit ball to porteur's bat
							
							#MULTIPLAYERS SHOULD ALWAYS HAVE BALLS, OTHERWISE IT DOESN'T FUN.
							if varglob.howplayers ==1:
								if varglob.players[self.porteurOrigin-1][5] > 0:
									varglob.players[self.porteurOrigin-1][5] -= 1 #ParLives
							# update player
							self.th_E.sendMsg("S%s:%s\n" %(self.porteurOrigin-1, varglob.players[self.porteurOrigin-1][3]))
							# redefine porteurOrigine
							self.porteur = self.porteurOrigin
							self.setimg(self.porteurOrigin)
							#V104
							if varglob.howplayers > 1:
								varglob.PenalityDelays[self.porteurOrigin-1] = time.time() + 3								
							else:
								varglob.PenalityDelays[self.porteurOrigin-1] = time.time() + 1
							#V105 update player penality: local time
							if varglob.howplayers > 1:
								self.th_E.sendMsg("X:%s:3\n" %(self.porteurOrigin-1))
							else:
								self.th_E.sendMsg("X:%s:1\n" %(self.porteurOrigin-1))
							
				else: # we are in screen game display
					# test if pos ball actual is greather then perimeter bat
					if (rayonball) > varglob.rayon - 10: # - bat size

						# test we're yet within bat trajectory
						#if (rayonball) > self.rayon: # and not self.hit:
						if (rayonball) < varglob.rayon + 10: # + bat size

							# we are in bat perimeter
							# test si on s'eloigne du centre
							if (rayonball) > self.rayon: # and not self.hit:
								print ("BALL PERIMETRE!!%s" %(rayonball))

								#self.rads = 0 #angle rapport au centre fentetre
								#self.vector = (angle,z) #vecteur de deplacement dans la fenetre

								#mur = False
								#if mur: # TODO ne rebondir sur le perimetre que s'il y a le bonus mur
									# CECI MARCHE ENFIN APRES 3 JOURS DE TESTS !!!
								#	angle =  -rads -((angle+rads)/2)
								#	has_changed = True
								
								#defini la distance angulaire limite bat en fontion de la taille fenetre
								limbat = 0.10

								if varglob.fenetre_size[0] >= 800:
									limbat = 0.09
								elif varglob.fenetre_size[0] >= 640:
									limbat = 0.14
								else:
									limbat = 0.17
								limbat2 = limbat
									
								#test angle 0
								#limbat = 6.2832

								if varglob.WallTime > time.time():
									#limbat = math.pi *2
									angle = math.pi-rads -((rads+angle)/1) #rebondir comme mirroir
									#angle -= distBallBat*2 #shift ball trajectory according bat impact
									print ("ball in wall protect")
									has_changed = True
									self.hit = 1					

								#V104: ball is prior to his owner, then check list...
								elif varglob.players[self.porteurOrigin-1][2]!="free": #check for each player connected, if angle ="free"=existe
									
									#WARNING: PASSAGE BY ZERO POSITIF/NEGATIF HAVE PROBLEMS
									angleplayer = varglob.players[self.porteurOrigin-1][2]
									distBallBat = (math.pi*2-rads - angleplayer)
									#all in positive
									angleplayer = varglob.players[self.porteurOrigin-1][2]
									distBallBat = (math.pi*2-angleplayer -rads)
									
									#WARNING: should be change according screen size
									if varglob.BatDim[self.porteurOrigin-1] == 1: #SHORT bat
										limbat2 = limbat - 0.05
									if varglob.BatDim[self.porteurOrigin-1] == 2: #LONG bat
										limbat2 = limbat + 0.04

									#TODO: verify positions with coordonnate calcul
									#if ((distBallBat < limbat) and (distBallBat >= 0)) or (distBallBat > math.pi*2-limbat): # try to fix 360° bug
									if ((distBallBat < limbat2) and (distBallBat >= 0)) or (distBallBat > math.pi*2-limbat2): # try to fix 360° bug
										angle = math.pi-rads -((rads+angle)/1) #rebondir comme mirroir
										angle -= distBallBat*2 #shift ball trajectory according bat impact
										print ("ball on bat")
										has_changed = True
										self.hit = 1					

										if self.img > 4 : #BALL SPEED
											self.setimg(self.porteurOrigin-1 + 5) #couleur du porteur
										else:
											self.setimg(self.porteurOrigin-1 + 1) # porteur colors

										self.porteur = self.porteurOrigin
										bats.load_batpng(self.porteurOrigin-1, 1) #flash light
										# if is serveur, ball's communicate to clients
										if self.th_E != 0:
											#update player
											self.th_E.sendMsg("S%s:%s\n" %(self.porteurOrigin-1, varglob.players[self.porteurOrigin-1][3]))

									#elif ((distBallBat > -limbat) and (distBallBat < 0)) or (distBallBat < -math.pi*2+limbat): # try to fix 360° bug
									elif ((distBallBat > -limbat2) and (distBallBat < 0)) or (distBallBat < -math.pi*2+limbat2): # try to fix 360° bug
										angle = math.pi-rads -((rads+angle)/1) # rebondir as mirror
										angle -= distBallBat*2 # devier tajectoire ball en fonction de l'impact bat
										print ("ball on bat")
										has_changed = True
										self.hit = 1					

										if self.img > 4 : #BALL SPEED
											self.setimg(self.porteurOrigin-1 + 5) # porteur color
										else:
											self.setimg(self.porteurOrigin-1 + 1) # porteur color

										self.porteur = self.porteurOrigin
										bats.load_batpng(self.porteurOrigin-1, 1) #flash light
										# if is serveur, ball's communicate to clients
										if self.th_E != 0:
											#update player
											self.th_E.sendMsg("S%s:%s\n" %(self.porteurOrigin-1, varglob.players[self.porteurOrigin-1][3]))
										

								if has_changed == False: #ball not on porteurOrigin, check others
									for nb, player in enumerate(varglob.players):
										if player[2]!="free": #check for each player connected, if angle ="free"=existe
										
											#WARNING: PASSAGE BY ZERO POSITIF/NEGATIF HAVE PROBLEMS
											angleplayer = varglob.players[nb][2]
											distBallBat = (math.pi*2-rads - angleplayer)

											#all in positive
											angleplayer = varglob.players[nb][2]
											distBallBat = (math.pi*2-angleplayer -rads)
											
											print ("a)BallRads: %s" %(rads) )
											print ("a)BallAngle: %s" %(angle) )
											print ("a)angleplayer %s: %s" %(nb, angleplayer) )
											print ("a)distBallBat: %s" %(distBallBat) )

											#WARNING: should be change according screen size
											if varglob.BatDim[nb] == 1: #SHORT bat
												limbat2 = limbat - 0.05
											if varglob.BatDim[nb] == 2: #LONG bat
												limbat2 = limbat + 0.04

											#TODO: verify positions with coordonnees calcul
											#if ((distBallBat < limbat) and (distBallBat >= 0)) or (distBallBat > math.pi*2-limbat): # try to fix 360° bug
											if ((distBallBat < limbat2) and (distBallBat >= 0)) or (distBallBat > math.pi*2-limbat2): # try to fix 360° bug
												print ("b)distBallBat: %s" %(distBallBat) )
												#FIXED: ZERO PASSAGE POSITIF/NEGATIF POSE PROBLEME
												#angle = -rads -((angle+rads)/2) #rebondir comme mirroir
												angle = math.pi-rads -((rads+angle)/1) #rebondir comme mirroir
												
												# have to change as FIXED 0°
												angle -= distBallBat*2 #shift ball trajectory according bat impact
												
												print ("ball on bat")
												has_changed = True
												print ("b)BallAngle: %s" %(angle) )
												
												self.hit = 1

												print ("LEFT")
												if self.img > 4 : #BALL SPEED
													self.setimg(nb + 5) #owner's color
												else:
													self.setimg(nb + 1) #owner's color

												if self.porteur != nb + 1:
													self.porteur = (nb + 1) #ball is from owner's bat (+1, 0 si None?)
													# non! varglob.players[self.porteur-1][5] += 1
													
												#load_batpng(nb, 1) #flash light
												bats.load_batpng(self.porteur-1, 1) #flash light
												# if is serveur, ball's communicate to clients
												if self.th_E != 0:
													#update player
													self.th_E.sendMsg("S%s:%s\n" %(self.porteur-1, varglob.players[self.porteur-1][3]))

												break
											
											#if ((distBallBat > -limbat) and (distBallBat < 0)) or (distBallBat < -math.pi*2+limbat): # try to fix 360° bug
											if ((distBallBat > -limbat2) and (distBallBat < 0)) or (distBallBat < -math.pi*2+limbat2): # try to fix 360° bug
												print ("c)distBallBat: %s" %(distBallBat))
												#FIXED: LE PASSAGE PAR ZERO POSITIF/NEGATIF POSE PROBLEME
												#angle = -rads -((angle+rads)/2) #rebondir comme mirroir
												angle = math.pi-rads -((rads+angle)/1) #rebondir comme mirroir
												
												# have to change as FIXED 0°
												angle -= distBallBat*2 #shift ball trajectory according bat impact
												print ("ball on bat")
												has_changed = True
												print ("c)BallAngle: %s" %(angle))
												
												self.hit = 1
												
												print ("RIGHT")
												if self.img > 4 : #BALL SPEED
													self.setimg(nb + 5) #couleur du porteur
												else:
													self.setimg(nb + 1) #couleur du porteur

												if self.porteur != nb + 1:
													self.porteur = (nb + 1) #ball is from owner's bat (+1, 0 si None?)
													#non ! varglob.players[self.porteur-1][5] += 1
													
												#load_batpng(nb, 1) #flash light
												bats.load_batpng(self.porteur-1, 1) #flash light
												# if is serveur, ball's communicate to clients
												if self.th_E != 0:
													#update player
													self.th_E.sendMsg("S%s:%s\n" %(self.porteur-1, varglob.players[self.porteur-1][3]))
													
												break
											
					# lower than perimetre, test if touch brick
					else:
						for idx, brick in enumerate(varglob.bricks):
							
							if varglob.bricks[idx][0].getstatus() != 0:

								porteur = self.porteur # owner's ball

								#collision = varglob.bricks[idx][0].check_collision(self.rect)
								collision = varglob.bricks[idx][0].check_collision(newpos)
								#list [0topleft, 1topright, 2bottomleft, 3bottomright, 4midleft, 5midright, 6midtop, 7midbottom, 8center]

								# WARNING: privilegier les angles ou les faces? faire parametre?
								# WARNING: regarder de quel coté la balle est collid (pas seulement la brique)
								
								angleNuclear = angle #1.0.7 memo Nuclear dosen't change, destroy all
								if (collision[0]):
									# print ("brick topleft")
									# voir CECI MARCHE ENFIN APRES 2 JOURS DE TESTS !!!
									# pas de quoi etre fiere: un bug m'a coute une journee suplementaire
									while angle >=  0:
										angle -= math.pi/4
									angle = angle/2
									angle =  -math.pi*3/4 - angle
									print ("ball on brick:%s collid0" %(idx) )
									has_changed = True

								if (not has_changed) and (collision[1]):
									#print ("brick topright")
									while angle >=  0:
										angle -= math.pi/4
									angle = angle/2
									angle =  -math.pi*1/4 - angle
									print ("ball on brick:%s collid1" %(idx) )
									has_changed = True

								if (not has_changed) and (collision[2]):
									#print ("brick bottomleft")
									while angle >=  0:
										angle -= math.pi/4
									angle = angle/2
									angle =  -math.pi*5/4 - angle
									print ("ball on brick:%s collid2" %(idx) )
									has_changed = True

								if (not has_changed) and (collision[3]):
									#print ("brick bottomright")
									while angle >=  0:
										angle -= math.pi/4
									angle = angle/2
									angle =  -math.pi*7/4 - angle
									print ("ball on brick:%s collid3" %(idx) )
									has_changed = True

								if (not has_changed) and (collision[4] or collision[5]):
									#print ("brick side vertical right or left")
									angle = math.pi - angle
									print ("ball on brick:%s collid4-5" %(idx) )
									has_changed = True

								if (not has_changed) and (collision[6] or collision[7]):
									#print ("brick top or bottom")
									angle = -angle
									print ("ball on brick:%s collid6-7" %(idx) )
									has_changed = True

								if has_changed == True:
									# black brick (7) doesn't count, as indestruclibles
									# WARNING: situation peut etre bloquée par rebond entre briques noires,
									# malgré un angle aléatoire supplementaire.
									# >>> recollage bat si tape BrickNoir + de 10 fois d'affilées.
									angle = angle + (random.randrange(0, 157)/100) # random pi/2
									angle %= (math.pi*2)

									if self.nuclearTime != 0:  #1.0.7 Nuclear destroy all
										angle = angleNuclear
										if (varglob.bricks[idx][0].getimg() == 7):
											varglob.bricks[idx][0].setimg(0)
											varglob.bricks[idx][0].setstatus(0)
											if self.th_E != 0:
												#self.th_E.sendMsg("H:%s:%s:%s:%s:%s\n" %(idx, 0, 0, bricks[idx][0].getBrickScore(), bricks[idx][0].getBrickScorePlayer()))
												self.th_E.sendMsg("H:%s:%s:%s:%s:%s\n" %(idx, 0, 0, 0, 0))
										
									if (varglob.bricks[idx][0].getimg() != 7): #BLACK brick
										
										if varglob.bricks[idx][0].getimg() == 10: #LIVE brick
											print ('ball hit LIVES brick bonus')
											varglob.bricks[idx][0].setimg(0)
											varglob.bricks[idx][0].setstatus(0)
											#ball+ player
											if porteur !=0:
												varglob.players[porteur-1][5] += 1
											
										elif varglob.bricks[idx][0].getimg() == 11: #BULLETS brick
											print ('ball hit BULLETS brick bonus')
											varglob.bricks[idx][0].setimg(0)
											varglob.bricks[idx][0].setstatus(0)
											#bullet+10 player
											if porteur !=0:
												varglob.players[porteur-1][4] += 10
											
										elif varglob.bricks[idx][0].getimg() == 12: #SPEED brick
											print ('ball hit SPEED brick bonus')
											varglob.bricks[idx][0].setimg(0)
											varglob.bricks[idx][0].setstatus(0)
											#ball set speedfast
											z = ParBallSpeedFast
											self.setimg(self.img + 4)
											self.speedTime = time.time() + 10
											
										elif varglob.bricks[idx][0].getimg() == 13: #GLUE brick
											print ("ball hit GLUE brick:%s bonus" %(idx))
											# warning: do not wait until ball return to bat
											# ask: logic to glue all porteur ball(s) to original porteur?
											varglob.bricks[idx][0].setimg(0)
											varglob.bricks[idx][0].setstatus(0)

											# exist if porteur exist
											if self.porteur != 0:
												#ball is from owner's bat
												self.setporteurorigin()
												self.setimg(self.porteurOrigin)
												#glue ball to bat
												bx, by, bvector = self.getposxyvect() #return (self.rect.x, self.rect.y, self.vector)
												bang = bvector[0]
												bspeed = 0 #bvector[1]
												bvector = (bang, bspeed)
												self.setposxyvect((bx, by), bvector)
												
												if self.th_E != 0:
													self.th_E.sendMsg("B:%s:%s:%s:%s:%s:%s\n" %(self.porteur-1, self.getimg(), bx, by, bang, 0))
												
												z = 0 # for actual ball
															
										elif varglob.bricks[idx][0].getimg() == 14: #BOMB brick
											print ("ball hit BOMB brick:%s bonus" %(idx))
											if S_bomb:
												S_bomb.play()
											checkbombs=[idx]
											while len(checkbombs)!=0:
												idxLast = checkbombs.pop()
												for idx2, brick2 in enumerate(varglob.bricks):
													#check only for existing bricks
													if (varglob.bricks[idx2][0].getstatus()!=0):
														collision2 = varglob.bricks[idxLast][0].check_collision(varglob.bricks[idx2][0].getrect())
														if collision2[0] or collision2[1] or collision2[2] or collision2[3] or collision2[4] \
														or collision2[5] or collision2[6] or collision2[7] or collision2[8]:
															#append other bombs to explode
															if (varglob.bricks[idx2][0].getimg() == 14) and (idxLast!=idx2) and (idx2 not in checkbombs):
																checkbombs.append(idx2)
															#destruction by bomb
															if (varglob.bricks[idx2][0].getimg() < 7):
																varglob.bricks[idx2][0].showBrickScore(varglob.bricks[idx2][0].getimg(), porteur)
																#increase score player for each brick destroyed
																if porteur !=0:
																	varglob.players[porteur-1][3] += varglob.bricks[idx2][0].getimg()

															#warning: if bonus brick no bonus for player
															varglob.bricks[idx2][0].setimg(0)
															varglob.bricks[idx2][0].setstatus(0)
															# if is server, broadcast (idx brick)
															if self.th_E != 0:
																self.th_E.sendMsg("H:%s:%s:%s:%s:%s\n" %(idx2, 0, 0, varglob.bricks[idxLast][0].getBrickScore(), varglob.bricks[idxLast][0].getBrickScorePlayer()))
																#self.th_E.sendMsg("H:%s:%s:%s:%s:%s\n" %(idx, 0, 0, 0, 0))

										elif varglob.bricks[idx][0].getimg() == 15: #WALL brick
											print ("ball hit WALL brick:%s bonus" %(idx))
											varglob.WallTime = time.time() + 7
											varglob.anouncetexte.append("WALL")
											varglob.bricks[idx][0].setimg(0)
											varglob.bricks[idx][0].setstatus(0)
											if self.th_E != 0:
												self.th_E.sendMsg("A%s:WALL\n" %(self.porteur-1))

										elif varglob.bricks[idx][0].getimg() == 16: #Random brick
											ylevel = random.randrange(0, 7)
											varglob.bricks[idx][0].setimg(ylevel)
											varglob.bricks[idx][0].setstatus(ylevel)
											if self.th_E != 0:
												self.th_E.sendMsg("H:%s:%s:%s:%s:%s\n" %(idx, varglob.bricks[idx][0].getimg(), varglob.bricks[idx][0].getstatus(), \
												varglob.bricks[idx][0].getBrickScore(), varglob.bricks[idx][0].getBrickScorePlayer()))
											#break

										elif varglob.bricks[idx][0].getimg() == 17: #INVERT brick
											print ("ball hit INVERT brick:%s bonus" %(idx))
											varglob.InvertTime[self.porteur-1] = time.time() + 5
											varglob.anouncetexte.append("INVERT")
											varglob.bricks[idx][0].setimg(0)
											varglob.bricks[idx][0].setstatus(0)
											if self.th_E != 0:
												self.th_E.sendMsg("A%s:INVERT\n" %(self.porteur-1))

										elif varglob.bricks[idx][0].getimg() == 18: #SHORT brick
											print ("ball hit SHORT brick:%s bonus" %(idx))
											varglob.BatDim[porteur-1] = 1 #SHORT bat
											varglob.BatDimTime[porteur-1] = time.time() + 10
											varglob.bricks[idx][0].setimg(0)
											varglob.bricks[idx][0].setstatus(0)
											bats.load_batpng(self.porteur-1, 2) #flash dark
											varglob.anouncetexte.append("SHORT")
											if self.th_E != 0:
												self.th_E.sendMsg("A%s:SHORT\n" %(self.porteur-1))

										elif varglob.bricks[idx][0].getimg() == 19: #LONG brick
											print ("ball hit LONG brick:%s bonus" %(idx))
											varglob.BatDim[porteur-1] = 2 #LONG bat
											varglob.BatDimTime[porteur-1] = time.time() + 10
											varglob.bricks[idx][0].setimg(0)
											varglob.bricks[idx][0].setstatus(0)
											bats.load_batpng(self.porteur-1, 1) #flash light
											varglob.anouncetexte.append("LONG")
											if self.th_E != 0:
												self.th_E.sendMsg("A%s:LONG\n" %(self.porteur-1))

										elif varglob.bricks[idx][0].getimg() == 20: #V1.0.7 NUCLEAR brick
											print ("ball hit NUCLEAR brick:%s bonus" %(idx))
											varglob.bricks[idx][0].setimg(0)
											varglob.bricks[idx][0].setstatus(0)
											self.nuclearTime = time.time() + 10
											varglob.anouncetexte.append("NUCLEARON")
											if self.th_E != 0:
												self.th_E.sendMsg("A%s:NUCLEARON\n" %(self.porteur-1))
												
										elif varglob.bricks[idx][0].getimg() == 21: #V1.0.7 BIG BALL brick
											print ("ball hit BIG BALL brick:%s bonus" %(idx))
											varglob.bricks[idx][0].setimg(0)
											varglob.bricks[idx][0].setstatus(0)
											self.bigBallTime = time.time() + 7
											self.setbigball(self.bigBallTime)
											varglob.anouncetexte.append("BIG_BALL")
											if self.th_E != 0:
												self.th_E.sendMsg("A%s:BIGBALLON\n" %(self.porteur-1))

										else:
											if ParDwngrdBrick:
												if varglob.bricks[idx][0].getimg() >= 1:
													varglob.bricks[idx][0].showBrickScore(varglob.bricks[idx][0].getimg(), porteur)
													if porteur !=0:
														varglob.players[porteur-1][3] += varglob.bricks[idx][0].getimg()
														
													varglob.bricks[idx][0].setimg(varglob.bricks[idx][0].getimg() - 1)
													if varglob.bricks[idx][0].getimg() == 0:
														varglob.bricks[idx][0].setstatus(0)
											else:
												varglob.bricks[idx][0].showBrickScore(varglob.bricks[idx][0].getimg(), porteur)
												if porteur !=0:
													# score increase as brick color showBrickScore()
													varglob.players[porteur-1][3] += varglob.bricks[idx][0].getimg()

												varglob.bricks[idx][0].setimg(0)
												varglob.bricks[idx][0].setstatus(0)


									# if is serveur, BROADCAST serveur (idx brick)
									if self.th_E != 0:
										# warning if black brick (th_E Score and Hit not util)
										if S_HitBrick:
											S_HitBrick.play()
										self.th_E.sendMsg("H:%s:%s:%s:%s:%s\n" %(idx, varglob.bricks[idx][0].getimg(), varglob.bricks[idx][0].getstatus(), \
										varglob.bricks[idx][0].getBrickScore(), varglob.bricks[idx][0].getBrickScorePlayer()))
										self.th_E.sendMsg("S%s:%s\n" %(porteur-1, varglob.players[porteur-1][3]))
									break
									
						self.hit = 0 # not util, may be yes... or not...

		# update new rayon
		self.rayon = rayonball

		# if is serveur, BROADCAST only changes (idx,x,y,angle,speed)
		if self.th_E != 0:
			# if rebond, restart from old position
			if has_changed == True:
				#TODO: recalculate only when not glue.
				self.rect = oldpos
				self.rayon = oldrayon
				#oldvector = self.vector
		
				angle %= (2*math.pi)
				angle = round(angle,5)
				self.vector = (angle,z)
			
				# and recalcuate mouvement !!!
				newpos = self.calcnewpos(self.rect,self.vector)
				self.rect = newpos
				#(angle,z) = self.vector
				print ("ball.update=B:%s:%s:%s:%s:%s:%s\n" %(self.idx, self.img, self.rect.x, self.rect.y, angle, z))
				self.th_E.sendMsg("B:%s:%s:%s:%s:%s:%s\n" %(self.idx, self.img, self.rect.x, self.rect.y, angle, z))
Example #3
0
    def update(self):
        """ Update bullet position"""
        #if varglob.pdb_debug: pdb.set_trace()

        # calculate next position
        newpos = self.calcnewpos(self.rect, self.vector)
        self.rect = newpos
        (angle, z) = self.vector

        # test if distance to center is bigger then rayon (perimeter trajectory's bats)
        self.center = self.rect.center
        bx = self.center[0]  #+self.rect.x
        by = self.center[1]  #+self.rect.y
        fx = varglob.fenetre_center[0]
        fy = varglob.fenetre_center[1]
        #calculate distance
        dbfx = bx - fx
        dbfy = by - fy
        rayonbullet = math.sqrt(dbfx * dbfx + dbfy * dbfy)  #pythagore a²+b²=c²
        #calculate angle
        rads = math.atan2(-dbfy, dbfx)

        #print ("rads: %s\n" %(rads) )
        # g besoin du signe ?
        rads %= (math.pi * 2)  # en radians

        self.rads = rads

        #degs = math.degrees(rads) # en degres

        #print (varglob.rayon)
        #print (varglob.fenetre_center)
        #print (self.center)
        #print (rayonbullet)
        #print ("rads %s" %(rads))
        #print ("vector %s" %(self.vector[0]))

        has_changed = False

        if self.vector[
                1] != 0:  #check collid only if bullet mouving and don't follow bat
            # poste isn't server, only movement is calculated
            # changes angle and collid will be check by broadcast server (idx,x,y,angle,speed)

            if self.th_E == 0:
                # update new rayon and vector
                self.rayon = rayonbullet
                angle %= (math.pi * 2)
                angle = round(angle, 5)
                self.vector = (angle, z)
            else:  # if poste is server bullets communicate just on change events
                # test if touch side screen
                if not self.area.contains(newpos):
                    tl = not self.area.collidepoint(newpos.topleft)
                    tr = not self.area.collidepoint(newpos.topright)
                    bl = not self.area.collidepoint(newpos.bottomleft)
                    br = not self.area.collidepoint(newpos.bottomright)
                    if tr and tl or (br and bl):  # up/down
                        print("SIDE UP/DOWN")
                        #angle = -angle
                        #self.vector[1] = 0
                        z = 0
                        has_changed = True
                    if tl and bl:  # cotes
                        print("SIDE LEFT")
                        #angle = math.pi - angle
                        #self.vector[1] = 0
                        z = 0
                        has_changed = True
                    if tr and br:  # cotes
                        print("SIDE RIGHT")
                        #angle = math.pi - angle
                        #self.vector[1] = 0
                        z = 0
                        has_changed = True
                else:  # we are within game screen
                    # test if actual pos is greather than rayon
                    #if (rayonbullet) > varglob.rayon:
                    if (rayonbullet) > varglob.rayon - 10:  #bat size
                        #test we're yet within bat's trajectory
                        #if (rayonbullet) > self.rayon: # and not self.hit:
                        if (rayonbullet
                            ) < varglob.rayon + 10:  # and not self.hit:
                            #print ("!!!BULLET PERIMETRE: %s" %(rayonbullet) )
                            #print (varglob.rayon)
                            #print (varglob.fenetre_center)
                            #print (self.center)
                            #print ("rads %s" %(rads) )
                            #print ("vector %s" %(self.vector[0]) )

                            # CECI MARCHE ENFIN APRES 2 JOURS DE TESTS !!!
                            #angle =  -rads -((angle+rads)/2)
                            #self.vector[1] = 0

                            # check if bat present

                            # define angle distance limit bat according screen size (fenetre)
                            limbat = 0.10
                            if varglob.fenetre_size[0] >= 800:
                                limbat = 0.09
                            elif varglob.fenetre_size[0] >= 640:
                                limbat = 0.14
                            else:
                                limbat = 0.17
                            limbat2 = limbat

                            for nb, player in enumerate(varglob.players):
                                if player[
                                        2] != "free":  #check all, for each players # and nb!=playerno:

                                    angleplayer = varglob.players[nb][2]
                                    distBallBat = (math.pi * 2 - rads -
                                                   angleplayer)

                                    #V106 BONUS SIZE BAT
                                    #WARNING: should be change according screen size
                                    if varglob.BatDim[nb] == 1:  #SHORT bat
                                        limbat2 = limbat - 0.05
                                    if varglob.BatDim[nb] == 2:  #LONG bat
                                        limbat2 = limbat + 0.04

                                    if distBallBat < limbat2:
                                        #print ("angleplayer %s: %s" %(nb, angleplayer))
                                        #print ("distBallBat: %s" %(distBallBat))

                                        #if distBallBat > -limbat:
                                        if distBallBat > -limbat2:
                                            #print ("bullet %s touche player %s" %(self.porteur-1, nb))
                                            #self.vector[1] = 0
                                            z = 0
                                            has_changed = True
                                            #increase player score, update client will be later on update pos
                                            porteur = self.porteur  #celui a qui appartien le tir, sauf 0

                                            #check if porteur isn't launcher
                                            if porteur != 0 and porteur != (
                                                    nb + 1):
                                                varglob.players[porteur -
                                                                1][3] += 10
                                                bats.load_batpng(
                                                    porteur - 1,
                                                    1)  #flash light
                                                #decrease hitted player score
                                                varglob.players[nb][3] -= 10
                                                bats.load_batpng(
                                                    nb, 2)  #flash dark
                                                if S_glassbreak:
                                                    S_glassbreak.play()
                                                #print ("bullet update bats %s and %s" %(porteur-1, nb) )

                                            if self.th_E != 0:
                                                # Warning: double emploi si on a deja touche, mais necessaire maj bullets
                                                #self.th_E.sendMsg("S%s:%s\n" %(porteur-1, varglob.players[porteur-1][3]))
                                                self.th_E.sendMsg(
                                                    "S%s:%s\n" %
                                                    (nb,
                                                     varglob.players[nb][3]))
                                                #update client will be later on update pos

                                            break
                                        else:
                                            #print ("MISSED LEFT")
                                            toto = 1
                                    else:
                                        #print ("MISSED RIGHT")
                                        toto = 1

                                    #time.sleep(1)

                            self.hit = 1
                            # update new rayon
                            self.rayon = rayonbullet
                        else:
                            self.hit = 0

                    else:
                        # test if brick touch
                        for idx, brick in enumerate(varglob.bricks):

                            if varglob.bricks[idx][0].getstatus() != 0:
                                porteur = self.porteur  # bullet owner
                                #collision1 = we check for bullet, not for brick!
                                collision = self.check_collision(
                                    varglob.bricks[idx][0].getrect())
                                #0topleft, 1topright, 2bottomleft, 3bottomright, 4midleft, 5midright, 6midtop, 7midbottom, 8center)

                                if collision[0] or collision[1] or collision[2] or collision[3] or collision[4] \
                                or collision[5] or collision[6] or collision[7] or collision[8]:
                                    z = 0
                                    has_changed = True

                                    # black brick (7) doesn't count as indestruclibles
                                    if varglob.bricks[idx][0].getimg() != 7:

                                        print("brick img: %s") % (
                                            varglob.bricks[idx][0].getimg())
                                        if varglob.bricks[idx][0].getimg(
                                        ) == 10:  #LIVE brick
                                            #print ("bullet hit LIVES brick bonus")
                                            #ball+ player
                                            if porteur != 0:
                                                varglob.players[porteur -
                                                                1][5] += 1

                                        elif varglob.bricks[idx][0].getimg(
                                        ) == 11:  #BULLETS brick
                                            #print ("bullet hit BULLETS brick bonus")
                                            #bullet+10 player
                                            if porteur != 0:
                                                varglob.players[porteur -
                                                                1][4] += 10

                                        elif varglob.bricks[idx][0].getimg(
                                        ) == 12:  #SPEED brick
                                            print(
                                                "bullet hit SPEED brick bonus")
                                            #do nothink, bullet set speedfast no sense

                                        elif varglob.bricks[idx][0].getimg(
                                        ) == 13:  #GLUE brick
                                            print(
                                                "bullet hit GLUE brick bonus")
                                            # warning: do not wait until ball return to bat
                                            # ask: logic to glue all porteur ball(s) to original porteur?
                                            varglob.bricks[idx][0].setimg(0)
                                            varglob.bricks[idx][0].setstatus(0)

                                            # exist if porteur exist
                                            if porteur != 0:
                                                # player got any balls?
                                                if (varglob.players[porteur -
                                                                    1][5] !=
                                                        0) or True:
                                                    for idx2, ball2 in enumerate(
                                                            varglob.balls):
                                                        #if varglob.balls[idx2][0].getporteur() == porteur:
                                                        if varglob.balls[idx2][
                                                                0].getporteurorigin(
                                                                ) == porteur:
                                                            # decrease ball old porteur
                                                            varglob.players[
                                                                idx2][5] -= 1
                                                            # if is serveur, broadcast serveur change old porteur
                                                            if self.th_E != 0:
                                                                self.th_E.sendMsg(
                                                                    "S%s:%s\n"
                                                                    %
                                                                    (idx2,
                                                                     varglob.
                                                                     players[
                                                                         idx2]
                                                                     [3]))

                                                            varglob.balls[idx2][
                                                                0].setporteurorigin(
                                                                )
                                                            varglob.balls[
                                                                idx2][0].setimg(
                                                                    varglob.
                                                                    balls[idx2]
                                                                    [0].
                                                                    getporteurorigin(
                                                                    ))

                                                            #increase ball new porteur
                                                            varglob.players[
                                                                self.porteur -
                                                                1][5] += 1
                                                            # if is serveur, broadcast serveur change new porteur
                                                            if self.th_E != 0:
                                                                self.th_E.sendMsg(
                                                                    "S%s:%s\n"
                                                                    %
                                                                    (self.
                                                                     porteur -
                                                                     1, varglob
                                                                     .players[
                                                                         self.
                                                                         porteur
                                                                         - 1]
                                                                     [3]))

                                                            bx, by, bvector = varglob.balls[
                                                                idx2][0].getposxyvect(
                                                                )  #return (self.rect.x, self.rect.y, self.vector)
                                                            bang = bvector[0]
                                                            bspeed = 0  #bvector[1]
                                                            bvector = (bang,
                                                                       bspeed)
                                                            varglob.balls[idx2][
                                                                0].setposxyvect(
                                                                    (bx, by),
                                                                    bvector)

                                                            # if is serveur, broadcast change old porteur
                                                            if self.th_E != 0:
                                                                #self.th_E.sendMsg("B:%s:%s:%s:%s:%s:%s\n" %(self.porteur, self.getimg(), bx, by, bang, 0))
                                                                self.th_E.sendMsg(
                                                                    "B:%s:%s:%s:%s:%s:%s\n"
                                                                    %
                                                                    (idx2,
                                                                     varglob.
                                                                     balls[idx2]
                                                                     [0].
                                                                     getimg(),
                                                                     bx, by,
                                                                     bang, 0))

                                        elif varglob.bricks[idx][0].getimg(
                                        ) == 14:  #BOMB brick
                                            print(
                                                "bullet hit BOMB brick bonus")
                                            if S_bomb:
                                                S_bomb.play()
                                            checkbombs = [idx]
                                            #check for all other bombs to explode
                                            while len(checkbombs) != 0:
                                                idxLast = checkbombs.pop()
                                                for idx2, brick2 in enumerate(
                                                        varglob.bricks):
                                                    #check only for existing bricks
                                                    if (varglob.bricks[idx2]
                                                        [0].getstatus() != 0):
                                                        collision2 = varglob.bricks[
                                                            idxLast][
                                                                0].check_collision(
                                                                    varglob.
                                                                    bricks[
                                                                        idx2]
                                                                    [0].
                                                                    getrect())
                                                        if collision2[0] or collision2[1] or collision2[2] or collision2[3] or collision2[4] \
                                                        or collision2[5] or collision2[6] or collision2[7] or collision2[8]:
                                                            #append other bombs to explode
                                                            if (varglob.bricks[
                                                                    idx2]
                                                                [0].getimg(
                                                                ) == 14) and (
                                                                    idxLast !=
                                                                    idx2
                                                                ) and (
                                                                    idx2 not in
                                                                    checkbombs
                                                                ):
                                                                checkbombs.append(
                                                                    idx2)
                                                            #increase score player for each brick destroyed
                                                            if porteur != 0:
                                                                if varglob.bricks[
                                                                        idx2][0].getimg(
                                                                        ) < 7:  # only thoses have points scores
                                                                    varglob.players[
                                                                        porteur
                                                                        -
                                                                        1][3] += varglob.bricks[
                                                                            idx2][
                                                                                0].getimg(
                                                                                )
                                                                    varglob.bricks[
                                                                        idx2][0].showBrickScore(
                                                                            varglob
                                                                            .
                                                                            bricks[
                                                                                idx2]
                                                                            [0]
                                                                            .
                                                                            getimg(
                                                                            ),
                                                                            porteur
                                                                        )

                                                            #warning: if bonus brick no bonus for player
                                                            varglob.bricks[
                                                                idx2][
                                                                    0].setimg(
                                                                        0)
                                                            varglob.bricks[idx2][
                                                                0].setstatus(0)
                                                            # if is serveur, broadcast serveur (idx brick)
                                                            if self.th_E != 0:
                                                                self.th_E.sendMsg("H:%s:%s:%s:%s:%s\n" %(idx2, varglob.bricks[idx2][0].getimg(), varglob.bricks[idx2][0].getstatus(), \
                                                                varglob.bricks[idx2][0].getBrickScore(), varglob.bricks[idx2][0].getBrickScorePlayer()))

                                        elif varglob.bricks[idx][0].getimg(
                                        ) == 15:  #WALL brick
                                            varglob.WallTime = time.time() + 7
                                            varglob.anouncetexte.append("WALL")
                                            if self.th_E != 0:
                                                self.th_E.sendMsg(
                                                    "A%s:WALL\n" %
                                                    (self.porteur - 1))

                                        elif varglob.bricks[idx][0].getimg(
                                        ) == 16:  #Random brick
                                            ylevel = random.randrange(0, 7)
                                            varglob.bricks[idx][0].setimg(
                                                ylevel)
                                            varglob.bricks[idx][0].setstatus(
                                                ylevel)
                                            if self.th_E != 0:
                                                self.th_E.sendMsg("H:%s:%s:%s:%s:%s\n" %(idx, varglob.bricks[idx][0].getimg(), varglob.bricks[idx][0].getstatus(), \
                                                varglob.bricks[idx][0].getBrickScore(), varglob.bricks[idx][0].getBrickScorePlayer()))
                                            break

                                        elif varglob.bricks[idx][0].getimg(
                                        ) == 17:  #INVERT brick
                                            varglob.InvertTime[
                                                self.porteur -
                                                1] = time.time() + 5
                                            varglob.anouncetexte.append(
                                                "INVERT")
                                            if self.th_E != 0:
                                                self.th_E.sendMsg(
                                                    "A%s:INVERT\n" %
                                                    (self.porteur - 1))

                                        elif varglob.bricks[idx][0].getimg(
                                        ) == 18:  #SHORT brick
                                            varglob.BatDim[self.porteur -
                                                           1] = 1
                                            varglob.BatDimTime[
                                                self.porteur -
                                                1] = time.time() + 10
                                            bats.load_batpng(
                                                self.porteur - 1,
                                                2)  #flash dark
                                            varglob.anouncetexte.append(
                                                "SHORT")
                                            if self.th_E != 0:
                                                self.th_E.sendMsg(
                                                    "A%s:SHORT\n" %
                                                    (self.porteur - 1))

                                        elif varglob.bricks[idx][0].getimg(
                                        ) == 19:  #LONG brick
                                            varglob.BatDim[self.porteur -
                                                           1] = 2
                                            varglob.BatDimTime[
                                                self.porteur -
                                                1] = time.time() + 10
                                            bats.load_batpng(
                                                self.porteur - 1,
                                                1)  #flash light
                                            varglob.anouncetexte.append("LONG")
                                            if self.th_E != 0:
                                                self.th_E.sendMsg(
                                                    "A%s:LONG\n" %
                                                    (self.porteur - 1))

                                        else:
                                            #increase score player as brick value, update client with update pos
                                            if porteur != 0:
                                                varglob.players[
                                                    porteur -
                                                    1][3] += varglob.bricks[
                                                        idx][0].getimg()
                                                varglob.bricks[idx][
                                                    0].showBrickScore(
                                                        varglob.bricks[idx]
                                                        [0].getimg(), porteur)

                                        #destruction by bullet
                                        varglob.bricks[idx][0].setimg(0)
                                        varglob.bricks[idx][0].setstatus(0)

                                    # if is serveur, broadcast serveur (idx brick)
                                    if self.th_E != 0:
                                        self.th_E.sendMsg("H:%s:%s:%s:%s:%s\n" %(idx, varglob.bricks[idx][0].getimg(), varglob.bricks[idx][0].getstatus(), \
                                        varglob.bricks[idx][0].getBrickScore(), varglob.bricks[idx][0].getBrickScorePlayer()))

                                        # Warning: double case if already hited, but nedeed update bullets
                                        #self.th_E.sendMsg("S%s:%s\n" %(porteur-1, varglob.players[porteur-1][3]))
                                    # explode one brick per time, then exit for
                                    break

        # if poste is server, broadcast only changes to server (idx,x,y,angle,speed,oriented)
        if self.th_E != 0:
            if has_changed == True:  # test not nedeed as in else
                angle = round(angle, 5)
                self.vector = (angle, z)
                # decrease bullets when tarjectory ended in update
                porteur = self.porteur
                #varglob.players[porteur-1][4] = varglob.players[porteur-1][4] - 1
                varglob.players[porteur - 1][4] -= 1
                #print ("UpdateBullet T:%s:%s:%s:%s:%s:%s\n" %(self.idx, self.img, self.rect.x, self.rect.y, angle, z))
                #self.th_E.sendMsg("T:%s:%s:%s:%s:%s:%s\n" %(self.idx, self.img, self.rect.x, self.rect.y, angle, z))
                self.th_E.sendMsg(
                    "T:%s:%s:%s:%s:%s:%s:%s\n" %
                    (self.idx, self.img, self.rect.x, self.rect.y, angle, z,
                     varglob.players[porteur - 1][2]))
                # update porteur
                # Warning: double emploi si on a deja touche, but nedeed update bullets
                self.th_E.sendMsg(
                    "S%s:%s\n" %
                    (porteur - 1, varglob.players[porteur - 1][3]))