Added duration-based restoration buffs for the Restore Item Script.
This commit is contained in:
parent
70423be9d4
commit
fd96b23110
@ -42,10 +42,16 @@ enum BuffType{
|
||||
DAMAGE_REDUCTION,
|
||||
SLOWDOWN,
|
||||
BLOCK_SLOWDOWN,
|
||||
RESTORATION,
|
||||
};
|
||||
|
||||
class Crawler;
|
||||
|
||||
struct Buff{
|
||||
BuffType type;
|
||||
float duration;
|
||||
float intensity;
|
||||
float duration=1;
|
||||
float timeBetweenTicks=1;
|
||||
float intensity=1;
|
||||
float nextTick=0;
|
||||
std::function<void(Crawler*,int)>repeatAction;
|
||||
};
|
@ -212,25 +212,46 @@ void ItemInfo::InitializeItems(){
|
||||
ItemProps::ItemProps(utils::datafile*scriptProps,utils::datafile*customProps)
|
||||
:scriptProps(scriptProps),customProps(customProps){}
|
||||
|
||||
int ItemProps::GetIntProp(std::string prop,size_t index=0){
|
||||
int ItemProps::GetIntProp(const std::string&prop,size_t index)const{
|
||||
if(customProps->HasProperty(prop)) return (*customProps)[prop].GetInt(index);
|
||||
else return (*scriptProps)[prop].GetInt(index);
|
||||
};
|
||||
float ItemProps::GetFloatProp(std::string prop,size_t index=0){
|
||||
float ItemProps::GetFloatProp(const std::string&prop,size_t index)const{
|
||||
if(customProps->HasProperty(prop)) return float((*customProps)[prop].GetReal(index));
|
||||
else return float((*scriptProps)[prop].GetReal(index));
|
||||
};
|
||||
std::string ItemProps::GetStringProp(std::string prop,size_t index=0){
|
||||
std::string ItemProps::GetStringProp(const std::string&prop,size_t index)const{
|
||||
if(customProps->HasProperty(prop)) return (*customProps)[prop].GetString(index);
|
||||
else return (*scriptProps)[prop].GetString(index);
|
||||
};
|
||||
|
||||
const uint32_t ItemProps::PropCount(const std::string&prop)const{
|
||||
if(customProps->HasProperty(prop)) return (*customProps)[prop].GetValueCount();
|
||||
else return (*scriptProps)[prop].GetValueCount();
|
||||
}
|
||||
|
||||
void ItemInfo::InitializeScripts(){
|
||||
|
||||
ITEM_SCRIPTS["Restore"]=[](Crawler*game,ItemProps props){
|
||||
game->GetPlayer()->Heal(props.GetIntProp("HP Restore"));
|
||||
game->GetPlayer()->Heal(int(game->GetPlayer()->GetMaxHealth()*props.GetIntProp("HP % Restore")/100.f));
|
||||
game->GetPlayer()->RestoreMana(props.GetIntProp("MP Restore"));
|
||||
game->GetPlayer()->RestoreMana(int(game->GetPlayer()->GetMaxMana()*props.GetIntProp("MP % Restore")/100.f));
|
||||
auto ParseItemScriptData=[&](const std::string&propName,std::function<void(Crawler*,int)>action,BuffType type){
|
||||
int restoreAmt=props.GetIntProp(propName);
|
||||
action(game,restoreAmt);
|
||||
if(restoreAmt>0&&props.PropCount(propName)==3){
|
||||
game->GetPlayer()->AddBuff(type,props.GetFloatProp(propName,2),restoreAmt,props.GetFloatProp(propName,1),action);
|
||||
}
|
||||
};
|
||||
ParseItemScriptData("HP Restore",[&](Crawler*game,int restoreAmt){
|
||||
game->GetPlayer()->Heal(restoreAmt);
|
||||
},RESTORATION);
|
||||
ParseItemScriptData("HP % Restore",[&](Crawler*game,int restoreAmt){
|
||||
game->GetPlayer()->Heal(int(game->GetPlayer()->GetMaxHealth()*restoreAmt/100.0f));
|
||||
},RESTORATION);
|
||||
ParseItemScriptData("MP Restore",[&](Crawler*game,int restoreAmt){
|
||||
game->GetPlayer()->RestoreMana(restoreAmt);
|
||||
},RESTORATION);
|
||||
ParseItemScriptData("MP % Restore",[&](Crawler*game,int restoreAmt){
|
||||
game->GetPlayer()->RestoreMana(int(game->GetPlayer()->GetMaxMana()*props.GetIntProp("MP % Restore")/100.f));
|
||||
},RESTORATION);
|
||||
return true;
|
||||
};
|
||||
ITEM_SCRIPTS["Buff"]=[](Crawler*game,ItemProps props){
|
||||
|
@ -223,9 +223,10 @@ class ItemProps{
|
||||
utils::datafile*customProps;
|
||||
public:
|
||||
ItemProps(utils::datafile*scriptProps,utils::datafile*customProps);
|
||||
int GetIntProp(std::string prop,size_t index);
|
||||
float GetFloatProp(std::string prop,size_t index);
|
||||
std::string GetStringProp(std::string prop,size_t index);
|
||||
int GetIntProp(const std::string&prop,size_t index=0)const;
|
||||
float GetFloatProp(const std::string&prop,size_t index=0)const;
|
||||
std::string GetStringProp(const std::string&prop,size_t index=0)const;
|
||||
const uint32_t PropCount(const std::string&prop)const;
|
||||
};
|
||||
|
||||
class ItemInfo{
|
||||
|
@ -272,14 +272,14 @@ void Player::Update(float fElapsedTime){
|
||||
manaTickTimer+=0.2f;
|
||||
RestoreMana(1,true);
|
||||
}
|
||||
for(std::vector<Buff>::iterator it=buffList.begin();it!=buffList.end();++it){
|
||||
Buff&b=*it;
|
||||
for(Buff&b:buffList){
|
||||
b.duration-=fElapsedTime;
|
||||
if(b.duration<=0){
|
||||
it=buffList.erase(it);
|
||||
if(it==buffList.end())break;
|
||||
if(b.nextTick>0&&b.duration<b.nextTick){
|
||||
b.repeatAction(game,b.intensity);
|
||||
b.nextTick-=b.timeBetweenTicks;
|
||||
}
|
||||
}
|
||||
std::erase_if(buffList,[](Buff&b){return b.duration<=0;});
|
||||
//Class-specific update events.
|
||||
OnUpdate(fElapsedTime);
|
||||
switch(state){
|
||||
@ -705,7 +705,10 @@ void Player::UpdateIdleAnimation(Key direction){
|
||||
}
|
||||
|
||||
void Player::AddBuff(BuffType type,float duration,float intensity){
|
||||
buffList.push_back(Buff{type,duration,intensity});
|
||||
buffList.push_back(Buff{.type=type,.duration=duration,.intensity=intensity});
|
||||
}
|
||||
void Player::AddBuff(BuffType type,float duration,float intensity,float timeBetweenTicks,std::function<void(Crawler*,int)>repeatAction){
|
||||
buffList.push_back(Buff{.type=type,.duration=duration,.timeBetweenTicks=timeBetweenTicks,.intensity=intensity,.nextTick=duration-timeBetweenTicks,.repeatAction=repeatAction});
|
||||
}
|
||||
|
||||
bool Player::OnUpperLevel(){
|
||||
|
@ -203,8 +203,9 @@ public:
|
||||
//Returns true if the move was valid and successful.
|
||||
bool SetPos(vf2d pos);
|
||||
void SetState(State::State newState);
|
||||
|
||||
|
||||
void AddBuff(BuffType type,float duration,float intensity);
|
||||
void AddBuff(BuffType type,float duration,float intensity,float timeBetweenTicks,std::function<void(Crawler*,int)>repeatAction);
|
||||
std::vector<Buff>GetBuffs(BuffType buff);
|
||||
void RemoveBuff(BuffType type); //Removes the first buff found.
|
||||
void RemoveAllBuffs(BuffType type); //Removes all buffs of a certain type.
|
||||
|
@ -39,7 +39,7 @@ All rights reserved.
|
||||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 2
|
||||
#define VERSION_PATCH 1
|
||||
#define VERSION_BUILD 4521
|
||||
#define VERSION_BUILD 4530
|
||||
|
||||
#define stringify(a) stringify_(a)
|
||||
#define stringify_(a) #a
|
||||
|
Loading…
x
Reference in New Issue
Block a user