Files
GDevelop/IDE/Compilation.cpp
T
Florian d9c92facda Tried to correct errors messages when saving in portable mode.
Started adding support for "dynamic extensions", meant to be written/compiled within Game Develop.
In SceneCanvas::Reload, now destroy and recreate scene member when reloading, as it is necessary for dynamic libraries for example to have explicit scene destruction when preview is ended.
Renamed GDE define to GD_IDE_ONLY.
Renamed old gdp namespace to GDpriv.

git-svn-id: svn://localhost@345 8062f311-0dae-4547-b526-b8ab9ac864a5
2011-01-09 16:54:20 +00:00

685 lines
35 KiB
C++

//(*InternalHeaders(Compilation)
#include <wx/bitmap.h>
#include <wx/settings.h>
#include <wx/intl.h>
#include <wx/image.h>
#include <wx/string.h>
//*)
#include <wx/textctrl.h>
#include <wx/icon.h>
#include <wx/image.h>
#include <wx/bitmap.h>
#include <wx/filefn.h>
#include <wx/log.h>
#include <wx/msgdlg.h>
#include <wx/dir.h>
#include <wx/help.h>
#include <wx/config.h>
#include <wx/dirdlg.h>
#include <wx/filedlg.h>
#include <wx/msgdlg.h>
#include <wx/filename.h>
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include "GDL/AES.h"
#include "GDL/Game.h"
#include "GDL/DatFile.h"
#include "GDL/OpenSaveLoadingScreen.h"
#include "GDL/OpenSaveGame.h"
#include "GDL/ResourcesMergingHelper.h"
#include "GDL/ExtensionsManager.h"
#include "GDL/HelpFileAccess.h"
#include "Compilation.h"
#include "ErrorCompilation.h"
#include "ErrorCompilation.h"
#include "ExecutableIconChanger.h"
using namespace std;
//(*IdInit(Compilation)
const long Compilation::ID_STATICBITMAP3 = wxNewId();
const long Compilation::ID_STATICTEXT1 = wxNewId();
const long Compilation::ID_PANEL1 = wxNewId();
const long Compilation::ID_STATICLINE1 = wxNewId();
const long Compilation::ID_STATICTEXT4 = wxNewId();
const long Compilation::ID_RADIOBOX1 = wxNewId();
const long Compilation::ID_BUTTON8 = wxNewId();
const long Compilation::ID_PANEL5 = wxNewId();
const long Compilation::ID_STATICTEXT5 = wxNewId();
const long Compilation::ID_STATICBITMAP1 = wxNewId();
const long Compilation::ID_CHECKBOX1 = wxNewId();
const long Compilation::ID_STATICBITMAP2 = wxNewId();
const long Compilation::ID_CHECKBOX2 = wxNewId();
const long Compilation::ID_BUTTON9 = wxNewId();
const long Compilation::ID_PANEL2 = wxNewId();
const long Compilation::ID_STATICTEXT6 = wxNewId();
const long Compilation::ID_BUTTON1 = wxNewId();
const long Compilation::ID_GAUGE1 = wxNewId();
const long Compilation::ID_STATICTEXT2 = wxNewId();
const long Compilation::ID_STATICTEXT3 = wxNewId();
const long Compilation::ID_PANEL3 = wxNewId();
const long Compilation::ID_STATICTEXT7 = wxNewId();
const long Compilation::ID_BUTTON3 = wxNewId();
const long Compilation::ID_BUTTON7 = wxNewId();
const long Compilation::ID_BUTTON5 = wxNewId();
const long Compilation::ID_PANEL4 = wxNewId();
const long Compilation::ID_NOTEBOOK1 = wxNewId();
const long Compilation::ID_STATICLINE2 = wxNewId();
const long Compilation::ID_BUTTON4 = wxNewId();
const long Compilation::ID_BUTTON2 = wxNewId();
//*)
BEGIN_EVENT_TABLE( Compilation, wxDialog )
//(*EventTable(Compilation)
//*)
END_EVENT_TABLE()
Compilation::Compilation( wxWindow* parent, const Game & gameToCompile_ ) :
gameToCompile(gameToCompile_)
{
//(*Initialize(Compilation)
wxStaticBoxSizer* StaticBoxSizer2;
wxFlexGridSizer* FlexGridSizer4;
wxFlexGridSizer* FlexGridSizer3;
wxFlexGridSizer* FlexGridSizer5;
wxFlexGridSizer* FlexGridSizer9;
wxFlexGridSizer* FlexGridSizer2;
wxFlexGridSizer* FlexGridSizer7;
wxStaticBoxSizer* StaticBoxSizer3;
wxFlexGridSizer* FlexGridSizer8;
wxFlexGridSizer* FlexGridSizer6;
wxStaticBoxSizer* StaticBoxSizer1;
wxFlexGridSizer* FlexGridSizer1;
wxFlexGridSizer* FlexGridSizer17;
Create(parent, wxID_ANY, _("Compilation du jeu"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, _T("wxID_ANY"));
wxIcon FrameIcon;
FrameIcon.CopyFromBitmap(wxBitmap(wxImage(_T("res/compil.png"))));
SetIcon(FrameIcon);
FlexGridSizer1 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer1->AddGrowableCol(0);
FlexGridSizer1->AddGrowableRow(1);
FlexGridSizer17 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer17->AddGrowableCol(0);
Panel1 = new wxPanel(this, ID_PANEL1, wxDefaultPosition, wxSize(420,54), wxTAB_TRAVERSAL, _T("ID_PANEL1"));
Panel1->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
FlexGridSizer6 = new wxFlexGridSizer(0, 3, 0, 0);
StaticBitmap3 = new wxStaticBitmap(Panel1, ID_STATICBITMAP3, wxBitmap(wxImage(_T("res/compilation.png"))), wxDefaultPosition, wxDefaultSize, wxNO_BORDER, _T("ID_STATICBITMAP3"));
FlexGridSizer6->Add(StaticBitmap3, 1, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5);
StaticText1 = new wxStaticText(Panel1, ID_STATICTEXT1, _("La compilation permet de rassembler \ntous les éléments de votre jeu de façon \nà pouvoir le distribuer.\nLes futurs joueurs n\'auront pas besoin \nde posséder Game Develop."), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE, _T("ID_STATICTEXT1"));
FlexGridSizer6->Add(StaticText1, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
Panel1->SetSizer(FlexGridSizer6);
FlexGridSizer6->SetSizeHints(Panel1);
FlexGridSizer17->Add(Panel1, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
StaticLine1 = new wxStaticLine(this, ID_STATICLINE1, wxDefaultPosition, wxSize(10,-1), wxLI_HORIZONTAL, _T("ID_STATICLINE1"));
FlexGridSizer17->Add(StaticLine1, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
FlexGridSizer1->Add(FlexGridSizer17, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
Notebook1 = new wxNotebook(this, ID_NOTEBOOK1, wxDefaultPosition, wxDefaultSize, 0, _T("ID_NOTEBOOK1"));
Panel5 = new wxPanel(Notebook1, ID_PANEL5, wxPoint(6,4), wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL5"));
FlexGridSizer7 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer7->AddGrowableCol(0);
FlexGridSizer7->AddGrowableRow(2);
StaticText4 = new wxStaticText(Panel5, ID_STATICTEXT4, _("Game Develop vous propose deux types de compilation :\n\n-La compilation simple créé un dossier rassemblant les ressources \n( images, sons... ) du jeu et l\'executable.\n\n-La compilation en un fichier unique rassemble votre jeu en un fichier\nunique, qui contient l\'ensemble du jeu."), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT4"));
FlexGridSizer7->Add(StaticText4, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
wxString __wxRadioBoxChoices_1[2] =
{
_("Simple ( dossier contenant jeu et ressources )"),
_("Fichier exécutable unique ( compressé )")
};
TypeBox = new wxRadioBox(Panel5, ID_RADIOBOX1, _("Choisissez le type de compilation :"), wxPoint(16,32), wxDefaultSize, 2, __wxRadioBoxChoices_1, 1, 0, wxDefaultValidator, _T("ID_RADIOBOX1"));
FlexGridSizer7->Add(TypeBox, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
Button4 = new wxButton(Panel5, ID_BUTTON8, _("Suivant"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON8"));
FlexGridSizer7->Add(Button4, 1, wxALL|wxALIGN_RIGHT|wxALIGN_BOTTOM, 5);
Panel5->SetSizer(FlexGridSizer7);
FlexGridSizer7->Fit(Panel5);
FlexGridSizer7->SetSizeHints(Panel5);
Panel2 = new wxPanel(Notebook1, ID_PANEL2, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL2"));
FlexGridSizer5 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer5->AddGrowableCol(0);
FlexGridSizer5->AddGrowableRow(2);
StaticText5 = new wxStaticText(Panel2, ID_STATICTEXT5, _("Game Develop permet de générer votre jeu pour Microsoft Windows\net pour GNU/Linux. Notez cependant que la compilation en mode\n\"Fichier executable unique\" n\'est pas disponible pour GNU/Linux."), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT5"));
FlexGridSizer5->Add(StaticText5, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
StaticBoxSizer1 = new wxStaticBoxSizer(wxHORIZONTAL, Panel2, _("Choisissez le(s) système(s) cible(s)"));
FlexGridSizer8 = new wxFlexGridSizer(0, 2, 0, 0);
StaticBitmap1 = new wxStaticBitmap(Panel2, ID_STATICBITMAP1, wxBitmap(wxImage(_T("res/win-logo.png"))), wxDefaultPosition, wxDefaultSize, wxNO_BORDER, _T("ID_STATICBITMAP1"));
FlexGridSizer8->Add(StaticBitmap1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
WinCheck = new wxCheckBox(Panel2, ID_CHECKBOX1, _("Microsoft Windows"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_CHECKBOX1"));
WinCheck->SetValue(true);
FlexGridSizer8->Add(WinCheck, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
StaticBitmap2 = new wxStaticBitmap(Panel2, ID_STATICBITMAP2, wxBitmap(wxImage(_T("res/linux-logo.png"))), wxDefaultPosition, wxDefaultSize, wxNO_BORDER, _T("ID_STATICBITMAP2"));
FlexGridSizer8->Add(StaticBitmap2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
LinuxCheck = new wxCheckBox(Panel2, ID_CHECKBOX2, _("GNU/Linux"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_CHECKBOX2"));
LinuxCheck->SetValue(true);
FlexGridSizer8->Add(LinuxCheck, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
StaticBoxSizer1->Add(FlexGridSizer8, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
FlexGridSizer5->Add(StaticBoxSizer1, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
Button5 = new wxButton(Panel2, ID_BUTTON9, _("Suivant"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON9"));
FlexGridSizer5->Add(Button5, 1, wxALL|wxALIGN_RIGHT|wxALIGN_BOTTOM, 5);
Panel2->SetSizer(FlexGridSizer5);
FlexGridSizer5->Fit(Panel2);
FlexGridSizer5->SetSizeHints(Panel2);
Panel3 = new wxPanel(Notebook1, ID_PANEL3, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL3"));
FlexGridSizer2 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer2->AddGrowableCol(0);
StaticText6 = new wxStaticText(Panel3, ID_STATICTEXT6, _("Game Develop est prêt à générer votre jeu !\nCliquez sur \"Lancer la compilation\", choisissez le répertoire ou le fichier\noù enregistrer votre jeu, et patientez jusqu\'à la fin du processus."), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT6"));
FlexGridSizer2->Add(StaticText6, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
CompilBt = new wxButton(Panel3, ID_BUTTON1, _("Lancer la compilation"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1"));
FlexGridSizer2->Add(CompilBt, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
StaticBoxSizer2 = new wxStaticBoxSizer(wxVERTICAL, Panel3, _("Avancement"));
FlexGridSizer9 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer9->AddGrowableCol(0);
FlexGridSizer9->AddGrowableRow(0);
AvancementGauge = new wxGauge(Panel3, ID_GAUGE1, 100, wxDefaultPosition, wxSize(238,28), 0, wxDefaultValidator, _T("ID_GAUGE1"));
FlexGridSizer9->Add(AvancementGauge, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
StaticText2 = new wxStaticText(Panel3, ID_STATICTEXT2, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT2"));
FlexGridSizer9->Add(StaticText2, 1, wxBOTTOM|wxLEFT|wxRIGHT|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 0);
StaticText3 = new wxStaticText(Panel3, ID_STATICTEXT3, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT3"));
FlexGridSizer9->Add(StaticText3, 1, wxTOP|wxLEFT|wxRIGHT|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 0);
StaticBoxSizer2->Add(FlexGridSizer9, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
FlexGridSizer2->Add(StaticBoxSizer2, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
Panel3->SetSizer(FlexGridSizer2);
FlexGridSizer2->Fit(Panel3);
FlexGridSizer2->SetSizeHints(Panel3);
Panel4 = new wxPanel(Notebook1, ID_PANEL4, wxPoint(205,2), wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL4"));
FlexGridSizer4 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer4->AddGrowableCol(0);
StaticText7 = new wxStaticText(Panel4, ID_STATICTEXT7, _("La compilation est terminée. \nSi Game Develop ne vous a rapporté aucune erreur, vous pouvez \nretrouver votre jeu dans le dossier suivant :"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT7"));
FlexGridSizer4->Add(StaticText7, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
OuvrirBt = new wxButton(Panel4, ID_BUTTON3, _("Ouvrir le dossier contenant le jeu"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON3"));
FlexGridSizer4->Add(OuvrirBt, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
StaticBoxSizer3 = new wxStaticBoxSizer(wxVERTICAL, Panel4, _("Découvrez maintenant comment..."));
DistribuerBt = new wxButton(Panel4, ID_BUTTON7, _("Distribuer votre jeu"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON7"));
StaticBoxSizer3->Add(DistribuerBt, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
CGShareBt = new wxButton(Panel4, ID_BUTTON5, _("L\'inscrire sur Compil Games Share"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON5"));
StaticBoxSizer3->Add(CGShareBt, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
FlexGridSizer4->Add(StaticBoxSizer3, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
Panel4->SetSizer(FlexGridSizer4);
FlexGridSizer4->Fit(Panel4);
FlexGridSizer4->SetSizeHints(Panel4);
Notebook1->AddPage(Panel5, _("Type de compilation"), false);
Notebook1->AddPage(Panel2, _("Système cible"), false);
Notebook1->AddPage(Panel3, _("Lancement"), false);
Notebook1->AddPage(Panel4, _("Finalisation"), false);
FlexGridSizer1->Add(Notebook1, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
StaticLine2 = new wxStaticLine(this, ID_STATICLINE2, wxDefaultPosition, wxSize(10,-1), wxLI_HORIZONTAL, _T("ID_STATICLINE2"));
FlexGridSizer1->Add(StaticLine2, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
FlexGridSizer3 = new wxFlexGridSizer(0, 2, 0, 0);
FlexGridSizer3->AddGrowableCol(0);
AideBt = new wxButton(this, ID_BUTTON4, _("Aide"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON4"));
FlexGridSizer3->Add(AideBt, 1, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5);
FermerBt = new wxButton(this, ID_BUTTON2, _("Fermer"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON2"));
FlexGridSizer3->Add(FermerBt, 1, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5);
FlexGridSizer1->Add(FlexGridSizer3, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
SetSizer(FlexGridSizer1);
FlexGridSizer1->Fit(this);
FlexGridSizer1->SetSizeHints(this);
Center();
Connect(ID_BUTTON8,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&Compilation::OnNext1Click);
Connect(ID_BUTTON9,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&Compilation::OnNext2Click);
Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&Compilation::OnCompilBtClick);
Connect(ID_BUTTON3,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&Compilation::OnOuvrirBtClick);
Connect(ID_BUTTON7,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&Compilation::OnDistribuerBtClick);
Connect(ID_BUTTON5,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&Compilation::OnCGShareBtClick);
Connect(ID_BUTTON4,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&Compilation::OnAideBtClick);
Connect(ID_BUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&Compilation::OnFermerBtClick);
//*)
Panel4->Enable(false);
}
Compilation::~Compilation()
{
//(*Destroy(Compilation)
//*)
}
void Compilation::OnFermerBtClick( wxCommandEvent& event )
{
EndModal( 0 );
}
void Compilation::OnCompilBtClick( wxCommandEvent& event )
{
wxLogNull noLogPlease;
wxString repTemp = GetTempDir();
string report;
std::string winExecutableName = gameToCompile.winExecutableFilename.empty() ? "Game.exe" : gameToCompile.winExecutableFilename+".exe";
std::string linuxExecutableName = gameToCompile.linuxExecutableFilename.empty() ? "GameLinux" : gameToCompile.linuxExecutableFilename;
destinationDirectory = "";
if ( TypeBox->GetSelection() == 0 )
{
wxDirDialog dialog(this, _("Choisissez un dossier, vierge de préférence, où créer le jeu."));
dialog.ShowModal();
if ( dialog.GetPath().empty() )
{
wxMessageBox(_("Vous devez choisir un répertoire où créer le jeu."), _("Compilation annulée"));
return;
}
destinationDirectory = dialog.GetPath();
}
ClearDirectory(string(repTemp.mb_str()), report); //Préparation du répertoire
//Copie du jeu
Game game = gameToCompile;
//Prepare resources to copy
StaticText3->SetLabel( "Préparation des ressources..." );
ResourcesMergingHelper resourcesMergingHelper;
//Add images
for ( unsigned int i = 0;i < game.images.size() ;i++ )
{
StaticText2->SetLabel( game.images[i].nom );
game.images[i].file = resourcesMergingHelper.GetNewFilename(game.images[i].file);
}
resourcesMergingHelper.GetNewFilename("vide.png");
if ( !game.loadingScreen.imageFichier.empty() )
game.loadingScreen.imageFichier = resourcesMergingHelper.GetNewFilename( game.loadingScreen.imageFichier );
//Add scenes resources
for ( unsigned int i = 0;i < game.scenes.size();i++ )
{
for (unsigned int j = 0;j<game.scenes[i]->initialObjects.size();++j) //Add objects resources
game.scenes[i]->initialObjects[j]->PrepareResourcesForMerging(resourcesMergingHelper);
InventoryEventsResources(game, game.scenes[i]->events, resourcesMergingHelper);
}
for (unsigned int j = 0;j<game.globalObjects.size();++j) //Add global objects resources
game.globalObjects[j]->PrepareResourcesForMerging(resourcesMergingHelper);
//Now copy resources
StaticText3->SetLabel( "Copie des ressources..." );
map<string, string> & resourcesNewFilename = resourcesMergingHelper.GetAllResourcesNewFilename();
unsigned int i = 0;
for(map<string, string>::const_iterator it = resourcesNewFilename.begin(); it != resourcesNewFilename.end(); ++it)
{
if ( !it->first.empty() && wxCopyFile( it->first, repTemp + "/" + it->second, true ) == false )
report += _( "Impossible de copier \""+it->first+"\" dans le répertoire de compilation.\n" );
++i;
AvancementGauge->SetValue( i / static_cast<float>(resourcesNewFilename.size())*100.f / 3.f );
wxSafeYield();
}
wxSafeYield();
StaticText3->SetLabel( "Compilation du jeu..." );
StaticText2->SetLabel( "Etape 1 sur 3" );
OpenSaveGame saveGame( game );
saveGame.SaveToFile(static_cast<string>( repTemp + "/compil.gdg" ));
AvancementGauge->SetValue(70);
wxSafeYield();
StaticText2->SetLabel( "Etape 2 sur 3" );
//Création du fichier source
{
ifstream ifile(repTemp+"/compil.gdg",ios_base::binary);
ofstream ofile(repTemp+"/src",ios_base::binary);
// get file size
ifile.seekg(0,ios_base::end);
int size,fsize = ifile.tellg();
ifile.seekg(0,ios_base::beg);
// round up (ignore pad for here)
size = (fsize+15)&(~15);
char * ibuffer = new char[size];
char * obuffer = new char[size];
ifile.read(ibuffer,fsize);
AES crypt;
crypt.SetParameters(192);
unsigned char key[] = "-P:j$4t&OHIUVM/Z+u4DeDP.";
crypt.StartEncryption(key);
crypt.Encrypt(reinterpret_cast<const unsigned char*>(ibuffer),reinterpret_cast<unsigned char*>(obuffer),size/16);
ofile.write(obuffer,size);
delete [] ibuffer;
delete [] obuffer;
ofile.close();
ifile.close();
}
wxRemoveFile( repTemp + "/compil.gdg" );
AvancementGauge->SetValue(80);
OpenSaveLoadingScreen saveLS(game.loadingScreen);
saveLS.SaveToFile(string(repTemp + "/loadingscreen"));
//Création du fichier gam.egd
StaticText2->SetLabel( "Etape 3 sur 3" );
wxSafeYield();
//On créé une liste avec tous les fichiers
vector < string > files;
{
wxString file = wxFindFirstFile( repTemp + "/*" );
while ( !file.empty() )
{
wxFileName filename(file);
files.push_back( static_cast<string>(filename.GetFullName()) );
file = wxFindNextFile();
}
}
//On créé le fichier à partir des fichiers
DatFile gameDatFile;
gameDatFile.Create(files, static_cast<string>(repTemp), static_cast<string>(repTemp + "/gam.egd"));
//On supprime maintenant tout le superflu
{
wxString file = wxFindFirstFile( repTemp + "/*" );
while ( !file.empty() )
{
wxFileName filename(file);
if ( filename.GetFullName() != "gam.egd" ) //On supprime tout sauf gam.egd
{
if ( !wxRemoveFile( file ) )
report += _( "Impossible de supprimer le fichier " + file + " situé dans le répertoire de compilation.\n" );
}
file = wxFindNextFile();
}
}
AvancementGauge->SetValue(90);
StaticText3->SetLabel( "Exportation du jeu..." );
StaticText2->SetLabel( "" );
wxSafeYield();
//Copy extensions
GDpriv::ExtensionsManager * extensionsManager = GDpriv::ExtensionsManager::getInstance();
for (unsigned int i = 0;i<game.extensionsUsed.size();++i)
{
//Builtin extensions does not have a namespace.
boost::shared_ptr<ExtensionBase> extension = extensionsManager->GetExtension(game.extensionsUsed[i]);
if ( extension != boost::shared_ptr<ExtensionBase>() &&
( extension->GetNameSpace() != "" || extension->GetName() == "CommonDialogs" )
&& extension->GetName() != "BuiltinCommonInstructions" ) //Extension with a namespace but builtin
{
if ( WinCheck->GetValue())
{
if ( wxCopyFile( "Extensions/"+game.extensionsUsed[i]+".xgdw", repTemp + "/" + game.extensionsUsed[i]+".xgdw", true ) == false )
report += _( "Impossible de copier l'extension \""+game.extensionsUsed[i]+"\" pour Windows dans le répertoire de compilation.\n" );
const std::vector < std::pair<std::string, std::string> > & supplementaryFiles = extension->GetSupplementaryRuntimeFiles();
for (unsigned int i = 0;i<supplementaryFiles.size();++i)
{
if ( supplementaryFiles[i].first == "Windows"
&& wxCopyFile( supplementaryFiles[i].second, repTemp + "/" + supplementaryFiles[i].second, true ) == false )
report += _( "Impossible de copier \""+supplementaryFiles[i].second+"\" pour Windows dans le répertoire de compilation.\n" );
}
}
if ( LinuxCheck->GetValue() )
{
if ( wxCopyFile( "Extensions/"+game.extensionsUsed[i]+".xgdl", repTemp + "/"+game.extensionsUsed[i]+".xgdl", true ) == false )
report += _( "Impossible de copier l'extension \""+game.extensionsUsed[i]+"\" pour Linux dans le répertoire de compilation.\n" );
const std::vector < std::pair<std::string, std::string> > & supplementaryFiles = extension->GetSupplementaryRuntimeFiles();
for (unsigned int i = 0;i<supplementaryFiles.size();++i)
{
if ( supplementaryFiles[i].first == "Linux"
&& wxCopyFile( supplementaryFiles[i].second, repTemp + "/" + supplementaryFiles[i].second, true ) == false )
report += _( "Impossible de copier \""+supplementaryFiles[i].second+"\" pour Linux dans le répertoire de compilation.\n" );
}
}
}
}
//Copie des derniers fichiers
if ( TypeBox->GetSelection() == 0 )
{
//Fichier pour windows
if ( WinCheck->GetValue() )
{
if ( wxCopyFile( "Runtime/PlayWin.exe", repTemp + "/" + winExecutableName, true ) == false )
report += _( "Impossible de créer l'executable Windows dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/gdl.dll", repTemp + "/gdl.dll", true ) == false )
report += _( "Impossible de créer l'executable gdl.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "sfml-audio.dll", repTemp + "/sfml-audio.dll", true ) == false )
report += _( "Impossible de créer l'executable sfml-audio.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "sfml-graphics.dll", repTemp + "/sfml-graphics.dll", true ) == false )
report += _( "Impossible de créer l'executable sfml-graphics.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "sfml-network.dll", repTemp + "/sfml-network.dll", true ) == false )
report += _( "Impossible de créer l'executable sfml-network.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "sfml-system.dll", repTemp + "/sfml-system.dll", true ) == false )
report += _( "Impossible de créer l'executable sfml-system.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "sfml-window.dll", repTemp + "/sfml-window.dll", true ) == false )
report += _( "Impossible de créer l'executable sfml-window.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "libsndfile-1.dll", repTemp + "/libsndfile-1.dll", true ) == false )
report += _( "Impossible de copier libsndfile-1.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "openal32.dll", repTemp + "/openal32.dll", true ) == false )
report += _( "Impossible de copier openal32.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "mingwm10.dll", repTemp + "/mingwm10.dll", true ) == false )
report += _( "Impossible de copier mingwm10.dll dans le répertoire de compilation.\n" );
}
//Fichiers pour linux
if ( LinuxCheck->GetValue() )
{
if ( wxCopyFile( "Runtime/ExeLinux", repTemp + "/ExeLinux", true ) == false )
report += _( "Impossible de créer l'executable Linux dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/PlayLinux", repTemp + "/" + linuxExecutableName, true ) == false )
report += _( "Impossible de créer le script executable Linux dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/libFLAC.so.7", repTemp + "/libFLAC.so.7", true ) == false )
report += _( "Impossible de créer libFLAC.so.7 dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/libfreetype.so.6", repTemp + "/libfreetype.so.6", true ) == false )
report += _( "Impossible de créer libfreetype.so.6 dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/libgdl.so", repTemp + "/libgdl.so", true ) == false )
report += _( "Impossible de créer libgdl.so dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/libopenal.so.0", repTemp + "/libopenal.so.0", true ) == false )
report += _( "Impossible de créer libopenal.so.0 dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/libsfml2-audio.so", repTemp + "/libsfml2-audio.so", true ) == false )
report += _( "Impossible de créer libsfml2-audio.so dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/libsfml2-graphics.so", repTemp + "/libsfml2-graphics.so", true ) == false )
report += _( "Impossible de créer libsfml2-graphics.so dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/libsfml2-network.so", repTemp + "/libsfml2-network.so", true ) == false )
report += _( "Impossible de créer libsfml2-network.so dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/libsfml2-system.so", repTemp + "/libsfml2-system.so", true ) == false )
report += _( "Impossible de créer libsfml2-system.so dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/libsfml2-system.so", repTemp + "/libsfml2-system.so", true ) == false )
report += _( "Impossible de créer libsfml2-system.so dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/libsfml2-window.so", repTemp + "/libsfml2-window.so", true ) == false )
report += _( "Impossible de créer libsfml2-window.so dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/libsndfile.so.1", repTemp + "/libsndfile.so.1", true ) == false )
report += _( "Impossible de créer libsndfile.so.1 dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/libGLEW.so.1.3", repTemp + "/libGLEW.so.1.3", true ) == false )
report += _( "Impossible de créer libGLEW.so.1.3 dans le répertoire de compilation.\n" );
}
//Copie du tout dans le répertoire final
wxString file = wxFindFirstFile( repTemp + "/*" );
while ( !file.empty() )
{
wxFileName fileName(file);
if ( !wxCopyFile( file, destinationDirectory + "/" + fileName.GetFullName(), true ) )
report += _( "Impossible de copier le fichier " + file + " depuis le répertoire de compilation vers le répertoire final.\n" );
file = wxFindNextFile();
}
}
else
{
if ( WinCheck->GetValue() )
{
if ( wxCopyFile( "Runtime/PlayWin.exe", repTemp + "/setup.exe", true ) == false )
report += _( "Impossible de créer l'executable Windows dans le répertoire de compilation.\n" );
if ( wxCopyFile( "Runtime/gdl.dll", repTemp + "/gdl.dll", true ) == false )
report += _( "Impossible de créer l'executable gdl.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "sfml-audio.dll", repTemp + "/sfml-audio.dll", true ) == false )
report += _( "Impossible de créer l'executable sfml-audio.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "sfml-graphics.dll", repTemp + "/sfml-graphics.dll", true ) == false )
report += _( "Impossible de créer l'executable sfml-graphics.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "sfml-network.dll", repTemp + "/sfml-network.dll", true ) == false )
report += _( "Impossible de créer l'executable sfml-network.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "sfml-system.dll", repTemp + "/sfml-system.dll", true ) == false )
report += _( "Impossible de créer l'executable sfml-system.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "sfml-window.dll", repTemp + "/sfml-window.dll", true ) == false )
report += _( "Impossible de créer l'executable sfml-window.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "libsndfile-1.dll", repTemp + "/libsndfile-1.dll", true ) == false )
report += _( "Impossible de copier libsndfile-1.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "openal32.dll", repTemp + "/openal32.dll", true ) == false )
report += _( "Impossible de copier openal32.dll dans le répertoire de compilation.\n" );
if ( wxCopyFile( "mingwm10.dll", repTemp + "/mingwm10.dll", true ) == false )
report += _( "Impossible de copier mingwm10.dll dans le répertoire de compilation.\n" );
//Compression en un seul fichier
StaticText3->SetLabel( "Exportation du jeu... ( Compression )" );
wxRemoveFile( "MonJeu.exe" );
wxArrayString arrStdOut, arrStdErr;
wxExecute( _T( "7za.exe a -sfx7zS.sfx \""+ repTemp +"/"+winExecutableName+"\" \"" + repTemp + "/*\"" ), arrStdOut, arrStdErr, wxEXEC_SYNC | wxEXEC_NOHIDE );
//Copie du fichier
if ( !wxCopyFile(repTemp +"/"+winExecutableName, destinationDirectory+"/"+winExecutableName) )
report += _( "Impossible de copier le fichier "+winExecutableName+" depuis le répertoire de compilation vers le répertoire final.\n" );
}
if ( LinuxCheck->GetValue() )
{
wxMessageBox( _( "La création d'un executable seul n'est pas disponible pour GNU/linux." ), _( "Non disponible" ), wxOK );
}
}
//Prepare executables
#if defined(WINDOWS)
if ( WinCheck->GetValue() )
ExecutableIconChanger::ChangeWindowsExecutableIcon(string(destinationDirectory+"/"+winExecutableName), game.winExecutableIconFile);
#endif
StaticText3->SetLabel( "Compilation terminée" );
StaticText2->SetLabel( "" );
AvancementGauge->SetValue( 100 );
//Display errors if needed
if ( !report.empty() )
{
ErrorCompilation dialog( this, report );
dialog.ShowModal();
}
//Go to last page
Panel4->Enable(true);
Notebook1->SetSelection(3);
}
void Compilation::OnOuvrirBtClick( wxCommandEvent& event )
{
wxExecute("explorer.exe \""+string(destinationDirectory.mb_str())+"\"");
}
void Compilation::OnAideBtClick( wxCommandEvent& event )
{
HelpFileAccess * helpFileAccess = HelpFileAccess::getInstance();
helpFileAccess->DisplaySection(125);
}
/**
* Return a temporary directory
*/
wxString Compilation::GetTempDir()
{
wxConfigBase *pConfig = wxConfigBase::Get();
wxString * result = new wxString();
pConfig->Read( _T( "/Dossier/Compilation" ), result );
wxString repTemp = *result;
if ( repTemp == "" ) //If the user has not forced a directory
{
repTemp = wxFileName::GetHomeDir()+"/.Game Develop/";
if ( !wxFileName::IsDirWritable(repTemp) )
repTemp = wxGetCwd();
if ( !wxFileName::IsDirWritable(repTemp) )
repTemp = wxFileName::GetHomeDir();
if ( !wxFileName::IsDirWritable(repTemp) )
wxMessageBox(_("Game Develop n'a pas réussi à trouver un répertoire temporaire pour la compilation.\nSi la compilation échoue, allez dans les préférences et choisissez un répertoire temporaire où vous avez les droits d'écriture."), _("La compilation risque d'échouer."), wxICON_EXCLAMATION);
}
return repTemp + "/Compil";
}
void Compilation::OnCGShareBtClick(wxCommandEvent& event)
{
HelpFileAccess * helpFileAccess = HelpFileAccess::getInstance();
helpFileAccess->DisplaySection(192);
}
void Compilation::OnDistribuerBtClick(wxCommandEvent& event)
{
HelpFileAccess * helpFileAccess = HelpFileAccess::getInstance();
helpFileAccess->DisplaySection(158);
}
void Compilation::OnNext1Click(wxCommandEvent& event)
{
Notebook1->SetSelection(1);
}
void Compilation::OnNext2Click(wxCommandEvent& event)
{
Notebook1->SetSelection(2);
}
void Compilation::ClearDirectory(std::string directory, string & report)
{
if ( !wxDirExists( directory ) && !wxMkdir( directory ) )
report += _( "Impossible de créer le répertoire : " + directory + "\n" );
wxString file = wxFindFirstFile( directory + "/*" );
while ( !file.empty() )
{
if ( !wxRemoveFile( file ) )
report += _( "Impossible de supprimer le fichier " + file + " situé dans le répertoire "+directory+".\n" );
file = wxFindNextFile();
}
}