From 98796771bbb5c6a0c14a5994d889e3477d5a4fc1 Mon Sep 17 00:00:00 2001 From: darkrose Date: Fri, 15 May 2015 18:02:24 +1000 Subject: [PATCH] new controls plus hud updates --- data/textures/heart.png | Bin 403 -> 2813 bytes data/textures/progress_ring.png | Bin 0 -> 1191 bytes data/textures/ringbg.png | Bin 6384 -> 8275 bytes src/client.cpp | 24 ++- src/client.h | 1 + src/defaultsettings.cpp | 9 +- src/environment.cpp | 3 + src/game.cpp | 307 +++++++++++++++++++++++++++----- src/guiKeyChangeMenu.cpp | 2 +- src/keycode.cpp | 7 +- src/keycode.h | 5 +- src/player.cpp | 102 ++++++----- src/player.h | 32 ++-- src/utility.h | 7 + 14 files changed, 386 insertions(+), 113 deletions(-) create mode 100644 data/textures/progress_ring.png diff --git a/data/textures/heart.png b/data/textures/heart.png index c25b62bdc6acc6dab755b0470b4812de144374fd..206e70f91827a0fa153eacafa96e6cd65dbc88c4 100644 GIT binary patch literal 2813 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 literal 6384 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 + player->setEnergy(hp); player->hp = hp; + } if (m_server_suffocation) player->air = air; if (m_server_hunger) @@ -2167,24 +2170,35 @@ u32 Client::getDayNightRatio() u16 Client::getHP() { Player *player = m_env.getLocalPlayer(); - assert(player != NULL); + if (!player) + return 0; return player->hp; } u16 Client::getAir() { Player *player = m_env.getLocalPlayer(); - assert(player != NULL); + if (!player) + return 0; return player->air; } u16 Client::getHunger() { Player *player = m_env.getLocalPlayer(); - assert(player != NULL); + if (!player) + return 0; return player->hunger; } +float Client::getEnergy() +{ + LocalPlayer *player = m_env.getLocalPlayer(); + if (!player) + return 0.0; + return player->getEnergy(); +} + void Client::setTempMod(v3s16 p, NodeMod mod) { //JMutexAutoLock envlock(m_env_mutex); //bulk comment-out diff --git a/src/client.h b/src/client.h index bfc64af..d69e091 100644 --- a/src/client.h +++ b/src/client.h @@ -269,6 +269,7 @@ public: u16 getHP(); u16 getAir(); u16 getHunger(); + float getEnergy(); void setTempMod(v3s16 p, NodeMod mod); void clearTempMod(v3s16 p); diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 813ec6c..0a1b69e 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -43,12 +43,15 @@ void set_default_settings(Settings *settings) settings->setDefault("keymap_jump", "KEY_SPACE"); settings->setDefault("keymap_sneak", "KEY_LSHIFT"); settings->setDefault("keymap_inventory", "KEY_KEY_I"); - settings->setDefault("keymap_special1", "KEY_KEY_E"); + settings->setDefault("keymap_examine", "KEY_KEY_Q"); + settings->setDefault("keymap_use", "KEY_KEY_H"); settings->setDefault("keymap_chat", "KEY_KEY_T"); settings->setDefault("keymap_cmd", "/"); - settings->setDefault("keymap_rangeselect", "KEY_KEY_R"); + settings->setDefault("keymap_rangeselect", "KEY_KEY_O"); settings->setDefault("keymap_freemove", "KEY_KEY_K"); - settings->setDefault("keymap_fastmove", "KEY_KEY_J"); + settings->setDefault("keymap_up", "KEY_KEY_R"); + settings->setDefault("keymap_down", "KEY_KEY_F"); + settings->setDefault("keymap_run", "KEY_KEY_E"); settings->setDefault("keymap_screenshot", "KEY_F12"); settings->setDefault("keymap_toggle_hud", "KEY_F1"); settings->setDefault("keymap_toggle_chat", "KEY_F2"); diff --git a/src/environment.cpp b/src/environment.cpp index daec48e..5fd9872 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -3974,6 +3974,9 @@ void ClientEnvironment::step(float dtime) pressure_per_second = MYMAX(pressure_per_second, content_features(legs).pressure_per_second); pressure_per_second = MYMAX(pressure_per_second, content_features(torso).pressure_per_second); pressure_per_second = MYMAX(pressure_per_second, content_features(head).pressure_per_second); + // energy + if (lplayer->getEnergy() < 0.0) + damage_per_second = MYMAX(damage_per_second, 1); // cold zone if (warmth_per_second == 0 && pp.Y > 60 && myrand()%10 == 0) { if (pp.Y < 1024) { diff --git a/src/game.cpp b/src/game.cpp index f35c160..3ec8324 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -354,6 +354,201 @@ void draw_old_hotbar(video::IVideoDriver *driver, gui::IGUIFont *font, font->draw(selected.c_str(), rect2, video::SColor(255,255,255,255), false, false, NULL); } } +void draw_progress_ring( + video::IVideoDriver *driver, + v2s32 screensize, + core::position2d pos, + s32 radius, + s16 value, + video::SColor color +) +{ + if (!value) + return; + const video::SColor colors[] = {color,color,color,color}; + video::ITexture *texture = driver->getTexture(getTexturePath("progress_ring.png").c_str()); + core::rect rect(pos.X-radius,pos.Y-radius,pos.X+radius,pos.Y+radius); + if (value >= 25) { + if (value >= 50) { + { + core::rect drect(rect); + drect.LowerRightCorner.X -= radius; + core::rect srect( + core::position2d(0,0), + core::dimension2di(texture->getOriginalSize()) + ); + srect.LowerRightCorner.X /= 2; + driver->draw2DImage( + texture, + drect, + srect, + NULL, + colors, + true + ); + } + if (value >= 75) { + if (value > 99) { + { + core::rect drect(rect); + drect.UpperLeftCorner.X += radius; + core::rect srect( + core::position2d(0,0), + core::dimension2di(texture->getOriginalSize()) + ); + srect.UpperLeftCorner.X += srect.LowerRightCorner.X/2; + driver->draw2DImage( + texture, + drect, + srect, + NULL, + colors, + true + ); + } + }else{ // top right corner + { + core::rect drect(rect); + drect.UpperLeftCorner.X += radius; + drect.UpperLeftCorner.Y += radius; + core::rect srect( + core::position2d(0,0), + core::dimension2di(texture->getOriginalSize()) + ); + srect.UpperLeftCorner.X += srect.LowerRightCorner.X/2; + srect.UpperLeftCorner.Y += srect.LowerRightCorner.Y/2; + driver->draw2DImage( + texture, + drect, + srect, + NULL, + colors, + true + ); + } + { + float os = (float)((value%25)*4)/100.0; + core::rect drect(rect);; + drect.UpperLeftCorner.X += radius+(radius-((float)radius*os)); + drect.UpperLeftCorner.Y += (radius-((float)radius*os)); + drect.LowerRightCorner.Y -= radius; + core::rect srect( + core::position2d(0,0), + core::dimension2di(texture->getOriginalSize()) + ); + float v = srect.LowerRightCorner.X/2; + srect.UpperLeftCorner.X += v+(v-((float)v*os)); + v = srect.LowerRightCorner.Y/2; + srect.UpperLeftCorner.Y += (v-((float)v*os)); + srect.LowerRightCorner.Y -= v; + driver->draw2DImage( + texture, + drect, + srect, + NULL, + colors, + true + ); + } + } + }else{ // bottom right corner + { + float os = (float)((value%25)*4)/100.0; + core::rect drect(rect); + drect.UpperLeftCorner.Y += radius+(radius-((float)radius*os)); + drect.UpperLeftCorner.X += radius; + drect.LowerRightCorner.X -= (radius-((float)radius*os)); + core::rect srect( + core::position2d(0,0), + core::dimension2di(texture->getOriginalSize()) + ); + float v = srect.LowerRightCorner.X/2; + srect.UpperLeftCorner.X += v; + srect.LowerRightCorner.X -= (v-((float)v*os)); + v = srect.LowerRightCorner.Y/2; + srect.UpperLeftCorner.Y += v+(v-((float)v*os)); + driver->draw2DImage( + texture, + drect, + srect, + NULL, + colors, + true + ); + } + } + }else{ // bottom left corner + { + core::rect drect(rect); + drect.LowerRightCorner.X -= radius; + drect.LowerRightCorner.Y -= radius; + core::rect srect( + core::position2d(0,0), + core::dimension2di(texture->getOriginalSize()) + ); + srect.LowerRightCorner.X /= 2; + srect.LowerRightCorner.Y /= 2; + driver->draw2DImage( + texture, + drect, + srect, + NULL, + colors, + true + ); + } + { + float os = (float)((value%25)*4)/100.0; + core::rect drect(rect); + drect.UpperLeftCorner.Y += radius; + drect.LowerRightCorner.X -= radius+((radius-(float)radius*os)); + drect.LowerRightCorner.Y -= (radius-((float)radius*os)); + core::rect srect( + core::position2d(0,0), + core::dimension2di(texture->getOriginalSize()) + ); + float v = srect.LowerRightCorner.X/2; + srect.LowerRightCorner.X -= v+(v-((float)v*os)); + v = srect.LowerRightCorner.Y/2; + srect.UpperLeftCorner.Y += v; + srect.LowerRightCorner.Y -= (v-((float)v*os)); + driver->draw2DImage( + texture, + drect, + srect, + NULL, + colors, + true + ); + } + } + }else{ // top left corner + { + float os = (float)((value%25)*4)/100.0; + core::rect drect(rect); + drect.UpperLeftCorner.X += radius-((float)radius*os); + drect.LowerRightCorner.X -= radius; + drect.LowerRightCorner.Y -= radius+(radius-((float)radius*os)); + core::rect srect( + core::position2d(0,0), + core::dimension2di(texture->getOriginalSize()) + ); + float v = srect.LowerRightCorner.X/2; + srect.UpperLeftCorner.X += v-((float)v*os); + srect.LowerRightCorner.X /= 2; + v = srect.LowerRightCorner.Y/2; + srect.LowerRightCorner.Y -= v+(v-((float)v*os)); + driver->draw2DImage( + texture, + drect, + srect, + NULL, + colors, + true + ); + } + } +} void draw_hud( video::IVideoDriver *driver, gui::IGUIFont *font, @@ -367,6 +562,7 @@ void draw_hud( s32 halfbubblecount, bool have_hunger, s32 halfhungercount, + float energy, int crosshair ) { @@ -417,9 +613,30 @@ void draw_hud( content_t type = item->getContent(); if ((type&CONTENT_TOOLITEM_MASK) == CONTENT_TOOLITEM_MASK || (type&CONTENT_CLOTHESITEM_MASK) == CONTENT_CLOTHESITEM_MASK) { float w = item->getWear(); - w = (100.0/65535.0)*w; - txt = itows(100-w); + w = 100.0-((100.0/65535.0)*w); + txt = itows(w); txt += L"%"; + { + + video::SColor bcolor[10] = { + video::SColor(255,255,0,0), + video::SColor(255,255,40,0), + video::SColor(255,255,80,0), + video::SColor(255,255,110,0), + video::SColor(255,255,120,0), + video::SColor(255,255,140,0), + video::SColor(255,255,160,0), + video::SColor(255,170,180,0), + video::SColor(255,50,200,0), + video::SColor(255,0,255,0) + }; + int i = ((int)w)/10; + if (i < 0) + i = 0; + if (i > 9) + i = 9; + draw_progress_ring(driver,screensize,core::position2d(screensize.X-92,screensize.Y-92),40,w,bcolor[i]); + } }else{ txt = itows(item->getCount()); } @@ -559,21 +776,32 @@ void draw_hud( // health if (have_health) { int c = 55+(halfheartcount*10); - const video::SColor color(220,c,c,c); - const video::SColor colors[] = {color,color,color,color}; - video::ITexture *texture = driver->getTexture(getTexturePath("heart.png").c_str()); - core::rect rect(60,screensize.Y-108,108,screensize.Y-60); - driver->draw2DImage( - texture, - rect, - core::rect( - core::position2d(0,0), - core::dimension2di(texture->getOriginalSize()) - ), - NULL, - colors, - true - ); + float e = energy/((float)halfheartcount/100.0); + if (e > 100.0) + e = 100.0; + if (e < 0.0) + e = 0.0; + { + const video::SColor color(255,c,0,0); + draw_progress_ring(driver,screensize,core::position2d(84,screensize.Y-84),30,e,color); + } + { + const video::SColor color(220,c,c,c); + const video::SColor colors[] = {color,color,color,color}; + video::ITexture *texture = driver->getTexture(getTexturePath("heart.png").c_str()); + core::rect rect(60,screensize.Y-108,108,screensize.Y-60); + driver->draw2DImage( + texture, + rect, + core::rect( + core::position2d(0,0), + core::dimension2di(texture->getOriginalSize()) + ), + NULL, + colors, + true + ); + } std::wstring txt = itows(halfheartcount*5); txt += L"%"; @@ -1639,16 +1867,6 @@ void the_game( statustext = wgettext("free_move enabled"); statustext_time = 0; } - }else if(input->wasKeyDown(getKeySetting(VLKC_FASTMOVE))) { - if (fast_move) { - fast_move = false; - statustext = wgettext("fast_move disabled"); - statustext_time = 0; - }else{ - fast_move = true; - statustext = wgettext("fast_move enabled"); - statustext_time = 0; - } }else if(input->wasKeyDown(getKeySetting(VLKC_SCREENSHOT))) { irr::video::IImage* const image = driver->createScreenShot(); if (image) { @@ -1889,31 +2107,38 @@ void the_game( false, false, false, - fast_move, + false, + false, free_move, camera_pitch, camera_yaw ); client.setPlayerControl(control); }else{ - /*bool a_up, - bool a_down, + /* + bool a_fwd, + bool a_back, bool a_left, bool a_right, bool a_jump, - bool a_superspeed, bool a_sneak, + bool a_up, + bool a_down, + bool a_fast, + bool a_free, float a_pitch, - float a_yaw*/ + float a_yaw + */ PlayerControl control( input->isKeyDown(getKeySetting(VLKC_FORWARD)), input->isKeyDown(getKeySetting(VLKC_BACKWARD)), input->isKeyDown(getKeySetting(VLKC_LEFT)), input->isKeyDown(getKeySetting(VLKC_RIGHT)), input->isKeyDown(getKeySetting(VLKC_JUMP)), - input->isKeyDown(getKeySetting(VLKC_USE)), input->isKeyDown(getKeySetting(VLKC_SNEAK)), - fast_move, + input->isKeyDown(getKeySetting(VLKC_UP)), + input->isKeyDown(getKeySetting(VLKC_DOWN)), + input->isKeyDown(getKeySetting(VLKC_RUN)), free_move, camera_pitch, camera_yaw @@ -2222,11 +2447,9 @@ void the_game( } - if (input->getRightClicked()) { - infostream<<"Ground right-clicked"<wasKeyDown(getKeySetting(VLKC_EXAMINE)) && !random_input) { // If metadata provides an inventory view, activate it - if (meta && meta->getDrawSpecString() != "" && !random_input) { + if (meta && meta->getDrawSpecString() != "") { infostream<<"Launching custom inventory view"<getRightClicked()) { + client.groundAction(1, nodepos, neighbourpos, g_selected_item); + camera.setDigging(1); // right click animation + } nodepos_old = nodepos; } @@ -2680,6 +2904,7 @@ void the_game( client.getAir(), client.getServerHunger(), hunger, + client.getEnergy(), crosshair ); } diff --git a/src/guiKeyChangeMenu.cpp b/src/guiKeyChangeMenu.cpp index e5f4ace..bb80a0b 100644 --- a/src/guiKeyChangeMenu.cpp +++ b/src/guiKeyChangeMenu.cpp @@ -392,7 +392,7 @@ void GUIKeyChangeMenu::init_keys() key_cmd = getKeySetting(VLKC_COMMAND); key_range = getKeySetting(VLKC_RANGE); key_fly = getKeySetting(VLKC_FREEMOVE); - key_fast = getKeySetting(VLKC_FASTMOVE); + key_fast = getKeySetting(VLKC_RUN); key_use = getKeySetting(VLKC_USE); key_dump = getKeySetting(VLKC_PRINT_DEBUG); key_next_item = getKeySetting(VLKC_SELECT_NEXT); diff --git a/src/keycode.cpp b/src/keycode.cpp index de09d27..f3a648e 100644 --- a/src/keycode.cpp +++ b/src/keycode.cpp @@ -359,12 +359,15 @@ static const char* keymap_strings[] = { "keymap_jump", "keymap_sneak", "keymap_inventory", - "keymap_special1", + "keymap_use", "keymap_chat", "keymap_cmd", "keymap_rangeselect", "keymap_freemove", - "keymap_fastmove", + "keymap_up", + "keymap_down", + "keymap_run", + "keymap_examine", "keymap_screenshot", "keymap_toggle_hud", "keymap_toggle_chat", diff --git a/src/keycode.h b/src/keycode.h index 81f542e..9e73c51 100644 --- a/src/keycode.h +++ b/src/keycode.h @@ -78,7 +78,10 @@ enum KeyCode { VLKC_COMMAND, VLKC_RANGE, VLKC_FREEMOVE, - VLKC_FASTMOVE, + VLKC_UP, + VLKC_DOWN, + VLKC_RUN, + VLKC_EXAMINE, VLKC_SCREENSHOT, VLKC_TOGGLE_HUD, VLKC_TOGGLE_CHAT, diff --git a/src/player.cpp b/src/player.cpp index 3691aab..ee5f582 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -682,9 +682,8 @@ LocalPlayer::LocalPlayer(): m_sneak_node(32767,32767,32767), m_sneak_node_exists(false) { - // Initialize hp to 0, so that no hearts will be shown if server - // doesn't support health points hp = 0; + m_energy = 0.0; hunger = 0; m_character = g_settings->get("character_definition"); } @@ -929,54 +928,16 @@ void LocalPlayer::applyControl(float dtime) setSpeed(speed); } - // Whether superspeed mode is used or not - bool superspeed = false; - - // If free movement and fast movement, always move fast - if (control.free && control.fast) - superspeed = true; - - // Auxiliary button 1 (E) - if (control.aux1) { - if (control.free) { - // In free movement mode, aux1 descends - v3f speed = getSpeed(); - if (control.fast) { - speed.Y = -20*BS; - }else{ - speed.Y = -walkspeed_max; - } - setSpeed(speed); - }else if (is_climbing) { - v3f speed = getSpeed(); - speed.Y = -3*BS; - setSpeed(speed); - }else{ - // If not free movement but fast is allowed, aux1 is - // "Turbo button" - if (control.fast) - superspeed = true; - } - } - - if (control.up) + if (control.forward) speed += move_direction; - if (control.down) + if (control.backward) speed -= move_direction; if (control.left) speed += move_direction.crossProduct(v3f(0,1,0)); if (control.right) speed += move_direction.crossProduct(v3f(0,-1,0)); if (control.jump) { - if (control.free) { - v3f speed = getSpeed(); - if (control.fast) { - speed.Y = 20*BS; - }else{ - speed.Y = walkspeed_max; - } - setSpeed(speed); - }else if (touching_ground) { + if (touching_ground) { v3f speed = getSpeed(); /* NOTE: The d value in move() affects jump height by @@ -992,20 +953,65 @@ void LocalPlayer::applyControl(float dtime) speed.Y = 1.5*BS; setSpeed(speed); swimming_up = true; - } else if (is_climbing) { + } + } + if (control.up) { + if (control.free) { + v3f speed = getSpeed(); + if (control.fast) { + speed.Y = 20*BS; + }else{ + speed.Y = walkspeed_max; + } + setSpeed(speed); + }else if (in_water) { + // Use the oscillating value for getting out of water + // (so that the player doesn't fly on the surface) + v3f speed = getSpeed(); + speed.Y = 1.5*BS; + setSpeed(speed); + swimming_up = true; + }else if (is_climbing) { v3f speed = getSpeed(); speed.Y = 3*BS; setSpeed(speed); } } + if (control.down) { + if (control.free) { + // In free movement mode, aux1 descends + v3f speed = getSpeed(); + if (control.fast) { + speed.Y = -20*BS; + }else{ + speed.Y = -walkspeed_max; + } + setSpeed(speed); + }else if (is_climbing) { + v3f speed = getSpeed(); + speed.Y = -3*BS; + setSpeed(speed); + }else if (in_water) { + v3f speed = getSpeed(); + speed.Y = -5*BS; + setSpeed(speed); + } + } // The speed of the player (Y is ignored) - if (superspeed) { + if (control.fast) { + m_energy -= dtime; speed = speed.normalize() * walkspeed_max * 5.0; - }else if (control.sneak) { - speed = speed.normalize() * walkspeed_max / 3.0; }else{ - speed = speed.normalize() * walkspeed_max; + if (m_energy < hp) + m_energy += dtime*2; + if (m_energy > hp) + m_energy = hp; + if (control.sneak) { + speed = speed.normalize() * walkspeed_max / 3.0; + }else{ + speed = speed.normalize() * walkspeed_max; + } } f32 inc = walk_acceleration * BS * dtime; diff --git a/src/player.h b/src/player.h index 69b5589..fc0ff95 100644 --- a/src/player.h +++ b/src/player.h @@ -427,51 +427,55 @@ struct PlayerControl { PlayerControl() { - up = false; - down = false; + forward = false; + backward = false; left = false; right = false; jump = false; - aux1 = false; sneak = false; + up = false; + down = false; fast = false; free = false; pitch = 0; yaw = 0; } PlayerControl( - bool a_up, - bool a_down, + bool a_fwd, + bool a_back, bool a_left, bool a_right, bool a_jump, - bool a_aux1, bool a_sneak, + bool a_up, + bool a_down, bool a_fast, bool a_free, float a_pitch, float a_yaw ) { - up = a_up; - down = a_down; + forward = a_fwd; + backward = a_back; left = a_left; right = a_right; jump = a_jump; - aux1 = a_aux1; sneak = a_sneak; + up = a_up; + down = a_down; fast = a_fast; free = a_free; pitch = a_pitch; yaw = a_yaw; } - bool up; - bool down; + bool forward; + bool backward; bool left; bool right; bool jump; - bool aux1; bool sneak; + bool up; + bool down; bool fast; bool free; float pitch; @@ -495,6 +499,9 @@ public: void applyControl(float dtime); + void setEnergy(float e) {m_energy = e;} + float getEnergy() {return m_energy;} + video::ITexture* getTexture(); PlayerControl control; @@ -507,6 +514,7 @@ private: bool m_sneak_node_exists; v3s16 m_old_node_below; content_t m_old_node_below_type; + float m_energy; }; #endif // !SERVER diff --git a/src/utility.h b/src/utility.h index 9bd6b32..d0cbdf6 100644 --- a/src/utility.h +++ b/src/utility.h @@ -926,6 +926,13 @@ inline std::string ftos(float f) return o.str(); } +inline std::wstring ftows(float f) +{ + std::wstringstream o; + o<