Skip to content

Commit

Permalink
Resource list and selection. No entries yet
Browse files Browse the repository at this point in the history
  • Loading branch information
xesf committed Mar 28, 2020
1 parent 04780a6 commit 24b8aa9
Show file tree
Hide file tree
Showing 3 changed files with 136 additions and 49 deletions.
88 changes: 72 additions & 16 deletions src/resources/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ const INDEX_HEADER_SIZE = 6;
* @param {*} filepath Full path of the file
* @param {*} filename File name
*/
export function loadResources(buffer, resbuffer) {
export const loadResources = (buffer) => {
let offset = 0; // current resource offest
const resources = []; // list of resource files
const data = new DataView(buffer, offset, buffer.byteLength);

const header = {
unk0: data.getUint8(offset, true),
unk1: data.getUint8(offset + 1, true), // number of entries?
unk1: data.getUint8(offset + 1, true),
unk2: data.getUint8(offset + 2, true),
unk3: data.getUint8(offset + 3, true),
numResources: data.getUint8(offset + 4, true),
Expand All @@ -27,8 +27,8 @@ export function loadResources(buffer, resbuffer) {

// Read resource files and entries
// Read number of resource files (castaway only uses a single one)
let innerOffset = offset;
for (let r = 0; r < header.numResources; r += 1) {
let innerOffset = offset;
const res = {
name: getString(data, innerOffset, INDEX_STRING_SIZE),
numEntries: data.getUint16(innerOffset + 13, true),
Expand All @@ -38,27 +38,15 @@ export function loadResources(buffer, resbuffer) {
resources.push(res);
innerOffset += 15;

res.size = resbuffer.byteLength;
const resData = new DataView(resbuffer, 0, res.size);

for (let e = 0; e < res.numEntries; e += 1) {
// from index
const entrySize = data.getUint16(innerOffset, true); // uncompressed size
const entryOffset = data.getUint32(innerOffset + 4, true);
// from resource
const name = getString(resData, entryOffset, INDEX_STRING_SIZE);
const entryCompressedSize = resData.getUint32(entryOffset + 13, true);
const startOffset = entryOffset + 17;
const endOffset = startOffset + entryCompressedSize;

const entry = {
name,
type: name.split('.')[1],
size: entrySize, // uncompressed size
offset: entryOffset,
compressedSize: entryCompressedSize,
buffer: resbuffer.slice(startOffset, endOffset),
data: new DataView(resbuffer, startOffset, entryCompressedSize),
};
innerOffset += 8;

Expand All @@ -70,9 +58,77 @@ export function loadResources(buffer, resbuffer) {
header,
resources
};
}
};

export function loadResourceEntry(entry) {
const resType = ResourceType.find((r) => r.type === entry.type);
return resType.callback(entry);
}


// /**
// * Load all Resource details based on index resource file
// * @param {*} filepath Full path of the file
// * @param {*} filename File name
// */
// export function loadResources(buffer, resbuffer) {
// let offset = 0; // current resource offest
// const resources = []; // list of resource files
// const data = new DataView(buffer, offset, buffer.byteLength);

// const header = {
// unk0: data.getUint8(offset, true),
// unk1: data.getUint8(offset + 1, true), // number of entries?
// unk2: data.getUint8(offset + 2, true),
// unk3: data.getUint8(offset + 3, true),
// numResources: data.getUint8(offset + 4, true),
// unk5: data.getUint8(offset + 5, true),
// };
// offset += INDEX_HEADER_SIZE;

// // Read resource files and entries
// // Read number of resource files (castaway only uses a single one)
// for (let r = 0; r < header.numResources; r += 1) {
// let innerOffset = offset;
// const res = {
// name: getString(data, innerOffset, INDEX_STRING_SIZE),
// numEntries: data.getUint16(innerOffset + 13, true),
// size: 0,
// entries: [],
// };
// resources.push(res);
// innerOffset += 15;

// res.size = resbuffer.byteLength;
// const resData = new DataView(resbuffer, 0, res.size);

// for (let e = 0; e < res.numEntries; e += 1) {
// // from index
// const entrySize = data.getUint16(innerOffset, true); // uncompressed size
// const entryOffset = data.getUint32(innerOffset + 4, true);
// // from resource
// const name = getString(resData, entryOffset, INDEX_STRING_SIZE);
// const entryCompressedSize = resData.getUint32(entryOffset + 13, true);
// const startOffset = entryOffset + 17;
// const endOffset = startOffset + entryCompressedSize;

// const entry = {
// name,
// type: name.split('.')[1],
// size: entrySize, // uncompressed size
// offset: entryOffset,
// compressedSize: entryCompressedSize,
// buffer: resbuffer.slice(startOffset, endOffset),
// data: new DataView(resbuffer, startOffset, entryCompressedSize),
// };
// innerOffset += 8;

// res.entries.push(entry);
// }
// }

// return {
// header,
// resources
// };
// }
26 changes: 15 additions & 11 deletions src/ui/ViewerApp.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,28 @@ import ResourceContent from './components/ResourceContent';
import { preloadFileAsync } from '../utils/preload';
import { loadResources } from '../resources';

const GameResources = {
castaway: 'RESOURCE.MAP',
turbosci: 'RESOURCE.MAP',
hoc: 'VOLUME.RMF',
willy: 'VOLUME.RMF',
dragon: 'VOLUME.VGA',
};

const ViewerApp = ({ game }) => {
const [resindex, setResindex] = useState();

useEffect(() => {
if (!resindex) {
async.auto({
resindex: preloadFileAsync(`data/${game}/RESOURCE.MAP`),
res: preloadFileAsync(`data/${game}/RESOURCE.001`),
}, (err, files) => {
// todo
setResindex(loadResources(files.resindex, files.res));
});
}
async.auto({
resindex: preloadFileAsync(`data/${game}/${GameResources[game]}`),
}, (err, files) => {
setResindex(loadResources(files.resindex));
});
return () => {};
});
}, [game]);

return (
<div style={{ width: 'auto', height: 'auto', backgroundColor: '#fff' }}>
<div key={game} style={{ width: 'auto', height: 'auto', backgroundColor: '#fff' }}>
<div className="ui visible sidebar inverted vertical menu small viewer-bkg" style={{ margin: '0', top: '40px', height: 'auto', overflowY: 'scroll' }}>
{resindex && <ResourceList res={resindex} />}
</div>
Expand Down
71 changes: 49 additions & 22 deletions src/ui/components/ResourceList.jsx
Original file line number Diff line number Diff line change
@@ -1,27 +1,54 @@
import React from 'react';

import React, { useState } from 'react';
import { map } from 'lodash';


const ResourceList = ({ res }) => (
<>
<div className="item">
<div className="header">{res.resources[0].name}</div>
<div className="menu">
{map(res.resources[0].entries,
(entry) => {
if (entry.type === 'VIN') {
return null;
}
return (
<a key={entry.name} className="item" href={`#entry=${entry.name}`}>
{entry.name}
</a>
);
})}
</div>
</div>
</>
);
const ResourceList = ({ res }) => {
const [resName, setResName] = useState(res.resources[0].name);

return (
<>
{map(res.resources,
(r) => (
<div
className={`item${r.name === resName ? ' active' : ''}`}
>
<div
className="header"
onClick={() => setResName(r.name)}
style={{ cursor: 'pointer' }}
>
{r.name}
</div>

{/* <a
key={r.name}
className="header"
href="/#"
>
{r.name}
</a> */}
{/* <div className="menu">
{map(r.entries,
(entry) => {
if (entry.type === 'VIN') {
return null;
}
return (
<a
key={entry.name}
className="item"
href={`#entry=${entry.name}`}
>
{entry.name}
</a>
);
})}
</div> */}
</div>
)
)}
</>
);
};

export default ResourceList;

0 comments on commit 24b8aa9

Please sign in to comment.