Fix missing strategy draw call for monsters. Add in death state and basic transition effects. Release Build 7662.
This commit is contained in:
parent
08aa7a309d
commit
03e6d3bd80
@ -480,6 +480,10 @@
|
||||
<ClInclude Include="SoundEffect.h" />
|
||||
<ClInclude Include="SpawnEncounterLabel.h" />
|
||||
<ClInclude Include="State.h" />
|
||||
<ClInclude Include="State_Death.h">
|
||||
<SubType>
|
||||
</SubType>
|
||||
</ClInclude>
|
||||
<ClInclude Include="State_GameHub.h">
|
||||
<SubType>
|
||||
</SubType>
|
||||
@ -720,6 +724,10 @@
|
||||
<SubType>
|
||||
</SubType>
|
||||
</ClCompile>
|
||||
<ClCompile Include="State_Death.cpp">
|
||||
<SubType>
|
||||
</SubType>
|
||||
</ClCompile>
|
||||
<ClCompile Include="State_GameHub.cpp">
|
||||
<SubType>
|
||||
</SubType>
|
||||
|
@ -468,6 +468,9 @@
|
||||
<ClInclude Include="LoadingScreen.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="State_Death.h">
|
||||
<Filter>Header Files\State</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Player.cpp">
|
||||
@ -821,6 +824,9 @@
|
||||
<ClCompile Include="packkey.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="State_Death.cpp">
|
||||
<Filter>Source Files\Game States</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="cpp.hint" />
|
||||
|
@ -1172,8 +1172,8 @@ void AiL::RenderWorld(float fElapsedTime){
|
||||
for(auto it=monstersBeforeLower.begin();it!=monstersBeforeLower.end();++it){
|
||||
Monster&m=**it;
|
||||
if(m.pos.y<tile->group->GetCollisionRange().middle().y){
|
||||
m.Draw();
|
||||
m.strategyDraw(this,m,MONSTER_DATA[m.GetName()].GetAIStrategy());
|
||||
m.Draw();
|
||||
it=monstersBeforeLower.erase(it);
|
||||
if(it==monstersBeforeLower.end())break;
|
||||
if(it!=monstersBeforeLower.begin())--it;
|
||||
@ -1225,8 +1225,8 @@ void AiL::RenderWorld(float fElapsedTime){
|
||||
for(auto it=monstersAfterLower.begin();it!=monstersAfterLower.end();++it){
|
||||
Monster&m=**it;
|
||||
if(m.pos.y<tile->group->GetCollisionRange().middle().y){
|
||||
m.Draw();
|
||||
m.strategyDraw(this,m,MONSTER_DATA[m.GetName()].GetAIStrategy());
|
||||
m.Draw();
|
||||
it=monstersAfterLower.erase(it);
|
||||
if(it==monstersAfterLower.end())break;
|
||||
if(it!=monstersAfterLower.begin())--it;
|
||||
@ -1277,7 +1277,8 @@ void AiL::RenderWorld(float fElapsedTime){
|
||||
}
|
||||
#pragma endregion
|
||||
#pragma region Remaining Rendering
|
||||
for(const Monster*const m:monstersBeforeLower){
|
||||
for(Monster*m:monstersBeforeLower){
|
||||
m->strategyDraw(this,*m,MONSTER_DATA[m->GetName()].GetAIStrategy());
|
||||
m->Draw();
|
||||
}
|
||||
for(const Bullet*const b:bulletsLower){
|
||||
@ -1297,7 +1298,8 @@ void AiL::RenderWorld(float fElapsedTime){
|
||||
}
|
||||
RenderPlayer(player->GetPos(),{1,1});
|
||||
}
|
||||
for(const Monster*const m:monstersAfterLower){
|
||||
for(Monster* m:monstersAfterLower){
|
||||
m->strategyDraw(this,*m,MONSTER_DATA[m->GetName()].GetAIStrategy());
|
||||
m->Draw();
|
||||
}
|
||||
for(const int dropInd:dropsAfterLower){
|
||||
@ -1419,8 +1421,8 @@ void AiL::RenderWorld(float fElapsedTime){
|
||||
for(auto it=monstersBeforeUpper.begin();it!=monstersBeforeUpper.end();++it){
|
||||
Monster&m=**it;
|
||||
if(m.pos.y<tile->group->GetCollisionRange().middle().y){
|
||||
m.Draw();
|
||||
m.strategyDraw(this,m,MONSTER_DATA[m.GetName()].GetAIStrategy());
|
||||
m.Draw();
|
||||
it=monstersBeforeUpper.erase(it);
|
||||
if(it==monstersBeforeUpper.end())break;
|
||||
if(it!=monstersBeforeUpper.begin())--it;
|
||||
@ -1472,8 +1474,8 @@ void AiL::RenderWorld(float fElapsedTime){
|
||||
for(auto it=monstersAfterUpper.begin();it!=monstersAfterUpper.end();++it){
|
||||
Monster&m=**it;
|
||||
if(m.pos.y<tile->group->GetCollisionRange().middle().y){
|
||||
m.Draw();
|
||||
m.strategyDraw(this,m,MONSTER_DATA[m.GetName()].GetAIStrategy());
|
||||
m.Draw();
|
||||
it=monstersAfterUpper.erase(it);
|
||||
if(it==monstersAfterUpper.end())break;
|
||||
if(it!=monstersAfterUpper.begin())--it;
|
||||
@ -1516,7 +1518,8 @@ void AiL::RenderWorld(float fElapsedTime){
|
||||
}
|
||||
#pragma endregion
|
||||
#pragma region Remaining Upper Rendering
|
||||
for(const Monster*const m:monstersBeforeUpper){
|
||||
for(Monster*m:monstersBeforeUpper){
|
||||
m->strategyDraw(this,*m,MONSTER_DATA[m->GetName()].GetAIStrategy());
|
||||
m->Draw();
|
||||
}
|
||||
for(const Bullet*const b:bulletsUpper){
|
||||
@ -1536,7 +1539,8 @@ void AiL::RenderWorld(float fElapsedTime){
|
||||
}
|
||||
RenderPlayer(player->GetPos(),{1,1});
|
||||
}
|
||||
for(const Monster*const m:monstersAfterUpper){
|
||||
for(Monster*m:monstersAfterUpper){
|
||||
m->strategyDraw(this,*m,MONSTER_DATA[m->GetName()].GetAIStrategy());
|
||||
m->Draw();
|
||||
}
|
||||
for(const int dropInd:dropsAfterUpper){
|
||||
@ -2028,6 +2032,7 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){
|
||||
GetPlayer()->ResetAccumulatedXP();
|
||||
GetPlayer()->SetIframes(0.f);
|
||||
GetPlayer()->SetInvisible(false);
|
||||
GetPlayer()->ResetVelocity();
|
||||
|
||||
ZONE_LIST=game->MAP_DATA[game->GetCurrentLevel()].ZoneData;
|
||||
return true;
|
||||
|
@ -364,6 +364,13 @@ void Audio::SetBGMVolume(float vol){
|
||||
channelListIndex++;
|
||||
}
|
||||
}
|
||||
void Audio::SetBGMPitch(float pitch){
|
||||
BGM&track=Self().bgm[Self().playParams.sound];
|
||||
for(int channelListIndex=0;int trackID:track.GetChannelIDs()){
|
||||
Engine().SetPitch(trackID,pitch);
|
||||
channelListIndex++;
|
||||
}
|
||||
}
|
||||
void Audio::SetSFXVolume(float vol){
|
||||
sfxVol=vol;
|
||||
}
|
||||
|
@ -70,6 +70,7 @@ public:
|
||||
static void SetAudioEvent(const Event&eventName);
|
||||
static const bool BGMIsPlaying();
|
||||
static const bool BGMFullyLoaded(); //Fully loaded means when the audio buffer has finished filling up, which means sound is now playing.
|
||||
static void SetBGMPitch(float pitch);
|
||||
static void SetBGMVolume(float vol);
|
||||
static void SetSFXVolume(float vol);
|
||||
static float&GetBGMVolume();
|
||||
|
@ -42,6 +42,7 @@ All rights reserved.
|
||||
#include "State_LevelComplete.h"
|
||||
#include "State_Story.h"
|
||||
#include "State_GameHub.h"
|
||||
#include "State_Death.h";
|
||||
|
||||
INCLUDE_game
|
||||
|
||||
@ -54,6 +55,7 @@ void GameState::Initialize(){
|
||||
NEW_STATE(States::LEVEL_COMPLETE,State_LevelComplete);
|
||||
NEW_STATE(States::STORY,State_Story);
|
||||
NEW_STATE(States::GAME_HUB,State_GameHub);
|
||||
NEW_STATE(States::DEATH,State_Death);
|
||||
|
||||
GameState::ChangeState(States::MAIN_MENU);
|
||||
}
|
||||
|
@ -52,6 +52,7 @@ namespace States{
|
||||
LEVEL_COMPLETE,
|
||||
STORY,
|
||||
KEYBIND,
|
||||
DEATH,
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -717,6 +717,8 @@ bool Player::Hurt(int damage,bool onUpperLevel,float z){
|
||||
}
|
||||
if(Menu::IsMenuOpen()&&mod_dmg>0)Menu::CloseAllMenus();
|
||||
hp=std::max(0,hp-int(mod_dmg));
|
||||
|
||||
if(hp==0&&GameState::STATE!=GameState::states[States::DEATH])GameState::ChangeState(States::DEATH);
|
||||
|
||||
hurtRumbleTime="Player.Hurt Rumble Time"_F;
|
||||
Input::StartVibration();
|
||||
@ -1358,4 +1360,8 @@ void Player::SetInvisible(const bool invisibleState){
|
||||
|
||||
const bool Player::IsInvisible()const{
|
||||
return invisibility;
|
||||
}
|
||||
|
||||
void Player::ResetVelocity(){
|
||||
vel={};
|
||||
}
|
@ -247,6 +247,7 @@ public:
|
||||
void SetLevel(uint8_t newLevel);
|
||||
void SetInvisible(const bool invisibleState);
|
||||
const bool IsInvisible()const;
|
||||
void ResetVelocity();
|
||||
private:
|
||||
int hp="Warrior.BaseHealth"_I;
|
||||
int mana="Player.BaseMana"_I;
|
||||
|
@ -56,5 +56,6 @@ namespace State{
|
||||
JUMP,
|
||||
RECOVERY,
|
||||
FORCE_WALK,
|
||||
DEATH,
|
||||
};
|
||||
}
|
96
Adventures in Lestoria/State_Death.cpp
Normal file
96
Adventures in Lestoria/State_Death.cpp
Normal file
@ -0,0 +1,96 @@
|
||||
#pragma region License
|
||||
/*
|
||||
License (OLC-3)
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions or derivations of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions or derivative works in binary form must reproduce the above
|
||||
copyright notice. This list of conditions and the following disclaimer must be
|
||||
reproduced in the documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software without specific
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
||||
|
||||
Portions of this software are copyright © 2024 The FreeType
|
||||
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
|
||||
All rights reserved.
|
||||
*/
|
||||
#pragma endregion
|
||||
#include "State_Death.h"
|
||||
#include "AdventuresInLestoria.h"
|
||||
#include "DEFINES.h"
|
||||
#include "Menu.h"
|
||||
#include "ItemDrop.h"
|
||||
#include "VisualNovel.h"
|
||||
#include "State_OverworldMap.h"
|
||||
#include "GameEvent.h"
|
||||
#include "MenuComponent.h"
|
||||
#include "Unlock.h"
|
||||
|
||||
INCLUDE_MONSTER_LIST
|
||||
INCLUDE_game
|
||||
|
||||
void State_Death::OnStateChange(GameState*prevState){
|
||||
if(Menu::IsMenuOpen()){
|
||||
Menu::CloseAllMenus();
|
||||
}
|
||||
game->GetPlayer()->SetState(State::DEATH);
|
||||
}
|
||||
void State_Death::OnLevelLoad(){
|
||||
Component<MenuComponent>(MenuType::PAUSE,"Return to Camp Button")->SetGrayedOut(
|
||||
!Unlock::IsUnlocked("HUB")||game->GetCurrentMapName()=="HUB"
|
||||
);
|
||||
}
|
||||
void State_Death::OnUserUpdate(AiL*game){
|
||||
accTime+=game->GetElapsedTime();
|
||||
if(gameSlowdownPct<10.f){
|
||||
gameSlowdownPct+=3.f*game->GetElapsedTime();
|
||||
}else{
|
||||
game->SetMosaicEffect(1U);
|
||||
}
|
||||
game->view.SetZoom(util::lerp(1.f,2.f,(gameSlowdownPct-1)/10.f),game->view.WorldToScreen(game->GetPlayer()->GetPos()));
|
||||
game->SetWorldColor({uint8_t(util::lerp(255,0,(gameSlowdownPct-1)/10.f)),uint8_t(util::lerp(255,0,(gameSlowdownPct-1)/10.f)),uint8_t(util::lerp(255,0,(gameSlowdownPct-1)/10.f)),255});
|
||||
Audio::SetBGMPitch(util::lerp(1.f,0,(gameSlowdownPct-1)/10.f));
|
||||
if(gameSlowdownPct<5.f){
|
||||
game->SetMosaicEffect(uint8_t(util::lerp(1.f,4.f,(gameSlowdownPct-1)/5.f)));
|
||||
}else{
|
||||
game->SetMosaicEffect(uint8_t(util::lerp(4.f,1.f,(gameSlowdownPct-5)/5.f)));
|
||||
}
|
||||
|
||||
if(gameSlowdownPct<10.f){
|
||||
if(accTime>=1/60.f*gameSlowdownPct){
|
||||
game->SetElapsedTime(1/60.f*gameSlowdownPct);
|
||||
game->HandleUserInput(game->GetElapsedTime());
|
||||
|
||||
game->UpdateEffects(game->GetElapsedTime());
|
||||
GameEvent::UpdateEvents();
|
||||
game->GetPlayer()->Update(game->GetElapsedTime());
|
||||
game->UpdateMonsters();
|
||||
|
||||
ItemDrop::UpdateDrops(game->GetElapsedTime());
|
||||
game->UpdateBullets(game->GetElapsedTime());
|
||||
//game->UpdateCamera(game->GetElapsedTime());
|
||||
accTime=0.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
void State_Death::Draw(AiL*game){}
|
51
Adventures in Lestoria/State_Death.h
Normal file
51
Adventures in Lestoria/State_Death.h
Normal file
@ -0,0 +1,51 @@
|
||||
#pragma region License
|
||||
/*
|
||||
License (OLC-3)
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions or derivations of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions or derivative works in binary form must reproduce the above
|
||||
copyright notice. This list of conditions and the following disclaimer must be
|
||||
reproduced in the documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software without specific
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
||||
|
||||
Portions of this software are copyright © 2024 The FreeType
|
||||
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
|
||||
All rights reserved.
|
||||
*/
|
||||
#pragma endregion
|
||||
#pragma once
|
||||
#include "GameState.h"
|
||||
#include "olcPGEX_ViewPort.h"
|
||||
|
||||
class State_Death:public GameState{
|
||||
protected:
|
||||
float gameSlowdownPct=1.f;
|
||||
float accTime=0.f;
|
||||
float zoom=1.f;
|
||||
virtual void OnStateChange(GameState*prevState)override;
|
||||
virtual void OnUserUpdate(AiL*game)override;
|
||||
virtual void Draw(AiL*game)override;
|
||||
virtual void OnLevelLoad()override;
|
||||
};
|
@ -39,7 +39,7 @@ All rights reserved.
|
||||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 3
|
||||
#define VERSION_PATCH 0
|
||||
#define VERSION_BUILD 7646
|
||||
#define VERSION_BUILD 7662
|
||||
|
||||
#define stringify(a) stringify_(a)
|
||||
#define stringify_(a) #a
|
||||
|
@ -1061,6 +1061,7 @@ namespace olc
|
||||
uint32_t GetFPS() const;
|
||||
// Gets last update of elapsed time
|
||||
float GetElapsedTime() const;
|
||||
void SetElapsedTime(float elapsedTime);
|
||||
// Returns whether the mouse cursor exists inside the window or outside of it.
|
||||
const bool IsMouseInsideWindow() const;
|
||||
// Gets Actual Window pos
|
||||
@ -2269,6 +2270,9 @@ namespace olc
|
||||
float PixelGameEngine::GetElapsedTime() const
|
||||
{ return fLastElapsed; }
|
||||
|
||||
void PixelGameEngine::SetElapsedTime(float elapsedTime)
|
||||
{ fLastElapsed=elapsedTime; }
|
||||
|
||||
const bool PixelGameEngine::IsMouseInsideWindow() const
|
||||
{ return GetMouseX()>=0&&GetMouseY()>=0&&GetMouseX()<GetScreenSize().x&&GetMouseY()<GetScreenSize().y; }
|
||||
|
||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user