Add missing item icons (placeholders). Add mounted parrot to Pirate Captain. Release Build 11649.
@ -433,6 +433,14 @@ void sig::Animation::InitializeAnimations(){
|
||||
ANIMATION_DATA[std::format("GOBLIN_BOW_ATTACK_{}",animationIndex)]=mountShootAnimation;
|
||||
}
|
||||
|
||||
Animate2D::FrameSequence parrot_sit_n,parrot_sit_e,parrot_sit_s,parrot_sit_w;
|
||||
//Idle sequences for the sitting parrot.
|
||||
for(int animationIndex=0;animationIndex<4;animationIndex++){
|
||||
Animate2D::FrameSequence mountAnimation{0.6f};
|
||||
mountAnimation.AddFrame(Animate2D::Frame{&GFX["monsters/commercial_assets/Parrot_foreground.png"],{{0,animationIndex*48},{48,48}}});
|
||||
ANIMATION_DATA[std::format("PARROT_MOUNTED_{}",animationIndex)]=mountAnimation;
|
||||
}
|
||||
|
||||
#pragma region Trapper Target Mark Debuff
|
||||
AnimationData targetAnimData{.frameDuration{0.1f},.style{Animate2D::Style::Repeat}};
|
||||
Animate2D::FrameSequence targetAnim(targetAnimData.frameDuration,targetAnimData.style);
|
||||
|
||||
@ -52,17 +52,16 @@ void Monster::STRATEGY::GOBLIN_BOAR_RIDER(Monster&m,float fElapsedTime,std::stri
|
||||
if(!m.B(A::INITIALIZED_MOUNTED_MONSTER)){
|
||||
m.B(A::INITIALIZED_MOUNTED_MONSTER)=true;
|
||||
m.F(A::PERCEPTION_LEVEL)=ConfigFloat("Starting Perception Level");
|
||||
m.internal_mounted_animState=Animate2D::AnimationState{};
|
||||
m.mounted_animation=Animate2D::Animation<std::string>{};
|
||||
|
||||
for(bool firstAnimation=true;const std::string&animation:Config("Imposed Monster Animations").GetValues()){
|
||||
m.mounted_animation.value().AddState(animation,ANIMATION_DATA.at(animation));
|
||||
|
||||
if(firstAnimation)m.mounted_animation.value().ChangeState(m.internal_mounted_animState.value(),animation);
|
||||
if(firstAnimation)m.mounted_animation.value().ChangeState(m.internal_mounted_animState,animation);
|
||||
firstAnimation=false;
|
||||
}
|
||||
m.mountedSprOffset=ConfigVec("Imposed Monster Offset");
|
||||
m.deathData.push_back(DeathSpawnInfo{ConfigString("Spawned Monster"),1U});
|
||||
m.deathData.emplace_back(ConfigString("Spawned Monster"),1U);
|
||||
}
|
||||
|
||||
BOAR(m,fElapsedTime,"Boar");
|
||||
@ -79,11 +78,11 @@ void Monster::STRATEGY::GOBLIN_BOAR_RIDER(Monster&m,float fElapsedTime,std::stri
|
||||
|
||||
m.F(A::ATTACK_COOLDOWN)=0.f;
|
||||
m.F(A::PERCEPTION_LEVEL)=std::min(ConfigFloat("Maximum Perception Level"),m.F(A::PERCEPTION_LEVEL)+ConfigFloat("Perception Level Increase"));
|
||||
m.mounted_animation.value().ChangeState(m.internal_mounted_animState.value(),std::format("GOBLIN_BOW_MOUNTED_{}",int(m.GetFacingDirection())));
|
||||
m.mounted_animation.value().ChangeState(m.internal_mounted_animState,std::format("GOBLIN_BOW_MOUNTED_{}",int(m.GetFacingDirection())));
|
||||
}
|
||||
}else
|
||||
if(m.F(A::ATTACK_COOLDOWN)>=ConfigFloat("Attack Reload Time")){
|
||||
m.F(A::SHOOT_TIMER)=ConfigFloat("Attack Windup Time");
|
||||
m.mounted_animation.value().ChangeState(m.internal_mounted_animState.value(),std::format("GOBLIN_BOW_ATTACK_{}",int(m.GetFacingDirection())));
|
||||
m.mounted_animation.value().ChangeState(m.internal_mounted_animState,std::format("GOBLIN_BOW_ATTACK_{}",int(m.GetFacingDirection())));
|
||||
}
|
||||
}
|
||||
@ -401,7 +401,7 @@ bool Monster::Update(float fElapsedTime){
|
||||
}
|
||||
}
|
||||
animation.UpdateState(internal_animState,randomFrameOffset+fElapsedTime);
|
||||
if(HasMountedMonster())mounted_animation.value().UpdateState(internal_mounted_animState.value(),fElapsedTime);
|
||||
if(HasMountedMonster())mounted_animation.value().UpdateState(internal_mounted_animState,fElapsedTime);
|
||||
randomFrameOffset=0;
|
||||
attackedByPlayer=false;
|
||||
return true;
|
||||
@ -446,7 +446,7 @@ void Monster::UpdateFacingDirection(vf2d facingTargetPoint){
|
||||
}
|
||||
}
|
||||
animation.ModifyDisplaySprite(internal_animState,std::format("{}_{}",animation.currentStateName.substr(0,animation.currentStateName.length()-2),int(facingDirection)));
|
||||
if(HasMountedMonster())mounted_animation.value().ModifyDisplaySprite(internal_mounted_animState.value(),std::format("{}_{}",mounted_animation.value().currentStateName.substr(0,mounted_animation.value().currentStateName.length()-2),int(facingDirection)));
|
||||
if(HasMountedMonster())mounted_animation.value().ModifyDisplaySprite(internal_mounted_animState,std::format("{}_{}",mounted_animation.value().currentStateName.substr(0,mounted_animation.value().currentStateName.length()-2),int(facingDirection)));
|
||||
}else{
|
||||
if(diff.x>0){
|
||||
facingDirection=Direction::WEST;
|
||||
@ -1316,13 +1316,12 @@ const bool Monster::HasFourWaySprites()const{
|
||||
}
|
||||
|
||||
const bool Monster::HasMountedMonster()const{
|
||||
if(internal_mounted_animState.has_value()^mounted_animation.has_value())ERR("WARNING! The internal mounted animation state and the mounted animation variables are not matching! They should both either be on or both be off! THIS SHOULD NOT BE HAPPENING!");
|
||||
return internal_mounted_animState.has_value()&&mounted_animation.has_value();
|
||||
return mounted_animation.has_value();
|
||||
}
|
||||
|
||||
const std::optional<const Animate2D::Frame>Monster::GetMountedFrame()const{
|
||||
if(!HasMountedMonster())return {};
|
||||
else return mounted_animation.value().GetFrame(internal_mounted_animState.value());
|
||||
else return mounted_animation.value().GetFrame(internal_mounted_animState);
|
||||
}
|
||||
|
||||
DeathSpawnInfo::DeathSpawnInfo(const std::string_view monsterName,const uint8_t spawnAmt,const vf2d spawnOffset)
|
||||
@ -1413,7 +1412,7 @@ const bool Monster::_DealTrueDamage(const uint32_t damageAmt,HurtFlag::HurtFlag
|
||||
|
||||
void Monster::Heal(const int healAmt,const bool displayDamageNumber){
|
||||
hp=std::clamp(hp+healAmt,0,int(GetMaxHealth()));
|
||||
if(displayDamageNumber)DAMAGENUMBER_LIST.emplace_back(std::make_shared<DamageNumber>(GetPos(),healAmt,false,DamageNumberType::HEALTH_GAIN);
|
||||
if(displayDamageNumber)DAMAGENUMBER_LIST.emplace_back(std::make_shared<DamageNumber>(GetPos(),healAmt,false,DamageNumberType::HEALTH_GAIN));
|
||||
}
|
||||
|
||||
const float Monster::GetModdedStatBonuses(std::string_view stat)const{
|
||||
|
||||
@ -255,7 +255,7 @@ private:
|
||||
Animate2D::Animation<std::string>animation;
|
||||
Animate2D::AnimationState internal_animState;
|
||||
std::optional<Animate2D::Animation<std::string>>mounted_animation;
|
||||
std::optional<Animate2D::AnimationState>internal_mounted_animState;
|
||||
Animate2D::AnimationState internal_mounted_animState;
|
||||
float randomFrameOffset=0.f;
|
||||
float deathTimer=0.f;
|
||||
float monsterHurtSoundCooldown=0.f;
|
||||
|
||||
@ -45,6 +45,7 @@ All rights reserved.
|
||||
using A=Attribute;
|
||||
|
||||
INCLUDE_game
|
||||
INCLUDE_ANIMATION_DATA
|
||||
|
||||
void Monster::STRATEGY::PIRATE_CAPTAIN(Monster&m,float fElapsedTime,std::string strategy){
|
||||
enum PhaseName{
|
||||
@ -58,6 +59,15 @@ void Monster::STRATEGY::PIRATE_CAPTAIN(Monster&m,float fElapsedTime,std::string
|
||||
switch(m.phase){
|
||||
case INIT:{
|
||||
m.F(A::TARGET_TIMER)=ConfigFloat("Shooting Frequency");
|
||||
m.mounted_animation=Animate2D::Animation<std::string>{};
|
||||
for(bool firstAnimation=true;const std::string&animation:Config("Imposed Monster Animations").GetValues()){
|
||||
m.mounted_animation.value().AddState(animation,ANIMATION_DATA.at(animation));
|
||||
|
||||
if(firstAnimation)m.mounted_animation.value().ChangeState(m.internal_mounted_animState,animation);
|
||||
firstAnimation=false;
|
||||
}
|
||||
m.mountedSprOffset=ConfigVec("Imposed Monster Offset");
|
||||
m.deathData.emplace_back(ConfigString("Spawned Monster"),1U);
|
||||
m.phase=MOVE;
|
||||
}break;
|
||||
case MOVE:{
|
||||
|
||||
@ -39,7 +39,7 @@ All rights reserved.
|
||||
#define VERSION_MAJOR 1
|
||||
#define VERSION_MINOR 3
|
||||
#define VERSION_PATCH 0
|
||||
#define VERSION_BUILD 11638
|
||||
#define VERSION_BUILD 11649
|
||||
|
||||
#define stringify(a) stringify_(a)
|
||||
#define stringify_(a) #a
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.10.2" class="Map" orientation="orthogonal" renderorder="right-down" width="335" height="165" tilewidth="24" tileheight="24" infinite="0" nextlayerid="8" nextobjectid="15">
|
||||
<map version="1.10" tiledversion="1.10.2" class="Map" orientation="orthogonal" renderorder="right-down" width="335" height="165" tilewidth="24" tileheight="24" infinite="0" nextlayerid="8" nextobjectid="16">
|
||||
<properties>
|
||||
<property name="Background Music" propertytype="BGM" value="mountain"/>
|
||||
<property name="Level Type" type="int" propertytype="LevelType" value="0"/>
|
||||
@ -865,12 +865,7 @@
|
||||
<object id="8" name="Spawn Zone" type="SpawnGroup" x="180" y="1326" width="426" height="306">
|
||||
<ellipse/>
|
||||
</object>
|
||||
<object id="13" template="../maps/Monsters/Pirate Buccaneer.tx" x="492" y="1458">
|
||||
<properties>
|
||||
<property name="spawner" type="object" value="8"/>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="14" template="../maps/Monsters/Goblin (Bow).tx" x="474" y="1530">
|
||||
<object id="15" template="../maps/Monsters/Pirate Captain.tx" x="504" y="1500">
|
||||
<properties>
|
||||
<property name="spawner" type="object" value="8"/>
|
||||
</properties>
|
||||
|
||||
@ -1091,6 +1091,11 @@ MonsterStrategy
|
||||
}
|
||||
Pirate Captain
|
||||
{
|
||||
|
||||
Imposed Monster Offset = 0,0
|
||||
Imposed Monster Animations = PARROT_MOUNTED_0,PARROT_MOUNTED_1,PARROT_MOUNTED_2,PARROT_MOUNTED_3,
|
||||
Spawned Monster = Parrot
|
||||
|
||||
Shooting Frequency = 6s
|
||||
Shoot Max Range = 400
|
||||
Shooting Chance = 60%
|
||||
|
||||
@ -665,10 +665,6 @@ Monsters
|
||||
|
||||
# Setting this to true means every four rows indicates one animation, the ordering of the directions is: NORTH, EAST, SOUTH, WEST
|
||||
4-Way Spritesheet = True
|
||||
|
||||
# For monsters that have a mounted portion, this will specify the animation to use.
|
||||
Mounted Animation = GOBLIN_BOW_MOUNTED
|
||||
Mounted Animation Offset = 0,-10
|
||||
|
||||
Animations
|
||||
{
|
||||
@ -1433,10 +1429,6 @@ Monsters
|
||||
Dagger Left Offset = -8,-2
|
||||
|
||||
########
|
||||
|
||||
# For monsters that have a mounted portion, this will specify the animation to use.
|
||||
Mounted Animation = PARROT_MOUNTED
|
||||
Mounted Animation Offset = 0,-10
|
||||
|
||||
Animations
|
||||
{
|
||||
|
||||
@ -93,6 +93,7 @@ Images
|
||||
GFX_GoblinSwordSlash = goblin_sword_slash.png
|
||||
GFX_GoblinArrow = goblin_arrow.png
|
||||
GFX_GoblinBowForeground = monsters/commercial_assets/Goblin (Bow)_foreground.png
|
||||
GFX_ParrotForeground = monsters/commercial_assets/Parrot_foreground.png
|
||||
GFX_GoblinBomb = goblin_bomb.png
|
||||
GFX_GoblinBombFuse = goblin_bomb_fuse.png
|
||||
GFX_BombBoom = bomb_boom.png
|
||||
|
||||
@ -327,9 +327,9 @@ ItemDatabase
|
||||
ItemCategory = Materials
|
||||
SellValue = 22
|
||||
}
|
||||
Empty Leather Pouche
|
||||
Empty Leather Pouch
|
||||
{
|
||||
Description = A Pouche to store coins in. This Pirate seems to be not to successful in his craft.
|
||||
Description = A pouch to store coins in. This Pirate seems to be not too successful in his craft.
|
||||
ItemCategory = Materials
|
||||
SellValue = 26
|
||||
}
|
||||
@ -341,19 +341,19 @@ ItemDatabase
|
||||
}
|
||||
Giant Claw
|
||||
{
|
||||
Description = The Giant Claw of a crap that grown up to ist maximum potential.
|
||||
Description = The giant claw of a crab that's grown to its maximum potential.
|
||||
ItemCategory = Materials
|
||||
SellValue = 38
|
||||
}
|
||||
Worm Skin
|
||||
{
|
||||
Description = The Skin feels kinda smooth. Maybe it could be used to craft clothing.
|
||||
Description = The skin feels kinda smooth. Maybe it could be used to craft clothing.
|
||||
ItemCategory = Materials
|
||||
SellValue = 24
|
||||
}
|
||||
White Feather
|
||||
{
|
||||
Description = The Feather is mainly White. But ist tip is actually black.
|
||||
Description = The feather is mainly White. But its tip is actually black.
|
||||
ItemCategory = Materials
|
||||
SellValue = 17
|
||||
}
|
||||
@ -365,13 +365,13 @@ ItemDatabase
|
||||
}
|
||||
Shell
|
||||
{
|
||||
Description = a beautiful Shell, found at a beach.
|
||||
Description = A beautiful Shell, found at a beach.
|
||||
ItemCategory = Materials
|
||||
SellValue = 9
|
||||
}
|
||||
Large Shell
|
||||
{
|
||||
Description = a big beautiful Shell, found at a beach.
|
||||
Description = A big beautiful shell, found at a beach.
|
||||
ItemCategory = Materials
|
||||
SellValue = 14
|
||||
}
|
||||
|
||||
BIN
Adventures in Lestoria/assets/items/Bandana.png
Normal file
|
After Width: | Height: | Size: 699 B |
BIN
Adventures in Lestoria/assets/items/Blue Gemstone.png
Normal file
|
After Width: | Height: | Size: 699 B |
BIN
Adventures in Lestoria/assets/items/Empty Leather Pouch.png
Normal file
|
After Width: | Height: | Size: 699 B |
BIN
Adventures in Lestoria/assets/items/Giant Claw.png
Normal file
|
After Width: | Height: | Size: 699 B |
BIN
Adventures in Lestoria/assets/items/Large Shell.png
Normal file
|
After Width: | Height: | Size: 699 B |
BIN
Adventures in Lestoria/assets/items/Rum Bottle.png
Normal file
|
After Width: | Height: | Size: 699 B |
BIN
Adventures in Lestoria/assets/items/Shell.png
Normal file
|
After Width: | Height: | Size: 699 B |
BIN
Adventures in Lestoria/assets/items/White Feather.png
Normal file
|
After Width: | Height: | Size: 699 B |
BIN
Adventures in Lestoria/assets/items/Worm Skin.png
Normal file
|
After Width: | Height: | Size: 699 B |