Subversion Repositories spk

Rev

Rev 11 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "stdafx.h"
#include "X3Overlay.h"

#include "Hook/MyDirect3DDevice9.h"
#include "Render/DisplayMessage.h"
#include "Render/DisplayText.h"
#include "Render/DisplayCustom.h"

CX3Overlay::~CX3Overlay ()
{
        if ( m_pDisplay )
                delete m_pDisplay;
        if ( m_lDisplays )
                delete m_lDisplays;
        if ( m_lPermDisplays )
                delete m_lPermDisplays;
    CoUninitialize();
}

void CX3Overlay::Init()
{
        m_lDisplays = new CLinkList<CDisplay>;
        m_lPermDisplays = new CLinkList<CDisplay>;
}

bool CX3Overlay::HaltMouse () 
{ 
        if ( m_pDisplay ) 
                return m_pDisplay->HaltMouse(); 
        return COverlay::HaltMouse(); 
}

bool CX3Overlay::MouseClick ( int but )
{
        if ( m_pDisplay )
                return m_pDisplay->MouseClick (  but, true );
        return false;
}

void CX3Overlay::MouseRelease ( int but )
{
        if ( m_pDisplay )
                m_pDisplay->MouseClick (  but, false );
}

CDisplay *CX3Overlay::FindDisplay(const CyString &name)
{
        for ( CListNode<CDisplay> *node = m_lPermDisplays->Front(); node; node = node->next() )
        {
                if ( !node->Data() ) continue;
                if ( node->Data()->CheckName(name) )
                        return node->Data();
        }
        return NULL;
}


void CX3Overlay::render(MyDirect3DDevice9 *device)
{
        DWORD timeNow = timeGetTime();
        device->SetVertexShader(0);
        device->SetPixelShader(0);

        // render are static objects
        for ( CListNode<CDisplay> *node = m_lPermDisplays->Front(); node; node = node->next() )
        {
                if ( node->Data()->CheckTimeout(timeNow) )
                        node->DeleteData();
                else
                {
                        node->Data()->Update(timeNow);
                        node->Data()->render(device);
                }
        }
        // remove any thats closed or timeout
        m_lPermDisplays->RemoveEmpty();


        // now render our main display
        if ( m_pDisplay )
        {
                if ( m_pDisplay->CheckTimeout(timeNow) )
                {
                        delete m_pDisplay;
                        m_pDisplay = NULL;
                }
                else
                {
                        m_pDisplay->Update(timeNow);
                        m_pDisplay->render ( device );
                }
        }

        CyStringList varibles;

        // read the log files for the game
        CFileIO File(m_sLogDir + "/log09005.txt");
        if ( File.exists() )
        {
                CyStringList *lines = File.ReadLinesStr();
                if ( lines )
                {
                        
                        for ( SStringList *str = lines->Head(); str; str = str->next )
                        {
                                CyString cmd = str->str.GetToken(":", 1, 1);
                                if ( cmd.Compare("MESSAGE") )
                                {
                                        SMessages *m = new SMessages;
                                        m->iTimeout = str->str.GetToken ( ":", 2, 2 ).ToInt();
                                        m->iHeight  = str->str.GetToken ( ":", 3, 3 ).ToInt();
                                        m->sHeader = str->str.GetToken ( ":", 4, 4 );
                                        m->sText = str->str.GetToken ( ":", 5 );

                                        if ( !m->iHeight )
                                                m->iHeight = 100;

                                        if ( m->iTimeout != -1 )
                                                m->iTimeout = timeNow + m->iTimeout;

                                        CDisplayMessage *display = new CDisplayMessage ( this, device, "", m->sHeader, m->sText );
                                        display->SetSize ( 520, m->iHeight, m_iWidth, m_iHeight );
                                        display->SetTimeout ( m->iTimeout );

                                        m_lDisplays->push_back ( display );
                                        delete m;
                                }
                                else if ( cmd.Compare("ADDGUI") ) // ADDGUI:<name>:<timeout>:x:y:<TYPE>:args
                                {
                                        CyString name = str->str.GetToken(":", 2, 2);
                                        CyString guicmd = str->str.GetToken(":", 6, 6);
                                        CDisplay *display = FindDisplay(name);
                                        if ( guicmd.Compare("TEXT") )
                                        {
                                                if ( !display )
                                                {
                                                        display = new CDisplayText(this, device, name, str->str.GetToken(":", 8));
                                                        m_lPermDisplays->push_back(display);
                                                        display->SetMaxSize(m_iWidth, m_iHeight);
                                                        display->SetSize(m_iWidth, m_iHeight);
                                                }
                                                display->SetLength(str->str.GetToken(":", 7, 7).ToInt());
                                                ((CDisplayText *)display)->SetText(str->str.GetToken(":", 8));

                                                CDisplay::Log(CyString("Adding Text Gui Object: ") + str->str.GetToken(":", 8));
                                        }

                                        if ( display ) 
                                        {
                                                int iTimeout = str->str.GetToken ( ":", 3, 3 ).ToInt();
                                                if ( iTimeout != -1 )
                                                        iTimeout = timeNow + iTimeout;
                                                display->SetTimeout(iTimeout);
                                                display->SetPosition(str->str.GetToken(":", 4, 4).ToInt(), str->str.GetToken(":", 5, 5).ToInt());
                                        }
                                }
                                else if ( cmd.Compare("REMOVEGUI") )
                                {
                                        CDisplay *d = FindDisplay(str->str.GetToken(":", 2, 2));
                                        if ( d )
                                                m_lPermDisplays->remove(d, true, true);
                                }
                                else if ( cmd.Compare("TEXTFILE") )
                                        m_sTextfile = str->str.GetToken ( ":", 2, 2 );
                                else if ( cmd.Compare("LANGUAGE") )
                                        m_sLang = str->str.GetToken ( ":", 2, 2 );
                                else if ( cmd.Compare("PURGE") )
                                {
                                        size_t time = str->str.GetToken ( ":", 2, 2 ).ToLong();
                                        if ( time == m_lCurrentTime )
                                                m_lSend.Clear();
                                        char buf[1000];
                                        sprintf_s ( buf, 1000, "t/%s%s.xml", m_sLang.c_str(), m_sTextfile.c_str() );
                                        remove ( buf );
                                }
                                else if ( cmd.Compare("CUSTOM") )
                                {
                                        CyString filename = str->str.GetToken ( ":", 3 );
                                        CyString name = str->str.GetToken ( ":", 2, 2 );
                                        CDisplayCustom *display = new CDisplayCustom ( this, device, filename, name, m_iWidth, m_iHeight, &varibles );
                                        display->SetMouse ( &m_iMouseX, &m_iMouseY );
                                        
                                        m_lDisplays->push_back ( display );
                                }
                                else if ( cmd.Compare("VARIBLES") )
                                {
                                        CyString rest = str->str.GetToken ( ":", 2, 2 );
                                        if ( rest.Left(5).Compare("ARRAY") )
                                        {
                                                CyString vari = rest.GetToken ( "(", 2 );
                                                vari.RemoveSpaces ();
                                                if ( vari.Right(1) == ")" )
                                                        vari.Truncate ( -1 );
                                                vari.RemoveSpaces ();

                                                int num = 0;
                                                CyString *varis = vari.SplitToken ( ',', &num );
                                                for ( int i = 0; i < num; i++ )
                                                {
                                                        CyString s = varis[i];
                                                        s.RemoveFirstSpace();
                                                        varibles.PushBack ( s );
                                                }

                                                CLEANSPLIT(varis, num)
                                        }
                                }
                        }
                        delete lines;
                }
                File.remove();
        }

        if ( (!m_lDisplays->empty()) && (!m_pDisplay) )
        {
                m_pDisplay = m_lDisplays->First();

                m_lDisplays->RemoveCurrent ();
        }
}


void CX3Overlay::init (MyDirect3DDevice9 *device)
{
        COverlay::init ( device );

        m_pDisplay = NULL;
}


bool CX3Overlay::KeyDown ( int key )
{
        if ( !m_pDisplay )
                return false;

        if ( key == DIK_NUMPADSTAR )
                m_pDisplay->SwitchRender ();

        if ( (m_pDisplay->GetTimeout() == -2) || ((m_pDisplay->GetTimeout() == -1) && (key == DIK_RETURN)) )
        {
                delete m_pDisplay;
                m_pDisplay = NULL;
                return true;
        }

        if ( m_pDisplay->CheckCloseEventKey ( key ) )
        {
                delete m_pDisplay;
                m_pDisplay = NULL;
                return true;
        }

        return false;
}

void CX3Overlay::Send ( CyString data )
{
        m_lSend.PushBack ( data.GetToken ( ":", 2 ), data.GetToken ( ":", 1, 1 ) );
        WriteTextFile ();
}


void CX3Overlay::WriteTextFile()
{
        m_lCurrentTime = timeGetTime();

        FILE *id;
        char buf[1000];
        sprintf_s ( buf, 1000, "t/%s%s.xml", m_sLang.c_str(), m_sTextfile.c_str() );
        if ( !fopen_s ( &id, buf, "w" ) )
        {
                fputs ( "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n", id );
                sprintf_s ( buf, 1000, "<language id=\"%s\">\r\n", m_sLang.c_str() );
                fputs ( buf, id );

                // write the page block
                sprintf_s ( buf, 1000, "<page id=\"%s\" title=\"Custom Gui Send Data\">\r\n", m_sTextfile.c_str() );
                fputs ( buf, id );

                // write the current time, to check if its been used in game
                sprintf_s ( buf, 1000, "  <t id=\"1\">%ld</t>\r\n", m_lCurrentTime );
                fputs ( buf, id );

                // write the sent data
                sprintf_s ( buf, 1000, "  <t id=\"2\">%d</t>\r\n", m_lSend.Count() );
                fputs ( buf, id );

                int num = 10;
                for ( SStringList *node = m_lSend.Head(); node; node = node->next, num += 10 )
                {
                        sprintf_s ( buf, 1000, "  <t id=\"%d\">%s</t>\r\n", num, node->data.c_str() );
                        fputs ( buf, id );
                        sprintf_s ( buf, 1000, "  <t id=\"%d\">%s</t>\r\n", num + 1, node->str.GetToken ( ":", 1, 1 ).c_str() );
                        fputs ( buf, id );
                        CyString s = node->str.GetToken ( ":", 2 );
                        if ( !s.Empty() )
                        {
                                sprintf_s ( buf, 1000, "  <t id=\"%d\">%s</t>\r\n", num + 2, s.c_str() );
                                fputs ( buf, id );
                        }
                }

                // finish the file
                fputs ( "</page>\r\n", id );
                fputs ( "</language>\r\n", id );
                fclose ( id );
        }
}