Falling sand and gravel
[oweals/minetest.git] / src / game.cpp
index 6c75863c01788f45c6dcce08fed5889807eb962d..ca13d292c1239650ef93b743ff48303d58786050 100644 (file)
@@ -47,9 +47,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "nodedef.h"
 #include "nodemetadata.h"
 #include "main.h" // For g_settings
-#include "content_mapnode.h" // For content_mapnode_init
 #include "tooldef.h"
-#include "content_mapnode.h" // Default nodes
+#include "tile.h" // For TextureSource
 
 /*
        Setting this to 1 enables a special camera mode that forces
@@ -256,9 +255,9 @@ void draw_hotbar(video::IVideoDriver *driver, gui::IGUIFont *font,
        /*
                Draw hearts
        */
+       video::ITexture *heart_texture = tsrc->getTextureRaw("heart.png");
+       if(heart_texture)
        {
-               video::ITexture *heart_texture =
-                               driver->getTexture(getTexturePath("heart.png").c_str());
                v2s32 p = pos + v2s32(0, -20);
                for(s32 i=0; i<halfheartcount/2; i++)
                {
@@ -519,7 +518,7 @@ void getPointedNode(Client *client, v3f player_position,
        } // for coords
 }
 
-void update_skybox(video::IVideoDriver* driver,
+void update_skybox(video::IVideoDriver* driver, ITextureSource *tsrc,
                scene::ISceneManager* smgr, scene::ISceneNode* &skybox,
                float brightness)
 {
@@ -535,32 +534,32 @@ void update_skybox(video::IVideoDriver* driver,
        if(brightness >= 0.5)
        {
                skybox = smgr->addSkyBoxSceneNode(
-                       driver->getTexture(getTexturePath("skybox2.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox3.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox1.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox1.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox1.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox1.png").c_str()));
+                       tsrc->getTextureRaw("skybox2.png"),
+                       tsrc->getTextureRaw("skybox3.png"),
+                       tsrc->getTextureRaw("skybox1.png"),
+                       tsrc->getTextureRaw("skybox1.png"),
+                       tsrc->getTextureRaw("skybox1.png"),
+                       tsrc->getTextureRaw("skybox1.png"));
        }
        else if(brightness >= 0.2)
        {
                skybox = smgr->addSkyBoxSceneNode(
-                       driver->getTexture(getTexturePath("skybox2_dawn.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox3_dawn.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox1_dawn.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox1_dawn.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox1_dawn.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox1_dawn.png").c_str()));
+                       tsrc->getTextureRaw("skybox2_dawn.png"),
+                       tsrc->getTextureRaw("skybox3_dawn.png"),
+                       tsrc->getTextureRaw("skybox1_dawn.png"),
+                       tsrc->getTextureRaw("skybox1_dawn.png"),
+                       tsrc->getTextureRaw("skybox1_dawn.png"),
+                       tsrc->getTextureRaw("skybox1_dawn.png"));
        }
        else
        {
                skybox = smgr->addSkyBoxSceneNode(
-                       driver->getTexture(getTexturePath("skybox2_night.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox3_night.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox1_night.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox1_night.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox1_night.png").c_str()),
-                       driver->getTexture(getTexturePath("skybox1_night.png").c_str()));
+                       tsrc->getTextureRaw("skybox2_night.png"),
+                       tsrc->getTextureRaw("skybox3_night.png"),
+                       tsrc->getTextureRaw("skybox1_night.png"),
+                       tsrc->getTextureRaw("skybox1_night.png"),
+                       tsrc->getTextureRaw("skybox1_night.png"),
+                       tsrc->getTextureRaw("skybox1_night.png"));
        }
 }
 
@@ -631,20 +630,17 @@ void the_game(
        /*
                Draw "Loading" screen
        */
-       /*gui::IGUIStaticText *gui_loadingtext = */
-       //draw_load_screen(L"Loading and connecting...", driver, font);
 
        draw_load_screen(L"Loading...", driver, font);
        
-       // Create tool definition manager
-       IWritableToolDefManager *tooldef = createToolDefManager();
        // Create texture source
        IWritableTextureSource *tsrc = createTextureSource(device);
+       
+       // These will be filled by data received from the server
+       // Create tool definition manager
+       IWritableToolDefManager *tooldef = createToolDefManager();
        // Create node definition manager
-       IWritableNodeDefManager *nodedef = createNodeDefManager(tsrc);
-
-       // Fill node feature table with default definitions
-       content_mapnode_init(tsrc, nodedef);
+       IWritableNodeDefManager *nodedef = createNodeDefManager();
 
        /*
                Create server.
@@ -701,54 +697,51 @@ void the_game(
        connect_address.print(&infostream);
        infostream<<std::endl;
        client.connect(connect_address);
-
-       bool could_connect = false;
        
+       /*
+               Wait for server to accept connection
+       */
+       bool could_connect = false;
        try{
+               float frametime = 0.033;
+               const float timeout = 10.0;
                float time_counter = 0.0;
                for(;;)
                {
-                       if(client.connectedAndInitialized())
-                       {
+                       // Update client and server
+                       client.step(frametime);
+                       if(server != NULL)
+                               server->step(frametime);
+                       
+                       // End condition
+                       if(client.connectedAndInitialized()){
                                could_connect = true;
                                break;
                        }
+                       // Break conditions
                        if(client.accessDenied())
-                       {
                                break;
-                       }
-                       // Wait for 10 seconds
-                       if(time_counter >= 10.0)
-                       {
+                       if(time_counter >= timeout)
                                break;
-                       }
                        
+                       // Display status
                        std::wostringstream ss;
                        ss<<L"Connecting to server... (timeout in ";
-                       ss<<(int)(10.0 - time_counter + 1.0);
+                       ss<<(int)(timeout - time_counter + 1.0);
                        ss<<L" seconds)";
                        draw_load_screen(ss.str(), driver, font);
-
-                       /*// Update screen
-                       driver->beginScene(true, true, video::SColor(255,0,0,0));
-                       guienv->drawAll();
-                       driver->endScene();*/
-
-                       // Update client and server
-
-                       client.step(0.1);
-
-                       if(server != NULL)
-                               server->step(0.1);
                        
                        // Delay a bit
-                       sleep_ms(100);
-                       time_counter += 0.1;
+                       sleep_ms(1000*frametime);
+                       time_counter += frametime;
                }
        }
        catch(con::PeerNotFoundException &e)
        {}
-
+       
+       /*
+               Handle failure to connect
+       */
        if(could_connect == false)
        {
                if(client.accessDenied())
@@ -765,13 +758,63 @@ void the_game(
                //gui_loadingtext->remove();
                return;
        }
+       
+       /*
+               Wait until content has been received
+       */
+       bool got_content = false;
+       {
+               float frametime = 0.033;
+               const float timeout = 5.0;
+               float time_counter = 0.0;
+               for(;;)
+               {
+                       // Update client and server
+                       client.step(frametime);
+                       if(server != NULL)
+                               server->step(frametime);
+                       
+                       // End condition
+                       if(client.texturesReceived() &&
+                                       client.tooldefReceived() &&
+                                       client.nodedefReceived()){
+                               got_content = true;
+                               break;
+                       }
+                       // Break conditions
+                       if(!client.connectedAndInitialized())
+                               break;
+                       if(time_counter >= timeout)
+                               break;
+                       
+                       // Display status
+                       std::wostringstream ss;
+                       ss<<L"Waiting content... (continuing anyway in ";
+                       ss<<(int)(timeout - time_counter + 1.0);
+                       ss<<L" seconds)\n";
+
+                       ss<<(client.tooldefReceived()?L"[X]":L"[  ]");
+                       ss<<L" Tool definitions\n";
+                       ss<<(client.nodedefReceived()?L"[X]":L"[  ]");
+                       ss<<L" Node definitions\n";
+                       //ss<<(client.texturesReceived()?L"[X]":L"[  ]");
+                       ss<<L"["<<(int)(client.textureReceiveProgress()*100+0.5)<<L"%] ";
+                       ss<<L" Textures\n";
+
+                       draw_load_screen(ss.str(), driver, font);
+                       
+                       // Delay a bit
+                       sleep_ms(1000*frametime);
+                       time_counter += frametime;
+               }
+       }
 
        /*
                Create skybox
        */
        float old_brightness = 1.0;
        scene::ISceneNode* skybox = NULL;
-       update_skybox(driver, smgr, skybox, 1.0);
+       update_skybox(driver, tsrc, smgr, skybox, 1.0);
        
        /*
                Create the camera node
@@ -886,6 +929,8 @@ void the_game(
        // A test
        //throw con::PeerNotFoundException("lol");
 
+       float brightness = 1.0;
+
        core::list<float> frametime_log;
 
        float nodig_delay_counter = 0.0;
@@ -1537,6 +1582,10 @@ void the_game(
                                        player->setPosition(player->getPosition() + v3f(0,-BS,0));
                                        camera.update(player, busytime, screensize);*/
                                }
+                               else if(event.type == CE_TEXTURES_UPDATED)
+                               {
+                                       update_skybox(driver, tsrc, smgr, skybox, brightness);
+                               }
                        }
                }
                
@@ -1902,25 +1951,27 @@ void the_game(
                /*
                        Calculate stuff for drawing
                */
-
+               
+               /*
+                       Calculate general brightness
+               */
                u32 daynight_ratio = client.getDayNightRatio();
-               u8 l = decode_light((daynight_ratio * LIGHT_SUN) / 1000);
+               u8 light8 = decode_light((daynight_ratio * LIGHT_SUN) / 1000);
+               brightness = (float)light8/255.0;
                video::SColor bgcolor = video::SColor(
                                255,
-                               bgcolor_bright.getRed() * l / 255,
-                               bgcolor_bright.getGreen() * l / 255,
-                               bgcolor_bright.getBlue() * l / 255);
-                               /*skycolor.getRed() * l / 255,
-                               skycolor.getGreen() * l / 255,
-                               skycolor.getBlue() * l / 255);*/
-
-               float brightness = (float)l/255.0;
+                               bgcolor_bright.getRed() * brightness,
+                               bgcolor_bright.getGreen() * brightness,
+                               bgcolor_bright.getBlue() * brightness);
+                               /*skycolor.getRed() * brightness,
+                               skycolor.getGreen() * brightness,
+                               skycolor.getBlue() * brightness);*/
 
                /*
                        Update skybox
                */
                if(fabs(brightness - old_brightness) > 0.01)
-                       update_skybox(driver, smgr, skybox, brightness);
+                       update_skybox(driver, tsrc, smgr, skybox, brightness);
 
                /*
                        Update clouds