Goblin (Dagger) dagger stab attack implemented. Release Build 9033.
This commit is contained in:
parent
c03f87aefd
commit
270d70a387
@ -658,6 +658,10 @@
|
|||||||
<SubType>
|
<SubType>
|
||||||
</SubType>
|
</SubType>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="DaggerStab.cpp">
|
||||||
|
<SubType>
|
||||||
|
</SubType>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="DamageNumber.cpp" />
|
<ClCompile Include="DamageNumber.cpp" />
|
||||||
<ClCompile Include="DeathMenu.cpp">
|
<ClCompile Include="DeathMenu.cpp">
|
||||||
<SubType>
|
<SubType>
|
||||||
|
@ -234,6 +234,7 @@ void sig::Animation::InitializeAnimations(){
|
|||||||
CreateStillAnimation("chain_lightning.png",{1,9});
|
CreateStillAnimation("chain_lightning.png",{1,9});
|
||||||
|
|
||||||
CreateHorizontalAnimationSequence("lightning_splash_effect.png",5,{24,24});
|
CreateHorizontalAnimationSequence("lightning_splash_effect.png",5,{24,24});
|
||||||
|
CreateHorizontalAnimationSequence("dagger_stab.png",2,{24,24},AnimationData{0.1f,Animate2D::Style::PingPong});
|
||||||
|
|
||||||
CreateStillAnimation("meteor.png",{192,192});
|
CreateStillAnimation("meteor.png",{192,192});
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ All rights reserved.
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "Bullet.h"
|
#include "Bullet.h"
|
||||||
|
#include "Direction.h"
|
||||||
|
|
||||||
struct EnergyBolt:public Bullet{
|
struct EnergyBolt:public Bullet{
|
||||||
float lastParticleSpawn=0;
|
float lastParticleSpawn=0;
|
||||||
@ -99,3 +100,30 @@ struct Wisp:public Bullet{
|
|||||||
bool PlayerHit(Player*player)override;
|
bool PlayerHit(Player*player)override;
|
||||||
bool MonsterHit(Monster&monster)override;
|
bool MonsterHit(Monster&monster)override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct DaggerStab:public Bullet{
|
||||||
|
struct DirectionOffsets{
|
||||||
|
std::unordered_map<Direction,vf2d>offsets;
|
||||||
|
DirectionOffsets(const vf2d upOffset,const vf2d downOffset,const vf2d leftOffset){
|
||||||
|
offsets[Direction::NORTH]=upOffset;
|
||||||
|
offsets[Direction::SOUTH]=downOffset;
|
||||||
|
offsets[Direction::EAST]=offsets[Direction::WEST]=leftOffset; //Both east and west use one offset because the sprite flipping system will handle flipping the position of the dagger for the other side.
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class HorizontalFlip{
|
||||||
|
NONE,
|
||||||
|
FLIPPED,
|
||||||
|
};
|
||||||
|
|
||||||
|
Monster&sourceMonster;
|
||||||
|
Direction facingDir;
|
||||||
|
float frameDuration;
|
||||||
|
float daggerStabDistance;
|
||||||
|
DirectionOffsets daggerPositionOffsets;
|
||||||
|
HorizontalFlip horizontalFlip;
|
||||||
|
DaggerStab(Monster&sourceMonster,float radius,int damage,bool upperLevel,const Direction facingDir,const float daggerFrameDuration,const float daggerStabDistance,const HorizontalFlip horizontalFlip,const DirectionOffsets offsets,bool friendly=false,Pixel col=WHITE);
|
||||||
|
void Update(float fElapsedTime)override;
|
||||||
|
bool PlayerHit(Player*player)override;
|
||||||
|
bool MonsterHit(Monster&monster)override;
|
||||||
|
};
|
104
Adventures in Lestoria/DaggerStab.cpp
Normal file
104
Adventures in Lestoria/DaggerStab.cpp
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
#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 "BulletTypes.h"
|
||||||
|
#include "SoundEffect.h"
|
||||||
|
#include "AdventuresInLestoria.h"
|
||||||
|
#include "DEFINES.h"
|
||||||
|
|
||||||
|
INCLUDE_game
|
||||||
|
INCLUDE_ANIMATION_DATA
|
||||||
|
|
||||||
|
DaggerStab::DaggerStab(Monster&sourceMonster,float radius,int damage,bool upperLevel,const Direction facingDir,const float daggerFrameDuration,const float daggerStabDistance,const HorizontalFlip horizontalFlip,const DirectionOffsets offsets,bool friendly,Pixel col)
|
||||||
|
:Bullet(sourceMonster.GetPos(),{},radius,damage,"dagger_stab.png",upperLevel,false,daggerFrameDuration*ANIMATION_DATA["dagger_stab.png"].GetFrameCountBasedOnAnimationStyle(),true,friendly,col),
|
||||||
|
sourceMonster(sourceMonster),frameDuration(daggerFrameDuration),daggerStabDistance(daggerStabDistance),facingDir(facingDir),daggerPositionOffsets(offsets),horizontalFlip(horizontalFlip){}
|
||||||
|
void DaggerStab::Update(float fElapsedTime){
|
||||||
|
ANIMATION_DATA["dagger_stab.png"].ChangeFrameDuration(frameDuration);
|
||||||
|
#pragma region Dagger Position Offset
|
||||||
|
vf2d daggerOffset=daggerPositionOffsets.offsets[facingDir];
|
||||||
|
if(horizontalFlip==HorizontalFlip::FLIPPED)daggerOffset.x*=-1;
|
||||||
|
pos=sourceMonster.GetPos()+daggerOffset;
|
||||||
|
#pragma endregion
|
||||||
|
#pragma region Dagger stabbing
|
||||||
|
if(lifetime<=ANIMATION_DATA["dagger_stab.png"].GetTotalAnimationDuration()*0.6667f&&
|
||||||
|
lifetime>=ANIMATION_DATA["dagger_stab.png"].GetTotalAnimationDuration()*0.3333f){
|
||||||
|
switch(facingDir){
|
||||||
|
case Direction::NORTH:{
|
||||||
|
pos+=vf2d{0,-daggerStabDistance};
|
||||||
|
}break;
|
||||||
|
case Direction::EAST:{
|
||||||
|
pos+=vf2d{daggerStabDistance,0};
|
||||||
|
}break;
|
||||||
|
case Direction::SOUTH:{
|
||||||
|
pos+=vf2d{0,daggerStabDistance};
|
||||||
|
}break;
|
||||||
|
case Direction::WEST:{
|
||||||
|
pos+=vf2d{-daggerStabDistance,0};
|
||||||
|
}break;
|
||||||
|
default:ERR(std::format("WARNING! Unknown direction value {} was supplied! THIS SHOULD NOT BE HAPPENING!",int(facingDir)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#pragma endregion
|
||||||
|
#pragma region Dagger rotation handling
|
||||||
|
switch(facingDir){
|
||||||
|
case Direction::NORTH:{
|
||||||
|
vel={0,-0.001f};
|
||||||
|
}break;
|
||||||
|
case Direction::EAST:{
|
||||||
|
vel={0.001f,0};
|
||||||
|
}break;
|
||||||
|
case Direction::SOUTH:{
|
||||||
|
vel={0,0.001f};
|
||||||
|
}break;
|
||||||
|
case Direction::WEST:{
|
||||||
|
vel={-0.001f,0};
|
||||||
|
}break;
|
||||||
|
default:ERR(std::format("WARNING! Unknown direction value {} was supplied! THIS SHOULD NOT BE HAPPENING!",int(facingDir)));
|
||||||
|
}
|
||||||
|
#pragma endregion
|
||||||
|
}
|
||||||
|
bool DaggerStab::PlayerHit(Player*player){
|
||||||
|
deactivated=true;
|
||||||
|
game->AddEffect(std::make_unique<Effect>(pos,0,"lightning_splash_effect.png",upperLevel,player->GetSizeMult()*0.25f,0.25,vf2d{}));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool DaggerStab::MonsterHit(Monster&monster){
|
||||||
|
deactivated=true;
|
||||||
|
game->AddEffect(std::make_unique<Effect>(pos,0,"lightning_splash_effect.png",upperLevel,monster.GetSizeMult()*0.25f,0.25,vf2d{}));
|
||||||
|
return false;
|
||||||
|
}
|
@ -39,6 +39,7 @@ All rights reserved.
|
|||||||
#include "DEFINES.h"
|
#include "DEFINES.h"
|
||||||
#include "Monster.h"
|
#include "Monster.h"
|
||||||
#include "MonsterStrategyHelpers.h"
|
#include "MonsterStrategyHelpers.h"
|
||||||
|
#include "BulletTypes.h"
|
||||||
/*
|
/*
|
||||||
Attack Strategie:
|
Attack Strategie:
|
||||||
Runs infront of player,
|
Runs infront of player,
|
||||||
@ -49,6 +50,7 @@ and either slashes with the dagger or stabs with it.
|
|||||||
|
|
||||||
INCLUDE_game
|
INCLUDE_game
|
||||||
INCLUDE_ANIMATION_DATA
|
INCLUDE_ANIMATION_DATA
|
||||||
|
INCLUDE_BULLET_LIST
|
||||||
using A=Attribute;
|
using A=Attribute;
|
||||||
|
|
||||||
void Monster::STRATEGY::GOBLIN_DAGGER(Monster&m,float fElapsedTime,std::string strategy){
|
void Monster::STRATEGY::GOBLIN_DAGGER(Monster&m,float fElapsedTime,std::string strategy){
|
||||||
@ -74,6 +76,7 @@ void Monster::STRATEGY::GOBLIN_DAGGER(Monster&m,float fElapsedTime,std::string s
|
|||||||
auto SetFacingAnimation=[&](ANIMATION_OFFSET animation,vf2d target){
|
auto SetFacingAnimation=[&](ANIMATION_OFFSET animation,vf2d target){
|
||||||
m.PerformOtherAnimation(int(animation)+int(m.GetFacingDirectionToTarget(target)));
|
m.PerformOtherAnimation(int(animation)+int(m.GetFacingDirectionToTarget(target)));
|
||||||
};
|
};
|
||||||
|
auto IsSpriteFlipped=[&](){return m.GetFacingDirection()==RIGHT;};
|
||||||
|
|
||||||
using enum ANIMATION_OFFSET;
|
using enum ANIMATION_OFFSET;
|
||||||
switch(m.phase){
|
switch(m.phase){
|
||||||
@ -102,7 +105,10 @@ void Monster::STRATEGY::GOBLIN_DAGGER(Monster&m,float fElapsedTime,std::string s
|
|||||||
m.phase=RECOVERY;
|
m.phase=RECOVERY;
|
||||||
switch(m.I(A::ATTACK_TYPE)){
|
switch(m.I(A::ATTACK_TYPE)){
|
||||||
case STAB:{
|
case STAB:{
|
||||||
SetFacingAnimation(STAB_ANIMATION,game->GetPlayer()->GetPos());
|
vf2d stabTarget=game->GetPlayer()->GetPos();
|
||||||
|
SetFacingAnimation(STAB_ANIMATION,stabTarget);
|
||||||
|
CreateBullet(DaggerStab)(m,ConfigFloat("Dagger Hit Radius"),m.GetAttack(),m.OnUpperLevel(),m.GetFacingDirectionToTarget(stabTarget),ConfigFloat("Dagger Frame Duration"),ConfigFloat("Dagger Stab Distance"),IsSpriteFlipped()?DaggerStab::HorizontalFlip::FLIPPED:DaggerStab::HorizontalFlip::NONE,
|
||||||
|
DaggerStab::DirectionOffsets{ConfigVec("Dagger Up Offset"),ConfigVec("Dagger Down Offset"),ConfigVec("Dagger Left Offset")})EndBullet;
|
||||||
}break;
|
}break;
|
||||||
case SLASH:{
|
case SLASH:{
|
||||||
SetFacingAnimation(SLASH_ANIMATION,game->GetPlayer()->GetPos());
|
SetFacingAnimation(SLASH_ANIMATION,game->GetPlayer()->GetPos());
|
||||||
|
@ -219,6 +219,7 @@ private:
|
|||||||
static int _GetInt(Monster&m,std::string param,std::string strategy,int index=0);
|
static int _GetInt(Monster&m,std::string param,std::string strategy,int index=0);
|
||||||
static float _GetFloat(Monster&m,std::string param,std::string strategy,int index=0);
|
static float _GetFloat(Monster&m,std::string param,std::string strategy,int index=0);
|
||||||
static Pixel _GetPixel(Monster&m,std::string param,std::string strategy,int index=0);
|
static Pixel _GetPixel(Monster&m,std::string param,std::string strategy,int index=0);
|
||||||
|
static vf2d _GetVec(Monster&m,std::string param,std::string strategy,int index=0);
|
||||||
static const std::string&_GetString(Monster&m,std::string param,std::string strategy,int index=0);
|
static const std::string&_GetString(Monster&m,std::string param,std::string strategy,int index=0);
|
||||||
static datafile _Get(Monster&m,std::string param,std::string strategy);
|
static datafile _Get(Monster&m,std::string param,std::string strategy);
|
||||||
static void RUN_STRATEGY(Monster&m,float fElapsedTime);
|
static void RUN_STRATEGY(Monster&m,float fElapsedTime);
|
||||||
|
@ -40,7 +40,9 @@ All rights reserved.
|
|||||||
#define ConfigFloat(param) _GetFloat(m,param,strategy)
|
#define ConfigFloat(param) _GetFloat(m,param,strategy)
|
||||||
#define ConfigPixel(param) _GetPixel(m,param,strategy)
|
#define ConfigPixel(param) _GetPixel(m,param,strategy)
|
||||||
#define ConfigString(param) _GetString(m,param,strategy)
|
#define ConfigString(param) _GetString(m,param,strategy)
|
||||||
|
#define ConfigVec(param) _GetVec(m,param,strategy)
|
||||||
#define Config(param) _Get(m,param,strategy)
|
#define Config(param) _Get(m,param,strategy)
|
||||||
#define ConfigIntArr(param,ind) _GetInt(m,param,strategy,ind)
|
#define ConfigIntArr(param,ind) _GetInt(m,param,strategy,ind)
|
||||||
#define ConfigFloatArr(param,ind) _GetFloat(m,param,strategy,ind)
|
#define ConfigFloatArr(param,ind) _GetFloat(m,param,strategy,ind)
|
||||||
#define ConfigStringArr(param,ind) _GetString(m,param,strategy,ind)
|
#define ConfigStringArr(param,ind) _GetString(m,param,strategy,ind)
|
||||||
|
#define ConfigVecArr(param,ind) _GetVec(m,param,strategy,ind)
|
@ -89,6 +89,16 @@ const std::string&Monster::STRATEGY::_GetString(Monster&m,std::string param,std:
|
|||||||
return DATA["MonsterStrategy"][strategy].GetProperty(param).GetString(index);
|
return DATA["MonsterStrategy"][strategy].GetProperty(param).GetString(index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
vf2d Monster::STRATEGY::_GetVec(Monster&m,std::string param,std::string strategy,int index){
|
||||||
|
if(m.IsNPC()&&DATA["NPCs"][m.name].HasProperty(param)){
|
||||||
|
return {DATA["NPCs"][m.name].GetProperty(param).GetReal(index),DATA["NPCs"][m.name].GetProperty(param).GetReal(index+1)};
|
||||||
|
}else
|
||||||
|
if(!m.IsNPC()&&DATA["Monsters"][m.name].HasProperty(param)){
|
||||||
|
return {DATA["Monsters"][m.name].GetProperty(param).GetReal(index),DATA["Monsters"][m.name].GetProperty(param).GetReal(index+1)};
|
||||||
|
} else {
|
||||||
|
return {DATA["MonsterStrategy"][strategy].GetProperty(param).GetReal(index),DATA["MonsterStrategy"][strategy].GetProperty(param).GetReal(index+1)};
|
||||||
|
}
|
||||||
|
}
|
||||||
datafile Monster::STRATEGY::_Get(Monster&m,std::string param,std::string strategy){
|
datafile Monster::STRATEGY::_Get(Monster&m,std::string param,std::string strategy){
|
||||||
if(m.IsNPC()&&DATA["NPCs"][m.name].HasProperty(param)){
|
if(m.IsNPC()&&DATA["NPCs"][m.name].HasProperty(param)){
|
||||||
return DATA["NPCs"][m.name].GetProperty(param);
|
return DATA["NPCs"][m.name].GetProperty(param);
|
||||||
|
@ -39,7 +39,7 @@ All rights reserved.
|
|||||||
#define VERSION_MAJOR 1
|
#define VERSION_MAJOR 1
|
||||||
#define VERSION_MINOR 2
|
#define VERSION_MINOR 2
|
||||||
#define VERSION_PATCH 0
|
#define VERSION_PATCH 0
|
||||||
#define VERSION_BUILD 9027
|
#define VERSION_BUILD 9033
|
||||||
|
|
||||||
#define stringify(a) stringify_(a)
|
#define stringify(a) stringify_(a)
|
||||||
#define stringify_(a) #a
|
#define stringify_(a) #a
|
||||||
|
@ -562,5 +562,19 @@ MonsterStrategy
|
|||||||
|
|
||||||
# Amount of time where nothing happens after an attack.
|
# Amount of time where nothing happens after an attack.
|
||||||
Attack Recovery Time = 1.0s
|
Attack Recovery Time = 1.0s
|
||||||
|
|
||||||
|
# Number of pixels from the dagger's center that the player would be hit by.
|
||||||
|
Dagger Hit Radius = 12
|
||||||
|
|
||||||
|
# Number of pixels of reach the dagger stab has.
|
||||||
|
Dagger Stab Distance = 2
|
||||||
|
|
||||||
|
# How long between each dagger stab frame.
|
||||||
|
Dagger Frame Duration = 0.1s
|
||||||
|
|
||||||
|
# Offset for the dagger stab effect per direction from the monster's center.
|
||||||
|
Dagger Up Offset = 6,-5
|
||||||
|
Dagger Down Offset = -5,11
|
||||||
|
Dagger Left Offset = -10,6
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -86,6 +86,7 @@ Images
|
|||||||
GFX_CustomFont = font.png
|
GFX_CustomFont = font.png
|
||||||
GFX_Vignette = vignette.png
|
GFX_Vignette = vignette.png
|
||||||
GFX_Checkmark = checkmark.png
|
GFX_Checkmark = checkmark.png
|
||||||
|
GFX_DaggerStab = dagger_stab.png
|
||||||
|
|
||||||
# Ability Icons
|
# Ability Icons
|
||||||
GFX_Warrior_BattleCry_Icon = Ability Icons/battlecry.png
|
GFX_Warrior_BattleCry_Icon = Ability Icons/battlecry.png
|
||||||
|
BIN
Adventures in Lestoria/assets/dagger_stab.png
Normal file
BIN
Adventures in Lestoria/assets/dagger_stab.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 712 B |
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
@ -116,6 +116,11 @@ namespace olc::utils::Animate2D
|
|||||||
m_nStyle = nStyle;
|
m_nStyle = nStyle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void ChangeFrameDuration(const float fFrameDuration){
|
||||||
|
m_fFrameDuration = fFrameDuration;
|
||||||
|
m_fFrameRate = 1.0f / m_fFrameDuration;
|
||||||
|
}
|
||||||
|
|
||||||
// Adds a frame to this sequence
|
// Adds a frame to this sequence
|
||||||
inline void AddFrame(const Frame& frame)
|
inline void AddFrame(const Frame& frame)
|
||||||
{
|
{
|
||||||
@ -150,6 +155,21 @@ namespace olc::utils::Animate2D
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline const size_t GetFrameCountBasedOnAnimationStyle()const{
|
||||||
|
switch (m_nStyle)
|
||||||
|
{
|
||||||
|
case Style::Repeat:
|
||||||
|
case Style::OneShot:
|
||||||
|
return m_vFrames.size();
|
||||||
|
case Style::PingPong:
|
||||||
|
case Style::Reverse: //These two require twice as much time (minus one frame) to complete a full animation cycle.
|
||||||
|
return m_vFrames.size()*2.f-1;
|
||||||
|
default:
|
||||||
|
ERR(std::format("WARNING! Animation style {} was not found! THIS SHOULD NOT BE HAPPENING!",int(m_nStyle)));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
inline const size_t ConvertTimeToFrame(const float fTime) const
|
inline const size_t ConvertTimeToFrame(const float fTime) const
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user