Advertisement
oauo

Staircase Generator Nightly 2

Apr 14th, 2020
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //https://developer.valvesoftware.com/wiki/Valve_Map_Format
  2.  
  3. const settings = {
  4.     step:{
  5.         depth:12,
  6.         height:8,
  7.         count:16
  8.     },
  9.     type:"ramp", //ramp, ramp + stringer, hanging tread, hanging tread + stringer, spiral, spiral + stringer
  10.     stringer:null,
  11.     spiral:null
  12. }
  13.  
  14. const data = {
  15.     id:0,
  16.     uv: {
  17.         x: {
  18.             u:[0, -1, 0],
  19.             v:[0, 0, -1]
  20.         },
  21.         y: {
  22.             u:[1, 0, 0],
  23.             v:[0, 0, -1]
  24.         },
  25.         z: {
  26.             u:[-1, 0, 0],
  27.             v:[0, -1, 0]
  28.         }
  29.     },
  30.     max: {
  31.         x:0,
  32.         y:0,
  33.         z:0
  34.     },
  35.     checkMax: (d,v) => data.max[d] = Math.max(data.max[d], v)
  36. }
  37.  
  38. class VMF {
  39.     //Convert JS object into VMF format
  40.     constructor(object) {
  41.         this.object = object
  42.     }
  43.     ind = indent => `   `.repeat(indent)
  44.     objectToVMF = (obj, i = 0) =>
  45.         `${[...Object.keys(obj)].map(x => typeof obj[x] == "object" ? Array.isArray(obj[x]) ?
  46.         /*Array*/  obj[x].map(y => `${this.ind(i)}${x}\n${this.ind(i)}{\n${this.objectToVMF(y,i+1)}\n${this.ind(i)}}`).join(`\n`) :
  47.         /*Object*/ `${this.ind(i)}${x}\n${this.ind(i)}{\n${this.objectToVMF(obj[x],i+1)}\n${this.ind(i)}}` :
  48.         /*Other*/  `${this.ind(i)}"${x}" "${obj[x]}"`).join(`\n`)}`
  49.     toString = () => {
  50.         this.object.cordon.maxs = `(${data.max.x+64} ${data.max.y+64} ${data.max.z+64})` //Move this
  51.         return this.objectToVMF(this.object,0)
  52.     }
  53. }
  54.  
  55. const GetAdjacentVertex = (d, x1, y1, z1, x2, y2, z2) => {
  56.     switch (d) {
  57.         case "xp": return `${x1} ${y1} ${z2}`
  58.         case "xn": return `${x1} ${y2} ${z1}`
  59.         case "yp": return `${x2} ${y1} ${z1}`
  60.         case "yn": return `${x1} ${y1} ${z2}`
  61.         case "zp": return `${x1} ${y2} ${z2}`
  62.         case "zn": return `${x2} ${y1} ${z1}`
  63.     }
  64. }
  65.  
  66. const ModifyU = (d, arr) => d[1] == "p" ? arr.map(x => x != 0 ? x *-1 : x) : arr
  67. const SideBuilder = (d, x1, y1, z1, x2, y2, z2, x3, y3, z3) => {
  68.     if(x3 == undefined || y3 == undefined || z3 == undefined) { //cuboid
  69.         return {
  70.             id:data.id++,
  71.             plane: `(${x1} ${y1} ${z1}) (${GetAdjacentVertex(d, x1, y1, z1, x2, y2, z2)}) (${x2} ${y2} ${z2})`,
  72.             material: "DEV/REFLECTIVITY_30",
  73.             uaxis:`[${ModifyU(d,data.uv[d[0]].u).join(" ")} 0] 0.25`,
  74.             vaxis:`[${data.uv[d[0]].v.join(" ")} 0] 0.25`,
  75.             rotation:0,
  76.             lightmapscale:16,
  77.             smoothing_groups:0
  78.         }
  79.     }
  80. }
  81.  
  82. const BrushBuilder = (x,y,z,w,d,h,t="cuboid") => {
  83.     data.checkMax("x",x+w)
  84.     data.checkMax("y",y+d)
  85.     data.checkMax("z",z+h)
  86.     switch(t) {
  87.         case "cuboid":
  88.             return {
  89.                 id:data.id++,
  90.                 side:[
  91.                     SideBuilder("xp", x+w, y,   z,    x+w, y+d, z+h),
  92.                     SideBuilder("xn", x,   y,   z,      x, y+d, z+h),
  93.                     SideBuilder("yp", x,   y+d, z,    x+w, y+d, z+h),
  94.                     SideBuilder("yn", x,   y,   z,    x+w, y,   z+h),
  95.                     SideBuilder("zp", x,   y,   z+h,  x+w, y+d, z+h),
  96.                     SideBuilder("zn", x,   y,   z,    x+w, y+d, z)
  97.                 ],
  98.                 editor: {
  99.                     color: "255 255 255",
  100.                     visgroupshown: 1,
  101.                     visgroupautoshown: 1
  102.                     //,groupid:0
  103.                 }
  104.             }
  105.         case "ramp":
  106.             return {
  107.                 id:data.id++,
  108.                 side:[
  109.                     SideBuilder("xp", x+w, y,   z,    x+w, y+d, z+h),
  110.                     SideBuilder("xn", x,   y,   z,      x, y+d, z+h),
  111.                     SideBuilder("yp", x,   y+d, z,    x+w, y+d, z+h),
  112.                     SideBuilder("zp", x,   y,   z,    x+w, y+d, z+h),
  113.                     SideBuilder("zn", x,   y,   z,    x+w, y+d, z)
  114.                 ],
  115.                 editor: {
  116.                     color: "255 255 255",
  117.                     visgroupshown: 1,
  118.                     visgroupautoshown: 1
  119.                     //,groupid:0
  120.                 }
  121.             }
  122.     }
  123. }
  124.  
  125. const StaircaseMap = {
  126.     versioninfo: {
  127.         editorversion:420,
  128.         editorbuild:1337,
  129.         mapversion:1,
  130.         formatversion:100,
  131.         prefab:0
  132.     },
  133.     viewsettings: {
  134.         bSnapToGrid:1,
  135.         bShowGrid:1,
  136.         bShowLogicalGrid:0,
  137.         nGridSpacing:64,
  138.         bShow3DGrid:0
  139.     },
  140.     world: {
  141.         id:data.id++,
  142.         mapversion:1,
  143.         classname:"worldspawn",
  144.         skyname:"sky_tf2_04",
  145.         maxpropscreenwidth:-1,
  146.         detailvbsp:"detail.vbsp",
  147.         detailmaterial:"detail/detailsprites",
  148.         solid:[
  149.             BrushBuilder(0,0,0,128,384,128),
  150.             BrushBuilder(192,0,0,128,128*1.5,128, "ramp")
  151.         ]
  152.     },
  153.     cameras: {
  154.         activecamera:-1
  155.     },
  156.     cordon: {
  157.         mins:"(-64 -64 -64)",
  158.         maxs:"(1024 1024 1024)",
  159.         active:1
  160.     }
  161. }
  162.  
  163. console.log(new VMF(StaircaseMap).toString())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement