Implement basic structures for Items, Item Sets, and Equipment.
This commit is contained in:
parent
47d7c02bb6
commit
b97c63f7b0
73
Crawler/AttributableStat.h
Normal file
73
Crawler/AttributableStat.h
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
#pragma region License
|
||||||
|
/*
|
||||||
|
License (OLC-3)
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Copyright 2018 - 2022 OneLoneCoder.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 © 2023 The FreeType
|
||||||
|
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
|
||||||
|
All rights reserved.
|
||||||
|
*/
|
||||||
|
#pragma endregion
|
||||||
|
#pragma once
|
||||||
|
#include "olcPixelGameEngine.h"
|
||||||
|
|
||||||
|
#define A(attr) get(attr)
|
||||||
|
#define A_Read(attr) get_readOnly(attr)
|
||||||
|
|
||||||
|
enum class ItemAttribute{
|
||||||
|
/*////////////////////////////////////////////*/
|
||||||
|
/*//////*/ENUM_START,/*///////////////////////*/
|
||||||
|
/*////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
defense,
|
||||||
|
health,
|
||||||
|
attack,
|
||||||
|
moveSpdPct,
|
||||||
|
cdrPct,
|
||||||
|
critPct,
|
||||||
|
critDmgPct,
|
||||||
|
healthPct, //Percentage of health boost
|
||||||
|
healthPctRecoveryPer6sec, //Percentage of health recovered every 6 seconds.
|
||||||
|
|
||||||
|
/*////////////////////////////////////////////*/
|
||||||
|
/*//////*/ENUM_END/*//////////////////////////*/
|
||||||
|
/*////////////////////////////////////////////*/
|
||||||
|
};
|
||||||
|
|
||||||
|
class ItemAttributable{
|
||||||
|
std::map<ItemAttribute,int>attributes;
|
||||||
|
public:
|
||||||
|
inline int&get(ItemAttribute a){
|
||||||
|
return attributes[a];
|
||||||
|
}
|
||||||
|
inline const int get_readOnly(ItemAttribute a)const{
|
||||||
|
return attributes.at(a);
|
||||||
|
}
|
||||||
|
};
|
@ -57,7 +57,7 @@ void Menu::InitializeClassInfoWindow(){
|
|||||||
|
|
||||||
classInfoWindow->AddComponent("Class Name",label);
|
classInfoWindow->AddComponent("Class Name",label);
|
||||||
|
|
||||||
CharacterRotatingDisplay*classDisplay=NEW CharacterRotatingDisplay(CLASS_INFO,{{0,0},{72,120}},GFX[data.classFullImgName].Decal());
|
CharacterRotatingDisplay*classDisplay=NEW CharacterRotatingDisplay(CLASS_INFO,{{15,48},{72,120}},GFX[data.classFullImgName].Decal());
|
||||||
|
|
||||||
classInfoWindow->AddComponent("Rotating Character Display",classDisplay);
|
classInfoWindow->AddComponent("Rotating Character Display",classDisplay);
|
||||||
|
|
||||||
|
@ -37,10 +37,24 @@ All rights reserved.
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
#include "Menu.h"
|
#include "Menu.h"
|
||||||
#include "MenuComponent.h"
|
#include "MenuComponent.h"
|
||||||
|
#include "MenuLabel.h"
|
||||||
|
#include "CharacterRotatingDisplay.h"
|
||||||
#include "Crawler.h"
|
#include "Crawler.h"
|
||||||
|
#include "ClassInfo.h"
|
||||||
|
|
||||||
INCLUDE_game
|
INCLUDE_game
|
||||||
|
INCLUDE_GFX
|
||||||
|
|
||||||
void Menu::InitializeCharacterMenuWindow(){
|
void Menu::InitializeCharacterMenuWindow(){
|
||||||
Menu*characterMenuWindow=CreateMenu(CHARACTER_MENU,CENTERED,game->GetScreenSize()-vf2d{52,52});
|
vf2d windowSize=game->GetScreenSize()-vf2d{52,52};
|
||||||
|
Menu*characterMenuWindow=CreateMenu(CHARACTER_MENU,CENTERED,windowSize);
|
||||||
|
|
||||||
|
MenuLabel*characterLabel=NEW MenuLabel(CHARACTER_MENU,{{0,4},{float(windowSize.x)-1,24}},"Character",2,ComponentAttr::SHADOW|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND);
|
||||||
|
|
||||||
|
MenuComponent*equipSlotOutline=NEW MenuComponent(CHARACTER_MENU,{{0,36},{120,windowSize.y-37}},"",DO_NOTHING,ButtonAttr::UNSELECTABLE);
|
||||||
|
CharacterRotatingDisplay*charDisplay=NEW CharacterRotatingDisplay(CHARACTER_MENU,{{135,36},{90,windowSize.y-37}},GFX[classutils::GetClassInfo(game->GetPlayer()->GetClassName()).classFullImgName].Decal());
|
||||||
|
|
||||||
|
characterMenuWindow->AddComponent("Character Label",characterLabel);
|
||||||
|
characterMenuWindow->AddComponent("Equip Slot Outline",equipSlotOutline);
|
||||||
|
characterMenuWindow->AddComponent("Character Rotating Display",charDisplay);
|
||||||
}
|
}
|
@ -51,6 +51,9 @@ protected:
|
|||||||
public:
|
public:
|
||||||
inline CharacterRotatingDisplay(MenuType parent,geom2d::rect<float>rect,Decal*icon)
|
inline CharacterRotatingDisplay(MenuType parent,geom2d::rect<float>rect,Decal*icon)
|
||||||
:MenuComponent(parent,rect,"",DO_NOTHING),icon(icon){}
|
:MenuComponent(parent,rect,"",DO_NOTHING),icon(icon){}
|
||||||
|
inline void SetIcon(Decal*icon){
|
||||||
|
this->icon=icon;
|
||||||
|
}
|
||||||
protected:
|
protected:
|
||||||
virtual inline void Update(Crawler*game)override{
|
virtual inline void Update(Crawler*game)override{
|
||||||
MenuComponent::Update(game);
|
MenuComponent::Update(game);
|
||||||
@ -63,10 +66,10 @@ protected:
|
|||||||
virtual inline void DrawDecal(Crawler*game,vf2d parentPos,bool focused)override{
|
virtual inline void DrawDecal(Crawler*game,vf2d parentPos,bool focused)override{
|
||||||
//MenuComponent::DrawDecal(game,parentPos,focused);
|
//MenuComponent::DrawDecal(game,parentPos,focused);
|
||||||
game->DrawWarpedDecal(icon,std::array<vf2d,4>{
|
game->DrawWarpedDecal(icon,std::array<vf2d,4>{
|
||||||
parentPos+rect.middle()+vf2d{abs(sin(timer)),sin(float(timer+PI))}*vf2d{rotatingFactor,perspectiveFactor},
|
Menu::menus[parentMenu]->pos+rect.pos+vf2d{abs(sin(timer)),sin(float(timer+PI))}*vf2d{rotatingFactor,perspectiveFactor},
|
||||||
parentPos+rect.middle()+vf2d{0,rect.size.y}+vf2d{abs(sin(timer)),sin(timer)}*vf2d{rotatingFactor,perspectiveFactor},
|
Menu::menus[parentMenu]->pos+rect.pos+vf2d{0,rect.size.y}+vf2d{abs(sin(timer)),sin(timer)}*vf2d{rotatingFactor,perspectiveFactor},
|
||||||
parentPos+rect.middle()+rect.size+vf2d{-abs(sin(float(timer+PI))),sin(float(timer+PI))}*vf2d{rotatingFactor,perspectiveFactor},
|
Menu::menus[parentMenu]->pos+rect.pos+rect.size+vf2d{-abs(sin(float(timer+PI))),sin(float(timer+PI))}*vf2d{rotatingFactor,perspectiveFactor},
|
||||||
parentPos+rect.middle()+vf2d{rect.size.x,0}+vf2d{-abs(sin(float(timer+PI))),sin(timer)}*vf2d{rotatingFactor,perspectiveFactor},
|
Menu::menus[parentMenu]->pos+rect.pos+vf2d{rect.size.x,0}+vf2d{-abs(sin(float(timer+PI))),sin(timer)}*vf2d{rotatingFactor,perspectiveFactor},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
@ -279,6 +279,10 @@
|
|||||||
<ClInclude Include="Ability.h" />
|
<ClInclude Include="Ability.h" />
|
||||||
<ClInclude Include="Animation.h" />
|
<ClInclude Include="Animation.h" />
|
||||||
<ClInclude Include="Attributable.h" />
|
<ClInclude Include="Attributable.h" />
|
||||||
|
<ClInclude Include="AttributableStat.h">
|
||||||
|
<SubType>
|
||||||
|
</SubType>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="Buff.h" />
|
<ClInclude Include="Buff.h" />
|
||||||
<ClInclude Include="Bullet.h" />
|
<ClInclude Include="Bullet.h" />
|
||||||
<ClInclude Include="BulletTypes.h" />
|
<ClInclude Include="BulletTypes.h" />
|
||||||
|
@ -285,6 +285,9 @@
|
|||||||
<ClInclude Include="miniaudio.h">
|
<ClInclude Include="miniaudio.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="AttributableStat.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="Player.cpp">
|
<ClCompile Include="Player.cpp">
|
||||||
|
@ -52,6 +52,7 @@ Item Item::BLANK;
|
|||||||
std::map<IT,Item>Inventory::_inventory;
|
std::map<IT,Item>Inventory::_inventory;
|
||||||
std::map<ITCategory,std::vector<Item>>Inventory::sortedInv;
|
std::map<ITCategory,std::vector<Item>>Inventory::sortedInv;
|
||||||
std::vector<ItemOverlay>ItemOverlay::items;
|
std::vector<ItemOverlay>ItemOverlay::items;
|
||||||
|
std::map<std::string,ItemSet>ItemSet::sets;
|
||||||
|
|
||||||
ItemInfo::ItemInfo()
|
ItemInfo::ItemInfo()
|
||||||
:customProps({nullptr,nullptr}),img(nullptr){}
|
:customProps({nullptr,nullptr}),img(nullptr){}
|
||||||
@ -157,10 +158,10 @@ void ItemInfo::InitializeScripts(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
Item::Item()
|
Item::Item()
|
||||||
:amt(0),it(nullptr){}
|
:amt(0),it(nullptr),enhancementLevel(0){}
|
||||||
|
|
||||||
Item::Item(uint32_t amt,IT item)
|
Item::Item(uint32_t amt,IT item,uint8_t enhancementLevel)
|
||||||
:amt(amt),it(&ITEM_DATA.at(item)){}
|
:amt(amt),it(&ITEM_DATA.at(item)),enhancementLevel(enhancementLevel){}
|
||||||
|
|
||||||
void Inventory::AddItem(IT it,uint32_t amt,bool monsterDrop){
|
void Inventory::AddItem(IT it,uint32_t amt,bool monsterDrop){
|
||||||
//There are two places to manipulate items in (Both the sorted inventory and the actual inventory)
|
//There are two places to manipulate items in (Both the sorted inventory and the actual inventory)
|
||||||
@ -401,3 +402,22 @@ float Item::CastTime(){
|
|||||||
float Item::CooldownTime(){
|
float Item::CooldownTime(){
|
||||||
return it->CooldownTime();
|
return it->CooldownTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Stats&EnhancementInfo::operator[](int level)const{
|
||||||
|
return enhancementStats[level];
|
||||||
|
}
|
||||||
|
|
||||||
|
const ItemSet&Item::GetItemSet()const{
|
||||||
|
return ItemSet::sets[set];
|
||||||
|
};
|
||||||
|
|
||||||
|
const Stats&ItemSet::operator[](int setPieces)const{
|
||||||
|
return setBonuses[setPieces];
|
||||||
|
};
|
||||||
|
|
||||||
|
void ItemSet::AddSetBonus(int pieceCount,const Stats&bonuses){
|
||||||
|
if(pieceCount<=0||pieceCount>=9)ERR("Piece count is invalid! Expecting a value (1-8) but got "<<pieceCount);
|
||||||
|
for(int i=pieceCount-1;i<setBonuses.size();i++){
|
||||||
|
setBonuses[i]+=bonuses;
|
||||||
|
}
|
||||||
|
}
|
@ -41,6 +41,7 @@ All rights reserved.
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include "olcPixelGameEngine.h"
|
#include "olcPixelGameEngine.h"
|
||||||
#include "olcUTIL_DataFile.h"
|
#include "olcUTIL_DataFile.h"
|
||||||
|
#include "AttributableStat.h"
|
||||||
|
|
||||||
class Crawler;
|
class Crawler;
|
||||||
class ItemInfo;
|
class ItemInfo;
|
||||||
@ -51,22 +52,51 @@ typedef std::string ITCategory;
|
|||||||
|
|
||||||
typedef std::function<bool(Crawler*,ItemProps)> ItemScript;
|
typedef std::function<bool(Crawler*,ItemProps)> ItemScript;
|
||||||
|
|
||||||
|
struct Stats:ItemAttributable{
|
||||||
|
public:
|
||||||
|
inline Stats&operator+=(const Stats&rhs){
|
||||||
|
for(ItemAttribute a=ItemAttribute(int(ItemAttribute::ENUM_START)+1);a<ItemAttribute::ENUM_END;a=ItemAttribute(int(a)+1)){
|
||||||
|
A(a)+=rhs.A_Read(a);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct EnhancementInfo{
|
||||||
|
private:
|
||||||
|
std::vector<Stats>enhancementStats;
|
||||||
|
public:
|
||||||
|
const Stats&operator[](int level)const;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ItemSet{
|
||||||
|
friend class Item;
|
||||||
|
static std::map<std::string,ItemSet>sets;
|
||||||
|
std::array<Stats,8>setBonuses;
|
||||||
|
public:
|
||||||
|
//Specify the piece count(1-8) for a set bonus to be applied.
|
||||||
|
void AddSetBonus(int pieceCount,const Stats&bonuses);
|
||||||
|
const Stats&operator[](int setPieces)const;
|
||||||
|
};
|
||||||
|
|
||||||
class Item{
|
class Item{
|
||||||
friend class Inventory;
|
friend class Inventory;
|
||||||
friend class Crawler;
|
friend class Crawler;
|
||||||
private:
|
private:
|
||||||
//The amount in the current item stack.
|
//The amount in the current item stack.
|
||||||
uint32_t amt;
|
uint32_t amt;
|
||||||
|
uint8_t enhancementLevel;
|
||||||
|
std::string set;
|
||||||
ItemInfo*it;
|
ItemInfo*it;
|
||||||
public:
|
public:
|
||||||
Item();
|
Item();
|
||||||
Item(uint32_t amt,IT item);
|
Item(uint32_t amt,IT item,uint8_t enhancementLevel=0);
|
||||||
uint32_t Amt();
|
uint32_t Amt();
|
||||||
std::string Name();
|
std::string Name();
|
||||||
std::string Description();
|
std::string Description();
|
||||||
ITCategory Category();
|
ITCategory Category();
|
||||||
Decal*Decal();
|
Decal*Decal();
|
||||||
ItemScript&OnUseAction();
|
ItemScript&OnUseAction();
|
||||||
|
const ItemSet&GetItemSet()const;
|
||||||
float CastTime();
|
float CastTime();
|
||||||
float CooldownTime();
|
float CooldownTime();
|
||||||
bool IsBlank();
|
bool IsBlank();
|
||||||
@ -122,6 +152,7 @@ class ItemInfo{
|
|||||||
std::string category;
|
std::string category;
|
||||||
float castTime=0;
|
float castTime=0;
|
||||||
float cooldownTime=0;
|
float cooldownTime=0;
|
||||||
|
EnhancementInfo enhancement;
|
||||||
Decal*img;
|
Decal*img;
|
||||||
//Returns true if the item can be used, false otherwise
|
//Returns true if the item can be used, false otherwise
|
||||||
std::string useFunc="";
|
std::string useFunc="";
|
||||||
|
@ -38,14 +38,20 @@ All rights reserved.
|
|||||||
#include "Menu.h"
|
#include "Menu.h"
|
||||||
#include "MenuComponent.h"
|
#include "MenuComponent.h"
|
||||||
#include "Crawler.h"
|
#include "Crawler.h"
|
||||||
|
#include "CharacterRotatingDisplay.h"
|
||||||
|
#include "ClassInfo.h"
|
||||||
|
|
||||||
INCLUDE_game
|
INCLUDE_game
|
||||||
|
INCLUDE_GFX
|
||||||
|
|
||||||
void Menu::InitializeOverworldMenuWindow(){
|
void Menu::InitializeOverworldMenuWindow(){
|
||||||
Menu*overworldMenuWindow=CreateMenu(OVERWORLD_MENU,CENTERED,vi2d{96,164});
|
Menu*overworldMenuWindow=CreateMenu(OVERWORLD_MENU,CENTERED,vi2d{96,164});
|
||||||
|
|
||||||
MenuComponent*resumeButton=NEW MenuComponent(OVERWORLD_MENU,{{4,12+28*0},{88,24}},"Resume",[](MenuFuncData data){Menu::CloseMenu();return true;});
|
MenuComponent*resumeButton=NEW MenuComponent(OVERWORLD_MENU,{{4,12+28*0},{88,24}},"Resume",[](MenuFuncData data){Menu::CloseMenu();return true;});
|
||||||
MenuComponent*characterButton=NEW MenuComponent(OVERWORLD_MENU,{{4,12+28*1},{88,24}},"Character",[](MenuFuncData data){Menu::OpenMenu(CHARACTER_MENU);return true;});
|
MenuComponent*characterButton=NEW MenuComponent(OVERWORLD_MENU,{{4,12+28*1},{88,24}},"Character",[](MenuFuncData data){
|
||||||
|
Component<CharacterRotatingDisplay>(CHARACTER_MENU,"Character Rotating Display")->SetIcon(GFX[classutils::GetClassInfo(game->GetPlayer()->GetClassName()).classFullImgName].Decal());
|
||||||
|
Menu::OpenMenu(CHARACTER_MENU);
|
||||||
|
return true;});
|
||||||
MenuComponent*inventoryButton=NEW MenuComponent(OVERWORLD_MENU,{{4,12+28*2},{88,24}},"Inventory",[](MenuFuncData data){/*Menu::OpenMenu(INVENTORY_MENU);*/return true;});
|
MenuComponent*inventoryButton=NEW MenuComponent(OVERWORLD_MENU,{{4,12+28*2},{88,24}},"Inventory",[](MenuFuncData data){/*Menu::OpenMenu(INVENTORY_MENU);*/return true;});
|
||||||
MenuComponent*settingsButton=NEW MenuComponent(OVERWORLD_MENU,{{4,12+28*3},{88,24}},"Settings",[](MenuFuncData data){/*Menu::OpenMenu(SETTINGS_MENU);*/return true;});
|
MenuComponent*settingsButton=NEW MenuComponent(OVERWORLD_MENU,{{4,12+28*3},{88,24}},"Settings",[](MenuFuncData data){/*Menu::OpenMenu(SETTINGS_MENU);*/return true;});
|
||||||
MenuComponent*quitButton=NEW MenuComponent(OVERWORLD_MENU,{{4,12+28*4},{88,24}},"Quit Game",[](MenuFuncData data){game->EndGame();return true;});
|
MenuComponent*quitButton=NEW MenuComponent(OVERWORLD_MENU,{{4,12+28*4},{88,24}},"Quit Game",[](MenuFuncData data){game->EndGame();return true;});
|
||||||
|
@ -39,7 +39,7 @@ All rights reserved.
|
|||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 2
|
#define VERSION_MINOR 2
|
||||||
#define VERSION_PATCH 1
|
#define VERSION_PATCH 1
|
||||||
#define VERSION_BUILD 3335
|
#define VERSION_BUILD 3347
|
||||||
|
|
||||||
#define stringify(a) stringify_(a)
|
#define stringify(a) stringify_(a)
|
||||||
#define stringify_(a) #a
|
#define stringify_(a) #a
|
||||||
|
Loading…
x
Reference in New Issue
Block a user