Targets already in the air should not be knocked back. Fix image loading dependencies internally within the engine so they work even during unit testing. Rearrange some item initializing functions to occur after the GFX map is reset so all graphics are loaded properly. Release Build 9835.

mac-build
sigonasr2 5 months ago
parent 6274dcefb1
commit c879cafe1e
  1. 2
      Adventures in Lestoria Tests/MonsterTests.cpp
  2. 18
      Adventures in Lestoria Tests/PlayerTests.cpp
  3. 21
      Adventures in Lestoria/AdventuresInLestoria.cpp
  4. 3
      Adventures in Lestoria/AdventuresInLestoria.h
  5. 2
      Adventures in Lestoria/Animation.cpp
  6. 2
      Adventures in Lestoria/Bullet.cpp
  7. 1
      Adventures in Lestoria/CharacterMenuWindow.cpp
  8. 2
      Adventures in Lestoria/Effect.cpp
  9. 2
      Adventures in Lestoria/MenuIconButton.h
  10. 2
      Adventures in Lestoria/Monster.cpp
  11. 3
      Adventures in Lestoria/Player.cpp
  12. 2
      Adventures in Lestoria/Version.h
  13. 24
      Adventures in Lestoria/olcPixelGameEngine.h
  14. BIN
      x64/Release/Adventures in Lestoria.exe

@ -61,7 +61,7 @@ namespace MonsterTests
//Makes MONSTER_DATA["TestName"] available. //Makes MONSTER_DATA["TestName"] available.
void SetupTestMonster(){ void SetupTestMonster(){
testGame.reset(new AiL()); testGame.reset(new AiL());
testGame->EnableTestingMode(); testGame->olc_SetTestingMode(true);
ItemAttribute::Initialize(); ItemAttribute::Initialize();
ItemInfo::InitializeItems(); ItemInfo::InitializeItems();
testGame->InitializePlayer(); testGame->InitializePlayer();

@ -53,12 +53,16 @@ namespace PlayerTests
HWButton*testKey; HWButton*testKey;
TEST_METHOD_INITIALIZE(PlayerInitialize){ TEST_METHOD_INITIALIZE(PlayerInitialize){
testGame.reset(new AiL()); testGame.reset(new AiL());
testGame->EnableTestingMode(); testGame->olc_SetTestingMode(true);
ItemAttribute::Initialize();
ItemInfo::InitializeItems();
testGame->InitializeGraphics();
testGame->InitializeClasses(); testGame->InitializeClasses();
sig::Animation::InitializeAnimations();
testGame->InitializeDefaultKeybinds(); testGame->InitializeDefaultKeybinds();
Tutorial::Initialize();
ItemAttribute::Initialize();
testGame->InitializePlayer(); testGame->InitializePlayer();
Menu::InitializeMenus();
Tutorial::Initialize();
Stats::InitializeDamageReductionTable(); Stats::InitializeDamageReductionTable();
player=testGame->GetPlayer(); player=testGame->GetPlayer();
//Setup key "0" as a test input //Setup key "0" as a test input
@ -118,5 +122,13 @@ namespace PlayerTests
player->GetRightClickAbility().action(player,player->GetPos()); player->GetRightClickAbility().action(player,player->GetPos());
Assert::AreEqual(int(State::BLOCK),int(player->GetState())); Assert::AreEqual(int(State::BLOCK),int(player->GetState()));
} }
TEST_METHOD(WizardCastDoesNotConsumeManaImmediately){
testGame->ChangePlayerClass(WIZARD);
player=testGame->GetPlayer(); //The player pointer has been reassigned...
//Ability 3 is Meteor, which is a cast. Mana should not be consumed for a spell that begins as a cast.
testKey->bHeld=true; //Force the key to be held down for testing purposes.
player->CheckAndPerformAbility(player->GetAbility3(),testKeyboardInput);
Assert::AreEqual(player->GetMaxMana(),player->GetMana());
}
}; };
} }

@ -267,10 +267,6 @@ bool AiL::OnUserCreate(){
VisualNovel::Initialize(); VisualNovel::Initialize();
ItemAttribute::Initialize();
ItemInfo::InitializeItems();
InitializeGraphics(); InitializeGraphics();
InitializeClasses(); InitializeClasses();
@ -3584,6 +3580,15 @@ void AiL::RenderMenu(){
} }
void AiL::InitializeGraphics(){ void AiL::InitializeGraphics(){
circleCooldownPoints.clear();
squareCircleCooldownPoints.clear();
GFX.Reset();
Menu::themes.Reset();
//These two create item graphics, so they should be after the GFX structure gets reset!
ItemAttribute::Initialize();
ItemInfo::InitializeItems();
circleCooldownPoints.push_back({0,0}); circleCooldownPoints.push_back({0,0});
squareCircleCooldownPoints.push_back({0,0}); squareCircleCooldownPoints.push_back({0,0});
for(int i=0;i<=360;i+=4){ for(int i=0;i<=360;i+=4){
@ -4394,12 +4399,4 @@ void AiL::UsingSteamAPI(const bool usingSteam){
void AiL::InitializePlayer(){ void AiL::InitializePlayer(){
player=std::make_unique<Warrior>(); player=std::make_unique<Warrior>();
}
void AiL::EnableTestingMode(){
testingMode=true;
}
const bool AiL::TestingModeEnabled()const{
return testingMode;
} }

@ -217,7 +217,6 @@ private:
std::optional<vf2d>bossIndicatorPos{}; std::optional<vf2d>bossIndicatorPos{};
bool steamAPIEnabled{true}; bool steamAPIEnabled{true};
Overlay hudOverlay{"pixel.png",BLANK}; Overlay hudOverlay{"pixel.png",BLANK};
bool testingMode{false};
public: public:
AiL(); AiL();
bool OnUserCreate() override; bool OnUserCreate() override;
@ -367,8 +366,6 @@ public:
const HurtList HurtMonsterType(vf2d pos,float radius,int damage,bool upperLevel,float z,const std::string_view monsterName)const; const HurtList HurtMonsterType(vf2d pos,float radius,int damage,bool upperLevel,float z,const std::string_view monsterName)const;
void InitializeGameConfigurations(); void InitializeGameConfigurations();
void InitializePlayer(); void InitializePlayer();
void EnableTestingMode();
const bool TestingModeEnabled()const;
struct TileGroupData{ struct TileGroupData{
vi2d tilePos; vi2d tilePos;

@ -46,6 +46,8 @@ INCLUDE_DATA
INCLUDE_GFX INCLUDE_GFX
void sig::Animation::InitializeAnimations(){ void sig::Animation::InitializeAnimations(){
ANIMATION_DATA.Reset();
auto CreateStillAnimation=[&](std::string imgName,vf2d size,AnimationData data={}){ auto CreateStillAnimation=[&](std::string imgName,vf2d size,AnimationData data={}){
Animate2D::FrameSequence anim(data.frameDuration,data.style); Animate2D::FrameSequence anim(data.frameDuration,data.style);
anim.AddFrame({&GFX[imgName],{{0,0},size}}); anim.AddFrame({&GFX[imgName],{{0,0},size}});

@ -52,7 +52,7 @@ Bullet::Bullet(vf2d pos,vf2d vel,float radius,int damage,bool upperLevel,bool fr
Bullet::Bullet(vf2d pos,vf2d vel,float radius,int damage,std::string animation,bool upperLevel,bool hitsMultiple,float lifetime,bool rotatesWithAngle,bool friendly,Pixel col,vf2d scale,float image_angle) Bullet::Bullet(vf2d pos,vf2d vel,float radius,int damage,std::string animation,bool upperLevel,bool hitsMultiple,float lifetime,bool rotatesWithAngle,bool friendly,Pixel col,vf2d scale,float image_angle)
:pos(pos),vel(vel),radius(radius),damage(damage),col(col),animated(true),rotates(rotatesWithAngle),lifetime(lifetime),hitsMultiple(hitsMultiple),friendly(friendly),upperLevel(upperLevel),scale(scale),image_angle(image_angle){ :pos(pos),vel(vel),radius(radius),damage(damage),col(col),animated(true),rotates(rotatesWithAngle),lifetime(lifetime),hitsMultiple(hitsMultiple),friendly(friendly),upperLevel(upperLevel),scale(scale),image_angle(image_angle){
this->animation.AddState(animation,ANIMATION_DATA[animation]); this->animation.AddState(animation,ANIMATION_DATA.at(animation));
this->animation.ChangeState(internal_animState,animation); this->animation.ChangeState(internal_animState,animation);
}; };

@ -146,6 +146,7 @@ void Menu::InitializeCharacterMenuWindow(){
characterMenuWindow->ADD("Character Label",MenuLabel)(geom2d::rect<float>{{0,-4},{float(windowSize.x)-1,24}},"Character",2,ComponentAttr::SHADOW|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END; characterMenuWindow->ADD("Character Label",MenuLabel)(geom2d::rect<float>{{0,-4},{float(windowSize.x)-1,24}},"Character",2,ComponentAttr::SHADOW|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END;
characterMenuWindow->ADD("Equip Slot Outline",MenuComponent)(geom2d::rect<float>{{0,28},{120,windowSize.y-37}},"",DO_NOTHING,ButtonAttr::UNSELECTABLE)END; characterMenuWindow->ADD("Equip Slot Outline",MenuComponent)(geom2d::rect<float>{{0,28},{120,windowSize.y-37}},"",DO_NOTHING,ButtonAttr::UNSELECTABLE)END;
//Don't load this graphical element if testing mode is enabled.
characterMenuWindow->ADD("Character Rotating Display",CharacterRotatingDisplay)(geom2d::rect<float>{{118,18},{130,windowSize.y-28}},GFX[classutils::GetClassInfo(game->GetPlayer()->GetClassName()).classFullImgName].Decal())END; characterMenuWindow->ADD("Character Rotating Display",CharacterRotatingDisplay)(geom2d::rect<float>{{118,18},{130,windowSize.y-28}},GFX[classutils::GetClassInfo(game->GetPlayer()->GetClassName()).classFullImgName].Decal())END;
characterMenuWindow->ADD("Level Class Display",MenuLabel)(geom2d::rect<float>{vf2d{126.f,windowSize.y-28},{118.f,8.f}},std::format("Lv{} {}",game->GetPlayer()->Level(),game->GetPlayer()->GetClassName()),1.f,ComponentAttr::SHADOW|ComponentAttr::LEFT_ALIGN)END; characterMenuWindow->ADD("Level Class Display",MenuLabel)(geom2d::rect<float>{vf2d{126.f,windowSize.y-28},{118.f,8.f}},std::format("Lv{} {}",game->GetPlayer()->Level(),game->GetPlayer()->GetClassName()),1.f,ComponentAttr::SHADOW|ComponentAttr::LEFT_ALIGN)END;

@ -45,13 +45,11 @@ INCLUDE_game
Effect::Effect(vf2d pos,float lifetime,std::string imgFile,bool upperLevel,float size,float fadeout,vf2d spd,Pixel col,float rotation,float rotationSpd,bool additiveBlending) Effect::Effect(vf2d pos,float lifetime,std::string imgFile,bool upperLevel,float size,float fadeout,vf2d spd,Pixel col,float rotation,float rotationSpd,bool additiveBlending)
:Effect::Effect(pos,lifetime,imgFile,upperLevel,vf2d{size,size},fadeout,spd,col,rotation,rotationSpd,additiveBlending){ :Effect::Effect(pos,lifetime,imgFile,upperLevel,vf2d{size,size},fadeout,spd,col,rotation,rotationSpd,additiveBlending){
if(game->TestingModeEnabled())return;
this->animation.AddState(imgFile,ANIMATION_DATA[imgFile]); this->animation.AddState(imgFile,ANIMATION_DATA[imgFile]);
} }
Effect::Effect(vf2d pos,float lifetime,std::string imgFile,bool upperLevel,vf2d size,float fadeout,vf2d spd,Pixel col,float rotation,float rotationSpd,bool additiveBlending) Effect::Effect(vf2d pos,float lifetime,std::string imgFile,bool upperLevel,vf2d size,float fadeout,vf2d spd,Pixel col,float rotation,float rotationSpd,bool additiveBlending)
:pos(pos),lifetime(lifetime),upperLevel(upperLevel),size(size),fadeout(fadeout),original_fadeoutTime(fadeout),spd(spd),col(col),rotation(rotation),rotationSpd(rotationSpd),additiveBlending(additiveBlending){ :pos(pos),lifetime(lifetime),upperLevel(upperLevel),size(size),fadeout(fadeout),original_fadeoutTime(fadeout),spd(spd),col(col),rotation(rotation),rotationSpd(rotationSpd),additiveBlending(additiveBlending){
if(game->TestingModeEnabled())return;
this->animation.AddState(imgFile,ANIMATION_DATA[imgFile]); this->animation.AddState(imgFile,ANIMATION_DATA[imgFile]);
} }

@ -52,7 +52,7 @@ enum class IconButtonAttr{
class MenuIconButton:public MenuComponent{ class MenuIconButton:public MenuComponent{
protected: protected:
Decal*icon; Decal*icon{nullptr};
vf2d iconScale{1,1}; vf2d iconScale{1,1};
Pixel tint=WHITE; Pixel tint=WHITE;
public: public:

@ -932,7 +932,7 @@ geom2d::circle<float>Monster::BulletCollisionHitbox(){
} }
void Monster::Knockback(const vf2d&vel){ void Monster::Knockback(const vf2d&vel){
if(IsSolid())return; if(IsSolid()||GetZ()>=1.f)return;
//A new angle will be applied, but will be constrained by whichever applied velocity is strongest (either the current velocity, or the new one). This prevents continuous uncapped velocities to knockbacks applied. //A new angle will be applied, but will be constrained by whichever applied velocity is strongest (either the current velocity, or the new one). This prevents continuous uncapped velocities to knockbacks applied.
if(vel==vf2d{})return; if(vel==vf2d{})return;
float maxVelThreshold; float maxVelThreshold;

@ -307,7 +307,7 @@ State::State Player::GetState(){
void Player::Knockback(vf2d vel){ void Player::Knockback(vf2d vel){
//A new angle will be applied, but will be constrained by whichever applied velocity is strongest (either the current velocity, or the new one). This prevents continuous uncapped velocities to knockbacks applied. //A new angle will be applied, but will be constrained by whichever applied velocity is strongest (either the current velocity, or the new one). This prevents continuous uncapped velocities to knockbacks applied.
if(vel==vf2d{})return; if(vel==vf2d{}||GetZ()>=1.f)return;
float maxVelThreshold; float maxVelThreshold;
if(GetState()==State::BLOCK)vel*=1-("Warrior.Right Click Ability.Knockback Reduction"_I/100.f); if(GetState()==State::BLOCK)vel*=1-("Warrior.Right Click Ability.Knockback Reduction"_I/100.f);
if(this->vel==vf2d{})maxVelThreshold=vel.mag(); if(this->vel==vf2d{})maxVelThreshold=vel.mag();
@ -811,7 +811,6 @@ void Player::AddAnimation(std::string state){
} }
void Player::UpdateAnimation(std::string animState,int specificClass, const float frameMult){ void Player::UpdateAnimation(std::string animState,int specificClass, const float frameMult){
if(game->TestingModeEnabled())return;
if(specificClass==ANY||specificClass&GetClass()){ if(specificClass==ANY||specificClass&GetClass()){
animation.ChangeState(internal_animState,animState,frameMult); animation.ChangeState(internal_animState,animState,frameMult);
} }

@ -39,7 +39,7 @@ All rights reserved.
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 2 #define VERSION_MINOR 2
#define VERSION_PATCH 3 #define VERSION_PATCH 3
#define VERSION_BUILD 9814 #define VERSION_BUILD 9835
#define stringify(a) stringify_(a) #define stringify(a) stringify_(a)
#define stringify_(a) #a #define stringify_(a) #a

@ -1043,6 +1043,7 @@ namespace olc
// Gets "screen" size // Gets "screen" size
const olc::vi2d& GetScreenSize() const; const olc::vi2d& GetScreenSize() const;
const bool IsFullscreen()const; const bool IsFullscreen()const;
const bool TestingModeEnabled()const;
// Gets any files dropped this frame // Gets any files dropped this frame
const std::vector<std::string>& GetDroppedFiles() const; const std::vector<std::string>& GetDroppedFiles() const;
const olc::vi2d& GetDroppedFilesPoint() const; const olc::vi2d& GetDroppedFilesPoint() const;
@ -1359,6 +1360,8 @@ namespace olc
bool pMouseOldState[nMouseButtons] = { 0 }; bool pMouseOldState[nMouseButtons] = { 0 };
HWButton pMouseState[nMouseButtons] = { 0 }; HWButton pMouseState[nMouseButtons] = { 0 };
bool testingMode{false};
// The main engine thread // The main engine thread
void EngineThread(); void EngineThread();
@ -1387,6 +1390,8 @@ namespace olc
void olc_Reanimate(); void olc_Reanimate();
bool olc_IsRunning(); bool olc_IsRunning();
void olc_SetTestingMode(const bool testingMode);
// At the very end of this file, chooses which // At the very end of this file, chooses which
// components to compile // components to compile
virtual void olc_ConfigureSystem(); virtual void olc_ConfigureSystem();
@ -1708,7 +1713,7 @@ namespace olc
Decal::Decal(olc::Sprite* spr, bool filter, bool clamp) Decal::Decal(olc::Sprite* spr, bool filter, bool clamp)
{ {
id = -1; id = -1;
if (spr == nullptr) return; if (renderer->ptrPGE->TestingModeEnabled()||spr == nullptr) return;
sprite = spr; sprite = spr;
id = renderer->CreateTexture(sprite->width, sprite->height, filter, clamp); id = renderer->CreateTexture(sprite->width, sprite->height, filter, clamp);
Update(); Update();
@ -1716,13 +1721,13 @@ namespace olc
Decal::Decal(const uint32_t nExistingTextureResource, olc::Sprite* spr) Decal::Decal(const uint32_t nExistingTextureResource, olc::Sprite* spr)
{ {
if (spr == nullptr) return; if (renderer->ptrPGE->TestingModeEnabled()||spr == nullptr) return;
id = nExistingTextureResource; id = nExistingTextureResource;
} }
void Decal::Update() void Decal::Update()
{ {
if (sprite == nullptr) return; if (renderer->ptrPGE->TestingModeEnabled()||sprite == nullptr) return;
vUVScale = { 1.0f / float(sprite->width), 1.0f / float(sprite->height) }; vUVScale = { 1.0f / float(sprite->width), 1.0f / float(sprite->height) };
renderer->ApplyTexture(id); renderer->ApplyTexture(id);
renderer->UpdateTexture(id, sprite); renderer->UpdateTexture(id, sprite);
@ -1730,7 +1735,7 @@ namespace olc
void Decal::UpdateSprite() void Decal::UpdateSprite()
{ {
if (sprite == nullptr) return; if (renderer->ptrPGE->TestingModeEnabled()||sprite == nullptr) return;
renderer->ApplyTexture(id); renderer->ApplyTexture(id);
renderer->ReadTexture(id, sprite); renderer->ReadTexture(id, sprite);
} }
@ -2034,7 +2039,7 @@ namespace olc
else else
{ {
nTargetLayer = 0; nTargetLayer = 0;
pDrawTarget = vLayers[0].pDrawTarget.Sprite(); if(!TestingModeEnabled())pDrawTarget = vLayers[0].pDrawTarget.Sprite();
} }
} }
@ -2202,6 +2207,10 @@ namespace olc
const bool PixelGameEngine::IsFullscreen()const{ const bool PixelGameEngine::IsFullscreen()const{
return bFullScreen; return bFullScreen;
} }
const bool PixelGameEngine::TestingModeEnabled()const{
return testingMode;
}
const olc::vi2d& PixelGameEngine::GetWindowMouse() const const olc::vi2d& PixelGameEngine::GetWindowMouse() const
{ return vMouseWindowPos; } { return vMouseWindowPos; }
@ -3950,6 +3959,7 @@ namespace olc
olc::vi2d PixelGameEngine::GetTextSizeProp(std::string_view s) olc::vi2d PixelGameEngine::GetTextSizeProp(std::string_view s)
{ {
if(vFontSpacing.size()==0)return{}; //Hack to allow for testing mode to just return a default value.
olc::vi2d size = { 0,1 }; olc::vi2d size = { 0,1 };
olc::vi2d pos = { 0,1 }; olc::vi2d pos = { 0,1 };
for (int skip=0;auto c : s) for (int skip=0;auto c : s)
@ -4565,6 +4575,10 @@ namespace olc
bool PixelGameEngine::olc_IsRunning() bool PixelGameEngine::olc_IsRunning()
{ return bAtomActive; } { return bAtomActive; }
void PixelGameEngine::olc_SetTestingMode(const bool testingMode){
this->testingMode=testingMode;
}
void PixelGameEngine::olc_Terminate() void PixelGameEngine::olc_Terminate()
{ bAtomActive = false; } { bAtomActive = false; }

Loading…
Cancel
Save