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();
|
Audio::UpdateBGMVolume();
|
||||||
#endif
|
#endif
|
||||||
game->view.SetZoom(1.f,game->view.WorldToScreen(game->camera.GetViewPosition()));
|
game->view.SetZoom(1.f,game->view.WorldToScreen(game->camera.GetViewPosition()));
|
||||||
SetMosaicEffect(1U);
|
|
||||||
worldColor=WHITE;
|
worldColor=WHITE;
|
||||||
worldColorFunc=[&](vi2d pos){return game->worldColor;};
|
worldColorFunc=[&](vi2d pos){return game->worldColor;};
|
||||||
levelTime=0;
|
levelTime=0;
|
||||||
@ -2106,6 +2105,7 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){
|
|||||||
|
|
||||||
#pragma region Monster Spawn Data Setup (Loading phase 2)
|
#pragma region Monster Spawn Data Setup (Loading phase 2)
|
||||||
LoadingScreen::AddPhase([&](){
|
LoadingScreen::AddPhase([&](){
|
||||||
|
SetMosaicEffect(1U);
|
||||||
for(auto&[key,value]:MAP_DATA[GetCurrentLevel()].SpawnerData){
|
for(auto&[key,value]:MAP_DATA[GetCurrentLevel()].SpawnerData){
|
||||||
SpawnerTag&spawnData=MAP_DATA[GetCurrentLevel()].SpawnerData[key];
|
SpawnerTag&spawnData=MAP_DATA[GetCurrentLevel()].SpawnerData[key];
|
||||||
std::vector<std::pair<std::string,vf2d>>monster_list;
|
std::vector<std::pair<std::string,vf2d>>monster_list;
|
||||||
|
@ -315,13 +315,13 @@ void Player::Update(float fElapsedTime){
|
|||||||
castInfo.castTimer-=fElapsedTime;
|
castInfo.castTimer-=fElapsedTime;
|
||||||
if(castInfo.castTimer<=0){
|
if(castInfo.castTimer<=0){
|
||||||
bool allowed=castPrepAbility->actionPerformedDuringCast;
|
bool allowed=castPrepAbility->actionPerformedDuringCast;
|
||||||
|
SetState(State::NORMAL);
|
||||||
if(!allowed&&castPrepAbility->action(this,castInfo.castPos))allowed=true;
|
if(!allowed&&castPrepAbility->action(this,castInfo.castPos))allowed=true;
|
||||||
if(allowed){
|
if(allowed){
|
||||||
castPrepAbility->cooldown=castPrepAbility->GetCooldownTime();
|
castPrepAbility->cooldown=castPrepAbility->GetCooldownTime();
|
||||||
ConsumeMana(castPrepAbility->manaCost);
|
ConsumeMana(castPrepAbility->manaCost);
|
||||||
}
|
}
|
||||||
castInfo.castTimer=0;
|
castInfo.castTimer=0;
|
||||||
SetState(State::NORMAL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -605,6 +605,9 @@ void Player::Update(float fElapsedTime){
|
|||||||
|
|
||||||
#pragma region Ranger
|
#pragma region Ranger
|
||||||
if(GetState()==State::SHOOT_ARROW){
|
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){
|
if(attack_cooldown_timer<=ARROW_ATTACK_COOLDOWN-0.3){
|
||||||
SetState(State::NORMAL);
|
SetState(State::NORMAL);
|
||||||
}
|
}
|
||||||
@ -773,9 +776,9 @@ void Player::AddAnimation(std::string state){
|
|||||||
animation.AddState(state,ANIMATION_DATA.at(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()){
|
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::WARRIOR:
|
||||||
case Class::THIEF:{
|
case Class::THIEF:{
|
||||||
if(FacingNorth()){
|
if(FacingNorth()){
|
||||||
UpdateAnimation("WARRIOR_SWINGSWORD_N",true);
|
UpdateAnimation("WARRIOR_SWINGSWORD_N");
|
||||||
}else
|
}else
|
||||||
if(FacingSouth()){
|
if(FacingSouth()){
|
||||||
UpdateAnimation("WARRIOR_SWINGSWORD_S",true);
|
UpdateAnimation("WARRIOR_SWINGSWORD_S");
|
||||||
}else
|
}else
|
||||||
if(FacingWest()){
|
if(FacingWest()){
|
||||||
UpdateAnimation("WARRIOR_SWINGSWORD_W",true);
|
UpdateAnimation("WARRIOR_SWINGSWORD_W");
|
||||||
}else
|
}else
|
||||||
if(FacingEast()){
|
if(FacingEast()){
|
||||||
UpdateAnimation("WARRIOR_SWINGSWORD_E",true);
|
UpdateAnimation("WARRIOR_SWINGSWORD_E");
|
||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
case Class::RANGER:
|
case Class::RANGER:
|
||||||
case Class::TRAPPER:{
|
case Class::TRAPPER:{
|
||||||
if(FacingNorth()){
|
if(FacingNorth()){
|
||||||
UpdateAnimation("RANGER_SHOOT_N",true);
|
UpdateAnimation("RANGER_SHOOT_N");
|
||||||
}else
|
}else
|
||||||
if(FacingSouth()){
|
if(FacingSouth()){
|
||||||
UpdateAnimation("RANGER_SHOOT_S",true);
|
UpdateAnimation("RANGER_SHOOT_S");
|
||||||
}else
|
}else
|
||||||
if(FacingWest()){
|
if(FacingWest()){
|
||||||
UpdateAnimation("RANGER_SHOOT_W",true);
|
UpdateAnimation("RANGER_SHOOT_W");
|
||||||
}else
|
}else
|
||||||
if(FacingEast()){
|
if(FacingEast()){
|
||||||
UpdateAnimation("RANGER_SHOOT_E",true);
|
UpdateAnimation("RANGER_SHOOT_E");
|
||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
}
|
}
|
||||||
|
@ -178,7 +178,7 @@ public:
|
|||||||
bool Heal(int damage,bool suppressDamageNumber=false);
|
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.
|
//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.
|
//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();
|
Animate2D::Frame GetFrame();
|
||||||
Key GetLastReleasedMovementKey();
|
Key GetLastReleasedMovementKey();
|
||||||
float GetSwordSwingTimer();
|
float GetSwordSwingTimer();
|
||||||
@ -316,6 +316,7 @@ private:
|
|||||||
const bool UsingAutoAim()const;
|
const bool UsingAutoAim()const;
|
||||||
bool lowHealthSoundPlayed=false;
|
bool lowHealthSoundPlayed=false;
|
||||||
float lowHealthSoundPlayedTimer=0.f;
|
float lowHealthSoundPlayedTimer=0.f;
|
||||||
|
float rangerShootAnimationTimer=0.f;
|
||||||
protected:
|
protected:
|
||||||
const float ATTACK_COOLDOWN="Warrior.Auto Attack.Cooldown"_F;
|
const float ATTACK_COOLDOWN="Warrior.Auto Attack.Cooldown"_F;
|
||||||
const float MAGIC_ATTACK_COOLDOWN="Wizard.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={}){
|
[](Player*p,vf2d pos={}){
|
||||||
vf2d arrowVelocity=util::pointTo(p->GetPos(),p->GetWorldAimingLocation());
|
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));
|
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));
|
p->SetAnimationBasedOnTargetingDirection(atan2(arrowVelocity.y,arrowVelocity.x));
|
||||||
game->SetupWorldShake("Ranger.Ability 2.WorldShakeTime"_F);
|
game->SetupWorldShake("Ranger.Ability 2.WorldShakeTime"_F);
|
||||||
p->Knockback(-1.f*arrowVelocity.norm()*"Ranger.Ability 2.Knockback"_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);
|
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)));
|
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);
|
p->SetAnimationBasedOnTargetingDirection(shootingAngle);
|
||||||
SoundEffect::PlaySFX("Ranger.Ability 3.Sound"_S,SoundEffect::CENTERED);
|
SoundEffect::PlaySFX("Ranger.Ability 3.Sound"_S,SoundEffect::CENTERED);
|
||||||
return true;
|
return true;
|
||||||
|
@ -39,7 +39,7 @@ All rights reserved.
|
|||||||
#define VERSION_MAJOR 1
|
#define VERSION_MAJOR 1
|
||||||
#define VERSION_MINOR 0
|
#define VERSION_MINOR 0
|
||||||
#define VERSION_PATCH 0
|
#define VERSION_PATCH 0
|
||||||
#define VERSION_BUILD 8357
|
#define VERSION_BUILD 8367
|
||||||
|
|
||||||
#define stringify(a) stringify_(a)
|
#define stringify(a) stringify_(a)
|
||||||
#define stringify_(a) #a
|
#define stringify_(a) #a
|
||||||
|
@ -172,11 +172,10 @@ namespace olc::utils::Animate2D
|
|||||||
Animation() = default;
|
Animation() = default;
|
||||||
|
|
||||||
// Change an animation state token to a new state
|
// 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) const
|
||||||
inline bool ChangeState(AnimationState& state, const StatesEnum& sStateName, bool force=false) const
|
|
||||||
{
|
{
|
||||||
size_t idx = m_mapStateIndices.at(sStateName);
|
size_t idx = m_mapStateIndices.at(sStateName);
|
||||||
if (state.nIndex != idx )
|
if (state.nIndex != idx)
|
||||||
{
|
{
|
||||||
state.fTime = 0.0f;
|
state.fTime = 0.0f;
|
||||||
state.nIndex = idx;
|
state.nIndex = idx;
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user