mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-09 17:52:08 -10:00
Compare commits
117
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3d680e1431 | ||
|
|
3ef2dc8134 | ||
|
|
dd2c182a60 | ||
|
|
7c5756996c | ||
|
|
e606278ce6 | ||
|
|
182ed7f9c7 | ||
|
|
4870b2fc9e | ||
|
|
586e514874 | ||
|
|
202bd88392 | ||
|
|
96e4fe4b6e | ||
|
|
2e8a5a2692 | ||
|
|
02c7fc1c89 | ||
|
|
74ac243ae1 | ||
|
|
8609816c7c | ||
|
|
15f365b09f | ||
|
|
9292ebf2c9 | ||
|
|
a04089e8a9 | ||
|
|
6bc3f565dd | ||
|
|
b94023a86f | ||
|
|
edc8b93a64 | ||
|
|
93381a2061 | ||
|
|
7c6c19a162 | ||
|
|
e399f53251 | ||
|
|
e62b09cdfd | ||
|
|
4c6ffd1650 | ||
|
|
93fcc4b8db | ||
|
|
d87ad46bd0 | ||
|
|
3314903dda | ||
|
|
045b7fc264 | ||
|
|
c99704efe4 | ||
|
|
015b1a6309 | ||
|
|
7871c4f146 | ||
|
|
ddc4d51999 | ||
|
|
7e3e0a9388 | ||
|
|
9f6d4533f8 | ||
|
|
090ea8ad50 | ||
|
|
fdf05d7e80 | ||
|
|
dbc87e4241 | ||
|
|
cbef6291cd | ||
|
|
5a2bd299c2 | ||
|
|
1daa233fe4 | ||
|
|
b03cbff4d1 | ||
|
|
773bf8b983 | ||
|
|
9421ab2fba | ||
|
|
669ea48153 | ||
|
|
4995f11472 | ||
|
|
6b884151bc | ||
|
|
4c91519648 | ||
|
|
e3c095684b | ||
|
|
591904644d | ||
|
|
c4d8a64a74 | ||
|
|
0b1ea699bb | ||
|
|
b88d75efb8 | ||
|
|
96ca7b1ffe | ||
|
|
563b113c68 | ||
|
|
112c1c4dfe | ||
|
|
77a63521e4 | ||
|
|
6b3ee7cfb7 | ||
|
|
549c76c137 | ||
|
|
c185dab59c | ||
|
|
60f201d1df | ||
|
|
225c8ece25 | ||
|
|
75d680483a | ||
|
|
4b662a3649 | ||
|
|
d6d69d9ac7 | ||
|
|
59c7c56dd4 | ||
|
|
c2a2f0727f | ||
|
|
a5078ce0aa | ||
|
|
36f2e4fd73 | ||
|
|
0458d83f94 | ||
|
|
c66a0b8e05 | ||
|
|
725b48d2b9 | ||
|
|
b7f4d00358 | ||
|
|
5a3fa6f576 | ||
|
|
28d23c56c0 | ||
|
|
7181e3d602 | ||
|
|
774f34dea4 | ||
|
|
7fa0a70c9e | ||
|
|
27f70fe135 | ||
|
|
1530e3556b | ||
|
|
b6914428ad | ||
|
|
d36f675f50 | ||
|
|
ca90928e08 | ||
|
|
f19a74b5c2 | ||
|
|
e8d72f5a50 | ||
|
|
be06149719 | ||
|
|
d0b3d8fe30 | ||
|
|
46ea3669d5 | ||
|
|
96c365ca86 | ||
|
|
f93e369d73 | ||
|
|
5983a47bc4 | ||
|
|
c4df09934c | ||
|
|
3b1597f2d9 | ||
|
|
56102ad328 | ||
|
|
8d2b02efb7 | ||
|
|
de60dfe106 | ||
|
|
7b293cd972 | ||
|
|
1ad8db2238 | ||
|
|
bce97dae91 | ||
|
|
721e71f860 | ||
|
|
a8510f8a51 | ||
|
|
f818572382 | ||
|
|
64d3a85dfa | ||
|
|
b9baca78ed | ||
|
|
e12b4c3840 | ||
|
|
b464f2a558 | ||
|
|
abd020529d | ||
|
|
d4b6ae7b8d | ||
|
|
5a92218ce6 | ||
|
|
38a42dd2e4 | ||
|
|
e7b0c695ea | ||
|
|
a77a92b8f0 | ||
|
|
bfdf0c5b48 | ||
|
|
5fc6743d4c | ||
|
|
b124ff648b | ||
|
|
5c032efc72 | ||
|
|
01a242f269 |
No files matched your search
+1
-1
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# This file uses GNU Automake to generate makefiles
|
||||
|
||||
SUBDIRS = libjpeg lua code
|
||||
SUBDIRS = code
|
||||
|
||||
|
||||
EXTRA_DIST = \
|
||||
|
||||
+175
@@ -712,3 +712,178 @@ int main ()
|
||||
AC_SUBST(THEORA_LIBS)
|
||||
rm -f conf.theoratest
|
||||
])
|
||||
|
||||
|
||||
dnl AM_PATH_OPENAL([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
|
||||
dnl Test for OpenAL, and define OPENAL_CFLAGS and OPENAL_LIBS
|
||||
dnl
|
||||
AC_DEFUN([AM_PATH_OPENAL],
|
||||
[dnl
|
||||
dnl Get the cflags and libraries
|
||||
dnl
|
||||
AC_ARG_WITH(openal,[ --with-openal=PFX Prefix where OpenAL is installed (optional)], openal_prefix="$withval", openal_prefix="")
|
||||
AC_ARG_WITH(openal-libraries,[ --with-openal-libraries=DIR Directory where OpenAL library is installed (optional)], openal_libraries="$withval", openal_libraries="")
|
||||
AC_ARG_WITH(openal-includes,[ --with-openal-includes=DIR Directory where OpenAL header files are installed (optional)], openal_includes="$withval", openal_includes="")
|
||||
AC_ARG_ENABLE(openaltest, [ --disable-openaltest Do not try to compile and run a test OpenAL program],, enable_openaltest=yes)
|
||||
|
||||
if test "x$openal_libraries" != "x" ; then
|
||||
OPENAL_LIBS="-L$openal_libraries"
|
||||
elif test "x$openal_prefix" != "x" ; then
|
||||
OPENAL_LIBS="-L$openal_prefix/lib"
|
||||
elif test "x$prefix" != "xNONE"; then
|
||||
OPENAL_LIBS="-L$libdir"
|
||||
fi
|
||||
|
||||
OPENAL_LIBS="$OPENAL_LIBS -lopenal"
|
||||
|
||||
if test "x$openal_includes" != "x" ; then
|
||||
OPENAL_CFLAGS="-I$openal_includes"
|
||||
elif test "x$openal_prefix" != "x" ; then
|
||||
OPENAL_CFLAGS="-I$openal_prefix/include"
|
||||
elif test "x$prefix" != "xNONE"; then
|
||||
OPENAL_CFLAGS=""
|
||||
fi
|
||||
|
||||
|
||||
AC_MSG_CHECKING(for OpenAL)
|
||||
no_openal=""
|
||||
|
||||
|
||||
if test "x$enable_openaltest" = "xyes" ; then
|
||||
ac_save_CFLAGS="$CFLAGS"
|
||||
ac_save_LIBS="$LIBS"
|
||||
CFLAGS="$CFLAGS $OPENAL_CFLAGS"
|
||||
LIBS="$LIBS $OPENAL_LIBS"
|
||||
dnl
|
||||
dnl Now check if the installed OpenAL is sufficiently new.
|
||||
dnl
|
||||
rm -f conf.openaltest
|
||||
AC_TRY_RUN([
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <AL/al.h>
|
||||
#include <AL/alc.h>
|
||||
|
||||
int main ()
|
||||
{
|
||||
#ifdef AL_VERSION_1_1
|
||||
alcIsExtensionPresent(NULL, (const ALCchar*)"ALC_ENUMERATION_EXT");
|
||||
|
||||
system("touch conf.openaltest");
|
||||
return 0;
|
||||
#else
|
||||
printf("\n*** OpenAL version 1.1 or greater is required.\n");
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
],, no_openal=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
|
||||
CFLAGS="$ac_save_CFLAGS"
|
||||
LIBS="$ac_save_LIBS"
|
||||
fi
|
||||
|
||||
if test "x$no_openal" = "x" ; then
|
||||
AC_MSG_RESULT(yes)
|
||||
ifelse([$1], , :, [$1])
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
if test -f conf.openaltest ; then
|
||||
:
|
||||
else
|
||||
echo "*** Could not run OpenAL test program, checking why..."
|
||||
CFLAGS="$CFLAGS $OPENAL_CFLAGS"
|
||||
LIBS="$LIBS $OPENAL_LIBS"
|
||||
AC_TRY_LINK([
|
||||
#include <stdio.h>
|
||||
#include <AL/al.h>
|
||||
], [ return 0; ],
|
||||
[ echo "*** The test program compiled, but did not run. This usually means"
|
||||
echo "*** that the run-time linker is not finding OpenAL or finding the wrong"
|
||||
echo "*** version of OpenAL. If it is not finding OpenAL, you'll need to set your"
|
||||
echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
|
||||
echo "*** to the installed location Also, make sure you have run ldconfig if that"
|
||||
echo "*** is required on your system"
|
||||
echo "***"
|
||||
echo "*** If you have an old version installed, it is best to remove it, although"
|
||||
echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
|
||||
[ echo "*** The test program failed to compile or link. See the file config.log for the"
|
||||
echo "*** exact error that occured. This usually means OpenAL was incorrectly installed"
|
||||
echo "*** or that you have moved OpenAL since it was installed." ])
|
||||
CFLAGS="$ac_save_CFLAGS"
|
||||
LIBS="$ac_save_LIBS"
|
||||
fi
|
||||
OPENAL_CFLAGS=""
|
||||
OPENAL_LIBS=""
|
||||
ifelse([$2], , :, [$2])
|
||||
fi
|
||||
AC_SUBST(OPENAL_CFLAGS)
|
||||
AC_SUBST(OPENAL_LIBS)
|
||||
rm -f conf.openaltest
|
||||
])
|
||||
|
||||
dnl AM_PATH_OPENGL([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
|
||||
dnl Test for OpenGL, and define OPENGL_CFLAGS and OPENGL_LIBS
|
||||
dnl
|
||||
AC_DEFUN([AM_PATH_OPENGL],
|
||||
[dnl
|
||||
dnl Get the cflags and libraries
|
||||
dnl
|
||||
AC_ARG_WITH(opengl,[ --with-opengl=PFX Prefix where OpenGL is installed (optional)], opengl_prefix="$withval", opengl_prefix="")
|
||||
AC_ARG_WITH(opengl-libraries,[ --with-opengl-libraries=DIR Directory where OpenGL library is installed (optional)], opengl_libraries="$withval", opengl_libraries="")
|
||||
AC_ARG_WITH(opengl-includes,[ --with-opengl-includes=DIR Directory where OpenGL header files are installed (optional)], opengl_includes="$withval", opengl_includes="")
|
||||
AC_ARG_ENABLE(opengltest, [ --disable-opengltest Do not try to compile and run a test OpenGL program],, enable_opengltest=yes)
|
||||
|
||||
if test "x$opengl_libraries" != "x" ; then
|
||||
OPENGL_LIBS="-L$opengl_libraries"
|
||||
elif test "x$opengl_prefix" != "x" ; then
|
||||
OPENGL_LIBS="-L$opengl_prefix/lib"
|
||||
elif test "x$prefix" != "xNONE"; then
|
||||
OPENGL_LIBS="-L$libdir"
|
||||
fi
|
||||
|
||||
OPENGL_LIBS="$OPENGL_LIBS -lGL -lGLU"
|
||||
|
||||
if test "x$opengl_includes" != "x" ; then
|
||||
OPENGL_CFLAGS="-I$opengl_includes"
|
||||
elif test "x$opengl_prefix" != "x" ; then
|
||||
OPENGL_CFLAGS="-I$opengl_prefix/include"
|
||||
elif test "x$prefix" != "xNONE"; then
|
||||
OPENGL_CFLAGS=""
|
||||
fi
|
||||
|
||||
|
||||
no_opengl=""
|
||||
|
||||
|
||||
if test "x$enable_opengltest" = "xyes" ; then
|
||||
ac_save_CFLAGS="$CFLAGS"
|
||||
ac_save_LIBS="$LIBS"
|
||||
CFLAGS="$CFLAGS $OPENGL_CFLAGS"
|
||||
LIBS="$LIBS $OPENGL_LIBS"
|
||||
|
||||
AC_CHECK_LIB(GL, glPushMatrix,
|
||||
[AC_CHECK_HEADER(GL/gl.h,
|
||||
[AC_CHECK_LIB(GLU, gluPerspective,
|
||||
[AC_CHECK_HEADER(GL/glu.h, ,
|
||||
dnl NOTE: this is a failure
|
||||
no_opengl=yes
|
||||
)]
|
||||
)]
|
||||
)]
|
||||
)
|
||||
|
||||
CFLAGS="$ac_save_CFLAGS"
|
||||
LIBS="$ac_save_LIBS"
|
||||
fi
|
||||
|
||||
if test "x$no_opengl" = "x" ; then
|
||||
ifelse([$1], , :, [$1])
|
||||
else
|
||||
OPENGL_CFLAGS=""
|
||||
OPENGL_LIBS=""
|
||||
ifelse([$2], , :, [$2])
|
||||
fi
|
||||
AC_SUBST(OPENGL_CFLAGS)
|
||||
AC_SUBST(OPENGL_LIBS)
|
||||
])
|
||||
+2
-2
@@ -49,7 +49,7 @@ DIE=0
|
||||
DIE=1
|
||||
}
|
||||
|
||||
for AM in automake-1.9 automake-1.8 automake-1.7 automake-1.6 automake; do
|
||||
for AM in automake-1.11 automake-1.10 automake-1.9 automake-1.8 automake-1.7 automake-1.6 automake; do
|
||||
(check_version "$AM" 1 6 1) && {
|
||||
AUTOMAKE="$AM"
|
||||
break
|
||||
@@ -67,7 +67,7 @@ fi
|
||||
|
||||
# if no automake, don't bother testing for aclocal
|
||||
test -z "$AUTOMAKE" || {
|
||||
for ACL in aclocal-1.9 aclocal-1.8 aclocal-1.7 aclocal-1.6 aclocal; do
|
||||
for ACL in aclocal-1.11 aclocal-1.10 aclocal-1.9 aclocal-1.8 aclocal-1.7 aclocal-1.6 aclocal; do
|
||||
(check_version "$ACL" 1 6 1) && {
|
||||
ACLOCAL="$ACL"
|
||||
break
|
||||
|
||||
+43
-52
@@ -185,7 +185,7 @@ EXTRA_DIST = \
|
||||
|
||||
# D_ variants are defaults and should always be used
|
||||
# FS2_ variants are for game building and wxFRED
|
||||
AM_CXXFLAGS = @D_CFLAGS@ @FS2_CXXFLAGS@ -I../lua
|
||||
AM_CXXFLAGS = @D_CFLAGS@ @FS2_CXXFLAGS@
|
||||
AM_LDFLAGS = @D_LDFLAGS@ @FS2_LDFLAGS@
|
||||
|
||||
noinst_LIBRARIES = libcode.a
|
||||
@@ -258,8 +258,6 @@ FS2_SOURCES = \
|
||||
debugconsole/dbugfile.h \
|
||||
debugconsole/timerbar.cpp \
|
||||
debugconsole/timerbar.h \
|
||||
decals/decals.cpp \
|
||||
decals/decals.h \
|
||||
demo/demo.cpp \
|
||||
demo/demo.h \
|
||||
exceptionhandler/exceptionhandler.cpp \
|
||||
@@ -283,12 +281,18 @@ FS2_SOURCES = \
|
||||
gamehelp/gameplayhelp.h \
|
||||
gamesequence/gamesequence.cpp \
|
||||
gamesequence/gamesequence.h \
|
||||
gamesnd/eventmusic.cpp \
|
||||
gamesnd/eventmusic.h \
|
||||
gamesnd/gamesnd.cpp \
|
||||
gamesnd/gamesnd.h \
|
||||
globalincs/alphacolors.cpp \
|
||||
globalincs/alphacolors.h \
|
||||
globalincs/crypt.cpp \
|
||||
globalincs/crypt.h \
|
||||
globalincs/def_files.cpp \
|
||||
globalincs/def_files.h \
|
||||
globalincs/fsmemory.cpp \
|
||||
globalincs/fsmemory.h \
|
||||
globalincs/globals.h \
|
||||
globalincs/linklist.h \
|
||||
globalincs/pstypes.h \
|
||||
@@ -572,6 +576,8 @@ FS2_SOURCES = \
|
||||
object/object.h \
|
||||
object/objectshield.cpp \
|
||||
object/objectshield.h \
|
||||
object/objectsnd.cpp \
|
||||
object/objectsnd.h \
|
||||
object/objectsort.cpp \
|
||||
object/parseobjectdock.cpp \
|
||||
object/parseobjectdock.h \
|
||||
@@ -634,6 +640,30 @@ FS2_SOURCES = \
|
||||
ship/shiphit.cpp \
|
||||
ship/shiphit.h \
|
||||
ship/subsysdamage.h \
|
||||
sound/audiostr.cpp \
|
||||
sound/audiostr.h \
|
||||
sound/acm.cpp \
|
||||
sound/acm.h \
|
||||
sound/ds.cpp \
|
||||
sound/ds.h \
|
||||
sound/ds3d.cpp \
|
||||
sound/ds3d.h \
|
||||
sound/dscap.cpp \
|
||||
sound/dscap.h \
|
||||
sound/fsspeech.cpp \
|
||||
sound/fsspeech.h \
|
||||
sound/openal.cpp \
|
||||
sound/openal.h \
|
||||
sound/rtvoice.cpp \
|
||||
sound/rtvoice.h \
|
||||
sound/sound.cpp \
|
||||
sound/sound.h \
|
||||
sound/speech.cpp \
|
||||
sound/speech.h \
|
||||
sound/voicerec.cpp \
|
||||
sound/voicerec.h \
|
||||
sound/ogg/ogg.cpp \
|
||||
sound/ogg/ogg.h \
|
||||
species_defs/species_defs.cpp \
|
||||
species_defs/species_defs.h \
|
||||
starfield/nebula.cpp \
|
||||
@@ -707,44 +737,6 @@ JOY_SOURCES = \
|
||||
io/joy-unix.cpp
|
||||
endif
|
||||
|
||||
## sound support sources
|
||||
if FS2_SOUND
|
||||
SOUND_SOURCES = \
|
||||
gamesnd/eventmusic.cpp \
|
||||
gamesnd/eventmusic.h \
|
||||
gamesnd/gamesnd.cpp \
|
||||
gamesnd/gamesnd.h \
|
||||
object/objectsnd.cpp \
|
||||
object/objectsnd.h \
|
||||
sound/ogg/ogg.cpp \
|
||||
sound/ogg/ogg.h \
|
||||
sound/audiostr-openal.cpp \
|
||||
sound/audiostr.cpp \
|
||||
sound/audiostr.h \
|
||||
sound/acm-openal.cpp \
|
||||
sound/acm.h \
|
||||
sound/ds.cpp \
|
||||
sound/ds.h \
|
||||
sound/ds3d.cpp \
|
||||
sound/ds3d.h \
|
||||
sound/dscap.cpp \
|
||||
sound/dscap.h \
|
||||
sound/rbaudio.cpp \
|
||||
sound/rbaudio.h \
|
||||
sound/rtvoice.cpp \
|
||||
sound/rtvoice.h \
|
||||
sound/sound.cpp \
|
||||
sound/sound.h \
|
||||
vcodec/codec1.cpp \
|
||||
vcodec/codec1.h \
|
||||
sound/fsspeech.cpp \
|
||||
sound/fsspeech.h \
|
||||
sound/speech.cpp \
|
||||
sound/speech.h \
|
||||
sound/voicerec.cpp \
|
||||
sound/voicerec.h
|
||||
endif
|
||||
|
||||
## Win32-specific sources
|
||||
if FS2_OS_WIN32
|
||||
WIN32_SOURCES = \
|
||||
@@ -755,7 +747,6 @@ WIN32_SOURCES = \
|
||||
directx/vdplay.h \
|
||||
directx/vdplobby.h \
|
||||
directx/vdsetup.h \
|
||||
directx/vdsound.h \
|
||||
directx/vdvp.h \
|
||||
globalincs/windebug.cpp \
|
||||
graphics/gl/GLAUX.H \
|
||||
@@ -787,8 +778,8 @@ endif
|
||||
|
||||
|
||||
## libcode.a
|
||||
libcode_a_SOURCES = ${FS2_SOURCES} ${JOY_SOURCES} ${SOUND_SOURCES} \
|
||||
${WIN32_SOURCES} ${UNIX_SOURCES}
|
||||
libcode_a_SOURCES = ${FS2_SOURCES} ${JOY_SOURCES} ${WIN32_SOURCES} \
|
||||
${UNIX_SOURCES}
|
||||
|
||||
##
|
||||
## End CODE library
|
||||
@@ -818,10 +809,10 @@ fs2_open_INF_d_SOURCES = \
|
||||
fs2_open_INF_r_SOURCES = \
|
||||
${FS2OPEN_SOURCES}
|
||||
|
||||
fs2_open_d_LDADD = libcode.a ../libjpeg/libjpeg.a ../lua/liblua.a
|
||||
fs2_open_r_LDADD = libcode.a ../libjpeg/libjpeg.a ../lua/liblua.a
|
||||
fs2_open_INF_d_LDADD = libcode.a ../libjpeg/libjpeg.a ../lua/liblua.a
|
||||
fs2_open_INF_r_LDADD = libcode.a ../libjpeg/libjpeg.a ../lua/liblua.a
|
||||
fs2_open_d_LDADD = libcode.a
|
||||
fs2_open_r_LDADD = libcode.a
|
||||
fs2_open_INF_d_LDADD = libcode.a
|
||||
fs2_open_INF_r_LDADD = libcode.a
|
||||
|
||||
##
|
||||
## End MAIN binary
|
||||
@@ -853,10 +844,10 @@ wxFRED2_INF_d_SOURCES = \
|
||||
wxFRED2_INF_r_SOURCES = \
|
||||
${wxFRED_SOURCES}
|
||||
|
||||
wxFRED2_d_LDADD = libcode.a ../libjpeg/libjpeg.a
|
||||
wxFRED2_r_LDADD = libcode.a ../libjpeg/libjpeg.a
|
||||
wxFRED2_INF_d_LDADD = libcode.a ../libjpeg/libjpeg.a
|
||||
wxFRED2_INF_r_LDADD = libcode.a ../libjpeg/libjpeg.a
|
||||
wxFRED2_d_LDADD = libcode.a
|
||||
wxFRED2_r_LDADD = libcode.a
|
||||
wxFRED2_INF_d_LDADD = libcode.a
|
||||
wxFRED2_INF_r_LDADD = libcode.a
|
||||
|
||||
##
|
||||
## End wxFRED2 binary
|
||||
|
||||
+1
-1
@@ -88,7 +88,7 @@ char *ai_get_goal_ship_name(char *name, int *index)
|
||||
}
|
||||
|
||||
Assert(Total_goal_ship_names < MAX_GOAL_SHIP_NAMES);
|
||||
Assert(strlen(name) < NAME_LENGTH - 1);
|
||||
Assertion(strlen(name) < NAME_LENGTH - 1, "Ship name %s is too long. Needs to be 31 characters or less.", name);
|
||||
i = Total_goal_ship_names++;
|
||||
strcpy_s(Goal_ship_names[i], name);
|
||||
*index = i;
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
struct ship_weapon;
|
||||
struct ship_subsys;
|
||||
struct object;
|
||||
struct ship_info;
|
||||
|
||||
#define AI_DEFAULT_CLASS 3 // default AI class for new ships (Fred)
|
||||
|
||||
@@ -205,12 +206,16 @@ typedef struct ai_class {
|
||||
float ai_glide_attack_percent[NUM_SKILL_LEVELS];
|
||||
float ai_circle_strafe_percent[NUM_SKILL_LEVELS];
|
||||
float ai_glide_strafe_percent[NUM_SKILL_LEVELS];
|
||||
float ai_random_sidethrust_percent[NUM_SKILL_LEVELS];
|
||||
float ai_stalemate_time_thresh[NUM_SKILL_LEVELS];
|
||||
float ai_stalemate_dist_thresh[NUM_SKILL_LEVELS];
|
||||
int ai_chance_to_use_missiles_on_plr[NUM_SKILL_LEVELS];
|
||||
float ai_max_aim_update_delay[NUM_SKILL_LEVELS];
|
||||
float ai_turret_max_aim_update_delay[NUM_SKILL_LEVELS];
|
||||
int ai_profile_flags; //Holds the state of flags that are set
|
||||
int ai_profile_flags_set; //Holds which flags are set and which are just left alone
|
||||
int ai_profile_flags2;
|
||||
int ai_profile_flags2_set;
|
||||
|
||||
//SUSHI: These are optional overrides to an AI class to prevent the automatic scaling based on AI class index
|
||||
int ai_aburn_use_factor[NUM_SKILL_LEVELS];
|
||||
@@ -435,11 +440,14 @@ typedef struct ai_info {
|
||||
float ai_glide_attack_percent;
|
||||
float ai_circle_strafe_percent;
|
||||
float ai_glide_strafe_percent;
|
||||
float ai_random_sidethrust_percent;
|
||||
float ai_stalemate_time_thresh;
|
||||
float ai_stalemate_dist_thresh;
|
||||
int ai_chance_to_use_missiles_on_plr;
|
||||
float ai_max_aim_update_delay;
|
||||
float ai_turret_max_aim_update_delay;
|
||||
int ai_profile_flags; //Holds AI_Profiles flags (possibly overriden by AI class) that actually apply to AI
|
||||
int ai_profile_flags2;
|
||||
|
||||
|
||||
union {
|
||||
@@ -632,6 +640,7 @@ extern ship_subsys *set_targeted_subsys(ai_info *aip, ship_subsys *new_subsys, i
|
||||
extern void ai_rearm_repair( object *objp, int docker_index, object *goal_objp, int dockee_index );
|
||||
extern void ai_add_rearm_goal( object *requester_objp, object *support_objp );
|
||||
extern void create_model_path(object *pl_objp, object *mobjp, int path_num, int subsys_path=0);
|
||||
extern int ai_find_goal_index( ai_goal* aigp, int mode, int submode = -1, int priority = -1 );
|
||||
|
||||
// Goober5000
|
||||
extern void ai_do_safety(object *objp);
|
||||
@@ -694,4 +703,8 @@ void init_aip_from_class_and_profile(ai_info *aip, ai_class *aicp, ai_profile_t
|
||||
|
||||
//SUSHI: Updating AI aim
|
||||
void ai_update_aim(ai_info *aip, object* En_Objp);
|
||||
|
||||
//SUSHI: Random evasive sidethrust
|
||||
void do_random_sidethrust(ai_info *aip, ship_info *sip);
|
||||
|
||||
#endif
|
||||
+27
-3
@@ -49,7 +49,6 @@ void set_flag(ai_profile_t *profile, char *name, int flag, int type)
|
||||
void parse_ai_profiles_tbl(char *filename)
|
||||
{
|
||||
int i, rval;
|
||||
bool no_create = false;
|
||||
char profile_name[NAME_LENGTH];
|
||||
ai_profile_t dummy_profile;
|
||||
char *saved_Mp = NULL;
|
||||
@@ -84,6 +83,7 @@ void parse_ai_profiles_tbl(char *filename)
|
||||
{
|
||||
ai_profile_t *profile = &dummy_profile;
|
||||
ai_profile_t *previous_profile = NULL;
|
||||
bool no_create = false;
|
||||
|
||||
// get the name
|
||||
required_string("$Profile Name:");
|
||||
@@ -273,6 +273,19 @@ void parse_ai_profiles_tbl(char *filename)
|
||||
}
|
||||
}
|
||||
|
||||
if (optional_string("$Random Sidethrust Percent:")) {
|
||||
parse_float_list(profile->random_sidethrust_percent, NUM_SKILL_LEVELS);
|
||||
//Percent is nice for modders, but here in the code we want it betwwen 0 and 1.0
|
||||
//While we're at it, verify the range
|
||||
for (int i = 0; i < NUM_SKILL_LEVELS; i++) {
|
||||
if (profile->random_sidethrust_percent[i] < 0.0f || profile->random_sidethrust_percent[i] > 100.0f) {
|
||||
profile->random_sidethrust_percent[i] = 0.0f;
|
||||
Warning(LOCATION, "$Random Sidethrust Percent should be between 0 and 100.0 (read %f). Setting to 0.", profile->random_sidethrust_percent[i]);
|
||||
}
|
||||
profile->random_sidethrust_percent[i] /= 100.0;
|
||||
}
|
||||
}
|
||||
|
||||
if (optional_string("$Stalemate Time Threshold:"))
|
||||
parse_float_list(profile->stalemate_time_thresh, NUM_SKILL_LEVELS);
|
||||
|
||||
@@ -309,6 +322,9 @@ void parse_ai_profiles_tbl(char *filename)
|
||||
if (optional_string("$Max Aim Update Delay:"))
|
||||
parse_float_list(profile->max_aim_update_delay, NUM_SKILL_LEVELS);
|
||||
|
||||
if (optional_string("$Turret Max Aim Update Delay:"))
|
||||
parse_float_list(profile->turret_max_aim_update_delay, NUM_SKILL_LEVELS);
|
||||
|
||||
set_flag(profile, "$big ships can attack beam turrets on untargeted ships:", AIPF_BIG_SHIPS_CAN_ATTACK_BEAM_TURRETS_ON_UNTARGETED_SHIPS, AIP_FLAG);
|
||||
|
||||
set_flag(profile, "$smart primary weapon selection:", AIPF_SMART_PRIMARY_WEAPON_SELECTION, AIP_FLAG);
|
||||
@@ -367,14 +383,22 @@ void parse_ai_profiles_tbl(char *filename)
|
||||
|
||||
set_flag(profile, "$allow vertical dodge:", AIPF_ALLOW_VERTICAL_DODGE, AIP_FLAG);
|
||||
|
||||
set_flag(profile, "$disarm or disable cause global ai goal effects:", AIPF_GLOBAL_DISARM_DISABLE_EFFECTS, AIP_FLAG);
|
||||
|
||||
set_flag(profile, "$force beam turrets to use normal fov:", AIPF_FORCE_BEAM_TURRET_FOV, AIP_FLAG);
|
||||
|
||||
set_flag(profile, "$fix ai class bug:", AIPF_FIX_AI_CLASS_BUG, AIP_FLAG);
|
||||
|
||||
set_flag(profile, "$turrets ignore targets radius in range checks:", AIPF2_TURRETS_IGNORE_TARGET_RADIUS, AIP_FLAG2);
|
||||
|
||||
set_flag(profile, "$no extra collision avoidance vs player:", AIPF2_NO_SPECIAL_PLAYER_AVOID, AIP_FLAG2);
|
||||
|
||||
set_flag(profile, "$perform less checks for death screams:", AIPF2_PERFORM_LESS_SCREAM_CHECKS, AIP_FLAG2);
|
||||
|
||||
set_flag(profile, "$advanced turret fov edge checks:", AIPF2_ADVANCED_TURRET_FOV_EDGE_CHECKS, AIP_FLAG2);
|
||||
|
||||
set_flag(profile, "$require turrets to have target in fov:", AIPF2_REQUIRE_TURRET_TO_HAVE_TARGET_IN_FOV, AIP_FLAG2);
|
||||
|
||||
set_flag(profile, "$all ships manage shields:", AIPF2_ALL_SHIPS_MANAGE_SHIELDS, AIP_FLAG2);
|
||||
|
||||
// if we've been through once already and are at the same place, force a move
|
||||
if ( saved_Mp && (saved_Mp == Mp) )
|
||||
Mp++;
|
||||
|
||||
+11
-3
@@ -47,12 +47,17 @@
|
||||
#define AIPF_ALLOW_TURRETS_TARGET_WEAPONS_FREELY (1 << 26)
|
||||
#define AIPF_USE_ONLY_SINGLE_FOV_FOR_TURRETS (1 << 27)
|
||||
#define AIPF_ALLOW_VERTICAL_DODGE (1 << 28) //Allows AI ships to evade weapons vertically as well as horizontally
|
||||
#define AIPF_GLOBAL_DISARM_DISABLE_EFFECTS (1 << 29)
|
||||
#define AIPF_FORCE_BEAM_TURRET_FOV (1 << 30)
|
||||
#define AIPF_FIX_AI_CLASS_BUG (1 << 31)
|
||||
#define AIPF_FORCE_BEAM_TURRET_FOV (1 << 29)
|
||||
#define AIPF_FIX_AI_CLASS_BUG (1 << 30)
|
||||
|
||||
// flags2
|
||||
#define AIPF2_TURRETS_IGNORE_TARGET_RADIUS (1 << 0)
|
||||
#define AIPF2_NO_SPECIAL_PLAYER_AVOID (1 << 1)
|
||||
#define AIPF2_PERFORM_LESS_SCREAM_CHECKS (1 << 2)
|
||||
#define AIPF2_ALL_SHIPS_MANAGE_SHIELDS (1 << 3)
|
||||
#define AIPF2_ADVANCED_TURRET_FOV_EDGE_CHECKS (1 << 4)
|
||||
#define AIPF2_REQUIRE_TURRET_TO_HAVE_TARGET_IN_FOV (1 << 5)
|
||||
|
||||
|
||||
#define MAX_AI_PROFILES 5
|
||||
|
||||
@@ -94,9 +99,11 @@ typedef struct ai_profile_t {
|
||||
float glide_attack_percent[NUM_SKILL_LEVELS]; // SUSHI: The likelihood (0.0-1.0) of the AI to use the "glide attack" move
|
||||
float circle_strafe_percent[NUM_SKILL_LEVELS]; // SUSHI: The likelihood (0.0-1.0) of the AI to use the "circle strafe" move
|
||||
float glide_strafe_percent[NUM_SKILL_LEVELS]; // SUSHI: The likelihood (0.0-1.0) of the AI to use glide when strafing capships
|
||||
float random_sidethrust_percent[NUM_SKILL_LEVELS]; // SUSHI: The likelihood (0.0-1.0) of the AI to randomly use sidethrust while dogfihthing
|
||||
float stalemate_time_thresh[NUM_SKILL_LEVELS]; // SUSHI: The amount of time required for the AI to detect (and try to break) dogfight stalemate
|
||||
float stalemate_dist_thresh[NUM_SKILL_LEVELS]; // SUSHI: The maximum distance the AI and target must be within for a stalemate
|
||||
float max_aim_update_delay[NUM_SKILL_LEVELS]; // SUSHI: The maximum delay before the AI updates their aim against small ships
|
||||
float turret_max_aim_update_delay[NUM_SKILL_LEVELS]; // SUSHI: As above, but for turrets updating their aim
|
||||
|
||||
// Multiplicative delay factors for increasing skill levels.
|
||||
float ship_fire_delay_scale_hostile[NUM_SKILL_LEVELS];
|
||||
@@ -125,6 +132,7 @@ typedef struct ai_profile_t {
|
||||
// the chance (x/7) that ship is allowed to fire missiles at player ship.
|
||||
int chance_to_use_missiles_on_plr[NUM_SKILL_LEVELS];
|
||||
|
||||
|
||||
} ai_profile_t;
|
||||
|
||||
|
||||
|
||||
+43
-10
@@ -376,7 +376,12 @@ int ai_big_maybe_follow_subsys_path(int do_dot_check)
|
||||
float dist;
|
||||
|
||||
pm = model_get( Ship_info[Ships[Pl_objp->instance].ship_info_index].model_num );
|
||||
|
||||
//Necessary sanity check
|
||||
polymodel *pm_t;
|
||||
pm_t = model_get(Ship_info[Ships[Objects[aip->target_objnum].instance].ship_info_index].model_num);
|
||||
Assertion(aip->targeted_subsys->system_info->path_num <= pm_t->n_paths, "Invalid Path number %d for subsystem %s on ship %s (Model: %s)\n", aip->targeted_subsys->system_info->path_num, aip->targeted_subsys->system_info->name, Ship_info[Ships[Objects[aip->target_objnum].instance].ship_info_index].name, pm_t->filename );
|
||||
if (aip->targeted_subsys->system_info->path_num > pm_t->n_paths)
|
||||
return 0;
|
||||
// If attacking a subsystem, ensure that we have an unobstructed line of sight... if not, then move
|
||||
// towards path linked to subsystem
|
||||
subsys_in_sight = 0; // assume Pl_objp doesn't have line of sight to subys
|
||||
@@ -420,7 +425,7 @@ int ai_big_maybe_follow_subsys_path(int do_dot_check)
|
||||
|
||||
aip->path_goal_dist = 5;
|
||||
subsys_path_num = aip->targeted_subsys->system_info->path_num;
|
||||
if ( (aip->path_start) == -1 || (aip->mp_index != subsys_path_num) ) {
|
||||
if ( ((aip->path_start) == -1 || (aip->mp_index != subsys_path_num)) && subsys_path_num <= pm->n_paths ) {
|
||||
// maybe create a new path
|
||||
if ( subsys_path_num >= 0 ) {
|
||||
Assert(aip->target_objnum >= 0);
|
||||
@@ -694,7 +699,7 @@ void ai_big_maybe_fire_weapons(float dist_to_enemy, float dot_to_enemy, vec3d *f
|
||||
ship_weapon *tswp = &temp_shipp->weapons;
|
||||
|
||||
if ( tswp->num_primary_banks > 0 ) {
|
||||
Assert(tswp->current_primary_bank < tswp->num_primary_banks);
|
||||
Assertion(tswp->current_primary_bank < tswp->num_primary_banks, "AI tried to select primary bank %d. Might be a model error\n", tswp->current_primary_bank);
|
||||
weapon_info *wip = &Weapon_info[tswp->primary_bank_weapons[tswp->current_primary_bank]];
|
||||
|
||||
if (dist_to_enemy < MIN((wip->max_speed * wip->lifetime), wip->weapon_range)){
|
||||
@@ -704,6 +709,9 @@ void ai_big_maybe_fire_weapons(float dist_to_enemy, float dot_to_enemy, vec3d *f
|
||||
// ship_stop_fire_primary(Pl_objp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tswp->num_secondary_banks > 0) {
|
||||
|
||||
int priority1, priority2;
|
||||
|
||||
@@ -787,7 +795,10 @@ void ai_big_maybe_fire_weapons(float dist_to_enemy, float dot_to_enemy, vec3d *f
|
||||
}
|
||||
}
|
||||
} else {
|
||||
aip->time_enemy_in_range *= (1.0f - flFrametime);
|
||||
if (flFrametime < 1.0f)
|
||||
aip->time_enemy_in_range *= (1.0f - flFrametime);
|
||||
else
|
||||
aip->time_enemy_in_range = 0;
|
||||
}
|
||||
|
||||
if(has_fired == -1){ //stuff that hapens when the ship stops fireing
|
||||
@@ -1094,8 +1105,12 @@ void ai_big_chase()
|
||||
// a big ship
|
||||
if (aip->mode != AIM_EVADE && aip->path_start == -1 ) {
|
||||
ai_big_maybe_fire_weapons(dist_to_enemy, dot_to_enemy, &player_pos, &predicted_enemy_pos, &En_objp->phys_info.vel);
|
||||
} else
|
||||
aip->time_enemy_in_range *= (1.0f - flFrametime);
|
||||
} else {
|
||||
if (flFrametime < 1.0f)
|
||||
aip->time_enemy_in_range *= (1.0f - flFrametime);
|
||||
else
|
||||
aip->time_enemy_in_range = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void ai_big_ship(object *objp)
|
||||
@@ -1151,9 +1166,13 @@ void ai_big_attack_get_data(vec3d *enemy_pos, float *dist_to_enemy, float *dot_t
|
||||
float weapon_speed;
|
||||
|
||||
// Compute position of gun in absolute space and use that as fire position.
|
||||
pnt = po->gun_banks[0].pnt[0];
|
||||
vm_vec_unrotate(&gun_pos, &pnt, &Pl_objp->orient);
|
||||
vm_vec_add2(&gun_pos, &Pl_objp->pos);
|
||||
if (po->n_guns > 0) {
|
||||
pnt = po->gun_banks[0].pnt[0];
|
||||
vm_vec_unrotate(&gun_pos, &pnt, &Pl_objp->orient);
|
||||
vm_vec_add2(&gun_pos, &Pl_objp->pos);
|
||||
} else {
|
||||
gun_pos = Pl_objp->pos;
|
||||
}
|
||||
weapon_speed = ai_get_weapon_speed(&shipp->weapons);
|
||||
|
||||
set_predicted_enemy_pos_turret(&predicted_enemy_pos, &gun_pos, Pl_objp, enemy_pos, &En_objp->phys_info.vel, weapon_speed, aip->time_enemy_in_range);
|
||||
@@ -1417,7 +1436,7 @@ void ai_big_strafe_glide_attack()
|
||||
if (aip->submode_parm1 == 1) {
|
||||
accelerate_ship(aip, 1.0f);
|
||||
//Use afterburners if we have them and are pointed the right way
|
||||
if (dot_to_goal > 0.99f && ai_maybe_fire_afterburner(Pl_objp, aip)) {
|
||||
if (dot_to_goal > 0.99f) {
|
||||
afterburners_start(Pl_objp);
|
||||
aip->afterburner_stop_time = Missiontime + 3*F1_0;
|
||||
}
|
||||
@@ -1626,6 +1645,20 @@ void ai_big_strafe()
|
||||
Int3(); // Illegal submode for AIM_STRAFE
|
||||
break;
|
||||
}
|
||||
|
||||
//Maybe apply random sidethrust, depending on the current submode
|
||||
//The following are valid targets for random sidethrust (circle strafe uses it too, but that is handled separately)
|
||||
if (aip->submode == AIS_STRAFE_ATTACK ||
|
||||
aip->submode == AIS_STRAFE_AVOID ||
|
||||
aip->submode == AIS_STRAFE_RETREAT1 ||
|
||||
aip->submode == AIS_STRAFE_RETREAT2 ||
|
||||
aip->submode == AIS_STRAFE_POSITION)
|
||||
{
|
||||
//Re-roll for random sidethrust every 2 seconds
|
||||
if (static_randf((Missiontime + static_rand(aip->shipnum)) >> 17) < aip->ai_random_sidethrust_percent) {
|
||||
do_random_sidethrust(aip, &Ship_info[Ships[Objects[aip->target_objnum].instance].ship_info_index]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// See if Pl_objp should enter strafe mode (This is called from maybe_evade_dumbfire_weapon(), and the
|
||||
|
||||
+433
-519
File diff suppressed because it is too large.
Load diff
+46
-34
@@ -43,9 +43,8 @@
|
||||
// Goober5000 - okay, this seems really stupid. If any ship in the mission is assigned a goal
|
||||
// in PURGE_GOALS_ALL_SHIPS, *every* other ship will have certain goals purged. So I added
|
||||
// PURGE_GOALS_ONE_SHIP for goals which should only purge other goals in the one ship.
|
||||
#define PURGE_GOALS_ALL_SHIPS (AI_GOAL_IGNORE)
|
||||
#define PURGE_GOALS_ALL_SHIPS (AI_GOAL_IGNORE | AI_GOAL_DISABLE_SHIP | AI_GOAL_DISARM_SHIP)
|
||||
#define PURGE_GOALS_ONE_SHIP (AI_GOAL_IGNORE_NEW)
|
||||
#define PURGE_GOALS_DISARM_DISABLE (AI_GOAL_DISABLE_SHIP | AI_GOAL_DISARM_SHIP)
|
||||
|
||||
// goals given from the player to other ships in the game are also handled in this
|
||||
// code
|
||||
@@ -394,9 +393,9 @@ void ai_mission_goal_complete( ai_info *aip )
|
||||
// which are destroy, etc, should get removed. goal list is the list of goals to purge. It is
|
||||
// always MAX_AI_GOALS in length. This function will only get called when the goal which causes
|
||||
// purging becomes valid.
|
||||
void ai_goal_purge_invalid_goals( ai_goal *aigp, ai_goal *goal_list )
|
||||
void ai_goal_purge_invalid_goals( ai_goal *aigp, ai_goal *goal_list, ai_info *aip, int ai_wingnum )
|
||||
{
|
||||
int i;
|
||||
int i, j;
|
||||
ai_goal *purge_goal;
|
||||
char *name;
|
||||
int mode, ship_index, wingnum;
|
||||
@@ -449,11 +448,33 @@ void ai_goal_purge_invalid_goals( ai_goal *aigp, ai_goal *goal_list )
|
||||
purge_goal->flags |= AIGF_PURGE;
|
||||
break;
|
||||
|
||||
// disarm/disable goals should remove any general attack
|
||||
case AI_GOAL_DISABLE_SHIP:
|
||||
// disarm/disable goals should remove attacks from certain ships types
|
||||
case AI_GOAL_DISARM_SHIP:
|
||||
if ( purge_ai_mode & (AI_GOAL_CHASE | AI_GOAL_CHASE_WING) )
|
||||
purge_goal->flags |= AIGF_PURGE;
|
||||
case AI_GOAL_DISABLE_SHIP:
|
||||
if ( purge_ai_mode & (AI_GOAL_CHASE | AI_GOAL_CHASE_WING) ) {
|
||||
int ai_ship_type;
|
||||
|
||||
// for wings we grab the ship type of the wing leader
|
||||
if (ai_wingnum >= 0) {
|
||||
ai_ship_type = Ship_info[Ships[Wings[ai_wingnum].special_ship].ship_info_index].class_type;
|
||||
}
|
||||
// otherwise we simply grab it from the ship itself
|
||||
else {
|
||||
Assert(aip != NULL);
|
||||
ai_ship_type = Ship_info[Ships[aip->shipnum].ship_info_index].class_type;
|
||||
}
|
||||
|
||||
// grab the ship type of the ship that is being disarmed/disabled
|
||||
ship_type_info *crippled_ships_type = &Ship_types[Ship_info[Ships[ship_index].ship_info_index].class_type];
|
||||
|
||||
// work through all the ship types which to see if the class matching our ai ship must ignore the ship
|
||||
// being disarmed/disabled
|
||||
for ( j=0 ; j < (int)crippled_ships_type->ai_cripple_ignores.size(); j++) {
|
||||
if (crippled_ships_type->ai_cripple_ignores[j] == ai_ship_type) {
|
||||
purge_goal->flags |= AIGF_PURGE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -466,22 +487,19 @@ void ai_goal_purge_all_invalid_goals(ai_goal *aigp)
|
||||
ship_obj *sop;
|
||||
|
||||
// only purge goals if a new goal is one of the types in next statement
|
||||
if (!((aigp->ai_mode & PURGE_GOALS_ALL_SHIPS) || (aigp->ai_mode & PURGE_GOALS_DISARM_DISABLE)))
|
||||
if (!(aigp->ai_mode & PURGE_GOALS_ALL_SHIPS))
|
||||
return;
|
||||
|
||||
if ((aigp->ai_mode & PURGE_GOALS_DISARM_DISABLE) && (!(The_mission.ai_profile->flags & AIPF_GLOBAL_DISARM_DISABLE_EFFECTS)))
|
||||
return;
|
||||
|
||||
for (sop = GET_FIRST(&Ship_obj_list); sop != END_OF_LIST(&Ship_obj_list); sop = GET_NEXT(sop))
|
||||
{
|
||||
ship *shipp = &Ships[Objects[sop->objnum].instance];
|
||||
ai_goal_purge_invalid_goals(aigp, Ai_info[shipp->ai_index].goals);
|
||||
ai_goal_purge_invalid_goals(aigp, Ai_info[shipp->ai_index].goals, &Ai_info[shipp->ai_index], -1);
|
||||
}
|
||||
|
||||
// we must do the same for the wing goals
|
||||
for (i = 0; i < Num_wings; i++)
|
||||
{
|
||||
ai_goal_purge_invalid_goals(aigp, Wings[i].ai_goals);
|
||||
ai_goal_purge_invalid_goals(aigp, Wings[i].ai_goals, NULL, i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -990,7 +1008,7 @@ void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp, char *actor_name )
|
||||
* Pass -1 in priority to ignore priority when searching
|
||||
* Returns -1 if not found, or [0, MAX_AI_GOALS)
|
||||
*/
|
||||
int ai_find_goal_index( ai_goal* aigp, int mode, int submode = -1, int priority = -1 )
|
||||
int ai_find_goal_index( ai_goal* aigp, int mode, int submode, int priority )
|
||||
{
|
||||
Assert( aigp != NULL );
|
||||
for ( int i = 0; i < MAX_AI_GOALS; i++ )
|
||||
@@ -1595,16 +1613,12 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
|
||||
// Goober5000 - see note at PURGE_GOALS_ALL_SHIPS... this is bizarre
|
||||
if ((status == SHIP_STATUS_ARRIVED) && !(aigp->flags & AIGF_GOALS_PURGED))
|
||||
{
|
||||
if ((aigp->ai_mode & PURGE_GOALS_ALL_SHIPS) ||
|
||||
((aigp->ai_mode & PURGE_GOALS_DISARM_DISABLE) && (The_mission.ai_profile->flags & AIPF_GLOBAL_DISARM_DISABLE_EFFECTS)))
|
||||
{
|
||||
if (aigp->ai_mode & PURGE_GOALS_ALL_SHIPS) {
|
||||
ai_goal_purge_all_invalid_goals(aigp);
|
||||
aigp->flags |= AIGF_GOALS_PURGED;
|
||||
}
|
||||
else if ((aigp->ai_mode & PURGE_GOALS_ONE_SHIP) ||
|
||||
((aigp->ai_mode & PURGE_GOALS_DISARM_DISABLE) && (!(The_mission.ai_profile->flags & AIPF_GLOBAL_DISARM_DISABLE_EFFECTS))))
|
||||
{
|
||||
ai_goal_purge_invalid_goals(aigp, aip->goals);
|
||||
else if (aigp->ai_mode & PURGE_GOALS_ONE_SHIP) {
|
||||
ai_goal_purge_invalid_goals(aigp, aip->goals, aip, -1);
|
||||
aigp->flags |= AIGF_GOALS_PURGED;
|
||||
}
|
||||
}
|
||||
@@ -2174,20 +2188,18 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
|
||||
other_obj = &Objects[Ships[shipnum].objnum];
|
||||
ai_attack_object( objp, other_obj, NULL);
|
||||
ai_set_attack_subsystem( objp, current_goal->ai_submode ); // submode stored the subsystem type
|
||||
if (The_mission.ai_profile->flags & AIPF_GLOBAL_DISARM_DISABLE_EFFECTS) {
|
||||
if (current_goal->ai_mode != AI_GOAL_DESTROY_SUBSYSTEM) {
|
||||
if (aip->target_objnum != -1) {
|
||||
// Only protect if _not_ a capital ship. We don't want the Lucifer accidentally getting protected.
|
||||
if (!(Ship_info[Ships[shipnum].ship_info_index].flags & SIF_HUGE_SHIP))
|
||||
Objects[aip->target_objnum].flags |= OF_PROTECTED;
|
||||
}
|
||||
} else // Just in case this ship had been protected, unprotect it.
|
||||
if (aip->target_objnum != -1)
|
||||
Objects[aip->target_objnum].flags &= ~OF_PROTECTED;
|
||||
}
|
||||
if (current_goal->ai_mode != AI_GOAL_DESTROY_SUBSYSTEM) {
|
||||
if (aip->target_objnum != -1) {
|
||||
// Only protect if _not_ a capital ship. We don't want the Lucifer accidentally getting protected.
|
||||
if (Ship_types[Ship_info[Ships[shipnum].ship_info_index].class_type].ai_bools & STI_AI_PROTECTED_ON_CRIPPLE)
|
||||
Objects[aip->target_objnum].flags |= OF_PROTECTED;
|
||||
}
|
||||
} else // Just in case this ship had been protected, unprotect it.
|
||||
if (aip->target_objnum != -1)
|
||||
Objects[aip->target_objnum].flags &= ~OF_PROTECTED;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
case AI_GOAL_CHASE_WING:
|
||||
wingnum = wing_name_lookup( current_goal->ship_name );
|
||||
|
||||
+24
-24
@@ -26,35 +26,35 @@ struct ai_goal;
|
||||
// Fred. If the goal you add doesn't have a target (such as chase_any), then you don't have
|
||||
// to worry about doing this. Also add it to list in Fred\Management.cpp, and let Hoffoss know!
|
||||
// WMC - Oh and add them to Ai_goal_names plz. TY! :)
|
||||
#define AI_GOAL_CHASE (1<<1)
|
||||
#define AI_GOAL_DOCK (1<<2) // used for undocking as well
|
||||
#define AI_GOAL_WAYPOINTS (1<<3)
|
||||
#define AI_GOAL_WAYPOINTS_ONCE (1<<4)
|
||||
#define AI_GOAL_WARP (1<<5)
|
||||
#define AI_GOAL_DESTROY_SUBSYSTEM (1<<6)
|
||||
#define AI_GOAL_FORM_ON_WING (1<<7)
|
||||
#define AI_GOAL_UNDOCK (1<<8)
|
||||
#define AI_GOAL_CHASE_WING (1<<9)
|
||||
#define AI_GOAL_GUARD (1<<10)
|
||||
#define AI_GOAL_DISABLE_SHIP (1<<11)
|
||||
#define AI_GOAL_DISARM_SHIP (1<<12)
|
||||
#define AI_GOAL_CHASE_ANY (1<<13)
|
||||
#define AI_GOAL_IGNORE (1<<14)
|
||||
#define AI_GOAL_GUARD_WING (1<<15)
|
||||
#define AI_GOAL_EVADE_SHIP (1<<16)
|
||||
#define AI_GOAL_CHASE (1<<1) // 0x00000002
|
||||
#define AI_GOAL_DOCK (1<<2) // 0x00000004 // used for undocking as well
|
||||
#define AI_GOAL_WAYPOINTS (1<<3) // 0x00000008
|
||||
#define AI_GOAL_WAYPOINTS_ONCE (1<<4) // 0x00000010
|
||||
#define AI_GOAL_WARP (1<<5) // 0x00000020
|
||||
#define AI_GOAL_DESTROY_SUBSYSTEM (1<<6) // 0x00000040
|
||||
#define AI_GOAL_FORM_ON_WING (1<<7) // 0x00000080
|
||||
#define AI_GOAL_UNDOCK (1<<8) // 0x00000100
|
||||
#define AI_GOAL_CHASE_WING (1<<9) // 0x00000200
|
||||
#define AI_GOAL_GUARD (1<<10) // 0x00000400
|
||||
#define AI_GOAL_DISABLE_SHIP (1<<11) // 0x00000800
|
||||
#define AI_GOAL_DISARM_SHIP (1<<12) // 0x00001000
|
||||
#define AI_GOAL_CHASE_ANY (1<<13) // 0x00002000
|
||||
#define AI_GOAL_IGNORE (1<<14) // 0x00004000
|
||||
#define AI_GOAL_GUARD_WING (1<<15) // 0x00008000
|
||||
#define AI_GOAL_EVADE_SHIP (1<<16) // 0x00010000
|
||||
|
||||
// the next goals are for support ships only
|
||||
#define AI_GOAL_STAY_NEAR_SHIP (1<<17)
|
||||
#define AI_GOAL_KEEP_SAFE_DISTANCE (1<<18)
|
||||
#define AI_GOAL_REARM_REPAIR (1<<19)
|
||||
#define AI_GOAL_STAY_NEAR_SHIP (1<<17) // 0x00020000
|
||||
#define AI_GOAL_KEEP_SAFE_DISTANCE (1<<18) // 0x00040000
|
||||
#define AI_GOAL_REARM_REPAIR (1<<19) // 0x00080000
|
||||
|
||||
// resume regular goals
|
||||
#define AI_GOAL_STAY_STILL (1<<20)
|
||||
#define AI_GOAL_PLAY_DEAD (1<<21)
|
||||
#define AI_GOAL_CHASE_WEAPON (1<<22)
|
||||
#define AI_GOAL_STAY_STILL (1<<20) // 0x00100000
|
||||
#define AI_GOAL_PLAY_DEAD (1<<21) // 0x00200000
|
||||
#define AI_GOAL_CHASE_WEAPON (1<<22) // 0x00400000
|
||||
|
||||
#define AI_GOAL_FLY_TO_SHIP (1<<23) // kazan
|
||||
#define AI_GOAL_IGNORE_NEW (1<<24) // Goober5000
|
||||
#define AI_GOAL_FLY_TO_SHIP (1<<23) // 0x00800000
|
||||
#define AI_GOAL_IGNORE_NEW (1<<24) // 0x01000000
|
||||
|
||||
// now the masks for ship types
|
||||
|
||||
|
||||
+196
-19
@@ -100,6 +100,101 @@ int object_in_turret_fov(object *objp, ship_subsys *ss, vec3d *tvec, vec3d *tpos
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool is_object_radius_in_turret_fov(object *objp, ship_subsys *ss, vec3d *tvec, vec3d *tpos, vec3d *v2e, vec3d *predicted_pos, float distance)
|
||||
{
|
||||
float target_dist = distance;
|
||||
if (distance == 0.0f)
|
||||
target_dist = vm_vec_dist(predicted_pos,tpos);
|
||||
|
||||
if (object_in_turret_fov(objp, ss, tvec, tpos, target_dist + objp->radius)) {
|
||||
// so the targeted spot in not in fov but the enemy + radius is
|
||||
// lets align the darn gun and try shooting there
|
||||
vec3d temp_vec;
|
||||
float multiplier = 0;
|
||||
model_subsystem *tp = ss->system_info;
|
||||
|
||||
// project v2e_from_turret to turret normal
|
||||
// substract resultant vector from the temp_vec (v2e_from_turret)
|
||||
// adjust z component as necessary
|
||||
// calculate multiplier for the resultant vector
|
||||
// use multiplier and the z component and compose a new vector
|
||||
float dot = vm_vec_dot(v2e, tvec);
|
||||
|
||||
vm_vec_scale_add(&temp_vec, v2e, tvec, -dot);
|
||||
|
||||
if (IS_VEC_NULL_SQ_SAFE(&temp_vec)) {
|
||||
// return false, target is perfectly aligned over or below the turret
|
||||
// safe bet is to allow turret to reacquire better target
|
||||
return false;
|
||||
}
|
||||
|
||||
// normalize the vec, it needs to be done regardless
|
||||
vm_vec_normalize(&temp_vec);
|
||||
bool fix_elevation = false;
|
||||
bool fix_base_rot = false;
|
||||
|
||||
if (dot < tp->turret_fov) {
|
||||
dot = tp->turret_fov;
|
||||
fix_elevation = true;
|
||||
}
|
||||
if (dot > tp->turret_max_fov) {
|
||||
dot = tp->turret_max_fov;
|
||||
fix_elevation = true;
|
||||
}
|
||||
|
||||
if (tp->flags & MSS_FLAG_TURRET_ALT_MATH) {
|
||||
vec3d temp_vec2;
|
||||
vm_vec_rotate(&temp_vec2, &temp_vec, &ss->world_to_turret_matrix);
|
||||
|
||||
// now in turrets frame of reference
|
||||
// check if math is actually possible
|
||||
if (!((temp_vec2.xyz.x == 0) && (temp_vec2.xyz.y == 0))) {
|
||||
float temp_z = temp_vec2.xyz.z;
|
||||
temp_vec2.xyz.z = 0.0f;
|
||||
// make sure null vecs wont happen
|
||||
if (!IS_VEC_NULL_SQ_SAFE(&temp_vec2)) {
|
||||
vm_vec_normalize(&temp_vec2);
|
||||
// only do this if it actually is required
|
||||
if (-temp_vec2.xyz.y < tp->turret_y_fov) {
|
||||
float check_pos = 1;
|
||||
|
||||
fix_base_rot = true;
|
||||
temp_vec2.xyz.y = -tp->turret_y_fov;
|
||||
if (temp_vec2.xyz.x < 0)
|
||||
check_pos = -1;
|
||||
temp_vec2.xyz.x = check_pos * sqrtf(1 - (temp_vec2.xyz.y*temp_vec2.xyz.y));
|
||||
|
||||
// restore z component
|
||||
float scaler = sqrtf(1 - (temp_z*temp_z));
|
||||
vm_vec_scale(&temp_vec2,scaler);
|
||||
temp_vec2.xyz.z = temp_z;
|
||||
// back to world frame
|
||||
vm_vec_unrotate(&temp_vec, &temp_vec2, &ss->world_to_turret_matrix);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (fix_elevation || fix_base_rot) {
|
||||
if (fix_elevation) {
|
||||
multiplier = sqrtf(1 - (dot*dot));
|
||||
// keep the temp_vec scaled with the tweaked vector
|
||||
vm_vec_scale(&temp_vec, multiplier);
|
||||
}
|
||||
vm_vec_scale_add(v2e, &temp_vec, tvec, dot);
|
||||
// and we are done with v2e...
|
||||
vm_vec_scale_add(predicted_pos, tpos, v2e, target_dist);
|
||||
// and we are done with predicted position
|
||||
return true;
|
||||
} else {
|
||||
mprintf(("Warning: Function 'is_object_radius_in_turret_fov' was called\nwithout need to fix turret alignments\n"));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// outside of the expanded radii, unable to align, return false
|
||||
return false;
|
||||
}
|
||||
|
||||
// return 1 if bomb_objp is headed towards ship_objp
|
||||
int bomb_headed_towards_ship(object *bomb_objp, object *ship_objp)
|
||||
{
|
||||
@@ -357,9 +452,10 @@ extern int Player_attacking_enabled;
|
||||
void evaluate_obj_as_target(object *objp, eval_enemy_obj_struct *eeo)
|
||||
{
|
||||
object *turret_parent_obj = &Objects[eeo->turret_parent_objnum];
|
||||
ship *shipp;
|
||||
ship *shipp;
|
||||
ship_subsys *ss = eeo->turret_subsys;
|
||||
float dist, dist_comp;
|
||||
bool turret_has_no_target = false;
|
||||
|
||||
// Don't look for bombs when weapon system is not ok
|
||||
if (objp->type == OBJ_WEAPON && !eeo->weapon_system_ok) {
|
||||
@@ -476,7 +572,10 @@ void evaluate_obj_as_target(object *objp, eval_enemy_obj_struct *eeo)
|
||||
if ((objp->type == OBJ_WEAPON) && check_weapon) {
|
||||
if ( Weapons[objp->instance].homing_object == &Objects[eeo->turret_parent_objnum] ) {
|
||||
if ( dist_comp < eeo->nearest_homing_bomb_dist ) {
|
||||
if ( (eeo->current_enemy == -1) || object_in_turret_fov(objp, ss, eeo->tvec, eeo->tpos, dist + objp->radius) ) {
|
||||
if (!(ss->flags & SSF_FOV_REQUIRED) && (eeo->current_enemy == -1)) {
|
||||
turret_has_no_target = true;
|
||||
}
|
||||
if ( (turret_has_no_target) || object_in_turret_fov(objp, ss, eeo->tvec, eeo->tpos, dist + objp->radius) ) {
|
||||
eeo->nearest_homing_bomb_dist = dist_comp;
|
||||
eeo->nearest_homing_bomb_objnum = OBJ_INDEX(objp);
|
||||
}
|
||||
@@ -484,7 +583,10 @@ void evaluate_obj_as_target(object *objp, eval_enemy_obj_struct *eeo)
|
||||
// if not homing, check if bomb is flying towards ship
|
||||
} else if ( bomb_headed_towards_ship(objp, &Objects[eeo->turret_parent_objnum]) ) {
|
||||
if ( dist_comp < eeo->nearest_bomb_dist ) {
|
||||
if ( (eeo->current_enemy == -1) || object_in_turret_fov(objp, ss, eeo->tvec, eeo->tpos, dist + objp->radius) ) {
|
||||
if (!(ss->flags & SSF_FOV_REQUIRED) && (eeo->current_enemy == -1)) {
|
||||
turret_has_no_target = true;
|
||||
}
|
||||
if ( (turret_has_no_target) || object_in_turret_fov(objp, ss, eeo->tvec, eeo->tpos, dist + objp->radius) ) {
|
||||
eeo->nearest_bomb_dist = dist_comp;
|
||||
eeo->nearest_bomb_objnum = OBJ_INDEX(objp);
|
||||
}
|
||||
@@ -540,7 +642,10 @@ void evaluate_obj_as_target(object *objp, eval_enemy_obj_struct *eeo)
|
||||
|
||||
// maybe update nearest attacker
|
||||
if ( dist_comp < eeo->nearest_attacker_dist ) {
|
||||
if ( (eeo->current_enemy == -1) || object_in_turret_fov(objp, ss, eeo->tvec, eeo->tpos, dist + objp->radius) ) {
|
||||
if (!(ss->flags & SSF_FOV_REQUIRED) && (eeo->current_enemy == -1)) {
|
||||
turret_has_no_target = true;
|
||||
}
|
||||
if ( (turret_has_no_target) || object_in_turret_fov(objp, ss, eeo->tvec, eeo->tpos, dist + objp->radius) ) {
|
||||
// nprintf(("AI", "Nearest enemy = %s, dist = %7.3f, dot = %6.3f, fov = %6.3f\n", Ships[objp->instance].ship_name, dist, vm_vec_dot(&v2e, tvec), tp->turret_fov));
|
||||
eeo->nearest_attacker_dist = dist_comp;
|
||||
eeo->nearest_attacker_objnum = OBJ_INDEX(objp);
|
||||
@@ -555,7 +660,10 @@ void evaluate_obj_as_target(object *objp, eval_enemy_obj_struct *eeo)
|
||||
dist_comp *= 0.9f + (0.01f * asteroid_time_to_impact(objp));
|
||||
|
||||
if (dist_comp < eeo->nearest_dist ) {
|
||||
if ( (eeo->current_enemy == -1) || object_in_turret_fov(objp, ss, eeo->tvec, eeo->tpos, dist + objp->radius) ) {
|
||||
if (!(ss->flags & SSF_FOV_REQUIRED) && (eeo->current_enemy == -1)) {
|
||||
turret_has_no_target = true;
|
||||
}
|
||||
if ( (turret_has_no_target) || object_in_turret_fov(objp, ss, eeo->tvec, eeo->tpos, dist + objp->radius) ) {
|
||||
eeo->nearest_dist = dist_comp;
|
||||
eeo->nearest_objnum = OBJ_INDEX(objp);
|
||||
}
|
||||
@@ -945,7 +1053,13 @@ int find_turret_enemy(ship_subsys *turret_subsys, int objnum, vec3d *tpos, vec3d
|
||||
dist = vm_vec_normalized_dir(&v2e, &Objects[aip->target_objnum].pos, tpos);
|
||||
|
||||
in_fov = turret_fov_test(turret_subsys, tvec, &v2e);
|
||||
// MODIFY FOR ATTACKING BIG SHIP
|
||||
|
||||
if (turret_subsys->flags & SSF_FOV_EDGE_CHECK) {
|
||||
if (in_fov == false)
|
||||
if (object_in_turret_fov(&Objects[aip->target_objnum], turret_subsys, tvec, tpos, dist + Objects[aip->target_objnum].radius))
|
||||
in_fov = true;
|
||||
}
|
||||
// MODIFY FOR ATTACKING BIG SHIP
|
||||
// dot += (0.5f * Objects[aip->target_objnum].radius / dist);
|
||||
if (in_fov) {
|
||||
return aip->target_objnum;
|
||||
@@ -1008,9 +1122,28 @@ void ship_get_global_turret_gun_info(object *objp, ship_subsys *ssp, vec3d *gpos
|
||||
vm_vec_normalized_dir(gvec, targetp, gpos);
|
||||
}
|
||||
|
||||
ship_model_stop(objp);
|
||||
ship_model_stop(objp);
|
||||
|
||||
// per firingpoint based changes go here for turrets
|
||||
}
|
||||
|
||||
//Update turret aiming data based on max turret aim update delay
|
||||
void turret_ai_update_aim(ai_info *aip, object *En_Objp, ship_subsys *ss)
|
||||
{
|
||||
if (Missiontime >= ss->next_aim_pos_time)
|
||||
{
|
||||
ss->last_aim_enemy_pos = En_Objp->pos;
|
||||
ss->last_aim_enemy_vel = En_Objp->phys_info.vel;
|
||||
ss->next_aim_pos_time = Missiontime + fl2f(frand_range(0.0f, aip->ai_turret_max_aim_update_delay));
|
||||
}
|
||||
else
|
||||
{
|
||||
//Update the position based on the velocity (assume no velocity vector change)
|
||||
vm_vec_scale_add2(&ss->last_aim_enemy_pos, &ss->last_aim_enemy_vel, flFrametime);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Rotate a turret towards an enemy.
|
||||
// Return TRUE if caller should use angles in subsequent rotations.
|
||||
// Some obscure model thing only John Slagel knows about.
|
||||
@@ -1041,23 +1174,26 @@ int aifft_rotate_turret(ship *shipp, int parent_objnum, ship_subsys *ss, object
|
||||
|
||||
ship_get_global_turret_info(&Objects[parent_objnum], tp, &gun_pos, &gun_vec);
|
||||
|
||||
//Update "known" position and velocity of target. Only matters if max_aim_update_delay is set.
|
||||
turret_ai_update_aim(&Ai_info[shipp->ai_index], &Objects[ss->turret_enemy_objnum], ss);
|
||||
|
||||
//Figure out what point on the ship we want to point the gun at, and store the global location
|
||||
//in enemy_point.
|
||||
vec3d enemy_point;
|
||||
if ((ss->targeted_subsys != NULL) && !(ss->flags & SSF_NO_SS_TARGETING)) {
|
||||
if (ss->turret_enemy_objnum != -1) {
|
||||
vm_vec_unrotate(&enemy_point, &ss->targeted_subsys->system_info->pnt, &Objects[ss->turret_enemy_objnum].orient);
|
||||
vm_vec_add2(&enemy_point, &Objects[ss->turret_enemy_objnum].pos);
|
||||
vm_vec_add2(&enemy_point, &ss->last_aim_enemy_pos);
|
||||
}
|
||||
} else {
|
||||
if ((lep->type == OBJ_SHIP) && (Ship_info[Ships[lep->instance].ship_info_index].flags & (SIF_BIG_SHIP | SIF_HUGE_SHIP))) {
|
||||
ai_big_pick_attack_point_turret(lep, ss, &gun_pos, &gun_vec, &enemy_point, tp->turret_fov, MIN(wip->max_speed * wip->lifetime, wip->weapon_range));
|
||||
} else {
|
||||
enemy_point = lep->pos;
|
||||
enemy_point = ss->last_aim_enemy_pos;
|
||||
}
|
||||
}
|
||||
|
||||
target_moving_direction = lep->phys_info.vel;
|
||||
target_moving_direction = ss->last_aim_enemy_vel;
|
||||
|
||||
//Try to guess where the enemy will be, and store that spot in predicted_enemy_pos
|
||||
if (The_mission.ai_profile->flags & AIPF_USE_ADDITIVE_WEAPON_VELOCITY) {
|
||||
@@ -1084,6 +1220,11 @@ int aifft_rotate_turret(ship *shipp, int parent_objnum, ship_subsys *ss, object
|
||||
|
||||
in_fov = turret_fov_test(ss, gvec, &v2e);
|
||||
|
||||
if (ss->flags & SSF_FOV_EDGE_CHECK) {
|
||||
if (in_fov == false)
|
||||
in_fov = is_object_radius_in_turret_fov(&Objects[ss->turret_enemy_objnum], ss, gvec, &gun_pos, &v2e, predicted_enemy_pos, 0.0f);
|
||||
}
|
||||
|
||||
if (in_fov) {
|
||||
ret_val = model_rotate_gun(Ship_info[shipp->ship_info_index].model_num,
|
||||
tp, &Objects[parent_objnum].orient,
|
||||
@@ -1317,7 +1458,7 @@ void turret_set_next_fire_timestamp(int weapon_num, weapon_info *wip, ship_subsy
|
||||
{
|
||||
|
||||
// make side even for team vs. team
|
||||
if ((Game_mode & GM_MULTIPLAYER) && (Netgame.type_flags & NG_TYPE_TEAM)) {
|
||||
if (MULTI_TEAM) {
|
||||
// flak guns need to fire more rapidly
|
||||
if (wip->wi_flags & WIF_FLAK) {
|
||||
wait *= aip->ai_ship_fire_delay_scale_friendly * 0.5f;
|
||||
@@ -1359,6 +1500,9 @@ void turret_set_next_fire_timestamp(int weapon_num, weapon_info *wip, ship_subsy
|
||||
wait *= frand_range(0.9f, 1.1f);
|
||||
}
|
||||
|
||||
if(turret->rof_scaler != 1.0f)
|
||||
wait /= get_adjusted_turret_rof(turret);
|
||||
|
||||
(*fs_dest) = timestamp((int)wait);
|
||||
}
|
||||
|
||||
@@ -1883,8 +2027,8 @@ void ai_fire_from_turret(ship *shipp, ship_subsys *ss, int parent_objnum)
|
||||
if(num_valid < 1)
|
||||
ss->turret_enemy_objnum = -1;
|
||||
|
||||
// Maybe pick a new enemy.
|
||||
if ( turret_should_pick_new_target(ss) ) {
|
||||
// Maybe pick a new enemy, unless targeting has been taken over by scripting
|
||||
if ( turret_should_pick_new_target(ss) && !ss->scripting_target_override) {
|
||||
Num_find_turret_enemy++;
|
||||
int objnum = find_turret_enemy(ss, parent_objnum, &gpos, &gvec, ss->turret_enemy_objnum);
|
||||
//Assert(objnum < 0 || is_target_beam_valid(tp, objnum));
|
||||
@@ -2119,6 +2263,12 @@ void ai_fire_from_turret(ship *shipp, ship_subsys *ss, int parent_objnum)
|
||||
turret_fire_weapon(valid_weapons[0], ss, parent_objnum, &gpos, &tv2e, &predicted_enemy_pos);
|
||||
else
|
||||
turret_fire_weapon(valid_weapons[i], ss, parent_objnum, &gpos, &tv2e, &predicted_enemy_pos);
|
||||
} else {
|
||||
// make sure salvo fire mode does not turn into autofire
|
||||
if ((tp->flags & MSS_FLAG_TURRET_SALVO) && ((i + 1) == number_of_firings)) {
|
||||
ai_info *parent_aip = &Ai_info[Ships[Objects[parent_objnum].instance].ai_index];
|
||||
turret_set_next_fire_timestamp(valid_weapons[0], wip, ss, parent_aip);
|
||||
}
|
||||
}
|
||||
// moved this here so we increment the fire pos only after we have fired and not during it
|
||||
ss->turret_next_fire_pos++;
|
||||
@@ -2178,7 +2328,7 @@ bool turret_std_fov_test(ship_subsys *ss, vec3d *gvec, vec3d *v2e, float size_mo
|
||||
{
|
||||
model_subsystem *tp = ss->system_info;
|
||||
float dot = vm_vec_dot(v2e, gvec);
|
||||
if (((dot + size_mod) > tp->turret_fov) && ((dot - size_mod) <= tp->turret_max_fov))
|
||||
if (((dot + size_mod) >= tp->turret_fov) && ((dot - size_mod) <= tp->turret_max_fov))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@@ -2188,17 +2338,19 @@ bool turret_adv_fov_test(ship_subsys *ss, vec3d *gvec, vec3d *v2e, float size_mo
|
||||
{
|
||||
model_subsystem *tp = ss->system_info;
|
||||
float dot = vm_vec_dot(v2e, gvec);
|
||||
if (((dot + size_mod) > tp->turret_fov) && ((dot - size_mod) <= tp->turret_max_fov)) {
|
||||
if (((dot + size_mod) >= tp->turret_fov) && ((dot - size_mod) <= tp->turret_max_fov)) {
|
||||
vec3d of_dst;
|
||||
vm_vec_rotate( &of_dst, v2e, &ss->world_to_turret_matrix );
|
||||
vm_vec_normalize(&of_dst);
|
||||
if ((of_dst.xyz.x == 0) && (of_dst.xyz.y == 0)) {
|
||||
return true;
|
||||
} else {
|
||||
of_dst.xyz.z = 0;
|
||||
// now we have 2d vector with lenght of 1 that points at the targets direction after being rotated to turrets FOR
|
||||
if ((-of_dst.xyz.y + size_mod) > tp->turret_y_fov)
|
||||
return true;
|
||||
if (!IS_VEC_NULL_SQ_SAFE(&of_dst)) {
|
||||
vm_vec_normalize(&of_dst);
|
||||
// now we have 2d vector with lenght of 1 that points at the targets direction after being rotated to turrets FOR
|
||||
if ((-of_dst.xyz.y + size_mod) >= tp->turret_y_fov)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
@@ -2214,3 +2366,28 @@ bool turret_fov_test(ship_subsys *ss, vec3d *gvec, vec3d *v2e, float size_mod)
|
||||
|
||||
return in_fov;
|
||||
}
|
||||
|
||||
float get_adjusted_turret_rof(ship_subsys *ss)
|
||||
{
|
||||
float tempf = ss->rof_scaler;
|
||||
|
||||
// optional reset switch (negative value)
|
||||
if (tempf < 0) {
|
||||
ss->rof_scaler = 1.0f;
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
if (tempf == 0) {
|
||||
// special case returning the number of firingpoints
|
||||
ss->rof_scaler = (float) ss->system_info->turret_num_firing_points;
|
||||
tempf = ss->rof_scaler;
|
||||
|
||||
// safety check to avoid div/0 issues
|
||||
if (tempf == 0) {
|
||||
ss->rof_scaler = 1.0f;
|
||||
return 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
return tempf;
|
||||
}
|
||||
+18
-6
@@ -112,11 +112,13 @@ MONITOR(NumANIPlayed)
|
||||
// Setup an anim_play_struct for passing into anim_play(). Will fill in default values, which you
|
||||
// can then change before calling anim_play().
|
||||
//
|
||||
void anim_play_init(anim_play_struct *aps, anim *a_info, int x, int y)
|
||||
void anim_play_init(anim_play_struct *aps, anim *a_info, int x, int y, int base_w, int base_h)
|
||||
{
|
||||
aps->anim_info = a_info;
|
||||
aps->x = x;
|
||||
aps->y = y;
|
||||
aps->base_w = base_w;
|
||||
aps->base_h = base_h;
|
||||
aps->start_at = 0;
|
||||
aps->stop_at = a_info->total_frames - 1;
|
||||
aps->screen_id = 0;
|
||||
@@ -219,6 +221,14 @@ anim_instance *anim_play(anim_play_struct *aps)
|
||||
instance->xlate_pal = 0;
|
||||
}
|
||||
|
||||
if(aps->base_w < 0 || aps->base_h < 0) {
|
||||
instance->base_w = gr_screen.max_w_unscaled;
|
||||
instance->base_h = gr_screen.max_h_unscaled;
|
||||
} else {
|
||||
instance->base_w = aps->base_w;
|
||||
instance->base_h = aps->base_h;
|
||||
}
|
||||
|
||||
// determining the start_at frame is more complicated, since it must be a key-frame.
|
||||
// Futhermore, need to subtract 1 from key-frame number, since frame number is always
|
||||
// incremented the first time anim_show_next_frame() is called
|
||||
@@ -521,6 +531,8 @@ int anim_show_next_frame(anim_instance *instance, float frametime)
|
||||
|
||||
// determine x,y to display the bitmap at
|
||||
if ( instance->world_pos == NULL ) {
|
||||
gr_set_screen_scale(instance->base_w, instance->base_h);
|
||||
gr_set_clip(0, 0, instance->base_w, instance->base_h, false);
|
||||
if ( instance->aa_color == NULL ) {
|
||||
gr_bitmap(instance->x, instance->y);
|
||||
}
|
||||
@@ -528,6 +540,8 @@ int anim_show_next_frame(anim_instance *instance, float frametime)
|
||||
gr_set_color_fast( (color*)instance->aa_color );
|
||||
gr_aabitmap(instance->x, instance->y);
|
||||
}
|
||||
gr_reset_screen_scale();
|
||||
gr_reset_clip();
|
||||
}
|
||||
else {
|
||||
g3_rotate_vertex(&image_vertex,instance->world_pos);
|
||||
@@ -1085,11 +1099,9 @@ void anim_reverse_direction(anim_instance *ai)
|
||||
{
|
||||
int temp;
|
||||
|
||||
if(!(ai->parent->flags & ANF_ALL_KEYFRAMES)){
|
||||
// you're not allowed to call anim_reverse_direction(...) unless every frame is a keyframe!!!!
|
||||
// The God of Delta-RLE demands it be thus.
|
||||
Int3();
|
||||
}
|
||||
// you're not allowed to call anim_reverse_direction(...) unless every frame is a keyframe!!!!
|
||||
// The God of Delta-RLE demands it be thus.
|
||||
Assertion( ai->parent->flags & ANF_ALL_KEYFRAMES, "Ani was set to play backwards. In order to enable this, all frames of the animation MUST be keyframes.");
|
||||
|
||||
// flip the animation direction
|
||||
if(ai->direction == ANIM_DIRECT_FORWARD){
|
||||
|
||||
@@ -24,6 +24,8 @@ typedef struct {
|
||||
anim *anim_info;
|
||||
int x;
|
||||
int y;
|
||||
int base_w;
|
||||
int base_h;
|
||||
int start_at;
|
||||
int stop_at;
|
||||
int screen_id;
|
||||
@@ -50,7 +52,7 @@ void anim_level_init();
|
||||
void anim_level_close();
|
||||
void anim_render_all(int screen_id, float frametime);
|
||||
void anim_render_one(int screen_id, anim_instance *ani, float frametime);
|
||||
void anim_play_init(anim_play_struct *aps, anim *a_info, int x, int y);
|
||||
void anim_play_init(anim_play_struct *aps, anim *a_info, int x, int y, int max_x = -1, int max_y = -1);
|
||||
anim_instance *anim_play(anim_play_struct *aps);
|
||||
void anim_ignore_next_frametime();
|
||||
int anim_stop_playing(anim_instance* anim_instance);
|
||||
|
||||
+1
-149
@@ -168,154 +168,6 @@ ubyte *anim_get_next_raw_buffer(anim_instance *inst, int xlate_pal, int aabitmap
|
||||
return inst->frame;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// anim_get_frame()
|
||||
//
|
||||
// Get a bitmap id from the anim_instance for the specified frame_num
|
||||
//
|
||||
// input: *inst => pointer to anim instance
|
||||
// frame_num => frame number to get (first frame is 0)
|
||||
// xlate_pal => DEFAULT PARM (value 1): whether to translate the palette
|
||||
// to the current game palette
|
||||
//
|
||||
int anim_get_frame(anim_instance *inst, int frame_num, int xlate_pal)
|
||||
{
|
||||
/*
|
||||
int bm, bitmap_flags, key = 0, offset = 0;
|
||||
int idx;
|
||||
|
||||
if ((frame_num < 0) || (frame_num >= inst->parent->total_frames)) // illegal frame number
|
||||
return -1;
|
||||
|
||||
int need_reset = 0;
|
||||
if ( anim_instance_is_streamed(inst) ) {
|
||||
if ( inst->file_offset < 0 ) {
|
||||
need_reset = 1;
|
||||
}
|
||||
} else {
|
||||
if ( !inst->data ) {
|
||||
need_reset = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (need_reset || (inst->frame_num >= inst->parent->total_frames)) { // reset to valid info
|
||||
inst->data = inst->parent->data;
|
||||
inst->file_offset = inst->parent->file_offset;
|
||||
inst->frame_num = 0;
|
||||
}
|
||||
|
||||
bitmap_flags = 0;
|
||||
if (inst->parent->flags & ANF_XPARENT) {
|
||||
// bitmap_flags = BMP_XPARENT;
|
||||
bitmap_flags = 0;
|
||||
}
|
||||
|
||||
if ( inst->frame_num == frame_num ) {
|
||||
bm = bm_create(16, inst->parent->width, inst->parent->height, inst->frame, bitmap_flags);
|
||||
bm_unload(bm);
|
||||
return bm;
|
||||
}
|
||||
|
||||
if (inst->parent->flags & ANF_XPARENT){
|
||||
// bitmap_flags = BMP_XPARENT;
|
||||
bitmap_flags = 0;
|
||||
} else {
|
||||
bitmap_flags = 0;
|
||||
}
|
||||
|
||||
idx = 0;
|
||||
key = 0;
|
||||
while(idx < inst->parent->num_keys){
|
||||
if (( (inst->parent->keys[idx].frame_num-1) <= frame_num) && ( (inst->parent->keys[idx].frame_num-1) > key)) { // find closest key
|
||||
key = inst->parent->keys[idx].frame_num - 1;
|
||||
offset = inst->parent->keys[idx].offset;
|
||||
|
||||
if ( key == frame_num )
|
||||
break;
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
|
||||
if ( key == frame_num ) {
|
||||
inst->frame_num = key;
|
||||
|
||||
if ( anim_instance_is_streamed(inst) ) {
|
||||
inst->file_offset = inst->parent->file_offset + offset;
|
||||
} else {
|
||||
inst->data = inst->parent->data + offset;
|
||||
}
|
||||
|
||||
anim_check_for_palette_change(inst);
|
||||
|
||||
if ( anim_instance_is_streamed(inst) ) {
|
||||
if ( xlate_pal ){
|
||||
inst->file_offset = unpack_frame_from_file(inst, inst->frame, inst->parent->width*inst->parent->height, inst->parent->palette_translation);
|
||||
} else {
|
||||
inst->file_offset = unpack_frame_from_file(inst, inst->frame, inst->parent->width*inst->parent->height, NULL);
|
||||
}
|
||||
} else {
|
||||
if ( xlate_pal ){
|
||||
inst->data = unpack_frame(inst, inst->data, inst->frame, inst->parent->width*inst->parent->height, inst->parent->palette_translation);
|
||||
} else {
|
||||
inst->data = unpack_frame(inst, inst->data, inst->frame, inst->parent->width*inst->parent->height, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
goto create_bitmap;
|
||||
}
|
||||
|
||||
if (key > inst->frame_num) // best key is closer than current position
|
||||
{
|
||||
inst->frame_num = key;
|
||||
|
||||
if ( anim_instance_is_streamed(inst) ) {
|
||||
inst->file_offset = inst->parent->file_offset + offset;
|
||||
} else {
|
||||
inst->data = inst->parent->data + offset;
|
||||
}
|
||||
|
||||
anim_check_for_palette_change(inst);
|
||||
|
||||
if ( anim_instance_is_streamed(inst) ) {
|
||||
if ( xlate_pal )
|
||||
inst->file_offset = unpack_frame_from_file(inst, inst->frame, inst->parent->width*inst->parent->height, inst->parent->palette_translation);
|
||||
else
|
||||
inst->file_offset = unpack_frame_from_file(inst, inst->frame, inst->parent->width*inst->parent->height, NULL);
|
||||
} else {
|
||||
if ( xlate_pal )
|
||||
inst->data = unpack_frame(inst, inst->data, inst->frame, inst->parent->width*inst->parent->height, inst->parent->palette_translation);
|
||||
else
|
||||
inst->data = unpack_frame(inst, inst->data, inst->frame, inst->parent->width*inst->parent->height, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
while (inst->frame_num != frame_num) {
|
||||
anim_check_for_palette_change(inst);
|
||||
|
||||
if ( anim_instance_is_streamed(inst) ) {
|
||||
if ( xlate_pal )
|
||||
inst->file_offset = unpack_frame_from_file(inst, inst->frame, inst->parent->width*inst->parent->height, inst->parent->palette_translation);
|
||||
else
|
||||
inst->file_offset = unpack_frame_from_file(inst, inst->frame, inst->parent->width*inst->parent->height, NULL);
|
||||
} else {
|
||||
if ( xlate_pal )
|
||||
inst->data = unpack_frame(inst, inst->data, inst->frame, inst->parent->width*inst->parent->height, inst->parent->palette_translation);
|
||||
else
|
||||
inst->data = unpack_frame(inst, inst->data, inst->frame, inst->parent->width*inst->parent->height, NULL);
|
||||
}
|
||||
inst->frame_num++;
|
||||
}
|
||||
|
||||
create_bitmap:
|
||||
|
||||
bm = bm_create(16, inst->parent->width, inst->parent->height, inst->frame, bitmap_flags);
|
||||
bm_unload(bm);
|
||||
return bm;
|
||||
*/
|
||||
Int3();
|
||||
return -1;
|
||||
}
|
||||
|
||||
// frame = frame pixel data to pack
|
||||
// save = memory to store packed data to
|
||||
// size = number of bytes to pack
|
||||
@@ -1173,7 +1025,7 @@ int unpack_frame_from_file(anim_instance *ai, ubyte *frame, int size, ubyte *pal
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Int3(); // unknown packing method
|
||||
// unknown packing method
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -71,6 +71,7 @@ typedef struct anim {
|
||||
typedef struct anim_instance {
|
||||
anim_instance *next, *prev;
|
||||
int x,y; // coordinates anim is played at (top left corner of anim)
|
||||
int base_w, base_h; // coordinate scale this anim is played in.
|
||||
vec3d *world_pos; // world (x,y,z) position of explosion
|
||||
float radius; // radius of image, needed for scaling
|
||||
int frame_num; // current frame, or last frame if between frames (first frame is 0)
|
||||
@@ -106,7 +107,6 @@ void anim_init();
|
||||
anim_instance *init_anim_instance(anim *ptr, int bpp);
|
||||
void free_anim_instance(anim_instance *inst);
|
||||
int anim_get_next_frame(anim_instance *inst);
|
||||
int anim_get_frame(anim_instance *inst, int frame_num, int xlate_pal=1);
|
||||
ubyte *anim_get_next_raw_buffer(anim_instance *inst, int xlate_pal, int aabitmap, int bpp);
|
||||
void anim_set_palette(anim *a);
|
||||
void anim_check_for_palette_change(anim_instance *inst);
|
||||
|
||||
@@ -1584,7 +1584,7 @@ void asteroid_update_collide_flag(object *asteroid_objp)
|
||||
asp->collide_objsig = -1;
|
||||
|
||||
// multiplayer dogfight
|
||||
if((Game_mode & GM_MULTIPLAYER) && (Netgame.type_flags & NG_TYPE_DOGFIGHT)){
|
||||
if(MULTI_DOGFIGHT){
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1935,23 +1935,10 @@ void asteroid_show_brackets()
|
||||
g3_rotate_vertex(&asteroid_vertex,&asteroid_objp->pos);
|
||||
g3_project_vertex(&asteroid_vertex);
|
||||
|
||||
if (!(asteroid_vertex.flags & PF_OVERFLOW)) {
|
||||
gr_set_color_fast(iff_get_color(IFF_COLOR_SELECTION, 1));
|
||||
hud_show_brackets(asteroid_objp, &asteroid_vertex);
|
||||
if ( Cmdline_targetinfo ) {
|
||||
hud_show_lead_indicator_quick(&asteroid_objp->pos, asteroid_objp);
|
||||
}
|
||||
}
|
||||
|
||||
// if asteroid is not on screen, draw an offscreen indicator
|
||||
if ( hud_gauge_active(HUD_OFFSCREEN_INDICATOR) ) {
|
||||
if (asteroid_vertex.codes != 0) {
|
||||
float dist;
|
||||
// dist = vm_vec_dist_quick(&Player_obj->pos, &asteroid_objp->pos);
|
||||
dist = hud_find_target_distance( asteroid_objp, Player_obj );
|
||||
gr_set_color_fast(iff_get_color(IFF_COLOR_SELECTION, 1));
|
||||
hud_draw_offscreen_indicator(&asteroid_vertex, &asteroid_objp->pos, dist);
|
||||
}
|
||||
if ( Cmdline_targetinfo ) {
|
||||
hud_target_add_display_list(asteroid_objp, &asteroid_vertex, &asteroid_objp->pos, 0, NULL, NULL, TARGET_DISPLAY_DIST | TARGET_DISPLAY_LEAD);
|
||||
} else {
|
||||
hud_target_add_display_list(asteroid_objp, &asteroid_vertex, &asteroid_objp->pos, 0, NULL, NULL, TARGET_DISPLAY_DIST);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+199
-142
@@ -39,6 +39,7 @@ extern int Cmdline_autopilot_interruptable;
|
||||
// Module variables
|
||||
bool AutoPilotEngaged;
|
||||
bool UseCutsceneBars;
|
||||
bool LockWeaponsDuringAutopilot;
|
||||
int CurrentNav;
|
||||
float ramp_bias;
|
||||
NavPoint Navs[MAX_NAVPOINTS];
|
||||
@@ -55,6 +56,9 @@ bool CinematicStarted, CameraMoving;
|
||||
vec3d cameraPos, cameraTarget;
|
||||
std::map<int,int> autopilot_wings;
|
||||
|
||||
int AutopilotMinEnemyDistance;
|
||||
int AutopilotMinAsteroidDistance;
|
||||
|
||||
// used for ramping time compression;
|
||||
int start_dist;
|
||||
|
||||
@@ -149,12 +153,7 @@ char* NavPoint::GetInteralName()
|
||||
}
|
||||
|
||||
// ********************************************************************************************
|
||||
// Tell us if autopilot is allowed
|
||||
// This needs:
|
||||
// * Nav point selected
|
||||
// * No enemies within X distance
|
||||
// * Destination > 1,000 meters away
|
||||
bool CanAutopilot(bool send_msg)
|
||||
bool CanAutopilot(vec3d targetPos, bool send_msg)
|
||||
{
|
||||
if (CurrentNav == -1)
|
||||
{
|
||||
@@ -162,99 +161,69 @@ bool CanAutopilot(bool send_msg)
|
||||
send_autopilot_msgID(NP_MSG_FAIL_NOSEL);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (object_get_gliding(Player_obj))
|
||||
{
|
||||
if (send_msg)
|
||||
send_autopilot_msgID(NP_MSG_FAIL_GLIDING);
|
||||
return false;
|
||||
}
|
||||
|
||||
// You cannot autopilot if you're within 1000 meters of your destination nav point
|
||||
if (vm_vec_dist_quick(&Player_obj->pos, Navs[CurrentNav].GetPosition()) < 1000)
|
||||
{
|
||||
if (vm_vec_dist_quick(&targetPos, Navs[CurrentNav].GetPosition()) < 1000) {
|
||||
if (send_msg)
|
||||
send_autopilot_msgID(NP_MSG_FAIL_TOCLOSE);
|
||||
return false;
|
||||
}
|
||||
|
||||
// see if any hostiles are nearby
|
||||
for (ship_obj *so = GET_FIRST(&Ship_obj_list); so != END_OF_LIST(&Ship_obj_list); so = GET_NEXT(so))
|
||||
{
|
||||
object *other_objp = &Objects[so->objnum];
|
||||
|
||||
// attacks player?
|
||||
if (iff_x_attacks_y(obj_team(other_objp), obj_team(Player_obj))
|
||||
&& !(Ship_info[Ships[other_objp->instance].ship_info_index].flags & SIF_CARGO))
|
||||
if ( AutopilotMinEnemyDistance > 0 ) {
|
||||
// see if any hostiles are nearby
|
||||
for (ship_obj *so = GET_FIRST(&Ship_obj_list); so != END_OF_LIST(&Ship_obj_list); so = GET_NEXT(so))
|
||||
{
|
||||
// Cannot autopilot if enemy within 5,000 meters
|
||||
if (vm_vec_dist_quick(&Player_obj->pos, &other_objp->pos) < 5000)
|
||||
object *other_objp = &Objects[so->objnum];
|
||||
// attacks player?
|
||||
if (iff_x_attacks_y(obj_team(other_objp), obj_team(Player_obj))
|
||||
&& !(Ship_info[Ships[other_objp->instance].ship_info_index].flags & SIF_CARGO)) // ignore cargo
|
||||
{
|
||||
if (send_msg)
|
||||
send_autopilot_msgID(NP_MSG_FAIL_HOSTILES);
|
||||
return false;
|
||||
// Cannot autopilot if enemy within AutopilotMinEnemyDistance meters
|
||||
if (vm_vec_dist_quick(&targetPos, &other_objp->pos) < AutopilotMinEnemyDistance) {
|
||||
if (send_msg)
|
||||
send_autopilot_msgID(NP_MSG_FAIL_HOSTILES);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//check for asteroids
|
||||
for (int n=0; n<MAX_ASTEROIDS; n++)
|
||||
{
|
||||
// asteroid
|
||||
if (Asteroids[n].flags & AF_USED)
|
||||
{
|
||||
// Cannot autopilot if asteroid within 1,000 meters
|
||||
if (vm_vec_dist_quick(&Player_obj->pos, &Objects[Asteroids[n].objnum].pos) < 1000)
|
||||
{
|
||||
if (send_msg)
|
||||
send_autopilot_msgID(NP_MSG_FAIL_HAZARD);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// ********************************************************************************************
|
||||
// Tell us if autopilot is allowed at a certain position (only performs checks based on that position)
|
||||
// This needs:
|
||||
// * Nav point selected
|
||||
// * No enemies within X distance
|
||||
// * Destination > 1,000 meters away
|
||||
bool CanAutopilotPos(vec3d targetPos)
|
||||
{
|
||||
// You cannot autopilot if you're within 1000 meters of your destination nav point
|
||||
if (vm_vec_dist_quick(&targetPos, Navs[CurrentNav].GetPosition()) < 1000)
|
||||
return false;
|
||||
// see if any hostiles are nearby
|
||||
for (ship_obj *so = GET_FIRST(&Ship_obj_list); so != END_OF_LIST(&Ship_obj_list); so = GET_NEXT(so))
|
||||
{
|
||||
object *other_objp = &Objects[so->objnum];
|
||||
// attacks player?
|
||||
if (iff_x_attacks_y(obj_team(other_objp), obj_team(Player_obj))
|
||||
&& !(Ship_info[Ships[other_objp->instance].ship_info_index].flags & SIF_CARGO)) // ignore cargo
|
||||
{
|
||||
// Cannot autopilot if enemy within 5,000 meters
|
||||
if (vm_vec_dist_quick(&targetPos, &other_objp->pos) < 5000)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//check for asteroids
|
||||
for (int n=0; n<MAX_ASTEROIDS; n++)
|
||||
{
|
||||
// asteroid
|
||||
if (Asteroids[n].flags & AF_USED)
|
||||
if ( AutopilotMinAsteroidDistance > 0 ) {
|
||||
//check for asteroids
|
||||
for (int n=0; n<MAX_ASTEROIDS; n++)
|
||||
{
|
||||
// Cannot autopilot if asteroid within 1,000 meters
|
||||
if (vm_vec_dist_quick(&targetPos, &Objects[Asteroids[n].objnum].pos) < 1000)
|
||||
return false;
|
||||
// asteroid
|
||||
if (Asteroids[n].flags & AF_USED)
|
||||
{
|
||||
// Cannot autopilot if asteroid within AutopilotMinAsteroidDistance meters
|
||||
if (vm_vec_dist_quick(&targetPos, &Objects[Asteroids[n].objnum].pos) < AutopilotMinAsteroidDistance) {
|
||||
if (send_msg)
|
||||
send_autopilot_msgID(NP_MSG_FAIL_HAZARD);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// check for support ships
|
||||
// cannot autopilot if support ship present
|
||||
if ( ship_find_repair_ship(Player_obj) != NULL ) {
|
||||
if (send_msg)
|
||||
send_autopilot_msgID(NP_MSG_FAIL_SUPPORT_PRESENT);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
extern object* Autopilot_flight_leader;
|
||||
// ********************************************************************************************
|
||||
// Engages autopilot
|
||||
// This does:
|
||||
@@ -263,13 +232,54 @@ bool CanAutopilotPos(vec3d targetPos)
|
||||
// * Lock time compression -WMC
|
||||
// * Tell AI to fly to targetted Nav Point (for all nav-status wings/ships)
|
||||
// * Sets max waypoint speed to the best-speed of the slowest ship tagged
|
||||
void StartAutopilot()
|
||||
bool StartAutopilot()
|
||||
{
|
||||
// Check for support ship and dismiss it if it is not doing anything.
|
||||
// If the support ship is doing something then tell the user such.
|
||||
bool done = false;
|
||||
while (!done) {
|
||||
object* support_ship_op = ship_find_repair_ship(Player_obj);
|
||||
if ( support_ship_op == NULL ) {
|
||||
// no more
|
||||
done = true;
|
||||
break;
|
||||
}
|
||||
|
||||
Assert( support_ship_op->type == OBJ_SHIP );
|
||||
Assert( support_ship_op->instance >= 0 );
|
||||
Assert( support_ship_op->instance < MAX_SHIPS );
|
||||
Assert( Ships[support_ship_op->instance].ai_index != -1 );
|
||||
|
||||
ai_info* support_ship_aip = &(Ai_info[Ships[support_ship_op->instance].ai_index]);
|
||||
|
||||
// is support ship trying to rearm-repair
|
||||
if ( ai_find_goal_index( support_ship_aip->goals, AI_GOAL_REARM_REPAIR ) == -1 ) {
|
||||
// no, so tell it to depart
|
||||
ai_add_ship_goal_player( AIG_TYPE_PLAYER_SHIP, AI_GOAL_WARP, -1, NULL, support_ship_aip );
|
||||
} else {
|
||||
// yes
|
||||
send_autopilot_msgID(NP_MSG_FAIL_SUPPORT_WORKING);
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
if (!CanAutopilot())
|
||||
return;
|
||||
return false;
|
||||
|
||||
AutoPilotEngaged = true;
|
||||
|
||||
// find the ship that is "leading" all of the ships when the player starts
|
||||
// autopilot
|
||||
// by default the ship that is leading the autopilot session the player's
|
||||
// wing leader (if the player is the wing leader then it will be the
|
||||
// player).
|
||||
// TODO:implement a way to allow a FREDer to say a different ship is leader
|
||||
Autopilot_flight_leader = get_wing_leader(Player_ship->wingnum);
|
||||
if ( Autopilot_flight_leader == NULL ) {
|
||||
// force player to be the leader if he doesn't have a wing
|
||||
Autopilot_flight_leader = Player_obj;
|
||||
}
|
||||
|
||||
if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS)
|
||||
LockAPConv = timestamp(); // lock convergence instantly
|
||||
else
|
||||
@@ -328,10 +338,20 @@ void StartAutopilot()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// damp speed_cap to 90% of actual -- to make sure ships stay in formation
|
||||
if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS)
|
||||
speed_cap = 0.90f * speed_cap;
|
||||
|
||||
if ( speed_cap < 1.0f ) {
|
||||
/* We need to deal with this so that incorrectly flagged ships will not
|
||||
cause the engine to fail to limit all the ships speeds correctly. */
|
||||
Warning(LOCATION, "Ship speed cap is way too small (%f)!\n"
|
||||
"This is normally caused by a ship that has nav-carry-status set, but cannot move itself (like a Cargo container).\n"
|
||||
"Speed cap has been set to 1.0 m/s.",
|
||||
speed_cap);
|
||||
speed_cap = 1.0f;
|
||||
}
|
||||
|
||||
ramp_bias = speed_cap/50.0f;
|
||||
|
||||
// assign ship goals
|
||||
@@ -397,10 +417,10 @@ void StartAutopilot()
|
||||
vm_vector_2_matrix(&Objects[Ships[i].objnum].orient, &norm1, NULL, NULL);
|
||||
}
|
||||
|
||||
// snap wings into formation them into formation
|
||||
// snap wings into formation
|
||||
if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS && // only if using cinematics
|
||||
(Ships[i].wingnum != -1 && Wings[Ships[i].wingnum].flags & WF_NAV_CARRY) // only if in a wing
|
||||
&& Player_obj != &Objects[Ships[i].objnum]) //only if not player object
|
||||
&& Autopilot_flight_leader != &Objects[Ships[i].objnum]) //only if not flight leader's object
|
||||
{
|
||||
ai_info *aip = &Ai_info[Ships[i].ai_index];
|
||||
int wingnum = aip->wing, wing_index = get_wing_index(&Objects[Ships[i].objnum], wingnum);
|
||||
@@ -419,33 +439,34 @@ void StartAutopilot()
|
||||
switch (wcount % 2)
|
||||
{
|
||||
case 1: // back-left
|
||||
vm_vec_add(&perp, &zero, &Player_obj->orient.vec.rvec);
|
||||
vm_vec_add(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
|
||||
//vm_vec_sub(&perp, &perp, &Player_obj->orient.vec.fvec);
|
||||
vm_vec_normalize(&perp);
|
||||
vm_vec_scale(&perp, -166.0f*j); // 166m is supposedly the optimal range according to tolwyn
|
||||
vm_vec_add(&goal_point, &Player_obj->pos, &perp);
|
||||
vm_vec_add(&goal_point, &Autopilot_flight_leader->pos, &perp);
|
||||
break;
|
||||
|
||||
default: //back-right
|
||||
case 0:
|
||||
vm_vec_add(&perp, &zero, &Player_obj->orient.vec.rvec);
|
||||
vm_vec_add(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
|
||||
//vm_vec_sub(&perp, &perp, &Player_obj->orient.vec.fvec);
|
||||
vm_vec_normalize(&perp);
|
||||
vm_vec_scale(&perp, 166.0f*j);
|
||||
vm_vec_add(&goal_point, &Player_obj->pos, &perp);
|
||||
vm_vec_add(&goal_point, &Autopilot_flight_leader->pos, &perp);
|
||||
break;
|
||||
}
|
||||
autopilot_wings[wingnum] = wcount;
|
||||
wcount++;
|
||||
}
|
||||
Objects[Ships[i].objnum].pos = goal_point;
|
||||
if (vm_vec_dist_quick(&Player_obj->pos, &Objects[Ships[i].objnum].pos) > distance)
|
||||
if (vm_vec_dist_quick(&Autopilot_flight_leader->pos, &Objects[Ships[i].objnum].pos) > distance)
|
||||
{
|
||||
distance = vm_vec_dist_quick(&Player_obj->pos, &Objects[Ships[i].objnum].pos);
|
||||
distance = vm_vec_dist_quick(&Autopilot_flight_leader->pos, &Objects[Ships[i].objnum].pos);
|
||||
}
|
||||
}
|
||||
// lock primary and secondary weapons
|
||||
//Ships[i].flags2 |= (SF2_PRIMARIES_LOCKED | SF2_SECONDARIES_LOCKED);
|
||||
if ( LockWeaponsDuringAutopilot )
|
||||
Ships[i].flags2 |= (SF2_PRIMARIES_LOCKED | SF2_SECONDARIES_LOCKED);
|
||||
|
||||
// clear the ship goals and cap the waypoint speed
|
||||
ai_clear_ship_goals(&Ai_info[Ships[i].ai_index]);
|
||||
@@ -540,9 +561,9 @@ void StartAutopilot()
|
||||
vec3d right, front, up, offset;
|
||||
for (i = 0; i < (int)capIndexes.size(); i++)
|
||||
{
|
||||
vm_vec_add(&right, &Player_obj->orient.vec.rvec, &zero);
|
||||
vm_vec_add(&front, &Player_obj->orient.vec.fvec, &zero);
|
||||
vm_vec_add(&up, &Player_obj->orient.vec.uvec, &zero);
|
||||
vm_vec_add(&right, &Autopilot_flight_leader->orient.vec.rvec, &zero);
|
||||
vm_vec_add(&front, &Autopilot_flight_leader->orient.vec.fvec, &zero);
|
||||
vm_vec_add(&up, &Autopilot_flight_leader->orient.vec.uvec, &zero);
|
||||
vm_vec_add(&offset, &zero, &zero);
|
||||
if (Ship_info[Ships[capIndexes[i]].ship_info_index].flags & (SIF_CAPITAL | SIF_SUPERCAP))
|
||||
{
|
||||
@@ -610,7 +631,7 @@ void StartAutopilot()
|
||||
vm_vec_scale(&up, (1+((float)floor((float)capship_placed[1]/3))));
|
||||
|
||||
// move ourselves up and out of the way of the smaller ships
|
||||
vm_vec_add(&perp, &Player_obj->orient.vec.uvec, &zero);
|
||||
vm_vec_add(&perp, &Autopilot_flight_leader->orient.vec.uvec, &zero);
|
||||
vm_vec_scale(&perp, capship_spreads[2]);
|
||||
vm_vec_add(&up, &up, &perp);
|
||||
|
||||
@@ -665,7 +686,7 @@ void StartAutopilot()
|
||||
vm_vec_scale(&front, 2*(1+((float)floor((float)capship_placed[2]/3))));
|
||||
|
||||
// move "out" by 166*(wcount-1) so we don't bump into fighters
|
||||
vm_vec_add(&perp, &Player_obj->orient.vec.rvec, &zero);
|
||||
vm_vec_add(&perp, &Autopilot_flight_leader->orient.vec.rvec, &zero);
|
||||
vm_vec_scale(&perp, 166.0f*float(wcount-1));
|
||||
if ( (capship_placed[2] % 2) == 0)
|
||||
vm_vec_add(&right, &right, &perp);
|
||||
@@ -687,16 +708,16 @@ void StartAutopilot()
|
||||
// global scale the position by 50%
|
||||
//vm_vec_scale(&offset, 1.5);
|
||||
|
||||
vm_vec_add(&Objects[Ships[capIndexes[i]].objnum].pos, &Player_obj->pos, &offset);
|
||||
vm_vec_add(&Objects[Ships[capIndexes[i]].objnum].pos, &Autopilot_flight_leader->pos, &offset);
|
||||
|
||||
if (vm_vec_dist_quick(&Player_obj->pos, &Objects[Ships[i].objnum].pos) > distance)
|
||||
if (vm_vec_dist_quick(&Autopilot_flight_leader->pos, &Objects[Ships[i].objnum].pos) > distance)
|
||||
{
|
||||
distance = vm_vec_dist_quick(&Player_obj->pos, &Objects[Ships[i].objnum].pos);
|
||||
distance = vm_vec_dist_quick(&Autopilot_flight_leader->pos, &Objects[Ships[i].objnum].pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ftemp = floor(Player_obj->phys_info.max_vel.xyz.z/speed_cap);
|
||||
ftemp = floor(Autopilot_flight_leader->phys_info.max_vel.xyz.z/speed_cap);
|
||||
if (ftemp >= 2.0f && ftemp < 4.0f)
|
||||
tc_factor = 2;
|
||||
else if (ftemp >= 4.0f && ftemp < 8.0f)
|
||||
@@ -708,11 +729,11 @@ void StartAutopilot()
|
||||
|
||||
tpos = *Navs[CurrentNav].GetPosition();
|
||||
// determine distance toward nav at which camera will be
|
||||
vm_vec_sub(&pos, &tpos, &Player_obj->pos);
|
||||
vm_vec_sub(&pos, &tpos, &Autopilot_flight_leader->pos);
|
||||
vm_vec_normalize(&pos); // pos is now a unit vector in the direction we will be moving the camera
|
||||
//norm1 = pos;
|
||||
vm_vec_scale(&pos, 5*speed_cap*tc_factor); // pos is now scaled by 5 times the speed (5 seconds ahead)
|
||||
vm_vec_add(&pos, &pos, &Player_obj->pos); // pos is now 5*speed cap in front of player ship
|
||||
vm_vec_add(&pos, &pos, &Autopilot_flight_leader->pos); // pos is now 5*speed cap in front of player ship
|
||||
|
||||
switch (myrand()%24)
|
||||
// 8 different ways of getting perp points
|
||||
@@ -723,74 +744,74 @@ void StartAutopilot()
|
||||
case 9:
|
||||
case 16:
|
||||
if (capship_placed[0] == 0)
|
||||
vm_vec_sub(&perp, &zero, &Player_obj->orient.vec.uvec);
|
||||
vm_vec_sub(&perp, &zero, &Autopilot_flight_leader->orient.vec.uvec);
|
||||
else
|
||||
{ // become up-left
|
||||
vm_vec_add(&perp, &zero, &Player_obj->orient.vec.uvec);
|
||||
vm_vec_sub(&perp, &perp, &Player_obj->orient.vec.rvec);
|
||||
vm_vec_add(&perp, &zero, &Autopilot_flight_leader->orient.vec.uvec);
|
||||
vm_vec_sub(&perp, &perp, &Autopilot_flight_leader->orient.vec.rvec);
|
||||
}
|
||||
break;
|
||||
|
||||
case 2: // up
|
||||
case 10:
|
||||
case 23:
|
||||
vm_vec_add(&perp, &perp, &Player_obj->orient.vec.uvec);
|
||||
vm_vec_add(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
|
||||
if (capshipPresent) // become up-right
|
||||
vm_vec_add(&perp, &perp, &Player_obj->orient.vec.rvec);
|
||||
vm_vec_add(&perp, &perp, &Autopilot_flight_leader->orient.vec.rvec);
|
||||
break;
|
||||
|
||||
case 3: // left
|
||||
case 11:
|
||||
case 22:
|
||||
vm_vec_sub(&perp, &zero, &Player_obj->orient.vec.rvec);
|
||||
vm_vec_sub(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
|
||||
break;
|
||||
|
||||
case 4: // up-left
|
||||
case 12:
|
||||
case 21:
|
||||
vm_vec_sub(&perp, &zero, &Player_obj->orient.vec.rvec);
|
||||
vm_vec_add(&perp, &perp, &Player_obj->orient.vec.uvec);
|
||||
vm_vec_sub(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
|
||||
vm_vec_add(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
|
||||
break;
|
||||
|
||||
case 5: // up-right
|
||||
case 13:
|
||||
case 20:
|
||||
vm_vec_add(&perp, &zero, &Player_obj->orient.vec.rvec);
|
||||
vm_vec_add(&perp, &perp, &Player_obj->orient.vec.uvec);
|
||||
vm_vec_add(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
|
||||
vm_vec_add(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
|
||||
break;
|
||||
|
||||
case 6: // down-left
|
||||
case 14:
|
||||
case 19:
|
||||
vm_vec_sub(&perp, &zero, &Player_obj->orient.vec.rvec);
|
||||
vm_vec_sub(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
|
||||
if (capship_placed[0] < 2)
|
||||
vm_vec_sub(&perp, &perp, &Player_obj->orient.vec.uvec);
|
||||
vm_vec_sub(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
|
||||
else
|
||||
vm_vec_add(&perp, &perp, &Player_obj->orient.vec.uvec);
|
||||
vm_vec_add(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
|
||||
break;
|
||||
|
||||
case 7: // down-right
|
||||
case 15:
|
||||
case 18:
|
||||
vm_vec_add(&perp, &zero, &Player_obj->orient.vec.rvec);
|
||||
vm_vec_add(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
|
||||
if (capship_placed[0] < 1)
|
||||
vm_vec_sub(&perp, &perp, &Player_obj->orient.vec.uvec);
|
||||
vm_vec_sub(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
|
||||
else
|
||||
vm_vec_add(&perp, &perp, &Player_obj->orient.vec.uvec);
|
||||
vm_vec_add(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
|
||||
break;
|
||||
|
||||
default:
|
||||
case 0: // right
|
||||
case 8:
|
||||
case 17:
|
||||
perp = Player_obj->orient.vec.rvec;
|
||||
perp = Autopilot_flight_leader->orient.vec.rvec;
|
||||
break;
|
||||
|
||||
}
|
||||
vm_vec_normalize(&perp);
|
||||
//vm_vec_scale(&perp, 2*radius+distance);
|
||||
|
||||
vm_vec_scale(&perp, Player_obj->radius+radius);
|
||||
vm_vec_scale(&perp, Autopilot_flight_leader->radius+radius);
|
||||
|
||||
// randomly scale up/down by up to 20%
|
||||
j = 20-myrand()%40; // [-20,20]
|
||||
@@ -830,16 +851,8 @@ void StartAutopilot()
|
||||
camMovingTime = int(4.5*float(tc_factor));
|
||||
set_time_compression((float)tc_factor);
|
||||
}
|
||||
}
|
||||
|
||||
// ********************************************************************************************
|
||||
// Checks if autopilot should automatically die
|
||||
// Returns true if:
|
||||
// * Targetted waypoint < 10,000 meters away
|
||||
// * Enemy < 10,000 meters
|
||||
bool Autopilot_AutoDiable()
|
||||
{
|
||||
return !CanAutopilot();
|
||||
return true;
|
||||
}
|
||||
|
||||
// ********************************************************************************************
|
||||
@@ -852,6 +865,8 @@ void EndAutoPilot()
|
||||
{
|
||||
AutoPilotEngaged = false;
|
||||
|
||||
Autopilot_flight_leader = NULL;
|
||||
|
||||
set_time_compression(1);
|
||||
lock_time_compression(false);
|
||||
Player_use_ai = 0;
|
||||
@@ -899,8 +914,10 @@ void EndAutoPilot()
|
||||
)
|
||||
{
|
||||
//unlock their weaponry
|
||||
//Ships[i].flags2 &= ~(SF2_PRIMARIES_LOCKED | SF2_SECONDARIES_LOCKED);
|
||||
if ( LockWeaponsDuringAutopilot )
|
||||
Ships[i].flags2 &= ~(SF2_PRIMARIES_LOCKED | SF2_SECONDARIES_LOCKED);
|
||||
Ai_info[Ships[i].ai_index].waypoint_speed_cap = -1; // uncap their speed
|
||||
Ai_info[Ships[i].ai_index].mode = AIM_NONE; // make AI re-evaluate current ship mode
|
||||
|
||||
for (j = 0; j < MAX_AI_GOALS; j++)
|
||||
{
|
||||
@@ -975,34 +992,54 @@ camera* nav_get_set_camera()
|
||||
|
||||
void nav_warp(bool prewarp=false)
|
||||
{
|
||||
// ok... find our end distance - norm1 is still a unit vector in the direction from the player to the navpoint
|
||||
vec3d targetPos, tpos=Player_obj->pos, pos;
|
||||
|
||||
vm_vec_sub(&pos, Navs[CurrentNav].GetPosition(), &Player_obj->pos);
|
||||
/* ok... find our end distance - norm1 is still a unit vector in the
|
||||
direction from the flight leader to the navpoint */
|
||||
vec3d targetPos, tpos=Autopilot_flight_leader->pos, pos, velocity;
|
||||
|
||||
/* calculate a vector that we can use to make a path from the flight
|
||||
leader's location to the nav point */
|
||||
vm_vec_sub(&pos, Navs[CurrentNav].GetPosition(), &Autopilot_flight_leader->pos);
|
||||
vm_vec_normalize(&pos);
|
||||
velocity = pos; // make a copy for later when we do setup veleocity vector
|
||||
vm_vec_scale(&pos, 250.0f); // we move by increments of 250
|
||||
|
||||
while (CanAutopilotPos(tpos))
|
||||
/* using the vector of the flight leaders's path, simulate moving the
|
||||
flight along this path by checking the autopilot conditions as specific
|
||||
intervals along the path*/
|
||||
while (CanAutopilot(tpos))
|
||||
{
|
||||
vm_vec_add(&tpos, &tpos, &pos);
|
||||
}
|
||||
vm_vec_sub(&targetPos, &tpos, &Player_obj->pos); //targetPos is actually a projection in a the direction toward the nav
|
||||
vm_vec_sub(&targetPos, &tpos, &Autopilot_flight_leader->pos);
|
||||
/* targetPos is actually a vector that describes the exact 3D movement that
|
||||
the flgith leader needs to execute to reach the location that the auto
|
||||
pilot is to shut off */
|
||||
|
||||
// Check if we are actually just setting up for the cinimatic shot of the
|
||||
// flight flying on autopilot. Only jump halfway. Also we also need to
|
||||
// put the camera in the correct position to show the player this cinimatic
|
||||
if (prewarp)
|
||||
{
|
||||
vm_vec_scale(&targetPos, 0.5);
|
||||
vm_vec_add(&cameraPos, &cameraPos, &targetPos);
|
||||
}
|
||||
|
||||
/* calcuate the speed that everyone is supposed to be going so that there
|
||||
is no need for anyone to accelerate or decelerate (most obvious with
|
||||
the player's fighter slowing down as it changes the camera pan speed). */
|
||||
Assert( Ai_info[Ships[Autopilot_flight_leader->instance].ai_index].waypoint_speed_cap > 0 );
|
||||
vm_vec_scale(&velocity, (float)Ai_info[Ships[Autopilot_flight_leader->instance].ai_index].waypoint_speed_cap);
|
||||
|
||||
// Find all ships that are supposed to autopilot with the player and move them
|
||||
// to the cinimatic location or the final destination
|
||||
for (int i = 0; i < MAX_SHIPS; i++)
|
||||
{
|
||||
if (Ships[i].objnum != -1 &&
|
||||
(Ships[i].flags2 & SF2_NAVPOINT_CARRY ||
|
||||
(Ships[i].wingnum != -1 && Wings[Ships[i].wingnum].flags & WF_NAV_CARRY)
|
||||
)
|
||||
)
|
||||
if (Ships[i].objnum != -1
|
||||
&& (Ships[i].flags2 & SF2_NAVPOINT_CARRY
|
||||
|| (Ships[i].wingnum != -1 && Wings[Ships[i].wingnum].flags & WF_NAV_CARRY)))
|
||||
{
|
||||
vm_vec_add(&Objects[Ships[i].objnum].pos, &Objects[Ships[i].objnum].pos, &targetPos);
|
||||
Objects[Ships[i].objnum].phys_info.vel = velocity;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1041,7 +1078,7 @@ void NavSystem_Do()
|
||||
}
|
||||
|
||||
|
||||
if (timestamp() >= EndAPCinematic || Autopilot_AutoDiable())
|
||||
if (timestamp() >= EndAPCinematic || !CanAutopilot())
|
||||
{
|
||||
nav_warp();
|
||||
EndAutoPilot();
|
||||
@@ -1060,7 +1097,7 @@ void NavSystem_Do()
|
||||
if(cam != NULL)
|
||||
{
|
||||
cam->set_position(&cameraPos);
|
||||
cam->set_rotation_facing(&Player_obj->pos);
|
||||
cam->set_rotation_facing(&Autopilot_flight_leader->pos);
|
||||
}
|
||||
|
||||
CinematicStarted = true;
|
||||
@@ -1068,7 +1105,7 @@ void NavSystem_Do()
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Autopilot_AutoDiable())
|
||||
if (!CanAutopilot())
|
||||
EndAutoPilot();
|
||||
|
||||
}
|
||||
@@ -1141,7 +1178,10 @@ void NavSystem_Do()
|
||||
}
|
||||
}
|
||||
|
||||
// autopilot linking
|
||||
/* Link in any ships that need to be linked in when the player gets close
|
||||
enough. Always done by the player because: "making sure the AI fighters
|
||||
are where they're supposed to be at all times is like herding cats" -Woolie Wool
|
||||
*/
|
||||
for (int i = 0; i < MAX_SHIPS; i++)
|
||||
{
|
||||
if (Ships[i].objnum != -1 && Ships[i].flags2 & SF2_NAVPOINT_NEEDSLINK)
|
||||
@@ -1191,7 +1231,7 @@ void send_autopilot_msg(char *msg, char *snd)
|
||||
// send/play
|
||||
if (audio_handle != -1)
|
||||
{
|
||||
audiostream_play(audio_handle, Master_event_music_volume, 0);
|
||||
audiostream_play(audio_handle, (Master_event_music_volume * aav_music_volume), 0);
|
||||
}
|
||||
|
||||
if (strlen(msg) != 0 && strcmp(msg, "none"))
|
||||
@@ -1247,6 +1287,21 @@ void parse_autopilot_table(char *filename)
|
||||
required_string("$Link Distance:");
|
||||
stuff_int(&NavLinkDistance);
|
||||
|
||||
if (optional_string("$Interrupt autopilot if enemy within distance:"))
|
||||
stuff_int(&AutopilotMinEnemyDistance);
|
||||
else
|
||||
AutopilotMinEnemyDistance = 5000;
|
||||
|
||||
if (optional_string("$Interrupt autopilot if asteroid within distance:"))
|
||||
stuff_int(&AutopilotMinAsteroidDistance);
|
||||
else
|
||||
AutopilotMinAsteroidDistance = 1000;
|
||||
|
||||
if (optional_string("$Lock Weapons During Autopilot:"))
|
||||
stuff_boolean(&LockWeaponsDuringAutopilot);
|
||||
else
|
||||
LockWeaponsDuringAutopilot = false;
|
||||
|
||||
// optional no cutscene bars
|
||||
if (optional_string("+No_Cutscene_Bars"))
|
||||
UseCutsceneBars = false;
|
||||
@@ -1255,7 +1310,9 @@ void parse_autopilot_table(char *filename)
|
||||
Cmdline_autopilot_interruptable = 0;
|
||||
|
||||
// No Nav selected message
|
||||
char *msg_tags[] = { "$No Nav Selected:", "$Gliding:", "$Too Close:", "$Hostiles:", "$Linked:", "$Hazard:" };
|
||||
char *msg_tags[] = { "$No Nav Selected:", "$Gliding:",
|
||||
"$Too Close:", "$Hostiles:", "$Linked:", "$Hazard:",
|
||||
"$Support Present:", "$Support Working:" };
|
||||
for (int i = 0; i < NP_NUM_MESSAGES; i++)
|
||||
{
|
||||
required_string(msg_tags[i]);
|
||||
|
||||
+17
-13
@@ -8,6 +8,7 @@
|
||||
#define _AUTOPILOT_H_
|
||||
|
||||
#include "globalincs/pstypes.h"
|
||||
#include "object/object.h"
|
||||
#include <map>
|
||||
|
||||
// milliseconds between updates
|
||||
@@ -37,13 +38,15 @@ struct NavPoint
|
||||
};
|
||||
|
||||
|
||||
#define NP_NUM_MESSAGES 6
|
||||
#define NP_MSG_FAIL_NOSEL 0
|
||||
#define NP_MSG_FAIL_GLIDING 1
|
||||
#define NP_MSG_FAIL_TOCLOSE 2
|
||||
#define NP_MSG_FAIL_HOSTILES 3
|
||||
#define NP_MSG_MISC_LINKED 4
|
||||
#define NP_MSG_FAIL_HAZARD 5
|
||||
#define NP_MSG_FAIL_SUPPORT_PRESENT 6
|
||||
#define NP_MSG_FAIL_SUPPORT_WORKING 7
|
||||
#define NP_NUM_MESSAGES 8
|
||||
|
||||
struct NavMessage
|
||||
{
|
||||
@@ -62,27 +65,28 @@ extern std::map<int,int> autopilot_wings;
|
||||
bool Sel_NextNav();
|
||||
|
||||
|
||||
// Tell us is autopilot is allow
|
||||
// Tell us if autopilot is allowed
|
||||
// This needs:
|
||||
// * Nav point selected
|
||||
// * No enemies within 5,000 meters
|
||||
// * No enemies within AutopilotMinEnemyDistance meters
|
||||
// * No asteroids within AutopilotMinAsteroidDistance meters
|
||||
// * Destination > 1,000 meters away
|
||||
bool CanAutopilot(bool send_msg=false);
|
||||
bool CanAutopilotPos(vec3d targetPos);
|
||||
// * Support ship not present or is actively leaving
|
||||
bool CanAutopilot(vec3d targetPos, bool send_msg=false);
|
||||
|
||||
// Check if autopilot is allowed at player's current position
|
||||
// See CanAutopilot(vec3d, bool) for more information
|
||||
inline bool CanAutopilot(bool send_msg=false) { return CanAutopilot(Player_obj->pos, send_msg); }
|
||||
|
||||
// Engages autopilot
|
||||
// This does:
|
||||
// * Checks if Autopilot is allowed. See CanAutopilot() for conditions.
|
||||
// * Control switched from player to AI
|
||||
// * Time compression to 32x
|
||||
// * Tell AI to fly to targetted Nav Point (for all nav-status wings/ships)
|
||||
// * Sets max waypoint speed to the best-speed of the slowest ship tagged
|
||||
void StartAutopilot();
|
||||
|
||||
// Checks if autopilot should automatically die
|
||||
// Returns true if:
|
||||
// * Targetted waypoint < 1,000 meters away
|
||||
// * Enemy < 5,000 meters
|
||||
bool Autopilot_AutoDiable();
|
||||
// * Sets max waypoint speed to the best-speed of the slowest ship tagged
|
||||
// Returns false if autopilot cannot be started. True otherwise.
|
||||
bool StartAutopilot();
|
||||
|
||||
// Disengages autopilot
|
||||
// this does:
|
||||
|
||||
+5
-11
@@ -534,7 +534,7 @@ int bm_load( char *real_filename )
|
||||
}
|
||||
|
||||
if (free_slot < 0) {
|
||||
Int3();
|
||||
Assertion(free_slot < 0, "Could not find free BMPMAN slot for bitmap: %s", real_filename);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
@@ -1046,7 +1046,7 @@ int bm_get_info( int handle, int *w, int * h, ubyte * flags, int *nframes, int *
|
||||
}
|
||||
#endif
|
||||
|
||||
Assert( bm_bitmaps[bitmapnum].handle == handle ); // INVALID BITMAP HANDLE!
|
||||
Assertion( bm_bitmaps[bitmapnum].handle == handle, "Invalid bitmap handle %d passed to bm_get_info().\nThis might be due to an invalid animation somewhere else.\n", handle ); // INVALID BITMAP HANDLE!
|
||||
|
||||
if ( (bm_bitmaps[bitmapnum].type == BM_TYPE_NONE) || (bm_bitmaps[bitmapnum].handle != handle) ) {
|
||||
if (w) *w = 0;
|
||||
@@ -1089,7 +1089,7 @@ unsigned int bm_get_signature(int handle)
|
||||
if ( !bm_inited ) bm_init();
|
||||
|
||||
int bitmapnum = handle % MAX_BITMAPS;
|
||||
Assert( bm_bitmaps[bitmapnum].handle == handle ); // INVALID BITMAP HANDLE
|
||||
Assertion( bm_bitmaps[bitmapnum].handle == handle, "Invalid bitmap handle %d passed to bm_get_signature().\nThis might be due to an invalid animation somewhere else.\n", handle ); // INVALID BITMAP HANDLE!
|
||||
|
||||
return bm_bitmaps[bitmapnum].signature;
|
||||
}
|
||||
@@ -1100,7 +1100,7 @@ ubyte bm_get_type(int handle)
|
||||
if ( !bm_inited ) bm_init();
|
||||
|
||||
int bitmapnum = handle % MAX_BITMAPS;
|
||||
Assert( bm_bitmaps[bitmapnum].handle == handle ); // INVALID BITMAP HANDLE
|
||||
Assertion( bm_bitmaps[bitmapnum].handle == handle, "Invalid bitmap handle %d passed to bm_get_type().\nThis might be due to an invalid animation somewhere else.\n", handle ); // INVALID BITMAP HANDLE!
|
||||
|
||||
return bm_bitmaps[bitmapnum].type;
|
||||
}
|
||||
@@ -1597,13 +1597,7 @@ bitmap * bm_lock( int handle, ubyte bpp, ubyte flags )
|
||||
|
||||
int bitmapnum = handle % MAX_BITMAPS;
|
||||
|
||||
#ifndef NDEBUG
|
||||
if(bm_bitmaps[bitmapnum].handle != handle) {
|
||||
mprintf(("bm_lock - %s: bm_bitmaps[%d].handle = %d, handle = %d\n", bm_bitmaps[bitmapnum].filename, bitmapnum, bm_bitmaps[bitmapnum].handle, handle));
|
||||
}
|
||||
#endif
|
||||
|
||||
Assert( bm_bitmaps[bitmapnum].handle == handle ); // INVALID BITMAP HANDLE
|
||||
Assertion( bm_bitmaps[bitmapnum].handle == handle, "Invalid handle %d passed to bm_lock. This might be due to an animation elsewhere in the code being too short.\n", handle ); // INVALID BITMAP HANDLE
|
||||
|
||||
// flags &= (~BMP_RLE);
|
||||
|
||||
|
||||
+101
-43
@@ -9,6 +9,7 @@
|
||||
#include "model/model.h" //polymodel, model_get
|
||||
#include "playerman/player.h" //player_get_padlock_orient
|
||||
#include "ship/ship.h" //compute_slew_matrix
|
||||
#include "graphics/font.h"
|
||||
|
||||
//*************************IMPORTANT GLOBALS*************************
|
||||
float VIEWER_ZOOM_DEFAULT = 0.75f; // Default viewer zoom, 0.625 as per multi-lateral agreement on 3/24/97
|
||||
@@ -471,6 +472,8 @@ void camera::get_info(vec3d *position, matrix *orientation)
|
||||
mtxB.a1d[i] = pos;
|
||||
}
|
||||
vm_matrix_x_matrix(&c_ori, &mtxA, &mtxB);
|
||||
|
||||
vm_orthogonalize_matrix(&c_ori);
|
||||
/*
|
||||
angles a;
|
||||
ori_p.get(&a.p, NULL);
|
||||
@@ -613,15 +616,25 @@ void warp_camera::get_info(vec3d *position, matrix *orientation)
|
||||
//*************************subtitle*************************
|
||||
|
||||
#define MAX_SUBTITLE_LINES 64
|
||||
subtitle::subtitle(int in_x_pos, int in_y_pos, char* in_text, float in_display_time, char* in_imageanim, float in_fade_time, color *in_text_color, bool center_x, bool center_y, int in_width, bool in_post_shaded)
|
||||
subtitle::subtitle(int in_x_pos, int in_y_pos, char* in_text, char* in_imageanim, float in_display_time, float in_fade_time, color *in_text_color, int in_text_fontnum, bool center_x, bool center_y, int in_width, int in_height, bool in_post_shaded)
|
||||
{
|
||||
// basic init, this always has to be done
|
||||
memset( imageanim, 0, sizeof(imageanim) );
|
||||
memset( &text_pos, 0, 2*sizeof(int) );
|
||||
memset( &image_pos, 0, 4*sizeof(int) );
|
||||
image_id = -1;
|
||||
|
||||
if ( ((in_text != NULL) && (strlen(in_text) <= 0)) && ((in_imageanim != NULL) && (strlen(in_imageanim) <= 0)) )
|
||||
return;
|
||||
|
||||
char text_buf[256];
|
||||
if (in_text != NULL && strlen(in_text) > 0)
|
||||
{
|
||||
strcpy(text_buf, in_text);
|
||||
sexp_replace_variable_names_with_values(text_buf, 256);
|
||||
in_text = text_buf;
|
||||
}
|
||||
|
||||
|
||||
int num_text_lines = 0;
|
||||
char *text_line_ptrs[MAX_SUBTITLE_LINES];
|
||||
@@ -629,7 +642,9 @@ subtitle::subtitle(int in_x_pos, int in_y_pos, char* in_text, float in_display_t
|
||||
|
||||
//Setup text
|
||||
if ( (in_text != NULL) && (strlen(in_text) > 0) ) {
|
||||
num_text_lines = split_str(in_text, in_width, text_line_lens, text_line_ptrs, MAX_SUBTITLE_LINES);
|
||||
int split_width = (in_width > 0) ? in_width : 200;
|
||||
|
||||
num_text_lines = split_str(in_text, split_width, text_line_lens, text_line_ptrs, MAX_SUBTITLE_LINES);
|
||||
std::string temp_str;
|
||||
for(int i = 0; i < num_text_lines; i++)
|
||||
{
|
||||
@@ -639,10 +654,11 @@ subtitle::subtitle(int in_x_pos, int in_y_pos, char* in_text, float in_display_t
|
||||
}
|
||||
|
||||
//Setup text color
|
||||
if(in_text_color)
|
||||
if(in_text_color != NULL)
|
||||
text_color = *in_text_color;
|
||||
else
|
||||
gr_init_alphacolor(&text_color, 255, 255, 255, 255);
|
||||
text_fontnum = in_text_fontnum;
|
||||
|
||||
//Setup display and fade time
|
||||
display_time = fl_abs(in_display_time);
|
||||
@@ -659,11 +675,20 @@ subtitle::subtitle(int in_x_pos, int in_y_pos, char* in_text, float in_display_t
|
||||
|
||||
//Setup pos
|
||||
int w=0, h=0, tw=0, th=0;
|
||||
float deltax, deltay;
|
||||
image_pos[0] = 0;
|
||||
image_pos[1] = 0;
|
||||
if(center_x || center_y)
|
||||
{
|
||||
// switch font because we need to measure it
|
||||
int old_fontnum;
|
||||
if (text_fontnum >= 0)
|
||||
{
|
||||
old_fontnum = gr_get_current_fontnum();
|
||||
gr_set_font(text_fontnum);
|
||||
}
|
||||
else
|
||||
{
|
||||
old_fontnum = -1;
|
||||
}
|
||||
|
||||
//Get text size
|
||||
for(int i = 0; i < num_text_lines; i++)
|
||||
{
|
||||
@@ -675,10 +700,21 @@ subtitle::subtitle(int in_x_pos, int in_y_pos, char* in_text, float in_display_t
|
||||
th += h;
|
||||
}
|
||||
|
||||
// restore old font
|
||||
if (old_fontnum >= 0)
|
||||
{
|
||||
gr_set_font(old_fontnum);
|
||||
}
|
||||
|
||||
//Get image size
|
||||
if(image_id != -1)
|
||||
{
|
||||
bm_get_info(image_id, &w, &h);
|
||||
if (in_width > 0)
|
||||
w = in_width;
|
||||
if (in_height > 0)
|
||||
h = in_height;
|
||||
|
||||
tw += w;
|
||||
if(h > th)
|
||||
th = h;
|
||||
@@ -686,44 +722,29 @@ subtitle::subtitle(int in_x_pos, int in_y_pos, char* in_text, float in_display_t
|
||||
|
||||
//Center it?
|
||||
if(center_x)
|
||||
image_pos[0] = (gr_screen.max_w - tw)/2;
|
||||
image_pos.x = (gr_screen.max_w - tw)/2;
|
||||
if(center_y)
|
||||
image_pos[1] = (gr_screen.max_h - th)/2;
|
||||
image_pos.y = (gr_screen.max_h - th)/2;
|
||||
}
|
||||
|
||||
if(in_x_pos < 0 && !center_x)
|
||||
image_pos[0] += gr_screen.max_w + in_x_pos;
|
||||
image_pos.x += gr_screen.max_w + in_x_pos;
|
||||
else if(!center_x)
|
||||
image_pos[0] += in_x_pos;
|
||||
image_pos.x += in_x_pos;
|
||||
|
||||
if(in_y_pos < 0 && !center_y)
|
||||
image_pos[1] += gr_screen.max_h + in_y_pos;
|
||||
image_pos.y += gr_screen.max_h + in_y_pos;
|
||||
else if(!center_y)
|
||||
image_pos[1] += in_y_pos;
|
||||
image_pos.y += in_y_pos;
|
||||
|
||||
image_pos.w = in_width;
|
||||
image_pos.h = in_height;
|
||||
|
||||
if(image_id != -1)
|
||||
{
|
||||
text_pos[0] = (float) (image_pos[0] + w); //Still set from bm_get_info call
|
||||
if (!center_x)
|
||||
{
|
||||
deltax = text_pos[0] / 1024.0f; //MikeStar;
|
||||
text_pos[0] = gr_screen.max_w * deltax; //MikeStar;
|
||||
}
|
||||
}
|
||||
text_pos.x = image_pos.x + w; //Still set from bm_get_info call
|
||||
else
|
||||
{
|
||||
text_pos[0] = (float) image_pos[0];
|
||||
if (!center_x)
|
||||
{
|
||||
deltax = text_pos[0] / 1024.0f; //MikeStar;
|
||||
text_pos[0] = gr_screen.max_w * deltax; //MikeStar;
|
||||
}
|
||||
}
|
||||
text_pos[1] = (float) image_pos[1];
|
||||
if (!center_y)
|
||||
{
|
||||
deltay = text_pos[1] / 768.0f; //MikeStar;
|
||||
text_pos[1] = gr_screen.max_h * deltay; //MikeStar;
|
||||
}
|
||||
text_pos.x = image_pos.x;
|
||||
text_pos.y = image_pos.y;
|
||||
|
||||
time_displayed = 0.0f;
|
||||
time_displayed_end = 2.0f*fade_time + display_time;
|
||||
@@ -754,9 +775,21 @@ void subtitle::do_frame(float frametime)
|
||||
|
||||
gr_set_color_fast(&text_color);
|
||||
|
||||
// save old font and set new font
|
||||
int old_fontnum;
|
||||
if (text_fontnum >= 0)
|
||||
{
|
||||
old_fontnum = gr_get_current_fontnum();
|
||||
gr_set_font(text_fontnum);
|
||||
}
|
||||
else
|
||||
{
|
||||
old_fontnum = -1;
|
||||
}
|
||||
|
||||
int font_height = gr_get_font_height();
|
||||
int x = fl2i(text_pos[0]);
|
||||
int y = fl2i(text_pos[1]);
|
||||
int x = text_pos.x;
|
||||
int y = text_pos.y;
|
||||
|
||||
for(unsigned int i = 0; i < text_lines.size(); i++)
|
||||
{
|
||||
@@ -764,10 +797,36 @@ void subtitle::do_frame(float frametime)
|
||||
y += font_height;
|
||||
}
|
||||
|
||||
if(image_id != -1)
|
||||
// restore old font
|
||||
if (old_fontnum >= 0)
|
||||
{
|
||||
gr_set_font(old_fontnum);
|
||||
}
|
||||
|
||||
if(image_id >= 0)
|
||||
{
|
||||
gr_set_bitmap(image_id, GR_ALPHABLEND_FILTER, GR_BITBLT_MODE_NORMAL, text_color.alpha/255.0f);
|
||||
gr_bitmap(image_pos[0], image_pos[1], false);
|
||||
|
||||
// scaling?
|
||||
if (image_pos.w > 0 || image_pos.h > 0)
|
||||
{
|
||||
int orig_w, orig_h;
|
||||
vec3d scale;
|
||||
|
||||
bm_get_info(image_id, &orig_w, &orig_h);
|
||||
scale.xyz.x = image_pos.w / (float) orig_w;
|
||||
scale.xyz.y = image_pos.h / (float) orig_h;
|
||||
scale.xyz.z = 1.0f;
|
||||
|
||||
gr_push_scale_matrix(&scale);
|
||||
gr_bitmap(image_pos.x, image_pos.y, false);
|
||||
gr_pop_scale_matrix();
|
||||
}
|
||||
// no scaling
|
||||
else
|
||||
{
|
||||
gr_bitmap(image_pos.x, image_pos.y, false);
|
||||
}
|
||||
}
|
||||
|
||||
time_displayed += frametime;
|
||||
@@ -789,9 +848,11 @@ void subtitle::clone(const subtitle &sub)
|
||||
for (i = 0; i < sub.text_lines.size(); i++) {
|
||||
text_lines.push_back(sub.text_lines[i]);
|
||||
}
|
||||
text_fontnum = sub.text_fontnum;
|
||||
|
||||
text_pos[0] = sub.text_pos[0];
|
||||
text_pos[1] = sub.text_pos[1];
|
||||
// copy the structs
|
||||
text_pos = sub.text_pos;
|
||||
image_pos = sub.image_pos;
|
||||
|
||||
display_time = sub.display_time;
|
||||
fade_time = sub.fade_time;
|
||||
@@ -806,9 +867,6 @@ void subtitle::clone(const subtitle &sub)
|
||||
image_id = -1;
|
||||
}
|
||||
|
||||
image_pos[0] = sub.image_pos[0];
|
||||
image_pos[1] = sub.image_pos[1];
|
||||
|
||||
time_displayed = sub.time_displayed;
|
||||
time_displayed_end = sub.time_displayed_end;
|
||||
|
||||
|
||||
@@ -125,16 +125,17 @@ private:
|
||||
void clone(const subtitle &sub);
|
||||
|
||||
SCP_vector<std::string> text_lines;
|
||||
float text_pos[2];
|
||||
struct { int x; int y; } text_pos;
|
||||
|
||||
float display_time;
|
||||
float fade_time;
|
||||
color text_color;
|
||||
int text_fontnum;
|
||||
|
||||
//Done with set
|
||||
char imageanim[MAX_FILENAME_LEN];
|
||||
int image_id;
|
||||
int image_pos[2];
|
||||
struct { int x; int y; int w; int h; } image_pos;
|
||||
|
||||
//Time this has been displayed
|
||||
float time_displayed;
|
||||
@@ -144,9 +145,9 @@ private:
|
||||
|
||||
bool post_shaded;
|
||||
public:
|
||||
subtitle(int in_x_pos, int in_y_pos, char* in_text, float in_display_time,
|
||||
char* in_imageanim = NULL, float in_fade_time = 0.0f, color *in_text_color = NULL,
|
||||
bool center_x = false, bool center_y = false, int in_width = 200, bool post_shaded=false);
|
||||
subtitle(int in_x_pos, int in_y_pos, char* in_text = NULL, char* in_imageanim = NULL,
|
||||
float in_display_time = 0, float in_fade_time = 0.0f, color *in_text_color = NULL, int in_text_fontnum = -1,
|
||||
bool center_x = false, bool center_y = false, int in_width = 0, int in_height = 0, bool post_shaded=false);
|
||||
~subtitle();
|
||||
|
||||
subtitle(const subtitle &sub) { clone(sub); }
|
||||
|
||||
+8
-50
@@ -78,7 +78,7 @@ cf_pathtype Pathtypes[CF_MAX_PATH_TYPES] = {
|
||||
{ CF_TYPE_SQUAD_IMAGES, "data" DIR_SEPARATOR_STR "players" DIR_SEPARATOR_STR "squads", ".pcx .png .dds", CF_TYPE_PLAYERS },
|
||||
{ CF_TYPE_SINGLE_PLAYERS, "data" DIR_SEPARATOR_STR "players" DIR_SEPARATOR_STR "single", ".pl2 .cs2 .plr .csg .css", CF_TYPE_PLAYERS },
|
||||
{ CF_TYPE_MULTI_PLAYERS, "data" DIR_SEPARATOR_STR "players" DIR_SEPARATOR_STR "multi", ".plr", CF_TYPE_PLAYERS },
|
||||
{ CF_TYPE_CACHE, "data" DIR_SEPARATOR_STR "cache", ".clr .tmp .ibx .tsb", CF_TYPE_DATA }, //clr=cached color
|
||||
{ CF_TYPE_CACHE, "data" DIR_SEPARATOR_STR "cache", ".clr .tmp .bx", CF_TYPE_DATA }, //clr=cached color
|
||||
{ CF_TYPE_MULTI_CACHE, "data" DIR_SEPARATOR_STR "multidata", ".pcx .png .dds .fs2 .txt", CF_TYPE_DATA },
|
||||
{ CF_TYPE_MISSIONS, "data" DIR_SEPARATOR_STR "missions", ".fs2 .fc2 .ntl .ssv", CF_TYPE_DATA },
|
||||
{ CF_TYPE_CONFIG, "data" DIR_SEPARATOR_STR "config", ".cfg", CF_TYPE_DATA },
|
||||
@@ -147,9 +147,14 @@ int cfile_in_root_dir(char *exe_path)
|
||||
token_count++;
|
||||
tok = strtok(NULL, DIR_SEPARATOR_STR);
|
||||
} while(tok != NULL);
|
||||
|
||||
// root directory if we have <= 1 slash
|
||||
|
||||
#ifdef SCP_UNIX
|
||||
// /freespace works, / does not
|
||||
if(token_count <= 1) {
|
||||
#else
|
||||
// C:/freespace works, C:/ does not
|
||||
if(token_count <= 2){
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -813,53 +818,6 @@ CFILE *cfopen_special(char *file_path, char *mode, const int size, const int off
|
||||
// it's a normal file
|
||||
return cf_open_fill_cfblock(fp, dir_type);
|
||||
}
|
||||
|
||||
/* char longname[_MAX_PATH];
|
||||
|
||||
if ( !cfile_inited ) {
|
||||
Int3();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//================================================
|
||||
// Check that all the parameters make sense
|
||||
Assert( file_path && strlen(file_path) );
|
||||
Assert( mode != NULL );
|
||||
|
||||
if ( (ext_num <= 0) || (!ext_list) ) {
|
||||
Int3();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// cfopen_ext() only supports reading files, not creating them
|
||||
if ( strchr(mode, 'w') ) {
|
||||
Int3();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//================================================
|
||||
// Search for file on disk, on cdrom, or in a packfile
|
||||
|
||||
int offset, size;
|
||||
char copy_file_path[MAX_PATH_LEN]; // FIX change in memory from cf_find_file_location
|
||||
strcpy_s(copy_file_path, file_path);
|
||||
|
||||
if ( cf_find_file_location_ext(copy_file_path, ext_num, ext_list, dir_type, sizeof(longname) - 1, longname, &size, &offset, localize) ) {
|
||||
// Fount it, now create a cfile out of it
|
||||
FILE *fp = fopen( longname, "rb" );
|
||||
|
||||
if ( fp ) {
|
||||
if ( offset ) {
|
||||
// Found it in a pack file
|
||||
return cf_open_packed_cfblock(fp, dir_type, offset, size );
|
||||
} else {
|
||||
// Found it in a normal file
|
||||
return cf_open_fill_cfblock(fp, dir_type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1168,7 +1168,7 @@ int cf_find_file_location_ext( char *filename, const int ext_num, const char **e
|
||||
int last_root_index = -1;
|
||||
int last_path_index = -1;
|
||||
|
||||
file_list_index.reserve(Num_files);
|
||||
file_list_index.reserve( MIN(ext_num * 4, Num_files) );
|
||||
|
||||
// next, run though and pick out base matches
|
||||
for (i = 0; i < Num_files; i++) {
|
||||
|
||||
+117
-77
@@ -21,6 +21,7 @@
|
||||
#include "globalincs/pstypes.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <io.h>
|
||||
#include <direct.h>
|
||||
#elif defined(APPLE_APP)
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
@@ -49,6 +50,7 @@ public:
|
||||
int get_int();
|
||||
float get_float();
|
||||
char *str();
|
||||
bool check_if_args_is_valid();
|
||||
};
|
||||
|
||||
static cmdline_parm Parm_list(NULL, NULL);
|
||||
@@ -75,6 +77,9 @@ enum
|
||||
|
||||
#define BUILD_CAP_OPENAL (1<<0)
|
||||
#define BUILD_CAP_NO_D3D (1<<1)
|
||||
#define BUILD_CAP_NEW_SND (1<<2)
|
||||
|
||||
#define PARSE_COMMAND_LINE_STRING "-parse_cmdline_only"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -108,16 +113,15 @@ typedef struct
|
||||
// Please group them by type, ie graphics, gameplay etc, maximum 20 different types
|
||||
Flag exe_params[] =
|
||||
{
|
||||
{ "-spec", "Enable specular", true, EASY_ALL_ON, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-spec", },
|
||||
{ "-spec", "Enable specular", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-spec", },
|
||||
{ "-glow", "Enable glowmaps", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-glow", },
|
||||
{ "-env", "Enable environment maps", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-env", },
|
||||
{ "-mipmap", "Enable mipmapping", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-mipmap", },
|
||||
{ "-mipmap", "Enable mipmapping", true, 0, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-mipmap", },
|
||||
{ "-nomotiondebris", "Disable motion debris", true, EASY_ALL_ON, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nomotiondebris",},
|
||||
{ "-noscalevid", "Disable scale-to-window for movies", true, 0, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-noscalevid", },
|
||||
{ "-missile_lighting", "Apply Lighting to Missiles" , true, EASY_ALL_ON, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-missile_lighting", },
|
||||
{ "-normal", "Enable normal maps", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-normal" },
|
||||
{ "-3dshockwave", "Enable 3D shockwaves", true, EASY_ALL_ON, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-3dshockwave" },
|
||||
{ "-post_process", "Enable post processing", true, EASY_MEM_ALL_ON, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-post_process" },
|
||||
{ "-3dshockwave", "Enable 3D shockwaves", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-3dshockwave" },
|
||||
|
||||
{ "-img2dds", "Compress non-compressed images", true, 0, EASY_DEFAULT, "Game Speed", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-img2dds", },
|
||||
{ "-no_vsync", "Disable vertical sync", true, 0, EASY_DEFAULT, "Game Speed", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-no_vsync", },
|
||||
@@ -126,18 +130,16 @@ Flag exe_params[] =
|
||||
{ "-dualscanlines", "Another pair of scanning lines", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-dualscanlines", },
|
||||
{ "-targetinfo", "Enable info next to target", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-targetinfo", },
|
||||
{ "-orbradar", "Enables 3d radar", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-orbradar", },
|
||||
{ "-rearm_timer", "Enable Rearm/Repair Completion Timer", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-rearm_timer", },
|
||||
{ "-rearm_timer", "Enable Rearm/Repair Completion Timer", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-rearm_timer", },
|
||||
{ "-ballistic_gauge", "Enable the analog ballistic ammo gauge", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-ballistic_gauge", },
|
||||
|
||||
{ "-ship_choice_3d", "Use models for ship selection", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-ship_choice_3d", },
|
||||
{ "-weapon_choice_3d", "Use models for weapon selection", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-weapon_choice_3d", },
|
||||
{ "-weapon_choice_3d", "Use models for weapon selection", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-weapon_choice_3d", },
|
||||
{ "-3dwarp", "Enable 3d warp", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-3dwarp", },
|
||||
{ "-warp_flash", "Enable flash upon warp", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-warp_flash", },
|
||||
{ "-no_ap_interrupt", "Disable interrupting autopilot", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-no_ap_interrupt", },
|
||||
{ "-tbp", "Toggle features for The Babylon Project", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-tbp", }, // TBP warp effects -Et1
|
||||
{ "-wcsaga", "Toggle features for Wing Commander Saga", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-wcsaga", },
|
||||
|
||||
{ "-snd_preload", "Preload mission game sounds", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Audio", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-snd_preload", },
|
||||
{ "-snd_preload", "Preload mission game sounds", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Audio", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-snd_preload", },
|
||||
{ "-nosound", "Disable sound and music", false, 0, EASY_DEFAULT, "Audio", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nosound", },
|
||||
{ "-nomusic", "Disable music", false, 0, EASY_DEFAULT, "Audio", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nomusic", },
|
||||
|
||||
@@ -151,40 +153,42 @@ Flag exe_params[] =
|
||||
|
||||
{ "-oldfire", "", false, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-oldfire", },
|
||||
{ "-nohtl", "Software mode (very slow)", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nohtl", },
|
||||
{ "-no_set_gamma", "Disable setting of gamma", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-no_set_gamma", },
|
||||
{ "-no_set_gamma", "Disable setting of gamma", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-no_set_gamma", },
|
||||
{ "-nomovies", "Disable video playback", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nomovies", },
|
||||
{ "-noparseerrors", "Disable parsing errors", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-noparseerrors", },
|
||||
{ "-safeloading", "", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-safeloading", },
|
||||
{ "-query_speech", "Does this build have speech?", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-query_speech", },
|
||||
{ "-query_speech", "Does this build have speech?", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-query_speech", },
|
||||
{ "-d3d_bad_tsys", "Enable inefficient textures", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-d3d_bad_tsys", },
|
||||
{ "-novbo", "Disable OpenGL VBO", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-novbo", },
|
||||
{ "-noibx", "Don't use cached index buffers (IBX)", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-noibx", },
|
||||
{ "-noibx", "Don't use cached index buffers (IBX)", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-noibx", },
|
||||
{ "-loadallweps", "Load all weapons, even those not used", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-loadallweps", },
|
||||
{ "-disable_fbo", "Disable OpenGL RenderTargets", true, 0, EASY_DEFAULT, "Troubleshoot", "", },
|
||||
{ "-disable_fbo", "Disable OpenGL RenderTargets", true, 0, EASY_DEFAULT, "Troubleshoot", "", },
|
||||
{ "-no_glsl", "Disable GLSL (shader) support", true, 0, EASY_DEFAULT, "Troubleshoot", "", },
|
||||
{ "-ati_swap", "Fix Color issues on some ATI cards", true, 0, EASY_DEFAULT, "Troubleshoot", "http://scp.indiegames.us/mantis/view.php?id=1669", },
|
||||
{ "-ati_swap", "Fix Color issues on some ATI cards", true, 0, EASY_DEFAULT, "Troubleshoot", "http://scp.indiegames.us/mantis/view.php?id=1669", },
|
||||
{ "-no_3d_sound", "Use only 2D/stereo for sound effects", true, 0, EASY_DEFAULT, "Troubleshoot", "", },
|
||||
{ "-disable_glsl_model","Don't use shaders for model rendering", true, 0, EASY_DEFAULT, "Troubleshoot", "", },
|
||||
|
||||
{ "-ingame_join", "Allows ingame joining", true, 0, EASY_DEFAULT, "Experimental", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-ingame_join", },
|
||||
{ "-voicer", "Voice recognition", true, 0, EASY_DEFAULT, "Experimental", "", },
|
||||
{ "-post_process", "Enable post processing", true, 0, EASY_DEFAULT, "Experimental", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-post_process" },
|
||||
|
||||
{ "-fps", "Show frames per second on HUD", false, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-fps", },
|
||||
{ "-pos", "Show position of camera", false, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-pos", },
|
||||
{ "-window", "Run in window", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-window", },
|
||||
{ "-fullscreen_window", "Run in fullscreen window", false, 0, 0, "Dev Tool", "", },
|
||||
{ "-res", "Run at specified resolution", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-res", },
|
||||
{ "-timerbar", "", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-timerbar", },
|
||||
{ "-fullscreen_window", "Run in fullscreen window", false, 0, EASY_DEFAULT, "Dev Tool", "", },
|
||||
|
||||
{ "-stats", "Show statistics", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-stats", },
|
||||
{ "-coords", "Show coordinates", false, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-coords", },
|
||||
{ "-coords", "Show coordinates", false, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-coords", },
|
||||
{ "-show_mem_usage", "Show memory usage", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-show_mem_usage", },
|
||||
{ "-pofspew", "", false, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-pofspew", },
|
||||
{ "-tablecrcs", "", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-tablecrcs", },
|
||||
{ "-missioncrcs", "", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-missioncrcs", },
|
||||
{ "-dis_collisions", "Disable collisions", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-dis_collisions", },
|
||||
{ "-dis_weapons", "Disable weapon rendering", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-dis_weapons", },
|
||||
{ "-dis_weapons", "Disable weapon rendering", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-dis_weapons", },
|
||||
{ "-output_sexps", "Outputs SEXPs to sexps.html", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-output_sexps", },
|
||||
{ "-output_scripting", "Outputs scripting to scripting.html", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-output_scripting", },
|
||||
{ "-save_render_target", "Save render targets to file", true, 0, EASY_DEFAULT, "Dev Tool", "", },
|
||||
{ "-debug_window", "Display debug window", true, 0, EASY_DEFAULT, "Dev Tool", "", },
|
||||
{ "-debug_window", "Display debug window", true, 0, EASY_DEFAULT, "Dev Tool", "", },
|
||||
{ "-verify_vps", "Spew VP crcs to vp_crcs.txt", true, 0, EASY_DEFAULT, "Dev Tool", "", },
|
||||
#ifdef SCP_UNIX
|
||||
{ "-nograb", "Don't grab mouse/keyboard in a window", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nograb", },
|
||||
@@ -249,7 +253,6 @@ cmdline_parm spec_point_arg("-spec_point", NULL);
|
||||
cmdline_parm spec_tube_arg("-spec_tube", NULL);
|
||||
cmdline_parm ambient_factor_arg("-ambient_factor", NULL); // Cmdline_ambient_factor
|
||||
cmdline_parm cell_arg("-cell", NULL); // Cmdline_cell
|
||||
cmdline_parm decals("-decals", NULL); // Cmdline_decals
|
||||
cmdline_parm env("-env", NULL); // Cmdline_env
|
||||
cmdline_parm mipmap_arg("-mipmap", NULL); // Cmdline_mipmap
|
||||
cmdline_parm missile_lighting_arg("-missile_lighting", NULL); // Cmdline_missile_lighting
|
||||
@@ -269,7 +272,6 @@ float Cmdline_fov = 0.75f;
|
||||
float Cmdline_ogl_spec = 80.0f;
|
||||
int Cmdline_ambient_factor = 128;
|
||||
int Cmdline_cell = 0;
|
||||
int Cmdline_decals = 0;
|
||||
int Cmdline_env = 0;
|
||||
int Cmdline_mipmap = 0;
|
||||
int Cmdline_missile_lighting = 0;
|
||||
@@ -332,12 +334,8 @@ int Cmdline_voice_recognition = 0;
|
||||
|
||||
// MOD related
|
||||
cmdline_parm mod_arg("-mod", NULL, true); // Cmdline_mod -- DTP modsupport
|
||||
cmdline_parm tbp("-tbp", NULL); // Cmdline_tbp -- TBP warp effects -Et1
|
||||
cmdline_parm wcsaga("-wcsaga", NULL); // Cmdline_wcsaga
|
||||
|
||||
char *Cmdline_mod = NULL; //DTP for mod arguement
|
||||
int Cmdline_tbp = 0;
|
||||
int Cmdline_wcsaga = 0;
|
||||
|
||||
// Multiplayer/Network related
|
||||
cmdline_parm almission_arg("-almission", NULL); // Cmdline_almission -- DTP for autoload Multi mission
|
||||
@@ -366,6 +364,8 @@ cmdline_parm safeloading_arg("-safeloading", NULL); // Cmdline_safeloading -- U
|
||||
cmdline_parm no_fbo_arg("-disable_fbo", NULL); // Cmdline_no_fbo
|
||||
cmdline_parm noglsl_arg("-no_glsl", NULL); // Cmdline_noglsl -- disable GLSL support in OpenGL
|
||||
cmdline_parm atiswap_arg("-ati_swap", NULL); // Cmdline_atiswap - Fix ATI color swap issue for screenshots.
|
||||
cmdline_parm no3dsound_arg("-no_3d_sound", NULL); // Cmdline_no_3d_sound - Disable use of full 3D sounds
|
||||
cmdline_parm no_glsl_models_arg("-disable_glsl_model", NULL); // Cmdline_no_glsl_model_rendering -- switches model rendering to fixed pipeline
|
||||
|
||||
int Cmdline_d3d_lesstmem = 0;
|
||||
int Cmdline_load_all_weapons = 0;
|
||||
@@ -378,6 +378,8 @@ int Cmdline_safeloading = 0;
|
||||
int Cmdline_no_fbo = 0;
|
||||
int Cmdline_noglsl = 0;
|
||||
int Cmdline_ati_color_swap = 0;
|
||||
int Cmdline_no_3d_sound = 0;
|
||||
int Cmdline_no_glsl_model_rendering = 0;
|
||||
|
||||
// Developer/Testing related
|
||||
cmdline_parm start_mission_arg("-start_mission", NULL); // Cmdline_start_mission
|
||||
@@ -385,6 +387,7 @@ cmdline_parm dis_collisions("-dis_collisions", NULL); // Cmdline_dis_collisions
|
||||
cmdline_parm dis_weapons("-dis_weapons", NULL); // Cmdline_dis_weapons
|
||||
cmdline_parm noparseerrors_arg("-noparseerrors", NULL); // Cmdline_noparseerrors -- turns off parsing errors -C
|
||||
cmdline_parm nowarn_arg("-no_warn", NULL); // Cmdline_nowarn
|
||||
cmdline_parm extra_warn_arg("-extra_warn", NULL); // Cmdline_extra_warn
|
||||
cmdline_parm fps_arg("-fps", NULL); // Cmdline_show_fps
|
||||
cmdline_parm show_mem_usage_arg("-show_mem_usage", NULL); // Cmdline_show_mem_usage
|
||||
cmdline_parm pos_arg("-pos", NULL); // Cmdline_show_pos
|
||||
@@ -396,6 +399,7 @@ cmdline_parm window_arg("-window", NULL); // Cmdline_window
|
||||
cmdline_parm fullscreen_window_arg("-fullscreen_window",NULL);
|
||||
cmdline_parm res_arg("-res", NULL); // Cmdline_lores
|
||||
cmdline_parm verify_vps_arg("-verify_vps", NULL); // Cmdline_verify_vps -- spew VP crcs to vp_crcs.txt
|
||||
cmdline_parm parse_cmdline_only(PARSE_COMMAND_LINE_STRING, NULL);
|
||||
#ifdef SCP_UNIX
|
||||
cmdline_parm no_grab("-nograb", NULL); // Cmdline_no_grab
|
||||
#endif
|
||||
@@ -405,6 +409,7 @@ int Cmdline_dis_collisions = 0;
|
||||
int Cmdline_dis_weapons = 0;
|
||||
int Cmdline_noparseerrors = 0;
|
||||
int Cmdline_nowarn = 0; // turn warnings off in FRED
|
||||
int Cmdline_extra_warn = 0;
|
||||
int Cmdline_show_mem_usage = 0;
|
||||
int Cmdline_show_pos = 0;
|
||||
int Cmdline_show_stats = 0;
|
||||
@@ -502,7 +507,7 @@ void parm_stuff_args(cmdline_parm *parm, char *cmdline)
|
||||
|
||||
cmdline += strlen(parm->name);
|
||||
|
||||
while ((*cmdline != '\0') && strncmp(cmdline, " -", 2)) {
|
||||
while ((*cmdline != '\0') && strncmp(cmdline, " -", 2) && ((size_t)(dest-buffer) < sizeof(buffer))) {
|
||||
*dest++ = *cmdline++;
|
||||
}
|
||||
|
||||
@@ -521,12 +526,15 @@ void parm_stuff_args(cmdline_parm *parm, char *cmdline)
|
||||
parm->args = NULL;
|
||||
}
|
||||
|
||||
int size = strlen(buffer) + 1;
|
||||
|
||||
if (saved_args != NULL)
|
||||
size += (strlen(saved_args) + 1); // an ',' is used as a separator when combining, so be sure to account for it
|
||||
int size = strlen(buffer);
|
||||
|
||||
if (size > 0) {
|
||||
size++; // nul char
|
||||
|
||||
if (saved_args != NULL) {
|
||||
size += (strlen(saved_args) + 1); // an ',' is used as a separator when combining, so be sure to account for it
|
||||
}
|
||||
|
||||
parm->args = new char[size];
|
||||
memset(parm->args, 0, size);
|
||||
|
||||
@@ -537,13 +545,14 @@ void parm_stuff_args(cmdline_parm *parm, char *cmdline)
|
||||
strcat_s(parm->args, size, ",");
|
||||
// now the new arg
|
||||
strcat_s(parm->args, size, buffer);
|
||||
|
||||
delete [] saved_args;
|
||||
} else {
|
||||
strcpy_s(parm->args, size, buffer);
|
||||
}
|
||||
} else {
|
||||
parm->args = saved_args;
|
||||
}
|
||||
|
||||
if (saved_args != NULL)
|
||||
delete[] saved_args;
|
||||
}
|
||||
|
||||
|
||||
@@ -599,8 +608,8 @@ void os_validate_parms(char *cmdline)
|
||||
char *token;
|
||||
int parm_found;
|
||||
|
||||
token = strtok(cmdline, seps);
|
||||
while(token != NULL) {
|
||||
token = strtok(cmdline, seps);
|
||||
while(token != NULL) {
|
||||
|
||||
if (token[0] == '-') {
|
||||
parm_found = 0;
|
||||
@@ -673,6 +682,12 @@ void os_init_cmdline(char *cmdline)
|
||||
{
|
||||
FILE *fp;
|
||||
|
||||
bool parse_config = true;
|
||||
|
||||
if (strstr(cmdline, PARSE_COMMAND_LINE_STRING) != NULL) {
|
||||
parse_config = false;
|
||||
}
|
||||
|
||||
// read the cmdline.cfg file from the data folder, and pass the command line arguments to
|
||||
// the the parse_parms and validate_parms line. Read these first so anything actually on
|
||||
// the command line will take precedence
|
||||
@@ -697,10 +712,13 @@ void os_init_cmdline(char *cmdline)
|
||||
#endif
|
||||
|
||||
// if the file exists, get a single line, and deal with it
|
||||
if ( fp ) {
|
||||
char buf[1024], *p;
|
||||
if ( fp && parse_config ) {
|
||||
char *buf, *p;
|
||||
|
||||
fgets(buf, 1024, fp);
|
||||
size_t len = filelength( fileno(fp) ) + 2;
|
||||
buf = new char [len];
|
||||
|
||||
fgets(buf, len-1, fp);
|
||||
|
||||
// replace the newline character with a NULL
|
||||
if ( (p = strrchr(buf, '\n')) != NULL ) {
|
||||
@@ -709,11 +727,12 @@ void os_init_cmdline(char *cmdline)
|
||||
|
||||
#ifdef SCP_UNIX
|
||||
// append a space for the os_parse_parms() check
|
||||
strcat_s(buf, " ");
|
||||
strcat_s(buf, len, " ");
|
||||
#endif
|
||||
|
||||
os_parse_parms(buf);
|
||||
os_validate_parms(buf);
|
||||
delete [] buf;
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
@@ -732,9 +751,12 @@ void os_init_cmdline(char *cmdline)
|
||||
|
||||
// if the file exists, get a single line, and deal with it
|
||||
if ( fp ) {
|
||||
char buf[1024], *p;
|
||||
char *buf, *p;
|
||||
|
||||
fgets(buf, 1024, fp);
|
||||
size_t len = filelength( fileno(fp) ) + 2;
|
||||
buf = new char [len];
|
||||
|
||||
fgets(buf, len-1, fp);
|
||||
|
||||
// replace the newline character with a NULL
|
||||
if ( (p = strrchr(buf, '\n')) != NULL ) {
|
||||
@@ -742,10 +764,11 @@ void os_init_cmdline(char *cmdline)
|
||||
}
|
||||
|
||||
// append a space for the os_parse_parms() check
|
||||
strcat_s(buf, " ");
|
||||
strcat_s(buf, len, " ");
|
||||
|
||||
os_parse_parms(buf);
|
||||
os_validate_parms(buf);
|
||||
delete [] buf;
|
||||
fclose(fp);
|
||||
}
|
||||
#endif
|
||||
@@ -788,6 +811,21 @@ cmdline_parm::~cmdline_parm()
|
||||
#endif
|
||||
}
|
||||
|
||||
// checks if the objects args variable is valid
|
||||
// returns true if it is, shows an error box and returns false if not valid.
|
||||
bool cmdline_parm::check_if_args_is_valid() {
|
||||
if ( args == NULL ) {
|
||||
Error(__FILE__, __LINE__,
|
||||
"Command line flag passed that requires an argument, but the argument is missing!\r\n"
|
||||
"The flag is '%s', make sure that you have an argument that follows it.\r\n"
|
||||
"You may need to close your launcher and remove the flag manually from %s/data/cmdline_fso.cfg\r\n",
|
||||
name, "<Freespace directory>");
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// returns - true if the parameter exists on the command line, otherwise false
|
||||
int cmdline_parm::found()
|
||||
@@ -798,7 +836,8 @@ int cmdline_parm::found()
|
||||
// returns - the interger representation for the parameter arguement
|
||||
int cmdline_parm::get_int()
|
||||
{
|
||||
Assert(args);
|
||||
check_if_args_is_valid();
|
||||
|
||||
int offset = 0;
|
||||
|
||||
if (stacks) {
|
||||
@@ -821,7 +860,8 @@ int cmdline_parm::get_int()
|
||||
// returns - the float representation for the parameter arguement
|
||||
float cmdline_parm::get_float()
|
||||
{
|
||||
Assert(args!=NULL);
|
||||
check_if_args_is_valid();
|
||||
|
||||
int offset = 0;
|
||||
|
||||
if (stacks) {
|
||||
@@ -844,7 +884,8 @@ float cmdline_parm::get_float()
|
||||
// returns - the string value for the parameter arguement
|
||||
char *cmdline_parm::str()
|
||||
{
|
||||
Assert(args);
|
||||
check_if_args_is_valid();
|
||||
|
||||
return args;
|
||||
}
|
||||
|
||||
@@ -879,8 +920,15 @@ bool SetCmdlineParams()
|
||||
Cmdline_FRED2_htl = 1;
|
||||
}*/
|
||||
|
||||
if (extra_warn_arg.found())
|
||||
{
|
||||
Cmdline_extra_warn = 1;
|
||||
}
|
||||
|
||||
if (timerbar_arg.found()) {
|
||||
Cmdline_timerbar = 1;
|
||||
#ifdef WIN32
|
||||
MessageBox(NULL, "the timerbar has been disabled in builds after August 31, 2010. Please remove the \"-timerbar\" command line from the launcher to prevent this message from appearing the the future.", "", MB_OK | MB_ICONINFORMATION);
|
||||
#endif
|
||||
}
|
||||
|
||||
if ( missioncrcspew_arg.found() ) {
|
||||
@@ -901,9 +949,11 @@ bool SetCmdlineParams()
|
||||
}
|
||||
}
|
||||
|
||||
// is this a standalone server??
|
||||
if (standalone_arg.found()) {
|
||||
Is_standalone = 1;
|
||||
if (!Fred_running) { //There is no standalone FRED
|
||||
// is this a standalone server??
|
||||
if (standalone_arg.found()) {
|
||||
Is_standalone = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// object update control
|
||||
@@ -1125,7 +1175,12 @@ bool SetCmdlineParams()
|
||||
}
|
||||
|
||||
if ( fov_arg.found() ) {
|
||||
VIEWER_ZOOM_DEFAULT = Cmdline_fov = fov_arg.get_float();
|
||||
Cmdline_fov = fov_arg.get_float();
|
||||
if (Cmdline_fov > 0.1) {
|
||||
VIEWER_ZOOM_DEFAULT = Cmdline_fov;
|
||||
} else {
|
||||
VIEWER_ZOOM_DEFAULT = Cmdline_fov = 0.75f;
|
||||
}
|
||||
}
|
||||
|
||||
if( clip_dist_arg.found() ) {
|
||||
@@ -1137,16 +1192,6 @@ bool SetCmdlineParams()
|
||||
Cmdline_orb_radar = 1;
|
||||
}
|
||||
|
||||
// TBP warp effects -Et1
|
||||
// Chief1983 - Add 3d shockwave, ship choice 3d and weapon choice 3d if TBP is checked
|
||||
if( tbp.found() )
|
||||
{
|
||||
Cmdline_tbp = 1;
|
||||
Cmdline_enable_3d_shockwave = 1;
|
||||
Cmdline_ship_choice_3d = 1;
|
||||
Cmdline_weapon_choice_3d = 1;
|
||||
}
|
||||
|
||||
if ( use_3dwarp.found() ) {
|
||||
Cmdline_3dwarp = 1;
|
||||
}
|
||||
@@ -1219,6 +1264,10 @@ bool SetCmdlineParams()
|
||||
Cmdline_noglsl = 1;
|
||||
}
|
||||
|
||||
if (no_glsl_models_arg.found() ) {
|
||||
Cmdline_no_glsl_model_rendering = 1;
|
||||
}
|
||||
|
||||
if ( img2dds_arg.found() )
|
||||
Cmdline_img2dds = 1;
|
||||
|
||||
@@ -1278,10 +1327,10 @@ bool SetCmdlineParams()
|
||||
ubyte build_caps = 0;
|
||||
|
||||
/* portej05 defined this always */
|
||||
build_caps |= BUILD_CAP_NO_D3D;
|
||||
#ifdef USE_OPENAL
|
||||
build_caps |= BUILD_CAP_OPENAL;
|
||||
#endif
|
||||
build_caps |= BUILD_CAP_NO_D3D;
|
||||
build_caps |= BUILD_CAP_NEW_SND;
|
||||
|
||||
|
||||
fwrite(&build_caps, 1, 1, fp);
|
||||
}
|
||||
@@ -1315,22 +1364,10 @@ bool SetCmdlineParams()
|
||||
Cmdline_env = 1;
|
||||
}
|
||||
|
||||
if ( decals.found() ) {
|
||||
|
||||
#ifdef WIN32
|
||||
MessageBox(NULL, "Decals have been disabled in builds after May 4, 2006. Please remove the \"-decals\" command line from the launcher to prevent this message from appearing the the future.", "", MB_OK | MB_ICONINFORMATION);
|
||||
#endif
|
||||
}
|
||||
|
||||
if ( ballistic_gauge.found() ) {
|
||||
Cmdline_ballistic_gauge = 1;
|
||||
}
|
||||
|
||||
if (wcsaga.found())
|
||||
{
|
||||
Cmdline_wcsaga = 1;
|
||||
}
|
||||
|
||||
if ( cache_bitmaps_arg.found() ) {
|
||||
Cmdline_cache_bitmaps = 1;
|
||||
}
|
||||
@@ -1378,6 +1415,9 @@ bool SetCmdlineParams()
|
||||
if ( verify_vps_arg.found() )
|
||||
Cmdline_verify_vps = 1;
|
||||
|
||||
if ( no3dsound_arg.found() )
|
||||
Cmdline_no_3d_sound = 1;
|
||||
|
||||
if ( atiswap_arg.found() )
|
||||
{
|
||||
Cmdline_ati_color_swap = 1;
|
||||
@@ -1443,4 +1483,4 @@ int parse_cmdline(char *cmdline)
|
||||
// If you're looking for the list of if (someparam.found()) { cmdline_someparam = something; } look above at this function
|
||||
// I did this because of fred2_parse_cmdline()
|
||||
return SetCmdlineParams();
|
||||
}
|
||||
}
|
||||
@@ -63,7 +63,6 @@ extern float static_point_factor;
|
||||
extern float static_tube_factor;
|
||||
extern int Cmdline_ambient_factor;
|
||||
extern int Cmdline_cell;
|
||||
extern int Cmdline_decals;
|
||||
extern int Cmdline_env;
|
||||
extern int Cmdline_mipmap;
|
||||
extern int Cmdline_missile_lighting;
|
||||
@@ -104,9 +103,6 @@ extern int Cmdline_voice_recognition;
|
||||
|
||||
// MOD related
|
||||
extern char *Cmdline_mod; // DTP for mod support
|
||||
extern int Cmdline_tbp;
|
||||
extern int Cmdline_wcsaga;
|
||||
|
||||
// Multiplayer/Network related
|
||||
extern char *Cmdline_almission; // DTP for autoload mission (for multi only)
|
||||
extern int Cmdline_ingamejoin;
|
||||
@@ -127,6 +123,8 @@ extern int Cmdline_safeloading;
|
||||
extern int Cmdline_no_fbo;
|
||||
extern int Cmdline_noglsl;
|
||||
extern int Cmdline_ati_color_swap;
|
||||
extern int Cmdline_no_3d_sound;
|
||||
extern int Cmdline_no_glsl_model_rendering;
|
||||
|
||||
// Developer/Testing related
|
||||
extern char *Cmdline_start_mission;
|
||||
@@ -134,6 +132,7 @@ extern int Cmdline_dis_collisions;
|
||||
extern int Cmdline_dis_weapons;
|
||||
extern int Cmdline_noparseerrors;
|
||||
extern int Cmdline_nowarn;
|
||||
extern int Cmdline_extra_warn;
|
||||
extern int Cmdline_show_mem_usage;
|
||||
extern int Cmdline_show_pos;
|
||||
extern int Cmdline_show_stats;
|
||||
|
||||
+12
-23
@@ -35,7 +35,6 @@ char *Cutscene_mask_name[GR_NUM_RESOLUTIONS] = {
|
||||
"2_ViewFootage-m"
|
||||
};
|
||||
|
||||
size_t Num_cutscenes;
|
||||
int Cutscenes_viewable;
|
||||
int Description_index;
|
||||
SCP_vector<cutscene_info> Cutscenes;
|
||||
@@ -43,7 +42,7 @@ SCP_vector<cutscene_info> Cutscenes;
|
||||
//extern int All_movies_enabled; // If set, all movies may be viewed. Keyed off cheat code.
|
||||
void cutscene_close()
|
||||
{
|
||||
for(size_t i = 0; i < Num_cutscenes; i++)
|
||||
for(size_t i = 0; i < Cutscenes.size(); i++)
|
||||
{
|
||||
if(Cutscenes[i].description)
|
||||
{
|
||||
@@ -73,7 +72,7 @@ void cutscene_init()
|
||||
reset_parse();
|
||||
|
||||
// parse in all the cutscenes
|
||||
Num_cutscenes = 0;
|
||||
Cutscenes.clear();
|
||||
skip_to_string("#Cutscenes");
|
||||
ignore_white_space();
|
||||
|
||||
@@ -97,7 +96,6 @@ void cutscene_init()
|
||||
stuff_int( &cutinfo.cd );
|
||||
|
||||
Cutscenes.push_back(cutinfo);
|
||||
Num_cutscenes++;
|
||||
}
|
||||
|
||||
required_string("#End");
|
||||
@@ -115,9 +113,8 @@ int cutscenes_get_cd_num( char *filename )
|
||||
#if defined(OEM_BUILD)
|
||||
return 0; // only 1 cd for OEM
|
||||
#else
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < Num_cutscenes; i++ ) {
|
||||
for (size_t i = 0; i < Cutscenes.size(); i++ ) {
|
||||
if ( !stricmp(Cutscenes[i].filename, filename) ) {
|
||||
return (Cutscenes[i].cd - 1);
|
||||
}
|
||||
@@ -130,7 +127,6 @@ int cutscenes_get_cd_num( char *filename )
|
||||
// marks a cutscene as viewable
|
||||
void cutscene_mark_viewable(char *filename)
|
||||
{
|
||||
size_t i;
|
||||
char cut_file[MAX_FILENAME_LEN];
|
||||
char file[MAX_FILENAME_LEN];
|
||||
|
||||
@@ -146,7 +142,7 @@ void cutscene_mark_viewable(char *filename)
|
||||
// change to lower case
|
||||
strlwr(file);
|
||||
|
||||
for (i = 0; i < Num_cutscenes; i++ ) {
|
||||
for (size_t i = 0; i < Cutscenes.size(); i++ ) {
|
||||
// change the cutscene file name to lower case
|
||||
strcpy_s(cut_file, Cutscenes[i].filename);
|
||||
strlwr(cut_file);
|
||||
@@ -171,7 +167,6 @@ void cutscene_mark_viewable(char *filename)
|
||||
#define PLAY_BUTTON 6
|
||||
#define EXIT_BUTTON 7
|
||||
|
||||
static int Num_files;
|
||||
static SCP_vector<int> Cutscene_list;
|
||||
//static int Stats_scroll_offset; // not used - taylor
|
||||
static int Selected_line = 0; // line that is currently selected for binding
|
||||
@@ -335,7 +330,7 @@ void cutscenes_screen_play()
|
||||
char name[MAX_FILENAME_LEN]; // *full_name
|
||||
int which_cutscene;
|
||||
|
||||
Assert( (Selected_line >= 0) && (Selected_line < Num_files) );
|
||||
Assert( (Selected_line >= 0) && (Selected_line < (int)Cutscene_list.size()) );
|
||||
which_cutscene = Cutscene_list[Selected_line];
|
||||
|
||||
strcpy_s(name, Cutscenes[which_cutscene].filename );
|
||||
@@ -376,7 +371,7 @@ void cutscenes_screen_scroll_line_down()
|
||||
{
|
||||
int h;
|
||||
|
||||
if (Selected_line < Num_files - 1) {
|
||||
if (Selected_line < (int)Cutscene_list.size() - 1) {
|
||||
Selected_line++;
|
||||
gamesnd_play_iface(SND_SCROLL);
|
||||
|
||||
@@ -413,7 +408,7 @@ void cutscenes_screen_scroll_screen_down()
|
||||
int h;
|
||||
|
||||
h = Cutscene_list_coords[gr_screen.res][3] / gr_get_font_height();
|
||||
if (Scroll_offset + h < Num_files) {
|
||||
if (Scroll_offset + h < (int)Cutscene_list.size()) {
|
||||
Scroll_offset++;
|
||||
if (Selected_line < Scroll_offset){
|
||||
Selected_line = Scroll_offset;
|
||||
@@ -468,7 +463,6 @@ int cutscenes_screen_button_pressed(int n)
|
||||
void cutscenes_screen_init()
|
||||
{
|
||||
int i;
|
||||
size_t j;
|
||||
ui_button_info *b;
|
||||
|
||||
Ui_window.create(0, 0, gr_screen.max_w_unscaled, gr_screen.max_h_unscaled, 0);
|
||||
@@ -512,12 +506,10 @@ void cutscenes_screen_init()
|
||||
// if (All_movies_enabled)
|
||||
// Cutscenes_viewable = 0xffffffff; // Cheat code enables all movies.
|
||||
|
||||
Num_files = 0;
|
||||
Cutscene_list.clear();
|
||||
for ( j = 0; j < Num_cutscenes; j++ ) {
|
||||
for (size_t j = 0; j < Cutscenes.size(); j++ ) {
|
||||
if ( Cutscenes_viewable & (1<<j) ) {
|
||||
Cutscene_list.push_back((int)j);
|
||||
Num_files++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -533,7 +525,6 @@ void cutscenes_screen_close()
|
||||
void cutscenes_screen_do_frame()
|
||||
{
|
||||
int i, k, y, z;
|
||||
size_t t;
|
||||
int font_height = gr_get_font_height();
|
||||
int select_tease_line = -1;
|
||||
|
||||
@@ -576,11 +567,9 @@ void cutscenes_screen_do_frame()
|
||||
// the "show-all" hotkey
|
||||
case KEY_CTRLED | KEY_SHIFTED | KEY_S:
|
||||
{
|
||||
Num_files = 0;
|
||||
Cutscene_list.clear();
|
||||
for (t = 0; t < Num_cutscenes; t++) {
|
||||
for (size_t t = 0; t < Cutscenes.size(); t++) {
|
||||
Cutscene_list.push_back((int)t);
|
||||
Num_files++;
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -598,14 +587,14 @@ void cutscenes_screen_do_frame()
|
||||
if (List_region.button_down()) {
|
||||
List_region.get_mouse_pos(NULL, &y);
|
||||
z = Scroll_offset + y / font_height;
|
||||
if ((z >= 0) && (z < Num_files))
|
||||
if ((z >= 0) && (z < (int)Cutscene_list.size()))
|
||||
select_tease_line = z;
|
||||
}
|
||||
|
||||
if (List_region.pressed()) {
|
||||
List_region.get_mouse_pos(NULL, &y);
|
||||
z = Scroll_offset + y / font_height;
|
||||
if ((z >= 0) && (z < Num_files))
|
||||
if ((z >= 0) && (z < (int)Cutscene_list.size()))
|
||||
Selected_line = z;
|
||||
}
|
||||
|
||||
@@ -630,7 +619,7 @@ void cutscenes_screen_do_frame()
|
||||
y = 0;
|
||||
z = Scroll_offset;
|
||||
while (y + font_height <= Cutscene_list_coords[gr_screen.res][3]) {
|
||||
if (z >= Num_files){
|
||||
if (z >= (int)Cutscene_list.size()){
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@ typedef struct cutscene_info
|
||||
} cutscene_info;
|
||||
|
||||
extern SCP_vector<cutscene_info> Cutscenes;
|
||||
extern size_t Num_cutscenes;
|
||||
extern int Cutscenes_viewable;
|
||||
|
||||
// initializa table data
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
|
||||
|
||||
#ifdef USE_OPENAL
|
||||
|
||||
static int audio_exp_table[256] =
|
||||
{
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
@@ -57,5 +55,3 @@ void mveaudio_uncompress(short *buffer, unsigned char *data, int length)
|
||||
sendWord(&buffer, nCurOffsets[1]);
|
||||
processSwath(buffer, data, swath, nCurOffsets);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -19,7 +19,7 @@
|
||||
#include "osapi/osapi.h"
|
||||
#include "io/timer.h"
|
||||
#include "sound/sound.h"
|
||||
#include "sound/ds.h"
|
||||
#include "sound/openal.h"
|
||||
#include "bmpman/bmpman.h"
|
||||
//#include "sound/audiostr.h"
|
||||
|
||||
@@ -45,7 +45,6 @@ static int mve_audio_canplay = 0;
|
||||
static int mve_audio_compressed = 0;
|
||||
static int audiobuf_created;
|
||||
|
||||
#ifdef USE_OPENAL
|
||||
// struct for the audio stream information
|
||||
typedef struct MVE_AUDIO_T {
|
||||
ALenum format;
|
||||
@@ -61,7 +60,6 @@ mve_audio_t *mas; // mve_audio_stream
|
||||
|
||||
// audio decompressor
|
||||
extern void mveaudio_uncompress(short *buffer, unsigned char *data, int length);
|
||||
#endif // USE_OPENAL
|
||||
|
||||
// video variables
|
||||
int g_width, g_height;
|
||||
@@ -227,7 +225,6 @@ void mve_audio_createbuf(ubyte minor, ubyte *data)
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef USE_OPENAL
|
||||
int flags, desired_buffer, sample_rate;
|
||||
|
||||
mas = (mve_audio_t *) vm_malloc ( sizeof(mve_audio_t) );
|
||||
@@ -278,7 +275,6 @@ void mve_audio_createbuf(ubyte minor, ubyte *data)
|
||||
OpenAL_ErrorPrint( alSourcef(mas->source_id, AL_GAIN, 1.0f) );
|
||||
|
||||
memset(mas->audio_buffer, 0, MVE_AUDIO_BUFFERS * sizeof(ALuint));
|
||||
#endif // USE_OPENAL
|
||||
|
||||
mve_audio_buffer_tail = 0;
|
||||
|
||||
@@ -289,7 +285,6 @@ void mve_audio_createbuf(ubyte minor, ubyte *data)
|
||||
void mve_audio_play()
|
||||
{
|
||||
if (mve_audio_canplay) {
|
||||
#ifdef USE_OPENAL
|
||||
ALint status, bqueued;
|
||||
|
||||
OpenAL_ErrorCheck( alGetSourcei(mas->source_id, AL_SOURCE_STATE, &status), return );
|
||||
@@ -301,7 +296,6 @@ void mve_audio_play()
|
||||
if (status != AL_PLAYING && bqueued > 0) {
|
||||
OpenAL_ErrorPrint( alSourcePlay(mas->source_id) );
|
||||
}
|
||||
#endif // USE_OPENAL
|
||||
}
|
||||
}
|
||||
|
||||
@@ -311,7 +305,6 @@ static void mve_audio_stop()
|
||||
if (!audiobuf_created)
|
||||
return;
|
||||
|
||||
#ifdef USE_OPENAL
|
||||
ALint p = 0;
|
||||
|
||||
mve_audio_playing = 0;
|
||||
@@ -332,7 +325,6 @@ static void mve_audio_stop()
|
||||
vm_free(mas);
|
||||
mas = NULL;
|
||||
}
|
||||
#endif // USE_OPENAL
|
||||
}
|
||||
|
||||
int mve_audio_data(ubyte major, ubyte *data)
|
||||
@@ -342,7 +334,6 @@ int mve_audio_data(ubyte major, ubyte *data)
|
||||
int nsamp;
|
||||
|
||||
if (mve_audio_canplay) {
|
||||
#ifdef USE_OPENAL
|
||||
chan = mve_get_ushort(data + 2);
|
||||
nsamp = mve_get_ushort(data + 4);
|
||||
|
||||
@@ -409,7 +400,6 @@ int mve_audio_data(ubyte major, ubyte *data)
|
||||
mprintf(("MVE: Buffer overrun: Queue full\n"));
|
||||
}
|
||||
}
|
||||
#endif // USE_OPENAL
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -678,8 +668,10 @@ int mve_video_init(ubyte *data)
|
||||
GL_state.SetAlphaBlendMode(ALPHA_BLEND_NONE);
|
||||
GL_state.SetZbufferType(ZBUFFER_TYPE_NONE);
|
||||
|
||||
GL_state.Texture.SetWrapS(GL_CLAMP_TO_EDGE);
|
||||
GL_state.Texture.SetWrapT(GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
// NOTE: using NULL instead of pixelbuf crashes some drivers, but then so does pixelbuf
|
||||
glTexImage2D(GL_state.Texture.GetTarget(), 0, GL_RGB5_A1, wp2, hp2, 0, GL_BGRA_EXT, GL_UNSIGNED_SHORT_1_5_5_5_REV, NULL);
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#include "io/key.h"
|
||||
#include "osapi/osapi.h"
|
||||
#include "sound/sound.h"
|
||||
#include "sound/ds.h"
|
||||
#include "sound/openal.h"
|
||||
#include "bmpman/bmpman.h"
|
||||
#include "cutscene/oggplayer.h"
|
||||
#include "io/timer.h"
|
||||
@@ -360,8 +360,10 @@ static void OGG_video_init(theora_info *tinfo)
|
||||
GL_state.SetAlphaBlendMode(ALPHA_BLEND_NONE);
|
||||
GL_state.SetZbufferType(ZBUFFER_TYPE_NONE);
|
||||
|
||||
GL_state.Texture.SetWrapS(GL_CLAMP_TO_EDGE);
|
||||
GL_state.Texture.SetWrapT(GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
// NOTE: using NULL instead of pixelbuf crashes some drivers, but then so does pixelbuf
|
||||
glTexImage2D(GL_state.Texture.GetTarget(), 0, GL_RGB8, wp2, hp2, 0, GL_BGR, GL_UNSIGNED_BYTE, NULL);
|
||||
|
||||
@@ -42,7 +42,7 @@ typedef struct debris {
|
||||
vec3d arc_pts[MAX_DEBRIS_ARCS][2]; // The endpoints of each arc
|
||||
int arc_timestamp[MAX_DEBRIS_ARCS]; // When this times out, the spark goes away. -1 is not used
|
||||
int arc_frequency; // Starts at 0, gets bigger
|
||||
char parent_alt_name;
|
||||
int parent_alt_name;
|
||||
float damage_mult;
|
||||
|
||||
} debris;
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,129 +0,0 @@
|
||||
//header file for making decals-Bobboau
|
||||
|
||||
|
||||
#ifndef _DECAL_H
|
||||
#define _DECAL_H
|
||||
|
||||
#include "object/object.h"
|
||||
#include "globalincs/pstypes.h"
|
||||
//#include "ship/ship.h"
|
||||
|
||||
#ifdef ENABLE_DECALS
|
||||
|
||||
#define MAX_DECAL_POLY 40
|
||||
#define MAX_DECAL_POLY_POINT 10
|
||||
#define MAX_DECAL_DEFPOINTS 10000
|
||||
#define MAX_DECAL_POINT 10
|
||||
#define MAX_SHIP_DECALS 25
|
||||
#define MAX_GLOBAL_DECAL_POLYS 11000
|
||||
#define QUICKFIND_SUBDIVISION 100
|
||||
#define QUICKFIND_SEGMENT_LENGTH (MAX_GLOBAL_DECAL_POLYS/QUICKFIND_SUBDIVISION)
|
||||
#define MAX_GLOBAL_DECALS 5000
|
||||
|
||||
#define DP_EOF 0
|
||||
#define DP_DEFPOINTS 1
|
||||
#define DP_FLATPOLY 2
|
||||
#define DP_TMAPPOLY 3
|
||||
#define DP_SORTNORM 4
|
||||
#define DP_BOUNDBOX 5
|
||||
|
||||
#endif // ENABLE_DECALS
|
||||
|
||||
struct decal;
|
||||
struct decal_list;
|
||||
struct decal_list_controle;
|
||||
|
||||
struct decal_poly{
|
||||
vec3d norm[3];
|
||||
vertex point[3];
|
||||
decal_poly *next;
|
||||
decal* parent;
|
||||
int idx;
|
||||
};
|
||||
|
||||
struct decal{
|
||||
int n_poly;
|
||||
int timestamp; //when this decal was created
|
||||
int burn_time; //how long it takes for the glow texture to fade
|
||||
int vertex_buffer_start; //were is the start of this decal's polys in the vertex buffer
|
||||
decal_poly* poly;
|
||||
decal_poly* add_poly();
|
||||
decal_poly* get_last_poly();
|
||||
void remove_last_poly();
|
||||
decal_list_controle *parent;
|
||||
};
|
||||
|
||||
struct decal_list{
|
||||
decal dec;
|
||||
decal_list *next;
|
||||
};
|
||||
|
||||
struct decal_item{
|
||||
decal_list dec;
|
||||
bool used;
|
||||
};
|
||||
|
||||
struct decal_list_controle{
|
||||
int n_decals;
|
||||
int buffer;
|
||||
int texture;
|
||||
int n_poly;
|
||||
int burn_texture;
|
||||
int glow_texture;
|
||||
bool modifyed;
|
||||
decal_list *d_list;
|
||||
decal_list *end;
|
||||
decal_list *add_new();
|
||||
void trim();
|
||||
void clear();
|
||||
~decal_list_controle();
|
||||
decal_list_controle();
|
||||
};
|
||||
|
||||
struct decal_system{
|
||||
decal_list_controle *decals;
|
||||
int n_decal_textures;
|
||||
bool decals_modified;
|
||||
int max_decals;
|
||||
decal_system():decals(NULL),n_decal_textures(0),decals_modified(false){};
|
||||
};
|
||||
|
||||
|
||||
//this is used to give all the data to the generation data to the functions that make them
|
||||
|
||||
struct decal_point{
|
||||
vec3d pnt;
|
||||
matrix orient;
|
||||
float radius;
|
||||
};
|
||||
|
||||
#ifdef ENABLE_DECALS
|
||||
|
||||
int decal_create(object * obj, decal_point *point, int subobject, int texture, int backfaced_texture = -1, int glow_texture = -1, int burn_texture = -1, int burn_time = 1000);//makes the decal
|
||||
|
||||
int decal_create_simple(object * obj, decal_point *point, int texture);//makes a simple non-clipped decal
|
||||
|
||||
void decal_render_all(object * obj); //renders all decals
|
||||
|
||||
int decal_create_sub(void *model_ptr);
|
||||
|
||||
void clear_decals(decal_system *system);
|
||||
|
||||
void init_decals();
|
||||
|
||||
#else // ENABLE_DECALS
|
||||
|
||||
inline int decal_create(object * obj, decal_point *point, int subobject, int texture, int backfaced_texture = -1, int glow_texture = -1, int burn_texture = -1, int burn_time = 1000)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define decal_create_simple(a, b, c) (0)
|
||||
#define decal_render_all(a)
|
||||
#define decal_create_sub(a) (0);
|
||||
#define clear_decals(a)
|
||||
#define init_decals()
|
||||
|
||||
#endif // ENABLE_DECALS
|
||||
|
||||
#endif // _DECAL_H
|
||||
@@ -1,864 +0,0 @@
|
||||
/*==========================================================================;
|
||||
*
|
||||
* Copyright (C) 1995,1996 Microsoft Corporation. All Rights Reserved.
|
||||
*
|
||||
* File: dsound.h
|
||||
* Content: DirectSound include file
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#ifndef __DSOUND_INCLUDED__
|
||||
#define __DSOUND_INCLUDED__
|
||||
|
||||
#include "directx/vd3dtypes.h"
|
||||
|
||||
#define COM_NO_WINDOWS_H
|
||||
#include <objbase.h>
|
||||
|
||||
#define _FACDS 0x878
|
||||
#define MAKE_DSHRESULT(code) MAKE_HRESULT(1, _FACDS, code)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
|
||||
// Direct Sound Component GUID {47D4D946-62E8-11cf-93BC-444553540000}
|
||||
DEFINE_GUID(CLSID_DirectSound, 0x47d4d946, 0x62e8, 0x11cf, 0x93, 0xbc, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0);
|
||||
|
||||
// DirectSound Capture Component GUID {B0210780-89CD-11d0-AF08-00A0C925CD16}
|
||||
DEFINE_GUID(CLSID_DirectSoundCapture, 0xb0210780, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16);
|
||||
|
||||
//
|
||||
// Structures
|
||||
//
|
||||
|
||||
#ifdef __cplusplus
|
||||
// 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined
|
||||
struct IDirectSound;
|
||||
struct IDirectSoundBuffer;
|
||||
struct IDirectSound3DListener;
|
||||
struct IDirectSound3DBuffer;
|
||||
struct IDirectSoundCapture;
|
||||
struct IDirectSoundCaptureBuffer;
|
||||
struct IDirectSoundNotify;
|
||||
#endif // __cplusplus
|
||||
|
||||
typedef struct IDirectSound *LPDIRECTSOUND;
|
||||
typedef struct IDirectSoundBuffer *LPDIRECTSOUNDBUFFER;
|
||||
typedef struct IDirectSound3DListener *LPDIRECTSOUND3DLISTENER;
|
||||
typedef struct IDirectSound3DBuffer *LPDIRECTSOUND3DBUFFER;
|
||||
typedef struct IDirectSoundCapture *LPDIRECTSOUNDCAPTURE;
|
||||
typedef struct IDirectSoundCaptureBuffer *LPDIRECTSOUNDCAPTUREBUFFER;
|
||||
typedef struct IDirectSoundNotify *LPDIRECTSOUNDNOTIFY;
|
||||
|
||||
typedef struct _DSCAPS
|
||||
{
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
DWORD dwMinSecondarySampleRate;
|
||||
DWORD dwMaxSecondarySampleRate;
|
||||
DWORD dwPrimaryBuffers;
|
||||
DWORD dwMaxHwMixingAllBuffers;
|
||||
DWORD dwMaxHwMixingStaticBuffers;
|
||||
DWORD dwMaxHwMixingStreamingBuffers;
|
||||
DWORD dwFreeHwMixingAllBuffers;
|
||||
DWORD dwFreeHwMixingStaticBuffers;
|
||||
DWORD dwFreeHwMixingStreamingBuffers;
|
||||
DWORD dwMaxHw3DAllBuffers;
|
||||
DWORD dwMaxHw3DStaticBuffers;
|
||||
DWORD dwMaxHw3DStreamingBuffers;
|
||||
DWORD dwFreeHw3DAllBuffers;
|
||||
DWORD dwFreeHw3DStaticBuffers;
|
||||
DWORD dwFreeHw3DStreamingBuffers;
|
||||
DWORD dwTotalHwMemBytes;
|
||||
DWORD dwFreeHwMemBytes;
|
||||
DWORD dwMaxContigFreeHwMemBytes;
|
||||
DWORD dwUnlockTransferRateHwBuffers;
|
||||
DWORD dwPlayCpuOverheadSwBuffers;
|
||||
DWORD dwReserved1;
|
||||
DWORD dwReserved2;
|
||||
} DSCAPS, *LPDSCAPS;
|
||||
|
||||
typedef const DSCAPS *LPCDSCAPS;
|
||||
|
||||
typedef struct _DSBCAPS
|
||||
{
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
DWORD dwBufferBytes;
|
||||
DWORD dwUnlockTransferRate;
|
||||
DWORD dwPlayCpuOverhead;
|
||||
} DSBCAPS, *LPDSBCAPS;
|
||||
|
||||
typedef const DSBCAPS *LPCDSBCAPS;
|
||||
|
||||
typedef struct _DSBUFFERDESC
|
||||
{
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
DWORD dwBufferBytes;
|
||||
DWORD dwReserved;
|
||||
LPWAVEFORMATEX lpwfxFormat;
|
||||
} DSBUFFERDESC, *LPDSBUFFERDESC;
|
||||
|
||||
typedef const DSBUFFERDESC *LPCDSBUFFERDESC;
|
||||
|
||||
typedef struct _DS3DBUFFER
|
||||
{
|
||||
DWORD dwSize;
|
||||
D3DVECTOR vPosition;
|
||||
D3DVECTOR vVelocity;
|
||||
DWORD dwInsideConeAngle;
|
||||
DWORD dwOutsideConeAngle;
|
||||
D3DVECTOR vConeOrientation;
|
||||
LONG lConeOutsideVolume;
|
||||
D3DVALUE flMinDistance;
|
||||
D3DVALUE flMaxDistance;
|
||||
DWORD dwMode;
|
||||
} DS3DBUFFER, *LPDS3DBUFFER;
|
||||
|
||||
typedef const DS3DBUFFER *LPCDS3DBUFFER;
|
||||
|
||||
typedef struct _DS3DLISTENER
|
||||
{
|
||||
DWORD dwSize;
|
||||
D3DVECTOR vPosition;
|
||||
D3DVECTOR vVelocity;
|
||||
D3DVECTOR vOrientFront;
|
||||
D3DVECTOR vOrientTop;
|
||||
D3DVALUE flDistanceFactor;
|
||||
D3DVALUE flRolloffFactor;
|
||||
D3DVALUE flDopplerFactor;
|
||||
} DS3DLISTENER, *LPDS3DLISTENER;
|
||||
|
||||
typedef const DS3DLISTENER *LPCDS3DLISTENER;
|
||||
|
||||
typedef struct _DSCCAPS
|
||||
{
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
DWORD dwFormats;
|
||||
DWORD dwChannels;
|
||||
} DSCCAPS, *LPDSCCAPS;
|
||||
|
||||
typedef const DSCCAPS *LPCDSCCAPS;
|
||||
|
||||
typedef struct _DSCBUFFERDESC
|
||||
{
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
DWORD dwBufferBytes;
|
||||
DWORD dwReserved;
|
||||
LPWAVEFORMATEX lpwfxFormat;
|
||||
} DSCBUFFERDESC, *LPDSCBUFFERDESC;
|
||||
|
||||
typedef const DSCBUFFERDESC *LPCDSCBUFFERDESC;
|
||||
|
||||
typedef struct _DSCBCAPS
|
||||
{
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
DWORD dwBufferBytes;
|
||||
DWORD dwReserved;
|
||||
} DSCBCAPS, *LPDSCBCAPS;
|
||||
|
||||
typedef const DSCBCAPS *LPCDSCBCAPS;
|
||||
|
||||
typedef struct _DSBPOSITIONNOTIFY
|
||||
{
|
||||
DWORD dwOffset;
|
||||
HANDLE hEventNotify;
|
||||
} DSBPOSITIONNOTIFY, *LPDSBPOSITIONNOTIFY;
|
||||
|
||||
typedef const DSBPOSITIONNOTIFY *LPCDSBPOSITIONNOTIFY;
|
||||
|
||||
//
|
||||
// Compatibility typedefs
|
||||
//
|
||||
|
||||
typedef LPDIRECTSOUND *LPLPDIRECTSOUND;
|
||||
typedef LPDIRECTSOUNDBUFFER *LPLPDIRECTSOUNDBUFFER;
|
||||
typedef LPDIRECTSOUND3DLISTENER *LPLPDIRECTSOUND3DLISTENER;
|
||||
typedef LPDIRECTSOUND3DBUFFER *LPLPDIRECTSOUND3DBUFFER;
|
||||
typedef LPDIRECTSOUNDCAPTURE *LPLPDIRECTSOUNDCAPTURE;
|
||||
typedef LPDIRECTSOUNDCAPTUREBUFFER *LPLPDIRECTSOUNDCAPTUREBUFFER;
|
||||
typedef LPDIRECTSOUNDNOTIFY *LPLPDIRECTSOUNDNOTIFY;
|
||||
typedef LPVOID *LPLPVOID;
|
||||
typedef const WAVEFORMATEX *LPCWAVEFORMATEX;
|
||||
|
||||
//
|
||||
// DirectSound API
|
||||
//
|
||||
|
||||
typedef BOOL (CALLBACK *LPDSENUMCALLBACKW)(LPGUID, LPCWSTR, LPCWSTR, LPVOID);
|
||||
typedef BOOL (CALLBACK *LPDSENUMCALLBACKA)(LPGUID, LPCSTR, LPCSTR, LPVOID);
|
||||
|
||||
extern HRESULT WINAPI DirectSoundCreate(LPGUID, LPDIRECTSOUND *, LPUNKNOWN);
|
||||
extern HRESULT WINAPI DirectSoundEnumerateW(LPDSENUMCALLBACKW, LPVOID);
|
||||
extern HRESULT WINAPI DirectSoundEnumerateA(LPDSENUMCALLBACKA, LPVOID);
|
||||
|
||||
extern HRESULT WINAPI DirectSoundCaptureCreate(LPGUID, LPDIRECTSOUNDCAPTURE *, LPUNKNOWN);
|
||||
extern HRESULT WINAPI DirectSoundCaptureEnumerateW(LPDSENUMCALLBACKW, LPVOID);
|
||||
extern HRESULT WINAPI DirectSoundCaptureEnumerateA(LPDSENUMCALLBACKA, LPVOID);
|
||||
|
||||
#ifdef UNICODE
|
||||
#define LPDSENUMCALLBACK LPDSENUMCALLBACKW
|
||||
#define DirectSoundEnumerate DirectSoundEnumerateW
|
||||
#define DirectSoundCaptureEnumerate DirectSoundCaptureEnumerateW
|
||||
#else // UNICODE
|
||||
#define LPDSENUMCALLBACK LPDSENUMCALLBACKA
|
||||
#define DirectSoundEnumerate DirectSoundEnumerateA
|
||||
#define DirectSoundCaptureEnumerate DirectSoundCaptureEnumerateA
|
||||
#endif // UNICODE
|
||||
|
||||
//
|
||||
// IDirectSound
|
||||
//
|
||||
|
||||
DEFINE_GUID(IID_IDirectSound, 0x279AFA83, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectSound
|
||||
|
||||
DECLARE_INTERFACE_(IDirectSound, IUnknown)
|
||||
{
|
||||
// IUnknown methods
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
|
||||
// IDirectSound methods
|
||||
STDMETHOD(CreateSoundBuffer) (THIS_ LPCDSBUFFERDESC, LPDIRECTSOUNDBUFFER *, LPUNKNOWN) PURE;
|
||||
STDMETHOD(GetCaps) (THIS_ LPDSCAPS) PURE;
|
||||
STDMETHOD(DuplicateSoundBuffer) (THIS_ LPDIRECTSOUNDBUFFER, LPDIRECTSOUNDBUFFER *) PURE;
|
||||
STDMETHOD(SetCooperativeLevel) (THIS_ HWND, DWORD) PURE;
|
||||
STDMETHOD(Compact) (THIS) PURE;
|
||||
STDMETHOD(GetSpeakerConfig) (THIS_ LPDWORD) PURE;
|
||||
STDMETHOD(SetSpeakerConfig) (THIS_ DWORD) PURE;
|
||||
STDMETHOD(Initialize) (THIS_ LPGUID) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSound_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||
#define IDirectSound_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirectSound_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirectSound_CreateSoundBuffer(p,a,b,c) (p)->lpVtbl->CreateSoundBuffer(p,a,b,c)
|
||||
#define IDirectSound_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a)
|
||||
#define IDirectSound_DuplicateSoundBuffer(p,a,b) (p)->lpVtbl->DuplicateSoundBuffer(p,a,b)
|
||||
#define IDirectSound_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b)
|
||||
#define IDirectSound_Compact(p) (p)->lpVtbl->Compact(p)
|
||||
#define IDirectSound_GetSpeakerConfig(p,a) (p)->lpVtbl->GetSpeakerConfig(p,a)
|
||||
#define IDirectSound_SetSpeakerConfig(p,b) (p)->lpVtbl->SetSpeakerConfig(p,b)
|
||||
#define IDirectSound_Initialize(p,a) (p)->lpVtbl->Initialize(p,a)
|
||||
#else // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSound_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
|
||||
#define IDirectSound_AddRef(p) (p)->AddRef()
|
||||
#define IDirectSound_Release(p) (p)->Release()
|
||||
#define IDirectSound_CreateSoundBuffer(p,a,b,c) (p)->CreateSoundBuffer(a,b,c)
|
||||
#define IDirectSound_GetCaps(p,a) (p)->GetCaps(a)
|
||||
#define IDirectSound_DuplicateSoundBuffer(p,a,b) (p)->DuplicateSoundBuffer(a,b)
|
||||
#define IDirectSound_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b)
|
||||
#define IDirectSound_Compact(p) (p)->Compact()
|
||||
#define IDirectSound_GetSpeakerConfig(p,a) (p)->GetSpeakerConfig(a)
|
||||
#define IDirectSound_SetSpeakerConfig(p,b) (p)->SetSpeakerConfig(b)
|
||||
#define IDirectSound_Initialize(p,a) (p)->Initialize(a)
|
||||
#endif // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
|
||||
//
|
||||
// IDirectSoundBuffer
|
||||
//
|
||||
|
||||
DEFINE_GUID(IID_IDirectSoundBuffer, 0x279AFA85, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectSoundBuffer
|
||||
|
||||
DECLARE_INTERFACE_(IDirectSoundBuffer, IUnknown)
|
||||
{
|
||||
// IUnknown methods
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
|
||||
// IDirectSoundBuffer methods
|
||||
STDMETHOD(GetCaps) (THIS_ LPDSBCAPS) PURE;
|
||||
STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD, LPDWORD) PURE;
|
||||
STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX, DWORD, LPDWORD) PURE;
|
||||
STDMETHOD(GetVolume) (THIS_ LPLONG) PURE;
|
||||
STDMETHOD(GetPan) (THIS_ LPLONG) PURE;
|
||||
STDMETHOD(GetFrequency) (THIS_ LPDWORD) PURE;
|
||||
STDMETHOD(GetStatus) (THIS_ LPDWORD) PURE;
|
||||
STDMETHOD(Initialize) (THIS_ LPDIRECTSOUND, LPCDSBUFFERDESC) PURE;
|
||||
STDMETHOD(Lock) (THIS_ DWORD, DWORD, LPVOID *, LPDWORD, LPVOID *, LPDWORD, DWORD) PURE;
|
||||
STDMETHOD(Play) (THIS_ DWORD, DWORD, DWORD) PURE;
|
||||
STDMETHOD(SetCurrentPosition) (THIS_ DWORD) PURE;
|
||||
STDMETHOD(SetFormat) (THIS_ LPCWAVEFORMATEX) PURE;
|
||||
STDMETHOD(SetVolume) (THIS_ LONG) PURE;
|
||||
STDMETHOD(SetPan) (THIS_ LONG) PURE;
|
||||
STDMETHOD(SetFrequency) (THIS_ DWORD) PURE;
|
||||
STDMETHOD(Stop) (THIS) PURE;
|
||||
STDMETHOD(Unlock) (THIS_ LPVOID, DWORD, LPVOID, DWORD) PURE;
|
||||
STDMETHOD(Restore) (THIS) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSoundBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||
#define IDirectSoundBuffer_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirectSoundBuffer_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirectSoundBuffer_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a)
|
||||
#define IDirectSoundBuffer_GetCurrentPosition(p,a,b) (p)->lpVtbl->GetCurrentPosition(p,a,b)
|
||||
#define IDirectSoundBuffer_GetFormat(p,a,b,c) (p)->lpVtbl->GetFormat(p,a,b,c)
|
||||
#define IDirectSoundBuffer_GetVolume(p,a) (p)->lpVtbl->GetVolume(p,a)
|
||||
#define IDirectSoundBuffer_GetPan(p,a) (p)->lpVtbl->GetPan(p,a)
|
||||
#define IDirectSoundBuffer_GetFrequency(p,a) (p)->lpVtbl->GetFrequency(p,a)
|
||||
#define IDirectSoundBuffer_GetStatus(p,a) (p)->lpVtbl->GetStatus(p,a)
|
||||
#define IDirectSoundBuffer_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b)
|
||||
#define IDirectSoundBuffer_Lock(p,a,b,c,d,e,f,g) (p)->lpVtbl->Lock(p,a,b,c,d,e,f,g)
|
||||
#define IDirectSoundBuffer_Play(p,a,b,c) (p)->lpVtbl->Play(p,a,b,c)
|
||||
#define IDirectSoundBuffer_SetCurrentPosition(p,a) (p)->lpVtbl->SetCurrentPosition(p,a)
|
||||
#define IDirectSoundBuffer_SetFormat(p,a) (p)->lpVtbl->SetFormat(p,a)
|
||||
#define IDirectSoundBuffer_SetVolume(p,a) (p)->lpVtbl->SetVolume(p,a)
|
||||
#define IDirectSoundBuffer_SetPan(p,a) (p)->lpVtbl->SetPan(p,a)
|
||||
#define IDirectSoundBuffer_SetFrequency(p,a) (p)->lpVtbl->SetFrequency(p,a)
|
||||
#define IDirectSoundBuffer_Stop(p) (p)->lpVtbl->Stop(p)
|
||||
#define IDirectSoundBuffer_Unlock(p,a,b,c,d) (p)->lpVtbl->Unlock(p,a,b,c,d)
|
||||
#define IDirectSoundBuffer_Restore(p) (p)->lpVtbl->Restore(p)
|
||||
#else // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSoundBuffer_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
|
||||
#define IDirectSoundBuffer_AddRef(p) (p)->AddRef()
|
||||
#define IDirectSoundBuffer_Release(p) (p)->Release()
|
||||
#define IDirectSoundBuffer_GetCaps(p,a) (p)->GetCaps(a)
|
||||
#define IDirectSoundBuffer_GetCurrentPosition(p,a,b) (p)->GetCurrentPosition(a,b)
|
||||
#define IDirectSoundBuffer_GetFormat(p,a,b,c) (p)->GetFormat(a,b,c)
|
||||
#define IDirectSoundBuffer_GetVolume(p,a) (p)->GetVolume(a)
|
||||
#define IDirectSoundBuffer_GetPan(p,a) (p)->GetPan(a)
|
||||
#define IDirectSoundBuffer_GetFrequency(p,a) (p)->GetFrequency(a)
|
||||
#define IDirectSoundBuffer_GetStatus(p,a) (p)->GetStatus(a)
|
||||
#define IDirectSoundBuffer_Initialize(p,a,b) (p)->Initialize(a,b)
|
||||
#define IDirectSoundBuffer_Lock(p,a,b,c,d,e,f,g) (p)->Lock(a,b,c,d,e,f,g)
|
||||
#define IDirectSoundBuffer_Play(p,a,b,c) (p)->Play(a,b,c)
|
||||
#define IDirectSoundBuffer_SetCurrentPosition(p,a) (p)->SetCurrentPosition(a)
|
||||
#define IDirectSoundBuffer_SetFormat(p,a) (p)->SetFormat(a)
|
||||
#define IDirectSoundBuffer_SetVolume(p,a) (p)->SetVolume(a)
|
||||
#define IDirectSoundBuffer_SetPan(p,a) (p)->SetPan(a)
|
||||
#define IDirectSoundBuffer_SetFrequency(p,a) (p)->SetFrequency(a)
|
||||
#define IDirectSoundBuffer_Stop(p) (p)->Stop()
|
||||
#define IDirectSoundBuffer_Unlock(p,a,b,c,d) (p)->Unlock(a,b,c,d)
|
||||
#define IDirectSoundBuffer_Restore(p) (p)->Restore()
|
||||
#endif // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
|
||||
//
|
||||
// IDirectSound3DListener
|
||||
//
|
||||
|
||||
DEFINE_GUID(IID_IDirectSound3DListener, 0x279AFA84, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectSound3DListener
|
||||
|
||||
DECLARE_INTERFACE_(IDirectSound3DListener, IUnknown)
|
||||
{
|
||||
// IUnknown methods
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
|
||||
// IDirectSound3D methods
|
||||
STDMETHOD(GetAllParameters) (THIS_ LPDS3DLISTENER) PURE;
|
||||
STDMETHOD(GetDistanceFactor) (THIS_ LPD3DVALUE) PURE;
|
||||
STDMETHOD(GetDopplerFactor) (THIS_ LPD3DVALUE) PURE;
|
||||
STDMETHOD(GetOrientation) (THIS_ LPD3DVECTOR, LPD3DVECTOR) PURE;
|
||||
STDMETHOD(GetPosition) (THIS_ LPD3DVECTOR) PURE;
|
||||
STDMETHOD(GetRolloffFactor) (THIS_ LPD3DVALUE) PURE;
|
||||
STDMETHOD(GetVelocity) (THIS_ LPD3DVECTOR) PURE;
|
||||
STDMETHOD(SetAllParameters) (THIS_ LPCDS3DLISTENER, DWORD) PURE;
|
||||
STDMETHOD(SetDistanceFactor) (THIS_ D3DVALUE, DWORD) PURE;
|
||||
STDMETHOD(SetDopplerFactor) (THIS_ D3DVALUE, DWORD) PURE;
|
||||
STDMETHOD(SetOrientation) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
|
||||
STDMETHOD(SetPosition) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
|
||||
STDMETHOD(SetRolloffFactor) (THIS_ D3DVALUE, DWORD) PURE;
|
||||
STDMETHOD(SetVelocity) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
|
||||
STDMETHOD(CommitDeferredSettings) (THIS) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSound3DListener_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||
#define IDirectSound3DListener_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirectSound3DListener_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirectSound3DListener_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a)
|
||||
#define IDirectSound3DListener_GetDistanceFactor(p,a) (p)->lpVtbl->GetDistanceFactor(p,a)
|
||||
#define IDirectSound3DListener_GetDopplerFactor(p,a) (p)->lpVtbl->GetDopplerFactor(p,a)
|
||||
#define IDirectSound3DListener_GetOrientation(p,a,b) (p)->lpVtbl->GetOrientation(p,a,b)
|
||||
#define IDirectSound3DListener_GetPosition(p,a) (p)->lpVtbl->GetPosition(p,a)
|
||||
#define IDirectSound3DListener_GetRolloffFactor(p,a) (p)->lpVtbl->GetRolloffFactor(p,a)
|
||||
#define IDirectSound3DListener_GetVelocity(p,a) (p)->lpVtbl->GetVelocity(p,a)
|
||||
#define IDirectSound3DListener_SetAllParameters(p,a,b) (p)->lpVtbl->SetAllParameters(p,a,b)
|
||||
#define IDirectSound3DListener_SetDistanceFactor(p,a,b) (p)->lpVtbl->SetDistanceFactor(p,a,b)
|
||||
#define IDirectSound3DListener_SetDopplerFactor(p,a,b) (p)->lpVtbl->SetDopplerFactor(p,a,b)
|
||||
#define IDirectSound3DListener_SetOrientation(p,a,b,c,d,e,f,g) (p)->lpVtbl->SetOrientation(p,a,b,c,d,e,f,g)
|
||||
#define IDirectSound3DListener_SetPosition(p,a,b,c,d) (p)->lpVtbl->SetPosition(p,a,b,c,d)
|
||||
#define IDirectSound3DListener_SetRolloffFactor(p,a,b) (p)->lpVtbl->SetRolloffFactor(p,a,b)
|
||||
#define IDirectSound3DListener_SetVelocity(p,a,b,c,d) (p)->lpVtbl->SetVelocity(p,a,b,c,d)
|
||||
#define IDirectSound3DListener_CommitDeferredSettings(p) (p)->lpVtbl->CommitDeferredSettings(p)
|
||||
#else // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSound3DListener_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
|
||||
#define IDirectSound3DListener_AddRef(p) (p)->AddRef()
|
||||
#define IDirectSound3DListener_Release(p) (p)->Release()
|
||||
#define IDirectSound3DListener_GetAllParameters(p,a) (p)->GetAllParameters(a)
|
||||
#define IDirectSound3DListener_GetDistanceFactor(p,a) (p)->GetDistanceFactor(a)
|
||||
#define IDirectSound3DListener_GetDopplerFactor(p,a) (p)->GetDopplerFactor(a)
|
||||
#define IDirectSound3DListener_GetOrientation(p,a,b) (p)->GetOrientation(a,b)
|
||||
#define IDirectSound3DListener_GetPosition(p,a) (p)->GetPosition(a)
|
||||
#define IDirectSound3DListener_GetRolloffFactor(p,a) (p)->GetRolloffFactor(a)
|
||||
#define IDirectSound3DListener_GetVelocity(p,a) (p)->GetVelocity(a)
|
||||
#define IDirectSound3DListener_SetAllParameters(p,a,b) (p)->SetAllParameters(a,b)
|
||||
#define IDirectSound3DListener_SetDistanceFactor(p,a,b) (p)->SetDistanceFactor(a,b)
|
||||
#define IDirectSound3DListener_SetDopplerFactor(p,a,b) (p)->SetDopplerFactor(a,b)
|
||||
#define IDirectSound3DListener_SetOrientation(p,a,b,c,d,e,f,g) (p)->SetOrientation(a,b,c,d,e,f,g)
|
||||
#define IDirectSound3DListener_SetPosition(p,a,b,c,d) (p)->SetPosition(a,b,c,d)
|
||||
#define IDirectSound3DListener_SetRolloffFactor(p,a,b) (p)->SetRolloffFactor(a,b)
|
||||
#define IDirectSound3DListener_SetVelocity(p,a,b,c,d) (p)->SetVelocity(a,b,c,d)
|
||||
#define IDirectSound3DListener_CommitDeferredSettings(p) (p)->CommitDeferredSettings()
|
||||
#endif // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
|
||||
//
|
||||
// IDirectSound3DBuffer
|
||||
//
|
||||
|
||||
DEFINE_GUID(IID_IDirectSound3DBuffer, 0x279AFA86, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectSound3DBuffer
|
||||
|
||||
DECLARE_INTERFACE_(IDirectSound3DBuffer, IUnknown)
|
||||
{
|
||||
// IUnknown methods
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
|
||||
// IDirectSoundBuffer3D methods
|
||||
STDMETHOD(GetAllParameters) (THIS_ LPDS3DBUFFER) PURE;
|
||||
STDMETHOD(GetConeAngles) (THIS_ LPDWORD, LPDWORD) PURE;
|
||||
STDMETHOD(GetConeOrientation) (THIS_ LPD3DVECTOR) PURE;
|
||||
STDMETHOD(GetConeOutsideVolume) (THIS_ LPLONG) PURE;
|
||||
STDMETHOD(GetMaxDistance) (THIS_ LPD3DVALUE) PURE;
|
||||
STDMETHOD(GetMinDistance) (THIS_ LPD3DVALUE) PURE;
|
||||
STDMETHOD(GetMode) (THIS_ LPDWORD) PURE;
|
||||
STDMETHOD(GetPosition) (THIS_ LPD3DVECTOR) PURE;
|
||||
STDMETHOD(GetVelocity) (THIS_ LPD3DVECTOR) PURE;
|
||||
STDMETHOD(SetAllParameters) (THIS_ LPCDS3DBUFFER, DWORD) PURE;
|
||||
STDMETHOD(SetConeAngles) (THIS_ DWORD, DWORD, DWORD) PURE;
|
||||
STDMETHOD(SetConeOrientation) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
|
||||
STDMETHOD(SetConeOutsideVolume) (THIS_ LONG, DWORD) PURE;
|
||||
STDMETHOD(SetMaxDistance) (THIS_ D3DVALUE, DWORD) PURE;
|
||||
STDMETHOD(SetMinDistance) (THIS_ D3DVALUE, DWORD) PURE;
|
||||
STDMETHOD(SetMode) (THIS_ DWORD, DWORD) PURE;
|
||||
STDMETHOD(SetPosition) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
|
||||
STDMETHOD(SetVelocity) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSound3DBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||
#define IDirectSound3DBuffer_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirectSound3DBuffer_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirectSound3DBuffer_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a)
|
||||
#define IDirectSound3DBuffer_GetConeAngles(p,a,b) (p)->lpVtbl->GetConeAngles(p,a,b)
|
||||
#define IDirectSound3DBuffer_GetConeOrientation(p,a) (p)->lpVtbl->GetConeOrientation(p,a)
|
||||
#define IDirectSound3DBuffer_GetConeOutsideVolume(p,a) (p)->lpVtbl->GetConeOutsideVolume(p,a)
|
||||
#define IDirectSound3DBuffer_GetPosition(p,a) (p)->lpVtbl->GetPosition(p,a)
|
||||
#define IDirectSound3DBuffer_GetMinDistance(p,a) (p)->lpVtbl->GetMinDistance(p,a)
|
||||
#define IDirectSound3DBuffer_GetMaxDistance(p,a) (p)->lpVtbl->GetMaxDistance(p,a)
|
||||
#define IDirectSound3DBuffer_GetMode(p,a) (p)->lpVtbl->GetMode(p,a)
|
||||
#define IDirectSound3DBuffer_GetVelocity(p,a) (p)->lpVtbl->GetVelocity(p,a)
|
||||
#define IDirectSound3DBuffer_SetAllParameters(p,a,b) (p)->lpVtbl->SetAllParameters(p,a,b)
|
||||
#define IDirectSound3DBuffer_SetConeAngles(p,a,b,c) (p)->lpVtbl->SetConeAngles(p,a,b,c)
|
||||
#define IDirectSound3DBuffer_SetConeOrientation(p,a,b,c,d) (p)->lpVtbl->SetConeOrientation(p,a,b,c,d)
|
||||
#define IDirectSound3DBuffer_SetConeOutsideVolume(p,a,b)(p)->lpVtbl->SetConeOutsideVolume(p,a,b)
|
||||
#define IDirectSound3DBuffer_SetPosition(p,a,b,c,d) (p)->lpVtbl->SetPosition(p,a,b,c,d)
|
||||
#define IDirectSound3DBuffer_SetMinDistance(p,a,b) (p)->lpVtbl->SetMinDistance(p,a,b)
|
||||
#define IDirectSound3DBuffer_SetMaxDistance(p,a,b) (p)->lpVtbl->SetMaxDistance(p,a,b)
|
||||
#define IDirectSound3DBuffer_SetMode(p,a,b) (p)->lpVtbl->SetMode(p,a,b)
|
||||
#define IDirectSound3DBuffer_SetVelocity(p,a,b,c,d) (p)->lpVtbl->SetVelocity(p,a,b,c,d)
|
||||
#else // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSound3DBuffer_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
|
||||
#define IDirectSound3DBuffer_AddRef(p) (p)->AddRef()
|
||||
#define IDirectSound3DBuffer_Release(p) (p)->Release()
|
||||
#define IDirectSound3DBuffer_GetAllParameters(p,a) (p)->GetAllParameters(a)
|
||||
#define IDirectSound3DBuffer_GetConeAngles(p,a,b) (p)->GetConeAngles(a,b)
|
||||
#define IDirectSound3DBuffer_GetConeOrientation(p,a) (p)->GetConeOrientation(a)
|
||||
#define IDirectSound3DBuffer_GetConeOutsideVolume(p,a) (p)->GetConeOutsideVolume(a)
|
||||
#define IDirectSound3DBuffer_GetPosition(p,a) (p)->GetPosition(a)
|
||||
#define IDirectSound3DBuffer_GetMinDistance(p,a) (p)->GetMinDistance(a)
|
||||
#define IDirectSound3DBuffer_GetMaxDistance(p,a) (p)->GetMaxDistance(a)
|
||||
#define IDirectSound3DBuffer_GetMode(p,a) (p)->GetMode(a)
|
||||
#define IDirectSound3DBuffer_GetVelocity(p,a) (p)->GetVelocity(a)
|
||||
#define IDirectSound3DBuffer_SetAllParameters(p,a,b) (p)->SetAllParameters(a,b)
|
||||
#define IDirectSound3DBuffer_SetConeAngles(p,a,b,c) (p)->SetConeAngles(a,b,c)
|
||||
#define IDirectSound3DBuffer_SetConeOrientation(p,a,b,c,d) (p)->SetConeOrientation(a,b,c,d)
|
||||
#define IDirectSound3DBuffer_SetConeOutsideVolume(p,a,b)(p)->SetConeOutsideVolume(a,b)
|
||||
#define IDirectSound3DBuffer_SetPosition(p,a,b,c,d) (p)->SetPosition(a,b,c,d)
|
||||
#define IDirectSound3DBuffer_SetMinDistance(p,a,b) (p)->SetMinDistance(a,b)
|
||||
#define IDirectSound3DBuffer_SetMaxDistance(p,a,b) (p)->SetMaxDistance(a,b)
|
||||
#define IDirectSound3DBuffer_SetMode(p,a,b) (p)->SetMode(a,b)
|
||||
#define IDirectSound3DBuffer_SetVelocity(p,a,b,c,d) (p)->SetVelocity(a,b,c,d)
|
||||
#endif // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
|
||||
//
|
||||
// IDirectSoundCapture
|
||||
//
|
||||
|
||||
DEFINE_GUID(IID_IDirectSoundCapture, 0xb0210781, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectSoundCapture
|
||||
|
||||
DECLARE_INTERFACE_(IDirectSoundCapture, IUnknown)
|
||||
{
|
||||
// IUnknown methods
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
|
||||
// IDirectSoundCapture methods
|
||||
STDMETHOD(CreateCaptureBuffer) (THIS_ LPCDSCBUFFERDESC, LPDIRECTSOUNDCAPTUREBUFFER *, LPUNKNOWN) PURE;
|
||||
STDMETHOD(GetCaps) (THIS_ LPDSCCAPS ) PURE;
|
||||
STDMETHOD(Initialize) (THIS_ LPGUID) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSoundCapture_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||
#define IDirectSoundCapture_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirectSoundCapture_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirectSoundCapture_CreateCaptureBuffer(p,a,b,c) (p)->lpVtbl->CreateCaptureBuffer(p,a,b,c)
|
||||
#define IDirectSoundCapture_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a)
|
||||
#define IDirectSoundCapture_Initialize(p,a) (p)->lpVtbl->Initialize(p,a)
|
||||
#else // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSoundCapture_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
|
||||
#define IDirectSoundCapture_AddRef(p) (p)->AddRef()
|
||||
#define IDirectSoundCapture_Release(p) (p)->Release()
|
||||
#define IDirectSoundCapture_CreateCaptureBuffer(p,a,b,c) (p)->CreateCaptureBuffer(a,b,c)
|
||||
#define IDirectSoundCapture_GetCaps(p,a) (p)->GetCaps(a)
|
||||
#define IDirectSoundCapture_Initialize(p,a) (p)->Initialize(a)
|
||||
#endif // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
|
||||
//
|
||||
// IDirectSoundCaptureBuffer
|
||||
//
|
||||
|
||||
DEFINE_GUID(IID_IDirectSoundCaptureBuffer, 0xb0210782, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectSoundCaptureBuffer
|
||||
|
||||
DECLARE_INTERFACE_(IDirectSoundCaptureBuffer, IUnknown)
|
||||
{
|
||||
// IUnknown methods
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
|
||||
// IDirectSoundCaptureBuffer methods
|
||||
STDMETHOD(GetCaps) (THIS_ LPDSCBCAPS ) PURE;
|
||||
STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD, LPDWORD ) PURE;
|
||||
STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX, DWORD, LPDWORD ) PURE;
|
||||
STDMETHOD(GetStatus) (THIS_ LPDWORD ) PURE;
|
||||
STDMETHOD(Initialize) (THIS_ LPDIRECTSOUNDCAPTURE, LPCDSCBUFFERDESC) PURE;
|
||||
STDMETHOD(Lock) (THIS_ DWORD, DWORD, LPVOID *, LPDWORD, LPVOID *, LPDWORD, DWORD) PURE;
|
||||
STDMETHOD(Start) (THIS_ DWORD) PURE;
|
||||
STDMETHOD(Stop) (THIS) PURE;
|
||||
STDMETHOD(Unlock) (THIS_ LPVOID, DWORD, LPVOID, DWORD) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSoundCaptureBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||
#define IDirectSoundCaptureBuffer_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirectSoundCaptureBuffer_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirectSoundCaptureBuffer_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a)
|
||||
#define IDirectSoundCaptureBuffer_GetCurrentPosition(p,a,b) (p)->lpVtbl->GetCurrentPosition(p,a,b)
|
||||
#define IDirectSoundCaptureBuffer_GetFormat(p,a,b,c) (p)->lpVtbl->GetFormat(p,a,b,c)
|
||||
#define IDirectSoundCaptureBuffer_GetStatus(p,a) (p)->lpVtbl->GetStatus(p,a)
|
||||
#define IDirectSoundCaptureBuffer_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b)
|
||||
#define IDirectSoundCaptureBuffer_Lock(p,a,b,c,d,e,f,g) (p)->lpVtbl->Lock(p,a,b,c,d,e,f,g)
|
||||
#define IDirectSoundCaptureBuffer_Start(p,a) (p)->lpVtbl->Start(p,a)
|
||||
#define IDirectSoundCaptureBuffer_Stop(p) (p)->lpVtbl->Stop(p)
|
||||
#define IDirectSoundCaptureBuffer_Unlock(p,a,b,c,d) (p)->lpVtbl->Unlock(p,a,b,c,d)
|
||||
#else // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSoundCaptureBuffer_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
|
||||
#define IDirectSoundCaptureBuffer_AddRef(p) (p)->AddRef()
|
||||
#define IDirectSoundCaptureBuffer_Release(p) (p)->Release()
|
||||
#define IDirectSoundCaptureBuffer_GetCaps(p,a) (p)->GetCaps(a)
|
||||
#define IDirectSoundCaptureBuffer_GetCurrentPosition(p,a,b) (p)->GetCurrentPosition(a,b)
|
||||
#define IDirectSoundCaptureBuffer_GetFormat(p,a,b,c) (p)->GetFormat(a,b,c)
|
||||
#define IDirectSoundCaptureBuffer_GetStatus(p,a) (p)->GetStatus(a)
|
||||
#define IDirectSoundCaptureBuffer_Initialize(p,a,b) (p)->Initialize(a,b)
|
||||
#define IDirectSoundCaptureBuffer_Lock(p,a,b,c,d,e,f,g) (p)->Lock(a,b,c,d,e,f,g)
|
||||
#define IDirectSoundCaptureBuffer_Start(p,a) (p)->Start(a)
|
||||
#define IDirectSoundCaptureBuffer_Stop(p) (p)->Stop()
|
||||
#define IDirectSoundCaptureBuffer_Unlock(p,a,b,c,d) (p)->Unlock(a,b,c,d)
|
||||
#endif // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
|
||||
//
|
||||
// IDirectSoundNotify
|
||||
//
|
||||
|
||||
DEFINE_GUID(IID_IDirectSoundNotify, 0xb0210783, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IDirectSoundNotify
|
||||
|
||||
DECLARE_INTERFACE_(IDirectSoundNotify, IUnknown)
|
||||
{
|
||||
// IUnknown methods
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
|
||||
// IDirectSoundNotify methods
|
||||
STDMETHOD(SetNotificationPositions) (THIS_ DWORD, LPCDSBPOSITIONNOTIFY) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSoundNotify_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||
#define IDirectSoundNotify_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IDirectSoundNotify_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IDirectSoundNotify_SetNotificationPositions(p,a,b) (p)->lpVtbl->SetNotificationPositions(p,a,b)
|
||||
#else // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IDirectSoundNotify_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
|
||||
#define IDirectSoundNotify_AddRef(p) (p)->AddRef()
|
||||
#define IDirectSoundNotify_Release(p) (p)->Release()
|
||||
#define IDirectSoundNotify_SetNotificationPositions(p,a,b) (p)->SetNotificationPositions(a,b)
|
||||
#endif // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
|
||||
//
|
||||
// IKsPropertySet
|
||||
//
|
||||
|
||||
#ifndef _IKsPropertySet_
|
||||
#define _IKsPropertySet_
|
||||
|
||||
#ifdef __cplusplus
|
||||
// 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined
|
||||
struct IKsPropertySet;
|
||||
#endif // __cplusplus
|
||||
|
||||
typedef struct IKsPropertySet *LPKSPROPERTYSET;
|
||||
|
||||
#define KSPROPERTY_SUPPORT_GET 0x00000001
|
||||
#define KSPROPERTY_SUPPORT_SET 0x00000002
|
||||
|
||||
DEFINE_GUID(IID_IKsPropertySet, 0x31efac30, 0x515c, 0x11d0, 0xa9, 0xaa, 0x00, 0xaa, 0x00, 0x61, 0xbe, 0x93);
|
||||
|
||||
#undef INTERFACE
|
||||
#define INTERFACE IKsPropertySet
|
||||
|
||||
DECLARE_INTERFACE_(IKsPropertySet, IUnknown)
|
||||
{
|
||||
// IUnknown methods
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
|
||||
// IKsPropertySet methods
|
||||
STDMETHOD(Get) (THIS_ REFGUID, ULONG, LPVOID, ULONG, LPVOID, ULONG, PULONG) PURE;
|
||||
STDMETHOD(Set) (THIS_ REFGUID, ULONG, LPVOID, ULONG, LPVOID, ULONG) PURE;
|
||||
STDMETHOD(QuerySupport) (THIS_ REFGUID, ULONG, PULONG) PURE;
|
||||
};
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IKsPropertySet_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
|
||||
#define IKsPropertySet_AddRef(p) (p)->lpVtbl->AddRef(p)
|
||||
#define IKsPropertySet_Release(p) (p)->lpVtbl->Release(p)
|
||||
#define IKsPropertySet_Get(p,a,b,c,d,e,f,g) (p)->lpVtbl->Get(p,a,b,c,d,e,f,g)
|
||||
#define IKsPropertySet_Set(p,a,b,c,d,e,f) (p)->lpVtbl->Set(p,a,b,c,d,e,f)
|
||||
#define IKsPropertySet_QuerySupport(p,a,b,c) (p)->lpVtbl->QuerySupport(p,a,b,c)
|
||||
#else // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define IKsPropertySet_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
|
||||
#define IKsPropertySet_AddRef(p) (p)->AddRef()
|
||||
#define IKsPropertySet_Release(p) (p)->Release()
|
||||
#define IKsPropertySet_Get(p,a,b,c,d,e,f,g) (p)->Get(a,b,c,d,e,f,g)
|
||||
#define IKsPropertySet_Set(p,a,b,c,d,e,f) (p)->Set(a,b,c,d,e,f)
|
||||
#define IKsPropertySet_QuerySupport(p,a,b,c) (p)->QuerySupport(a,b,c)
|
||||
#endif // !defined(__cplusplus) || defined(CINTERFACE)
|
||||
|
||||
#endif // _IKsPropertySet_
|
||||
|
||||
//
|
||||
// Return Codes
|
||||
//
|
||||
|
||||
#define DS_OK 0
|
||||
|
||||
// The call failed because resources (such as a priority level)
|
||||
// were already being used by another caller.
|
||||
#define DSERR_ALLOCATED MAKE_DSHRESULT(10)
|
||||
|
||||
// The control (vol,pan,etc.) requested by the caller is not available.
|
||||
#define DSERR_CONTROLUNAVAIL MAKE_DSHRESULT(30)
|
||||
|
||||
// An invalid parameter was passed to the returning function
|
||||
#define DSERR_INVALIDPARAM E_INVALIDARG
|
||||
|
||||
// This call is not valid for the current state of this object
|
||||
#define DSERR_INVALIDCALL MAKE_DSHRESULT(50)
|
||||
|
||||
// An undetermined error occured inside the DirectSound subsystem
|
||||
#define DSERR_GENERIC E_FAIL
|
||||
|
||||
// The caller does not have the priority level required for the function to
|
||||
// succeed.
|
||||
#define DSERR_PRIOLEVELNEEDED MAKE_DSHRESULT(70)
|
||||
|
||||
// Not enough free memory is available to complete the operation
|
||||
#define DSERR_OUTOFMEMORY E_OUTOFMEMORY
|
||||
|
||||
// The specified WAVE format is not supported
|
||||
#define DSERR_BADFORMAT MAKE_DSHRESULT(100)
|
||||
|
||||
// The function called is not supported at this time
|
||||
#define DSERR_UNSUPPORTED E_NOTIMPL
|
||||
|
||||
// No sound driver is available for use
|
||||
#define DSERR_NODRIVER MAKE_DSHRESULT(120)
|
||||
|
||||
// This object is already initialized
|
||||
#define DSERR_ALREADYINITIALIZED MAKE_DSHRESULT(130)
|
||||
|
||||
// This object does not support aggregation
|
||||
#define DSERR_NOAGGREGATION CLASS_E_NOAGGREGATION
|
||||
|
||||
// The buffer memory has been lost, and must be restored.
|
||||
#define DSERR_BUFFERLOST MAKE_DSHRESULT(150)
|
||||
|
||||
// Another app has a higher priority level, preventing this call from
|
||||
// succeeding.
|
||||
#define DSERR_OTHERAPPHASPRIO MAKE_DSHRESULT(160)
|
||||
|
||||
// This object has not been initialized
|
||||
#define DSERR_UNINITIALIZED MAKE_DSHRESULT(170)
|
||||
|
||||
// The requested COM interface is not available
|
||||
#define DSERR_NOINTERFACE E_NOINTERFACE
|
||||
|
||||
//
|
||||
// Flags
|
||||
//
|
||||
|
||||
#define DSCAPS_PRIMARYMONO 0x00000001
|
||||
#define DSCAPS_PRIMARYSTEREO 0x00000002
|
||||
#define DSCAPS_PRIMARY8BIT 0x00000004
|
||||
#define DSCAPS_PRIMARY16BIT 0x00000008
|
||||
#define DSCAPS_CONTINUOUSRATE 0x00000010
|
||||
#define DSCAPS_EMULDRIVER 0x00000020
|
||||
#define DSCAPS_CERTIFIED 0x00000040
|
||||
#define DSCAPS_SECONDARYMONO 0x00000100
|
||||
#define DSCAPS_SECONDARYSTEREO 0x00000200
|
||||
#define DSCAPS_SECONDARY8BIT 0x00000400
|
||||
#define DSCAPS_SECONDARY16BIT 0x00000800
|
||||
|
||||
#define DSBPLAY_LOOPING 0x00000001
|
||||
|
||||
#define DSBSTATUS_PLAYING 0x00000001
|
||||
#define DSBSTATUS_BUFFERLOST 0x00000002
|
||||
#define DSBSTATUS_LOOPING 0x00000004
|
||||
|
||||
#define DSBLOCK_FROMWRITECURSOR 0x00000001
|
||||
#define DSBLOCK_ENTIREBUFFER 0x00000002
|
||||
|
||||
#define DSSCL_NORMAL 0x00000001
|
||||
#define DSSCL_PRIORITY 0x00000002
|
||||
#define DSSCL_EXCLUSIVE 0x00000003
|
||||
#define DSSCL_WRITEPRIMARY 0x00000004
|
||||
|
||||
#define DS3DMODE_NORMAL 0x00000000
|
||||
#define DS3DMODE_HEADRELATIVE 0x00000001
|
||||
#define DS3DMODE_DISABLE 0x00000002
|
||||
|
||||
#define DS3D_IMMEDIATE 0x00000000
|
||||
#define DS3D_DEFERRED 0x00000001
|
||||
|
||||
#define DS3D_MINDISTANCEFACTOR 0.0f
|
||||
#define DS3D_MAXDISTANCEFACTOR 10.0f
|
||||
#define DS3D_DEFAULTDISTANCEFACTOR 1.0f
|
||||
|
||||
#define DS3D_MINROLLOFFFACTOR 0.0f
|
||||
#define DS3D_MAXROLLOFFFACTOR 10.0f
|
||||
#define DS3D_DEFAULTROLLOFFFACTOR 1.0f
|
||||
|
||||
#define DS3D_MINDOPPLERFACTOR 0.0f
|
||||
#define DS3D_MAXDOPPLERFACTOR 10.0f
|
||||
#define DS3D_DEFAULTDOPPLERFACTOR 1.0f
|
||||
|
||||
#define DS3D_DEFAULTMINDISTANCE 1.0f
|
||||
#define DS3D_DEFAULTMAXDISTANCE 1000000000.0f
|
||||
|
||||
#define DS3D_MINCONEANGLE 0
|
||||
#define DS3D_MAXCONEANGLE 360
|
||||
#define DS3D_DEFAULTCONEANGLE 360
|
||||
|
||||
#define DS3D_DEFAULTCONEOUTSIDEVOLUME 0
|
||||
|
||||
#define DSBCAPS_PRIMARYBUFFER 0x00000001
|
||||
#define DSBCAPS_STATIC 0x00000002
|
||||
#define DSBCAPS_LOCHARDWARE 0x00000004
|
||||
#define DSBCAPS_LOCSOFTWARE 0x00000008
|
||||
#define DSBCAPS_CTRL3D 0x00000010
|
||||
#define DSBCAPS_CTRLFREQUENCY 0x00000020
|
||||
#define DSBCAPS_CTRLPAN 0x00000040
|
||||
#define DSBCAPS_CTRLVOLUME 0x00000080
|
||||
#define DSBCAPS_CTRLPOSITIONNOTIFY 0x00000100
|
||||
#define DSBCAPS_CTRLDEFAULT 0x000000E0
|
||||
#define DSBCAPS_CTRLALL 0x000001F0
|
||||
#define DSBCAPS_STICKYFOCUS 0x00004000
|
||||
#define DSBCAPS_GLOBALFOCUS 0x00008000
|
||||
#define DSBCAPS_GETCURRENTPOSITION2 0x00010000
|
||||
#define DSBCAPS_MUTE3DATMAXDISTANCE 0x00020000
|
||||
|
||||
#define DSCBCAPS_WAVEMAPPED 0x80000000
|
||||
|
||||
#define DSSPEAKER_HEADPHONE 0x00000001
|
||||
#define DSSPEAKER_MONO 0x00000002
|
||||
#define DSSPEAKER_QUAD 0x00000003
|
||||
#define DSSPEAKER_STEREO 0x00000004
|
||||
#define DSSPEAKER_SURROUND 0x00000005
|
||||
|
||||
#define DSSPEAKER_GEOMETRY_MIN 0x00000005 // 5 degrees
|
||||
#define DSSPEAKER_GEOMETRY_NARROW 0x0000000A // 10 degrees
|
||||
#define DSSPEAKER_GEOMETRY_WIDE 0x00000014 // 20 degrees
|
||||
#define DSSPEAKER_GEOMETRY_MAX 0x000000B4 // 180 degrees
|
||||
|
||||
#define DSSPEAKER_COMBINED(c, g) ((DWORD)(((BYTE)(c)) | ((DWORD)((BYTE)(g))) << 16))
|
||||
#define DSSPEAKER_CONFIG(a) ((BYTE)(a))
|
||||
#define DSSPEAKER_GEOMETRY(a) ((BYTE)(((DWORD)(a) >> 16) & 0x00FF))
|
||||
|
||||
#define DSCCAPS_EMULDRIVER 0x00000020
|
||||
|
||||
#define DSCBLOCK_ENTIREBUFFER 0x00000001
|
||||
|
||||
#define DSCBSTATUS_CAPTURING 0x00000001
|
||||
#define DSCBSTATUS_LOOPING 0x00000002
|
||||
|
||||
#define DSCBSTART_LOOPING 0x00000001
|
||||
|
||||
#define DSBFREQUENCY_MIN 100
|
||||
#define DSBFREQUENCY_MAX 100000
|
||||
#define DSBFREQUENCY_ORIGINAL 0
|
||||
|
||||
#define DSBPAN_LEFT -10000
|
||||
#define DSBPAN_CENTER 0
|
||||
#define DSBPAN_RIGHT 10000
|
||||
|
||||
#define DSBVOLUME_MIN -10000
|
||||
#define DSBVOLUME_MAX 0
|
||||
|
||||
#define DSBSIZE_MIN 4
|
||||
#define DSBSIZE_MAX 0x0FFFFFFF
|
||||
|
||||
#define DSBPN_OFFSETSTOP 0xFFFFFFFF
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif // __DSOUND_INCLUDED__
|
||||
@@ -922,7 +922,9 @@ int fireball_create( vec3d * pos, int fireball_type, int render_type, int parent
|
||||
}
|
||||
|
||||
if ( fb->fireball_render_type == FIREBALL_WARP_EFFECT ) {
|
||||
Assert( warp_lifetime > 4.0f ); // Warp lifetime must be at least 4 seconds!
|
||||
Assert( warp_lifetime >= 4.0f ); // Warp lifetime must be at least 4 seconds!
|
||||
if ( warp_lifetime < 4.0f )
|
||||
warp_lifetime = 4.0f;
|
||||
fb->total_time = warp_lifetime; // in seconds
|
||||
} else {
|
||||
fb->total_time = i2fl(fl->num_frames) / fl->fps; // in seconds
|
||||
|
||||
@@ -36,6 +36,7 @@ struct ship_info;
|
||||
#define FIREBALL_NUM_LARGE_EXPLOSIONS 2
|
||||
|
||||
extern int fireball_used[MAX_FIREBALL_TYPES];
|
||||
extern int Num_fireball_types;
|
||||
|
||||
// all this moved here by Goober5000 because it makes more sense in the H file
|
||||
typedef struct fireball_lod {
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#include "ship/ship.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
@@ -87,7 +86,6 @@ BOOL AltShipClassDlg::OnInitDialog()
|
||||
while (objp != END_OF_LIST(&obj_used_list)) {
|
||||
if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) {
|
||||
if (objp->flags & OF_MARKED) {
|
||||
|
||||
m_selected_ships[num_selected_ships++] = objp->instance;
|
||||
}
|
||||
}
|
||||
@@ -95,6 +93,8 @@ BOOL AltShipClassDlg::OnInitDialog()
|
||||
}
|
||||
|
||||
Assert (num_selected_ships > 0);
|
||||
Assert (Objects[cur_object_index].flags & OF_MARKED);
|
||||
|
||||
if (num_selected_ships > 1)
|
||||
{
|
||||
multi_edit = true;
|
||||
@@ -137,7 +137,7 @@ BOOL AltShipClassDlg::OnInitDialog()
|
||||
|
||||
// Set up the actual list of alt classes
|
||||
alt_class_pool.clear();
|
||||
alt_class_pool = Ships[m_selected_ships[0]].s_alt_classes;
|
||||
alt_class_pool = Ships[Objects[cur_object_index].instance].s_alt_classes;
|
||||
alt_class_list_rebuild();
|
||||
|
||||
return TRUE; // return TRUE unless you set the focus to a control
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
#include "gamesnd/eventmusic.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include "parse/sexp.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
#include "mission/missiongrid.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#include "species_defs/species_defs.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include "ship/ship.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include "mission/missionparse.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
#include "localization/localize.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include "mission/missiongoals.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#include "mission/missionparse.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#include "mission/missionparse.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include "mission/missionparse.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#include "localization/localize.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#include "iff_defs/iff_defs.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include "ship/ship.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#include "localization/localize.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#include "dialog1.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include "weapon/weapon.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include "localization/localize.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
@@ -82,15 +81,17 @@ void event_editor::DoDataExchange(CDataExchange* pDX)
|
||||
DDX_CBString(pDX, IDC_WAVE_FILENAME, m_wave_filename);
|
||||
DDX_LBIndex(pDX, IDC_MESSAGE_LIST, m_cur_msg);
|
||||
|
||||
|
||||
// m_team == -1 maps to 2
|
||||
if(m_team == -1){
|
||||
m_team = 2;
|
||||
m_team = MAX_TVT_TEAMS;
|
||||
}
|
||||
|
||||
DDX_CBIndex(pDX, IDC_EVENT_TEAM, m_team);
|
||||
|
||||
// m_message_team == -1 maps to 2
|
||||
if(m_message_team == -1){
|
||||
m_message_team = 2;
|
||||
m_message_team = MAX_TVT_TEAMS;
|
||||
}
|
||||
DDX_CBIndex(pDX, IDC_MESSAGE_TEAM, m_message_team);
|
||||
//}}AFX_DATA_MAP
|
||||
@@ -570,7 +571,7 @@ void event_editor::update_cur_message()
|
||||
m_persona = 0;
|
||||
}
|
||||
|
||||
if(m_messages[m_cur_msg].multi_team >= 2){
|
||||
if(m_messages[m_cur_msg].multi_team >= MAX_TVT_TEAMS){
|
||||
m_message_team = -1;
|
||||
m_messages[m_cur_msg].multi_team = -1;
|
||||
} else {
|
||||
@@ -715,6 +716,7 @@ void event_editor::reset_event(int num, HTREEITEM after)
|
||||
m_events[num].chain_delay = -1;
|
||||
m_events[num].objective_text = NULL;
|
||||
m_events[num].objective_key_text = NULL;
|
||||
m_events[num].team = -1;
|
||||
m_sig[num] = -1;
|
||||
|
||||
m_event_tree.item_index = -1;
|
||||
@@ -1174,7 +1176,7 @@ int event_editor::save_message(int num)
|
||||
// box list.
|
||||
m_messages[num].persona_index = m_persona - 1;
|
||||
|
||||
if(m_message_team >= 2){
|
||||
if(m_message_team >= MAX_TVT_TEAMS){
|
||||
m_messages[num].multi_team = -1;
|
||||
m_message_team = -1;
|
||||
} else {
|
||||
@@ -1409,8 +1411,8 @@ void event_editor::OnSelchangeTeam()
|
||||
|
||||
UpdateData(TRUE);
|
||||
|
||||
// team == 2, means no team
|
||||
if(m_team == 2){
|
||||
// If the team isn't valid mark it as such.
|
||||
if((m_team >= MAX_TVT_TEAMS) || (m_team < -1) ){
|
||||
m_team = -1;
|
||||
}
|
||||
|
||||
@@ -1426,8 +1428,8 @@ void event_editor::OnSelchangeMessageTeam()
|
||||
|
||||
UpdateData(TRUE);
|
||||
|
||||
// team == 2, means no team
|
||||
if(m_message_team == 2){
|
||||
// If the team isn't valid mark it as such.
|
||||
if((m_message_team>= MAX_TVT_TEAMS) || (m_message_team < -1) ) {
|
||||
m_message_team = -1;
|
||||
}
|
||||
|
||||
|
||||
+42
-4
@@ -28,6 +28,8 @@
|
||||
#include "debugconsole/dbugfile.h"
|
||||
#include "globalincs/mspdb_callstack.h"
|
||||
|
||||
#include "AFXADV.H"
|
||||
|
||||
#ifdef NDEBUG
|
||||
#ifndef FRED
|
||||
#error macro FRED is not defined when trying to build release Fred. Please define FRED macro in build settings in all Fred projects
|
||||
@@ -35,7 +37,6 @@
|
||||
#endif
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
@@ -80,12 +81,12 @@ window_data Mission_notes_wnd_data;
|
||||
BEGIN_MESSAGE_MAP(CFREDApp, CWinApp)
|
||||
//{{AFX_MSG_MAP(CFREDApp)
|
||||
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
|
||||
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
|
||||
// NOTE - the ClassWizard will add and remove mapping macros here.
|
||||
// DO NOT EDIT what you see in these blocks of generated code!
|
||||
//}}AFX_MSG_MAP
|
||||
// Standard file based document commands
|
||||
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
|
||||
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
|
||||
// Standard print setup command
|
||||
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
|
||||
END_MESSAGE_MAP()
|
||||
@@ -125,7 +126,7 @@ BOOL CFREDApp::InitInstance()
|
||||
|
||||
|
||||
// disable the debug memory stuff
|
||||
_CrtSetDbgFlag(~(_CRTDBG_ALLOC_MEM_DF) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
|
||||
// _CrtSetDbgFlag(~(_CRTDBG_ALLOC_MEM_DF) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
|
||||
|
||||
// Standard initialization
|
||||
// If you are not using these features and wish to reduce the size
|
||||
@@ -236,9 +237,23 @@ BOOL CFREDApp::InitInstance()
|
||||
*str_end = '\0';
|
||||
|
||||
|
||||
// Goober5000 - figure out where the FRED file dialog should go
|
||||
if ((m_pRecentFileList != NULL) && (m_pRecentFileList->GetSize() > 0))
|
||||
{
|
||||
// use the most recently opened file to supply the default folder
|
||||
m_sInitialDir = m_pRecentFileList->operator[](0); // lol syntax
|
||||
}
|
||||
else
|
||||
{
|
||||
// use FRED's own directory to search for missions
|
||||
m_sInitialDir = Fred_base_dir;
|
||||
m_sInitialDir += "\\data\\missions";
|
||||
}
|
||||
|
||||
|
||||
// Parse command line for standard shell commands, DDE, file open
|
||||
CCommandLineInfo cmdInfo;
|
||||
ParseCommandLine(cmdInfo);
|
||||
ParseCommandLine(cmdInfo);
|
||||
|
||||
m_nCmdShow = Main_wnd_data.p.showCmd;
|
||||
|
||||
@@ -309,6 +324,25 @@ void CFREDApp::OnAppAbout()
|
||||
aboutDlg.DoModal();
|
||||
}
|
||||
|
||||
// G5K - from http://www.experts-exchange.com/Programming/System/Windows__Programming/MFC/Q_20155824.html
|
||||
void CFREDApp::OnFileOpen()
|
||||
{
|
||||
// use the initial dir the first time we prompt for a file
|
||||
// name. after a successful open, the file name will be
|
||||
// changed to be the empty string and the default dir
|
||||
// will be supplied by the CFileDialog internal memory
|
||||
if(!DoPromptFileName(m_sInitialDir, AFX_IDS_OPENFILE, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, TRUE, NULL))
|
||||
{
|
||||
// open cancelled
|
||||
return;
|
||||
}
|
||||
AfxGetApp()->OpenDocumentFile(m_sInitialDir);
|
||||
// if returns NULL, the user has already been alerted
|
||||
|
||||
// now erase the initial dir since we only want to use it once
|
||||
m_sInitialDir.Empty();
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CFREDApp commands
|
||||
|
||||
@@ -668,3 +702,7 @@ int CFREDApp::ExitInstance()
|
||||
|
||||
return CWinApp::ExitInstance();
|
||||
}
|
||||
|
||||
// Empty functions to make fred link with the sexp_mission_set_subspace
|
||||
void game_start_subspace_ambient_sound() {}
|
||||
void game_stop_subspace_ambient_sound() {}
|
||||
@@ -52,6 +52,7 @@ typedef struct window_data {
|
||||
class CFREDApp : public CWinApp
|
||||
{
|
||||
int app_init;
|
||||
CString m_sInitialDir;
|
||||
|
||||
public:
|
||||
void record_window_data(window_data *wndd, CWnd *wnd);
|
||||
@@ -75,6 +76,7 @@ public:
|
||||
|
||||
//{{AFX_MSG(CFREDApp)
|
||||
afx_msg void OnAppAbout();
|
||||
afx_msg void OnFileOpen();
|
||||
// NOTE - the ClassWizard will add and remove member functions here.
|
||||
// DO NOT EDIT what you see in these blocks of generated code !
|
||||
//}}AFX_MSG
|
||||
|
||||
+66
-21
@@ -634,7 +634,7 @@ CAPTION "About FRED2"
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
ICON IDR_MAINFRAME,IDC_STATIC,10,17,20,20,SS_REALSIZEIMAGE
|
||||
LTEXT "FRED2_OPEN - FreeSpace Editor, Version 3.6.11 OpenGL",
|
||||
LTEXT "FRED2_OPEN - FreeSpace Editor, Version 3.6.13 OpenGL",
|
||||
IDC_STATIC,39,8,184,10,SS_NOPREFIX
|
||||
LTEXT "Copyright © 1999 Volition, Inc. All Rights Reserved",
|
||||
IDC_STATIC,39,17,164,8
|
||||
@@ -878,10 +878,10 @@ BEGIN
|
||||
IDC_STATIC,60,183,307,11
|
||||
END
|
||||
|
||||
IDD_MISSION_NOTES DIALOGEX 0, 0, 479, 349
|
||||
IDD_MISSION_NOTES DIALOG DISCARDABLE 0, 0, 479, 349
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Mission Specs"
|
||||
FONT 8, "MS Sans Serif", 0, 0, 0x1
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
RTEXT "Title",IDC_STATIC,7,10,29,8
|
||||
EDITTEXT IDC_MISSION_TITLE,41,7,109,14,ES_AUTOHSCROLL
|
||||
@@ -1003,6 +1003,8 @@ BEGIN
|
||||
CONTROL "",IDC_MAX_RESPAWN_DELAY_SPIN,"msctls_updown32",
|
||||
UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
|
||||
UDS_ARROWKEYS,136,112,11,14
|
||||
PUSHBUTTON "Sound Environment",IDC_SOUND_ENVIRONMENT_BUTTON,158,244,
|
||||
140,15
|
||||
END
|
||||
|
||||
IDD_PREFERENCES DIALOG DISCARDABLE 0, 0, 333, 81
|
||||
@@ -1552,8 +1554,8 @@ BEGIN
|
||||
EDITTEXT IDC_CHAIN_DELAY,210,255,45,14,ES_AUTOHSCROLL | ES_NUMBER
|
||||
EDITTEXT IDC_OBJ_TEXT,86,246,117,14,ES_AUTOHSCROLL
|
||||
EDITTEXT IDC_OBJ_KEY_TEXT,86,262,117,14,ES_AUTOHSCROLL
|
||||
EDITTEXT IDC_HELP_BOX,7,298,423,126,ES_MULTILINE | ES_READONLY,
|
||||
WS_EX_TRANSPARENT
|
||||
EDITTEXT IDC_HELP_BOX,7,298,423,126,ES_MULTILINE | ES_AUTOVSCROLL |
|
||||
ES_READONLY | WS_VSCROLL,WS_EX_TRANSPARENT
|
||||
PUSHBUTTON "New Msg",IDC_NEW_MSG,229,59,50,14,0,WS_EX_STATICEDGE
|
||||
PUSHBUTTON "Delete Msg",IDC_DELETE_MSG,229,77,50,14,0,
|
||||
WS_EX_STATICEDGE
|
||||
@@ -2270,8 +2272,8 @@ BEGIN
|
||||
BS_3STATE | WS_TABSTOP,165,17,85,10
|
||||
CONTROL "Affected By Gravity",IDC_AFFECTED_BY_GRAVITY,"Button",
|
||||
BS_3STATE | WS_TABSTOP,165,27,77,10
|
||||
CONTROL "Special Warpin",IDC_SPECIAL_WARPIN,"Button",BS_AUTOCHECKBOX |
|
||||
WS_TABSTOP,165,37,59,10
|
||||
CONTROL "Special Warpin",IDC_SPECIAL_WARPIN,"Button",
|
||||
BS_AUTOCHECKBOX | WS_TABSTOP,165,37,59,10
|
||||
CONTROL "Targetable as Bomb",IDC_TARGETABLE_AS_BOMB,"Button",
|
||||
BS_3STATE | WS_TABSTOP,165,47,79,10
|
||||
CONTROL "Disable Built-in Messages",IDC_DISABLE_BUILTIN_SHIP,
|
||||
@@ -2398,19 +2400,21 @@ BEGIN
|
||||
CBS_SORT | WS_VSCROLL | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_SPECIAL_HITPOINTS DIALOG DISCARDABLE 0, 0, 234, 57
|
||||
IDD_SPECIAL_HITPOINTS DIALOG DISCARDABLE 0, 0, 234, 85
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Special Hitpoints"
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
CONTROL "Enable Special Hitpoints",IDC_ENABLE_SPECIAL_HITPOINTS,
|
||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,93,10
|
||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,37,93,10
|
||||
EDITTEXT IDC_SPECIAL_SHIELDS,91,19,62,12,ES_AUTOHSCROLL
|
||||
LTEXT "Shields:",-1,61,23,26,8
|
||||
EDITTEXT IDC_SPECIAL_HULL,91,33,62,12,ES_AUTOHSCROLL
|
||||
LTEXT "Hull:",-1,72,36,15,8
|
||||
LTEXT "Shields:",-1,62,23,26,8
|
||||
EDITTEXT IDC_SPECIAL_HULL,91,52,62,12,ES_AUTOHSCROLL
|
||||
LTEXT "Hull:",-1,73,55,15,8
|
||||
DEFPUSHBUTTON "OK",ID_OK,177,7,50,14
|
||||
PUSHBUTTON "Cancel",ID_CANCEL,177,24,50,14
|
||||
CONTROL "Enable Special Shield Points",IDC_ENABLE_SPECIAL_SHIELD,
|
||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,106,10
|
||||
END
|
||||
|
||||
IDD_SET_GLOBAL_SHIP_FLAGS DIALOG DISCARDABLE 0, 0, 114, 79
|
||||
@@ -2453,17 +2457,18 @@ BEGIN
|
||||
WS_TABSTOP
|
||||
LTEXT "Example",IDC_LBL_EXAMPLE,17,158,31,10
|
||||
EDITTEXT IDC_EXAMPLE,49,156,77,12,ES_AUTOHSCROLL | ES_READONLY
|
||||
CONTROL "Don't replace existing file names",IDC_NO_REPLACE,
|
||||
CONTROL "Include sender name in filename",IDC_INCLUDE_SENDER,
|
||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,175,112,10
|
||||
PUSHBUTTON "Generate File Names",IDC_GENERATE_FILE_NAMES,12,190,120,
|
||||
14
|
||||
CONTROL "Don't replace existing file names",IDC_NO_REPLACE,
|
||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,186,112,10
|
||||
PUSHBUTTON "Generate File Names",IDC_GENERATE_FILE_NAMES,12,198,120,14
|
||||
GROUPBOX "Script Options",IDC_SCRIPT_OPTIONS,143,7,257,204
|
||||
GROUPBOX "Script Entry Format",IDC_ENTRY,149,17,246,76
|
||||
EDITTEXT IDC_ENTRY_FORMAT,154,28,109,56,ES_MULTILINE |
|
||||
ES_AUTOHSCROLL | ES_WANTRETURN
|
||||
LTEXT "$filename - name of the message file\r\n$message - text of the message\r\n$persona - persona of the sender\r\n$sender - name of the sender\r\n\r\nNote that $persona and $sender will only appear for the Message section.",
|
||||
IDC_STATIC,270,28,120,58
|
||||
GROUPBOX "Export",IDC_EXPORT,149,98,119,64
|
||||
GROUPBOX "Export",IDC_EXPORT,149,98,119,83
|
||||
CONTROL "Everything",IDC_EXPORT_EVERYTHING,"Button",
|
||||
BS_AUTORADIOBUTTON,153,108,99,9
|
||||
CONTROL "Just Command Briefings",IDC_EXPORT_COMMAND_BRIEFINGS,
|
||||
@@ -2475,6 +2480,9 @@ BEGIN
|
||||
CONTROL "Just Messages",IDC_EXPORT_MESSAGES,"Button",
|
||||
BS_AUTORADIOBUTTON,153,148,99,9
|
||||
PUSHBUTTON "Generate Script",IDC_GENERATE_SCRIPT,149,190,120,14
|
||||
CONTROL "Group send-message-list messages before others",
|
||||
IDC_GROUP_MESSAGES,"Button",BS_AUTOCHECKBOX | BS_TOP |
|
||||
BS_MULTILINE | WS_TABSTOP,166,159,100,19
|
||||
END
|
||||
|
||||
IDD_BRIEFING_PERSONAS DIALOG DISCARDABLE 0, 0, 320, 201
|
||||
@@ -2552,6 +2560,32 @@ BEGIN
|
||||
WS_VSCROLL | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_SOUND_ENVIRONMENT DIALOGEX 0, 0, 315, 89
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Sound Environment"
|
||||
FONT 8, "MS Sans Serif", 0, 0, 0x1
|
||||
BEGIN
|
||||
COMBOBOX IDC_SOUND_ENVIRONMENT,75,9,117,30,CBS_DROPDOWN |
|
||||
WS_VSCROLL | WS_TABSTOP
|
||||
EDITTEXT IDC_SOUND_ENVIRONMENT_VOLUME,75,31,76,12,ES_AUTOHSCROLL
|
||||
EDITTEXT IDC_SOUND_ENVIRONMENT_DAMPING,75,48,76,12,ES_AUTOHSCROLL
|
||||
EDITTEXT IDC_SOUND_ENVIRONMENT_DECAY,75,64,76,12,ES_AUTOHSCROLL
|
||||
DEFPUSHBUTTON "OK",IDOK,258,7,50,14
|
||||
PUSHBUTTON "Cancel",IDCANCEL,258,24,50,14
|
||||
LTEXT "Environment:",IDC_SOUND_ENVIRONMENT_LABEL,28,13,42,8
|
||||
LTEXT "Volume:",IDC_SOUND_ENVIRONMENT_VOLUME_LABEL,42,35,26,8
|
||||
LTEXT "Damping:",IDC_SOUND_ENVIRONENT_DAMPING_LABEL,37,52,31,8
|
||||
LTEXT "Decay Time:",IDC_SOUND_ENVIRONMENT_DECAY_LABEL,27,68,41,
|
||||
8
|
||||
LTEXT "range: 0.0 .. 1.0",IDC_STATIC,157,32,55,8,WS_DISABLED
|
||||
LTEXT "range: 0.1 .. 2.0",IDC_STATIC,157,50,55,8,WS_DISABLED
|
||||
LTEXT "range: 0.1 .. 20.0",IDC_STATIC,157,66,62,11,WS_DISABLED
|
||||
GROUPBOX "Preview",IDC_SOUND_ENVIRONMENT_TEST,229,50,79,32
|
||||
PUSHBUTTON "Browse",IDC_BROWSE_WAVE,258,62,44,15
|
||||
PUSHBUTTON "IDB_PLAY",IDC_PLAY,235,62,17,15,BS_BITMAP,
|
||||
WS_EX_TRANSPARENT
|
||||
END
|
||||
|
||||
|
||||
#ifndef _MAC
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
@@ -2560,8 +2594,8 @@ END
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 3,6,11,0
|
||||
PRODUCTVERSION 3,6,11,0
|
||||
FILEVERSION 3,6,13,0
|
||||
PRODUCTVERSION 3,6,13,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@@ -2578,12 +2612,12 @@ BEGIN
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Volition Inc.\0"
|
||||
VALUE "FileDescription", "Fred 2 Open\0"
|
||||
VALUE "FileVersion", "3.6.11.0000\0"
|
||||
VALUE "FileVersion", "3.6.13.0000\0"
|
||||
VALUE "InternalName", "Fred 2 Open\0"
|
||||
VALUE "LegalCopyright", "Copyright © 1998\0"
|
||||
VALUE "OriginalFilename", "fred2.exe\0"
|
||||
VALUE "ProductName", "Fred 2 Open\0"
|
||||
VALUE "ProductVersion", "3.6.11\0"
|
||||
VALUE "ProductVersion", "3.6.13\0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
@@ -2973,6 +3007,17 @@ BEGIN
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 59
|
||||
END
|
||||
|
||||
IDD_SOUND_ENVIRONMENT, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 308
|
||||
VERTGUIDE, 70
|
||||
VERTGUIDE, 151
|
||||
VERTGUIDE, 157
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 82
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
@@ -3145,7 +3190,7 @@ IDC_CURSOR2 CURSOR DISCARDABLE "res\\cursor2.cur"
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDR_MAINFRAME "FRED2_OPEN 3.6.11 - FreeSpace2 Mission Editor\nUntitled\nFRED2\nFreeSpace2 Missions (*.fs2)\n.fs2\nFreeSpace2Mission\nFreeSpace2 Mission"
|
||||
IDR_MAINFRAME "FRED2_OPEN 3.6.13 - FreeSpace2 Mission Editor\nUntitled\nFRED2\nFreeSpace2 Missions (*.fs2)\n.fs2\nFreeSpace2Mission\nFreeSpace2 Mission"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
|
||||
@@ -50,7 +50,6 @@
|
||||
extern int Num_objects;
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
@@ -427,7 +426,7 @@ int CFREDDoc::load_mission(char *pathname, int flags)
|
||||
generate_weaponry_usage_list(i, used_pool);
|
||||
for (j=0; j<Team_data[i].num_weapon_choices; j++) {
|
||||
// The amount used in wings is always set by a static loadout entry so skip any that were set by Sexp variables
|
||||
if ((Team_data[i].weaponry_pool_variable[j] == -1) && (Team_data[i].weaponry_amount_variable[j] == -1) ) {
|
||||
if ( (!strlen(Team_data[i].weaponry_pool_variable[j])) && (!strlen(Team_data[i].weaponry_amount_variable[j])) ) {
|
||||
// convert weaponry_pool to be extras available beyond the current ships weapons
|
||||
Team_data[i].weaponry_count[j] -= used_pool[Team_data[i].weaponry_pool[j]];
|
||||
if (Team_data[i].weaponry_count[j] < 0) {
|
||||
@@ -446,8 +445,8 @@ int CFREDDoc::load_mission(char *pathname, int flags)
|
||||
// add the weapon as a new entry
|
||||
Team_data[i].weaponry_pool[Team_data[i].num_weapon_choices] = j;
|
||||
Team_data[i].weaponry_count[Team_data[i].num_weapon_choices] = used_pool[j];
|
||||
Team_data[i].weaponry_amount_variable[Team_data[i].num_weapon_choices] = -1;
|
||||
Team_data[i].weaponry_pool_variable[Team_data[i].num_weapon_choices++] = -1;
|
||||
strcpy_s(Team_data[i].weaponry_amount_variable[Team_data[i].num_weapon_choices], "");
|
||||
strcpy_s(Team_data[i].weaponry_pool_variable[Team_data[i].num_weapon_choices++], "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,7 +58,6 @@ extern float flFrametime;
|
||||
extern subsys_to_render Render_subsys;
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -188,7 +188,6 @@ int Framerate_delay;
|
||||
void game_start_time(){}
|
||||
void game_stop_time(){}
|
||||
int game_get_default_skill_level(){return 0;}
|
||||
void game_load_palette(){}
|
||||
float FreeSpace_gamma;
|
||||
int set_cdrom_path(int){return 0;}
|
||||
int find_freespace_cd(char*){return 0;}
|
||||
|
||||
@@ -65,7 +65,6 @@
|
||||
#include "gl/glu.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#include "editor.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include "globalincs/linklist.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#include "weapon/weapon.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#include "object/objectdock.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include "iff_defs/iff_defs.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -324,8 +324,10 @@ bool fred_init()
|
||||
|
||||
timer_init();
|
||||
|
||||
Assert(strlen(Fred_exe_dir) > 0);
|
||||
Assert(strlen(Fred_base_dir) > 0);
|
||||
|
||||
// sigh... this should enable proper reading of cmdline_fso.cfg - Goober5000
|
||||
cfile_chdir(Fred_base_dir);
|
||||
|
||||
// this should enable mods - Kazan
|
||||
fred2_parse_cmdline(__argc, __argv);
|
||||
@@ -379,7 +381,7 @@ bool fred_init()
|
||||
}
|
||||
*/
|
||||
|
||||
snd_init(0, 0, 44100, 16);
|
||||
snd_init();
|
||||
|
||||
// Not ready for this yet
|
||||
// Cmdline_nospec = 1;
|
||||
@@ -563,6 +565,7 @@ int create_ship(matrix *orient, vec3d *pos, int ship_type)
|
||||
resolve_parse_flags(&Objects[obj], Iff_info[shipp->team].default_parse_flags, Iff_info[shipp->team].default_parse_flags2);
|
||||
|
||||
// default shield setting
|
||||
shipp->special_shield = -1;
|
||||
z1 = Shield_sys_teams[shipp->team];
|
||||
z2 = Shield_sys_types[ship_type];
|
||||
if (((z1 == 1) && z2) || (z2 == 1))
|
||||
@@ -601,9 +604,9 @@ int create_ship(matrix *orient, vec3d *pos, int ship_type)
|
||||
}
|
||||
|
||||
// calc kamikaze stuff
|
||||
if (shipp->special_hitpoint_index != -1)
|
||||
if (shipp->use_special_explosion)
|
||||
{
|
||||
temp_max_hull_strength = (float) atoi(Sexp_variables[shipp->special_hitpoint_index+HULL_STRENGTH].text);
|
||||
temp_max_hull_strength = (float)shipp->special_exp_blast;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -996,9 +999,9 @@ void clear_mission()
|
||||
for ( j = 0; j < MAX_SHIP_CLASSES; j++ ) {
|
||||
if (Ship_info[j].flags & SIF_DEFAULT_PLAYER_SHIP) {
|
||||
Team_data[i].ship_list[count] = j;
|
||||
Team_data[i].ship_list_variables[count] = -1;
|
||||
strcpy_s(Team_data[i].ship_list_variables[count], "");
|
||||
Team_data[i].ship_count[count] = 5;
|
||||
Team_data[i].ship_count_variables[count++] = -1;
|
||||
strcpy_s(Team_data[i].ship_count_variables[count++], "");
|
||||
}
|
||||
}
|
||||
Team_data[i].num_ship_choices = count;
|
||||
@@ -1012,8 +1015,8 @@ void clear_mission()
|
||||
Team_data[i].weaponry_count[count] = 500;
|
||||
}
|
||||
Team_data[i].weaponry_pool[count] = j;
|
||||
Team_data[i].weaponry_pool_variable[count] = -1;
|
||||
Team_data[i].weaponry_amount_variable[count++] = -1;
|
||||
strcpy_s(Team_data[i].weaponry_pool_variable[count], "");
|
||||
strcpy_s(Team_data[i].weaponry_amount_variable[count++], "");
|
||||
}
|
||||
}
|
||||
Team_data[i].num_weapon_choices = count;
|
||||
@@ -1089,6 +1092,9 @@ void clear_mission()
|
||||
strcpy_s(The_mission.skybox_model, "");
|
||||
strcpy_s(The_mission.envmap_name, "");
|
||||
|
||||
// no sound environment
|
||||
The_mission.sound_environment.id = -1;
|
||||
|
||||
ENVMAP = -1;
|
||||
|
||||
set_modified(FALSE);
|
||||
@@ -2518,7 +2524,7 @@ void generate_weaponry_usage_list(int *arr, int wing)
|
||||
j = swp->num_secondary_banks;
|
||||
while (j--) {
|
||||
if (swp->secondary_bank_weapons[j] >=0 && swp->secondary_bank_weapons[j] < MAX_WEAPON_TYPES) {
|
||||
arr[swp->secondary_bank_weapons[j]] += int(ceil(swp->secondary_bank_ammo[j] * swp->secondary_bank_capacity[j] / 100 / (Weapon_info[swp->secondary_bank_weapons[j]].cargo_size + 0.5f)));
|
||||
arr[swp->secondary_bank_weapons[j]] += (int) floor((swp->secondary_bank_ammo[j] * swp->secondary_bank_capacity[j] / 100.0f / Weapon_info[swp->secondary_bank_weapons[j]].cargo_size) + 0.5f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#include "mission/missionmessage.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
#define ID_REPLACE_WINGS 15000
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include "FREDDoc.h"
|
||||
#include "MissionNotesDlg.h"
|
||||
#include "CustomWingNames.h"
|
||||
#include "soundenvironmentdlg.h"
|
||||
#include "Management.h"
|
||||
#include "gamesnd/eventmusic.h"
|
||||
#include "cfile/cfile.h"
|
||||
@@ -21,7 +22,6 @@
|
||||
#include "mission/missionmessage.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
@@ -143,6 +143,7 @@ BEGIN_MESSAGE_MAP(CMissionNotesDlg, CDialog)
|
||||
ON_BN_CLICKED(IDC_LOADING_SCREEN_BUTTON1024, OnLoad1024)
|
||||
ON_BN_CLICKED(IDC_CONTRAIL_THRESHOLD_CHECK, OnToggleContrailThreshold)
|
||||
ON_BN_CLICKED(IDC_CUSTOM_WING_NAMES, OnCustomWingNames)
|
||||
ON_BN_CLICKED(IDC_SOUND_ENVIRONMENT_BUTTON, OnSoundEnvironment)
|
||||
//}}AFX_MSG_MAP
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
@@ -725,3 +726,13 @@ void CMissionNotesDlg::OnCustomWingNames()
|
||||
|
||||
UpdateData(FALSE);
|
||||
}
|
||||
|
||||
void CMissionNotesDlg::OnSoundEnvironment()
|
||||
{
|
||||
UpdateData(TRUE);
|
||||
|
||||
SoundEnvironment dlg;
|
||||
dlg.DoModal();
|
||||
|
||||
UpdateData(FALSE);
|
||||
}
|
||||
@@ -98,6 +98,7 @@ protected:
|
||||
afx_msg void OnLoad1024();
|
||||
afx_msg void OnToggleContrailThreshold();
|
||||
afx_msg void OnCustomWingNames();
|
||||
afx_msg void OnSoundEnvironment();
|
||||
//}}AFX_MSG
|
||||
DECLARE_MESSAGE_MAP()
|
||||
public:
|
||||
|
||||
+154
-28
@@ -44,6 +44,8 @@
|
||||
#include "iff_defs/iff_defs.h"
|
||||
#include "missionui/fictionviewer.h"
|
||||
#include "globalincs/version.h"
|
||||
#include "sound/sound.h"
|
||||
#include "sound/ds.h"
|
||||
|
||||
|
||||
void CFred_mission_save::convert_special_tags_to_retail(char *text, int max_len)
|
||||
@@ -589,6 +591,30 @@ int CFred_mission_save::save_mission_info()
|
||||
fso_comment_pop();
|
||||
}
|
||||
|
||||
// sound environment (EFX/EAX) - taylor
|
||||
sound_env *m_env = &The_mission.sound_environment;
|
||||
if ( (m_env->id >= 0) && (m_env->id < (int)EFX_presets.size()) ) {
|
||||
EFXREVERBPROPERTIES *prop = &EFX_presets[m_env->id];
|
||||
|
||||
fso_comment_push(";;FSO 3.6.12;;");
|
||||
|
||||
fout_version("\n\n$Sound Environment: %s", prop->name.c_str());
|
||||
|
||||
if (m_env->volume != prop->flGain) {
|
||||
fout_version("\n+Volume: %f", m_env->volume);
|
||||
}
|
||||
|
||||
if (m_env->damping != prop->flDecayHFRatio) {
|
||||
fout_version("\n+Damping: %f", m_env->damping);
|
||||
}
|
||||
|
||||
if (m_env->decay != prop->flDecayTime) {
|
||||
fout_version("\n+Decay Time: %f", m_env->decay);
|
||||
}
|
||||
|
||||
fso_comment_pop();
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1035,13 +1061,18 @@ int CFred_mission_save::save_variables()
|
||||
char string[] = "string";
|
||||
char block[] = "block";
|
||||
int i;
|
||||
int num_block_vars = 0;
|
||||
|
||||
// sort sexp_variables
|
||||
sexp_variable_sort();
|
||||
|
||||
// get count
|
||||
int num_variables = sexp_variable_count();
|
||||
int num_block_vars = sexp_variable_block_count();
|
||||
|
||||
if (Format_fs2_open == FSO_FORMAT_RETAIL) {
|
||||
generate_special_explosion_block_variables();
|
||||
num_block_vars = num_block_variables();
|
||||
}
|
||||
int total_variables = num_variables + num_block_vars;
|
||||
|
||||
if (total_variables > 0) {
|
||||
@@ -1087,7 +1118,7 @@ int CFred_mission_save::save_variables()
|
||||
|
||||
for (i=MAX_SEXP_VARIABLES-num_block_vars; i<MAX_SEXP_VARIABLES; i++) {
|
||||
type = block;
|
||||
fout("\n\t\t%d\t\t\"%s\"\t\t\"%s\"\t\t\"%s\"", i, Sexp_variables[i].variable_name, Sexp_variables[i].text, type);
|
||||
fout("\n\t\t%d\t\t\"%s\"\t\t\"%s\"\t\t\"%s\"", i, Block_variables[i].variable_name, Block_variables[i].text, type);
|
||||
}
|
||||
|
||||
fout("\n)");
|
||||
@@ -1104,6 +1135,7 @@ int CFred_mission_save::save_variables()
|
||||
int CFred_mission_save::save_players()
|
||||
{
|
||||
int i, j;
|
||||
int var_idx;
|
||||
int used_pool[MAX_WEAPON_TYPES];
|
||||
|
||||
// write out alternate name list
|
||||
@@ -1148,20 +1180,22 @@ int CFred_mission_save::save_players()
|
||||
|
||||
for (j=0; j<Team_data[i].num_ship_choices; j++) {
|
||||
// Check to see if a variable name should be written for the class rather than a number
|
||||
if (Team_data[i].ship_list_variables[j] != -1) {
|
||||
Assert (Team_data[i].ship_list_variables[j] > -1 && Team_data[i].ship_list_variables[j] < MAX_SEXP_VARIABLES);
|
||||
if (strlen(Team_data[i].ship_list_variables[j])) {
|
||||
var_idx = get_index_sexp_variable_name(Team_data[i].ship_list_variables[j]);
|
||||
Assert (var_idx > -1 && var_idx < MAX_SEXP_VARIABLES);
|
||||
|
||||
fout("\t@%s\t", Sexp_variables[Team_data[i].ship_list_variables[j]].variable_name);
|
||||
fout("\t@%s\t", Sexp_variables[var_idx].variable_name);
|
||||
}
|
||||
else {
|
||||
fout("\t\"%s\"\t", Ship_info[Team_data[i].ship_list[j]].name);
|
||||
}
|
||||
|
||||
// Now check if we should write a variable or a number for the amount of ships available
|
||||
if (Team_data[i].ship_count_variables[j] != -1) {
|
||||
Assert (Team_data[i].ship_count_variables[j] > -1 && Team_data[i].ship_count_variables[j] < MAX_SEXP_VARIABLES);
|
||||
if (strlen(Team_data[i].ship_count_variables[j])) {
|
||||
var_idx = get_index_sexp_variable_name(Team_data[i].ship_count_variables[j]);
|
||||
Assert (var_idx > -1 && var_idx < MAX_SEXP_VARIABLES);
|
||||
|
||||
fout("@%s\n", Sexp_variables[Team_data[i].ship_count_variables[j]].variable_name);
|
||||
fout("@%s\n", Sexp_variables[var_idx].variable_name);
|
||||
}
|
||||
else {
|
||||
fout("%d\n", Team_data[i].ship_count[j]);
|
||||
@@ -1180,10 +1214,11 @@ int CFred_mission_save::save_players()
|
||||
generate_weaponry_usage_list(i, used_pool);
|
||||
for (j=0; j<Team_data[i].num_weapon_choices; j++) {
|
||||
// first output the weapon name or a variable that sets it
|
||||
if (Team_data[i].weaponry_pool_variable[j] != -1) {
|
||||
Assert (Team_data[i].weaponry_pool_variable[j] > -1 && Team_data[i].weaponry_pool_variable[j] < MAX_SEXP_VARIABLES);
|
||||
if (strlen(Team_data[i].weaponry_pool_variable[j])) {
|
||||
var_idx = get_index_sexp_variable_name(Team_data[i].weaponry_pool_variable[j]);
|
||||
Assert (var_idx > -1 && var_idx < MAX_SEXP_VARIABLES);
|
||||
|
||||
fout("\t@%s\t", Sexp_variables[Team_data[i].weaponry_pool_variable[j]].variable_name);
|
||||
fout("\t@%s\t", Sexp_variables[var_idx].variable_name);
|
||||
}
|
||||
else {
|
||||
fout("\t\"%s\"\t", Weapon_info[Team_data[i].weaponry_pool[j]].name);
|
||||
@@ -1192,13 +1227,14 @@ int CFred_mission_save::save_players()
|
||||
// now output the amount of this weapon or a variable that sets it. If this weapon is in the used pool and isn't
|
||||
// set by a variable we should add the amount of weapons used by the wings to it and zero the entry so we know
|
||||
// that we have dealt with it
|
||||
if (Team_data[i].weaponry_amount_variable[j] != -1) {
|
||||
Assert (Team_data[i].weaponry_amount_variable[j] > -1 && Team_data[i].weaponry_amount_variable[j] < MAX_SEXP_VARIABLES);
|
||||
if (strlen(Team_data[i].weaponry_amount_variable[j])) {
|
||||
var_idx = get_index_sexp_variable_name(Team_data[i].weaponry_amount_variable[j]);
|
||||
Assert (var_idx > -1 && var_idx < MAX_SEXP_VARIABLES);
|
||||
|
||||
fout ("@%s\n", Sexp_variables[Team_data[i].weaponry_amount_variable[j]].variable_name);
|
||||
fout ("@%s\n", Sexp_variables[var_idx].variable_name);
|
||||
}
|
||||
else {
|
||||
if (Team_data[i].weaponry_pool_variable[j] != -1) {
|
||||
if (strlen(Team_data[i].weaponry_pool_variable[j])) {
|
||||
fout ("%d\n", Team_data[i].weaponry_count[j]);
|
||||
}
|
||||
else {
|
||||
@@ -1626,27 +1662,117 @@ int CFred_mission_save::save_objects()
|
||||
fout(" %d", Ships[i].escort_priority);
|
||||
}
|
||||
|
||||
if (Ships[i].special_exp_index != -1) {
|
||||
if (optional_string_fred("+Special Exp index:", "$Name:")) {
|
||||
parse_comments();
|
||||
} else {
|
||||
fout("\n+Special Exp index:");
|
||||
}
|
||||
// special explosions
|
||||
if (Format_fs2_open != FSO_FORMAT_RETAIL) {
|
||||
if (Ships[i].use_special_explosion) {
|
||||
if (optional_string_fred("$Special Explosion:", "$Name:")) {
|
||||
parse_comments();
|
||||
|
||||
fout(" %d", Ships[i].special_exp_index);
|
||||
required_string_fred("+Special Exp Damage:");
|
||||
parse_comments();
|
||||
fout(" %d", Ships[i].special_exp_damage);
|
||||
|
||||
required_string_fred("+Special Exp Blast:");
|
||||
parse_comments();
|
||||
fout(" %d", Ships[i].special_exp_blast);
|
||||
|
||||
required_string_fred("+Special Exp Inner Radius:");
|
||||
parse_comments();
|
||||
fout(" %d", Ships[i].special_exp_inner);
|
||||
|
||||
required_string_fred("+Special Exp Outer Radius:");
|
||||
parse_comments();
|
||||
fout(" %d", Ships[i].special_exp_outer);
|
||||
|
||||
if (Ships[i].use_shockwave && (Ships[i].special_exp_shockwave_speed > 0)) {
|
||||
optional_string_fred("+Special Exp Shockwave Speed:");
|
||||
parse_comments();
|
||||
fout(" %d", Ships[i].special_exp_shockwave_speed);
|
||||
}
|
||||
else {
|
||||
bypass_comment(";;FSO 3.6.13;; +Special Exp Shockwave Speed:");
|
||||
}
|
||||
}
|
||||
else {
|
||||
fso_comment_push(";;FSO 3.6.13;;");
|
||||
fout_version("\n$Special Explosion:");
|
||||
|
||||
fout_version("\n+Special Exp Damage:");
|
||||
fout(" %d", Ships[i].special_exp_damage);
|
||||
|
||||
fout_version("\n+Special Exp Blast:");
|
||||
fout(" %d", Ships[i].special_exp_blast);
|
||||
|
||||
fout_version("\n+Special Exp Inner Radius:");
|
||||
fout(" %d", Ships[i].special_exp_inner);
|
||||
|
||||
fout_version("\n+Special Exp Outer Radius:");
|
||||
fout(" %d", Ships[i].special_exp_outer);
|
||||
|
||||
if (Ships[i].use_shockwave && (Ships[i].special_exp_shockwave_speed > 0)) {
|
||||
fout_version("\n+Special Exp Shockwave Speed:");
|
||||
fout(" %d", Ships[i].special_exp_shockwave_speed);
|
||||
}
|
||||
|
||||
fso_comment_pop();
|
||||
}
|
||||
}
|
||||
else {
|
||||
bypass_comment(";;FSO 3.6.13;; +Special Exp Shockwave Speed:");
|
||||
}
|
||||
}
|
||||
// retail format special explosions
|
||||
else {
|
||||
if (Ships[i].use_special_explosion) {
|
||||
int special_exp_index;
|
||||
|
||||
if (has_special_explosion_block_index(&Ships[i], &special_exp_index)) {
|
||||
fout("\n+Special Exp index:");
|
||||
fout(" %d", special_exp_index);
|
||||
}
|
||||
else {
|
||||
CString text = "You are saving in the retail mission format, but ";
|
||||
text += "the mission has too many special explosions defined. \"";
|
||||
text += Ships[i].ship_name;
|
||||
text += "\" has therefore lost any special explosion data that was defined for it. ";
|
||||
text += "\" Either remove special explosions or SEXP variables if you need it to have one ";
|
||||
MessageBox(NULL, text, "Too many variables!", MB_OK);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Goober5000 ------------------------------------------------
|
||||
if (Format_fs2_open != FSO_FORMAT_RETAIL)
|
||||
{
|
||||
if (Ships[i].special_hitpoint_index != -1) {
|
||||
if (optional_string_fred("+Special Hitpoint index:", "$Name:")) {
|
||||
if (Ships[i].special_hitpoints) {
|
||||
if (optional_string_fred("+Special Hitpoints:", "$Name:")) {
|
||||
parse_comments();
|
||||
} else {
|
||||
fout("\n+Special Hitpoint index:");
|
||||
fso_comment_push(";;FSO 3.6.13;;");
|
||||
fout_version("\n+Special Hitpoints:");
|
||||
fso_comment_pop();
|
||||
}
|
||||
|
||||
fout(" %d", Ships[i].special_hitpoint_index);
|
||||
fout(" %d", Ships[i].special_hitpoints);
|
||||
}
|
||||
else {
|
||||
bypass_comment(";;FSO 3.6.13;; +Special Hitpoints:");
|
||||
}
|
||||
|
||||
if (Ships[i].special_shield >= 0) {
|
||||
if (optional_string_fred("+Special Shield Points:", "$Name:")) {
|
||||
parse_comments();
|
||||
} else {
|
||||
fso_comment_push(";;FSO 3.6.13;;");
|
||||
fout_version("\n+Special Shield Points:");
|
||||
fso_comment_pop();
|
||||
}
|
||||
|
||||
fout(" %d", Ships[i].special_shield);
|
||||
}
|
||||
else {
|
||||
bypass_comment(";;FSO 3.6.13;; +Special Shield Points:");
|
||||
}
|
||||
}
|
||||
// -----------------------------------------------------------
|
||||
@@ -1864,9 +1990,9 @@ int CFred_mission_save::save_common_object_data(object *objp, ship *shipp)
|
||||
}
|
||||
|
||||
// Goober5000
|
||||
if (Format_fs2_open != FSO_FORMAT_RETAIL && (shipp->special_hitpoint_index != -1))
|
||||
if (Format_fs2_open != FSO_FORMAT_RETAIL && (shipp->special_hitpoints))
|
||||
{
|
||||
temp_max_hull_strength = (float) atoi(Sexp_variables[shipp->special_hitpoint_index+HULL_STRENGTH].text);
|
||||
temp_max_hull_strength = (float)shipp->special_hitpoints;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include "parse/sexp.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#include "OperatorArgTypeSelect.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#include "FREDView.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#include "weapon/weapon.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
@@ -95,22 +94,32 @@ BOOL player_start_editor::OnInitDialog()
|
||||
for(idx=0; idx<Team_data[i].num_ship_choices; idx++)
|
||||
{
|
||||
// do we have a variable for this entry? if we don't....
|
||||
if (Team_data[i].ship_list_variables[idx] == -1)
|
||||
if (!strlen(Team_data[i].ship_list_variables[idx]))
|
||||
{
|
||||
// This pool is set to hold the number of ships available at an index corresponding to the Ship_info array.
|
||||
static_ship_pool[i][Team_data[i].ship_list[idx]] = Team_data[i].ship_count[idx];
|
||||
// This pool is set to hold whether a ship at a Ship_info index has been set by a variable (and the
|
||||
// variables index in Sexp_variables) if it has).
|
||||
static_ship_variable_pool[i][Team_data[i].ship_list[idx]] = Team_data[i].ship_count_variables[idx];
|
||||
if (strlen(Team_data[i].ship_count_variables[idx])) {
|
||||
static_ship_variable_pool[i][Team_data[i].ship_list[idx]] = get_index_sexp_variable_name(Team_data[i].ship_count_variables[idx]);
|
||||
}
|
||||
else {
|
||||
static_ship_variable_pool[i][Team_data[i].ship_list[idx]] = -1;
|
||||
}
|
||||
}
|
||||
// if we do....
|
||||
else
|
||||
{
|
||||
// This pool is set to hold the number of ships available at an index corresponding to the Sexp_variables array
|
||||
dynamic_ship_pool[i][Team_data[i].ship_list_variables[idx]] = Team_data[i].ship_count[idx];
|
||||
dynamic_ship_pool[i][get_index_sexp_variable_name(Team_data[i].ship_list_variables[idx])] = Team_data[i].ship_count[idx];
|
||||
// This pool is set to hold whether a ship at a Ship_info index has been set by a variable (and the
|
||||
// variables index in Sexp_variables) if it has).
|
||||
dynamic_ship_variable_pool[i][Team_data[i].ship_list_variables[idx]] = Team_data[i].ship_count_variables[idx];
|
||||
if (strlen(Team_data[i].ship_count_variables[idx])) {
|
||||
dynamic_ship_variable_pool[i][get_index_sexp_variable_name(Team_data[i].ship_list_variables[idx])] = get_index_sexp_variable_name(Team_data[i].ship_count_variables[idx]);
|
||||
}
|
||||
else {
|
||||
dynamic_ship_variable_pool[i][get_index_sexp_variable_name(Team_data[i].ship_list_variables[idx])] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -125,16 +134,26 @@ BOOL player_start_editor::OnInitDialog()
|
||||
for(idx=0; idx<Team_data[i].num_weapon_choices; idx++)
|
||||
{
|
||||
// do we have a variable for this entry?
|
||||
if (Team_data[i].weaponry_pool_variable[idx] == -1)
|
||||
if (!strlen(Team_data[i].weaponry_pool_variable[idx]))
|
||||
{
|
||||
static_weapon_pool[i][Team_data[i].weaponry_pool[idx]] = Team_data[i].weaponry_count[idx];
|
||||
static_weapon_variable_pool[i][Team_data[i].weaponry_pool[idx]] = Team_data[i].weaponry_amount_variable[idx];
|
||||
if (strlen(Team_data[i].weaponry_amount_variable[idx])) {
|
||||
static_weapon_variable_pool[i][Team_data[i].weaponry_pool[idx]] = get_index_sexp_variable_name(Team_data[i].weaponry_amount_variable[idx]);
|
||||
}
|
||||
else {
|
||||
static_weapon_variable_pool[i][Team_data[i].weaponry_pool[idx]] = -1;
|
||||
}
|
||||
}
|
||||
// if we do....
|
||||
else
|
||||
{
|
||||
dynamic_weapon_pool[i][Team_data[i].weaponry_pool_variable[idx]] = Team_data[i].weaponry_count[idx];
|
||||
dynamic_weapon_variable_pool[i][Team_data[i].weaponry_pool_variable[idx]] = Team_data[i].weaponry_amount_variable[idx];
|
||||
dynamic_weapon_pool[i][get_index_sexp_variable_name(Team_data[i].weaponry_pool_variable[idx])] = Team_data[i].weaponry_count[idx];
|
||||
if (strlen(Team_data[i].weaponry_amount_variable[idx])) {
|
||||
dynamic_weapon_variable_pool[i][get_index_sexp_variable_name(Team_data[i].weaponry_pool_variable[idx])] = get_index_sexp_variable_name(Team_data[i].weaponry_amount_variable[idx]);
|
||||
}
|
||||
else {
|
||||
dynamic_weapon_variable_pool[i][get_index_sexp_variable_name(Team_data[i].weaponry_pool_variable[idx])] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -760,18 +779,24 @@ void player_start_editor::OnOK()
|
||||
|
||||
|
||||
// Copy the variable to Team_data
|
||||
Team_data[i].ship_list_variables[num_choices] = idx;
|
||||
if (idx != -1) {
|
||||
Assert (idx < MAX_SEXP_VARIABLES);
|
||||
strcpy_s(Team_data[i].ship_list_variables[num_choices], Sexp_variables[idx].variable_name);
|
||||
}
|
||||
else {
|
||||
strcpy_s(Team_data[i].ship_list_variables[num_choices], "");
|
||||
}
|
||||
Team_data[i].ship_list[num_choices] = -1;
|
||||
|
||||
// Now we need to set the number of this type available
|
||||
if (dynamic_ship_variable_pool[i][idx] == -1) {
|
||||
Team_data[i].ship_count[num_choices] = dynamic_ship_pool[i][idx];
|
||||
Team_data[i].ship_count_variables[num_choices] = -1;
|
||||
strcpy_s(Team_data[i].ship_count_variables[num_choices], "");
|
||||
}
|
||||
else {
|
||||
Assert (Sexp_variables[dynamic_ship_variable_pool[i][idx]].type & SEXP_VARIABLE_NUMBER);
|
||||
|
||||
Team_data[i].ship_count_variables[num_choices] = dynamic_ship_variable_pool[i][idx];
|
||||
strcpy_s(Team_data[i].ship_count_variables[num_choices], Sexp_variables[dynamic_ship_variable_pool[i][idx]].variable_name);
|
||||
Team_data[i].ship_count[num_choices] = atoi(Sexp_variables[dynamic_ship_variable_pool[i][idx]].text);
|
||||
}
|
||||
|
||||
@@ -785,17 +810,17 @@ void player_start_editor::OnOK()
|
||||
// if we have ships here
|
||||
if(static_ship_pool[i][idx] > 0 || static_ship_variable_pool[i][idx] > -1) {
|
||||
Team_data[i].ship_list[num_choices] = idx;
|
||||
Team_data[i].ship_list_variables[num_choices] = -1;
|
||||
strcpy_s(Team_data[i].ship_list_variables[num_choices], "");
|
||||
|
||||
// Now set the number of this class available
|
||||
if (static_ship_variable_pool[i][idx] == -1) {
|
||||
Team_data[i].ship_count[num_choices] = static_ship_pool[i][idx];
|
||||
Team_data[i].ship_count_variables[num_choices] = -1;
|
||||
strcpy_s(Team_data[i].ship_count_variables[num_choices], "");
|
||||
}
|
||||
else {
|
||||
Assert (Sexp_variables[static_ship_variable_pool[i][idx]].type & SEXP_VARIABLE_NUMBER);
|
||||
|
||||
Team_data[i].ship_count_variables[num_choices] = static_ship_variable_pool[i][idx];
|
||||
strcpy_s(Team_data[i].ship_count_variables[num_choices], Sexp_variables[static_ship_variable_pool[i][idx]].variable_name);
|
||||
Team_data[i].ship_count[num_choices] = atoi(Sexp_variables[static_ship_variable_pool[i][idx]].text);
|
||||
}
|
||||
|
||||
@@ -830,20 +855,20 @@ void player_start_editor::OnOK()
|
||||
}
|
||||
|
||||
// Copy the variable to Team_data
|
||||
Team_data[i].weaponry_pool_variable[num_choices] = idx;
|
||||
strcpy_s(Team_data[i].weaponry_pool_variable[num_choices], Sexp_variables[idx].variable_name);
|
||||
Team_data[i].weaponry_pool[num_choices] = -1;
|
||||
|
||||
// Now we need to set the number of this class available
|
||||
if (dynamic_weapon_variable_pool[i][idx] == -1)
|
||||
{
|
||||
Team_data[i].weaponry_count[num_choices] = dynamic_weapon_pool[i][idx];
|
||||
Team_data[i].weaponry_amount_variable[num_choices] = -1;
|
||||
strcpy_s(Team_data[i].weaponry_amount_variable[num_choices], "");
|
||||
}
|
||||
else
|
||||
{
|
||||
Assert (Sexp_variables[dynamic_weapon_variable_pool[i][idx]].type & SEXP_VARIABLE_NUMBER);
|
||||
|
||||
Team_data[i].weaponry_amount_variable[num_choices] = dynamic_weapon_variable_pool[i][idx];
|
||||
strcpy_s(Team_data[i].weaponry_amount_variable[num_choices], Sexp_variables[dynamic_weapon_variable_pool[i][idx]].variable_name);
|
||||
Team_data[i].weaponry_count[num_choices] = atoi(Sexp_variables[dynamic_weapon_variable_pool[i][idx]].text);
|
||||
}
|
||||
|
||||
@@ -859,19 +884,19 @@ void player_start_editor::OnOK()
|
||||
if(static_weapon_pool[i][idx] > 0 || static_weapon_variable_pool[i][idx] > -1)
|
||||
{
|
||||
Team_data[i].weaponry_pool[num_choices] = idx;
|
||||
Team_data[i].weaponry_pool_variable[num_choices] = -1;
|
||||
strcpy_s(Team_data[i].weaponry_pool_variable[num_choices], "");
|
||||
|
||||
// Now set the number of this class available
|
||||
if (static_weapon_variable_pool[i][idx] == -1)
|
||||
{
|
||||
Team_data[i].weaponry_count[num_choices] = static_weapon_pool[i][idx];
|
||||
Team_data[i].weaponry_amount_variable[num_choices] = -1;
|
||||
strcpy_s(Team_data[i].weaponry_amount_variable[num_choices], "");
|
||||
}
|
||||
else
|
||||
{
|
||||
Assert (Sexp_variables[static_weapon_variable_pool[i][idx]].type & SEXP_VARIABLE_NUMBER);
|
||||
|
||||
Team_data[i].weaponry_amount_variable[num_choices] = static_weapon_variable_pool[i][idx];
|
||||
strcpy_s(Team_data[i].weaponry_amount_variable[num_choices], Sexp_variables[static_weapon_variable_pool[i][idx]].variable_name);
|
||||
Team_data[i].weaponry_count[num_choices] = atoi(Sexp_variables[static_weapon_variable_pool[i][idx]].text);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include "FREDView.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#define ID_WING_DATA 9000
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
+16
-2
@@ -123,6 +123,7 @@
|
||||
#define IDB_DATA_90 314
|
||||
#define IDB_DATA_95 315
|
||||
#define IDD_FICTION_VIEWER 318
|
||||
#define IDD_SOUND_ENVIRONMENT 319
|
||||
#define IDC_SHIP_CLASS 1003
|
||||
#define IDC_SHIP_WING 1004
|
||||
#define IDC_SOUND_CLIP_NAME 1007
|
||||
@@ -531,6 +532,7 @@
|
||||
#define IDC_ASCT1_CLASS_COMBO1 1188
|
||||
#define IDC_SHIP_VARIABLES_COMBO 1188
|
||||
#define IDC_SUFFIX 1188
|
||||
#define IDC_SOUND_ENVIRONMENT 1188
|
||||
#define IDC_CREATED 1189
|
||||
#define IDC_DEPARTURE_TARGET 1189
|
||||
#define IDC_SBITMAP 1189
|
||||
@@ -777,6 +779,7 @@
|
||||
#define IDC_SPECIAL_INNER_RAD 1343
|
||||
#define IDC_SQUAD_LOGO 1343
|
||||
#define IDC_SQUADRON_WING_NAME_1 1343
|
||||
#define IDC_SOUND_ENVIRONMENT_DAMPING 1343
|
||||
#define IDC_EDIT3 1344
|
||||
#define IDC_AMMO3 1344
|
||||
#define IDC_TIME 1344
|
||||
@@ -790,6 +793,7 @@
|
||||
#define IDC_ABBREV_CAMPAIGN 1344
|
||||
#define IDC_TVT_WING_NAME_1 1344
|
||||
#define IDC_ASSIST_SCORE 1344
|
||||
#define IDC_SOUND_ENVIRONMENT_VOLUME 1344
|
||||
#define IDC_EDIT4 1345
|
||||
#define IDC_AMMO4 1345
|
||||
#define IDC_VOICE 1345
|
||||
@@ -1048,6 +1052,7 @@
|
||||
#define IDC_SPECIAL_SHIELDS 1555
|
||||
#define IDC_SPECIAL_HULL 1556
|
||||
#define IDC_LOADING_SCREEN_BUTTON1024 1557
|
||||
#define IDC_ENABLE_SPECIAL_SHIELD 1557
|
||||
#define IDC_LOADING_SCREEN640 1558
|
||||
#define IDC_TYPE_CAMPAIGN_PERSISTENT 1559
|
||||
#define IDC_MAX_HULL_REPAIR_VAL 1559
|
||||
@@ -1127,6 +1132,15 @@
|
||||
#define IDC_STORY_FILE 1618
|
||||
#define IDC_FONT_FILE 1619
|
||||
#define IDC_FICTION_MUSIC 1620
|
||||
#define IDC_SOUND_ENVIRONMENT_LABEL 1621
|
||||
#define IDC_SOUND_ENVIRONMENT_VOLUME_LABEL 1622
|
||||
#define IDC_SOUND_ENVIRONENT_DAMPING_LABEL 1623
|
||||
#define IDC_SOUND_ENVIRONMENT_DECAY_LABEL 1624
|
||||
#define IDC_SOUND_ENVIRONMENT_DECAY 1625
|
||||
#define IDC_SOUND_ENVIRONMENT_BUTTON 1626
|
||||
#define IDC_SOUND_ENVIRONMENT_TEST 1627
|
||||
#define IDC_GROUP_MESSAGES 1628
|
||||
#define IDC_INCLUDE_SENDER 1629
|
||||
#define ID_FILE_MISSIONNOTES 32771
|
||||
#define ID_DUPLICATE 32774
|
||||
#define ID_VIEW_ROTATE 32775
|
||||
@@ -1418,9 +1432,9 @@
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_3D_CONTROLS 1
|
||||
#define _APS_NEXT_RESOURCE_VALUE 319
|
||||
#define _APS_NEXT_RESOURCE_VALUE 320
|
||||
#define _APS_NEXT_COMMAND_VALUE 33098
|
||||
#define _APS_NEXT_CONTROL_VALUE 1621
|
||||
#define _APS_NEXT_CONTROL_VALUE 1629
|
||||
#define _APS_NEXT_SYMED_VALUE 105
|
||||
#endif
|
||||
#endif
|
||||
@@ -13,7 +13,6 @@
|
||||
#include "model/model.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
#include "SetGlobalShipFlags.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
+166
-21
@@ -43,6 +43,8 @@
|
||||
#include "iff_defs/iff_defs.h"
|
||||
#include "mission/missionmessage.h"
|
||||
#include "graphics/gropenglshader.h"
|
||||
#include "graphics/gropenglpostprocessing.h"
|
||||
#include "sound/ds.h"
|
||||
|
||||
#define TREE_NODE_INCREMENT 100
|
||||
|
||||
@@ -55,7 +57,6 @@
|
||||
// note: stay below 0xe000 so we don't collide with MFC defines..
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
@@ -867,8 +868,9 @@ void sexp_tree::right_clicked(int mode)
|
||||
case OP_TECH_ADD_INTEL:
|
||||
case OP_TECH_RESET_TO_DEFAULT:
|
||||
#endif*/
|
||||
// unlike the above operators, this one is deprecated
|
||||
// unlike the above operators, these are deprecated
|
||||
case OP_HITS_LEFT_SUBSYSTEM:
|
||||
case OP_CUTSCENES_SHOW_SUBTITLE:
|
||||
j = Num_op_menus; // don't allow these operators to be visible
|
||||
break;
|
||||
}
|
||||
@@ -904,8 +906,9 @@ void sexp_tree::right_clicked(int mode)
|
||||
case OP_TECH_ADD_INTEL:
|
||||
case OP_TECH_RESET_TO_DEFAULT:
|
||||
#endif*/
|
||||
// unlike the above operators, this one is deprecated
|
||||
// unlike the above operators, these are deprecated
|
||||
case OP_HITS_LEFT_SUBSYSTEM:
|
||||
case OP_CUTSCENES_SHOW_SUBTITLE:
|
||||
j = Num_submenus; // don't allow these operators to be visible
|
||||
break;
|
||||
}
|
||||
@@ -1145,7 +1148,7 @@ void sexp_tree::right_clicked(int mode)
|
||||
}
|
||||
|
||||
// modify string or number if (modify_variable)
|
||||
if ( Operators[op].value == OP_MODIFY_VARIABLE || Operators[op].value == OP_SET_VARIABLE_BY_INDEX ) {
|
||||
if ( Operators[op].value == OP_MODIFY_VARIABLE ) {
|
||||
int modify_type = get_modify_variable_type(parent);
|
||||
|
||||
if (modify_type == OPF_NUMBER) {
|
||||
@@ -1154,6 +1157,24 @@ void sexp_tree::right_clicked(int mode)
|
||||
}
|
||||
// no change for string type
|
||||
}
|
||||
else if ( Operators[op].value == OP_SET_VARIABLE_BY_INDEX ) {
|
||||
// it depends on which argument we are modifying
|
||||
// first argument is always a number
|
||||
if (Replace_count == 0) {
|
||||
menu.EnableMenuItem(ID_REPLACE_NUMBER, MF_ENABLED);
|
||||
menu.EnableMenuItem(ID_REPLACE_STRING, MF_GRAYED);
|
||||
}
|
||||
// second argument could be anything
|
||||
else {
|
||||
int modify_type = get_modify_variable_type(parent);
|
||||
|
||||
if (modify_type == OPF_NUMBER) {
|
||||
menu.EnableMenuItem(ID_REPLACE_NUMBER, MF_ENABLED);
|
||||
menu.EnableMenuItem(ID_REPLACE_STRING, MF_GRAYED);
|
||||
}
|
||||
// no change for string type
|
||||
}
|
||||
}
|
||||
|
||||
list->destroy();
|
||||
|
||||
@@ -2553,6 +2574,14 @@ int sexp_tree::get_default_value(sexp_list_item *item, int op, int i)
|
||||
str = "<persona name>";
|
||||
break;
|
||||
|
||||
case OPF_FONT:
|
||||
str = Fonts[0].filename;
|
||||
break;
|
||||
|
||||
case OPF_AUDIO_VOLUME_OPTION:
|
||||
str = "Music";
|
||||
break;
|
||||
|
||||
default:
|
||||
str = "<new default required!>";
|
||||
break;
|
||||
@@ -2632,6 +2661,13 @@ int sexp_tree::query_default_argument_available(int op, int i)
|
||||
case OPF_POST_EFFECT:
|
||||
case OPF_TARGET_PRIORITIES:
|
||||
case OPF_ARMOR_TYPES:
|
||||
case OPF_FONT:
|
||||
case OPF_HUD_ELEMENT:
|
||||
case OPF_SOUND_ENVIRONMENT:
|
||||
case OPF_SOUND_ENVIRONMENT_OPTION:
|
||||
case OPF_EXPLOSION_OPTION:
|
||||
case OPF_AUDIO_VOLUME_OPTION:
|
||||
case OPF_WEAPON_BANK_NUMBER:
|
||||
return 1;
|
||||
|
||||
case OPF_SHIP:
|
||||
@@ -3136,20 +3172,27 @@ void get_variable_name_from_sexp_tree_node_text(const char *text, char *var_name
|
||||
|
||||
int sexp_tree::get_modify_variable_type(int parent)
|
||||
{
|
||||
Assert(parent >= 0);
|
||||
int sexp_var_index = -1;
|
||||
|
||||
Assert(parent >= 0);
|
||||
int op_const = get_operator_const(tree_nodes[parent].text);
|
||||
|
||||
Assert(tree_nodes[parent].child >= 0);
|
||||
char *node_text = tree_nodes[tree_nodes[parent].child].text;
|
||||
|
||||
if ( op_const == OP_MODIFY_VARIABLE ) {
|
||||
Assert(tree_nodes[parent].child >= 0);
|
||||
sexp_var_index = get_tree_name_to_sexp_variable_index(tree_nodes[tree_nodes[parent].child].text);
|
||||
sexp_var_index = get_tree_name_to_sexp_variable_index(node_text);
|
||||
Assert(sexp_var_index >= 0);
|
||||
} else if ( op_const == OP_SET_VARIABLE_BY_INDEX ) {
|
||||
Assert(tree_nodes[parent].child != -1);
|
||||
if (can_construe_as_integer(tree_nodes[tree_nodes[parent].child].text)) {
|
||||
sexp_var_index = atoi(tree_nodes[tree_nodes[parent].child].text);
|
||||
}
|
||||
else if ( op_const == OP_SET_VARIABLE_BY_INDEX ) {
|
||||
if (can_construe_as_integer(node_text)) {
|
||||
sexp_var_index = atoi(node_text);
|
||||
Assert(sexp_var_index >= 0);
|
||||
}
|
||||
else if (strchr(node_text, '(') && strchr(node_text, ')')) {
|
||||
// the variable index is itself a variable!
|
||||
return OPF_AMBIGUOUS;
|
||||
}
|
||||
} else {
|
||||
Int3(); // should not be called otherwise
|
||||
}
|
||||
@@ -4318,6 +4361,34 @@ sexp_list_item *sexp_tree::get_listing_opf(int opf, int parent_node, int arg_ind
|
||||
list = get_listing_opf_post_effect();
|
||||
break;
|
||||
|
||||
case OPF_FONT:
|
||||
list = get_listing_opf_font();
|
||||
break;
|
||||
|
||||
case OPF_HUD_ELEMENT:
|
||||
list = get_listing_opf_hud_elements();
|
||||
break;
|
||||
|
||||
case OPF_SOUND_ENVIRONMENT:
|
||||
list = get_listing_opf_sound_environment();
|
||||
break;
|
||||
|
||||
case OPF_SOUND_ENVIRONMENT_OPTION:
|
||||
list = get_listing_opf_sound_environment_option();
|
||||
break;
|
||||
|
||||
case OPF_AUDIO_VOLUME_OPTION:
|
||||
list = get_listing_opf_adjust_audio_volume();
|
||||
break;
|
||||
|
||||
case OPF_EXPLOSION_OPTION:
|
||||
list = get_listing_opf_explosion_option();
|
||||
break;
|
||||
|
||||
case OPF_WEAPON_BANK_NUMBER:
|
||||
list = get_listing_opf_weapon_banks();
|
||||
break;
|
||||
|
||||
default:
|
||||
Int3(); // unknown OPF code
|
||||
list = NULL;
|
||||
@@ -5116,6 +5187,18 @@ sexp_list_item *sexp_tree::get_listing_opf_persona()
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_font()
|
||||
{
|
||||
int i;
|
||||
sexp_list_item head;
|
||||
|
||||
for (i = 0; i < Num_fonts; i++) {
|
||||
head.add_data(Fonts[i].filename);
|
||||
}
|
||||
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_who_from()
|
||||
{
|
||||
object *ptr;
|
||||
@@ -5147,6 +5230,50 @@ sexp_list_item *sexp_tree::get_listing_opf_priority()
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_sound_environment()
|
||||
{
|
||||
sexp_list_item head;
|
||||
|
||||
head.add_data(SEXP_NONE_STRING);
|
||||
for (int i = 0; i < (int)EFX_presets.size(); i++) {
|
||||
// ugh
|
||||
char *text = const_cast<char*>(EFX_presets[i].name.c_str());
|
||||
head.add_data(text);
|
||||
}
|
||||
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_sound_environment_option()
|
||||
{
|
||||
sexp_list_item head;
|
||||
|
||||
for (int i = 0; i < Num_sound_environment_options; i++)
|
||||
head.add_data(Sound_environment_option[i]);
|
||||
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_adjust_audio_volume()
|
||||
{
|
||||
sexp_list_item head;
|
||||
|
||||
for (int i = 0; i < Num_adjust_audio_options; i++)
|
||||
head.add_data(Adjust_audio_options[i]);
|
||||
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_explosion_option()
|
||||
{
|
||||
sexp_list_item head;
|
||||
|
||||
for (int i = 0; i < Num_explosion_options; i++)
|
||||
head.add_data(Explosion_option[i]);
|
||||
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_waypoint_path()
|
||||
{
|
||||
int i;
|
||||
@@ -5377,7 +5504,7 @@ sexp_list_item *sexp_tree::get_listing_opf_string()
|
||||
{
|
||||
sexp_list_item head;
|
||||
|
||||
head.add_data("<any string>");
|
||||
head.add_data(SEXP_ANY_STRING);
|
||||
|
||||
return head.next;
|
||||
}
|
||||
@@ -5567,7 +5694,7 @@ sexp_list_item *sexp_tree::get_listing_opf_nebula_storm_type()
|
||||
sexp_list_item head;
|
||||
int i;
|
||||
|
||||
head.add_data("none");
|
||||
head.add_data(SEXP_NONE_STRING);
|
||||
|
||||
for (i=0; i < Num_storm_types; i++)
|
||||
{
|
||||
@@ -5605,9 +5732,11 @@ sexp_list_item *sexp_tree::get_listing_opf_post_effect()
|
||||
{
|
||||
unsigned int i;
|
||||
sexp_list_item head;
|
||||
SCP_vector<opengl::post_effect> &ppe_names = opengl::post_shader::get_effects();
|
||||
for (i=0; i < ppe_names.size(); i++)
|
||||
head.add_data(const_cast<char*>(ppe_names[i].name.c_str()));
|
||||
SCP_vector<SCP_string> ppe_names;
|
||||
get_post_process_effect_names(ppe_names);
|
||||
for (i=0; i < ppe_names.size(); i++) {
|
||||
head.add_data(const_cast<char*>(ppe_names[i].c_str()));
|
||||
}
|
||||
|
||||
return head.next;
|
||||
}
|
||||
@@ -5636,6 +5765,22 @@ sexp_list_item *sexp_tree::get_listing_opf_armor_types()
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_hud_elements()
|
||||
{
|
||||
sexp_list_item head;
|
||||
head.add_data("warpout");
|
||||
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_weapon_banks()
|
||||
{
|
||||
sexp_list_item head;
|
||||
head.add_data(SEXP_ALL_BANKS_STRING);
|
||||
|
||||
return head.next;
|
||||
}
|
||||
|
||||
// Deletes sexp_variable from sexp_tree.
|
||||
// resets tree to not include given variable, and resets text and type
|
||||
void sexp_tree::delete_sexp_tree_variable(const char *var_name)
|
||||
@@ -5776,20 +5921,20 @@ int sexp_tree::get_loadout_variable_count(int var_index)
|
||||
|
||||
for (int i=0; i < MAX_TVT_TEAMS; i++) {
|
||||
for(idx=0; idx<Team_data[i].num_ship_choices; idx++) {
|
||||
if (var_index == Team_data[i].ship_list_variables[idx]) {
|
||||
if (!strcmp(Team_data[i].ship_list_variables[idx], Sexp_variables[var_index].variable_name)) {
|
||||
count++;
|
||||
}
|
||||
|
||||
if (var_index == Team_data[i].ship_count_variables[idx]) {
|
||||
count++;
|
||||
if (!strcmp(Team_data[i].ship_count_variables[idx], Sexp_variables[var_index].variable_name)) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
for (idx=0; idx<Team_data[i].num_weapon_choices; idx++) {
|
||||
if (var_index == Team_data[i].weaponry_pool_variable[idx]) {
|
||||
if (!strcmp(Team_data[i].weaponry_pool_variable[idx], Sexp_variables[var_index].variable_name)) {
|
||||
count++;
|
||||
}
|
||||
if (var_index == Team_data[i].weaponry_amount_variable[idx]) {
|
||||
if (!strcmp(Team_data[i].weaponry_amount_variable[idx], Sexp_variables[var_index].variable_name)) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -236,7 +236,6 @@ public:
|
||||
sexp_list_item *get_listing_opf_sun_bitmap();
|
||||
sexp_list_item *get_listing_opf_nebula_storm_type();
|
||||
sexp_list_item *get_listing_opf_nebula_poof();
|
||||
// Goober5000 ----------------------------------------------
|
||||
sexp_list_item *get_listing_opf_cargo();
|
||||
sexp_list_item *get_listing_opf_ai_class();
|
||||
sexp_list_item *get_listing_opf_support_ship_class();
|
||||
@@ -256,8 +255,14 @@ public:
|
||||
sexp_list_item *get_listing_opf_armor_types();
|
||||
sexp_list_item *get_listing_opf_turret_target_priorities();
|
||||
sexp_list_item *get_listing_opf_persona();
|
||||
// ---------------------------------------------------------
|
||||
sexp_list_item *get_listing_opf_font();
|
||||
sexp_list_item *get_listing_opf_post_effect();
|
||||
sexp_list_item *get_listing_opf_hud_elements();
|
||||
sexp_list_item *get_listing_opf_sound_environment();
|
||||
sexp_list_item *get_listing_opf_sound_environment_option();
|
||||
sexp_list_item *get_listing_opf_explosion_option();
|
||||
sexp_list_item *get_listing_opf_adjust_audio_volume();
|
||||
sexp_list_item *get_listing_opf_weapon_banks();
|
||||
|
||||
int m_mode;
|
||||
int item_index;
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#include "iff_defs/iff_defs.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#define ACTIVITY_WING 2
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#include "ShipClassEditorDlg.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -47,7 +47,6 @@
|
||||
#define NO_PERSONA_INDEX 999
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
@@ -1253,9 +1252,16 @@ int CShipEditorDlg::update_ship(int ship)
|
||||
if (strlen(m_cargo1)) {
|
||||
z = string_lookup(m_cargo1, Cargo_names, Num_cargo);
|
||||
if (z == -1) {
|
||||
Assert(Num_cargo < MAX_CARGO);
|
||||
z = Num_cargo++;
|
||||
strcpy(Cargo_names[z], m_cargo1);
|
||||
if (Num_cargo < MAX_CARGO) {
|
||||
z = Num_cargo++;
|
||||
strcpy(Cargo_names[z], m_cargo1);
|
||||
}
|
||||
else {
|
||||
str.Format("Maximum number of cargo names (%d) reached.\nIgnoring new name.\n", MAX_CARGO);
|
||||
MessageBox(str, "Error", MB_ICONEXCLAMATION);
|
||||
z = 0;
|
||||
m_cargo1 = Cargo_names[z];
|
||||
}
|
||||
}
|
||||
|
||||
MODIFY(Ships[ship].cargo1, (char)z);
|
||||
@@ -1314,7 +1320,7 @@ int CShipEditorDlg::update_ship(int ship)
|
||||
m_arrival_delay.save(&Ships[ship].arrival_delay);
|
||||
m_departure_delay.save(&Ships[ship].departure_delay);
|
||||
if (m_arrival_target >= 0) {
|
||||
z = ((CComboBox *) GetDlgItem(IDC_ARRIVAL_TARGET)) -> GetItemData(m_arrival_target);
|
||||
z = ((CComboBox *) GetDlgItem(IDC_ARRIVAL_TARGET))->GetItemData(m_arrival_target);
|
||||
MODIFY(Ships[ship].arrival_anchor, z);
|
||||
|
||||
// if the arrival is not hyperspace or docking bay -- force arrival distance to be
|
||||
@@ -1324,7 +1330,7 @@ int CShipEditorDlg::update_ship(int ship)
|
||||
if ((Ships[ship].arrival_distance < d) && (Ships[ship].arrival_distance > -d)) {
|
||||
str.Format("Ship must arrive at least %d meters away from target.\n"
|
||||
"Value has been reset to this. Use with caution!\r\n"
|
||||
"Reccomended distance is %d meters.\r\n", d, (int)(2.0f * Objects[Ships[ship].objnum].radius) );
|
||||
"Recommended distance is %d meters.\r\n", d, (int)(2.0f * Objects[Ships[ship].objnum].radius) );
|
||||
|
||||
MessageBox(str);
|
||||
if (Ships[ship].arrival_distance < 0)
|
||||
@@ -1336,8 +1342,10 @@ int CShipEditorDlg::update_ship(int ship)
|
||||
}
|
||||
}
|
||||
}
|
||||
z = ((CComboBox *)GetDlgItem(IDC_DEPARTURE_TARGET))->GetItemData(m_departure_target);
|
||||
MODIFY(Ships[ship].departure_anchor, z );
|
||||
if (m_departure_target >= 0) {
|
||||
z = ((CComboBox *) GetDlgItem(IDC_DEPARTURE_TARGET))->GetItemData(m_departure_target);
|
||||
MODIFY(Ships[ship].departure_anchor, z );
|
||||
}
|
||||
}
|
||||
|
||||
if (m_hotkey != -1)
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include "globalincs/linklist.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#define DATA_MASK 0x0fff
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#include "FREDDoc.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
@@ -42,15 +41,15 @@ void ShipSpecialDamage::DoDataExchange(CDataExchange* pDX)
|
||||
DDX_Check(pDX, IDC_ENABLE_SHOCKWAVE, m_shock_enabled);
|
||||
DDX_Check(pDX, IDC_ENABLE_SPECIAL_EXP, m_special_exp_enabled);
|
||||
DDX_Text(pDX, IDC_SPECIAL_INNER_RAD, m_inner_rad);
|
||||
DDV_MinMaxInt(pDX, m_inner_rad, 10, 10000);
|
||||
DDV_MinMaxInt(pDX, m_inner_rad, 1, INT_MAX);
|
||||
DDX_Text(pDX, IDC_SPECIAL_OUTER_RAD, m_outer_rad);
|
||||
DDV_MinMaxInt(pDX, m_outer_rad, 11, 10000);
|
||||
DDV_MinMaxInt(pDX, m_outer_rad, 2, INT_MAX);
|
||||
DDX_Text(pDX, IDC_SPECIAL_DAMAGE, m_damage);
|
||||
DDV_MinMaxInt(pDX, m_damage, 0, 100000);
|
||||
DDV_MinMaxInt(pDX, m_damage, 0, INT_MAX);
|
||||
DDX_Text(pDX, IDC_SPECIAL_SHOCK_SPEED, m_shock_speed);
|
||||
DDV_MinMaxInt(pDX, m_shock_speed, 10, 10000);
|
||||
DDV_MinMaxInt(pDX, m_shock_speed, 0, INT_MAX);
|
||||
DDX_Text(pDX, IDC_SPECIAL_BLAST, m_blast);
|
||||
DDV_MinMaxInt(pDX, m_blast, 0, 100000);
|
||||
DDV_MinMaxInt(pDX, m_blast, 0, INT_MAX);
|
||||
//}}AFX_DATA_MAP
|
||||
}
|
||||
|
||||
@@ -71,7 +70,8 @@ void ShipSpecialDamage::OnEnableShockwave()
|
||||
UpdateData(TRUE);
|
||||
|
||||
// enable/disable shock speed
|
||||
DoGray();}
|
||||
DoGray();
|
||||
}
|
||||
|
||||
void ShipSpecialDamage::OnEnableSpecialExp()
|
||||
{
|
||||
@@ -89,21 +89,23 @@ BOOL ShipSpecialDamage::OnInitDialog()
|
||||
// get ship num
|
||||
object *objp;
|
||||
|
||||
m_ship_num = -1;
|
||||
num_selected_ships = 0;
|
||||
|
||||
objp = GET_FIRST(&obj_used_list);
|
||||
while (objp != END_OF_LIST(&obj_used_list)) {
|
||||
if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) {
|
||||
if (objp->flags & OF_MARKED) {
|
||||
|
||||
m_ship_num = objp->instance;
|
||||
break;
|
||||
m_selected_ships[num_selected_ships] = objp->instance;
|
||||
num_selected_ships++;
|
||||
}
|
||||
}
|
||||
objp = GET_NEXT(objp);
|
||||
}
|
||||
|
||||
if (Ships[m_ship_num].special_exp_index == -1) {
|
||||
Assert (Objects[cur_object_index].flags & OF_MARKED);
|
||||
m_ship_num = Objects[cur_object_index].instance;
|
||||
|
||||
if (!(Ships[m_ship_num].use_special_explosion)) {
|
||||
// get default_table_values
|
||||
ship_info *sip;
|
||||
sip = &Ship_info[Ships[m_ship_num].ship_info_index];
|
||||
@@ -116,19 +118,23 @@ BOOL ShipSpecialDamage::OnInitDialog()
|
||||
m_shock_speed = (int) sip->shockwave.speed;
|
||||
m_special_exp_enabled = FALSE;
|
||||
|
||||
if (m_inner_rad < 10) m_inner_rad = 10;
|
||||
if (m_outer_rad < 11) m_outer_rad = 11;
|
||||
if (m_shock_speed < 10) m_shock_speed = 10;
|
||||
} else {
|
||||
int index = Ships[m_ship_num].special_exp_index;
|
||||
Assert( (index > 0) && (index < MAX_SEXP_VARIABLES-(BLOCK_EXP_SIZE-1)) );
|
||||
|
||||
m_inner_rad = atoi(Sexp_variables[index++].text);
|
||||
m_outer_rad = atoi(Sexp_variables[index++].text);
|
||||
m_damage = atoi(Sexp_variables[index++].text);
|
||||
m_blast = atoi(Sexp_variables[index++].text);
|
||||
m_shock_enabled = atoi(Sexp_variables[index++].text);
|
||||
m_shock_speed = atoi(Sexp_variables[index++].text);
|
||||
if (m_inner_rad < 1) {
|
||||
m_inner_rad = 1;
|
||||
}
|
||||
if (m_outer_rad < 2) {
|
||||
m_outer_rad = 2;
|
||||
}
|
||||
if (m_shock_speed < 1) {
|
||||
m_shock_speed = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
m_inner_rad = Ships[m_ship_num].special_exp_inner;
|
||||
m_outer_rad = Ships[m_ship_num].special_exp_outer;
|
||||
m_damage = Ships[m_ship_num].special_exp_damage;
|
||||
m_blast = Ships[m_ship_num].special_exp_blast;
|
||||
m_shock_enabled = Ships[m_ship_num].use_shockwave;
|
||||
m_shock_speed = Ships[m_ship_num].special_exp_shockwave_speed;
|
||||
m_special_exp_enabled = TRUE;
|
||||
}
|
||||
|
||||
@@ -164,16 +170,15 @@ void ShipSpecialDamage::OnOK()
|
||||
{
|
||||
UpdateData(TRUE);
|
||||
|
||||
object *objp;
|
||||
int i;
|
||||
|
||||
objp = GET_FIRST(&obj_used_list);
|
||||
while (objp != END_OF_LIST(&obj_used_list)) {
|
||||
if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) {
|
||||
if (objp->flags & OF_MARKED)
|
||||
update_ship(objp->instance);
|
||||
}
|
||||
if (m_inner_rad > m_outer_rad) {
|
||||
MessageBox("Inner radius must be less than outer radius");
|
||||
return;
|
||||
}
|
||||
|
||||
objp = GET_NEXT(objp);
|
||||
for ( i = 0; i < num_selected_ships; i++ ) {
|
||||
update_ship(m_selected_ships[i]);
|
||||
}
|
||||
|
||||
CDialog::OnOK();
|
||||
@@ -182,51 +187,33 @@ void ShipSpecialDamage::OnOK()
|
||||
void ShipSpecialDamage::update_ship(int shipnum)
|
||||
{
|
||||
ship *shipp = &Ships[shipnum];
|
||||
|
||||
// set to update
|
||||
set_modified();
|
||||
|
||||
// TODO: Add extra validation here
|
||||
if (m_special_exp_enabled) {
|
||||
|
||||
int start;
|
||||
|
||||
if (m_inner_rad > m_outer_rad) {
|
||||
MessageBox("Inner radius must be less than outer radius");
|
||||
return;
|
||||
}
|
||||
|
||||
if (shipp->special_exp_index == -1) {
|
||||
// get free sexp_variables
|
||||
start = sexp_variable_allocate_block(shipp->ship_name, SEXP_VARIABLE_BLOCK | SEXP_VARIABLE_BLOCK_EXP);
|
||||
if (start == -1) {
|
||||
MessageBox("Unable to allocate storage, try deleting Sexp variables");
|
||||
return;
|
||||
} else {
|
||||
shipp->special_exp_index = start;
|
||||
}
|
||||
} else {
|
||||
start = shipp->special_exp_index;
|
||||
}
|
||||
// set to update
|
||||
set_modified();
|
||||
|
||||
// set em
|
||||
sprintf(Sexp_variables[start+INNER_RAD].text, "%d", m_inner_rad);
|
||||
sprintf(Sexp_variables[start+OUTER_RAD].text, "%d", m_outer_rad);
|
||||
sprintf(Sexp_variables[start+DAMAGE].text, "%d", m_damage);
|
||||
sprintf(Sexp_variables[start+BLAST].text, "%d", m_blast);
|
||||
sprintf(Sexp_variables[start+PROPAGATE].text, "%d", m_shock_enabled);
|
||||
sprintf(Sexp_variables[start+SHOCK_SPEED].text, "%d", m_shock_speed);
|
||||
|
||||
} else {
|
||||
if (shipp->special_exp_index != -1) {
|
||||
// set to update
|
||||
set_modified();
|
||||
|
||||
// free block
|
||||
sexp_variable_block_free(shipp->ship_name, Ships[m_ship_num].special_exp_index, SEXP_VARIABLE_BLOCK | SEXP_VARIABLE_BLOCK_EXP);
|
||||
|
||||
// set index to no exp block
|
||||
shipp->special_exp_index = -1;
|
||||
shipp->use_special_explosion = true;
|
||||
shipp->special_exp_inner = m_inner_rad;
|
||||
shipp->special_exp_outer = m_outer_rad;
|
||||
shipp->special_exp_damage = m_damage;
|
||||
shipp->special_exp_blast = m_blast;
|
||||
shipp->use_shockwave = (m_shock_enabled ? 1:0) ;
|
||||
if (m_shock_speed) {
|
||||
if (m_shock_speed < 1) {
|
||||
m_shock_speed = 1;
|
||||
MessageBox("Shockwave speed must be defined! Setting this to 1 now");
|
||||
}
|
||||
shipp->special_exp_shockwave_speed = m_shock_speed;
|
||||
}
|
||||
} else {
|
||||
shipp->use_special_explosion = false;
|
||||
shipp->special_exp_inner = -1;
|
||||
shipp->special_exp_outer = -1;
|
||||
shipp->special_exp_damage = -1;
|
||||
shipp->special_exp_blast = -1;
|
||||
shipp->use_shockwave = false;
|
||||
shipp->special_exp_shockwave_speed = -1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,13 +30,19 @@ public:
|
||||
//{{AFX_DATA(ShipSpecialDamage)
|
||||
enum { IDD = IDD_SPECIAL_DAMAGE };
|
||||
int m_shock_enabled;
|
||||
BOOL m_special_exp_enabled;
|
||||
BOOL m_special_exp_enabled;
|
||||
int m_inner_rad;
|
||||
int m_outer_rad;
|
||||
int m_damage;
|
||||
int m_shock_speed;
|
||||
int m_blast;
|
||||
int m_ship_num;
|
||||
|
||||
private:
|
||||
// variables to handle selection of multiple ships
|
||||
int m_selected_ships[MAX_SHIPS];
|
||||
int num_selected_ships;
|
||||
|
||||
//}}AFX_DATA
|
||||
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#include "FREDDoc.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
@@ -31,10 +30,11 @@ void ShipSpecialHitpoints::DoDataExchange(CDataExchange* pDX)
|
||||
CDialog::DoDataExchange(pDX);
|
||||
//{{AFX_DATA_MAP(ShipSpecialHitpoints)
|
||||
DDX_Check(pDX, IDC_ENABLE_SPECIAL_HITPOINTS, m_special_hitpoints_enabled);
|
||||
DDX_Check(pDX, IDC_ENABLE_SPECIAL_SHIELD, m_special_shield_enabled);
|
||||
DDX_Text(pDX, IDC_SPECIAL_SHIELDS, m_shields);
|
||||
DDV_MinMaxInt(pDX, m_shields, 0, INT_MAX);
|
||||
DDV_MinMaxInt(pDX, m_shields, -1, INT_MAX);
|
||||
DDX_Text(pDX, IDC_SPECIAL_HULL, m_hull);
|
||||
DDV_MinMaxInt(pDX, m_hull, 10, INT_MAX);
|
||||
DDV_MinMaxInt(pDX, m_hull, 1, INT_MAX);
|
||||
//}}AFX_DATA_MAP
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ void ShipSpecialHitpoints::DoDataExchange(CDataExchange* pDX)
|
||||
BEGIN_MESSAGE_MAP(ShipSpecialHitpoints, CDialog)
|
||||
//{{AFX_MSG_MAP(ShipSpecialHitpoints)
|
||||
ON_BN_CLICKED(IDC_ENABLE_SPECIAL_HITPOINTS, OnEnableSpecialHitpoints)
|
||||
ON_BN_CLICKED(IDC_ENABLE_SPECIAL_SHIELD, OnEnableSpecialShieldpoints)
|
||||
ON_BN_CLICKED(ID_OK, OnOk)
|
||||
ON_BN_CLICKED(ID_CANCEL, OnCancel)
|
||||
//}}AFX_MSG_MAP
|
||||
@@ -58,46 +59,70 @@ void ShipSpecialHitpoints::OnEnableSpecialHitpoints()
|
||||
DoGray();
|
||||
}
|
||||
|
||||
void ShipSpecialHitpoints::OnEnableSpecialShieldpoints()
|
||||
{
|
||||
// TODO: Add your control notification handler code here
|
||||
UpdateData(TRUE);
|
||||
|
||||
DoGray();
|
||||
}
|
||||
|
||||
BOOL ShipSpecialHitpoints::OnInitDialog()
|
||||
{
|
||||
// get ship num
|
||||
object *objp;
|
||||
|
||||
m_ship_num = -1;
|
||||
num_selected_ships = 0;
|
||||
|
||||
objp = GET_FIRST(&obj_used_list);
|
||||
while (objp != END_OF_LIST(&obj_used_list)) {
|
||||
if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) {
|
||||
if (objp->flags & OF_MARKED) {
|
||||
|
||||
m_ship_num = objp->instance;
|
||||
break;
|
||||
m_selected_ships[num_selected_ships] = objp->instance;
|
||||
num_selected_ships++;
|
||||
}
|
||||
}
|
||||
objp = GET_NEXT(objp);
|
||||
}
|
||||
|
||||
if (Ships[m_ship_num].special_hitpoint_index == -1)
|
||||
{
|
||||
Assert(num_selected_ships);
|
||||
Assert (Objects[cur_object_index].flags & OF_MARKED);
|
||||
m_ship_num = Objects[cur_object_index].instance;
|
||||
|
||||
// get the details from the first ship
|
||||
//hull
|
||||
if (Ships[m_ship_num].special_hitpoints) {
|
||||
m_hull = Ships[m_ship_num].special_hitpoints;
|
||||
m_special_hitpoints_enabled = TRUE;
|
||||
}
|
||||
else {
|
||||
// get default_table_values
|
||||
ship_info *sip;
|
||||
sip = &Ship_info[Ships[m_ship_num].ship_info_index];
|
||||
|
||||
m_hull = (int)sip->max_hull_strength;
|
||||
m_special_hitpoints_enabled = FALSE;
|
||||
|
||||
if (m_hull < 1) m_hull = 10;
|
||||
}
|
||||
|
||||
//shields
|
||||
if (Ships[m_ship_num].special_shield > 0){
|
||||
m_shields = Ships[m_ship_num].special_shield;
|
||||
m_special_shield_enabled = TRUE;
|
||||
}
|
||||
else {
|
||||
// get default_table_values
|
||||
ship_info *sip;
|
||||
sip = &Ship_info[Ships[m_ship_num].ship_info_index];
|
||||
|
||||
m_shields = (int)sip->max_shield_strength;
|
||||
m_hull = (int)sip->max_hull_strength;
|
||||
m_special_hitpoints_enabled = FALSE;
|
||||
m_special_shield_enabled = FALSE;
|
||||
|
||||
if (m_shields < 0) m_shields = 0;
|
||||
if (m_hull < 10) m_hull = 10;
|
||||
} else {
|
||||
int index = Ships[m_ship_num].special_hitpoint_index;
|
||||
// Assert( (index > 0) && (index < MAX_SEXP_VARIABLES-(BLOCK_HITPOINT_SIZE-1)) );
|
||||
|
||||
m_shields = atoi(Sexp_variables[index++].text);
|
||||
m_hull = atoi(Sexp_variables[index++].text);
|
||||
|
||||
m_special_hitpoints_enabled = TRUE;
|
||||
}
|
||||
if (m_shields < 0) {
|
||||
m_shields = 0;
|
||||
}
|
||||
}
|
||||
|
||||
CDialog::OnInitDialog();
|
||||
|
||||
@@ -110,7 +135,7 @@ BOOL ShipSpecialHitpoints::OnInitDialog()
|
||||
|
||||
void ShipSpecialHitpoints::DoGray()
|
||||
{
|
||||
GetDlgItem(IDC_SPECIAL_SHIELDS)->EnableWindow(m_special_hitpoints_enabled);
|
||||
GetDlgItem(IDC_SPECIAL_SHIELDS)->EnableWindow(m_special_shield_enabled);
|
||||
GetDlgItem(IDC_SPECIAL_HULL)->EnableWindow(m_special_hitpoints_enabled);
|
||||
}
|
||||
|
||||
@@ -124,6 +149,8 @@ void ShipSpecialHitpoints::OnCancel()
|
||||
void ShipSpecialHitpoints::OnOk()
|
||||
{
|
||||
float temp_max_hull_strength;
|
||||
int new_shield_strength, new_hull_strength;
|
||||
int i;
|
||||
|
||||
UpdateData(TRUE);
|
||||
|
||||
@@ -131,58 +158,65 @@ void ShipSpecialHitpoints::OnOk()
|
||||
if (m_special_hitpoints_enabled) {
|
||||
|
||||
// Don't update anything if the hull strength is invalid
|
||||
if (m_hull < 10)
|
||||
{
|
||||
if (m_hull < 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
int start;
|
||||
|
||||
if (Ships[m_ship_num].special_hitpoint_index == -1) {
|
||||
|
||||
// get free sexp_variables
|
||||
start = sexp_variable_allocate_block(Ships[m_ship_num].ship_name, SEXP_VARIABLE_BLOCK | SEXP_VARIABLE_BLOCK_HIT);
|
||||
if (start == -1) {
|
||||
MessageBox("Unable to allocate storage, try deleting Sexp variables");
|
||||
return;
|
||||
} else {
|
||||
Ships[m_ship_num].special_hitpoint_index = start;
|
||||
}
|
||||
} else {
|
||||
start = Ships[m_ship_num].special_hitpoint_index;
|
||||
}
|
||||
// set to update
|
||||
set_modified();
|
||||
|
||||
// set em
|
||||
sprintf(Sexp_variables[start+SHIELD_STRENGTH].text, "%d", m_shields);
|
||||
sprintf(Sexp_variables[start+HULL_STRENGTH].text, "%d", m_hull);
|
||||
new_hull_strength = m_hull;
|
||||
//Ships[m_ship_num].special_hitpoints = m_hull;
|
||||
|
||||
} else {
|
||||
if (Ships[m_ship_num].special_hitpoint_index != -1) {
|
||||
// set to update
|
||||
set_modified();
|
||||
}
|
||||
else {
|
||||
// set to update
|
||||
set_modified();
|
||||
|
||||
// free block
|
||||
sexp_variable_block_free(Ships[m_ship_num].ship_name, Ships[m_ship_num].special_hitpoint_index, SEXP_VARIABLE_BLOCK | SEXP_VARIABLE_BLOCK_HIT);
|
||||
new_hull_strength = 0;
|
||||
}
|
||||
|
||||
// set index to no hit block
|
||||
Ships[m_ship_num].special_hitpoint_index = -1;
|
||||
if (m_special_shield_enabled) {
|
||||
|
||||
// Don't update anything if the hull strength is invalid
|
||||
if (m_shields < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// set to update
|
||||
set_modified();
|
||||
|
||||
new_shield_strength = m_shields;
|
||||
//Ships[m_ship_num].special_shield = m_shields;
|
||||
|
||||
}
|
||||
else {
|
||||
// set to update
|
||||
set_modified();
|
||||
|
||||
new_shield_strength = -1;
|
||||
}
|
||||
|
||||
// calc kamikaze stuff
|
||||
if (Ships[m_ship_num].special_hitpoint_index != -1)
|
||||
{
|
||||
temp_max_hull_strength = (float) atoi(Sexp_variables[Ships[m_ship_num].special_hitpoint_index+HULL_STRENGTH].text);
|
||||
}
|
||||
else
|
||||
{
|
||||
temp_max_hull_strength = Ship_info[Ships[m_ship_num].ship_info_index].max_hull_strength;
|
||||
for ( i=0; i<num_selected_ships; i++) {
|
||||
// set the special hitpoints/shield
|
||||
Ships[m_selected_ships[i]].special_hitpoints = new_hull_strength;
|
||||
Ships[m_selected_ships[i]].special_shield = new_shield_strength;
|
||||
|
||||
// calc kamikaze stuff
|
||||
if (Ships[m_selected_ships[i]].special_hitpoints)
|
||||
{
|
||||
temp_max_hull_strength = (float)Ships[m_selected_ships[i]].special_hitpoints;
|
||||
}
|
||||
else
|
||||
{
|
||||
temp_max_hull_strength = Ship_info[Ships[m_selected_ships[i]].ship_info_index].max_hull_strength;
|
||||
}
|
||||
|
||||
Ai_info[Ships[m_selected_ships[i]].ai_index].kamikaze_damage = min(1000.0f, 200.0f + (temp_max_hull_strength / 4.0f));
|
||||
|
||||
|
||||
}
|
||||
|
||||
Ai_info[Ships[m_ship_num].ai_index].kamikaze_damage = min(1000.0f, 200.0f + (temp_max_hull_strength / 4.0f));
|
||||
|
||||
|
||||
|
||||
CDialog::OnOK();
|
||||
}
|
||||
@@ -23,11 +23,16 @@ public:
|
||||
//{{AFX_DATA(ShipSpecialHitpoints)
|
||||
enum { IDD = IDD_SPECIAL_HITPOINTS };
|
||||
BOOL m_special_hitpoints_enabled;
|
||||
BOOL m_special_shield_enabled;
|
||||
int m_shields;
|
||||
int m_hull;
|
||||
int m_ship_num;
|
||||
//}}AFX_DATA
|
||||
|
||||
private:
|
||||
// variables to handle selection of multiple ships
|
||||
int m_selected_ships[MAX_SHIPS];
|
||||
int num_selected_ships;
|
||||
int m_ship_num;
|
||||
|
||||
// Overrides
|
||||
// ClassWizard generated virtual function overrides
|
||||
@@ -42,6 +47,7 @@ protected:
|
||||
// Generated message map functions
|
||||
//{{AFX_MSG(ShipSpecialHitpoints)
|
||||
afx_msg void OnEnableSpecialHitpoints();
|
||||
afx_msg void OnEnableSpecialShieldpoints();
|
||||
virtual BOOL OnInitDialog();
|
||||
afx_msg void DoGray();
|
||||
virtual void OnCancel();
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
#include "bmpman/bmpman.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,246 @@
|
||||
// soundenvironmentdlg.cpp : implementation file
|
||||
//
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "fred.h"
|
||||
#include "soundenvironmentdlg.h"
|
||||
#include "sound/audiostr.h"
|
||||
#include "sound/sound.h"
|
||||
#include "sound/ds.h"
|
||||
#include "cfile/cfile.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// SoundEnvironment dialog
|
||||
|
||||
|
||||
SoundEnvironment::SoundEnvironment(CWnd* pParent /*=NULL*/)
|
||||
: CDialog(SoundEnvironment::IDD, pParent)
|
||||
{
|
||||
//{{AFX_DATA_INIT(SoundEnvironment)
|
||||
m_environment = -1;
|
||||
m_damping = 0.0f;
|
||||
m_decay_time = 0.0f;
|
||||
m_volume = 0.0f;
|
||||
m_wave_filename = _T("");
|
||||
m_wave_id = -1;
|
||||
//}}AFX_DATA_INIT
|
||||
}
|
||||
|
||||
|
||||
void SoundEnvironment::DoDataExchange(CDataExchange* pDX)
|
||||
{
|
||||
CDialog::DoDataExchange(pDX);
|
||||
//{{AFX_DATA_MAP(SoundEnvironment)
|
||||
DDX_CBIndex(pDX, IDC_SOUND_ENVIRONMENT, m_environment);
|
||||
DDX_Text(pDX, IDC_SOUND_ENVIRONMENT_DAMPING, m_damping);
|
||||
DDV_MinMaxFloat(pDX, m_damping, 0.1f, 2.0f);
|
||||
DDX_Text(pDX, IDC_SOUND_ENVIRONMENT_DECAY, m_decay_time);
|
||||
DDV_MinMaxFloat(pDX, m_decay_time, 0.1f, 20.0f);
|
||||
DDX_Text(pDX, IDC_SOUND_ENVIRONMENT_VOLUME, m_volume);
|
||||
DDV_MinMaxFloat(pDX, m_volume, 0.0f, 1.0f);
|
||||
//}}AFX_DATA_MAP
|
||||
}
|
||||
|
||||
|
||||
BEGIN_MESSAGE_MAP(SoundEnvironment, CDialog)
|
||||
//{{AFX_MSG_MAP(SoundEnvironment)
|
||||
ON_CBN_SELCHANGE(IDC_SOUND_ENVIRONMENT, OnSelChangeSoundEnvironment)
|
||||
ON_BN_CLICKED(IDC_BROWSE_WAVE, OnBrowseWave)
|
||||
ON_BN_CLICKED(IDC_PLAY, OnPlay)
|
||||
//}}AFX_MSG_MAP
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// SoundEnvironment message handlers
|
||||
|
||||
BOOL SoundEnvironment::OnInitDialog()
|
||||
{
|
||||
m_play_bm.LoadBitmap(IDB_PLAY);
|
||||
((CButton *) GetDlgItem(IDC_PLAY)) -> SetBitmap(m_play_bm);
|
||||
|
||||
// fill environment list ...
|
||||
|
||||
CComboBox *box = (CComboBox *) GetDlgItem(IDC_SOUND_ENVIRONMENT);
|
||||
|
||||
// add empty default string (for no environment set)
|
||||
box->AddString("");
|
||||
|
||||
for (size_t i = 0; i < EFX_presets.size(); i++) {
|
||||
box->AddString(EFX_presets[i].name.c_str());
|
||||
}
|
||||
|
||||
// set values ...
|
||||
|
||||
sound_env *m_env = &The_mission.sound_environment;
|
||||
|
||||
// make sure we are set by default to mission values
|
||||
if (m_env->id >= 0) {
|
||||
m_environment = m_env->id + 1;
|
||||
|
||||
m_volume = m_env->volume;
|
||||
m_damping = m_env->damping;
|
||||
m_decay_time = m_env->decay;
|
||||
|
||||
// make it active
|
||||
sound_env_set(m_env);
|
||||
} else {
|
||||
m_environment = 0;
|
||||
|
||||
m_volume = 0.0f;
|
||||
m_damping = 0.1f;
|
||||
m_decay_time = 0.1f;
|
||||
|
||||
sound_env_disable();
|
||||
}
|
||||
|
||||
CDialog::OnInitDialog();
|
||||
UpdateData(FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void SoundEnvironment::OnOK()
|
||||
{
|
||||
UpdateData(TRUE);
|
||||
|
||||
sound_env *m_env = &The_mission.sound_environment;
|
||||
|
||||
int env_id = m_environment - 1;
|
||||
|
||||
// save anything if we need to
|
||||
if (env_id >= 0) {
|
||||
m_env->id = env_id;
|
||||
m_env->volume = m_volume;
|
||||
m_env->damping = m_damping;
|
||||
m_env->decay = m_decay_time;
|
||||
} else {
|
||||
m_env->id = -1;
|
||||
}
|
||||
|
||||
CDialog::OnOK();
|
||||
}
|
||||
|
||||
void SoundEnvironment::OnCancel()
|
||||
{
|
||||
CDialog::OnCancel();
|
||||
}
|
||||
|
||||
void SoundEnvironment::OnClose()
|
||||
{
|
||||
int z;
|
||||
|
||||
UpdateData(TRUE);
|
||||
|
||||
if (query_modified()) {
|
||||
z = MessageBox("Do you want to keep your changes?", "Close", MB_ICONQUESTION | MB_YESNOCANCEL);
|
||||
if (z == IDCANCEL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (z == IDYES) {
|
||||
OnOK();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
CDialog::OnClose();
|
||||
}
|
||||
|
||||
int SoundEnvironment::query_modified()
|
||||
{
|
||||
int env_id = m_environment - 1;
|
||||
sound_env *m_env = &The_mission.sound_environment;
|
||||
|
||||
return ( (env_id != m_env->id) || (m_volume != m_env->volume) || (m_damping != m_env->damping)
|
||||
|| (m_decay_time != m_env->decay) );
|
||||
}
|
||||
|
||||
void SoundEnvironment::OnSelChangeSoundEnvironment()
|
||||
{
|
||||
UpdateData(TRUE);
|
||||
|
||||
int index = m_environment - 1;
|
||||
|
||||
if (index >= 0) {
|
||||
m_volume = EFX_presets[index].flGain;
|
||||
m_damping = EFX_presets[index].flDecayHFRatio;
|
||||
m_decay_time = EFX_presets[index].flDecayTime;
|
||||
} else {
|
||||
m_volume = 0.0f;
|
||||
m_damping = 0.1f;
|
||||
m_decay_time = 0.1f;
|
||||
}
|
||||
|
||||
UpdateData(FALSE);
|
||||
}
|
||||
|
||||
BOOL SoundEnvironment::DestroyWindow()
|
||||
{
|
||||
sound_env_disable();
|
||||
|
||||
audiostream_close_file(m_wave_id, 0);
|
||||
m_wave_id = -1;
|
||||
|
||||
m_play_bm.DeleteObject();
|
||||
return CDialog::DestroyWindow();
|
||||
}
|
||||
|
||||
void SoundEnvironment::OnPlay()
|
||||
{
|
||||
sound_env m_env;
|
||||
|
||||
if ( !sound_env_supported() ) {
|
||||
MessageBox("Sound environment effects are not available! Unable to preview!", "Error", MB_OK | MB_ICONEXCLAMATION);
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_wave_id < 0) {
|
||||
OnBrowseWave();
|
||||
return;
|
||||
}
|
||||
|
||||
UpdateData(TRUE);
|
||||
|
||||
if (m_environment > 0) {
|
||||
m_env.id = m_environment - 1;
|
||||
m_env.volume = m_volume;
|
||||
m_env.damping = m_damping;
|
||||
m_env.decay = m_decay_time;
|
||||
|
||||
sound_env_set(&m_env);
|
||||
}
|
||||
|
||||
audiostream_play(m_wave_id, 1.0f, 0);
|
||||
}
|
||||
|
||||
void SoundEnvironment::OnBrowseWave()
|
||||
{
|
||||
int z;
|
||||
|
||||
if (m_wave_id >= 0) {
|
||||
audiostream_close_file(m_wave_id, 0);
|
||||
m_wave_id = -1;
|
||||
}
|
||||
|
||||
UpdateData(TRUE);
|
||||
|
||||
m_wave_filename = _T("");
|
||||
|
||||
z = cfile_push_chdir(CF_TYPE_DATA);
|
||||
|
||||
CFileDialog dlg(TRUE, "wav", m_wave_filename, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR,
|
||||
"Voice Files (*.ogg, *.wav)|*.ogg;*.wav|Ogg Vorbis Files (*.ogg)|*.ogg|Wave Files (*.wav)|*.wav||");
|
||||
|
||||
if (dlg.DoModal() == IDOK) {
|
||||
m_wave_filename = dlg.GetFileName();
|
||||
m_wave_id = audiostream_open((char *)(LPCSTR) m_wave_filename, ASF_SOUNDFX);
|
||||
}
|
||||
|
||||
if ( !z ) {
|
||||
cfile_pop_dir();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
#if !defined(AFX_SOUNDENVIRONMENTDLG_H__C27DA258_9C66_4987_8D20_AEEB260644A8__INCLUDED_)
|
||||
#define AFX_SOUNDENVIRONMENTDLG_H__C27DA258_9C66_4987_8D20_AEEB260644A8__INCLUDED_
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER > 1000
|
||||
// soundenvironmentdlg.h : header file
|
||||
//
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// SoundEnvironment dialog
|
||||
|
||||
class SoundEnvironment : public CDialog
|
||||
{
|
||||
// Construction
|
||||
public:
|
||||
SoundEnvironment(CWnd* pParent = NULL); // standard constructor
|
||||
int query_modified();
|
||||
void OnOK();
|
||||
void OnCancel();
|
||||
|
||||
// Dialog Data
|
||||
//{{AFX_DATA(SoundEnvironment)
|
||||
enum { IDD = IDD_SOUND_ENVIRONMENT };
|
||||
int m_environment;
|
||||
float m_damping;
|
||||
float m_decay_time;
|
||||
float m_volume;
|
||||
CString m_wave_filename;
|
||||
//}}AFX_DATA
|
||||
|
||||
CBitmap m_play_bm;
|
||||
|
||||
// Overrides
|
||||
// ClassWizard generated virtual function overrides
|
||||
//{{AFX_VIRTUAL(SoundEnvironment)
|
||||
public:
|
||||
virtual BOOL DestroyWindow();
|
||||
protected:
|
||||
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
||||
//}}AFX_VIRTUAL
|
||||
|
||||
// Implementation
|
||||
protected:
|
||||
|
||||
// Generated message map functions
|
||||
//{{AFX_MSG(SoundEnvironment)
|
||||
virtual BOOL OnInitDialog();
|
||||
afx_msg void OnClose();
|
||||
afx_msg void OnSelChangeSoundEnvironment();
|
||||
afx_msg void OnBrowseWave();
|
||||
afx_msg void OnPlay();
|
||||
//}}AFX_MSG
|
||||
DECLARE_MESSAGE_MAP()
|
||||
|
||||
private:
|
||||
int m_wave_id;
|
||||
};
|
||||
|
||||
//{{AFX_INSERT_LOCATION}}
|
||||
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
|
||||
|
||||
#endif // !defined(AFX_SOUNDENVIRONMENT_H__C27DA258_9C66_4987_8D20_AEEB260644A8__INCLUDED_)
|
||||
@@ -16,7 +16,6 @@
|
||||
#include "FREDDoc.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
Loaded 100 of 437 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user