Descent3/editor/WorldSoundsDialog.cpp

1190 lines
33 KiB
C++
Raw Normal View History

/*
2024-06-15 18:12:48 +00:00
* 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/>.
--- HISTORICAL COMMENTS FOLLOW ---
* $Logfile: /DescentIII/Main/editor/WorldSoundsDialog.cpp $
* $Revision: 1.1.1.1 $
* $Date: 2003-08-26 03:57:40 $
* $Author: kevinb $
*
* Sound page dialog
*
* $Log: not supported by cvs2svn $
2024-06-15 18:12:48 +00:00
*
* 29 4/21/99 5:55p Jason
* added override button to sound page
2024-06-15 18:12:48 +00:00
*
* 28 2/23/99 11:26a Matt
* Cleaned up sounds dialog
2024-06-15 18:12:48 +00:00
*
* 27 11/06/98 12:34p Jason
* more speedups for manage system
2024-06-15 18:12:48 +00:00
*
* 26 10/22/98 8:31p Chris
* Sounds use GlobalAlloc and GlobalFree
2024-06-15 18:12:48 +00:00
*
* 25 10/19/98 1:21p Chris
* Improve the volume import scaling code
2024-06-15 18:12:48 +00:00
*
* 24 10/19/98 11:57a Chris
* Update the sound system to use the import volume
2024-06-15 18:12:48 +00:00
*
* 23 10/14/98 12:09p Jason
* fixed some long standing name problems
2024-06-15 18:12:48 +00:00
*
* 22 9/21/98 8:18p Chris
* Removed annoying mprints
2024-06-15 18:12:48 +00:00
*
* 21 6/29/98 10:35p Chris
* Added support for once per object
2024-06-15 18:12:48 +00:00
*
* 20 6/23/98 2:43p Matt
* Changed calls to OutrageMessageBox() & Debug_MessageBox() to deal with
* int return value (instead of bool).
2024-06-15 18:12:48 +00:00
*
* 19 6/19/98 3:03p Chris
* Made CheckAndForceSoundDataAlloc a SoundSystem function - useful for
* multiple mixers. Added IsSoundPlaying to the high level sound lib.
2024-06-15 18:12:48 +00:00
*
* 18 4/22/98 5:38p Chris
* Fixed problems with adding new sounds
2024-06-15 18:12:48 +00:00
*
* 17 2/15/98 7:43p Luke
2024-06-15 18:12:48 +00:00
*
* 16 2/12/98 6:07p Chris
* Fixed a problem with addsound
2024-06-15 18:12:48 +00:00
*
* 15 2/12/98 4:55p Chris
* More validation checks for sounds
2024-06-15 18:12:48 +00:00
*
* 14 2/12/98 4:44p Chris
* Fixed a bunch of bugs in the dialog
2024-06-15 18:12:48 +00:00
*
* 13 2/12/98 4:20p Chris
* Fixed problem with sound dialog and allowing users to enter invalid
* values
2024-06-15 18:12:48 +00:00
*
* 12 2/06/98 3:22a Chris
* Added a stop sounds button. Made delete sound first stop the currently
* playing sounds.
2024-06-15 18:12:48 +00:00
*
* 11 12/31/97 2:58a Chris
* Another major revision to the SoundLib. This cleaned up the code after
* removing the direct sound secondary buffers.
2024-06-15 18:12:48 +00:00
*
* 10 12/30/97 2:07p Chris
* Adding further support for software 3d stuff
2024-06-15 18:12:48 +00:00
*
* 9 12/29/97 4:50p Chris
* Added SPF_NO_UPDATE
2024-06-15 18:12:48 +00:00
*
* 8 12/22/97 6:19p Chris
* Moved weapon battery firing sound off the projectile (weapon) and into
* the weapon battery.
2024-06-15 18:12:48 +00:00
*
* 7 12/18/97 12:26p Chris
* Incremental new lib improvements
2024-06-15 18:12:48 +00:00
*
* 6 12/10/97 4:47p Chris
* Revision 1.0 of new sound library (no hardware -- uses primary buffer
* streaming)
2024-06-15 18:12:48 +00:00
*
* 5 12/02/97 5:31p Samir
* New file dialog interface implemented.
2024-06-15 18:12:48 +00:00
*
* 4 9/08/97 4:05p Samir
* Fixed some warnings and took out extranneous includes to windows.h in
* important headers.
*
* $NoKeywords: $
*/
// WorldSoundsDialog.cpp : implementation file
//
#include <filesystem>
#include "stdafx.h"
#include "pserror.h"
#include "editor.h"
#include "WorldSoundsDialog.h"
#include "soundload.h"
#include "soundpage.h"
#include "manage.h"
#include "mono.h"
#include "hlsoundlib.h"
#include "ddio.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CWorldSoundsDialog dialog
2024-06-15 18:12:48 +00:00
CWorldSoundsDialog::CWorldSoundsDialog(CWnd *pParent /*=NULL*/) : CDialog(CWorldSoundsDialog::IDD, pParent) {
//{{AFX_DATA_INIT(CWorldSoundsDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::DoDataExchange(CDataExchange *pDX) {
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWorldSoundsDialog)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CWorldSoundsDialog, CDialog)
2024-06-15 18:12:48 +00:00
//{{AFX_MSG_MAP(CWorldSoundsDialog)
ON_BN_CLICKED(IDC_ADD_SOUND, OnAddSound)
ON_BN_CLICKED(IDC_CHECKIN_SOUND, OnCheckinSound)
ON_BN_CLICKED(IDC_DELETE_SOUND, OnDeleteSound)
ON_BN_CLICKED(IDC_LOCK_SOUND, OnLockSound)
ON_BN_CLICKED(IDC_LOAD_SOUND, OnLoadSound)
ON_BN_CLICKED(IDC_NEXT_SOUND, OnNextSound)
ON_BN_CLICKED(IDC_PREV_SOUND, OnPrevSound)
ON_EN_KILLFOCUS(IDC_SOUND_NAME_EDIT, OnKillfocusSoundNameEdit)
ON_CBN_SELENDOK(IDC_SOUND_PULLDOWN, OnSelendokSoundPulldown)
ON_BN_CLICKED(IDC_PLAYSOUND, OnPlaysound)
ON_EN_KILLFOCUS(IDC_SOUNDINNERCONEANGLE_EDIT, OnKillfocusSoundinnerconeangleEdit)
ON_EN_KILLFOCUS(IDC_SOUNDLOOPEND_EDIT, OnKillfocusSoundloopendEdit)
ON_EN_KILLFOCUS(IDC_SOUNDLOOPSTART_EDIT, OnKillfocusSoundloopstartEdit)
ON_EN_KILLFOCUS(IDC_SOUNDMAXDIST_EDIT, OnKillfocusSoundmaxdistEdit)
ON_EN_KILLFOCUS(IDC_SOUNDMINDIST_EDIT, OnKillfocusSoundmindistEdit)
ON_EN_KILLFOCUS(IDC_SOUNDOUTERCONEANGLE_EDIT, OnKillfocusSoundouterconeangleEdit)
ON_EN_KILLFOCUS(IDC_SOUNDOUTERCONEVOL_EDIT, OnKillfocusSoundouterconevolEdit)
ON_BN_CLICKED(IDC_SOUNDHALLEFFECT_CHECK, OnSoundhalleffectCheck)
ON_BN_CLICKED(IDC_LOOPING_CHECK, OnLoopingCheck)
ON_BN_CLICKED(IDC_SOUNDBACKWARD_RADIO, OnSoundbackwardRadio)
ON_BN_CLICKED(IDC_SOUNDDOWNWARD_RADIO, OnSounddownwardRadio)
ON_BN_CLICKED(IDC_SOUNDEXCLUSIVE_CHECK, OnSoundexclusiveCheck)
ON_BN_CLICKED(IDC_SOUNDFOREVER_CHECK, OnSoundforeverCheck)
ON_BN_CLICKED(IDC_SOUNDFORWARD_RADIO, OnSoundforwardRadio)
ON_BN_CLICKED(IDC_SOUNDOBJATTACH_RADIO, OnSoundobjattachRadio)
ON_BN_CLICKED(IDC_SOUNDOBJECT_RADIO, OnSoundobjectRadio)
ON_BN_CLICKED(IDC_SOUNDONCE_CHECK, OnSoundonceCheck)
ON_BN_CLICKED(IDC_SOUNDPOSATTACH_RADIO, OnSoundposattachRadio)
ON_BN_CLICKED(IDC_SOUNDTURRET1_RADIO, OnSoundturret1Radio)
ON_BN_CLICKED(IDC_SOUNDTURRET2_RADIO, OnSoundturret2Radio)
ON_BN_CLICKED(IDC_SOUNDTURRET3_RADIO, OnSoundturret3Radio)
ON_BN_CLICKED(IDC_SOUNDUPWARD_RADIO, OnSoundupwardRadio)
ON_WM_HELPINFO()
ON_BN_CLICKED(IDC_SOUND_NO_UPDATE, OnSoundNoUpdate)
ON_BN_CLICKED(IDC_KILLSOUNDS, OnKillsounds)
ON_BN_CLICKED(IDC_SOUND_ONCE_PER_OBJ_CHECK, OnSoundOncePerObjCheck)
ON_EN_KILLFOCUS(IDC_SOUND_IMPORT_VOLUME_EDIT, OnKillfocusSoundImportVolumeEdit)
ON_BN_CLICKED(IDC_SOUND_CHANGE_NAME, OnSoundChangeName)
ON_BN_CLICKED(IDC_OVERRIDE, OnOverride)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWorldSoundsDialog message handlers
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnAddSound() {
char filename[256], dir[256], fname[128], ext[32];
char cur_name[100];
int raw_handle;
int sound_handle;
int c = 1, finding_name = 1;
if (!Network_up) {
OutrageMessageBox("Sorry babe, the network is down. This action is a no-no.\n");
return;
}
// Get the filename of the representing image
CString filter = "Descent III files (*.wav)|*.wav||";
if (!OpenFileDialog(this, (LPCSTR)filter, filename, Current_sounds_dir, sizeof(Current_sounds_dir)))
return;
ddio_SplitPath(filename, dir, fname, ext);
// Okay, we selected a file. Lets do what needs to be done here.
raw_handle = LoadSoundFile(filename, 1.0f, true);
if (raw_handle < 0) {
OutrageMessageBox("Invalid sound file.");
return;
}
// Alloc a sound and give a name not already taken by some other sound
sound_handle = AllocSound();
while (finding_name) {
if (c == 1)
sprintf(cur_name, "%s", fname);
else
sprintf(cur_name, "%s%d", fname, c);
if (FindSoundName(cur_name) != -1)
c++;
else
finding_name = 0;
}
strcpy(Sounds[sound_handle].name, cur_name);
2024-06-15 18:12:48 +00:00
Sounds[sound_handle].sample_index = raw_handle;
// Finally, save a local copy of the .wav and alloc a tracklock
mprintf(0, "Making a copy of this sound locally...\n");
std::filesystem::path destname = LocalSoundsDir / SoundFiles[Sounds[sound_handle].sample_index].name;
cf_CopyFile(destname, filename);
2024-06-15 18:12:48 +00:00
mng_AllocTrackLock(cur_name, PAGETYPE_SOUND);
D3EditState.current_sound = sound_handle;
RemapSounds();
Sound_system.CheckAndForceSoundDataAlloc(D3EditState.current_sound);
Sounds[sound_handle].loop_end = SoundFiles[Sounds[sound_handle].sample_index].np_sample_length - 1;
UpdateDialog();
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnCheckinSound() {
int n = D3EditState.current_sound;
mngs_Pagelock temp_pl;
int r;
if (Num_sounds < 1)
return;
if (!mng_MakeLocker())
return;
// Make sure we own this sound
strcpy(temp_pl.name, Sounds[n].name);
temp_pl.pagetype = PAGETYPE_SOUND;
r = mng_CheckIfPageOwned(&temp_pl, TableUser);
if (r < 0)
OutrageMessageBox(ErrorString);
else if (r == 0)
OutrageMessageBox(InfoString);
else {
// Change the pagelock state to UNLOCKED
strcpy(temp_pl.holder, "UNLOCKED");
if (!mng_ReplacePagelock(temp_pl.name, &temp_pl)) {
MessageBox(ErrorString, "Error!");
mng_EraseLocker();
return;
} else {
// Now actually replace the copy on the net with our local one
if (!mng_ReplacePage(Sounds[n].name, Sounds[n].name, n, PAGETYPE_SOUND, 0))
OutrageMessageBox(ErrorString);
else {
// Save this sound raw to the network for all
std::filesystem::path srcname = LocalSoundsDir / SoundFiles[Sounds[n].sample_index].name;
std::filesystem::path destname = NetSoundsDir / SoundFiles[Sounds[n].sample_index].name;
2024-06-15 18:12:48 +00:00
cf_CopyFile(destname, srcname);
OutrageMessageBox("Sound checked in.");
2024-09-03 10:34:37 +00:00
// Delete it from local pagefile if it is there
2024-06-15 18:12:48 +00:00
int dret = mng_DeletePage(Sounds[n].name, PAGETYPE_SOUND, 1);
ASSERT(dret == 1);
mng_EraseLocker();
// Free the tracklock
int p = mng_FindTrackLock(Sounds[n].name, PAGETYPE_SOUND);
ASSERT(p != -1);
mng_FreeTrackLock(p);
UpdateDialog();
}
}
}
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnDeleteSound() {
int answer, tl;
mngs_Pagelock pl;
int n = D3EditState.current_sound;
if (Num_sounds < 1)
return;
Sound_system.BeginSoundFrame();
Sound_system.StopAllSounds();
Sound_system.EndSoundFrame();
// Check to see if we even have it locked
if ((tl = mng_FindTrackLock(Sounds[n].name, PAGETYPE_SOUND)) == -1) {
OutrageMessageBox("This sound is not yours to delete. Lock first.");
return;
}
2024-09-03 10:34:37 +00:00
// Make sure it is to be deleted
2024-06-15 18:12:48 +00:00
answer = MessageBox("Are you sure you want to delete this sound?", Sounds[n].name, MB_YESNO);
if (answer == IDNO)
return;
if (!mng_MakeLocker())
return;
strcpy(pl.name, Sounds[n].name);
pl.pagetype = PAGETYPE_SOUND;
// Check to see if this is a local sound only. If so, only delete it locally
if (mng_CheckIfPageOwned(&pl, TableUser) != 1) {
mng_FreeTrackLock(tl);
if (!mng_DeletePage(Sounds[n].name, PAGETYPE_SOUND, 1)) {
mprintf(0, ErrorString);
Int3();
}
2024-09-03 10:34:37 +00:00
} else // if it is network, delete it from both the net and local drives
2024-06-15 18:12:48 +00:00
{
mng_FreeTrackLock(tl);
mng_DeletePage(Sounds[n].name, PAGETYPE_SOUND, 1);
mng_DeletePage(Sounds[n].name, PAGETYPE_SOUND, 0);
mng_DeletePagelock(Sounds[n].name, PAGETYPE_SOUND);
}
// Advance to the next sound
D3EditState.current_sound = GetNextSound(n);
FreeSound(n);
mng_EraseLocker();
OutrageMessageBox("Sound deleted.");
RemapSounds();
UpdateDialog();
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnLockSound() {
int n = D3EditState.current_sound;
mngs_Pagelock temp_pl;
mngs_sound_page soundpage;
int r;
if (Num_sounds < 1)
return;
if (!mng_MakeLocker())
return;
// Make sure it can be locked
strcpy(temp_pl.name, Sounds[n].name);
temp_pl.pagetype = PAGETYPE_SOUND;
r = mng_CheckIfPageLocked(&temp_pl);
if (r == 2) {
int answer;
answer = OutrageMessageBox(MBOX_YESNO, "This page is not even in the table file, or the database maybe corrupt. "
"Override to 'Unlocked'? (Select NO if you don't know what you're doing)");
if (answer == IDYES) {
strcpy(temp_pl.holder, "UNLOCKED");
if (!mng_ReplacePagelock(temp_pl.name, &temp_pl))
MessageBox(ErrorString, "Error!");
}
} else if (r < 0)
OutrageMessageBox(ErrorString);
else if (r == 1)
OutrageMessageBox(InfoString);
else {
// Everything is ok. Tell the network we're locking it and get a copy to
// our local drive
strcpy(temp_pl.holder, TableUser);
if (!mng_ReplacePagelock(temp_pl.name, &temp_pl)) {
MessageBox(ErrorString, "Error!");
mng_EraseLocker();
return;
} else {
// Search thru the net pagefile and get a new copy in RAM in case anyone
// changed it since we started the editor
if (mng_FindSpecificSoundPage(temp_pl.name, &soundpage)) {
if (mng_AssignSoundPageToSound(&soundpage, n)) {
if (!mng_ReplacePage(Sounds[n].name, Sounds[n].name, n, PAGETYPE_SOUND, 1)) {
OutrageMessageBox("There was problem writing that page locally!");
mng_EraseLocker();
return;
}
OutrageMessageBox("Sound locked.");
} else
OutrageMessageBox(
"There was a problem loading this sound. You might encounter problems in dealing with it. Good luck!");
mng_AllocTrackLock(Sounds[n].name, PAGETYPE_SOUND);
UpdateDialog();
} else
OutrageMessageBox("Couldn't find that sound in the table file!");
}
}
mng_EraseLocker();
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnLoadSound() {
char filename[255];
int raw_handle;
int sound_handle;
int c = 1, finding_name = 1;
// Get the filename of the representing image
CString filter = "Descent III files (*.wav)|*.wav||";
if (!OpenFileDialog(this, (LPCSTR)filter, filename, Current_sounds_dir, sizeof(Current_sounds_dir)))
return;
sound_handle = D3EditState.current_sound;
// Okay, we selected a file. Lets do what needs to be done here.
raw_handle = LoadSoundFile(filename, Sounds[sound_handle].import_volume, true);
if (raw_handle < 0) {
OutrageMessageBox("Invalid sound file.");
return;
}
Sounds[sound_handle].sample_index = raw_handle;
// Finally, save a local copy of the raw
std::filesystem::path curname = LocalSoundsDir / SoundFiles[Sounds[sound_handle].sample_index].name;
2024-06-15 18:12:48 +00:00
cf_CopyFile(curname, filename);
UpdateDialog();
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnNextSound() {
D3EditState.current_sound = GetNextSound(D3EditState.current_sound);
UpdateDialog();
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnPrevSound() {
D3EditState.current_sound = GetPrevSound(D3EditState.current_sound);
UpdateDialog();
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnKillfocusSoundNameEdit() {
CEdit *ebox;
int n = D3EditState.current_sound;
char name[PAGENAME_LEN];
mngs_Pagelock pl;
// Make sure we have this sound locked, if not reset name and bail
int p = mng_FindTrackLock(Sounds[n].name, PAGETYPE_SOUND);
if (p == -1) {
OutrageMessageBox("You must lock this sound if you wish to change its name.");
CEdit *ebox = (CEdit *)GetDlgItem(IDC_SOUND_NAME_EDIT);
ebox->SetWindowText(Sounds[n].name);
return;
}
// Get the new name
ebox = (CEdit *)GetDlgItem(IDC_SOUND_NAME_EDIT);
ebox->GetWindowText(name, PAGENAME_LEN);
// Check to see if there is already a sound with this name. If so, reset and bail
if (FindSoundName(name) != -1) {
OutrageMessageBox("There already is a sound with that name...choose another name.");
CEdit *ebox = (CEdit *)GetDlgItem(IDC_SOUND_NAME_EDIT);
ebox->SetWindowText(Sounds[n].name);
return;
}
if (!mng_MakeLocker())
return;
// Check to see if this page exists on the network. If so, we have to
// rename it so we can prevent havoc
strcpy(pl.name, Sounds[n].name);
pl.pagetype = PAGETYPE_SOUND;
int ret = mng_CheckIfPageOwned(&pl, TableUser);
if (ret < 0)
OutrageMessageBox(ErrorString);
else if (ret == 1)
mng_RenamePage(Sounds[n].name, name, PAGETYPE_SOUND);
else if (ret == 2) {
// This page has never been checked in, replace only local copy
char oldname[PAGENAME_LEN];
strcpy(oldname, Sounds[n].name);
strcpy(Sounds[n].name, name);
mng_ReplacePage(oldname, Sounds[n].name, n, PAGETYPE_SOUND, 1);
} else if (ret == 0) {
OutrageMessageBox("You don't own this page. Get Jason now!");
mng_FreeTrackLock(p);
return;
}
// Finally, copy our new name to the appropriate arrays
strcpy(GlobalTrackLocks[p].name, name);
strcpy(Sounds[n].name, name);
mng_EraseLocker();
RemapSounds();
UpdateDialog();
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSelendokSoundPulldown() {
int i, cur;
char name[200];
cur = SendDlgItemMessage(IDC_SOUND_PULLDOWN, CB_GETCURSEL, 0, 0);
SendDlgItemMessage(IDC_SOUND_PULLDOWN, CB_GETLBTEXT, cur, (LPARAM)(LPCTSTR)name);
i = FindSoundName(name);
if (i == -1) {
mprintf(0, "Possible corrupted sound list, but probably nothing.");
UpdateDialog();
}
D3EditState.current_sound = i;
UpdateDialog();
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::UpdateDialog() {
CEdit *ebox;
CStatic *sbox;
CButton *bbox;
int n = D3EditState.current_sound;
char str[50];
int radio_index[4];
int i;
int total_hardware_memory = 0;
int total_memory = 0;
Sound_system.CheckAndForceSoundDataAlloc(D3EditState.current_sound);
for (i = 0; i < MAX_SOUNDS; i++) {
if (Sounds[i].used)
total_memory += SoundFiles[Sounds[i].sample_index].sample_length * 2;
}
if (Num_sounds < 1) {
bbox = (CButton *)GetDlgItem(IDC_NEXT_SOUND);
bbox->EnableWindow(FALSE);
bbox = (CButton *)GetDlgItem(IDC_PREV_SOUND);
bbox->EnableWindow(FALSE);
return;
} else {
bbox = (CButton *)GetDlgItem(IDC_NEXT_SOUND);
bbox->EnableWindow(TRUE);
bbox = (CButton *)GetDlgItem(IDC_PREV_SOUND);
bbox->EnableWindow(TRUE);
}
if (!Sounds[n].used)
n = D3EditState.current_sound = GetNextSound(n);
ebox = (CEdit *)GetDlgItem(IDC_SOUNDMAXDIST_EDIT);
sprintf(str, "%f", Sounds[n].max_distance);
ebox->SetWindowText(str);
sbox = (CStatic *)GetDlgItem(IDC_SOUND_MEMORY_STATIC);
sprintf(str, "%d, %d H, %d Total", SoundFiles[Sounds[n].sample_index].sample_length / 512,
total_hardware_memory / 1024, total_memory / 1024);
sbox->SetWindowText(str);
ebox = (CEdit *)GetDlgItem(IDC_SOUNDMINDIST_EDIT);
sprintf(str, "%f", Sounds[n].min_distance);
ebox->SetWindowText(str);
ebox = (CEdit *)GetDlgItem(IDC_SOUNDINNERCONEANGLE_EDIT);
sprintf(str, "%d", Sounds[n].inner_cone_angle);
ebox->SetWindowText(str);
ebox = (CEdit *)GetDlgItem(IDC_SOUNDOUTERCONEANGLE_EDIT);
sprintf(str, "%d", Sounds[n].outer_cone_angle);
ebox->SetWindowText(str);
ebox = (CEdit *)GetDlgItem(IDC_SOUNDOUTERCONEVOL_EDIT);
sprintf(str, "%f", Sounds[n].outer_cone_volume * 100);
ebox->SetWindowText(str);
ebox = (CEdit *)GetDlgItem(IDC_SOUNDLOOPSTART_EDIT);
sprintf(str, "%d", Sounds[n].loop_start);
ebox->SetWindowText(str);
if (Sounds[n].loop_end >= SoundFiles[Sounds[n].sample_index].np_sample_length) {
Sounds[n].loop_end = SoundFiles[Sounds[n].sample_index].np_sample_length - 1;
}
if (Sounds[n].loop_start > Sounds[n].loop_end) {
Sounds[n].loop_start = 0;
}
ebox = (CEdit *)GetDlgItem(IDC_SOUNDLOOPEND_EDIT);
sprintf(str, "%d", Sounds[n].loop_end);
ebox->SetWindowText(str);
ebox = (CEdit *)GetDlgItem(IDC_SOUND_IMPORT_VOLUME_EDIT);
sprintf(str, "%f", Sounds[n].import_volume * 100.0f);
ebox->SetWindowText(str);
ebox = (CEdit *)GetDlgItem(IDC_RAW_NAME_EDIT);
ebox->SetWindowText(SoundFiles[Sounds[n].sample_index].name);
bbox = (CButton *)GetDlgItem(IDC_SOUNDHALLEFFECT_CHECK);
bbox->SetCheck(!(Sounds[n].flags & SPF_FIXED_FREQ));
bbox = (CButton *)GetDlgItem(IDC_SOUNDFOREVER_CHECK);
bbox->SetCheck(Sounds[n].flags & SPF_FOREVER);
bbox = (CButton *)GetDlgItem(IDC_SOUND_ONCE_PER_OBJ_CHECK);
bbox->SetCheck(Sounds[n].flags & SPF_ONCE_PER_OBJ);
bbox = (CButton *)GetDlgItem(IDC_SOUNDEXCLUSIVE_CHECK);
bbox->SetCheck(Sounds[n].flags & SPF_PLAYS_EXCLUSIVELY);
bbox = (CButton *)GetDlgItem(IDC_SOUND_NO_UPDATE);
bbox->SetCheck(Sounds[n].flags & SPF_LISTENER_UPDATE);
bbox = (CButton *)GetDlgItem(IDC_SOUNDONCE_CHECK);
bbox->SetCheck(Sounds[n].flags & SPF_PLAYS_ONCE);
bbox = (CButton *)GetDlgItem(IDC_LOOPING_CHECK);
bbox->SetCheck(Sounds[n].flags & SPF_LOOPED);
if (Sounds[n].flags & SPF_OBJ_UPDATE) {
bbox = (CButton *)GetDlgItem(IDC_SOUNDOBJATTACH_RADIO);
bbox->SetCheck(1);
bbox = (CButton *)GetDlgItem(IDC_SOUNDPOSATTACH_RADIO);
bbox->SetCheck(0);
} else {
bbox = (CButton *)GetDlgItem(IDC_SOUNDPOSATTACH_RADIO);
bbox->SetCheck(1);
bbox = (CButton *)GetDlgItem(IDC_SOUNDOBJATTACH_RADIO);
bbox->SetCheck(0);
}
memset(radio_index, 0, 4 * sizeof(int));
switch (SPFT_CONE_LINK_MASK & Sounds[n].flags) {
case SPFT_CONE_LINK_OBJECT:
radio_index[0] = 1;
break;
case SPFT_CONE_LINK_TURRET1:
radio_index[1] = 1;
break;
case SPFT_CONE_LINK_TURRET2:
radio_index[2] = 1;
break;
case SPFT_CONE_LINK_TURRET3:
radio_index[3] = 1;
break;
}
bbox = (CButton *)GetDlgItem(IDC_SOUNDOBJECT_RADIO);
bbox->SetCheck(radio_index[0]);
bbox = (CButton *)GetDlgItem(IDC_SOUNDTURRET1_RADIO);
bbox->SetCheck(radio_index[1]);
bbox = (CButton *)GetDlgItem(IDC_SOUNDTURRET2_RADIO);
bbox->SetCheck(radio_index[2]);
bbox = (CButton *)GetDlgItem(IDC_SOUNDTURRET3_RADIO);
bbox->SetCheck(radio_index[3]);
memset(radio_index, 0, 4 * sizeof(int));
switch (SPFT_CONE_DIR_MASK & Sounds[n].flags) {
case SPFT_CONE_DIR_FORWARD:
radio_index[0] = 1;
break;
case SPFT_CONE_DIR_BACKWARD:
radio_index[1] = 1;
break;
case SPFT_CONE_DIR_UPWARD:
radio_index[2] = 1;
break;
case SPFT_CONE_DIR_DOWNWARD:
radio_index[3] = 1;
break;
}
bbox = (CButton *)GetDlgItem(IDC_SOUNDFORWARD_RADIO);
bbox->SetCheck(radio_index[0]);
bbox = (CButton *)GetDlgItem(IDC_SOUNDBACKWARD_RADIO);
bbox->SetCheck(radio_index[1]);
bbox = (CButton *)GetDlgItem(IDC_SOUNDUPWARD_RADIO);
bbox->SetCheck(radio_index[2]);
bbox = (CButton *)GetDlgItem(IDC_SOUNDDOWNWARD_RADIO);
bbox->SetCheck(radio_index[3]);
bbox = (CButton *)GetDlgItem(IDC_CHECKIN_SOUND);
if (mng_FindTrackLock(Sounds[n].name, PAGETYPE_SOUND) == -1) {
bbox->EnableWindow(FALSE);
bbox = (CButton *)GetDlgItem(IDC_LOCK_SOUND);
bbox->EnableWindow(TRUE);
bbox = (CButton *)GetDlgItem(IDC_SOUND_CHANGE_NAME);
bbox->EnableWindow(FALSE);
} else {
bbox->EnableWindow(TRUE);
bbox = (CButton *)GetDlgItem(IDC_LOCK_SOUND);
bbox->EnableWindow(FALSE);
bbox = (CButton *)GetDlgItem(IDC_SOUND_CHANGE_NAME);
bbox->EnableWindow(TRUE);
}
SendDlgItemMessage(IDC_SOUND_PULLDOWN, CB_RESETCONTENT, 0, 0);
for (i = 0; i < MAX_SOUNDS; i++) {
if (Sounds[i].used)
SendDlgItemMessage(IDC_SOUND_PULLDOWN, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)Sounds[i].name);
}
SendDlgItemMessage(IDC_SOUND_PULLDOWN, CB_SELECTSTRING, 0, (LPARAM)(LPCTSTR)Sounds[n].name);
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::SaveSoundsOnClose() {
int i, t;
if (!Network_up)
return; // don't save a damn thing if the network is down
2024-06-15 18:12:48 +00:00
for (i = 0; i < MAX_TRACKLOCKS; i++) {
if (GlobalTrackLocks[i].used == 1 && GlobalTrackLocks[i].pagetype == PAGETYPE_SOUND) {
t = FindSoundName(GlobalTrackLocks[i].name);
ASSERT(t != -1);
2024-06-15 18:12:48 +00:00
mng_ReplacePage(Sounds[t].name, Sounds[t].name, t, PAGETYPE_SOUND, 1);
}
}
}
2024-06-15 18:12:48 +00:00
BOOL CWorldSoundsDialog::DestroyWindow() {
SaveSoundsOnClose();
return CDialog::DestroyWindow();
}
2024-06-15 18:12:48 +00:00
BOOL CWorldSoundsDialog::OnInitDialog() {
CDialog::OnInitDialog();
UpdateDialog();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnPlaysound() {
int n = D3EditState.current_sound;
2024-06-15 18:12:48 +00:00
if (Num_sounds < 1)
return;
Sound_system.BeginSoundFrame();
Sound_system.Play2dSound(n);
Sound_system.EndSoundFrame();
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnKillfocusSoundinnerconeangleEdit() {
CEdit *ebox;
char str[20];
int n = D3EditState.current_sound;
ebox = (CEdit *)GetDlgItem(IDC_SOUNDINNERCONEANGLE_EDIT);
ebox->GetWindowText(str, 20);
2024-06-15 18:12:48 +00:00
Sounds[n].inner_cone_angle = atoi(str);
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnKillfocusSoundloopendEdit() {
CEdit *ebox;
char str[20];
int n = D3EditState.current_sound;
2024-06-15 18:12:48 +00:00
ebox = (CEdit *)GetDlgItem(IDC_SOUNDLOOPEND_EDIT);
ebox->GetWindowText(str, 20);
sscanf(str, "%d", &Sounds[n].loop_end);
if (Sounds[n].loop_end < Sounds[n].loop_start)
Sounds[n].loop_end = Sounds[n].loop_start;
if (Sounds[n].loop_end >= SoundFiles[Sounds[n].sample_index].np_sample_length)
Sounds[n].loop_end = SoundFiles[Sounds[n].sample_index].np_sample_length - 1;
if (Sounds[n].loop_end < 0)
Sounds[n].loop_end = 0;
UpdateDialog();
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnKillfocusSoundloopstartEdit() {
CEdit *ebox;
char str[20];
int n = D3EditState.current_sound;
ebox = (CEdit *)GetDlgItem(IDC_SOUNDLOOPSTART_EDIT);
ebox->GetWindowText(str, 20);
2024-06-15 18:12:48 +00:00
sscanf(str, "%d", &Sounds[n].loop_start);
if (Sounds[n].loop_start > Sounds[n].loop_end)
Sounds[n].loop_start = Sounds[n].loop_end;
if (Sounds[n].loop_start >= SoundFiles[Sounds[n].sample_index].np_sample_length)
Sounds[n].loop_start = SoundFiles[Sounds[n].sample_index].np_sample_length - 1;
2024-06-15 18:12:48 +00:00
if (Sounds[n].loop_start < 0)
Sounds[n].loop_start = 0;
2024-06-15 18:12:48 +00:00
UpdateDialog();
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnKillfocusSoundmaxdistEdit() {
CEdit *ebox;
char str[20];
int n = D3EditState.current_sound;
2024-06-15 18:12:48 +00:00
ebox = (CEdit *)GetDlgItem(IDC_SOUNDMAXDIST_EDIT);
ebox->GetWindowText(str, 20);
Sounds[n].max_distance = atof(str);
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnKillfocusSoundmindistEdit() {
CEdit *ebox;
char str[20];
int n = D3EditState.current_sound;
ebox = (CEdit *)GetDlgItem(IDC_SOUNDMINDIST_EDIT);
ebox->GetWindowText(str, 20);
2024-06-15 18:12:48 +00:00
Sounds[n].min_distance = atof(str);
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnKillfocusSoundouterconeangleEdit() {
CEdit *ebox;
char str[20];
int n = D3EditState.current_sound;
ebox = (CEdit *)GetDlgItem(IDC_SOUNDOUTERCONEANGLE_EDIT);
ebox->GetWindowText(str, 20);
2024-06-15 18:12:48 +00:00
Sounds[n].outer_cone_angle = atoi(str);
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnKillfocusSoundouterconevolEdit() {
CEdit *ebox;
char str[20];
int n = D3EditState.current_sound;
2024-06-15 18:12:48 +00:00
ebox = (CEdit *)GetDlgItem(IDC_SOUNDOUTERCONEVOL_EDIT);
ebox->GetWindowText(str, 20);
Sounds[n].outer_cone_volume = atof(str) / 100.0;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundhalleffectCheck() {
int n = D3EditState.current_sound;
CButton *btn;
btn = (CButton *)GetDlgItem(IDC_SOUNDHALLEFFECT_CHECK);
if (btn->GetCheck())
Sounds[n].flags &= ~SPF_FIXED_FREQ;
else
Sounds[n].flags |= SPF_FIXED_FREQ;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnLoopingCheck() {
int n = D3EditState.current_sound;
CButton *btn;
btn = (CButton *)GetDlgItem(IDC_LOOPING_CHECK);
if (btn->GetCheck())
Sounds[n].flags |= SPF_LOOPED;
else
Sounds[n].flags &= ~SPF_LOOPED;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundbackwardRadio() {
int n = D3EditState.current_sound;
2024-06-15 18:12:48 +00:00
Sounds[n].flags &= ~SPFT_CONE_DIR_MASK;
Sounds[n].flags |= SPFT_CONE_DIR_BACKWARD;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSounddownwardRadio() {
int n = D3EditState.current_sound;
2024-06-15 18:12:48 +00:00
Sounds[n].flags &= ~SPFT_CONE_DIR_MASK;
Sounds[n].flags |= SPFT_CONE_DIR_DOWNWARD;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundexclusiveCheck() {
int n = D3EditState.current_sound;
CButton *btn;
btn = (CButton *)GetDlgItem(IDC_SOUNDEXCLUSIVE_CHECK);
if (btn->GetCheck())
Sounds[n].flags |= SPF_PLAYS_EXCLUSIVELY;
else
Sounds[n].flags &= ~SPF_PLAYS_EXCLUSIVELY;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundforeverCheck() {
int n = D3EditState.current_sound;
CButton *btn;
btn = (CButton *)GetDlgItem(IDC_SOUNDFOREVER_CHECK);
if (btn->GetCheck())
Sounds[n].flags |= SPF_FOREVER;
else
Sounds[n].flags &= ~SPF_FOREVER;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundforwardRadio() {
int n = D3EditState.current_sound;
2024-06-15 18:12:48 +00:00
Sounds[n].flags &= ~SPFT_CONE_DIR_MASK;
Sounds[n].flags |= SPFT_CONE_DIR_FORWARD;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundobjattachRadio() {
int n = D3EditState.current_sound;
Sounds[n].flags |= SPF_OBJ_UPDATE;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundobjectRadio() {
int n = D3EditState.current_sound;
2024-06-15 18:12:48 +00:00
Sounds[n].flags &= ~SPFT_CONE_LINK_MASK;
Sounds[n].flags |= SPFT_CONE_LINK_OBJECT;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundonceCheck() {
int n = D3EditState.current_sound;
CButton *btn;
btn = (CButton *)GetDlgItem(IDC_SOUNDONCE_CHECK);
if (btn->GetCheck())
Sounds[n].flags |= SPF_PLAYS_ONCE;
else
Sounds[n].flags &= ~SPF_PLAYS_ONCE;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundposattachRadio() {
int n = D3EditState.current_sound;
Sounds[n].flags &= ~SPF_OBJ_UPDATE;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundturret1Radio() {
int n = D3EditState.current_sound;
2024-06-15 18:12:48 +00:00
Sounds[n].flags &= ~SPFT_CONE_LINK_MASK;
Sounds[n].flags |= SPFT_CONE_LINK_TURRET1;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundturret2Radio() {
int n = D3EditState.current_sound;
2024-06-15 18:12:48 +00:00
Sounds[n].flags &= ~SPFT_CONE_LINK_MASK;
Sounds[n].flags |= SPFT_CONE_LINK_TURRET2;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundturret3Radio() {
int n = D3EditState.current_sound;
2024-06-15 18:12:48 +00:00
Sounds[n].flags &= ~SPFT_CONE_LINK_MASK;
Sounds[n].flags |= SPFT_CONE_LINK_TURRET3;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundupwardRadio() {
int n = D3EditState.current_sound;
2024-06-15 18:12:48 +00:00
Sounds[n].flags &= ~SPFT_CONE_DIR_MASK;
Sounds[n].flags |= SPFT_CONE_DIR_UPWARD;
}
2024-06-15 18:12:48 +00:00
BOOL CWorldSoundsDialog::OnHelpInfo(HELPINFO *pHelpInfo) {
WinHelp(HID_SOUNDSDLG, HELP_CONTEXT);
return TRUE;
// return CDialog::OnHelpInfo(pHelpInfo);
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundNoUpdate() {
int n = D3EditState.current_sound;
CButton *btn;
2024-06-15 18:12:48 +00:00
btn = (CButton *)GetDlgItem(IDC_SOUND_NO_UPDATE);
2024-06-15 18:12:48 +00:00
if (btn->GetCheck())
Sounds[n].flags |= SPF_LISTENER_UPDATE;
else
Sounds[n].flags &= ~SPF_LISTENER_UPDATE;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnKillsounds() {
Sound_system.BeginSoundFrame();
Sound_system.StopAllSounds();
Sound_system.EndSoundFrame();
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundOncePerObjCheck() {
int n = D3EditState.current_sound;
CButton *btn;
btn = (CButton *)GetDlgItem(IDC_SOUND_ONCE_PER_OBJ_CHECK);
if (btn->GetCheck())
Sounds[n].flags |= SPF_ONCE_PER_OBJ;
else
Sounds[n].flags &= ~SPF_ONCE_PER_OBJ;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnKillfocusSoundImportVolumeEdit() {
CEdit *ebox;
char str[20];
int n = D3EditState.current_sound;
ebox = (CEdit *)GetDlgItem(IDC_SOUND_IMPORT_VOLUME_EDIT);
ebox->GetWindowText(str, 20);
sscanf(str, "%f", &Sounds[n].import_volume);
Sounds[n].import_volume /= 100.0f;
if (Sounds[n].import_volume < 0.01f)
Sounds[n].import_volume = 0.01f;
if (Sounds[n].import_volume > 1.0f)
Sounds[n].import_volume = 1.0f;
int j = Sounds[n].sample_index;
if (j >= 0 && SoundFiles[j].used) {
if (SoundFiles[j].sample_16bit) {
GlobalFree(SoundFiles[j].sample_16bit);
SoundFiles[j].sample_16bit = NULL;
}
if (SoundFiles[j].sample_8bit) {
GlobalFree(SoundFiles[j].sample_8bit);
SoundFiles[j].sample_8bit = NULL;
}
}
UpdateDialog();
}
#include "mem.h"
#include "EditLineDialog.h"
2024-06-15 18:12:48 +00:00
// Gets a name from the user, making sure it's unique
// Returns true if got new name, false if cancelled.
// the data in buf not changed if cancel is pressed
bool InputSoundName(char *buf, int len, char *title, char *prompt, CWnd *wnd) {
if (len > (PAGENAME_LEN - 1))
len = PAGENAME_LEN - 1;
2024-06-15 18:12:48 +00:00
char *tempbuf = (char *)mem_malloc(len);
2024-06-15 18:12:48 +00:00
strncpy(tempbuf, buf, len - 1);
tempbuf[len - 1] = '\0';
try_again:
2024-06-15 18:12:48 +00:00
if (!InputString(tempbuf, len, title, prompt, wnd)) {
mem_free(tempbuf);
return 0;
}
2024-06-15 18:12:48 +00:00
if (FindSoundName(tempbuf) != -1) {
OutrageMessageBox("The name you specified is already in use. Enter another name.");
goto try_again;
}
2024-06-15 18:12:48 +00:00
strcpy(buf, tempbuf);
mem_free(tempbuf);
2024-06-15 18:12:48 +00:00
return 1;
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnSoundChangeName() {
int n = D3EditState.current_sound;
char name[PAGENAME_LEN];
mngs_Pagelock pl;
// Make sure we have this ship locked, if not reset name and bail
int p = mng_FindTrackLock(Sounds[n].name, PAGETYPE_SOUND);
if (p == -1) {
OutrageMessageBox("You must lock this sound if you wish to change its name.");
return;
}
if (!mng_MakeLocker())
return;
// Get new name
strcpy(name, Sounds[n].name);
if (!InputSoundName(name, sizeof(name), "Sound name", "Enter a new name for this sound:", this))
return;
// Check to see if this page exists on the network. If so, we have to
// rename it so we can prevent havoc
strcpy(pl.name, Sounds[n].name);
pl.pagetype = PAGETYPE_SOUND;
int ret = mng_CheckIfPageOwned(&pl, TableUser);
if (ret < 0)
OutrageMessageBox(ErrorString);
else if (ret == 1)
mng_RenamePage(Sounds[n].name, name, PAGETYPE_SOUND);
else if (ret == 2) {
// This page has never been checked in, replace only local copy
char oldname[PAGENAME_LEN];
strcpy(oldname, Sounds[n].name);
strcpy(Sounds[n].name, name);
mng_ReplacePage(oldname, Sounds[n].name, n, PAGETYPE_SOUND, 1);
} else if (ret == 0) {
OutrageMessageBox("You don't own this page. Get Jason now!");
mng_FreeTrackLock(p);
return;
}
// Finally, copy our new name to the appropriate arrays
strcpy(GlobalTrackLocks[p].name, name);
strcpy(Sounds[n].name, name);
mng_EraseLocker();
UpdateDialog();
}
2024-06-15 18:12:48 +00:00
void CWorldSoundsDialog::OnOverride() {
int n = D3EditState.current_sound;
mngs_Pagelock temp_pl;
2024-06-15 18:12:48 +00:00
strcpy(temp_pl.name, Sounds[n].name);
temp_pl.pagetype = PAGETYPE_SOUND;
2024-06-15 18:12:48 +00:00
mng_OverrideToUnlocked(&temp_pl);
}