Skip to content

Commit

Permalink
Add XXXAnimsDelay
Browse files Browse the repository at this point in the history
  • Loading branch information
ZivDero committed Nov 27, 2024
1 parent 41efa1c commit 3222cac
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 7 deletions.
5 changes: 5 additions & 0 deletions docs/New-Features-and-Enhancements.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ In `RULES.INI`:
<stage>AnimsMinimum= ; list of integers, the minimum number of animations that can spawn when choosing the random amount for each of the respective entries on the animations list. This list must have the same number of entries as the animations list. Defaults to 1 for each entry.
<stage>AnimsMaximum= ; list of integers, the maximum number of animations that can spawn when choosing the random amount for each of the respective entries on the animations list. This list must have the same number of entries as the animations list. Defaults to 1 for each entry.
<stage>AnimsCount= ; list of integers, the number of animations to spawn for each of the respective entries on the animations list. This list must have the same number of entries as the animations list. Defaults to 1 for each entry, and takes priority over the Minimum and Maximum entries.
<stage>AnimsDelay= ; list of integers, the number of frames before the spawned animation appears for each of the respective entries on the animations list. This list must have the same number of entries as the animations list. Defaults to 0 for each entry.
```

```{note}
If the animation moves, delayed animations that it spawns will appear where it was when they were spawned, not when their delay expired.
```

- In addition to this new system, a new key for setting the logical middle frame (the frame in which the craters etc, are spawned) can now be set.
Expand Down
10 changes: 5 additions & 5 deletions src/extensions/anim/animext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ bool AnimClassExtension::Start()
*
* Spawns the start animations.
*/
Spawn_Animations(This()->Center_Coord(), animtypeext->StartAnims, animtypeext->StartAnimsCount, animtypeext->StartAnimsMinimum, animtypeext->StartAnimsMaximum);
Spawn_Animations(This()->Center_Coord(), animtypeext->StartAnims, animtypeext->StartAnimsCount, animtypeext->StartAnimsMinimum, animtypeext->StartAnimsMaximum, animtypeext->StartAnimsDelay);

return true;
}
Expand All @@ -203,7 +203,7 @@ bool AnimClassExtension::Middle()
*
* Spawns the middle animations.
*/
Spawn_Animations(This()->Center_Coord(), animtypeext->MiddleAnims, animtypeext->MiddleAnimsCount, animtypeext->MiddleAnimsMinimum, animtypeext->MiddleAnimsMaximum);
Spawn_Animations(This()->Center_Coord(), animtypeext->MiddleAnims, animtypeext->MiddleAnimsCount, animtypeext->MiddleAnimsMinimum, animtypeext->MiddleAnimsMaximum, animtypeext->MiddleAnimsDelay);

return true;
}
Expand All @@ -223,7 +223,7 @@ bool AnimClassExtension::End()
*
* Spawns the end animations.
*/
Spawn_Animations(This()->Center_Coord(), animtypeext->EndAnims, animtypeext->EndAnimsCount, animtypeext->EndAnimsMinimum, animtypeext->EndAnimsMaximum);
Spawn_Animations(This()->Center_Coord(), animtypeext->EndAnims, animtypeext->EndAnimsCount, animtypeext->EndAnimsMinimum, animtypeext->EndAnimsMaximum, animtypeext->EndAnimsDelay);

return true;
}
Expand All @@ -236,7 +236,7 @@ bool AnimClassExtension::End()
*
* @author: CCHyper
*/
bool AnimClassExtension::Spawn_Animations(const Coordinate &coord, const TypeList<AnimTypeClass *> &animlist, const TypeList<int> &countlist, const TypeList<int> &minlist, const TypeList<int> &maxlist)
bool AnimClassExtension::Spawn_Animations(const Coordinate &coord, const TypeList<AnimTypeClass *> &animlist, const TypeList<int> &countlist, const TypeList<int> &minlist, const TypeList<int> &maxlist, const TypeList<int>& delaylist)
{
if (!animlist.Count()) {
return false;
Expand Down Expand Up @@ -282,7 +282,7 @@ bool AnimClassExtension::Spawn_Animations(const Coordinate &coord, const TypeLis
* Based on the count decided above, spawn the animation type.
*/
for (int i = 0; i < count; ++i) {
AnimClass *anim = new AnimClass(animtype, (Coordinate &)coord);
AnimClass *anim = new AnimClass(animtype, (Coordinate &)coord, delaylist[index]);
ASSERT(anim != nullptr);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/extensions/anim/animext.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ AnimClassExtension final : public ObjectClassExtension
bool End();

private:
bool Spawn_Animations(const Coordinate &coord, const TypeList<AnimTypeClass *> &animlist, const TypeList<int> &countlist, const TypeList<int> &minlist, const TypeList<int> &maxlist);
bool Spawn_Animations(const Coordinate &coord, const TypeList<AnimTypeClass *> &animlist, const TypeList<int> &countlist, const TypeList<int> &minlist, const TypeList<int> &maxlist, const TypeList<int>& delaylist);

public:
};
29 changes: 28 additions & 1 deletion src/extensions/animtype/animtypeext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,17 @@ AnimTypeClassExtension::AnimTypeClassExtension(const AnimTypeClass *this_ptr) :
StartAnimsCount(),
StartAnimsMinimum(),
StartAnimsMaximum(),
StartAnimsDelay(),
MiddleAnims(),
MiddleAnimsCount(),
MiddleAnimsMinimum(),
MiddleAnimsMaximum(),
MiddleAnimsDelay(),
EndAnims(),
EndAnimsCount(),
EndAnimsMinimum(),
EndAnimsMaximum(),
EndAnimsDelay(),
MiddleFrame(-2)
{
//if (this_ptr) EXT_DEBUG_TRACE("AnimTypeClassExtension::AnimTypeClassExtension - Name: %s (0x%08X)\n", Name(), (uintptr_t)(This()));
Expand All @@ -80,14 +83,17 @@ AnimTypeClassExtension::AnimTypeClassExtension(const NoInitClass &noinit) :
StartAnimsCount(noinit),
StartAnimsMinimum(noinit),
StartAnimsMaximum(noinit),
StartAnimsDelay(noinit),
MiddleAnims(noinit),
MiddleAnimsCount(noinit),
MiddleAnimsMinimum(noinit),
MiddleAnimsMaximum(noinit),
MiddleAnimsDelay(noinit),
EndAnims(noinit),
EndAnimsCount(noinit),
EndAnimsMinimum(noinit),
EndAnimsMaximum(noinit)
EndAnimsMaximum(noinit),
EndAnimsDelay(noinit)
{
//EXT_DEBUG_TRACE("AnimTypeClassExtension::AnimTypeClassExtension(NoInitClass) - Name: %s (0x%08X)\n", Name(), (uintptr_t)(This()));
}
Expand Down Expand Up @@ -138,14 +144,17 @@ HRESULT AnimTypeClassExtension::Load(IStream *pStm)
StartAnimsCount.Clear();
StartAnimsMinimum.Clear();
StartAnimsMaximum.Clear();
StartAnimsDelay.Clear();
MiddleAnims.Clear();
MiddleAnimsCount.Clear();
MiddleAnimsMinimum.Clear();
MiddleAnimsMaximum.Clear();
MiddleAnimsDelay.Clear();
EndAnims.Clear();
EndAnimsCount.Clear();
EndAnimsMinimum.Clear();
EndAnimsMaximum.Clear();
EndAnimsDelay.Clear();

HRESULT hr = ObjectTypeClassExtension::Load(pStm);
if (FAILED(hr)) {
Expand All @@ -158,14 +167,17 @@ HRESULT AnimTypeClassExtension::Load(IStream *pStm)
StartAnimsCount.Load(pStm);
StartAnimsMinimum.Load(pStm);
StartAnimsMaximum.Load(pStm);
StartAnimsDelay.Load(pStm);
MiddleAnims.Load(pStm);
MiddleAnimsCount.Load(pStm);
MiddleAnimsMinimum.Load(pStm);
MiddleAnimsMaximum.Load(pStm);
MiddleAnimsDelay.Load(pStm);
EndAnims.Load(pStm);
EndAnimsCount.Load(pStm);
EndAnimsMinimum.Load(pStm);
EndAnimsMaximum.Load(pStm);
EndAnimsDelay.Load(pStm);

VINIFERA_SWIZZLE_REQUEST_POINTER_REMAP_LIST(StartAnims, "StartAnims");
VINIFERA_SWIZZLE_REQUEST_POINTER_REMAP_LIST(MiddleAnims, "MiddleAnims");
Expand Down Expand Up @@ -193,14 +205,17 @@ HRESULT AnimTypeClassExtension::Save(IStream *pStm, BOOL fClearDirty)
StartAnimsCount.Save(pStm);
StartAnimsMinimum.Save(pStm);
StartAnimsMaximum.Save(pStm);
StartAnimsDelay.Save(pStm);
MiddleAnims.Save(pStm);
MiddleAnimsCount.Save(pStm);
MiddleAnimsMinimum.Save(pStm);
MiddleAnimsMaximum.Save(pStm);
MiddleAnimsDelay.Save(pStm);
EndAnims.Save(pStm);
EndAnimsCount.Save(pStm);
EndAnimsMinimum.Save(pStm);
EndAnimsMaximum.Save(pStm);
EndAnimsDelay.Save(pStm);

return hr;
}
Expand Down Expand Up @@ -247,14 +262,17 @@ void AnimTypeClassExtension::Compute_CRC(WWCRCEngine &crc) const
crc(StartAnimsCount.Count());
crc(StartAnimsMinimum.Count());
crc(StartAnimsMaximum.Count());
crc(StartAnimsDelay.Count());
crc(MiddleAnims.Count());
crc(MiddleAnimsCount.Count());
crc(MiddleAnimsMinimum.Count());
crc(MiddleAnimsMaximum.Count());
crc(MiddleAnimsDelay.Count());
crc(EndAnims.Count());
crc(EndAnimsCount.Count());
crc(EndAnimsMinimum.Count());
crc(EndAnimsMaximum.Count());
crc(EndAnimsDelay.Count());
}


Expand Down Expand Up @@ -337,6 +355,7 @@ bool AnimTypeClassExtension::Read_INI(CCINIClass &ini)
StartAnimsCount = ini.Get_Integers(ini_name, "StartAnimsCount", StartAnimsCount);
StartAnimsMinimum = ini.Get_Integers(ini_name, "StartAnimsMinimum", StartAnimsMinimum);
StartAnimsMaximum = ini.Get_Integers(ini_name, "StartAnimsMaximum", StartAnimsMaximum);
StartAnimsDelay = ini.Get_Integers(ini_name, "StartAnimsDelay", StartAnimsDelay);

if (!StartAnimsCount.Count()) {
FILL_TYPELIST(StartAnimsMinimum, StartAnims.Count(), 1);
Expand All @@ -346,10 +365,13 @@ bool AnimTypeClassExtension::Read_INI(CCINIClass &ini)
FILL_TYPELIST(StartAnimsCount, StartAnims.Count(), 1);
}

FILL_TYPELIST(StartAnimsDelay, StartAnims.Count(), 0);

MiddleAnims = ini.Get_Anims(ini_name, "MiddleAnims", MiddleAnims);
MiddleAnimsCount = ini.Get_Integers(ini_name, "MiddleAnimsCount", MiddleAnimsCount);
MiddleAnimsMinimum = ini.Get_Integers(ini_name, "MiddleAnimsMinimum", MiddleAnimsMinimum);
MiddleAnimsMaximum = ini.Get_Integers(ini_name, "MiddleAnimsMaximum", MiddleAnimsMaximum);
MiddleAnimsDelay = ini.Get_Integers(ini_name, "MiddleAnimsDelay", MiddleAnimsDelay);

if (!MiddleAnimsCount.Count()) {
FILL_TYPELIST(MiddleAnimsMinimum, MiddleAnims.Count(), 1);
Expand All @@ -359,10 +381,13 @@ bool AnimTypeClassExtension::Read_INI(CCINIClass &ini)
FILL_TYPELIST(MiddleAnimsCount, MiddleAnims.Count(), 1);
}

FILL_TYPELIST(MiddleAnimsDelay, MiddleAnims.Count(), 0);

EndAnims = ini.Get_Anims(ini_name, "EndAnims", EndAnims);
EndAnimsCount = ini.Get_Integers(ini_name, "EndAnimsCount", EndAnimsCount);
EndAnimsMinimum = ini.Get_Integers(ini_name, "EndAnimsMinimum", EndAnimsMinimum);
EndAnimsMaximum = ini.Get_Integers(ini_name, "EndAnimsMaximum", EndAnimsMaximum);
EndAnimsDelay = ini.Get_Integers(ini_name, "EndAnimsDelay", EndAnimsDelay);

if (!EndAnimsCount.Count()) {
FILL_TYPELIST(EndAnimsMinimum, EndAnims.Count(), 1);
Expand All @@ -372,6 +397,8 @@ bool AnimTypeClassExtension::Read_INI(CCINIClass &ini)
FILL_TYPELIST(EndAnimsCount, EndAnims.Count(), 1);
}

FILL_TYPELIST(EndAnimsDelay, EndAnims.Count(), 0);

/**
* #issue-883
*
Expand Down
3 changes: 3 additions & 0 deletions src/extensions/animtype/animtypeext.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ AnimTypeClassExtension final : public ObjectTypeClassExtension
TypeList<int> StartAnimsCount;
TypeList<int> StartAnimsMinimum;
TypeList<int> StartAnimsMaximum;
TypeList<int> StartAnimsDelay;

/**
* List of animations to spawn at the logical middle of this animation.
Expand All @@ -119,6 +120,7 @@ AnimTypeClassExtension final : public ObjectTypeClassExtension
TypeList<int> MiddleAnimsCount;
TypeList<int> MiddleAnimsMinimum;
TypeList<int> MiddleAnimsMaximum;
TypeList<int> MiddleAnimsDelay;

/**
* List of animations to spawn at the logical end of this animation.
Expand All @@ -127,6 +129,7 @@ AnimTypeClassExtension final : public ObjectTypeClassExtension
TypeList<int> EndAnimsCount;
TypeList<int> EndAnimsMinimum;
TypeList<int> EndAnimsMaximum;
TypeList<int> EndAnimsDelay;

/**
* The middle (biggest) frame, if set by the user.
Expand Down

0 comments on commit 3222cac

Please sign in to comment.