mirror of
https://github.com/rwengine/openrw.git
synced 2024-09-15 06:52:34 +02:00
Restore script debugging features to trace script threads
This commit is contained in:
parent
6178cd03e3
commit
b58cc9b164
@ -46,7 +46,7 @@ else()
|
||||
ENDIF()
|
||||
|
||||
IF(${ENABLE_SCRIPT_DEBUG})
|
||||
add_definitions(-DSCM_DEBUG_INSTRUCTIONS)
|
||||
add_definitions(-DRW_SCRIPT_DEBUG)
|
||||
ENDIF()
|
||||
|
||||
# Find dependancies
|
||||
|
@ -6,10 +6,6 @@
|
||||
#include <core/Logger.hpp>
|
||||
#include <cstring>
|
||||
|
||||
#if SCM_DEBUG_INSTRUCTIONS
|
||||
#include <iostream>
|
||||
#endif
|
||||
|
||||
SCMOpcodes::~SCMOpcodes()
|
||||
{
|
||||
for(auto m : modules)
|
||||
@ -93,7 +89,7 @@ void ScriptMachine::executeThread(SCMThread &t, int msPassed)
|
||||
pc += sizeof(SCMByte) * 2;
|
||||
break;
|
||||
case TGlobal: {
|
||||
auto v = _file->read<std::uint16_t>(pc);
|
||||
auto v = _file->read<std::uint16_t>(pc);
|
||||
parameters.back().globalPtr = globalData.data() + v; //* SCM_VARIABLE_SIZE;
|
||||
if( v >= _file->getGlobalsSize() )
|
||||
{
|
||||
@ -103,7 +99,7 @@ void ScriptMachine::executeThread(SCMThread &t, int msPassed)
|
||||
}
|
||||
break;
|
||||
case TLocal: {
|
||||
auto v = _file->read<std::uint16_t>(pc);
|
||||
auto v = _file->read<std::uint16_t>(pc);
|
||||
parameters.back().globalPtr = t.locals.data() + v * SCM_VARIABLE_SIZE;
|
||||
if( v >= SCM_THREAD_LOCAL_SIZE )
|
||||
{
|
||||
@ -149,6 +145,18 @@ void ScriptMachine::executeThread(SCMThread &t, int msPassed)
|
||||
}
|
||||
}
|
||||
|
||||
#if RW_SCRIPT_DEBUG
|
||||
if (strcmp(t.name, "EIGHT") == 0)
|
||||
{
|
||||
printf("% 8s %04x %04x % 25s", t.name, t.programCounter, opcode, code.signature.c_str());
|
||||
for (auto& a : sca.getParameters())
|
||||
{
|
||||
printf(" %08x", a.integerValue());
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
// After debugging has been completed, update the program counter
|
||||
t.programCounter = pc;
|
||||
|
||||
|
@ -19,6 +19,7 @@ GameObject* ScriptArguments::getPlayerCharacter(unsigned int player) const
|
||||
{
|
||||
auto playerId = parameters->at(player).integerValue();
|
||||
PlayerController* controller = getWorld()->players.at( playerId );
|
||||
RW_CHECK(controller != nullptr, "No controller for player " << player);
|
||||
return controller->getCharacter();
|
||||
}
|
||||
|
||||
@ -30,31 +31,41 @@ template<> GameObject* ScriptArguments::getObject< PlayerController >(unsigned i
|
||||
template<> GameObject* ScriptArguments::getObject< CharacterObject >(unsigned int arg) const
|
||||
{
|
||||
auto gameObjectID = parameters->at(arg).integerValue();
|
||||
return getWorld()->pedestrianPool.find( gameObjectID );
|
||||
auto object = getWorld()->pedestrianPool.find( gameObjectID );
|
||||
RW_CHECK(object != nullptr, "No pedestrian for ID " << gameObjectID);
|
||||
return object;
|
||||
}
|
||||
|
||||
template<> GameObject* ScriptArguments::getObject< CutsceneObject >(unsigned int arg) const
|
||||
{
|
||||
auto gameObjectID = parameters->at(arg).integerValue();
|
||||
return getWorld()->cutscenePool.find( gameObjectID );
|
||||
auto object = getWorld()->cutscenePool.find( gameObjectID );
|
||||
RW_CHECK(object != nullptr, "No cutscene object for ID " << gameObjectID);
|
||||
return object;
|
||||
}
|
||||
|
||||
template<> GameObject* ScriptArguments::getObject< InstanceObject >(unsigned int arg) const
|
||||
{
|
||||
auto gameObjectID = parameters->at(arg).integerValue();
|
||||
return getWorld()->instancePool.find( gameObjectID );
|
||||
auto object = getWorld()->instancePool.find( gameObjectID );
|
||||
RW_CHECK(object != nullptr, "No instance for ID " << gameObjectID);
|
||||
return object;
|
||||
}
|
||||
|
||||
template<> GameObject* ScriptArguments::getObject< PickupObject >(unsigned int arg) const
|
||||
{
|
||||
auto gameObjectID = parameters->at(arg).integerValue();
|
||||
return getWorld()->pickupPool.find( gameObjectID );
|
||||
auto object = getWorld()->pickupPool.find( gameObjectID );
|
||||
RW_CHECK(object != nullptr, "No pickup for ID " << gameObjectID);
|
||||
return object;
|
||||
}
|
||||
|
||||
template<> GameObject* ScriptArguments::getObject< VehicleObject >(unsigned int arg) const
|
||||
{
|
||||
auto gameObjectID = parameters->at(arg).integerValue();
|
||||
return getWorld()->vehiclePool.find( gameObjectID );
|
||||
auto object = getWorld()->vehiclePool.find( gameObjectID );
|
||||
RW_CHECK(object != nullptr, "No pedestrian for ID " << gameObjectID);
|
||||
return object;
|
||||
}
|
||||
|
||||
/*GameObject* ScriptArguments::getGameObject(unsigned int arg) const
|
||||
|
Loading…
Reference in New Issue
Block a user