From af6086c5e53fd3b38921ff584abe3b621a2aa9f3 Mon Sep 17 00:00:00 2001 From: LMH Date: Sat, 15 Nov 2014 10:34:59 -1000 Subject: [PATCH] Completed airflower powerup abilities. Airflower is meant to be a powerup geared to speed runs and sky levels. It makes Tux light on his feet, with a passive ability of faster max run speed and greater attainable jump height. In addition, airflower has an active ability which allows Tux to glide for a short period of time after jumping. The duration that Tux can glide increases with additional airflower powerups. To glide, the user only needs to hold the jump key while falling. Every time the player jumps they may glide for a set amount of time which is reset upon Tux touching the ground. Tux sprites still need to be done, and it may be worth considering replacing the backflip with a launching jump when Tux has this powerup. Of course tweaks to the values used will also likely be needed. --- WHATSNEW.txt | 1 + .../objects/bonus_block/bonus-air_flower.png | Bin 0 -> 3137 bytes .../objects/bonus_block/bonus-earth_flower.png | Bin 0 -> 3150 bytes data/images/tiles.strf | 50 ++++++++++++++++++++- src/object/player.cpp | 33 +++++++++++++- src/object/player.hpp | 4 ++ src/supertux/player_status.hpp | 4 +- src/worldmap/tux.cpp | 6 +++ 8 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 data/images/objects/bonus_block/bonus-air_flower.png create mode 100644 data/images/objects/bonus_block/bonus-earth_flower.png diff --git a/WHATSNEW.txt b/WHATSNEW.txt index a742979a6..2e6006130 100644 --- a/WHATSNEW.txt +++ b/WHATSNEW.txt @@ -14,6 +14,7 @@ move to SDL2 menus reworked addon manager improved new tilemap- halloween +new powerups: air- and earth-flower Supertux Release 0.3.4 (2013-07) -------------------------------- diff --git a/data/images/objects/bonus_block/bonus-air_flower.png b/data/images/objects/bonus_block/bonus-air_flower.png new file mode 100644 index 0000000000000000000000000000000000000000..abc8ac19259c822bc3a23d8b7f78465afeab2f07 GIT binary patch literal 3137 zcmV-H48HS;P)WFU8GbZ8()Nlj2>E@cM*01Kr_L_t(o!)2FSaNX5; z#eaMMZ|8q5IyySKTe4*t8DV7E1}rcb34mAloK-qT_rPbuYxE7NBhMY>U{`%=QNsBv< zbkmSc)7@NW-_|?v>*tuOl}RL$?C8sI+rB{t?PY#2a)H0TX^2elJQEd%8#}uL%xVIN zp=mZrE6F$S(~0B+PFUsC#97i^v;6EUuM#Xg#>M&rtku($yb_gkH<>8KsvAMJ2ToCn6rCNd;+wLakJ9K2T1lCT@&+VmL znP9y>M`yf-jJ`*-_6+lWFHLfWU#_$er3V0wLL!b{cEL*FA&{WxFu;tNpRAmwQx-N~ zzhM~N{x^I=47ral9hg9=9o%^J7INA;v&9%nXwcX|XSSRDI}UMe$9DF0|1pW`Tl{=^ ziLTTl?eSUuWMG&`ixX)kt%gZj6L^OFL;)!k-L{W(9sJN`uI{nsOU6qb{AkKzt@1t( z3_Z%;T0eidw~^&Co2L*}aoj59N(t%Y`NiUPp6tDmukP<*RlbTeA3??Y$cQzB zXdxMEK*|`NjBXSiWG_H zQA~Rm^MOIaHb}*LFwI7!jD0FU2q92Wh*Am&h$0USjnFF*gcTxxl_-jcTRqf*MauO& zYlXA?q)^LBs?qvam&p7Cp|s*6mDgT}Kan$raJVq8BGx_$PW> zF7VO`n{_9{V}~DSyBVXRisV#3rj;ROw~&q}(KQ`Z1Vn(u3jNaL*K)e>0A7&}A0auVd*Js0c-fAr)o6P8fMa)nQNpwqcV^rI~Zru|+G>{x{HU zn5lK}%bdg;Uq%l+NkhDiq@BPunm8}>yjI@MguBR>g+<`M$Mi-Lbs^2I10RzRN4QeG zf>H`AktUKAu9Q6*43A9ACY_C=MOU+4d6Ss72i zlT!uyo3|ljJrq`d%FAPt?uJqF`VghYPB!CP=Rz4Q9k&o}4zuZu zV#kNr*)&O8+dCYcw+W10=*ea}k|~m!O`{Runm!;taYRB0Pzp_GNG0%-;QTZ1uI2fkvjN|};Q|j|^*A&6Cf;65 zAu=ItnnH^NF-y^C8xWJ9_yMD#>#6ivo#l6?@XIxFYat&;4oOP-Ns+N;ZQD@S*^HiZ#qC}<>#DU9id_r`Pqo1J62$D*EtOTWt#kcs`fCmmEBw) zOR#&k%;n)3PXFiww0F+4nm>zf1UjonFJlEAT>8l}IjhXAi6rBP;r?(7mlDtLtA-Lm z7u8(7mpG*qp;8ER zB;ew3jnRnis}LQ@a%q%(jSsRQ=IJ)CVbJblLlv0wCs|#Z!=0Vw^=h5l>H`GN{ulNG zmq40ql-DS%J6y51u&3GO(hq&Ueg1Y9$a1{?Yu2JG#6^Y-Ni3NlNsPs4ks`C`fr~Cp zg+el|Mro`c;9M}rHZ8^$w+_Ux{4Vxed&yZ7B+pG#{OEmle)nER=4uEmR*N2m%Ni$_ z4)OQjdY0E#_V9FYo|H_Il#Se~-@sL7KN>pQj1Ep#XYhkFtVEXyQwj7jqe8pp@P0T? z%Ae$Bxr33&;iUf|R~x%YnXQz)c@laLx2FdVsYG+w z+8~yep%NLKa9+oW>SU~LiYlPwSGg+DN7)Pb^`#{eJuM7BcZPWRTILZ9>O$Gho={K%tz zaFis6iA|g`9yJ0qAb~`YCkD7eAdze{`$?%5CcI_9q=H9@b-*Es2Shk{Z1(pu>6{>v zz~r#_;sC$F&RbNY(M|VKolMO@59RM15`ZECLiuUFiv*JY4<#VbpqPUBc9UY|0?dwl bf$skRWdf9dTujEr00000NkvXXu0mjfsip9T literal 0 HcmV?d00001 diff --git a/data/images/objects/bonus_block/bonus-earth_flower.png b/data/images/objects/bonus_block/bonus-earth_flower.png new file mode 100644 index 0000000000000000000000000000000000000000..c94d8d8a1a2d4e868fb7717befa3f1e03f99cccc GIT binary patch literal 3150 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.0f); visible = true; + glide_time = 0; + stone = false; swimming = false; on_ice = false; ice_this_frame = false; @@ -403,6 +412,8 @@ Player::update(float elapsed_time) if (deactivated) do_standup(); } + if (player_status->bonus == AIR_BONUS) + glide_time = player_status->max_air_time * GLIDE_TIME_PER_FLOWER; } // calculate movement for this frame @@ -718,13 +729,33 @@ Player::handle_vertical_input() else do_jump((fabs(physic.get_velocity_x()) > MAX_WALK_XM) ? -580 : -520); } - } + // airflower glide only when holding jump key + } else if (controller->hold(Controller::JUMP) && player_status->bonus == AIR_BONUS && physic.get_velocity_y() > MAX_GLIDE_YM) { + if (glide_time > 0 && !ability_timer.started()) + ability_timer.start(glide_time); + else if (ability_timer.started()) { + log_debug << ability_timer.get_timeleft() << std::endl; + if (ability_timer.get_timeleft() <= 0.05f) { + glide_time = 0; + ability_timer.stop(); + } else { + physic.set_velocity_y(MAX_GLIDE_YM); + physic.set_acceleration_y(0); + } + } + } + /*ability_timer.started() ? gliding = true : ability_timer.start(player_status->max_air_time);*/ + //} // Let go of jump key else if(!controller->hold(Controller::JUMP)) { if (!backflipping && jumping && physic.get_velocity_y() < 0) { jumping = false; early_jump_apex(); } + if (player_status->bonus == AIR_BONUS && ability_timer.started()){ + glide_time = ability_timer.get_timeleft(); + ability_timer.stop(); + } } if(jump_early_apex && physic.get_velocity_y() >= 0) { diff --git a/src/object/player.hpp b/src/object/player.hpp index 2e72b523a..4205f9f7a 100644 --- a/src/object/player.hpp +++ b/src/object/player.hpp @@ -274,6 +274,8 @@ private: int backflip_direction; Direction peekingX; Direction peekingY; + float glide_time; + bool stone; bool swimming; float speedlimit; Controller* scripting_controller_old; /**< Saves the old controller while the scripting_controller is used */ @@ -302,6 +304,8 @@ public: Timer safe_timer; Timer kick_timer; Timer shooting_timer; // used to show the arm when Tux is shooting + Timer ability_timer; // maximum lengh of time that special abilities can last + Timer cooldown_timer; // minimum time period between successive uses of a special ability Timer dying_timer; bool growing; Timer backflip_timer; diff --git a/src/supertux/player_status.hpp b/src/supertux/player_status.hpp index 6db8d8381..35adf967a 100644 --- a/src/supertux/player_status.hpp +++ b/src/supertux/player_status.hpp @@ -56,8 +56,8 @@ public: BonusType bonus; int max_fire_bullets; /**< maximum number of fire bullets in play */ int max_ice_bullets; /**< maximum number of ice bullets in play */ - int max_air_time; /**< maximum number of seconds player can float in air */ - int max_earth_time; /**< maximum number of seconds player can turn to stone */ + int max_air_time; /**set_action(moving ? "ice-walking" : "ice-stop"); break; + case AIR_BONUS: + sprite->set_action(moving ? "ice-walking" : "ice-stop"); + break; + case EARTH_BONUS: + sprite->set_action(moving ? "fire-walking" : "fire-stop"); + break; case NO_BONUS: sprite->set_action(moving ? "small-walking" : "small-stop"); break; -- 2.11.0