This repository has been archived by the owner on Feb 25, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathrevlimitedengine.py
91 lines (74 loc) · 2.66 KB
/
revlimitedengine.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import math
class RevLimitedEngine(object):
engineSpeedToCarSpeedMultiplier=338
def __init__(self,startX,endX,baseline):
self.startX=startX
self.endX=endX
self.baseline=baseline
self.gearTopSpeeds=[]
self.gearMultipliers=[]
self.gearIndex=0
self.currentRevs=0.0
self.currentSpeed=0.0
self.maxRevs=10000.0
def addGear(self,speedAtMaxRevs,multiplier):
self.gearTopSpeeds.append(speedAtMaxRevs)
self.gearMultipliers.append(multiplier)
def getMaxRevIncreaseAtCurrentSpeedInCurrentGear(self):
currentSpeed=self.currentSpeed
speedAtMaxRevs=self.gearTopSpeeds[self.gearIndex]
revIncrease=math.sin(self.startX+((self.endX-self.startX)/speedAtMaxRevs*currentSpeed))*self.gearMultipliers[self.gearIndex]
return revIncrease
def advanceFrame(self,acceleration,braking):
if braking>0:
acceleration=0
currentSpeed=self.getSpeed()
if currentSpeed>self.gearTopSpeeds[self.gearIndex]:
self.currentRevs=self.currentRevs-50
else:
targetRevs=self.maxRevs*acceleration
if targetRevs>self.currentRevs:
maxRevIncrease=self.getMaxRevIncreaseAtCurrentSpeedInCurrentGear()
actualRevIncrease=maxRevIncrease*acceleration
self.currentRevs=self.currentRevs+actualRevIncrease
if self.currentRevs>self.maxRevs:
self.currentRevs=self.maxRevs
elif targetRevs<self.currentRevs:
revDifference=self.currentRevs-targetRevs
revChange=revDifference/100
if revChange<10:
revChange=10
self.currentRevs=self.currentRevs-revChange
if self.currentRevs<targetRevs:
self.currentRevs=targetRevs
speedAtMaxRevs=self.gearTopSpeeds[self.gearIndex]
speedAtCurrentRevs=float(speedAtMaxRevs)/float(self.maxRevs)*float(self.currentRevs)
self.currentSpeed=speedAtCurrentRevs
if braking>0:
currentSpeed=self.getSpeed()
currentSpeed=currentSpeed-0.003
if currentSpeed<0:
currentSpeed=0
self.setSpeed(currentSpeed)
def setCurrentGear(self,gearNumber):
oldGearIndex=self.gearIndex
self.gearIndex=gearNumber-1
self.currentRevs=self.currentRevs*(self.gearTopSpeeds[oldGearIndex]/self.gearTopSpeeds[self.gearIndex])
def getCurrentGear(self):
return self.gearIndex+1
def setSpeed(self,speed):
speedAtMaxRevs=self.gearTopSpeeds[self.gearIndex]
self.currentRevs=self.maxRevs/speedAtMaxRevs*speed
self.currentSpeed=speed
def getSpeed(self):
return self.currentSpeed
def getRevs(self):
return self.currentRevs
def setRevs(self,revs):
self.revs=revs
@staticmethod
def convertCarSpeedToEngineSpeed(carSpeed):
return(carSpeed/RevLimitedEngine.engineSpeedToCarSpeedMultiplier)
@staticmethod
def convertEngineSpeedToCarSpeed(engineSpeed):
return(engineSpeed*RevLimitedEngine.engineSpeedToCarSpeedMultiplier)