\ No newline at end of file
+404: This page could not be found.VL2 Forge
404
This page could not be found.
\ No newline at end of file
diff --git a/docs/404/index.html b/docs/404/index.html
index f74e83d..57e2bf5 100644
--- a/docs/404/index.html
+++ b/docs/404/index.html
@@ -1 +1 @@
-404: This page could not be found.VL2 Forge
404
This page could not be found.
\ No newline at end of file
+404: This page could not be found.VL2 Forge
404
This page could not be found.
\ No newline at end of file
diff --git a/docs/_next/static/VFn6qWTJj18_ybDB8NUw-/_buildManifest.js b/docs/_next/static/FgY9gJcnpj3lZXg7cOXvf/_buildManifest.js
similarity index 100%
rename from docs/_next/static/VFn6qWTJj18_ybDB8NUw-/_buildManifest.js
rename to docs/_next/static/FgY9gJcnpj3lZXg7cOXvf/_buildManifest.js
diff --git a/docs/_next/static/VFn6qWTJj18_ybDB8NUw-/_ssgManifest.js b/docs/_next/static/FgY9gJcnpj3lZXg7cOXvf/_ssgManifest.js
similarity index 100%
rename from docs/_next/static/VFn6qWTJj18_ybDB8NUw-/_ssgManifest.js
rename to docs/_next/static/FgY9gJcnpj3lZXg7cOXvf/_ssgManifest.js
diff --git a/docs/_next/static/chunks/53c13509-17317f399c482fd7.js b/docs/_next/static/chunks/53c13509-17317f399c482fd7.js
new file mode 100644
index 0000000..d7d25bf
--- /dev/null
+++ b/docs/_next/static/chunks/53c13509-17317f399c482fd7.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[240],{1273:function(c,t,a){a.d(t,{W95:function(){return r},ekl:function(){return s}});var n=a(6231);function r(c){return(0,n.w_)({tag:"svg",attr:{viewBox:"0 0 384 512"},child:[{tag:"path",attr:{d:"M192 0c-41.8 0-77.4 26.7-90.5 64H64C28.7 64 0 92.7 0 128V448c0 35.3 28.7 64 64 64H320c35.3 0 64-28.7 64-64V128c0-35.3-28.7-64-64-64H282.5C269.4 26.7 233.8 0 192 0zm0 64a32 32 0 1 1 0 64 32 32 0 1 1 0-64zM72 272a24 24 0 1 1 48 0 24 24 0 1 1 -48 0zm104-16H304c8.8 0 16 7.2 16 16s-7.2 16-16 16H176c-8.8 0-16-7.2-16-16s7.2-16 16-16zM72 368a24 24 0 1 1 48 0 24 24 0 1 1 -48 0zm88 0c0-8.8 7.2-16 16-16H304c8.8 0 16 7.2 16 16s-7.2 16-16 16H176c-8.8 0-16-7.2-16-16z"},child:[]}]})(c)}function s(c){return(0,n.w_)({tag:"svg",attr:{viewBox:"0 0 320 512"},child:[{tag:"path",attr:{d:"M16 144a144 144 0 1 1 288 0A144 144 0 1 1 16 144zM160 80c8.8 0 16-7.2 16-16s-7.2-16-16-16c-53 0-96 43-96 96c0 8.8 7.2 16 16 16s16-7.2 16-16c0-35.3 28.7-64 64-64zM128 480V317.1c10.4 1.9 21.1 2.9 32 2.9s21.6-1 32-2.9V480c0 17.7-14.3 32-32 32s-32-14.3-32-32z"},child:[]}]})(c)}}}]);
\ No newline at end of file
diff --git a/docs/_next/static/chunks/59650de3-d12eb82ab0e85613.js b/docs/_next/static/chunks/59650de3-d12eb82ab0e85613.js
new file mode 100644
index 0000000..6355066
--- /dev/null
+++ b/docs/_next/static/chunks/59650de3-d12eb82ab0e85613.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[212],{8637:function(t,a,r){r.d(a,{HXH:function(){return h}});var n=r(6231);function h(t){return(0,n.w_)({tag:"svg",attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M8 21h12a2 2 0 0 0 2-2v-2H10v2a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v3h4"},child:[]},{tag:"path",attr:{d:"M19 17V5a2 2 0 0 0-2-2H4"},child:[]},{tag:"path",attr:{d:"M15 8h-5"},child:[]},{tag:"path",attr:{d:"M15 12h-5"},child:[]}]})(t)}}}]);
\ No newline at end of file
diff --git a/docs/_next/static/chunks/795d4814-53044e1cf9e42373.js b/docs/_next/static/chunks/795d4814-53044e1cf9e42373.js
new file mode 100644
index 0000000..4e65aa1
--- /dev/null
+++ b/docs/_next/static/chunks/795d4814-53044e1cf9e42373.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[51],{2744:function(t,h,n){n.d(h,{JEK:function(){return v},seb:function(){return i}});var a=n(6231);function v(t){return(0,a.w_)({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"M21 9v2h-2V3h-2v2h-2V3h-2v2h-2V3H9v2H7V3H5v8H3V9H1v12h9v-3c0-1.1.9-2 2-2s2 .9 2 2v3h9V9h-2zm-10 3H9V9h2v3zm4 0h-2V9h2v3z"},child:[]}]})(t)}function i(t){return(0,a.w_)({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"},child:[]},{tag:"path",attr:{d:"m14 6-3.75 5 2.85 3.8-1.6 1.2C9.81 13.75 7 10 7 10l-6 8h22L14 6z"},child:[]}]})(t)}}}]);
\ No newline at end of file
diff --git a/docs/_next/static/chunks/app/page-835d545c09f56ec6.js b/docs/_next/static/chunks/app/page-835d545c09f56ec6.js
new file mode 100644
index 0000000..9f5fa29
--- /dev/null
+++ b/docs/_next/static/chunks/app/page-835d545c09f56ec6.js
@@ -0,0 +1 @@
+(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{9343:function(e,t,i){Promise.resolve().then(i.bind(i,9330))},9330:function(e,t,i){"use strict";i.d(t,{Forge:function(){return b}});var n=i(7437),a=i(2265),s=i(7380),r=i(7635),l=i.n(r),o=i(12),m=i(1124),c=i.n(m),p=i(9089),u=i(2744),d=i(8637),g=i(1273),f=i(6537),y=i.n(f);function h(e){let t=e.split("/"),i="",n="";return(t.length>1?(i=t.slice(0,-1).join("/"),n=t[t.length-1]):(i="",n=t[0]),i)?"".concat(i,"/").concat(n):(/\.(l|m|h)(male|female|bioderm)\.png$/i.test(n)||/^(vehicle|weapon)_.+png$/i.test(n)||/^dcase\d\d\.png$/i.test(n)?i="textures/skins":/\.(ter|spn)$/i.test(n)?i="terrains":/\.mis$/i.test(n)?i="missions":/\.dif$/i.test(n)&&(i="interiors"),i)?"".concat(i,"/").concat(n):n}function _(e){if(e.type){if(/^image\//i.test(e.type))return{mimeType:e.type,genericType:"image"};if(/^audio\//i.test(e.type))return{mimeType:e.type,genericType:"audio"}}if(/\.png$/i.test(e.name))return{mimeType:"image/png",genericType:"image"};if(/\.jpg$/i.test(e.name))return{mimeType:"image/jpeg",genericType:"image"};if(/\.bmp$/i.test(e.name))return{mimeType:"image/bmp",genericType:"image"};if(/\.webp$/i.test(e.name))return{mimeType:"image/webp",genericType:"image"};if(/\.gif$/i.test(e.name))return{mimeType:"image/gif",genericType:"image"};if(/\.tiff$/i.test(e.name))return{mimeType:"image/tiff",genericType:"image"};if(/\.svg$/i.test(e.name))return{mimeType:"image/svg+xml",genericType:"image"};else if(/\.wav$/i.test(e.name))return{mimeType:"audio/wav",genericType:"audio"};else if(/\.mp3$/i.test(e.name))return{mimeType:"audio/mpeg",genericType:"audio"};return e.type?{mimeType:e.type,genericType:null}:null}function w(e){var t;let{file:i,onDelete:a,onRename:s}=e,r=null;return i.dataUri&&(null===(t=i.type)||void 0===t?void 0:t.genericType)==="image"?r=(0,n.jsx)("img",{className:y().PreviewIcon,src:i.dataUri,width:24,alt:""}):/\.cs$/i.test(i.path)?r=(0,n.jsx)(d.HXH,{}):/\.mis$/i.test(i.path)?r=(0,n.jsx)(g.W95,{}):/\.dif$/i.test(i.path)?r=(0,n.jsx)(u.JEK,{}):/\.ter$/i.test(i.path)?r=(0,n.jsx)(u.seb,{}):/\.spn$/i.test(i.path)&&(r=(0,n.jsx)(g.ekl,{})),(0,n.jsxs)("div",{className:y().File,children:[(0,n.jsx)("span",{className:y().IconContainer,children:r})," ",(0,n.jsx)("span",{className:y().Path,onDoubleClick:()=>{let e=window.prompt("Rename file (".concat(i.path,"):"),i.path);(e=e.trim().replace(/\/+/g,"/").replace(/^\//,"").replace(/\/$/,"").trim())!==i.path&&s(i.path,e)},children:i.path}),(0,n.jsx)("button",{className:y().DeleteButton,type:"button","aria-label":"Delete",title:"Delete",onClick:e=>{a(i.path)},children:(0,n.jsx)(p.AMf,{})})]})}async function v(e){let t=await l().loadAsync(e),i=new Map;for(let e in t.files){let s=t.files[e];if(!s.dir){var n,a;let t={path:e=h(e),buffer:await s.async("arraybuffer"),dataUri:null,date:s.date,unixPermissions:s.unixPermissions,dosPermissions:s.dosPermissions,type:_(s)};if((null===(n=t.type)||void 0===n?void 0:n.genericType)==="image"||(null===(a=t.type)||void 0===a?void 0:a.genericType)==="audio"){let e=await s.async("base64");t.dataUri="data:".concat(t.type.mimeType,";base64,").concat(e)}i.set(e,t)}}return i}async function x(e){var t,i;let n;let a=new Map;if(e.path)(n=e.path).startsWith("/")&&(n=n.slice(1));else{if(!e.name)return a;n=e.name}n=h(n);let s=await new Promise((t,i)=>{let n=new FileReader;n.addEventListener("load",e=>{t(e.target.result)}),n.readAsArrayBuffer(e)}),r={path:n,buffer:s,dataUri:null,date:null,unixPermissions:null,dosPermissions:null,type:_(e)};if((null===(t=r.type)||void 0===t?void 0:t.genericType)==="image"||(null===(i=r.type)||void 0===i?void 0:i.genericType)==="audio"){let e=function(e){for(var t,i,n,a,s="",r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",l=new Uint8Array(e),o=l.byteLength,m=o%3,c=o-m,p=0;p>18]+r[(258048&a)>>12]+r[(4032&a)>>6]+r[63&a];return 1==m?s+=r[t=(252&(a=l[c]))>>2]+r[(3&a)<<4]+"==":2==m&&(s+=r[t=(64512&(a=l[c]<<8|l[c+1]))>>10]+r[(1008&a)>>4]+r[(15&a)<<2]+"="),s}(s);r.dataUri="data:".concat(r.type.mimeType,";base64,").concat(e)}return a.set(n,r),a}async function T(e){return/\.(zip|vl2)$/i.test(e.name)?v(e):x(e)}async function F(e,t){let i=await e.generateAsync({type:"blob",mimeType:"application/octet-stream"});(0,o.saveAs)(i,t)}function b(){let[e,t]=(0,a.useState)(()=>[]),[i,r]=(0,a.useState)(()=>new Map),o=(0,a.useCallback)(async e=>{let i=[],n=new Map;(await Promise.all(e.map(e=>T(e)))).forEach(e=>{e.forEach((e,t)=>{n.has(t)&&i.push({type:"overwrite",path:t}),n.set(t,e)})}),r(e=>new Map([...Array.from(e.entries()),...Array.from(n.entries())])),t(e=>[...e,...i])},[]),{getRootProps:m,getInputProps:p,open:u,isDragActive:d}=(0,s.uI)({noClick:!0,onDrop:o}),g=(0,a.useMemo)(()=>c()(Array.from(i.keys()),[e=>e.toLowerCase()],["asc"]).map(e=>i.get(e)),[i]),f=(0,n.jsx)("button",{type:"button",className:y().AddButton,"aria-label":"Add files",title:"Add files",onClick:u,children:"+"}),h=(0,a.useCallback)(e=>{r(t=>{let i=new Map(t);return i.delete(e),i})},[]),_=(0,a.useCallback)((e,t)=>{r(i=>{let n={...i.get(e),path:t},a=new Map(i);return a.delete(e),a.set(t,n),a})},[]);return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("section",{className:y().Forge,...m(),children:[(0,n.jsxs)("header",{className:y().Header,children:[(0,n.jsx)("img",{width:210,height:188,src:"/vl2-forge/logo-md.png",alt:"VL2 Forge"}),f]}),(0,n.jsx)("input",{...p()}),(0,n.jsx)("div",{className:y().ListArea,children:g.length?(0,n.jsx)("ul",{className:y().FileList,children:g.map(e=>(0,n.jsx)("li",{children:(0,n.jsx)(w,{file:e,onDelete:h,onRename:_})},e.path))}):(0,n.jsx)("div",{className:y().EmptyMessage,children:"Drop files onto the page or press the add button!"})})]}),(0,n.jsx)("footer",{className:y().Footer,children:(0,n.jsxs)("form",{onSubmit:async e=>{e.preventDefault();let t=e.target.elements.fileName,i=t.value.trim();if(i){if(g.length){let e=function(e){let t=new(l());for(let i of e)t.file(i.path,i.buffer,{date:i.date,dosPermissions:i.dosPermissions,unixPermissions:i.unixPermissions});return t}(g);await F(e,"".concat(i,".vl2"))}else window.alert("Add some files!")}else window.alert("Name thy file."),t.focus()},children:[(0,n.jsx)("div",{className:y().NameInput,children:(0,n.jsx)("input",{name:"fileName",type:"text",placeholder:"name thy file",onChange:e=>{/\.vl2$/i.test(e.target.value)&&(e.target.value=e.target.value.slice(0,-4))}})}),(0,n.jsx)("button",{type:"submit",className:y().DownloadButton,children:"Download"})]})})]})}},6537:function(e){e.exports={Forge:"Forge_Forge__dDZFe",Footer:"Forge_Footer__ghw3O",NameInput:"Forge_NameInput__lpcsg",DownloadButton:"Forge_DownloadButton__CnFTn",ListArea:"Forge_ListArea__OpY_R",FileList:"Forge_FileList__9JOyh",EmptyMessage:"Forge_EmptyMessage__Lrlud",AddButton:"Forge_AddButton__09pXD",Header:"Forge_Header__7t3Qc",File:"Forge_File__Mn05Y",DeleteButton:"Forge_DeleteButton__Csfdg",IconContainer:"Forge_IconContainer__AgM_T",PreviewIcon:"Forge_PreviewIcon__HFERe",Path:"Forge_Path__GZs81"}}},function(e){e.O(0,[359,51,212,240,699,634,971,117,744],function(){return e(e.s=9343)}),_N_E=e.O()}]);
\ No newline at end of file
diff --git a/docs/_next/static/chunks/app/page-b02dc3190aa5562d.js b/docs/_next/static/chunks/app/page-b02dc3190aa5562d.js
deleted file mode 100644
index 32cc355..0000000
--- a/docs/_next/static/chunks/app/page-b02dc3190aa5562d.js
+++ /dev/null
@@ -1 +0,0 @@
-(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{9343:function(e,t,i){Promise.resolve().then(i.bind(i,9330))},9330:function(e,t,i){"use strict";i.d(t,{Forge:function(){return T}});var n=i(7437),a=i(2265),r=i(7380),s=i(7635),l=i.n(s),o=i(12),m=i(1124),c=i.n(m),u=i(9089),p=i(6537),d=i.n(p);function g(e){let t=e.split("/"),i="",n="";return(t.length>1?(i=t.slice(0,-1).join("/"),n=t[t.length-1]):(i="",n=t[0]),(/\.(l|m|h)(male|female|bioderm)\.png$/i.test(n)||/^(vehicle|weapon)_.+png$/i.test(n))&&(i="textures/skins"),i)?"".concat(i,"/").concat(n):n}function f(e){if(e.type){if(/^image\//i.test(e.type))return{mimeType:e.type,genericType:"image"};if(/^audio\//i.test(e.type))return{mimeType:e.type,genericType:"audio"}}if(/\.png$/i.test(e.name))return{mimeType:"image/png",genericType:"image"};if(/\.jpg$/i.test(e.name))return{mimeType:"image/jpeg",genericType:"image"};if(/\.bmp$/i.test(e.name))return{mimeType:"image/bmp",genericType:"image"};if(/\.webp$/i.test(e.name))return{mimeType:"image/webp",genericType:"image"};if(/\.gif$/i.test(e.name))return{mimeType:"image/gif",genericType:"image"};if(/\.tiff$/i.test(e.name))return{mimeType:"image/tiff",genericType:"image"};if(/\.svg$/i.test(e.name))return{mimeType:"image/svg+xml",genericType:"image"};else if(/\.wav$/i.test(e.name))return{mimeType:"audio/wav",genericType:"audio"};else if(/\.mp3$/i.test(e.name))return{mimeType:"audio/mpeg",genericType:"audio"};return e.type?{mimeType:e.type,genericType:null}:null}function y(e){var t;let{file:i,onDelete:a}=e,r=null;return i.dataUri&&(null===(t=i.type)||void 0===t?void 0:t.genericType)==="image"&&(r=(0,n.jsx)("img",{className:d().PreviewIcon,src:i.dataUri,width:24,alt:""})),(0,n.jsxs)("div",{className:d().File,children:[(0,n.jsx)("span",{className:d().IconContainer,children:r})," ",(0,n.jsx)("span",{className:d().Path,children:i.path}),(0,n.jsx)("button",{className:d().DeleteButton,type:"button","aria-label":"Delete",title:"Delete",onClick:e=>{a(i.path)},children:(0,n.jsx)(u.AMf,{})})]})}async function h(e){let t=await l().loadAsync(e),i=new Map;for(let e in t.files){let r=t.files[e];if(!r.dir){var n,a;let t={path:e=g(e),buffer:await r.async("arraybuffer"),dataUri:null,date:r.date,unixPermissions:r.unixPermissions,dosPermissions:r.dosPermissions,type:f(r)};if((null===(n=t.type)||void 0===n?void 0:n.genericType)==="image"||(null===(a=t.type)||void 0===a?void 0:a.genericType)==="audio"){let e=await r.async("base64");t.dataUri="data:".concat(t.type.mimeType,";base64,").concat(e)}i.set(e,t)}}return i}async function _(e){var t,i;let n;let a=new Map;if(e.path)(n=e.path).startsWith("/")&&(n=n.slice(1));else{if(!e.name)return a;n=e.name}n=g(n);let r=await new Promise((t,i)=>{let n=new FileReader;n.addEventListener("load",e=>{t(e.target.result)}),n.readAsArrayBuffer(e)}),s={path:n,buffer:r,dataUri:null,date:null,unixPermissions:null,dosPermissions:null,type:f(e)};if((null===(t=s.type)||void 0===t?void 0:t.genericType)==="image"||(null===(i=s.type)||void 0===i?void 0:i.genericType)==="audio"){let e=function(e){for(var t,i,n,a,r="",s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",l=new Uint8Array(e),o=l.byteLength,m=o%3,c=o-m,u=0;u>18]+s[(258048&a)>>12]+s[(4032&a)>>6]+s[63&a];return 1==m?r+=s[t=(252&(a=l[c]))>>2]+s[(3&a)<<4]+"==":2==m&&(r+=s[t=(64512&(a=l[c]<<8|l[c+1]))>>10]+s[(1008&a)>>4]+s[(15&a)<<2]+"="),r}(r);s.dataUri="data:".concat(s.type.mimeType,";base64,").concat(e)}return a.set(n,s),a}async function v(e){return/\.(zip|vl2)$/i.test(e.name)?h(e):_(e)}async function w(e,t){let i=await e.generateAsync({type:"blob",mimeType:"application/octet-stream"});(0,o.saveAs)(i,t)}function T(){let[e,t]=(0,a.useState)(()=>[]),[i,s]=(0,a.useState)(()=>new Map),o=(0,a.useCallback)(async e=>{let i=[],n=new Map;(await Promise.all(e.map(e=>v(e)))).forEach(e=>{e.forEach((e,t)=>{n.has(t)&&i.push({type:"overwrite",path:t}),n.set(t,e)})}),s(e=>new Map([...Array.from(e.entries()),...Array.from(n.entries())])),t(e=>[...e,...i])},[]),{getRootProps:m,getInputProps:u,open:p,isDragActive:g}=(0,r.uI)({noClick:!0,onDrop:o}),f=(0,a.useMemo)(()=>c()(Array.from(i.keys()),[e=>e.toLowerCase()],["asc"]).map(e=>i.get(e)),[i]),h=(0,n.jsx)("button",{type:"button",className:d().AddButton,"aria-label":"Add files",title:"Add files",onClick:p,children:"+"}),_=(0,a.useCallback)(e=>{s(t=>{let i=new Map(t);return i.delete(e),i})},[]);return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("section",{className:d().Forge,...m(),children:[(0,n.jsxs)("header",{className:d().Header,children:[(0,n.jsx)("img",{width:210,height:188,src:"/vl2-forge/logo-md.png",alt:"VL2 Forge"}),h]}),(0,n.jsx)("input",{...u()}),(0,n.jsx)("div",{className:d().ListArea,children:f.length?(0,n.jsx)("ul",{className:d().FileList,children:f.map(e=>(0,n.jsx)("li",{children:(0,n.jsx)(y,{file:e,onDelete:_})},e.path))}):(0,n.jsx)("div",{className:d().EmptyMessage,children:"Drop files onto the page or press the add button!"})})]}),(0,n.jsx)("footer",{className:d().Footer,children:(0,n.jsxs)("form",{onSubmit:async e=>{e.preventDefault();let t=e.target.elements.fileName,i=t.value.trim();if(i){if(f.length){let e=function(e){let t=new(l());for(let i of e)t.file(i.path,i.buffer,{date:i.date,dosPermissions:i.dosPermissions,unixPermissions:i.unixPermissions});return t}(f);await w(e,"".concat(i,".vl2"))}else window.alert("Add some files!")}else window.alert("Name thy file."),t.focus()},children:[(0,n.jsx)("div",{className:d().NameInput,children:(0,n.jsx)("input",{name:"fileName",type:"text",placeholder:"name thy file",onChange:e=>{/\.vl2$/i.test(e.target.value)&&(e.target.value=e.target.value.slice(0,-4))}})}),(0,n.jsx)("button",{type:"submit",className:d().DownloadButton,children:"Download"})]})})]})}},6537:function(e){e.exports={Forge:"Forge_Forge__dDZFe",Footer:"Forge_Footer__ghw3O",NameInput:"Forge_NameInput__lpcsg",DownloadButton:"Forge_DownloadButton__CnFTn",ListArea:"Forge_ListArea__OpY_R",FileList:"Forge_FileList__9JOyh",EmptyMessage:"Forge_EmptyMessage__Lrlud",AddButton:"Forge_AddButton__09pXD",Header:"Forge_Header__7t3Qc",File:"Forge_File__Mn05Y",DeleteButton:"Forge_DeleteButton__Csfdg",IconContainer:"Forge_IconContainer__AgM_T",PreviewIcon:"Forge_PreviewIcon__HFERe",Path:"Forge_Path__GZs81"}}},function(e){e.O(0,[359,699,634,971,117,744],function(){return e(e.s=9343)}),_N_E=e.O()}]);
\ No newline at end of file
diff --git a/docs/_next/static/css/914a77656c3e670b.css b/docs/_next/static/css/16a8d2abbd38d527.css
similarity index 88%
rename from docs/_next/static/css/914a77656c3e670b.css
rename to docs/_next/static/css/16a8d2abbd38d527.css
index 6f1d1ef..9ad23ff 100644
--- a/docs/_next/static/css/914a77656c3e670b.css
+++ b/docs/_next/static/css/16a8d2abbd38d527.css
@@ -1 +1 @@
-.Forge_Forge__dDZFe{flex:1 0 auto;display:grid;grid-template-columns:auto 1fr;grid-template-rows:1fr;align-content:stretch;font-family:var(--font-departure),monospace;color:#fff;text-shadow:2px 1px 0 #000;padding:20px;grid-gap:20px;gap:20px}.Forge_Footer__ghw3O{position:relative;display:flex;align-items:center;justify-content:center;padding:40px;background:rgba(59,55,49,.8);border-image-slice:18 26 26 23;border-image-width:16px 16px 16px 16px;border-image-outset:0 0 0 0;border-image-repeat:round repeat;border-image-source:url(/vl2-forge/_next/static/media/border.d6506fa8.png);border-style:solid;box-shadow:0 0 8px rgba(0,0,0,.3),inset 0 0 12px rgba(0,0,0,.8)}.Forge_Footer__ghw3O:before{top:-3px;left:-3px;right:-3px;bottom:-3px;border-color:rgba(255,250,234,.4) hsla(0,0%,9%,.5) hsla(0,0%,9%,.5) rgba(255,250,234,.4);border-style:solid;border-width:4px 4px 5px}.Forge_Footer__ghw3O:after,.Forge_Footer__ghw3O:before{display:block;content:"";position:absolute;pointer-events:none}.Forge_Footer__ghw3O:after{top:10px;left:10px;right:10px;bottom:10px;border-color:hsla(0,0%,9%,.5) rgba(255,250,234,.4) rgba(255,250,234,.4) hsla(0,0%,9%,.5);border-style:solid;border-width:4px}.Forge_Footer__ghw3O form{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:12px}.Forge_NameInput__lpcsg{position:relative;font-size:18px;font-family:var(--system-ui);font-weight:400;font-style:italic;line-height:1}.Forge_NameInput__lpcsg input{display:block;min-width:240px;max-width:100%;min-height:46px;background:#fff;color:#333;font-size:inherit;font-family:inherit;font-weight:inherit;font-style:inherit;line-height:inherit;padding:2px 50px 2px 10px}.Forge_NameInput__lpcsg:after{display:grid;place-content:center;content:".vl2";position:absolute;top:0;right:0;bottom:0;width:50px;color:#999}.Forge_DownloadButton__CnFTn{border:0;margin:0;padding:0 0 1px;min-width:128px;min-height:46px;font-family:var(--font-departure),monospace;font-size:18px;font-style:inherit;font-weight:inherit;line-height:1;border-radius:2px;background:url(/vl2-forge/_next/static/media/button.69ed12fe.png) transparent;background-repeat:no-repeat;background-size:150% 190%;background-position:50% 50%;border-color:rgba(255,145,105,.5) rgba(36,14,14,.7) rgba(36,14,14,.7) rgba(255,178,150,.5);border-style:solid;border-width:3px;color:#fff;text-shadow:0 0 5px rgba(255,226,82,.358),2px 3px 0 rgba(0,0,0,.5);cursor:pointer}.Forge_ListArea__OpY_R{display:flex;align-items:center;justify-content:center;padding:32px;background:rgba(2,2,84,.252);border-radius:12px}.Forge_FileList__9JOyh{width:100%;display:flex;flex-direction:column;gap:6px;margin:0;padding:0;list-style:none}.Forge_EmptyMessage__Lrlud{align-self:center;text-align:center}.Forge_AddButton__09pXD{border:0;margin:0;padding:0 0 2px;min-width:48px;min-height:48px;font-family:var(--font-departure),monospace;font-size:40px;font-style:inherit;font-weight:inherit;line-height:1;border-radius:3px;background:url(/vl2-forge/_next/static/media/button.69ed12fe.png) transparent;background-repeat:no-repeat;background-size:150% 190%;background-position:50% 50%;border-color:rgba(255,145,105,.5) rgba(36,14,14,.7) rgba(36,14,14,.7) rgba(255,178,150,.5);border-style:solid;border-width:3px;color:#fff;text-shadow:0 0 5px rgba(255,226,82,.358),2px 3px 0 rgba(0,0,0,.5);cursor:pointer;vertical-align:middle}.Forge_Header__7t3Qc{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:40px}.Forge_File__Mn05Y{display:flex;align-items:center;gap:12px}.Forge_DeleteButton__Csfdg{flex:0 0 auto;border:0;background:transparent;display:grid;place-content:center;font-size:24px;margin:0;padding:0;color:rgba(0,0,0,.4);cursor:pointer}.Forge_DeleteButton__Csfdg:hover{color:#ff5959}.Forge_DeleteButton__Csfdg svg{pointer-events:none}.Forge_IconContainer__AgM_T{flex:0 0 auto;display:grid;place-content:center;width:24px}.Forge_PreviewIcon__HFERe{width:100%;height:auto;max-height:24px;border:1px solid #000}.Forge_Path__GZs81{background:rgba(0,0,0,.3);padding:3px 8px;border-radius:8px}@media (max-width:767px){.Forge_Forge__dDZFe{grid-template-columns:1fr;grid-template-rows:auto 1fr;padding:12px;gap:12px}.Forge_Header__7t3Qc{flex-direction:row}.Forge_Header__7t3Qc img{width:auto;max-height:96px}}
\ No newline at end of file
+.Forge_Forge__dDZFe{flex:1 0 auto;display:grid;grid-template-columns:auto 1fr;grid-template-rows:1fr;align-content:stretch;font-family:var(--font-departure),monospace;color:#fff;text-shadow:2px 1px 0 #000;padding:20px;grid-gap:20px;gap:20px}.Forge_Footer__ghw3O{position:relative;display:flex;align-items:center;justify-content:center;padding:40px;background:rgba(59,55,49,.8);border-image-slice:18 26 26 23;border-image-width:16px 16px 16px 16px;border-image-outset:0 0 0 0;border-image-repeat:round repeat;border-image-source:url(/vl2-forge/_next/static/media/border.d6506fa8.png);border-style:solid;box-shadow:0 0 8px rgba(0,0,0,.3),inset 0 0 12px rgba(0,0,0,.8)}.Forge_Footer__ghw3O:before{top:-3px;left:-3px;right:-3px;bottom:-3px;border-color:rgba(255,250,234,.4) hsla(0,0%,9%,.5) hsla(0,0%,9%,.5) rgba(255,250,234,.4);border-style:solid;border-width:4px 4px 5px}.Forge_Footer__ghw3O:after,.Forge_Footer__ghw3O:before{display:block;content:"";position:absolute;pointer-events:none}.Forge_Footer__ghw3O:after{top:10px;left:10px;right:10px;bottom:10px;border-color:hsla(0,0%,9%,.5) rgba(255,250,234,.4) rgba(255,250,234,.4) hsla(0,0%,9%,.5);border-style:solid;border-width:4px}.Forge_Footer__ghw3O form{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:12px}.Forge_NameInput__lpcsg{position:relative;font-size:18px;font-family:var(--system-ui);font-weight:400;font-style:italic;line-height:1}.Forge_NameInput__lpcsg input{display:block;min-width:240px;max-width:100%;min-height:46px;background:#fff;color:#333;font-size:inherit;font-family:inherit;font-weight:inherit;font-style:inherit;line-height:inherit;padding:2px 50px 2px 10px}.Forge_NameInput__lpcsg:after{display:grid;place-content:center;content:".vl2";position:absolute;top:0;right:0;bottom:0;width:50px;color:#999}.Forge_DownloadButton__CnFTn{border:0;margin:0;padding:0 0 1px;min-width:128px;min-height:46px;font-family:var(--font-departure),monospace;font-size:18px;font-style:inherit;font-weight:inherit;line-height:1;border-radius:2px;background:url(/vl2-forge/_next/static/media/button.69ed12fe.png) transparent;background-repeat:no-repeat;background-size:150% 190%;background-position:50% 50%;border-color:rgba(255,145,105,.5) rgba(36,14,14,.7) rgba(36,14,14,.7) rgba(255,178,150,.5);border-style:solid;border-width:3px;color:#fff;text-shadow:0 0 5px rgba(255,226,82,.358),2px 3px 0 rgba(0,0,0,.5);cursor:pointer}.Forge_ListArea__OpY_R{display:flex;align-items:center;justify-content:center;padding:32px;background:rgba(2,2,84,.252);border-radius:12px}.Forge_FileList__9JOyh{width:100%;display:flex;flex-direction:column;gap:6px;margin:0;padding:0;list-style:none}.Forge_EmptyMessage__Lrlud{align-self:center;text-align:center}.Forge_AddButton__09pXD{border:0;margin:0;padding:0 0 2px;min-width:48px;min-height:48px;font-family:var(--font-departure),monospace;font-size:40px;font-style:inherit;font-weight:inherit;line-height:1;border-radius:3px;background:url(/vl2-forge/_next/static/media/button.69ed12fe.png) transparent;background-repeat:no-repeat;background-size:150% 190%;background-position:50% 50%;border-color:rgba(255,145,105,.5) rgba(36,14,14,.7) rgba(36,14,14,.7) rgba(255,178,150,.5);border-style:solid;border-width:3px;color:#fff;text-shadow:0 0 5px rgba(255,226,82,.358),2px 3px 0 rgba(0,0,0,.5);cursor:pointer;vertical-align:middle}.Forge_Header__7t3Qc{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:40px}.Forge_File__Mn05Y{display:flex;align-items:center;gap:12px}.Forge_DeleteButton__Csfdg{flex:0 0 auto;border:0;background:transparent;display:grid;place-content:center;font-size:24px;margin:0;padding:0;color:rgba(0,0,0,.4);cursor:pointer}.Forge_DeleteButton__Csfdg:hover{color:#ff5959}.Forge_DeleteButton__Csfdg svg{pointer-events:none}.Forge_IconContainer__AgM_T{flex:0 0 auto;display:grid;place-content:center;width:24px;font-size:22px;color:hsla(0,0%,100%,.9)}.Forge_PreviewIcon__HFERe{width:100%;height:auto;max-height:24px;border:1px solid #000}.Forge_Path__GZs81{background:rgba(0,0,0,.3);padding:3px 8px;border-radius:8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media (max-width:767px){.Forge_Forge__dDZFe{grid-template-columns:1fr;grid-template-rows:auto 1fr;padding:12px;gap:12px}.Forge_Header__7t3Qc{flex-direction:row}.Forge_Header__7t3Qc img{width:auto;max-height:96px}}
\ No newline at end of file
diff --git a/docs/index.html b/docs/index.html
index 4ccdf0f..75d119e 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1 +1 @@
-VL2 Forge
Drop files onto the page or press the add button!
\ No newline at end of file
+VL2 Forge
Drop files onto the page or press the add button!
\ No newline at end of file
diff --git a/docs/index.txt b/docs/index.txt
index 8e0dcee..9460b13 100644
--- a/docs/index.txt
+++ b/docs/index.txt
@@ -1,6 +1,6 @@
-2:I[9330,["699","static/chunks/8e1d74a4-8e519121d6db0557.js","634","static/chunks/634-d90cc75f8d4e4c06.js","931","static/chunks/app/page-b02dc3190aa5562d.js"],"Forge"]
+2:I[9330,["51","static/chunks/795d4814-53044e1cf9e42373.js","212","static/chunks/59650de3-d12eb82ab0e85613.js","240","static/chunks/53c13509-17317f399c482fd7.js","699","static/chunks/8e1d74a4-8e519121d6db0557.js","634","static/chunks/634-d90cc75f8d4e4c06.js","931","static/chunks/app/page-835d545c09f56ec6.js"],"Forge"]
3:I[4707,[],""]
4:I[6423,[],""]
-0:["VFn6qWTJj18_ybDB8NUw-",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{}],[["$","link","0",{"rel":"stylesheet","href":"/vl2-forge/_next/static/css/914a77656c3e670b.css","precedence":"next","crossOrigin":"$undefined"}]]],null],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/vl2-forge/_next/static/css/c50e9c221475fcb7.css","precedence":"next","crossOrigin":"$undefined"}]],["$","html",null,{"lang":"en","className":"__variable_6dd175","children":["$","body",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L5",null]]]]
+0:["FgY9gJcnpj3lZXg7cOXvf",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{}],[["$","link","0",{"rel":"stylesheet","href":"/vl2-forge/_next/static/css/16a8d2abbd38d527.css","precedence":"next","crossOrigin":"$undefined"}]]],null],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/vl2-forge/_next/static/css/c50e9c221475fcb7.css","precedence":"next","crossOrigin":"$undefined"}]],["$","html",null,{"lang":"en","className":"__variable_6dd175","children":["$","body",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L5",null]]]]
5:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"VL2 Forge"}],["$","meta","3",{"name":"description","content":"Create .vl2 files for Tribes 2"}],["$","meta","4",{"name":"next-size-adjust"}]]
1:null
diff --git a/src/Forge.module.css b/src/Forge.module.css
index 0e05846..f7d56c7 100644
--- a/src/Forge.module.css
+++ b/src/Forge.module.css
@@ -218,6 +218,8 @@
display: grid;
place-content: center;
width: 24px;
+ font-size: 22px;
+ color: rgba(255, 255, 255, 0.9);
}
.PreviewIcon {
@@ -231,6 +233,7 @@
background: rgba(0, 0, 0, 0.3);
padding: 3px 8px;
border-radius: 8px;
+ user-select: none;
}
@media (max-width: 767px) {
diff --git a/src/Forge.tsx b/src/Forge.tsx
index df412aa..f763a72 100644
--- a/src/Forge.tsx
+++ b/src/Forge.tsx
@@ -5,6 +5,9 @@ import JSZip from "jszip";
import { saveAs } from "file-saver";
import orderBy from "lodash.orderby";
import { FaTrashAlt } from "react-icons/fa";
+import { MdCastle, MdTerrain } from "react-icons/md";
+import { LuScrollText } from "react-icons/lu";
+import { FaClipboardList, FaMapPin } from "react-icons/fa6";
import styles from "./Forge.module.css";
import { base64ArrayBuffer } from "./utils";
@@ -19,11 +22,21 @@ function detectBestPath(path) {
folder = "";
basename = parts[0];
}
+ if (folder) {
+ return `${folder}/${basename}`;
+ }
if (
/\.(l|m|h)(male|female|bioderm)\.png$/i.test(basename) ||
- /^(vehicle|weapon)_.+png$/i.test(basename)
+ /^(vehicle|weapon)_.+png$/i.test(basename) ||
+ /^dcase\d\d\.png$/i.test(basename)
) {
folder = "textures/skins";
+ } else if (/\.(ter|spn)$/i.test(basename)) {
+ folder = "terrains";
+ } else if (/\.mis$/i.test(basename)) {
+ folder = "missions";
+ } else if (/\.dif$/i.test(basename)) {
+ folder = "interiors";
}
if (folder) {
return `${folder}/${basename}`;
@@ -68,7 +81,7 @@ function detectFileType(file): FileType | null {
return null;
}
-function FilePreview({ file, onDelete }) {
+function FilePreview({ file, onDelete, onRename }) {
let icon = null;
if (file.dataUri && file.type?.genericType === "image") {
icon = (
@@ -79,11 +92,37 @@ function FilePreview({ file, onDelete }) {
alt=""
/>
);
+ } else if (/\.cs$/i.test(file.path)) {
+ icon = ;
+ } else if (/\.mis$/i.test(file.path)) {
+ icon = ;
+ } else if (/\.dif$/i.test(file.path)) {
+ icon = ;
+ } else if (/\.ter$/i.test(file.path)) {
+ icon = ;
+ } else if (/\.spn$/i.test(file.path)) {
+ icon = ;
}
return (