Add missing item icons (placeholders). Add mounted parrot to Pirate Captain. Release Build 11649.

DynamicItemDescriptions
sigonasr2 6 months ago
parent d432966e3e
commit 5f63f23635
  1. 8
      Adventures in Lestoria/Animation.cpp
  2. 9
      Adventures in Lestoria/Goblin_Boar_Rider.cpp
  3. 11
      Adventures in Lestoria/Monster.cpp
  4. 2
      Adventures in Lestoria/Monster.h
  5. 10
      Adventures in Lestoria/Pirate_Captain.cpp
  6. 2
      Adventures in Lestoria/Version.h
  7. 9
      Adventures in Lestoria/assets/Campaigns/3_1.tmx
  8. 5
      Adventures in Lestoria/assets/config/MonsterStrategies.txt
  9. 8
      Adventures in Lestoria/assets/config/Monsters.txt
  10. 1
      Adventures in Lestoria/assets/config/gfx/gfx.txt
  11. 14
      Adventures in Lestoria/assets/config/items/ItemDatabase.txt
  12. BIN
      Adventures in Lestoria/assets/gamepack.pak
  13. BIN
      Adventures in Lestoria/assets/items/Bandana.png
  14. BIN
      Adventures in Lestoria/assets/items/Blue Gemstone.png
  15. BIN
      Adventures in Lestoria/assets/items/Empty Leather Pouch.png
  16. BIN
      Adventures in Lestoria/assets/items/Giant Claw.png
  17. BIN
      Adventures in Lestoria/assets/items/Large Shell.png
  18. BIN
      Adventures in Lestoria/assets/items/Rum Bottle.png
  19. BIN
      Adventures in Lestoria/assets/items/Shell.png
  20. BIN
      Adventures in Lestoria/assets/items/White Feather.png
  21. BIN
      Adventures in Lestoria/assets/items/Worm Skin.png
  22. BIN
      x64/Release/Adventures in Lestoria.exe

@ -433,6 +433,14 @@ void sig::Animation::InitializeAnimations(){
ANIMATION_DATA[std::format("GOBLIN_BOW_ATTACK_{}",animationIndex)]=mountShootAnimation; 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 #pragma region Trapper Target Mark Debuff
AnimationData targetAnimData{.frameDuration{0.1f},.style{Animate2D::Style::Repeat}}; AnimationData targetAnimData{.frameDuration{0.1f},.style{Animate2D::Style::Repeat}};
Animate2D::FrameSequence targetAnim(targetAnimData.frameDuration,targetAnimData.style); 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)){ if(!m.B(A::INITIALIZED_MOUNTED_MONSTER)){
m.B(A::INITIALIZED_MOUNTED_MONSTER)=true; m.B(A::INITIALIZED_MOUNTED_MONSTER)=true;
m.F(A::PERCEPTION_LEVEL)=ConfigFloat("Starting Perception Level"); m.F(A::PERCEPTION_LEVEL)=ConfigFloat("Starting Perception Level");
m.internal_mounted_animState=Animate2D::AnimationState{};
m.mounted_animation=Animate2D::Animation<std::string>{}; m.mounted_animation=Animate2D::Animation<std::string>{};
for(bool firstAnimation=true;const std::string&animation:Config("Imposed Monster Animations").GetValues()){ for(bool firstAnimation=true;const std::string&animation:Config("Imposed Monster Animations").GetValues()){
m.mounted_animation.value().AddState(animation,ANIMATION_DATA.at(animation)); 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; firstAnimation=false;
} }
m.mountedSprOffset=ConfigVec("Imposed Monster Offset"); 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"); 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::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.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 }else
if(m.F(A::ATTACK_COOLDOWN)>=ConfigFloat("Attack Reload Time")){ if(m.F(A::ATTACK_COOLDOWN)>=ConfigFloat("Attack Reload Time")){
m.F(A::SHOOT_TIMER)=ConfigFloat("Attack Windup 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); 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; randomFrameOffset=0;
attackedByPlayer=false; attackedByPlayer=false;
return true; 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))); 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{ }else{
if(diff.x>0){ if(diff.x>0){
facingDirection=Direction::WEST; facingDirection=Direction::WEST;
@ -1316,13 +1316,12 @@ const bool Monster::HasFourWaySprites()const{
} }
const bool Monster::HasMountedMonster()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 mounted_animation.has_value();
return internal_mounted_animState.has_value()&&mounted_animation.has_value();
} }
const std::optional<const Animate2D::Frame>Monster::GetMountedFrame()const{ const std::optional<const Animate2D::Frame>Monster::GetMountedFrame()const{
if(!HasMountedMonster())return {}; 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) 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){ void Monster::Heal(const int healAmt,const bool displayDamageNumber){
hp=std::clamp(hp+healAmt,0,int(GetMaxHealth())); 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{ const float Monster::GetModdedStatBonuses(std::string_view stat)const{

@ -255,7 +255,7 @@ private:
Animate2D::Animation<std::string>animation; Animate2D::Animation<std::string>animation;
Animate2D::AnimationState internal_animState; Animate2D::AnimationState internal_animState;
std::optional<Animate2D::Animation<std::string>>mounted_animation; 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 randomFrameOffset=0.f;
float deathTimer=0.f; float deathTimer=0.f;
float monsterHurtSoundCooldown=0.f; float monsterHurtSoundCooldown=0.f;

@ -45,6 +45,7 @@ All rights reserved.
using A=Attribute; using A=Attribute;
INCLUDE_game INCLUDE_game
INCLUDE_ANIMATION_DATA
void Monster::STRATEGY::PIRATE_CAPTAIN(Monster&m,float fElapsedTime,std::string strategy){ void Monster::STRATEGY::PIRATE_CAPTAIN(Monster&m,float fElapsedTime,std::string strategy){
enum PhaseName{ enum PhaseName{
@ -58,6 +59,15 @@ void Monster::STRATEGY::PIRATE_CAPTAIN(Monster&m,float fElapsedTime,std::string
switch(m.phase){ switch(m.phase){
case INIT:{ case INIT:{
m.F(A::TARGET_TIMER)=ConfigFloat("Shooting Frequency"); 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; m.phase=MOVE;
}break; }break;
case MOVE:{ case MOVE:{

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

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?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> <properties>
<property name="Background Music" propertytype="BGM" value="mountain"/> <property name="Background Music" propertytype="BGM" value="mountain"/>
<property name="Level Type" type="int" propertytype="LevelType" value="0"/> <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"> <object id="8" name="Spawn Zone" type="SpawnGroup" x="180" y="1326" width="426" height="306">
<ellipse/> <ellipse/>
</object> </object>
<object id="13" template="../maps/Monsters/Pirate Buccaneer.tx" x="492" y="1458"> <object id="15" template="../maps/Monsters/Pirate Captain.tx" x="504" y="1500">
<properties>
<property name="spawner" type="object" value="8"/>
</properties>
</object>
<object id="14" template="../maps/Monsters/Goblin (Bow).tx" x="474" y="1530">
<properties> <properties>
<property name="spawner" type="object" value="8"/> <property name="spawner" type="object" value="8"/>
</properties> </properties>

@ -1091,6 +1091,11 @@ MonsterStrategy
} }
Pirate Captain 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 Shooting Frequency = 6s
Shoot Max Range = 400 Shoot Max Range = 400
Shooting Chance = 60% 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 # 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 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 Animations
{ {
@ -1433,10 +1429,6 @@ Monsters
Dagger Left Offset = -8,-2 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 Animations
{ {

@ -93,6 +93,7 @@ Images
GFX_GoblinSwordSlash = goblin_sword_slash.png GFX_GoblinSwordSlash = goblin_sword_slash.png
GFX_GoblinArrow = goblin_arrow.png GFX_GoblinArrow = goblin_arrow.png
GFX_GoblinBowForeground = monsters/commercial_assets/Goblin (Bow)_foreground.png GFX_GoblinBowForeground = monsters/commercial_assets/Goblin (Bow)_foreground.png
GFX_ParrotForeground = monsters/commercial_assets/Parrot_foreground.png
GFX_GoblinBomb = goblin_bomb.png GFX_GoblinBomb = goblin_bomb.png
GFX_GoblinBombFuse = goblin_bomb_fuse.png GFX_GoblinBombFuse = goblin_bomb_fuse.png
GFX_BombBoom = bomb_boom.png GFX_BombBoom = bomb_boom.png

@ -327,9 +327,9 @@ ItemDatabase
ItemCategory = Materials ItemCategory = Materials
SellValue = 22 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 ItemCategory = Materials
SellValue = 26 SellValue = 26
} }
@ -341,19 +341,19 @@ ItemDatabase
} }
Giant Claw 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 ItemCategory = Materials
SellValue = 38 SellValue = 38
} }
Worm Skin 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 ItemCategory = Materials
SellValue = 24 SellValue = 24
} }
White Feather 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 ItemCategory = Materials
SellValue = 17 SellValue = 17
} }
@ -365,13 +365,13 @@ ItemDatabase
} }
Shell Shell
{ {
Description = a beautiful Shell, found at a beach. Description = A beautiful Shell, found at a beach.
ItemCategory = Materials ItemCategory = Materials
SellValue = 9 SellValue = 9
} }
Large Shell Large Shell
{ {
Description = a big beautiful Shell, found at a beach. Description = A big beautiful shell, found at a beach.
ItemCategory = Materials ItemCategory = Materials
SellValue = 14 SellValue = 14
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

Loading…
Cancel
Save