Fix Ranger Charged Shot and Multi Shot animations being overwritten by cast completion state resetting. Release Build 8367.
This commit is contained in:
parent
37d738fbf9
commit
0830185829
@ -2068,7 +2068,6 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){
|
||||
Audio::UpdateBGMVolume();
|
||||
#endif
|
||||
game->view.SetZoom(1.f,game->view.WorldToScreen(game->camera.GetViewPosition()));
|
||||
SetMosaicEffect(1U);
|
||||
worldColor=WHITE;
|
||||
worldColorFunc=[&](vi2d pos){return game->worldColor;};
|
||||
levelTime=0;
|
||||
@ -2106,6 +2105,7 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){
|
||||
|
||||
#pragma region Monster Spawn Data Setup (Loading phase 2)
|
||||
LoadingScreen::AddPhase([&](){
|
||||
SetMosaicEffect(1U);
|
||||
for(auto&[key,value]:MAP_DATA[GetCurrentLevel()].SpawnerData){
|
||||
SpawnerTag&spawnData=MAP_DATA[GetCurrentLevel()].SpawnerData[key];
|
||||
std::vector<std::pair<std::string,vf2d>>monster_list;
|
||||
|
@ -315,13 +315,13 @@ void Player::Update(float fElapsedTime){
|
||||
castInfo.castTimer-=fElapsedTime;
|
||||
if(castInfo.castTimer<=0){
|
||||
bool allowed=castPrepAbility->actionPerformedDuringCast;
|
||||
SetState(State::NORMAL);
|
||||
if(!allowed&&castPrepAbility->action(this,castInfo.castPos))allowed=true;
|
||||
if(allowed){
|
||||
castPrepAbility->cooldown=castPrepAbility->GetCooldownTime();
|
||||
ConsumeMana(castPrepAbility->manaCost);
|
||||
}
|
||||
castInfo.castTimer=0;
|
||||
SetState(State::NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -605,6 +605,9 @@ void Player::Update(float fElapsedTime){
|
||||
|
||||
#pragma region Ranger
|
||||
if(GetState()==State::SHOOT_ARROW){
|
||||
if(rangerShootAnimationTimer>0.f){
|
||||
rangerShootAnimationTimer=std::max(0.f,rangerShootAnimationTimer-fElapsedTime);
|
||||
}else
|
||||
if(attack_cooldown_timer<=ARROW_ATTACK_COOLDOWN-0.3){
|
||||
SetState(State::NORMAL);
|
||||
}
|
||||
@ -773,9 +776,9 @@ void Player::AddAnimation(std::string state){
|
||||
animation.AddState(state,ANIMATION_DATA.at(state));
|
||||
}
|
||||
|
||||
void Player::UpdateAnimation(std::string animState,int specificClass,const bool force){
|
||||
void Player::UpdateAnimation(std::string animState,int specificClass){
|
||||
if(specificClass==ANY||specificClass&GetClass()){
|
||||
animation.ChangeState(internal_animState,animState,force);
|
||||
animation.ChangeState(internal_animState,animState);
|
||||
}
|
||||
}
|
||||
|
||||
@ -974,31 +977,31 @@ void Player::SetAnimationBasedOnTargetingDirection(float targetDirection){
|
||||
case Class::WARRIOR:
|
||||
case Class::THIEF:{
|
||||
if(FacingNorth()){
|
||||
UpdateAnimation("WARRIOR_SWINGSWORD_N",true);
|
||||
UpdateAnimation("WARRIOR_SWINGSWORD_N");
|
||||
}else
|
||||
if(FacingSouth()){
|
||||
UpdateAnimation("WARRIOR_SWINGSWORD_S",true);
|
||||
UpdateAnimation("WARRIOR_SWINGSWORD_S");
|
||||
}else
|
||||
if(FacingWest()){
|
||||
UpdateAnimation("WARRIOR_SWINGSWORD_W",true);
|
||||
UpdateAnimation("WARRIOR_SWINGSWORD_W");
|
||||
}else
|
||||
if(FacingEast()){
|
||||
UpdateAnimation("WARRIOR_SWINGSWORD_E",true);
|
||||
UpdateAnimation("WARRIOR_SWINGSWORD_E");
|
||||
}
|
||||
}break;
|
||||
case Class::RANGER:
|
||||
case Class::TRAPPER:{
|
||||
if(FacingNorth()){
|
||||
UpdateAnimation("RANGER_SHOOT_N",true);
|
||||
UpdateAnimation("RANGER_SHOOT_N");
|
||||
}else
|
||||
if(FacingSouth()){
|
||||
UpdateAnimation("RANGER_SHOOT_S",true);
|
||||
UpdateAnimation("RANGER_SHOOT_S");
|
||||
}else
|
||||
if(FacingWest()){
|
||||
UpdateAnimation("RANGER_SHOOT_W",true);
|
||||
UpdateAnimation("RANGER_SHOOT_W");
|
||||
}else
|
||||
if(FacingEast()){
|
||||
UpdateAnimation("RANGER_SHOOT_E",true);
|
||||
UpdateAnimation("RANGER_SHOOT_E");
|
||||
}
|
||||
}break;
|
||||
}
|
||||
|
@ -178,7 +178,7 @@ public:
|
||||
bool Heal(int damage,bool suppressDamageNumber=false);
|
||||
//specificClass is a bitwise-combination of classes from the Class enum. It makes sure certain animations only play if you are a certain class.
|
||||
//Set force to true to force the animation to restart evne if the animation were already playing.
|
||||
void UpdateAnimation(std::string animState,int specificClass=ANY,const bool force=false);
|
||||
void UpdateAnimation(std::string animState,int specificClass=ANY);
|
||||
Animate2D::Frame GetFrame();
|
||||
Key GetLastReleasedMovementKey();
|
||||
float GetSwordSwingTimer();
|
||||
@ -316,6 +316,7 @@ private:
|
||||
const bool UsingAutoAim()const;
|
||||
bool lowHealthSoundPlayed=false;
|
||||
float lowHealthSoundPlayedTimer=0.f;
|
||||
float rangerShootAnimationTimer=0.f;
|
||||
protected:
|
||||
const float ATTACK_COOLDOWN="Warrior.Auto Attack.Cooldown"_F;
|
||||
const float MAGIC_ATTACK_COOLDOWN="Wizard.Auto Attack.Cooldown"_F;
|
||||
|
@ -114,6 +114,8 @@ void Ranger::InitializeClassAbilities(){
|
||||
[](Player*p,vf2d pos={}){
|
||||
vf2d arrowVelocity=util::pointTo(p->GetPos(),p->GetWorldAimingLocation());
|
||||
BULLET_LIST.push_back(std::make_unique<ChargedArrow>(p->GetPos(),arrowVelocity*"Ranger.Ability 2.Speed"_F,12*"Ranger.Ability 2.Radius"_F/100,p->GetAttack()*"Ranger.Ability 2.DamageMult"_F,p->OnUpperLevel(),true));
|
||||
p->SetState(State::SHOOT_ARROW);
|
||||
p->rangerShootAnimationTimer=0.3f;
|
||||
p->SetAnimationBasedOnTargetingDirection(atan2(arrowVelocity.y,arrowVelocity.x));
|
||||
game->SetupWorldShake("Ranger.Ability 2.WorldShakeTime"_F);
|
||||
p->Knockback(-1.f*arrowVelocity.norm()*"Ranger.Ability 2.Knockback"_F);
|
||||
@ -139,6 +141,8 @@ void Ranger::InitializeClassAbilities(){
|
||||
vf2d extendedLine=pointTowardsCursor.upoint(1.1f);
|
||||
BULLET_LIST.push_back(std::make_unique<Arrow>(Arrow(p->GetPos(),extendedLine,vf2d{cos(newAngle)*"Ranger.Ability 3.ArrowSpd"_F,float(sin(newAngle)*"Ranger.Ability 3.ArrowSpd"_F-PI/8*"Ranger.Ability 3.ArrowSpd"_F)}+p->movementVelocity,12*"Ranger.Ability 3.ArrowRadius"_F/100,int(p->GetAttack()*"Ranger.Ability 3.DamageMult"_F),p->OnUpperLevel(),true)));
|
||||
}
|
||||
p->rangerShootAnimationTimer=0.3f;
|
||||
p->SetState(State::SHOOT_ARROW);
|
||||
p->SetAnimationBasedOnTargetingDirection(shootingAngle);
|
||||
SoundEffect::PlaySFX("Ranger.Ability 3.Sound"_S,SoundEffect::CENTERED);
|
||||
return true;
|
||||
|
@ -39,7 +39,7 @@ All rights reserved.
|
||||
#define VERSION_MAJOR 1
|
||||
#define VERSION_MINOR 0
|
||||
#define VERSION_PATCH 0
|
||||
#define VERSION_BUILD 8357
|
||||
#define VERSION_BUILD 8367
|
||||
|
||||
#define stringify(a) stringify_(a)
|
||||
#define stringify_(a) #a
|
||||
|
@ -172,11 +172,10 @@ namespace olc::utils::Animate2D
|
||||
Animation() = default;
|
||||
|
||||
// Change an animation state token to a new state
|
||||
//If force is set, will reset the animation even if it's the same animation.
|
||||
inline bool ChangeState(AnimationState& state, const StatesEnum& sStateName, bool force=false) const
|
||||
inline bool ChangeState(AnimationState& state, const StatesEnum& sStateName) const
|
||||
{
|
||||
size_t idx = m_mapStateIndices.at(sStateName);
|
||||
if (state.nIndex != idx )
|
||||
if (state.nIndex != idx)
|
||||
{
|
||||
state.fTime = 0.0f;
|
||||
state.nIndex = idx;
|
||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user