From a9d2bb1613669e2acb7bf50fd39c74f9f89b0002 Mon Sep 17 00:00:00 2001 From: avolkov Date: Wed, 2 Jun 2010 20:59:33 +0000 Subject: [PATCH] Use ditty-specific functions for playing and testing for (PLRPlaying() is not enough); fixes bug #1003 git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3546 8092fc87-c524-0410-9efc-e669fe64eaf9 --- sc2/ChangeLog | 1 + sc2/src/uqm/battle.c | 1 + sc2/src/uqm/tactrans.c | 50 +++++++++++++++++++++++++++++------------- sc2/src/uqm/tactrans.h | 2 ++ 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/sc2/ChangeLog b/sc2/ChangeLog index 52ef77455..8e992cd17 100644 --- a/sc2/ChangeLog +++ b/sc2/ChangeLog @@ -1,4 +1,5 @@ Changes towards version 0.7: +- Game no longer locks up after quickly escaping melee (bug #1003) - Alex - Reset input delay upon leaving Supermelee (bug #1022) - Alex - Properly account for simultaneous destruction of last ships in each fleet in Supermelee (bug #437) - Alex diff --git a/sc2/src/uqm/battle.c b/sc2/src/uqm/battle.c index fd1b0757e..b0a3c077c 100644 --- a/sc2/src/uqm/battle.c +++ b/sc2/src/uqm/battle.c @@ -510,6 +510,7 @@ AbortBattle: setBattleStateConnections (NULL); #endif /* NETPLAY */ + StopDitty (); StopMusic (); StopSound (); } diff --git a/sc2/src/uqm/tactrans.c b/sc2/src/uqm/tactrans.c index 56d2d02d7..74f82f080 100644 --- a/sc2/src/uqm/tactrans.c +++ b/sc2/src/uqm/tactrans.c @@ -43,6 +43,9 @@ #include "libs/mathlib.h" +static BOOLEAN dittyIsPlaying; + + BOOLEAN OpponentAlive (STARSHIP *TestStarShipPtr) { @@ -66,6 +69,31 @@ OpponentAlive (STARSHIP *TestStarShipPtr) return TRUE; } +static void +PlayDitty (STARSHIP *ship) +{ + PlayMusic (ship->RaceDescPtr->ship_data.victory_ditty, FALSE, 3); + dittyIsPlaying = TRUE; +} + +void +StopDitty (void) +{ + if (dittyIsPlaying) + StopMusic (); + dittyIsPlaying = FALSE; +} + +static BOOLEAN +DittyPlaying (void) +{ + if (!dittyIsPlaying) + return FALSE; + + dittyIsPlaying = PLRPlaying ((MUSIC_REF)~0); + return dittyIsPlaying; +} + #ifdef NETPLAY static void readyToEnd2Callback (NetConnection *conn, void *arg) @@ -223,12 +251,12 @@ readyForBattleEnd (COUNT side) return true; #else /* !DEMO_MODE */ (void) side; - return !PLRPlaying ((MUSIC_REF)~0); + return !DittyPlaying (); #endif /* !DEMO_MODE */ #else /* defined (NETPLAY) */ int playerI; - if (PLRPlaying ((MUSIC_REF)~0)) + if (DittyPlaying ()) return false; // We can only handle one dead ship at a time. So 'deadSide' is set @@ -272,23 +300,14 @@ new_ship (ELEMENT *DeadShipPtr) } else { + // Ship explosion has finished, or ship has just warped out + // if DeadStarShipPtr->crew_level != 0 BOOLEAN MusicStarted; HELEMENT hElement, hSuccElement; /* Record crew left after the battle */ DeadStarShipPtr->crew_level = DeadStarShipPtr->RaceDescPtr->ship_info.crew_level; - if (DeadStarShipPtr->crew_level) - { - // We've just warped out. new_ship() will still be called - // a few times, as for any "dead" ship. - StopMusic (); - - // Even after much investigation, I could find no purpose for - // the next line, but with the crew management changes I need - // it not to be here. - SvdB - // DeadStarShipPtr->RaceDescPtr->ship_info.crew_level = 0; - } MusicStarted = FALSE; // XXX: Set to 0 to be vaguely checksum-compatible with previous @@ -333,8 +352,7 @@ new_ship (ELEMENT *DeadShipPtr) { // StarShipPtr points to the remaining ship. MusicStarted = TRUE; - PlayMusic (StarShipPtr->RaceDescPtr-> - ship_data.victory_ditty, FALSE, 3); + PlayDitty (StarShipPtr); StarShipPtr->cur_status_flags &= ~PLAY_VICTORY_DITTY; } @@ -361,6 +379,7 @@ new_ship (ELEMENT *DeadShipPtr) { BOOLEAN RestartMusic; + StopDitty (); StopMusic (); StopSound (); @@ -520,6 +539,7 @@ ship_death (ELEMENT *ShipPtr) HELEMENT hElement, hNextElement; ELEMENT *ElementPtr; + StopDitty (); StopMusic (); GetElementStarShip (ShipPtr, &StarShipPtr); diff --git a/sc2/src/uqm/tactrans.h b/sc2/src/uqm/tactrans.h index a09dbb641..65a79d1f1 100644 --- a/sc2/src/uqm/tactrans.h +++ b/sc2/src/uqm/tactrans.h @@ -37,6 +37,8 @@ extern void ship_death (ELEMENT *ShipPtr); extern void spawn_ion_trail (ELEMENT *ElementPtr); extern void flee_preprocess (ELEMENT *ElementPtr); +extern void StopDitty (void); + #endif /* _TACTRANS_H */