mirror of
https://github.com/kevinbentley/Descent3.git
synced 2025-01-22 19:55:23 +00:00
379 lines
8.9 KiB
C++
379 lines
8.9 KiB
C++
/*
|
|
* Descent 3
|
|
* Copyright (C) 2024 Parallax Software
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
// BriefManage.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "BriefManage.h"
|
|
#include "editor.h"
|
|
#include "ddio.h"
|
|
#include "manage.h"
|
|
#include "pserror.h"
|
|
#include "pstypes.h"
|
|
#include "gamefile.h"
|
|
#include "soundpage.h"
|
|
#include "editlinedialog.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CBriefManage dialog
|
|
|
|
CBriefManage::CBriefManage(CWnd *pParent /*=NULL*/) : CDialog(CBriefManage::IDD, pParent) {
|
|
//{{AFX_DATA_INIT(CBriefManage)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
void CBriefManage::DoDataExchange(CDataExchange *pDX) {
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CBriefManage)
|
|
DDX_Control(pDX, IDC_LIST, m_List);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CBriefManage, CDialog)
|
|
//{{AFX_MSG_MAP(CBriefManage)
|
|
ON_BN_CLICKED(IDC_ADD, OnAdd)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CBriefManage message handlers
|
|
bool AddNewGameFile(char *fullpath, char *directory);
|
|
bool CheckInGamefile(char *tempbuffer, bool show_ok_confirmation);
|
|
void CBriefManage::OnAdd() {
|
|
if (!Network_up) {
|
|
MessageBox("You need to say YES on the data update when starting the editor");
|
|
return;
|
|
}
|
|
|
|
int sel = m_List.GetCurSel();
|
|
if (sel == LB_ERR) {
|
|
MessageBox("Please select the file you want to add");
|
|
return;
|
|
}
|
|
|
|
char full_buffer[_MAX_PATH + 100];
|
|
m_List.GetText(sel, full_buffer);
|
|
|
|
int page_type = -1;
|
|
char *ptr;
|
|
|
|
// break it down
|
|
ptr = full_buffer + strlen(full_buffer);
|
|
|
|
while (ptr > full_buffer && (*ptr) != '|')
|
|
ptr--;
|
|
|
|
if (*ptr != '|') {
|
|
MessageBox("Internal Error");
|
|
Int3(); // get jeff;
|
|
return;
|
|
}
|
|
|
|
*ptr = '\0';
|
|
ptr++;
|
|
|
|
if (page_type == -1 && strstr(ptr, "[sound]"))
|
|
page_type = PAGETYPE_SOUND;
|
|
if (page_type == -1 && strstr(ptr, "[file]"))
|
|
page_type = PAGETYPE_GAMEFILE;
|
|
|
|
if (page_type == -1) {
|
|
MessageBox("Internal Error");
|
|
Int3(); // get Jeff
|
|
return;
|
|
}
|
|
|
|
if (page_type == PAGETYPE_SOUND) {
|
|
MessageBox("You must add sounds in the sound dialog");
|
|
return;
|
|
}
|
|
|
|
switch (page_type) {
|
|
case PAGETYPE_GAMEFILE: {
|
|
char filename[255];
|
|
char real_filename[_MAX_PATH];
|
|
|
|
strcpy(filename, full_buffer);
|
|
|
|
// Get the filename of the representing image
|
|
CString filter = "";
|
|
|
|
if (!OpenFileDialog(this, (LPCTSTR)filter, filename, Current_files_dir, sizeof(Current_files_dir)))
|
|
return;
|
|
|
|
char directory[32], ext[32];
|
|
bool know_dir = false;
|
|
|
|
ddio_SplitPath(filename, NULL, real_filename, ext);
|
|
strcat(real_filename, ext);
|
|
|
|
if (!know_dir && !stricmp(ext, ".ogf")) {
|
|
know_dir = true;
|
|
strcpy(directory, "graphics");
|
|
}
|
|
|
|
if (!know_dir && !stricmp(ext, ".tga")) {
|
|
know_dir = true;
|
|
strcpy(directory, "graphics");
|
|
}
|
|
|
|
if (!know_dir && !stricmp(ext, ".pcx")) {
|
|
know_dir = true;
|
|
strcpy(directory, "graphics");
|
|
}
|
|
|
|
if (!know_dir && !stricmp(ext, ".oof")) {
|
|
know_dir = true;
|
|
strcpy(directory, "models");
|
|
}
|
|
|
|
if (!know_dir) {
|
|
CEditLineDialog dlg("What directory does this belong in?", "Directory", "graphics", false, this);
|
|
if (dlg.DoModal() != IDOK)
|
|
return;
|
|
|
|
strcpy(directory, dlg.GetText());
|
|
|
|
bool is_ok = false;
|
|
|
|
if (!is_ok && !stricmp(directory, "briefings"))
|
|
is_ok = true;
|
|
|
|
if (!is_ok && !stricmp(directory, "graphics"))
|
|
is_ok = true;
|
|
|
|
if (!is_ok && !stricmp(directory, "levels"))
|
|
is_ok = true;
|
|
|
|
if (!is_ok && !stricmp(directory, "misc"))
|
|
is_ok = true;
|
|
|
|
if (!is_ok && !stricmp(directory, "models"))
|
|
is_ok = true;
|
|
|
|
if (!is_ok && !stricmp(directory, "music"))
|
|
is_ok = true;
|
|
|
|
if (!is_ok && !stricmp(directory, "scripts"))
|
|
is_ok = true;
|
|
|
|
if (!is_ok && !stricmp(directory, "sounds"))
|
|
is_ok = true;
|
|
|
|
if (!is_ok) {
|
|
MessageBox("Invalid directory");
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!AddNewGameFile(filename, directory)) {
|
|
char buffer[_MAX_PATH * 2];
|
|
sprintf(buffer, "Unable to add:\r\n%s\r\nto %s", filename, directory);
|
|
MessageBox(buffer);
|
|
return;
|
|
}
|
|
|
|
// auto checkin
|
|
if (!mng_MakeLocker()) {
|
|
return;
|
|
}
|
|
|
|
if (!CheckInGamefile(real_filename, true)) {
|
|
MessageBox("Unable to auto-checkin");
|
|
}
|
|
|
|
mng_EraseLocker();
|
|
} break;
|
|
}
|
|
|
|
UpdateDialog();
|
|
}
|
|
|
|
BOOL CBriefManage::OnInitDialog() {
|
|
CDialog::OnInitDialog();
|
|
|
|
UpdateDialog();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CBriefManage::AddString(char *filename, int pagetype) {
|
|
char buffer[_MAX_PATH + 100];
|
|
char real_filename[_MAX_PATH];
|
|
char page_type[100];
|
|
char *pagename = filename;
|
|
|
|
switch (pagetype) {
|
|
case PAGETYPE_SOUND: {
|
|
// look for the page in the manage system
|
|
bool found;
|
|
|
|
found = false;
|
|
|
|
mngs_sound_page page;
|
|
|
|
if (mng_FindSpecificSoundPage(filename, &page) > 0) {
|
|
found = true;
|
|
}
|
|
|
|
if (!found) {
|
|
// ok there wasn't one in the gamefiles make sure there isn't a tracklocked
|
|
if (mng_FindTrackLock(filename, PAGETYPE_SOUND) != -1) {
|
|
// there isn't one in the track lock...this is our first compile!
|
|
found = true;
|
|
}
|
|
}
|
|
|
|
if (found) {
|
|
// we already have this in the manage system
|
|
return;
|
|
}
|
|
|
|
strcpy(page_type, "[sound]");
|
|
} break;
|
|
case PAGETYPE_GAMEFILE: {
|
|
// look for the page in the manage system
|
|
bool found;
|
|
int i;
|
|
|
|
char ext[32];
|
|
ddio_SplitPath(filename, NULL, real_filename, ext);
|
|
strcat(real_filename, ext);
|
|
pagename = real_filename;
|
|
|
|
found = false;
|
|
for (i = 0; i < MAX_GAMEFILES; i++) {
|
|
if (Gamefiles[i].used && (!stricmp(real_filename, Gamefiles[i].name))) {
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!found) {
|
|
// ok there wasn't one in the gamefiles make sure there isn't a tracklocked
|
|
if (mng_FindTrackLock(real_filename, PAGETYPE_GAMEFILE) != -1) {
|
|
// there isn't one in the track lock...this is our first compile!
|
|
found = true;
|
|
}
|
|
}
|
|
|
|
if (found) {
|
|
// we already have this in the manage system
|
|
return;
|
|
}
|
|
|
|
strcpy(page_type, "[file]");
|
|
} break;
|
|
default:
|
|
Int3();
|
|
return;
|
|
}
|
|
|
|
sprintf(buffer, "%s|%s", pagename, page_type);
|
|
|
|
// see if it's already in the list
|
|
if (m_List.FindStringExact(-1, buffer) == LB_ERR) {
|
|
m_List.AddString(buffer);
|
|
}
|
|
}
|
|
|
|
void CBriefManage::UpdateDialog(void) {
|
|
m_List.ResetContent();
|
|
|
|
int curr_screen = Briefing_root_screen;
|
|
int curr_effect;
|
|
tBriefScreen *screen;
|
|
tBriefEffect *effect;
|
|
|
|
// go through and see what we have
|
|
while (curr_screen != -1) {
|
|
screen = &Briefing_screens[curr_screen];
|
|
|
|
ASSERT(screen->used);
|
|
|
|
if (screen->layout[0] != '\0') {
|
|
// add the layout screen
|
|
AddString(screen->layout);
|
|
}
|
|
|
|
// go through all the effects for this screen
|
|
curr_effect = screen->root_effect;
|
|
while (curr_effect != -1) {
|
|
effect = &screen->effects[curr_effect];
|
|
ASSERT(effect->used);
|
|
|
|
switch (effect->type) {
|
|
case BE_MOVIE:
|
|
case BE_TEXT:
|
|
case BE_BKG:
|
|
break; // no files in here
|
|
|
|
case BE_BMP:
|
|
if (*effect->bmp_desc.filename) {
|
|
AddString(effect->bmp_desc.filename);
|
|
}
|
|
break;
|
|
|
|
case BE_POLY:
|
|
if (*effect->poly_desc.polyname) {
|
|
AddString(effect->poly_desc.polyname);
|
|
}
|
|
break;
|
|
case BE_SND:
|
|
if (*effect->snd_desc.filename) {
|
|
AddString(effect->snd_desc.filename, PAGETYPE_SOUND);
|
|
}
|
|
break;
|
|
case BE_BUTTON:
|
|
if (*effect->button_desc.filename) {
|
|
AddString(effect->button_desc.filename);
|
|
}
|
|
|
|
if (*effect->button_desc.filename_focus) {
|
|
AddString(effect->button_desc.filename_focus);
|
|
}
|
|
|
|
if (*effect->button_desc.flash_filename) {
|
|
AddString(effect->button_desc.flash_filename);
|
|
}
|
|
|
|
if (*effect->button_desc.flash_filename_focus) {
|
|
AddString(effect->button_desc.flash_filename_focus);
|
|
}
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
curr_effect = effect->next;
|
|
}
|
|
|
|
curr_screen = screen->next;
|
|
}
|
|
|
|
m_List.SetCurSel(0);
|
|
} |