]> git.rm.cloudns.org Git - xonotic/netradiant.git/commitdiff
Q3map2:
authorGarux <garux@mail.ru>
Wed, 2 Aug 2017 06:20:56 +0000 (09:20 +0300)
committerGarux <garux@mail.ru>
Wed, 2 Aug 2017 06:20:56 +0000 (09:20 +0300)
* fix: parsing of /* */ comments, having * or / inside

Radiant:

misc...
encapsulate RETURN_FALSE_IF_FAIL macros with do while 0: minus warnings
* button to call color selector from ents inspector color entry
* explanatory text on initial engine path configuration
* don't show Global preferences by default, except first start
* activate {xyview, camera, texbro glwidget} on mouse button press and scroll, so {texbro treeview and console} hotkeys do not override global ones
* activate windows, containing xyview, camera, texbro on mouse scroll
* fix: autoapplying trigger texture on entity creation is undoable
* fix: texbro m1/2 x2 work, when some tag is loaded
* bold key and spawnflags names in entity inspector entity description
* fix: +CameraFreeMove* command, +shift, -CameraFreeMove*, -shift = still moving (reason: caps letter)

18 files changed:
libs/gtkutil/accelerator.cpp
libs/picomodel/pm_mdc.c
libs/stringio.h
plugins/md3model/md5.cpp
radiant/camwindow.cpp
radiant/eclass_doom3.cpp
radiant/entity.cpp
radiant/entity.h
radiant/entityinspector.cpp
radiant/gtkdlgs.cpp
radiant/gtkdlgs.h
radiant/mainframe.cpp
radiant/preferences.cpp
radiant/preferences.h
radiant/texwindow.cpp
radiant/xywindow.cpp
tools/quake3/common/scriplib.c
tools/quake3/q3map2/portals.c

index c49c2c703605621157ae252bb7361584f180bf3e..5e01456c648c16839fee61650fbb0d53ea815234 100644 (file)
@@ -342,14 +342,14 @@ AcceleratorMap g_keydown_accelerators;
 AcceleratorMap g_keyup_accelerators;
 
 bool Keys_press( PressedKeys::Keys& keys, guint keyval ){
-       if ( keys.insert( keyval ).second ) {
+       if ( keys.insert( gdk_keyval_to_upper( keyval ) ).second ) {
                return AcceleratorMap_activate( g_keydown_accelerators, accelerator_for_event_key( keyval, 0 ) );
        }
        return g_keydown_accelerators.find( accelerator_for_event_key( keyval, 0 ) ) != g_keydown_accelerators.end();
 }
 
 bool Keys_release( PressedKeys::Keys& keys, guint keyval ){
-       if ( keys.erase( keyval ) != 0 ) {
+       if ( keys.erase( gdk_keyval_to_upper( keyval ) ) != 0 ) {
                return AcceleratorMap_activate( g_keyup_accelerators, accelerator_for_event_key( keyval, 0 ) );
        }
        return g_keyup_accelerators.find( accelerator_for_event_key( keyval, 0 ) ) != g_keyup_accelerators.end();
index 7e898ff1e3887f2c6d980831959c1d3c313268e1..aac525b8bb5c83f29c6329d9f098503a4425ca91 100644 (file)
@@ -52,7 +52,7 @@
 #define MDC_DIST_SCALE      0.05f
 
 /* mdc decoding normal table */
-double mdcNormals[ 256 ][ 3 ] =
+const double mdcNormals[ 256 ][ 3 ] =
 {
        { 1.000000, 0.000000, 0.000000 },
        { 0.980785, 0.195090, 0.000000 },
index 658e0ace0f476dd103b355bed31eac7b1f3fc2f4..83572e2fbcc0d70f735512eff2f464407e69f467 100644 (file)
@@ -219,7 +219,8 @@ inline bool string_parse_size( const char* string, std::size_t& i ){
 }
 
 
-#define RETURN_FALSE_IF_FAIL( expression ) if ( !expression ) {return false; }else
+//#define RETURN_FALSE_IF_FAIL( expression ) if ( !expression ) {return false; }else
+#define RETURN_FALSE_IF_FAIL( expression ) do{ if ( !expression ) {return false; } }while( 0 )
 
 inline void Tokeniser_unexpectedError( Tokeniser& tokeniser, const char* token, const char* expected ){
        globalErrorStream() << Unsigned( tokeniser.getLine() ) << ":" << Unsigned( tokeniser.getColumn() ) << ": parse error at '" << ( token != 0 ? token : "#EOF" ) << "': expected '" << expected << "'\n";
index 69719051c588e568cbafad6b86edebc8dc41eed1..6da4b7205ba2e7c70217b8942a4952d2c0b6fe87 100644 (file)
@@ -29,7 +29,8 @@
 
 #include "model.h"
 
-#define MD5_RETURN_FALSE_IF_FAIL( expression ) if ( !( expression ) ) { globalErrorStream() << "md5 parse failed: " # expression "\n"; return false; } else
+//#define MD5_RETURN_FALSE_IF_FAIL( expression ) if ( !( expression ) ) { globalErrorStream() << "md5 parse failed: " # expression "\n"; return false; } else
+#define MD5_RETURN_FALSE_IF_FAIL( expression ) do{ if ( !( expression ) ) { globalErrorStream() << "md5 parse failed: " # expression "\n"; return false; } }while( 0 )
 
 bool MD5_parseToken( Tokeniser& tokeniser, const char* string ){
        const char* token = tokeniser.getToken();
index ca7e26a0ac360ab15bc623ac72d1bc5ac446f420..1c782e43ad455c5374961a8465cd032d04294955 100644 (file)
@@ -845,6 +845,7 @@ void camwnd_update_xor_rectangle( CamWnd& self, rect_t area ){
 
 gboolean selection_button_press( GtkWidget* widget, GdkEventButton* event, WindowObserver* observer ){
        if ( event->type == GDK_BUTTON_PRESS ) {
+               gtk_widget_grab_focus( widget );
                observer->onMouseDown( WindowVector_forDouble( event->x, event->y ), button_for_button( event->button ), modifiers_for_state( event->state ) );
        }
        return FALSE;
@@ -886,6 +887,11 @@ gboolean selection_motion_freemove( GtkWidget *widget, GdkEventMotion *event, Wi
 }
 
 gboolean wheelmove_scroll( GtkWidget* widget, GdkEventScroll* event, CamWnd* camwnd ){
+       //gtk_window_set_focus( camwnd->m_parent, camwnd->m_gl_widget );
+       gtk_widget_grab_focus( camwnd->m_gl_widget );
+       if( !gtk_window_is_active( camwnd->m_parent ) )
+               gtk_window_present( camwnd->m_parent );
+
        if ( event->direction == GDK_SCROLL_UP ) {
                Camera_Freemove_updateAxes( camwnd->getCamera() );
                if( camwnd->m_bFreeMove || !g_camwindow_globals.m_bZoomInToPointer ){
index 61380f787fb141e50a5c113bcba5844a9e8442b6..a358dccea4fcbdfc2b06065f6ca6bc864ba22c91 100644 (file)
@@ -84,7 +84,8 @@ inline void printParseError( const char* message ){
        globalErrorStream() << message;
 }
 
-#define PARSE_RETURN_FALSE_IF_FAIL( expression ) if ( !( expression ) ) { printParseError( FILE_LINE "\nparse failed: " # expression "\n" ); return false; } else
+//#define PARSE_RETURN_FALSE_IF_FAIL( expression ) if ( !( expression ) ) { printParseError( FILE_LINE "\nparse failed: " # expression "\n" ); return false; } else
+#define PARSE_RETURN_FALSE_IF_FAIL( expression ) do{ if ( !( expression ) ) { printParseError( FILE_LINE "\nparse failed: " # expression "\n" ); return false; } }while( 0 )
 
 bool EntityClassDoom3_parseToken( Tokeniser& tokeniser ){
        const char* token = tokeniser.getToken();
index e1fa526039421762ea819a7326e26f0b39c8741c..d18f9456ec809414a0a4807f3f94e3d62dc4d4ce 100644 (file)
@@ -306,6 +306,19 @@ void Entity_createFromSelection( const char* name, const Vector3& origin ){
 
        bool brushesSelected = Scene_countSelectedBrushes( GlobalSceneGraph() ) != 0;
 
+       //is important to have retexturing here; if doing in the end, undo doesn't succeed;
+       if ( string_compare_nocase_n( name, "trigger_", 8 ) == 0 && brushesSelected ){
+               const char* shader = g_pGameDescription->getKeyValue( "shader_trigger" );
+               if ( shader && *shader ){
+                       Scene_PatchSetShader_Selected( GlobalSceneGraph(), shader );
+                       Scene_BrushSetShader_Selected( GlobalSceneGraph(), shader );
+               }
+               else{
+                       Scene_PatchSetShader_Selected( GlobalSceneGraph(), "textures/common/trigger" );
+                       Scene_BrushSetShader_Selected( GlobalSceneGraph(), "textures/common/trigger" );
+               }
+       }
+
        if ( !( entityClass->fixedsize || isModel ) && !brushesSelected ) {
                globalErrorStream() << "failed to create a group entity - no brushes are selected\n";
                return;
@@ -392,18 +405,6 @@ void Entity_createFromSelection( const char* name, const Vector3& origin ){
                        Node_getEntity( node )->setKeyValue( "model", model );
                }
        }
-
-       if ( string_compare_nocase_n( name, "trigger_", 8 ) == 0 && brushesSelected ){
-               const char* shader = g_pGameDescription->getKeyValue( "shader_trigger" );
-               if ( shader && *shader ){
-                       Scene_PatchSetShader_Selected( GlobalSceneGraph(), shader );
-                       Scene_BrushSetShader_Selected( GlobalSceneGraph(), shader );
-               }
-               else{
-                       Scene_PatchSetShader_Selected( GlobalSceneGraph(), "textures/common/trigger" );
-                       Scene_BrushSetShader_Selected( GlobalSceneGraph(), "textures/common/trigger" );
-               }
-       }
 }
 
 #if 0
index eaf73cbb47041be9664248e8db6361cb2e28ed5c..9096287a63eb3179e95d5fa1a0cf780e39db9335 100644 (file)
@@ -32,6 +32,7 @@ void Scene_EntitySetClassname_Selected( const char* classname );
 
 typedef struct _GtkWidget GtkWidget;
 const char* misc_model_dialog( GtkWidget* parent );
+void Entity_setColour();
 
 typedef struct _GtkMenu GtkMenu;
 void Entity_constructMenu( GtkMenu* menu );
index 9ebeec4e0d8de471c7929eaa5f9ff7fb38f396f3..4905cf0141c7b46deb37fbe620cb21d3d47cb35c 100644 (file)
@@ -222,6 +222,52 @@ ShaderAttribute( const char* key ) : StringAttribute( key ){
 };
 
 
+class ColorAttribute : public EntityAttribute
+{
+CopiedString m_key;
+BrowsedPathEntry m_entry;
+NonModalEntry m_nonModal;
+public:
+ColorAttribute( const char* key ) :
+       m_key( key ),
+       m_entry( BrowseCaller( *this ) ),
+       m_nonModal( ApplyCaller( *this ), UpdateCaller( *this ) ){
+       m_nonModal.connect( m_entry.m_entry.m_entry );
+}
+void release(){
+       delete this;
+}
+GtkWidget* getWidget() const {
+       return GTK_WIDGET( m_entry.m_entry.m_frame );
+}
+void apply(){
+       StringOutputStream value( 64 );
+       value << gtk_entry_get_text( GTK_ENTRY( m_entry.m_entry.m_entry ) );
+       Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), value.c_str() );
+}
+typedef MemberCaller<ColorAttribute, &ColorAttribute::apply> ApplyCaller;
+void update(){
+       StringOutputStream value( 64 );
+       value << SelectedEntity_getValueForKey( m_key.c_str() );
+       gtk_entry_set_text( GTK_ENTRY( m_entry.m_entry.m_entry ), value.c_str() );
+}
+typedef MemberCaller<ColorAttribute, &ColorAttribute::update> UpdateCaller;
+void browse( const BrowsedPathEntry::SetPathCallback& setPath ){
+       //const char *filename = misc_model_dialog( gtk_widget_get_toplevel( GTK_WIDGET( m_entry.m_entry.m_frame ) ) );
+
+       /* hijack BrowsedPathEntry to call colour chooser */
+       Entity_setColour();
+
+//     if ( filename != 0 ) {
+//             setPath( filename );
+//             apply();
+//     }
+       update();
+}
+typedef MemberCaller1<ColorAttribute, const BrowsedPathEntry::SetPathCallback&, &ColorAttribute::browse> BrowseCaller;
+};
+
+
 class ModelAttribute : public EntityAttribute
 {
 CopiedString m_key;
@@ -847,7 +893,34 @@ void SetComment( EntityClass* eclass ){
        g_current_comment = eclass;
 
        GtkTextBuffer* buffer = gtk_text_view_get_buffer( g_entityClassComment );
-       gtk_text_buffer_set_text( buffer, eclass->comments(), -1 );
+       //gtk_text_buffer_set_text( buffer, eclass->comments(), -1 );
+       const char* comment = eclass->comments(), *c;
+       int offset = 0, pattern_start = -1, spaces = 0;
+
+       gtk_text_buffer_set_text( buffer, comment, -1 );
+
+       // Catch patterns like "\nstuff :" used to describe keys and spawnflags, and make them bold for readability.
+
+       for( c = comment; *c; ++c, ++offset ) {
+               if( *c == '\n' ) {
+                       pattern_start = offset;
+                       spaces = 0;
+               }
+               else if( pattern_start >= 0 && ( *c < 'a' || *c > 'z' ) && ( *c < 'A' || *c > 'Z' ) && ( *c < '0' || *c > '9' ) && ( *c != '_' ) ) {
+                       if( *c == ':' && spaces <= 1 ) {
+                               GtkTextIter iter_start, iter_end;
+
+                               gtk_text_buffer_get_iter_at_offset( buffer, &iter_start, pattern_start );
+                               gtk_text_buffer_get_iter_at_offset( buffer, &iter_end, offset );
+                               gtk_text_buffer_apply_tag_by_name( buffer, "bold", &iter_start, &iter_end );
+                       }
+
+                       if( *c == ' ' )
+                               ++spaces;
+                       else
+                               pattern_start = -1;
+               }
+       }
 }
 
 void SurfaceFlags_setEntityClass( EntityClass* eclass ){
@@ -948,7 +1021,7 @@ Creators m_creators;
 public:
 EntityAttributeFactory(){
        m_creators.insert( Creators::value_type( "string", &StatelessAttributeCreator<StringAttribute>::create ) );
-       m_creators.insert( Creators::value_type( "color", &StatelessAttributeCreator<StringAttribute>::create ) );
+       m_creators.insert( Creators::value_type( "color", &StatelessAttributeCreator<ColorAttribute>::create ) );
        m_creators.insert( Creators::value_type( "integer", &StatelessAttributeCreator<StringAttribute>::create ) );
        m_creators.insert( Creators::value_type( "real", &StatelessAttributeCreator<StringAttribute>::create ) );
        m_creators.insert( Creators::value_type( "shader", &StatelessAttributeCreator<ShaderAttribute>::create ) );
@@ -1416,6 +1489,10 @@ GtkWidget* EntityInspector_constructWindow( GtkWindow* toplevel ){
                                        gtk_widget_show( GTK_WIDGET( text ) );
                                        gtk_container_add( GTK_CONTAINER( scr ), GTK_WIDGET( text ) );
                                        g_entityClassComment = text;
+                                       {
+                                               GtkTextBuffer *buffer = gtk_text_view_get_buffer( text );
+                                               gtk_text_buffer_create_tag( buffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL );
+                                       }
                                }
                        }
                }
index d0738e8d11b3891357728787673215c85179e29a..3669107a09bf5827660a77b26043db183240913f 100644 (file)
@@ -970,7 +970,7 @@ EMessageBoxReturn DoLightIntensityDlg( int *intensity ){
 // =============================================================================
 // Add new shader tag dialog
 
-EMessageBoxReturn DoShaderTagDlg( CopiedString* tag, char* title ){
+EMessageBoxReturn DoShaderTagDlg( CopiedString* tag, const char* title ){
        ModalDialog dialog;
        GtkEntry* textentry;
        ModalDialogButton ok_button( dialog, eIDOK );
@@ -1031,7 +1031,7 @@ EMessageBoxReturn DoShaderTagDlg( CopiedString* tag, char* title ){
        return ret;
 }
 
-EMessageBoxReturn DoShaderInfoDlg( const char* name, const char* filename, char* title ){
+EMessageBoxReturn DoShaderInfoDlg( const char* name, const char* filename, const char* title ){
        ModalDialog dialog;
        ModalDialogButton ok_button( dialog, eIDOK );
 
index dfebe8f805decc252711624cf3c698301cc2cf7f..3c3e76ee87239d15661dd10f47729ac9c2ff3845 100644 (file)
@@ -35,8 +35,8 @@
 #include "string/string.h"
 
 EMessageBoxReturn DoLightIntensityDlg( int *intensity );
-EMessageBoxReturn DoShaderTagDlg( CopiedString *tag, char* title );
-EMessageBoxReturn DoShaderInfoDlg( const char* name, const char* filename, char* title );
+EMessageBoxReturn DoShaderTagDlg( CopiedString *tag, const char* title );
+EMessageBoxReturn DoShaderInfoDlg( const char* name, const char* filename, const char* title );
 EMessageBoxReturn DoTextureLayout( float *fx, float *fy );
 void DoTextEditor( const char* filename, int cursorpos, int length, bool external_editor );
 
index 75662b23bfc08052610d2731fb2c8db55e49d2e9..1c956db0b9cf341a3f8b610f7af4b4a01095439f 100644 (file)
@@ -1,4 +1,4 @@
-/*
+/*
    Copyright (C) 1999-2006 Id Software, Inc. and contributors.
    For a list of contributors, see the accompanying CONTRIBUTORS file.
 
@@ -438,12 +438,28 @@ GtkWindow* BuildDialog(){
        GtkVBox* vbox2 = create_dialog_vbox( 0, 4 );
        gtk_container_add( GTK_CONTAINER( frame ), GTK_WIDGET( vbox2 ) );
 
+       const char* engine;
+#if defined( WIN32 )
+       engine = g_pGameDescription->getRequiredKeyValue( "engine_win32" );
+#elif defined( __linux__ ) || defined ( __FreeBSD__ )
+       engine = g_pGameDescription->getRequiredKeyValue( "engine_linux" );
+#elif defined( __APPLE__ )
+       engine = g_pGameDescription->getRequiredKeyValue( "engine_macos" );
+#else
+#error "unsupported platform"
+#endif
+       StringOutputStream text( 256 );
+       text << "Select directory, where game executable sits (typically \"" << engine << "\")\n";
+       GtkLabel* label = GTK_LABEL( gtk_label_new( text.c_str() ) );
+       gtk_widget_show( GTK_WIDGET( label ) );
+       gtk_container_add( GTK_CONTAINER( vbox2 ), GTK_WIDGET( label ) );
+
        {
                PreferencesPage preferencesPage( *this, GTK_WIDGET( vbox2 ) );
                Paths_constructPreferences( preferencesPage );
        }
 
-       return create_simple_modal_dialog_window( "Engine Path Not Found", m_modal, GTK_WIDGET( frame ) );
+       return create_simple_modal_dialog_window( "Engine Path Configuration", m_modal, GTK_WIDGET( frame ) );
 }
 };
 
index 52ea88774d627f3d63e98d95c925373e2a93b976..78757c39cacdf3688bfcc16272c623716ea24274 100644 (file)
@@ -444,7 +444,7 @@ void CGameDialog::Init(){
                        }
                }
        }
-       if ( m_bGamePrompt || !currentGameDescription ) {
+       if ( !currentGameDescription ) {
                Create();
                DoGameDialog();
                // use m_nComboSelect to identify the game to run as and set the globals
index 8793d03904b091a075b6cdf1a8969a09d7100b28..4b44f97fcec94db0529cc5767b86350e4a0e0cc2 100644 (file)
@@ -245,7 +245,7 @@ std::list<CGameDescription*> mGames;
 
 CGameDialog() :
        m_sGameFile( "" ),
-       m_bGamePrompt( true ),
+       m_bGamePrompt( false ),
        m_bForceLogConsole( false ){
 }
 virtual ~CGameDialog();
index 926937ea55341ee7e8ede09b21c8eda668ae4ff4..efc5f4327e8c2dca4b6cf2b19e651c8a19a0c072 100644 (file)
@@ -335,10 +335,10 @@ TextureBrowser() :
        m_rmbSelected( false ),
        m_searchedTags( false ),
        m_tags( false ),
+       m_move_started( false ),
        m_uniformTextureSize( 160 ),
        m_uniformTextureMinSize( 48 ),
-       m_hideNonShadersInCommon( true ),
-       m_move_started( false ){
+       m_hideNonShadersInCommon( true ){
 }
 };
 
@@ -779,6 +779,7 @@ void visit( const char* minor, const _QERPlugImageTable& table ) const {
 };
 
 void TextureBrowser_ShowDirectory( TextureBrowser& textureBrowser, const char* directory ){
+       textureBrowser.m_searchedTags = false;
        if ( TextureBrowser_showWads() ) {
                Archive* archive = GlobalFileSystem().getArchive( directory );
                ASSERT_NOTNULL( archive );
@@ -1377,6 +1378,7 @@ void BuildStoreAvailableTags(   GtkListStore* storeAvailable,
 
 gboolean TextureBrowser_button_press( GtkWidget* widget, GdkEventButton* event, TextureBrowser* textureBrowser ){
        if ( event->type == GDK_BUTTON_PRESS ) {
+               gtk_widget_grab_focus( widget );
                if ( event->button == 3 ) {
                        if ( GlobalTextureBrowser().m_tags ) {
                                textureBrowser->m_rmbSelected = true;
@@ -1451,6 +1453,10 @@ gboolean TextureBrowser_motion( GtkWidget *widget, GdkEventMotion *event, Textur
 }
 
 gboolean TextureBrowser_scroll( GtkWidget* widget, GdkEventScroll* event, TextureBrowser* textureBrowser ){
+       gtk_widget_grab_focus( widget );
+       if( !gtk_window_is_active( textureBrowser->m_parent ) )
+               gtk_window_present( textureBrowser->m_parent );
+
        if ( event->direction == GDK_SCROLL_UP ) {
                TextureBrowser_MouseWheel( *textureBrowser, true );
        }
@@ -2048,7 +2054,7 @@ void TextureBrowser_SetNotex(){
        name << GlobalRadiant().getAppPath() << "bitmaps/notex.png";
        g_notex = name.c_str();
 
-       name = NULL;
+       name.clear();
        name << GlobalRadiant().getAppPath() << "bitmaps/shadernotex.png";
        g_shadernotex = name.c_str();
 }
index 8b2da7cbd24ecec059b97671c0e48142cead2595..9a1be033098b674ac0b98e939d380e732b14e308 100644 (file)
@@ -746,6 +746,8 @@ void xy_update_xor_rectangle( XYWnd& self, rect_t area ){
 
 gboolean xywnd_button_press( GtkWidget* widget, GdkEventButton* event, XYWnd* xywnd ){
        if ( event->type == GDK_BUTTON_PRESS ) {
+               gtk_widget_grab_focus( xywnd->GetWidget() );
+
                if( !xywnd->Active() ){
                        g_pParentWnd->SetActiveXY( xywnd );
                }
@@ -785,6 +787,11 @@ void xywnd_motion( gdouble x, gdouble y, guint state, void* data ){
 }
 
 gboolean xywnd_wheel_scroll( GtkWidget* widget, GdkEventScroll* event, XYWnd* xywnd ){
+       gtk_widget_grab_focus( xywnd->GetWidget() );
+       GtkWindow* window = xywnd->m_parent != 0 ? xywnd->m_parent : MainFrame_getWindow();
+       if( !gtk_window_is_active( window ) )
+               gtk_window_present( window );
+
        if( !xywnd->Active() ){
                g_pParentWnd->SetActiveXY( xywnd );
        }
index 1f0ac88deeea9784ff7051f815c2027a41422421..95a09e9471f310b07df24bfeb95559be15e29597 100644 (file)
@@ -263,7 +263,7 @@ skipspace:
                        Error( "Line %i is incomplete\nFile location be: %s\n", scriptline, g_strLoadedFileLocation );
                }
                script->script_p += 2;
-               while ( script->script_p[0] != '*' && script->script_p[1] != '/' )
+               while ( script->script_p[0] != '*' || script->script_p[1] != '/' )
                {
                        if ( *script->script_p == '\n' ) {
                                script->line++;
index aee1446ea5a4fb237299f4ac1c11c644ae1438c9..c1963e7ca5a42638000f8d83eadf11e734d4ae33 100644 (file)
@@ -668,7 +668,7 @@ int FloodEntities( tree_t *tree ){
        node_t      *headnode;
        entity_t    *e, *tripped;
        const char  *value;
-       int tripcount;
+       int tripcount = INT_MIN;
 
 
        headnode = tree->headnode;