/*
* V-Gears
* Copyright (C) 2022 V-Gears Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include "decompiler/field/instruction/FieldWalkmeshInstruction.h"
#include "decompiler/field/FieldEngine.h"
#include "decompiler/field/FieldCodeGenerator.h"
#include "decompiler/field/FieldDisassembler.h"
void FieldWalkmeshInstruction::ProcessInst(
Function& func, ValueStack&, Engine* engine, CodeGenerator *code_gen
){
FunctionMetaData md(func.metadata);
switch (opcode_){
case OPCODES::SLIP: code_gen->WriteTodo(md.GetEntityName(), "SLIP"); break;
case OPCODES::UC: ProcessUC(code_gen); break;
case OPCODES::IDLCK:
// Triangle id, on or off
code_gen->AddOutputLine(
(boost::format("walkmesh:lock_walkmesh(%1%, %2%)")
% params_[0]->GetUnsigned()
% FieldCodeGenerator::FormatBool(params_[1]->GetUnsigned())).str());
break;
case OPCODES::LINE: ProcessLINE(code_gen, md.GetEntityName()); break;
case OPCODES::LINON: code_gen->WriteTodo(md.GetEntityName(), "LINON"); break;
case OPCODES::SLINE: code_gen->WriteTodo(md.GetEntityName(), "SLINE"); break;
default:
code_gen->AddOutputLine(FieldCodeGenerator::FormatInstructionNotImplemented(
md.GetEntityName(), address_, opcode_
));
}
}
void FieldWalkmeshInstruction::ProcessUC(CodeGenerator* code_gen){
code_gen->AddOutputLine((
boost::format("entity_manager:player_lock(%1%)")
% FieldCodeGenerator::FormatBool(params_[0]->GetUnsigned())
).str());
}
void FieldWalkmeshInstruction::ProcessLINE(CodeGenerator* code_gen, const std::string& entity){
float xa = params_[0]->GetSigned();
float ya = params_[1]->GetSigned();
float za = params_[2]->GetSigned();
float xb = params_[3]->GetSigned();
float yb = params_[4]->GetSigned();
float zb = params_[5]->GetSigned();
// Scale down. TODO: Why this number?
xa *= 0.00781249709639;
ya *= 0.00781249709639;
za *= 0.00781249709639;
xb *= 0.00781249709639;
yb *= 0.00781249709639;
zb *= 0.00781249709639;
// Just print as a comment.
code_gen->AddOutputLine(
"-- LINE (" + std::to_string(xa) + ", " + std::to_string(ya) + ", " + std::to_string(za)
+ ")-(" + std::to_string(xb) + ", " +std::to_string(yb) + ", " + std::to_string(zb) + ")"
);
}