1
0
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:
Daniel Evans 2016-05-22 20:05:04 +01:00
parent 6178cd03e3
commit b58cc9b164
3 changed files with 31 additions and 12 deletions

View File

@ -46,7 +46,7 @@ else()
ENDIF()
IF(${ENABLE_SCRIPT_DEBUG})
add_definitions(-DSCM_DEBUG_INSTRUCTIONS)
add_definitions(-DRW_SCRIPT_DEBUG)
ENDIF()
# Find dependancies

View File

@ -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;

View File

@ -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