PageRenderTime 55ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/mission.py

https://github.com/josomebody/evotank
Python | 560 lines | 510 code | 23 blank | 27 comment | 164 complexity | 1307d97917def55eedd69db73a68d7f2 MD5 | raw file
  1. import signal
  2. #import psyco
  3. from evotankclasses import *
  4. from evotanklevels import *
  5. #psyco.full()
  6. def mission(currentlevel, levels, screen):
  7. random.seed()
  8. protobullet = projectile()
  9. protobot = robot()
  10. you = player()
  11. you.room= 0
  12. you.x = levels[currentlevel].playerx
  13. you.y = levels[currentlevel].playery
  14. you.rotate = levels[currentlevel].playerrotate
  15. thisgame = gamedetails()
  16. gameconsole = console()
  17. print "Loading images..."
  18. font = pygame.font.SysFont("Terminal", 14)
  19. armorpic = pygame.image.load('images/armor.png').convert_alpha()
  20. ammopic = pygame.image.load('images/ammo.png').convert_alpha()
  21. fuelpic = pygame.image.load('images/fuel.png').convert_alpha()
  22. barrelpic = pygame.image.load('images/barrel.png').convert_alpha()
  23. cratepic = pygame.image.load('images/crate.png').convert_alpha()
  24. wallpic = pygame.image.load('images/wall.png').convert_alpha()
  25. heattx = font.render('HEAT', True, (255, 255, 255))
  26. armortx = font.render('ARMOR', True, (255, 255, 255))
  27. fueltx = font.render('FUEL', True, (255, 255, 255))
  28. ammotx = font.render('AMMO', True, (255, 255, 255))
  29. throttlex = font.render('THROTTLE', True, (255, 255, 255))
  30. bulletpic = []
  31. goodtankpic = []
  32. badtankpic = []
  33. doorpic = []
  34. obstaclepic = []
  35. for i in range(8):
  36. picname = 'images/bullet' + str(i) + '.png'
  37. tempic = pygame.image.load(picname).convert_alpha()
  38. bulletpic.append(tempic)
  39. picname = 'images/goodtank' + str(i) + '.png'
  40. tempic = pygame.image.load(picname).convert_alpha()
  41. goodtankpic.append(tempic)
  42. picname = 'images/badtank' + str(i) + '.png'
  43. tempic = pygame.image.load(picname).convert_alpha()
  44. badtankpic.append(tempic)
  45. for i in range(4):
  46. picname = 'images/door' + str(i) + '.png'
  47. tempic = pygame.image.load(picname).convert_alpha()
  48. doorpic.append(tempic)
  49. tempic = pygame.image.load('images/barrel.png').convert_alpha()
  50. obstaclepic.append(tempic)
  51. tempic = pygame.image.load('images/crate.png').convert_alpha()
  52. obstaclepic.append(tempic)
  53. tempic = pygame.image.load('images/wall.png').convert_alpha()
  54. obstaclepic.append(tempic)
  55. gameconsole.write("Loading sounds...")
  56. bang = pygame.mixer.Sound('sounds/bang.wav')
  57. clank = pygame.mixer.Sound('sounds/clank.wav')
  58. ping = pygame.mixer.Sound('sounds/ping.wav')
  59. diesound = pygame.mixer.Sound('sounds/die.wav')
  60. lowammosound = pygame.mixer.Sound('sounds/ammo.wav')
  61. lowarmorsound = pygame.mixer.Sound('sounds/armor.wav')
  62. lowfuelsound = pygame.mixer.Sound('sounds/fuel.wav')
  63. overheatsound = pygame.mixer.Sound('sounds/heat.wav')
  64. latersound = pygame.mixer.Sound('sounds/later.wav')
  65. letsgosound = pygame.mixer.Sound('sounds/letsgo.wav')
  66. # protobot.dead = 0
  67. # protobot.hitstilmating = 5
  68. # protobot.state = 0
  69. # protobot.armor = maxarmor
  70. # protobot.fuel = maxfuel
  71. # protobot.ammo = maxammo
  72. # protobot.offspring = robot()
  73. # robots.append(protobot)
  74. #initialize game coordinates and shit
  75. ptypes = ['fuel', 'armor', 'ammo']
  76. robotstats = []
  77. robotstatspic = []
  78. bulletcount = 0
  79. lowfuelflag = 0
  80. lowammoflag = 0
  81. lowarmorflag = 0
  82. overheatflag = 0
  83. fps = [0]
  84. fpsavg = 0
  85. frametime = 0
  86. showfps = 1
  87. showconsole = 1
  88. showmeters = 1
  89. code_entry = []
  90. tooslow = 0
  91. dropframe = 0
  92. framedelay = 0
  93. firstframe = 1
  94. stillcheat = 0
  95. clipdoors = 0
  96. background = pygame.image.load(levels[currentlevel].rooms[you.room].background).convert()
  97. #main gameloop
  98. pygame.mixer.music.load(levels[currentlevel].music)
  99. pygame.mixer.music.set_volume(.5)
  100. pygame.mixer.music.play(-1)
  101. font = pygame.font.SysFont('Terminal', 14)
  102. shotsfired = 0
  103. shotslanded = 0
  104. framestarttime = pygame.time.get_ticks()
  105. leveltimezero = pygame.time.get_ticks()
  106. while 1:
  107. signal.signal(signal.SIGALRM, handler)
  108. signal.alarm(5)
  109. pygame.event.pump()
  110. if fpsavg > 70:
  111. framedelay = (1000 - 1000 / frametime) / 60
  112. #first of all, check for births
  113. #for i in range(len(levels[currentlevel].rooms[you.room].robots)):
  114. # if levels[currentlevel].rooms[you.room].robots[i].gestation == 1:
  115. # levels[currentlevel].rooms[you.room].robots.append(levels[currentlevel].rooms[you.room].robots[i].givebirth())
  116. # gameconsole.write(levels[currentlevel].rooms[you.room].robots[i].name + ' has given birth to ' + levels[currentlevel].rooms[you.room].robots[len(levels[currentlevel].rooms[you.room].robots) - 1].name)
  117. #draw everybody
  118. if fpsavg < 20:
  119. tooslow = tooslow + 1
  120. if tooslow > 30:
  121. print 'Dropped frame (fps: ' + str(fps[len(fps) - 1]) + ') (average fps for last 100 frames:' + str(fpsavg) + ')'
  122. dropframe = 1
  123. tooslow = 0
  124. else:
  125. tooslow = 0
  126. dropframe = 0
  127. if dropframe == 1:
  128. gameconsole.write('frame dropped (' + str(frametime) + ')')
  129. gameconsole.blit(screen, font)
  130. else:
  131. screen.blit(background, (0, 0))
  132. for i in range(len(levels[currentlevel].rooms[you.room].pickups)):
  133. if levels[currentlevel].rooms[you.room].pickups[i].pickuptype == 'fuel':
  134. screen.blit(fuelpic, (levels[currentlevel].rooms[you.room].pickups[i].x, levels[currentlevel].rooms[you.room].pickups[i].y))
  135. if levels[currentlevel].rooms[you.room].pickups[i].pickuptype == 'ammo':
  136. screen.blit(ammopic, (levels[currentlevel].rooms[you.room].pickups[i].x, levels[currentlevel].rooms[you.room].pickups[i].y))
  137. if levels[currentlevel].rooms[you.room].pickups[i].pickuptype == 'armor':
  138. screen.blit(armorpic, (levels[currentlevel].rooms[you.room].pickups[i].x, levels[currentlevel].rooms[you.room].pickups[i].y))
  139. for i in range(len(levels[currentlevel].rooms[you.room].bullets)):
  140. screen.blit(bulletpic[levels[currentlevel].rooms[you.room].bullets[i].rotate], (levels[currentlevel].rooms[you.room].bullets[i].x, levels[currentlevel].rooms[you.room].bullets[i].y))
  141. for i in range(len(levels[currentlevel].rooms[you.room].robots)):
  142. screen.blit(badtankpic[levels[currentlevel].rooms[you.room].robots[i].rotate], (levels[currentlevel].rooms[you.room].robots[i].x, levels[currentlevel].rooms[you.room].robots[i].y))
  143. screen.blit(goodtankpic[you.rotate], (you.x, you.y))
  144. for i in range(len(levels[currentlevel].rooms[you.room].obstacles)):
  145. screen.blit(obstaclepic[levels[currentlevel].rooms[you.room].obstacles[i].obstacletypenum], (levels[currentlevel].rooms[you.room].obstacles[i].x, levels[currentlevel].rooms[you.room].obstacles[i].y))
  146. for i in range(len(levels[currentlevel].rooms[you.room].doors)):
  147. screen.blit(doorpic[levels[currentlevel].rooms[you.room].doors[i].rotate], (levels[currentlevel].rooms[you.room].doors[i].x, levels[currentlevel].rooms[you.room].doors[i].y))
  148. del robotstats[:]
  149. del robotstatspic[:]
  150. for i in range(len(levels[currentlevel].rooms[you.room].robots)):
  151. robotag = levels[currentlevel].rooms[you.room].robots[i].name + ' '
  152. if levels[currentlevel].rooms[you.room].robots[i].state == 10:
  153. levels[currentlevel].rooms[you.room].robots[i].state = 0 #robotag = robotag + '(***mating w/ ' + levels[currentlevel].rooms[you.room].robots[i].partner + '***)'
  154. if levels[currentlevel].rooms[you.room].robots[i].state == 11:
  155. levels[currentlevel].rooms[you.room].robots[i].state = 0 #robotag = robotag + '(***gestating***)'
  156. robotstats.append(robotag)
  157. for i in range(len(robotstats)):
  158. robotstatspic.append(font.render(robotstats[i], True, (255, 0, 0)))
  159. for i in range(len(levels[currentlevel].rooms[you.room].robots)):
  160. screen.blit(robotstatspic[i], (levels[currentlevel].rooms[you.room].robots[i].x, levels[currentlevel].rooms[you.room].robots[i].y))
  161. if showconsole == 1:
  162. gameconsole.blit(screen, font)
  163. if showmeters == 1:
  164. pygame.draw.rect(screen, (64, 0, 0), (0, 470, you.heat / 20, 10))
  165. pygame.draw.rect(screen, (0, 0, 64), (110, 470, you.armor, 10))
  166. pygame.draw.rect(screen, (0, 64, 0), (220, 470, (you.fuel / 50), 10))
  167. pygame.draw.rect(screen, (32, 32, 64), (330, 470, you.ammo, 10))
  168. if you.velocity < -1:
  169. pygame.draw.rect(screen, (64, 64, 0), (450, 470, 25, 10))
  170. if you.velocity < 0:
  171. pygame.draw.rect(screen, (64, 64, 0), (475, 470, 25, 10))
  172. if you.velocity > 0:
  173. pygame.draw.rect(screen, (64, 64, 0), (500, 470, 25, 10))
  174. if you.velocity > 1:
  175. pygame.draw.rect(screen, (64, 64, 0), (525, 470, 25, 10))
  176. screen.blit(heattx, (0, 470))
  177. screen.blit(armortx, (110, 470))
  178. screen.blit(fueltx, (220, 470))
  179. screen.blit(ammotx, (330, 470))
  180. screen.blit(throttlex, (465, 470))
  181. if showfps == 1:
  182. fpsstring = 'fps: ' + str(fpsavg)
  183. fpspic = font.render(fpsstring, True, (255, 128, 0))
  184. screen.blit(fpspic, (640 - len(fpsstring) * 7, 0))
  185. dropframe = 0
  186. if firstframe == 1:
  187. letsgopic = font.render('LEVEL ' + str(currentlevel) + '...LET\'S GO!', True, (255, 255, 255))
  188. screen.blit(letsgopic, (257, 233))
  189. pygame.display.flip()
  190. letsgosound.play(0)
  191. for killsometime in range(10):
  192. screen.blit(badtankpic[you.rotate], (you.x, you.y))
  193. pygame.display.flip()
  194. pygame.time.wait(50)
  195. screen.blit(goodtankpic[you.rotate], (you.x, you.y))
  196. pygame.display.flip()
  197. pygame.time.wait(50)
  198. firstframe = 0
  199. pygame.display.flip()
  200. #everybody gets a turn
  201. for event in pygame.event.get():
  202. if event.type == KEYDOWN:
  203. if event.key == K_q:
  204. gameconsole.write('SELF-DESTRUCT')
  205. you.armor = 0
  206. elif event.key == K_f:
  207. if showfps == 0:
  208. showfps = 1
  209. elif showfps == 1:
  210. showfps = 0
  211. else:
  212. showfps = 0
  213. elif event.key == K_c:
  214. if showconsole == 0:
  215. showconsole = 1
  216. else:
  217. showconsole = 0
  218. elif event.key == K_m:
  219. if showmeters == 0:
  220. showmeters = 1
  221. else:
  222. showmeters = 0
  223. elif (event.key == K_UP) or (event.key == K_DOWN) or (event.key == K_LEFT) or (event.key == K_RIGHT) or (event.key == K_SPACE):
  224. didyoushoot = len(levels[currentlevel].rooms[you.room].bullets)
  225. you.control(event.key, levels[currentlevel].rooms[you.room].bullets, bang)
  226. if len(levels[currentlevel].rooms[you.room].bullets) > didyoushoot:
  227. shotsfired += 1
  228. else:
  229. code_entry.append(decoderkey(event.key))
  230. if pygame.time.get_ticks() % 2000 == 0:
  231. if len(entry_code) > 0:
  232. del code_entry[0]
  233. if code_entry == ['i', 'd']:
  234. del code_entry[:]
  235. gameconsole.write('this ain\'t doom, moron!')
  236. for i in range(15):
  237. punishment = open('savedbots/cicte', 'r')
  238. protobot = pickle.load(punishment)
  239. punishment.close
  240. protobot.x = you.x
  241. protobot.y = you.y
  242. protobot.moveable = 1
  243. protobot.dead = 0
  244. protobot.state = 0
  245. protobot.gestation = 0
  246. levels[currentlevel].rooms[you.room].robots.append(protobot)
  247. if code_entry == ['j', 'j', 'g', 'u', 'n']:
  248. del code_entry[:]
  249. gameconsole.write('ammo cheat')
  250. you.ammo = maxammo
  251. if code_entry == ['j', 'j', 'g', 'a', 's']:
  252. del code_entry[:]
  253. gameconsole.write('fuel cheat')
  254. you.fuel = maxfuel
  255. if code_entry == ['j', 'j', 's', 'u', 'i', 't']:
  256. del code_entry[:]
  257. gameconsole.write('armor cheat')
  258. you.armor = maxarmor
  259. if code_entry == ['j', 'j', 'k', 'o', 'o', 'l']:
  260. del code_entry[:]
  261. gameconsole.write('heat cheat')
  262. you.heat = 0
  263. if code_entry == ['j', 'j', 'k', 'i', 'l', 'l', 'a', 'l', 'l']:
  264. del code_entry[:]
  265. gameconsole.write('massacre cheat')
  266. for i in range(len(levels[currentlevel].rooms[you.room].robots)-1):
  267. levels[currentlevel].rooms[you.room].robots[i].armor = 1
  268. if code_entry == ['j', 'j', 's', 't', 'i', 'l', 'l']:
  269. gameconsole.write('still cheat')
  270. if stillcheat == 0:
  271. stillcheat = 1
  272. else:
  273. stillcheat = 0
  274. for i in range(len(levels[currentlevel].rooms[you.room].robots)):
  275. levels[currentlevel].rooms[you.room].robots[i].letsgo(levels[currentlevel].rooms[you.room].bullets, levels[currentlevel].rooms[you.room].pickups, levels[currentlevel].rooms[you.room].robots, you, bang, i)
  276. #move everybody
  277. if dropframe != 1:
  278. for i in range(len(levels[currentlevel].rooms[you.room].bullets)):
  279. levels[currentlevel].rooms[you.room].bullets[i].move()
  280. for i in range(len(levels[currentlevel].rooms[you.room].robots)):
  281. if stillcheat == 0:
  282. levels[currentlevel].rooms[you.room].robots[i].move()
  283. you.move() #if your machine is going too slow, you get bullet-time!
  284. if clipdoors > 0:
  285. clipdoors -= you.velocity
  286. if clipdoors < 0:
  287. clipdoors = 0
  288. #and now the expensive part: collision checks and shit
  289. for i in range(len(levels[currentlevel].rooms[you.room].doors)):
  290. if (detect_collision(you, tanksize, levels[currentlevel].rooms[you.room].doors[i], doorsize)) == 1 and (clipdoors == 0):
  291. clipdoors = doorsize * 2
  292. you.x = levels[currentlevel].rooms[you.room].doors[i].to_x
  293. you.y = levels[currentlevel].rooms[you.room].doors[i].to_y
  294. you.room = levels[currentlevel].rooms[you.room].doors[i].to_room
  295. pygame.draw.rect(screen, (0,0,0), (0,0,640,480))
  296. pygame.display.flip()
  297. background = pygame.image.load(levels[currentlevel].rooms[you.room].background).convert()
  298. gameconsole.write('Entering room #' + str(you.room + 1) + ' of ' + str(len(levels[currentlevel].rooms)) + ' of Level #' + str(currentlevel + 1))
  299. diesound.play(0)
  300. break
  301. for i in range(len(levels[currentlevel].rooms[you.room].obstacles)):
  302. if levels[currentlevel].rooms[you.room].obstacles[i].obstacletypenum == 2:
  303. usesize = wallsize
  304. else:
  305. usesize = obstaclesize
  306. if (detect_collision(you, tanksize, levels[currentlevel].rooms[you.room].obstacles[i], usesize)) == 1:
  307. bounce(you, levels[currentlevel].rooms[you.room].obstacles[i])
  308. clank.play(0)
  309. for j in range(len(levels[currentlevel].rooms[you.room].robots)):
  310. if (detect_collision(levels[currentlevel].rooms[you.room].robots[j], tanksize, levels[currentlevel].rooms[you.room].obstacles[i], usesize)) == 1:
  311. bounce(levels[currentlevel].rooms[you.room].robots[j], levels[currentlevel].rooms[you.room].obstacles[i])
  312. clank.play(0)
  313. for j in range(len(levels[currentlevel].rooms[you.room].bullets)):
  314. if (detect_collision(levels[currentlevel].rooms[you.room].bullets[j], bulletsize, levels[currentlevel].rooms[you.room].obstacles[i], usesize)) == 1:
  315. levels[currentlevel].rooms[you.room].bullets[j].dead = 1
  316. clank.play(0)
  317. if dropframe != 1:
  318. for i in range(len(levels[currentlevel].rooms[you.room].bullets)):
  319. if levels[currentlevel].rooms[you.room].bullets[i].offscreen() == 1:
  320. levels[currentlevel].rooms[you.room].bullets[i].dead = 1
  321. for i in range(len(levels[currentlevel].rooms[you.room].bullets)):
  322. if (detect_collision(levels[currentlevel].rooms[you.room].bullets[i], bulletsize, you, tanksize) == 1) and (levels[currentlevel].rooms[you.room].bullets[i].originator != you.name):
  323. you.armor = you.armor - 5
  324. for j in range(len(levels[currentlevel].rooms[you.room].robots)):
  325. if levels[currentlevel].rooms[you.room].bullets[i].originator == levels[currentlevel].rooms[you.room].robots[j].name:
  326. levels[currentlevel].rooms[you.room].robots[j].hits = levels[currentlevel].rooms[you.room].robots[j].hits + 1
  327. levels[currentlevel].rooms[you.room].robots[j].hitstilmating = levels[currentlevel].rooms[you.room].robots[j].hitstilmating - 1
  328. if levels[currentlevel].rooms[you.room].robots[j].hitstilmating < 5:
  329. levels[currentlevel].rooms[you.room].robots[j].hitstilmating = 5
  330. gameconsole.write((levels[currentlevel].rooms[you.room].robots[j].name + ' scored hit #' + str(levels[currentlevel].rooms[you.room].robots[j].hits)))
  331. levels[currentlevel].rooms[you.room].bullets[i].dead = 1
  332. clank.play(0)
  333. for i in range(len(levels[currentlevel].rooms[you.room].bullets)):
  334. for j in range(len(levels[currentlevel].rooms[you.room].robots)):
  335. if (detect_collision(levels[currentlevel].rooms[you.room].bullets[i], bulletsize, levels[currentlevel].rooms[you.room].robots[j], tanksize) == 1) and (levels[currentlevel].rooms[you.room].bullets[i].originator != levels[currentlevel].rooms[you.room].robots[j].name):
  336. levels[currentlevel].rooms[you.room].robots[j].armor = levels[currentlevel].rooms[you.room].robots[j].armor - 5
  337. if levels[currentlevel].rooms[you.room].bullets[i].originator == 'bitch':
  338. shotslanded += 1
  339. levels[currentlevel].rooms[you.room].bullets[i].dead = 1
  340. clank.play(0)
  341. for i in range(len(levels[currentlevel].rooms[you.room].pickups)):
  342. if detect_collision(levels[currentlevel].rooms[you.room].pickups[i], pickupsize, you, tanksize) == 1:
  343. if you.cangetpickup(levels[currentlevel].rooms[you.room].pickups[i].pickuptype):
  344. you.getpickup(levels[currentlevel].rooms[you.room].pickups[i].pickuptype)
  345. levels[currentlevel].rooms[you.room].pickups[i].dead = 1
  346. ping.play(0)
  347. for i in range(len(levels[currentlevel].rooms[you.room].pickups)):
  348. for j in range(len(levels[currentlevel].rooms[you.room].robots)):
  349. if detect_collision(levels[currentlevel].rooms[you.room].pickups[i], pickupsize, levels[currentlevel].rooms[you.room].robots[j], tanksize) == 1:
  350. if levels[currentlevel].rooms[you.room].robots[j].cangetpickup(levels[currentlevel].rooms[you.room].pickups[i].pickuptype):
  351. levels[currentlevel].rooms[you.room].robots[j].getpickup(levels[currentlevel].rooms[you.room].pickups[i].pickuptype)
  352. levels[currentlevel].rooms[you.room].pickups[i].dead = 1
  353. ping.play(0)
  354. for i in range(len(levels[currentlevel].rooms[you.room].robots)):
  355. if detect_collision(levels[currentlevel].rooms[you.room].robots[i], tanksize, you, tanksize) == 1:
  356. bounce(levels[currentlevel].rooms[you.room].robots[i], you)
  357. clank.play(0)
  358. for j in range(len(levels[currentlevel].rooms[you.room].robots)):
  359. if i != j:
  360. if detect_collision(levels[currentlevel].rooms[you.room].robots[i], tanksize, levels[currentlevel].rooms[you.room].robots[j], tanksize) == 1:
  361. bounce(levels[currentlevel].rooms[you.room].robots[i], levels[currentlevel].rooms[you.room].robots[j])
  362. clank.play(0)
  363. #and now for the sad part: coping with death
  364. if you.armor <= 0:
  365. diesound.play(0)
  366. screen.blit(background,(0,0))
  367. gameconsole.write('you got pwned. continue? y/N')
  368. gameconsole.blit(screen, font)
  369. pygame.display.flip()
  370. pygame.time.wait(1000)
  371. choicekey = 0
  372. signal.alarm(0)
  373. while choicekey != K_y:
  374. for event in pygame.event.get():
  375. if event.type == KEYDOWN:
  376. choicekey = event.key
  377. if event.key == K_y:
  378. signal.alarm(5)
  379. you.armor = maxarmor
  380. you.fuel = maxfuel
  381. you.ammo = maxammo
  382. you.room = 0
  383. background = pygame.image.load(levels[currentlevel].rooms[you.room].background).convert()
  384. you.x = levels[currentlevel].playerx
  385. you.y = levels[currentlevel].playery
  386. you.rotate = levels[currentlevel].playerrotate
  387. firstframe = 1
  388. gameconsole.write('continuing after getting pwned')
  389. elif event.key == K_n:
  390. latersound.play(0)
  391. pygame.time.wait(1500)
  392. return (-2, shotsfired, shotslanded, pygame.time.get_ticks() - leveltimezero)
  393. for i in range(len(levels[currentlevel].rooms[you.room].robots)):
  394. if levels[currentlevel].rooms[you.room].robots[i].armor <=0:
  395. levels[currentlevel].rooms[you.room].robots[i].dead = 1
  396. gameconsole.write(levels[currentlevel].rooms[you.room].robots[i].name + ' died.')
  397. #and getting rid of the bodies
  398. if dropframe != 1:
  399. for i in range(len(levels[currentlevel].rooms[you.room].robots)):
  400. if i < len(levels[currentlevel].rooms[you.room].robots):
  401. if levels[currentlevel].rooms[you.room].robots[i].dead == 1:
  402. del levels[currentlevel].rooms[you.room].robots[i]
  403. diesound.play(0)
  404. for i in range(len(levels[currentlevel].rooms[you.room].bullets)):
  405. if i < len(levels[currentlevel].rooms[you.room].bullets):
  406. if levels[currentlevel].rooms[you.room].bullets[i].dead == 1:
  407. del levels[currentlevel].rooms[you.room].bullets[i]
  408. for i in range(len(levels[currentlevel].rooms[you.room].pickups)):
  409. if i < len(levels[currentlevel].rooms[you.room].pickups):
  410. if levels[currentlevel].rooms[you.room].pickups[i].dead ==1:
  411. del levels[currentlevel].rooms[you.room].pickups[i]
  412. alldead = 1
  413. for i in range(len(levels[currentlevel].rooms)):
  414. if len(levels[currentlevel].rooms[i].robots) > 0:
  415. alldead = 0
  416. if alldead == 1:
  417. if currentlevel >= len(levels) - 1:
  418. print 'you beat the game.'
  419. return (-1, shotsfired, shotslanded, pygame.time.get_ticks() - leveltimezero)
  420. else:
  421. currentlevel += 1
  422. return (currentlevel, shotsfired, shotslanded, pygame.time.get_ticks() - leveltimezero)
  423. #and playing game warning sounds
  424. if you.armor < 50:
  425. if lowarmorflag == 0:
  426. lowarmorsound.play(0)
  427. lowarmorflag = 1
  428. else:
  429. lowarmorflag = 0
  430. if you.ammo < 10:
  431. if lowammoflag == 0:
  432. lowammosound.play(0)
  433. lowammoflag = 1
  434. else:
  435. lowammoflag = 0
  436. if you.fuel < 1000:
  437. if lowfuelflag == 0:
  438. lowfuelsound.play(0)
  439. lowfuelflag = 1
  440. else:
  441. lowfuelflag = 0
  442. if you.heat > 1000:
  443. if overheatflag == 0:
  444. overheatsound.play(0)
  445. overheatflag = 1
  446. elif you.heat < 950:
  447. overheatflag = 0
  448. #get the fps so we can act accordingly
  449. #if (framedelay > 1) and (framedelay < 16):
  450. #pygame.time.wait(framedelay)
  451. frametime = pygame.time.get_ticks() - framestarttime
  452. if frametime > 0: #you never know. if a frame is executed in less than 1 ms, don't worry about it
  453. fps.append(1000 / frametime)
  454. if len(fps) > 100:
  455. del fps[0]
  456. fpsavg = sum(fps) / len(fps)
  457. framestarttime = pygame.time.get_ticks()
  458. signal.alarm(0)
  459. def handler(signum, frame):
  460. print "CRASH! Frame got stuck!"
  461. raise SystemExit
  462. def main():
  463. levelfiles = ['levels/crisis']
  464. levels = []
  465. print 'loading level files...'
  466. for i in range(len(levelfiles)):
  467. protolevel = level()
  468. protolevel = protolevel.load(levelfiles[i])
  469. for j in range(len(protolevel.rooms)):
  470. print 'checking level ' + str(i + 1) + 'room ' + str(j) + '...'
  471. for k in range(len(protolevel.rooms[j].robots)):
  472. print 'loading robot ' + str(j) + '...'
  473. protolevel.rooms[j].robots[k].ammo = maxammo
  474. protolevel.rooms[j].robots[k].armor = maxarmor
  475. protolevel.rooms[j].robots[k].fuel = maxfuel
  476. protolevel.rooms[j].robots[k].gestating = 0
  477. protolevel.rooms[j].robots[k].hits = 0
  478. protolevel.rooms[j].robots[k].moveable = 1
  479. if len(protolevel.rooms[j].doors) < 0:
  480. print 'room #' + str(j) + ' has no doors.'
  481. raise SystemExit
  482. levels.append(protolevel)
  483. print 'Initializing pygame'
  484. pygame.init()
  485. print "Opening display 640x480 full-screen"
  486. screen = pygame.display.set_mode((640, 480))
  487. pygame.display.set_caption('EvoTank')
  488. pygame.mouse.set_visible(False)
  489. font = pygame.font.SysFont('Terminal', 14)
  490. titlepic = pygame.image.load('images/title.png').convert()
  491. screen.blit(titlepic, (0,0))
  492. pygame.display.flip()
  493. pygame.mixer.music.load('sounds/title.ogg')
  494. pygame.mixer.music.play(-1)
  495. go = 0
  496. while go == 0:
  497. for event in pygame.event.get():
  498. if event.type == KEYDOWN:
  499. if event.key == K_SPACE:
  500. go = 1
  501. currentlevel = 0
  502. while (currentlevel != -1) and (currentlevel != -2):
  503. currentlevel, shotsfired, shotslanded, time = mission(currentlevel, levels, screen)
  504. screen.blit(titlepic, (0,0))
  505. completepic = font.render('LEVEL COMPLETE', True, (255, 128, 0))
  506. if currentlevel == -2:
  507. completepic = font.render('YOU GOT PWNED', True, (255, 128, 0))
  508. shotsfiredpic = font.render('SHOTS FIRED: ' + str(shotsfired), True, (255, 128, 0))
  509. if shotsfired > 0:
  510. accuracypic = font.render('SHOTS LANDED: ' + str(shotslanded) + '(' + str(shotslanded * 100 / shotsfired) + '%)', True, (255, 128, 0))
  511. else:
  512. accuracypic = font.render('NO SHOTS FIRED', True, (255, 128, 0))
  513. levelseconds = time / 1000
  514. timesecs = levelseconds % 60
  515. timemins = (levelseconds - timesecs) / 60
  516. if timesecs < 10:
  517. strsecs = '0' + str(timesecs)
  518. else:
  519. strsecs = str(timesecs)
  520. time = str(timemins) + ':' + strsecs
  521. timepic = font.render('TIME: ' + time, True, (255, 128, 0))
  522. screen.blit(completepic, (300, 20))
  523. screen.blit(shotsfiredpic, (300, 100))
  524. screen.blit(accuracypic, (300, 114))
  525. screen.blit(timepic, (300, 128))
  526. pygame.display.flip()
  527. pygame.mixer.music.load('sounds/endlevels.ogg')
  528. pygame.mixer.music.play(-1)
  529. go = 0
  530. signal.alarm(0)
  531. while go == 0:
  532. for event in pygame.event.get():
  533. if event.type == KEYDOWN:
  534. if event.key == K_SPACE:
  535. go = 1
  536. raise SystemExit
  537. main()