Browse Source

Introduce AutofillArray

pull/2583/head
Vladimir Olteanu 5 years ago committed by Anders Jenbo
parent
commit
b5d6758295
  1. 58
      Source/misdat.cpp
  2. 31
      Source/misdat.h
  3. 29
      Source/utils/autofill_array.h

58
Source/misdat.cpp

@ -194,8 +194,8 @@ MisFileData MissileSpriteData[] = {
};
MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags,
std::array<uint8_t, 16> animDelay, std::array<uint8_t, 16> animLen,
std::array<int16_t, 16> animWidth, std::array<int16_t, 16> animWidth2)
AutofillArray<uint8_t, 16> animDelay, AutofillArray<uint8_t, 16> animLen,
AutofillArray<int16_t, 16> animWidth, AutofillArray<int16_t, 16> animWidth2)
: name(name)
, animName(animName)
, animFAmt(animFAmt)
@ -209,55 +209,13 @@ MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, u
pinnedMem.reserve(1);
else
pinnedMem.reserve(animFAmt);
}
namespace {
template <typename T>
constexpr std::array<T, 16> duplicate(T value, unsigned count)
{
std::array<T, 16> ret = {};
for (unsigned i = 0; i < count; i++)
ret[i] = value;
return ret;
}
} //namespace
MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags,
uint8_t animDelay, uint8_t animLen,
int16_t animWidth, int16_t animWidth2)
: MisFileData(name, animName, animFAmt, flags,
duplicate<uint8_t>(animDelay, animFAmt), duplicate<uint8_t>(animLen, animFAmt),
duplicate<int16_t>(animWidth, animFAmt), duplicate<int16_t>(animWidth2, animFAmt))
{
}
MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags,
uint8_t animDelay, std::array<uint8_t, 16> animLen,
int16_t animWidth, int16_t animWidth2)
: MisFileData(name, animName, animFAmt, flags,
duplicate<uint8_t>(animDelay, animFAmt), animLen,
duplicate<int16_t>(animWidth, animFAmt), duplicate<int16_t>(animWidth2, animFAmt))
{
}
MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags,
std::array<uint8_t, 16> animDelay, uint8_t animLen,
int16_t animWidth, int16_t animWidth2)
: MisFileData(name, animName, animFAmt, flags,
animDelay, duplicate<uint8_t>(animLen, animFAmt),
duplicate<int16_t>(animWidth, animFAmt), duplicate<int16_t>(animWidth2, animFAmt))
{
}
MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags,
uint8_t animDelay, std::array<uint8_t, 16> animLen,
std::array<int16_t, 16> animWidth, std::array<int16_t, 16> animWidth2)
: MisFileData(name, animName, animFAmt, flags,
duplicate<uint8_t>(animDelay, animFAmt), animLen,
animWidth, animWidth2)
{
for (int i = animFAmt; i < 16; i++) {
animDelay[i] = 0;
animLen[i] = 0;
animWidth = 0;
animWidth2 = 0;
}
}
void MisFileData::LoadGFX()

31
Source/misdat.h

@ -10,6 +10,7 @@
#include "engine.h"
#include "effects.h"
#include "utils/autofill_array.h"
#include "utils/stdcompat/cstddef.hpp"
namespace devilution {
@ -127,11 +128,11 @@ struct MisFileData {
uint8_t animName;
uint8_t animFAmt;
uint32_t flags;
std::array<byte *, 16> animData = {};
std::array<uint8_t, 16> animDelay = {};
std::array<uint8_t, 16> animLen = {};
std::array<int16_t, 16> animWidth = {};
std::array<int16_t, 16> animWidth2 = {};
AutofillArray<byte *, 16> animData = {};
AutofillArray<uint8_t, 16> animDelay = {};
AutofillArray<uint8_t, 16> animLen = {};
AutofillArray<int16_t, 16> animWidth = {};
AutofillArray<int16_t, 16> animWidth2 = {};
private:
std::vector<std::unique_ptr<byte[]>> pinnedMem;
@ -146,24 +147,8 @@ public:
}
MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags,
std::array<uint8_t, 16> animDelay, std::array<uint8_t, 16> animLen,
std::array<int16_t, 16> animWidth, std::array<int16_t, 16> animWidth2);
MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags,
uint8_t animDelay, uint8_t animLen,
int16_t animWidth, int16_t animWidth2);
MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags,
uint8_t animDelay, std::array<uint8_t, 16> animLen,
int16_t animWidth, int16_t animWidth2);
MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags,
std::array<uint8_t, 16> animDelay, uint8_t animLen,
int16_t animWidth, int16_t animWidth2);
MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags,
uint8_t animDelay, std::array<uint8_t, 16> animLen,
std::array<int16_t, 16> animWidth, std::array<int16_t, 16> animWidth2);
AutofillArray<uint8_t, 16> animDelay, AutofillArray<uint8_t, 16> animLen,
AutofillArray<int16_t, 16> animWidth, AutofillArray<int16_t, 16> animWidth2);
void LoadGFX();

29
Source/utils/autofill_array.h

@ -0,0 +1,29 @@
#pragma once
#include <array>
namespace devilution {
template<typename T, std::size_t N>
struct AutofillArray: public std::array<T, N>
{
using std::array<T, N>::array;
explicit AutofillArray(T x)
{
std::array<T, N>::fill(x);
}
AutofillArray()
: AutofillArray(0)
{
}
template<typename... Xs>
AutofillArray(const T &x, const Xs &... xs)
: std::array<T, N>({ x, static_cast<const T &>(xs)... })
{
}
};
} //namespace devilution
Loading…
Cancel
Save