void ScriptObject::GenerateHeader() { ScriptClass *class_scriptclass = ( ScriptClass* )( this ); std::string file_name = this->GetName(); file_name.append( ".h" ); for( ScriptObject *outer = this->outer(); outer; outer = outer->outer() ) { file_name.insert( 0, "__" ); file_name.insert( 0, outer->GetName() ); } OutputLogTo( "..\\..\\..\\src\\TribesAscendSDK\\HeaderDump\\HeaderDump.h", "#include \"%s\"\n", file_name.c_str() ); file_name.insert( 0, "..\\..\\..\\src\\TribesAscendSDK\\HeaderDump\\" ); InitLoggingTo( file_name.c_str() ); OutputLogTo( file_name.c_str(), "#pragma once\n" ); OutputLogTo( file_name.c_str(), "#define ADD_VAR( x, y, z ) ( ##x ) var_##y() \\\n" ); OutputLogTo( file_name.c_str(), "{ \\\n" ); OutputLogTo( file_name.c_str(), "\tstatic ScriptProperty *script_property = ScriptObject::Find< ScriptProperty >( #x \" %s.%s.\" #y ); \\\n", this->outer()->GetName(), this->GetName() ); OutputLogTo( file_name.c_str(), "\treturn ( ##x( this, script_property->offset, z ) ); \\\n" ); OutputLogTo( file_name.c_str(), "}\n" ); OutputLogTo( file_name.c_str(), "#define ADD_STRUCT( x, y, z ) ( ##x ) var_##y() \\\n" ); OutputLogTo( file_name.c_str(), "{ \\\n" ); OutputLogTo( file_name.c_str(), "\tstatic ScriptProperty *script_property = ScriptObject::Find< ScriptProperty >( \"StructProperty %s.%s.\" #y ); \\\n", this->outer()->GetName(), this->GetName() ); OutputLogTo( file_name.c_str(), "\treturn ( ##x( this, script_property->offset, z ) ); \\\n" ); OutputLogTo( file_name.c_str(), "}\n" ); OutputLogTo( file_name.c_str(), "#define ADD_OBJECT( x, y ) ( class x* ) var_##y() \\\n" ); OutputLogTo( file_name.c_str(), "{ \\\n" ); OutputLogTo( file_name.c_str(), "\tstatic ScriptProperty *script_property = ScriptObject::Find< ScriptProperty >( \"ObjectProperty %s.%s.\" #y ); \\\n", this->outer()->GetName(), this->GetName() ); OutputLogTo( file_name.c_str(), "\treturn *( x** )( this + script_property->offset ); \\\n" ); OutputLogTo( file_name.c_str(), "}\n" ); OutputLogTo( file_name.c_str(), "namespace UnrealScript\n" ); OutputLogTo( file_name.c_str(), "{\n" ); if( class_scriptclass->super() ) OutputLogTo( file_name.c_str(), "\tclass %s : public %s\n", class_scriptclass->GetName(), class_scriptclass->super()->GetName() ); else OutputLogTo( file_name.c_str(), "\tclass %s\n", class_scriptclass->GetName() ); OutputLogTo( file_name.c_str(), "\t{\n" ); OutputLogTo( file_name.c_str(), "\tpublic:\n" ); for( int i = 0; i < object_array()->count(); i++ ) { ScriptObject *object = ( *object_array() )( i ); if( object && object->outer() == this ) { if( !strcmp( object->object_class()->GetName(), "ObjectProperty" ) ) { ScriptObjectProperty *object_property = ( ScriptObjectProperty* )( object ); OutputLogTo( file_name.c_str(), "\t\t\tADD_OBJECT( %s, %s )\n", object_property->property_class->GetName(), object->GetName() ); } else if( !strcmp( object->object_class()->GetName(), "Function" ) ) { } else if( !strcmp( object->object_class()->GetName(), "ByteProperty" ) ) OutputLogTo( file_name.c_str(), "\t\t\tADD_VAR( ::%s, %s, 0xFFFFFFFF )\n", object->object_class()->GetName(), object->GetName() ); else if( !strcmp( object->object_class()->GetName(), "IntProperty" ) ) OutputLogTo( file_name.c_str(), "\t\t\tADD_VAR( ::%s, %s, 0xFFFFFFFF )\n", object->object_class()->GetName(), object->GetName() ); else if( !strcmp( object->object_class()->GetName(), "FloatProperty" ) ) OutputLogTo( file_name.c_str(), "\t\t\tADD_VAR( ::%s, %s, 0xFFFFFFFF )\n", object->object_class()->GetName(), object->GetName() ); else if( !strcmp( object->object_class()->GetName(), "BoolProperty" ) ) { ScriptBoolProperty *bool_property = ( ScriptBoolProperty* )( object ); OutputLogTo( file_name.c_str(), "\t\t\tADD_VAR( ::%s, %s, 0x%X )\n", object->object_class()->GetName(), object->GetName(), bool_property->bit_mask ); } else if( !strcmp( object->object_class()->GetName(), "StrProperty" ) ) OutputLogTo( file_name.c_str(), "\t\t\tADD_VAR( ::%s, %s, 0xFFFFFFFF )\n", object->object_class()->GetName(), object->GetName() ); else if( !strcmp( object->object_class()->GetName(), "StringRefProperty" ) ) OutputLogTo( file_name.c_str(), "\t\t\tADD_OBJECT( void, %s, 0xFFFFFFFF )\n", object->GetName() ); else if( !strcmp( object->object_class()->GetName(), "NameProperty" ) ) OutputLogTo( file_name.c_str(), "\t\t\tADD_VAR( ::%s, %s, 0xFFFFFFFF )\n", object->object_class()->GetName(), object->GetName() ); else if( !strcmp( object->object_class()->GetName(), "StructProperty" ) ) { ScriptObjectProperty *object_property = ( ScriptObjectProperty* )( object ); if( !strcmp( object_property->property_class->GetName(), "Vector" ) ) OutputLogTo( file_name.c_str(), "\t\t\tADD_STRUCT( ::VectorProperty, %s, 0xFFFFFFFF )\n", object->GetName() ); else if( !strcmp( object_property->property_class->GetName(), "Rotator" ) ) OutputLogTo( file_name.c_str(), "\t\t\tADD_STRUCT( ::RotatorProperty, %s, 0xFFFFFFFF )\n", object->GetName() ); } } } OutputLogTo( file_name.c_str(), "\t};\n" ); OutputLogTo( file_name.c_str(), "}\n\n" ); OutputLogTo( file_name.c_str(), "#undef ADD_VAR\n" ); OutputLogTo( file_name.c_str(), "#undef ADD_STRUCT\n" ); OutputLogTo( file_name.c_str(), "#undef ADD_OBJECT\n" ); ScriptClass *core_class = ScriptObject::Find< ScriptClass >( "Class Core.Class" ); for( int i = 0; i < object_array()->count(); i++ ) { ScriptObject *class_object = ( *object_array() )( i ); ScriptClass *class_scriptclass = ( ScriptClass* )( class_object ); if( class_object && class_object->object_class() == core_class && class_scriptclass->super() == this && strcmp( class_object->outer()->GetName(), "UnrealEd" ) && strcmp( class_object->GetName(), "GenericBrowserType_GFxMovie" ) && strcmp( class_object->GetName(), "TrRank" ) ) { class_object->GenerateHeader(); } } }