/* ================ idEvent::Restore ================ */ void idEvent::Restore( idRestoreGame *savefile ) { char *str; int num, argsize, i, j, size; idStr name; byte *dataPtr; idEvent *event; const char *format; savefile->ReadInt( num ); for ( i = 0; i < num; i++ ) { if ( FreeEvents.IsListEmpty() ) { gameLocal.Error( "idEvent::Restore : No more free events" ); } event = FreeEvents.Next(); event->eventNode.Remove(); event->eventNode.AddToEnd( EventQueue ); savefile->ReadInt( event->time ); // read the event name savefile->ReadString( name ); event->eventdef = idEventDef::FindEvent( name ); if ( !event->eventdef ) { savefile->Error( "idEvent::Restore: unknown event '%s'", name.c_str() ); } // read the classtype savefile->ReadString( name ); event->typeinfo = idClass::GetClass( name ); if ( !event->typeinfo ) { savefile->Error( "idEvent::Restore: unknown class '%s' on event '%s'", name.c_str(), event->eventdef->GetName() ); } savefile->ReadObject( event->object ); // read the args savefile->ReadInt( argsize ); if ( ((size_t)argsize) != event->eventdef->GetArgSize() ) { savefile->Error( "idEvent::Restore: arg size (%d) doesn't match saved arg size(%d) on event '%s'", event->eventdef->GetArgSize(), argsize, event->eventdef->GetName() ); } if ( argsize ) { event->data = eventDataAllocator.Alloc( argsize ); format = event->eventdef->GetArgFormat(); assert( format ); for ( j = 0, size = 0; j < event->eventdef->GetNumArgs(); ++j) { dataPtr = &event->data[ event->eventdef->GetArgOffset( j ) ]; switch( format[ j ] ) { case D_EVENT_FLOAT : savefile->ReadFloat( *reinterpret_cast<float *>( dataPtr ) ); size += sizeof( float ); break; case D_EVENT_INTEGER : case D_EVENT_ENTITY : case D_EVENT_ENTITY_NULL : savefile->ReadInt( *reinterpret_cast<int *>( dataPtr ) ); size += sizeof( int ); break; case D_EVENT_VECTOR : savefile->ReadVec3( *reinterpret_cast<idVec3 *>( dataPtr ) ); size += sizeof( idVec3 ); break; case D_EVENT_TRACE : savefile->ReadBool( *reinterpret_cast<bool *>( dataPtr ) ); size += sizeof( bool ); if ( *reinterpret_cast<bool *>( dataPtr ) ) { size += sizeof( trace_t ); trace_t &t = *reinterpret_cast<trace_t *>( dataPtr + sizeof( bool ) ); RestoreTrace( savefile, t) ; if ( t.c.material ) { size += MAX_STRING_LEN; str = reinterpret_cast<char *>( dataPtr + sizeof( bool ) + sizeof( trace_t ) ); savefile->Read( str, MAX_STRING_LEN ); } } break; default: break; } } assert( size == event->eventdef->GetArgSize() ); } else { event->data = NULL; } } }
/* ================ idEvent::Restore ================ */ void idEvent::Restore( idRestoreGame* savefile ) { char* str; int num, argsize, i, j, size; idStr name; byte* dataPtr; idEvent* event; const char* format; // RB: for missing D_EVENT_STRING idStr s; // RB end savefile->ReadInt( num ); for( i = 0; i < num; i++ ) { if( FreeEvents.IsListEmpty() ) { gameLocal.Error( "idEvent::Restore : No more free events" ); } event = FreeEvents.Next(); event->eventNode.Remove(); event->eventNode.AddToEnd( EventQueue ); savefile->ReadInt( event->time ); // read the event name savefile->ReadString( name ); event->eventdef = idEventDef::FindEvent( name ); if( event->eventdef == NULL ) { savefile->Error( "idEvent::Restore: unknown event '%s'", name.c_str() ); return; } // read the classtype savefile->ReadString( name ); event->typeinfo = idClass::GetClass( name ); if( event->typeinfo == NULL ) { savefile->Error( "idEvent::Restore: unknown class '%s' on event '%s'", name.c_str(), event->eventdef->GetName() ); return; } savefile->ReadObject( event->object ); // read the args savefile->ReadInt( argsize ); if( argsize != ( int )event->eventdef->GetArgSize() ) { // RB: fixed wrong formatting savefile->Error( "idEvent::Restore: arg size (%zd) doesn't match saved arg size(%zd) on event '%s'", event->eventdef->GetArgSize(), argsize, event->eventdef->GetName() ); // RB end } if( argsize ) { event->data = eventDataAllocator.Alloc( argsize ); format = event->eventdef->GetArgFormat(); assert( format ); for( j = 0, size = 0; j < event->eventdef->GetNumArgs(); ++j ) { dataPtr = &event->data[ event->eventdef->GetArgOffset( j ) ]; switch( format[ j ] ) { case D_EVENT_FLOAT : savefile->ReadFloat( *reinterpret_cast<float*>( dataPtr ) ); // RB: 64 bit fix, changed sizeof( float ) to sizeof( intptr_t ) size += sizeof( intptr_t ); // RB end break; case D_EVENT_INTEGER : // RB: 64 bit fix savefile->ReadInt( *reinterpret_cast<int*>( dataPtr ) ); size += sizeof( intptr_t ); break; // RB end case D_EVENT_ENTITY : case D_EVENT_ENTITY_NULL : // RB: 64 bit fix, changed alignment to sizeof( intptr_t ) reinterpret_cast<idEntityPtr<idEntity> *>( dataPtr )->Restore( savefile ); size += sizeof( intptr_t ); // RB end break; case D_EVENT_VECTOR : savefile->ReadVec3( *reinterpret_cast<idVec3*>( dataPtr ) ); // RB: 64 bit fix, changed sizeof( int ) to E_EVENT_SIZEOF_VEC size += E_EVENT_SIZEOF_VEC; // RB end break; #if 1 // RB: added missing D_EVENT_STRING case case D_EVENT_STRING : savefile->ReadString( s ); //idStr::Copynz(reinterpret_cast<char *>( dataPtr ), s, s.Length() ); //size += s.Length(); idStr::Copynz( reinterpret_cast<char*>( dataPtr ), s, MAX_STRING_LEN ); size += MAX_STRING_LEN; break; // RB end #endif case D_EVENT_TRACE : savefile->ReadBool( *reinterpret_cast<bool*>( dataPtr ) ); size += sizeof( bool ); if( *reinterpret_cast<bool*>( dataPtr ) ) { size += sizeof( trace_t ); trace_t& t = *reinterpret_cast<trace_t*>( dataPtr + sizeof( bool ) ); RestoreTrace( savefile, t ) ; if( t.c.material ) { size += MAX_STRING_LEN; str = reinterpret_cast<char*>( dataPtr + sizeof( bool ) + sizeof( trace_t ) ); savefile->Read( str, MAX_STRING_LEN ); } } break; default: break; } } assert( size == ( int )event->eventdef->GetArgSize() ); } else { event->data = NULL; } } // Restore the Fast EventQueue savefile->ReadInt( num ); for( i = 0; i < num; i++ ) { if( FreeEvents.IsListEmpty() ) { gameLocal.Error( "idEvent::Restore : No more free events" ); } event = FreeEvents.Next(); event->eventNode.Remove(); event->eventNode.AddToEnd( FastEventQueue ); savefile->ReadInt( event->time ); // read the event name savefile->ReadString( name ); event->eventdef = idEventDef::FindEvent( name ); if( event->eventdef == NULL ) { savefile->Error( "idEvent::Restore: unknown event '%s'", name.c_str() ); return; } // read the classtype savefile->ReadString( name ); event->typeinfo = idClass::GetClass( name ); if( event->typeinfo == NULL ) { savefile->Error( "idEvent::Restore: unknown class '%s' on event '%s'", name.c_str(), event->eventdef->GetName() ); return; } savefile->ReadObject( event->object ); // read the args savefile->ReadInt( argsize ); if( argsize != ( int )event->eventdef->GetArgSize() ) { savefile->Error( "idEvent::Restore: arg size (%d) doesn't match saved arg size(%d) on event '%s'", event->eventdef->GetArgSize(), argsize, event->eventdef->GetName() ); } if( argsize ) { event->data = eventDataAllocator.Alloc( argsize ); savefile->Read( event->data, argsize ); } else { event->data = NULL; } } }