Guest User

forza tuner

a guest
Jul 28th, 2022
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.29 KB | None | 0 0
  1. import React, { useState } from 'react'
  2. import TirePressure from "./tuning/TirePressure"
  3. import Gearing from "./tuning/Gearing"
  4. import Alignment from "./tuning/Alignment"
  5. import AntirollBars from './tuning/AntirollBars'
  6. import Springs from './tuning/Springs'
  7. import Damping from './tuning/Damping'
  8.  
  9. const TuneEditor = () => {
  10. const [tuneValues, setTuneValues] = useState({
  11. file: "", fileName: "", error: "",
  12. tirePressureFront: 35.0, tirePressureRear: 35.0,
  13. finalDrive: 4.2,
  14. firstGear: 3.3,
  15. secondGear: 3.3,
  16. thirdGear: 3.3,
  17. fourthGear: 3.3,
  18. fifthGear: 3.3,
  19. sixthGear: 3.3,
  20. seventhGear: 3.3,
  21. eighthGear: 3.3,
  22. ninthGear: 3.3,
  23. tenthGear: 3.3,
  24. camberFront: 0.0, camberRear: 0.0,
  25. toeFront: 0.0, toeRear: 0.0,
  26. caster: 4.0,
  27. arbsFront: 32.5, arbsRear: 32.5,
  28. springsFront: 50.0, springsRear: 50.0,
  29. rideHeightFront: 50.0, rideHeightRear: 50.0,
  30. reboundFront: 10.0, reboundRear: 10.0,
  31. bumpFront: 10.0, bumpRear: 10.0,
  32. })
  33.  
  34. const onTuneFileUpload = async (e) => {
  35. const uploadedFile = e.target.files[0]
  36. let byteArray = await fileToByteArray(uploadedFile)
  37. if(byteArray.length === 378) {
  38. setTuneValues({
  39. ...tuneValues,
  40. file: byteArray, fileName: uploadedFile.name,
  41. tirePressureFront: getValue(byteArray, 242, 15.0, 40.0, 10.0),
  42. tirePressureRear: getValue(byteArray, 286, 15.0, 40.0, 10.0),
  43. //finalDrive: getValue(byteArray, 202, 0.48, 5.52, 100.0),
  44. //firstGear: getValue(byteArray, 338, 0.48, 5.52, 100.0),
  45. //secondGear: getValue(byteArray, 342, 0.48, 5.52, 100.0),
  46. //thirdGear: getValue(byteArray, 346, 0.48, 5.52, 100.0),
  47. //fourthGear: getValue(byteArray, 350, 0.48, 5.52, 100.0),
  48. //fifthGear: getValue(byteArray, 354, 0.48, 5.52, 100.0),
  49. //sixthGear: getValue(byteArray, 358, 0.48, 5.52, 100.0),
  50. //seventhGear: getValue(byteArray, 362, 0.48, 5.52, 100.0),
  51. //eighthGear: getValue(byteArray, 366, 0.48, 5.52, 100.0),
  52. //ninthGear: getValue(byteArray, 370, 0.48, 5.52, 100.0),
  53. //tenthGear: getValue(byteArray, 374, 0.48, 5.52, 100.0),
  54. //camberFront: getNegValue(byteArray, 246),
  55. //camberRear: getNegValue(byteArray, 290),
  56. //toeFront: getNegValue(byteArray, 250),
  57. //toeRear: getNegValue(byteArray, 294),
  58. //caster: getValue(byteArray, 254, 1.0, 6.0, 100.0),
  59. arbsFront: getValue(byteArray, 262, 1.0, 64.0, 10.0),
  60. arbsRear: getValue(byteArray, 262, 1.0, 64.0, 10.0),
  61. springsFront:getOther(byteArray, 258, 100),
  62. springsRear: getOther(byteArray, 302, 100),
  63. rideHeightFront:getOther(byteArray, 266, 100),
  64. rideHeightRear: getOther(byteArray, 310, 100),
  65. //reboundFront: getValue(byteArray, 274, 1.0, 19.0, 10.0),
  66. //reboundRear: getValue(byteArray, 318, 1.0, 19.0, 10.0),
  67. //bumpFront: getValue(byteArray, 270, 1.0, 19.0, 10.0),
  68. //bumpRear: getValue(byteArray, 314, 1.0, 19.0, 10.0),
  69. })
  70. } else {
  71. setTuneValues({...tuneValues, error: "File is not 378 bytes."})
  72. }
  73. }
  74.  
  75. function downloadFile() {
  76. setValue(242, tuneValues.tirePressureFront, 15.0, 40.0)
  77. setValue(286, tuneValues.tirePressureRear, 15.0, 40.0)
  78. setValue(202, tuneValues.finalDrive, 2.2, 3.9)
  79. setValue(338, tuneValues.firstGear, 0.48, 5.52)
  80. setValue(342, tuneValues.secondGear, 0.48, 5.52)
  81. setValue(346, tuneValues.thirdGear, 0.48, 5.52)
  82. setValue(350, tuneValues.fourthGear, 0.48, 5.52)
  83. setValue(354, tuneValues.fifthGear, 0.48, 5.52)
  84. setValue(358, tuneValues.sixthGear, 0.48, 5.52)
  85. setValue(362, tuneValues.seventhGear, 0.48, 5.52)
  86. setValue(366, tuneValues.eighthGear, 0.48, 5.52)
  87. setValue(370, tuneValues.ninthGear, 0.48, 5.52)
  88. setValue(374, tuneValues.tenthGear, 0.48, 5.52)
  89. setValue(246, tuneValues.camberFront, -5.0, 10.0)
  90. setValue(290, tuneValues.camberRear, -5.0, 10.0)
  91. setValue(250, tuneValues.toeFront, -5.0, 10.0)
  92. setValue(294, tuneValues.toeRear, -5.0, 10.0)
  93. setValue(254, tuneValues.caster, 1.0, 6.0)
  94. setValue(262, tuneValues.arbsFront, 1.0, 64.0)
  95. setValue(306, tuneValues.arbsRear, 1.0, 64.0)
  96. setValue(258, tuneValues.springsFront, 0, 100)
  97. setValue(302, tuneValues.springsRear, 0, 100)
  98. setValue(266, tuneValues.rideHeightFront, 0, 100)
  99. setValue(310, tuneValues.rideHeightRear, 0, 100)
  100. setValue(274, tuneValues.reboundFront, 1.0, 19.0)
  101. setValue(318, tuneValues.reboundRear, 1.0, 19.0)
  102. setValue(270, tuneValues.bumpFront, 1.0, 19.0)
  103. setValue(314, tuneValues.bumpRear, 1.0, 19.0)
  104.  
  105. let element = document.createElement('a')
  106. element.href = window.URL.createObjectURL(new Blob([new Uint8Array(tuneValues.file)], {type: 'application/octet-stream'}))
  107. element.download = tuneValues.fileName
  108. element.style.display = 'none'
  109. document.body.appendChild(element)
  110. element.click()
  111. document.body.removeChild(element)
  112. }
  113.  
  114. const onSliderChange = (e) => setTuneValues({ ...tuneValues, [e.target.id]: e.target.value })
  115.  
  116. function setValue(start, tuneValue, min, range) {
  117. const reversedValue = (tuneValue - min) / range
  118. const f = new Float32Array(1)
  119. f[0] = reversedValue
  120. const array = new Int8Array(f.buffer)
  121. const tuneArray = tuneValues.file
  122. tuneArray[start] = array[0]
  123. tuneArray[start + 1] = array[1]
  124. tuneArray[start + 2] = array[2]
  125. tuneArray[start + 3] = array[3]
  126. setTuneValues({ ...tuneValues, file: tuneArray })
  127. }
  128.  
  129. function getValue(byteArray, start, min, range, round) {
  130. const arr = byteArray.slice(start, start + 4)
  131. const floatArr = new Float32Array(new Uint8Array(arr).buffer)[0]
  132. return Math.round((floatArr * range + min) * round) / round
  133. }
  134.  
  135. function getOther(byteArray, start, other){
  136. const arr = byteArray.slice(start, start + 4)
  137. const floatArr = new Float32Array(new Uint8Array(arr).buffer)[0]
  138. return Math.round((floatArr * other) * 100) / 100
  139. }
  140.  
  141. function getNegValue(byteArray, start) {
  142. const arr = byteArray.slice(start, start + 4)
  143. const floatArr = new Float32Array(new Uint8Array(arr).buffer)[0]
  144. const result = (floatArr * 10.0) + (-5.0)
  145. if(result < 0) {
  146. return (Math.round(result * -10.0) / -10.0);
  147. } else {
  148. return Math.round(result * 10.0) / 10.0;
  149. }
  150. }
  151.  
  152. function fileToByteArray(file) {
  153. return new Promise((resolve, reject) => {
  154. try {
  155. let reader = new FileReader()
  156. let fileByteArray = []
  157. reader.readAsArrayBuffer(file)
  158. reader.onloadend = (evt) => {
  159. if (evt.target.readyState === FileReader.DONE) {
  160. let arrayBuffer = evt.target.result,
  161. array = new Uint8Array(arrayBuffer)
  162. for (let byte of array) {
  163. fileByteArray.push(byte)
  164. }
  165. }
  166. resolve(fileByteArray)
  167. }
  168. }
  169. catch (e) {
  170. reject(e)
  171. }
  172. })
  173. }
  174.  
  175. return (
  176. <div>
  177. <section>
  178. <h1>Upload Tune File</h1>
  179. <p>All values will be saved when you click download.</p>
  180.  
  181. <input onChange={onTuneFileUpload} type="file" />
  182. <p style={{color: "red"}}>{tuneValues.error}</p>
  183.  
  184. <br/>
  185. </section>
  186.  
  187. <TirePressure onSliderChange={onSliderChange} tuneValues={tuneValues} />
  188. <Gearing onSliderChange={onSliderChange} tuneValues={tuneValues} />
  189. <Alignment onSliderChange={onSliderChange} tuneValues={tuneValues} />
  190. <AntirollBars onSliderChange={onSliderChange} tuneValues={tuneValues} />
  191. <Springs onSliderChange={onSliderChange} tuneValues={tuneValues} />
  192. <Damping onSliderChange={onSliderChange} tuneValues={tuneValues} />
  193.  
  194.  
  195. <section>
  196. <h1>Finish</h1>
  197. <p>Replace the file you uploaded with the file downloaded here. Make sure the file name is exactly the same,
  198. remove any trailing text like `_1` or `(1)`. Microsoft tune files have NO extension, steam tune files will end in .Data
  199. </p>
  200. <input type="button" onClick={downloadFile} value="Download" />
  201. <br />
  202. </section>
  203. </div>
  204. )
  205. }
  206.  
  207.  
  208. export default TuneEditor
Advertisement
Add Comment
Please, Sign In to add comment