Skip to content

Commit

Permalink
PEGASUS: Stub off spot sound code
Browse files Browse the repository at this point in the history
  • Loading branch information
Matthew Hoops committed Sep 5, 2011
1 parent 7070d88 commit fe99e95
Show file tree
Hide file tree
Showing 5 changed files with 466 additions and 16 deletions.
246 changes: 246 additions & 0 deletions engines/pegasus/constants.h
Expand Up @@ -221,6 +221,252 @@ const TimeValue kPlasmaImpactTime = kTwoSeconds;

const TimeValue kNoradAirMaskTimeLimit = kOneMinute + kFifteenSeconds;

enum {
kButtonDownBit = 0,
kAutoButtonBit = 1,
kBitsPerButton = 2,

kButtonDownMask = 1 << kButtonDownBit,
kAutoButtonMask = 1 << kAutoButtonBit,

kButtonStateBits = kButtonDownMask | kAutoButtonMask,

kRawButtonUp = 0,
kRawButtonDown = kButtonDownMask | kAutoButtonMask,

kButtonUp = 0,
kButtonDown = kButtonDownMask,
kButtonAutoUp = kAutoButtonMask,
kButtonAutoDown = kButtonDownMask | kAutoButtonMask
};

enum {
kUpButtonNum = 0,
kLeftButtonNum = 1,
kDownButtonNum = 2,
kRightButtonNum = 3,
kLeftFireButtonNum = 4,
kRightFireButtonNum = 5,
kOneButtonNum = 6,
kTwoButtonNum = 7,
kThreeButtonNum = 8,
kFourButtonNum = 9,
kMod1ButtonNum = 10,
kMod2ButtonNum = 11,
kMod3ButtonNum = 12
};

enum {
kUpButtonShift = kUpButtonNum * kBitsPerButton,
kLeftButtonShift = kLeftButtonNum * kBitsPerButton,
kDownButtonShift = kDownButtonNum * kBitsPerButton,
kRightButtonShift = kRightButtonNum * kBitsPerButton,
kLeftFireButtonShift = kLeftFireButtonNum * kBitsPerButton,
kRightFireButtonShift = kRightFireButtonNum * kBitsPerButton,
kOneButtonShift = kOneButtonNum * kBitsPerButton,
kTwoButtonShift = kTwoButtonNum * kBitsPerButton,
kThreeButtonShift = kThreeButtonNum * kBitsPerButton,
kFourButtonShift = kFourButtonNum * kBitsPerButton,
kMod1ButtonShift = kMod1ButtonNum * kBitsPerButton,
kMod2ButtonShift = kMod2ButtonNum * kBitsPerButton,
kMod3ButtonShift = kMod3ButtonNum * kBitsPerButton
};

enum {
kAllUpBits = (kButtonUp << kUpButtonShift) |
(kButtonUp << kLeftButtonShift) |
(kButtonUp << kDownButtonShift) |
(kButtonUp << kRightButtonShift) |
(kButtonUp << kLeftFireButtonShift) |
(kButtonUp << kRightFireButtonShift) |
(kButtonUp << kOneButtonShift) |
(kButtonUp << kTwoButtonShift) |
(kButtonUp << kThreeButtonShift) |
(kButtonUp << kFourButtonShift) |
(kButtonUp << kMod1ButtonShift) |
(kButtonUp << kMod2ButtonShift) |
(kButtonUp << kMod3ButtonShift),
kDirectionBits = (kButtonDownMask << kUpButtonShift) |
(kButtonDownMask << kLeftButtonShift) |
(kButtonDownMask << kDownButtonShift) |
(kButtonDownMask << kRightButtonShift),
kButtonBits = (kButtonDownMask << kLeftFireButtonShift) |
(kButtonDownMask << kRightFireButtonShift) |
(kButtonDownMask << kOneButtonShift) |
(kButtonDownMask << kTwoButtonShift) |
(kButtonDownMask << kThreeButtonShift) |
(kButtonDownMask << kFourButtonShift) |
(kButtonDownMask << kMod1ButtonShift) |
(kButtonDownMask << kMod2ButtonShift) |
(kButtonDownMask << kMod3ButtonShift),
kAllButtonDownBits = kDirectionBits | kButtonBits,
kAllAutoBits = (kAutoButtonMask << kUpButtonShift) |
(kAutoButtonMask << kLeftButtonShift) |
(kAutoButtonMask << kDownButtonShift) |
(kAutoButtonMask << kRightButtonShift) |
(kAutoButtonMask << kLeftFireButtonShift) |
(kAutoButtonMask << kRightFireButtonShift) |
(kAutoButtonMask << kOneButtonShift) |
(kAutoButtonMask << kTwoButtonShift) |
(kAutoButtonMask << kThreeButtonShift) |
(kAutoButtonMask << kFourButtonShift) |
(kAutoButtonMask << kMod1ButtonShift) |
(kAutoButtonMask << kMod2ButtonShift) |
(kAutoButtonMask << kMod3ButtonShift),

kFilterUpButton = kButtonDownMask << kUpButtonShift,
kFilterUpAuto = kAutoButtonMask << kUpButtonShift,
kFilterUpButtonAny = kFilterUpButton | kFilterUpAuto,
kFilterLeftButton = kButtonDownMask << kLeftButtonShift,
kFilterLeftAuto = kAutoButtonMask << kLeftButtonShift,
kFilterLeftButtonAny = kFilterLeftButton | kFilterLeftAuto,
kFilterDownButton = kButtonDownMask << kDownButtonShift,
kFilterDownAuto = kAutoButtonMask << kDownButtonShift,
kFilterDownButtonAny = kFilterDownButton | kFilterDownAuto,
kFilterRightButton = kButtonDownMask << kRightButtonShift,
kFilterRightAuto = kAutoButtonMask << kRightButtonShift,
kFilterRightButtonAny = kFilterRightButton | kFilterRightAuto,
kFilterLeftFireButton = kButtonDownMask << kLeftFireButtonShift,
kFilterLeftFireAuto = kAutoButtonMask << kLeftFireButtonShift,
kFilterLeftFireButtonAny = kFilterLeftFireButton | kFilterLeftFireAuto,
kFilterRightFireButton = kButtonDownMask << kRightFireButtonShift,
kFilterRightFireAuto = kAutoButtonMask << kRightFireButtonShift,
kFilterRightFireButtonAny = kFilterRightFireButton | kFilterRightFireAuto,
kFilterOneButton = kButtonDownMask << kOneButtonShift,
kFilterOneAuto = kAutoButtonMask << kOneButtonShift,
kFilterOneButtonAny = kFilterOneButton | kFilterOneAuto,
kFilterTwoButton = kButtonDownMask << kTwoButtonShift,
kFilterTwoAuto = kAutoButtonMask << kTwoButtonShift,
kFilterTwoButtonAny = kFilterTwoButton | kFilterTwoAuto,
kFilterThreeButton = kButtonDownMask << kThreeButtonShift,
kFilterThreeAuto = kAutoButtonMask << kThreeButtonShift,
kFilterThreeButtonAny = kFilterThreeButton | kFilterThreeAuto,
kFilterFourButton = kButtonDownMask << kFourButtonShift,
kFilterFourAuto = kAutoButtonMask << kFourButtonShift,
kFilterFourButtonAny = kFilterFourButton | kFilterFourAuto,
kFilterMod1Button = kButtonDownMask << kMod1ButtonShift,
kFilterMod1Auto = kAutoButtonMask << kMod1ButtonShift,
kFilterMod1ButtonAny = kFilterMod1Button | kFilterMod1Auto,
kFilterMod2Button = kButtonDownMask << kMod2ButtonShift,
kFilterMod2Auto = kAutoButtonMask << kMod2ButtonShift,
kFilterMod2ButtonAny = kFilterMod2Button | kFilterMod2Auto,
kFilterMod3Button = kButtonDownMask << kMod3ButtonShift,
kFilterMod3Auto = kAutoButtonMask << kMod3ButtonShift,
kFilterMod3ButtonAny = kFilterMod3Button | kFilterMod3Auto,

kFilterNoInput = 0,
kFilterAllInput = kFilterUpButton |
kFilterUpAuto |
kFilterLeftButton |
kFilterLeftAuto |
kFilterDownButton |
kFilterDownAuto |
kFilterRightButton |
kFilterRightAuto |
kFilterLeftFireButton |
kFilterLeftFireAuto |
kFilterRightFireButton |
kFilterRightFireAuto |
kFilterOneButton |
kFilterOneAuto |
kFilterTwoButton |
kFilterTwoAuto |
kFilterThreeButton |
kFilterThreeAuto |
kFilterFourButton |
kFilterFourAuto |
kFilterMod1Button |
kFilterMod1Auto |
kFilterMod2Button |
kFilterMod2Auto |
kFilterMod3Button |
kFilterMod3Auto,

kFilterAllDirections = kFilterUpButton |
kFilterUpAuto |
kFilterLeftButton |
kFilterLeftAuto |
kFilterDownButton |
kFilterDownAuto |
kFilterRightButton |
kFilterRightAuto,

kFilterButtons = kFilterOneButton |
kFilterOneAuto |
kFilterTwoButton |
kFilterTwoAuto |
kFilterThreeButton |
kFilterThreeAuto |
kFilterFourButton |
kFilterFourAuto,

kFilterFireButtons = kFilterLeftFireButton |
kFilterLeftFireAuto |
kFilterRightFireButton |
kFilterRightFireAuto,

kFilterAllButtons = kFilterLeftFireButton |
kFilterLeftFireAuto |
kFilterRightFireButton |
kFilterRightFireAuto |
kFilterOneButton |
kFilterOneAuto |
kFilterTwoButton |
kFilterTwoAuto |
kFilterThreeButton |
kFilterThreeAuto |
kFilterFourButton |
kFilterFourAuto |
kFilterMod1Button |
kFilterMod1Auto |
kFilterMod2Button |
kFilterMod2Auto |
kFilterMod3Button |
kFilterMod3Auto,

kFilterAllInputNoAuto = kFilterUpButton |
kFilterLeftButton |
kFilterDownButton |
kFilterRightButton |
kFilterLeftFireButton |
kFilterRightFireButton |
kFilterOneButton |
kFilterTwoButton |
kFilterThreeButton |
kFilterFourButton |
kFilterMod1Button |
kFilterMod2Button |
kFilterMod3Button
};

const tNotificationID kNeighborhoodNotificationID = 1;
const tNotificationID kLastNeighborhoodNotificationID = kNeighborhoodNotificationID;

const tNotificationFlags kNeighborhoodMovieCompletedFlag = 1;
const tNotificationFlags kMoveForwardCompletedFlag = kNeighborhoodMovieCompletedFlag << 1;
const tNotificationFlags kStrideCompletedFlag = kMoveForwardCompletedFlag << 1;
const tNotificationFlags kTurnCompletedFlag = kStrideCompletedFlag << 1;
const tNotificationFlags kSpotCompletedFlag = kTurnCompletedFlag << 1;
const tNotificationFlags kDoorOpenCompletedFlag = kSpotCompletedFlag << 1;
const tNotificationFlags kExtraCompletedFlag = kDoorOpenCompletedFlag << 1;
const tNotificationFlags kSpotSoundCompletedFlag = kExtraCompletedFlag << 1;
const tNotificationFlags kDelayCompletedFlag = kSpotSoundCompletedFlag << 1;
const tNotificationFlags kActionRequestCompletedFlag = kDelayCompletedFlag << 1;
const tNotificationFlags kDeathExtraCompletedFlag = kActionRequestCompletedFlag << 1;
const tNotificationFlags kLastNeighborhoodNotificationFlag = kDeathExtraCompletedFlag;

const tNotificationFlags kNeighborhoodFlags = kNeighborhoodMovieCompletedFlag |
kMoveForwardCompletedFlag |
kStrideCompletedFlag |
kTurnCompletedFlag |
kSpotCompletedFlag |
kDoorOpenCompletedFlag |
kExtraCompletedFlag |
kSpotSoundCompletedFlag |
kDelayCompletedFlag |
kActionRequestCompletedFlag |
kDeathExtraCompletedFlag;

} // End of namespace Pegasus

#endif
125 changes: 124 additions & 1 deletion engines/pegasus/neighborhood/neighborhood.cpp
Expand Up @@ -32,9 +32,10 @@

namespace Pegasus {

Neighborhood::Neighborhood(PegasusEngine *vm, const Common::String &resName, tNeighborhoodID id) : _vm(vm), _resName(resName) {
Neighborhood::Neighborhood(PegasusEngine *vm, const Common::String &resName, tNeighborhoodID id) : MMIDObject(id), _vm(vm), _resName(resName) {
GameState.setOpenDoorLocation(kNoRoomID, kNoDirection);
_currentAlternate = 0;
_interruptionFilter = kFilterAllInput;
}

Neighborhood::~Neighborhood() {
Expand Down Expand Up @@ -96,6 +97,7 @@ void Neighborhood::init() {
delete stream;

createNeighborhoodSpots();
loadSoundSpots();

// TODO: AI, movies, notifications, buncha other stuff
}
Expand Down Expand Up @@ -268,4 +270,125 @@ void Neighborhood::createNeighborhoodSpots() {
delete hotspotList;
}

void Neighborhood::loadSoundSpots() {
// TODO: Eventually push to the subclasses

Common::String fileName = "Sounds/";

switch (getObjectID()) {
case kCaldoriaID:
fileName += "Caldoria/Caldoria Spots";
break;
case kFullTSAID:
case kFinalTSAID:
case kTinyTSAID:
fileName += "TSA/TSA Spots";
break;
case kPrehistoricID:
fileName += "Prehistoric/Prehistoric Spots";
break;
case kMarsID:
fileName += "Mars/Mars Spots";
break;
case kWSCID:
fileName += "World Science Center/WSC Spots";
break;
case kNoradAlphaID:
fileName += "Norad/Norad Alpha Spots";
break;
case kNoradDeltaID:
fileName += "Norad/Norad Delta Spots";
break;
}

_spotSounds.initFromQuickTime(fileName);
}

void Neighborhood::popActionQueue() {
if (!_actionQueue.empty()) {
tQueueRequest topRequest = _actionQueue.pop();

switch (topRequest.requestType) {
case kNavExtraRequest:
// TODO
break;
case kSpotSoundRequest:
_spotSounds.stopSound();
break;
case kDelayRequest:
// TODO
break;
}

serviceActionQueue();
}
}

void Neighborhood::serviceActionQueue() {
if (!_actionQueue.empty()) {
tQueueRequest &topRequest = _actionQueue.front();

if (!topRequest.playing) {
topRequest.playing = true;
switch (topRequest.requestType) {
case kNavExtraRequest:
// TODO
break;
case kSpotSoundRequest:
_spotSounds.stopSound();
_spotSounds.playSoundSegment(topRequest.start, topRequest.stop);
_interruptionFilter = topRequest.interruptionFilter;
// TODO: stop trigger
break;
case kDelayRequest:
// TODO
break;
}
}
} else {
_interruptionFilter = kFilterAllInput;
}
}

void Neighborhood::requestAction(const tQueueRequestType requestType, const tExtraID extra, const TimeValue in, const TimeValue out,
const tInputBits interruptionFilter, const tNotificationFlags flags) {

tQueueRequest request;

request.requestType = requestType;
request.extra = extra;
request.start = in;
request.stop = out;
request.interruptionFilter = interruptionFilter;
request.playing = false;
request.flags = flags | kActionRequestCompletedFlag;

// TODO: notification

_actionQueue.push(request);
if (_actionQueue.size() == 1)
serviceActionQueue();
}

void Neighborhood::requestExtraSequence(const tExtraID whichExtra, const tNotificationFlags flags, const tInputBits interruptionFilter) {
requestAction(kNavExtraRequest, whichExtra, 0, 0, interruptionFilter, flags);
}

void Neighborhood::requestSpotSound(const TimeValue in, const TimeValue out, const tInputBits interruptionFilter, const tNotificationFlags flags) {
requestAction(kSpotSoundRequest, 0xFFFFFFFF, in, out, interruptionFilter, flags);
}

void Neighborhood::requestDelay(const TimeValue delayDuration, const TimeScale delayScale, const tInputBits interruptionFilter, const tNotificationFlags flags) {
requestAction(kDelayRequest, 0xFFFFFFFF, delayDuration, delayScale, interruptionFilter, flags);
}

bool operator==(const tQueueRequest &arg1, const tQueueRequest &arg2) {
return arg1.requestType == arg2.requestType && arg1.extra == arg2.extra &&
arg1.start == arg2.start && arg1.stop == arg2.stop;
}

bool operator!=(const tQueueRequest &arg1, const tQueueRequest &arg2) {
return !operator==(arg1, arg2);
}

} // End of namespace Pegasus

0 comments on commit fe99e95

Please sign in to comment.