diff --git a/Adventures in Lestoria/BreakingPillar.cpp b/Adventures in Lestoria/BreakingPillar.cpp index c0a07e69..b92881e8 100644 --- a/Adventures in Lestoria/BreakingPillar.cpp +++ b/Adventures in Lestoria/BreakingPillar.cpp @@ -39,6 +39,7 @@ All rights reserved. #include "MonsterStrategyHelpers.h" #include "util.h" #include "AdventuresInLestoria.h" +#include "SoundEffect.h" using A=Attribute; @@ -60,6 +61,17 @@ void Monster::STRATEGY::BREAKING_PILLAR(Monster&m,float fElapsedTime,std::string m.F(A::BREAK_TIME)=ConfigFloat("Break Time"); m.F(A::SHAKE_TIMER)=0.2f; m.phase=RUN; + + m.SetStrategyDeathFunction([&](GameEvent&deathEvent,Monster&m,const std::string&strategy){ + m.lifetime=0.01f; + m.B(A::MARKED_DEAD)=true; + const float bulletAngRandomOffset{util::random(PI/2)}; + for(int i=0;istarting 75% every 10% (75%, 65%, 55% ...) The Stone golem targetst the Player with 3 Pillar attacks like the one at the beginning of the fight. -2 of the 3 Pillars spawn damaged and will break 3 seconds later again. one is solid and can tank up to 3 shockwaves. +>2 of the 3 Pillars spawn damaged and will break 3 seconds later again. one is solid and can tank up to 3 shockwaves. -Like previously every pillar appears with 2,5 seconds delay from each other. (2 sec with an indicator, 0,5 seconds delay after a pillar got created) +>Like previously every pillar appears with 2,5 seconds delay from each other. (2 sec with an indicator, 0,5 seconds delay after a pillar got created) The Boss continues with its normal behaviour while the pillars are getting casted. diff --git a/Adventures in Lestoria/Monster.cpp b/Adventures in Lestoria/Monster.cpp index e398bfa6..b59de7b4 100644 --- a/Adventures in Lestoria/Monster.cpp +++ b/Adventures in Lestoria/Monster.cpp @@ -847,6 +847,10 @@ void Monster::OnDeath(){ SoundEffect::StopLoopingSFX(GetSizeT(Attribute::LOOPING_SOUND_ID)); GetSizeT(Attribute::LOOPING_SOUND_ID)=std::numeric_limits::max(); } + if(GetSizeT(Attribute::RESPAWN_LOOPING_SOUND_ID)!=std::numeric_limits::max()){//Just make sure on death any looping sound effect has been discarded proper. + SoundEffect::StopLoopingSFX(GetSizeT(Attribute::RESPAWN_LOOPING_SOUND_ID)); + GetSizeT(Attribute::RESPAWN_LOOPING_SOUND_ID)=std::numeric_limits::max(); + } if(HasMountedMonster()){ for(DeathSpawnInfo&deathInfo:deathData){ diff --git a/Adventures in Lestoria/MonsterAttribute.h b/Adventures in Lestoria/MonsterAttribute.h index 643ebfcc..73402553 100644 --- a/Adventures in Lestoria/MonsterAttribute.h +++ b/Adventures in Lestoria/MonsterAttribute.h @@ -131,4 +131,12 @@ enum class Attribute{ BREAK_TIME, SHAKE_TIMER, SHAKE_DIR, + RESPAWN_CASTING_TIMER, + RESPAWN_LOCKON_POS, + RESPAWN_PATTERN_REPEAT_COUNT, + RESPAWN_RECOVERY_TIME, + RESPAWN_PHASE, + RESPAWN_LOOPING_SOUND_ID, //NOTE: Store looping sound IDs temporarily with this value. The game automatically cleans this up in Monster::OnDestroy() if you don't, since a monster that dies should not have their looping sound still playing. + SAFE_AREA_WAIT_TIMER, + PREVIOUS_MONSTER_COUNT, }; \ No newline at end of file diff --git a/Adventures in Lestoria/StoneGolem.cpp b/Adventures in Lestoria/StoneGolem.cpp index 80e5ce13..31021290 100644 --- a/Adventures in Lestoria/StoneGolem.cpp +++ b/Adventures in Lestoria/StoneGolem.cpp @@ -62,12 +62,15 @@ void Monster::STRATEGY::STONE_GOLEM(Monster&m,float fElapsedTime,std::string str STONE_THROW_CAST, STONE_THROW_FINISH_ANIMATION, SHOCKWAVE, + FIX_SAFE_AREAS, }; const auto PrepareSafeAreas=[&](){ m.VEC(A::STAGE_POLYGONS).clear(); std::for_each(MONSTER_LIST.begin(),MONSTER_LIST.end(),[&](const std::unique_ptr&monsterPtr){ - if(monsterPtr->GetName()!="Stone Golem Pillar")return; + if(monsterPtr->GetName()!="Stone Golem Pillar"&&monsterPtr->GetName()!="Breaking Stone Golem Pillar"){ + return; + } const Monster&pillar=*monsterPtr; if(geom2d::overlaps(geom2d::circle{m.GetPos(),m.GetCollisionRadius()},geom2d::circle{pillar.GetPos(),pillar.GetCollisionRadius()}))return; @@ -111,6 +114,45 @@ void Monster::STRATEGY::STONE_GOLEM(Monster&m,float fElapsedTime,std::string str }); }; + #pragma region Respawn Pillar Actions + switch(m.I(A::RESPAWN_PHASE)){ + case RESPAWN_PILLAR_PREPARE:{ + m.F(A::RESPAWN_RECOVERY_TIME)-=fElapsedTime; + if(m.F(A::RESPAWN_RECOVERY_TIME)<=0.f){ + m.V(A::RESPAWN_LOCKON_POS)=game->GetPlayer()->GetPos(); + m.SIZET(A::RESPAWN_LOOPING_SOUND_ID)=SoundEffect::PlayLoopingSFX("Rock Toss Cast",m.GetPos()); + game->AddEffect(std::make_unique(m.V(A::RESPAWN_LOCKON_POS),ConfigFloat("Pillar Respawns.Cast Time"),"range_indicator.png","spell_insignia.png",m.OnUpperLevel(),vf2d{1.f,1.f}*(MONSTER_DATA.at("Stone Golem Pillar").GetCollisionRadius()*MONSTER_DATA.at("Stone Golem Pillar").GetSizeMult()/12.f)*1.25f,0.3f,vf2d{},ConfigPixel("Pillar Respawns.Spell Circle Color"),util::random(2*PI),util::degToRad(ConfigFloat("Pillar Respawns.Spell Circle Rotation Spd")),false,vf2d{1.f,1.f}*(MONSTER_DATA.at("Stone Golem Pillar").GetCollisionRadius()*MONSTER_DATA.at("Stone Golem Pillar").GetSizeMult()/12.f)*0.9f,0.3f,vf2d{},ConfigPixel("Pillar Respawns.Spell Insignia Color"),util::random(2*PI),util::degToRad(ConfigFloat("Pillar Respawns.Spell Insignia Rotation Spd"))),true); + m.F(A::RESPAWN_CASTING_TIMER)=ConfigFloat("Pillar Respawns.Cast Time"); + m.I(A::RESPAWN_PHASE)=RESPAWN_PILLAR_CAST; + } + }break; + case RESPAWN_PILLAR_CAST:{ + m.F(A::RESPAWN_CASTING_TIMER)-=fElapsedTime; + if(m.F(A::RESPAWN_CASTING_TIMER)<=0.f){ + SoundEffect::StopLoopingSFX(m.SIZET(A::RESPAWN_LOOPING_SOUND_ID)); + SoundEffect::PlaySFX("Pillar Rise",m.V(A::RESPAWN_LOCKON_POS)); + if(m.I(A::BAD_PILLAR_SPAWN_COUNT)>0&& + (util::random_range(0,1)<0.5f||m.I(A::RESPAWN_PATTERN_REPEAT_COUNT)<=m.I(A::BAD_PILLAR_SPAWN_COUNT))){ + Monster&badPillar{game->SpawnMonster(m.V(A::RESPAWN_LOCKON_POS),MONSTER_DATA.at("Breaking Stone Golem Pillar"),m.OnUpperLevel())}; + game->Hurt(m.V(A::RESPAWN_LOCKON_POS),MONSTER_DATA.at("Breaking Stone Golem Pillar").GetCollisionRadius()*MONSTER_DATA.at("Breaking Stone Golem Pillar").GetSizeMult(),MONSTER_DATA.at("Breaking Stone Golem Pillar").GetAttack(),m.OnUpperLevel(),0.f,HurtType::PLAYER); + badPillar._DealTrueDamage(badPillar.GetMaxHealth()-1U); //Force the health to be 1. + m.I(A::BAD_PILLAR_SPAWN_COUNT)--; + }else{ + game->Hurt(m.V(A::RESPAWN_LOCKON_POS),MONSTER_DATA.at("Stone Golem Pillar").GetCollisionRadius()*MONSTER_DATA.at("Stone Golem Pillar").GetSizeMult(),MONSTER_DATA.at("Stone Golem Pillar").GetAttack(),m.OnUpperLevel(),0.f,HurtType::PLAYER); + game->SpawnMonster(m.V(A::RESPAWN_LOCKON_POS),MONSTER_DATA.at("Stone Golem Pillar"),m.OnUpperLevel()); + } + m.I(A::RESPAWN_PATTERN_REPEAT_COUNT)--; + if(m.I(A::RESPAWN_PATTERN_REPEAT_COUNT)<=0){ + m.I(A::RESPAWN_PHASE)=STANDARD; + }else{ + m.F(A::RESPAWN_RECOVERY_TIME)=ConfigFloat("Pillar Respawns.Cast Delay Time"); + m.I(A::RESPAWN_PHASE)=RESPAWN_PILLAR_PREPARE; + } + } + }break; + } + #pragma endregion + switch(m.phase){ case INITIALIZE:{ m.F(A::RECOVERY_TIME)=ConfigFloat("Beginning Phase.Pillar Cast Delay Time"); @@ -132,17 +174,6 @@ void Monster::STRATEGY::STONE_GOLEM(Monster&m,float fElapsedTime,std::string str m.phase=SPAWN_PILLAR_CAST; } }break; - case RESPAWN_PILLAR_PREPARE:{ - m.F(A::RECOVERY_TIME)-=fElapsedTime; - if(m.F(A::RECOVERY_TIME)<=0.f){ - m.V(A::LOCKON_POS)=game->GetPlayer()->GetPos(); - m.SIZET(A::LOOPING_SOUND_ID)=SoundEffect::PlayLoopingSFX("Rock Toss Cast",m.GetPos()); - m.PerformAnimation("CAST",m.GetFacingDirectionToTarget(m.V(A::LOCKON_POS))); - game->AddEffect(std::make_unique(m.V(A::LOCKON_POS),ConfigFloat("Pillar Respawns.Cast Time"),"range_indicator.png","spell_insignia.png",m.OnUpperLevel(),vf2d{1.f,1.f}*(MONSTER_DATA.at("Stone Golem Pillar").GetCollisionRadius()*MONSTER_DATA.at("Stone Golem Pillar").GetSizeMult()/12.f)*1.25f,0.3f,vf2d{},ConfigPixel("Pillar Respawns.Spell Circle Color"),util::random(2*PI),util::degToRad(ConfigFloat("Pillar Respawns.Spell Circle Rotation Spd")),false,vf2d{1.f,1.f}*(MONSTER_DATA.at("Stone Golem Pillar").GetCollisionRadius()*MONSTER_DATA.at("Stone Golem Pillar").GetSizeMult()/12.f)*0.9f,0.3f,vf2d{},ConfigPixel("Pillar Respawns.Spell Insignia Color"),util::random(2*PI),util::degToRad(ConfigFloat("Pillar Respawns.Spell Insignia Rotation Spd"))),true); - m.F(A::CASTING_TIMER)=ConfigFloat("Pillar Respawns.Cast Time"); - m.phase=RESPAWN_PILLAR_CAST; - } - }break; case SPAWN_PILLAR_CAST:{ m.F(A::CASTING_TIMER)-=fElapsedTime; if(m.F(A::CASTING_TIMER)<=0.f){ @@ -160,36 +191,15 @@ void Monster::STRATEGY::STONE_GOLEM(Monster&m,float fElapsedTime,std::string str } } }break; - case RESPAWN_PILLAR_CAST:{ - m.F(A::CASTING_TIMER)-=fElapsedTime; - if(m.F(A::CASTING_TIMER)<=0.f){ - SoundEffect::StopLoopingSFX(m.SIZET(A::LOOPING_SOUND_ID)); - SoundEffect::PlaySFX("Pillar Rise",m.V(A::LOCKON_POS)); - if(m.I(A::BAD_PILLAR_SPAWN_COUNT)>0&& - (util::random_range(0,1)<0.5f||m.I(A::PATTERN_REPEAT_COUNT)<=m.I(A::BAD_PILLAR_SPAWN_COUNT))){ - Monster&badPillar{game->SpawnMonster(m.V(A::LOCKON_POS),MONSTER_DATA.at("Breaking Stone Golem Pillar"),m.OnUpperLevel())}; - badPillar._DealTrueDamage(badPillar.GetMaxHealth()-1U); //Force the health to be 1. - m.I(A::BAD_PILLAR_SPAWN_COUNT)--; - }else game->SpawnMonster(m.V(A::LOCKON_POS),MONSTER_DATA.at("Stone Golem Pillar"),m.OnUpperLevel()); - m.I(A::PATTERN_REPEAT_COUNT)--; - game->Hurt(m.V(A::LOCKON_POS),MONSTER_DATA.at("Stone Golem Pillar").GetCollisionRadius()*MONSTER_DATA.at("Stone Golem Pillar").GetSizeMult(),MONSTER_DATA.at("Stone Golem Pillar").GetAttack(),m.OnUpperLevel(),0.f,HurtType::PLAYER); - if(m.I(A::PATTERN_REPEAT_COUNT)<=0){ - m.phase=STANDARD; - }else{ - m.PerformIdleAnimation(m.GetFacingDirectionToTarget(game->GetPlayer()->GetPos())); - m.F(A::RECOVERY_TIME)=ConfigFloat("Pillar Respawns.Cast Delay Time"); - m.phase=RESPAWN_PILLAR_PREPARE; - } - } - }break; case STANDARD:{ BEAR(m,fElapsedTime,"Bear"); //Extending the bear script's variables to read the state of it... - const bool SlamHasFinished=m.I(A::ATTACK_COUNT)!=m.I(A::BEAR_STOMP_COUNT); + const bool SlamHasFinished=m.I(A::PHASE)==0; //The bear script uses the internal phase variable to determine the state of things. if(SlamHasFinished){ if(m.F(A::HEALTH_PCT_PHASE)-m.GetHealthRatio()>=ConfigFloat("Shockwave.Repeating Threshold")/100.f){ m.F(A::HEALTH_PCT_PHASE)-=ConfigFloat("Shockwave.Repeating Threshold")/100.f; m.F(A::CASTING_TIMER)=ConfigFloat("Shockwave.Cast Time"); + m.SIZET(A::PREVIOUS_MONSTER_COUNT)=MONSTER_LIST.size(); PrepareSafeAreas(); m.phase=SHOCKWAVE; break; @@ -197,11 +207,10 @@ void Monster::STRATEGY::STONE_GOLEM(Monster&m,float fElapsedTime,std::string str if(m.F(A::NEXT_HEALTH_PCT_PILLAR_PHASE)>=m.GetHealthRatio()){ m.F(A::NEXT_HEALTH_PCT_PILLAR_PHASE)-=ConfigFloat("Pillar Respawns.Repeating Threshold")/100.f; - m.F(A::RECOVERY_TIME)=ConfigFloat("Pillar Respawns.Cast Delay Time"); - m.I(A::PATTERN_REPEAT_COUNT)=ConfigIntArr("Pillar Respawns.Respawn Count",0); - m.I(A::BAD_PILLAR_SPAWN_COUNT)=ConfigIntArr("Pillar Respawns.Respawn Count",1); - m.phase=RESPAWN_PILLAR_PREPARE; - break; + m.F(A::RESPAWN_RECOVERY_TIME)=ConfigFloat("Pillar Respawns.Cast Delay Time"); + m.I(A::RESPAWN_PATTERN_REPEAT_COUNT)+=ConfigIntArr("Pillar Respawns.Respawn Count",0); + m.I(A::BAD_PILLAR_SPAWN_COUNT)+=ConfigIntArr("Pillar Respawns.Respawn Count",1); + m.I(A::RESPAWN_PHASE)=RESPAWN_PILLAR_PREPARE; } const bool StoneThrowRollSucceeds=util::random(100.f)<=ConfigFloat("Standard Attack.Stone Throw Chance"); @@ -245,6 +254,12 @@ void Monster::STRATEGY::STONE_GOLEM(Monster&m,float fElapsedTime,std::string str newCol.a=util::lerp(255.f,210.f,sin(geom2d::pi*game->GetRunTime()*2)/2.f+0.5f); game->SetWorldColor(newCol); + if(m.SIZET(A::PREVIOUS_MONSTER_COUNT)!=MONSTER_LIST.size()){ //The monster list has changed...Whether it's a pillar getting added or removed, it's important we recalculate safe areas proper. + m.phase=FIX_SAFE_AREAS; //HACK ALERT! Since spawning/removing monsters doesn't immediately occur in the MONSTER_LIST structure, we must defer the safe areas until the next tick and then recalculate them. To do this, we put the monster into another state and pause the shockwave attack for a frame to fix the new spawn areas on the next tick. + m.F(A::SAFE_AREA_WAIT_TIMER)=0.01f; + m.SIZET(A::PREVIOUS_MONSTER_COUNT)=MONSTER_LIST.size(); + } + if(m.F(A::CASTING_TIMER)<=0.f){ game->SetupWorldShake(ConfigFloat("Shockwave.Shockwave Screen Shake Time")); bool playerIsSafe{false}; @@ -273,5 +288,11 @@ void Monster::STRATEGY::STONE_GOLEM(Monster&m,float fElapsedTime,std::string str game->SetWorldColor(WHITE); } }break; + case FIX_SAFE_AREAS:{ + if(m.F(A::SAFE_AREA_WAIT_TIMER)<=0.f){ + PrepareSafeAreas(); //Recalculate safe areas if the shockwave attack is going off. + m.phase=SHOCKWAVE; + }else m.F(A::SAFE_AREA_WAIT_TIMER)-=fElapsedTime; + }; } } \ No newline at end of file diff --git a/Adventures in Lestoria/Version.h b/Adventures in Lestoria/Version.h index c6d2d40d..9be9a123 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 2 #define VERSION_PATCH 3 -#define VERSION_BUILD 9959 +#define VERSION_BUILD 9974 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Adventures in Lestoria/assets/Campaigns/World_Map.tmx b/Adventures in Lestoria/assets/Campaigns/World_Map.tmx index de394ac7..bbc944f4 100644 --- a/Adventures in Lestoria/assets/Campaigns/World_Map.tmx +++ b/Adventures in Lestoria/assets/Campaigns/World_Map.tmx @@ -391,8 +391,8 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10849,10850,10988,10989,10990,10991,10992,10993,10994,10995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10849,10850,0,10862,10863,11001,11002,11003,11004,11005,11006,11007,11008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,10920,0,0,10849,10850,0,10849,10850,0,10862,10863,0,0,0,11014,11015,11016,11017,11018,11019,11020,11021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10849,10850,10923,10924,10872,10925,10876,10925,10829,10872,10931,10932,10933,10849,10850,10862,10863,0,10862,10863,0,0,0,0,0,0,11027,11028,11029,11030,11031,11032,11033,11034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10849,10850,0,10862,10863,10936,10937,10885,10925,10940,10941,10842,10885,10944,10945,10946,10862,10863,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10849,10850,10923,10924,10878,10879,10876,10925,10829,10872,10931,10932,10933,10849,10850,10862,10863,0,10862,10863,0,0,0,0,0,0,11027,11028,11029,11030,11031,11032,11033,11034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10849,10850,0,10862,10863,10936,10937,10891,10892,10940,10941,10842,10885,10944,10945,10946,10862,10863,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10849,10850,0,10862,10863,0,0,0,10949,10950,10951,10952,10953,10954,10955,10956,10957,10958,10959,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10849,10850,0,10862,10863,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10862,10863,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -732,7 +732,7 @@ - + @@ -740,7 +740,7 @@ - + @@ -748,7 +748,7 @@ - + @@ -756,7 +756,7 @@ - + diff --git a/Adventures in Lestoria/assets/config/audio/events.txt b/Adventures in Lestoria/assets/config/audio/events.txt index acf0ba42..d2bad7dd 100644 --- a/Adventures in Lestoria/assets/config/audio/events.txt +++ b/Adventures in Lestoria/assets/config/audio/events.txt @@ -156,6 +156,12 @@ Events # Specify file names, followed by volume %. Optional min and max pitch adjustment (Defaults are 90%,110%) File[0] = pillar_rise.ogg, 90% } + Pillar Shake + { + CombatSound = True + # Specify file names, followed by volume %. Optional min and max pitch adjustment (Defaults are 90%,110%) + File[0] = button_click2.ogg, 30%, 30%, 60% + } Player Hit { CombatSound = True diff --git a/x64/Release/Adventures in Lestoria.exe b/x64/Release/Adventures in Lestoria.exe index 735667d6..ca0edb25 100644 Binary files a/x64/Release/Adventures in Lestoria.exe and b/x64/Release/Adventures in Lestoria.exe differ