diff --git a/Adventures in Lestoria/Adventures in Lestoria.vcxproj b/Adventures in Lestoria/Adventures in Lestoria.vcxproj index 1180343b..a4d7d47e 100644 --- a/Adventures in Lestoria/Adventures in Lestoria.vcxproj +++ b/Adventures in Lestoria/Adventures in Lestoria.vcxproj @@ -857,6 +857,10 @@ + + + + diff --git a/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters b/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters index 593acb9e..a6d72859 100644 --- a/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters +++ b/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters @@ -1289,6 +1289,9 @@ Source Files\Effects + + Source Files\Bullet Types + diff --git a/Adventures in Lestoria/AdventuresInLestoria.cpp b/Adventures in Lestoria/AdventuresInLestoria.cpp index fb1a6424..9284d75c 100644 --- a/Adventures in Lestoria/AdventuresInLestoria.cpp +++ b/Adventures in Lestoria/AdventuresInLestoria.cpp @@ -758,9 +758,6 @@ void AiL::HandleUserInput(float fElapsedTime){ } } } - - //NOTE: An assumption is made that after handling user input all user movement temporary counters can be completely reset. They should go here! - player->RemoveAllBuffs(BuffType::INK_SLOWDOWN); } void AiL::UpdateCamera(float fElapsedTime){ @@ -1128,11 +1125,13 @@ void AiL::RenderWorld(float fElapsedTime){ const std::vectormovespeedBuffs{player->GetBuffs(BuffType::SPEEDBOOST)}; const std::vectoradrenalineRushBuffs{player->GetBuffs(BuffType::ADRENALINE_RUSH)}; const std::vectordamageReductionBuffs{player->GetBuffs(BuffType::DAMAGE_REDUCTION)}; + const std::vectorinkSlowdownDebuff{player->GetBuffs(BuffType::INK_SLOWDOWN)}; Pixel playerCol{WHITE}; if(attackBuffs.size()>0)playerCol={255,uint8_t(255*abs(sin(1.4f*attackBuffs[0].duration))),uint8_t(255*abs(sin(1.4f*attackBuffs[0].duration)))}; else if(adrenalineRushBuffs.size()>0)playerCol={uint8_t(255*abs(sin(6.f*adrenalineRushBuffs[0].duration))),255,uint8_t(255*abs(sin(6.f*adrenalineRushBuffs[0].duration)))}; else if(movespeedBuffs.size()>0)playerCol={uint8_t(255*abs(sin(2.f*movespeedBuffs[0].duration))),255,uint8_t(255*abs(sin(2.f*movespeedBuffs[0].duration)))}; + else if(inkSlowdownDebuff.size()>0)playerCol={uint8_t(255*abs(sin(2.f*inkSlowdownDebuff[0].duration))),uint8_t(255*abs(sin(2.f*inkSlowdownDebuff[0].duration))),uint8_t(255*abs(sin(2.f*inkSlowdownDebuff[0].duration)))}; if(player->HasIframes())playerCol.a*=0.62f; diff --git a/Adventures in Lestoria/Buff.h b/Adventures in Lestoria/Buff.h index 38f59c5e..18d38c8f 100644 --- a/Adventures in Lestoria/Buff.h +++ b/Adventures in Lestoria/Buff.h @@ -65,7 +65,7 @@ enum BuffType{ CURSE_OF_PAIN, CURSE_OF_DEATH, AFFECTED_BY_LIGHTNING_BOLT, //Intensity indicates number of repeats remaining. - INK_SLOWDOWN, //Intensity indicates number of ink spots running over. This buff type is reset every frame by AdventuresInLestoria::HandleUserInput! See Ink class constructor comment for more information on how this works! + INK_SLOWDOWN, //Intensity indicates % movespd slowdown. }; enum class BuffRestorationType{ ONE_OFF, //This is used as a hack fix for the RestoreDuringCast Item script since they require us to restore 1 tick immediately. Over time buffs do not apply a tick immediately. diff --git a/Adventures in Lestoria/BulletTypes.h b/Adventures in Lestoria/BulletTypes.h index 9992809e..111f7986 100644 --- a/Adventures in Lestoria/BulletTypes.h +++ b/Adventures in Lestoria/BulletTypes.h @@ -417,7 +417,7 @@ private: }; struct InkBullet:public Bullet{ - InkBullet(const vf2d pos,const vf2d targetPos,const vf2d vel,const float inkExplosionRadius,const float inkPuddleLifetime,const float inkPuddleRadius,const bool upperLevel,const bool friendly); + InkBullet(const vf2d pos,const vf2d targetPos,const vf2d vel,const float inkExplosionRadius,const float inkPuddleLifetime,const float inkSlowdownDuration,const float inkSlowdownPct,const float inkPuddleRadius,const bool upperLevel,const bool friendly); void Update(float fElapsedTime)override; BulletDestroyState PlayerHit(Player*player)override;//DO NOT CALL THIS DIRECTLY! INSTEAD USE _PlayerHit()!! BulletDestroyState MonsterHit(Monster&monster,const uint8_t markStacksBeforeHit)override;//DO NOT CALL THIS DIRECTLY! INSTEAD USE _MonsterHit()!! @@ -427,6 +427,17 @@ private: const vf2d targetPos; const float inkExplosionRadius; const float inkSlowdownPct; + const float inkSlowdownDuration; const float inkPuddleLifetime; const float inkPuddleRadius; +}; + +struct HomingBullet:public Bullet{ + HomingBullet(const vf2d pos,const Entity target,const float rotateTowardsSpeed,const float rotateTowardsSpeedCoveredInInk,const float lifetime,const float speed,const float radius,const int damage,const bool upperLevel,const bool friendly=false,const Pixel col=WHITE,const vf2d scale={1,1},const float image_angle=0.f); + void Update(float fElapsedTime)override; + void ModifyOutgoingDamageData(HurtDamageInfo&data); +private: + const Entity target; + const float rotateTowardsSpeed; + const float rotateTowardsSpeedCoveredInInk; }; \ No newline at end of file diff --git a/Adventures in Lestoria/Effect.h b/Adventures in Lestoria/Effect.h index 11727610..6bcd96e1 100644 --- a/Adventures in Lestoria/Effect.h +++ b/Adventures in Lestoria/Effect.h @@ -218,8 +218,10 @@ struct LingeringEffect:FadeInOutEffect{ struct Ink:Effect{ //NOTE: The way ink works is that every update frame, each ink stack will check for distance to player, and if the player collides with the radius of the ink it will add one to the ink debuff for the player. // At the end of AdventuresInLestoria::HandleUserInput(), the ink stack counter is reset after handling user input for moving the player. - Ink(vf2d pos,float radius,float lifetime,float fadeinTime,float fadeoutTime,vf2d size,Pixel col,bool onUpperLevel,float rotation); + Ink(vf2d pos,float radius,float lifetime,float inkSlowdownDuration,float inkSlowdownPct,float fadeinTime,float fadeoutTime,vf2d size,Pixel col,bool onUpperLevel,float rotation); virtual bool Update(float fElapsedTime)override final; private: const float radius; + const float inkSlowdownDuration; + const float inkSlowdownAmount; }; \ No newline at end of file diff --git a/Adventures in Lestoria/GiantOctopus.cpp b/Adventures in Lestoria/GiantOctopus.cpp index 22e60d83..d7452c4f 100644 --- a/Adventures in Lestoria/GiantOctopus.cpp +++ b/Adventures in Lestoria/GiantOctopus.cpp @@ -137,26 +137,29 @@ void Monster::STRATEGY::GIANT_OCTOPUS(Monster&m,float fElapsedTime,std::string s m.F(A::CASTING_TIMER)=util::random_range(ConfigFloatArr("Arm Move Timer",0),ConfigFloatArr("Arm Move Timer",1)); } if(m.F(A::SHOOT_TIMER)<=0.f){ + const auto CreateBurstBullet=[&](){ + CreateBullet(BurstBullet)(m.GetPos(),util::pointTo(m.GetPos(),game->GetPlayer()->GetPos())*ConfigFloat("Big Bullet Speed"),game->GetPlayer(),ConfigPixels("Big Bullet Detection Radius"),ConfigInt("Big Bullet Extra Bullet Count"),util::degToRad(ConfigFloat("Big Bullet Extra Bullet Rotate Speed")),ConfigFloat("Big Bullet Extra Bullet Radius"),vf2d{ConfigFloatArr("Big Bullet Extra Bullet Image Scale",0),ConfigFloatArr("Big Bullet Extra Bullet Image Scale",1)},ConfigFloat("Big Bullet Extra Bullet Speed"),ConfigFloat("Big Bullet Extra Bullet Acceleration"),ConfigFloat("Big Bullet Radius"),ConfigInt("Big Bullet Damage"),m.OnUpperLevel(),false,ConfigPixel("Big Bullet Color"),vf2d{ConfigFloat("Big Bullet Image Scale"),ConfigFloat("Big Bullet Image Scale")})EndBullet; + m.F(A::SHOOT_TIMER)=ConfigFloat("Big Bullet Boss Rest Time"); + m.I(A::ATTACK_COUNT)=-1; + }; if(InSecondPhase){ if(m.F(A::LAST_INK_SHOOT_TIMER)<=0.f){ - CreateBullet(InkBullet)(m.GetPos(),game->GetPlayer()->GetPos(),vf2d{ConfigFloat("Phase 2.Ink Bullet Speed"),0.f},ConfigFloat("Phase 2.Ink Explosion Radius"),ConfigFloat("Phase 2.Ink Puddle Lifetime"),ConfigFloat("Phase 2.Ink Puddle Collision Radius"),m.OnUpperLevel(),false)EndBullet; + CreateBullet(InkBullet)(m.GetPos(),game->GetPlayer()->GetPos(),vf2d{ConfigFloat("Phase 2.Ink Bullet Speed"),0.f},ConfigFloat("Phase 2.Ink Explosion Radius"),ConfigFloat("Phase 2.Ink Puddle Lifetime"),ConfigFloat("Phase 2.Ink Slowdown Time"),ConfigFloat("Phase 2.Ink Slowdown Amount")/100.f,ConfigFloat("Phase 2.Ink Puddle Collision Radius"),m.OnUpperLevel(),false)EndBullet; m.F(A::LAST_INK_SHOOT_TIMER)=ConfigFloat("Phase 2.Ink Bullet Frequency"); goto BulletShot; }else if(m.I(A::BULLET_COUNT_AFTER_INK_ATTACK)>ConfigInt("Phase 2.Homing Bullet Starts After")){ - /* - if(m.I(A::ATTACK_COUNT)%ConfigInt("Phase 2.Homing Bullet Frequency")==0)CreateBullet(HomingBullet)(m.GetPos(),util::pointTo(m.GetPos(),game->GetPlayer()->GetPos())*ConfigFloat("Bullet Speed"),ConfigFloat("Bullet Radius"),ConfigFloat("Bullet Damage"),m.OnUpperLevel(),false,ConfigPixel("Bullet Color"),{ConfigFloat("Bullet Radius"),ConfigFloat("Bullet Radius")})EndBullet; + if(m.I(A::ATTACK_COUNT)%ConfigInt("Phase 2.Homing Bullet Frequency")==0)CreateBullet(HomingBullet)(m.GetPos(),Entity{game->GetPlayer()},util::degToRad(ConfigFloat("Phase 2.Homing Bullet Rotation Speed")),util::degToRad(ConfigFloat("Phase 2.Homing Bullet Rotation Speed Player Covered In Ink")),ConfigFloat("Phase 2.Homing Bullet Lifetime"),ConfigFloat("Bullet Speed"),ConfigFloat("Bullet Radius"),ConfigFloat("Bullet Damage"),m.OnUpperLevel(),false,ConfigPixel("Phase 2.Homing Bullet Color"),{ConfigFloat("Bullet Radius"),ConfigFloat("Bullet Radius")})EndBullet; + else + if(m.I(A::ATTACK_COUNT)>=ConfigInt("Big Bullet Frequency")-1)CreateBurstBullet(); else CreateBullet(Bullet)(m.GetPos(),util::pointTo(m.GetPos(),game->GetPlayer()->GetPos())*ConfigFloat("Bullet Speed"),ConfigFloat("Bullet Radius"),ConfigFloat("Bullet Damage"),m.OnUpperLevel(),false,ConfigPixel("Bullet Color"),{ConfigFloat("Bullet Radius"),ConfigFloat("Bullet Radius")})EndBullet; - */ + m.F(A::SHOOT_TIMER)=ConfigFloat("Shoot Frequency"); goto BulletShot; } m.I(A::BULLET_COUNT_AFTER_INK_ATTACK)++; } - if(m.I(A::ATTACK_COUNT)>=ConfigInt("Big Bullet Frequency")-1){ - CreateBullet(BurstBullet)(m.GetPos(),util::pointTo(m.GetPos(),game->GetPlayer()->GetPos())*ConfigFloat("Big Bullet Speed"),game->GetPlayer(),ConfigPixels("Big Bullet Detection Radius"),ConfigInt("Big Bullet Extra Bullet Count"),util::degToRad(ConfigFloat("Big Bullet Extra Bullet Rotate Speed")),ConfigFloat("Big Bullet Extra Bullet Radius"),vf2d{ConfigFloatArr("Big Bullet Extra Bullet Image Scale",0),ConfigFloatArr("Big Bullet Extra Bullet Image Scale",1)},ConfigFloat("Big Bullet Extra Bullet Speed"),ConfigFloat("Big Bullet Extra Bullet Acceleration"),ConfigFloat("Big Bullet Radius"),ConfigInt("Big Bullet Damage"),m.OnUpperLevel(),false,ConfigPixel("Big Bullet Color"),vf2d{ConfigFloat("Big Bullet Image Scale"),ConfigFloat("Big Bullet Image Scale")})EndBullet; - m.F(A::SHOOT_TIMER)=ConfigFloat("Big Bullet Boss Rest Time"); - m.I(A::ATTACK_COUNT)=-1; - }else{ + if(m.I(A::ATTACK_COUNT)>=ConfigInt("Big Bullet Frequency")-1)CreateBurstBullet(); + else{ m.F(A::SHOOT_TIMER)=ConfigFloat("Shoot Frequency"); CreateBullet(Bullet)(m.GetPos(),util::pointTo(m.GetPos(),game->GetPlayer()->GetPos())*ConfigFloat("Bullet Speed"),ConfigFloat("Bullet Radius"),ConfigFloat("Bullet Damage"),m.OnUpperLevel(),false,ConfigPixel("Bullet Color"),{ConfigFloat("Bullet Radius"),ConfigFloat("Bullet Radius")})EndBullet; } diff --git a/Adventures in Lestoria/HomingBullet.cpp b/Adventures in Lestoria/HomingBullet.cpp new file mode 100644 index 00000000..e148fa17 --- /dev/null +++ b/Adventures in Lestoria/HomingBullet.cpp @@ -0,0 +1,54 @@ +#pragma region License +/* +License (OLC-3) +~~~~~~~~~~~~~~~ + +Copyright 2024 Joshua Sigona + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions or derivations of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions or derivative works in binary form must reproduce the above +copyright notice. This list of conditions and the following disclaimer must be +reproduced in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may +be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +Portions of this software are copyright © 2024 The FreeType +Project (www.freetype.org). Please see LICENSE_FT.txt for more information. +All rights reserved. +*/ +#pragma endregion + +#include "BulletTypes.h" + +HomingBullet::HomingBullet(const vf2d pos,const Entity target,const float rotateTowardsSpeed,const float rotateTowardsSpeedCoveredInInk,const float lifetime,const float speed,const float radius,const int damage,const bool upperLevel,const bool friendly,const Pixel col,const vf2d scale,const float image_angle) +:Bullet(pos,util::pointTo(pos,target.GetPos())*speed,radius,damage,upperLevel,friendly,col,scale,image_angle),target(target),rotateTowardsSpeed(rotateTowardsSpeed),rotateTowardsSpeedCoveredInInk(rotateTowardsSpeedCoveredInInk){ + this->lifetime=lifetime; +} +void HomingBullet::Update(float fElapsedTime){ + const float magnitude{vel.mag()}; + float bulletAngle{vel.polar().y}; + float bulletRotationSpeed{rotateTowardsSpeed}; + if(game->GetPlayer()->CoveredInInk())bulletRotationSpeed=rotateTowardsSpeedCoveredInInk; + if(util::distance(pos,game->GetPlayer()->GetPos())>=7*24.f)bulletRotationSpeed=0.f; //Don't rotate if basically offscreen. + util::turn_towards_target(bulletAngle,pos,target.GetPos(),bulletRotationSpeed,fElapsedTime); + vel=vf2d{magnitude,bulletAngle}.cart(); +} +void HomingBullet::ModifyOutgoingDamageData(HurtDamageInfo&data){} \ No newline at end of file diff --git a/Adventures in Lestoria/Ink.cpp b/Adventures in Lestoria/Ink.cpp index 59eb7b2d..2d41f132 100644 --- a/Adventures in Lestoria/Ink.cpp +++ b/Adventures in Lestoria/Ink.cpp @@ -40,13 +40,13 @@ All rights reserved. INCLUDE_game -Ink::Ink(vf2d pos,float radius,float lifetime,float fadeinTime,float fadeoutTime,vf2d size,Pixel col,bool onUpperLevel,float rotation) -:Effect(pos,lifetime,"ink.png",onUpperLevel,fadeinTime,fadeoutTime,size,{},EffectType::NONE,col,rotation,0.f,false),radius(radius){} +Ink::Ink(vf2d pos,float radius,float lifetime,float inkSlowdownDuration,float inkSlowdownPct,float fadeinTime,float fadeoutTime,vf2d size,Pixel col,bool onUpperLevel,float rotation) + :Effect(pos,lifetime,"ink.png",onUpperLevel,fadeinTime,fadeoutTime,size,{},EffectType::NONE,col,rotation,0.f,false),radius(radius),inkSlowdownDuration(inkSlowdownDuration),inkSlowdownAmount(inkSlowdownPct){} bool Ink::Update(float fElapsedTime){ const float distToPlayer{util::distance(game->GetPlayer()->GetPos(),pos)}; if(distToPlayer<=radius){ - Buff¤tInkSlowdown{game->GetPlayer()->GetOrAddBuff(BuffType::INK_SLOWDOWN,{lifetime,0})}; - currentInkSlowdown.intensity++; + Buff¤tInkSlowdown{game->GetPlayer()->GetOrAddBuff(BuffType::INK_SLOWDOWN,{inkSlowdownDuration,inkSlowdownAmount})}; + currentInkSlowdown.duration=inkSlowdownDuration; //Reset the duration if needed. } return Effect::Update(fElapsedTime); } \ No newline at end of file diff --git a/Adventures in Lestoria/InkBullet.cpp b/Adventures in Lestoria/InkBullet.cpp index 18edd8a1..0d6e1dc0 100644 --- a/Adventures in Lestoria/InkBullet.cpp +++ b/Adventures in Lestoria/InkBullet.cpp @@ -40,9 +40,9 @@ All rights reserved. INCLUDE_ANIMATION_DATA -InkBullet::InkBullet(const vf2d pos,const vf2d targetPos,const vf2d vel,const float inkExplosionRadius,const float inkPuddleLifetime,const float inkPuddleRadius,const bool upperLevel,const bool friendly) -:Bullet(pos,vel,inkExplosionRadius,0,"inkbullet.png",upperLevel,friendly),targetPos(targetPos),inkExplosionRadius(inkExplosionRadius),inkSlowdownPct(inkSlowdownPct),inkPuddleLifetime(inkPuddleLifetime),inkPuddleRadius(inkPuddleRadius){ - additiveBlending=true; +InkBullet::InkBullet(const vf2d pos,const vf2d targetPos,const vf2d vel,const float inkExplosionRadius,const float inkPuddleLifetime,const float inkSlowdownDuration,const float inkSlowdownPct,const float inkPuddleRadius,const bool upperLevel,const bool friendly) +:Bullet(pos,vel,inkExplosionRadius,0,"inkbullet.png",upperLevel,friendly),targetPos(targetPos),inkExplosionRadius(inkExplosionRadius),inkSlowdownPct(inkSlowdownPct),inkSlowdownDuration(inkSlowdownDuration),inkPuddleLifetime(inkPuddleLifetime),inkPuddleRadius(inkPuddleRadius){ + additiveBlending=true; } void InkBullet::Update(float fElapsedTime){ const float magnitude{vel.mag()}; @@ -52,7 +52,7 @@ void InkBullet::Update(float fElapsedTime){ } void InkBullet::Splat(){ game->AddEffect(std::make_unique(pos,ANIMATION_DATA["inkbubble_explode.png"].GetTotalAnimationDuration(),"inkbubble_explode.png",OnUpperLevel(),vf2d{1.f,1.f},0.f,vf2d{},WHITE,0.f,0.f,additiveBlending)); - game->AddEffect(std::make_unique(pos,inkPuddleRadius,inkPuddleLifetime,0.4f,0.4f,vf2d{1.f,1.f},WHITE,OnUpperLevel(),int(util::random_range(0,4.f))*PI/2),true); + game->AddEffect(std::make_unique(pos,inkPuddleRadius,inkPuddleLifetime,inkSlowdownDuration,inkSlowdownPct,0.4f,0.4f,vf2d{1.f,1.f},WHITE,OnUpperLevel(),int(util::random_range(0,4.f))*PI/2),true); lifetime=0.f; } BulletDestroyState InkBullet::PlayerHit(Player*player){ diff --git a/Adventures in Lestoria/Player.cpp b/Adventures in Lestoria/Player.cpp index 2b33e8c1..be1d6195 100644 --- a/Adventures in Lestoria/Player.cpp +++ b/Adventures in Lestoria/Player.cpp @@ -318,6 +318,9 @@ float Player::GetMoveSpdMult(){ for(const Buff&b:GetBuffs(BuffType::BLOCK_SLOWDOWN)){ mod_moveSpd-=moveSpdPct*b.intensity; } + for(const Buff&b:GetBuffs(BuffType::INK_SLOWDOWN)){ + mod_moveSpd-=moveSpdPct*b.intensity; + } for(const Buff&b:GetBuffs(LOCKON_SPEEDBOOST)){ mod_moveSpd+=moveSpdPct*b.intensity; } @@ -330,9 +333,6 @@ float Player::GetMoveSpdMult(){ for(const Buff&b:GetBuffs(BuffType::ADRENALINE_RUSH)){ mod_moveSpd+=moveSpdPct*"Thief.Ability 3.Movement Speed Increase"_F/100.f; } - for(const Buff&b:GetBuffs(BuffType::INK_SLOWDOWN)){ - mod_moveSpd-=moveSpdPct*(b.intensity*"MonsterStrategy.Giant Octopus.Phase 2.Ink Slowdown Amount"_F/100.f); - } return mod_moveSpd; } @@ -2319,4 +2319,7 @@ void Player::AddMoney(const uint32_t moneyCost){ } const bool Player::HasBuff(BuffType buff)const{ return std::find_if(buffList.begin(),buffList.end(),[type=buff](const Buff&buff){return buff.type==type;})!=buffList.end(); +} +const bool Player::CoveredInInk()const{ + return HasBuff(BuffType::INK_SLOWDOWN); } \ No newline at end of file diff --git a/Adventures in Lestoria/Player.h b/Adventures in Lestoria/Player.h index 6444c086..d7f77713 100644 --- a/Adventures in Lestoria/Player.h +++ b/Adventures in Lestoria/Player.h @@ -338,6 +338,7 @@ public: void CastSpell(Ability&ability); //NOTE: This usually is not called unless we are running tests! CastSpell is meant to be used when we have chosen a pre-casting target position and have released the associated key to cast the spell. void PrepareCast(Ability&ability); //NOTE: This usually is not called unless we are running tests! PrepareCast is meant to be used before we use CastSpell in unit tests. void SetTestScreenAimingLocation(vf2d forcedAimingLoc); + const bool CoveredInInk()const; private: static std::vector>ABILITY_LIST; const int SHIELD_CAPACITY{32}; diff --git a/Adventures in Lestoria/Version.h b/Adventures in Lestoria/Version.h index d79a6c83..cbac74cd 100644 --- a/Adventures in Lestoria/Version.h +++ b/Adventures in Lestoria/Version.h @@ -39,7 +39,7 @@ All rights reserved. #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_PATCH 0 -#define VERSION_BUILD 11900 +#define VERSION_BUILD 11914 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Adventures in Lestoria/assets/config/MonsterStrategies.txt b/Adventures in Lestoria/assets/config/MonsterStrategies.txt index d82b7ada..3299349a 100644 --- a/Adventures in Lestoria/assets/config/MonsterStrategies.txt +++ b/Adventures in Lestoria/assets/config/MonsterStrategies.txt @@ -1285,12 +1285,17 @@ MonsterStrategy Ink Bullet Frequency = 15s Ink Explosion Radius = 57px # Movespeed to decrease by - Ink Slowdown Amount = 30% + Ink Slowdown Amount = 40% + Ink Slowdown Time = 25s Ink Puddle Lifetime = 30s Ink Puddle Collision Radius = 28px Homing Bullet Starts After = 6 Ink Bullets # Every nth bullet will be a homing bullet, n determined by this value Homing Bullet Frequency = 2 Bullets + Homing Bullet Rotation Speed = 80deg/s + Homing Bullet Rotation Speed Player Covered In Ink = 30deg/s + Homing Bullet Lifetime = 12s + Homing Bullet Color = 110r,255g,110b,255a } } } \ No newline at end of file diff --git a/Adventures in Lestoria/util.cpp b/Adventures in Lestoria/util.cpp index eff52455..452a1058 100644 --- a/Adventures in Lestoria/util.cpp +++ b/Adventures in Lestoria/util.cpp @@ -38,6 +38,7 @@ All rights reserved. #include "util.h" #include "olcPixelGameEngine.h" #include "olcPGEX_TTF.h" +#include "Entity.h" std::random_device rd; std::mt19937 rng(rd()); @@ -210,6 +211,12 @@ void util::turn_towards_direction(float&angle,float target,float rate) diff<0&&newAngleDiff>0)angle=fmod(target,2*PI); //We have crossed the angle difference threshold and can safely say we reached it. } +void util::turn_towards_target(float&angle,const vf2d fromPos,const vf2d toPos,float rate,const std::optionalfElapsedTime) +{ + const float targetAngle{util::angleTo(fromPos,toPos)}; + turn_towards_direction(angle,targetAngle,rate*fElapsedTime.value_or(1.f)); +} + std::wstring util::to_wstring(const std::string&str){ return {str.begin(),str.end()}; } diff --git a/Adventures in Lestoria/util.h b/Adventures in Lestoria/util.h index e14e7d29..abca4977 100644 --- a/Adventures in Lestoria/util.h +++ b/Adventures in Lestoria/util.h @@ -41,6 +41,9 @@ All rights reserved. #include "olcPGEX_TTF.h" #include "Direction.h" #include +#include + +class Entity; namespace olc::util{ //Returns 0-range (as a float). @@ -91,6 +94,9 @@ namespace olc::util{ const float distance(const vf2d&point1,const vf2d&point2); //Modifies angle argument directly to turn towards said direction. rate is in radians, please multiply by fElapsedTime if you intend to use this per frame. void turn_towards_direction(float&angle,float target,float rate); + //Modifies angle argument directly to turn from a given position and angle towards said target. rate is in radians, no need to multiply by fElapsedTime. + //If you need a raw angle amount, then DO NOT DEFINE A fElapsedTime value!!! + void turn_towards_target(float&angle,const vf2d fromPos,const vf2d toPos,float rate,const std::optionalfElapsedTime); std::wstring to_wstring(const std::string&str); template diff --git a/x64/Release/Adventures in Lestoria.exe b/x64/Release/Adventures in Lestoria.exe index f4e592a5..691b39a8 100644 Binary files a/x64/Release/Adventures in Lestoria.exe and b/x64/Release/Adventures in Lestoria.exe differ