]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/game.cpp
+ paper, book, bookshelf
[dragonfireclient.git] / src / game.cpp
index c806034f2e0b58abff34d97bb167d1795b78c3c3..7970a6ed9425c18b435c9f3b8f4cb87e9025abc4 100644 (file)
@@ -1,6 +1,6 @@
 /*
 Minetest-c55
-Copyright (C) 2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -22,10 +22,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "client.h"
 #include "server.h"
 #include "guiPauseMenu.h"
+#include "guiPasswordChange.h"
 #include "guiInventoryMenu.h"
 #include "guiTextInputMenu.h"
 #include "guiFurnaceMenu.h"
 #include "materials.h"
+#include "config.h"
+#include "clouds.h"
+#include "keycode.h"
 
 /*
        Setting this to 1 enables a special camera mode that forces
@@ -179,8 +183,15 @@ void updateViewingRange(f32 frametime_in, Client *client)
        float range_min = g_settings.getS16("viewing_range_nodes_min");
        float range_max = g_settings.getS16("viewing_range_nodes_max");
        
+       // Limit minimum to keep the feedback loop stable
+       if(range_min < 5)
+               range_min = 5;
+       
        draw_control.wanted_min_range = range_min;
-       draw_control.wanted_max_blocks = (1.2*draw_control.blocks_drawn)+1;
+       //draw_control.wanted_max_blocks = (1.5*draw_control.blocks_drawn)+1;
+       draw_control.wanted_max_blocks = (1.5*draw_control.blocks_would_have_drawn)+1;
+       if(draw_control.wanted_max_blocks < 10)
+               draw_control.wanted_max_blocks = 10;
        
        float block_draw_ratio = 1.0;
        if(draw_control.blocks_would_have_drawn != 0)
@@ -259,7 +270,6 @@ void updateViewingRange(f32 frametime_in, Client *client)
        }
 
        new_range += wanted_range_change;
-       //dstream<<"new_range="<<new_range/*<<std::endl*/;
        
        //float new_range_unclamped = new_range;
        if(new_range < range_min)
@@ -267,10 +277,8 @@ void updateViewingRange(f32 frametime_in, Client *client)
        if(new_range > range_max)
                new_range = range_max;
        
-       /*if(new_range != new_range_unclamped)
-               dstream<<", clamped to "<<new_range<<std::endl;
-       else
-               dstream<<std::endl;*/
+       /*dstream<<"new_range="<<new_range_unclamped
+                       <<", clamped to "<<new_range<<std::endl;*/
 
        draw_control.wanted_range = new_range;
 
@@ -338,7 +346,7 @@ void draw_hotbar(video::IVideoDriver *driver, gui::IGUIFont *font,
        */
        {
                video::ITexture *heart_texture =
-                               driver->getTexture(porting::getDataPath("heart.png").c_str());
+                               driver->getTexture(getTexturePath("heart.png").c_str());
                v2s32 p = pos + v2s32(0, -20);
                for(s32 i=0; i<halfheartcount/2; i++)
                {
@@ -578,6 +586,47 @@ void getPointedNode(Client *client, v3f player_position,
        } // for coords
 }
 
+void update_skybox(video::IVideoDriver* driver,
+               scene::ISceneManager* smgr, scene::ISceneNode* &skybox,
+               float brightness)
+{
+       if(skybox)
+       {
+               skybox->remove();
+       }
+       
+       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()));
+       }
+       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()));
+       }
+       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()));
+       }
+}
+
 void the_game(
        bool &kill,
        bool random_input,
@@ -586,6 +635,7 @@ void the_game(
        gui::IGUIFont* font,
        std::string map_dir,
        std::string playername,
+       std::string password,
        std::string address,
        u16 port,
        std::wstring &error_message
@@ -601,24 +651,29 @@ void the_game(
        const s32 hotbar_itemcount = 8;
        const s32 hotbar_imagesize = 36;
        
+       // The color of the sky
+
+       //video::SColor skycolor = video::SColor(255,140,186,250);
+
+       video::SColor bgcolor_bright = video::SColor(255,170,200,230);
+
        /*
                Draw "Loading" screen
        */
-       const wchar_t *text = L"Loading and connecting...";
-       u32 text_height = font->getDimension(text).Height;
+       const wchar_t *loadingtext = L"Loading and connecting...";
+       u32 text_height = font->getDimension(loadingtext).Height;
        core::vector2d<s32> center(screensize.X/2, screensize.Y/2);
        core::vector2d<s32> textsize(300, text_height);
        core::rect<s32> textrect(center - textsize/2, center + textsize/2);
 
        gui::IGUIStaticText *gui_loadingtext = guienv->addStaticText(
-                       text, textrect, false, false);
+                       loadingtext, textrect, false, false);
        gui_loadingtext->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
 
        driver->beginScene(true, true, video::SColor(255,0,0,0));
        guienv->drawAll();
        driver->endScene();
 
-       std::cout<<DTIME<<"Creating server and client"<<std::endl;
        
        /*
                Create server.
@@ -626,6 +681,7 @@ void the_game(
        */
        SharedPtr<Server> server;
        if(address == ""){
+               std::cout<<DTIME<<"Creating server"<<std::endl;
                server = new Server(map_dir);
                server->start(port);
        }
@@ -634,7 +690,8 @@ void the_game(
                Create client
        */
 
-       Client client(device, playername.c_str(), draw_control);
+       std::cout<<DTIME<<"Creating client"<<std::endl;
+       Client client(device, playername.c_str(), password, draw_control);
                        
        Address connect_address(0,0,0,0, port);
        try{
@@ -673,6 +730,10 @@ void the_game(
                                could_connect = true;
                                break;
                        }
+                       if(client.accessDenied())
+                       {
+                               break;
+                       }
                        // Wait for 10 seconds
                        if(time_counter >= 10.0)
                        {
@@ -701,8 +762,16 @@ void the_game(
 
        if(could_connect == false)
        {
-               std::cout<<DTIME<<"Timed out."<<std::endl;
-               error_message = L"Connection timed out.";
+               if(client.accessDenied())
+               {
+                       error_message = L"Access denied. Check your password and try again.";
+                       std::cout<<DTIME<<"Access denied."<<std::endl;
+               }
+               else
+               {
+                       error_message = L"Connection timed out.";
+                       std::cout<<DTIME<<"Timed out."<<std::endl;
+               }
                gui_loadingtext->remove();
                return;
        }
@@ -710,14 +779,9 @@ void the_game(
        /*
                Create skybox
        */
-       /*scene::ISceneNode* skybox;
-       skybox = smgr->addSkyBoxSceneNode(
-               driver->getTexture(porting::getDataPath("skybox2.png").c_str()),
-               driver->getTexture(porting::getDataPath("skybox3.png").c_str()),
-               driver->getTexture(porting::getDataPath("skybox1.png").c_str()),
-               driver->getTexture(porting::getDataPath("skybox1.png").c_str()),
-               driver->getTexture(porting::getDataPath("skybox1.png").c_str()),
-               driver->getTexture(porting::getDataPath("skybox1.png").c_str()));*/
+       float old_brightness = 1.0;
+       scene::ISceneNode* skybox = NULL;
+       update_skybox(driver, smgr, skybox, 1.0);
        
        /*
                Create the camera node
@@ -736,11 +800,6 @@ void the_game(
                return;
        }
 
-       //video::SColor skycolor = video::SColor(255,90,140,200);
-       //video::SColor skycolor = video::SColor(255,166,202,244);
-       //video::SColor skycolor = video::SColor(255,120,185,244);
-       video::SColor skycolor = video::SColor(255,140,186,250);
-
        camera->setFOV(FOV_ANGLE);
 
        // Just so big a value that everything rendered is visible
@@ -749,6 +808,15 @@ void the_game(
        f32 camera_yaw = 0; // "right/left"
        f32 camera_pitch = 0; // "up/down"
 
+       /*
+               Clouds
+       */
+       
+       float cloud_height = BS*100;
+       Clouds *clouds = NULL;
+       clouds = new Clouds(smgr->getRootSceneNode(), smgr, -1,
+                       cloud_height, time(0));
+
        /*
                Move into game
        */
@@ -845,6 +913,13 @@ void the_game(
                        break;
                }
 
+               if(g_gamecallback->changepassword_requested)
+               {
+                       (new GUIPasswordChange(guienv, guiroot, -1,
+                               &g_menumgr, &client))->drop();
+                       g_gamecallback->changepassword_requested = false;
+               }
+
                /*
                        Process TextureSource's queue
                */
@@ -1027,7 +1102,7 @@ void the_game(
                /*
                        Launch menus according to keys
                */
-               if(input->wasKeyDown(irr::KEY_KEY_I))
+               if(input->wasKeyDown(getKeySetting("keymap_inventory")))
                {
                        dstream<<DTIME<<"the_game: "
                                        <<"Launching inventory"<<std::endl;
@@ -1053,15 +1128,18 @@ void the_game(
 
                        menu->drop();
                }
-               else if(input->wasKeyDown(irr::KEY_ESCAPE))
+               else if(input->wasKeyDown(KEY_ESCAPE))
                {
                        dstream<<DTIME<<"the_game: "
                                        <<"Launching pause menu"<<std::endl;
                        // It will delete itself by itself
                        (new GUIPauseMenu(guienv, guiroot, -1, g_gamecallback,
                                        &g_menumgr))->drop();
+
+                       // Move mouse cursor on top of the disconnect button
+                       input->setMousePos(displaycenter.X, displaycenter.Y+25);
                }
-               else if(input->wasKeyDown(irr::KEY_KEY_T))
+               else if(input->wasKeyDown(getKeySetting("keymap_chat")))
                {
                        TextDest *dest = new TextDestChat(&client);
 
@@ -1069,6 +1147,28 @@ void the_game(
                                        &g_menumgr, dest,
                                        L""))->drop();
                }
+               else if(input->wasKeyDown(getKeySetting("keymap_freemove")))
+               {
+                       if(g_settings.getBool("free_move"))
+                       {
+                               g_settings.set("free_move","false");
+                       }
+                       else
+                       {
+                               g_settings.set("free_move","true");
+                       }
+               }
+               else if(input->wasKeyDown(getKeySetting("keymap_fastmove")))
+               {
+                       if(g_settings.getBool("fast_move"))
+                       {
+                               g_settings.set("fast_move","false");
+                       }
+                       else
+                       {
+                               g_settings.set("fast_move","true");
+                       }
+               }
 
                // Item selection with mouse wheel
                {
@@ -1111,7 +1211,7 @@ void the_game(
                }
 
                // Viewing range selection
-               if(input->wasKeyDown(irr::KEY_KEY_R))
+               if(input->wasKeyDown(getKeySetting("keymap_rangeselect")))
                {
                        if(draw_control.range_all)
                        {
@@ -1126,7 +1226,7 @@ void the_game(
                }
 
                // Print debug stacks
-               if(input->wasKeyDown(irr::KEY_KEY_P))
+               if(input->wasKeyDown(getKeySetting("keymap_print_debug_stacks")))
                {
                        dstream<<"-----------------------------------------"
                                        <<std::endl;
@@ -1138,6 +1238,7 @@ void the_game(
 
                /*
                        Player speed control
+                       TODO: Cache the keycodes from getKeySetting
                */
                
                {
@@ -1151,14 +1252,13 @@ void the_game(
                        float a_pitch,
                        float a_yaw*/
                        PlayerControl control(
-                               input->isKeyDown(irr::KEY_KEY_W),
-                               input->isKeyDown(irr::KEY_KEY_S),
-                               input->isKeyDown(irr::KEY_KEY_A),
-                               input->isKeyDown(irr::KEY_KEY_D),
-                               input->isKeyDown(irr::KEY_SPACE),
-                               input->isKeyDown(irr::KEY_KEY_E),
-                               input->isKeyDown(irr::KEY_LSHIFT)
-                                               || input->isKeyDown(irr::KEY_RSHIFT),
+                               input->isKeyDown(getKeySetting("keymap_forward")),
+                               input->isKeyDown(getKeySetting("keymap_backward")),
+                               input->isKeyDown(getKeySetting("keymap_left")),
+                               input->isKeyDown(getKeySetting("keymap_right")),
+                               input->isKeyDown(getKeySetting("keymap_jump")),
+                               input->isKeyDown(getKeySetting("keymap_special1")),
+                               input->isKeyDown(getKeySetting("keymap_sneak")),
                                camera_pitch,
                                camera_yaw
                        );
@@ -1208,7 +1308,7 @@ void the_game(
                
                // Get player position
                v3f player_position = client.getPlayerPosition();
-               
+
                //TimeTaker //timer2("//timer2");
 
                /*
@@ -1228,6 +1328,17 @@ void the_game(
                                s32 dx = input->getMousePos().X - displaycenter.X;
                                s32 dy = input->getMousePos().Y - displaycenter.Y;
                                //std::cout<<"window active, pos difference "<<dx<<","<<dy<<std::endl;
+                               
+                               /*const float keyspeed = 500;
+                               if(input->isKeyDown(irr::KEY_UP))
+                                       dy -= dtime * keyspeed;
+                               if(input->isKeyDown(irr::KEY_DOWN))
+                                       dy += dtime * keyspeed;
+                               if(input->isKeyDown(irr::KEY_LEFT))
+                                       dx -= dtime * keyspeed;
+                               if(input->isKeyDown(irr::KEY_RIGHT))
+                                       dx += dtime * keyspeed;*/
+
                                camera_yaw -= dx*0.2;
                                camera_pitch += dy*0.2;
                                if(camera_pitch < -89.5) camera_pitch = -89.5;
@@ -1651,9 +1762,33 @@ void the_game(
                u8 l = decode_light((daynight_ratio * LIGHT_SUN) / 1000);
                video::SColor bgcolor = video::SColor(
                                255,
-                               skycolor.getRed() * l / 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);
+                               skycolor.getBlue() * l / 255);*/
+
+               float brightness = (float)l/255.0;
+
+               /*
+                       Update skybox
+               */
+               if(fabs(brightness - old_brightness) > 0.01)
+                       update_skybox(driver, smgr, skybox, brightness);
+
+               /*
+                       Update coulds
+               */
+               if(clouds)
+               {
+                       clouds->step(dtime);
+                       clouds->update(v2f(player_position.X, player_position.Z),
+                                       0.05+brightness*0.95);
+               }
+               
+               // Store brightness value
+               old_brightness = brightness;
 
                /*
                        Fog
@@ -1661,11 +1796,11 @@ void the_game(
                
                if(g_settings.getBool("enable_fog") == true)
                {
-                       //f32 range = draw_control.wanted_range * BS + MAP_BLOCKSIZE/2*BS;
-                       f32 range = draw_control.wanted_range * BS + 0.8*MAP_BLOCKSIZE*BS;
-                       //f32 range = draw_control.wanted_range * BS + 0.0*MAP_BLOCKSIZE*BS;
+                       f32 range = draw_control.wanted_range*BS + MAP_BLOCKSIZE*BS*1.5;
                        if(draw_control.range_all)
                                range = 100000*BS;
+                       if(range < 50*BS)
+                               range = range * 0.5 + 25*BS;
 
                        driver->setFog(
                                bgcolor,
@@ -1708,13 +1843,12 @@ void the_game(
                        endscenetime_avg = endscenetime_avg * 0.95 + (float)endscenetime*0.05;
                        
                        char temptext[300];
-                       snprintf(temptext, 300, "Minetest-c55 ("
-                                       "F: item=%i"
-                                       ", R: range_all=%i"
+                       snprintf(temptext, 300, "Minetest-c55 %s ("
+                                       "R: range_all=%i"
                                        ")"
                                        " drawtime=%.0f, beginscenetime=%.0f"
                                        ", scenetime=%.0f, endscenetime=%.0f",
-                                       g_selected_item,
+                                       VERSION_STRING,
                                        draw_control.range_all,
                                        drawtime_avg,
                                        beginscenetime_avg,
@@ -1966,7 +2100,7 @@ void the_game(
                */
                {
                        TimeTaker timer("endScene");
-                       driver->endScene();
+                       endSceneX(driver);
                        endscenetime = timer.stop(true);
                }
 
@@ -1984,13 +2118,34 @@ void the_game(
                {
                        core::stringw str = L"Minetest [";
                        str += driver->getName();
-                       str += "] FPS:";
+                       str += "] FPS=";
                        str += fps;
 
                        device->setWindowCaption(str.c_str());
                        lastFPS = fps;
                }
        }
+
+       /*
+               Drop stuff
+       */
+       clouds->drop();
+       
+       /*
+               Draw a "shutting down" screen, which will be shown while the map
+               generator and other stuff quits
+       */
+       {
+               const wchar_t *shuttingdowntext = L"Shutting down stuff...";
+               gui::IGUIStaticText *gui_shuttingdowntext = guienv->addStaticText(
+                               shuttingdowntext, textrect, false, false);
+               gui_shuttingdowntext->setTextAlignment(gui::EGUIA_CENTER,
+                               gui::EGUIA_UPPERLEFT);
+               driver->beginScene(true, true, video::SColor(255,0,0,0));
+               guienv->drawAll();
+               driver->endScene();
+               gui_shuttingdowntext->remove();
+       }
 }