Browse Source

Apply cleanups to codec, control, and some of cursor

pull/2252/head
Anders Jenbo 5 years ago
parent
commit
e7f0ce2764
  1. 38
      Source/codec.cpp
  2. 8
      Source/control.cpp
  3. 44
      Source/cursor.cpp
  4. 6
      Source/cursor.h

38
Source/codec.cpp

@ -25,25 +25,24 @@ struct CodecSignature {
static void CodecInitKey(const char *pszPassword)
{
char key[136]; // last 64 bytes are the SHA1
uint32_t rand_state = 0x7058;
uint32_t randState = 0x7058;
for (char &notch : key) {
rand_state = rand_state * 214013 + 2531011;
notch = rand_state >> 16; // Downcasting to char keeps the 2 least-significant bytes
randState = randState * 214013 + 2531011;
notch = randState >> 16; // Downcasting to char keeps the 2 least-significant bytes
}
char pw[64];
std::size_t password_i = 0;
for (std::size_t i = 0; i < sizeof(pw); ++i, ++password_i) {
if (pszPassword[password_i] == '\0')
password_i = 0;
pw[i] = pszPassword[password_i];
for (std::size_t i = 0; i < sizeof(pw); i++) {
if (pszPassword[i] == '\0')
i = 0;
pw[i] = pszPassword[i];
}
char digest[SHA1HashSize];
SHA1Reset(0);
SHA1Calculate(0, pw, digest);
SHA1Clear();
for (std::size_t i = 0; i < sizeof(key); ++i)
for (std::size_t i = 0; i < sizeof(key); i++)
key[i] ^= digest[i % SHA1HashSize];
memset(pw, 0, sizeof(pw));
memset(digest, 0, sizeof(digest));
@ -85,7 +84,7 @@ std::size_t codec_decode(byte *pbSrcDst, std::size_t size, const char *pszPasswo
}
SHA1Result(0, dst);
if (sig->checksum != *(DWORD *)dst) {
if (sig->checksum != *(uint32_t *)dst) {
memset(dst, 0, sizeof(dst));
goto error;
}
@ -105,22 +104,19 @@ std::size_t codec_get_encoded_len(std::size_t dwSrcBytes)
return dwSrcBytes + sizeof(CodecSignature);
}
void codec_encode(byte *pbSrcDst, std::size_t size, std::size_t size_64, const char *pszPassword)
void codec_encode(byte *pbSrcDst, std::size_t size, std::size_t size64, const char *pszPassword)
{
char buf[128];
char tmp[SHA1HashSize];
char dst[SHA1HashSize];
DWORD chunk;
uint16_t last_chunk;
CodecSignature *sig;
if (size_64 != codec_get_encoded_len(size))
if (size64 != codec_get_encoded_len(size))
app_fatal("Invalid encode parameters");
CodecInitKey(pszPassword);
last_chunk = 0;
uint16_t lastChunk = 0;
while (size != 0) {
chunk = size < BLOCKSIZE ? size : BLOCKSIZE;
uint16_t chunk = size < BLOCKSIZE ? size : BLOCKSIZE;
memcpy(buf, pbSrcDst, chunk);
if (chunk < BLOCKSIZE)
memset(buf + chunk, 0, BLOCKSIZE - chunk);
@ -131,17 +127,17 @@ void codec_encode(byte *pbSrcDst, std::size_t size, std::size_t size_64, const c
}
memset(dst, 0, sizeof(dst));
memcpy(pbSrcDst, buf, BLOCKSIZE);
last_chunk = chunk;
lastChunk = chunk;
pbSrcDst += BLOCKSIZE;
size -= chunk;
}
memset(buf, 0, sizeof(buf));
SHA1Result(0, tmp);
sig = (CodecSignature *)pbSrcDst;
auto *sig = (CodecSignature *)pbSrcDst;
sig->error = 0;
sig->unused = 0;
sig->checksum = *(DWORD *)&tmp[0];
sig->last_chunk_size = last_chunk;
sig->checksum = *(uint32_t *)&tmp[0];
sig->last_chunk_size = lastChunk;
SHA1Clear();
}

8
Source/control.cpp

@ -206,10 +206,10 @@ const char *const PanBtnStr[8] = {
};
/** Maps from attribute_id to the rectangle on screen used for attribute increment buttons. */
Rectangle ChrBtnsRect[4] = {
{ 137, 138, 41, 22 },
{ 137, 166, 41, 22 },
{ 137, 195, 41, 22 },
{ 137, 223, 41, 22 }
{ {137, 138}, {41, 22} },
{ {137, 166}, {41, 22} },
{ {137, 195}, {41, 22} },
{ {137, 223}, {41, 22} }
};
/** Maps from spellbook page number and position to spell_id. */

44
Source/cursor.cpp

@ -159,39 +159,39 @@ int GetInvItemFrame(int i)
return i < InvItems1Size ? i : i - (InvItems1Size - 1);
}
Size GetInvItemSize(int i)
Size GetInvItemSize(int cursId)
{
if (i >= InvItems1Size)
return { InvItemWidth2[i - (InvItems1Size - 1)], InvItemHeight2[i - (InvItems1Size - 1)] };
return { InvItemWidth1[i], InvItemHeight1[i] };
if (cursId >= InvItems1Size)
return { InvItemWidth2[cursId - (InvItems1Size - 1)], InvItemHeight2[cursId - (InvItems1Size - 1)] };
return { InvItemWidth1[cursId], InvItemHeight1[cursId] };
}
void SetICursor(int i)
void SetICursor(int cursId)
{
auto size = GetInvItemSize(i);
auto size = GetInvItemSize(cursId);
icursW = size.width;
icursH = size.height;
icursW28 = icursW / 28;
icursH28 = icursH / 28;
}
void NewCursor(int i)
void NewCursor(int cursId)
{
pcurs = i;
auto size = GetInvItemSize(i);
pcurs = cursId;
auto size = GetInvItemSize(cursId);
cursW = size.width;
cursH = size.height;
SetICursor(i);
if (IsHardwareCursorEnabled() && GetCurrentCursorInfo() != CursorInfo::GameCursor(pcurs) && pcurs != CURSOR_NONE) {
SetHardwareCursor(CursorInfo::GameCursor(pcurs));
SetICursor(cursId);
if (IsHardwareCursorEnabled() && GetCurrentCursorInfo() != CursorInfo::GameCursor(cursId) && cursId != CURSOR_NONE) {
SetHardwareCursor(CursorInfo::GameCursor(cursId));
}
}
void CelDrawCursor(const CelOutputBuffer &out, Point position, int pcurs)
void CelDrawCursor(const CelOutputBuffer &out, Point position, int cursId)
{
const auto &sprite = GetInvItemSprite(pcurs);
const int frame = GetInvItemFrame(pcurs);
if (IsItemSprite(pcurs)) {
const auto &sprite = GetInvItemSprite(cursId);
const int frame = GetInvItemFrame(cursId);
if (IsItemSprite(cursId)) {
const auto &heldItem = plr[myplr].HoldItem;
CelBlitOutlineTo(out, GetOutlineColor(heldItem, true), position, sprite, frame, false);
CelDrawItem(heldItem._iStatFlag, out, position, sprite, frame);
@ -215,10 +215,8 @@ void InitLevelCursor()
void CheckTown()
{
int i, mx;
for (i = 0; i < nummissiles; i++) {
mx = missileactive[i];
for (int i = 0; i < nummissiles; i++) {
int mx = missileactive[i];
if (missile[mx]._mitype == MIS_TOWN) {
if ((cursmx == missile[mx].position.tile.x - 1 && cursmy == missile[mx].position.tile.y)
|| (cursmx == missile[mx].position.tile.x && cursmy == missile[mx].position.tile.y - 1)
@ -241,10 +239,8 @@ void CheckTown()
void CheckRportal()
{
int i, mx;
for (i = 0; i < nummissiles; i++) {
mx = missileactive[i];
for (int i = 0; i < nummissiles; i++) {
int mx = missileactive[i];
if (missile[mx]._mitype == MIS_RPORTAL) {
if ((cursmx == missile[mx].position.tile.x - 1 && cursmy == missile[mx].position.tile.y)
|| (cursmx == missile[mx].position.tile.x && cursmy == missile[mx].position.tile.y - 1)

6
Source/cursor.h

@ -55,12 +55,12 @@ void CheckRportal();
void CheckTown();
void CheckCursMove();
inline bool IsItemSprite(int pcurs)
inline bool IsItemSprite(int cursId)
{
return pcurs >= CURSOR_FIRSTITEM;
return cursId >= CURSOR_FIRSTITEM;
}
void CelDrawCursor(const CelOutputBuffer &out, Point position, int pcurs);
void CelDrawCursor(const CelOutputBuffer &out, Point position, int cursId);
/** Returns the sprite for the given inventory index. */
const CelSprite &GetInvItemSprite(int i);

Loading…
Cancel
Save