Path: blob/master/SonicMania/Objects/Global/Music.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Music Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectMusic *Music;1011void Music_Update(void)12{13RSDK_THIS(Music);1415StateMachine_Run(self->state);16}1718void Music_LateUpdate(void) {}1920void Music_StaticUpdate(void) {}2122void Music_Draw(void) {}2324void Music_Create(void *data)25{26RSDK_THIS(Music);2728if (!SceneInfo->inEditor) {29// if frozen, ACTIVE_ALWAYS, else ACTIVE_NORMAL30self->active = ACTIVE_ALWAYS + ((SceneInfo->state & 3) != ENGINESTATE_FROZEN);3132if (self->trackFile.length) {33if (self->trackID != TRACK_SOUNDTEST) {34char trackName[0x20];35RSDK.GetCString(trackName, &self->trackFile);36Music_SetMusicTrack(trackName, self->trackID, self->trackLoop);3738if (self->playOnLoad)39self->state = Music_State_PlayOnLoad;40else41destroyEntity(self);42}43}44}45}4647void Music_StageLoad(void)48{49// Slot 0: stage music50Music_SetMusicTrack("Invincible.ogg", TRACK_INVINCIBLE, 139263);51Music_SetMusicTrack("Sneakers.ogg", TRACK_SNEAKERS, 120960);52Music_SetMusicTrack("BossMini.ogg", TRACK_MINIBOSS, 276105);53Music_SetMusicTrack("BossHBH.ogg", TRACK_HBHBOSS, 70560);54Music_SetMusicTrack("BossEggman1.ogg", TRACK_EGGMAN1, 282240);55Music_SetMusicTrack("BossEggman2.ogg", TRACK_EGGMAN2, 264600);56Music_SetMusicTrack("ActClear.ogg", TRACK_ACTCLEAR, false);57Music_SetMusicTrack("Drowning.ogg", TRACK_DROWNING, false);58Music_SetMusicTrack("GameOver.ogg", TRACK_GAMEOVER, false);59Music_SetMusicTrack("Super.ogg", TRACK_SUPER, 165375);60Music_SetMusicTrack("HBHMischief.ogg", TRACK_HBHMISCHIEF, 381405);61// Slot 12 (slot 11 in pre-plus): "no load"62Music_SetMusicTrack("1up.ogg", TRACK_1UP, false);6364#if GAME_VERSION != VER_10065if (globals->suppressAutoMusic) {66if (globals->restartMusicID > TRACK_STAGE)67Music->activeTrack = globals->restartMusicID;68}69else {70Music->activeTrack = TRACK_STAGE;71}7273globals->restartMusicID = TRACK_STAGE;74Music->nextTrack = TRACK_NONE;75#else76if (!globals->suppressAutoMusic)77Music->activeTrack = TRACK_STAGE;7879Music->prevTrack = TRACK_NONE;80Music->nextTrack = TRACK_NONE;81Music->playingDrownTrack = false;82Music->playing1UPTrack = false;83#endif8485#if MANIA_USE_PLUS86if (sku_platform == PLATFORM_DEV)87RSDK.AddViewableVariable("Vape Mode", &globals->vapeMode, VIEWVAR_BOOL, false, true);88#endif89}9091void Music_SetMusicTrack(const char *path, uint8 track, uint32 loopPoint)92{93track &= 0xF;9495int32 charID = 0;96for (; charID < 0x20; ++charID) {97if (!path[charID])98break;99else100Music->trackNames[track][charID] = path[charID];101}102Music->trackNames[track][charID] = 0;103Music->trackLoops[track] = loopPoint;104}105106void Music_Stop(void) { RSDK.StopChannel(Music->channelID); }107void Music_Pause(void) { RSDK.PauseChannel(Music->channelID); }108void Music_Resume(void) { RSDK.ResumeChannel(Music->channelID); }109bool32 Music_IsPlaying(void) { return RSDK.ChannelActive(Music->channelID); }110111void Music_State_PlayOnLoad(void)112{113RSDK_THIS(Music);114115if (globals->suppressAutoMusic) {116globals->suppressAutoMusic = false;117118#if MANIA_USE_PLUS119switch (Music->activeTrack) {120case TRACK_INVINCIBLE:121case TRACK_SNEAKERS:122case TRACK_1UP: Music_TransitionTrack(self->trackID, 0.025); break;123case TRACK_SUPER: Music_PlayAutoMusicQueuedTrack(Music->activeTrack); break;124default: break;125}126#endif127}128else {129Music_PlayTrack(self->trackID);130}131132destroyEntity(self);133}134135void Music_PlayJingle(uint8 trackID)136{137trackID &= 0xF;138139#if MANIA_USE_PLUS140// remove any existing vers of this on the stack141for (int32 slot = SLOT_MUSICSTACK_START; slot < SLOT_MUSICSTACK_END; ++slot) {142EntityMusic *music = RSDK_GET_ENTITY(slot, Music);143if (music->classID == Music->classID && music->trackID == trackID) {144destroyEntity(music);145}146}147148EntityMusic *entity = NULL;149// get the first empty stack slot150for (int32 slot = SLOT_MUSICSTACK_START; slot < SLOT_MUSICSTACK_END; ++slot) {151entity = RSDK_GET_ENTITY(slot, Music);152if (entity->classID != Music->classID) {153RSDK.ResetEntity(entity, Music->classID, NULL);154break;155}156}157158entity->trackID = trackID;159entity->state = Music_State_Jingle;160entity->trackPriority = TRACK_PRIORITY_NONE;161entity->fadeSpeed = 0.08;162163switch (trackID) {164case TRACK_INVINCIBLE:165case TRACK_SNEAKERS:166Music_HandleMusicStack_Powerups(entity);167entity->trackPriority = TRACK_PRIORITY_POWERUP;168entity->restartTrack = true;169break;170171case TRACK_DROWNING:172entity->timer = 960;173entity->trackPriority = TRACK_PRIORITY_DROWN;174entity->restartTrack = true;175break;176177case TRACK_SUPER:178entity->trackPriority = TRACK_PRIORITY_SUPER;179entity->restartTrack = true;180break;181182case TRACK_1UP:183entity->timer = 224;184entity->trackPriority = TRACK_PRIORITY_1UP;185break;186187default: break;188}189190Music_GetNextTrackStartPos(entity);191192for (int32 slot = SLOT_MUSICSTACK_START; slot < SLOT_MUSICSTACK_END; ++slot) {193EntityMusic *music = RSDK_GET_ENTITY(slot, Music);194if (music->classID == Music->classID && music != entity) {195if (music->trackPriority > entity->trackPriority) {196entity->volume = 0.0;197return;198}199}200}201202Music_Stop();203Music->activeTrack = trackID;204Music->channelID = RSDK.PlayStream(Music->trackNames[Music->activeTrack], 0, 0, Music->trackLoops[Music->activeTrack], true);205206#if MANIA_USE_PLUS207if (globals->vapeMode)208RSDK.SetChannelAttributes(Music->channelID, 1.0, 0.0, 0.75);209#endif210211entity->volume = 1.0;212#else213214switch (trackID) {215case TRACK_1UP: {216Music->playing1UPTrack = true;217218EntityMusic *music = RSDK_GET_ENTITY(SLOT_MUSIC, Music);219RSDK.ResetEntity(music, Music->classID, NULL);220music->state = Music_State_1UPJingle;221music->volume = 0.0;222music->fadeSpeed = 0.08;223224if (Music->activeTrack != TRACK_1UP) {225Music->trackStartPos = RSDK.GetChannelPos(Music->channelID);226Music->queuedTrack = Music->activeTrack;227}228229Music_Stop();230Music->activeTrack = TRACK_1UP;231Music->channelID = RSDK.PlayStream(Music->trackNames[Music->activeTrack], 0, 0, Music->trackLoops[Music->activeTrack], true);232break;233}234235default:236if (Music->playing1UPTrack || Music->playingDrownTrack) {237Music->nextTrack = trackID;238}239else {240destroyEntitySlot(SLOT_MUSIC);241Music_Stop();242243if (!Music->playingRegularTrack)244Music->nextTrack = Music->activeTrack;245246Music->playingRegularTrack = true;247248Music->nextTrack = TRACK_NONE;249Music->activeTrack = trackID;250Music->trackStartPos = 0;251Music->channelID = RSDK.PlayStream(Music->trackNames[Music->activeTrack], 0, 0, Music->trackLoops[Music->activeTrack], true);252}253break;254}255#endif256}257258void Music_PlayTrack(uint8 trackID)259{260trackID &= 0xF;261262#if MANIA_USE_PLUS263if (trackID != TRACK_ACTCLEAR && Music_CheckMusicStack_Active()) {264Music->nextTrack = trackID;265}266else {267if (trackID == TRACK_ACTCLEAR)268Music_ClearMusicStack();269270destroyEntitySlot(SLOT_MUSIC);271Music_Stop();272273Music->activeTrack = trackID;274Music->trackStartPos = 0;275Music->channelID = RSDK.PlayStream(Music->trackNames[trackID], 0, 0, Music->trackLoops[trackID], true);276277if (globals->vapeMode)278RSDK.SetChannelAttributes(Music->channelID, 1.0, 0.0, 0.75);279}280#else281if (Music->playing1UPTrack || Music->playingDrownTrack) {282Music->nextTrack = trackID;283}284else {285EntityMusic *music = RSDK_GET_ENTITY(SLOT_MUSIC, Music);286RSDK.ResetEntity(music, Music->classID, NULL);287288if (!Music->playingRegularTrack)289Music->prevTrack = Music->activeTrack;290291bool32 regularTrack = true;292switch (trackID) {293default: break;294295case TRACK_INVINCIBLE:296case TRACK_SNEAKERS:297case TRACK_SUPER:298case TRACK_SOUNDTEST:299case TRACK_HBHMISCHIEF:300case TRACK_1UP: regularTrack = false; break;301}302303if (regularTrack)304Music->playingRegularTrack = true;305306Music->nextTrack = TRACK_NONE;307Music->activeTrack = trackID;308Music->trackStartPos = 0;309Music->channelID = RSDK.PlayStream(Music->trackNames[trackID], 0, 0, Music->trackLoops[trackID], true);310}311#endif312}313314void Music_PlayTrackPtr(EntityMusic *entity)315{316RSDK.GetCString(Music->trackNames[0], &entity->trackFile);317Music->trackLoops[0] = entity->trackLoop;318319destroyEntitySlot(SLOT_MUSIC);320Music_Stop();321322Music->activeTrack = 0;323Music->trackStartPos = 0;324Music->channelID = RSDK.PlayStream(Music->trackNames[0], 0, 0, Music->trackLoops[0], true);325326#if MANIA_USE_PLUS327if (globals->vapeMode)328RSDK.SetChannelAttributes(Music->channelID, 1.0, 0.0, 0.75);329#endif330}331332#if MANIA_USE_PLUS333void Music_PlayAutoMusicQueuedTrack(uint8 trackID)334{335trackID &= 0xF;336Music->nextTrack = TRACK_STAGE;337338// remove any existing vers of this on the stack339for (int32 slot = SLOT_MUSICSTACK_START; slot < SLOT_MUSICSTACK_END; ++slot) {340EntityMusic *music = RSDK_GET_ENTITY(slot, Music);341if (music->classID == Music->classID && music->trackID == trackID) {342destroyEntity(music);343}344}345346EntityMusic *entity = NULL;347// get the first empty stack slot348for (int32 slot = SLOT_MUSICSTACK_START; slot < SLOT_MUSICSTACK_END; ++slot) {349entity = RSDK_GET_ENTITY(slot, Music);350if (entity->classID != Music->classID) {351destroyEntity(entity);352break;353}354}355356entity->trackID = trackID;357entity->state = Music_State_Jingle;358entity->trackPriority = TRACK_PRIORITY_NONE;359entity->volume = 1.0;360entity->fadeSpeed = 0.08;361362switch (trackID) {363case TRACK_INVINCIBLE:364case TRACK_SNEAKERS:365Music_HandleMusicStack_Powerups(entity);366entity->trackPriority = TRACK_PRIORITY_POWERUP;367entity->restartTrack = true;368break;369370case TRACK_DROWNING:371entity->timer = 960;372entity->trackPriority = TRACK_PRIORITY_DROWN;373entity->restartTrack = true;374break;375376case TRACK_SUPER:377entity->trackPriority = TRACK_PRIORITY_SUPER;378entity->restartTrack = true;379break;380381case TRACK_1UP:382entity->timer = 224;383entity->trackPriority = TRACK_PRIORITY_1UP;384break;385386default: break;387}388}389390void Music_HandleMusicStack_Powerups(EntityMusic *entity)391{392for (int32 slot = SLOT_MUSICSTACK_START; slot < SLOT_MUSICSTACK_END; ++slot) {393EntityMusic *music = RSDK_GET_ENTITY(slot, Music);394if (music->classID == Music->classID && music->trackPriority == TRACK_PRIORITY_POWERUP && music->trackID != entity->trackID395&& music != entity)396music->trackPriority = TRACK_PRIORITY_ANY;397}398}399400bool32 Music_CheckMusicStack_Active(void)401{402bool32 active = false;403404for (int32 slot = SLOT_MUSICSTACK_START; slot < SLOT_MUSICSTACK_END; ++slot) {405EntityMusic *music = RSDK_GET_ENTITY(slot, Music);406if (music->classID == Music->classID && music->trackPriority > TRACK_PRIORITY_NONE)407active = true;408}409410return active;411}412413void Music_GetNextTrackStartPos(EntityMusic *entity)414{415int32 stackCount = 0;416417for (int32 slot = SLOT_MUSICSTACK_START; slot < SLOT_MUSICSTACK_END; ++slot) {418EntityMusic *music = RSDK_GET_ENTITY(slot, Music);419if (music->classID == Music->classID && entity != music) {420if (music->trackID == Music->activeTrack) {421entity->trackStartPos = RSDK.GetChannelPos(Music->channelID);422entity->volume = 0.0;423}424stackCount++;425}426}427428if (!stackCount) {429if (Music->activeTrack > TRACK_NONE) {430if (Music->nextTrack == TRACK_NONE)431Music->nextTrack = Music->activeTrack;432433Music->trackStartPos = RSDK.GetChannelPos(Music->channelID);434}435}436}437#endif438439void Music_JingleFadeOut(uint8 trackID, bool32 transitionFade)440{441trackID &= 0xF;442443#if MANIA_USE_PLUS444for (int32 slot = SLOT_MUSICSTACK_START; slot < SLOT_MUSICSTACK_END; ++slot) {445EntityMusic *music = RSDK_GET_ENTITY(slot, Music);446if (music->classID == Music->classID && music->trackID == trackID) {447if (transitionFade) {448music->state = Music_State_JingleFade;449music->fadeSpeed = 0.05;450}451else {452music->timer = 1;453}454break;455}456}457#else458switch (trackID) {459default: break;460461case TRACK_INVINCIBLE:462case TRACK_SNEAKERS:463case TRACK_SUPER:464Music->playingRegularTrack = false;465466if (Music->nextTrack == TRACK_NONE)467Music_TransitionTrack(trackID, 0.025);468break;469470case TRACK_DROWNING:471if (Music->playingDrownTrack) {472Music->playingDrownTrack = false;473474if (Music->playing1UPTrack) {475if (Music->nextTrack == TRACK_NONE) {476Music->queuedTrack = Music->prevTrack == TRACK_NONE ? TRACK_STAGE : Music->prevTrack;477}478else {479Music->queuedTrack = Music->nextTrack;480Music->nextTrack = TRACK_NONE;481}482}483else {484if (Music->nextTrack == TRACK_NONE) {485Music->activeTrack = Music->activeTrack == TRACK_NONE ? TRACK_STAGE : Music->prevTrack;486}487else {488Music->activeTrack = Music->nextTrack;489Music->nextTrack = TRACK_NONE;490}491492Music_Stop();493Music->channelID = RSDK.PlayStream(Music->trackNames[Music->activeTrack], 0, 0, Music->trackLoops[Music->activeTrack], true);494}495}496break;497}498#endif499}500501#if MANIA_USE_PLUS502void Music_FinishJingle(EntityMusic *entity)503{504if (entity) {505EntityMusic *music = RSDK_GET_ENTITY(SLOT_MUSIC, Music);506if (music->classID == Music->classID && music->state == Music_State_PlayOnFade) {507destroyEntity(entity);508}509else {510destroyEntity(music);511512// remove all of these buggers that have higher priority and thus wont be played513for (int32 slot = SLOT_MUSICSTACK_START; slot < SLOT_MUSICSTACK_END; ++slot) {514EntityMusic *stack = RSDK_GET_ENTITY(slot, Music);515if (stack->classID == Music->classID && stack != entity && entity->trackPriority <= stack->trackPriority) {516destroyEntity(entity);517return;518}519}520521bool32 shouldRestartTrack = entity->restartTrack;522destroyEntity(entity);523int32 priority = TRACK_PRIORITY_NONE;524525EntityMusic *trackPtr = NULL;526// the next track to be played will be the track with the highest priority on the stack (may be none)527for (int32 slot = SLOT_MUSICSTACK_START; slot < SLOT_MUSICSTACK_END; ++slot) {528EntityMusic *stack = RSDK_GET_ENTITY(slot, Music);529if (stack->classID == Music->classID && stack->trackPriority > priority) {530trackPtr = stack;531priority = stack->trackPriority;532}533}534535if (trackPtr) { // another track is on the music stack still536Music_Stop();537538if (trackPtr->trackID == Music->activeTrack) {539trackPtr->trackStartPos = 0;540}541else {542Music->activeTrack = trackPtr->trackID;543if (shouldRestartTrack)544trackPtr->trackStartPos = 0;545Music->channelID = RSDK.PlayStream(Music->trackNames[Music->activeTrack], 0, trackPtr->trackStartPos,546Music->trackLoops[Music->activeTrack], true);547if (trackPtr->trackStartPos) {548RSDK.SetChannelAttributes(Music->channelID, 0.0, 0.0, globals->vapeMode ? 0.75 : 1.0);549}550else if (globals->vapeMode) {551RSDK.SetChannelAttributes(Music->channelID, 1.0, 0.0, 0.75);552}553}554}555else if (Music->nextTrack > TRACK_NONE) { // next track is queued556Music_Stop();557558Music->activeTrack = Music->nextTrack;559Music->nextTrack = TRACK_NONE;560561if (shouldRestartTrack)562Music->trackStartPos = 0;563564Music->channelID =565RSDK.PlayStream(Music->trackNames[Music->activeTrack], 0, Music->trackStartPos, Music->trackLoops[Music->activeTrack], true);566567if (Music->trackStartPos) {568RSDK.SetChannelAttributes(Music->channelID, 0.0, 0.0, globals->vapeMode ? 0.75 : 1.0);569music = RSDK_GET_ENTITY(SLOT_MUSIC, Music);570RSDK.ResetEntity(music, Music->classID, NULL);571music->state = Music_State_FadeTrackIn;572music->volume = 0.0;573music->fadeSpeed = 0.08;574}575else if (globals->vapeMode) {576RSDK.SetChannelAttributes(Music->channelID, 1.0, 0.0, 0.75);577}578}579}580}581}582583void Music_ClearMusicStack(void)584{585for (int32 slot = SLOT_MUSICSTACK_START; slot < SLOT_MUSICSTACK_END; ++slot) destroyEntity(RSDK_GET_ENTITY(slot, Music));586}587#endif588589void Music_TransitionTrack(uint8 trackID, float fadeSpeed)590{591trackID &= 0xF;592593EntityMusic *music = NULL;594#if MANIA_USE_PLUS595switch (trackID) {596case TRACK_ACTCLEAR:597Music_ClearMusicStack();598// [Fallthrough]599600case TRACK_MINIBOSS:601case TRACK_HBHBOSS:602case TRACK_EGGMAN1:603case TRACK_EGGMAN2:604case TRACK_HBHMISCHIEF: music = RSDK_GET_ENTITY(SLOT_MUSIC, Music); break;605606default:607if (!Music_CheckMusicStack_Active())608music = RSDK_GET_ENTITY(SLOT_MUSIC, Music);609break;610}611612Music->nextTrack = trackID;613#else614if (Music->playing1UPTrack || Music->playingDrownTrack) {615Music->nextTrack = Music->prevTrack;616}617else if (Music->activeTrack == trackID) {618Music->nextTrack = Music->prevTrack & 0xF;619music = RSDK_GET_ENTITY(SLOT_MUSIC, Music);620}621else {622Music->nextTrack = trackID & 0xF;623music = RSDK_GET_ENTITY(SLOT_MUSIC, Music);624}625#endif626627if (music && (music->classID != Music->classID || music->state != Music_State_PlayOnFade)) {628RSDK.ResetEntity(music, Music->classID, NULL);629music->state = Music_State_PlayOnFade;630music->volume = 1.0;631music->fadeSpeed = fadeSpeed;632}633}634635void Music_FadeOut(float fadeSpeed)636{637if (Music->activeTrack != TRACK_DROWNING) {638EntityMusic *music = RSDK_GET_ENTITY(SLOT_MUSIC, Music);639RSDK.ResetEntity(music, Music->classID, NULL);640music->state = Music_State_StopOnFade;641music->volume = 1.0;642music->fadeSpeed = fadeSpeed;643}644}645646#if MANIA_USE_PLUS647void Music_State_Jingle(void)648{649RSDK_THIS(Music);650651if (Music->activeTrack == self->trackID && RSDK.GetChannelPos(Music->channelID) > (uint32)self->trackStartPos) {652self->trackStartPos = 0;653if (self->volume < 1.0) {654self->volume += self->fadeSpeed;655RSDK.SetChannelAttributes(Music->channelID, self->volume, 0.0, 1.0);656if (self->volume >= 1.0)657self->volume = 1.0;658}659}660661if (self->timer > 0) {662if (!--self->timer)663Music_FinishJingle(self);664}665}666void Music_State_JingleFade(void)667{668RSDK_THIS(Music);669670if (self->volume > -0.5) {671self->volume -= self->fadeSpeed;672673if (Music->activeTrack == self->trackID)674RSDK.SetChannelAttributes(Music->channelID, self->volume, 0.0, 1.0);675676if (self->volume <= -0.5)677Music_FinishJingle(self);678}679}680#endif681682void Music_State_FadeTrackIn(void)683{684RSDK_THIS(Music);685686#if MANIA_USE_PLUS687if (RSDK.GetChannelPos(Music->channelID) > (uint32)Music->trackStartPos) {688Music->trackStartPos = 0;689self->volume += self->fadeSpeed;690691RSDK.SetChannelAttributes(Music->channelID, self->volume, 0.0, 1.0);692if (self->volume >= 1.0) {693self->volume = 1.0;694destroyEntity(self);695}696}697#else698self->volume += self->fadeSpeed;699RSDK.SetChannelAttributes(Music->channelID, self->volume, 0.0, 1.0);700if (self->volume >= 1.0) {701self->volume = 1.0;702destroyEntity(self);703}704#endif705}706void Music_State_StopOnFade(void)707{708RSDK_THIS(Music);709710self->volume -= self->fadeSpeed;711RSDK.SetChannelAttributes(Music->channelID, self->volume, 0.0, 1.0);712713if (self->volume < -0.5) {714Music_Stop();715destroyEntity(self);716}717}718719void Music_State_PlayOnFade(void)720{721RSDK_THIS(Music);722723self->volume -= self->fadeSpeed;724RSDK.SetChannelAttributes(Music->channelID, self->volume, 0.0, 1.0);725726if (self->volume < -0.5) {727#if MANIA_USE_PLUS728Music_Stop();729730Music->activeTrack = Music->nextTrack;731Music->trackStartPos = 0;732Music->channelID = RSDK.PlayStream(Music->trackNames[Music->activeTrack], 0, 0, Music->trackLoops[Music->activeTrack], true);733734if (globals->vapeMode)735RSDK.SetChannelAttributes(Music->channelID, 1.0, 0.0, 0.75);736#else737int32 trackID = Music->nextTrack & 0xF;738if (Music->playing1UPTrack || Music->playingDrownTrack) {739Music->nextTrack = trackID;740}741else {742destroyEntitySlot(SLOT_MUSIC);743Music_Stop();744745if (!Music->playingRegularTrack)746Music->prevTrack = Music->activeTrack;747748bool32 regularTrack = true;749switch (trackID) {750default: break;751752case TRACK_INVINCIBLE:753case TRACK_SNEAKERS:754case TRACK_SUPER:755case TRACK_SOUNDTEST:756case TRACK_HBHMISCHIEF:757case TRACK_1UP: regularTrack = false; break;758}759760if (regularTrack)761Music->playingRegularTrack = true;762763Music->nextTrack = TRACK_NONE;764Music->activeTrack = trackID;765Music->trackStartPos = 0;766Music->channelID = RSDK.PlayStream(Music->trackNames[Music->activeTrack], 0, 0, Music->trackLoops[Music->activeTrack], true);767}768#endif769770Music->nextTrack = TRACK_NONE;771destroyEntity(self);772}773}774775#if !MANIA_USE_PLUS776void Music_State_1UPJingle(void)777{778RSDK_THIS(Music);779780self->timer++;781if (self->timer == 224) {782Music_Stop();783784if (Music->nextTrack == TRACK_NONE) {785Music->activeTrack = Music->queuedTrack;786}787else {788Music->activeTrack = Music->nextTrack;789Music->trackStartPos = 0;790Music->nextTrack = TRACK_NONE;791}792793if (Music->playingDrownTrack) {794if (Music->activeTrack != TRACK_DROWNING)795Music->trackStartPos = 0;796797Music->activeTrack = TRACK_DROWNING;798}799800Music->playing1UPTrack = false;801Music->channelID =802RSDK.PlayStream(Music->trackNames[Music->activeTrack], 0, Music->trackStartPos, Music->trackLoops[Music->activeTrack], true);803804if (Music->trackStartPos)805RSDK.SetChannelAttributes(Music->channelID, self->volume, 0.0, 1.0);806else807destroyEntity(self);808}809else if (self->timer > 224) {810if (RSDK.GetChannelPos(Music->channelID) > Music->trackStartPos) {811self->timer = 0;812Music->trackStartPos = 0;813self->state = Music_State_FadeTrackIn;814}815}816}817#endif818819#if GAME_INCLUDE_EDITOR820void Music_EditorDraw(void)821{822RSDK_THIS(Music);823824RSDK.SetSpriteAnimation(Music->aniFrames, 0, &self->animator, true, 1);825RSDK.DrawSprite(&self->animator, NULL, false);826}827828void Music_EditorLoad(void)829{830Music->aniFrames = RSDK.LoadSpriteAnimation("Editor/EditorIcons.bin", SCOPE_STAGE);831832RSDK_ACTIVE_VAR(Music, trackID);833RSDK_ENUM_VAR("Zone Act", TRACK_STAGE);834RSDK_ENUM_VAR("Invincible", TRACK_INVINCIBLE);835RSDK_ENUM_VAR("Power Sneakers", TRACK_SNEAKERS);836RSDK_ENUM_VAR("Mini Boss", TRACK_MINIBOSS);837RSDK_ENUM_VAR("HBH Boss", TRACK_HBHBOSS);838RSDK_ENUM_VAR("Eggman Boss 1", TRACK_EGGMAN1);839RSDK_ENUM_VAR("Eggman Boss 2", TRACK_EGGMAN2);840RSDK_ENUM_VAR("Act Clear", TRACK_ACTCLEAR);841RSDK_ENUM_VAR("Drowning", TRACK_DROWNING);842RSDK_ENUM_VAR("Game Over", TRACK_GAMEOVER);843RSDK_ENUM_VAR("Super Sonic", TRACK_SUPER);844#if MANIA_USE_PLUS845RSDK_ENUM_VAR("HBH Mischief", TRACK_HBHMISCHIEF);846RSDK_ENUM_VAR("Sound Test", TRACK_SOUNDTEST);847#else848RSDK_ENUM_VAR("Sound Test", TRACK_SOUNDTEST);849RSDK_ENUM_VAR("HBH Mischief", TRACK_HBHMISCHIEF);850#endif851RSDK_ENUM_VAR("1UP", TRACK_1UP);852}853#endif854855void Music_Serialize(void)856{857RSDK_EDITABLE_VAR(Music, VAR_STRING, trackFile);858RSDK_EDITABLE_VAR(Music, VAR_STRING, soundTestTitle);859RSDK_EDITABLE_VAR(Music, VAR_ENUM, trackID);860RSDK_EDITABLE_VAR(Music, VAR_UINT32, trackLoop);861RSDK_EDITABLE_VAR(Music, VAR_BOOL, playOnLoad);862}863864865