Subversion Repositories eduke32

Compare Revisions

Ignore whitespace Rev 4986 → Rev 4987

/polymer/eduke32/Makefile
220,7 → 220,7
COMMON_OBJS=rev
COMMON_EDITOR_OBJS=m32common m32def m32exec m32vars mathutil rev
 
DUKE3D_OBJS=game actors anim common config demo gamedef gameexec gamevars global input menus namesdyn net player premap savegame sector rts osdfuncs osdcmds grpscan sounds soundsdyn $(MACT_OBJ)
DUKE3D_OBJS=game global actors gamedef gameexec gamevars player premap sector anim animsounds common config demo input menus namesdyn net savegame rts osdfuncs osdcmds grpscan sounds soundsdyn $(MACT_OBJ)
DUKE3D_EDITOR_OBJS=astub common grpscan sounds_mapster32
 
ifneq ($(USE_LIBVPX),0)
/polymer/eduke32/Makefile.deps
38,7 → 38,8
 
$(DUKE3D_OBJ)/game.$o: $(DUKE3D_SRC)/game.c $(game_defs_dep) $(DUKE3D_SRC)/jmact/scriplib.h $(duke3d_h) $(DUKE3D_SRC)/input.h $(DUKE3D_INC)/osdfuncs.h $(DUKE3D_INC)/osdcmds.h $(DUKE3D_INC)/grpscan.h $(DUKE3D_INC)/demo.h $(ENGINE_INC)/hightile.h
$(DUKE3D_OBJ)/actors.$o: $(DUKE3D_SRC)/actors.c $(duke3d_h)
$(DUKE3D_OBJ)/anim.$o: $(DUKE3D_SRC)/anim.c $(duke3d_h) $(DUKE3D_SRC)/input.h $(DUKE3D_SRC)/jmact/animlib.h $(DUKE3D_SRC)/animvpx.h
$(DUKE3D_OBJ)/anim.$o: $(DUKE3D_SRC)/anim.c $(duke3d_h) $(DUKE3D_SRC)/input.h $(DUKE3D_SRC)/jmact/animlib.h $(DUKE3D_SRC)/animvpx.h $(DUKE3D_SRC)/animsounds.h
$(DUKE3D_OBJ)/animsounds.$o: $(DUKE3D_SRC)/animsounds.c $(DUKE3D_SRC)/animsounds.h
$(DUKE3D_OBJ)/demo.$o: $(DUKE3D_SRC)/demo.c $(duke3d_h) $(DUKE3D_SRC)/input.h
$(DUKE3D_OBJ)/gamedef.$o: $(DUKE3D_SRC)/gamedef.c $(duke3d_h) $(gamedef_h) $(DUKE3D_SRC)/savegame.h
$(DUKE3D_OBJ)/gameexec.$o: $(DUKE3D_SRC)/gameexec.c $(DUKE3D_SRC)/gamestructures.c $(duke3d_h) $(gamedef_h)
/polymer/eduke32/Makefile.msvc
190,6 → 190,7
$(DUKE3D_OBJ)\actors.$o \
$(DUKE3D_OBJ)\actors_inline.$o \
$(DUKE3D_OBJ)\anim.$o \
$(DUKE3D_OBJ)\animsounds.$o \
$(DUKE3D_OBJ)\animvpx.$o \
$(DUKE3D_OBJ)\common.$o \
$(DUKE3D_OBJ)\demo.$o \
/polymer/eduke32/build/src/defs.c
86,6 → 86,7
T_TILEFROMTEXTURE, T_XOFFSET, T_YOFFSET, T_TEXHITSCAN, T_NOFULLBRIGHT,
T_INCLUDEDEFAULT,
T_ANIMSOUNDS,
T_CUTSCENE,
T_NOFLOORPALRANGE,
T_TEXHITSCANRANGE,
T_NOFULLBRIGHTRANGE,
250,6 → 251,7
{ "music", T_MUSIC },
{ "sound", T_SOUND },
{ "animsounds", T_ANIMSOUNDS }, // dummy
{ "cutscene", T_CUTSCENE },
{ "nofloorpalrange", T_NOFLOORPALRANGE },
{ "texhitscanrange", T_TEXHITSCANRANGE },
{ "nofullbrightrange", T_NOFULLBRIGHTRANGE },
2073,6 → 2075,7
}
break;
 
case T_CUTSCENE:
case T_ANIMSOUNDS:
{
char *dummy;
/polymer/eduke32/eduke32.vcxproj
293,9 → 293,11
<ClInclude Include="source\android.h" />
<ClInclude Include="source\android\in_android.h" />
<ClInclude Include="source\anim.h" />
<ClInclude Include="source\animsounds.h" />
<ClInclude Include="source\animvpx.h" />
<ClInclude Include="source\common_game.h" />
<ClInclude Include="source\demo.h" />
<ClInclude Include="source\events_defs.h" />
<ClInclude Include="source\game.h" />
<ClInclude Include="source\game_inline.h" />
<ClInclude Include="source\gameexec.h" />
407,6 → 409,7
<ClCompile Include="source\android\android-jni.cpp" />
<ClCompile Include="source\android\in_android.c" />
<ClCompile Include="source\anim.c" />
<ClCompile Include="source\animsounds.c" />
<ClCompile Include="source\animvpx.c" />
<ClCompile Include="source\astub.c" />
<ClCompile Include="source\config.c" />
/polymer/eduke32/eduke32.vcxproj.filters
363,6 → 363,9
<ClInclude Include="source\demo.h">
<Filter>eduke32\headers</Filter>
</ClInclude>
<ClInclude Include="source\events_defs.h">
<Filter>eduke32\headers</Filter>
</ClInclude>
<ClInclude Include="source\quotes.h">
<Filter>eduke32\headers</Filter>
</ClInclude>
453,6 → 456,9
<ClInclude Include="build\include\buildtypes.h">
<Filter>build\headers</Filter>
</ClInclude>
<ClInclude Include="source\animsounds.h">
<Filter>eduke32\headers</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="build\src\a-c.c">
785,6 → 791,9
<ClCompile Include="build\src\sdlayer12.c">
<Filter>build\source</Filter>
</ClCompile>
<ClCompile Include="source\animsounds.c">
<Filter>eduke32\source</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="Makefile.msvc">
/polymer/eduke32/source/anim.c
32,228 → 32,77
 
#ifdef USE_LIBVPX
# include "animvpx.h"
 
uint16_t anim_hi_numsounds[NUM_HARDCODED_ANIMS], *anim_hi_sounds[NUM_HARDCODED_ANIMS];
#endif
 
static void endanimsounds(int32_t fr)
{
switch (ud.volume_number)
{
case 0:
break;
case 1:
switch (fr)
{
case 1:
S_PlaySound(WIND_AMBIENCE);
break;
case 26:
S_PlaySound(ENDSEQVOL2SND1);
break;
case 36:
S_PlaySound(ENDSEQVOL2SND2);
break;
case 54:
S_PlaySound(THUD);
break;
case 62:
S_PlaySound(ENDSEQVOL2SND3);
break;
case 75:
S_PlaySound(ENDSEQVOL2SND4);
break;
case 81:
S_PlaySound(ENDSEQVOL2SND5);
break;
case 115:
S_PlaySound(ENDSEQVOL2SND6);
break;
case 124:
S_PlaySound(ENDSEQVOL2SND7);
break;
}
break;
case 2:
switch (fr)
{
case 1:
S_PlaySound(WIND_REPEAT);
break;
case 98:
S_PlaySound(DUKE_GRUNT);
break;
case 82+20:
S_PlaySound(THUD);
S_PlaySound(SQUISHED);
break;
case 104+20:
S_PlaySound(ENDSEQVOL3SND3);
break;
case 114+20:
S_PlaySound(ENDSEQVOL3SND2);
break;
case 158:
S_PlaySound(PIPEBOMB_EXPLODE);
break;
}
break;
}
}
#include "animsounds.h"
 
static void logoanimsounds(int32_t fr)
hashtable_t h_dukeanim = { 8, NULL };
dukeanim_t * g_animPtr;
 
dukeanim_t *G_FindAnim(const char *s)
{
switch (fr)
{
case 1:
S_PlaySound(FLY_BY);
break;
case 19:
S_PlaySound(PIPEBOMB_EXPLODE);
break;
}
intptr_t ptr = hash_findcase(&h_dukeanim, s);
return (dukeanim_t *)(ptr == -1 ? NULL : (dukeanim_t *)ptr);
}
 
static void intro4animsounds(int32_t fr)
dukeanim_t * G_DefineAnim(const char *fn, uint8_t fdelay, void (*sound_func)(int32_t))
{
switch (fr)
{
case 1:
S_PlaySound(INTRO4_B);
break;
case 12:
case 34:
S_PlaySound(SHORT_CIRCUIT);
break;
case 18:
S_PlaySound(INTRO4_5);
break;
}
}
dukeanim_t * anim = G_FindAnim(fn);
if (!anim)
anim = (dukeanim_t *)Xcalloc(1, sizeof(dukeanim_t));
 
static void first4animsounds(int32_t fr)
{
switch (fr)
{
case 1:
S_PlaySound(INTRO4_1);
break;
case 12:
S_PlaySound(INTRO4_2);
break;
case 7:
S_PlaySound(INTRO4_3);
break;
case 26:
S_PlaySound(INTRO4_4);
break;
}
hash_add(&h_dukeanim, fn, (intptr_t)anim, 0);
 
if (sound_func)
anim->sound_func = sound_func;
 
anim->framedelay = fdelay;
 
return anim;
}
 
static void intro42animsounds(int32_t fr)
void G_InitAnim(void)
{
switch (fr)
{
case 10:
S_PlaySound(INTRO4_6);
break;
}
}
hash_init(&h_dukeanim);
 
static void endanimvol41(int32_t fr)
{
switch (fr)
{
case 3:
S_PlaySound(DUKE_UNDERWATER);
break;
case 35:
S_PlaySound(VOL4ENDSND1);
break;
}
G_DefineAnim("logo.anm", 9, logoanimsounds);
G_DefineAnim("3dr.anm", 10, NULL);
G_DefineAnim("vol4e1.anm", 10, endanimvol41);
G_DefineAnim("vol4e2.anm", 14, endanimvol42);
G_DefineAnim("vol4e3.anm", 10, endanimvol43);
G_DefineAnim("vol41a.anm", 14, first4animsounds);
G_DefineAnim("vol42a.anm", 18, intro4animsounds);
G_DefineAnim("vol43a.anm", 10, intro42animsounds);
G_DefineAnim("duketeam.anm", 10, NULL);
G_DefineAnim("radlogo.anm", 10, NULL);
G_DefineAnim("cineov2.anm", 18, endanimsounds);
G_DefineAnim("cineov3.anm", 10, endanimsounds);
}
 
static void endanimvol42(int32_t fr)
int32_t G_PlayAnim(const char *fn)
{
switch (fr)
{
case 11:
S_PlaySound(DUKE_UNDERWATER);
break;
case 20:
S_PlaySound(VOL4ENDSND1);
break;
case 39:
S_PlaySound(VOL4ENDSND2);
break;
case 50:
FX_StopAllSounds();
break;
}
}
dukeanim_t *anim = G_FindAnim(fn);
 
static void endanimvol43(int32_t fr)
{
switch (fr)
if (!anim)
{
case 1:
S_PlaySound(BOSS4_DEADSPEECH);
break;
case 40:
S_PlaySound(VOL4ENDSND1);
S_PlaySound(DUKE_UNDERWATER);
break;
case 50:
S_PlaySound(BIGBANG);
break;
OSD_Printf("Animation %s is undefined!\n", fn);
return 0;
}
}
 
static uint8_t* animbuf[NUM_HARDCODED_ANIMS];
static char animlock[NUM_HARDCODED_ANIMS];
int32_t framenum = 0, soundidx = 0; // custom anim sounds
int32_t running = 1, i;
 
int32_t G_PlayAnim(const char *fn, char t)
{
int32_t i, length=0, numframes=0;
#ifdef USE_OPENGL
int32_t ogltexfiltermode=gltexfiltermode;
#endif
int32_t handle=-1;
int32_t frametime = 0;
int32_t running = 1;
 
// t parameter:
//
// 1: cineov2
// 2: cineov3
// 3: RADLOGO
// 4: DUKETEAM
// 5: logo
// 6: vol41a
// 7: vol42a
// 8: vol4e1
// 9: vol43a
// 10: vol4e2
// 11: vol4e3
// 12: 3drealms anim
 
I_ClearAllInput();
 
#ifdef USE_LIBVPX
while (getrendermode() >= REND_POLYMOST && glinfo.glsl) // if, really
{
char vpxfn[BMAX_PATH], *dot;
animvpx_ivf_header_t info;
 
animvpx_codec_ctx codec;
uint8_t *pic;
uint32_t msecsperframe, nextframetime;
int32_t animidx, framenum=0, soundidx=0, numtotalsounds=0; // custom anim sounds
 
char vpxfn[BMAX_PATH];
Bstrncpyz(vpxfn, fn, BMAX_PATH);
 
dot = Bstrrchr(vpxfn, '.');
if (!dot || (dot-vpxfn)+4 >= BMAX_PATH)
char *dot = Bstrrchr(vpxfn, '.');
if (!dot || (dot - vpxfn) + 4 >= BMAX_PATH)
break;
 
dot[1] = 'i';
261,20 → 110,24
dot[3] = 'f';
dot[4] = 0;
 
handle = kopen4loadfrommod(vpxfn, 0);
int32_t handle = kopen4loadfrommod(vpxfn, 0);
if (handle == -1)
break;
 
animvpx_ivf_header_t info;
i = animvpx_read_ivf_header(handle, &info);
 
if (i)
{
OSD_Printf("Failed reading IVF file: %s\n",
animvpx_read_ivf_header_errmsg[i]);
OSD_Printf("Failed reading IVF file: %s\n", animvpx_read_ivf_header_errmsg[i]);
kclose(handle);
return 0;
}
 
animvpx_setup_glstate();
 
animvpx_codec_ctx codec;
 
if (animvpx_init_codec(&info, handle, &codec))
{
OSD_Printf("Error initializing VPX codec.\n");
282,16 → 135,13
return 0;
}
 
animidx = t-1;
if ((unsigned)animidx < NUM_HARDCODED_ANIMS && anim_hi_sounds[animidx])
numtotalsounds = anim_hi_numsounds[animidx];
uint32_t msecsperframe = ((uint64_t)info.fpsdenom * 1000) / info.fpsnumer;
uint32_t nextframetime = getticks();
uint8_t *pic;
 
msecsperframe = ((uint64_t)info.fpsdenom*1000)/info.fpsnumer;
// OSD_Printf("msecs per frame: %d\n", msecsperframe);
// OSD_Printf("msecs per frame: %d\n", msecsperframe);
 
nextframetime = getticks();
 
while (running)
do
{
nextframetime += msecsperframe;
 
298,8 → 148,7
i = animvpx_nextpic(&codec, &pic);
if (i)
{
OSD_Printf("Failed getting next pic: %s\n",
animvpx_nextpic_errmsg[i]);
OSD_Printf("Failed getting next pic: %s\n", animvpx_nextpic_errmsg[i]);
if (codec.errmsg)
{
OSD_Printf(" %s\n", codec.errmsg);
316,9 → 165,9
 
// after rendering the frame but before displaying: maybe play sound...
framenum++;
while (soundidx < numtotalsounds && anim_hi_sounds[animidx][2*soundidx] == framenum)
while (soundidx < anim->numsounds && anim->sounds[soundidx << 1] == framenum)
{
S_PlaySound(anim_hi_sounds[animidx][2*soundidx+1]);
S_PlaySound(anim->sounds[(soundidx << 1) + 1]);
soundidx++;
}
 
327,7 → 176,7
palfadedelta = 0;
showframe(0);
 
// I_ClearAllInput();
// I_ClearAllInput();
 
do
{
338,9 → 187,8
running = 0;
break;
}
}
while (getticks() < nextframetime);
}
} while (getticks() < nextframetime);
} while (running);
 
animvpx_print_stats(&codec);
 
353,13 → 201,18
return !running; // done with playing VP8!
}
#endif
// ANM playback --- v v v ---
// ANM playback --- v v v ---
 
handle = kopen4load(fn, 0);
#ifdef USE_OPENGL
int32_t ogltexfiltermode = gltexfiltermode;
#endif
int32_t handle = kopen4load(fn, 0);
 
if (handle == -1)
return 0;
 
length = kfilelength(handle);
int32_t length = kfilelength(handle);
 
if (length == 0)
{
OSD_Printf("Warning: skipping playback of empty ANM file \"%s\".\n", fn);
366,19 → 219,21
goto end_anim;
}
 
walock[TILE_ANIM] = 219+t;
animlock[t-1] = 1;
walock[TILE_ANIM] = 219;
anim->animlock = 1;
 
if (!animbuf[t-1])
allocache((intptr_t *)&animbuf[t-1], length+1, &animlock[t-1]);
if (!anim->animbuf)
allocache((intptr_t *)&anim->animbuf, length + 1, &anim->animlock);
 
tilesiz[TILE_ANIM].x = 200;
tilesiz[TILE_ANIM].y = 320;
 
kread(handle, animbuf[t-1], length);
kread(handle, anim->animbuf, length);
kclose(handle);
 
if (ANIM_LoadAnim(animbuf[t-1], length) < 0 || (numframes = ANIM_NumFrames()) <= 0)
int32_t numframes;
 
if (ANIM_LoadAnim(anim->animbuf, length) < 0 || (numframes = ANIM_NumFrames()) <= 0)
{
// XXX: ANM_LoadAnim() still checks less than the bare minimum,
// e.g. ANM file could still be too small and not contain any frames.
388,9 → 243,9
 
basepaltable[ANIMPAL] = ANIM_GetPalette();
 
//setpalette(0L,256L,tempbuf);
//setbrightness(ud.brightness>>2,tempbuf,2);
P_SetGamePalette(g_player[myconnectindex].ps, ANIMPAL, 8+2);
// setpalette(0L,256L,tempbuf);
// setbrightness(ud.brightness>>2,tempbuf,2);
P_SetGamePalette(g_player[myconnectindex].ps, ANIMPAL, 8 + 2);
 
#ifdef USE_OPENGL
gltexfiltermode = 0;
400,6 → 255,7
ototalclock = totalclock + 10;
 
i = 1;
int32_t frametime; frametime = 0;
 
do
{
411,11 → 267,11
 
G_HandleAsync();
 
if (totalclock < ototalclock-1)
if (totalclock < ototalclock - 1)
continue;
 
waloff[TILE_ANIM] = (intptr_t) ANIM_DrawFrame(i);
invalidatetile(TILE_ANIM, 0, 1<<4); // JBF 20031228
waloff[TILE_ANIM] = (intptr_t)ANIM_DrawFrame(i);
invalidatetile(TILE_ANIM, 0, 1 << 4); // JBF 20031228
 
if (I_CheckAllInput())
{
433,30 → 289,28
 
clearallviews(0);
 
rotatesprite_fs(0<<16, 0<<16, 65536L, 512, TILE_ANIM, 0, 0, 2+4+8+16+64+(ud.bgstretch ? 1024 : 0));
rotatesprite_fs(0 << 16, 0 << 16, 65536L, 512, TILE_ANIM, 0, 0, 2 + 4 + 8 + 16 + 64 + BGSTRETCH);
 
g_animPtr = anim;
i = VM_OnEventWithReturn(EVENT_CUTSCENE, -1, myconnectindex, i);
g_animPtr = NULL;
 
nextpage();
 
I_ClearAllInput();
 
if (t == 10) ototalclock += 14;
else if (t == 9) ototalclock += 10;
else if (t == 7) ototalclock += 18;
else if (t == 6) ototalclock += 14;
else if (t == 5) ototalclock += 9;
else if (ud.volume_number == 3) ototalclock += 10;
else if (ud.volume_number == 2) ototalclock += 10;
else if (ud.volume_number == 1) ototalclock += 18;
else ototalclock += 10;
ototalclock += anim->framedelay;
 
if (t == 8) endanimvol41(i);
else if (t == 10) endanimvol42(i);
else if (t == 11) endanimvol43(i);
else if (t == 9) intro42animsounds(i);
else if (t == 7) intro4animsounds(i);
else if (t == 6) first4animsounds(i);
else if (t == 5) logoanimsounds(i);
else if (t < 4) endanimsounds(i);
i++;
if (!anim->numsounds && anim->sound_func)
anim->sound_func(i);
 
framenum = i++;
 
while (soundidx < anim->numsounds && anim->sounds[soundidx << 1] == framenum)
{
S_PlaySound(anim->sounds[(soundidx << 1) + 1]);
soundidx++;
}
} while (i < numframes);
 
end_anim_restore_gl:
468,7 → 322,7
I_ClearAllInput();
ANIM_FreeAnim();
walock[TILE_ANIM] = 1;
animlock[t-1] = 0;
anim->animlock = 0;
 
return !running;
}
/polymer/eduke32/source/anim.h
25,19 → 25,21
 
#define NUM_HARDCODED_ANIMS 12
 
# ifdef USE_LIBVPX
extern uint16_t anim_hi_numsounds[NUM_HARDCODED_ANIMS], *anim_hi_sounds[NUM_HARDCODED_ANIMS];
# endif
typedef struct
{
uint8_t* animbuf;
void (*sound_func)(int32_t);
uint16_t *sounds;
int16_t numsounds;
uint8_t framedelay;
char animlock;
} dukeanim_t;
 
int32_t G_PlayAnim(const char *fn,char t);
/*
void endanimvol43(int32_t fr);
void endanimvol42(int32_t fr);
void endanimvol41(int32_t fr);
void intro42animsounds(int32_t fr);
void first4animsounds(int32_t fr);
void intro4animsounds(int32_t fr);
void logoanimsounds(int32_t fr);
void endanimsounds(int32_t fr);
*/
extern dukeanim_t * g_animPtr;
extern hashtable_t h_dukeanim;
extern dukeanim_t * G_FindAnim(const char *s);
extern dukeanim_t * G_DefineAnim(const char *fn, uint8_t framerate, void (*sound_func)(int32_t));
int32_t G_PlayAnim(const char *fn);
void G_InitAnim(void);
 
#endif
/polymer/eduke32/source/animsounds.c
0,0 → 1,197
//-------------------------------------------------------------------------
/*
Copyright (C) 2015 EDuke32 developers and contributors
 
This file is part of EDuke32.
 
EDuke32 is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
See the GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
//-------------------------------------------------------------------------
 
#include "duke3d.h"
#include "animsounds.h"
 
void endanimsounds(int32_t fr)
{
switch (ud.volume_number)
{
case 0:
break;
case 1:
switch (fr)
{
case 1:
S_PlaySound(WIND_AMBIENCE);
break;
case 26:
S_PlaySound(ENDSEQVOL2SND1);
break;
case 36:
S_PlaySound(ENDSEQVOL2SND2);
break;
case 54:
S_PlaySound(THUD);
break;
case 62:
S_PlaySound(ENDSEQVOL2SND3);
break;
case 75:
S_PlaySound(ENDSEQVOL2SND4);
break;
case 81:
S_PlaySound(ENDSEQVOL2SND5);
break;
case 115:
S_PlaySound(ENDSEQVOL2SND6);
break;
case 124:
S_PlaySound(ENDSEQVOL2SND7);
break;
}
break;
case 2:
switch (fr)
{
case 1:
S_PlaySound(WIND_REPEAT);
break;
case 98:
S_PlaySound(DUKE_GRUNT);
break;
case 82+20:
S_PlaySound(THUD);
S_PlaySound(SQUISHED);
break;
case 104+20:
S_PlaySound(ENDSEQVOL3SND3);
break;
case 114+20:
S_PlaySound(ENDSEQVOL3SND2);
break;
case 158:
S_PlaySound(PIPEBOMB_EXPLODE);
break;
}
break;
}
}
 
void logoanimsounds(int32_t fr)
{
switch (fr)
{
case 1:
S_PlaySound(FLY_BY);
break;
case 19:
S_PlaySound(PIPEBOMB_EXPLODE);
break;
}
}
 
void intro4animsounds(int32_t fr)
{
switch (fr)
{
case 1:
S_PlaySound(INTRO4_B);
break;
case 12:
case 34:
S_PlaySound(SHORT_CIRCUIT);
break;
case 18:
S_PlaySound(INTRO4_5);
break;
}
}
 
void first4animsounds(int32_t fr)
{
switch (fr)
{
case 1:
S_PlaySound(INTRO4_1);
break;
case 12:
S_PlaySound(INTRO4_2);
break;
case 7:
S_PlaySound(INTRO4_3);
break;
case 26:
S_PlaySound(INTRO4_4);
break;
}
}
 
void intro42animsounds(int32_t fr)
{
switch (fr)
{
case 10:
S_PlaySound(INTRO4_6);
break;
}
}
 
void endanimvol41(int32_t fr)
{
switch (fr)
{
case 3:
S_PlaySound(DUKE_UNDERWATER);
break;
case 35:
S_PlaySound(VOL4ENDSND1);
break;
}
}
 
void endanimvol42(int32_t fr)
{
switch (fr)
{
case 11:
S_PlaySound(DUKE_UNDERWATER);
break;
case 20:
S_PlaySound(VOL4ENDSND1);
break;
case 39:
S_PlaySound(VOL4ENDSND2);
break;
case 50:
FX_StopAllSounds();
break;
}
}
 
void endanimvol43(int32_t fr)
{
switch (fr)
{
case 1:
S_PlaySound(BOSS4_DEADSPEECH);
break;
case 40:
S_PlaySound(VOL4ENDSND1);
S_PlaySound(DUKE_UNDERWATER);
break;
case 50:
S_PlaySound(BIGBANG);
break;
}
}
/polymer/eduke32/source/animsounds.h
0,0 → 1,33
//-------------------------------------------------------------------------
/*
Copyright (C) 2015 EDuke32 developers and contributors
 
This file is part of EDuke32.
 
EDuke32 is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
See the GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
//-------------------------------------------------------------------------
 
#ifndef animsounds_h__
#define animsounds_h__
void endanimsounds(int32_t fr);
void logoanimsounds(int32_t fr);
void intro4animsounds(int32_t fr);
void endanimvol43(int32_t fr);
void endanimvol42(int32_t fr);
void endanimvol41(int32_t fr);
void intro42animsounds(int32_t fr);
void first4animsounds(int32_t fr);
#endif // animsounds_h__
/polymer/eduke32/source/events_defs.h
104,6 → 104,7
EVENT_ACTIVATECHEAT,
EVENT_DISPLAYINACTIVEMENU,
EVENT_DISPLAYINACTIVEMENUREST,
EVENT_CUTSCENE,
#ifdef LUNATIC
EVENT_ANIMATEALLSPRITES,
#endif
/polymer/eduke32/source/game.c
222,9 → 222,11
T_MUSIC,
T_SOUND,
T_FILE,
T_CUTSCENE,
T_ANIMSOUNDS,
T_NOFLOORPALRANGE,
T_ID
T_ID,
T_DELAY
};
 
 
3767,13 → 3769,13
{
int32_t a = VM_OnEvent(EVENT_DISPLAYCROSSHAIR, g_player[screenpeek].ps->i, screenpeek);
 
if (a == 0 || a > 1)
if ((unsigned)a < MAXTILES)
{
vec2_t crosshairpos = { 160<<16, 100<<16 };
 
if (a == 0)
a = CROSSHAIR;
 
vec2_t crosshairpos = { 160<<16, 100<<16 };
 
rotatesprite_win(crosshairpos.x-(g_player[myconnectindex].ps->look_ang<<15),crosshairpos.y,scale(65536,ud.crosshairscale,100),
0,a,0,CROSSHAIR_PAL,2+1);
 
3809,13 → 3811,8
#endif
 
#ifdef USE_OPENGL
{
extern int32_t mdpause;
 
mdpause = 0;
if (ud.pause_on || (ud.recstat==2 && (g_demo_paused && g_demo_goalCnt==0)) || (g_player[myconnectindex].ps->gm&MODE_MENU && numplayers < 2))
mdpause = 1;
}
extern int32_t mdpause;
mdpause = (ud.pause_on || (ud.recstat==2 && (g_demo_paused && g_demo_goalCnt==0)) || (g_player[myconnectindex].ps->gm&MODE_MENU && numplayers < 2));
#endif
 
G_PrintFPS();
3823,7 → 3820,7
// JBF 20040124: display level stats in screen corner
if ((ud.overhead_on != 2 && ud.levelstats) && (g_player[myconnectindex].ps->gm&MODE_MENU) == 0)
{
const DukePlayer_t *myps = g_player[myconnectindex].ps;
DukePlayer_t const * const myps = g_player[myconnectindex].ps;
 
if (ud.screen_size == 4)
{
9366,9 → 9363,8
{ "noautoload", T_NOAUTOLOAD },
{ "music", T_MUSIC },
{ "sound", T_SOUND },
#ifdef USE_LIBVPX
{ "cutscene", T_CUTSCENE },
{ "animsounds", T_ANIMSOUNDS },
#endif
};
 
static const tokenlist sound_musictokens[] =
9377,6 → 9373,11
{ "file", T_FILE },
};
 
static const tokenlist animtokens [] =
{
{ "delay", T_DELAY },
};
 
while (1)
{
tokn = getatoken(script,tokens,ARRAY_SIZE(tokens));
9471,50 → 9472,75
}
break;
 
#ifdef USE_LIBVPX
case T_CUTSCENE:
{
int32_t delay = 10;
char *animend;
dukeanim_t *anim = NULL;
char *animname = NULL;
 
scriptfile_getstring(script, &animname);
 
if (scriptfile_getbraces(script, &animend))
break;
 
while (script->textptr < animend)
{
switch (getatoken(script, animtokens, ARRAY_SIZE(animtokens)))
{
case T_DELAY: scriptfile_getnumber(script, &delay); break;
}
}
 
// if (!preload)
{
/*
if (check_file_exist(animname))
break;
*/
 
anim = G_FindAnim(animname);
 
if (!anim)
anim = G_DefineAnim(animname, delay, NULL);
else
anim->framedelay = delay;
}
}
break;
case T_ANIMSOUNDS:
{
char *otokptr = script->ltextptr;
char *animsoundsend = NULL;
int32_t animnum, numpairs=0, allocsz=4, bad=1, lastframenum=INT32_MIN;
int32_t numpairs = 0, allocsz = 4, bad = 1, lastframenum = INT32_MIN;
dukeanim_t *anim = NULL;
char *animname = NULL;
 
static const tokenlist hardcoded_anim_tokens[] =
{
{ "cineov2", 0 },
{ "cineov3", 1 },
{ "RADLOGO", 2 },
{ "DUKETEAM", 3 },
{ "logo", 4 },
{ "vol41a", 5 },
{ "vol42a", 6 },
{ "vol4e1", 7 },
{ "vol43a", 8 },
{ "vol4e2", 9 },
{ "vol4e3", 10 },
{ "3dr", 11 },
// NUM_HARDCODED_ANIMS
};
scriptfile_getstring(script, &animname);
 
EDUKE32_STATIC_ASSERT(ARRAY_SIZE(hardcoded_anim_tokens) == NUM_HARDCODED_ANIMS);
if (animname)
anim = G_FindAnim(animname);
 
animnum = getatoken(script, hardcoded_anim_tokens, NUM_HARDCODED_ANIMS);
if ((unsigned)animnum >= NUM_HARDCODED_ANIMS)
if (!anim)
{
initprintf("Error: expected a hardcoded anim file name (sans extension) on line %s:%d\n",
script->filename, scriptfile_getlinum(script, otokptr));
break;
}
 
if (scriptfile_getbraces(script, &animsoundsend)) break;
if (scriptfile_getbraces(script, &animsoundsend))
break;
 
if (anim_hi_sounds[animnum])
if (anim->sounds)
{
initprintf("Warning: overwriting already defined hi-anim %s's sounds on line %s:%d\n",
hardcoded_anim_tokens[animnum].text, script->filename,
scriptfile_getlinum(script, otokptr));
Bfree(anim_hi_sounds[animnum]);
anim_hi_numsounds[animnum] = 0;
initprintf("Warning: overwriting already defined hi-anim %s's sounds on line %s:%d\n", animname,
script->filename, scriptfile_getlinum(script, otokptr));
Bfree(anim->sounds);
anim->numsounds = 0;
}
 
if (!preload)
anim_hi_sounds[animnum] = (uint16_t *)Xcalloc(allocsz, 2*sizeof(anim_hi_sounds[0]));
anim->sounds = (uint16_t *)Xcalloc(allocsz, 2 * sizeof(uint16_t));
while (script->textptr < animsoundsend)
{
int32_t framenum, soundnum;
9522,7 → 9548,10
if (preload)
{
// dummy
getatoken(script, hardcoded_anim_tokens, NUM_HARDCODED_ANIMS);
scriptfile_getstring(script, &animname);
 
if (animname)
anim = G_FindAnim(animname);
continue;
}
 
9534,21 → 9563,23
 
// would produce error when it encounters the closing '}'
// without the above hack
if (scriptfile_getnumber(script, &framenum)) break;
if (scriptfile_getnumber(script, &framenum))
break;
 
bad=1;
bad = 1;
 
// TODO: look carefully at whether this can be removed.
if (anim_hi_sounds[animnum]==NULL) // Bcalloc check
if (anim->sounds == NULL) // Bcalloc check
break;
 
if (scriptfile_getsymbol(script, &soundnum)) break;
if (scriptfile_getsymbol(script, &soundnum))
break;
 
// frame numbers start at 1 for us
if (framenum <= 0)
{
initprintf("Error: frame number must be greater zero on line %s:%d\n",
script->filename, scriptfile_getlinum(script, script->ltextptr));
initprintf("Error: frame number must be greater zero on line %s:%d\n", script->filename,
scriptfile_getlinum(script, script->ltextptr));
break;
}
 
9563,8 → 9594,8
 
if ((unsigned)soundnum >= MAXSOUNDS)
{
initprintf("Error: sound number #%d invalid on line %s:%d\n", soundnum,
script->filename, scriptfile_getlinum(script, script->ltextptr));
initprintf("Error: sound number #%d invalid on line %s:%d\n", soundnum, script->filename,
scriptfile_getlinum(script, script->ltextptr));
break;
}
 
9573,15 → 9604,15
void *newptr;
 
allocsz *= 2;
newptr = Xrealloc(anim_hi_sounds[animnum], allocsz*2*sizeof(anim_hi_sounds[0]));
newptr = Xrealloc(anim->sounds, allocsz * 2 * sizeof(uint16_t));
 
anim_hi_sounds[animnum] = (uint16_t *)newptr;
anim->sounds = (uint16_t *)newptr;
}
 
bad=0;
bad = 0;
 
anim_hi_sounds[animnum][2*numpairs] = framenum;
anim_hi_sounds[animnum][2*numpairs+1] = soundnum;
anim->sounds[2 * numpairs] = framenum;
anim->sounds[2 * numpairs + 1] = soundnum;
numpairs++;
}
 
9589,21 → 9620,20
{
if (!bad)
{
anim_hi_numsounds[animnum] = numpairs;
anim->numsounds = numpairs;
// initprintf("Defined sound sequence for hi-anim \"%s\" with %d frame/sound pairs\n",
// hardcoded_anim_tokens[animnum].text, numpairs);
}
else
{
Bfree(anim_hi_sounds[animnum]);
anim_hi_sounds[animnum] = NULL;
DO_FREE_AND_NULL(anim->sounds);
initprintf("Failed defining sound sequence for hi-anim \"%s\".\n",
hardcoded_anim_tokens[animnum].text);
animname);
}
}
}
break;
#endif // defined USE_LIBVPX
 
case T_SOUND:
{
char *tinttokptr = script->ltextptr;
10443,7 → 10473,7
if (!I_CheckAllInput() && g_noLogoAnim == 0)
{
Net_GetPackets();
G_PlayAnim("logo.anm",5);
G_PlayAnim("logo.anm");
G_FadePalette(0,0,0,63);
I_ClearAllInput();
}
10485,7 → 10515,7
if (i != -1)
{
kclose(i);
G_PlayAnim("3dr.anm", 12);
G_PlayAnim("3dr.anm");
G_FadePalette(0, 0, 0, 63);
I_ClearAllInput();
}
10682,6 → 10712,8
hash_free(&h_labels);
hash_free(&h_gamefuncs);
#endif
 
hash_free(&h_dukeanim); // TODO: free the dukeanim_t structs the hash table entries point to
}
 
/*
11476,15 → 11508,15
 
if (quitevent) return 4;
 
G_InitAnim();
 
const char *defsfile = G_DefFile();
uint32_t stime = getticks();
if (!loaddefinitionsfile(defsfile))
{
const char *defsfile = G_DefFile();
uint32_t stime = getticks();
if (!loaddefinitionsfile(defsfile))
{
uint32_t etime = getticks();
initprintf("Definitions file \"%s\" loaded in %d ms.\n", defsfile, etime-stime);
loaddefinitions_game(defsfile, FALSE);
}
uint32_t etime = getticks();
initprintf("Definitions file \"%s\" loaded in %d ms.\n", defsfile, etime-stime);
loaddefinitions_game(defsfile, FALSE);
}
 
for (i=0; i < g_defModulesNum; ++i)
12211,7 → 12243,7
if (ud.lockout == 0 && !(G_GetLogoFlags() & LOGO_NOE2BONUSSCENE))
{
fadepal(0,0,0, 63,0,-1);
G_PlayAnim("cineov2.anm",1);
G_PlayAnim("cineov2.anm");
I_ClearAllInput();
clearallviews(0L);
nextpage();
12247,19 → 12279,19
fadepal(0,0,0, 63,0,-1);
 
I_ClearAllInput();
t = G_PlayAnim("vol4e1.anm",8);
t = G_PlayAnim("vol4e1.anm");
clearallviews(0L);
nextpage();
if (t)
goto end_vol4e;
 
t = G_PlayAnim("vol4e2.anm",10);
t = G_PlayAnim("vol4e2.anm");
clearallviews(0L);
nextpage();
if (t)
goto end_vol4e;
 
G_PlayAnim("vol4e3.anm",11);
G_PlayAnim("vol4e3.anm");
clearallviews(0L);
nextpage();
}
12300,7 → 12332,7
clearallviews(0L);
nextpage();
 
G_PlayAnim("DUKETEAM.ANM",4);
G_PlayAnim("DUKETEAM.ANM");
 
I_ClearAllInput();
G_HandleEventsWhileNoInput();
12326,7 → 12358,7
if (ud.lockout == 0 && !(G_GetLogoFlags() & LOGO_NOE3BONUSSCENE))
{
fadepal(0,0,0, 63,0,-1);
G_PlayAnim("cineov3.anm",2);
G_PlayAnim("cineov3.anm");
I_ClearAllInput();
ototalclock = totalclock+200;
while (totalclock < ototalclock)
12341,7 → 12373,7
if (G_GetLogoFlags() & LOGO_NOE3RADLOGO)
goto ENDANM;
 
G_PlayAnim("RADLOGO.ANM",3);
G_PlayAnim("RADLOGO.ANM");
 
if (ud.lockout == 0 && !I_CheckAllInput())
{
12377,7 → 12409,7
clearallviews(0L);
nextpage();
 
G_PlayAnim("DUKETEAM.ANM",4);
G_PlayAnim("DUKETEAM.ANM");
 
I_ClearAllInput();
G_HandleEventsWhileNoInput();
/polymer/eduke32/source/gamedef.c
96,6 → 96,8
{ CON_DYNAMICSOUNDREMAP, 20130530 },
{ CON_SCREENSOUND, 20130628 },
{ CON_SETMUSICPOSITION, 20150115 },
{ CON_CUTSCENE, 20150117 },
{ CON_IFCUTSCENE, 20150117 },
};
#endif
 
555,6 → 557,8
"undefinevolume", // 375
"undefineskill", // 376
"undefinelevel", // 377
"cutscene", // 378
"ifcutscene", // 379
"<null>"
};
#endif
661,6 → 665,7
"EVENT_ACTIVATECHEAT",
"EVENT_DISPLAYINACTIVEMENU",
"EVENT_DISPLAYINACTIVEMENUREST",
"EVENT_CUTSCENE",
#ifdef LUNATIC
"EVENT_ANIMATEALLSPRITES",
#endif
4162,6 → 4167,7
case CON_SETACTORANGLE:
case CON_SETPLAYERANGLE:
case CON_SETMUSICPOSITION:
case CON_CUTSCENE:
C_GetNextVar();
continue;
 
5124,6 → 5130,7
case CON_IFP:
case CON_IFPINVENTORY:
case CON_IFPLAYERSL:
case CON_IFCUTSCENE:
{
intptr_t offset;
intptr_t lastScriptPtr = (g_scriptPtr-&script[0]-1);
5132,6 → 5139,9
 
switch (tw)
{
case CON_IFCUTSCENE:
C_GetNextVar();
break;
case CON_IFAI:
C_GetNextValue(LABEL_AI);
break;
/polymer/eduke32/source/gamedef.h
982,6 → 982,8
CON_UNDEFINEVOLUME, // 375
CON_UNDEFINESKILL, // 376
CON_UNDEFINELEVEL, // 377
CON_CUTSCENE, // 378
CON_IFCUTSCENE, // 379
CON_END
};
// KEEPINSYNC with the keyword list in lunatic/con_lang.lua
/polymer/eduke32/source/gameexec.c
38,6 → 38,7
#include "osd.h"
#include "menus.h"
#include "input.h"
#include "anim.h"
 
#ifdef LUNATIC
# include "lunatic_game.h"
2712,6 → 2713,31
}
continue;
 
case CON_CUTSCENE:
case CON_IFCUTSCENE:
insptr++;
{
int32_t j = Gv_GetVarX(*insptr++);
 
if (EDUKE32_PREDICT_FALSE((unsigned)j >= MAXQUOTES || ScriptQuotes[j] == NULL))
{
CON_ERRPRINTF("invalid quote ID %d for anim!\n", j);
continue;
}
 
if (tw == CON_IFCUTSCENE)
{
VM_CONDITIONAL(g_animPtr == G_FindAnim(ScriptQuotes[j]));
continue;
}
 
tw = ps->palette;
G_PlayAnim(ScriptQuotes[j]);
P_SetGamePalette(ps, tw, 2 + 16);
continue;
}
continue;
 
case CON_GUNIQHUDID:
insptr++;
{
/polymer/eduke32/source/premap.c
1363,19 → 1363,19
clearview(0L);
nextpage();
 
i = G_PlayAnim("vol41a.anm",6);
i = G_PlayAnim("vol41a.anm");
clearview(0L);
nextpage();
if (i)
goto end_vol4a;
 
i = G_PlayAnim("vol42a.anm",7);
i = G_PlayAnim("vol42a.anm");
clearview(0L);
nextpage();
if (i)
goto end_vol4a;
 
G_PlayAnim("vol43a.anm",9);
G_PlayAnim("vol43a.anm");
clearview(0L);
nextpage();