//============================================================================= // Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved. // // File: // // Description: Implement MissionScriptLoader // // History: 12/06/2002 + Created -- NAME // //============================================================================= //======================================== // System Includes //======================================== // Foundation Tech #include #include #include #include //======================================== // Project Includes //======================================== #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //****************************************************************************** // // Global Data, Local Data, Local Classes // //****************************************************************************** // Static pointer to instance of singleton. MissionScriptLoader* MissionScriptLoader::spInstance = 0; //****************************************************************************** // // Public Member Functions // //****************************************************************************** //============================================================================== // MissionScriptLoader::CreateInstance //============================================================================== // // Description: Creates the MissionScriptLoader. // // Parameters: None. // // Return: Pointer to the MissionScriptLoader. // // Constraints: This is a singleton so only one instance is allowed. // //============================================================================== MissionScriptLoader* MissionScriptLoader::CreateInstance() { MEMTRACK_PUSH_GROUP( "MissionScriptLoader" ); rAssert( spInstance == 0 ); #ifdef RAD_GAMECUBE HeapMgr()->PushHeap( GMA_GC_VMM ); #else HeapMgr()->PushHeap( GMA_PERSISTENT ); #endif spInstance = new MissionScriptLoader; rAssert( spInstance ); #ifdef RAD_GAMECUBE HeapMgr()->PopHeap( GMA_GC_VMM ); #else HeapMgr()->PopHeap( GMA_PERSISTENT ); #endif spInstance->Register(); MEMTRACK_POP_GROUP( "MissionScriptLoader" ); return spInstance; } //============================================================================== // MissionScriptLoader::GetInstance //============================================================================== // // Description: - Access point for the MissionScriptLoader singleton. // // Parameters: None. // // Return: Pointer to the MissionScriptLoader. // // Constraints: This is a singleton so only one instance is allowed. // //============================================================================== MissionScriptLoader* MissionScriptLoader::GetInstance() { rAssert( spInstance != 0 ); return spInstance; } //============================================================================== // MissionScriptLoader::DestroyInstance //============================================================================== // // Description: Destroy the MissionScriptLoader. // // Parameters: None. // // Return: None. // //============================================================================== void MissionScriptLoader::DestroyInstance() { rAssert( spInstance != 0 ); delete spInstance; spInstance = 0; } //============================================================================== // MissionScriptLoader::MissionScriptLoader //============================================================================== // Description: Constructor. // // Parameters: None. // // Return: N/A. // //============================================================================== MissionScriptLoader::MissionScriptLoader() : mp_ModelGroup( NULL ), mPedGroupID( -1 ), mp_TrafficGroup( NULL), mpMission( NULL ), mpStage( NULL ), mpObjective( NULL ), mpCondition( NULL ), mFirstObjective( true ) { } //============================================================================== // MissionScriptLoader::~MissionScriptLoader //============================================================================== // Description: Destructor. // // Parameters: None. // // Return: N/A. // //============================================================================== MissionScriptLoader::~MissionScriptLoader() { } //============================================================================= // MissionScriptLoader::Register //============================================================================= // Description: Comment // // Parameters: () // // Return: void // //============================================================================= void MissionScriptLoader::Register() { Console* console = GetConsole(); /* * TC: removing this, since it's not needed anymore; plus, there's no more room * in the console to add any more functions (it's already maxed out) * #ifdef PAL console->AddFunction( "SetLanguage", SetLanguage, "", 1, 1 ); #endif // PAL */ // // Level methods // console->AddFunction( "InitLevelPlayerVehicle", InitLevelPlayerVehicle, "", 3, 4 ); //Inits a player vehicle and puts it at the locator ( carname, locatorname, slot, [.con] ) console->AddFunction( "PlacePlayerCar", PlacePlayerCar, "", 2, 2 ); //Places a Player car at the locator (carname, locatorname) /* console->AddFunction( "EnableTraffic", EnableTraffic, "Traffic", 0, 0 ); console->AddFunction( "DisableTraffic", DisableTraffic, "No Traffic", 0, 0 ); */ console->AddFunction( "AddPurchaseCarReward", AddPurchaseCarReward, "", 5, 6 ); //Add purchasable car reward (name), (character name), (choreo), (location), (float scale), [carstart] console->AddFunction( "SetPostLevelFMV", SetPostLevelFMV, "", 1, 1 ); //FMV to play before loading next level. console->AddFunction( "CreatePedGroup",CreatePedGroup, "",1,1); //Creates a ped group console->AddFunction( "AddPed",AddPed, "",2,2); //Adds a ped to a group console->AddFunction( "ClosePedGroup",ClosePedGroup, "",0,0); //Closes a group console->AddFunction( "UsePedGroup",UsePedGroup, "", 1,1 ); //Sets current ped group to a group console->AddFunction("BindReward",BindReward,"", 5, 7); //Binds a reward to a Quest console->AddFunction("CreateTrafficGroup",CreateTrafficGroup,"",1,1); //Creates a Traffic Group console->AddFunction("AddTrafficModel",AddTrafficModel, "",2,3); //Add a Traffic Model to a Group console->AddFunction("CloseTrafficGroup",CloseTrafficGroup, "",0,0); //Closes a Traffic Group console->AddFunction("SetCarAttributes",SetCarAttributes, "",5,5); //Set the Car Attributes displayed in the Phone Booth console->AddFunction("SetTotalGags",SetTotalGags, "",2,2); //Set the total number of gags for a level console->AddFunction("SetTotalWasps",SetTotalWasps, "",2,2); //Set the total number of wasps for a level console->AddFunction("AddGlobalProp",AddGlobalProp, "",1,1); //Adds a Prop the Master Global Prop Hash Table //Chase/HitnRun Methods console->AddFunction( "CreateChaseManager",CreateChaseManager, "",3,3); //Creates a ChaseManager for a host car console->AddFunction("DisableHitAndRun",DisableHitAndRun, "",0,0); //Disables Hit and Run Feature console->AddFunction("EnableHitAndRun",EnableHitAndRun, "",0,0); //Enables Hit and Run Feature console->AddFunction("SetHitAndRunMeter",SetHitAndRunMeter, "",1,1); //Set the value of the HitnRun meter console->AddFunction("SetNumChaseCars",SetNumChaseCars, "",1,1); //Set the Max Number of Chase Cars console->AddFunction( "SetChaseSpawnRate",SetChaseSpawnRate, "",2,2); //Sets the Spawn rate for a host car console->AddFunction( "KillAllChaseAI",KillAllChaseAI, "",1,1); //Kills all Chase AI for a host car console->AddFunction( "ResetHitAndRun",ResetHitAndRun, "",0,0); //Resets HitnRun system console->AddFunction( "SetHitAndRunDecay",SetHitAndRunDecay, "",1,1); //Sets decay rate for HitnRun meter console->AddFunction( "SetHitAndRunDecayInterior",KillAllChaseAI, "",1,1); //Sets interior decay rate for HitnRun meter // // Mission methods // console->AddFunction( "AddMission", AddMission, "", 1, 1 ); //Adds a new mission and names it (Name) console->AddFunction( "AddBonusMission", AddBonusMission, "", 1, 1 ); //Adds a new bonus mission and names it (Name) console->AddFunction( "SetMissionNameIndex", SetMissionNameIndex, "", 1, 1 ); //Sets the index in the text bible (index) console->AddFunction( "SelectMission", SelectMission, "", 1, 1 ); //Selects a mission by name (Name) //console->AddFunction( "InitMissionPlayerVehicle", InitMissionPlayerVehicle, "", 1, 2 ); //Adds a player vehicle to this mission (vehiclename), [.con] console->AddFunction( "SetMissionResetPlayerInCar", SetMissionResetPlayerInCar, "", 1, 1 ); //This is where the player will go (in car) when the mission resets due to failure [locator] console->AddFunction( "SetMissionResetPlayerOutCar", SetMissionResetPlayerOutCar, "", 2, 2 ); //This is where the player will go (out of car) when the mission resets due to failure [player locator, vehicle locator] console->AddFunction( "SetDynaLoadData", SetDynaLoadData, "", 1, 2 ); //This is the string that defines what to load and dump.. console->AddFunction( "AddBonusObjective", AddBonusObjective, "", 1, 2 ); //This adds a bonus objective to the current mission (type). console->AddFunction( "SetForcedCar", SetForcedCar, "", 0, 0 ); //This makes a mission a forced car mission console->AddFunction( "CloseMission", CloseMission, "", 0, 0 ); //Closes the current mission console->AddFunction( "SetDemoLoopTime", SetDemoLoopTime, "", 1, 1 ); //Sets the demo loop time only for demo loops console->AddFunction("StreetRacePropsLoad",StreetRacePropsLoad, "",1,1); //String that defines which file that contains the props for streetraces to load console->AddFunction("StreetRacePropsUnload",StreetRacePropsUnload, "",1,1); //String that defines which file that contains the props for streetraces to unload console->AddFunction("UseElapsedTime",UseElapsedTime, "",0,0); //Make this Mission timer count UP console->AddFunction("AttachStatePropCollectible",AttachStatePropCollectible, "" , 2, 2 ); //Attaches a collectible to the vehicle (vehicle name , statepropname ) console->AddFunction("ShowHUD",ShowHUD, "" , 1, 1 ); //Sets visibility of in-game HUD console->AddFunction( "SetNumValidFailureHints", SetNumValidFailureHints, "", 1, 1 ); //Sets number of valid failure hints to be randomly chosen // // Stage methods // console->AddFunction( "AddStage", AddStage, "", 0, 7 ); //Adds a new stage to the current mission ([final], [locked, skin|car, name], [locked, skin|car, name]) console->AddFunction( "SetStageMessageIndex", SetStageMessageIndex, "", 1, 2 ); //Sets the index in the text bible (index) console->AddFunction( "SetStageTime", SetStageTime, "", 1, 1 ); //Adds time to the current stage () console->AddFunction( "AddStageTime", AddStageTime, "", 1, 1 ); //Sets the time of the current stage () console->AddFunction( "AddStageVehicle", AddStageVehicle, "", //Adds an AI vehicle to the stage (name, startlocator, aitype, [.con], [driver name]) 3, 5 ); console->AddFunction( "MoveStageVehicle", MoveStageVehicle, "", //Moves an AI vehicle in the stage (name, startlocator, aitype) 3, 3 ); console->AddFunction( "ActivateVehicle", ActivateVehicle, "", 3, 4 ); //Activates AI vehicle that has no AI in the stage (name, startlocator, aitype, [driver name]) console->AddFunction( "AddStageWaypoint", AddStageWaypoint, "", 1, 1 ); //Adds a waypoint to the stage (locatorname) console->AddFunction( "AddStageCharacter", AddStageCharacter, "", 3, 5 ); //Adds a character to the stage (name, locatorname, dynaload string, [vehiclename], [carlocator]) console->AddFunction( "AddStageMusicChange", AddStageMusicChange, "", 0, 0 ); //Triggers check for change of music tension console->AddFunction( "SetStageMusicAlwaysOn", SetStageMusicAlwaysOn, "", 0, 0 ); //Locks music on for walking out of car in stage console->AddFunction( "SetCompletionDialog", SetCompletionDialog, "", 1, 2 ); //Plays dialog with given event name at end of stage console->AddFunction( "StageStartMusicEvent", SetStageStartMusicEvent, "", 1, 1 ); //Triggers a music event when stage begins console->AddFunction( "SetMusicState", SetMusicState, "", 2, 2 ); //Sets a radMusic state using the given state and event names console->AddFunction( "SetStageCamera", SetStageCamera, "", 3, 3 ); //Sets the current camera mode for this stage (mode, cut, quick transition) console->AddFunction( "RESET_TO_HERE", ResetToThisStage, "", 0, 0 ); //Sets the desred stage for resseting to... hehe hehehshshehahrheh console->AddFunction( "SetMaxTraffic", SetTrafficDensity, "", 1, 1 ); //Sets the max traffic density. console->AddFunction( "AddSafeZone", AddSafeZone, "", 2, 2 ); //Adds a Safezone at locatorname,radius in meters () console->AddFunction( "SetBonusMissionStart", SetBonusMissionStart, "", 0, 0 ); //Makes this stage the start of a bonus mission. console->AddFunction( "ShowStageComplete", ShowStageComplete, "", 0, 0 ); //Show stage complete presentation. console->AddFunction( "SetHUDIcon", SetHUDIcon, "", 1, 1 ); //Set HUD Icon Image. console->AddFunction( "SetIrisWipe", SetIrisWipe, "", 1, 1 ); //Turns on Iris wipe. console->AddFunction( "SetFadeOut", SetFadeOut, "", 1, 1 ); //Turns on Fade Out. console->AddFunction( "CloseStage", CloseStage, "", 0, 0 ); //Closes the current stage () console->AddFunction( "SetVehicleAIParams", SetVehicleAIParams, "", 3, 3 ); //Sets params for an existing stage vehicle AI (STAGEVEHICLENAME, MINSHORTCUTSKILL, MAXSHORTCUTSKILL) console->AddFunction("PlacePlayerAtLocatorName",PlacePlayerAtLocatorName, "",1,1); //On Stage Reset/Init places the player at a Locator console->AddFunction("msPlacePlayerCarAtLocatorName",msPlacePlayerCarAtLocatorName, "",1,1); //Place the players current car at locator at the start of stage //Chuck:Commands for Swapping Default for forced cars As per the Agreed template console->AddFunction("SwapInDefaultCar",SwapInDefaultCar, "",0,0); //At the End of this Stage We Swap In the Default during the Iris Wipe console->AddFunction("SetSwapPlayerLocator",SetSwapPlayerRespawnLocatorName, "",1,1); //Sets the Locator to spawn the player after we swap cars console->AddFunction("SetSwapDefaultCarLocator",SetSwapDefaultCarRespawnLocatorName, "",1,1); //Set the Locator to spawn the default car after we swap cars console->AddFunction("SetSwapForcedCarLocator",SetSwapForcedCarRespawnLocatorName, "",1,1); //Set the Locator to spawn the forced car after we swap cars console->AddFunction("NoTrafficForStage",NoTrafficForStage, "",0,0); //Sets No Traffic For a Stage console->AddFunction("ClearTrafficForStage",ClearTrafficForStage, "",0,0); //Clear traffic at the beginning of the stage console->AddFunction( "SetStageAIRaceCatchupParams",SetStageAIRaceCatchupParams, "", 5,5 ); //Sets Race AI catchup params. console->AddFunction( "SetStageAIEvadeCatchupParams",SetStageAIEvadeCatchupParams, "", 3,3 ); //Sets Evade AI catchup params. console->AddFunction( "SetStageAITargetCatchupParams",SetStageAITargetCatchupParams, "", 3,3 ); //Sets Target AI catchup params. console->AddFunction("SetCharacterToHide",SetCharacterToHide, "",1,1); //Set a Character To Be Hidden for duration at start of stage console->AddFunction("SetLevelOver",SetLevelOver, "",0,0); //Explictly Command to End Level at Stage Finalize console->AddFunction("SetGameOver", SetGameOver, "", 0, 0); //Explicitly end the game. console->AddFunction("StayInBlack",StayInBlack, "",0,0); //Makes Scree black for duration of stage console->AddFunction("AllowMissionAbort",AllowMissionAbort,"",1,1); // //Gamble Race Commands // console->AddFunction("SetParTime",SetParTime, "",1,1); //Sets Par Time for Gambling Races ONLY! console->AddFunction("SetRaceEnteryFee",SetRaceEnteryFee, "",1,1); //Sets The Amount of Coins Required to Enter Race console->AddFunction("PutMFPlayerInCar",PutMFPlayerInCar, "",0,0); //Forces the player to respawn in their car at the beginning of this stage console->AddFunction("SetStatepropShadow",SetStatepropShadow, "", 2,2 ); //Sets which element of a stateprop is the shadow and projects it onto the ground // // Objective methods // console->AddFunction( "AddObjective", AddObjective, "", 1, 3 ); //Adds a new objective to the current stage ( objtype ) console->AddFunction( "CloseObjective", CloseObjective, "", 0, 0 ); //Closes the current objective () console->AddFunction( "SetDestination", SetDestination, "", 1, 3); //Sets the destination of the current objective (locator name, [p3d name], [float scale factor]) console->AddFunction( "AddNPC", AddNPC, "",2, 3 ); //Adds an NPC (name) to the position (locator name) beginning at this objective console->AddFunction( "RemoveNPC", RemoveNPC, "",1, 1 ); //Remove an NPC (name) in this objective console->AddFunction( "AddDriver", AddDriver, "",2, 2 ); //Adds an driver (name) int the car (other name) in this objective console->AddFunction( "RemoveDriver", RemoveDriver, "",1, 1 ); //Remove an driver (name) in this objective console->AddFunction( "SetTalkToTarget", SetTalkToTarget, "", 1, 4 ); //Sets the target of the objective's conversation (name, [0 - exclamation (default), 1 - gift, 2 - Door], [y offset], [trigger radius] console->AddFunction( "SetDialogueInfo", SetDialogueInfo, "", 4, 4 ); //Sets the members of the dialogue, the name of the dialogue sound and the length of pause console->AddFunction( "SetDialoguePositions", SetDialoguePositions, "", 2, 4 ); //Sets the positions of the characters and the car for the dialogue console->AddFunction( "SetRaceLaps", SetRaceLaps, "", 1, 1 ); //Sets the number of laps in the race. console->AddFunction( "TurnGotoDialogOff", TurnGotoDialogOff, "", 0, 0 ); //Turns arrival dialog off for goto objectives. console->AddFunction( "MustActionTrigger", MustActionTrigger, "", 0, 0 ); //Must use action button for goto objectives. //Chuck Coin Objectives console->AddFunction("SetCoinFee",SetCoinFee, "",1,1); //Set The Amount of Coins to get past a Stage //Timer Objectives console->AddFunction("SetDurationTime",SetPauseDuration, "",1,1); //Set the amount of time for the timer objective // // Collection objective methods // console->AddFunction( "AddCollectible", AddCollectible, "", 1, 4 ); //Adds a new collectible to the current objective (locator name, [p3d name], [dialog event], [float scale factor]) console->AddFunction( "SetCollectibleEffect", SetCollectibleEffect, "", 1, 1 ); //Sets the collectible effect (effect name) console->AddFunction( "BindCollectibleTo", BindCollectibleToWaypoint, "", 2, 2 ); //Binds the collectible to the waypoint (collect num, waypoint num) console->AddFunction( "AllowUserDump", AllowUserDump, "", 0, 0 ); //Allows the player to lose collected object when struck by ai vehicles. console->AddFunction( "SetVehicleToLoad", SetVehicleToLoad, "", 3,3); //Starts an async load of a new player vehicle // // Follow objective methods // console->AddFunction( "SetObjTargetVehicle", SetObjTargetVehicle, "", 1, 1 ); //Sets the target vehicle for a follow objective (name) console->AddFunction( "SetObjDistance", SetObjDistance, "", 1, 1 ); //Sets the distance needed to lose the tail (distance) // Boss objective console->AddFunction( "SetObjTargetBoss", SetObjTargetBoss, "", 1,1 ); //Sets the target boss for a destroy objective console->AddFunction( "AddCollectibleStateProp", AddCollectibleStateProp, "", 3,3 ); //Creates a new collectible stateprop into world console->AddFunction( "SetPickupTarget", SetPickupTarget, "", 1,1 ); //Sets the target for a pickupitem objective console->AddFunction( "AllowRockOut", AllowRockOut, "", 0, 0 ); //Have the PC 'rock out' when idling during this objective // // Mission Condition methods // console->AddFunction( "AddCondition", AddCondition, "", 1, 2 ); //Adds a new condition to the stage (type) console->AddFunction( "CloseCondition", CloseCondition, "", 0, 0 ); //Closes the current condition console->AddFunction( "SetFollowDistances", SetFollowDistances, "", 2, 2 ); //Sets the follow condition distances (min, max) // // Follow Condition methods // console->AddFunction( "SetCondTargetVehicle", SetCondTargetVehicle, "", 1, 1 ); //Sets the target vehicle for a follow condition (name) // // Position Condition methods console->AddFunction("SetConditionPosition", SetConditionPosition, "", 1, 1 ); //Sets the position required for the position condition on a race. console->AddFunction("SetCondTime", SetCondTime, "", 1, 1 ); //Sets the timeout for the out of car condition. console->AddFunction("SetHitNRun", SetHitNRun, "", 0, 0 ); //Turns on Hit N Run on timeout condition. // // Presentation Functions // console->AddFunction( "EnableTutorialMode", EnableTutorialMode, "", 1, 1 ); //Should tutorial mode be enabled? console->AddFunction( "SetConversationCamName", SetConversationCamName, "x", 1, 1 ); //Should tutorial mode be enabled? console->AddFunction( "SetConversationCamPcName", SetConversationCamPcName, "", 1, 1 ); //Sets which of the conversation cameras will be used when the PC is talking console->AddFunction( "SetConversationCamNpcName", SetConversationCamNpcName, "", 1, 1 ); //Sets which of the conversation cameras will be used when the NPC is talking console->AddFunction( "SetConversationCam", SetConversationCam, "", 2, 3 ); //Sets the conversation cmaera for a particular line of dialog console->AddFunction( "SetConversationCamDistance", SetConversationCamDistance, "", 2, 2 ); //Sets which of the conversation cameras will be used when the NPC is talking console->AddFunction( "AmbientAnimationRandomize", AmbientAnimationRandomize, "", 2, 2 ); //should the animation for a particular character be randomized? console->AddFunction( "ClearAmbientAnimations", ClearAmbientAnimations, "", 1, 1 ); console->AddFunction( "AddAmbientPcAnimation", AddAmbientPcAnimation, "", 1, 2 ); //Adds an animation that will be chosen at random during conversations console->AddFunction( "AddAmbientNpcAnimation", AddAmbientNpcAnimation, "", 1, 2 ); //Adds an animation that will be chosen at random during conversations console->AddFunction( "CharacterIsChild", CharacterIsChild, "", 1, 1 ); //Tells the conversation camera that this character is a child, and to look down console->AddFunction( "SetPresentationBitmap", SetPresentationBitmap, "", 1, 1 ); //this is the bitmap to use on the mission breifing screen console->AddFunction( "SetAnimCamMulticontName", SetAnimatedCameraMulticontrollerName, "", 1, 1 ); //This is the multicontroller for the animated camera that we should use console->AddFunction( "SetAnimatedCameraName", SetAnimatedCameraName, "", 1, 1 ); //This is the animated camera that we should use console->AddFunction( "SetMissionStartMulticontName", SetMissionStartMulticontrollerName, "", 1, 1 ); //This is the multicontroller for the animated camera that we should use console->AddFunction( "SetMissionStartCameraName", SetMissionStartCameraName, "", 1, 1 ); //This is the animated camera that we should use console->AddFunction( "SetCamBestSide", SetCamBestSide, "", 1, 2 ); //This is the name of the locator that corresponds to the best side for the camera console->AddFunction( "SetFMVInfo", SetFMVInfo, "", 1, 2 ); //Play the FMV specified by file name console->AddFunction( "StartCountdown", StartCountdown, "", 1, 2 ); //start the 321 go countdown, specify dialog console->AddFunction( "AddToCountdownSequence", AddToCountdownSequence, "", 1, 2 ); //Add message and dialog to countdown sequence console->AddFunction( "SetCarStartCamera", SetCarStartCamera, "", 1, 1 ); //Sets the camera that will be used when a car is loaded from a phone booth console->AddFunction( "GoToPsScreenWhenDone", GoToPattyAndSelmaScreenWhenDone, "", 0, 0 ); //go to patty and selma screen when stage done? //SuperSprint methods console->AddFunction( "SetPlayerCarName", SetPlayerCarName, "", 2, 2 ); //This sets the car name for a given player console->AddFunction( "SetCondMinHealth", SetCondMinHealth, "", 1, 1 ); //This sets the min health before failing the condition // // Loading script methods // console->AddFunction( "LoadP3DFile", LoadP3DFile, "", 1, 3 ); //Loads a Pure3D file ( filename, [heap name], [inventory section name] ) console->AddFunction( "LoadDisposableCar", LoadDisposableCar, "", 3, 3 ); //Loads a Pure3D CAR file ( filename,name,slot ) //Setting the respawn time for wrenches and wasps and nitro etc console->AddFunction("SetRespawnRate",SetRespawnRate, "",2,2); //Set RespawnRate for Wrenches and Nitro in seconds,etc console->AddFunction( "AddCharacter", AddCharacter, "", 2, 2 ); //Adds a character to the game world. All files must still be loaded ( p3d, choreo ) console->AddFunction( "AddNPCCharacterBonusMission", AddNPCCharacterBonusMission, "", 7, 8 ); //Adds an NPC character to the game world. All files must still be loaded ( p3d, choreo, loc, mission name, icon name, dialogue name, isRace, alternate icon name ) console->AddFunction( "SetBonusMissionDialoguePos", SetBonusMissionDialoguePositions, "", 3, 4 ); //Sets the positions of the characters and the car for the bonus mission dialogue (mission name, char 1 loc, char 2 loc, car loc) console->AddFunction( "AddAmbientCharacter", AddAmbientCharacter, "", 2, 3 ); //Adds an ambient NPC character to the game world. All files must still be loaded ( p3d, loc) console->AddFunction( "AddBonusMissionNPCWaypoint", AddBonusMissionNPCWaypoint, "", 2, 2 ); //Adds a waypoint for specified bonus mission NPC ( NPCNAME, LOCATOR ) console->AddFunction( "AddObjectiveNPCWaypoint", AddObjectiveNPCWaypoint, "", 2, 2 ); //Adds a waypoint for specified mission objective NPC ( NPCNAME, LOCATOR ) console->AddFunction( "AddAmbientNPCWaypoint", AddAmbientNPCWaypoint, "", 2, 2 ); //Adds a waypoint for specified ambient NPC ( NPCNAME, LOCATOR ) console->AddFunction( "AddPurchaseCarNPCWaypoint", AddPurchaseCarNPCWaypoint, "", 2, 2 ); //Adds a waypoint for specified Purchase Car Reward NPC ( NPCNAME, LOCATOR ) console->AddFunction( "ActivateTrigger", ActivateTrigger, "", 1, 1 ); //Activate a locator ( locator name ) console->AddFunction( "DeactivateTrigger", DeactivateTrigger, "", 1, 1 ); //Deactivate a locator ( locator name ) // // Oh, that's a creative name. Like, duh. // console->AddFunction( "CreateAnimPhysObject", CreateAnimPhysObject, "", 2, 2 ); //Creates an animated physics object (name, animname) console->AddFunction( "CreateActionEventTrigger", CreateActionEventTrigger, "", 5, 5 ); //Creates an action event trigger CreateActionEventTrigger(const char* triggerName, rmt::Vector& pos, float r) console->AddFunction( "LinkActionToObjectJoint", LinkActionToObjectJoint, "", 5, 5 ); //Links the Action Trigger to an object joint. LinkActionToObjectJoint(const char* objectName, const char* jointName, const char* triggerName, const char* typeName, const char* buttonName ) console->AddFunction( "LinkActionToObject", LinkActionToObject, "", 5, 5 ); //Links the Action Trigger to an object. LinkActionToObject(const char* objectName, const char* jointName, const char* triggerName, const char* typeName, const char* buttonName) console->AddFunction( "SetCoinDrawable", SetCoinDrawable, "", 1, 1 ); //Name the drawable for the coins console->AddFunction( "SetParticleTexture", SetParticleTexture, "", 2, 2 ); //Name of texture used for particle } //============================================================================= // MissionScriptLoader::LoadScript //============================================================================= // Description: Comment // // Parameters: ( char* filename ) // // Return: void // //============================================================================= void MissionScriptLoader::LoadScript( char* filename ) { mFirstObjective = true; HeapMgr()->PushHeap (GMA_LEVEL_MISSION); // // NOTE: This has to stay sync because the scripts queue requests to the // loading manager and these do not get processed if the loadmanager is // already busy loading something // GetConsole()->ExecuteScriptSync( filename ); HeapMgr()->PopHeap (GMA_LEVEL_MISSION); } void MissionScriptLoader::LoadScriptAsync( char* filename, LoadingManager::ProcessRequestsCallback* callback ) { mFirstObjective = true; HeapMgr()->PushHeap (GMA_LEVEL_MISSION); GetConsole()->ExecuteScript( filename, this, callback ); HeapMgr()->PopHeap(GMA_LEVEL_MISSION); } void MissionScriptLoader::OnExecuteScriptComplete( void* pUserData ) { if ( pUserData != NULL ) { LoadingManager::ProcessRequestsCallback* callback = static_cast(pUserData); if ( callback ) { callback->OnProcessRequestsComplete( NULL ); } } } //****************************************************************************** // // Private Member Functions // //****************************************************************************** //============================================================================= // MissionScriptLoader::SetLanguage //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetLanguage( int argc, char** argv ) { #ifdef PAL const char languageID = argv[ 1 ][ 0 ]; switch( languageID ) { case 'F': { CGuiTextBible::SetCurrentLanguage( Scrooby::XL_FRENCH ); break; } case 'G': { CGuiTextBible::SetCurrentLanguage( Scrooby::XL_GERMAN ); break; } #ifndef RAD_GAMECUBE case 'S': { CGuiTextBible::SetCurrentLanguage( Scrooby::XL_SPANISH ); break; } #endif // !RAD_GAMECUBE default: { rTuneAssertMsg( languageID == 'E', "Invalid language specification!" ); break; } } #endif // PAL } //============================================================================= // MissionScriptLoader::InitVehicle //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::InitLevelPlayerVehicle( int argc, char** argv ) { char locator[64], vehicleName[64], confile[64], slot[64]; GameplayManager::eCarSlots eslot = GameplayManager::eDefaultCar; strcpy( vehicleName, argv[ 1 ]); strcpy( locator, argv[ 2 ]); strcpy(slot,argv[3]); //determining which slot init on. if(strcmp (slot,"DEFAULT") == 0) { eslot = GameplayManager::eDefaultCar; } else if ( strcmp (slot,"OTHER") == 0 ) { eslot = GameplayManager::eOtherCar; } else if (strcmp (slot,"AI") == 0 ) { rTuneAssertMsg(0, "is this ever called - see greg \n"); eslot = GameplayManager::eAICar; } else { printf(" Unknown Slot type, trying Init Level Car\n"); rAssert (0); } //empty vehicle point case if ( GetGameplayManager()->mVehicleSlots[eslot].mp_vehicle == NULL) { Vehicle* vehicle; if(argc == 5) { strcpy( confile, argv[ 4 ]); vehicle = GetGameplayManager()->AddLevelVehicle( vehicleName,eslot, confile ); } else { vehicle = GetGameplayManager()->AddLevelVehicle( vehicleName,eslot, 0 ); } GetGameplayManager()->SetCurrentVehicle(vehicle); // the mDefaultVehicle member data is old daryll legacy bs //if(eslot == GameplayManager::eDefaultCar) //{ // strcpy(GetGameplayManager()->mDefaultVehicle,vehicleName); //} GetGameplayManager()->PlaceVehicleAtLocatorName( vehicle, locator ); } //non empty ptr else { // greg // jan 4, 2003 // i'm curious to see if we ever get here rAssert(0); if (strcmp(GetGameplayManager()->mVehicleSlots[eslot].mp_vehicle->GetName(), vehicleName) == 0) { //do nothing same vehicle exist } else { //trying to add some vehicle to a slot thats occupied rAssert(0); } } if ( eslot == GameplayManager::eDefaultCar ) { //Save this as the default level data. sprintf( GetGameplayManager()->mDefaultLevelVehicleName, vehicleName ); if ( argc == 5 ) { sprintf( GetGameplayManager()->mDefaultLevelVehicleConfile, confile ); } sprintf( GetGameplayManager()->mDefaultLevelVehicleLocator, locator ); } } //============================================================================= // MissionScriptLoader::PlacePlayerCar //============================================================================= // Description: Moves a Player car to a locator. // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::PlacePlayerCar( int argc, char** argv ) { char locator[64], vehicleName[64]; strcpy( vehicleName, argv[ 1 ]); strcpy( locator, argv[ 2 ]); Vehicle* vehicle = NULL; //checking command to move current car. if (strcmp(vehicleName,"current")==0) { vehicle= GetGameplayManager()->GetCurrentVehicle(); } else { rTuneAssertMsg(0, "was this ever getting called, 'cause it wouldn't have worked - see greg \n"); //vehicle= GetGameplayManager()->GetVehicle(vehicleName); } rAssert(vehicle != NULL); GetGameplayManager()->PlaceVehicleAtLocatorName( vehicle, locator ); } /* void MissionScriptLoader::EnableTraffic( int argc, char** argv ) { ITrafficSpawnController* p_TrafficController= TrafficManager::GetSpawnController(); rAssert(p_TrafficController); p_TrafficController->EnableTraffic(); } void MissionScriptLoader::DisableTraffic( int argc, char** argv ) { ITrafficSpawnController* p_TrafficController= TrafficManager::GetSpawnController(); rAssert(p_TrafficController); p_TrafficController->DisableTraffic(); } */ //============================================================================= // MissionScriptLoader::AddPurchaseCarReward //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddPurchaseCarReward( int argc, char** argv ) { HeapMgr()->PushHeap( GMA_LEVEL_OTHER ); ActionEventLocator* rewLoc = NULL; rewLoc = new ActionEventLocator(); rAssert( rewLoc ); rewLoc->SetName( argv[1] ); rewLoc->SetActionNameSize( strlen("PurchaseCar") ); rewLoc->SetActionName( "PurchaseCar" ); rAssert( argc == 7 ); //The obj name is the name of the carstart locator rewLoc->SetObjNameSize( strlen( argv[6] ) ); rewLoc->SetObjName( argv[6] ); //We use people for cars. char uniqueName[64]; sprintf(uniqueName, "reward_%s", argv[2]); Character* c = GetCharacterManager()->AddCharacterDeferedLoad( CharacterManager::NPC, uniqueName, argv[2], argv[3], argv[4] ); c->SetRole(Character::ROLE_REWARD); c->SetAmbient(argv[4], 0.0f); //This is a hack to tie the character name to the action event. rewLoc->SetJointNameSize( strlen( uniqueName ) ); rewLoc->SetJointName( uniqueName ); c->SetRenderLayer(RenderEnums::LevelSlot); c->AddToWorldScene(); rewLoc->SetButtonInput( (CharacterController::DoAction ) ); rewLoc->SetShouldTransform( false ); Locator* posLoc = p3d::find(argv[4]); rAssert( posLoc ); rmt::Vector pos( 0.0f, 0.0f, 0.0f ); if ( posLoc ) { posLoc->GetLocation( &pos ); } rewLoc->SetLocation( pos ); // If AddToGame() fails, actLoc will be released. // Hold on to it here. // rewLoc->AddRef(); bool added = rewLoc->AddToGame( NULL ); rAssert( added ); // If AddToGame() didn't addref the locator, // this release will delete it. // rewLoc->Release( ); if ( added ) { //Create a trigger volume for the locator; float scale = static_cast( atof( argv[5] ) ); SphereTriggerVolume* newTrigger = new SphereTriggerVolume( pos, scale ); rAssert( newTrigger ); newTrigger->SetLocator( rewLoc ); rewLoc->SetNumTriggers( 1, GMA_LEVEL_OTHER ); rewLoc->AddTriggerVolume( newTrigger ); GetTriggerVolumeTracker()->AddTrigger( newTrigger ); } HeapMgr()->PopHeap( GMA_LEVEL_OTHER ); } void MissionScriptLoader::SetPostLevelFMV( int argc, char** argv ) { rAssert( argc > 1 ); GetGameplayManager()->SetPostLevelFMV( argv[ 1 ] ); } //============================================================================= // MissionScriptLoader::CreateChaseManager //============================================================================= // Description: Creates a ChaseManager instance for the hostvehicle // // Parameters: the hostvehicle (char* )and the spawn rate (int) // // Return: void // //============================================================================= void MissionScriptLoader::CreateChaseManager(int argc,char** argv) { char vehiclename [64]; char confile [64]; int spawnrate =0; strcpy(vehiclename,argv[1]); strcpy(confile,argv[2]); spawnrate = atoi(argv[3]); if ( GetGameplayManager()->CreateChaseManager(vehiclename,confile,spawnrate) != 0) { //no room to create new chasemanager, WTF? rAssert(0); } } //============================================================================= // MissionScriptLoader::SetChaseSpawnRate //============================================================================= // Description: Sets the spawn rate for the hostvehicle // // Parameters: the hostvehicle (char* )and the spawn rate (int) 0-10 whole integer // // Return: void // //============================================================================= void MissionScriptLoader::SetChaseSpawnRate (int argc,char** argv) { char vehiclename [64]; int num_cars =0; ChaseManager* p_chasemanager = NULL; strcpy(vehiclename,argv[1]); num_cars = atoi(argv[2]); spInstance->mpStage->SetChaseSpawnRate(vehiclename,num_cars); } //============================================================================= // MissionScriptLoader::KillAllChaseAI //============================================================================= // Description: Stop all chase AI vehicle for a hostvehicle // // Parameters: the hostvehicle (char* ) // // Return: void // //============================================================================= void MissionScriptLoader::KillAllChaseAI(int argc,char** argv) { char vehiclename [64]; ChaseManager* p_chasemanager = NULL; strcpy(vehiclename,argv[1]); p_chasemanager=GetGameplayManager()->GetChaseManager(vehiclename); rAssert(p_chasemanager); p_chasemanager->DisableAllActiveVehicleAIs(); } //============================================================================= // MissionScriptLoader::AddMission //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddMission( int argc, char** argv ) { int index = GetGameplayManager()->GetNumMissions(); spInstance->mMissionHeap = GetGameplayManager()->GetMissionHeap( index ); HeapMgr()->PushHeap( spInstance->mMissionHeap ); MEMTRACK_PUSH_GROUP( "Mission" ); spInstance->mpMission = new Mission(); spInstance->mpMission->SetName( argv[ 1 ] ); if ( !GetGameplayManager()->mIsDemo ) { Mission* sdPart = new Mission(); char name[64]; sprintf( name, "%ssd", argv[ 1 ] ); sdPart->SetName( name ); spInstance->mpStage = NULL; //Add the SD part of the mission... index; GetGameplayManager()->SetNumMissions( index + 1 ); GetGameplayManager()->SetMission( index, sdPart ); sdPart->SetSundayDrive(); index++; } //Add the Main part of the mission... GetGameplayManager()->SetNumMissions( index + 1 ); GetGameplayManager()->SetMission( index, spInstance->mpMission ); //chuck: when we are in demo we shouldn't add missions to the charactersheet. if (GetGameplayManager()->mIsDemo == false) { //check for m8, m8 is a bogus mission and should not get added to charactersheet. if (strcmp(argv[1],"m8") != 0) { if (GetCharacterSheetManager()->AddMission(GetGameplayManager()->GetCurrentLevelIndex(),spInstance->mpMission->GetName()) !=0 ) { //asserted cause something failed adding mission to charactersheet. rAssert(0); } } } HeapMgr()->PopHeap( spInstance->mMissionHeap ); MEMTRACK_POP_GROUP( "Mission" ); } //============================================================================= // MissionScriptLoader::AddBonusMission //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddBonusMission( int argc, char** argv ) { int index = GameplayManager::MAX_MISSIONS + GetGameplayManager()->GetNumBonusMissions(); spInstance->mMissionHeap = GetGameplayManager()->GetMissionHeap( index ); HeapMgr()->PushHeap( spInstance->mMissionHeap ); MEMTRACK_PUSH_GROUP( "Mission" ); spInstance->mpMission = new Mission(); spInstance->mpMission->SetName( argv[ 1 ] ); spInstance->mpMission->SetBonusMission(); //Add the Main part of the mission... int bonusMissionsCount = GetGameplayManager()->GetNumBonusMissions(); GetGameplayManager()->SetNumBonusMissions( bonusMissionsCount + 1 ); GetGameplayManager()->SetMission( index, spInstance->mpMission ); MEMTRACK_POP_GROUP( "Mission" ); //Chuck: a Code Design Shortcut. //I'm going to ASSUME That all bonusmission will be name "bm1" //its a bonus mission if (strcmp(argv[1],"bm1") ==0) { if (GetCharacterSheetManager()->AddBonusMission(GetGameplayManager()->GetCurrentLevelIndex(),spInstance->mpMission->GetName()) !=0 ) { //asserted cause something failed adding mission to charactersheet. rAssert(0); } } else if (strcmp (argv[1],"gr1")==0) { //its a gamble race and we do nothing if(GetCharacterSheetManager()->AddGambleRace(GetGameplayManager()->GetCurrentLevelIndex(),spInstance->mpMission->GetName()) != 0) { rTuneAssert(0); } } else { //add it the charactersheet since it must be a streetrace if(GetCharacterSheetManager()->AddStreetRace(GetGameplayManager()->GetCurrentLevelIndex(),spInstance->mpMission->GetName()) !=0 ) { //problems adding the streetrace to the charactersheet //rAssert(0); rReleasePrintf("Warning: Could NOT add %S into the CharacterSheet, All 3 StreetRace Slots are Full, Double Check this Mission's Name\n",spInstance->mpMission->GetName()); } } HeapMgr()->PopHeap( spInstance->mMissionHeap ); } //============================================================================= // MissionScriptLoader::CloseMission //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::CloseMission( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpMission != NULL, "Mission already closed!\n" ); spInstance->mpMission = NULL; } //============================================================================= // MissionScriptLoader::SetForcedCar //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetForcedCar( int argc, char** argv ) { spInstance->mpMission->SetForcedCar( true ); } //============================================================================= // MissionScriptLoader::SetDemoLoopTime //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetDemoLoopTime( int argc, char** argv ) { if ( ( CommandLineOptions::Get( CLO_DEMO_TEST ) || GetCheatInputSystem()->IsCheatEnabled( CHEAT_ID_DEMO_TEST ) ) && ( !CommandLineOptions::Get( CLO_SHORT_DEMO ) ) ) { ContextEnum currctx = GetGameFlow()->GetCurrentContext(); if ( currctx == CONTEXT_DEMO || currctx == CONTEXT_LOADING_DEMO ) { DemoContext* dctx = static_cast(GetGameFlow()->GetContext( CONTEXT_DEMO )); rAssert( dctx != NULL ); dctx->SetDemoLoopTime( atoi( argv[1] ) ); } } } //============================================================================= // MissionScriptLoader::SelectMission //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SelectMission( int argc, char** argv ) { GameplayManager* gpm = GetGameplayManager(); int missionNum = gpm->GetMissionNumByName( argv[1] ); if ( missionNum > -1 ) { spInstance->mpMission = gpm->GetMission( missionNum ); // new // jan 8, 2003 // greg // this is the very beginning of a brand new mission // // dump out old mission car list from GameplayManger // HUGE TODO!!!! // // only want to do this the first time we start a mission // NOT on a mission reset gpm->EmptyMissionVehicleSlots(); return; } spInstance->mpMission = NULL; // This really bad rAssert( false ); } //============================================================================= // MissionScriptLoader::SetMissionNameIndex //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetMissionNameIndex( int argc, char** argv ) { rAssert( spInstance->mpMission != NULL ); int index = atoi( argv[ 1 ] ); //spInstance->mpMission->SetNameIndex( index ); } //============================================================================= // MissionScriptLoader::AddMissionPlayerVehicle //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= /* void MissionScriptLoader::InitMissionPlayerVehicle( int argc, char** argv ) { // don't think this is ever called rAssert(0); rAssert( spInstance->mpMission != NULL ); char confile[64]; Vehicle* vehicle = NULL; if(argc == 2) { vehicle = GetVehicleCentral()->InitVehicle( argv[ 1 ], false, 0, VT_USER ); } else if(argc == 3) { strcpy (confile, argv[2]); vehicle = GetVehicleCentral()->InitVehicle( argv[ 1 ], false, confile, VT_USER ); } else { rTuneAssertMsg(0,"wrong number of arguments for InitMissionPlayerVehicle\n"); } // now handled by VehicleCentral::AddVehicleToActiveList //GetRenderManager()->mpLayer(RenderEnums::LevelSlot)->AddGuts((tDrawable*)( vehicle ) ); //spInstance->mpMission->AddVehicle( vehicle ); } */ //============================================================================= // MissionScriptLoader::SetMissionResetPlayerInCar //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetMissionResetPlayerInCar( int argc, char** argv ) { //Find the locator named argv[ 1 ] CarStartLocator* loc = p3d::find( argv[ 1 ] ); if ( loc != NULL ) { spInstance->mpMission->SetVehicleRestart( loc ); } else { #ifdef RAD_DEBUG char error[256]; sprintf( error, "Can not find locator: %s\n", argv[ 1 ] ); rDebugString( error ); #endif } } //============================================================================= // MissionScriptLoader::SetMissionResetPlayerOutCar //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetMissionResetPlayerOutCar( int argc, char** argv ) { //Find the locator named argv[ 1 ] Locator* playerLoc = p3d::find( argv[ 1 ] ); //Find the locator named argv[ 2 ] CarStartLocator* vehicleLoc = p3d::find( argv[ 2 ] ); if ( playerLoc != NULL && vehicleLoc != NULL ) { spInstance->mpMission->SetVehicleRestart( vehicleLoc ); spInstance->mpMission->SetPlayerRestart( playerLoc ); } else { #ifndef FINAL if(playerLoc == NULL) { char error[256]; sprintf( error, "Can not find locator: %s, Designer Error!!!!\n", argv[ 1 ] ); TreeOfWoeErrorMsg(error); rTuneAssertMsg(0, error ); } if(vehicleLoc == NULL) { char error[256]; sprintf( error, "Can not find locator: %s, Designer Error!!!!\n", argv[ 1 ] ); TreeOfWoeErrorMsg(error); rTuneAssertMsg(0, error ); } #endif } if(playerLoc) { bool loading = ((GetGuiSystem()->GetBackendManager()->GetCurrentScreen() == CGuiWindow::GUI_SCREEN_ID_LOADING) && GetGuiSystem()->GetBackendManager()->GetCurrentWindow()->IsRunning()); if((GetGameFlow()->GetCurrentContext() == CONTEXT_LOADING_GAMEPLAY) || loading) { rmt::Vector pos; playerLoc->GetLocation(&pos); GetInteriorManager()->LoadLevelGags(pos, true); } } } //============================================================================= // MissionScriptLoader::SetDynaLoadData //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetDynaLoadData( int argc, char** argv ) { if(argc == 3) { spInstance->mpMission->SetRestartDynaload( argv[ 1 ], argv[ 2 ] ); } else { spInstance->mpMission->SetRestartDynaload( argv[ 1 ] ); } } //============================================================================= // MissionScriptLoader::AddBonusObjective //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddBonusObjective( int argc, char** argv ) { rAssert( spInstance->mpMission ); #ifdef RAD_GAMECUBE HeapMgr()->PushHeap( GMA_GC_VMM ); #else HeapMgr()->PushHeap( GMA_LEVEL_MISSION ); #endif if ( strncmp("no_damage", argv[1], 9 ) == 0 ) { //This is a no damage type bonus objective; NoDamageBonusObjective* ndbo = new NoDamageBonusObjective(); rAssert( ndbo ); spInstance->mpMission->AddBonusObjective( ndbo ); } else if ( strncmp("no_harass", argv[1], 9 ) == 0 ) { //This is a no harass cars type bonus objective; NoCopBonusObjective* ncbo = new NoCopBonusObjective(); rAssert( ncbo ); spInstance->mpMission->AddBonusObjective( ncbo ); } else if ( strncmp("time", argv[1], 4 ) == 0 ) { //This is a minimum time remaining type bonus objective; TimeRemainBonusObjective* trbo = new TimeRemainBonusObjective(); rAssert( trbo ); trbo->SetTime( atoi(argv[2]) ); trbo->SetMission( spInstance->mpMission ); spInstance->mpMission->AddBonusObjective( trbo ); } else if ( strncmp("position", argv[1], 8 ) == 0 ) { //This is a minimum time remaining type bonus objective; RacePositionBonusObjective* rpbo = new RacePositionBonusObjective(); rAssert( rpbo ); rpbo->SetDesiredPosition( atoi(argv[2]) ); spInstance->mpMission->AddBonusObjective( rpbo ); } #ifdef RAD_GAMECUBE HeapMgr()->PopHeap( GMA_GC_VMM ); #else HeapMgr()->PopHeap( GMA_LEVEL_MISSION ); #endif } //============================================================================= // MissionScriptLoader::AddObjective //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddObjective( int argc, char** argv ) { // The AddObjective script command takes between 1 and 3 parameters // The first parameter is the objective type. // The 2nd depends is either the arrow type or , if it is a race, it could be "gamble" // If the 2nd parameter is gamble, the third is optionally the arrow type // Make the last parameter optionally be the directional arrow type // Default is BOTH, if it is not present DirectionalArrowEnum::TYPE darrowType; if ( GetDirectionalArrowType( argv[ argc - 1 ], &darrowType ) == false ) { darrowType = DirectionalArrowEnum::BOTH; } HeapMgr()->PushHeap( spInstance->mMissionHeap ); MEMTRACK_PUSH_GROUP( "Mission - Objectives" ); rAssert( spInstance->mpStage->GetObjective() == NULL ); rAssert( spInstance->mpObjective == NULL ); spInstance->mObjType = MissionObjective::OBJ_INVALID; bool found = false; for( unsigned int i = 0; i < MissionObjective::NUM_OBJECTIVES; i++ ) { if( strcmp( MissionObjectiveNames::Name[ i ], argv[ 1 ] ) == 0 ) { spInstance->mObjType = (MissionObjective::ObjectiveTypeEnum)( i ); found = true; break; } } rTuneAssertMsg( found, "This is not a valid Objective type" ); switch( spInstance->mObjType ) { case MissionObjective::OBJ_DELIVERY: { DeliveryObjective* pDel = new DeliveryObjective(); spInstance->mpObjective = pDel; break; } case MissionObjective::OBJ_GOTO: { GoToObjective* pGoto = new GoToObjective(); spInstance->mpObjective = pGoto; break; } case MissionObjective::OBJ_FOLLOW: { FollowObjective* pFollow = new FollowObjective(); spInstance->mpObjective = pFollow; break; } case MissionObjective::OBJ_RACE: { RaceObjective* pRace = new RaceObjective(); //Chuck: check if this race is a gamble race if(strcmp(argv[2],"gamble") ==0) { pRace->SetGambleRace(true); } spInstance->mpObjective = pRace; break; } case MissionObjective::OBJ_LOSETAIL: { LoseObjective* pLose = new LoseObjective(); spInstance->mpObjective = pLose; break; } case MissionObjective::OBJ_DESTROY: { DestroyObjective* pDestroy = new DestroyObjective(); spInstance->mpObjective = pDestroy; break; } case MissionObjective::OBJ_TALKTO: { TalkToObjective* pTalkTo = new TalkToObjective(); spInstance->mpObjective = pTalkTo; break; } case MissionObjective::OBJ_DIALOGUE: { DialogueObjective* pDialogue = new DialogueObjective(); spInstance->mpObjective = pDialogue; break; } case MissionObjective::OBJ_GETIN: { GetInObjective* pGetIn = new GetInObjective(); if(argc == 3) //added another param for strict getin { pGetIn->SetStrict(argv[2]); } spInstance->mpObjective = pGetIn; break; } case MissionObjective::OBJ_DUMP: { CollectDumpedObjective* pDump = new CollectDumpedObjective(); spInstance->mpObjective = pDump; break; } case MissionObjective::OBJ_FMV: { FMVObjective* fmvObjective = new FMVObjective(); spInstance->mpObjective = fmvObjective; break; } case MissionObjective::OBJ_INTERIOR: { InteriorObjective* intObjective = new InteriorObjective(); spInstance->mpObjective = intObjective; break; } case MissionObjective::OBJ_COIN: { CoinObjective* pCoinObjective = new CoinObjective(); spInstance->mpObjective = pCoinObjective; break; } case MissionObjective::OBJ_DESTROY_BOSS: { DestroyBossObjective* pObjective = new DestroyBossObjective(); spInstance->mpObjective = pObjective; break; } case MissionObjective::OBJ_LOAD_VEHICLE: { LoadVehicleObjective* objective = new LoadVehicleObjective(); spInstance->mpObjective = objective; break; } case MissionObjective::OBJ_PICKUP_ITEM: { PickupItemObjective* objective = new PickupItemObjective(); spInstance->mpObjective = objective; break; } case MissionObjective::OBJ_TIMER: { TimerObjective* pTimerObjective = new TimerObjective(); spInstance->mpObjective = pTimerObjective; break; } case MissionObjective::OBJ_BUY_CAR: { BuyCarObjective* bco = new BuyCarObjective(); spInstance->mpObjective = bco; rTuneAssertMsg( argc == 3, "You need to specify which car to buy for BuyCar Objectives\n"); if ( argc == 3 ) { bco->SetVehicleName( argv[2] ); } break; } case MissionObjective::OBJ_BUY_SKIN: { BuySkinObjective* bso = new BuySkinObjective(); spInstance->mpObjective = bso; rTuneAssertMsg( argc == 3, "You need to specify which skin to buy for BuSkinr Objectives\n"); if ( argc == 3 ) { bso->SetSkinName( argv[2] ); } break; } case MissionObjective::OBJ_GO_OUTSIDE: { GoOutsideObjective* pGoOutSide = new GoOutsideObjective(); spInstance->mpObjective = pGoOutSide; break; } default: { MissionObjective* objective = new MissionObjective(); spInstance->mpObjective = objective; break; } } //GetRoadManager()->SetDirectionalArrowType( darrowType ); rAssert( spInstance->mpObjective ); spInstance->mpObjective->SetDirectionalArrowType( &darrowType ); spInstance->mpObjective->SetObjectiveType( spInstance->mObjType ); spInstance->mpStage->SetObjective( spInstance->mpObjective ); MEMTRACK_POP_GROUP( "Mission - Objectives" ); HeapMgr()->PopHeap( spInstance->mMissionHeap ); } //============================================================================= // MissionScriptLoader::AddNPC //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddNPC( int argc, char** argv ) { HeapMgr()->PushHeap( GMA_LEVEL_MISSION ); //Find the locator named argv[ 2 ] spInstance->mpObjective->AddNPC( argv[ 1 ], argv[ 2 ], false ); if(spInstance->mFirstObjective) { GetCharacterManager()->PreloadCharacter(argv[1], "npd"); } HeapMgr()->PopHeap(GMA_LEVEL_MISSION); } //============================================================================= void MissionScriptLoader::AddDriver( int argc, char** argv ) { HeapMgr()->PushHeap( GMA_LEVEL_MISSION ); spInstance->mpObjective->AddNPC( argv[ 1 ], argv[ 2 ], true ); if(spInstance->mFirstObjective) { GetCharacterManager()->PreloadCharacter(argv[1], "npd"); } HeapMgr()->PopHeap(GMA_LEVEL_MISSION); } //============================================================================= void MissionScriptLoader::RemoveNPC( int argc, char** argv ) { HeapMgr()->PushHeap( GMA_LEVEL_MISSION ); //Find the locator named argv[ 2 ] spInstance->mpObjective->RemoveNPC( argv[ 1 ], false); HeapMgr()->PopHeap(GMA_LEVEL_MISSION); } //============================================================================= void MissionScriptLoader::RemoveDriver( int argc, char** argv ) { HeapMgr()->PushHeap( GMA_LEVEL_MISSION ); //Find the locator named argv[ 2 ] spInstance->mpObjective->RemoveNPC( argv[ 1 ], true); HeapMgr()->PopHeap(GMA_LEVEL_MISSION); } //============================================================================= // MissionScriptLoader::SetTalkToTarget //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetTalkToTarget( int argc, char** argv ) { if ( spInstance->mObjType != MissionObjective::OBJ_TALKTO ) { rDebugString( "Can only set talk to targets in talk to objectives\n" ); return; } TalkToObjective::IconType icon = TalkToObjective::EXCLAMATION; if ( argc > 2 ) { icon = static_cast(::atoi( argv[2] )); } float yOffset = 0.0f; if ( argc > 3 ) { yOffset = static_cast(::atof( argv[3] )); } float trigRad = 1.3f; if ( argc > 4 ) { trigRad = static_cast(::atof( argv[4] )); } reinterpret_cast(spInstance->mpObjective)->SetTalkToTarget( argv[1], icon, yOffset, trigRad ); } //============================================================================= // MissionScriptLoader::SetDialogueInfo //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetDialogueInfo( int argc, char** argv ) { if ( spInstance->mObjType != MissionObjective::OBJ_DIALOGUE ) { rDebugString( "Can only set dialoge settings in dialogue objectives!" ); return; } DialogueObjective* dialogObj = reinterpret_cast(spInstance->mpObjective); dialogObj->SetChar1Name( argv[1] ); dialogObj->SetChar2Name( argv[2] ); dialogObj->SetDialogueName( argv[3] ); } //============================================================================= // MissionScriptLoader::SetDialoguePositions //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetDialoguePositions( int argc, char** argv ) { if ( spInstance->mObjType != MissionObjective::OBJ_DIALOGUE ) { rDebugString( "Can only set dialoge settings in dialogue objectives!" ); return; } CarStartLocator* char1Pos = p3d::find( argv[1] ); #ifndef RAD_RELEASE if ( !char1Pos ) { char error[128]; sprintf( error, "Could not find %s for dialogue position\n", argv[1] ); rTuneAssertMsg( false, error ); } #endif CarStartLocator* char2Pos = p3d::find( argv[2] ); #ifndef RAD_RELEASE if ( !char2Pos ) { char error[128]; sprintf( error, "Could not find %s for dialogue position\n", argv[2] ); rTuneAssertMsg( false, error ); } #endif CarStartLocator* carPos = NULL; /*if ( argc >= 4 ) { //Also need a car start carPos = p3d::find( argv[3] ); #ifndef RAD_RELEASE if ( !carPos ) { char error[128]; sprintf( error, "Could not find %s for dialogue position\n", argv[3] ); rTuneAssertMsg( false, error ); } #endif }*/ bool dontReset = false; if ( argc >= 5 ) { dontReset = (atoi( argv[ 4 ] ) == 1); } static_cast(spInstance->mpObjective)->SetPositions( char1Pos, char2Pos, carPos, dontReset ); } //============================================================================= // MissionScriptLoader::SetRaceLaps //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetRaceLaps( int argc, char** argv ) { rAssert( spInstance->mObjType == MissionObjective::OBJ_RACE ); RaceObjective* ro = reinterpret_cast(spInstance->mpObjective); ro->SetNumLaps( atoi(argv[1] ) ); } //============================================================================= // MissionScriptLoader::BindCollectibleToWaypoint //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::BindCollectibleToWaypoint( int argc, char** argv ) { rAssert( spInstance->mObjType == MissionObjective::OBJ_DUMP ); CollectDumpedObjective* cdo = reinterpret_cast(spInstance->mpObjective); cdo->BindCollectibleToWaypoint( atoi( argv[1] ), atoi( argv[2] ) ); } //============================================================================= // MissionScriptLoader::AllowUserDump //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AllowUserDump( int argc, char** argv ) { rAssert( spInstance->mObjType == MissionObjective::OBJ_DUMP || spInstance->mObjType == MissionObjective::OBJ_DELIVERY ); static_cast(spInstance->mpObjective)->AllowUserDump(); } //============================================================================= // MissionScriptLoader::SetVehicleToLoad //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetVehicleToLoad( int argc, char** argv ) { rAssert( spInstance->mObjType == MissionObjective::OBJ_LOAD_VEHICLE ); LoadVehicleObjective* objective = static_cast< LoadVehicleObjective* >( spInstance->mpObjective ); const char* filename = argv[1]; const char* vehiclename = argv[2]; const char* locatorname = argv[3]; objective->SetFilename( filename ); objective->SetVehicleName( vehiclename ); objective->SetLocatorName( locatorname ); } //============================================================================= // MissionScriptLoader::CloseObjective //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::CloseObjective( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpObjective != NULL, "Objective already closed!\n" ); spInstance->mpObjective = NULL; spInstance->mObjType = MissionObjective::OBJ_INVALID; spInstance->mFirstObjective = false; } //============================================================================= // MissionScriptLoader::AddCollectible //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddCollectible( int argc, char** argv ) { bool bValid = spInstance->mObjType == MissionObjective::OBJ_DELIVERY || spInstance->mObjType == MissionObjective::OBJ_RACE || spInstance->mObjType == MissionObjective::OBJ_DUMP; rTuneAssertMsg( bValid, "The current objective cannot accept collectibles." ); rAssert( dynamic_cast( spInstance->mpObjective ) != NULL ); CollectibleObjective* pCol = static_cast( spInstance->mpObjective ); rAssert( pCol ); if ( argc == 2 ) { pCol->AddCollectibleLocatorName( argv[ 1 ], "", 0, 0, 0.0f ); } else if ( argc == 3 ) { pCol->AddCollectibleLocatorName( argv[ 1 ], argv[ 2 ], 0, 0, 0.0f ); } else if ( argc == 4 ) { pCol->AddCollectibleLocatorName( argv[ 1 ], argv[ 2 ], ::radMakeKey32( argv[ 3 ] ), 0, 0.0f ); } else if ( argc == 5 ) { pCol->AddCollectibleLocatorName( argv[ 1 ], argv[ 2 ], ::radMakeKey32( argv[ 3 ] ), tEntity::MakeUID( argv[ 4 ] ), 0.0f ); } else { pCol->AddCollectibleLocatorName( argv[ 1 ], argv[ 2 ], ::radMakeKey32( argv[ 3 ] ), tEntity::MakeUID( argv[ 4 ] ), static_cast(::atof( argv[ 5 ] )) ); } } //============================================================================= // MissionScriptLoader::AddCollectibleStateProp //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddCollectibleStateProp( int argc, char** argv ) { rmt::Vector position; const char* statepropName = argv[1]; const char* locatorName = argv[2]; int physID = atoi( argv[3] ); spInstance->mpMission->CreateStatePropCollectible( statepropName, locatorName, physID ); } //============================================================================= // MissionScriptLoader::SetCollectibleEffect //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetCollectibleEffect( int argc, char** argv ) { if ( spInstance->mpObjective->GetObjectiveType() == MissionObjective::OBJ_GOTO ) { GoToObjective* gto = static_cast( spInstance->mpObjective ); gto->SetCollectEffectName( argv[ 1 ] ); } else { rTuneAssertMsg( dynamic_cast< CollectibleObjective* >( spInstance->mpObjective ) != NULL, "The current objective cannot accept collectibles."); CollectibleObjective* pCol = static_cast( spInstance->mpObjective ); rAssert( pCol ); pCol->SetCollectEffectName( argv[ 1 ] ); } } //============================================================================= // MissionScriptLoader::SetDestination //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetDestination( int argc, char** argv ) { MissionObjective::ObjectiveTypeEnum type = spInstance->mObjType; switch( type ) { case MissionObjective::OBJ_GO_OUTSIDE: case MissionObjective::OBJ_GOTO: { GoToObjective* pObj = (GoToObjective*)(spInstance->mpObjective); //Test to see if there is no drawable, but a scale. if ( argc == 3 && static_cast(::atof( argv[ 2 ] )) != 0.0f ) { pObj->SetDestinationNames( argv[ 1 ], "", static_cast(::atof( argv[ 2 ] )) ); } else if ( argc == 3 ) { //There is no scale factor pObj->SetDestinationNames( argv[ 1 ], argv[ 2 ], 0.0f ); } else if ( argc == 4 ) { pObj->SetDestinationNames( argv[ 1 ], argv[ 2 ], static_cast(::atof( argv[ 3 ] )) ); } else { pObj->SetDestinationNames( argv[ 1 ], "", 0.0f ); } break; } case MissionObjective::OBJ_INTERIOR: { InteriorObjective* pObj = (InteriorObjective*)(spInstance->mpObjective); pObj->SetDestination(argv[1]); if ( argc >= 3 ) { pObj->SetIcon( argv[2] ); } } break; default: { // fook! rTuneAssertMsg( false, "The current objective cannot accept a destination." ); } } } //============================================================================= // MissionScriptLoader::TurnGotoDialogOff //============================================================================= // Description: Turn the arrival dialogue off for a goto objective // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::TurnGotoDialogOff( int argc, char** argv ) { rAssert( spInstance->mpObjective->GetObjectiveType() == MissionObjective::OBJ_GOTO || spInstance->mpObjective->GetObjectiveType() == MissionObjective::OBJ_GO_OUTSIDE ); static_cast(spInstance->mpObjective)->SetGotoDialogOff(); } //============================================================================= // MissionScriptLoader::MustActionTrigger //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::MustActionTrigger( int argc, char** argv ) { rAssertMsg( spInstance->mpObjective->GetObjectiveType() == MissionObjective::OBJ_GOTO, "MustActionTrigger can only be applied to GOTO objectives!\n" ); static_cast(spInstance->mpObjective)->SetMustActionTrigger(); } //============================================================================= // MissionScriptLoader::AddStageVehicle //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddStageVehicle( int argc, char** argv ) { MEMTRACK_PUSH_GROUP( "Mission - Stage Vehicle" ); char vehiclename[32]; char spawnname[32]; char ainame[32]; char confile[32]; strcpy( vehiclename, argv[ 1 ] ); strcpy( spawnname, argv[ 2 ] ); if(argc >= 4) { strcpy( ainame, argv[ 3 ] ); } else { // ever have this case? ainame[0] = 0; } rTuneAssertMsg( spInstance->mpMission != NULL, "No mission is selected\n" ); // new // greg // jan 7, 2003 // GameplayManager is now the owner of these vehilces // // mission stages can continue to reference them as before, but they do not own them // // I don't think there is any use in having a reference in the mission also Vehicle* vehicle = NULL; switch(argc) { case 4: { vehicle = GetGameplayManager()->AddMissionVehicle(vehiclename); } break; case 5: { strcpy(confile, argv[4]); vehicle = GetGameplayManager()->AddMissionVehicle(vehiclename, confile); // this method will return a pointer if the vehicle already exists in the list of mission cars, // or it will allocate a new one } break; case 6: { strcpy(confile, argv[4]); vehicle = GetGameplayManager()->AddMissionVehicle(vehiclename, confile, argv[5]); // this method will return a pointer if the vehicle already exists in the list of mission cars, // or it will allocate a new one } break; } rTuneAssertMsg( vehicle != NULL, "Could not find or create the requested vehicle\n" ); /* if(argc == 5) { strcpy(confile, argv[4]); vehicle = GetVehicleCentral()->InitVehicle( vehiclename, false, confile, VT_AI ); } else { vehicle = GetVehicleCentral()->InitVehicle( vehiclename, false, 0, VT_AI ); } */ //spInstance->mpMission->AddVehicle( vehicle ); // useless // now handled by VehicleCentral::AddVehicleToActiveList //GetRenderManager()->mpLayer(RenderEnums::LevelSlot)->AddGuts((tDrawable*)( vehicle ) ); CarStartLocator* locator = NULL; if( argc >= 3 && strlen( spawnname ) != 0 ) { locator = p3d::find( spawnname ); #ifndef FINAL char error [255]; sprintf(error,"AddStageVehicle: Could not find the requested Car Start locator %s\n",spawnname); rTuneAssertMsg( locator != NULL,error); #endif } rTuneAssertMsg( spInstance->mpStage != NULL, "No stage active\n" ); // new // greg // jan 9, 2003 // move the allocation of the vehicle AI into the MissionStage /* MEMTRACK_PUSH_GROUP( "Mission - AI " ); VehicleAI* pAI = NULL; if( argc >= 4 ) { if( strcmp( ainame, "chase") == 0 ) { pAI = new ChaseAI( vehicle ); } else if( strcmp( ainame, "waypoint" ) == 0 ) { pAI = new WaypointAI( vehicle ); } else if ( strcmp( ainame, "NULL" ) == 0 ) { pAI = NULL; } else { char buffy[64]; sprintf( buffy, "Unknown AI vehicle type: %s", argv[ 3 ] ); rTuneAssertMsg( false, buffy ); } } MEMTRACK_POP_GROUP(); */ int vehicleCentralIndex = GetGameplayManager()->GetMissionVehicleIndex(vehicle); //rAssert(vehicleCentralIndex != -1); //spInstance->mpStage->AddVehicle( vehicle, vehicleCentralIndex, locator, pAI ); spInstance->mpStage->AddVehicle( vehicle, vehicleCentralIndex, locator, ainame ); MEMTRACK_POP_GROUP( "Mission - Stage Vehicle" ); } //============================================================================= // MissionScriptLoader::MoveStageVehicle //============================================================================= // Description: Used to move a staged Vehicle from one location to another. This vehicle must have been // Initialized or the command to fail. and // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::MoveStageVehicle( int argc, char** argv ) { MEMTRACK_PUSH_GROUP( "Mission - Stage Vehicle" ); char vehiclename[32]; char spawnname[32]; char ainame[32]; strcpy( vehiclename, argv[ 1 ] ); strcpy( spawnname, argv[ 2 ] ); if(argc >= 4) { strcpy( ainame, argv[ 3 ] ); } else { // ever have this case? ainame[0] = 0; } rTuneAssertMsg( spInstance->mpMission != NULL, "No mission is selected\n" ); Vehicle* vehicle = NULL; vehicle = spInstance->GetVehicleByName(vehiclename); CarStartLocator* locator = NULL; if( argc >= 3 && strlen( spawnname ) != 0 ) { locator = p3d::find( spawnname ); rTuneAssertMsg( locator != NULL, "Could not find the requested Car Start locator\n" ); } rTuneAssertMsg( spInstance->mpStage != NULL, "No stage active\n" ); /* MEMTRACK_PUSH_GROUP( "Mission - AI " ); VehicleAI* pAI = NULL; if( argc >= 4 ) { if( strcmp( ainame, "chase") == 0 ) { pAI = new ChaseAI( vehicle ); } else if( strcmp( ainame, "waypoint" ) == 0 ) { pAI = new WaypointAI( vehicle ); } else if ( strcmp( ainame, "NULL" ) == 0 ) { pAI = NULL; } else { char buffy[64]; sprintf( buffy, "Unknown AI vehicle type: %s", argv[ 3 ] ); rTuneAssertMsg( false, buffy ); } } MEMTRACK_POP_GROUP(); */ int vehicleCentralIndex = GetGameplayManager()->GetMissionVehicleIndex(vehicle); rAssert(vehicleCentralIndex != -1); spInstance->mpStage->AddVehicle( vehicle, vehicleCentralIndex, locator, ainame ); MEMTRACK_POP_GROUP( "Mission - Stage Vehicle" ); GetGameplayManager()->PlaceVehicleAtLocator( vehicle, locator ); } //============================================================================= // MissionScriptLoader::ActivateVehicle //============================================================================= // Description: Used to give a staged Vehicle a new AI type . Call this on a vehicle that is idle. // This vehicle must have been Initialized via AddStageVehicle or the command to fail. // Parameters: ( int argc, char** argv ) vehicle,locator,AI // // Return: void // //============================================================================= void MissionScriptLoader::ActivateVehicle( int argc, char** argv ) { MEMTRACK_PUSH_GROUP( "Mission - Stage Vehicle" ); #if (RAD_TUNE||RAD_DEBUG) char errMsg[256]; #endif char vehiclename[32]; char spawnname[32]; char ainame[32]; strcpy( vehiclename, argv[ 1 ] ); strcpy( spawnname, argv[ 2 ] ); if(argc >= 4) { strcpy( ainame, argv[ 3 ] ); } else { // ever have this case? ainame[0] = 0; } rTuneAssertMsg( spInstance->mpMission != NULL, "No mission is selected\n" ); Vehicle* vehicle = NULL; vehicle = spInstance->GetVehicleByName(vehiclename); #if (RAD_TUNE||RAD_DEBUG) sprintf( errMsg, "ActivateVehicle: Cannot find vehicle called \"%s\"", vehiclename ); rTuneAssertMsg( vehicle, errMsg ); #endif if ( argc >= 5 ) { vehicle->SetDriverName( argv[4] ); } CarStartLocator* locator = NULL; if( argc >= 3 && strlen( spawnname ) != 0 ) { if (strcmp (spawnname,"NULL") == 0) { //do nothing } else { //get a ptr to the locator locator = p3d::find( spawnname ); #if (RAD_TUNE||RAD_DEBUG) sprintf( errMsg, "ActivateVehicle: Could not find the requested Car Start locator \"%s\"", spawnname ); rTuneAssertMsg( locator, errMsg ); #endif } } #if (RAD_TUNE||RAD_DEBUG) sprintf( errMsg, "ActivateVehicle: This command is invalid because no stage is active." ); rTuneAssertMsg( spInstance->mpStage, errMsg ); #endif /* MEMTRACK_PUSH_GROUP( "Mission - AI " ); VehicleAI* pAI = NULL; if( argc >= 4 ) { if( strcmp( ainame, "chase") == 0 ) { pAI = new ChaseAI( vehicle ); } else if( strcmp( ainame, "waypoint" ) == 0 ) { pAI = new WaypointAI( vehicle ); } else if ( strcmp( ainame, "NULL" ) == 0 ) { pAI = NULL; } else { char buffy[64]; sprintf( buffy, "Unknown AI vehicle type: %s", argv[ 3 ] ); rTuneAssertMsg( false, buffy ); } } MEMTRACK_POP_GROUP(); */ int vehicleCentralIndex = GetGameplayManager()->GetMissionVehicleIndex(vehicle); //rAssert(vehicleCentralIndex != -1); spInstance->mpStage->AddVehicle( vehicle, vehicleCentralIndex, locator, ainame ); MEMTRACK_POP_GROUP( "Mission - Stage Vehicle" ); } //============================================================================= // MissionScriptLoader::AddStageWaypoint //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddStageWaypoint( int argc, char** argv ) { Locator* locator = p3d::find( argv[ 1 ] ); rTuneAssertMsg( locator != NULL, "Could not find the requested waypoint locator\n" ); rTuneAssertMsg( spInstance->mpStage != NULL, "No stage active\n" ); spInstance->mpStage->AddWaypoint( locator ); } //============================================================================= // MissionScriptLoader::AddStageCharacter //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddStageCharacter( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpStage != NULL, "No stage active\n" ); /* // Characters not loaded until Gameplay Context starts // Character* character = GetCharacterManager()->GetCharacterByName( argv[ 1 ] ); rTuneAssertMsg( character != NULL, "Could not find the requested character\n" ); */ CarStartLocator* locator = NULL; if ( strcmp( argv[ 2 ], "" ) != 0 ) { locator = p3d::find( argv[ 2 ] ); rTuneAssertMsg( locator != NULL, "Could not find the requested car start locator\n" ); } CarStartLocator* carlocator = NULL; if ( argc >= 6 ) { carlocator = p3d::find( argv[ 5 ] ); rTuneAssertMsg( carlocator != NULL, "Could not find the requested car start locator\n" ); } const char* dynaloadString = argv[3]; Vehicle* vehicle = NULL; if( argc >= 5 ) { //chuck: we will use the overloader AddCharacter function. if(strcmp(argv[4],"current") ==0) { spInstance->mpStage->AddCharacter( argv[ 1 ], locator, carlocator, dynaloadString, argv[4] ); return; } vehicle = spInstance->GetVehicleByName( argv[ 4 ] ); rTuneAssertMsg( vehicle != NULL, "Could not find the requested vehicle\n" ); } //////////////////////////////////////////////////////////////////////////// // MS10: Hack to allow character to be selected. // char name[32]; // GetMissionManager()->GetOverrideCharacterName( name ); // spInstance->mpStage->AddCharacter( name, locator, dynaloadString, vehicle ); // // Put this back! // spInstance->mpStage->AddCharacter( argv[ 1 ], locator, carlocator, dynaloadString, vehicle ); // //////////////////////////////////////////////////////////////////////////// } //============================================================================= // MissionScriptLoader::AddStageMusicChange //============================================================================= // Description: Sets an indicator used by the music player to tell it that // we should change up the music and make it more dramatic for // this stage. // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddStageMusicChange( int argc, char** argv ) { spInstance->mpStage->SetMusicChangeFlag(); } //============================================================================= // MissionScriptLoader::SetStageMusicAlwaysOn //============================================================================= // Description: Sets an indicator for the music player to say that we should // continue playing music out of the car for this stage. // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetStageMusicAlwaysOn( int argc, char** argv ) { spInstance->mpStage->SetMusicAlwaysOnFlag(); } //============================================================================= // MissionScriptLoader::SetCompletionDialog //============================================================================= // Description: Sets the event name of a dialog line to play when stage // is completed // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetCompletionDialog( int argc, char** argv ) { spInstance->mpStage->SetDialogKey( ::radMakeKey32( argv[1] ) ); if( argc == 3 ) { spInstance->mpStage->SetConversationCharacterKey( tEntity::MakeUID( argv[2] ) ); } } //============================================================================= // MissionScriptLoader::SetStageStartMusicEvent //============================================================================= // Description: Sets the name of a music event to trigger when the current // stage begins // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetStageStartMusicEvent( int argc, char** argv ) { spInstance->mpStage->SetStageStartMusicEvent( ::radMakeCaseInsensitiveKey32( argv[1] ) ); } //============================================================================= // MissionScriptLoader::SetMusicState //============================================================================= // Description: Set a state in that funky radMusic matrix stuff // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetMusicState( int argc, char** argv ) { spInstance->mpStage->SetStageMusicState( ::radMakeCaseInsensitiveKey32( argv[1] ), ::radMakeCaseInsensitiveKey32( argv[2] ) ); } //============================================================================= // MissionScriptLoader::SetStageCamera //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetStageCamera( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpStage != NULL, "No stage active\n" ); if ( spInstance->mpStage == NULL ) { return; } bool cut = atoi( argv[2] ) == 1 ? true : false; bool qTrans = atoi( argv[3] ) == 1 ? true : false; if ( strcmp( argv[1], "follow" ) == 0 ) { //Set to follow cam spInstance->mpStage->SetCameraInfo( SuperCam::FOLLOW_CAM, cut, qTrans ); } else if ( strcmp( argv[1], "walker" ) == 0 ) { //Set to walker cam #ifdef RAD_WIN32 spInstance->mpStage->SetCameraInfo( SuperCam::ON_FOOT_CAM, cut, qTrans ); #else spInstance->mpStage->SetCameraInfo( SuperCam::WALKER_CAM, cut, qTrans ); #endif } else { rTuneAssertMsg( false, "Unsupported camera type set in script!" ); } } //============================================================================= // MissionScriptLoader::ResetToThisStage //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::ResetToThisStage( int argc, char** argv ) { int stagNum = spInstance->spInstance->mpMission->GetNumStages() - 1; spInstance->mpMission->SetResetToStage( stagNum ); } //============================================================================= // MissionScriptLoader::SetTrafficDensity //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetTrafficDensity( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpStage != NULL, "No stage active\n" ); if ( spInstance->mpStage == NULL ) { return; } spInstance->mpStage->SetTrafficDensity( static_cast(atoi(argv[1])) ); } //============================================================================= // MissionScriptLoader::AddCondition //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddCondition( int argc, char** argv ) { HeapMgr()->PushHeap( spInstance->mMissionHeap ); MEMTRACK_PUSH_GROUP( "Mission - Conditions" ); rAssert( spInstance->mpCondition == NULL ); spInstance->mCondType = MissionCondition::COND_INVALID; for( unsigned int i = 0; i < MissionCondition::NUM_CONDITIONS; i++ ) { if( strcmp( MissionConditionNames::Name[ i ], argv[ 1 ] ) == 0 ) { spInstance->mCondType = (MissionCondition::ConditionTypeEnum)( i ); break; } } rTuneAssertMsg( spInstance->mCondType != MissionCondition::COND_INVALID, "This is not a valid Condition type\n" ); switch( spInstance->mCondType ) { case MissionCondition::COND_FOLLOW_DISTANCE: { FollowCondition* pCond = new FollowCondition(); spInstance->mpCondition = pCond; break; } case MissionCondition::COND_TIME_OUT: { TimeOutCondition* pCond = new TimeOutCondition(); spInstance->mpCondition = pCond; break; } case MissionCondition::COND_RACE: { RaceCondition* pCond = new RaceCondition(); spInstance->mpCondition = pCond; break; } case MissionCondition::COND_OUT_OF_BOUNDS: { OutOfBoundsCondition* pCond = new OutOfBoundsCondition(); spInstance->mpCondition = pCond; break; } case MissionCondition::COND_VEHICLE_DAMAGE: { DamageCondition* pCond = new DamageCondition(); spInstance->mpCondition = pCond; break; } case MissionCondition::COND_LEAVE_INTERIOR: { LeaveInteriorCondition* lic = new LeaveInteriorCondition(); spInstance->mpCondition = lic; break; } case MissionCondition::COND_POSITION: { PositionCondition* pc = new PositionCondition(); spInstance->mpCondition = pc; break; } case MissionCondition::COND_CARRYING_STATEPROP_COLLECTIBLE: { VehicleCarryingStateProp* vcsp = new VehicleCarryingStateProp(); spInstance->mpCondition = vcsp; if ( argc > 2 ) { // grab the collectible name, if specified const char* collectiblename = argv[2]; vcsp->SetDesiredProp( collectiblename ); } break; } case MissionCondition::COND_PLAYER_OUT_OF_VEHICLE: { GetOutOfCarCondition* goocc = new GetOutOfCarCondition(); spInstance->mpCondition = goocc; break; } case MissionCondition::COND_NOT_ABDUCTED: { NotAbductedCondition* condition = new NotAbductedCondition(); spInstance->mpCondition = condition; break; } case MissionCondition::COND_KEEP_BARREL: { KeepBarrelCondition* kbc = new KeepBarrelCondition(); spInstance->mpCondition = kbc; if ( argc == 3 ) { kbc->JumpBackBy( atoi( argv[2] ) ); } break; } default: { rTuneAssertMsg( false, "Unknown Condition type\n" ); break; } } rAssert( spInstance->mpCondition != NULL ); unsigned int num = spInstance->mpStage->GetNumConditions(); spInstance->mpStage->SetCondition( num, spInstance->mpCondition ); spInstance->mpStage->SetNumConditions( num + 1 ); MEMTRACK_POP_GROUP( "Mission - Conditions" ); HeapMgr()->PopHeap( spInstance->mMissionHeap ); } //============================================================================= // MissionScriptLoader::CloseCondition //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::CloseCondition( int argc, char** argv ) { spInstance->mpCondition = NULL; spInstance->mCondType = MissionCondition::COND_INVALID; } //============================================================================= // MissionScriptLoader::AmbientAnimationRandomize //============================================================================= // Description: should the animations for a particular character be randomized // or not? // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AmbientAnimationRandomize( int argc, char** argv ) { rAssert( argc == 3 ); int characterNumber = atoi( argv[ 1 ] ); int randomInt = atoi( argv[ 2 ] ); bool random = ( randomInt != 0 ); spInstance->mpStage->AmbientCharacterAnimationSetRandom( characterNumber, random ); } //============================================================================= // MissionScriptLoader::ClearAmbientAnimations //============================================================================= // Description: adds an ambient animation to be played during conversations // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::ClearAmbientAnimations( int argc, char** argv ) { rAssert( argc == 2 ); char* bonusMissionName = argv[ 1 ]; const int index = GetGameplayManager()->GetMissionNumByName( bonusMissionName ) - GameplayManager::MAX_MISSIONS; //the bonus missions come after the regular missions rAssert( index >= 0 ); BonusMissionInfo* bmi = GetGameplayManager()->GetBonusMissionInfo( index ); rAssert( bmi != NULL ); bmi->ClearAmbientAnimations(); } //============================================================================= // MissionScriptLoader::AddAmbientNpcAnimation //============================================================================= // Description: adds an ambient animation to be played during conversations // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddAmbientNpcAnimation( int argc, char** argv ) { if( argc == 2 ) { spInstance->mpStage->AddAmbientCharacterAnimation( 1, argv[ 1 ] ); } else { rAssert( argc == 3 ); char* bonusMissionName = argv[ 2 ]; const int index = GetGameplayManager()->GetMissionNumByName( bonusMissionName ) - GameplayManager::MAX_MISSIONS; //the bonus missions come after the regular missions rAssert( index >= 0 ); BonusMissionInfo* bmi = GetGameplayManager()->GetBonusMissionInfo( index ); rAssert( bmi != NULL ); bmi->AddAmbientCharacterAnimation( 1, argv[ 1 ] ); } } //============================================================================= // MissionScriptLoader::AddAmbientPcAnimation //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddAmbientPcAnimation( int argc, char** argv ) { if( argc == 2 ) { HeapMgr()->PushHeap( GMA_TEMP ); spInstance->mpStage->AddAmbientCharacterAnimation( 0, argv[ 1 ] ); HeapMgr()->PopHeap(GMA_TEMP); } else { rAssert( argc == 3 ); char* bonusMissionName = argv[ 2 ]; const int index = GetGameplayManager()->GetMissionNumByName( bonusMissionName ) - GameplayManager::MAX_MISSIONS; //the bonus missions come after the regular missions rAssert( index >= 0 ); BonusMissionInfo* bmi = GetGameplayManager()->GetBonusMissionInfo( index ); rAssert( bmi != NULL ); bmi->AddAmbientCharacterAnimation( 0, argv[ 1 ] ); } } //============================================================================= // MissionScriptLoader::SetCamBestSide //============================================================================= // Description: Sets the best side locator name for the conversation cameras // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetCamBestSide( int argc, char** argv ) { char* name = argv[ 1 ]; if( argc == 2 ) { spInstance->mpStage->SetBestSideLocator( name ); } else { rAssert( argc == 3 ); char* bonusMissionName = argv[ 2 ]; const int index = GetGameplayManager()->GetMissionNumByName( bonusMissionName ) - GameplayManager::MAX_MISSIONS; //the bonus missions come after the regular missions rAssert( index >= 0 ); BonusMissionInfo* bmi = GetGameplayManager()->GetBonusMissionInfo( index ); rAssert( bmi != NULL ); bmi->SetBestSideLocator( name ); } } //============================================================================= // MissionScriptLoader::SetConversationCamName //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetConversationCamName( int argc, char** argv ) { HeapMgr()->PushHeap( GMA_TEMP ); spInstance->mpStage->SetConversationCamName( argv[ 1 ] ); HeapMgr()->PopHeap( GMA_TEMP ); } //============================================================================= // MissionScriptLoader::SetConversationCamPcName //============================================================================= // Description: sets up the conversation camera used when the PC is talking // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetConversationCamPcName( int argc, char** argv ) { HeapMgr()->PushHeap( GMA_TEMP ); spInstance->mpStage->SetConversationCamPcName( argv[ 1 ] ); HeapMgr()->PopHeap( GMA_TEMP ); } //============================================================================= // MissionScriptLoader::SetConversationCamNpcName //============================================================================= // Description: sets up the conversation camera used when the NPC is talking // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetConversationCamNpcName( int argc, char** argv ) { HeapMgr()->PushHeap( GMA_TEMP ); spInstance->mpStage->SetConversationCamNpcName( argv[ 1 ] ); HeapMgr()->PopHeap( GMA_TEMP ); } //============================================================================= // MissionScriptLoader::SetConversationCam //============================================================================= // Description: sets the conversation camera for a particular line of dialog // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetConversationCam( int argc, char** argv ) { HeapMgr()->PushHeap( GMA_TEMP ); int lineOfDialog = atoi( argv[ 1 ] ); tName name = argv[ 2 ]; if( argc == 3 ) { spInstance->mpStage->SetCameraForDialogLine( lineOfDialog, name ); } else { rAssert( argc == 4 ); char* bonusMissionName = argv[ 3 ]; const int index = GetGameplayManager()->GetMissionNumByName( bonusMissionName ) - GameplayManager::MAX_MISSIONS; //the bonus missions come after the regular missions rAssert( index >= 0 ); BonusMissionInfo* bmi = GetGameplayManager()->GetBonusMissionInfo( index ); rAssert( bmi != NULL ); bmi->SetCameraForDialogLine( lineOfDialog, name ); } HeapMgr()->PopHeap( GMA_TEMP ); } //============================================================================= // MissionScriptLoader::SetConversationCamAngle //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetConversationCamAngle( int argc, char** argv ) { rAssert( argc == 2 ); const char* cameraName = argv[ 1 ]; float camAngle = static_cast< float >( ::atof( argv[ 2 ] ) ); } //============================================================================= // MissionScriptLoader::SetConversationCamDistance //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetConversationCamDistance( int argc, char** argv ) { rAssert( argc == 3 ); const char* cameraName = argv[ 1 ]; float camDistance = static_cast< float >( ::atof( argv[ 2 ] ) ); ConversationCam::SetCameraDistanceByName( cameraName, camDistance ); } //============================================================================= // MissionScriptLoader::SetConversationCamDistance //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetPresentationBitmap( int argc, char** argv ) { bool changeRequired = !CGuiScreenMissionLoad::IsCurrentBitmap( argv[ 1 ] ); if( changeRequired ) { CGuiScreenMissionLoad::SetBitmapName( argv[ 1 ] ); CGuiScreenMissionLoad::ReplaceBitmap(); } } //============================================================================= // MissionScriptLoader::SetAnimatedCameraMulticontrollerName //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetAnimatedCameraMulticontrollerName( int argc, char** argv ) { rAssert( argc > 1 ); AnimatedCam::SetMulticontroller( argv[ 1 ] ); } //============================================================================= // MissionScriptLoader::SetAnimatedCameraName //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetAnimatedCameraName( int argc, char** argv ) { rAssert( argc > 1 ); AnimatedCam::ClearCamera(); AnimatedCam::SetCamera( argv[ 1 ] ); } //============================================================================= // MissionScriptLoader::SetMissionStartMulticontrollerName //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetMissionStartMulticontrollerName( int argc, char** argv ) { rAssert( argc > 1 ); AnimatedCam::SetMissionStartMulticontroller( argv[ 1 ] ); } //============================================================================= // MissionScriptLoader::SetMissionStartCameraName //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetMissionStartCameraName ( int argc, char** argv ) { rAssert( argc > 1 ); AnimatedCam::SetMissionStartCamera( argv[ 1 ] ); } //============================================================================= // MissionScriptLoader::SetPlayerCarName //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetPlayerCarName( int argc, char** argv ) { GetSSM()->SetVehicle( ::atoi(argv[1]), argv[2] ); } /*============================================================================= Description: Plays a FMV, usually after a mission. Note that it causes the HUD to be un/reloaded. =============================================================================*/ void MissionScriptLoader::SetFMVInfo( int argc, char** argv ) { rAssert( argc > 1 ); if ( spInstance->mObjType != MissionObjective::OBJ_FMV ) { rDebugString( "Can only set FMV information in fmv objectives!" ); return; } FMVObjective* fmvObj = reinterpret_cast(spInstance->mpObjective); fmvObj->SetFileName( argv[ 1 ] ); if( argc > 2 ) { fmvObj->SetMusicStop(); } } //============================================================================= // MissionScriptLoader::CharacterIsChild //============================================================================= // Description: marks a specific character as a child character - camera // will be set lower in this case // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::CharacterIsChild( int argc, char** argv ) { rAssert( argc > 1 ); AnimatedCam::SetMulticontroller( argv[ 1 ] ); } //============================================================================= // MissionScriptLoader::SetFollowDistances //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetFollowDistances( int argc, char** argv ) { rAssert( spInstance->mpCondition != NULL ); switch( spInstance->mCondType ) { case MissionCondition::COND_FOLLOW_DISTANCE: { FollowCondition* pCond = (FollowCondition*)(spInstance->mpCondition); float dist; dist = static_cast( atoi( argv[ 1 ] )); pCond->SetMinDistance( dist ); dist = static_cast( atoi( argv[ 2 ] )); pCond->SetMaxDistance( dist ); break; } default: { // fook! rTuneAssertMsg( false, "The current Condition cannot accept a follow distance\n" ); } } } //============================================================================= // MissionScriptLoader::SetCondMinHealth //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetCondMinHealth( int argc, char** argv ) { rAssert( spInstance->mpCondition != NULL ); switch( spInstance->mCondType ) { case MissionCondition::COND_VEHICLE_DAMAGE: { DamageCondition* pCond = (DamageCondition*)(spInstance->mpCondition); float damage = static_cast( atoi( argv[ 1 ] )); pCond->SetMinValue( damage ); break; } default: { // fook! rTuneAssertMsg( false, "The current Condition cannot accept a min health value\n" ); } } } //============================================================================= // MissionScriptLoader::SetConditionPosition //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetConditionPosition( int argc, char** argv ) { rAssert( spInstance->mpCondition != NULL ); rAssert( spInstance->mCondType == MissionCondition::COND_POSITION ); PositionCondition* pc = static_cast(spInstance->mpCondition); pc->SetRequiredPosition( atoi(argv[1] ) ); } //============================================================================= // MissionScriptLoader::SetCondTime //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetCondTime( int argc, char** argv ) { rAssert( spInstance->mpCondition->GetType() == MissionCondition::COND_PLAYER_OUT_OF_VEHICLE ); GetOutOfCarCondition* goocc = static_cast(spInstance->mpCondition); goocc->SetTime( static_cast(::atoi( argv[1] )) ); } //============================================================================= // MissionScriptLoader::SetHitNRun //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetHitNRun( int argc, char** argv ) { rAssert( spInstance->mpCondition->GetType() == MissionCondition::COND_TIME_OUT ); TimeOutCondition* toc = static_cast(spInstance->mpCondition); //toc->SetHitNRun(); } //============================================================================= // MissionScriptLoader::SetObjTargetVehicle //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetObjTargetVehicle( int argc, char** argv ) { rAssert( spInstance->mpObjective != NULL ); Vehicle* vehicle = NULL; if (strcmp("current",argv[1]) ==0) { vehicle = GetGameplayManager()->GetCurrentVehicle(); } else { vehicle = spInstance->GetVehicleByName( argv[ 1 ] ); } rTuneAssertMsg( vehicle != NULL, "Could not find the requested target vehicle\n" ); switch( spInstance->mObjType ) { case MissionObjective::OBJ_FOLLOW: { FollowObjective* pObj = (FollowObjective*)(spInstance->mpObjective); pObj->SetTargetVehicle( vehicle ); break; } case MissionObjective::OBJ_LOSETAIL: { LoseObjective* pObj = (LoseObjective*)(spInstance->mpObjective); pObj->SetTargetVehicle( vehicle ); break; } case MissionObjective::OBJ_DESTROY: { DestroyObjective* pObj = (DestroyObjective*)(spInstance->mpObjective); pObj->SetTargetVehicle( vehicle ); break; } case MissionObjective::OBJ_GETIN: { // GetInObjective* pObj = (GetInObjective*)(spInstance->mpObjective); // pObj->SetTargetVehicle( vehicle ); break; } case MissionObjective::OBJ_DUMP: { CollectDumpedObjective* pObj = (CollectDumpedObjective*)(spInstance->mpObjective); pObj->SetDumpVehicle( vehicle ); break; } default: { // fook! rTuneAssertMsg( false, "The current objective cannot accept a target vehicle\n" ); } } } //============================================================================= // MissionScriptLoader::SetObjTargetBoss //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetObjTargetBoss( int argc, char** argv ) { rAssert( spInstance->mpObjective != NULL ); // Only supporting destroying right now rAssert( spInstance->mObjType == MissionObjective::OBJ_DESTROY_BOSS ); rAssert( dynamic_cast< DestroyBossObjective* >( spInstance->mpObjective ) != NULL ); DestroyBossObjective* pObj = (DestroyBossObjective*)(spInstance->mpObjective); // Ok, we are looking for a boss, which means UFO, which means // actormanager const char* bossName = argv[1]; Actor* actor = GetActorManager()->GetActorByName( bossName ); pObj->SetTarget( actor ); } //============================================================================= // MissionScriptLoader::SetPickupTarget //============================================================================= // Description: Set an object that the user must pickup in his vehicle // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetPickupTarget( int argc, char** argv ) { rAssert( spInstance->mObjType == MissionObjective::OBJ_PICKUP_ITEM ); rAssert( dynamic_cast< PickupItemObjective* >( spInstance->mpObjective ) != NULL ); PickupItemObjective* pObj = (PickupItemObjective*)(spInstance->mpObjective); const char* targetname = argv[1]; pObj->SetTarget( targetname ); } //============================================================================= // MissionScriptLoader::AllowRockOut //============================================================================= // Description: The PC character will rock out during this objective //============================================================================= void MissionScriptLoader::AllowRockOut( int argc, char** argv ) { spInstance->mpObjective->SetRockOut(true); } //============================================================================= // MissionScriptLoader::SetObjDistance //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetObjDistance( int argc, char** argv ) { rAssert( spInstance->mpObjective != NULL ); switch( spInstance->mObjType ) { case MissionObjective::OBJ_LOSETAIL: { LoseObjective* pObj = (LoseObjective*)(spInstance->mpObjective); float dist = static_cast( atoi( argv[ 1 ] )); pObj->SetDistance( dist ); break; } default: { // fook! rTuneAssertMsg( false, "The current objective cannot accept a distance\n" ); } } } //============================================================================= // MissionScriptLoader::SetCondTargetVehicle //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetCondTargetVehicle( int argc, char** argv ) { rAssert( spInstance->mpCondition != NULL ); Vehicle* vehicle = NULL; if ( strncmp( argv[ 1 ], "current", 7 ) == 0 ) { vehicle = GetGameplayManager()->GetCurrentVehicle(); } else { vehicle = spInstance->GetVehicleByName( argv[ 1 ] ); } rTuneAssertMsg( vehicle != NULL, "Could not find the requested target vehicle\n" ); switch( spInstance->mCondType ) { case MissionCondition::COND_FOLLOW_DISTANCE: case MissionCondition::COND_RACE: case MissionCondition::COND_VEHICLE_DAMAGE: { VehicleCondition* pCond = (VehicleCondition*)(spInstance->mpCondition); pCond->SetVehicle( vehicle ); break; } default: { // fook! rTuneAssertMsg( false, "The current Condition cannot accept a target vehicle\n" ); } } } //============================================================================= // MissionScriptLoader::AddStage //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddStage( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpStage == NULL, "No stage active\n" ); HeapMgr()->PushHeap( spInstance->mMissionHeap ); MEMTRACK_PUSH_GROUP( "Mission - Stages" ); if ( argc <= 3 ) //This should only be "final" and/or some number or nothing. { //This is a standard spInstance->mpStage = new MissionStage(); for( int i = 1; i < argc; i++ ) { if( strcmp(argv[ i ], "final") == 0 ) { spInstance->mpStage->SetFinalStage(true); break; } } int index = spInstance->mpMission->GetNumStages(); spInstance->mpMission->SetNumStages( index + 1 ); spInstance->mpMission->SetStage( index, spInstance->mpStage ); spInstance->mpObjective = NULL; spInstance->mpCondition = NULL; } else if ( argc == 4 || argc == 7 ) { //This is a new type of add stage that allows for locked stages. unsigned int num = 0; unsigned int i; for ( i = 1; i < (MAX_LOCK_REQUIREMENTS * 3) + 1; i = i + 3 ) { if ( strcmp(argv[i], "locked") == 0 ) { //This is a locked stage. rAssert( strcmp(argv[i + 1], "skin") == 0 || strcmp(argv[i + 1], "car") == 0 ); MissionStage::LockRequirement::Type type = MissionStage::LockRequirement::NONE; if ( strcmp(argv[i + 1], "skin") == 0 ) { type = MissionStage::LockRequirement::SKIN; } else if ( strcmp(argv[i + 1], "car") == 0 ) { type = MissionStage::LockRequirement::CAR; } else { rTuneAssertMsg(false, "Invalid use of locked stage type\n"); } if ( type != MissionStage::LockRequirement::NONE ) { if ( spInstance->mpStage == NULL ) { spInstance->mpStage = new MissionStage(); int index = spInstance->mpMission->GetNumStages(); spInstance->mpMission->SetNumStages( index + 1 ); spInstance->mpMission->SetStage( index, spInstance->mpStage ); spInstance->mpObjective = NULL; spInstance->mpCondition = NULL; } spInstance->mpStage->SetLockRequirement( num, type, argv[i + 2] ); ++num; } } } } else { rTuneAssertMsg( false, "Incorrect format of AddStage script command. Get Cary\n" ); } MEMTRACK_POP_GROUP( "Mission - Stages" ); HeapMgr()->PopHeap(spInstance->mMissionHeap); } //============================================================================= // MissionScriptLoader::SetStageMessageIndex //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetStageMessageIndex( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpStage != NULL, "No stage active\n" ); int index = atoi( argv[ 1 ] ); spInstance->mpStage->SetStartMessageIndex( index ); } //============================================================================= // MissionScriptLoader::SetStageTime //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetStageTime( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpStage != NULL, "No stage active\n" ); int factor = GetCheatInputSystem()->IsCheatEnabled(CHEAT_ID_EXTRA_TIME) ? 5 : 1; spInstance->mpStage->SetStageTime( MissionStage::STAGETIME_SET, atoi( argv[ 1 ] ) * factor); } //============================================================================= // MissionScriptLoader::AddStageTime //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddStageTime( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpStage != NULL, "No stage active\n" ); int factor = GetCheatInputSystem()->IsCheatEnabled(CHEAT_ID_EXTRA_TIME) ? 5 : 1; spInstance->mpStage->SetStageTime( MissionStage::STAGETIME_ADD, atoi( argv[ 1 ] ) * factor); } //============================================================================= // MissionScriptLoader::ShowStageComplete //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::ShowStageComplete( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpStage != NULL, "No stage active\n" ); spInstance->mpStage->ShowStageComplete( true ); } //============================================================================= // MissionScriptLoader::SetHUDIcon //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetHUDIcon( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpStage != NULL, "No stage active\n" ); spInstance->mpStage->SetHUDIcon( argv[ 1 ] ); } //============================================================================= // MissionScriptLoader::SetIrisWipe //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetIrisWipe( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpStage != NULL, "No stage active\n" ); spInstance->mpStage->SetIrisAtEnd(); } //============================================================================= // MissionScriptLoader::SetFadeOut //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetFadeOut( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpStage != NULL, "No stage active\n" ); spInstance->mpStage->SetFadeOutAtEnd(); } //============================================================================= // MissionScriptLoader::CloseStage //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::CloseStage( int argc, char** argv ) { rTuneAssertMsg( spInstance->mpStage != NULL, "Stage already closed!\n" ); spInstance->mpStage = NULL; } void MissionScriptLoader::SetVehicleAIParams( int argc, char** argv ) { #if (RAD_TUNE || RAD_DEBUG) char errMsg[256]; #endif rTuneAssertMsg( argc == 4, "Bad number of args for this command!\n" "SYNTAX: SetVehicleAIParams( vehiclename, minshortcutskill, maxshortcutskill )" ); // parse the args char vehiclename[32]; strcpy( vehiclename, argv[1] ); MissionStage::AIParams params; params.minShortcutSkill = atoi( argv[2] ); params.maxShortcutSkill = atoi( argv[3] ); rAssert( spInstance ); Vehicle* vehicle = spInstance->GetVehicleByName( vehiclename ); #if (RAD_TUNE||RAD_DEBUG) sprintf( errMsg, "SetVehicleAIParams: Cannot find vehicle called \"%s\"", vehiclename ); rTuneAssertMsg( vehicle, errMsg ); #endif #if (RAD_TUNE||RAD_DEBUG) sprintf( errMsg, "SetVehicleAIParams: This command is invalid because no stage is active." ); rTuneAssertMsg( spInstance->mpStage, errMsg ); #endif spInstance->mpStage->SetAIParams( vehicle, params ); } //============================================================================= // MissionScriptLoader::SetBonusMissionStart //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetBonusMissionStart( int argc, char** argv ) { rAssert( spInstance->mpStage ); spInstance->mpStage->MakeBonusObjectiveStart(); } //============================================================================= // MissionScriptLoader::GetLocator //============================================================================= // Description: Comment // // Parameters: ( char* name ) // // Return: EventLocator // //============================================================================= Locator* MissionScriptLoader::GetLocator( char* name ) { Locator* locator = p3d::find( name ); rTuneAssertMsg( locator != NULL, "Could not find the requested locator\n" ); return( locator ); } //============================================================================= // MissionScriptLoader::GetVehicleOfName //============================================================================= // Description: Comment // // Parameters: ( char* name ) // // Return: Vehicle // //============================================================================= Vehicle* MissionScriptLoader::GetVehicleByName( const char* name ) { // change this to look through GameplayManagers list: Vehicle* vehicle = GetGameplayManager()->GetMissionVehicleByName(name); if(vehicle == NULL) { // also look through the 'user' cars... vehicle = GetGameplayManager()->GetUserVehicleByName(name); } rTuneAssertMsg(vehicle, "missionscriptloader: can't find vehicle by name\n"); return vehicle; /* if( spInstance->mpMission != NULL ) { vehicle = spInstance->mpMission->GetVehicleByName( name ); } if( vehicle == NULL ) { for( int i = 0; i < GetVehicleCentral()->GetMaxActiveVehicles(); i++ ) //for( int i = 0; i < GetVehicleCentral()->GetNumVehicles(); i++ ) { Vehicle* v = GetVehicleCentral()->GetVehicle( i ); if( v == NULL ) { continue; } if( strcmp( v->GetName(), name ) == 0 ) { vehicle = v; break; } } } return vehicle; */ } //============================================================================= // MissionScriptLoader::GetDirectionalArrowType //============================================================================= // Description: Returns enumeration based upon string fetched from a mission script // // Parameters: const char* input string name. Ptr to output enumeration type // // Return: bool indicating whether or not the arrow is of a valid type // //============================================================================= bool MissionScriptLoader::GetDirectionalArrowType( const char* string, DirectionalArrowEnum::TYPE* outArrowType ) { if ( string == NULL ) return false; bool validType = true; if ( strcmp( string, "BOTH") == 0 || strcmp( string, "both" ) == 0 || strcmp( string, "b" ) == 0 ) { *outArrowType = DirectionalArrowEnum::BOTH; } else if ( strcmp( string, "NEITHER") == 0 || strcmp( string, "neither" ) == 0 || strcmp( string, "n" ) == 0 ) { *outArrowType = DirectionalArrowEnum::NEITHER; } else if ( strcmp( string, "INTERSECTION") == 0 || strcmp( string, "intersection" ) == 0 || strcmp( string, "i" ) == 0 ) { *outArrowType = DirectionalArrowEnum::INTERSECTION; } else if ( strcmp( string, "nearest road" ) == 0 || strcmp( string, "NEAREST ROAD" ) == 0 || strcmp( string, "n" ) == 0 ) { *outArrowType = DirectionalArrowEnum::NEAREST_ROAD; } else { validType = false; } return validType; } //============================================================================= // MissionScriptLoader::LoadP3DFile //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::LoadP3DFile( int argc, char** argv ) { #ifdef MEMORYTRACKER_ENABLED char name[256]; sprintf( name, "Mission - Load: %s", argv[1] ); #else char* name = ""; #endif // HACK HACK HACK : ignore loads ona bunch of stuff that we know we have preloaded if((strcmp(argv[ 1 ], "art\\phonecamera.p3d") == 0) || (strcmp(argv[ 1 ], "art\\cards.p3d") == 0) || (strcmp(argv[ 1 ], "art\\wrench.p3d") == 0) || (strcmp(argv[ 1 ], "art\\missions\\generic\\missgen.p3d") == 0) || (strcmp(argv[ 1 ], "art\\cars\\common.p3d") == 0) || (strcmp(argv[ 1 ], "art\\cars\\huskA.p3d") == 0)) { return; } GameMemoryAllocator heap = GMA_LEVEL_MISSION; // // tName allocates string space for the life of this function, // so direct it to the temp heap // HeapMgr()->PushHeap( GMA_TEMP ); tName heapName = argv[2]; HeapMgr()->PopHeap( GMA_TEMP ); if ( argc > 2 ) { // 2nd argument is the heap, switch upon it if ( heapName == "GMA_DEFAULT" ) heap = GMA_DEFAULT; else if ( heapName == "GMA_TEMP" ) heap = GMA_TEMP; #ifdef RAD_GAMECUBE else if ( heapName == "GMA_GC_VMM" ) heap = GMA_GC_VMM; #endif else if ( heapName == "GMA_PERSISTENT" ) heap = GMA_PERSISTENT; else if ( heapName == "GMA_LEVEL" ) { rAssert( false ); heap = GMA_LEVEL; } else if ( heapName == "GMA_LEVEL_MOVIE" ) heap = GMA_LEVEL_MOVIE; else if ( heapName == "GMA_LEVEL_FE" ) heap = GMA_LEVEL_FE; else if ( heapName == "GMA_LEVEL_ZONE" ) heap = GMA_LEVEL_ZONE; else if ( heapName == "GMA_LEVEL_OTHER" ) heap = GMA_LEVEL_OTHER; else if ( heapName == "GMA_LEVEL_HUD" ) heap = GMA_LEVEL_HUD; else if ( heapName == "GMA_LEVEL_MISSION" ) heap = GMA_LEVEL_MISSION; else if ( heapName == "GMA_LEVEL_AUDIO" ) heap = GMA_LEVEL_AUDIO; else if ( heapName == "GMA_DEBUG" ) heap = GMA_DEBUG; else if ( heapName == "GMA_SPECIAL" ) heap = GMA_SPECIAL; #ifdef RAD_XBOX else if ( heapName == "GMA_XBOX_SOUND_MEMORY" ) heap = GMA_XBOX_SOUND_MEMORY; #endif else { // unrecognized heapName! rTuneAssertMsg( false, "Mission Script LoadP3DFile not given a valid heap!" ); } } if ( argc == 4 ) { GetLoadingManager()->AddRequest( spInstance->mFileHandler, argv[ 1 ], heap, argv[ 3 ], argv[ 1 ], 0, name ); } else { GetLoadingManager()->AddRequest( spInstance->mFileHandler, argv[ 1 ], heap, 0, name ); } } //============================================================================= // MissionScriptLoader::LoadDisposableCar //============================================================================= // Description: Use this to load any vehicle that may get unloaded during a level gameplay session, // ie player car,ai car, forced car into its own iventory section. // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::LoadDisposableCar( int argc, char** argv ) { if (strcmp (argv[3],"DEFAULT")== 0) { //loading a default vehicle if ( GetGameplayManager()->mVehicleSlots[GameplayManager::eDefaultCar].mp_vehicle !=NULL ) { //problem designer wants to load a default car when one has already be specified in the script previously rAssert(0); } else { //load pure3d car into the inventory under its filename GetLoadingManager()->AddRequest( spInstance->mFileHandler, argv[ 1 ], GMA_LEVEL_MISSION, argv[1], "Default" ); strcpy(GetGameplayManager()->mVehicleSlots[GameplayManager::eDefaultCar].filename,argv[1]); strcpy(GetGameplayManager()->mVehicleSlots[GameplayManager::eDefaultCar].name,argv[2]); } } else if (strcmp (argv[3],"OTHER") == 0) { if( strcmp(GetGameplayManager()->mVehicleSlots[GameplayManager::eOtherCar].name,argv[2]) ==0) { rTuneAssertMsg(0, "why are you doing this - see greg \n"); //we are trying to load a car that already exists,so do nothing } else { //clear player default car GetGameplayManager()->DumpCurrentCar(); GetGameplayManager()->ClearVehicleSlot(GameplayManager::eOtherCar); //TO DO dump Phone booth car if the player is using it. if ( GetGameplayManager()->mVehicleSlots[GameplayManager::eOtherCar].mp_vehicle !=NULL ) { //problem default vehicle already defined time to unload it and load another in its place. #ifndef FINAL printf("other vehicle already in inventory, time to dispose of car \n"); #endif rTuneAssertMsg(0, "this is concerning to me - see greg \n"); //clear the inventory of old car GetGameplayManager()->ClearVehicleSlot(GameplayManager::eOtherCar); //clear player default car GetGameplayManager()->ClearVehicleSlot(GameplayManager::eDefaultCar); //TO DO dump Phone booth car if the player is using it. strcpy(GetGameplayManager()->GetVehicleSlotFilename(GameplayManager::eOtherCar),argv[1]); strcpy(GetGameplayManager()->GetVehicleSlotFilename(GameplayManager::eOtherCar),argv[2]); //load pure3d car into the inventory under its filename GetLoadingManager()->AddRequest( spInstance->mFileHandler, argv[ 1 ], GMA_LEVEL_MISSION, argv[1], "Default" ); } else { strcpy(GetGameplayManager()->mVehicleSlots[GameplayManager::eOtherCar].filename,argv[1]); strcpy(GetGameplayManager()->mVehicleSlots[GameplayManager::eOtherCar].name,argv[2]); //load pure3d car into the inventory under its filename GetLoadingManager()->AddRequest( spInstance->mFileHandler, argv[ 1 ], GMA_LEVEL_MISSION, argv[1], "Default" ); } } } else if (strcmp(argv[3],"AI")== 0) { //loading an AI car GetGameplayManager()->ClearVehicleSlot(GameplayManager::eAICar); strcpy(GetGameplayManager()->mVehicleSlots[GameplayManager::eAICar].filename,argv[1]); strcpy(GetGameplayManager()->mVehicleSlots[GameplayManager::eAICar].name,argv[2]); //load pure3d car into the inventory under its filename //TODO: change GMA_LEVEL_MISSION to GMA_LEVEL_HUD if we deicide to unload cars for FMV GetLoadingManager()->AddRequest( spInstance->mFileHandler, argv[ 1 ], GMA_LEVEL_MISSION, argv[1], "Default" ); } else if (strcmp(argv[3],"CHASE")==0) { //copy the filename for this chase car into the car data struct for the chasemanager //will come in handy when we unload it. strcpy(GetGameplayManager()->m_ChaseManager_Array[0].hostvehiclefilename,argv[1]); GetLoadingManager()->AddRequest(spInstance->mFileHandler,argv[1],GMA_LEVEL_MISSION,"level_chase",argv[1]); } else { //loading unknown flag rAssert (0); } } /* ============================================================================== MissionScriptLoader::AddCharacter ============================================================================== Description: Comment Parameters: (int argc, char** argv ) Return: void ============================================================================= */ void MissionScriptLoader::AddCharacter(int argc, char** argv ) { rAssert( argc == 3 ); GetCharacterManager( )->AddPCCharacter( argv[ 1 ], argv[ 2 ] ); } //============================================================================= // MissionScriptLoader::AddNPCCharacterBonusMission //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddNPCCharacterBonusMission( int argc, char** argv ) { char uniqueName[16]; sprintf(uniqueName, "b_%s", argv[1]); Character* c = GetCharacterManager()->AddCharacterDeferedLoad( CharacterManager::NPC, uniqueName, argv[1], argv[2], argv[3] ); c->AddToWorldScene(); c->SetRole(Character::ROLE_ACTIVE_BONUS); if ( !GetGameplayManager()->mIsDemo ) { bool isRace = atoi(argv[7]) == 1; // Try and retrieve the mission record const MissionRecord* missionRecord = GetCharacterSheetManager()->QueryStreetRaceStatus( GetGameplayManager()->GetCurrentLevelIndex(), argv[4] ); if ( missionRecord == NULL ) GetCharacterSheetManager()->QueryBonusMissionStatus( GetGameplayManager()->GetCurrentLevelIndex(), argv[4] ); // Mission record is valid // See if this bonus mission or street race has already been done bool wasMissionAlreadyCompleted; if ( missionRecord != NULL ) { wasMissionAlreadyCompleted = missionRecord->mCompleted; } else { wasMissionAlreadyCompleted = false; } if ( argc == 8 ) { GetGameplayManager()->SetBonusMissionInfo( uniqueName, argv[4], argv[5], argv[6], isRace, NULL, wasMissionAlreadyCompleted ); } else if ( argc > 8 ) { GetGameplayManager()->SetBonusMissionInfo( uniqueName, argv[4], argv[5], argv[6], isRace, argv[8], wasMissionAlreadyCompleted ); } } } //============================================================================= // MissionScriptLoader::SetBonusMissionDialoguePositions //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetBonusMissionDialoguePositions( int argc, char** argv ) { if ( GetGameplayManager()->mIsDemo ) { return; } int missionNum = GetGameplayManager()->GetMissionNumByName( argv[1] ); rTuneAssertMsg( missionNum != -1, "Trying to set character positions on non-existant mission\n" ); rTuneAssertMsg( missionNum >= GameplayManager::MAX_MISSIONS, "Trying to set bonus mission positions on regular mission\n"); if ( missionNum != -1 && missionNum >= GameplayManager::MAX_MISSIONS ) { CarStartLocator* char1Pos = p3d::find( argv[2] ); #ifndef RAD_RELEASE if ( !char1Pos ) { char error[128]; sprintf( error, "Could not find %s for dialogue position\n", argv[2] ); rTuneAssertMsg( false, error ); } #endif CarStartLocator* char2Pos = p3d::find( argv[3] ); #ifndef RAD_RELEASE if ( !char2Pos ) { char error[128]; sprintf( error, "Could not find %s for dialogue position\n", argv[3] ); rTuneAssertMsg( false, error ); } #endif CarStartLocator* carPos = NULL; if ( argc >= 5 ) { //Also need a car start carPos = p3d::find( argv[4] ); #ifndef RAD_RELEASE if ( !carPos ) { char error[128]; sprintf( error, "Could not find %s for dialogue position\n", argv[4] ); rTuneAssertMsg( false, error ); } #endif } BonusMissionInfo* bmi = GetGameplayManager()->GetBonusMissionInfo( missionNum - GameplayManager::MAX_MISSIONS ); bmi->SetPositions( char1Pos, char2Pos, carPos ); } } //============================================================================= // MissionScriptLoader::AddAmbientCharacter //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddAmbientCharacter( int argc, char** argv ) { Locator* loc = p3d::find( argv[2] ); if(!loc) { char error[256]; sprintf( error, "Can not find locator: %s, Designer Error!!!!\n", argv[2] ); MissionScriptLoader::TreeOfWoeErrorMsg(error); rTuneAssertMsg(0, error ); } Character* c = GetCharacterManager()->AddCharacterDeferedLoad( CharacterManager::NPC, argv[1], argv[1], "npd", argv[2] ); c->SetAmbient(argv[2], (argc == 4) ? (float)atof(argv[3]) : 1.3f); c->AddToWorldScene(); } void MissionScriptLoader::AddBonusMissionNPCWaypoint( int argc, char** argv ) { // Check syntax: commandname, NPCname, locatorname rTuneAssertMsg( argc == 3, "AddBonusMissionNPCWaypoint takes 2 args: NPCName, locatorName" ); // grab the two arguments rTuneAssert( argv[1] ); const char* locName = argv[2]; rTuneAssert( locName ); // Bonus mission characters have "b_" prefix... so prepend it before // calling CharacterManager::GetCharacterByName. char npcName[64]; sprintf( npcName, "b_%s", argv[1] ); bool succeeded = AddNPCWaypoint( npcName, locName ); rTuneAssertMsg( succeeded, "Failed adding waypoint for a Bonus Mission NPC" ); } void MissionScriptLoader::AddObjectiveNPCWaypoint( int argc, char** argv ) { #if (RAD_TUNE || RAD_DEBUG) char errMsg[ 256 ]; #endif // Check syntax: commandname, NPCname, locatorname rTuneAssertMsg( argc == 3, "AddObjectiveNPCWaypoint takes 2 args: NPCName, locatorName" ); // grab the two arguments const char* npcName = argv[1]; rTuneAssert( npcName ); const char* locName = argv[2]; rTuneAssert( locName ); // First look for the locator Locator* loc = p3d::find< Locator >( locName ); if( loc == NULL ) { #if (RAD_TUNE || RAD_DEBUG) sprintf( errMsg, "Couldn't find locator %s for NPC %s", locName, npcName ); rTuneAssertMsg( false, errMsg ); #endif return; } rmt::Vector locPos; loc->GetPosition( &locPos ); // Now, look for the character // see if we have an objective.. if so, we search through the objective first // to update its mNPCs member MissionScriptLoader* msl = GetInstance(); rAssert( msl ); if( msl->mpObjective ) { bool foundInObjective = msl->mpObjective->AddNPCWaypoint( npcName, locName ); // if we couldn't add it to the objective or if the NPC does not exist in the // objective, we search for it in Character manager... if( !foundInObjective ) { #if (RAD_TUNE || RAD_DEBUG) sprintf( errMsg, "Waypoint at locator %s could not be " "added for mission objective NPC %s", locName, npcName ); rTuneAssertMsg( false, errMsg ); #endif return; } } else { // objective doesn't exist... But this is an objective NPC!! #if (RAD_TUNE || RAD_DEBUG) sprintf( errMsg, "Mission Objective undefined before calling this command!" ); rTuneAssertMsg( false, errMsg ); #endif return; } } bool MissionScriptLoader::AddNPCWaypoint( const char* npcName, const char* locName ) { #if (RAD_TUNE || RAD_DEBUG) char errMsg[256]; #endif // First look for the locator Locator* loc = p3d::find< Locator >( locName ); if( loc == NULL ) { #if (RAD_TUNE || RAD_DEBUG) sprintf( errMsg, "Couldn't find locator %s for NPC %s", locName, npcName ); rTuneAssertMsg( false, errMsg ); #endif return false; } rmt::Vector locPos; loc->GetPosition( &locPos ); // Now, look for the character in CharacterManager Character* character = GetCharacterManager()->GetCharacterByName( npcName ); if( character == NULL ) { #if (RAD_TUNE || RAD_DEBUG) sprintf( errMsg, "NPC %s does not exist in character manager", npcName ); rTuneAssertMsg( false, errMsg ); #endif return false; } // Better make sure it is also an NPC rAssert( character->IsNPC() ); NPCharacter* npc = (NPCharacter*) character; // Make sure the controller exists (gets created in NPC constructor) NPCController* npcController = (NPCController*) npc->GetController(); rAssert( npcController ); bool succeeded = npcController->AddNPCWaypoint( locPos ); if( !succeeded ) { #if (RAD_TUNE || RAD_DEBUG) sprintf( errMsg, "Could not add waypoint at %s for NPC %s", locName, npcName ); rTuneAssertMsg( false, errMsg ); #endif return false; } return true; } void MissionScriptLoader::AddPurchaseCarNPCWaypoint( int argc, char** argv ) { // Check syntax: commandname, NPCname, locatorname rTuneAssertMsg( argc == 3, "AddPurchaseCarNPCWaypoint takes 2 args: NPCName, locatorName" ); // grab the two arguments rTuneAssert( argv[1] ); const char* locName = argv[2]; rTuneAssert( locName ); // Purchase car NPCs are named differently char npcName[64]; sprintf( npcName, "reward_%s", argv[1] ); bool succeeded = AddNPCWaypoint( npcName, locName ); rTuneAssertMsg( succeeded, "Failed to add waypoint for Purchase Car Reward NPC." ); } void MissionScriptLoader::AddAmbientNPCWaypoint( int argc, char** argv ) { // Check syntax: commandname, NPCname, locatorname rTuneAssertMsg( argc == 3, "AddAmbientNPCWaypoint takes 2 args: NPCName, locatorName" ); // grab the two arguments const char* npcName = argv[1]; rTuneAssert( npcName ); const char* locName = argv[2]; rTuneAssert( locName ); bool succeeded = AddNPCWaypoint( npcName, locName ); rTuneAssertMsg( succeeded, "Failed to add waypoint for Ambient NPC." ); } //============================================================================= // MissionScriptLoader::ActivateTrigger //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::ActivateTrigger( int argc, char** argv ) { Locator* loc; loc = p3d::find( argv[1] ); rAssert( loc ); loc->SetFlag( Locator::ACTIVE, true ); } //============================================================================= // MissionScriptLoader::DeactivateTrigger //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::DeactivateTrigger( int argc, char** argv ) { Locator* loc; loc = p3d::find( argv[1] ); rAssert( loc ); loc->SetFlag( Locator::ACTIVE, false ); } /* //============================================================================= // MissionScriptLoader::InitAIVehicle //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::InitAIVehicle( int argc, char** argv ) { char locator[16], vehicleName[16], aitype[16]; strcpy( vehicleName, argv[ 1 ]); strcpy( aitype, argv[ 2 ]); strcpy( locator, argv[ 3 ]); Vehicle* vehicle = GetVehicleCentral()->InitVehicle( vehicleName, false ); GetGameplayManager()->PlaceAtLocatorName( vehicle, locator ); GetRenderManager()->mpLayer(RenderEnums::LevelSlot)->AddGuts((tDrawable*)( vehicle ) ); VehicleAI* pAI; if( strcmp( aitype, "follow") == 0 ) { pAI = new ChaseAI( vehicle ); ((ChaseAI*)pAI)->SetTarget( GetVehicleCentral()->GetVehicle( 0 ) ); } else if( strcmp( aitype, "waypoint" ) == 0 ) { pAI = new WaypointAI( vehicle ); } else { char buffy[64]; sprintf( buffy, "Unknown AI vehicle type: %s", aitype ); rTuneAssertMsg( false, buffy ); } GetVehicleCentral()->SetVehicleController( GetVehicleCentral()->GetVehicleId( vehicle ), pAI ); pAI->Initialize(); spInstance->mpCurrentVehicleAI = pAI; } //============================================================================= // MissionScriptLoader::AddAIWaypoint //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddAIWaypoint( int argc, char** argv ) { rAssert( spInstance->mpCurrentVehicleAI ); Locator* loc = p3d::find( argv[1] ); rAssert( loc ); WaypointAI* wpAI = dynamic_cast( spInstance->mpCurrentVehicleAI ); rTuneAssertMsg( wpAI != NULL, "This is not a waypoint following vehicle AI\n" ); wpAI->AddWaypoint( loc ); } */ /* ============================================================================== MissionScriptLoader::CreateAnimPhysObject ============================================================================== Description: Comment Parameters: ( int argc, char** argv ) Return: void ============================================================================= */ void MissionScriptLoader::CreateAnimPhysObject( int argc, char** argv ) { // No longer neccessary; loading being done uniformly now. // You have been assimilated. rTuneAssertMsg( false, "No longer neccessary; loading being done uniformly now. You have been assimilated.\n" ); } void MissionScriptLoader::CreateActionEventTrigger( int argc, char** argv ) { //const char* triggerName, rmt::Vector& pos, float r ); rmt::Vector pos; pos.x = static_cast( atoi( argv[ 2 ] ) ); pos.y = static_cast( atoi( argv[ 3 ] ) ); pos.z = static_cast( atoi( argv[ 4 ] ) ); float r = static_cast( atoi( argv[ 5 ] ) ); GetActionButtonManager()->CreateActionEventTrigger( argv[1], pos, r ); } void MissionScriptLoader::LinkActionToObjectJoint( int argc, char** argv ) { //const char* objectName, const char* jointName, const char* triggerName, const char* typeName, const char* buttonName ); GetActionButtonManager()->LinkActionToObjectJoint( argv[1], argv[2], argv[3], argv[4], argv[5] ); } void MissionScriptLoader::LinkActionToObject( int argc, char** argv ) { //const char* objectName, const char* triggerName, const char* typeName, const char* buttonName = (const char*)0 ); GetActionButtonManager()->LinkActionToObject( argv[1], argv[2], argv[3], argv[4], argv[5], false ); } void MissionScriptLoader::SetCoinDrawable( int argc, char** argv ) { rAssert( argc >= 1 ); tDrawable* coinDrawable = p3d::find( argv[ 1 ] ); GetCoinManager()->SetCoinDrawable( coinDrawable ); } void MissionScriptLoader::SetParticleTexture( int argc, char** argv ) { tTexture* t = p3d::find( argv[ 2 ] ); int i = atoi( argv[ 1 ] ); GetSparkleManager()->SetTexture( i, t ); } //adds a safezone to a stage void MissionScriptLoader::AddSafeZone(int argc, char** argv) { Locator* locator = NULL; locator=p3d::find (argv[1]) ; int radius =10; radius= atoi(argv[2]); rAssert( dynamic_cast< CarStartLocator* > (locator ) != NULL ); CarStartLocator* carstartlocator = static_cast < CarStartLocator*>(locator); rAssert(carstartlocator); rTuneAssertMsg( spInstance->mpStage != NULL, "This Command: AddSafeZone needs to be in a stage \n" ); spInstance->mpStage->AddSafeZone(carstartlocator,radius); } //create a new ped group void MissionScriptLoader::CreatePedGroup(int argc,char** argv) { rAssert(argc == 2); int groupid = atoi(argv[1]); GetMissionScriptLoader()->mp_ModelGroup = new PedestrianManager::ModelGroup; GetMissionScriptLoader()->mPedGroupID = groupid; GetMissionScriptLoader()->mp_ModelGroup->numModels =0; } void MissionScriptLoader::AddPed(int argc,char** argv) { //if you asserted here then the wrong number of arguements have been passed rAssert(argc == 3); //check if group is full, if its full then dont add the ped if (spInstance->mp_ModelGroup->numModels == PedestrianManager::MAX_MODELS) { //you asserted here cause your adding too many peds to a group. rTuneAssert(0); } else { char name [64]; int max_number; strncpy(name,argv[1],64); name[63]='\0'; max_number = atoi(argv[2]); spInstance->mp_ModelGroup->models[spInstance->mp_ModelGroup->numModels].Init(name,max_number); spInstance->mp_ModelGroup->numModels++; } } //Closes a ped grp. void MissionScriptLoader::ClosePedGroup(int argc, char** argv) { if (spInstance->mp_ModelGroup->numModels == 0 ) { //if your asserted here, then the group has no peds, smack the designer. rTuneAssert(0); } PedestrianManager::GetInstance()->SetModelGroup(spInstance->mPedGroupID, *(spInstance->mp_ModelGroup)); spInstance->mPedGroupID = -1; delete spInstance->mp_ModelGroup; spInstance->mp_ModelGroup =NULL; } void MissionScriptLoader::UsePedGroup( int argc, char** argv ) { rTuneAssert(argc == 2); int groupId = atoi(argv[1]); rTuneAssertMsg( 0 <= groupId && groupId < PedestrianManager::MAX_MODEL_GROUPS, "Invalid groupId" ); spInstance->mpMission->SetInitPedGroup( groupId ); } void MissionScriptLoader::BindReward (int argc,char** argv) { char name [16]; char filename [64]; int level =0; Reward::eQuestType qtype = Reward::eBlank; Reward::eRewardType rtype = Reward::eNULL; //Arguement check //rTuneAssertMsg((argc >= 6 && argc <= 8) ,"Incorrect Number of Arguements passed \n"); strncpy (name,argv[1],16); name[15] = '\0'; strncpy (filename,argv[2],64); filename[63] = '\0'; level =atoi (argv[5]); //decrement level since all the internal arrays for levels are 0-6, F#@King level enums!! level--; //check for the reward type if ( strcmp (argv[3],"skin") ==0) { rtype = Reward::ALT_SKIN_OTHER; } else if (strcmp (argv[3],"car") ==0) { rtype = Reward::ALT_PLAYERCAR; } else if (strcmp (argv[3],"fe_toy") ==0) { rtype = Reward::FE_TOY; } else { rTuneAssertMsg(0,"ERROR: Unknown Reward type! \n"); } bool isMerchandise = false; //check for quest type if (strcmp (argv[4],"streetrace") ==0) { qtype = Reward::eStreetRace; } else if (strcmp (argv[4],"bonusmission") ==0) { qtype =Reward::eBonusMission; } else if (strcmp (argv[4],"cards") ==0) { qtype = Reward::eCards; } else if (strcmp (argv[4],"goldcards") ==0) { qtype = Reward::eGoldCards; } else if (strcmp (argv[4],"forsale") ==0) { isMerchandise = true; } else if (strcmp (argv[4],"defaultcar") == 0) { qtype = Reward::eDefaultCar; } else if (strcmp (argv[4],"defaultskin") == 0) { qtype = Reward::eDefaultSkin; } else { printf("ERROR: Unknown Quest type %s !\n",argv[4]); } if( isMerchandise ) { rTuneAssertMsg( argc == 8, "Invalid number of arguments!" ); int cost = atoi(argv[6]); Merchandise::eSellerType sellerType = Merchandise::INVALID_SELLER_TYPE; if( strcmp( argv[ 7 ], "interior" ) == 0 ) { sellerType = Merchandise::SELLER_INTERIOR; } else if( strcmp( argv[ 7 ], "simpson" ) == 0 ) { sellerType = Merchandise::SELLER_SIMPSON; } else if( strcmp( argv[ 7 ], "gil" ) == 0 ) { sellerType = Merchandise::SELLER_GIL; } else { rTuneAssertMsg( false, "Invalid seller type!" ); } GetRewardsManager()->AddMerchandise(name,filename,rtype,level,cost,sellerType); } else { //update the RewardsManager GetRewardsManager()->BindReward(name,filename,rtype,qtype,level); } }//end of Bind Reward //use to set the cars attributes displayed in the phone booth interface void MissionScriptLoader::SetCarAttributes(int argc,char** argv) { char CarName [16] = "NULL"; //check the correct number of parameters rTuneAssertMsg (argc == 6,"Incorrect number of parameter for the Set Car Attribute\n"); //check the name length if(strlen(argv[1]) >16) { rTuneAssertMsg(0,"Name is too long \n"); } strncpy(CarName,argv[1],16); CarName[15]='\0'; float speed = static_cast( atof(argv[2]) ); float acceleration = static_cast( atof(argv[3]) ); float toughness= static_cast( atof(argv[4]) ); float stability = static_cast( atof(argv[5]) ); GetRewardsManager()->SetCarAttributes(CarName,speed,acceleration,toughness,stability); } //============================================================================= // MissionScriptLoader::SetTotalGags //============================================================================= // Description: // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetTotalGags(int argc,char ** argv) { rAssert( argc >= 2 ); int level = atoi( argv[ 1 ] ) - 1; int numGags = atoi( argv[ 2 ] ); GetRewardsManager()->SetTotalGags( level, numGags ); } //============================================================================= // MissionScriptLoader::SetTotalWasps //============================================================================= // Description: // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetTotalWasps(int argc,char ** argv) { rAssert( argc >= 2 ); int level = atoi( argv[ 1 ] ) - 1; int numWasps = atoi( argv[ 2 ] ); GetRewardsManager()->SetTotalWasps( level, numWasps ); } //create a new traffic group void MissionScriptLoader::CreateTrafficGroup(int argc,char** argv) { rAssert(argc == 2); int groupid = atoi(argv[1]); spInstance->mp_TrafficGroup=TrafficManager::GetInstance()->GetTrafficModelGroup(groupid); rTuneAssert(spInstance->mp_TrafficGroup); spInstance->mp_TrafficGroup->ClearGroup(); } void MissionScriptLoader::AddTrafficModel(int argc,char** argv) { //check if group is full, if its full then dont add the ped { char name [64]; int max_number; strncpy(name,argv[1],64); name[63]='\0'; max_number = atoi(argv[2]); spInstance->mp_TrafficGroup->AddTrafficModel(name,max_number); } if ((GetGameFlow()->GetCurrentContext () == CONTEXT_GAMEPLAY) || (GetGameFlow()->GetCurrentContext () == CONTEXT_LOADING_GAMEPLAY)) { bool isBig = false; if ( argc == 4 ) { isBig = (atoi( argv[3] ) == 1); } if ( !isBig ) { //Add this to the Parked Car Manager GetPCM().AddCarType( argv[1] ); } } } //Closes a traffic grp. void MissionScriptLoader::CloseTrafficGroup(int argc, char** argv) { spInstance->mp_TrafficGroup =NULL; } //setting the respawn vaules inside the respawn manager void MissionScriptLoader::SetRespawnRate(int argc,char ** argv) { int seconds =0; seconds = atoi(argv[2]); char item[32]; strncpy(item,argv[1],32); item[31] ='\0'; seconds = seconds * 1000; //change seconds into milliseconds if (strcmp(item,"wrench") == 0) { GetGameplayManager()->GetRespawnManager()->SetWrenchRespawnTime(seconds); } else if (strcmp(item,"nitro")==0) { GetGameplayManager()->GetRespawnManager()->SetNitroRespawnTime(seconds); } else if (strcmp(item,"wasp")==0) { GetGameplayManager()->GetRespawnManager()->SetWaspRespawnTime(seconds); } else { rReleasePrintf("Unknown %s item type \n",item); } } //============================================================================= // MissionScriptLoader::EnableTutorialMode //============================================================================= // Description: Triggers the tutorial mode to be enabled // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::EnableTutorialMode(int argc,char ** argv) { int enableInt = atoi( argv[ 1 ] ); bool enable = ( enableInt != 0 ); #ifdef RAD_WIN32 if( !GetInputManager()->GetController(0)->IsTutorialDisabled() ) { #endif TutorialManager::GetInstance()->EnableTutorialMode( enable ); #ifdef RAD_WIN32 } #endif } //============================================================================= // MissionScriptLoader::StartCountdown //============================================================================= // Description: starts the 321go countdown // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::StartCountdown(int argc,char ** argv) { tUID secondUID; if( argc == 3 ) { secondUID = tEntity::MakeUID( argv[2] ); } else { secondUID = 0; } spInstance->mpStage->SetCountdownEnabled( radMakeKey32( argv[ 1 ] ), secondUID ); } //============================================================================= // MissionScriptLoader::AddToCountdownSequence //============================================================================= // Description: // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::AddToCountdownSequence(int argc,char ** argv) { if( argc > 2 ) { spInstance->mpStage->AddCountdownSequenceUnit( argv[ 1 ], atoi( argv[ 2 ] ) ); } else { spInstance->mpStage->AddCountdownSequenceUnit( argv[ 1 ] ); } } //============================================================================= // MissionScriptLoader::SetCarStartCamera //============================================================================= // Description: this is the camera that will be used when a car is loaded from // a phone booth // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::SetCarStartCamera( int argc, char** argv ) { } //============================================================================= // MissionScriptLoader::GoToPattyAndSelmaScreenWhenDone //============================================================================= // Description: should we trigger the patty and selma screen when we're done // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::GoToPattyAndSelmaScreenWhenDone( int argc, char** argv ) { spInstance->mpStage->GoToPattyAndSelmaScreenWhenDone(); } //============================================================================= // MissionScriptLoader::StreetRacePropsLoad //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::StreetRacePropsLoad( int argc, char** argv ) { spInstance->mpMission->LoadStreetRaceProps( argv[ 1 ] ); } //============================================================================= // MissionScriptLoader::StreetRacePropsUnload //============================================================================= // Description: Comment // // Parameters: ( int argc, char** argv ) // // Return: void // //============================================================================= void MissionScriptLoader::StreetRacePropsUnload( int argc, char** argv ) { spInstance->mpMission->UnloadStreetRaceProps( argv[ 1 ] ); } void MissionScriptLoader::UseElapsedTime(int argc,char** argv) { rTuneAssertMsg( spInstance->mpStage != NULL, "This Command: UseElapsedTime needs to be in a stage \n" ); spInstance->mpStage->UseElapsedTime(); } void MissionScriptLoader::AttachStatePropCollectible(int argc,char** argv) { HeapMgr()->PushHeap( GMA_LEVEL_MISSION ); // Create a new statepropcollectible and attach it to the current // player vehicle const char* vehicleName = argv[1]; const char* statepropName = argv[2]; rAssert( spInstance != NULL ); spInstance->mpMission->AttachStatePropCollectible( statepropName, vehicleName, 2 ); HeapMgr()->PopHeap( GMA_LEVEL_MISSION ); } void MissionScriptLoader::ShowHUD(int argc,char** argv) { bool isShowHUD = ( strcmp( argv[ 1 ], "false" ) != 0 ); rAssert( spInstance != NULL && spInstance->mpMission != NULL ); spInstance->mpMission->ShowHUD( isShowHUD ); } void MissionScriptLoader::SetNumValidFailureHints( int argc, char** argv ) { rAssert( spInstance != NULL && spInstance->mpMission != NULL ); spInstance->mpMission->SetNumValidFailureHints( atoi( argv[ 1 ] ) ); } //used to set the ParTime for Gamble Missions ONLY!!!! void MissionScriptLoader::SetParTime(int argc,char** argv) { int i =0; //first check that this we have a race objective first if (spInstance->mObjType == MissionObjective::OBJ_RACE) { RaceObjective* pRaceObjective = dynamic_cast (spInstance->mpObjective); //check if its a gamble race if (pRaceObjective->QueryIsGambleRace() == true) { pRaceObjective->SetParTime(atoi(argv[1])); } else { rTuneAssertMsg(0,"ERROR: You CANNOT set a par time for a NON GAMBLE Race Objective!!!!\n"); } } else { rTuneAssertMsg(0,"ERROR: You CANNOT set a par time for a NON RACE Objective!!!!\n"); } } //Sets The entery fee for a stage. void MissionScriptLoader::SetRaceEnteryFee(int argc, char** argv) { int enteryfee = -1; enteryfee=atoi(argv[1]); if(enteryfee < 0 ) { rTuneAssertMsg(0,"ERROR: Entery Fee MUST be at least GREATER than 1 coin, Double Check your Script!!\n"); } else { spInstance->mpStage->SetRaceEnteryFee(enteryfee); } } //Set the Coins Fee Required to Pass a Coin Objective void MissionScriptLoader::SetCoinFee(int argc,char** argv) { int coinfee=0; coinfee=atoi(argv[1]); if (coinfee < 0) { rTuneAssertMsg(0,"ERROR: Entery Fee MUST be at least GREATER than 1 coin, Double Check your Script!!\n"); } else { if ( spInstance->mObjType == MissionObjective::OBJ_COIN) { CoinObjective* pCoinObjective = dynamic_cast (spInstance->mpObjective); rAssert(pCoinObjective); pCoinObjective->SetCoinFee(coinfee); } } } //Force the MF player in their car on mission stage start void MissionScriptLoader::PutMFPlayerInCar(int argc,char** argv) { rTuneAssertMsg( spInstance->mpStage != NULL, "This Command: PutMFPlayerInCar needs to be in a stage \n" ); spInstance->mpStage->PutMFPlayerInCar(); } // Set which element of a stateprop is to be treated as the shadow (or light pool) void MissionScriptLoader::SetStatepropShadow(int argc,char** argv) { const char* compDrawName = argv[1]; const char* compDrawElement = argv[2]; AnimDynaPhysLoader::SetShadowElement( compDrawName, compDrawElement ); } void MissionScriptLoader::TreeOfWoeErrorMsg(const char* outputbuffer) { #ifndef RAD_XBOX #ifndef FINAL IRadTextDisplay* textDisplay; ::radTextDisplayGet( &textDisplay, GMA_DEFAULT ); if ( textDisplay ) { textDisplay->SetBackgroundColor( 0 ); textDisplay->SetTextColor( 0xffffffff ); textDisplay->Clear(); textDisplay->TextOutAt("Another Body for The Tree Of Woe", 5, 2 ); textDisplay->TextOutAt(outputbuffer, 5, 5 ); textDisplay->SwapBuffers(); textDisplay->Release(); } #endif #endif } void MissionScriptLoader::DisableHitAndRun(int argc,char** argv) { rTuneAssertMsg( spInstance->mpStage != NULL, "This Command: DisableHitAndRun needs to be in a stage \n" ); spInstance->mpStage->DisableHitAndRun(); GetHitnRunManager()->DisableHitnRun(); } void MissionScriptLoader::EnableHitAndRun(int argc,char** argv) { GetHitnRunManager()->EnableHitnRun(); } void MissionScriptLoader::ResetHitAndRun(int argc,char** argv) { GetHitnRunManager()->ResetState(); } void MissionScriptLoader::SetNumChaseCars(int argc,char** argv) { int numofcars =0; numofcars = atoi(argv[1]); GetHitnRunManager()->SetNumChaseCars(numofcars); } void MissionScriptLoader::SetHitAndRunDecay(int argc,char** argv) { float value = 0.0f; value = static_cast(atof(argv[1])); GetHitnRunManager()->SetDecayRate(value); } void MissionScriptLoader::SetHitAndRunDecayInterior(int argc,char** argv) { float value = 0.0f; value = static_cast(atof(argv[1])); GetHitnRunManager()->SetDecayRateInside(value); } void MissionScriptLoader::SetHitAndRunMeter(int argc,char** argv) { float value = 0.0f; value = static_cast(atof(argv[1])); GetHitnRunManager()->SetHitnRunValue(value); } void MissionScriptLoader::SwapInDefaultCar(int argc,char** argv) { rTuneAssertMsg( spInstance->mpStage != NULL, "This Command: SwapInDefaultCar needs to be in a stage \n" ); spInstance->mpStage->SwapInDefaultCar(); } void MissionScriptLoader::SetSwapDefaultCarRespawnLocatorName(int argc,char** argv) { rTuneAssertMsg( spInstance->mpStage != NULL, "This Command: SetSwapDefaultCarLocator needs to be in a stage \n" ); spInstance->mpStage->SetSwapDefaultCarRespawnLocatorName(argv[1]); } void MissionScriptLoader::SetSwapForcedCarRespawnLocatorName(int argc,char** argv) { rTuneAssertMsg( spInstance->mpStage != NULL, "This Command: SetSwapForcedCarLocator needs to be in a stage \n" ); spInstance->mpStage->SetSwapForcedCarRespawnLocatorName(argv[1]); } void MissionScriptLoader::SetSwapPlayerRespawnLocatorName(int argc,char** argv) { rTuneAssertMsg( spInstance->mpStage != NULL, "This Command: SetSwapPlayerLocator needs to be in a stage \n" ); spInstance->mpStage->SetSwapPlayerRespawnLocatorName(argv[1]); } void MissionScriptLoader::NoTrafficForStage(int argc,char** argv) { rTuneAssertMsg( spInstance->mpStage != NULL, "This Command:NoTrafficForStage needs to be in a stage \n" ); spInstance->mpStage->DisableTraffic(); } void MissionScriptLoader::ClearTrafficForStage(int argc,char** argv) { rTuneAssertMsg( spInstance->mpStage != NULL, "This Command: ClearTrafficForStage needs to be in a stage \n" ); spInstance->mpStage->ClearTrafficForStage(); } void MissionScriptLoader::AddGlobalProp(int argc,char** argv) { //GetGlobalPropManager()->AddProp(argv[1])); } void MissionScriptLoader::PlacePlayerAtLocatorName(int argc,char** argv) { rTuneAssertMsg(spInstance->mpStage != NULL," You must USE: PlacePlayerAtLocatorName inside the Stage Command!! \n"); spInstance->mpStage->SetPlayerRespawnLocatorName(argv[1]); } void MissionScriptLoader::msPlacePlayerCarAtLocatorName(int argc,char** argv) { rTuneAssertMsg(spInstance->mpStage != NULL," You must USE: msPlacePlayerCarAtLocatorName inside the Stage Command!! \n"); spInstance->mpStage->SetmsPlayerCarRespawnLocatorName(argv[1]); } void MissionScriptLoader::SetStageAIRaceCatchupParams( int argc, char** argv ) { rAssert( spInstance ); #if defined(RAD_TUNE) || defined(RAD_DEBUG) char cmd[64]; sprintf( cmd, "SetStageAIRaceCatchupParams" ); char errMsg[512]; #endif #if defined(RAD_TUNE) || defined(RAD_DEBUG) sprintf( errMsg, "You must use: %s inside the Stage Command!!", cmd ); rTuneAssertMsg( spInstance->mpStage != NULL, errMsg); #endif #if defined(RAD_TUNE) || defined(RAD_DEBUG) sprintf( errMsg, "Bad number of args. Syntax: %s( STAGEVEHICLENAME, " "ALONGROADDISTFROMPLAYER_TO_APPLYMAXCATCHUP, " "FRACTIONPLAYERSPEED_MINCATCHUP, " "FRACTIONPLAYERSPEED_NOCATCHUP, " "FRACTIONPLAYERSPEED_MAXCATCHUP )", cmd ); rTuneAssertMsg( argc == 6, errMsg ); #endif char vehiclename[32]; strcpy( vehiclename, argv[1] ); Vehicle* vehicle = spInstance->GetVehicleByName( vehiclename ); #if defined(RAD_TUNE) || defined(RAD_DEBUG) sprintf( errMsg, "%s: Cannot find vehicle called \"%s\"", cmd, vehiclename ); rTuneAssertMsg( vehicle, errMsg ); #endif VehicleAI::RaceCatchupParams params; params.DistMaxCatchup = (float) atof(argv[2]); params.FractionPlayerSpeedMinCatchup = (float) atof(argv[3]); params.FractionPlayerSpeedMidCatchup = (float) atof(argv[4]); params.FractionPlayerSpeedMaxCatchup = (float) atof(argv[5]); spInstance->mpStage->SetAIRaceCatchupParams( vehicle, params ); } void MissionScriptLoader::SetStageAIEvadeCatchupParams( int argc, char** argv ) { rAssert( spInstance ); #if defined(RAD_TUNE) || defined(RAD_DEBUG) char cmd[64]; sprintf( cmd, "SetStageAIEvadeCatchupParams" ); char errMsg[512]; #endif #if defined(RAD_TUNE) || defined(RAD_DEBUG) sprintf( errMsg, "You must use: %s inside the Stage Command!!", cmd ); rTuneAssertMsg( spInstance->mpStage != NULL, errMsg); #endif #if defined(RAD_TUNE) || defined(RAD_DEBUG) sprintf( errMsg, "Bad number of args. Syntax: %s( STAGEVEHICLENAME, " "CROWFLYDIST_PLAYERTOONEAR, CROWFLYDIST_PLAYERFARENOUGH )", cmd ); rTuneAssertMsg( argc == 4, errMsg ); #endif char vehiclename[32]; strcpy( vehiclename, argv[1] ); Vehicle* vehicle = spInstance->GetVehicleByName( vehiclename ); #if defined(RAD_TUNE) || defined(RAD_DEBUG) sprintf( errMsg, "%s: Cannot find vehicle called \"%s\"", cmd, vehiclename ); rTuneAssertMsg( vehicle, errMsg ); #endif VehicleAI::EvadeCatchupParams params; params.DistPlayerTooNear = (float) atof(argv[2]); params.DistPlayerFarEnough = (float) atof(argv[3]); spInstance->mpStage->SetAIEvadeCatchupParams( vehicle, params ); } void MissionScriptLoader::SetStageAITargetCatchupParams( int argc, char** argv ) { rAssert( spInstance ); #if defined(RAD_TUNE) || defined(RAD_DEBUG) char cmd[64]; sprintf( cmd, "SetStageAITargetCatchupParams" ); char errMsg[512]; #endif #if defined(RAD_TUNE) || defined(RAD_DEBUG) sprintf( errMsg, "You must use: %s inside the Stage Command!!", cmd ); rTuneAssertMsg( spInstance->mpStage != NULL, errMsg); #endif #if defined(RAD_TUNE) || defined(RAD_DEBUG) sprintf( errMsg, "Bad number of args. Syntax: %s( STAGEVEHICLENAME, " "CROWFLYDIST_PLAYERNEARENOUGH, CROWFLYDIST_PLAYERTOOFAR )", cmd ); rTuneAssertMsg( argc == 4, errMsg ); #endif char vehiclename[32]; strcpy( vehiclename, argv[1] ); Vehicle* vehicle = spInstance->GetVehicleByName( vehiclename ); #if defined(RAD_TUNE) || defined(RAD_DEBUG) sprintf( errMsg, "%s: Cannot find vehicle called \"%s\"", cmd, vehiclename ); rTuneAssertMsg( vehicle, errMsg ); #endif VehicleAI::TargetCatchupParams params; params.DistPlayerNearEnough = (float) atof(argv[2]); params.DistPlayerTooFar = (float) atof(argv[3]); spInstance->mpStage->SetAITargetCatchupParams( vehicle, params ); } void MissionScriptLoader::SetPauseDuration(int argc,char** argv) { if (spInstance->mpObjective != NULL) { if (spInstance->mObjType == MissionObjective::OBJ_TIMER) { TimerObjective* pTimerObjective = dynamic_cast (spInstance->mpObjective); rAssert(pTimerObjective); unsigned int milliseconds =0; milliseconds = atoi(argv[1]); //convert to milliseconds milliseconds *= 1000; pTimerObjective->SetTimer( milliseconds); } else { rTuneAssertMsg(0," You must USE SetPauseDuration : inside a Timer Objective \n"); } } else { rTuneAssertMsg(0,"Timer Objective has not been declared, You must use AddObjective(timer); first \n"); } } void MissionScriptLoader::SetCharacterToHide(int argc,char** argv) { rTuneAssert(spInstance->mpStage != NULL); spInstance->mpStage->SetCharacterToHide(argv[1]); } void MissionScriptLoader::SetLevelOver(int argc,char** argv) { rTuneAssert(spInstance->mpStage != NULL); spInstance->mpStage->SetLevelOver(); } void MissionScriptLoader::SetGameOver(int argc, char** argv) { rTuneAssert(spInstance->mpStage != 0); spInstance->mpStage->SetGameOver(); } void MissionScriptLoader::StayInBlack(int argc,char** argv) { rTuneAssertMsg(spInstance->mpStage != NULL,"You cant use this command to a Stage that doesnt exist, Use AddStage() before this command! \n"); spInstance->mpStage->mbStayBlackForStage= true; } void MissionScriptLoader::AllowMissionAbort(int argc,char** argv) { rTuneAssertMsg(spInstance->mpStage != NULL,"You cant use this command to a Stage that doesnt exist, Use AddStage() before this command! \n"); bool allowMissionAbort = (strcmp( argv[ 1 ], "false" ) != 0); spInstance->mpStage->SetMissionAbortEnabled( allowMissionAbort ); }