83 lines
2.4 KiB
C++
83 lines
2.4 KiB
C++
#include "anm2.h"
|
|
|
|
#include "map_.h"
|
|
#include "types.h"
|
|
#include "unordered_map_.h"
|
|
|
|
using namespace anm2ed::types;
|
|
using namespace anm2ed::util;
|
|
|
|
namespace anm2ed::anm2
|
|
{
|
|
Item* Anm2::item_get(int animationIndex, Type type, int id)
|
|
{
|
|
if (Animation* animation = animation_get(animationIndex))
|
|
{
|
|
switch (type)
|
|
{
|
|
case ROOT:
|
|
return &animation->rootAnimation;
|
|
case LAYER:
|
|
return unordered_map::find(animation->layerAnimations, id);
|
|
case NULL_:
|
|
return map::find(animation->nullAnimations, id);
|
|
case TRIGGER:
|
|
return &animation->triggers;
|
|
default:
|
|
return nullptr;
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
Reference Anm2::layer_animation_add(Reference reference, std::string name, int spritesheetID, locale::Type locale)
|
|
{
|
|
auto id = reference.itemID == -1 ? map::next_id_get(content.layers) : reference.itemID;
|
|
auto& layer = content.layers[id];
|
|
|
|
layer.name = !name.empty() ? name : layer.name;
|
|
layer.spritesheetID = content.spritesheets.contains(spritesheetID) ? spritesheetID : 0;
|
|
|
|
auto add = [&](Animation* animation, int id)
|
|
{
|
|
animation->layerAnimations[id] = Item();
|
|
animation->layerOrder.push_back(id);
|
|
};
|
|
|
|
if (locale == locale::GLOBAL)
|
|
{
|
|
for (auto& animation : animations.items)
|
|
if (!animation.layerAnimations.contains(id)) add(&animation, id);
|
|
}
|
|
else if (locale == locale::LOCAL)
|
|
{
|
|
if (auto animation = animation_get(reference.animationIndex))
|
|
if (!animation->layerAnimations.contains(id)) add(animation, id);
|
|
}
|
|
|
|
return {reference.animationIndex, LAYER, id};
|
|
}
|
|
|
|
Reference Anm2::null_animation_add(Reference reference, std::string name, locale::Type locale)
|
|
{
|
|
auto id = reference.itemID == -1 ? map::next_id_get(content.nulls) : reference.itemID;
|
|
auto& null = content.nulls[id];
|
|
|
|
null.name = !name.empty() ? name : null.name;
|
|
|
|
auto add = [&](Animation* animation, int id) { animation->nullAnimations[id] = Item(); };
|
|
|
|
if (locale == locale::GLOBAL)
|
|
{
|
|
for (auto& animation : animations.items)
|
|
if (!animation.nullAnimations.contains(id)) add(&animation, id);
|
|
}
|
|
else if (locale == locale::LOCAL)
|
|
{
|
|
if (auto animation = animation_get(reference.animationIndex))
|
|
if (!animation->nullAnimations.contains(id)) add(animation, id);
|
|
}
|
|
|
|
return {reference.animationIndex, LAYER, id};
|
|
}
|
|
} |