Skip to content

Commit

Permalink
jup B and start vm37
Browse files Browse the repository at this point in the history
  • Loading branch information
ate47 committed May 29, 2024
1 parent 1bf5dbd commit a4fcb64
Show file tree
Hide file tree
Showing 5 changed files with 594 additions and 15 deletions.
19 changes: 8 additions & 11 deletions src/acts/tools/gsc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,7 @@ namespace {
{ VM_T937,[](byte* file, size_t fileSize) { return std::make_shared<T937GSCOBJHandler>(file, fileSize); }},
{ VM_T9,[](byte* file, size_t fileSize) { return std::make_shared<T9GSCOBJHandler>(file, fileSize); }},
{ VM_MW23,[](byte* file, size_t fileSize) { return std::make_shared<MW23GSCOBJHandler>(file, fileSize); }},
{ VM_MW23B,[](byte* file, size_t fileSize) { return std::make_shared<MW23BGSCOBJHandler>(file, fileSize); }},
{ VM_T7,[](byte* file, size_t fileSize) { return std::make_shared<T7GSCOBJHandler>(file, fileSize); }},
{ VM_T71B,[](byte* file, size_t fileSize) { return std::make_shared<T71BGSCOBJHandler>(file, fileSize); }},
};
Expand Down Expand Up @@ -730,18 +731,14 @@ int GscInfoHandleData(byte* data, size_t size, const char* path, const GscInfoOp
byte vm;
bool iw;

auto magicVal = *reinterpret_cast<uint64_t*>(data) & ~0xFF00000000000000;
if (magicVal == 0xa0d4353478a) {
// IW GSC file, use user input
if (opt.m_vm == VM_UNKNOWN) {
LOG_ERROR("VM type needed with IW GSC file, please use --vm [vm] to set it");
return tool::BASIC_ERROR;
}
vm = opt.m_vm;
uint64_t magicVal = *reinterpret_cast<uint64_t*>(data);
if ((magicVal & ~0x000000000000000F) == 0xA0D43534780) {
// IW GSC file, use 0 revision
vm = data[0];
iw = true;
}
else if (magicVal == 0xa0d43534780) {
// Treyarch GSC file, use revision
}
else if ((magicVal & ~0xFF0000000000000F) == 0xa0d43534780) {
// Treyarch GSC file, use 7 revision
vm = data[7];
iw = false;
}
Expand Down
37 changes: 36 additions & 1 deletion src/acts/tools/gsc_opcodes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,12 @@ namespace tool::gsc::opcode {
if (!_strcmpi("t7_1b", name) || !_strcmpi("bo4_1b", name) || !_strcmpi("blackops3_1b", name) || !_strcmpi("1b", name)) {
return VM_T71B;
}
if (!_strcmpi("jup", name) || !_strcmpi("s4", name) || !_strcmpi("mwiii", name) || !_strcmpi("modernwarfareiii", name) || !_strcmpi("mw23", name)) {
if (!_strcmpi("jup", name) || !_strcmpi("s5", name) || !_strcmpi("mwiii", name) || !_strcmpi("modernwarfareiii", name) || !_strcmpi("mw23", name)) {
return VM_MW23;
}
if (!_strcmpi("jupb", name) || !_strcmpi("s5b", name) || !_strcmpi("mwiiib", name) || !_strcmpi("modernwarfareiiib", name) || !_strcmpi("mw23b", name)) {
return VM_MW23B;
}
return VM_UNKNOWN;
}

Expand Down Expand Up @@ -665,6 +668,37 @@ class OPCodeInfoRegisterVariable : public OPCodeInfo {
}
};

class OPCodeInfoRegisterMultipleVariables : public OPCodeInfo {
public:
OPCodeInfoRegisterMultipleVariables() : OPCodeInfo(OPCode::OPCODE_IW_RegisterMultipleVariables, "RegisterMultipleVariables") {}

int Dump(std::ostream& out, uint16_t value, ASMContext& context, tool::gsc::T8GSCOBJContext& objctx) const override {
byte count = *(context.m_bcl++);

out << "count: " << std::dec << (int)count << "\n";

for (size_t i = 0; i < count; i++) {
uint64_t name = *reinterpret_cast<uint64_t*>(context.m_bcl);
context.m_bcl += 8;

if (!context.m_localvars.size()) {
// the local variables starts at 1
context.m_localvars.insert(context.m_localvars.begin(), { hashutils::Hash32("<error>"), 0 });
}

context.m_localvars.insert(context.m_localvars.begin(), { name, 0 });
context.WritePadding(out) << hashutils::ExtractTmp("var", name) << " (-" << std::dec << context.m_localvars.size() << ")" << std::endl;
}
// don't create statement, we can ignore it
context.m_lastOpCodeBase = -1;
return 0;
}

int Skip(uint16_t value, ASMSkipContext& ctx) const override {
ctx.m_bcl += 8; // skip hash
return 0;
}
};

class OPCodeInfoSafeCreateLocalVariables : public OPCodeInfo {
public:
Expand Down Expand Up @@ -4906,6 +4940,7 @@ void tool::gsc::opcode::RegisterOpCodes() {

// IW
RegisterOpCodeHandler(new OPCodeInfoRegisterVariable());
RegisterOpCodeHandler(new OPCodeInfoRegisterMultipleVariables());
RegisterOpCodeHandler(new OPCodeInfoEvalLocalVariableCached(OPCODE_IW_EvalLocalVariableCached0, "EvalLocalVariableCached0", 1, 0));
RegisterOpCodeHandler(new OPCodeInfoEvalLocalVariableCached(OPCODE_IW_EvalLocalVariableCached1, "EvalLocalVariableCached1", 1, 1));
RegisterOpCodeHandler(new OPCodeInfoEvalLocalVariableCached(OPCODE_IW_EvalLocalVariableCached2, "EvalLocalVariableCached2", 1, 2));
Expand Down
Loading

0 comments on commit a4fcb64

Please sign in to comment.