diff --git a/.gitignore b/.gitignore
index b0678d5c..9cee0b3d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -424,3 +424,4 @@ desktop.ini
/x64/Unit Testing/assets
/Adventures in Lestoria Tests/x64/Unit Testing
/x64/Unit Testing
+/Adventures in Lestoria/assets/2.10
diff --git a/Adventures in Lestoria/Adventures in Lestoria.vcxproj b/Adventures in Lestoria/Adventures in Lestoria.vcxproj
index 0b369131..50f22e80 100644
--- a/Adventures in Lestoria/Adventures in Lestoria.vcxproj
+++ b/Adventures in Lestoria/Adventures in Lestoria.vcxproj
@@ -1126,6 +1126,7 @@
+
diff --git a/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters b/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters
index 41dddc8f..45eeb963 100644
--- a/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters
+++ b/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters
@@ -1298,6 +1298,9 @@
Documentation
+
+ Documentation\Mechanics
+
diff --git a/Adventures in Lestoria/Chapter_3_Monsters.txt b/Adventures in Lestoria/Chapter_3_Monsters.txt
new file mode 100644
index 00000000..d74bb6b6
--- /dev/null
+++ b/Adventures in Lestoria/Chapter_3_Monsters.txt
@@ -0,0 +1,190 @@
+Pirate
+-Wields a Saber and wears an eye patch, pirate hat, the typical Pirate stereotype.
+
+Animations (5):
+Idle
+Walk
+Slash
+Stab
+Dead
+
+Pirate Marauder
+-Equipped with 2 Swords.
+
+Animations (5):
+Idle
+Walk
+Jump Attack (Plunge)
+Whirlwind Attack (Spinning around frantically)
+Dead
+
+Pirate Buccaneer
+-Equipped with a musket.
+
+Animations (5):
+Idle
+Walk
+Aim
+Firing
+Dead
+
+Pirate Captain
+-Holds a Saber in one hand and a Hand Gun in the other.
+
+Animations (7):
+Idle
+Walk
+Slash using Saber
+Stab using Saber
+Raise + Shoot Handgun
+Drink a bottle of Rum.
+Dead
+
+Parrot
+======
+(Does not require a death animation)
+
+Animations (3):
+Idle
+Fly
+Charge
+
+Crab
+====
+Animations (4):
+Idle
+Sidestep / Crab Walk
+Lifts up pincers and charges
+Dead
+
+Sandworm
+========
+Starts underground (can see silhouette)
+
+Animations (6):
+Idle (Head above ground)
+Dive underground
+Swim in sand
+Rise up from ground
+Shoot/Spit Sand
+Dead
+
+
+Seagull
+=======
+Animations (3):
+Idle
+Flying
+Dead
+
+=================
+
+Pirate
+ Size: 100%
+ Hp: 350
+ Exp: 33
+ Attack: 31
+ Move-Spd: 110%
+
+Equipped with a Saber.
+Same behaviour like Chapter 2 Dagger Goblins.
+
+Pirate Marauder
+ Size: 100%
+ Hp: 500
+ Exp: 39
+ Attack: 43
+ Move-Spd: 125%
+
+ Equipped with 2 Swords.
+Base behaviour like Pirate.
+every 8 seconds chance to do an ability:
+25% & insight of players vision & further then 400 range away: Jump attack on the player 150 radius impact area
+25% & within 700 range of player & further then 400 range away: whirlwind attack, spinning to the players position +60% Move-spd during this attack
+50% continue base behaviour.
+
+Pirate Buccaneer
+ Size: 100%
+ Hp: 430
+ Exp: 37
+ Attack: 45
+ Move-Spd: 100%
+
+ Equipped with a Muskeet.
+ Aim (1.0 Sec) - Lock position (0.3 sec) - Shoot - reload (2 sec) - move if to far away. (trying to stay in 1000 Range)
+
+
+Pirate Captain (+Parrot)
+ Size: 120%
+ Hp: 1050
+ Exp: 59
+ Attack: 55
+ Move-Spd: 95%
+
+1 hand Saber. 1 Hand Gun
+Also Base Pirate behaviour.
+every 6 seconds if range <400 60% chance to stand still for 0.5 seconds - shoot his gun and continue base movement.
+
+Once the Captain dropps below 300 health he pulls out a bottle of Rum and starts drinking. takes 2 seconds and recovers 150 Health. Only triggers once.
+
+When the Pirate Enters the Screen the Parrot is still sitting on its shoulder and starts flying 2 seconds after the enemy is visible.
+The parrot has the same stats and behaviour like chapter 2 Hawks.
+The Parrot doesnt die, instead it gets stunned for 5 seconds on death and then recovers.
+When the Captain dies the Parrot flies away and despawns out of screen.
+
+Crap
+ Size: 60%
+ Hp: 600
+ Exp: 34
+ Attack: 23
+ Move-Spd: 120%
+
+ Side step circles around the player in a 400 range radius.
+ every second running in a circle 20% chance to stop for 0.5 seconds, turn his side towards the player and charges with a pincer attack and runs a bit further to get to 400 range on the other side of the player.
+starts circling the player again.
+
+Giant Crap
+ Size: 180%
+ Hp: 1800
+ Exp: 61
+ Attack: 49
+ Move-Spd: 90%
+
+ Charges player sideways. charges 600 range further then players position.
+ After charge 1 second no moving. then starts next charge building up movespeed over first 2 seconds.
+
+Sandworm
+ Size: 90%
+ Hp: 400
+ Exp: 24
+ Attack: 33
+ Move-Spd: 200% // 0% (stationary on air)
+
+ The sandworm spawns underground.
+ The sandworm ist completly invisible when its underground.
+
+ It moves to a random point within a 400 range around the player. (can be exactly under the player aswell)
+
+ once it reaches it position there is an 300 radisu animation and the player gets sucked in with a 30% movespd effect (
+ Examples:
+ if playing doesnt move it moves with 30% speed into the middle,
+ if moving to the center normal speed +30%
+ if moving out normal speed -30%
+
+ Effect lasts for 3 seconds. If player is in the middle player receives collision damage.
+
+ Worm behaves like Chapter 1 Flower for up to 6 Attacks or if range to player is higher then 1500.
+ Then it burrows down again and repeats.
+
+Seagul
+ Size: 80%
+ Hp: 40
+ Exp: 6
+ Attack: 0
+ Move-Spd: 120%
+When Player gets within 1000 Range Seagul starts flying away. takes 2 seconds to leave the ground. (time needs to be extended if 2 seconds arent enough for a warrior to get in warcry range)
+Despawns once it reaches 4000 Range.
+
+Bosses
+Giant Octopus
+Pirate Captain Ghost
\ No newline at end of file
diff --git a/Adventures in Lestoria/MonsterAttribute.h b/Adventures in Lestoria/MonsterAttribute.h
index 830353db..736fdfa2 100644
--- a/Adventures in Lestoria/MonsterAttribute.h
+++ b/Adventures in Lestoria/MonsterAttribute.h
@@ -142,4 +142,5 @@ enum class Attribute{
CHASE_TIMER,
STONE_TOSS_COUNT,
STONE_TOSS_TIMER,
+ SHOCKWAVE_COLOR,
};
\ No newline at end of file
diff --git a/Adventures in Lestoria/StoneGolem.cpp b/Adventures in Lestoria/StoneGolem.cpp
index 06d7a9bd..9a898e59 100644
--- a/Adventures in Lestoria/StoneGolem.cpp
+++ b/Adventures in Lestoria/StoneGolem.cpp
@@ -105,13 +105,13 @@ void Monster::STRATEGY::STONE_GOLEM(Monster&m,float fElapsedTime,std::string str
const vf2d extendedSmallestCornerPoint{geom2d::line{m.GetPos(),smallestCorner.second}.rpoint((100000.f))};
#pragma endregion
- m.VEC(A::STAGE_POLYGONS).emplace_back(StageMaskPolygon{{largestCorner.second,extendedLargestCornerPoint,extendedSmallestCornerPoint,smallestCorner.second},"safeIndicatorGradient.png",angleToMiddle,PixelLerp(VERY_DARK_BLUE,BLACK,sin(geom2d::pi*game->GetRunTime()*2))});
+ m.VEC(A::STAGE_POLYGONS).emplace_back(StageMaskPolygon{{largestCorner.second,extendedLargestCornerPoint,extendedSmallestCornerPoint,smallestCorner.second},"safeIndicatorGradient.png",angleToMiddle,PixelLerp(Pixel{uint32_t(m.I(A::SHOCKWAVE_COLOR))},BLACK,sin(geom2d::pi*game->GetRunTime()*2))});
});
- m.SetStrategyDrawFunction([&](AiL*game,Monster&m,const std::string&strategyName){
+ m.SetStrategyDrawFunction([](AiL*game,Monster&m,const std::string&strategyName){
std::for_each(m.VEC(A::STAGE_POLYGONS).begin(),m.VEC(A::STAGE_POLYGONS).end(),[&](std::any&data){
StageMaskPolygon&polygon{std::any_cast(data)};
- Pixel newCol{PixelLerp(VERY_DARK_BLUE,BLACK,sin(geom2d::pi*game->GetRunTime()*2)/2.f+0.5f)};
- newCol.a=util::lerp(255.f,0.f,sin(geom2d::pi*game->GetRunTime()*2)/2.f+0.5f);
+ Pixel newCol{PixelLerp(Pixel{uint32_t(m.I(A::SHOCKWAVE_COLOR))},BLACK,sin(geom2d::pi*game->GetRunTime()*2)/2.f+0.5f)};
+ newCol.a=util::lerp(Pixel{uint32_t(m.I(A::SHOCKWAVE_COLOR))}.a,0.f,sin(geom2d::pi*game->GetRunTime()*2)/2.f+0.5f);
polygon.SetBlendColor(newCol);
polygon.Draw();
});
@@ -163,6 +163,7 @@ void Monster::STRATEGY::STONE_GOLEM(Monster&m,float fElapsedTime,std::string str
m.I(A::PATTERN_REPEAT_COUNT)=ConfigInt("Beginning Phase.Repeat Count");
m.F(A::HEALTH_PCT_PHASE)=1.f;
m.F(A::NEXT_HEALTH_PCT_PILLAR_PHASE)=ConfigFloat("Pillar Respawns.Start HP Threshold")/100.f;
+ m.I(A::SHOCKWAVE_COLOR)=ConfigPixel("Shockwave.Danger Area Color").n;
m.phase=SPAWN_PILLAR_PREPARE;
if(ConfigIntArr("Pillar Respawns.Respawn Count",0)