mirror of
https://github.com/kevinbentley/Descent3.git
synced 2025-01-22 19:55:23 +00:00
31b63bb79f
Generated using script: for file in \$(find ./legacy -type f | \grep -E "\.cpp|\.h") do mv $file temp.xxx cp gplheader $file cat temp.xxx >> $file done
1313 lines
32 KiB
C++
1313 lines
32 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/>.
|
|
*/
|
|
|
|
/*
|
|
* $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 $
|
|
*
|
|
* 29 4/21/99 5:55p Jason
|
|
* added override button to sound page
|
|
*
|
|
* 28 2/23/99 11:26a Matt
|
|
* Cleaned up sounds dialog
|
|
*
|
|
* 27 11/06/98 12:34p Jason
|
|
* more speedups for manage system
|
|
*
|
|
* 26 10/22/98 8:31p Chris
|
|
* Sounds use GlobalAlloc and GlobalFree
|
|
*
|
|
* 25 10/19/98 1:21p Chris
|
|
* Improve the volume import scaling code
|
|
*
|
|
* 24 10/19/98 11:57a Chris
|
|
* Update the sound system to use the import volume
|
|
*
|
|
* 23 10/14/98 12:09p Jason
|
|
* fixed some long standing name problems
|
|
*
|
|
* 22 9/21/98 8:18p Chris
|
|
* Removed annoying mprints
|
|
*
|
|
* 21 6/29/98 10:35p Chris
|
|
* Added support for once per object
|
|
*
|
|
* 20 6/23/98 2:43p Matt
|
|
* Changed calls to OutrageMessageBox() & Debug_MessageBox() to deal with
|
|
* int return value (instead of bool).
|
|
*
|
|
* 19 6/19/98 3:03p Chris
|
|
* Made CheckAndForceSoundDataAlloc a SoundSystem function - useful for
|
|
* multiple mixers. Added IsSoundPlaying to the high level sound lib.
|
|
*
|
|
* 18 4/22/98 5:38p Chris
|
|
* Fixed problems with adding new sounds
|
|
*
|
|
* 17 2/15/98 7:43p Luke
|
|
*
|
|
* 16 2/12/98 6:07p Chris
|
|
* Fixed a problem with addsound
|
|
*
|
|
* 15 2/12/98 4:55p Chris
|
|
* More validation checks for sounds
|
|
*
|
|
* 14 2/12/98 4:44p Chris
|
|
* Fixed a bunch of bugs in the dialog
|
|
*
|
|
* 13 2/12/98 4:20p Chris
|
|
* Fixed problem with sound dialog and allowing users to enter invalid
|
|
* values
|
|
*
|
|
* 12 2/06/98 3:22a Chris
|
|
* Added a stop sounds button. Made delete sound first stop the currently
|
|
* playing sounds.
|
|
*
|
|
* 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.
|
|
*
|
|
* 10 12/30/97 2:07p Chris
|
|
* Adding further support for software 3d stuff
|
|
*
|
|
* 9 12/29/97 4:50p Chris
|
|
* Added SPF_NO_UPDATE
|
|
*
|
|
* 8 12/22/97 6:19p Chris
|
|
* Moved weapon battery firing sound off the projectile (weapon) and into
|
|
* the weapon battery.
|
|
*
|
|
* 7 12/18/97 12:26p Chris
|
|
* Incremental new lib improvements
|
|
*
|
|
* 6 12/10/97 4:47p Chris
|
|
* Revision 1.0 of new sound library (no hardware -- uses primary buffer
|
|
* streaming)
|
|
*
|
|
* 5 12/02/97 5:31p Samir
|
|
* New file dialog interface implemented.
|
|
*
|
|
* 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 "stdafx.h"
|
|
|
|
#include "pserror.h"
|
|
#include "editor.h"
|
|
#include "WorldSoundsDialog.h"
|
|
#include "soundload.h"
|
|
#include "soundpage.h"
|
|
#include "manage.h"
|
|
#include "hlsoundlib.h"
|
|
#include "ddio.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CWorldSoundsDialog dialog
|
|
|
|
|
|
CWorldSoundsDialog::CWorldSoundsDialog(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CWorldSoundsDialog::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CWorldSoundsDialog)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
|
|
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)
|
|
//{{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
|
|
|
|
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);
|
|
|
|
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"));
|
|
|
|
char destname[100];
|
|
sprintf (destname,"%s\\%s",LocalSoundsDir,SoundFiles[Sounds[sound_handle].sample_index].name);
|
|
if (stricmp (destname,filename)) // only copy if they are different
|
|
cf_CopyFile (destname,filename);
|
|
|
|
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 ();
|
|
|
|
|
|
}
|
|
|
|
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
|
|
|
|
char destname[100],srcname[100];
|
|
|
|
sprintf (srcname,"%s\\%s",LocalSoundsDir,SoundFiles[Sounds[n].sample_index].name);
|
|
sprintf (destname,"%s\\%s",NetSoundsDir,SoundFiles[Sounds[n].sample_index].name);
|
|
|
|
cf_CopyFile (destname,srcname);
|
|
|
|
OutrageMessageBox ("Sound checked in.");
|
|
|
|
// Delete it from local pagefile if its there
|
|
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 ();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
//Make sure its to be deleted
|
|
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();
|
|
}
|
|
}
|
|
else // if its network, delete it from both the net and local drives
|
|
{
|
|
|
|
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 ();
|
|
|
|
|
|
}
|
|
|
|
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();
|
|
|
|
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnLoadSound()
|
|
{
|
|
char filename[255];
|
|
char curname[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
|
|
|
|
sprintf (curname,"%s\\%s",LocalSoundsDir,SoundFiles[Sounds[sound_handle].sample_index].name);
|
|
cf_CopyFile (curname,filename);
|
|
|
|
UpdateDialog();
|
|
|
|
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnNextSound()
|
|
{
|
|
D3EditState.current_sound=GetNextSound(D3EditState.current_sound);
|
|
UpdateDialog();
|
|
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnPrevSound()
|
|
{
|
|
D3EditState.current_sound=GetPrevSound(D3EditState.current_sound);
|
|
UpdateDialog();
|
|
}
|
|
|
|
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();
|
|
|
|
|
|
|
|
}
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
void CWorldSoundsDialog::SaveSoundsOnClose()
|
|
{
|
|
int i,t;
|
|
|
|
|
|
if (!Network_up)
|
|
return; // don't save a damn thing if the network is down
|
|
|
|
|
|
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);
|
|
|
|
mng_ReplacePage (Sounds[t].name,Sounds[t].name,t,PAGETYPE_SOUND,1);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
BOOL CWorldSoundsDialog::DestroyWindow()
|
|
{
|
|
SaveSoundsOnClose();
|
|
return CDialog::DestroyWindow();
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnPlaysound()
|
|
{
|
|
int n=D3EditState.current_sound;
|
|
|
|
if (Num_sounds<1)
|
|
return;
|
|
|
|
Sound_system.BeginSoundFrame();
|
|
Sound_system.Play2dSound(n);
|
|
Sound_system.EndSoundFrame();
|
|
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnKillfocusSoundinnerconeangleEdit()
|
|
{
|
|
CEdit *ebox;
|
|
char str[20];
|
|
int n=D3EditState.current_sound;
|
|
|
|
ebox=(CEdit *) GetDlgItem (IDC_SOUNDINNERCONEANGLE_EDIT);
|
|
ebox->GetWindowText (str,20);
|
|
|
|
Sounds[n].inner_cone_angle = atoi (str);
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnKillfocusSoundloopendEdit()
|
|
{
|
|
CEdit *ebox;
|
|
char str[20];
|
|
int n=D3EditState.current_sound;
|
|
|
|
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();
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnKillfocusSoundloopstartEdit()
|
|
{
|
|
CEdit *ebox;
|
|
char str[20];
|
|
int n=D3EditState.current_sound;
|
|
|
|
ebox=(CEdit *) GetDlgItem (IDC_SOUNDLOOPSTART_EDIT);
|
|
ebox->GetWindowText (str,20);
|
|
|
|
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;
|
|
|
|
if(Sounds[n].loop_start < 0) Sounds[n].loop_start = 0;
|
|
|
|
UpdateDialog();
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnKillfocusSoundmaxdistEdit()
|
|
{
|
|
CEdit *ebox;
|
|
char str[20];
|
|
int n=D3EditState.current_sound;
|
|
|
|
ebox=(CEdit *) GetDlgItem (IDC_SOUNDMAXDIST_EDIT);
|
|
ebox->GetWindowText (str,20);
|
|
|
|
Sounds[n].max_distance = atof (str);
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnKillfocusSoundmindistEdit()
|
|
{
|
|
CEdit *ebox;
|
|
char str[20];
|
|
int n=D3EditState.current_sound;
|
|
|
|
ebox=(CEdit *) GetDlgItem (IDC_SOUNDMINDIST_EDIT);
|
|
ebox->GetWindowText (str,20);
|
|
|
|
Sounds[n].min_distance = atof (str);
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnKillfocusSoundouterconeangleEdit()
|
|
{
|
|
CEdit *ebox;
|
|
char str[20];
|
|
int n=D3EditState.current_sound;
|
|
|
|
ebox=(CEdit *) GetDlgItem (IDC_SOUNDOUTERCONEANGLE_EDIT);
|
|
ebox->GetWindowText (str,20);
|
|
|
|
Sounds[n].outer_cone_angle = atoi (str);
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnKillfocusSoundouterconevolEdit()
|
|
{
|
|
CEdit *ebox;
|
|
char str[20];
|
|
int n=D3EditState.current_sound;
|
|
|
|
ebox=(CEdit *) GetDlgItem (IDC_SOUNDOUTERCONEVOL_EDIT);
|
|
ebox->GetWindowText (str,20);
|
|
|
|
Sounds[n].outer_cone_volume = atof(str) / 100.0;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnSoundbackwardRadio()
|
|
{
|
|
int n=D3EditState.current_sound;
|
|
|
|
Sounds[n].flags &= ~SPFT_CONE_DIR_MASK;
|
|
Sounds[n].flags |= SPFT_CONE_DIR_BACKWARD;
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnSounddownwardRadio()
|
|
{
|
|
int n=D3EditState.current_sound;
|
|
|
|
Sounds[n].flags &= ~SPFT_CONE_DIR_MASK;
|
|
Sounds[n].flags |= SPFT_CONE_DIR_DOWNWARD;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnSoundforwardRadio()
|
|
{
|
|
int n=D3EditState.current_sound;
|
|
|
|
Sounds[n].flags &= ~SPFT_CONE_DIR_MASK;
|
|
Sounds[n].flags |= SPFT_CONE_DIR_FORWARD;
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnSoundobjattachRadio()
|
|
{
|
|
int n=D3EditState.current_sound;
|
|
Sounds[n].flags |= SPF_OBJ_UPDATE;
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnSoundobjectRadio()
|
|
{
|
|
int n=D3EditState.current_sound;
|
|
|
|
Sounds[n].flags &= ~SPFT_CONE_LINK_MASK;
|
|
Sounds[n].flags |= SPFT_CONE_LINK_OBJECT;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnSoundposattachRadio()
|
|
{
|
|
int n=D3EditState.current_sound;
|
|
Sounds[n].flags &= ~SPF_OBJ_UPDATE;
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnSoundturret1Radio()
|
|
{
|
|
int n=D3EditState.current_sound;
|
|
|
|
Sounds[n].flags &= ~SPFT_CONE_LINK_MASK;
|
|
Sounds[n].flags |= SPFT_CONE_LINK_TURRET1;
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnSoundturret2Radio()
|
|
{
|
|
int n=D3EditState.current_sound;
|
|
|
|
Sounds[n].flags &= ~SPFT_CONE_LINK_MASK;
|
|
Sounds[n].flags |= SPFT_CONE_LINK_TURRET2;
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnSoundturret3Radio()
|
|
{
|
|
int n=D3EditState.current_sound;
|
|
|
|
Sounds[n].flags &= ~SPFT_CONE_LINK_MASK;
|
|
Sounds[n].flags |= SPFT_CONE_LINK_TURRET3;
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnSoundupwardRadio()
|
|
{
|
|
int n=D3EditState.current_sound;
|
|
|
|
Sounds[n].flags &= ~SPFT_CONE_DIR_MASK;
|
|
Sounds[n].flags |= SPFT_CONE_DIR_UPWARD;
|
|
}
|
|
|
|
BOOL CWorldSoundsDialog::OnHelpInfo(HELPINFO* pHelpInfo)
|
|
{
|
|
WinHelp(HID_SOUNDSDLG,HELP_CONTEXT);
|
|
return TRUE;
|
|
//return CDialog::OnHelpInfo(pHelpInfo);
|
|
}
|
|
|
|
|
|
void CWorldSoundsDialog::OnSoundNoUpdate()
|
|
{
|
|
int n=D3EditState.current_sound;
|
|
CButton *btn;
|
|
|
|
btn = (CButton *)GetDlgItem(IDC_SOUND_NO_UPDATE);
|
|
|
|
if (btn->GetCheck())
|
|
Sounds[n].flags |= SPF_LISTENER_UPDATE;
|
|
else
|
|
Sounds[n].flags &= ~SPF_LISTENER_UPDATE;
|
|
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnKillsounds()
|
|
{
|
|
Sound_system.BeginSoundFrame();
|
|
Sound_system.StopAllSounds();
|
|
Sound_system.EndSoundFrame();
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
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"
|
|
|
|
//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;
|
|
|
|
char *tempbuf = (char *) mem_malloc(len);
|
|
|
|
strncpy(tempbuf,buf,len-1);
|
|
tempbuf[len-1] = '\0';
|
|
|
|
try_again:
|
|
|
|
if (! InputString(tempbuf,len,title,prompt,wnd)) {
|
|
mem_free(tempbuf);
|
|
return 0;
|
|
}
|
|
|
|
if (FindSoundName(tempbuf) != -1) {
|
|
OutrageMessageBox("The name you specified is already in use. Enter another name.");
|
|
goto try_again;
|
|
}
|
|
|
|
strcpy(buf,tempbuf);
|
|
mem_free(tempbuf);
|
|
|
|
return 1;
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
void CWorldSoundsDialog::OnOverride()
|
|
{
|
|
int n=D3EditState.current_sound;
|
|
mngs_Pagelock temp_pl;
|
|
|
|
|
|
strcpy (temp_pl.name,Sounds[n].name);
|
|
temp_pl.pagetype=PAGETYPE_SOUND;
|
|
|
|
mng_OverrideToUnlocked (&temp_pl);
|
|
|
|
|
|
}
|