From: <kla...@us...> - 2012-07-16 03:51:02
|
Revision: 13388 http://vegastrike.svn.sourceforge.net/vegastrike/?rev=13388&view=rev Author: klaussfreire Date: 2012-07-16 03:50:55 +0000 (Mon, 16 Jul 2012) Log Message: ----------- issue #3435204: expand cockpit sounds Modified Paths: -------------- trunk/data/cockpits/disabled-cockpit.cpt/disabled-cockpit.cpt trunk/vegastrike/CMakeLists.txt trunk/vegastrike/Makefile.am trunk/vegastrike/src/SharedPool.h trunk/vegastrike/src/accountserver.cpp trunk/vegastrike/src/cmd/container.h trunk/vegastrike/src/cmd/images.h trunk/vegastrike/src/cmd/unit_generic.cpp trunk/vegastrike/src/cmd/unit_generic.h trunk/vegastrike/src/gfx/cockpit.cpp trunk/vegastrike/src/gfx/cockpit.h trunk/vegastrike/src/gfx/cockpit_generic.cpp trunk/vegastrike/src/gfx/cockpit_generic.h trunk/vegastrike/src/gfx/cockpit_xml.cpp trunk/vegastrike/src/gfx/vid_file.cpp trunk/vegastrike/src/vegastrike.h trunk/vegastrike/src/vs_globals.cpp trunk/vegastrike/src/vsfilesystem.cpp Added Paths: ----------- trunk/data/sounds/asap.wav trunk/data/sounds/lockwarning.wav trunk/data/sounds/missilelockwarning.wav trunk/masters/sounds/lockwarning.tar.gz trunk/masters/sounds/missilelockwarning.tar.gz trunk/vegastrike/src/gfx/soundcontainer.cpp trunk/vegastrike/src/gfx/soundcontainer.h trunk/vegastrike/src/gfx/soundcontainer_aldrv.cpp trunk/vegastrike/src/gfx/soundcontainer_aldrv.h trunk/vegastrike/src/gfx/soundcontainer_generic.cpp trunk/vegastrike/src/gfx/soundcontainer_generic.h Modified: trunk/data/cockpits/disabled-cockpit.cpt/disabled-cockpit.cpt =================================================================== --- trunk/data/cockpits/disabled-cockpit.cpt/disabled-cockpit.cpt 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/data/cockpits/disabled-cockpit.cpt/disabled-cockpit.cpt 2012-07-16 03:50:55 UTC (rev 13388) @@ -63,4 +63,11 @@ <VDU TextRows="14" TextCols="100" type="Message" file="mvdu.sprite" /> <VDU TextRows="30" TextCols="30" type="Objectives" file="objvdu.sprite"/> <VDU TextRows="15" TextCols="30" type="Comm" file ="commvdu.sprite" /> + + <!-- Sounds --> + <Event event="JumpAvailable" soundfile="electricity.wav" /> + <Event event="ASAPEngaged" soundfile="asap.wav" /> + <Event event="ASAPDisengaged" soundfile="lockingbak.wav" /> + <Event event="Lock" soundfile="lockwarning.wav" looping="true" /> + <Event event="MissileLock" soundfile="missilelockwarning.wav" looping="true" /> </Cockpit> \ No newline at end of file Added: trunk/data/sounds/asap.wav =================================================================== (Binary files differ) Property changes on: trunk/data/sounds/asap.wav ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/data/sounds/lockwarning.wav =================================================================== (Binary files differ) Property changes on: trunk/data/sounds/lockwarning.wav ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/data/sounds/missilelockwarning.wav =================================================================== (Binary files differ) Property changes on: trunk/data/sounds/missilelockwarning.wav ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/masters/sounds/lockwarning.tar.gz =================================================================== (Binary files differ) Property changes on: trunk/masters/sounds/lockwarning.tar.gz ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/masters/sounds/missilelockwarning.tar.gz =================================================================== (Binary files differ) Property changes on: trunk/masters/sounds/missilelockwarning.tar.gz ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: trunk/vegastrike/CMakeLists.txt =================================================================== --- trunk/vegastrike/CMakeLists.txt 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/CMakeLists.txt 2012-07-16 03:50:55 UTC (rev 13388) @@ -233,6 +233,7 @@ src/gfx/mesh_xml.cpp src/gfx/mesh.cpp src/gfx/quaternion.cpp + src/gfx/soundcontainer_generic.cpp src/gfx/sphere_generic.cpp src/gfx/vec.cpp ) @@ -294,6 +295,8 @@ src/gfx/quadtree.cpp src/gfx/ring.cpp src/gfx/screenshot.cpp + src/gfx/soundcontainer.cpp + src/gfx/soundcontainer_aldrv.cpp src/gfx/sphere.cpp src/gfx/sprite.cpp src/gfx/star.cpp Modified: trunk/vegastrike/Makefile.am =================================================================== --- trunk/vegastrike/Makefile.am 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/Makefile.am 2012-07-16 03:50:55 UTC (rev 13388) @@ -558,6 +558,8 @@ src/gfx/mesh.h \ src/gfx/quaternion.cpp \ src/gfx/quaternion.h \ + src/gfx/soundcontainer_generic.h \ + src/gfx/soundcontainer_generic.cpp \ src/gfx/sphere_generic.cpp \ src/gfx/vec.cpp \ src/gfx/vec.h \ @@ -660,6 +662,10 @@ src/gfx/ring.h \ src/gfx/screenshot.cpp \ src/gfx/screenshot.h \ + src/gfx/soundcontainer.h \ + src/gfx/soundcontainer.cpp \ + src/gfx/soundcontainer_aldrv.h \ + src/gfx/soundcontainer_aldrv.cpp \ src/gfx/sphere.cpp \ src/gfx/sphere.h \ src/gfx/sprite.cpp \ Modified: trunk/vegastrike/src/SharedPool.h =================================================================== --- trunk/vegastrike/src/SharedPool.h 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/SharedPool.h 2012-07-16 03:50:55 UTC (rev 13388) @@ -58,7 +58,8 @@ ++(_it->second); } -public: Reference() : + public: + Reference() : _it( SharedPool::getSingleton().referenceCounter.end() ) , _rc( &SharedPool::getSingleton().referenceCounter ) {} Modified: trunk/vegastrike/src/accountserver.cpp =================================================================== --- trunk/vegastrike/src/accountserver.cpp 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/accountserver.cpp 2012-07-16 03:50:55 UTC (rev 13388) @@ -42,6 +42,7 @@ char SERVER = 2; float simulation_atom_var = (float) 1.0/10.0; +float audio_atom_var = (float) 1.0/18.0; class NetClient {}; NetClient *Network; Modified: trunk/vegastrike/src/cmd/container.h =================================================================== --- trunk/vegastrike/src/cmd/container.h 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/cmd/container.h 2012-07-16 03:50:55 UTC (rev 13388) @@ -41,6 +41,11 @@ ~UnitContainer(); void SetUnit( Unit* ); Unit * GetUnit(); + + const Unit * GetConstUnit() const + { + return unit; + } }; #endif Modified: trunk/vegastrike/src/cmd/images.h =================================================================== --- trunk/vegastrike/src/cmd/images.h 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/cmd/images.h 2012-07-16 03:50:55 UTC (rev 13388) @@ -348,7 +348,7 @@ //target gauges TARGETSHIELDF, TARGETSHIELDB, TARGETSHIELDR, TARGETSHIELDL, KPS, //KEEP KPS HERE - it marks the start of text-based gauges - SETKPS, COCKPIT_FPS, WARPFIELDSTRENGTH, MAXKPS, MAXCOMBATKPS, MAXCOMBATABKPS, MASSEFFECT, + SETKPS, COCKPIT_FPS, WARPFIELDSTRENGTH, MAXWARPFIELDSTRENGTH, MAXKPS, MAXCOMBATKPS, MAXCOMBATABKPS, MASSEFFECT, AUTOPILOT_MODAL, //KEEP first multimodal gauge HERE -- it marks the start of multi-modal gauges SPEC_MODAL, FLIGHTCOMPUTER_MODAL, TURRETCONTROL_MODAL, ECM_MODAL, CLOAK_MODAL, TRAVELMODE_MODAL, RECIEVINGFIRE_MODAL, RECEIVINGMISSILES_MODAL, RECEIVINGMISSILELOCK_MODAL, RECEIVINGTARGETLOCK_MODAL, Modified: trunk/vegastrike/src/cmd/unit_generic.cpp =================================================================== --- trunk/vegastrike/src/cmd/unit_generic.cpp 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/cmd/unit_generic.cpp 2012-07-16 03:50:55 UTC (rev 13388) @@ -166,6 +166,23 @@ maxenergy = maxen; } +Vector Unit::GetWarpRefVelocity() const +{ + //Velocity + Vector VelocityRef( 0, 0, 0 ); + { + const Unit *vr = computer.velocity_ref.GetConstUnit(); + if (vr) + VelocityRef = vr->cumulative_velocity; + } + Vector v = Velocity-VelocityRef; + float len = v.Magnitude(); + if (len > .01) //only get velocity going in DIRECTIOn of cumulative transformation for warp calc... + v = v*( cumulative_transformation_matrix.getR().Dot( v*(1./len) ) ); + + return v; +} + Vector Unit::GetWarpVelocity() const { Vector VelocityRef( 0, 0, 0 ); @@ -2661,25 +2678,50 @@ return minmultiplier; } +float Unit::GetMaxWarpFieldStrength( float rampmult ) const +{ + Vector v = GetWarpRefVelocity(); + + //Pi^2 + static float warpMultiplierMin = + XMLSupport::parse_float( vs_config->getVariable( "physics", "warpMultiplierMin", "9.86960440109" ) ); + //C + static float warpMultiplierMax = + XMLSupport::parse_float( vs_config->getVariable( "physics", "warpMultiplierMax", "300000000" ) ); + //Pi^2 * C + static float warpMaxEfVel = XMLSupport::parse_float( vs_config->getVariable( "physics", "warpMaxEfVel", "2960881320" ) ); + //inverse fractional effect of ship vs real big object + float minmultiplier = warpMultiplierMax*graphicOptions.MaxWarpMultiplier; + Unit *nearest_unit = NULL; + minmultiplier = CalculateNearestWarpUnit( this, minmultiplier, &nearest_unit, true ); + float minWarp = warpMultiplierMin*graphicOptions.MinWarpMultiplier; + float maxWarp = warpMultiplierMax*graphicOptions.MaxWarpMultiplier; + if (minmultiplier < minWarp) + minmultiplier = minWarp; + if (minmultiplier > maxWarp) + minmultiplier = maxWarp; //SOFT LIMIT + minmultiplier *= rampmult; + if (minmultiplier < 1) + minmultiplier = 1; + v *= minmultiplier; + float vmag = sqrt( v.i*v.i+v.j*v.j+v.k*v.k ); + if (vmag > warpMaxEfVel) { + v *= warpMaxEfVel/vmag; //HARD LIMIT + minmultiplier *= warpMaxEfVel/vmag; + } + return minmultiplier; +} + void Unit::AddVelocity( float difficulty ) { - Vector VelocityRef( 0, 0, 0 ); - { - Unit *vr = computer.velocity_ref.GetUnit(); - if (vr) - VelocityRef = vr->cumulative_velocity; - } //for the heck of it. static float humanwarprampuptime = XMLSupport::parse_float( vs_config->getVariable( "physics", "warprampuptime", "5" ) ); //for the heck of it. static float compwarprampuptime = XMLSupport::parse_float( vs_config->getVariable( "physics", "computerwarprampuptime", "10" ) ); static float warprampdowntime = XMLSupport::parse_float( vs_config->getVariable( "physics", "warprampdowntime", "0.5" ) ); - Vector v = Velocity-VelocityRef; - float len = v.Magnitude(); float lastWarpField = graphicOptions.WarpFieldStrength; - if (len > .01) //only get velocity going in DIRECTIOn of cumulative transformation for warp calc... - v = v*( cumulative_transformation_matrix.getR().Dot( v*(1./len) ) ); + bool playa = _Universe->isPlayerStarship( this ) ? true : false; float warprampuptime = playa ? humanwarprampuptime : compwarprampuptime; //Warp Turning on/off @@ -2693,19 +2735,7 @@ graphicOptions.WarpRamping = 0; } if (graphicOptions.InWarp == 1 || graphicOptions.RampCounter != 0) { - //Pi^2 - static float warpMultiplierMin = - XMLSupport::parse_float( vs_config->getVariable( "physics", "warpMultiplierMin", "9.86960440109" ) ); - //C - static float warpMultiplierMax = - XMLSupport::parse_float( vs_config->getVariable( "physics", "warpMultiplierMax", "300000000" ) ); - //Pi^2 * C - static float warpMaxEfVel = XMLSupport::parse_float( vs_config->getVariable( "physics", "warpMaxEfVel", "2960881320" ) ); - //inverse fractional effect of ship vs real big object - float minmultiplier = warpMultiplierMax*graphicOptions.MaxWarpMultiplier; - Unit *nearest_unit = NULL; - minmultiplier = CalculateNearestWarpUnit( this, minmultiplier, &nearest_unit, true ); - float rampmult = 1; + float rampmult = 1.f; if (graphicOptions.RampCounter != 0) { graphicOptions.RampCounter -= SIMULATION_ATOM; if (graphicOptions.RampCounter <= 0) @@ -2715,32 +2745,18 @@ if (graphicOptions.InWarp == 1 && graphicOptions.RampCounter > warprampuptime) graphicOptions.RampCounter = warprampuptime; rampmult = (graphicOptions.InWarp) ? 1.0 - -( (graphicOptions.RampCounter - /warprampuptime) - *(graphicOptions.RampCounter - /warprampuptime) ) : (graphicOptions.RampCounter - /warprampdowntime)*(graphicOptions.RampCounter/warprampdowntime); + -( (graphicOptions.RampCounter + /warprampuptime) + *(graphicOptions.RampCounter + /warprampuptime) ) : (graphicOptions.RampCounter + /warprampdowntime)*(graphicOptions.RampCounter/warprampdowntime); } - float minWarp = warpMultiplierMin*graphicOptions.MinWarpMultiplier; - float maxWarp = warpMultiplierMax*graphicOptions.MaxWarpMultiplier; - if (minmultiplier < minWarp) - minmultiplier = minWarp; - if (minmultiplier > maxWarp) - minmultiplier = maxWarp; //SOFT LIMIT - minmultiplier *= rampmult; - if (minmultiplier < 1) - minmultiplier = 1; - v *= minmultiplier; - float vmag = sqrt( v.i*v.i+v.j*v.j+v.k*v.k ); - if (vmag > warpMaxEfVel) { - v *= warpMaxEfVel/vmag; //HARD LIMIT - minmultiplier *= warpMaxEfVel/vmag; - } - graphicOptions.WarpFieldStrength = minmultiplier; + graphicOptions.WarpFieldStrength = GetMaxWarpFieldStrength(rampmult); } else { graphicOptions.WarpFieldStrength = 1; } //not any more? lastWarpField=1; + Vector v; if (graphicOptions.WarpFieldStrength != 1.0) v = GetWarpVelocity(); else Modified: trunk/vegastrike/src/cmd/unit_generic.h =================================================================== --- trunk/vegastrike/src/cmd/unit_generic.h 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/cmd/unit_generic.h 2012-07-16 03:50:55 UTC (rev 13388) @@ -923,6 +923,7 @@ { return warpenergy; } + float GetMaxWarpFieldStrength( float rampmult = 1.f ) const; void DecreaseWarpEnergy( bool insystem, float time = 1.0f ); void IncreaseWarpEnergy( bool insystem, float time = 1.0f ); bool RefillWarpEnergy(); @@ -1108,6 +1109,7 @@ return cumulative_velocity; } Vector GetWarpVelocity() const; + Vector GetWarpRefVelocity() const; void SetVelocity( const Vector& ); void SetAngularVelocity( const Vector& ); float GetMoment() const Modified: trunk/vegastrike/src/gfx/cockpit.cpp =================================================================== --- trunk/vegastrike/src/gfx/cockpit.cpp 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/gfx/cockpit.cpp 2012-07-16 03:50:55 UTC (rev 13388) @@ -55,6 +55,7 @@ #include <string> #include "cmd/unit_const_cache.h" #include "options.h" +#include "soundcontainer_aldrv.h" extern vs_options game_options; @@ -1141,6 +1142,9 @@ case UnitImages< void >::WARPFIELDSTRENGTH: return target->graphicOptions.WarpFieldStrength; + + case UnitImages< void >::MAXWARPFIELDSTRENGTH: + return target->GetMaxWarpFieldStrength(); case UnitImages< void >::JUMP: return jumpok ? 1 : 0; @@ -1386,6 +1390,167 @@ return; } +GameCockpit::LastState::LastState() +{ + processing_time = 0; + + jumpok = jumpnotok = + specon = specoff = + asapon = asapoff = + asap_dockon = asap_dockoff = + asap_dock_avail = + dock = + dock_avail = + lock = missilelock = + eject = + flightcompon = flightcompoff = false; +} + +void GameCockpit::TriggerEvents( Unit *un ) +{ + double curtime = UniverseUtil::GetGameTime(); + if ((curtime - AUDIO_ATOM) < last.processing_time) + return; + else + last.processing_time = curtime; + + VSFileSystem::vs_dprintf(3, "Processing events\n"); + for (EVENTID event = EVENTID_FIRST; event < NUM_EVENTS; event = (EVENTID)(event+1)) { + GameSoundContainer *sound = static_cast<GameSoundContainer*>(GetSoundForEvent(event)); + if (sound != NULL) { + #define MODAL_TRIGGER(name, _triggervalue, _curvalue, lastvar) \ + do { \ + bool triggervalue = _triggervalue; \ + bool curvalue = _curvalue; \ + VSFileSystem::vs_dprintf(3, "Processing event " name " (cur=%d last=%d)\n", \ + int(curvalue), int(last.lastvar) ); \ + \ + if (curvalue != last.lastvar) { \ + VSFileSystem::vs_dprintf(2, "Triggering event edge " name " (cur=%d last=%d on=%d)\n", \ + int(curvalue), int(last.lastvar), int(triggervalue) ); \ + last.lastvar = curvalue; \ + if (curvalue == triggervalue) \ + sound->play(); \ + else \ + sound->stop(); \ + } \ + } while(0) + + #define MODAL_IMAGE_TRIGGER(image, itrigger, btrigger, lastvar) \ + MODAL_TRIGGER(#image, btrigger, LookupUnitStat(UnitImages< void >::image, un) == UnitImages< void >::itrigger, lastvar) + + #define MODAL_RAWIMAGE_TRIGGER(image, itrigger, btrigger, lastvar) \ + MODAL_TRIGGER(#image, btrigger, LookupUnitStat(UnitImages< void >::image, un) itrigger, lastvar) + + switch(event) { + case WARP_READY: + MODAL_RAWIMAGE_TRIGGER(MAXWARPFIELDSTRENGTH, >= 2, true, warpready); + break; + case WARP_UNREADY: + MODAL_RAWIMAGE_TRIGGER(MAXWARPFIELDSTRENGTH, >= 2, false, warpunready); + break; + case WARP_ENGAGED: + MODAL_IMAGE_TRIGGER(SPEC_MODAL, OFF, false, specon); + break; + case WARP_DISENGAGED: + MODAL_IMAGE_TRIGGER(SPEC_MODAL, OFF, true, specoff); + break; + case FLIGHT_COMPUTER_ENABLED: + MODAL_IMAGE_TRIGGER(FLIGHTCOMPUTER_MODAL, OFF, false, flightcompon); + break; + case FLIGHT_COMPUTER_DISABLED: + MODAL_IMAGE_TRIGGER(FLIGHTCOMPUTER_MODAL, OFF, true, flightcompoff); + break; + case ASAP_ENGAGED: + MODAL_TRIGGER("ASAP_ENGAGED", true, un->autopilotactive, asapon); + break; + case ASAP_DISENGAGED: + MODAL_TRIGGER("ASAP_DISENGAGED", false, un->autopilotactive, asapoff); + break; + case DOCK_AVAILABLE: + MODAL_IMAGE_TRIGGER(CANDOCK_MODAL, READY, true, dock_avail); + break; + case ASAP_DOCKING_AVAILABLE: + MODAL_IMAGE_TRIGGER(CANDOCK_MODAL, AUTOREADY, true, asap_dock_avail); + break; + case ASAP_DOCKING_ENGAGED: + { + UnitImages< void >::GAUGES candock = (UnitImages< void >::GAUGES)LookupUnitStat(UnitImages< void >::CANDOCK_MODAL, un); + MODAL_TRIGGER("ASAP_DOCKING", true, + (un->autopilotactive && ( candock == UnitImages< void >::READY + || candock == UnitImages< void >::AUTOREADY)), + asap_dockon); + } + break; + case ASAP_DOCKING_DISENGAGED: + { + UnitImages< void >::GAUGES candock = (UnitImages< void >::GAUGES)LookupUnitStat(UnitImages< void >::CANDOCK_MODAL, un); + MODAL_TRIGGER("ASAP_DOCKING", false, + (un->autopilotactive && ( candock == UnitImages< void >::READY + || candock == UnitImages< void >::AUTOREADY)), + asap_dockoff); + } + break; + case JUMP_AVAILABLE: + MODAL_TRIGGER("JUMP_AVAILABLE", true, ((jumpok) ? true : false), jumpok); + break; + case JUMP_UNAVAILABLE: + MODAL_TRIGGER("JUMP_UNAVAILABLE", false, ((jumpok) ? true : false), jumpnotok); + break; + case LOCK_WARNING: + MODAL_RAWIMAGE_TRIGGER(LOCK, >= 1, true, lock); + break; + case MISSILELOCK_WARNING: + MODAL_RAWIMAGE_TRIGGER(MISSILELOCK, >= 1, true, missilelock); + break; + case EJECT_WARNING: + MODAL_RAWIMAGE_TRIGGER(EJECT, >= 1, true, eject); + break; + case WARP_LOOP0: + case WARP_LOOP0+1: + case WARP_LOOP0+2: + case WARP_LOOP0+3: + case WARP_LOOP0+4: + case WARP_LOOP0+5: + case WARP_LOOP0+6: + case WARP_LOOP0+7: + case WARP_LOOP0+8: + case WARP_LOOP0+9: + { + float warpfieldstrength = LookupUnitStat(UnitImages< void >::WARPFIELDSTRENGTH, un); + int warpreflevel = event - WARP_LOOP0; + int warplevel = int(log(warpfieldstrength)/log(10)); + MODAL_TRIGGER("WARP_LOOP", warpreflevel, warplevel, warplooplevel); + } + break; + case WARP_SKIP0: + case WARP_SKIP0+1: + case WARP_SKIP0+2: + case WARP_SKIP0+3: + case WARP_SKIP0+4: + case WARP_SKIP0+5: + case WARP_SKIP0+6: + case WARP_SKIP0+7: + case WARP_SKIP0+8: + case WARP_SKIP0+9: + { + float warpfieldstrength = LookupUnitStat(UnitImages< void >::WARPFIELDSTRENGTH, un); + int warpreflevel = event - WARP_SKIP0; + int warplevel = int(log(warpfieldstrength)/log(10)); + MODAL_TRIGGER("WARP_SKIP", warpreflevel, warplevel, warpskiplevel); + } + break; + case JUMP_FAILED: + case DOCK_FAILED: + // TODO + break; + default: + break; + } + } + } +} + void GameCockpit::DrawGauges( Unit *un ) { int i; @@ -2427,6 +2592,18 @@ } //draw unit gauges if ( ( un = parent.GetUnit() ) ) { + switch (view) { + case CP_FRONT: + case CP_LEFT: + case CP_RIGHT: + case CP_BACK: + case CP_VIEWTARGET: + case CP_PANINSIDE: + TriggerEvents( un ); + break; + default: + break; + }; if ( view == CP_FRONT || (view == CP_CHASE && drawChaseVDU) @@ -3374,3 +3551,7 @@ insidePanPitchSpeed = speed; } +SoundContainer* GameCockpit::soundImpl(const SoundContainer &specs) +{ + return new AldrvSoundContainer(specs); +} Modified: trunk/vegastrike/src/gfx/cockpit.h =================================================================== --- trunk/vegastrike/src/gfx/cockpit.h 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/gfx/cockpit.h 2012-07-16 03:50:55 UTC (rev 13388) @@ -111,6 +111,27 @@ //colors of blips/targetting boxes GFXColor friendly, enemy, neutral, targeted, targetting, planet; + // Last observed values for edge-triggered events + struct LastState { + double processing_time; + int warplooplevel; + int warpskiplevel; + + bool jumpok:1, jumpnotok:1; + bool specon:1, specoff:1; + bool asapon:1, asapoff:1; + bool asap_dockon:1, asap_dockoff:1; + bool asap_dock_avail:1; + bool dock:1; + bool dock_avail:1; + bool lock:1, missilelock:1; + bool eject:1; + bool flightcompon:1, flightcompoff:1; + bool warpready:1, warpunready:1; + + LastState(); + } last; + /// Used to display the arrow pointing to the currently selected target. float projection_limit_x, projection_limit_y; float inv_screen_aspect_ratio; //Precomputed division 1 / g_game.aspect. @@ -138,6 +159,8 @@ void DrawTargetGauges( Unit *target ); ///Draws unit gauges void DrawGauges( Unit *un ); + ///Trigger scripted events + void TriggerEvents( Unit *un ); NavigationSystem ThisNav; //Draw the arrow pointing to the target. void DrawArrowToTarget(const Radar::Sensor&, Unit*); @@ -233,6 +256,10 @@ // Ship is jumping void OnJumpBegin(Unit *unit); void OnJumpEnd(Unit *unit); + +protected: + /// Override to use a specific kind of sound implementation + SoundContainer* soundImpl(const SoundContainer &specs); }; #endif Modified: trunk/vegastrike/src/gfx/cockpit_generic.cpp =================================================================== --- trunk/vegastrike/src/gfx/cockpit_generic.cpp 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/gfx/cockpit_generic.cpp 2012-07-16 03:50:55 UTC (rev 13388) @@ -955,4 +955,24 @@ std::replace(name.begin(), name.end(), ' ', '_'); return name; -} \ No newline at end of file +} + +SoundContainer* Cockpit::GetSoundForEvent(Cockpit::EVENTID eventId) const +{ + if (eventId < sounds.size()) + return sounds[eventId]; + else + return NULL; +} + +void Cockpit::SetSoundForEvent(Cockpit::EVENTID eventId, const SoundContainer &soundSpecs) +{ + while (eventId >= sounds.size()) + sounds.push_back(NULL); + sounds[eventId] = soundImpl(soundSpecs); +} + +SoundContainer* Cockpit::soundImpl(const SoundContainer &specs) +{ + return new SoundContainer(specs); +} Modified: trunk/vegastrike/src/gfx/cockpit_generic.h =================================================================== --- trunk/vegastrike/src/gfx/cockpit_generic.h 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/gfx/cockpit_generic.h 2012-07-16 03:50:55 UTC (rev 13388) @@ -26,6 +26,7 @@ } #include "in.h" #include "cmd/images.h" +#include "soundcontainer_generic.h" /** * The Cockpit Contains all displayable information about a particular Unit * * Gauges are used to indicate analog controls, and some diagital ones @@ -33,6 +34,87 @@ */ class Cockpit { +public: + ///cockpit events + enum EVENTID { + EVENTID_FIRST, + + /// Warp is possible at this time + WARP_READY = EVENTID_FIRST, + + /// Warp ceased to be possible at this time + WARP_UNREADY, + + /// Warp started + WARP_ENGAGED, + + /// Warp stopped + WARP_DISENGAGED, + + /// Asap autopilot engaged + ASAP_ENGAGED, + + /// Asap autopilot disengaged + ASAP_DISENGAGED, + + /// Asap docking available + ASAP_DOCKING_AVAILABLE, + + /// Asap docking engaged + ASAP_DOCKING_ENGAGED, + + /// Asap docking disengaged + ASAP_DOCKING_DISENGAGED, + + /// Docking ready + DOCK_AVAILABLE, + + /// Docking no longer ready + DOCK_UNAVAILABLE, + + /// Docking triggered yet not ready + DOCK_FAILED, + + /// Jump ready + JUMP_AVAILABLE, + + /// Jump no longer ready + JUMP_UNAVAILABLE, + + /// Jump triggered yet not ready + JUMP_FAILED, + + /// Weapons lock warning active + LOCK_WARNING, + + /// Missile lock warning acgive + MISSILELOCK_WARNING, + + /// Eject light + EJECT_WARNING, + + /// Governor enabled + FLIGHT_COMPUTER_ENABLED, + + /// Governor disabled + FLIGHT_COMPUTER_DISABLED, + + /// Warp loop, warp speed 0 (+1 = warp 1, +2 = warp 2, etc...) + WARP_LOOP0, + WARP_LOOP9 = WARP_LOOP0 + 9, + /// Last warp level + WRAP_LOOPLAST = WARP_LOOP9, + + /// Warp threshold, warp speed 0 (+1 = warp 1, +2 = warp 2, etc...) + WARP_SKIP0, + WARP_SKIP9 = WARP_SKIP0 + 9, + /// Last warp level + WRAP_SKIPLAST = WARP_SKIP9, + + /// Just after all valid values + NUM_EVENTS + }; + protected: ///style of current view (chase cam, inside) enum VIEWSTYLE view; @@ -112,6 +194,7 @@ std::vector< std::string > unitfilename; std::vector< std::string > unitsystemname; std::vector< std::string > unitbasename; + std::vector< SoundContainer* > sounds; public: double secondsWithZeroEnergy; @@ -252,6 +335,19 @@ static void TurretControl( const KBData&, KBSTATE ) {} virtual void SetCommAnimation( Animation *ani, Unit *un ) {} virtual void SetStaticAnimation() {} + + /** + * Retrieves the sound associated to the given event. + * Returns NULL if no sound has been associated + */ + SoundContainer* GetSoundForEvent(EVENTID eventId) const; + + /** + * Sets the sound associated to the given event to match the given specs + * (the actual container will be a different, implementation-specific one) + */ + void SetSoundForEvent(EVENTID eventId, const SoundContainer &soundSpecs); + class SaveGame*savegame; ///Accesses the current navigationsystem @@ -304,6 +400,10 @@ virtual void OnDockEnd(Unit *, Unit *) {} virtual void OnJumpBegin(Unit *) {} virtual void OnJumpEnd(Unit *) {} + +protected: + /// Override to use a specific kind of sound implementation + virtual SoundContainer* soundImpl(const SoundContainer &specs); }; #endif Modified: trunk/vegastrike/src/gfx/cockpit_xml.cpp =================================================================== --- trunk/vegastrike/src/gfx/cockpit_xml.cpp 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/gfx/cockpit_xml.cpp 2012-07-16 03:50:55 UTC (rev 13388) @@ -78,7 +78,9 @@ G_LEFT, G_RIGHT, G_TIME, - ALPH + ALPH, + EVENT, + LOOPING }; const EnumMap::Pair element_names[] = { @@ -91,6 +93,7 @@ EnumMap::Pair( "RightVDU", RVDU ), EnumMap::Pair( "Panel", PANEL ), EnumMap::Pair( "Crosshairs", CROSSHAIRS ), + EnumMap::Pair( "Event", EVENT ), EnumMap::Pair( "ArmorF", UnitImages< void >::ARMORF ), EnumMap::Pair( "ArmorR", UnitImages< void >::ARMORR ), EnumMap::Pair( "ArmorL", UnitImages< void >::ARMORL ), @@ -180,7 +183,56 @@ EnumMap::Pair( "g", GREEN ), EnumMap::Pair( "b", BLUE ), EnumMap::Pair( "type", VDUTYPE ), - EnumMap::Pair( "a", ALPH ) + EnumMap::Pair( "a", ALPH ), + EnumMap::Pair( "event", EVENT ), + EnumMap::Pair( "looping", LOOPING ), + + + // Cockpit events + EnumMap::Pair( "WarpReady", Cockpit::WARP_READY ), + EnumMap::Pair( "WarpUnready", Cockpit::WARP_UNREADY ), + EnumMap::Pair( "WarpEngaged", Cockpit::WARP_ENGAGED ), + EnumMap::Pair( "WarpDisengaged",Cockpit::WARP_DISENGAGED ), + EnumMap::Pair( "WarpLoop0", Cockpit::WARP_LOOP0 ), + EnumMap::Pair( "WarpLoop1", Cockpit::WARP_LOOP0+1 ), + EnumMap::Pair( "WarpLoop2", Cockpit::WARP_LOOP0+2 ), + EnumMap::Pair( "WarpLoop3", Cockpit::WARP_LOOP0+3 ), + EnumMap::Pair( "WarpLoop4", Cockpit::WARP_LOOP0+4 ), + EnumMap::Pair( "WarpLoop5", Cockpit::WARP_LOOP0+5 ), + EnumMap::Pair( "WarpLoop6", Cockpit::WARP_LOOP0+6 ), + EnumMap::Pair( "WarpLoop7", Cockpit::WARP_LOOP0+7 ), + EnumMap::Pair( "WarpLoop8", Cockpit::WARP_LOOP0+8 ), + EnumMap::Pair( "WarpLoop9", Cockpit::WARP_LOOP0+9 ), + EnumMap::Pair( "WarpSkip0", Cockpit::WARP_LOOP0 ), + EnumMap::Pair( "WarpSkip1", Cockpit::WARP_LOOP0+1 ), + EnumMap::Pair( "WarpSkip2", Cockpit::WARP_LOOP0+2 ), + EnumMap::Pair( "WarpSkip3", Cockpit::WARP_LOOP0+3 ), + EnumMap::Pair( "WarpSkip4", Cockpit::WARP_LOOP0+4 ), + EnumMap::Pair( "WarpSkip5", Cockpit::WARP_LOOP0+5 ), + EnumMap::Pair( "WarpSkip6", Cockpit::WARP_LOOP0+6 ), + EnumMap::Pair( "WarpSkip7", Cockpit::WARP_LOOP0+7 ), + EnumMap::Pair( "WarpSkip8", Cockpit::WARP_LOOP0+8 ), + EnumMap::Pair( "WarpSkip9", Cockpit::WARP_LOOP0+9 ), + + EnumMap::Pair( "ASAPEngaged", Cockpit::ASAP_ENGAGED ), + EnumMap::Pair( "ASAPDisengaged",Cockpit::ASAP_DISENGAGED ), + EnumMap::Pair( "ASAPDockingAvailable", Cockpit::ASAP_DOCKING_AVAILABLE ), + EnumMap::Pair( "ASAPDockingEngaged", Cockpit::ASAP_DOCKING_ENGAGED ), + EnumMap::Pair( "ASAPDockingDisengaged", Cockpit::ASAP_DOCKING_DISENGAGED ), + EnumMap::Pair( "FlightComputerEnabled", Cockpit::FLIGHT_COMPUTER_ENABLED ), + EnumMap::Pair( "FlightComputerDisabled", Cockpit::FLIGHT_COMPUTER_DISABLED ), + + EnumMap::Pair( "DockAvailable", Cockpit::DOCK_AVAILABLE ), + EnumMap::Pair( "DockUnavailable", Cockpit::DOCK_UNAVAILABLE ), + EnumMap::Pair( "DockFailed", Cockpit::DOCK_FAILED ), + EnumMap::Pair( "JumpAvailable", Cockpit::JUMP_AVAILABLE ), + EnumMap::Pair( "JumpUnavailable", Cockpit::JUMP_UNAVAILABLE ), + EnumMap::Pair( "JumpFailed", Cockpit::JUMP_FAILED ), + + EnumMap::Pair( "Lock", Cockpit::LOCK_WARNING ), + EnumMap::Pair( "MissileLock", Cockpit::MISSILELOCK_WARNING ), + EnumMap::Pair( "Eject", Cockpit::EJECT_WARNING ), + }; const EnumMap element_map( element_names, sizeof (element_names)/sizeof (element_names[0]) ); @@ -571,6 +623,34 @@ Panel.erase( Panel.end()-1 ); //don't want null panels } break; + case EVENT: + { + std::string soundfile; + bool looping = false; + EVENTID event = Cockpit::NUM_EVENTS; + + for (iter = attributes.begin(); iter != attributes.end(); iter++) { + switch ( attribute_map.lookup( (*iter).name ) ) + { + case SOUNDFILE: + soundfile = (*iter).value; + break; + case LOOPING: + looping = XMLSupport::parse_bool( (*iter).value ); + break; + case EVENT: + event = (Cockpit::EVENTID) attribute_map.lookup( (*iter).value ); + break; + default: + break; + } + } + + if (!soundfile.empty() && (event > 0) && (event < Cockpit::NUM_EVENTS)) { + SetSoundForEvent(event, SoundContainer(soundfile, looping)); + } + } + break; default: break; } Added: trunk/vegastrike/src/gfx/soundcontainer.cpp =================================================================== --- trunk/vegastrike/src/gfx/soundcontainer.cpp (rev 0) +++ trunk/vegastrike/src/gfx/soundcontainer.cpp 2012-07-16 03:50:55 UTC (rev 13388) @@ -0,0 +1,60 @@ +#include "config.h" + +#include <string> + +#include "soundcontainer.h" + +GameSoundContainer::GameSoundContainer( const SoundContainer &other ) + : SoundContainer( other ) + , triggered( false ) + , loaded( false ) +{ +} + +GameSoundContainer::~GameSoundContainer() +{ + unload(); +} + +void GameSoundContainer::load() +{ + if (!loaded) { + loadImpl(); + loaded = true; + } +} + +void GameSoundContainer::unload() +{ + if (loaded) { + unloadImpl(); + loaded = false; + } +} + +void GameSoundContainer::play() +{ + if (!loaded) + load(); + + if (!isLooping() || !isPlaying()) { + playImpl(); + triggered = true; + } +} + +void GameSoundContainer::stop() +{ + if (loaded && triggered) { + stopImpl(); + triggered = false; + } +} + +bool GameSoundContainer::isPlaying() const +{ + if (!loaded || !triggered) + return false; + else + return isPlayingImpl(); +} Added: trunk/vegastrike/src/gfx/soundcontainer.h =================================================================== --- trunk/vegastrike/src/gfx/soundcontainer.h (rev 0) +++ trunk/vegastrike/src/gfx/soundcontainer.h 2012-07-16 03:50:55 UTC (rev 13388) @@ -0,0 +1,89 @@ +#ifndef _SOUNDCONTAINER_H_ +#define _SOUNDCONTAINER_H_ + +#include <string> + +#include "soundcontainer_generic.h" + +/** + * A reference to a soundfile that can be lazily loaded. + * + * This abstract base class specifies the common interface + * for all implementations of sound containers, see + * concrete implementations for more details. + */ +class GameSoundContainer : public SoundContainer +{ + bool triggered; + bool loaded; + +public: + /** + * Create a refernece to an optionally-looping sound file. + */ + GameSoundContainer( const SoundContainer &other ); + + virtual ~GameSoundContainer(); + + /** + * Forced loading of the resource. It's not necessary to call it, + * but useful if you know you'll need it later and want to avoid + * the latency of loading it on-demand. + */ + void load(); + + /** + * Forced unloading of the resource. It's not necessary to call it, + * but useful if you know you won't be needing the resource for a while. + */ + void unload(); + + /** + * Start playing. For a looping source, it starts the loop if not already + * playing. For a non-looping source, it will start playing from time 0 + * even if it's already playing. + */ + void play(); + + /** + * Stop playing. + */ + void stop(); + + /** + * Return whether or not the sound is really playing now. + */ + bool isPlaying() const; + + /** + * Return whether or not the sound was triggered with play(). + * Will return true after play(), false after stop() and right + * after creation. + */ + bool isTriggered() const + { + return triggered; + } + + // Concrete classes implement the following: +protected: + virtual void loadImpl() = 0; + virtual void unloadImpl() = 0; + + /** + * Start playing. Needs not account for loopgin vs non-looping, + * just start playing the sound. + */ + virtual void playImpl() = 0; + + virtual void stopImpl() = 0; + + /** + * Return whether or not the sound is really playing now. + */ + virtual bool isPlayingImpl() const = 0; + +}; + +#endif + Added: trunk/vegastrike/src/gfx/soundcontainer_aldrv.cpp =================================================================== --- trunk/vegastrike/src/gfx/soundcontainer_aldrv.cpp (rev 0) +++ trunk/vegastrike/src/gfx/soundcontainer_aldrv.cpp 2012-07-16 03:50:55 UTC (rev 13388) @@ -0,0 +1,45 @@ +#include "config.h" + +#include "soundcontainer_aldrv.h" +#include "audiolib.h" + +AldrvSoundContainer::AldrvSoundContainer( const SoundContainer &other ) + : GameSoundContainer(other) + , sound(-2) +{ +} + +AldrvSoundContainer::~AldrvSoundContainer() +{ + // unload already takes care +} + +void AldrvSoundContainer::loadImpl() +{ + sound = AUDCreateSoundWAV( getSoundFile(), isLooping() ); +} + +void AldrvSoundContainer::unloadImpl() +{ + if (sound >= 0) { + stopImpl(); + AUDDeleteSound( sound, false ); + sound = -2; + } +} + +void AldrvSoundContainer::playImpl() +{ + AUDStartPlaying(sound); +} + +void AldrvSoundContainer::stopImpl() +{ + AUDStopPlaying(sound); +} + +bool AldrvSoundContainer::isPlayingImpl() const +{ + return AUDIsPlaying(sound); +} + Added: trunk/vegastrike/src/gfx/soundcontainer_aldrv.h =================================================================== --- trunk/vegastrike/src/gfx/soundcontainer_aldrv.h (rev 0) +++ trunk/vegastrike/src/gfx/soundcontainer_aldrv.h 2012-07-16 03:50:55 UTC (rev 13388) @@ -0,0 +1,35 @@ +#ifndef _SOUNDCONTAINER_ALDRV_H_ +#define _SOUNDCONTAINER_ALDRV_H_ + +#include <string> + +#include "soundcontainer.h" + +/** + * A reference to a soundfile that can be lazily loaded. + * + * This class implements the operations on sounds using aldrv + */ +class AldrvSoundContainer : public GameSoundContainer +{ +private: + int sound; + +public: + /** + * Create a refernece to an optionally-looping sound file. + */ + AldrvSoundContainer( const SoundContainer &other ); + + virtual ~AldrvSoundContainer(); + +protected: + virtual void loadImpl(); + virtual void unloadImpl(); + virtual void playImpl(); + virtual void stopImpl(); + virtual bool isPlayingImpl() const; +}; + +#endif + Added: trunk/vegastrike/src/gfx/soundcontainer_generic.cpp =================================================================== --- trunk/vegastrike/src/gfx/soundcontainer_generic.cpp (rev 0) +++ trunk/vegastrike/src/gfx/soundcontainer_generic.cpp 2012-07-16 03:50:55 UTC (rev 13388) @@ -0,0 +1,32 @@ +#include "config.h" + +#include <string> + +#include "soundcontainer_generic.h" + +#include "SharedPool.h" + +void SoundContainer::init( const StringPool::Reference &_soundfile, bool _looping ) +{ + this->soundFile = _soundfile; + this->looping = _looping; +} + +SoundContainer::SoundContainer( const SoundContainer &other ) +{ + init(other.soundFile, other.looping); +} + +SoundContainer::SoundContainer( const std::string &_soundfile, bool _looping ) +{ + init(stringPool.get(_soundfile), _looping); +} + +SoundContainer::SoundContainer( const StringPool::Reference &_soundfile, bool _looping ) +{ + init(_soundfile, _looping); +} + +SoundContainer::~SoundContainer() +{ +} Added: trunk/vegastrike/src/gfx/soundcontainer_generic.h =================================================================== --- trunk/vegastrike/src/gfx/soundcontainer_generic.h (rev 0) +++ trunk/vegastrike/src/gfx/soundcontainer_generic.h 2012-07-16 03:50:55 UTC (rev 13388) @@ -0,0 +1,45 @@ +#ifndef _SOUNDCONTAINER_GENERIC_H_ +#define _SOUNDCONTAINER_GENERIC_H_ + +#include <string> + +#include "SharedPool.h" + +/** + * A reference to a soundfile that can be lazily loaded. + * + * This base class implement no actions on it, see concrete subclasses for that, + * but it does contain all common data points. + */ +class SoundContainer +{ +private: + StringPool::Reference soundFile; + bool looping; + +protected: + void init( const StringPool::Reference &soundfile, bool looping ); + +public: + /** + * Create a refernece to an optionally-looping sound file. + */ + SoundContainer( const SoundContainer &other ); + explicit SoundContainer( const std::string &soundfile, bool looping = false ); + explicit SoundContainer( const StringPool::Reference &soundfile, bool looping = false ); + + const std::string& getSoundFile() const + { + return soundFile.get(); + } + + const bool isLooping() const + { + return looping; + } + + virtual ~SoundContainer(); +}; + +#endif + Modified: trunk/vegastrike/src/gfx/vid_file.cpp =================================================================== --- trunk/vegastrike/src/gfx/vid_file.cpp 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/gfx/vid_file.cpp 2012-07-16 03:50:55 UTC (rev 13388) @@ -213,7 +213,7 @@ //Open file std::string npath = std::string( "vsfile:" )+path; std::string errbase = std::string( "Cannot open URL \"" )+npath+"\""; - if ( ( 0 != av_open_input_file( &pFormatCtx, npath.c_str(), NULL, BUFFER_SIZE, NULL ) ) + if ( ( 0 != avformat_open_input( &pFormatCtx, npath.c_str(), NULL, NULL ) ) || ( 0 > av_find_stream_info( pFormatCtx ) ) ) throw VidFile::FileOpenException( errbase+" (wrong format or)" ); //Dump format info in case we want to know... #ifdef VS_DEBUG Modified: trunk/vegastrike/src/vegastrike.h =================================================================== --- trunk/vegastrike/src/vegastrike.h 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/vegastrike.h 2012-07-16 03:50:55 UTC (rev 13388) @@ -25,13 +25,10 @@ #ifndef _VEGASTRIKE_H_ #define _VEGASTRIKE_H_ -#if 0 -static const float SIMULATION_ATOM = (float) (1.0/10.0); -extern float simulation_atom_var; //not used, just dummy to compile -#else extern float simulation_atom_var; +extern float audio_atom_var; #define SIMULATION_ATOM (simulation_atom_var) -#endif +#define AUDIO_ATOM (audio_atom_var) #include "vs_math.h" Modified: trunk/vegastrike/src/vs_globals.cpp =================================================================== --- trunk/vegastrike/src/vs_globals.cpp 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/vs_globals.cpp 2012-07-16 03:50:55 UTC (rev 13388) @@ -15,6 +15,7 @@ FILE *fpread = NULL; float simulation_atom_var = (float) (1.0/10.0); +float audio_atom_var = (float) (1.0/18.0); Mission *mission = NULL; double benchmark = -1.0; Modified: trunk/vegastrike/src/vsfilesystem.cpp =================================================================== --- trunk/vegastrike/src/vsfilesystem.cpp 2012-07-11 08:18:51 UTC (rev 13387) +++ trunk/vegastrike/src/vsfilesystem.cpp 2012-07-16 03:50:55 UTC (rev 13388) @@ -877,7 +877,8 @@ Directories[PythonFile] = "bases"; Directories[AccountFile] = "accounts"; - simulation_atom_var = atof( vs_config->getVariable( "general", "simulation_atom", "0.1" ).c_str() ); + SIMULATION_ATOM = atof( vs_config->getVariable( "general", "simulation_atom", "0.1" ).c_str() ); + AUDIO_ATOM = atof( vs_config->getVariable( "general", "audio_atom", "0.05555555556" ).c_str() ); cout<<"SIMULATION_ATOM: "<<SIMULATION_ATOM<<endl; /************************* Home directory subdirectories creation ************************/ |