Add in visual novel audio pitch and BGM change commands. Add in XP bonus when completing stages. Release Build 7706.
This commit is contained in:
parent
fa8dfd3c6f
commit
0c619aa4f6
@ -2019,6 +2019,7 @@ void AiL::_PrepareLevel(MapName map,MusicChange changeMusic){
|
|||||||
ItemDrop::drops.clear();
|
ItemDrop::drops.clear();
|
||||||
GameEvent::events.clear();
|
GameEvent::events.clear();
|
||||||
Audio::SetBGMPitch(1.f);
|
Audio::SetBGMPitch(1.f);
|
||||||
|
Audio::SetAudioEvent("Default Volume");
|
||||||
game->view.SetZoom(1.f,game->view.WorldToScreen(game->camera.GetViewPosition()));
|
game->view.SetZoom(1.f,game->view.WorldToScreen(game->camera.GetViewPosition()));
|
||||||
SetMosaicEffect(1U);
|
SetMosaicEffect(1U);
|
||||||
worldColor=WHITE;
|
worldColor=WHITE;
|
||||||
|
@ -78,7 +78,7 @@ void Menu::InitializeLevelCompleteWindow(){
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
levelCompleteWindow->ADD("Level Details Outline",MenuComponent)(geom2d::rect<float>{{windowSize.size.x-72.f,32},{71,72}},"",DO_NOTHING,ButtonAttr::UNSELECTABLE)END;
|
levelCompleteWindow->ADD("Level Details Outline",MenuComponent)(geom2d::rect<float>{{windowSize.size.x-72.f,32},{71,72}},"",DO_NOTHING,ButtonAttr::UNSELECTABLE|ButtonAttr::FIT_TO_LABEL)END;
|
||||||
levelCompleteWindow->ADD("Level EXP Gain Outline",MenuLabel)(geom2d::rect<float>{{windowSize.size.x-72.f,104},{71,36}},"+ Exp",1,ComponentAttr::SHADOW|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END;
|
levelCompleteWindow->ADD("Level EXP Gain Outline",MenuLabel)(geom2d::rect<float>{{windowSize.size.x-72.f,104},{71,36}},"+ Exp",1,ComponentAttr::SHADOW|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END;
|
||||||
levelCompleteWindow->ADD("Next Button",MenuComponent)(geom2d::rect<float>{{windowSize.size.x-72.f,144},{71,32}},"Proceed\nto Camp",nextButtonAction,ButtonAttr::FIT_TO_LABEL)END;
|
levelCompleteWindow->ADD("Next Button",MenuComponent)(geom2d::rect<float>{{windowSize.size.x-72.f,144},{71,32}},"Proceed\nto Camp",nextButtonAction,ButtonAttr::FIT_TO_LABEL)END;
|
||||||
|
|
||||||
|
@ -69,6 +69,7 @@ void Menu::InitializePauseWindow(){
|
|||||||
},ButtonAttr::FIT_TO_LABEL)END;
|
},ButtonAttr::FIT_TO_LABEL)END;
|
||||||
pauseWindow->ADD("Return to Camp Button",MenuComponent)(geom2d::rect<float>{{6.f,112.f},{84.f,24.f}},"Return to Camp",[](MenuFuncData data){
|
pauseWindow->ADD("Return to Camp Button",MenuComponent)(geom2d::rect<float>{{6.f,112.f},{84.f,24.f}},"Return to Camp",[](MenuFuncData data){
|
||||||
Component<MenuLabel>(LEVEL_COMPLETE,"Stage Complete Label")->SetLabel("Stage Summary");
|
Component<MenuLabel>(LEVEL_COMPLETE,"Stage Complete Label")->SetLabel("Stage Summary");
|
||||||
|
Component<MenuComponent>(LEVEL_COMPLETE,"Level Details Outline")->SetLabel("");
|
||||||
GameState::ChangeState(States::LEVEL_COMPLETE,0.4f);
|
GameState::ChangeState(States::LEVEL_COMPLETE,0.4f);
|
||||||
return true;
|
return true;
|
||||||
},ButtonAttr::FIT_TO_LABEL)END;
|
},ButtonAttr::FIT_TO_LABEL)END;
|
||||||
|
@ -983,6 +983,7 @@ void Player::CheckEndZoneCollision(){
|
|||||||
endZoneStandTime+=game->GetElapsedTime();
|
endZoneStandTime+=game->GetElapsedTime();
|
||||||
if(endZoneStandTime>="Player.End Zone Wait Time"_F){
|
if(endZoneStandTime>="Player.End Zone Wait Time"_F){
|
||||||
Component<MenuLabel>(LEVEL_COMPLETE,"Stage Complete Label")->SetLabel("Stage Completed");
|
Component<MenuLabel>(LEVEL_COMPLETE,"Stage Complete Label")->SetLabel("Stage Completed");
|
||||||
|
Component<MenuComponent>(LEVEL_COMPLETE,"Level Details Outline")->SetLabel("Complete Bonus\n +10% XP");
|
||||||
if(Unlock::IsUnlocked("HUB")){
|
if(Unlock::IsUnlocked("HUB")){
|
||||||
Component<MenuComponent>(LEVEL_COMPLETE,"Next Button")->SetLabel("Proceed\nto Camp");
|
Component<MenuComponent>(LEVEL_COMPLETE,"Next Button")->SetLabel("Proceed\nto Camp");
|
||||||
}else{
|
}else{
|
||||||
|
@ -57,11 +57,10 @@ void State_LevelComplete::OnStateChange(GameState*prevState){
|
|||||||
Menu::CloseAllMenus();
|
Menu::CloseAllMenus();
|
||||||
}
|
}
|
||||||
levelUpTextPos={-100.f,-100.f};
|
levelUpTextPos={-100.f,-100.f};
|
||||||
Component<MenuLabel>(MenuType::LEVEL_COMPLETE,"Level EXP Gain Outline")->SetLabel(std::format("+{} Exp",game->GetPlayer()->GetAccumulatedXP()));
|
|
||||||
Component<ProgressBar>(MenuType::LEVEL_COMPLETE,"XP Bar")->ResetProgressBar(game->GetPlayer()->CurrentXP(),game->GetPlayer()->NextLevelXPRequired());
|
Component<ProgressBar>(MenuType::LEVEL_COMPLETE,"XP Bar")->ResetProgressBar(game->GetPlayer()->CurrentXP(),game->GetPlayer()->NextLevelXPRequired());
|
||||||
accumulatedXP=game->GetPlayer()->GetAccumulatedXP();
|
accumulatedXP=game->GetPlayer()->GetAccumulatedXP();
|
||||||
game->GetPlayer()->AddXP(game->GetPlayer()->GetAccumulatedXP());
|
|
||||||
|
float xpBonus=1.1f; //10% XP bonus for finishing a stage.
|
||||||
if(Component<MenuLabel>(LEVEL_COMPLETE,"Stage Complete Label")->GetLabel()!="Stage Summary"){ //If the label says stage summary, we didn't actually the level. Don't reward any stage items to the player.
|
if(Component<MenuLabel>(LEVEL_COMPLETE,"Stage Complete Label")->GetLabel()!="Stage Summary"){ //If the label says stage summary, we didn't actually the level. Don't reward any stage items to the player.
|
||||||
for(const ItemMapData&data:game->GetCurrentMap().GetStageLoot()){
|
for(const ItemMapData&data:game->GetCurrentMap().GetStageLoot()){
|
||||||
uint8_t amountDiff=data.maxAmt-data.minAmt;
|
uint8_t amountDiff=data.maxAmt-data.minAmt;
|
||||||
@ -75,7 +74,16 @@ void State_LevelComplete::OnStateChange(GameState*prevState){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
xpBonus=1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
accumulatedXP*=xpBonus;
|
||||||
|
|
||||||
|
Component<MenuLabel>(MenuType::LEVEL_COMPLETE,"Level EXP Gain Outline")->SetLabel(std::format("+{} Exp",accumulatedXP));
|
||||||
|
|
||||||
|
game->GetPlayer()->AddXP(game->GetPlayer()->GetAccumulatedXP());
|
||||||
|
|
||||||
game->GetPlayer()->SetState(State::NORMAL);
|
game->GetPlayer()->SetState(State::NORMAL);
|
||||||
Menu::OpenMenu(LEVEL_COMPLETE);
|
Menu::OpenMenu(LEVEL_COMPLETE);
|
||||||
};
|
};
|
||||||
|
@ -2,8 +2,6 @@ February 28th -> Begin Internal Game Playtesting
|
|||||||
March 6th -> Discord/Friend Playtesting
|
March 6th -> Discord/Friend Playtesting
|
||||||
March 30th -> Public Demo Release
|
March 30th -> Public Demo Release
|
||||||
|
|
||||||
Add Bonus XP when completing a stage
|
|
||||||
|
|
||||||
- Hide mouse cursor during controller play. Reveal it again during mouse play.
|
- Hide mouse cursor during controller play. Reveal it again during mouse play.
|
||||||
|
|
||||||
- Auto aim causes retreat-type moves to aim away from the auto target, and prefer the direction the player's moving in.
|
- Auto aim causes retreat-type moves to aim away from the auto target, and prefer the direction the player's moving in.
|
||||||
|
@ -39,7 +39,7 @@ All rights reserved.
|
|||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 3
|
#define VERSION_MINOR 3
|
||||||
#define VERSION_PATCH 0
|
#define VERSION_PATCH 0
|
||||||
#define VERSION_BUILD 7700
|
#define VERSION_BUILD 7706
|
||||||
|
|
||||||
#define stringify(a) stringify_(a)
|
#define stringify(a) stringify_(a)
|
||||||
#define stringify_(a) #a
|
#define stringify_(a) #a
|
||||||
|
@ -139,6 +139,14 @@ void VisualNovel::Initialize(){
|
|||||||
if(line.find("{PAUSE")!=std::string::npos){//Pause command
|
if(line.find("{PAUSE")!=std::string::npos){//Pause command
|
||||||
if(arguments.size()!=0)ERR("Arguments size is "<<arguments.size()<<". Expecting no arguments.")
|
if(arguments.size()!=0)ERR("Arguments size is "<<arguments.size()<<". Expecting no arguments.")
|
||||||
data.push_back(std::make_unique<PauseCommand>());
|
data.push_back(std::make_unique<PauseCommand>());
|
||||||
|
}else
|
||||||
|
if(line.find("{AUDIOPITCH")!=std::string::npos){//Pause command
|
||||||
|
if(arguments.size()!=1)ERR("Arguments size is "<<arguments.size()<<". Expecting only 1 argument.")
|
||||||
|
data.push_back(std::make_unique<AudioPitchCommand>(arguments[0]));
|
||||||
|
}else
|
||||||
|
if(line.find("{BGM")!=std::string::npos){//Pause command
|
||||||
|
if(arguments.size()!=1)ERR("Arguments size is "<<arguments.size()<<". Expecting only 1 argument.")
|
||||||
|
data.push_back(std::make_unique<BGMCommand>(arguments[0]));
|
||||||
}else{
|
}else{
|
||||||
ERR("Unknown command "<<line<<". Could not parse!");
|
ERR("Unknown command "<<line<<". Could not parse!");
|
||||||
}
|
}
|
||||||
@ -181,12 +189,14 @@ void VisualNovel::LoadVisualNovel(std::string storyLevelName){
|
|||||||
for(std::unique_ptr<Command>&command:storyLevelData.at(storyLevelName)){
|
for(std::unique_ptr<Command>&command:storyLevelData.at(storyLevelName)){
|
||||||
novel.commands.push_back(command.get());
|
novel.commands.push_back(command.get());
|
||||||
}
|
}
|
||||||
|
Audio::PlayBGM("story");
|
||||||
GameState::ChangeState(States::STORY,0.5f,10U);
|
GameState::ChangeState(States::STORY,0.5f,10U);
|
||||||
novel.ExecuteNextCommand();
|
novel.ExecuteNextCommand();
|
||||||
novel.prevTheme=Menu::GetCurrentTheme().GetThemeName();
|
novel.prevTheme=Menu::GetCurrentTheme().GetThemeName();
|
||||||
Menu::themeSelection="Purple";
|
Menu::themeSelection="Purple";
|
||||||
}
|
}
|
||||||
void VisualNovel::Update(){
|
void VisualNovel::Update(){
|
||||||
|
Audio::SetBGMPitch(audioPitch);
|
||||||
if(transitionTime==0&&game->KEY_CONFIRM.Pressed()){
|
if(transitionTime==0&&game->KEY_CONFIRM.Pressed()){
|
||||||
activeText=U"";
|
activeText=U"";
|
||||||
novel.ExecuteNextCommand();
|
novel.ExecuteNextCommand();
|
||||||
@ -383,4 +393,20 @@ CommandType::CommandType DialogCommand::GetType(){return CommandType::DIALOG;}
|
|||||||
|
|
||||||
void PauseCommand::Execute(VisualNovel&vn){}
|
void PauseCommand::Execute(VisualNovel&vn){}
|
||||||
PauseCommand::PauseCommand(){}
|
PauseCommand::PauseCommand(){}
|
||||||
CommandType::CommandType PauseCommand::GetType(){return CommandType::PAUSE;}
|
CommandType::CommandType PauseCommand::GetType(){return CommandType::PAUSE;}
|
||||||
|
|
||||||
|
void AudioPitchCommand::Execute(VisualNovel&vn){
|
||||||
|
vn.audioPitch=pitch;
|
||||||
|
vn.ExecuteNextCommand();
|
||||||
|
}
|
||||||
|
AudioPitchCommand::AudioPitchCommand(std::string pitch)
|
||||||
|
:pitch(std::stof(pitch)){}
|
||||||
|
CommandType::CommandType AudioPitchCommand::GetType(){return CommandType::AUDIOPITCH;}
|
||||||
|
|
||||||
|
void BGMCommand::Execute(VisualNovel&vn){
|
||||||
|
Audio::PlayBGM(songName);
|
||||||
|
vn.ExecuteNextCommand();
|
||||||
|
}
|
||||||
|
BGMCommand::BGMCommand(std::string songName)
|
||||||
|
:songName(songName){}
|
||||||
|
CommandType::CommandType BGMCommand::GetType(){return CommandType::BGM;}
|
@ -52,7 +52,9 @@ namespace CommandType{
|
|||||||
BACKGROUND,
|
BACKGROUND,
|
||||||
RIGHT,
|
RIGHT,
|
||||||
LEFT,
|
LEFT,
|
||||||
LOCATION
|
LOCATION,
|
||||||
|
AUDIOPITCH,
|
||||||
|
BGM,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,6 +124,22 @@ public:
|
|||||||
CommandType::CommandType GetType()final override;
|
CommandType::CommandType GetType()final override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class AudioPitchCommand final:public Command{
|
||||||
|
float pitch;
|
||||||
|
public:
|
||||||
|
void Execute(VisualNovel&vn)override;
|
||||||
|
AudioPitchCommand(std::string pitch);
|
||||||
|
CommandType::CommandType GetType()final override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BGMCommand final:public Command{
|
||||||
|
std::string songName;
|
||||||
|
public:
|
||||||
|
void Execute(VisualNovel&vn)override;
|
||||||
|
BGMCommand(std::string songName);
|
||||||
|
CommandType::CommandType GetType()final override;
|
||||||
|
};
|
||||||
|
|
||||||
class VisualNovel{
|
class VisualNovel{
|
||||||
friend class State_Story;
|
friend class State_Story;
|
||||||
friend class AiL;
|
friend class AiL;
|
||||||
@ -133,6 +151,7 @@ class VisualNovel{
|
|||||||
friend class SpeakerCommand;
|
friend class SpeakerCommand;
|
||||||
friend class DialogCommand;
|
friend class DialogCommand;
|
||||||
friend class PauseCommand;
|
friend class PauseCommand;
|
||||||
|
friend class AudioPitchCommand;
|
||||||
std::string storyLevel;
|
std::string storyLevel;
|
||||||
std::u32string speakerDisplayName=U"";
|
std::u32string speakerDisplayName=U"";
|
||||||
std::u32string actualSpeakerName=U"";
|
std::u32string actualSpeakerName=U"";
|
||||||
@ -153,6 +172,7 @@ class VisualNovel{
|
|||||||
float backgroundScrollAmt=0;
|
float backgroundScrollAmt=0;
|
||||||
float prevBackgroundScrollAmt=0;
|
float prevBackgroundScrollAmt=0;
|
||||||
static constexpr float maxTextScrollTime=1.0f;
|
static constexpr float maxTextScrollTime=1.0f;
|
||||||
|
float audioPitch=1.f;
|
||||||
public:
|
public:
|
||||||
static Font font,narratorFont,locationFont;
|
static Font font,narratorFont,locationFont;
|
||||||
private:
|
private:
|
||||||
|
@ -111,4 +111,22 @@ BGM
|
|||||||
Default Volume = 0%,70%,0%,0%,70%,70%,0%
|
Default Volume = 0%,70%,0%,0%,70%,70%,0%
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
story
|
||||||
|
{
|
||||||
|
Track Name = Foresty Story
|
||||||
|
|
||||||
|
channel[0]=foresty1_1_drums.ogg
|
||||||
|
channel[1]=foresty1_1_flute.ogg
|
||||||
|
channel[2]=foresty1_1_strings.ogg
|
||||||
|
channel[3]=foresty1_1_xtra perc.ogg
|
||||||
|
|
||||||
|
# Transition time between one phase to the next.
|
||||||
|
Fade Time = 2.0
|
||||||
|
|
||||||
|
Events
|
||||||
|
{
|
||||||
|
Default Volume = 20%,70%,70%,70%
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,6 +1,9 @@
|
|||||||
===STORY_1_1===
|
===STORY_1_1===
|
||||||
{LOCATION Bleakport Outskirts}
|
{LOCATION Bleakport Outskirts}
|
||||||
{BACKGROUND sea.png}
|
{BACKGROUND sea.png}
|
||||||
|
{BGM story}
|
||||||
|
{AUDIOPITCH 0.4}
|
||||||
|
|
||||||
[]
|
[]
|
||||||
You are on your way from Bleakport to the Lestorian Forest, where slimes can be found.
|
You are on your way from Bleakport to the Lestorian Forest, where slimes can be found.
|
||||||
|
|
||||||
@ -124,6 +127,7 @@ You keep an eye on Sherman as he recovers.
|
|||||||
|
|
||||||
The next day you wake to find Sherman no longer lying down but is instead sitting on the grass.
|
The next day you wake to find Sherman no longer lying down but is instead sitting on the grass.
|
||||||
|
|
||||||
|
{AUDIOPITCH 1.0}
|
||||||
{BACKGROUND commercial_assets/Forest Clearing Campsite_Day.png}
|
{BACKGROUND commercial_assets/Forest Clearing Campsite_Day.png}
|
||||||
[Sherman]
|
[Sherman]
|
||||||
|
|
||||||
@ -178,6 +182,7 @@ Guess I have to take that answer for now. I am on my way to the Forest then. Bye
|
|||||||
===STORY_1_2===
|
===STORY_1_2===
|
||||||
{LOCATION Lestorian Forest}
|
{LOCATION Lestorian Forest}
|
||||||
{BACKGROUND sea.png}
|
{BACKGROUND sea.png}
|
||||||
|
{BGM story}
|
||||||
|
|
||||||
[?,Greg]
|
[?,Greg]
|
||||||
Did you defeat the Monsters?
|
Did you defeat the Monsters?
|
||||||
@ -286,6 +291,8 @@ See you later.
|
|||||||
===STORY_1_3===
|
===STORY_1_3===
|
||||||
{LOCATION Stone Wall}
|
{LOCATION Stone Wall}
|
||||||
{BACKGROUND sea.png}
|
{BACKGROUND sea.png}
|
||||||
|
{BGM story}
|
||||||
|
{AUDIOPITCH 0.4}
|
||||||
[]
|
[]
|
||||||
|
|
||||||
You see a crack in the Stone Wall.
|
You see a crack in the Stone Wall.
|
||||||
@ -329,6 +336,7 @@ Then...
|
|||||||
{RIGHT}
|
{RIGHT}
|
||||||
*click*
|
*click*
|
||||||
{BACKGROUND cave_dark.png}
|
{BACKGROUND cave_dark.png}
|
||||||
|
{AUDIOPITCH 0.05}
|
||||||
Darkness.
|
Darkness.
|
||||||
|
|
||||||
The Stone Cube is still glowing in your hand, but the glow is now very faint.
|
The Stone Cube is still glowing in your hand, but the glow is now very faint.
|
||||||
@ -345,6 +353,9 @@ Returning seems to be no problem, until...
|
|||||||
|
|
||||||
Halfway back you suddenly feel a movement.
|
Halfway back you suddenly feel a movement.
|
||||||
|
|
||||||
|
{BGM foresty_boss}
|
||||||
|
{AUDIOPITCH 1.0}
|
||||||
|
|
||||||
An #C72500Earthquake#FFFFFF!
|
An #C72500Earthquake#FFFFFF!
|
||||||
|
|
||||||
It's not a strong one but presents a threat remaining inside a cavern.
|
It's not a strong one but presents a threat remaining inside a cavern.
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user