Implemented minimap HUD overlay and included miniature player marker. Rearranged initialization of player animations in loading process. Release Build 8851.

pull/57/head
sigonasr2 8 months ago
parent 64a25dc66c
commit 2e39c0a3f5
  1. 16
      Adventures in Lestoria/AdventuresInLestoria.cpp
  2. 6
      Adventures in Lestoria/Minimap.cpp
  3. 33
      Adventures in Lestoria/Player.cpp
  4. 3
      Adventures in Lestoria/Player.h
  5. 2
      Adventures in Lestoria/Version.h
  6. 6
      Adventures in Lestoria/assets/config/Player.txt
  7. BIN
      Adventures in Lestoria/assets/ranger-map.png
  8. BIN
      Adventures in Lestoria/assets/warrior-map.png
  9. BIN
      Adventures in Lestoria/assets/wizard-map.png
  10. 5
      Adventures in Lestoria/olcPGEX_ViewPort.h
  11. BIN
      x64/Release/Adventures in Lestoria.exe

@ -272,19 +272,19 @@ bool AiL::OnUserCreate(){
ItemInfo::InitializeItems();
player=std::make_unique<Warrior>();
InitializeGraphics();
InitializeClasses();
healthCounter.Initialize(&player->hp,"Interface.HUD Health Tick Rate"_F,"Interface.HUD Health Display Color"_Pixel,"Interface.HUD Heal Damage Color"_Pixel,"Interface.HUD Take Damage Color"_Pixel,"Interface.HUD Health Change Time"_F);
manaCounter.Initialize(&player->mana,"Interface.HUD Mana Tick Rate"_F,"Interface.HUD Mana Display Color"_Pixel,"Interface.HUD Restore Mana Color"_Pixel,"Interface.HUD Reduce Mana Color"_Pixel,"Interface.HUD Mana Change Time"_F);
sig::Animation::InitializeAnimations();
player=std::make_unique<Warrior>();
InitializePlayerLevelCap();
InitializeGraphics();
InitializeClasses();
healthCounter.Initialize(&player->hp,"Interface.HUD Health Tick Rate"_F,"Interface.HUD Health Display Color"_Pixel,"Interface.HUD Heal Damage Color"_Pixel,"Interface.HUD Take Damage Color"_Pixel,"Interface.HUD Health Change Time"_F);
manaCounter.Initialize(&player->mana,"Interface.HUD Mana Tick Rate"_F,"Interface.HUD Mana Display Color"_Pixel,"Interface.HUD Restore Mana Color"_Pixel,"Interface.HUD Reduce Mana Color"_Pixel,"Interface.HUD Mana Change Time"_F);
Monster::InitializeStrategies();
//Animations
sig::Animation::InitializeAnimations();
MonsterData::InitializeMonsterData();
MonsterData::InitializeNPCData();
@ -353,6 +353,7 @@ bool AiL::OnUserCreate(){
SetupDiscord();
#endif
player->InitializeMinimapImage();
minimap.Initialize();
gameInitialized=true;
@ -2700,6 +2701,7 @@ void AiL::ChangePlayerClass(Class cl){
camera.SetTarget(player->GetPos());
Component<MenuLabel>(CHARACTER_MENU,"Level Class Display")->SetLabel(std::format("Lv{} {}",game->GetPlayer()->Level(),game->GetPlayer()->GetClassName()));
Player::moneyListeners=moneyListeners;
GetPlayer()->InitializeMinimapImage();
}
void AiL::InitializeClasses(){

@ -42,6 +42,7 @@ All rights reserved.
#include "util.h"
INCLUDE_game
INCLUDE_GFX
void Minimap::Initialize(){
std::vector<vf2d>enlargedCircle;
@ -176,7 +177,10 @@ void Minimap::UpdateChunk(const MapName map,const vi2d chunkPos){
}
void Minimap::Draw(){
if(!game->InBossEncounter())mapCircleHud.DrawRotatedDecal(vf2d{float("Minimap.Minimap HUD Size"_I),float("Minimap.Minimap HUD Size"_I)}/2,cover.Decal(),0.f,game->GetPlayer()->GetPos()/game->GetCurrentMapData().tilewidth,vf2d{0.5f,0.5f});
const vf2d minimapPos=vf2d{float("Minimap.Minimap HUD Size"_I),float("Minimap.Minimap HUD Size"_I)}/2;
if(!game->InBossEncounter())mapCircleHud.DrawRotatedDecal(minimapPos,cover.Decal(),0.f,game->GetPlayer()->GetPos()/game->GetCurrentMapData().tilewidth,vf2d{0.5f,0.5f});
game->DrawRotatedDecal(mapCircleHud.GetOffset()+minimapPos,GFX["skill_overlay_icon.png"].Decal(),0.f,GFX["skill_overlay_icon.png"].Sprite()->Size()/2,vf2d{float("Minimap.Minimap HUD Size"_I),float("Minimap.Minimap HUD Size"_I)}/24.f*1.05f);
game->DrawRotatedDecal(mapCircleHud.GetOffset()+minimapPos,game->GetPlayer()->GetMinimapImage().Decal(),0.f,vi2d{"Player.Minimap Image Size"_i[0],"Player.Minimap Image Size"_i[1]}/2,{0.5f,0.5f});
}
void Minimap::EraseChunkData(){

@ -111,6 +111,33 @@ void Player::Initialize(){
cooldownSoundInstance=Audio::Engine().LoadSound("spell_cast.ogg"_SFX);
}
void Player::InitializeMinimapImage(){
#pragma region Setup Minimap Image
minimapImg.Create("Player.Minimap Image Size"_i[0],"Player.Minimap Image Size"_i[1]);
game->SetDrawTarget(minimapImg.Sprite());
game->SetPixelMode(Pixel::Mode::ALPHA);
game->Clear(BLANK);
for(int y=0;y<"Player.Minimap Image Size"_i[1];y++){
for(int x=0;x<"Player.Minimap Image Size"_i[0];x++){
const int radius="Player.Minimap Image Size"_i[0]/2;
const vi2d center=vi2d{"Player.Minimap Image Offset"_i[0],"Player.Minimap Image Offset"_i[1]};
vi2d imgOffset=vi2d{-"Player.Minimap Image Size"_i[0]/2,-"Player.Minimap Image Size"_i[1]/2}+vi2d{"Player.Minimap Image Offset"_i[0],"Player.Minimap Image Offset"_i[1]};
float dist=geom2d::line<float>{imgOffset+vi2d{x,y},center}.length();
if(dist>radius)continue;
std::string className=GetWalkSAnimation();
Animate2D::FrameSequence sequence=ANIMATION_DATA.at(className);
Animate2D::Frame frame=sequence.GetFrame(0.f);
const Renderable*temp=frame.GetSourceImage();
Pixel col=temp->Sprite()->GetPixel(imgOffset+vi2d{x,y});
minimapImg.Sprite()->SetPixel({x,y},col);
}
}
game->SetDrawTarget(nullptr);
game->SetPixelMode(Pixel::Mode::NORMAL);
minimapImg.Decal()->Update();
#pragma endregion
}
void Player::ForceSetPos(vf2d pos){
this->pos=pos;
Moved();
@ -866,7 +893,7 @@ void Player::Moved(){
ForceSetPos({pos.x,float(game->GetCurrentMapData().playerSpawnLocation.y)});
}
game->minimap.UpdateChunk(game->GetCurrentMapName(),GetPos()/24/"Minimap.Chunk Size"_I);
game->minimap.UpdateChunk(game->GetCurrentMapName(),GetPos()/game->GetCurrentMapData().tilewidth/"Minimap.Chunk Size"_I);
}
void Player::Spin(float duration,float spinSpd){
@ -1505,3 +1532,7 @@ const float Player::GetAtkGrowthRate()const{
const float Player::GetIframeTime()const{
return iframe_time;
}
const Renderable&Player::GetMinimapImage()const{
return minimapImg;
}

@ -252,6 +252,7 @@ public:
const float GetHealthGrowthRate()const;
const float GetAtkGrowthRate()const;
const float GetIframeTime()const;
const Renderable&GetMinimapImage()const;
private:
int hp="Warrior.BaseHealth"_I;
int mana="Player.BaseMana"_I;
@ -313,9 +314,11 @@ private:
//Typical usage is playerInvoked is true on first call, and playerInvoked is false on all subsequent chained calls.
bool _SetY(float y,const bool playerInvoked=true);
const bool UsingAutoAim()const;
void InitializeMinimapImage();
bool lowHealthSoundPlayed=false;
float lowHealthSoundPlayedTimer=0.f;
float rangerShootAnimationTimer=0.f;
Renderable minimapImg; //An image of the character represented on a minimap. Should be 12x12 and generally be a circle.
protected:
const float ATTACK_COOLDOWN="Warrior.Auto Attack.Cooldown"_F;
const float MAGIC_ATTACK_COOLDOWN="Wizard.Auto Attack.Cooldown"_F;

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

@ -6,6 +6,12 @@ Player
# Game Map Starting Location
Starting Location = Story I
# Class Minimap Image offset
Minimap Image Offset = 12,11
# Class Minimap Image Size (Total Width and Height, starting from the center going out) Ex: 12 means 6 in both directions.
Minimap Image Size = 12,12
# Starting base crit rate.
Crit Rate = 0%

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 716 B

@ -23,6 +23,7 @@ namespace olc {
void clear();
void drawEdges();
void setOffset(vf2d offset);
const vf2d&GetOffset();
static ViewPort rectViewPort(vf2d topLeft,
vf2d size,
@ -178,6 +179,10 @@ void olc::ViewPort::setOffset(vf2d offset) {
this->offset = offset;
}
const vf2d&olc::ViewPort::GetOffset() {
return offset;
}
olc::ViewPort
olc::ViewPort::rectViewPort(vf2d topLeft, vf2d size, olc::vf2d offset) {
olc::ViewPort newPort={{

Loading…
Cancel
Save