1
0
mirror of https://github.com/blupi-games/planetblupi synced 2024-12-30 10:15:36 +01:00

Begin real improvements for the recorder

Use an infinite vector instead of a stupid static array.
This commit is contained in:
Mathieu Schroeter 2017-08-26 00:56:58 +02:00
parent 0565e1dce0
commit bfe84f65ca
2 changed files with 62 additions and 62 deletions

View File

@ -19,6 +19,7 @@
*/ */
#include <assert.h> #include <assert.h>
#include <ctime>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unordered_map> #include <unordered_map>
@ -1554,7 +1555,6 @@ CEvent::CEvent ()
m_bDemoRec = false; m_bDemoRec = false;
m_bDemoPlay = false; m_bDemoPlay = false;
m_pDemoBuffer = nullptr; m_pDemoBuffer = nullptr;
m_pDemoSDLBuffer = nullptr;
m_bStartRecording = false; m_bStartRecording = false;
m_demoTime = 0; m_demoTime = 0;
m_keymod = 0; m_keymod = 0;
@ -4554,11 +4554,7 @@ CEvent::GetPause ()
void void
CEvent::DemoRecStart () CEvent::DemoRecStart ()
{ {
m_pDemoSDLBuffer = (DemoSDLEvent *) malloc (MAXDEMO * sizeof (DemoSDLEvent)); m_pDemoSDLBuffer.clear ();
if (m_pDemoSDLBuffer == nullptr)
return;
memset (m_pDemoSDLBuffer, 0, MAXDEMO * sizeof (DemoSDLEvent));
m_demoTime = 0; m_demoTime = 0;
m_demoIndex = 0; m_demoIndex = 0;
m_bDemoRec = true; m_bDemoRec = true;
@ -4578,31 +4574,33 @@ CEvent::DemoRecStop ()
FILE * file = nullptr; FILE * file = nullptr;
DemoHeader header; DemoHeader header;
if (m_bDemoPlay) if (m_bDemoPlay || !m_bDemoRec)
return; return;
if (m_pDemoSDLBuffer != nullptr) std::time_t t = std::time (nullptr);
std::localtime (&t);
std::string demoPath = "demo/demo." + std::to_string (t) + ".blp";
AddUserPath (demoPath);
unlink (demoPath.c_str ());
file = fopen (demoPath.c_str (), "wb");
if (file)
{ {
const auto demo = GetBaseDir () + "data/demo.blp"; memset (&header, 0, sizeof (DemoHeader));
unlink (demo.c_str ()); header.majRev = 2;
file = fopen (demo.c_str (), "wb"); header.minRev = 0;
if (file != nullptr) header.bSchool = m_bSchool;
{ header.bPrivate = m_bPrivate;
memset (&header, 0, sizeof (DemoHeader)); header.world = GetPhysicalWorld ();
header.majRev = 2; header.skill = m_pDecor->GetSkill ();
header.minRev = 0;
header.bSchool = m_bSchool; fwrite (&header, sizeof (DemoHeader), 1, file);
header.bPrivate = m_bPrivate; for (const auto buffer : m_pDemoSDLBuffer)
header.world = GetPhysicalWorld (); fwrite (&buffer, sizeof (DemoSDLEvent), 1, file);
header.skill = m_pDecor->GetSkill (); fclose (file);
fwrite (&header, sizeof (DemoHeader), 1, file);
fwrite (m_pDemoSDLBuffer, sizeof (DemoSDLEvent), m_demoIndex, file);
fclose (file);
}
free (m_pDemoSDLBuffer);
m_pDemoSDLBuffer = nullptr;
} }
m_pDemoSDLBuffer.clear ();
m_bDemoRec = false; m_bDemoRec = false;
m_demoTime = 0; m_demoTime = 0;
} }
@ -4639,19 +4637,12 @@ CEvent::DemoPlayStart ()
{ {
m_pDemoBuffer = (DemoEvent *) malloc (MAXDEMO * sizeof (DemoEvent)); m_pDemoBuffer = (DemoEvent *) malloc (MAXDEMO * sizeof (DemoEvent));
if (m_pDemoBuffer == nullptr) if (m_pDemoBuffer == nullptr)
return false;
memset (m_pDemoBuffer, 0, MAXDEMO * sizeof (DemoEvent));
}
else if (header.majRev == 2)
{
m_pDemoSDLBuffer =
static_cast<DemoSDLEvent *> (calloc (MAXDEMO, sizeof (DemoSDLEvent)));
if (!m_pDemoSDLBuffer)
{ {
fclose (file); fclose (file);
DemoPlayStop (); DemoPlayStop ();
return false; return false;
} }
memset (m_pDemoBuffer, 0, MAXDEMO * sizeof (DemoEvent));
} }
m_bSchool = !!header.bSchool; m_bSchool = !!header.bSchool;
@ -4661,7 +4652,20 @@ CEvent::DemoPlayStart ()
if (header.majRev == 1) if (header.majRev == 1)
m_demoEnd = fread (m_pDemoBuffer, sizeof (DemoEvent), MAXDEMO, file); m_demoEnd = fread (m_pDemoBuffer, sizeof (DemoEvent), MAXDEMO, file);
else if (header.majRev == 2) else if (header.majRev == 2)
m_demoEnd = fread (m_pDemoSDLBuffer, sizeof (DemoSDLEvent), MAXDEMO, file); {
DemoSDLEvent demoEvent;
for (;;)
{
auto res = fread (&demoEvent, sizeof (DemoSDLEvent), 1, file);
if (res != 1)
break;
m_pDemoSDLBuffer.push_back (demoEvent);
}
m_demoEnd = m_pDemoSDLBuffer.size ();
}
fclose (file); fclose (file);
m_demoTime = 0; m_demoTime = 0;
@ -4693,11 +4697,7 @@ CEvent::DemoPlayStop ()
m_pDemoBuffer = nullptr; m_pDemoBuffer = nullptr;
} }
if (m_pDemoSDLBuffer) m_pDemoSDLBuffer.clear ();
{
free (m_pDemoSDLBuffer);
m_pDemoSDLBuffer = nullptr;
}
m_bDemoPlay = false; m_bDemoPlay = false;
m_bDemoRec = false; m_bDemoRec = false;
@ -4823,9 +4823,7 @@ CEvent::DemoStep ()
} }
} }
if ( if (m_bDemoPlay)
m_bDemoPlay && // démo en lecture ?
(m_pDemoBuffer || m_pDemoSDLBuffer))
{ {
while (true) while (true)
{ {
@ -4838,7 +4836,7 @@ CEvent::DemoStep ()
wParam = m_pDemoBuffer[m_demoIndex].wParam; wParam = m_pDemoBuffer[m_demoIndex].wParam;
lParam = m_pDemoBuffer[m_demoIndex].lParam; lParam = m_pDemoBuffer[m_demoIndex].lParam;
} }
else if (m_pDemoSDLBuffer) // New SDL events format else // New SDL events format
{ {
time = m_pDemoSDLBuffer[m_demoIndex].time; time = m_pDemoSDLBuffer[m_demoIndex].time;
event.type = m_pDemoSDLBuffer[m_demoIndex].type; event.type = m_pDemoSDLBuffer[m_demoIndex].type;
@ -4906,39 +4904,41 @@ CEvent::DemoStep ()
void void
CEvent::DemoRecEvent (const SDL_Event & event) CEvent::DemoRecEvent (const SDL_Event & event)
{ {
if (!m_bDemoRec || !m_pDemoSDLBuffer) if (!m_bDemoRec)
return; return;
DemoSDLEvent demoEvent = {0};
switch (event.type) switch (event.type)
{ {
case SDL_KEYUP: case SDL_KEYUP:
case SDL_KEYDOWN: case SDL_KEYDOWN:
m_pDemoSDLBuffer[m_demoIndex].type = event.type; demoEvent.type = event.type;
m_pDemoSDLBuffer[m_demoIndex].time = m_demoTime; demoEvent.time = m_demoTime;
m_pDemoSDLBuffer[m_demoIndex].scancode = event.key.keysym.scancode; demoEvent.scancode = event.key.keysym.scancode;
m_pDemoSDLBuffer[m_demoIndex].sym = event.key.keysym.sym; demoEvent.sym = event.key.keysym.sym;
break; break;
case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONUP:
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
m_pDemoSDLBuffer[m_demoIndex].type = event.type; demoEvent.type = event.type;
m_pDemoSDLBuffer[m_demoIndex].time = m_demoTime; demoEvent.time = m_demoTime;
m_pDemoSDLBuffer[m_demoIndex].button = event.button.button; demoEvent.button = event.button.button;
m_pDemoSDLBuffer[m_demoIndex].x = event.button.x; demoEvent.x = event.button.x;
m_pDemoSDLBuffer[m_demoIndex].y = event.button.y; demoEvent.y = event.button.y;
break; break;
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
m_pDemoSDLBuffer[m_demoIndex].type = event.type; demoEvent.type = event.type;
m_pDemoSDLBuffer[m_demoIndex].time = m_demoTime; demoEvent.time = m_demoTime;
m_pDemoSDLBuffer[m_demoIndex].x = event.motion.x; demoEvent.x = event.motion.x;
m_pDemoSDLBuffer[m_demoIndex].y = event.motion.y; demoEvent.y = event.motion.y;
break; break;
} }
m_demoIndex++; m_pDemoSDLBuffer.push_back (demoEvent);
if (m_demoIndex >= MAXDEMO)
DemoRecStop (); m_demoIndex = m_pDemoSDLBuffer.size ();
} }
// Retourne la dernière position de la souris. // Retourne la dernière position de la souris.

View File

@ -254,7 +254,7 @@ protected:
bool m_bDemoRec; bool m_bDemoRec;
bool m_bDemoPlay; bool m_bDemoPlay;
DemoEvent * m_pDemoBuffer; DemoEvent * m_pDemoBuffer;
DemoSDLEvent * m_pDemoSDLBuffer; std::vector<DemoSDLEvent> m_pDemoSDLBuffer;
bool m_bStartRecording; bool m_bStartRecording;
Uint32 m_demoTime; Uint32 m_demoTime;
size_t m_demoIndex; size_t m_demoIndex;