Update Overworld Map with new stage plates. Updated stages with spawn zones and end zones. Cleaned up sound effects with extra noise. Updated some sound effects with more appropriate ones. Added sound effects for many events.

This commit is contained in:
sigonasr2 2024-01-08 07:42:44 -06:00
parent 0643393b9c
commit c7ea530484
37 changed files with 311 additions and 43 deletions

View File

@ -317,6 +317,7 @@ void AiL::HandleUserInput(float fElapsedTime){
if(!Menu::stack.empty())return; //A window being opened means there's no user input allowed. if(!Menu::stack.empty())return; //A window being opened means there's no user input allowed.
bool setIdleAnimation=true; bool setIdleAnimation=true;
bool heldDownMovementKey=false; //Is true when a movement key has been held down.
if(GetKey(F1).bPressed){ if(GetKey(F1).bPressed){
ConsoleShow(F1); ConsoleShow(F1);
} }
@ -376,6 +377,7 @@ void AiL::HandleUserInput(float fElapsedTime){
player->UpdateWalkingAnimation(RIGHT); player->UpdateWalkingAnimation(RIGHT);
} }
setIdleAnimation=false; setIdleAnimation=false;
heldDownMovementKey=true;
} }
if(LeftHeld()){ if(LeftHeld()){
player->SetX(player->GetX()-fElapsedTime*"Player.MoveSpd"_F*player->GetMoveSpdMult()); player->SetX(player->GetX()-fElapsedTime*"Player.MoveSpd"_F*player->GetMoveSpdMult());
@ -395,6 +397,7 @@ void AiL::HandleUserInput(float fElapsedTime){
} }
} }
setIdleAnimation=false; setIdleAnimation=false;
heldDownMovementKey=true;
} }
if(UpHeld()){ if(UpHeld()){
player->SetY(player->GetY()-fElapsedTime*"Player.MoveSpd"_F*player->GetMoveSpdMult()); player->SetY(player->GetY()-fElapsedTime*"Player.MoveSpd"_F*player->GetMoveSpdMult());
@ -406,6 +409,7 @@ void AiL::HandleUserInput(float fElapsedTime){
} }
} }
setIdleAnimation=false; setIdleAnimation=false;
heldDownMovementKey=true;
} }
if(DownHeld()){ if(DownHeld()){
player->SetY(player->GetY()+fElapsedTime*"Player.MoveSpd"_F*player->GetMoveSpdMult()); player->SetY(player->GetY()+fElapsedTime*"Player.MoveSpd"_F*player->GetMoveSpdMult());
@ -417,6 +421,7 @@ void AiL::HandleUserInput(float fElapsedTime){
} }
} }
setIdleAnimation=false; setIdleAnimation=false;
heldDownMovementKey=true;
} }
} }
if(UpReleased()){ if(UpReleased()){
@ -484,6 +489,29 @@ void AiL::HandleUserInput(float fElapsedTime){
setIdleAnimation=false; setIdleAnimation=false;
} }
if(heldDownMovementKey){
player->footstepTimer+=GetElapsedTime();
if(player->footstepTimer>"Player.Footstep Timer"_F){
player->footstepTimer-="Player.Footstep Timer"_F;
bool inWater=true;
for(const LayerTag&layer:GetCurrentMap().LayerData){
int tileID=layer.tiles[player->GetY()/24][player->GetX()/24]-1;
if(tileID!=-1&&!IsReflectiveTile(GetTileSheet(GetCurrentLevel(),tileID),tileID)){
inWater=false;
break;
}
}
if(inWater){
SoundEffect::PlaySFX("Footstep - Wet");
}else{
SoundEffect::PlaySFX("Footstep");
}
}
}
if(setIdleAnimation){ if(setIdleAnimation){
switch(player->GetLastReleasedMovementKey()){ switch(player->GetLastReleasedMovementKey()){
case UP:{ case UP:{
@ -1920,6 +1948,7 @@ void AiL::ChangePlayerClass(Class cl){
uint32_t currentLevelXP=player->currentLevelXP; uint32_t currentLevelXP=player->currentLevelXP;
std::set<MenuComponent*>moneyListeners=Player::moneyListeners; std::set<MenuComponent*>moneyListeners=Player::moneyListeners;
EntityStats previousStats=player->stats; EntityStats previousStats=player->stats;
size_t cooldownSoundInstance=player->cooldownSoundInstance;
switch(cl){ switch(cl){
case WARRIOR:{ case WARRIOR:{
player.reset(NEW Warrior(player.get())); player.reset(NEW Warrior(player.get()));
@ -1953,6 +1982,7 @@ void AiL::ChangePlayerClass(Class cl){
player->hpGrowthRate=float(DATA.GetProperty(player->GetClassName()+".HealthGrowthRate").GetReal()); player->hpGrowthRate=float(DATA.GetProperty(player->GetClassName()+".HealthGrowthRate").GetReal());
player->atkGrowthRate=float(DATA.GetProperty(player->GetClassName()+".AtkGrowthRate").GetReal()); player->atkGrowthRate=float(DATA.GetProperty(player->GetClassName()+".AtkGrowthRate").GetReal());
player->money=oldMoney; player->money=oldMoney;
player->cooldownSoundInstance=cooldownSoundInstance;
sig::Animation::SetupPlayerAnimations(); sig::Animation::SetupPlayerAnimations();
GetPlayer()->UpdateIdleAnimation(DOWN); GetPlayer()->UpdateIdleAnimation(DOWN);
GetPlayer()->SetItem1UseFunc(itemAbility1); GetPlayer()->SetItem1UseFunc(itemAbility1);

View File

@ -38,6 +38,7 @@ All rights reserved.
#include "Menu.h" #include "Menu.h"
#include "MenuLabel.h" #include "MenuLabel.h"
#include "SoundEffect.h"
using A=Attribute; using A=Attribute;
@ -85,6 +86,7 @@ void Menu::InitializeBuyItemWindow(){
Merchant&merchant=Merchant::GetCurrentTravelingMerchant(); Merchant&merchant=Merchant::GetCurrentTravelingMerchant();
const std::string&item=Component<MenuLabel>(BUY_ITEM,"Item Purchase Header")->GetString(A::ITEM_NAME); const std::string&item=Component<MenuLabel>(BUY_ITEM,"Item Purchase Header")->GetString(A::ITEM_NAME);
merchant.PurchaseItem(item,GetQuantity()); merchant.PurchaseItem(item,GetQuantity());
SoundEffect::PlaySFX("Buy Item");
Menu::CloseMenu(); Menu::CloseMenu();
return true; return true;
})END; })END;

View File

@ -47,6 +47,7 @@ All rights reserved.
#include "Item.h" #include "Item.h"
#include "ScrollableWindowComponent.h" #include "ScrollableWindowComponent.h"
#include "RowItemDisplay.h" #include "RowItemDisplay.h"
#include "SoundEffect.h"
INCLUDE_game INCLUDE_game
INCLUDE_GFX INCLUDE_GFX
@ -136,9 +137,9 @@ void Menu::InitializeCharacterMenuWindow(){
const static auto OppositeRingSlotDoesNotMatchCurrentEquip=[](RowItemDisplay*comp){ const static auto OppositeRingSlotDoesNotMatchCurrentEquip=[](RowItemDisplay*comp){
EquipSlot slot=EquipSlot(comp->I(Attribute::EQUIP_TYPE)); EquipSlot slot=EquipSlot(comp->I(Attribute::EQUIP_TYPE));
std::weak_ptr<Item>otherItem; std::weak_ptr<Item>otherItem;
if(slot==EquipSlot::RING1)otherItem=Inventory::GetEquip(EquipSlot::RING2); if(slot&EquipSlot::RING1)otherItem=Inventory::GetEquip(EquipSlot::RING2);
else else
if(slot==EquipSlot::RING2)otherItem=Inventory::GetEquip(EquipSlot::RING1); if(slot&EquipSlot::RING2)otherItem=Inventory::GetEquip(EquipSlot::RING1);
return ISBLANK(otherItem)||(&*comp->GetItem().lock()!=&*otherItem.lock()); return ISBLANK(otherItem)||(&*comp->GetItem().lock()!=&*otherItem.lock());
}; };
@ -148,6 +149,7 @@ void Menu::InitializeCharacterMenuWindow(){
if(comp!=nullptr){ if(comp!=nullptr){
if(OppositeRingSlotDoesNotMatchCurrentEquip(comp)){ //If we find that the opposite ring slot is equipped to us, this would be an item swap or the exact same ring, therefore no stat calculations apply. if(OppositeRingSlotDoesNotMatchCurrentEquip(comp)){ //If we find that the opposite ring slot is equipped to us, this would be an item swap or the exact same ring, therefore no stat calculations apply.
Inventory::EquipItem(comp->GetItem(),EquipSlot(comp->I(Attribute::EQUIP_TYPE))); Inventory::EquipItem(comp->GetItem(),EquipSlot(comp->I(Attribute::EQUIP_TYPE)));
SoundEffect::PlaySFX(comp->GetItem().lock()->UseSound());
for(MenuComponent*button:((ScrollableWindowComponent*)data.parentComponent)->GetComponents()){ for(MenuComponent*button:((ScrollableWindowComponent*)data.parentComponent)->GetComponents()){
RowItemDisplay*comp=DYNAMIC_CAST<RowItemDisplay*>(button); RowItemDisplay*comp=DYNAMIC_CAST<RowItemDisplay*>(button);
if(comp!=nullptr){ if(comp!=nullptr){

View File

@ -44,6 +44,7 @@ All rights reserved.
#include "AttributableStat.h" #include "AttributableStat.h"
#include <numeric> #include <numeric>
#include "util.h" #include "util.h"
#include "SoundEffect.h"
INCLUDE_game INCLUDE_game
INCLUDE_DATA INCLUDE_DATA
@ -147,7 +148,7 @@ void ItemInfo::InitializeItems(){
if(keyName=="SellValue"){ if(keyName=="SellValue"){
sellValue=data[key][keyName].GetInt(); sellValue=data[key][keyName].GetInt();
}else }else
if(keyName=="UseSound"){ if(keyName=="UseSound"||keyName=="Equip Sound"){
useSound=data[key][keyName].GetString(); useSound=data[key][keyName].GetString();
}else{ //THis is a custom override modifier for a script. NO-OP }else{ //THis is a custom override modifier for a script. NO-OP
} }
@ -853,6 +854,8 @@ void Item::EnhanceItem(uint8_t qty){
Inventory::RemoveItem(Inventory::GetItem(name)[0],amt); Inventory::RemoveItem(Inventory::GetItem(name)[0],amt);
} }
game->GetPlayer()->SetMoney(game->GetPlayer()->GetMoney()-consumedResources.GetCost()); game->GetPlayer()->SetMoney(game->GetPlayer()->GetMoney()-consumedResources.GetCost());
SoundEffect::PlaySFX("Enhance Item");
}else{ //This is a craftable, so we have to give the player the item they crafted. }else{ //This is a craftable, so we have to give the player the item they crafted.
Inventory::AddItem(ActualName()); Inventory::AddItem(ActualName());
@ -862,6 +865,8 @@ void Item::EnhanceItem(uint8_t qty){
Inventory::RemoveItem(Inventory::GetItem(name)[0],amt); Inventory::RemoveItem(Inventory::GetItem(name)[0],amt);
} }
game->GetPlayer()->SetMoney(game->GetPlayer()->GetMoney()-consumedResources.GetCost()); game->GetPlayer()->SetMoney(game->GetPlayer()->GetMoney()-consumedResources.GetCost());
SoundEffect::PlaySFX("Craft Item");
} }
} }
}; };

View File

@ -38,6 +38,7 @@ All rights reserved.
#include "ItemDrop.h" #include "ItemDrop.h"
#include "olcUTIL_Geometry2D.h" #include "olcUTIL_Geometry2D.h"
#include "AdventuresInLestoria.h" #include "AdventuresInLestoria.h"
#include "SoundEffect.h"
INCLUDE_game INCLUDE_game
INCLUDE_GFX INCLUDE_GFX
@ -136,6 +137,7 @@ void ItemDrop::UpdateDrops(float fElapsedTime){
if(drop.collected){ if(drop.collected){
Inventory::AddItem(drop.GetItem()->Name(),1,true); Inventory::AddItem(drop.GetItem()->Name(),1,true);
ItemOverlay::AddToItemOverlay(*drop.GetItem()); ItemOverlay::AddToItemOverlay(*drop.GetItem());
SoundEffect::PlaySFX("Collect Item");
return true; return true;
} }
return false; return false;

View File

@ -46,6 +46,7 @@ All rights reserved.
#include "util.h" #include "util.h"
#include "MonsterAttribute.h" #include "MonsterAttribute.h"
#include "ItemDrop.h" #include "ItemDrop.h"
#include "SoundEffect.h"
INCLUDE_ANIMATION_DATA INCLUDE_ANIMATION_DATA
INCLUDE_MONSTER_DATA INCLUDE_MONSTER_DATA
@ -73,6 +74,7 @@ Monster::Monster(vf2d pos,MonsterData data,bool upperLevel,bool bossMob):
stats.A("Attack")=data.GetAttack(); stats.A("Attack")=data.GetAttack();
stats.A("Move Spd %")=data.GetMoveSpdMult(); stats.A("Move Spd %")=data.GetMoveSpdMult();
randomFrameOffset=(util::random()%1000)/1000.f; randomFrameOffset=(util::random()%1000)/1000.f;
monsterWalkSoundTimer=util::random(1.f);
} }
vf2d&Monster::GetPos(){ vf2d&Monster::GetPos(){
return pos; return pos;
@ -152,6 +154,8 @@ bool Monster::SetY(float y){
bool Monster::Update(float fElapsedTime){ bool Monster::Update(float fElapsedTime){
lastHitTimer=std::max(0.f,lastHitTimer-fElapsedTime); lastHitTimer=std::max(0.f,lastHitTimer-fElapsedTime);
iframe_timer=std::max(0.f,iframe_timer-fElapsedTime); iframe_timer=std::max(0.f,iframe_timer-fElapsedTime);
monsterHurtSoundCooldown=std::max(0.f,monsterHurtSoundCooldown-fElapsedTime);
if(size!=targetSize){ if(size!=targetSize){
if(size>targetSize){ if(size>targetSize){
size=std::max(targetSize,size-AiL::SIZE_CHANGE_SPEED*fElapsedTime); size=std::max(targetSize,size-AiL::SIZE_CHANGE_SPEED*fElapsedTime);
@ -275,6 +279,11 @@ void Monster::Moved(){
upperLevel=false; upperLevel=false;
} }
} }
monsterWalkSoundTimer+=game->GetElapsedTime();
if(monsterWalkSoundTimer>1.f){
monsterWalkSoundTimer-=1.f;
SoundEffect::PlaySFX(GetWalkSound());
}
} }
std::string Monster::GetDeathAnimationName(){ std::string Monster::GetDeathAnimationName(){
return MONSTER_DATA[name].GetDeathAnimation(); return MONSTER_DATA[name].GetDeathAnimation();
@ -316,14 +325,22 @@ bool Monster::Hurt(int damage,bool onUpperLevel,float z){
lastHitTimer=0.05f; lastHitTimer=0.05f;
if(!IsAlive()){ if(!IsAlive()){
OnDeath(); OnDeath();
SoundEffect::PlaySFX(GetDeathSound());
}else{ }else{
hp=std::max(1,hp); //Make sure it stays alive if it's supposed to be alive... hp=std::max(1,hp); //Make sure it stays alive if it's supposed to be alive...
if(monsterHurtSoundCooldown==0.f){
monsterHurtSoundCooldown=util::random(0.5f)+0.5f;
SoundEffect::PlaySFX(GetHurtSound());
}
} }
if(game->InBossEncounter()){ if(game->InBossEncounter()){
game->BossDamageDealt(int(mod_dmg)); game->BossDamageDealt(int(mod_dmg));
} }
GetInt(Attribute::HITS_UNTIL_DEATH)=std::max(0,GetInt(Attribute::HITS_UNTIL_DEATH)-1); GetInt(Attribute::HITS_UNTIL_DEATH)=std::max(0,GetInt(Attribute::HITS_UNTIL_DEATH)-1);
iframe_timer=GetFloat(Attribute::IFRAME_TIME_UPON_HIT); iframe_timer=GetFloat(Attribute::IFRAME_TIME_UPON_HIT);
return true; return true;
} }
@ -489,3 +506,13 @@ ItemAttribute&Monster::Get(std::string_view attr){
const uint32_t MonsterData::GetXP()const{ const uint32_t MonsterData::GetXP()const{
return xp; return xp;
} }
const EventName&Monster::GetHurtSound(){
return MONSTER_DATA[name].GetHurtSound();
}
const EventName&Monster::GetDeathSound(){
return MONSTER_DATA[name].GetDeathSound();
}
const EventName&Monster::GetWalkSound(){
return MONSTER_DATA[name].GetWalkSound();
}

View File

@ -83,6 +83,9 @@ struct MonsterData{
std::string jumpAnimation="WARRIOR_IDLE_S"; std::string jumpAnimation="WARRIOR_IDLE_S";
std::string shootAnimation="WARRIOR_IDLE_S"; std::string shootAnimation="WARRIOR_IDLE_S";
std::string deathAnimation="WARRIOR_IDLE_S"; std::string deathAnimation="WARRIOR_IDLE_S";
EventName hurtSound="";
EventName deathSound="";
EventName walkSound="";
std::vector<MonsterDropData> dropData; std::vector<MonsterDropData> dropData;
public: public:
MonsterData(); MonsterData();
@ -98,6 +101,9 @@ struct MonsterData{
std::string GetJumpAnimation(); std::string GetJumpAnimation();
std::string GetShootAnimation(); std::string GetShootAnimation();
std::string GetDeathAnimation(); std::string GetDeathAnimation();
const EventName&GetHurtSound();
const EventName&GetDeathSound();
const EventName&GetWalkSound();
std::vector<std::string>GetAnimations(){ std::vector<std::string>GetAnimations(){
return animations; return animations;
} }
@ -159,6 +165,9 @@ public:
void SetStrategyDrawFunction(std::function<void(AiL*)>func); void SetStrategyDrawFunction(std::function<void(AiL*)>func);
std::function<void(AiL*)>strategyDraw=[](AiL*pge){}; std::function<void(AiL*)>strategyDraw=[](AiL*pge){};
const ItemAttributable&GetStats()const; const ItemAttributable&GetStats()const;
const EventName&GetHurtSound();
const EventName&GetDeathSound();
const EventName&GetWalkSound();
private: private:
std::string name; std::string name;
vf2d pos; vf2d pos;
@ -180,6 +189,8 @@ private:
Animate2D::AnimationState internal_animState; Animate2D::AnimationState internal_animState;
float randomFrameOffset=0.f; float randomFrameOffset=0.f;
float deathTimer=0.f; float deathTimer=0.f;
float monsterHurtSoundCooldown=0.f;
float monsterWalkSoundTimer;
std::vector<Buff>buffList; std::vector<Buff>buffList;
std::string GetDeathAnimationName(); std::string GetDeathAnimationName();
bool hasHitPlayer=false; bool hasHitPlayer=false;

View File

@ -71,6 +71,20 @@ void MonsterData::InitializeMonsterData(){
MonsterData::imgs[MonsterName]=NEW Renderable(); MonsterData::imgs[MonsterName]=NEW Renderable();
MonsterData::imgs[MonsterName]->Load("assets/monsters/"+MonsterName+".png"); MonsterData::imgs[MonsterName]->Load("assets/monsters/"+MonsterName+".png");
EventName hurtSound="";
EventName deathSound="";
EventName walkSound="";
if(DATA["Monsters"][MonsterName].HasProperty("Hurt Sound")){
hurtSound=DATA["Monsters"][MonsterName]["Hurt Sound"].GetString();
}
if(DATA["Monsters"][MonsterName].HasProperty("Death Sound")){
deathSound=DATA["Monsters"][MonsterName]["Death Sound"].GetString();
}
if(DATA["Monsters"][MonsterName].HasProperty("Walk Sound")){
walkSound=DATA["Monsters"][MonsterName]["Walk Sound"].GetString();
}
for(int i=0;i<animations.size();i++){ for(int i=0;i<animations.size();i++){
std::string animationConfigName=""; std::string animationConfigName="";
std::string imgName=""; std::string imgName="";
@ -157,6 +171,10 @@ void MonsterData::InitializeMonsterData(){
DATA["Monsters"][MonsterName]["CollisionDmg"].GetInt() DATA["Monsters"][MonsterName]["CollisionDmg"].GetInt()
); );
monster.hurtSound=hurtSound;
monster.deathSound=deathSound;
monster.walkSound=walkSound;
MONSTER_DATA[MonsterName]=monster; MONSTER_DATA[MonsterName]=monster;
} }
} }
@ -197,3 +215,14 @@ std::string MonsterData::GetDeathAnimation(){
const std::vector<MonsterDropData>&MonsterData::GetDropData(){ const std::vector<MonsterDropData>&MonsterData::GetDropData(){
return dropData; return dropData;
} }
const EventName&MonsterData::GetHurtSound(){
return hurtSound;
}
const EventName&MonsterData::GetDeathSound(){
return deathSound;
}
const EventName&MonsterData::GetWalkSound(){
return walkSound;
}

View File

@ -96,6 +96,7 @@ void Player::Initialize(){
SetBaseStat("Crit Dmg","Player.Crit Dmg"_F); SetBaseStat("Crit Dmg","Player.Crit Dmg"_F);
SetBaseStat("Health %",0); SetBaseStat("Health %",0);
SetBaseStat("HP6 Recovery %",0); SetBaseStat("HP6 Recovery %",0);
cooldownSoundInstance=Audio::Engine().LoadSound("spell_cast.ogg"_SFX);
} }
bool Player::SetX(float x){ bool Player::SetX(float x){
@ -272,6 +273,15 @@ void Player::Update(float fElapsedTime){
SetState(State::NORMAL); SetState(State::NORMAL);
} }
} }
if(state==State::CASTING){
if(!Audio::Engine().IsPlaying(cooldownSoundInstance)){
Audio::Engine().Play(cooldownSoundInstance,true);
}
}else{
Audio::Engine().Stop(cooldownSoundInstance);
}
while(manaTickTimer<=0){ while(manaTickTimer<=0){
manaTickTimer+=0.2f; manaTickTimer+=0.2f;
RestoreMana(1,true); RestoreMana(1,true);

View File

@ -308,6 +308,8 @@ protected:
float endZoneStandTime=0; float endZoneStandTime=0;
const float RAPID_FIRE_SHOOT_DELAY="Ranger.Ability 1.ArrowDelay"_F; const float RAPID_FIRE_SHOOT_DELAY="Ranger.Ability 1.ArrowDelay"_F;
const int RAPID_FIRE_SHOOT_AMOUNT="Ranger.Ability 1.ArrowCount"_I; const int RAPID_FIRE_SHOOT_AMOUNT="Ranger.Ability 1.ArrowCount"_I;
float footstepTimer=0.f;
size_t cooldownSoundInstance=std::numeric_limits<size_t>::max();
}; };
#pragma region Warrior #pragma region Warrior

View File

@ -44,6 +44,7 @@ All rights reserved.
#include "BulletTypes.h" #include "BulletTypes.h"
#include "util.h" #include "util.h"
#include "config.h" #include "config.h"
#include "SoundEffect.h"
INCLUDE_MONSTER_LIST INCLUDE_MONSTER_LIST
INCLUDE_BULLET_LIST INCLUDE_BULLET_LIST
@ -74,6 +75,7 @@ bool Ranger::AutoAttack(){
BULLET_LIST.push_back(std::make_unique<Arrow>(Arrow(GetPos(),extendedLine,vf2d{cos(angleToCursor)*"Ranger.Auto Attack.ArrowSpd"_F,float(sin(angleToCursor)*"Ranger.Auto Attack.ArrowSpd"_F-PI/8*"Ranger.Auto Attack.ArrowSpd"_F)}+movementVelocity,"Ranger.Auto Attack.Radius"_F/100*12,int(GetAttack()*"Ranger.Auto Attack.DamageMult"_F),OnUpperLevel(),true))); BULLET_LIST.push_back(std::make_unique<Arrow>(Arrow(GetPos(),extendedLine,vf2d{cos(angleToCursor)*"Ranger.Auto Attack.ArrowSpd"_F,float(sin(angleToCursor)*"Ranger.Auto Attack.ArrowSpd"_F-PI/8*"Ranger.Auto Attack.ArrowSpd"_F)}+movementVelocity,"Ranger.Auto Attack.Radius"_F/100*12,int(GetAttack()*"Ranger.Auto Attack.DamageMult"_F),OnUpperLevel(),true)));
SetState(State::SHOOT_ARROW); SetState(State::SHOOT_ARROW);
SetAnimationBasedOnTargetingDirection(angleToCursor); SetAnimationBasedOnTargetingDirection(angleToCursor);
SoundEffect::PlaySFX("Ranger.Auto Attack.Sound"_S);
return true; return true;
} }
@ -92,6 +94,7 @@ void Ranger::InitializeClassAbilities(){
float angleToCursor=atan2(game->GetWorldMousePos().y-p->GetPos().y,game->GetWorldMousePos().x-p->GetPos().x); float angleToCursor=atan2(game->GetWorldMousePos().y-p->GetPos().y,game->GetWorldMousePos().x-p->GetPos().x);
p->SetAnimationBasedOnTargetingDirection(angleToCursor); p->SetAnimationBasedOnTargetingDirection(angleToCursor);
p->SetState(State::RETREAT); p->SetState(State::RETREAT);
SoundEffect::PlaySFX("Ranger.Right Click Ability.Sound"_S);
return true; return true;
}; };
#pragma endregion #pragma endregion
@ -103,6 +106,7 @@ void Ranger::InitializeClassAbilities(){
if("Ranger.Ability 1.IsAnimationLocked"_I){ if("Ranger.Ability 1.IsAnimationLocked"_I){
p->SetState(State::ANIMATION_LOCK); p->SetState(State::ANIMATION_LOCK);
} }
SoundEffect::PlaySFX("Ranger.Ability 1.Sound"_S);
return true; return true;
}; };
#pragma endregion #pragma endregion
@ -114,6 +118,7 @@ void Ranger::InitializeClassAbilities(){
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);
SoundEffect::PlaySFX("Ranger.Ability 2.Sound"_S);
return true; return true;
}; };
#pragma endregion #pragma endregion
@ -136,6 +141,7 @@ void Ranger::InitializeClassAbilities(){
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->SetAnimationBasedOnTargetingDirection(shootingAngle); p->SetAnimationBasedOnTargetingDirection(shootingAngle);
SoundEffect::PlaySFX("Ranger.Ability 3.Sound"_S);
return true; return true;
}; };
#pragma endregion #pragma endregion

View File

@ -38,6 +38,7 @@ All rights reserved.
#include "Menu.h" #include "Menu.h"
#include "ItemMenuLabel.h" #include "ItemMenuLabel.h"
#include "SoundEffect.h"
using A=Attribute; using A=Attribute;
@ -84,6 +85,7 @@ void Menu::InitializeSellItemWindow(){
sellItemWindow->ADD("Sell Button",MenuComponent)({{sellItemWindow->size.x/2+18,70},{64,12}},"Sell",[&](MenuFuncData data){ sellItemWindow->ADD("Sell Button",MenuComponent)({{sellItemWindow->size.x/2+18,70},{64,12}},"Sell",[&](MenuFuncData data){
Merchant&merchant=Merchant::GetCurrentTravelingMerchant(); Merchant&merchant=Merchant::GetCurrentTravelingMerchant();
merchant.SellItem(Component<ItemMenuLabel>(SELL_ITEM,"Item Sell Header")->GetItem(),GetQuantity()); merchant.SellItem(Component<ItemMenuLabel>(SELL_ITEM,"Item Sell Header")->GetItem(),GetQuantity());
SoundEffect::PlaySFX("Sell Item");
Menu::CloseMenu(); Menu::CloseMenu();
return true; return true;
})END; })END;

View File

@ -44,6 +44,7 @@ All rights reserved.
#include "Effect.h" #include "Effect.h"
#include "FallingDebris.h" #include "FallingDebris.h"
#include "MonsterAttribute.h" #include "MonsterAttribute.h"
#include "SoundEffect.h"
INCLUDE_game INCLUDE_game
INCLUDE_BULLET_LIST INCLUDE_BULLET_LIST
@ -68,12 +69,14 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,std::string strat
float angle=((2*PI)/bulletCount)*i+angleOffset; float angle=((2*PI)/bulletCount)*i+angleOffset;
BULLET_LIST.emplace_back(std::make_unique<Bullet>(m.GetPos(),vf2d{cos(angle),sin(angle)}*bulletSpd,6,ConfigInt("ProjectileDamage"),m.OnUpperLevel(),false,YELLOW,vf2d{6,6})); BULLET_LIST.emplace_back(std::make_unique<Bullet>(m.GetPos(),vf2d{cos(angle),sin(angle)}*bulletSpd,6,ConfigInt("ProjectileDamage"),m.OnUpperLevel(),false,YELLOW,vf2d{6,6}));
} }
SoundEffect::PlaySFX("Slime King Shoot");
}; };
const auto Landed=[&ShootBulletRing,&m](int currentPhase){ const auto Landed=[&ShootBulletRing,&m](int currentPhase){
if(currentPhase==1){ if(currentPhase==1){
ShootBulletRing(m.F(A::SHOOT_RING_OFFSET)); ShootBulletRing(m.F(A::SHOOT_RING_OFFSET));
} }
SoundEffect::PlaySFX("Slime King Land");
}; };
const auto TransitionPhase=[&](int newPhase){ const auto TransitionPhase=[&](int newPhase){
@ -288,6 +291,7 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,std::string strat
float angle=(i-(bulletCount/2))*util::degToRad(ConfigFloat("Phase2.ShootAngleSpread"))+initialAngle; float angle=(i-(bulletCount/2))*util::degToRad(ConfigFloat("Phase2.ShootAngleSpread"))+initialAngle;
BULLET_LIST.emplace_back(std::make_unique<Bullet>(m.GetPos(),vf2d{cos(angle),sin(angle)}*bulletSpd,6,ConfigInt("ProjectileDamage"),m.OnUpperLevel(),false,YELLOW,vf2d{6,6})); BULLET_LIST.emplace_back(std::make_unique<Bullet>(m.GetPos(),vf2d{cos(angle),sin(angle)}*bulletSpd,6,ConfigInt("ProjectileDamage"),m.OnUpperLevel(),false,YELLOW,vf2d{6,6}));
} }
SoundEffect::PlaySFX("Slime King Shoot");
} }
if(m.I(A::PATTERN_REPEAT_COUNT)>ConfigInt("Phase2.ShootCount")){ if(m.I(A::PATTERN_REPEAT_COUNT)>ConfigInt("Phase2.ShootCount")){
m.I(A::PATTERN_REPEAT_COUNT)=0; m.I(A::PATTERN_REPEAT_COUNT)=0;
@ -317,6 +321,7 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,std::string strat
float angle=(i-(bulletCount/2))*util::degToRad(ConfigFloat("Phase3.ShootAngleSpread"))+initialAngle; float angle=(i-(bulletCount/2))*util::degToRad(ConfigFloat("Phase3.ShootAngleSpread"))+initialAngle;
BULLET_LIST.emplace_back(std::make_unique<Bullet>(m.GetPos(),vf2d{cos(angle),sin(angle)}*bulletSpd,6,ConfigInt("ProjectileDamage"),m.OnUpperLevel(),false,YELLOW,vf2d{6,6})); BULLET_LIST.emplace_back(std::make_unique<Bullet>(m.GetPos(),vf2d{cos(angle),sin(angle)}*bulletSpd,6,ConfigInt("ProjectileDamage"),m.OnUpperLevel(),false,YELLOW,vf2d{6,6}));
} }
SoundEffect::PlaySFX("Slime King Shoot");
}else }else
if(m.I(A::PATTERN_REPEAT_COUNT)>=4){ if(m.I(A::PATTERN_REPEAT_COUNT)>=4){
m.F(A::RECOVERY_TIME)=ConfigFloat("Phase3.PhaseRecoveryTime"); m.F(A::RECOVERY_TIME)=ConfigFloat("Phase3.PhaseRecoveryTime");
@ -346,6 +351,7 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,std::string strat
float spreadAngle=util::degToRad(ConfigFloat("Phase4.RandomOffsetAngle")); float spreadAngle=util::degToRad(ConfigFloat("Phase4.RandomOffsetAngle"));
bulletAngle+=util::random(spreadAngle*2)-spreadAngle; bulletAngle+=util::random(spreadAngle*2)-spreadAngle;
BULLET_LIST.emplace_back(std::make_unique<Bullet>(m.GetPos(),vf2d{cos(bulletAngle),sin(bulletAngle)}*bulletSpd,6,ConfigInt("ProjectileDamage"),m.OnUpperLevel(),false,YELLOW,vf2d{6,6})); BULLET_LIST.emplace_back(std::make_unique<Bullet>(m.GetPos(),vf2d{cos(bulletAngle),sin(bulletAngle)}*bulletSpd,6,ConfigInt("ProjectileDamage"),m.OnUpperLevel(),false,YELLOW,vf2d{6,6}));
SoundEffect::PlaySFX("Slime King Shoot");
}else }else
if(m.I(A::PATTERN_REPEAT_COUNT)==5){ if(m.I(A::PATTERN_REPEAT_COUNT)==5){
m.I(A::PATTERN_REPEAT_COUNT)++; m.I(A::PATTERN_REPEAT_COUNT)++;

View File

@ -63,6 +63,7 @@ void SoundEffect::Initialize(){
} }
void SoundEffect::PlaySFX(const std::string_view eventName){ void SoundEffect::PlaySFX(const std::string_view eventName){
if(eventName.length()==0)return;
auto itr=SOUND_EFFECTS.equal_range(std::string(eventName)); auto itr=SOUND_EFFECTS.equal_range(std::string(eventName));
size_t soundCount=std::distance(itr.first,itr.second); size_t soundCount=std::distance(itr.first,itr.second);
size_t soundEffectChoice=util::random()%soundCount; size_t soundEffectChoice=util::random()%soundCount;

View File

@ -39,7 +39,7 @@ All rights reserved.
#define VERSION_MAJOR 0 #define VERSION_MAJOR 0
#define VERSION_MINOR 2 #define VERSION_MINOR 2
#define VERSION_PATCH 1 #define VERSION_PATCH 1
#define VERSION_BUILD 5476 #define VERSION_BUILD 5498
#define stringify(a) stringify_(a) #define stringify(a) stringify_(a)
#define stringify_(a) #a #define stringify_(a) #a

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="240" height="120" tilewidth="24" tileheight="24" infinite="0" nextlayerid="7" nextobjectid="17"> <map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="240" height="120" tilewidth="24" tileheight="24" infinite="0" nextlayerid="7" nextobjectid="18">
<properties> <properties>
<property name="Level Type" propertytype="LevelType" value="Dungeon"/> <property name="Level Type" propertytype="LevelType" value="Dungeon"/>
</properties> </properties>
@ -545,5 +545,6 @@
<object id="16" name="Spawn 14" type="SpawnGroup" x="4966" y="1993" width="368" height="350"> <object id="16" name="Spawn 14" type="SpawnGroup" x="4966" y="1993" width="368" height="350">
<ellipse/> <ellipse/>
</object> </object>
<object id="17" name="Player Spawn" type="PlayerSpawnLocation" x="360" y="1464" width="24" height="24"/>
</objectgroup> </objectgroup>
</map> </map>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="200" height="120" tilewidth="24" tileheight="24" infinite="0" nextlayerid="9" nextobjectid="22"> <map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="200" height="120" tilewidth="24" tileheight="24" infinite="0" nextlayerid="9" nextobjectid="23">
<properties> <properties>
<property name="Level Type" propertytype="LevelType" value="Dungeon"/> <property name="Level Type" propertytype="LevelType" value="Dungeon"/>
</properties> </properties>
@ -436,5 +436,6 @@
<object id="21" name="Spawn 19" type="SpawnGroup" x="3493.94" y="781.818" width="369.697" height="345.455"> <object id="21" name="Spawn 19" type="SpawnGroup" x="3493.94" y="781.818" width="369.697" height="345.455">
<ellipse/> <ellipse/>
</object> </object>
<object id="22" name="Player Spawn" type="PlayerSpawnLocation" x="3696" y="600" width="24" height="24"/>
</objectgroup> </objectgroup>
</map> </map>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="200" height="250" tilewidth="24" tileheight="24" infinite="0" nextlayerid="7" nextobjectid="29"> <map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="right-down" width="200" height="250" tilewidth="24" tileheight="24" infinite="0" nextlayerid="7" nextobjectid="30">
<properties> <properties>
<property name="Level Type" propertytype="LevelType" value="Dungeon"/> <property name="Level Type" propertytype="LevelType" value="Dungeon"/>
</properties> </properties>
@ -1105,5 +1105,6 @@
<object id="28" name="Spawn 10" type="SpawnGroup" x="304" y="2524" width="376" height="376"> <object id="28" name="Spawn 10" type="SpawnGroup" x="304" y="2524" width="376" height="376">
<ellipse/> <ellipse/>
</object> </object>
<object id="29" name="Player Spawn" type="PlayerSpawnLocation" x="1704" y="5448" width="24" height="24"/>
</objectgroup> </objectgroup>
</map> </map>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" orientation="orthogonal" renderorder="right-down" width="250" height="175" tilewidth="24" tileheight="24" infinite="0" nextlayerid="6" nextobjectid="29"> <map version="1.10" tiledversion="1.10.1" orientation="orthogonal" renderorder="right-down" width="250" height="175" tilewidth="24" tileheight="24" infinite="0" nextlayerid="6" nextobjectid="31">
<tileset firstgid="1" source="../maps/Decorations_c1_No_Shadow24x24.tsx"/> <tileset firstgid="1" source="../maps/Decorations_c1_No_Shadow24x24.tsx"/>
<tileset firstgid="1621" source="../maps/Tilesheet_No_Shadow24x24.tsx"/> <tileset firstgid="1621" source="../maps/Tilesheet_No_Shadow24x24.tsx"/>
<layer id="2" name="Layer 1" width="250" height="175"> <layer id="2" name="Layer 1" width="250" height="175">
@ -624,5 +624,7 @@
<object id="28" name="Spawn 26" type="SpawnGroup" x="5003" y="1489" width="358" height="358"> <object id="28" name="Spawn 26" type="SpawnGroup" x="5003" y="1489" width="358" height="358">
<ellipse/> <ellipse/>
</object> </object>
<object id="29" name="End Zone" type="EndZone" x="5856" y="1608" width="120" height="120"/>
<object id="30" name="Player Spawn" type="PlayerSpawnLocation" x="888" y="3432" width="24" height="24"/>
</objectgroup> </objectgroup>
</map> </map>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" orientation="orthogonal" renderorder="right-down" width="225" height="150" tilewidth="24" tileheight="24" infinite="0" nextlayerid="7" nextobjectid="22"> <map version="1.10" tiledversion="1.10.1" orientation="orthogonal" renderorder="right-down" width="225" height="150" tilewidth="24" tileheight="24" infinite="0" nextlayerid="7" nextobjectid="24">
<tileset firstgid="1" source="../maps/Decorations_c1_No_Shadow24x24.tsx"/> <tileset firstgid="1" source="../maps/Decorations_c1_No_Shadow24x24.tsx"/>
<tileset firstgid="1621" source="../maps/Tilesheet_No_Shadow24x24.tsx"/> <tileset firstgid="1621" source="../maps/Tilesheet_No_Shadow24x24.tsx"/>
<tileset firstgid="4533" source="../maps/24x24_Waterfall.tsx"/> <tileset firstgid="4533" source="../maps/24x24_Waterfall.tsx"/>
@ -677,5 +677,7 @@
<object id="21" name="Spawn 19" type="SpawnGroup" x="4638" y="2588" width="360" height="388"> <object id="21" name="Spawn 19" type="SpawnGroup" x="4638" y="2588" width="360" height="388">
<ellipse/> <ellipse/>
</object> </object>
<object id="22" name="Player Spawn" type="PlayerSpawnLocation" x="1776" y="288" width="24" height="24"/>
<object id="23" name="End Zone" type="EndZone" x="5016" y="2718" width="120" height="120"/>
</objectgroup> </objectgroup>
</map> </map>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" orientation="orthogonal" renderorder="right-down" width="250" height="125" tilewidth="24" tileheight="24" infinite="0" nextlayerid="6" nextobjectid="24"> <map version="1.10" tiledversion="1.10.1" orientation="orthogonal" renderorder="right-down" width="250" height="125" tilewidth="24" tileheight="24" infinite="0" nextlayerid="6" nextobjectid="26">
<tileset firstgid="1" source="../maps/Tilesheet_No_Shadow24x24.tsx"/> <tileset firstgid="1" source="../maps/Tilesheet_No_Shadow24x24.tsx"/>
<tileset firstgid="2913" source="../maps/Decorations_c1_No_Shadow24x24.tsx"/> <tileset firstgid="2913" source="../maps/Decorations_c1_No_Shadow24x24.tsx"/>
<layer id="2" name="Layer 1" width="250" height="125"> <layer id="2" name="Layer 1" width="250" height="125">
@ -459,5 +459,7 @@
<object id="23" name="Spawn 23" type="SpawnGroup" x="5420.09" y="1327.76" width="359.818" height="348.485"> <object id="23" name="Spawn 23" type="SpawnGroup" x="5420.09" y="1327.76" width="359.818" height="348.485">
<ellipse/> <ellipse/>
</object> </object>
<object id="24" name="End Zone" type="EndZone" x="5832" y="1440" width="120" height="120"/>
<object id="25" name="Player Spawn" type="PlayerSpawnLocation" x="360" y="1488" width="24" height="24"/>
</objectgroup> </objectgroup>
</map> </map>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="left-down" width="250" height="177" tilewidth="4" tileheight="4" infinite="0" nextlayerid="5" nextobjectid="12"> <map version="1.10" tiledversion="1.10.1" class="Map" orientation="orthogonal" renderorder="left-down" width="250" height="177" tilewidth="4" tileheight="4" infinite="0" nextlayerid="5" nextobjectid="17">
<properties> <properties>
<property name="Level Type" propertytype="LevelType" value="World Map"/> <property name="Level Type" propertytype="LevelType" value="World Map"/>
<property name="Optimize" type="bool" value="true"/> <property name="Optimize" type="bool" value="true"/>
@ -553,7 +553,7 @@
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11035,11036,11037,11038,11039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11035,11036,11037,11038,11039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</data> </data>
</layer> </layer>
<objectgroup id="4" name="Object Layer 1"> <objectgroup id="4" name="Stage Plates">
<object id="2" name="Temp Player Spawn" type="PlayerSpawnLocation" x="200" y="325" width="20" height="20"/> <object id="2" name="Temp Player Spawn" type="PlayerSpawnLocation" x="200" y="325" width="20" height="20"/>
<object id="3" name="Stage I-I" type="StagePlate" x="252" y="496" width="44" height="16"> <object id="3" name="Stage I-I" type="StagePlate" x="252" y="496" width="44" height="16">
<properties> <properties>
@ -607,7 +607,7 @@
</object> </object>
<object id="9" name="Stage IV" type="StagePlate" x="172" y="580" width="44" height="16"> <object id="9" name="Stage IV" type="StagePlate" x="172" y="580" width="44" height="16">
<properties> <properties>
<property name="Connection 1" type="object" value="0"/> <property name="Connection 1" type="object" value="12"/>
<property name="Connection 2" type="object" value="0"/> <property name="Connection 2" type="object" value="0"/>
<property name="Map" propertytype="Level" value="CAMPAIGN_1_4"/> <property name="Map" propertytype="Level" value="CAMPAIGN_1_4"/>
<property name="Type" propertytype="StageType" value="DUNGEON"/> <property name="Type" propertytype="StageType" value="DUNGEON"/>
@ -616,11 +616,56 @@
</object> </object>
<object id="11" name="Boss I" type="StagePlate" x="156" y="644" width="32" height="24"> <object id="11" name="Boss I" type="StagePlate" x="156" y="644" width="32" height="24">
<properties> <properties>
<property name="Connection 1" type="object" value="0"/> <property name="Connection 1" type="object" value="16"/>
<property name="Map" propertytype="Level" value="BOSS_1"/> <property name="Map" propertytype="Level" value="BOSS_1"/>
<property name="Type" propertytype="StageType" value="BOSS"/> <property name="Type" propertytype="StageType" value="BOSS"/>
<property name="Unlock Condition" propertytype="Level" value="CAMPAIGN_1_8"/> <property name="Unlock Condition" propertytype="Level" value="CAMPAIGN_1_8"/>
</properties> </properties>
</object> </object>
<object id="12" name="Stage V" type="StagePlate" x="112" y="532" width="44" height="16">
<properties>
<property name="Connection 1" type="object" value="13"/>
<property name="Connection 2" type="object" value="0"/>
<property name="Map" propertytype="Level" value="CAMPAIGN_1_5"/>
<property name="Type" propertytype="StageType" value="DUNGEON"/>
<property name="Unlock Condition" propertytype="Level" value="CAMPAIGN_1_4"/>
</properties>
</object>
<object id="13" name="Stage VI" type="StagePlate" x="60" y="484" width="44" height="16">
<properties>
<property name="Connection 1" type="object" value="14"/>
<property name="Connection 2" type="object" value="0"/>
<property name="Map" propertytype="Level" value="CAMPAIGN_1_6"/>
<property name="Type" propertytype="StageType" value="DUNGEON"/>
<property name="Unlock Condition" propertytype="Level" value="CAMPAIGN_1_5"/>
</properties>
</object>
<object id="14" name="Stage VII" type="StagePlate" x="36" y="556" width="44" height="16">
<properties>
<property name="Connection 1" type="object" value="15"/>
<property name="Connection 2" type="object" value="0"/>
<property name="Map" propertytype="Level" value="CAMPAIGN_1_7"/>
<property name="Type" propertytype="StageType" value="DUNGEON"/>
<property name="Unlock Condition" propertytype="Level" value="CAMPAIGN_1_6"/>
</properties>
</object>
<object id="15" name="Stage VIII" type="StagePlate" x="72" y="612" width="44" height="16">
<properties>
<property name="Connection 1" type="object" value="11"/>
<property name="Connection 2" type="object" value="0"/>
<property name="Map" propertytype="Level" value="CAMPAIGN_1_8"/>
<property name="Type" propertytype="StageType" value="DUNGEON"/>
<property name="Unlock Condition" propertytype="Level" value="CAMPAIGN_1_7"/>
</properties>
</object>
<object id="16" name="Story III" type="StagePlate" x="160" y="612" width="20" height="24">
<properties>
<property name="Connection 1" type="object" value="0"/>
<property name="Connection 2" type="object" value="0"/>
<property name="Map" propertytype="Level" value="STORY_1_3"/>
<property name="Type" propertytype="StageType" value="STORY"/>
<property name="Unlock Condition" propertytype="Level" value="BOSS_1"/>
</properties>
</object>
</objectgroup> </objectgroup>
</map> </map>

View File

@ -29,6 +29,10 @@ Monsters
DROP[1] = Minor Health Potion,5%,1,1 DROP[1] = Minor Health Potion,5%,1,1
DROP[2] = Berries,5%,1,1 DROP[2] = Berries,5%,1,1
Hurt Sound = Monster Hurt
Death Sound = Slime Dead
Walk Sound = Slime Walk
#Additional custom animations go down below. Start with ANIMATION[0]. Order is: #Additional custom animations go down below. Start with ANIMATION[0]. Order is:
# Frame Count, Frame Speed (s), Frame Cycling (Repeat,OneShot,PingPong,Reverse) # Frame Count, Frame Speed (s), Frame Cycling (Repeat,OneShot,PingPong,Reverse)
#ANIMATION[0] = 6, 0.1, Repeat #ANIMATION[0] = 6, 0.1, Repeat
@ -56,6 +60,10 @@ Monsters
ShootAnimation = 10, 0.1, Repeat ShootAnimation = 10, 0.1, Repeat
DeathAnimation = 10, 0.1, OneShot DeathAnimation = 10, 0.1, OneShot
Hurt Sound = Monster Hurt
Death Sound = Slime Dead
Walk Sound = Slime Walk
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity # Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
DROP[0] = Blue Slime Remains,65%,1,2 DROP[0] = Blue Slime Remains,65%,1,2
DROP[1] = Minor Health Potion,5%,1,1 DROP[1] = Minor Health Potion,5%,1,1
@ -87,6 +95,10 @@ Monsters
ShootAnimation = 10, 0.1, OneShot ShootAnimation = 10, 0.1, OneShot
DeathAnimation = 10, 0.1, OneShot DeathAnimation = 10, 0.1, OneShot
Hurt Sound = Monster Hurt
Death Sound = Slime Dead
Walk Sound = Slime Walk
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity # Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
DROP[0] = Red Slime Remains,65%,1,2 DROP[0] = Red Slime Remains,65%,1,2
DROP[1] = Minor Health Potion,5%,1,1 DROP[1] = Minor Health Potion,5%,1,1
@ -118,6 +130,10 @@ Monsters
ShootAnimation = 10, 0.1, OneShot ShootAnimation = 10, 0.1, OneShot
DeathAnimation = 10, 0.1, OneShot DeathAnimation = 10, 0.1, OneShot
Hurt Sound = Monster Hurt
Death Sound = Slime Dead
Walk Sound = Slime Walk
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity # Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
DROP[0] = Berries,5%,1,1 DROP[0] = Berries,5%,1,1
@ -147,6 +163,10 @@ Monsters
ShootAnimation = 5, 0.1, OneShot ShootAnimation = 5, 0.1, OneShot
DeathAnimation = 5, 0.2, OneShot DeathAnimation = 5, 0.2, OneShot
Hurt Sound = Monster Hurt
Death Sound = Slime Dead
# Walk Sound = Slime Walk # DOES NOT WALK!
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity # Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
DROP[0] = Bandages,30%,1,1 DROP[0] = Bandages,30%,1,1
DROP[1] = Berries,5%,1,1 DROP[1] = Berries,5%,1,1
@ -179,6 +199,10 @@ Monsters
ShootAnimation = 10, 0.1, OneShot ShootAnimation = 10, 0.1, OneShot
DeathAnimation = 10, 0.1, OneShot DeathAnimation = 10, 0.1, OneShot
Hurt Sound = Monster Hurt
Death Sound = Slime Dead
Walk Sound = Slime Walk
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity # Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
DROP[0] = Berries,5%,1,1 DROP[0] = Berries,5%,1,1

View File

@ -26,6 +26,9 @@ Player
# How long the player must stand in the end zone before leaving the level. # How long the player must stand in the end zone before leaving the level.
End Zone Wait Time = 5.0 End Zone Wait Time = 5.0
# How long between each footstep.
Footstep Timer = 0.4
# Each attack will have _N,_E,_S,_W appended to them once read in-game. # Each attack will have _N,_E,_S,_W appended to them once read in-game.
PLAYER_ANIMATION[0] = WARRIOR_WALK PLAYER_ANIMATION[0] = WARRIOR_WALK
PLAYER_ANIMATION[1] = WARRIOR_IDLE PLAYER_ANIMATION[1] = WARRIOR_IDLE

View File

@ -19,8 +19,8 @@ Events
Equip Armor Equip Armor
{ {
# Specify file names, followed by volume % # Specify file names, followed by volume %
File[0] = equip.ogg, 100% File[0] = equip.ogg, 60%
File[1] = equip2.ogg, 100% File[1] = equip2.ogg, 60%
} }
Equip Accessory Equip Accessory
{ {
@ -30,7 +30,7 @@ Events
Footstep Footstep
{ {
# Specify file names, followed by volume % # Specify file names, followed by volume %
File[0] = footsteps.ogg, 100% File[0] = footsteps.ogg, 90%
} }
Footstep - Wet Footstep - Wet
{ {
@ -40,38 +40,43 @@ Events
Buy Item Buy Item
{ {
# Specify file names, followed by volume % # Specify file names, followed by volume %
File[0] = item_buy.ogg, 100% File[0] = item_buy.ogg, 70%
} }
Sell Item Sell Item
{ {
# Specify file names, followed by volume % # Specify file names, followed by volume %
File[0] = item_sell.ogg, 100% File[0] = item_sell.ogg, 80%
} }
Craft Item Craft Item
{ {
# Specify file names, followed by volume % # Specify file names, followed by volume %
File[0] = item_craft.ogg, 100% File[0] = item_craft.ogg, 70%
} }
Enhance Item Enhance Item
{ {
# Specify file names, followed by volume % # Specify file names, followed by volume %
File[0] = item_enhance.ogg, 100% File[0] = item_enhance.ogg, 100%
} }
Collect Item
{
# Specify file names, followed by volume %
File[0] = item_collect.ogg, 40%
}
Monster Hurt Monster Hurt
{ {
# Specify file names, followed by volume % # Specify file names, followed by volume %
File[0] = monster_hurt.ogg, 100% File[0] = monster_hurt.ogg, 40%
} }
Ranger Auto Attack Ranger Auto Attack
{ {
# Specify file names, followed by volume % # Specify file names, followed by volume %
File[0] = ranger_auto1.ogg, 100% File[0] = ranger_auto1.ogg, 50%
File[1] = ranger_auto2.ogg, 100% File[1] = ranger_auto2.ogg, 50%
} }
Ranger Backstep Ranger Retreat
{ {
# Specify file names, followed by volume % # Specify file names, followed by volume %
File[0] = ranger_backstep.ogg, 100% File[0] = ranger_backstep.ogg, 90%
} }
Ranger Multishot Ranger Multishot
{ {
@ -86,22 +91,18 @@ Events
Ranger Charged Shot Ranger Charged Shot
{ {
# Specify file names, followed by volume % # Specify file names, followed by volume %
File[0] = ranger_charged_shot.ogg, 100% File[0] = ranger_charged_shot.ogg, 70%
}
Ranger Multishot
{
# Specify file names, followed by volume %
File[0] = ranger_multishot.ogg, 100%
} }
Slime Dead Slime Dead
{ {
# Specify file names, followed by volume % # Specify file names, followed by volume %
File[0] = slime_dead.ogg, 100% File[0] = slime_dead.ogg, 60%
File[1] = slime_dead2.ogg, 60%
} }
Monster Dead Monster Dead
{ {
# Specify file names, followed by volume % # Specify file names, followed by volume %
File[0] = slime_dead2.ogg, 100% File[0] = slime_dead2.ogg, 60%
} }
Slime King Land Slime King Land
{ {
@ -122,14 +123,9 @@ Events
Slime Walk Slime Walk
{ {
# Specify file names, followed by volume % # Specify file names, followed by volume %
File[0] = slime_walk.ogg, 100% File[0] = slime_walk.ogg, 10%
File[1] = slime_walk2.ogg, 100% File[1] = slime_walk2.ogg, 10%
File[2] = slime_walk3.ogg, 100% File[2] = slime_walk3.ogg, 10%
}
Spell Cast
{
# Specify file names, followed by volume %
File[0] = spell_cast.ogg, 100%
} }
Warrior Auto Attack Warrior Auto Attack
{ {

View File

@ -22,6 +22,7 @@ Ranger
ArrowSpd = 250 ArrowSpd = 250
Sound = Ranger Auto Attack
} }
Right Click Ability Right Click Ability
{ {
@ -47,6 +48,8 @@ Ranger
RetreatTime = 0.2 RetreatTime = 0.2
# The distance the retreat moves the Ranger. # The distance the retreat moves the Ranger.
RetreatDistance = 250 RetreatDistance = 250
Sound = Ranger Retreat
} }
Ability 1 Ability 1
{ {
@ -81,6 +84,8 @@ Ranger
# Hitbox radius of the arrows # Hitbox radius of the arrows
ArrowRadius = 100 ArrowRadius = 100
Sound = Ranger Rapid Fire
} }
Ability 2 Ability 2
{ {
@ -113,6 +118,8 @@ Ranger
# How long the world shakes upon using this ability. # How long the world shakes upon using this ability.
WorldShakeTime = 0.3 WorldShakeTime = 0.3
Sound = Ranger Charged Shot
} }
Ability 3 Ability 3
{ {
@ -146,5 +153,6 @@ Ranger
# Hitbox radius of the arrows # Hitbox radius of the arrows
ArrowRadius = 100 ArrowRadius = 100
Sound = Ranger Multishot
} }
} }

View File

@ -11,6 +11,7 @@ Equipment
MaxStats = 20,4,4,3 MaxStats = 20,4,4,3
SellValue = 90 SellValue = 90
Equip Sound = Equip Accessory
} }
Ring of the Bear Ring of the Bear
{ {
@ -22,5 +23,7 @@ Equipment
MinStats = 4,4,1 MinStats = 4,4,1
MaxStats = 10,10,3 MaxStats = 10,10,3
SellValue = 75 SellValue = 75
Equip Sound = Equip Accessory
} }
} }

View File

@ -21,6 +21,8 @@ Equipment
StatValues[9] = 10,7,4 StatValues[9] = 10,7,4
StatValues[10] = 11,8,4 StatValues[10] = 11,8,4
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -107,6 +109,8 @@ Equipment
StatValues[9] = 14,6,4 StatValues[9] = 14,6,4
StatValues[10] = 15,7,4 StatValues[10] = 15,7,4
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -193,6 +197,8 @@ Equipment
StatValues[9] = 13,5,6 StatValues[9] = 13,5,6
StatValues[10] = 14,5,7 StatValues[10] = 14,5,7
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -279,6 +285,8 @@ Equipment
StatValues[9] = 8,4,7 StatValues[9] = 8,4,7
StatValues[10] = 8,4,8 StatValues[10] = 8,4,8
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -365,6 +373,8 @@ Equipment
StatValues[9] = 9,5,4 StatValues[9] = 9,5,4
StatValues[10] = 9,5,5 StatValues[10] = 9,5,5
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -451,6 +461,8 @@ Equipment
StatValues[9] = 18,12,5 StatValues[9] = 18,12,5
StatValues[10] = 20,12,5 StatValues[10] = 20,12,5
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -537,6 +549,8 @@ Equipment
StatValues[9] = 23,9,5 StatValues[9] = 23,9,5
StatValues[10] = 25,10,5 StatValues[10] = 25,10,5
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -623,6 +637,8 @@ Equipment
StatValues[9] = 20,7,9 StatValues[9] = 20,7,9
StatValues[10] = 22,8,10 StatValues[10] = 22,8,10
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -709,6 +725,8 @@ Equipment
StatValues[9] = 10,5,12 StatValues[9] = 10,5,12
StatValues[10] = 11,5,12 StatValues[10] = 11,5,12
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -795,6 +813,8 @@ Equipment
StatValues[9] = 11,7,7 StatValues[9] = 11,7,7
StatValues[10] = 12,8,8 StatValues[10] = 12,8,8
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -881,6 +901,8 @@ Equipment
StatValues[9] = 35,14,6 StatValues[9] = 35,14,6
StatValues[10] = 40,14,6 StatValues[10] = 40,14,6
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -967,6 +989,8 @@ Equipment
StatValues[9] = 51,12,6 StatValues[9] = 51,12,6
StatValues[10] = 57,12,6 StatValues[10] = 57,12,6
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -1053,6 +1077,8 @@ Equipment
StatValues[9] = 38,9,12 StatValues[9] = 38,9,12
StatValues[10] = 42,10,12 StatValues[10] = 42,10,12
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -1139,6 +1165,8 @@ Equipment
StatValues[9] = 14,6,14 StatValues[9] = 14,6,14
StatValues[10] = 15,6,14 StatValues[10] = 15,6,14
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -1225,6 +1253,8 @@ Equipment
StatValues[9] = 15,9,9 StatValues[9] = 15,9,9
StatValues[10] = 16,10,10 StatValues[10] = 16,10,10
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -1311,6 +1341,8 @@ Equipment
StatValues[9] = 51,17,7 StatValues[9] = 51,17,7
StatValues[10] = 53,19,7 StatValues[10] = 53,19,7
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -1397,6 +1429,8 @@ Equipment
StatValues[9] = 70,14,7 StatValues[9] = 70,14,7
StatValues[10] = 72,14,7 StatValues[10] = 72,14,7
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -1484,6 +1518,8 @@ Equipment
StatValues[9] = 57,11,14 StatValues[9] = 57,11,14
StatValues[10] = 61,12,14 StatValues[10] = 61,12,14
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -1570,6 +1606,8 @@ Equipment
StatValues[9] = 18,7,17 StatValues[9] = 18,7,17
StatValues[10] = 19,7,19 StatValues[10] = 19,7,19
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]
@ -1656,6 +1694,8 @@ Equipment
StatValues[9] = 19,11,11 StatValues[9] = 19,11,11
StatValues[10] = 21,12,12 StatValues[10] = 21,12,12
Equip Sound = Equip Armor
Crafting Crafting
{ {
Level[1] Level[1]

View File

@ -11,4 +11,7 @@ Levels
CAMPAIGN_1_3 = 1_3.tmx CAMPAIGN_1_3 = 1_3.tmx
CAMPAIGN_1_4 = 1_4.tmx CAMPAIGN_1_4 = 1_4.tmx
CAMPAIGN_1_5 = 1_5.tmx CAMPAIGN_1_5 = 1_5.tmx
CAMPAIGN_1_6 = 1_6.tmx
CAMPAIGN_1_7 = 1_7.tmx
CAMPAIGN_1_8 = 1_8.tmx
} }

Binary file not shown.

View File

@ -366,6 +366,8 @@ namespace olc::utils
// first assignment, trim any whitespace from ends // first assignment, trim any whitespace from ends
sPropName = line.substr(0, x); sPropName = line.substr(0, x);
trim(sPropName); trim(sPropName);
auto&top=stkPath.top().get();
if(stkPath.top().get().HasProperty(sPropName))ERR(std::format("WARNING! Duplicate key found! Key {} already exists! Duplicate line: {}",sPropName,line));
// Extract the property value, which is all characters after // Extract the property value, which is all characters after
// the first assignment operator, trim any whitespace from ends // the first assignment operator, trim any whitespace from ends