t6 waittillmatch and animations fixes
This commit is contained in:
parent
5504bef189
commit
dbde03cc24
@ -215,36 +215,37 @@ void decompiler::decompile_instruction(const instruction::ptr& inst, bool last)
|
|||||||
break;
|
break;
|
||||||
case opcode::OP_GetAnimation:
|
case opcode::OP_GetAnimation:
|
||||||
{
|
{
|
||||||
auto value = utils::string::unquote(inst->data[0]);
|
bool found = false;
|
||||||
|
|
||||||
if (value != "")
|
for (const auto& entry : program_->declarations)
|
||||||
|
{
|
||||||
|
if (entry == ast::kind::decl_usingtree)
|
||||||
|
{
|
||||||
|
if (entry.as_usingtree->name->value == inst->data[0])
|
||||||
|
found = true;
|
||||||
|
else
|
||||||
|
found = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
{
|
{
|
||||||
auto tree = std::make_unique<ast::expr_string>(loc, inst->data[0]);
|
auto tree = std::make_unique<ast::expr_string>(loc, inst->data[0]);
|
||||||
auto decl = std::make_unique<ast::decl_usingtree>(loc, std::move(tree));
|
auto decl = std::make_unique<ast::decl_usingtree>(loc, std::move(tree));
|
||||||
program_->declarations.push_back(ast::decl(std::move(decl)));
|
program_->declarations.push_back(ast::decl(std::move(decl)));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto node = std::make_unique<ast::expr_animation>(loc, utils::string::unquote(inst->data[1]));
|
auto node = std::make_unique<ast::expr_animation>(loc, inst->data[1]);
|
||||||
stack_.push(std::move(node));
|
stack_.push(std::move(node));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case opcode::OP_GetFunction:
|
case opcode::OP_GetFunction:
|
||||||
{
|
|
||||||
if (inst->data.size() == 1)
|
|
||||||
{
|
|
||||||
auto path = std::make_unique<ast::expr_path>(loc);
|
|
||||||
auto name = std::make_unique<ast::expr_identifier>(loc, inst->data[0]);
|
|
||||||
auto node = std::make_unique<ast::expr_reference>(loc, std::move(path), std::move(name));
|
|
||||||
stack_.push(std::move(node));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
auto path = std::make_unique<ast::expr_path>(loc, inst->data[0]);
|
auto path = std::make_unique<ast::expr_path>(loc, inst->data[0]);
|
||||||
auto name = std::make_unique<ast::expr_identifier>(loc, inst->data[1]);
|
auto name = std::make_unique<ast::expr_identifier>(loc, inst->data[1]);
|
||||||
auto node = std::make_unique<ast::expr_reference>(loc, std::move(path), std::move(name));
|
auto node = std::make_unique<ast::expr_reference>(loc, std::move(path), std::move(name));
|
||||||
stack_.push(std::move(node));
|
stack_.push(std::move(node));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case opcode::OP_CreateLocalVariable:
|
case opcode::OP_CreateLocalVariable:
|
||||||
throw decomp_error("unhandled opcode " + resolver::opcode_name(inst->opcode));
|
throw decomp_error("unhandled opcode " + resolver::opcode_name(inst->opcode));
|
||||||
@ -892,7 +893,7 @@ void decompiler::decompile_instruction(const instruction::ptr& inst, bool last)
|
|||||||
auto expr = ast::expr(std::move(stack_.top())); stack_.pop();
|
auto expr = ast::expr(std::move(stack_.top())); stack_.pop();
|
||||||
loc = expr.as_node->loc();
|
loc = expr.as_node->loc();
|
||||||
|
|
||||||
for (auto i = std::stoul(inst->data[0]); i > 0; i++)
|
for (auto i = std::stoul(inst->data[0]); i > 0; i--)
|
||||||
{
|
{
|
||||||
auto node = std::move(stack_.top()); stack_.pop();
|
auto node = std::move(stack_.top()); stack_.pop();
|
||||||
loc = node->loc();
|
loc = node->loc();
|
||||||
|
@ -462,7 +462,7 @@ void disassembler::disassemble_string(const instruction::ptr& inst)
|
|||||||
|
|
||||||
const auto& entry = string_refs_.at(script_->pos());
|
const auto& entry = string_refs_.at(script_->pos());
|
||||||
|
|
||||||
inst->data.push_back(entry->type ? entry->name : utils::string::to_literal(entry->name));
|
inst->data.push_back(entry->name);
|
||||||
script_->seek(2);
|
script_->seek(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -573,7 +573,7 @@ void disassembler::disassemble_end_switch(const instruction::ptr& inst)
|
|||||||
{
|
{
|
||||||
inst->data.push_back("case");
|
inst->data.push_back("case");
|
||||||
const auto& entry = string_refs_.at(script_->pos() - 2);
|
const auto& entry = string_refs_.at(script_->pos() - 2);
|
||||||
inst->data.push_back(utils::string::quote(entry->name, false));
|
inst->data.push_back(entry->name);
|
||||||
}
|
}
|
||||||
else if (value == 0)
|
else if (value == 0)
|
||||||
{
|
{
|
||||||
|
@ -565,12 +565,12 @@ auto expr_hash::print() const -> std::string
|
|||||||
|
|
||||||
auto expr_string::print() const -> std::string
|
auto expr_string::print() const -> std::string
|
||||||
{
|
{
|
||||||
return value;
|
return utils::string::to_literal(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto expr_istring::print() const -> std::string
|
auto expr_istring::print() const -> std::string
|
||||||
{
|
{
|
||||||
return "&"s += value;
|
return "&"s += utils::string::to_literal(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto expr_path::print() const -> std::string
|
auto expr_path::print() const -> std::string
|
||||||
@ -1365,12 +1365,12 @@ auto decl_usingtree::print() const -> std::string
|
|||||||
|
|
||||||
auto decl_dev_begin::print() const -> std::string
|
auto decl_dev_begin::print() const -> std::string
|
||||||
{
|
{
|
||||||
return "/#";
|
return "/#\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
auto decl_dev_end::print() const -> std::string
|
auto decl_dev_end::print() const -> std::string
|
||||||
{
|
{
|
||||||
return "#/";
|
return "#/\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
auto include::print() const -> std::string
|
auto include::print() const -> std::string
|
||||||
@ -1387,14 +1387,14 @@ auto program::print() const -> std::string
|
|||||||
data += include->print();
|
data += include->print();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data += "\n";
|
||||||
|
|
||||||
for (const auto& entry : declarations)
|
for (const auto& entry : declarations)
|
||||||
{
|
{
|
||||||
if (entry == kind::decl_thread)
|
|
||||||
{
|
|
||||||
data += "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
data += entry.print();
|
data += entry.print();
|
||||||
|
|
||||||
|
if (&entry != &declarations.back())
|
||||||
|
data += "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
|
Loading…
Reference in New Issue
Block a user