Advertisement
Guest User

Untitled

a guest
Jun 28th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.54 KB | None | 0 0
  1. import random
  2. import codecs
  3. import math
  4.  
  5. POWER = 1.0/150.0
  6. CRASH = .3 #stdev of random factor in crash function
  7. LAPS = 70
  8. QUALIFYING = False
  9.  
  10. class Car:
  11. def __init__(self, turning, topspeed, braking, acceleration, pitting, tires, tiretype, time, bestlap, pits, team):
  12. self.t = turning
  13. self.s = topspeed
  14. self.b = braking
  15. self.a = acceleration
  16. self.p = pitting
  17. self.tires = tires
  18. self.tiretype = tiretype
  19. self.time = time
  20. self.bestlap = bestlap
  21. self.pits = pits
  22. self.team = team
  23. self.crash_flag = False
  24.  
  25. class Driver:
  26. def __init__(self, corners, overtaking, defending, tirewear, technical, adaptability, starting, number, name, relations):
  27. self.c = corners
  28. self.o = overtaking
  29. self.d = defending
  30. self.t = tirewear
  31. self.technical = technical
  32. self.a = adaptability
  33. self.startpos = starting
  34. self.num = number
  35. self.name = name
  36. self.relations = relations
  37.  
  38. class Track:
  39. def __init__(self, corners, technical, straights, weather, length):
  40. self.c = corners
  41. self.technical = technical
  42. self.s = straights
  43. self.w = weather
  44. self.l = length
  45.  
  46. def run_lap(track, qualifying, car, driver, car_ahead_time, driver_ahead_def, car_behind_time, lap, rainstat_flag, was_raining, was_wet, driver_ahead_num, driver_behind_num, pit_flag):
  47. base = track.l
  48. power1 = POWER
  49. power2 = POWER
  50. power3 = POWER
  51. power4 = POWER
  52. power5 = POWER
  53. power6 = POWER
  54. power7 = POWER
  55. power8 = POWER
  56. power9 = POWER
  57. power10 = POWER
  58. if car.t > track.c:
  59. power1 = POWER*1/car.t**(1.0/3.0)
  60. if driver.c > track.c:
  61. power2 = POWER*1/driver.c**(1.0/3.0)
  62. if car.s > track.s:
  63. power3 = POWER*1/car.s**(1.0/3.0)
  64. if car.b > track.c:
  65. power4 = POWER*1/car.b**(1.0/3.0)
  66. if car.b > track.technical:
  67. power5 = POWER*1/car.b**(1.0/3.0)
  68. if driver.t > track.c:
  69. power6 = POWER*1/driver.t**(1.0/3.0)
  70. if driver.t > track.technical:
  71. power7 = POWER*1/driver.t**(1.0/3.0)
  72. if car.a > track.c:
  73. power8 = POWER*1/car.a**(1.0/3.0)
  74. if car.a > track.technical:
  75. power9 = POWER*1/car.a**(1.0/3.0)
  76. if driver.technical > track.technical:
  77. power10 = POWER*1/driver.technical**(1.0/3.0)
  78. cornering = (1/(car.t/track.c)**power1 + 1/(driver.c/track.c)**power2)/2
  79. topspeed = 1/(car.s/track.s)**power3
  80. braking = (1/(car.b/track.c)**power4 + 1/(car.b/track.technical)**power5)/2
  81. acceleration = (1/(car.a/track.c)**power8 + 1/(car.a/track.technical)**power9)/2
  82. brkacc = (1/(driver.t/track.c)**power6 + 1/(driver.t/track.technical)**power7)/2
  83. technical = 1/(driver.technical/track.technical)**power10
  84. wear = 1/(car.tires/80)**(POWER*2)
  85.  
  86. #determine if it's raining for status updates
  87. if rainstat_flag == True and intensity[int(math.floor(car.time/60))] > 0 and was_raining == False:
  88. print "it has begun to rain"
  89. crashes.append((driver.name,4,lap,False))
  90. was_raining = True
  91. was_wet = True
  92. if rainstat_flag == True and intensity[int(math.floor(car.time/60))] == 0 and was_raining == True:
  93. print "the rain has ended"
  94. crashes.append((driver.name,5,lap,False))
  95. was_raining = False
  96. if rainstat_flag == True and wetness[int(math.floor(car.time/60))] == 0 and was_wet == True:
  97. print "track is dry"
  98. crashes.append((driver.name,6,lap,False))
  99. was_wet = False
  100.  
  101. #weather effects
  102. current_wetness = wetness[int(math.floor(car.time/60))]
  103. if car.tiretype == "DRY":
  104. weather = (95/90-1)*track.l*current_wetness*2*math.exp(-driver.a/10) #base 5 s per 90 s lap * wetness parameter * adaptability
  105. else: #on wets
  106. weather = ((95/90-1)*track.l*(1-current_wetness)*2+2)*math.exp(-driver.a/10)
  107.  
  108. #tirewear
  109. tirewear = track.l/40 * (1/track.c**POWER + 1/track.technical**POWER)/2 * 1/(driver.t)**POWER * 1/(car.tires/100)**.5 #base * track length * track wear * driver skill * how worn tires are already
  110. if car.tiretype == "WET":
  111. tirewear *= ((1-current_wetness)*2+1)*math.exp(-driver.a/10) #if the track is dry rip your tires, it's fine if this is < 1 though cause wet tires stronk
  112. car.tires -= tirewear
  113.  
  114. #overtaking
  115. overtaking = 1
  116. overtaking_flag = False
  117. pit = False
  118. pit_time = 0
  119. relation_time = 1
  120. if qualifying == False:
  121. if car.time - car_ahead_time < 1 and driver_ahead_num != None:
  122. '''if driver.o >= driver_ahead_def:
  123. overtaking = 1/(driver.o/driver_ahead_def)**POWER * 1.01
  124. else:
  125. overtaking = 1/(driver.o/driver_ahead_def/2)**POWER * 1.01'''
  126. if driver_ahead_num != None and relations[str(driver_ahead_num)][str(driver.num)] < 0:
  127. driver_ahead_def += 1 #increase defense of driver ahead if they're your rival
  128. overtaking = 1/(driver.o/driver_ahead_def)**POWER * 1.01 #delete this line ONLY if you add the commented part back in
  129.  
  130. #relations affecting lap times
  131. avgrel = (relations[str(driver_ahead_num)][str(driver.num)] + relations[str(driver.num)][str(driver_ahead_num)])/2
  132. relation_time *= 1/(math.fabs(avgrel)/100+.01)**(POWER/2)
  133.  
  134. if driver_ahead_num != None:
  135. relations[str(driver.num)][str(driver_ahead_num)] += base/90
  136. if car_behind_time - car.time < 1:
  137. overtaking = 1.01
  138.  
  139. #relations affecting lap times
  140. avgrel = (relations[str(driver_behind_num)][str(driver.num)] + relations[str(driver.num)][str(driver_behind_num)])/2
  141. print avgrel
  142. relation_time *= 1/(math.fabs(avgrel)/100+.01)**(POWER/2)
  143.  
  144. if driver_behind_num != None:
  145. relations[str(driver.num)][str(driver_behind_num)] += base/90
  146.  
  147. #pitting
  148. #if you pit you automatically replace your tires
  149. if car.tires < 40 and random.random() < .5:
  150. pit = True
  151. elif car.tires < 30 and random.random() < .75:
  152. pit = True
  153. elif car.tires < 20 and random.random() < .9:
  154. pit = True
  155. elif car.tires < 10:
  156. pit = True
  157. #set appropriate tire type when track conditions change
  158. if current_wetness <= .5 and car.tiretype == "WET":
  159. car.tiretype = "DRY"
  160. pit = True
  161. elif current_wetness >= .5 and car.tiretype == "DRY":
  162. car.tiretype = "WET"
  163. pit = True
  164. if pit == True:
  165. pit_time = 12 + 5 * 1/(car.p/5)**(POWER*20) + random.random()-.5
  166. pit_time += current_wetness #a little slower if it's wet
  167. car.tires = 100
  168. car.pits += 1
  169. else:
  170. pit_time = 0
  171.  
  172. #crashing
  173. #high tire wear, poor skill, weather, and overtaking play into whether or not you will crash each lap
  174. #three types of crashes: small mistake/disruption, off the course (requires pit), race-ruining (driver dnfs)
  175. crash = 1 + 1/car.tires*10 + (track.c/car.t + track.c/driver.c + track.technical/driver.technical)/30 + random.gauss(0, CRASH)
  176. out = False
  177. out2 = False
  178. pit2 = False
  179. temp_crash = 0
  180. temp_crash2 = 0
  181. crash_prob = .1 * 130.0/track.l * 1/(car.tires) + (track.c/car.t + track.c/driver.c + track.technical/driver.technical)/3000 * (1+current_wetness*math.exp(-driver.a/10))
  182.  
  183. #crash into the people
  184. if driver_behind_num != None:
  185. behind_crash_probability = .01*2**(-relations[str(driver_behind_num)][str(driver.num)]/100)
  186. else:
  187. behind_crash_probability = 0
  188.  
  189. if random.random() < behind_crash_probability and car.crash_flag == False:
  190. relations[str(driver.num)][str(driver_behind_num)] -= 15
  191. #affect them or you
  192. who = .5
  193. if relations[str(driver.num)][str(driver_behind_num)] < 0:
  194. who = .5 -relations[str(driver_behind_num)][str(driver.num)]/400 #.75 for -100
  195. if random.random() < who: #you crash
  196. type = random.random() * 10
  197. car.crash_flag = True
  198. if type < 8:
  199. print 'crash (small)'
  200. temp_crash = 7
  201. crash_time = random.gauss(1.5 * (1+current_wetness),.5 * (1+current_wetness))
  202. relations[str(driver.num)][str(driver_behind_num)] -= 15
  203. elif type < 9:
  204. print 'crash (pits) %s %s' % (driver_behind_num, driver.num)
  205. temp_crash = 8
  206. crash_time = 12 + 5 * 1/(car.p/5)**(POWER*20) * (crash) + random.random()-.5 #pitting plus severity of crash for repairs
  207. crash_time += current_wetness #a little slower if it's wet
  208. car.tires = 100
  209. car.pits += 1
  210. pit = True
  211. relations[str(driver.num)][str(driver_behind_num)] -= 35
  212. else:
  213. print 'crash (out)'
  214. temp_crash = 9
  215. crash_time = 0
  216. out = True
  217. relations[str(driver.num)][str(driver_behind_num)] -= 75
  218. if random.random() < .5: #they crash
  219. type = random.random() * 10
  220. d_cars[str(driver_behind_num)].crash_flag = True
  221. if type < 8:
  222. print 'crash (small)'
  223. temp_crash2 = 7
  224. crash_time2 = random.gauss(1.5 * (1+current_wetness),.5 * (1+current_wetness))
  225. relations[str(driver_behind_num)][str(driver.num)] -= 15
  226. elif type < 9:
  227. print 'crash (pits) %s %s' % (driver_behind_num, driver.num)
  228. temp_crash2 = 8
  229. crash_time2 = 12 + 5 * 1/(car.p/5)**(POWER*20) * (crash) + random.random()-.5 #pitting plus severity of crash for repairs
  230. crash_time2 += current_wetness #a little slower if it's wet
  231. d_cars[str(driver_behind_num)].tires = 100
  232. d_cars[str(driver_behind_num)].pits += 1
  233. pit2 = True
  234. relations[str(driver_behind_num)][str(driver.num)] -= 35
  235. else:
  236. print 'crash (out)'
  237. temp_crash2 = 9
  238. crash_time2 = 0
  239. out2 = True
  240. relations[str(driver_behind_num)][str(driver.num)] -= 75
  241. d_cars[str(driver_behind_num)].time += crash_time2
  242. ast1 = ''
  243. ast2 = ''
  244. if temp_crash != 0:
  245. ast1 = '*'
  246. if temp_crash2 != 0:
  247. ast2 = '*'
  248. p = "%s%s collided with %s%s on lap %s" % (d_drivers[str(driver_behind_num)].name, ast2, driver.name, ast1, lap)
  249. if temp_crash2 == 8 and temp_crash == 8:
  250. p += ", causing both to make a pit stop to repair damage"
  251. elif temp_crash2 == 8 and temp_crash == 9:
  252. p += ", causing %s to make a pit stop to repair damage and resulting in the retirement of %s" % (d_drivers[str(driver_behind_num)].name, driver.name)
  253. elif temp_crash2 == 9 and temp_crash == 8:
  254. p += ", causing %s to make a pit stop to repair damage and resulting in the retirement of %s" % (driver.name, d_drivers[str(driver_behind_num)].name)
  255. elif temp_crash2 == 9 and temp_crash == 9:
  256. p += ", resulting in both drivers' retirement"
  257. elif temp_crash == 8:
  258. p += ", causing %s to make a pit stop to repair damage" % driver.name
  259. elif temp_crash2 == 8:
  260. p += ", causing %s to make a pit stop to repair damage" % d_drivers[str(driver_behind_num)].name
  261. elif temp_crash2 == 9:
  262. p += ", resulting in the retirement of %s" % d_drivers[str(driver_behind_num)].name
  263. elif temp_crash == 9:
  264. p += ", resulting in the retirement of %s" % driver.name
  265. crashes.append((p, 0))
  266.  
  267. if random.random() < crash_prob and car.crash_flag == False:
  268. type = random.random() * 10
  269. car.crash_flag = True
  270. if type < 8:
  271. print 'crash (small)'
  272. crashes.append((driver.name,1,lap,overtaking_flag))
  273. crash_time = random.gauss(1.5 * (1+current_wetness),.5 * (1+current_wetness))
  274. elif type < 9:
  275. print 'crash (pits)'
  276. crashes.append((driver.name,2,lap,overtaking_flag))
  277. crash_time = 12 + 5 * 1/(car.p/5)**(POWER*20) * (crash) + random.random()-.5 #pitting plus severity of crash for repairs
  278. crash_time += current_wetness #a little slower if it's wet
  279. car.tires = 100
  280. car.pits += 1
  281. pit = True
  282. else:
  283. print 'crash (out)'
  284. crashes.append((driver.name,3,lap,overtaking_flag))
  285. crash_time = 0
  286. out = True
  287. else:
  288. crash_time = 0
  289.  
  290. if pit_flag == True:
  291. pit = True
  292.  
  293. laptime = base * cornering * topspeed * braking * acceleration * brkacc * technical * wear * overtaking * relation_time + weather + pit_time + crash_time + random.random()-.5
  294. car.time += laptime
  295. return laptime, pit, pit2, car.tiretype, out, out2, was_raining, was_wet
  296.  
  297. #read in relations
  298. f = open('relations.txt', 'r')
  299. k = f.readlines()
  300. relations = {}
  301. for line in k:
  302. l = line.strip().split(',')
  303. num = l[0]
  304. if int(num) < 10:
  305. num = " " + num
  306. l.pop(0)
  307. d = {}
  308. for data in l:
  309. m = data.split(':')
  310. d[m[0]] = 0.75*float(m[1].lstrip()) #regress toward the mean each race
  311. relations[num] = d
  312.  
  313. cars = []
  314. drivers = []
  315.  
  316. retcars = []
  317. retdrivers = []
  318. crashes = []
  319.  
  320. track1 = Track(10.0, 10.0, 10.0, 0, 30.0)
  321. kaeshar_gp = Track(5.0, 4.0, 7.0, 6, 100.10)
  322. aeridani_gp = Track(3.0, 8.0, 2.0, 8, 89.84)
  323. ethanthova_gp = Track(3.0, 2.0, 6.0, 2, 55.40)
  324. tjedigar_gp = Track(3.0, 6.0, 1.0, 3, 104.22)
  325. aiyota_gp = Track(2.0, 9.0, 10.0, 6, 84.03)
  326. czalliso_gp = Track(5.0, 10.0, 5.0, 3, 117.53)
  327. blaland_gp = Track(10.0, 9.0, 7.0, 4, 100.22)
  328. sagua_gp = Track(10.0, 5.0, 1.0, 5, 88.78)
  329. aahrus_gp = Track(8.0, 6.0, 5.0, 6, 131.70)
  330. auspikitan_gp = Track(2.0, 7.0, 3.0, 5, 106.16)
  331. darvincia_gp = Track(5.0, 2.0, 5.0, 4, 103.36)
  332. wyverncliff_gp = Track(5.0, 1.0, 2.0, 5, 90.00)
  333. solea_gp = Track(7.0, 8.0, 9.0, 7, 122.68)
  334. barsein_gp = Track(5.0, 7.0, 1.0, 1, 106.24)
  335. dotruga_gp = Track(4.0, 6.0, 5.0, 4, 121.51)
  336. bielosia_gp = Track(8.0, 1.0, 7.0, 4, 86.55)
  337. bongatar_gp = Track(5.0, 5.0, 4.0, 4, 77.20)
  338. space_gp = Track(1.0, 1.0, 10.0, 0, 73.63)
  339. # TURN SPD BRAK ACC PIT
  340. cars.append(Car(6.0, 9.0, 6.0, 7.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Team Solea Racing"))
  341. cars.append(Car(6.0, 9.0, 6.0, 7.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Team Solea Racing"))
  342. cars.append(Car(6.0, 9.0, 6.0, 7.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Team Solea Racing"))
  343. cars.append(Car(6.0, 7.0, 6.0, 7.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Dotruga Formula Racing"))
  344. cars.append(Car(6.0, 7.0, 6.0, 7.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Dotruga Formula Racing"))
  345. cars.append(Car(6.0, 7.0, 6.0, 7.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Dotruga Formula Racing"))
  346. cars.append(Car(6.0, 7.0, 6.0, 7.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Cows Go Moo Racing"))
  347. cars.append(Car(6.0, 7.0, 6.0, 7.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Cows Go Moo Racing"))
  348. cars.append(Car(6.0, 7.0, 6.0, 7.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Cows Go Moo Racing"))
  349. cars.append(Car(6.0, 8.0, 6.0, 6.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "BONGATAR"))
  350. cars.append(Car(6.0, 8.0, 6.0, 6.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "BONGATAR"))
  351. cars.append(Car(6.0, 8.0, 6.0, 6.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "BONGATAR"))
  352. cars.append(Car(5.0, 10.0, 3.0, 9.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Team V.V. Imperial"))
  353. cars.append(Car(5.0, 10.0, 3.0, 9.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Team V.V. Imperial"))
  354. cars.append(Car(5.0, 10.0, 3.0, 9.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Team V.V. Imperial"))
  355. cars.append(Car(8.0, 7.0, 7.0, 7.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Team Diigikwk Racers"))
  356. cars.append(Car(8.0, 7.0, 7.0, 7.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Team Diigikwk Racers"))
  357. cars.append(Car(8.0, 7.0, 7.0, 7.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Team Diigikwk Racers"))
  358. cars.append(Car(5.0, 5.0, 3.0, 4.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Team Vincent"))
  359. cars.append(Car(5.0, 5.0, 3.0, 4.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Team Vincent"))
  360. cars.append(Car(5.0, 5.0, 3.0, 4.0, 1.0, 100.0, "DRY", 0.0, 999.0, 0, "Team Vincent"))
  361. cars.append(Car(5.0, 7.0, 3.0, 4.0, 2.0, 100.0, "DRY", 0.0, 999.0, 0, "Team Blaland Racing"))
  362. cars.append(Car(5.0, 7.0, 3.0, 4.0, 2.0, 100.0, "DRY", 0.0, 999.0, 0, "Team Blaland Racing"))
  363. cars.append(Car(5.0, 7.0, 3.0, 4.0, 2.0, 100.0, "DRY", 0.0, 999.0, 0, "Team Blaland Racing"))
  364. # CRN OVTK DEF FINE TECH ADPT
  365. drivers.append(Driver(6.0, 6.0, 2.0, 4.0, 5.0, 3.0, 17, 47, u"ketila léqa pavúteka", relations["47"]))
  366. drivers.append(Driver(5.0, 3.0, 4.0, 3.0, 2.0, 2.0, 10, 19, u"khélok atep zailunaɰ", relations["19"]))
  367. drivers.append(Driver(3.0, 2.0, 3.0, 5.0, 2.0, 1.0, 5, 31, u"xap'ít celentir šaŋév", relations["31"]))
  368. drivers.append(Driver(5.0, 5.0, 4.0, 6.0, 7.0, 4.0, 1, 29, "Sago Aludetsei", relations["29"]))
  369. drivers.append(Driver(4.0, 2.0, 3.0, 2.0, 4.0, 1.0, 23, 11, "Tuto Keget", relations["11"]))
  370. drivers.append(Driver(4.0, 2.0, 4.0, 3.0, 2.0, 1.0, 20, 98, "Gorga Motxev", relations["98"]))
  371. drivers.append(Driver(4.0, 3.0, 3.0, 3.0, 3.0, 1.0, 9, 41, "Olga Candy", relations["41"]))
  372. drivers.append(Driver(4.0, 3.0, 3.0, 3.0, 2.0, 1.0, 13, 69, "Marisa Sanchez", relations["69"]))
  373. drivers.append(Driver(9.0, 6.0, 3.0, 5.0, 4.0, 1.0, 4, 42, "Frank Oosterhout", relations["42"]))
  374. drivers.append(Driver(7.0, 7.0, 5.0, 6.0, 7.0, 5.0, 11, 30, "Josh Wise", relations["30"]))
  375. drivers.append(Driver(3.0, 3.0, 4.0, 1.0, 5.0, 1.0, 19, " 2", "Body Hide", relations[" 2"]))
  376. drivers.append(Driver(1.0, 2.0, 1.0, 5.0, 5.0, 1.0, 16, " 3", "Bob", relations[" 3"]))
  377. drivers.append(Driver(7.0, 8.0, 3.0, 5.0, 4.0, 4.0, 2, 80, u"Ifloenne é Aya", relations["80"]))
  378. drivers.append(Driver(4.0, 3.0, 2.0, 4.0, 3.0, 1.0, 15, 81, u"Lyǽs Kæræsekæræn", relations["81"]))
  379. drivers.append(Driver(4.0, 4.0, 3.0, 3.0, 3.0, 1.0, 12, " 1", "Robbie Rotten", relations[" 1"]))
  380. drivers.append(Driver(3.0, 5.0, 4.0, 3.0, 4.0, 2.0, 6, 74, u"Bařàsiz Konoca", relations["74"]))
  381. drivers.append(Driver(1.0, 2.0, 2.0, 4.0, 7.0, 1.0, 14, 94, u"Jašo Neχëhe", relations["94"]))
  382. drivers.append(Driver(2.0, 1.0, 3.0, 4.0, 6.0, 2.0, 7, 53, u"Ešuro Tàcràɰë", relations["53"]))
  383. drivers.append(Driver(5.0, 5.0, 5.0, 5.0, 2.0, 2.0, 18, 20, "Mac", relations["20"]))
  384. drivers.append(Driver(6.0, 6.0, 5.0, 3.0, 2.0, 2.0, 22, 21, "Orson", relations["21"]))
  385. drivers.append(Driver(5.0, 5.0, 5.0, 5.0, 2.0, 2.0, 21, 22, "Philipe", relations["22"]))
  386. drivers.append(Driver(8.0, 5.0, 2.0, 5.0, 7.0, 3.0, 3, " 4", "Zaku Blaxon", relations[" 4"]))
  387. drivers.append(Driver(2.0, 2.0, 1.0, 1.0, 2.0, 1.0, 24, " 5", "Naxan Noxokolonaxon", relations[" 5"]))
  388. drivers.append(Driver(4.0, 3.0, 2.0, 4.0, 4.0, 2.0, 8, 44, "Kaxon Kaxutak", relations["44"]))
  389. #1 2 3 4 5 11 19 20 21 22 29 30 31 41 42 44 47 53 69 74 80 81 94 98
  390.  
  391. d_cars = {}
  392. d_drivers = {}
  393.  
  394. for car, driver in zip(cars, drivers):
  395. d_cars[str(driver.num)] = car
  396. d_drivers[str(driver.num)] = driver
  397.  
  398. TRACK = kaeshar_gp
  399.  
  400. #generate weather conditions
  401. wet = 0
  402. wetness = []
  403. intensity = []
  404. seconds_of_rain_left = 0.0
  405. if TRACK.w == 1: #desert winter
  406. rfreq = 3.0
  407. rint = 4.0
  408. rdur = 7.0
  409. elif TRACK.w == 2: #desert summer
  410. rfreq = 3.0
  411. rint = 7.0
  412. rdur = 3.0
  413. elif TRACK.w == 3: #temperate winter
  414. rfreq = 7.0
  415. rint = 5.0
  416. rdur = 9.0
  417. elif TRACK.w == 4: #temperate summer
  418. rfreq = 4.0
  419. rint = 2.0
  420. rdur = 2.0
  421. elif TRACK.w == 5: #tropics wet
  422. rfreq = 5.0
  423. rint = 9.0
  424. rdur = 5.0
  425. elif TRACK.w == 6: #tropics dry
  426. rfreq = 1.0
  427. rint = 7.0
  428. rdur = 4.0
  429. elif TRACK.w == 7: #subtropic winter
  430. rfreq = 4.0
  431. rint = 4.0
  432. rdur = 7.0
  433. elif TRACK.w == 8: #subtropic summer
  434. rfreq = 5.0
  435. rint = 6.0
  436. rdur = 5.0
  437. elif TRACK.w == 0: #space
  438. rfreq = 0.0
  439. rint = 0.0
  440. rdur = 0.0
  441. else:
  442. print 'no weather'
  443. #is it raining at start?
  444. if random.random() < rfreq/20.0: #it is raining
  445. RAIN_FLAG = True
  446. WET_FLAG = True
  447. #how long has it been raining?
  448. seconds_rained = random.random()*rdur*720 #seconds rained for
  449. #how wet is the track?
  450. initial_wetness = rint*seconds_rained/5/720
  451. if initial_wetness > 1:
  452. initial_wetness = 1.0
  453. wetness.append(initial_wetness)
  454. wet = initial_wetness
  455. #how heavily is it raining?
  456. intensity.append(math.fabs(random.gauss(rint, rint/5.0)))
  457. #how long will it continue to rain for?
  458. seconds_of_rain_left = math.fabs(random.gauss(1, .2))*rdur*720
  459. seconds_of_rain_left -= seconds_rained
  460. if seconds_of_rain_left < 0:
  461. seconds_of_rain_left = 0
  462. print 'it is raining'
  463. else: #it is dry
  464. RAIN_FLAG = False
  465. WET_FLAG = False
  466. wetness.append(0.0)
  467. intensity.append(0.0)
  468.  
  469. #fill in weather values for every 60 seconds
  470. for min in xrange(0, 240): #run for 4 hours
  471. #it needs to start raining randomly during the race
  472. if seconds_of_rain_left <= 0: #it's not raining
  473. intflag = False
  474. if random.random() < rfreq/20/120: #chance per minute to start raining
  475. #how heavily is it raining?
  476. intensity.append(math.fabs(random.gauss(rint, rint/5.0)))
  477. intflat = True
  478. #update track wetness
  479. wet += intensity[-1]*60/5/720
  480. #how long will it continue to rain for?
  481. seconds_of_rain_left = math.fabs(random.gauss(1, .2))*rdur*720
  482. if intflag == False:
  483. intensity.append(0.0)
  484. wet -= .003 + wetness[-1]**2/10 #track dries automatically
  485. if wet > 1:
  486. wetness.append(1.0)
  487. elif wet < 0:
  488. wetness.append(0.0)
  489. else:
  490. wetness.append(wet)
  491. else: #it's raining
  492. seconds_of_rain_left -= 60
  493. #how heavily is it raining?
  494. intensity.append(math.fabs(random.gauss(rint, rint/5.0)))
  495. #update track wetness
  496. wet += intensity[-1]*60/5/720
  497. wet -= .003 + wetness[-1]**2/10 #track dries automatically
  498. if wet > 1:
  499. wetness.append(1.0)
  500. elif wet < 0:
  501. wetness.append(0.0)
  502. else:
  503. wetness.append(wet)
  504.  
  505. wfile = open("wetness.txt", "w+")
  506. for value in wetness:
  507. wfile.write("%.3f\n" % value)
  508. wfile.close()
  509.  
  510. #determine starting tire
  511. if wetness[0] > 0.5:
  512. starting_tire_type = "WET"
  513. else:
  514. starting_tire_type = "DRY"
  515.  
  516. #starting grid
  517. if QUALIFYING == False:
  518. for car, driver in zip(cars, drivers):
  519. car.time = (driver.startpos-1)/2/10.0
  520.  
  521. #race
  522. file = codecs.open("yay.txt", "w", "utf-8") #open output file
  523. file.write("-- LAP TIMES --\n")
  524. #lap 0 stats first
  525. lap_stats = []
  526. for car, driver in zip(cars, drivers):
  527. lap_stats.append((driver.num, car.time, False)) #lap 0 stats
  528. car.tiretype = starting_tire_type #update starting tires to wet if needed
  529.  
  530. file.write('Lap 0\t')
  531.  
  532. temp = zip(cars, drivers, lap_stats)
  533. temp.sort(key=lambda x: x[0].time, reverse=False)
  534. cars, drivers, lap_stats = [list(a) for a in zip(*temp)]
  535.  
  536. for stat in lap_stats:
  537. pit = " "
  538. if stat[2] == True:
  539. pit = stat[3] #DRY or WET
  540. q = "%s %.3f %s\t" % (stat[0], stat[1], pit)
  541. file.write(q)
  542. file.write('\n')
  543. #now really race
  544. for k in xrange(0,LAPS):
  545. lap_stats = []
  546. retire = []
  547.  
  548. prev_lap_times = [] #total times saved before the start of the lap simulation, for crash usage
  549. for car in cars:
  550. prev_lap_times.append(car.time)
  551.  
  552. last_time = 0 #first car is not behind anyone
  553. last_def = 1 #...
  554. last_driver = None #...
  555. next_time = 0 #for when the last car is not ahead of anyone
  556. i = 0 #index for getting driver_behind's distance
  557.  
  558. pit_flag = False #for crashes
  559.  
  560. file.write('Lap %i\t' % (k+1))
  561.  
  562. for car, driver in zip(cars, drivers):
  563. i += 1
  564. if i <= len(cars)-1:
  565. next_time = cars[i].time
  566. next_driver = drivers[i].num
  567. else:
  568. next_time = 1000000000000
  569. next_driver = None
  570. RAIN_STATUS_FLAG = False
  571. if i == 1:
  572. RAIN_STATUS_FLAG = True
  573. laptime, pit, pit2, tire, out, out2, RAIN_FLAG, WET_FLAG = run_lap(TRACK, QUALIFYING, car, driver, last_time, last_def, next_time, k+1, RAIN_STATUS_FLAG, RAIN_FLAG, WET_FLAG, last_driver, next_driver, pit_flag)
  574. laptime = car.time - prev_lap_times[i-1]
  575. lap_stats.append((driver.num, laptime, pit, tire))
  576.  
  577. if laptime < car.bestlap:
  578. car.bestlap = laptime
  579.  
  580. if pit2 == True:
  581. pit_flag = True
  582. else:
  583. pit_flag = False
  584.  
  585. if out == True and i-1 not in retire:
  586. retire.append(i-1)
  587.  
  588. if out2 == True:
  589. retire.append(i)
  590.  
  591. last_time = car.time - laptime #subtract previous laptime because it was just updated
  592. last_def = driver.d
  593. last_driver = driver.num
  594.  
  595. j = 0
  596. for retiree_index in retire:
  597. retcars.append(cars.pop(retiree_index-j))
  598. retdrivers.append(drivers.pop(retiree_index-j))
  599. j += 1
  600.  
  601. temp = zip(cars, drivers, lap_stats)
  602. temp.sort(key=lambda x: x[0].time, reverse=False)
  603. cars, drivers, lap_stats = [list(a) for a in zip(*temp)]
  604.  
  605. for stat in lap_stats:
  606. pit = " "
  607. if stat[2] == True:
  608. pit = stat[3] #DRY or WET
  609. q = "%s %.3f %s\t" % (stat[0], stat[1], pit)
  610. file.write(q)
  611. file.write('\n')
  612.  
  613. #final results
  614. temp = zip(cars, drivers)
  615. if QUALIFYING == False:
  616. temp.sort(key=lambda x: x[0].time, reverse=False)
  617. if QUALIFYING == True:
  618. temp.sort(key=lambda x: x[0].bestlap, reverse=False)
  619. cars, drivers = zip(*temp)
  620.  
  621. if len(retcars) > 0:
  622. temp = zip(retcars, retdrivers)
  623. temp.sort(key=lambda x: x[0].time, reverse=True)
  624. retcars, retdrivers = zip(*temp)
  625.  
  626. i = 0
  627. file.write("\n-- OFFICIAL RESULTS --\n")
  628. file.write("Pos\t#No\tDriver\t\t\t\t\t\tTeam\t\t\t\t\tTime\t\tDiff\t\tPits\tBest\n")
  629. first = cars[0].time
  630. for car, driver in zip(cars,drivers):
  631. i += 1
  632. if i < 10:
  633. i1 = "0%i" % i
  634. else:
  635. i1 = i
  636. last_name = driver.name.split(' ')[-1][:3].upper()
  637. hours = car.time/3600
  638. minutes = car.time%3600/60
  639. seconds = car.time%60
  640. if seconds < 10:
  641. seconds = "0%.3f" % seconds
  642. else:
  643. seconds = "%.3f" % seconds
  644. diff = car.time - first
  645.  
  646. #truncate yqtnames
  647. if len(driver.name) > 23:
  648. driver_name = driver.name[:23]
  649. else:
  650. driver_name = driver.name
  651. tab1t = len(driver_name)/4
  652. tab1 = "\t"*(6-tab1t)
  653. tab2t = len(car.team)/4
  654. tab2 = "\t"*(6-tab2t)
  655. diff = "%.3f" % diff
  656. tab3t = (len(str(diff))+1)/4
  657. tab3 = "\t"*(3-tab3t)
  658. p = "%s\t#%s\t%s\t%s%s%s%s%i:%i:%s\t-%s%s%i\t\t%.3f\n" % (i1, driver.num, last_name, driver_name, tab1, car.team, tab2, hours,minutes,seconds, diff, tab3, car.pits, car.bestlap)
  659. file.write(p)
  660.  
  661. for car, driver in zip(retcars, retdrivers):
  662. i += 1
  663. last_name = driver.name.split(' ')[-1][:3].upper()
  664.  
  665. #truncate yqtnames
  666. if len(driver.name) > 23:
  667. driver_name = driver.name[:23]
  668. else:
  669. driver_name = driver.name
  670. tab1t = len(driver_name)/4
  671. tab1 = "\t"*(6-tab1t)
  672. tab2t = len(car.team)/4
  673. tab2 = "\t"*(6-tab2t)
  674.  
  675. p = "%s\t#%s\t%s\t%s%s%s%sRETIRED\t\tDNF\t\t\t%i\t\t%.3f\n" % (i, driver.num, last_name, driver_name, tab1, car.team, tab2, car.pits, car.bestlap)
  676. file.write(p)
  677.  
  678. file.write("\n-- RACE INCIDENT REPORT --\n")
  679.  
  680. for incident in crashes:
  681. if len(incident) > 2:
  682. severity = incident[1]
  683. lap = incident[2]
  684. #truncate yqtnames
  685. if len(incident[0]) > 23:
  686. driver = incident[0][:23]
  687. else:
  688. driver = incident[0]
  689. if severity == 1:
  690. type = "made a mistake"
  691. if severity == 2:
  692. type = "made a pit stop to repair damage caused by a large incident"
  693. if severity == 3:
  694. type = "crashed out"
  695. overtake = ""
  696. if incident[3] == True:
  697. overtake = " while attempting an overtake"
  698. if severity < 4:
  699. p = "%s %s%s on lap %i.\n" % (driver, type, overtake, lap)
  700. elif severity == 4:
  701. p = "It began to rain on lap %i.\n" % lap
  702. elif severity == 5:
  703. p = "The rain ceased on lap %i.\n" % lap
  704. elif severity == 6:
  705. p = "The track dried on lap %i.\n" % lap
  706. else:
  707. p = incident[0] + ".\n"
  708. file.write(p)
  709.  
  710. file.write("\n-- RELATIONS --\n")
  711.  
  712. drivers = list(drivers)
  713.  
  714. for driver in retdrivers:
  715. drivers.append(driver)
  716.  
  717. highest_rel = -200
  718. lowest_rel = 200
  719. for driver in drivers:
  720. file.write('%s' % driver.num)
  721. for num, relation in driver.relations.iteritems():
  722. file.write(',%s: %s' % (num, relation))
  723. if relation > highest_rel:
  724. highest_rel = relation
  725. if relation < lowest_rel:
  726. lowest_rel = relation
  727. file.write('\n')
  728.  
  729. print highest_rel
  730. print lowest_rel
  731.  
  732. file.close()
  733.  
  734. #turning - increases time on corners
  735. #topspeed - increases time on straights
  736. #braking - increases time into corners/technical sections
  737. #acceleration - increases time out of corners/in technical sections
  738.  
  739. #corners - skill in corners
  740. #overtaking - skill at passing people when near them
  741. #defending - skill at preventing passes
  742. #tirewear -
  743. #technical - skill in technical sections
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement