Update sprites for second boss, add config parameters for new behavior.

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
pull/35/head
Nic0Nic0Nii 10 months ago
parent aa39b1b855
commit 1046557ac0
  1. 4
      Adventures in Lestoria/Bear.cpp
  2. 104
      Adventures in Lestoria/SaveFile.cpp
  3. 3
      Adventures in Lestoria/SaveFile.h
  4. 18
      Adventures in Lestoria/assets/config/MonsterStrategies.txt
  5. BIN
      Adventures in Lestoria/assets/monsters/Ursule Mother of Bears2.png
  6. BIN
      Adventures in Lestoria/assets/monsters/Ursule, Mother of Bears.png

@ -88,14 +88,14 @@ void Monster::STRATEGY::BEAR(Monster&m,float fElapsedTime,std::string strategy){
if(geom2d::overlaps(attackCircle,game->GetPlayer()->Hitbox())){
if(game->GetPlayer()->Hurt(m.GetAttack(),m.OnUpperLevel(),0.f)){
game->GetPlayer()->Knockup(ConfigFloat("Attack Knockup Duration"));
vf2d playerDirVecNorm=geom2d::line<float>(m.V(A::LOCKON_POS),game->GetPlayer()->GetPos()).vector().norm();
vf2d playerDirVecNorm=geom2d::line<float>(m.GetPos(),game->GetPlayer()->GetPos()).vector().norm();
game->GetPlayer()->Knockback(playerDirVecNorm*ConfigFloat("Attack Knockback Amount"));
}
}
for(Monster&otherM:MONSTER_LIST){
if(!otherM.AttackAvoided(m.GetZ())&&&m!=&otherM&&geom2d::overlaps(attackCircle,otherM.Hitbox())){
otherM.Knockup(ConfigFloat("Attack Knockup Duration"));
vf2d monsterDirVecNorm=geom2d::line<float>(m.V(A::LOCKON_POS),otherM.GetPos()).vector().norm();
vf2d monsterDirVecNorm=geom2d::line<float>(m.GetPos(),otherM.GetPos()).vector().norm();
game->GetPlayer()->Knockback(monsterDirVecNorm*ConfigFloat("Attack Knockback Amount"));
}
}

@ -124,35 +124,37 @@ const void SaveFile::SaveGame(){
utils::datafile::INITIAL_SETUP_COMPLETE=true;
#ifdef __EMSCRIPTEN__
std::stringstream fileContents;
std::ifstream file("save_file_path"_S+std::format("save.{:04}",saveFileID));
while(file.good()){
int val=file.get();
if(val!=-1){
fileContents<<char(val);
if(onlineMode){
std::stringstream fileContents;
std::ifstream file("save_file_path"_S+std::format("save.{:04}",saveFileID)+"_online");
while(file.good()){
int val=file.get();
if(val!=-1){
fileContents<<char(val);
}
}
}
std::string contents=fileContents.str();
emscripten_idb_async_store("/assets",("save_file_path"_S+std::format("save.{:04}",saveFileID)).c_str(),contents.data(),contents.length(),0,[](void*arg){
std::cout<<"Successfully saved save file "<<saveFileID<<"!"<<std::endl;
},[](void*arg){
std::cout<<"Failed to save save file "<<saveFileID<<"!"<<std::endl;
});
std::string contents=fileContents.str();
emscripten_idb_async_store("/assets",("save_file_path"_S+std::format("save.{:04}",saveFileID)+"_online").c_str(),contents.data(),contents.length(),0,[](void*arg){
std::cout<<"Successfully saved save file "<<saveFileID<<"!"<<std::endl;
},[](void*arg){
std::cout<<"Failed to save save file "<<saveFileID<<"!"<<std::endl;
});
file.close();
std::function<void(std::string_view response)>RetryResponse;
RetryResponse=[&](std::string_view response){
if(response!="ERR"){
Server_SaveFile([](std::string_view response){
if(response=="ERR"){
std::cout<<"WARNING! Could not save data to server!"<<std::endl;
}
});
}else{
std::cout<<"WARNING! Could not save metadata to server!"<<std::endl;
}
};
Server_SaveMetadataFile(RetryResponse);
file.close();
std::function<void(std::string_view response)>RetryResponse;
RetryResponse=[&](std::string_view response){
if(response!="ERR"){
Server_SaveFile([](std::string_view response){
if(response=="ERR"){
std::cout<<"WARNING! Could not save data to server!"<<std::endl;
}
});
}else{
std::cout<<"WARNING! Could not save metadata to server!"<<std::endl;
}
};
Server_SaveMetadataFile(RetryResponse);
}
#endif
}
@ -264,6 +266,30 @@ const void SaveFile::UpdateSaveGameData(){
}
}
};
auto LoadOnlineMetadataFile=[](){
auto gameFilesList=Component<ScrollableWindowComponent>(LOAD_GAME,"Game Files List");
gameFilesList->RemoveAllComponents();
if(SaveFile::IsOnline()){
const size_t saveFileCount=GetSaveFileCount();
utils::datafile metadata;
if(!std::filesystem::exists("save_file_path"_S+"metadata.dat")){
utils::datafile::Write(metadata,"save_file_path"_S+"metadata.dat");
}
utils::datafile::Read(metadata,"save_file_path"_S+"metadata.dat");
float offsetY=0;
for(size_t i=0;i<saveFileCount;i++){
if(metadata.HasProperty(std::format("save{}",i))){
gameFilesList->ADD(std::format("Load File Button - Save {}",i),LoadFileButton)(geom2d::rect<float>{{0,offsetY},{gameFilesList->GetSize().x-13,48}},metadata[std::format("save{}",i)],i,[](MenuFuncData data){
std::weak_ptr<LoadFileButton>comp=DYNAMIC_POINTER_CAST<LoadFileButton>(data.component.lock());
saveFileID=comp.lock()->getSaveFileID();
SaveFile::LoadGame();
return true;
},ButtonAttr::NONE)END;
offsetY+=49;
}
}
}
};
LoadMetadataFile();
@ -337,7 +363,7 @@ const void SaveFile::Server_GetFile(std::function<void(std::string_view)>respCal
}
const void SaveFile::Server_SaveFile(std::function<void(std::string_view)>respCallbackFunc){
std::stringstream fileContents;
std::ifstream file("save_file_path"_S+std::format("save.{:04}",saveFileID));
std::ifstream file("save_file_path"_S+std::format("save.{:04}",saveFileID)+"_online");
while(file.good()){
int val=file.get();
if(val!=-1){
@ -349,21 +375,19 @@ const void SaveFile::Server_SaveFile(std::function<void(std::string_view)>respCa
}
const void SaveFile::Server_SaveMetadataFile(std::function<void(std::string_view)>respCallbackFunc){
std::stringstream fileContents;
std::ifstream file("save_file_path"_S+"metadata.dat");
std::ifstream file("save_file_path"_S+"metadata.dat"+"_online");
while(file.good()){
int val=file.get();
if(val!=-1){
fileContents<<char(val);
}
}
#ifdef __EMSCRIPTEN__
std::string contents=fileContents.str();
emscripten_idb_async_store("/assets",("save_file_path"_S+"metadata.dat").c_str(),contents.data(),contents.length(),0,[](void*arg){
std::cout<<"Saved metadata successfully!"<<std::endl;
},[](void*arg){
std::cout<<"Failed to save metadata!"<<std::endl;
});
#endif
std::string contents=fileContents.str();
emscripten_idb_async_store("/assets",("save_file_path"_S+"metadata.dat"+"_online").c_str(),contents.data(),contents.length(),0,[](void*arg){
std::cout<<"Saved metadata successfully!"<<std::endl;
},[](void*arg){
std::cout<<"Failed to save metadata!"<<std::endl;
});
game->SendRequest("save_server"_S,CreateServerRequest(SaveFileOperation::SAVE_METADATA_FILE,fileContents.str()));
game->responseCallback=respCallbackFunc;
}
@ -375,6 +399,10 @@ const void SaveFile::SetUserID(std::string_view userID){
SaveFile::username=userID;
}
bool SaveFile::IsOnline(){
const bool SaveFile::IsOnline(){
return onlineMode;
}
void SaveFile::SetOnlineMode(bool online){
onlineMode=online;
}

@ -57,7 +57,8 @@ public:
static const std::string_view GetSaveFileName();
static const void SetSaveFileName(std::string_view saveFileName);
static const size_t GetSaveFileCount();
static bool IsOnline();
static const bool IsOnline();
static void SetOnlineMode(bool online);
static const std::string_view GetUserID();
static const void SetUserID(std::string_view userID);
static const void SaveGame();

@ -334,6 +334,15 @@ MonsterStrategy
# Maximum amount of time the boss takes to run towards the center before giving up and continuing through Phase 2.
Run to Center Time = 10.0s
# Number of stomps to perform before doing a run towards the player.
Stomp Count = 3
# Amount of time to run towards the player.
Run Time = 2.0s
# Provide a speed boost amount during the run.
Run Speed Boost = 0%
}
Phase 2
{
@ -419,6 +428,15 @@ MonsterStrategy
# Amount of knockback to cause to the player when hit by the charging attack.
Charge Attack Knockback Strength = 3.5
# Number of stomps to perform before doing a run towards the player.
Stomp Count = 3
# Amount of time to run towards the player.
Run Time = 2.0s
# Provide a speed boost amount during the run.
Run Speed Boost = 0%
}
Phase 4
{

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Loading…
Cancel
Save