less copy protection, more size visualization
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

644 lines
20 KiB

  1. function makeVehicle(name, sides, mass) {
  2. views = {
  3. }
  4. Object.entries(sides).forEach(([key, val]) => {
  5. views[key] = {
  6. attributes: {
  7. height: {
  8. name: "Height",
  9. power: 1,
  10. type: "length",
  11. base: val.height
  12. }
  13. },
  14. image: val.image,
  15. name: val.name
  16. }
  17. if (mass !== undefined) {
  18. views[key].attributes.mass = {
  19. name: "Mass",
  20. power: 3,
  21. type: "mass",
  22. base: mass
  23. }
  24. }
  25. });
  26. return makeEntity({ name: name }, views);
  27. }
  28. function makeMultiVehicle(name, sides) {
  29. views = {
  30. }
  31. Object.entries(sides).forEach(([key, val]) => {
  32. views[key] = {
  33. attributes: {
  34. height: {
  35. name: "Height",
  36. power: 1,
  37. type: "length",
  38. base: val.height
  39. }
  40. },
  41. image: val.image,
  42. name: val.name,
  43. rename: val.rename
  44. }
  45. if (val.mass) {
  46. views[key].attributes.mass = {
  47. name: "Mass",
  48. power: 3,
  49. type: "mass",
  50. base: val.mass
  51. }
  52. }
  53. });
  54. return makeEntity({ name: name }, views);
  55. }
  56. function makeAircraft() {
  57. const options = [
  58. ["Antonov An-225", 84, 18.1, 285000],
  59. ["Airbus A380-800", 72.7, 24.1, 277000],
  60. ["Stratolaunch", 73, 16.5, 540000],
  61. ["Boeing 747-8", 76.3, 19.4, 220128],
  62. ["Hughes H-4 Hercules", 66.6, 24.2, 136077],
  63. ["Cessena 172", 8.28, 2.72, 757, 2.72]
  64. ],
  65. sides = {}
  66. const sorted = options.sort((a, b) => a[1] - b[1])
  67. sorted.forEach(plane => {
  68. sides[plane[0] + " (Side)"] = {
  69. name: plane[0] + " (Side)",
  70. rename: true,
  71. height: math.unit(plane[2], "meters"),
  72. mass: math.unit(plane[3], "kg"),
  73. image: { source: "./media/vehicles/planes/plane_" + plane[0].replace(/ /g, "-").toLowerCase() + "-side.svg" }
  74. };
  75. sides[plane[0] + " (Top)"] = {
  76. name: plane[0] + " (Top)",
  77. rename: true,
  78. height: math.unit(plane[1], "meters"),
  79. mass: math.unit(plane[3], "kg"),
  80. image: { source: "./media/vehicles/planes/plane_" + plane[0].replace(/ /g, "-").toLowerCase() + "-top.svg" }
  81. };
  82. if (plane.length > 4) {
  83. sides[plane[0] + " (Front)"] = {
  84. name: plane[0] + " (Front)",
  85. rename: true,
  86. height: math.unit(plane[4], "meters"),
  87. mass: math.unit(plane[3], "kg"),
  88. image: { source: "./media/vehicles/planes/plane_" + plane[0].replace(/ /g, "-").toLowerCase() + "-front.svg" }
  89. };
  90. }
  91. });
  92. const entity = makeMultiVehicle("Aircraft", sides);
  93. entity.sizes.push({
  94. name: "1:72",
  95. height: math.unit(sorted[0][2] / 72, "meters")
  96. });
  97. entity.sizes.push({
  98. name: "1:24",
  99. height: math.unit(sorted[0][2] / 24, "meters")
  100. });
  101. entity.sizes.push({
  102. name: "1:16",
  103. height: math.unit(sorted[0][2] / 16, "meters")
  104. });
  105. entity.sizes.push({
  106. name: "1:8",
  107. height: math.unit(sorted[0][2] / 8, "meters")
  108. });
  109. entity.sizes.push({
  110. name: "1:4",
  111. height: math.unit(sorted[0][2] / 4, "meters")
  112. });
  113. entity.sizes.push({
  114. name: "1",
  115. height: math.unit(sorted[0][2], "meters")
  116. });
  117. return entity;
  118. }
  119. function makeCars() {
  120. const options = [
  121. ["Toyota Prius C", 3.99, 1.45, 1134, 1, 1.07, 1],
  122. ["VW New Beetle", 4.13, 1.57, 1230, 1, 1, 1],
  123. ["Honda Civic", 4.55, 1.42, 1303, 1, 1, 1],
  124. ["Lamborghini Aventador", 4.78, 1.136, 1575, 1, 1, 1],
  125. ["Ford F-150", 5.89, 1.92, 1950, 1, 1, 1]
  126. ]
  127. sides = {}
  128. const sorted = options.sort((a, b) => a[1] - b[1])
  129. sorted.forEach(car => {
  130. sides[car[0] + " (Front)"] = {
  131. name: car[0] + " (Front)",
  132. rename: true,
  133. height: math.unit(car[2], "meters"),
  134. mass: math.unit(car[3], "kg"),
  135. image: { source: "./media/vehicles/cars/car_" + car[0].replace(/ /g, "-").toLowerCase() + "-front.svg", extra: car[4] }
  136. };
  137. sides[car[0] + " (Side)"] = {
  138. name: car[0] + " (Side)",
  139. rename: true,
  140. height: math.unit(car[2], "meters"),
  141. mass: math.unit(car[3], "kg"),
  142. image: { source: "./media/vehicles/cars/car_" + car[0].replace(/ /g, "-").toLowerCase() + "-side.svg", extra: car[5] }
  143. };
  144. sides[car[0] + " (Top)"] = {
  145. name: car[0] + " (Top)",
  146. rename: true,
  147. height: math.unit(car[1], "meters"),
  148. mass: math.unit(car[3], "kg"),
  149. image: { source: "./media/vehicles/cars/car_" + car[0].replace(/ /g, "-").toLowerCase() + "-top.svg", extra: car[6] }
  150. };
  151. });
  152. const entity = makeMultiVehicle("Cars", sides);
  153. entity.sizes.push({
  154. name: "1:72",
  155. height: math.unit(sorted[0][2] / 72, "meters")
  156. });
  157. entity.sizes.push({
  158. name: "1:24",
  159. height: math.unit(sorted[0][2] / 24, "meters")
  160. });
  161. entity.sizes.push({
  162. name: "1:16",
  163. height: math.unit(sorted[0][2] / 16, "meters")
  164. });
  165. entity.sizes.push({
  166. name: "1:8",
  167. height: math.unit(sorted[0][2] / 8, "meters")
  168. });
  169. entity.sizes.push({
  170. name: "1:4",
  171. height: math.unit(sorted[0][2] / 4, "meters")
  172. });
  173. entity.sizes.push({
  174. name: "1",
  175. height: math.unit(sorted[0][2], "meters")
  176. });
  177. return entity;
  178. }
  179. function makeBuses() {
  180. const options = [
  181. ["City Bus", 11.95, 2.99, 14000, 1, 1, 1],
  182. ["Articulated Bus", 18, 3.13, 25000, 1, 1, 1],
  183. ["Coach Bus", 12, 3.81, 18000, 1, 1, 1],
  184. ["Shuttle Bus", 7.01, 2.67, 6000, 1, 1, 1],
  185. ]
  186. sides = {}
  187. options.forEach(bus => {
  188. sides[bus[0] + " (Front)"] = {
  189. name: bus[0] + " (Front)",
  190. rename: true,
  191. height: math.unit(bus[2], "meters"),
  192. mass: math.unit(bus[3], "kg"),
  193. image: { source: "./media/vehicles/buses/bus_" + bus[0].replace(/ /g, "-").toLowerCase() + "-front.svg", extra: bus[4] }
  194. };
  195. sides[bus[0] + " (Side)"] = {
  196. name: bus[0] + " (Side)",
  197. rename: true,
  198. height: math.unit(bus[2], "meters"),
  199. mass: math.unit(bus[3], "kg"),
  200. image: { source: "./media/vehicles/buses/bus_" + bus[0].replace(/ /g, "-").toLowerCase() + "-side.svg", extra: bus[5] }
  201. };
  202. sides[bus[0] + " (Top)"] = {
  203. name: bus[0] + " (Top)",
  204. rename: true,
  205. height: math.unit(bus[1], "meters"),
  206. mass: math.unit(bus[3], "kg"),
  207. image: { source: "./media/vehicles/buses/bus_" + bus[0].replace(/ /g, "-").toLowerCase() + "-top.svg", extra: bus[6] }
  208. };
  209. });
  210. const entity = makeMultiVehicle("Buses", sides);
  211. entity.sizes.push({
  212. name: "1:72",
  213. height: math.unit(options[0][2] / 72, "meters")
  214. });
  215. entity.sizes.push({
  216. name: "1:24",
  217. height: math.unit(options[0][2] / 24, "meters")
  218. });
  219. entity.sizes.push({
  220. name: "1:16",
  221. height: math.unit(options[0][2] / 16, "meters")
  222. });
  223. entity.sizes.push({
  224. name: "1:8",
  225. height: math.unit(options[0][2] / 8, "meters")
  226. });
  227. entity.sizes.push({
  228. name: "1:4",
  229. height: math.unit(options[0][2] / 4, "meters")
  230. });
  231. entity.sizes.push({
  232. name: "1",
  233. height: math.unit(options[0][2], "meters")
  234. });
  235. return entity;
  236. }
  237. // TODO this should be named something more generic and put in objects.js
  238. function makeVehicleGroup(info, name, prefix, directory="vehicles") {
  239. sides = {}
  240. let defaultHeight;
  241. info.forEach(vehicle => {
  242. Object.entries(vehicle.sides).forEach(([sideName, data]) => {
  243. if (!defaultHeight) {
  244. defaultHeight = data.height;
  245. }
  246. sides[vehicle.name + " (" + sideName + ")"] = {
  247. name: vehicle.name + " (" + sideName + ")",
  248. rename: true,
  249. height: data.height,
  250. mass: vehicle.mass,
  251. image: { source: "./media/" + directory + "/" + name.replace(/ /g, "-").toLowerCase() + "/" + (prefix == "" ? "" : prefix + "_") + vehicle.name.replace(/ /g, "-").toLowerCase() + "-" + sideName.replace(/ /g, "-").toLowerCase() + ".svg", extra: (data.extra ? data.extra : 1) }
  252. };
  253. });
  254. });
  255. const entity = makeMultiVehicle(name, sides);
  256. entity.sizes.push({
  257. name: "1:72",
  258. height: math.unit(math.divide(defaultHeight, 72))
  259. });
  260. entity.sizes.push({
  261. name: "1:24",
  262. height: math.unit(math.divide(defaultHeight, 24))
  263. });
  264. entity.sizes.push({
  265. name: "1:16",
  266. height: math.unit(math.divide(defaultHeight, 16))
  267. });
  268. entity.sizes.push({
  269. name: "1:8",
  270. height: math.unit(math.divide(defaultHeight, 8))
  271. });
  272. entity.sizes.push({
  273. name: "1:4",
  274. height: math.unit(math.divide(defaultHeight, 4))
  275. });
  276. return entity;
  277. }
  278. function makeAutoVehicleGroup(info, name) {
  279. sides = {}
  280. let defaultHeight;
  281. info.forEach(vehicle => {
  282. Object.entries(vehicle.sides).forEach(([sideName, data]) => {
  283. if (!defaultHeight) {
  284. defaultHeight = data.height;
  285. }
  286. sides[vehicle.name + " (" + sideName + ")"] = {
  287. name: vehicle.name + " (" + sideName + ")",
  288. rename: true,
  289. height: data.height,
  290. image: { source: "./media/vehicles/" + name + "/" + vehicle.name + "-" + sideName + ".svg" }
  291. };
  292. });
  293. });
  294. const entity = makeMultiVehicle(name, sides);
  295. entity.sizes.push({
  296. name: "1:72",
  297. height: math.unit(math.divide(defaultHeight, 72))
  298. });
  299. entity.sizes.push({
  300. name: "1:24",
  301. height: math.unit(math.divide(defaultHeight, 24))
  302. });
  303. entity.sizes.push({
  304. name: "1:16",
  305. height: math.unit(math.divide(defaultHeight, 16))
  306. });
  307. entity.sizes.push({
  308. name: "1:8",
  309. height: math.unit(math.divide(defaultHeight, 8))
  310. });
  311. entity.sizes.push({
  312. name: "1:4",
  313. height: math.unit(math.divide(defaultHeight, 4))
  314. });
  315. return entity;
  316. }
  317. function makeVehicles() {
  318. const results = [];
  319. results.push({
  320. name: "Leopard 2 Rev. 1",
  321. constructor: () => makeVehicle(
  322. "Leopard 2 Rev. 1",
  323. {
  324. side: {
  325. name: "Side",
  326. height: math.unit(3, "meters"),
  327. image: { source: "./media/vehicles/leopard-2-revolution-1.svg" },
  328. },
  329. vertical: {
  330. name: "Side (Vertical)",
  331. height: math.unit(10, "meters"),
  332. image: { source: "./media/vehicles/vertical-leopard-2-revolution-1.svg" },
  333. }
  334. },
  335. math.unit(60, "tonnes")
  336. )
  337. });
  338. results.push({
  339. name: "Titanic",
  340. constructor: () => makeVehicle(
  341. "Titanic",
  342. {
  343. side: {
  344. name: "Side",
  345. height: math.unit(883 * 1114 / 4250, "feet"),
  346. image: { source: "./media/vehicles/titanic.svg" },
  347. },
  348. sideVertical: {
  349. name: "Side (Vertical)",
  350. height: math.unit(883, "feet"),
  351. image: { source: "./media/vehicles/vertical-titanic.svg" },
  352. },
  353. },
  354. math.unit(52310, "tons")
  355. )
  356. });
  357. results.push({
  358. name: "18-Wheeler",
  359. constructor: () => makeVehicle(
  360. "18-Wheeler",
  361. {
  362. side: {
  363. name: "Side",
  364. height: math.unit(13.6, "feet"),
  365. image: { source: "./media/vehicles/18-wheeler.svg" },
  366. },
  367. sideVertical: {
  368. name: "Side (Vertical)",
  369. height: math.unit(54, "feet"),
  370. image: { source: "./media/vehicles/18-wheeler-vertical.svg" },
  371. },
  372. },
  373. math.unit(52310, "tons")
  374. )
  375. });
  376. results.push({
  377. name: "Spacecraft",
  378. constructor: () => makeMultiVehicle(
  379. "Spacecraft",
  380. {
  381. "n-1": {
  382. name: "N-1",
  383. rename: true,
  384. height: math.unit(105, "meters"),
  385. mass: math.unit(95, "tons"),
  386. image: { source: "./media/vehicles/spacecraft/n-1.svg" }
  387. },
  388. "saturn-v": {
  389. name: "Saturn V",
  390. rename: true,
  391. height: math.unit(110.6, "meters"),
  392. mass: math.unit(140, "tons"),
  393. image: { source: "./media/vehicles/spacecraft/saturn-v.svg" }
  394. },
  395. "starship": {
  396. name: "Starship",
  397. rename: true,
  398. height: math.unit(118, "m"),
  399. mass: math.unit(150, "tons"),
  400. image: { source: "./media/vehicles/spacecraft/saturn-v.svg" }
  401. },
  402. }
  403. )
  404. });
  405. results.push({
  406. name: "Aircraft",
  407. constructor: () => makeAircraft()
  408. });
  409. results.push({
  410. name: "Cars",
  411. constructor: () => makeCars()
  412. });
  413. results.push({
  414. name: "Buses",
  415. constructor: () => makeBuses()
  416. });
  417. results.push({
  418. name: "Trains",
  419. constructor: () => makeVehicleGroup([
  420. {
  421. name: "60' Boxcar",
  422. mass: math.unit(80900, "lbs"),
  423. sides: {
  424. "Side": { height: math.unit(17, "feet") },
  425. "Front": { height: math.unit(17, "feet") }
  426. }
  427. },
  428. {
  429. name: "64' Flatcar",
  430. mass: math.unit(66000, "lbs"),
  431. sides: {
  432. "Side": { height: math.unit(5.03, "feet") },
  433. "Front": { height: math.unit(5.03, "feet") },
  434. }
  435. },
  436. {
  437. name: "3250 Cubic Ft Hopper",
  438. mass: math.unit(52000, "lbs"),
  439. sides: {
  440. "Side": { height: math.unit(15 + 3 / 12, "feet") },
  441. "Front": { height: math.unit(15 + 3 / 12, "feet") },
  442. }
  443. },
  444. {
  445. name: "28600 Gallon Tank Car",
  446. mass: math.unit(93000, "lbs"),
  447. sides: {
  448. "Side": { height: math.unit(15 + 5.7 / 12, "feet") },
  449. "Front": { height: math.unit(15 + 5.7 / 12, "feet") },
  450. }
  451. }
  452. ],
  453. "Trains",
  454. "train")
  455. });
  456. const dataWarships = [
  457. {
  458. name: "Bismarck",
  459. sides: {
  460. "Side": { height: math.unit(54.69636677864504, "meters") },
  461. "Front": { height: math.unit(54.69636677864504, "meters") },
  462. "Top": { height: math.unit(255.13670261140695, "meters") },
  463. }
  464. },
  465. {
  466. name: "Enterprise",
  467. sides: {
  468. "Side": { height: math.unit(48.51854022788899, "meters") },
  469. "Front": { height: math.unit(48.51854022788899, "meters") },
  470. "Top": { height: math.unit(253.1778795587282, "meters") },
  471. }
  472. },
  473. {
  474. name: "Hood",
  475. sides: {
  476. "Side": { height: math.unit(51.230756762367264, "meters") },
  477. "Front": { height: math.unit(51.230756762367264, "meters") },
  478. "Top": { height: math.unit(263.41015261022113, "meters") },
  479. }
  480. },
  481. {
  482. name: "Hōshō",
  483. sides: {
  484. "Side": { height: math.unit(32.758064912151085, "meters") },
  485. "Front": { height: math.unit(32.758064912151085, "meters") },
  486. "Top": { height: math.unit(185.00137927141287, "meters") },
  487. }
  488. },
  489. {
  490. name: "Iowa",
  491. sides: {
  492. "Side": { height: math.unit(49.127098508478305, "meters") },
  493. "Front": { height: math.unit(49.127098508478305, "meters") },
  494. "Top": { height: math.unit(271.8477422138651, "meters") },
  495. }
  496. },
  497. {
  498. name: "New Mexico",
  499. sides: {
  500. "Side": { height: math.unit(41.32890317041514, "meters") },
  501. "Front": { height: math.unit(41.32890317041514, "meters") },
  502. "Top": { height: math.unit(190.75114403153, "meters") },
  503. }
  504. },
  505. {
  506. name: "Shōkaku",
  507. sides: {
  508. "Side": { height: math.unit(41.67455523006811, "meters") },
  509. "Front": { height: math.unit(41.67455523006811, "meters") },
  510. "Top": { height: math.unit(260.7137969911492, "meters") },
  511. }
  512. },
  513. {
  514. name: "Texas",
  515. sides: {
  516. "Side": { height: math.unit(48.903111190282694, "meters") },
  517. "Front": { height: math.unit(48.903111190282694, "meters") },
  518. "Top": { height: math.unit(195.24415882424861, "meters") },
  519. }
  520. },
  521. {
  522. name: "U-2501",
  523. sides: {
  524. "Side": { height: math.unit(11.361271301409108, "meters") },
  525. "Front": { height: math.unit(11.361271301409108, "meters") },
  526. "Top": { height: math.unit(77.06816292937421, "meters") },
  527. }
  528. },
  529. {
  530. name: "Yamato",
  531. sides: {
  532. "Side": { height: math.unit(49.20849004806329, "meters") },
  533. "Front": { height: math.unit(49.20849004806329, "meters") },
  534. "Top": { height: math.unit(265.94789907523005, "meters") },
  535. }
  536. }
  537. ];
  538. results.push({
  539. name: "Warships",
  540. constructor: () => makeAutoVehicleGroup(dataWarships,
  541. "Warships",
  542. "")
  543. });
  544. results.push({
  545. name: "Tanks",
  546. constructor: () => makeVehicleGroup([
  547. {
  548. name: "T95 Super Heavy Tank",
  549. mass: math.unit(95, "tons"),
  550. sides: {
  551. "Side": { height: math.unit(18.83, "feet") },
  552. "Front": { height: math.unit(18.83, "feet") },
  553. "Top": { height: math.unit(2608/1659*36.5, "feet") },
  554. }
  555. },
  556. {
  557. name: "Leopard I",
  558. mass: math.unit(42.2, "tonnes"),
  559. sides: {
  560. "Side": { height: math.unit(2.80, "meters") },
  561. "Front": { height: math.unit(2.80, "meters") },
  562. "Top": { height: math.unit(9.54, "meters") },
  563. }
  564. },
  565. ],
  566. "Tanks",
  567. "")
  568. });
  569. results.push({
  570. name: "Helicopters",
  571. constructor: () => makeVehicleGroup([
  572. {
  573. name: "Mil Mi-26",
  574. mass: math.unit(109349, "lbs"),
  575. sides: {
  576. "Side": { height: math.unit(12.2, "meters") },
  577. "Front": { height: math.unit(12.2, "meters") },
  578. "Bottom": { height: math.unit(40.025, "meters") },
  579. }
  580. }
  581. ],
  582. "Helicopters",
  583. "")
  584. })
  585. return results;
  586. }